1273562Smarcel/*!
2273562Smarcel * jQuery JavaScript Library v1.7
3273562Smarcel * http://jquery.com/
4273562Smarcel *
5273562Smarcel * Copyright 2011, John Resig
6273562Smarcel * Dual licensed under the MIT or GPL Version 2 licenses.
7273562Smarcel * http://jquery.org/license
8273562Smarcel *
9273562Smarcel * Includes Sizzle.js
10273562Smarcel * http://sizzlejs.com/
11273562Smarcel * Copyright 2011, The Dojo Foundation
12273562Smarcel * Released under the MIT, BSD, and GPL Licenses.
13273562Smarcel *
14273562Smarcel * Date: Thu Nov 3 16:18:21 2011 -0400
15273562Smarcel */
16273562Smarcel(function( window, undefined ) {
17273562Smarcel
18273562Smarcel// Use the correct document accordingly with window argument (sandbox)
19273562Smarcelvar document = window.document,
20273562Smarcel	navigator = window.navigator,
21273562Smarcel	location = window.location;
22273562Smarcelvar jQuery = (function() {
23273562Smarcel
24273562Smarcel// Define a local copy of jQuery
25273562Smarcelvar jQuery = function( selector, context ) {
26273562Smarcel		// The jQuery object is actually just the init constructor 'enhanced'
27273562Smarcel		return new jQuery.fn.init( selector, context, rootjQuery );
28273562Smarcel	},
29273562Smarcel
30273562Smarcel	// Map over jQuery in case of overwrite
31273562Smarcel	_jQuery = window.jQuery,
32273562Smarcel
33273562Smarcel	// Map over the $ in case of overwrite
34273562Smarcel	_$ = window.$,
35273562Smarcel
36273562Smarcel	// A central reference to the root jQuery(document)
37273562Smarcel	rootjQuery,
38273562Smarcel
39273562Smarcel	// A simple way to check for HTML strings or ID strings
40273562Smarcel	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
41273562Smarcel	quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
42273562Smarcel
43273562Smarcel	// Check if a string has a non-whitespace character in it
44273562Smarcel	rnotwhite = /\S/,
45273562Smarcel
46273562Smarcel	// Used for trimming whitespace
47273562Smarcel	trimLeft = /^\s+/,
48273562Smarcel	trimRight = /\s+$/,
49273562Smarcel
50273562Smarcel	// Check for digits
51273562Smarcel	rdigit = /\d/,
52273562Smarcel
53273562Smarcel	// Match a standalone tag
54273562Smarcel	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
55273562Smarcel
56273562Smarcel	// JSON RegExp
57273562Smarcel	rvalidchars = /^[\],:{}\s]*$/,
58273562Smarcel	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
59273562Smarcel	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
60273562Smarcel	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
61273562Smarcel
62273562Smarcel	// Useragent RegExp
63273562Smarcel	rwebkit = /(webkit)[ \/]([\w.]+)/,
64273562Smarcel	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
65273562Smarcel	rmsie = /(msie) ([\w.]+)/,
66273562Smarcel	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
67273562Smarcel
68273562Smarcel	// Matches dashed string for camelizing
69273562Smarcel	rdashAlpha = /-([a-z]|[0-9])/ig,
70273562Smarcel	rmsPrefix = /^-ms-/,
71273562Smarcel
72273562Smarcel	// Used by jQuery.camelCase as callback to replace()
73273562Smarcel	fcamelCase = function( all, letter ) {
74273562Smarcel		return ( letter + "" ).toUpperCase();
75273562Smarcel	},
76273562Smarcel
77273562Smarcel	// Keep a UserAgent string for use with jQuery.browser
78273562Smarcel	userAgent = navigator.userAgent,
79273562Smarcel
80273562Smarcel	// For matching the engine and version of the browser
81273562Smarcel	browserMatch,
82273562Smarcel
83273562Smarcel	// The deferred used on DOM ready
84273562Smarcel	readyList,
85273562Smarcel
86273562Smarcel	// The ready event handler
87273562Smarcel	DOMContentLoaded,
88273562Smarcel
89273562Smarcel	// Save a reference to some core methods
90273562Smarcel	toString = Object.prototype.toString,
91273562Smarcel	hasOwn = Object.prototype.hasOwnProperty,
92273562Smarcel	push = Array.prototype.push,
93273562Smarcel	slice = Array.prototype.slice,
94273562Smarcel	trim = String.prototype.trim,
95273562Smarcel	indexOf = Array.prototype.indexOf,
96273562Smarcel
97273562Smarcel	// [[Class]] -> type pairs
98273562Smarcel	class2type = {};
99273562Smarcel
100273562SmarceljQuery.fn = jQuery.prototype = {
101273562Smarcel	constructor: jQuery,
102273562Smarcel	init: function( selector, context, rootjQuery ) {
103273562Smarcel		var match, elem, ret, doc;
104273562Smarcel
105273562Smarcel		// Handle $(""), $(null), or $(undefined)
106273562Smarcel		if ( !selector ) {
107273562Smarcel			return this;
108273562Smarcel		}
109273562Smarcel
110273562Smarcel		// Handle $(DOMElement)
111273562Smarcel		if ( selector.nodeType ) {
112273562Smarcel			this.context = this[0] = selector;
113273562Smarcel			this.length = 1;
114273562Smarcel			return this;
115273562Smarcel		}
116273562Smarcel
117273562Smarcel		// The body element only exists once, optimize finding it
118273562Smarcel		if ( selector === "body" && !context && document.body ) {
119273562Smarcel			this.context = document;
120273562Smarcel			this[0] = document.body;
121273562Smarcel			this.selector = selector;
122273562Smarcel			this.length = 1;
123273562Smarcel			return this;
124273562Smarcel		}
125273562Smarcel
126273562Smarcel		// Handle HTML strings
127273562Smarcel		if ( typeof selector === "string" ) {
128273562Smarcel			// Are we dealing with HTML string or an ID?
129273562Smarcel			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
130273562Smarcel				// Assume that strings that start and end with <> are HTML and skip the regex check
131273562Smarcel				match = [ null, selector, null ];
132273562Smarcel
133273562Smarcel			} else {
134273562Smarcel				match = quickExpr.exec( selector );
135273562Smarcel			}
136273562Smarcel
137273562Smarcel			// Verify a match, and that no context was specified for #id
138273562Smarcel			if ( match && (match[1] || !context) ) {
139273562Smarcel
140273562Smarcel				// HANDLE: $(html) -> $(array)
141273562Smarcel				if ( match[1] ) {
142273562Smarcel					context = context instanceof jQuery ? context[0] : context;
143273562Smarcel					doc = ( context ? context.ownerDocument || context : document );
144273562Smarcel
145273562Smarcel					// If a single string is passed in and it's a single tag
146273562Smarcel					// just do a createElement and skip the rest
147273562Smarcel					ret = rsingleTag.exec( selector );
148273562Smarcel
149273562Smarcel					if ( ret ) {
150273562Smarcel						if ( jQuery.isPlainObject( context ) ) {
151273562Smarcel							selector = [ document.createElement( ret[1] ) ];
152273562Smarcel							jQuery.fn.attr.call( selector, context, true );
153273562Smarcel
154273562Smarcel						} else {
155273562Smarcel							selector = [ doc.createElement( ret[1] ) ];
156273562Smarcel						}
157273562Smarcel
158273562Smarcel					} else {
159273562Smarcel						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
160273562Smarcel						selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
161273562Smarcel					}
162273562Smarcel
163273562Smarcel					return jQuery.merge( this, selector );
164273562Smarcel
165273562Smarcel				// HANDLE: $("#id")
166273562Smarcel				} else {
167273562Smarcel					elem = document.getElementById( match[2] );
168273562Smarcel
169273562Smarcel					// Check parentNode to catch when Blackberry 4.6 returns
170273562Smarcel					// nodes that are no longer in the document #6963
171273562Smarcel					if ( elem && elem.parentNode ) {
172273562Smarcel						// Handle the case where IE and Opera return items
173273562Smarcel						// by name instead of ID
174273562Smarcel						if ( elem.id !== match[2] ) {
175273562Smarcel							return rootjQuery.find( selector );
176273562Smarcel						}
177273562Smarcel
178273562Smarcel						// Otherwise, we inject the element directly into the jQuery object
179273562Smarcel						this.length = 1;
180273562Smarcel						this[0] = elem;
181273562Smarcel					}
182273562Smarcel
183273562Smarcel					this.context = document;
184273562Smarcel					this.selector = selector;
185273562Smarcel					return this;
186273562Smarcel				}
187273562Smarcel
188273562Smarcel			// HANDLE: $(expr, $(...))
189273562Smarcel			} else if ( !context || context.jquery ) {
190273562Smarcel				return ( context || rootjQuery ).find( selector );
191273562Smarcel
192273562Smarcel			// HANDLE: $(expr, context)
193273562Smarcel			// (which is just equivalent to: $(context).find(expr)
194273562Smarcel			} else {
195273562Smarcel				return this.constructor( context ).find( selector );
196273562Smarcel			}
197273562Smarcel
198273562Smarcel		// HANDLE: $(function)
199273562Smarcel		// Shortcut for document ready
200273562Smarcel		} else if ( jQuery.isFunction( selector ) ) {
201273562Smarcel			return rootjQuery.ready( selector );
202273562Smarcel		}
203273562Smarcel
204273562Smarcel		if ( selector.selector !== undefined ) {
205273562Smarcel			this.selector = selector.selector;
206273562Smarcel			this.context = selector.context;
207273562Smarcel		}
208273562Smarcel
209273562Smarcel		return jQuery.makeArray( selector, this );
210273562Smarcel	},
211273562Smarcel
212273562Smarcel	// Start with an empty selector
213273562Smarcel	selector: "",
214273562Smarcel
215273562Smarcel	// The current version of jQuery being used
216273562Smarcel	jquery: "1.7",
217273562Smarcel
218273562Smarcel	// The default length of a jQuery object is 0
219273562Smarcel	length: 0,
220273562Smarcel
221273562Smarcel	// The number of elements contained in the matched element set
222273562Smarcel	size: function() {
223273562Smarcel		return this.length;
224273562Smarcel	},
225273562Smarcel
226273562Smarcel	toArray: function() {
227273562Smarcel		return slice.call( this, 0 );
228273562Smarcel	},
229273562Smarcel
230273562Smarcel	// Get the Nth element in the matched element set OR
231273562Smarcel	// Get the whole matched element set as a clean array
232273562Smarcel	get: function( num ) {
233273562Smarcel		return num == null ?
234273562Smarcel
235273562Smarcel			// Return a 'clean' array
236273562Smarcel			this.toArray() :
237273562Smarcel
238273562Smarcel			// Return just the object
239273562Smarcel			( num < 0 ? this[ this.length + num ] : this[ num ] );
240273562Smarcel	},
241273562Smarcel
242273562Smarcel	// Take an array of elements and push it onto the stack
243273562Smarcel	// (returning the new matched element set)
244273562Smarcel	pushStack: function( elems, name, selector ) {
245273562Smarcel		// Build a new jQuery matched element set
246273562Smarcel		var ret = this.constructor();
247273562Smarcel
248273562Smarcel		if ( jQuery.isArray( elems ) ) {
249273562Smarcel			push.apply( ret, elems );
250273562Smarcel
251273562Smarcel		} else {
252273562Smarcel			jQuery.merge( ret, elems );
253273562Smarcel		}
254273562Smarcel
255273562Smarcel		// Add the old object onto the stack (as a reference)
256273562Smarcel		ret.prevObject = this;
257273562Smarcel
258273562Smarcel		ret.context = this.context;
259273562Smarcel
260273562Smarcel		if ( name === "find" ) {
261273562Smarcel			ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
262273562Smarcel		} else if ( name ) {
263273562Smarcel			ret.selector = this.selector + "." + name + "(" + selector + ")";
264273562Smarcel		}
265273562Smarcel
266273562Smarcel		// Return the newly-formed element set
267273562Smarcel		return ret;
268273562Smarcel	},
269273562Smarcel
270273562Smarcel	// Execute a callback for every element in the matched set.
271273562Smarcel	// (You can seed the arguments with an array of args, but this is
272273562Smarcel	// only used internally.)
273273562Smarcel	each: function( callback, args ) {
274273562Smarcel		return jQuery.each( this, callback, args );
275273562Smarcel	},
276273562Smarcel
277273562Smarcel	ready: function( fn ) {
278273562Smarcel		// Attach the listeners
279273562Smarcel		jQuery.bindReady();
280273562Smarcel
281273562Smarcel		// Add the callback
282273562Smarcel		readyList.add( fn );
283273562Smarcel
284273562Smarcel		return this;
285273562Smarcel	},
286273562Smarcel
287273562Smarcel	eq: function( i ) {
288273562Smarcel		return i === -1 ?
289273562Smarcel			this.slice( i ) :
290273562Smarcel			this.slice( i, +i + 1 );
291273562Smarcel	},
292273562Smarcel
293273562Smarcel	first: function() {
294273562Smarcel		return this.eq( 0 );
295273562Smarcel	},
296273562Smarcel
297273562Smarcel	last: function() {
298273562Smarcel		return this.eq( -1 );
299273562Smarcel	},
300273562Smarcel
301273562Smarcel	slice: function() {
302273562Smarcel		return this.pushStack( slice.apply( this, arguments ),
303273562Smarcel			"slice", slice.call(arguments).join(",") );
304273562Smarcel	},
305273562Smarcel
306273562Smarcel	map: function( callback ) {
307273562Smarcel		return this.pushStack( jQuery.map(this, function( elem, i ) {
308273562Smarcel			return callback.call( elem, i, elem );
309273562Smarcel		}));
310273562Smarcel	},
311273562Smarcel
312273562Smarcel	end: function() {
313273562Smarcel		return this.prevObject || this.constructor(null);
314273562Smarcel	},
315273562Smarcel
316273562Smarcel	// For internal use only.
317273562Smarcel	// Behaves like an Array's method, not like a jQuery method.
318273562Smarcel	push: push,
319273562Smarcel	sort: [].sort,
320273562Smarcel	splice: [].splice
321273562Smarcel};
322273562Smarcel
323273562Smarcel// Give the init function the jQuery prototype for later instantiation
324273562SmarceljQuery.fn.init.prototype = jQuery.fn;
325273562Smarcel
326273562SmarceljQuery.extend = jQuery.fn.extend = function() {
327273562Smarcel	var options, name, src, copy, copyIsArray, clone,
328273562Smarcel		target = arguments[0] || {},
329273562Smarcel		i = 1,
330273562Smarcel		length = arguments.length,
331273562Smarcel		deep = false;
332273562Smarcel
333273562Smarcel	// Handle a deep copy situation
334273562Smarcel	if ( typeof target === "boolean" ) {
335273562Smarcel		deep = target;
336273562Smarcel		target = arguments[1] || {};
337273562Smarcel		// skip the boolean and the target
338273562Smarcel		i = 2;
339273562Smarcel	}
340273562Smarcel
341273562Smarcel	// Handle case when target is a string or something (possible in deep copy)
342273562Smarcel	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
343273562Smarcel		target = {};
344273562Smarcel	}
345273562Smarcel
346273562Smarcel	// extend jQuery itself if only one argument is passed
347273562Smarcel	if ( length === i ) {
348273562Smarcel		target = this;
349273562Smarcel		--i;
350273562Smarcel	}
351273562Smarcel
352273562Smarcel	for ( ; i < length; i++ ) {
353273562Smarcel		// Only deal with non-null/undefined values
354273562Smarcel		if ( (options = arguments[ i ]) != null ) {
355273562Smarcel			// Extend the base object
356273562Smarcel			for ( name in options ) {
357273562Smarcel				src = target[ name ];
358273562Smarcel				copy = options[ name ];
359273562Smarcel
360273562Smarcel				// Prevent never-ending loop
361273562Smarcel				if ( target === copy ) {
362273562Smarcel					continue;
363273562Smarcel				}
364273562Smarcel
365273562Smarcel				// Recurse if we're merging plain objects or arrays
366273562Smarcel				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
367273562Smarcel					if ( copyIsArray ) {
368273562Smarcel						copyIsArray = false;
369273562Smarcel						clone = src && jQuery.isArray(src) ? src : [];
370273562Smarcel
371273562Smarcel					} else {
372273562Smarcel						clone = src && jQuery.isPlainObject(src) ? src : {};
373273562Smarcel					}
374273562Smarcel
375273562Smarcel					// Never move original objects, clone them
376273562Smarcel					target[ name ] = jQuery.extend( deep, clone, copy );
377273562Smarcel
378273562Smarcel				// Don't bring in undefined values
379273562Smarcel				} else if ( copy !== undefined ) {
380273562Smarcel					target[ name ] = copy;
381273562Smarcel				}
382273562Smarcel			}
383273562Smarcel		}
384273562Smarcel	}
385273562Smarcel
386273562Smarcel	// Return the modified object
387273562Smarcel	return target;
388273562Smarcel};
389273562Smarcel
390273562SmarceljQuery.extend({
391273562Smarcel	noConflict: function( deep ) {
392273562Smarcel		if ( window.$ === jQuery ) {
393273562Smarcel			window.$ = _$;
394273562Smarcel		}
395273562Smarcel
396273562Smarcel		if ( deep && window.jQuery === jQuery ) {
397273562Smarcel			window.jQuery = _jQuery;
398273562Smarcel		}
399273562Smarcel
400273562Smarcel		return jQuery;
401273562Smarcel	},
402273562Smarcel
403273562Smarcel	// Is the DOM ready to be used? Set to true once it occurs.
404273562Smarcel	isReady: false,
405273562Smarcel
406273562Smarcel	// A counter to track how many items to wait for before
407273562Smarcel	// the ready event fires. See #6781
408273562Smarcel	readyWait: 1,
409273562Smarcel
410273562Smarcel	// Hold (or release) the ready event
411273562Smarcel	holdReady: function( hold ) {
412273562Smarcel		if ( hold ) {
413273562Smarcel			jQuery.readyWait++;
414273562Smarcel		} else {
415273562Smarcel			jQuery.ready( true );
416273562Smarcel		}
417273562Smarcel	},
418273562Smarcel
419273562Smarcel	// Handle when the DOM is ready
420273562Smarcel	ready: function( wait ) {
421273562Smarcel		// Either a released hold or an DOMready/load event and not yet ready
422273562Smarcel		if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
423273562Smarcel			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
424273562Smarcel			if ( !document.body ) {
425273562Smarcel				return setTimeout( jQuery.ready, 1 );
426273562Smarcel			}
427273562Smarcel
428273562Smarcel			// Remember that the DOM is ready
429273562Smarcel			jQuery.isReady = true;
430273562Smarcel
431273562Smarcel			// If a normal DOM Ready event fired, decrement, and wait if need be
432273562Smarcel			if ( wait !== true && --jQuery.readyWait > 0 ) {
433273562Smarcel				return;
434273562Smarcel			}
435273562Smarcel
436273562Smarcel			// If there are functions bound, to execute
437273562Smarcel			readyList.fireWith( document, [ jQuery ] );
438273562Smarcel
439273562Smarcel			// Trigger any bound ready events
440273562Smarcel			if ( jQuery.fn.trigger ) {
441273562Smarcel				jQuery( document ).trigger( "ready" ).unbind( "ready" );
442273562Smarcel			}
443273562Smarcel		}
444273562Smarcel	},
445273562Smarcel
446273562Smarcel	bindReady: function() {
447273562Smarcel		if ( readyList ) {
448273562Smarcel			return;
449273562Smarcel		}
450273562Smarcel
451273562Smarcel		readyList = jQuery.Callbacks( "once memory" );
452273562Smarcel
453273562Smarcel		// Catch cases where $(document).ready() is called after the
454273562Smarcel		// browser event has already occurred.
455273562Smarcel		if ( document.readyState === "complete" ) {
456273562Smarcel			// Handle it asynchronously to allow scripts the opportunity to delay ready
457273562Smarcel			return setTimeout( jQuery.ready, 1 );
458273562Smarcel		}
459273562Smarcel
460273562Smarcel		// Mozilla, Opera and webkit nightlies currently support this event
461273562Smarcel		if ( document.addEventListener ) {
462273562Smarcel			// Use the handy event callback
463273562Smarcel			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
464273562Smarcel
465273562Smarcel			// A fallback to window.onload, that will always work
466273562Smarcel			window.addEventListener( "load", jQuery.ready, false );
467273562Smarcel
468273562Smarcel		// If IE event model is used
469273562Smarcel		} else if ( document.attachEvent ) {
470273562Smarcel			// ensure firing before onload,
471273562Smarcel			// maybe late but safe also for iframes
472273562Smarcel			document.attachEvent( "onreadystatechange", DOMContentLoaded );
473273562Smarcel
474273562Smarcel			// A fallback to window.onload, that will always work
475273562Smarcel			window.attachEvent( "onload", jQuery.ready );
476273562Smarcel
477273562Smarcel			// If IE and not a frame
478273562Smarcel			// continually check to see if the document is ready
479273562Smarcel			var toplevel = false;
480273562Smarcel
481273562Smarcel			try {
482273562Smarcel				toplevel = window.frameElement == null;
483273562Smarcel			} catch(e) {}
484273562Smarcel
485273562Smarcel			if ( document.documentElement.doScroll && toplevel ) {
486273562Smarcel				doScrollCheck();
487273562Smarcel			}
488273562Smarcel		}
489273562Smarcel	},
490273562Smarcel
491273562Smarcel	// See test/unit/core.js for details concerning isFunction.
492273562Smarcel	// Since version 1.3, DOM methods and functions like alert
493273562Smarcel	// aren't supported. They return false on IE (#2968).
494273562Smarcel	isFunction: function( obj ) {
495273562Smarcel		return jQuery.type(obj) === "function";
496273562Smarcel	},
497273562Smarcel
498273562Smarcel	isArray: Array.isArray || function( obj ) {
499273562Smarcel		return jQuery.type(obj) === "array";
500273562Smarcel	},
501273562Smarcel
502273562Smarcel	// A crude way of determining if an object is a window
503273562Smarcel	isWindow: function( obj ) {
504273562Smarcel		return obj && typeof obj === "object" && "setInterval" in obj;
505273562Smarcel	},
506273562Smarcel
507273562Smarcel	isNumeric: function( obj ) {
508273562Smarcel		return obj != null && rdigit.test( obj ) && !isNaN( obj );
509273562Smarcel	},
510273562Smarcel
511273562Smarcel	type: function( obj ) {
512273562Smarcel		return obj == null ?
513273562Smarcel			String( obj ) :
514273562Smarcel			class2type[ toString.call(obj) ] || "object";
515273562Smarcel	},
516273562Smarcel
517273562Smarcel	isPlainObject: function( obj ) {
518273562Smarcel		// Must be an Object.
519273562Smarcel		// Because of IE, we also have to check the presence of the constructor property.
520273562Smarcel		// Make sure that DOM nodes and window objects don't pass through, as well
521273562Smarcel		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
522273562Smarcel			return false;
523273562Smarcel		}
524273562Smarcel
525273562Smarcel		try {
526273562Smarcel			// Not own constructor property must be Object
527273562Smarcel			if ( obj.constructor &&
528273562Smarcel				!hasOwn.call(obj, "constructor") &&
529273562Smarcel				!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
530273562Smarcel				return false;
531273562Smarcel			}
532273562Smarcel		} catch ( e ) {
533273562Smarcel			// IE8,9 Will throw exceptions on certain host objects #9897
534273562Smarcel			return false;
535273562Smarcel		}
536273562Smarcel
537273562Smarcel		// Own properties are enumerated firstly, so to speed up,
538273562Smarcel		// if last one is own, then all properties are own.
539273562Smarcel
540273562Smarcel		var key;
541273562Smarcel		for ( key in obj ) {}
542273562Smarcel
543273562Smarcel		return key === undefined || hasOwn.call( obj, key );
544273562Smarcel	},
545273562Smarcel
546273562Smarcel	isEmptyObject: function( obj ) {
547273562Smarcel		for ( var name in obj ) {
548273562Smarcel			return false;
549273562Smarcel		}
550273562Smarcel		return true;
551273562Smarcel	},
552273562Smarcel
553273562Smarcel	error: function( msg ) {
554273562Smarcel		throw msg;
555273562Smarcel	},
556273562Smarcel
557273562Smarcel	parseJSON: function( data ) {
558273562Smarcel		if ( typeof data !== "string" || !data ) {
559273562Smarcel			return null;
560273562Smarcel		}
561273562Smarcel
562273562Smarcel		// Make sure leading/trailing whitespace is removed (IE can't handle it)
563273562Smarcel		data = jQuery.trim( data );
564273562Smarcel
565273562Smarcel		// Attempt to parse using the native JSON parser first
566273562Smarcel		if ( window.JSON && window.JSON.parse ) {
567273562Smarcel			return window.JSON.parse( data );
568273562Smarcel		}
569273562Smarcel
570273562Smarcel		// Make sure the incoming data is actual JSON
571273562Smarcel		// Logic borrowed from http://json.org/json2.js
572273562Smarcel		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
573273562Smarcel			.replace( rvalidtokens, "]" )
574273562Smarcel			.replace( rvalidbraces, "")) ) {
575273562Smarcel
576273562Smarcel			return ( new Function( "return " + data ) )();
577273562Smarcel
578273562Smarcel		}
579273562Smarcel		jQuery.error( "Invalid JSON: " + data );
580273562Smarcel	},
581273562Smarcel
582273562Smarcel	// Cross-browser xml parsing
583273562Smarcel	parseXML: function( data ) {
584273562Smarcel		var xml, tmp;
585273562Smarcel		try {
586273562Smarcel			if ( window.DOMParser ) { // Standard
587273562Smarcel				tmp = new DOMParser();
588273562Smarcel				xml = tmp.parseFromString( data , "text/xml" );
589273562Smarcel			} else { // IE
590273562Smarcel				xml = new ActiveXObject( "Microsoft.XMLDOM" );
591273562Smarcel				xml.async = "false";
592273562Smarcel				xml.loadXML( data );
593273562Smarcel			}
594273562Smarcel		} catch( e ) {
595273562Smarcel			xml = undefined;
596273562Smarcel		}
597273562Smarcel		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
598273562Smarcel			jQuery.error( "Invalid XML: " + data );
599273562Smarcel		}
600273562Smarcel		return xml;
601273562Smarcel	},
602273562Smarcel
603273562Smarcel	noop: function() {},
604273562Smarcel
605273562Smarcel	// Evaluates a script in a global context
606273562Smarcel	// Workarounds based on findings by Jim Driscoll
607273562Smarcel	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
608273562Smarcel	globalEval: function( data ) {
609273562Smarcel		if ( data && rnotwhite.test( data ) ) {
610273562Smarcel			// We use execScript on Internet Explorer
611273562Smarcel			// We use an anonymous function so that context is window
612273562Smarcel			// rather than jQuery in Firefox
613273562Smarcel			( window.execScript || function( data ) {
614273562Smarcel				window[ "eval" ].call( window, data );
615273562Smarcel			} )( data );
616273562Smarcel		}
617273562Smarcel	},
618273562Smarcel
619273562Smarcel	// Convert dashed to camelCase; used by the css and data modules
620273562Smarcel	// Microsoft forgot to hump their vendor prefix (#9572)
621273562Smarcel	camelCase: function( string ) {
622273562Smarcel		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
623273562Smarcel	},
624273562Smarcel
625273562Smarcel	nodeName: function( elem, name ) {
626273562Smarcel		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
627273562Smarcel	},
628273562Smarcel
629273562Smarcel	// args is for internal usage only
630273562Smarcel	each: function( object, callback, args ) {
631273562Smarcel		var name, i = 0,
632273562Smarcel			length = object.length,
633273562Smarcel			isObj = length === undefined || jQuery.isFunction( object );
634273562Smarcel
635273562Smarcel		if ( args ) {
636273562Smarcel			if ( isObj ) {
637273562Smarcel				for ( name in object ) {
638273562Smarcel					if ( callback.apply( object[ name ], args ) === false ) {
639273562Smarcel						break;
640273562Smarcel					}
641273562Smarcel				}
642273562Smarcel			} else {
643273562Smarcel				for ( ; i < length; ) {
644273562Smarcel					if ( callback.apply( object[ i++ ], args ) === false ) {
645273562Smarcel						break;
646273562Smarcel					}
647273562Smarcel				}
648273562Smarcel			}
649273562Smarcel
650273562Smarcel		// A special, fast, case for the most common use of each
651273562Smarcel		} else {
652273562Smarcel			if ( isObj ) {
653273562Smarcel				for ( name in object ) {
654273562Smarcel					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
655273562Smarcel						break;
656273562Smarcel					}
657273562Smarcel				}
658273562Smarcel			} else {
659273562Smarcel				for ( ; i < length; ) {
660273562Smarcel					if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
661273562Smarcel						break;
662273562Smarcel					}
663273562Smarcel				}
664273562Smarcel			}
665273562Smarcel		}
666273562Smarcel
667273562Smarcel		return object;
668273562Smarcel	},
669273562Smarcel
670273562Smarcel	// Use native String.trim function wherever possible
671273562Smarcel	trim: trim ?
672273562Smarcel		function( text ) {
673273562Smarcel			return text == null ?
674273562Smarcel				"" :
675273562Smarcel				trim.call( text );
676273562Smarcel		} :
677273562Smarcel
678273562Smarcel		// Otherwise use our own trimming functionality
679273562Smarcel		function( text ) {
680273562Smarcel			return text == null ?
681273562Smarcel				"" :
682273562Smarcel				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
683273562Smarcel		},
684273562Smarcel
685273562Smarcel	// results is for internal usage only
686273562Smarcel	makeArray: function( array, results ) {
687273562Smarcel		var ret = results || [];
688273562Smarcel
689273562Smarcel		if ( array != null ) {
690273562Smarcel			// The window, strings (and functions) also have 'length'
691273562Smarcel			// The extra typeof function check is to prevent crashes
692273562Smarcel			// in Safari 2 (See: #3039)
693273562Smarcel			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
694273562Smarcel			var type = jQuery.type( array );
695273562Smarcel
696273562Smarcel			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
697273562Smarcel				push.call( ret, array );
698273562Smarcel			} else {
699273562Smarcel				jQuery.merge( ret, array );
700273562Smarcel			}
701273562Smarcel		}
702273562Smarcel
703273562Smarcel		return ret;
704273562Smarcel	},
705273562Smarcel
706273562Smarcel	inArray: function( elem, array, i ) {
707273562Smarcel		var len;
708273562Smarcel
709273562Smarcel		if ( array ) {
710273562Smarcel			if ( indexOf ) {
711273562Smarcel				return indexOf.call( array, elem, i );
712273562Smarcel			}
713273562Smarcel
714273562Smarcel			len = array.length;
715273562Smarcel			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
716273562Smarcel
717273562Smarcel			for ( ; i < len; i++ ) {
718273562Smarcel				// Skip accessing in sparse arrays
719273562Smarcel				if ( i in array && array[ i ] === elem ) {
720273562Smarcel					return i;
721273562Smarcel				}
722273562Smarcel			}
723273562Smarcel		}
724273562Smarcel
725273562Smarcel		return -1;
726273562Smarcel	},
727273562Smarcel
728273562Smarcel	merge: function( first, second ) {
729273562Smarcel		var i = first.length,
730273562Smarcel			j = 0;
731273562Smarcel
732273562Smarcel		if ( typeof second.length === "number" ) {
733273562Smarcel			for ( var l = second.length; j < l; j++ ) {
734273562Smarcel				first[ i++ ] = second[ j ];
735273562Smarcel			}
736273562Smarcel
737273562Smarcel		} else {
738273562Smarcel			while ( second[j] !== undefined ) {
739273562Smarcel				first[ i++ ] = second[ j++ ];
740273562Smarcel			}
741273562Smarcel		}
742273562Smarcel
743273562Smarcel		first.length = i;
744273562Smarcel
745273562Smarcel		return first;
746273562Smarcel	},
747273562Smarcel
748273562Smarcel	grep: function( elems, callback, inv ) {
749273562Smarcel		var ret = [], retVal;
750273562Smarcel		inv = !!inv;
751273562Smarcel
752273562Smarcel		// Go through the array, only saving the items
753273562Smarcel		// that pass the validator function
754273562Smarcel		for ( var i = 0, length = elems.length; i < length; i++ ) {
755273562Smarcel			retVal = !!callback( elems[ i ], i );
756273562Smarcel			if ( inv !== retVal ) {
757273562Smarcel				ret.push( elems[ i ] );
758273562Smarcel			}
759273562Smarcel		}
760273562Smarcel
761273562Smarcel		return ret;
762273562Smarcel	},
763273562Smarcel
764273562Smarcel	// arg is for internal usage only
765273562Smarcel	map: function( elems, callback, arg ) {
766273562Smarcel		var value, key, ret = [],
767273562Smarcel			i = 0,
768273562Smarcel			length = elems.length,
769273562Smarcel			// jquery objects are treated as arrays
770273562Smarcel			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
771273562Smarcel
772273562Smarcel		// Go through the array, translating each of the items to their
773273562Smarcel		if ( isArray ) {
774273562Smarcel			for ( ; i < length; i++ ) {
775273562Smarcel				value = callback( elems[ i ], i, arg );
776273562Smarcel
777273562Smarcel				if ( value != null ) {
778273562Smarcel					ret[ ret.length ] = value;
779273562Smarcel				}
780273562Smarcel			}
781273562Smarcel
782273562Smarcel		// Go through every key on the object,
783273562Smarcel		} else {
784273562Smarcel			for ( key in elems ) {
785273562Smarcel				value = callback( elems[ key ], key, arg );
786273562Smarcel
787273562Smarcel				if ( value != null ) {
788273562Smarcel					ret[ ret.length ] = value;
789273562Smarcel				}
790273562Smarcel			}
791273562Smarcel		}
792273562Smarcel
793273562Smarcel		// Flatten any nested arrays
794273562Smarcel		return ret.concat.apply( [], ret );
795273562Smarcel	},
796273562Smarcel
797273562Smarcel	// A global GUID counter for objects
798273562Smarcel	guid: 1,
799273562Smarcel
800273562Smarcel	// Bind a function to a context, optionally partially applying any
801273562Smarcel	// arguments.
802273562Smarcel	proxy: function( fn, context ) {
803273562Smarcel		if ( typeof context === "string" ) {
804273562Smarcel			var tmp = fn[ context ];
805273562Smarcel			context = fn;
806273562Smarcel			fn = tmp;
807273562Smarcel		}
808273562Smarcel
809273562Smarcel		// Quick check to determine if target is callable, in the spec
810273562Smarcel		// this throws a TypeError, but we will just return undefined.
811273562Smarcel		if ( !jQuery.isFunction( fn ) ) {
812273562Smarcel			return undefined;
813273562Smarcel		}
814273562Smarcel
815273562Smarcel		// Simulated bind
816273562Smarcel		var args = slice.call( arguments, 2 ),
817273562Smarcel			proxy = function() {
818273562Smarcel				return fn.apply( context, args.concat( slice.call( arguments ) ) );
819273562Smarcel			};
820273562Smarcel
821273562Smarcel		// Set the guid of unique handler to the same of original handler, so it can be removed
822273562Smarcel		proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
823273562Smarcel
824273562Smarcel		return proxy;
825273562Smarcel	},
826273562Smarcel
827273562Smarcel	// Mutifunctional method to get and set values to a collection
828273562Smarcel	// The value/s can optionally be executed if it's a function
829273562Smarcel	access: function( elems, key, value, exec, fn, pass ) {
830273562Smarcel		var length = elems.length;
831273562Smarcel
832273562Smarcel		// Setting many attributes
833273562Smarcel		if ( typeof key === "object" ) {
834273562Smarcel			for ( var k in key ) {
835273562Smarcel				jQuery.access( elems, k, key[k], exec, fn, value );
836273562Smarcel			}
837273562Smarcel			return elems;
838273562Smarcel		}
839273562Smarcel
840273562Smarcel		// Setting one attribute
841273562Smarcel		if ( value !== undefined ) {
842273562Smarcel			// Optionally, function values get executed if exec is true
843273562Smarcel			exec = !pass && exec && jQuery.isFunction(value);
844273562Smarcel
845273562Smarcel			for ( var i = 0; i < length; i++ ) {
846273562Smarcel				fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
847273562Smarcel			}
848273562Smarcel
849273562Smarcel			return elems;
850273562Smarcel		}
851273562Smarcel
852273562Smarcel		// Getting an attribute
853273562Smarcel		return length ? fn( elems[0], key ) : undefined;
854273562Smarcel	},
855273562Smarcel
856273562Smarcel	now: function() {
857273562Smarcel		return ( new Date() ).getTime();
858273562Smarcel	},
859273562Smarcel
860273562Smarcel	// Use of jQuery.browser is frowned upon.
861273562Smarcel	// More details: http://docs.jquery.com/Utilities/jQuery.browser
862273562Smarcel	uaMatch: function( ua ) {
863273562Smarcel		ua = ua.toLowerCase();
864273562Smarcel
865273562Smarcel		var match = rwebkit.exec( ua ) ||
866273562Smarcel			ropera.exec( ua ) ||
867273562Smarcel			rmsie.exec( ua ) ||
868273562Smarcel			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
869273562Smarcel			[];
870273562Smarcel
871273562Smarcel		return { browser: match[1] || "", version: match[2] || "0" };
872273562Smarcel	},
873273562Smarcel
874273562Smarcel	sub: function() {
875273562Smarcel		function jQuerySub( selector, context ) {
876273562Smarcel			return new jQuerySub.fn.init( selector, context );
877273562Smarcel		}
878273562Smarcel		jQuery.extend( true, jQuerySub, this );
879273562Smarcel		jQuerySub.superclass = this;
880273562Smarcel		jQuerySub.fn = jQuerySub.prototype = this();
881273562Smarcel		jQuerySub.fn.constructor = jQuerySub;
882273562Smarcel		jQuerySub.sub = this.sub;
883273562Smarcel		jQuerySub.fn.init = function init( selector, context ) {
884273562Smarcel			if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
885273562Smarcel				context = jQuerySub( context );
886273562Smarcel			}
887273562Smarcel
888273562Smarcel			return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
889273562Smarcel		};
890273562Smarcel		jQuerySub.fn.init.prototype = jQuerySub.fn;
891273562Smarcel		var rootjQuerySub = jQuerySub(document);
892273562Smarcel		return jQuerySub;
893273562Smarcel	},
894273562Smarcel
895273562Smarcel	browser: {}
896273562Smarcel});
897273562Smarcel
898273562Smarcel// Populate the class2type map
899273562SmarceljQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
900273562Smarcel	class2type[ "[object " + name + "]" ] = name.toLowerCase();
901273562Smarcel});
902273562Smarcel
903273562SmarcelbrowserMatch = jQuery.uaMatch( userAgent );
904273562Smarcelif ( browserMatch.browser ) {
905273562Smarcel	jQuery.browser[ browserMatch.browser ] = true;
906273562Smarcel	jQuery.browser.version = browserMatch.version;
907273562Smarcel}
908273562Smarcel
909273562Smarcel// Deprecated, use jQuery.browser.webkit instead
910273562Smarcelif ( jQuery.browser.webkit ) {
911273562Smarcel	jQuery.browser.safari = true;
912273562Smarcel}
913273562Smarcel
914273562Smarcel// IE doesn't match non-breaking spaces with \s
915273562Smarcelif ( rnotwhite.test( "\xA0" ) ) {
916273562Smarcel	trimLeft = /^[\s\xA0]+/;
917273562Smarcel	trimRight = /[\s\xA0]+$/;
918273562Smarcel}
919273562Smarcel
920273562Smarcel// All jQuery objects should point back to these
921273562SmarcelrootjQuery = jQuery(document);
922273562Smarcel
923273562Smarcel// Cleanup functions for the document ready method
924273562Smarcelif ( document.addEventListener ) {
925273562Smarcel	DOMContentLoaded = function() {
926273562Smarcel		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
927273562Smarcel		jQuery.ready();
928273562Smarcel	};
929273562Smarcel
930273562Smarcel} else if ( document.attachEvent ) {
931273562Smarcel	DOMContentLoaded = function() {
932273562Smarcel		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
933273562Smarcel		if ( document.readyState === "complete" ) {
934273562Smarcel			document.detachEvent( "onreadystatechange", DOMContentLoaded );
935273562Smarcel			jQuery.ready();
936273562Smarcel		}
937273562Smarcel	};
938273562Smarcel}
939273562Smarcel
940273562Smarcel// The DOM ready check for Internet Explorer
941273562Smarcelfunction doScrollCheck() {
942273562Smarcel	if ( jQuery.isReady ) {
943273562Smarcel		return;
944273562Smarcel	}
945273562Smarcel
946273562Smarcel	try {
947273562Smarcel		// If IE is used, use the trick by Diego Perini
948273562Smarcel		// http://javascript.nwbox.com/IEContentLoaded/
949273562Smarcel		document.documentElement.doScroll("left");
950273562Smarcel	} catch(e) {
951273562Smarcel		setTimeout( doScrollCheck, 1 );
952273562Smarcel		return;
953273562Smarcel	}
954273562Smarcel
955273562Smarcel	// and execute any waiting functions
956273562Smarcel	jQuery.ready();
957273562Smarcel}
958273562Smarcel
959273562Smarcel// Expose jQuery as an AMD module, but only for AMD loaders that
960273562Smarcel// understand the issues with loading multiple versions of jQuery
961273562Smarcel// in a page that all might call define(). The loader will indicate
962273562Smarcel// they have special allowances for multiple jQuery versions by
963273562Smarcel// specifying define.amd.jQuery = true. Register as a named module,
964273562Smarcel// since jQuery can be concatenated with other files that may use define,
965273562Smarcel// but not use a proper concatenation script that understands anonymous
966273562Smarcel// AMD modules. A named AMD is safest and most robust way to register.
967273562Smarcel// Lowercase jquery is used because AMD module names are derived from
968273562Smarcel// file names, and jQuery is normally delivered in a lowercase file name.
969273562Smarcelif ( typeof define === "function" && define.amd && define.amd.jQuery ) {
970273562Smarcel	define( "jquery", [], function () { return jQuery; } );
971273562Smarcel}
972273562Smarcel
973273562Smarcelreturn jQuery;
974273562Smarcel
975273562Smarcel})();
976273562Smarcel
977273562Smarcel
978273562Smarcel// String to Object flags format cache
979273562Smarcelvar flagsCache = {};
980273562Smarcel
981273562Smarcel// Convert String-formatted flags into Object-formatted ones and store in cache
982273562Smarcelfunction createFlags( flags ) {
983273562Smarcel	var object = flagsCache[ flags ] = {},
984273562Smarcel		i, length;
985273562Smarcel	flags = flags.split( /\s+/ );
986273562Smarcel	for ( i = 0, length = flags.length; i < length; i++ ) {
987273562Smarcel		object[ flags[i] ] = true;
988273562Smarcel	}
989273562Smarcel	return object;
990273562Smarcel}
991273562Smarcel
992273562Smarcel/*
993273562Smarcel * Create a callback list using the following parameters:
994273562Smarcel *
995273562Smarcel *	flags:	an optional list of space-separated flags that will change how
996273562Smarcel *			the callback list behaves
997273562Smarcel *
998273562Smarcel * By default a callback list will act like an event callback list and can be
999273562Smarcel * "fired" multiple times.
1000273562Smarcel *
1001273562Smarcel * Possible flags:
1002273562Smarcel *
1003273562Smarcel *	once:			will ensure the callback list can only be fired once (like a Deferred)
1004273562Smarcel *
1005273562Smarcel *	memory:			will keep track of previous values and will call any callback added
1006273562Smarcel *					after the list has been fired right away with the latest "memorized"
1007273562Smarcel *					values (like a Deferred)
1008273562Smarcel *
1009273562Smarcel *	unique:			will ensure a callback can only be added once (no duplicate in the list)
1010273562Smarcel *
1011273562Smarcel *	stopOnFalse:	interrupt callings when a callback returns false
1012273562Smarcel *
1013273562Smarcel */
1014273562SmarceljQuery.Callbacks = function( flags ) {
1015273562Smarcel
1016273562Smarcel	// Convert flags from String-formatted to Object-formatted
1017273562Smarcel	// (we check in cache first)
1018273562Smarcel	flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
1019273562Smarcel
1020273562Smarcel	var // Actual callback list
1021273562Smarcel		list = [],
1022273562Smarcel		// Stack of fire calls for repeatable lists
1023273562Smarcel		stack = [],
1024273562Smarcel		// Last fire value (for non-forgettable lists)
1025273562Smarcel		memory,
1026273562Smarcel		// Flag to know if list is currently firing
1027273562Smarcel		firing,
1028273562Smarcel		// First callback to fire (used internally by add and fireWith)
1029273562Smarcel		firingStart,
1030273562Smarcel		// End of the loop when firing
1031273562Smarcel		firingLength,
1032273562Smarcel		// Index of currently firing callback (modified by remove if needed)
1033273562Smarcel		firingIndex,
1034273562Smarcel		// Add one or several callbacks to the list
1035273562Smarcel		add = function( args ) {
1036273562Smarcel			var i,
1037273562Smarcel				length,
1038273562Smarcel				elem,
1039273562Smarcel				type,
1040273562Smarcel				actual;
1041273562Smarcel			for ( i = 0, length = args.length; i < length; i++ ) {
1042273562Smarcel				elem = args[ i ];
1043273562Smarcel				type = jQuery.type( elem );
1044273562Smarcel				if ( type === "array" ) {
1045273562Smarcel					// Inspect recursively
1046273562Smarcel					add( elem );
1047273562Smarcel				} else if ( type === "function" ) {
1048273562Smarcel					// Add if not in unique mode and callback is not in
1049273562Smarcel					if ( !flags.unique || !self.has( elem ) ) {
1050273562Smarcel						list.push( elem );
1051273562Smarcel					}
1052273562Smarcel				}
1053273562Smarcel			}
1054273562Smarcel		},
1055273562Smarcel		// Fire callbacks
1056273562Smarcel		fire = function( context, args ) {
1057273562Smarcel			args = args || [];
1058273562Smarcel			memory = !flags.memory || [ context, args ];
1059273562Smarcel			firing = true;
1060273562Smarcel			firingIndex = firingStart || 0;
1061273562Smarcel			firingStart = 0;
1062273562Smarcel			firingLength = list.length;
1063273562Smarcel			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
1064273562Smarcel				if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
1065273562Smarcel					memory = true; // Mark as halted
1066273562Smarcel					break;
1067273562Smarcel				}
1068273562Smarcel			}
1069273562Smarcel			firing = false;
1070273562Smarcel			if ( list ) {
1071273562Smarcel				if ( !flags.once ) {
1072273562Smarcel					if ( stack && stack.length ) {
1073273562Smarcel						memory = stack.shift();
1074273562Smarcel						self.fireWith( memory[ 0 ], memory[ 1 ] );
1075273562Smarcel					}
1076273562Smarcel				} else if ( memory === true ) {
1077273562Smarcel					self.disable();
1078273562Smarcel				} else {
1079273562Smarcel					list = [];
1080273562Smarcel				}
1081273562Smarcel			}
1082273562Smarcel		},
1083273562Smarcel		// Actual Callbacks object
1084273562Smarcel		self = {
1085273562Smarcel			// Add a callback or a collection of callbacks to the list
1086273562Smarcel			add: function() {
1087273562Smarcel				if ( list ) {
1088273562Smarcel					var length = list.length;
1089273562Smarcel					add( arguments );
1090273562Smarcel					// Do we need to add the callbacks to the
1091273562Smarcel					// current firing batch?
1092273562Smarcel					if ( firing ) {
1093273562Smarcel						firingLength = list.length;
1094273562Smarcel					// With memory, if we're not firing then
1095273562Smarcel					// we should call right away, unless previous
1096273562Smarcel					// firing was halted (stopOnFalse)
1097273562Smarcel					} else if ( memory && memory !== true ) {
1098273562Smarcel						firingStart = length;
1099273562Smarcel						fire( memory[ 0 ], memory[ 1 ] );
1100273562Smarcel					}
1101273562Smarcel				}
1102273562Smarcel				return this;
1103273562Smarcel			},
1104273562Smarcel			// Remove a callback from the list
1105273562Smarcel			remove: function() {
1106273562Smarcel				if ( list ) {
1107273562Smarcel					var args = arguments,
1108273562Smarcel						argIndex = 0,
1109273562Smarcel						argLength = args.length;
1110273562Smarcel					for ( ; argIndex < argLength ; argIndex++ ) {
1111273562Smarcel						for ( var i = 0; i < list.length; i++ ) {
1112273562Smarcel							if ( args[ argIndex ] === list[ i ] ) {
1113273562Smarcel								// Handle firingIndex and firingLength
1114273562Smarcel								if ( firing ) {
1115273562Smarcel									if ( i <= firingLength ) {
1116273562Smarcel										firingLength--;
1117273562Smarcel										if ( i <= firingIndex ) {
1118273562Smarcel											firingIndex--;
1119273562Smarcel										}
1120273562Smarcel									}
1121273562Smarcel								}
1122273562Smarcel								// Remove the element
1123273562Smarcel								list.splice( i--, 1 );
1124273562Smarcel								// If we have some unicity property then
1125273562Smarcel								// we only need to do this once
1126273562Smarcel								if ( flags.unique ) {
1127273562Smarcel									break;
1128273562Smarcel								}
1129273562Smarcel							}
1130273562Smarcel						}
1131273562Smarcel					}
1132273562Smarcel				}
1133273562Smarcel				return this;
1134273562Smarcel			},
1135273562Smarcel			// Control if a given callback is in the list
1136273562Smarcel			has: function( fn ) {
1137273562Smarcel				if ( list ) {
1138273562Smarcel					var i = 0,
1139273562Smarcel						length = list.length;
1140273562Smarcel					for ( ; i < length; i++ ) {
1141273562Smarcel						if ( fn === list[ i ] ) {
1142273562Smarcel							return true;
1143273562Smarcel						}
1144273562Smarcel					}
1145273562Smarcel				}
1146273562Smarcel				return false;
1147273562Smarcel			},
1148273562Smarcel			// Remove all callbacks from the list
1149273562Smarcel			empty: function() {
1150273562Smarcel				list = [];
1151273562Smarcel				return this;
1152273562Smarcel			},
1153273562Smarcel			// Have the list do nothing anymore
1154273562Smarcel			disable: function() {
1155273562Smarcel				list = stack = memory = undefined;
1156273562Smarcel				return this;
1157273562Smarcel			},
1158273562Smarcel			// Is it disabled?
1159273562Smarcel			disabled: function() {
1160273562Smarcel				return !list;
1161273562Smarcel			},
1162273562Smarcel			// Lock the list in its current state
1163273562Smarcel			lock: function() {
1164273562Smarcel				stack = undefined;
1165273562Smarcel				if ( !memory || memory === true ) {
1166273562Smarcel					self.disable();
1167273562Smarcel				}
1168273562Smarcel				return this;
1169273562Smarcel			},
1170273562Smarcel			// Is it locked?
1171273562Smarcel			locked: function() {
1172273562Smarcel				return !stack;
1173273562Smarcel			},
1174273562Smarcel			// Call all callbacks with the given context and arguments
1175273562Smarcel			fireWith: function( context, args ) {
1176273562Smarcel				if ( stack ) {
1177273562Smarcel					if ( firing ) {
1178273562Smarcel						if ( !flags.once ) {
1179273562Smarcel							stack.push( [ context, args ] );
1180273562Smarcel						}
1181273562Smarcel					} else if ( !( flags.once && memory ) ) {
1182273562Smarcel						fire( context, args );
1183273562Smarcel					}
1184273562Smarcel				}
1185273562Smarcel				return this;
1186273562Smarcel			},
1187273562Smarcel			// Call all the callbacks with the given arguments
1188273562Smarcel			fire: function() {
1189273562Smarcel				self.fireWith( this, arguments );
1190273562Smarcel				return this;
1191273562Smarcel			},
1192273562Smarcel			// To know if the callbacks have already been called at least once
1193273562Smarcel			fired: function() {
1194273562Smarcel				return !!memory;
1195273562Smarcel			}
1196273562Smarcel		};
1197273562Smarcel
1198273562Smarcel	return self;
1199273562Smarcel};
1200273562Smarcel
1201273562Smarcel
1202273562Smarcel
1203273562Smarcel
1204273562Smarcelvar // Static reference to slice
1205273562Smarcel	sliceDeferred = [].slice;
1206273562Smarcel
1207273562SmarceljQuery.extend({
1208273562Smarcel
1209273562Smarcel	Deferred: function( func ) {
1210273562Smarcel		var doneList = jQuery.Callbacks( "once memory" ),
1211273562Smarcel			failList = jQuery.Callbacks( "once memory" ),
1212273562Smarcel			progressList = jQuery.Callbacks( "memory" ),
1213273562Smarcel			state = "pending",
1214273562Smarcel			lists = {
1215273562Smarcel				resolve: doneList,
1216273562Smarcel				reject: failList,
1217273562Smarcel				notify: progressList
1218273562Smarcel			},
1219273562Smarcel			promise = {
1220273562Smarcel				done: doneList.add,
1221273562Smarcel				fail: failList.add,
1222273562Smarcel				progress: progressList.add,
1223273562Smarcel
1224273562Smarcel				state: function() {
1225273562Smarcel					return state;
1226273562Smarcel				},
1227273562Smarcel
1228273562Smarcel				// Deprecated
1229273562Smarcel				isResolved: doneList.fired,
1230273562Smarcel				isRejected: failList.fired,
1231273562Smarcel
1232273562Smarcel				then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
1233273562Smarcel					deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
1234273562Smarcel					return this;
1235273562Smarcel				},
1236273562Smarcel				always: function() {
1237273562Smarcel					return deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
1238273562Smarcel				},
1239273562Smarcel				pipe: function( fnDone, fnFail, fnProgress ) {
1240273562Smarcel					return jQuery.Deferred(function( newDefer ) {
1241273562Smarcel						jQuery.each( {
1242273562Smarcel							done: [ fnDone, "resolve" ],
1243273562Smarcel							fail: [ fnFail, "reject" ],
1244273562Smarcel							progress: [ fnProgress, "notify" ]
1245273562Smarcel						}, function( handler, data ) {
1246273562Smarcel							var fn = data[ 0 ],
1247273562Smarcel								action = data[ 1 ],
1248273562Smarcel								returned;
1249273562Smarcel							if ( jQuery.isFunction( fn ) ) {
1250273562Smarcel								deferred[ handler ](function() {
1251273562Smarcel									returned = fn.apply( this, arguments );
1252273562Smarcel									if ( returned && jQuery.isFunction( returned.promise ) ) {
1253273562Smarcel										returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
1254273562Smarcel									} else {
1255273562Smarcel										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
1256273562Smarcel									}
1257273562Smarcel								});
1258273562Smarcel							} else {
1259273562Smarcel								deferred[ handler ]( newDefer[ action ] );
1260273562Smarcel							}
1261273562Smarcel						});
1262273562Smarcel					}).promise();
1263273562Smarcel				},
1264273562Smarcel				// Get a promise for this deferred
1265273562Smarcel				// If obj is provided, the promise aspect is added to the object
1266273562Smarcel				promise: function( obj ) {
1267273562Smarcel					if ( obj == null ) {
1268273562Smarcel						obj = promise;
1269273562Smarcel					} else {
1270273562Smarcel						for ( var key in promise ) {
1271273562Smarcel							obj[ key ] = promise[ key ];
1272273562Smarcel						}
1273273562Smarcel					}
1274273562Smarcel					return obj;
1275273562Smarcel				}
1276273562Smarcel			},
1277273562Smarcel			deferred = promise.promise({}),
1278273562Smarcel			key;
1279273562Smarcel
1280273562Smarcel		for ( key in lists ) {
1281273562Smarcel			deferred[ key ] = lists[ key ].fire;
1282273562Smarcel			deferred[ key + "With" ] = lists[ key ].fireWith;
1283273562Smarcel		}
1284273562Smarcel
1285273562Smarcel		// Handle state
1286273562Smarcel		deferred.done( function() {
1287273562Smarcel			state = "resolved";
1288273562Smarcel		}, failList.disable, progressList.lock ).fail( function() {
1289273562Smarcel			state = "rejected";
1290273562Smarcel		}, doneList.disable, progressList.lock );
1291273562Smarcel
1292273562Smarcel		// Call given func if any
1293273562Smarcel		if ( func ) {
1294273562Smarcel			func.call( deferred, deferred );
1295273562Smarcel		}
1296273562Smarcel
1297273562Smarcel		// All done!
1298273562Smarcel		return deferred;
1299273562Smarcel	},
1300273562Smarcel
1301273562Smarcel	// Deferred helper
1302273562Smarcel	when: function( firstParam ) {
1303273562Smarcel		var args = sliceDeferred.call( arguments, 0 ),
1304273562Smarcel			i = 0,
1305273562Smarcel			length = args.length,
1306273562Smarcel			pValues = new Array( length ),
1307273562Smarcel			count = length,
1308273562Smarcel			pCount = length,
1309273562Smarcel			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
1310273562Smarcel				firstParam :
1311273562Smarcel				jQuery.Deferred(),
1312273562Smarcel			promise = deferred.promise();
1313273562Smarcel		function resolveFunc( i ) {
1314273562Smarcel			return function( value ) {
1315273562Smarcel				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
1316273562Smarcel				if ( !( --count ) ) {
1317273562Smarcel					deferred.resolveWith( deferred, args );
1318273562Smarcel				}
1319273562Smarcel			};
1320273562Smarcel		}
1321273562Smarcel		function progressFunc( i ) {
1322273562Smarcel			return function( value ) {
1323273562Smarcel				pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
1324273562Smarcel				deferred.notifyWith( promise, pValues );
1325273562Smarcel			};
1326273562Smarcel		}
1327273562Smarcel		if ( length > 1 ) {
1328273562Smarcel			for ( ; i < length; i++ ) {
1329273562Smarcel				if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
1330273562Smarcel					args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
1331273562Smarcel				} else {
1332273562Smarcel					--count;
1333273562Smarcel				}
1334273562Smarcel			}
1335273562Smarcel			if ( !count ) {
1336273562Smarcel				deferred.resolveWith( deferred, args );
1337273562Smarcel			}
1338273562Smarcel		} else if ( deferred !== firstParam ) {
1339273562Smarcel			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
1340273562Smarcel		}
1341273562Smarcel		return promise;
1342273562Smarcel	}
1343273562Smarcel});
1344273562Smarcel
1345273562Smarcel
1346273562Smarcel
1347273562Smarcel
1348273562SmarceljQuery.support = (function() {
1349273562Smarcel
1350273562Smarcel	var div = document.createElement( "div" ),
1351273562Smarcel		documentElement = document.documentElement,
1352273562Smarcel		all,
1353273562Smarcel		a,
1354273562Smarcel		select,
1355273562Smarcel		opt,
1356273562Smarcel		input,
1357273562Smarcel		marginDiv,
1358273562Smarcel		support,
1359273562Smarcel		fragment,
1360273562Smarcel		body,
1361273562Smarcel		testElementParent,
1362273562Smarcel		testElement,
1363273562Smarcel		testElementStyle,
1364273562Smarcel		tds,
1365273562Smarcel		events,
1366273562Smarcel		eventName,
1367273562Smarcel		i,
1368273562Smarcel		isSupported;
1369273562Smarcel
1370273562Smarcel	// Preliminary tests
1371273562Smarcel	div.setAttribute("className", "t");
1372273562Smarcel	div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/><nav></nav>";
1373273562Smarcel
1374273562Smarcel
1375273562Smarcel	all = div.getElementsByTagName( "*" );
1376273562Smarcel	a = div.getElementsByTagName( "a" )[ 0 ];
1377273562Smarcel
1378273562Smarcel	// Can't get basic test support
1379273562Smarcel	if ( !all || !all.length || !a ) {
1380273562Smarcel		return {};
1381273562Smarcel	}
1382273562Smarcel
1383273562Smarcel	// First batch of supports tests
1384273562Smarcel	select = document.createElement( "select" );
1385273562Smarcel	opt = select.appendChild( document.createElement("option") );
1386273562Smarcel	input = div.getElementsByTagName( "input" )[ 0 ];
1387273562Smarcel
1388273562Smarcel	support = {
1389273562Smarcel		// IE strips leading whitespace when .innerHTML is used
1390273562Smarcel		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
1391273562Smarcel
1392273562Smarcel		// Make sure that tbody elements aren't automatically inserted
1393273562Smarcel		// IE will insert them into empty tables
1394273562Smarcel		tbody: !div.getElementsByTagName( "tbody" ).length,
1395273562Smarcel
1396273562Smarcel		// Make sure that link elements get serialized correctly by innerHTML
1397273562Smarcel		// This requires a wrapper element in IE
1398273562Smarcel		htmlSerialize: !!div.getElementsByTagName( "link" ).length,
1399273562Smarcel
1400273562Smarcel		// Get the style information from getAttribute
1401273562Smarcel		// (IE uses .cssText instead)
1402273562Smarcel		style: /top/.test( a.getAttribute("style") ),
1403273562Smarcel
1404273562Smarcel		// Make sure that URLs aren't manipulated
1405273562Smarcel		// (IE normalizes it by default)
1406273562Smarcel		hrefNormalized: ( a.getAttribute( "href" ) === "/a" ),
1407273562Smarcel
1408273562Smarcel		// Make sure that element opacity exists
1409273562Smarcel		// (IE uses filter instead)
1410273562Smarcel		// Use a regex to work around a WebKit issue. See #5145
1411273562Smarcel		opacity: /^0.55/.test( a.style.opacity ),
1412273562Smarcel
1413273562Smarcel		// Verify style float existence
1414273562Smarcel		// (IE uses styleFloat instead of cssFloat)
1415273562Smarcel		cssFloat: !!a.style.cssFloat,
1416273562Smarcel
1417273562Smarcel		// Make sure unknown elements (like HTML5 elems) are handled appropriately
1418273562Smarcel		unknownElems: !!div.getElementsByTagName( "nav" ).length,
1419273562Smarcel
1420273562Smarcel		// Make sure that if no value is specified for a checkbox
1421273562Smarcel		// that it defaults to "on".
1422273562Smarcel		// (WebKit defaults to "" instead)
1423273562Smarcel		checkOn: ( input.value === "on" ),
1424273562Smarcel
1425273562Smarcel		// Make sure that a selected-by-default option has a working selected property.
1426273562Smarcel		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
1427273562Smarcel		optSelected: opt.selected,
1428273562Smarcel
1429273562Smarcel		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
1430273562Smarcel		getSetAttribute: div.className !== "t",
1431273562Smarcel
1432273562Smarcel		// Tests for enctype support on a form(#6743)
1433273562Smarcel		enctype: !!document.createElement("form").enctype,
1434273562Smarcel
1435273562Smarcel		// Will be defined later
1436273562Smarcel		submitBubbles: true,
1437273562Smarcel		changeBubbles: true,
1438273562Smarcel		focusinBubbles: false,
1439273562Smarcel		deleteExpando: true,
1440273562Smarcel		noCloneEvent: true,
1441273562Smarcel		inlineBlockNeedsLayout: false,
1442273562Smarcel		shrinkWrapBlocks: false,
1443273562Smarcel		reliableMarginRight: true
1444273562Smarcel	};
1445273562Smarcel
1446273562Smarcel	// Make sure checked status is properly cloned
1447273562Smarcel	input.checked = true;
1448273562Smarcel	support.noCloneChecked = input.cloneNode( true ).checked;
1449273562Smarcel
1450273562Smarcel	// Make sure that the options inside disabled selects aren't marked as disabled
1451273562Smarcel	// (WebKit marks them as disabled)
1452273562Smarcel	select.disabled = true;
1453273562Smarcel	support.optDisabled = !opt.disabled;
1454273562Smarcel
1455273562Smarcel	// Test to see if it's possible to delete an expando from an element
1456273562Smarcel	// Fails in Internet Explorer
1457273562Smarcel	try {
1458273562Smarcel		delete div.test;
1459273562Smarcel	} catch( e ) {
1460273562Smarcel		support.deleteExpando = false;
1461273562Smarcel	}
1462273562Smarcel
1463273562Smarcel	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
1464273562Smarcel		div.attachEvent( "onclick", function() {
1465273562Smarcel			// Cloning a node shouldn't copy over any
1466273562Smarcel			// bound event handlers (IE does this)
1467273562Smarcel			support.noCloneEvent = false;
1468273562Smarcel		});
1469273562Smarcel		div.cloneNode( true ).fireEvent( "onclick" );
1470273562Smarcel	}
1471273562Smarcel
1472273562Smarcel	// Check if a radio maintains its value
1473273562Smarcel	// after being appended to the DOM
1474273562Smarcel	input = document.createElement("input");
1475273562Smarcel	input.value = "t";
1476273562Smarcel	input.setAttribute("type", "radio");
1477273562Smarcel	support.radioValue = input.value === "t";
1478273562Smarcel
1479273562Smarcel	input.setAttribute("checked", "checked");
1480273562Smarcel	div.appendChild( input );
1481273562Smarcel	fragment = document.createDocumentFragment();
1482273562Smarcel	fragment.appendChild( div.lastChild );
1483273562Smarcel
1484273562Smarcel	// WebKit doesn't clone checked state correctly in fragments
1485273562Smarcel	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
1486273562Smarcel
1487273562Smarcel	div.innerHTML = "";
1488273562Smarcel
1489273562Smarcel	// Figure out if the W3C box model works as expected
1490273562Smarcel	div.style.width = div.style.paddingLeft = "1px";
1491273562Smarcel
1492273562Smarcel	// We don't want to do body-related feature tests on frameset
1493273562Smarcel	// documents, which lack a body. So we use
1494273562Smarcel	// document.getElementsByTagName("body")[0], which is undefined in
1495273562Smarcel	// frameset documents, while document.body isn���t. (7398)
1496273562Smarcel	body = document.getElementsByTagName("body")[ 0 ];
1497273562Smarcel	// We use our own, invisible, body unless the body is already present
1498273562Smarcel	// in which case we use a div (#9239)
1499273562Smarcel	testElement = document.createElement( body ? "div" : "body" );
1500273562Smarcel	testElementStyle = {
1501273562Smarcel		visibility: "hidden",
1502273562Smarcel		width: 0,
1503273562Smarcel		height: 0,
1504273562Smarcel		border: 0,
1505273562Smarcel		margin: 0,
1506273562Smarcel		background: "none"
1507273562Smarcel	};
1508273562Smarcel	if ( body ) {
1509273562Smarcel		jQuery.extend( testElementStyle, {
1510273562Smarcel			position: "absolute",
1511273562Smarcel			left: "-999px",
1512273562Smarcel			top: "-999px"
1513273562Smarcel		});
1514273562Smarcel	}
1515273562Smarcel	for ( i in testElementStyle ) {
1516273562Smarcel		testElement.style[ i ] = testElementStyle[ i ];
1517273562Smarcel	}
1518273562Smarcel	testElement.appendChild( div );
1519273562Smarcel	testElementParent = body || documentElement;
1520273562Smarcel	testElementParent.insertBefore( testElement, testElementParent.firstChild );
1521273562Smarcel
1522273562Smarcel	// Check if a disconnected checkbox will retain its checked
1523273562Smarcel	// value of true after appended to the DOM (IE6/7)
1524273562Smarcel	support.appendChecked = input.checked;
1525273562Smarcel
1526273562Smarcel	support.boxModel = div.offsetWidth === 2;
1527273562Smarcel
1528273562Smarcel	if ( "zoom" in div.style ) {
1529273562Smarcel		// Check if natively block-level elements act like inline-block
1530273562Smarcel		// elements when setting their display to 'inline' and giving
1531273562Smarcel		// them layout
1532273562Smarcel		// (IE < 8 does this)
1533273562Smarcel		div.style.display = "inline";
1534273562Smarcel		div.style.zoom = 1;
1535273562Smarcel		support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
1536273562Smarcel
1537273562Smarcel		// Check if elements with layout shrink-wrap their children
1538273562Smarcel		// (IE 6 does this)
1539273562Smarcel		div.style.display = "";
1540273562Smarcel		div.innerHTML = "<div style='width:4px;'></div>";
1541273562Smarcel		support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
1542273562Smarcel	}
1543273562Smarcel
1544273562Smarcel	div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
1545273562Smarcel	tds = div.getElementsByTagName( "td" );
1546273562Smarcel
1547273562Smarcel	// Check if table cells still have offsetWidth/Height when they are set
1548273562Smarcel	// to display:none and there are still other visible table cells in a
1549273562Smarcel	// table row; if so, offsetWidth/Height are not reliable for use when
1550273562Smarcel	// determining if an element has been hidden directly using
1551273562Smarcel	// display:none (it is still safe to use offsets if a parent element is
1552273562Smarcel	// hidden; don safety goggles and see bug #4512 for more information).
1553273562Smarcel	// (only IE 8 fails this test)
1554273562Smarcel	isSupported = ( tds[ 0 ].offsetHeight === 0 );
1555273562Smarcel
1556273562Smarcel	tds[ 0 ].style.display = "";
1557273562Smarcel	tds[ 1 ].style.display = "none";
1558273562Smarcel
1559273562Smarcel	// Check if empty table cells still have offsetWidth/Height
1560273562Smarcel	// (IE < 8 fail this test)
1561273562Smarcel	support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
1562273562Smarcel	div.innerHTML = "";
1563273562Smarcel
1564273562Smarcel	// Check if div with explicit width and no margin-right incorrectly
1565273562Smarcel	// gets computed margin-right based on width of container. For more
1566273562Smarcel	// info see bug #3333
1567273562Smarcel	// Fails in WebKit before Feb 2011 nightlies
1568273562Smarcel	// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
1569273562Smarcel	if ( document.defaultView && document.defaultView.getComputedStyle ) {
1570273562Smarcel		marginDiv = document.createElement( "div" );
1571273562Smarcel		marginDiv.style.width = "0";
1572273562Smarcel		marginDiv.style.marginRight = "0";
1573273562Smarcel		div.appendChild( marginDiv );
1574273562Smarcel		support.reliableMarginRight =
1575273562Smarcel			( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
1576273562Smarcel	}
1577273562Smarcel
1578273562Smarcel	// Technique from Juriy Zaytsev
1579273562Smarcel	// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
1580273562Smarcel	// We only care about the case where non-standard event systems
1581273562Smarcel	// are used, namely in IE. Short-circuiting here helps us to
1582273562Smarcel	// avoid an eval call (in setAttribute) which can cause CSP
1583273562Smarcel	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
1584273562Smarcel	if ( div.attachEvent ) {
1585273562Smarcel		for( i in {
1586273562Smarcel			submit: 1,
1587273562Smarcel			change: 1,
1588273562Smarcel			focusin: 1
1589273562Smarcel		} ) {
1590273562Smarcel			eventName = "on" + i;
1591273562Smarcel			isSupported = ( eventName in div );
1592273562Smarcel			if ( !isSupported ) {
1593273562Smarcel				div.setAttribute( eventName, "return;" );
1594273562Smarcel				isSupported = ( typeof div[ eventName ] === "function" );
1595273562Smarcel			}
1596273562Smarcel			support[ i + "Bubbles" ] = isSupported;
1597273562Smarcel		}
1598273562Smarcel	}
1599273562Smarcel
1600273562Smarcel	// Run fixed position tests at doc ready to avoid a crash
1601273562Smarcel	// related to the invisible body in IE8
1602273562Smarcel	jQuery(function() {
1603273562Smarcel		var container, outer, inner, table, td, offsetSupport,
1604273562Smarcel			conMarginTop = 1,
1605273562Smarcel			ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",
1606273562Smarcel			vb = "visibility:hidden;border:0;",
1607273562Smarcel			style = "style='" + ptlm + "border:5px solid #000;padding:0;'",
1608273562Smarcel			html = "<div " + style + "><div></div></div>" +
1609273562Smarcel							"<table " + style + " cellpadding='0' cellspacing='0'>" +
1610273562Smarcel							"<tr><td></td></tr></table>";
1611273562Smarcel
1612273562Smarcel		// Reconstruct a container
1613273562Smarcel		body = document.getElementsByTagName("body")[0];
1614273562Smarcel		if ( !body ) {
1615273562Smarcel			// Return for frameset docs that don't have a body
1616273562Smarcel			// These tests cannot be done
1617273562Smarcel			return;
1618273562Smarcel		}
1619273562Smarcel
1620273562Smarcel		container = document.createElement("div");
1621273562Smarcel		container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
1622273562Smarcel		body.insertBefore( container, body.firstChild );
1623273562Smarcel
1624273562Smarcel		// Construct a test element
1625273562Smarcel		testElement = document.createElement("div");
1626273562Smarcel		testElement.style.cssText = ptlm + vb;
1627273562Smarcel
1628273562Smarcel		testElement.innerHTML = html;
1629273562Smarcel		container.appendChild( testElement );
1630273562Smarcel		outer = testElement.firstChild;
1631273562Smarcel		inner = outer.firstChild;
1632273562Smarcel		td = outer.nextSibling.firstChild.firstChild;
1633273562Smarcel
1634273562Smarcel		offsetSupport = {
1635273562Smarcel			doesNotAddBorder: ( inner.offsetTop !== 5 ),
1636273562Smarcel			doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
1637273562Smarcel		};
1638273562Smarcel
1639273562Smarcel		inner.style.position = "fixed";
1640273562Smarcel		inner.style.top = "20px";
1641273562Smarcel
1642273562Smarcel		// safari subtracts parent border width here which is 5px
1643273562Smarcel		offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
1644273562Smarcel		inner.style.position = inner.style.top = "";
1645273562Smarcel
1646273562Smarcel		outer.style.overflow = "hidden";
1647273562Smarcel		outer.style.position = "relative";
1648273562Smarcel
1649273562Smarcel		offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
1650273562Smarcel		offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
1651273562Smarcel
1652273562Smarcel		body.removeChild( container );
1653273562Smarcel		testElement = container = null;
1654273562Smarcel
1655273562Smarcel		jQuery.extend( support, offsetSupport );
1656273562Smarcel	});
1657273562Smarcel
1658273562Smarcel	testElement.innerHTML = "";
1659273562Smarcel	testElementParent.removeChild( testElement );
1660273562Smarcel
1661273562Smarcel	// Null connected elements to avoid leaks in IE
1662273562Smarcel	testElement = fragment = select = opt = body = marginDiv = div = input = null;
1663273562Smarcel
1664273562Smarcel	return support;
1665273562Smarcel})();
1666273562Smarcel
1667273562Smarcel// Keep track of boxModel
1668273562SmarceljQuery.boxModel = jQuery.support.boxModel;
1669273562Smarcel
1670273562Smarcel
1671273562Smarcel
1672273562Smarcel
1673273562Smarcelvar rbrace = /^(?:\{.*\}|\[.*\])$/,
1674273562Smarcel	rmultiDash = /([A-Z])/g;
1675273562Smarcel
1676273562SmarceljQuery.extend({
1677273562Smarcel	cache: {},
1678273562Smarcel
1679273562Smarcel	// Please use with caution
1680273562Smarcel	uuid: 0,
1681273562Smarcel
1682273562Smarcel	// Unique for each copy of jQuery on the page
1683273562Smarcel	// Non-digits removed to match rinlinejQuery
1684273562Smarcel	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
1685273562Smarcel
1686273562Smarcel	// The following elements throw uncatchable exceptions if you
1687273562Smarcel	// attempt to add expando properties to them.
1688273562Smarcel	noData: {
1689273562Smarcel		"embed": true,
1690273562Smarcel		// Ban all objects except for Flash (which handle expandos)
1691273562Smarcel		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
1692273562Smarcel		"applet": true
1693273562Smarcel	},
1694273562Smarcel
1695273562Smarcel	hasData: function( elem ) {
1696273562Smarcel		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
1697273562Smarcel		return !!elem && !isEmptyDataObject( elem );
1698273562Smarcel	},
1699273562Smarcel
1700273562Smarcel	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
1701273562Smarcel		if ( !jQuery.acceptData( elem ) ) {
1702273562Smarcel			return;
1703273562Smarcel		}
1704273562Smarcel
1705273562Smarcel		var privateCache, thisCache, ret,
1706273562Smarcel			internalKey = jQuery.expando,
1707273562Smarcel			getByName = typeof name === "string",
1708273562Smarcel
1709273562Smarcel			// We have to handle DOM nodes and JS objects differently because IE6-7
1710273562Smarcel			// can't GC object references properly across the DOM-JS boundary
1711273562Smarcel			isNode = elem.nodeType,
1712273562Smarcel
1713273562Smarcel			// Only DOM nodes need the global jQuery cache; JS object data is
1714273562Smarcel			// attached directly to the object so GC can occur automatically
1715273562Smarcel			cache = isNode ? jQuery.cache : elem,
1716273562Smarcel
1717273562Smarcel			// Only defining an ID for JS objects if its cache already exists allows
1718273562Smarcel			// the code to shortcut on the same path as a DOM node with no cache
1719273562Smarcel			id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando,
1720273562Smarcel			isEvents = name === "events";
1721273562Smarcel
1722273562Smarcel		// Avoid doing any more work than we need to when trying to get data on an
1723273562Smarcel		// object that has no data at all
1724273562Smarcel		if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
1725273562Smarcel			return;
1726273562Smarcel		}
1727273562Smarcel
1728273562Smarcel		if ( !id ) {
1729273562Smarcel			// Only DOM nodes need a new unique ID for each element since their data
1730273562Smarcel			// ends up in the global cache
1731273562Smarcel			if ( isNode ) {
1732273562Smarcel				elem[ jQuery.expando ] = id = ++jQuery.uuid;
1733273562Smarcel			} else {
1734273562Smarcel				id = jQuery.expando;
1735273562Smarcel			}
1736273562Smarcel		}
1737273562Smarcel
1738273562Smarcel		if ( !cache[ id ] ) {
1739273562Smarcel			cache[ id ] = {};
1740273562Smarcel
1741273562Smarcel			// Avoids exposing jQuery metadata on plain JS objects when the object
1742273562Smarcel			// is serialized using JSON.stringify
1743273562Smarcel			if ( !isNode ) {
1744273562Smarcel				cache[ id ].toJSON = jQuery.noop;
1745273562Smarcel			}
1746273562Smarcel		}
1747273562Smarcel
1748273562Smarcel		// An object can be passed to jQuery.data instead of a key/value pair; this gets
1749273562Smarcel		// shallow copied over onto the existing cache
1750273562Smarcel		if ( typeof name === "object" || typeof name === "function" ) {
1751273562Smarcel			if ( pvt ) {
1752273562Smarcel				cache[ id ] = jQuery.extend( cache[ id ], name );
1753273562Smarcel			} else {
1754273562Smarcel				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
1755273562Smarcel			}
1756273562Smarcel		}
1757273562Smarcel
1758273562Smarcel		privateCache = thisCache = cache[ id ];
1759273562Smarcel
1760273562Smarcel		// jQuery data() is stored in a separate object inside the object's internal data
1761273562Smarcel		// cache in order to avoid key collisions between internal data and user-defined
1762273562Smarcel		// data.
1763273562Smarcel		if ( !pvt ) {
1764273562Smarcel			if ( !thisCache.data ) {
1765273562Smarcel				thisCache.data = {};
1766273562Smarcel			}
1767273562Smarcel
1768273562Smarcel			thisCache = thisCache.data;
1769273562Smarcel		}
1770273562Smarcel
1771273562Smarcel		if ( data !== undefined ) {
1772273562Smarcel			thisCache[ jQuery.camelCase( name ) ] = data;
1773273562Smarcel		}
1774273562Smarcel
1775273562Smarcel		// Users should not attempt to inspect the internal events object using jQuery.data,
1776273562Smarcel		// it is undocumented and subject to change. But does anyone listen? No.
1777273562Smarcel		if ( isEvents && !thisCache[ name ] ) {
1778273562Smarcel			return privateCache.events;
1779273562Smarcel		}
1780273562Smarcel
1781273562Smarcel		// Check for both converted-to-camel and non-converted data property names
1782273562Smarcel		// If a data property was specified
1783273562Smarcel		if ( getByName ) {
1784273562Smarcel
1785273562Smarcel			// First Try to find as-is property data
1786273562Smarcel			ret = thisCache[ name ];
1787273562Smarcel
1788273562Smarcel			// Test for null|undefined property data
1789273562Smarcel			if ( ret == null ) {
1790273562Smarcel
1791273562Smarcel				// Try to find the camelCased property
1792273562Smarcel				ret = thisCache[ jQuery.camelCase( name ) ];
1793273562Smarcel			}
1794273562Smarcel		} else {
1795273562Smarcel			ret = thisCache;
1796273562Smarcel		}
1797273562Smarcel
1798273562Smarcel		return ret;
1799273562Smarcel	},
1800273562Smarcel
1801273562Smarcel	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
1802273562Smarcel		if ( !jQuery.acceptData( elem ) ) {
1803273562Smarcel			return;
1804273562Smarcel		}
1805273562Smarcel
1806273562Smarcel		var thisCache, i, l,
1807273562Smarcel
1808273562Smarcel			// Reference to internal data cache key
1809273562Smarcel			internalKey = jQuery.expando,
1810273562Smarcel
1811273562Smarcel			isNode = elem.nodeType,
1812273562Smarcel
1813273562Smarcel			// See jQuery.data for more information
1814273562Smarcel			cache = isNode ? jQuery.cache : elem,
1815273562Smarcel
1816273562Smarcel			// See jQuery.data for more information
1817273562Smarcel			id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
1818273562Smarcel
1819273562Smarcel		// If there is already no cache entry for this object, there is no
1820273562Smarcel		// purpose in continuing
1821273562Smarcel		if ( !cache[ id ] ) {
1822273562Smarcel			return;
1823273562Smarcel		}
1824273562Smarcel
1825273562Smarcel		if ( name ) {
1826273562Smarcel
1827273562Smarcel			thisCache = pvt ? cache[ id ] : cache[ id ].data;
1828273562Smarcel
1829273562Smarcel			if ( thisCache ) {
1830273562Smarcel
1831273562Smarcel				// Support space separated names
1832273562Smarcel				if ( jQuery.isArray( name ) ) {
1833273562Smarcel					name = name;
1834273562Smarcel				} else if ( name in thisCache ) {
1835273562Smarcel					name = [ name ];
1836273562Smarcel				} else {
1837273562Smarcel
1838273562Smarcel					// split the camel cased version by spaces
1839273562Smarcel					name = jQuery.camelCase( name );
1840273562Smarcel					if ( name in thisCache ) {
1841273562Smarcel						name = [ name ];
1842273562Smarcel					} else {
1843273562Smarcel						name = name.split( " " );
1844273562Smarcel					}
1845273562Smarcel				}
1846273562Smarcel
1847273562Smarcel				for ( i = 0, l = name.length; i < l; i++ ) {
1848273562Smarcel					delete thisCache[ name[i] ];
1849273562Smarcel				}
1850273562Smarcel
1851273562Smarcel				// If there is no data left in the cache, we want to continue
1852273562Smarcel				// and let the cache object itself get destroyed
1853273562Smarcel				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
1854273562Smarcel					return;
1855273562Smarcel				}
1856273562Smarcel			}
1857273562Smarcel		}
1858273562Smarcel
1859273562Smarcel		// See jQuery.data for more information
1860273562Smarcel		if ( !pvt ) {
1861273562Smarcel			delete cache[ id ].data;
1862273562Smarcel
1863273562Smarcel			// Don't destroy the parent cache unless the internal data object
1864273562Smarcel			// had been the only thing left in it
1865273562Smarcel			if ( !isEmptyDataObject(cache[ id ]) ) {
1866273562Smarcel				return;
1867273562Smarcel			}
1868273562Smarcel		}
1869273562Smarcel
1870273562Smarcel		// Browsers that fail expando deletion also refuse to delete expandos on
1871273562Smarcel		// the window, but it will allow it on all other JS objects; other browsers
1872273562Smarcel		// don't care
1873273562Smarcel		// Ensure that `cache` is not a window object #10080
1874273562Smarcel		if ( jQuery.support.deleteExpando || !cache.setInterval ) {
1875273562Smarcel			delete cache[ id ];
1876273562Smarcel		} else {
1877273562Smarcel			cache[ id ] = null;
1878273562Smarcel		}
1879273562Smarcel
1880273562Smarcel		// We destroyed the cache and need to eliminate the expando on the node to avoid
1881273562Smarcel		// false lookups in the cache for entries that no longer exist
1882273562Smarcel		if ( isNode ) {
1883273562Smarcel			// IE does not allow us to delete expando properties from nodes,
1884273562Smarcel			// nor does it have a removeAttribute function on Document nodes;
1885273562Smarcel			// we must handle all of these cases
1886273562Smarcel			if ( jQuery.support.deleteExpando ) {
1887273562Smarcel				delete elem[ jQuery.expando ];
1888273562Smarcel			} else if ( elem.removeAttribute ) {
1889273562Smarcel				elem.removeAttribute( jQuery.expando );
1890273562Smarcel			} else {
1891273562Smarcel				elem[ jQuery.expando ] = null;
1892273562Smarcel			}
1893273562Smarcel		}
1894273562Smarcel	},
1895273562Smarcel
1896273562Smarcel	// For internal use only.
1897273562Smarcel	_data: function( elem, name, data ) {
1898273562Smarcel		return jQuery.data( elem, name, data, true );
1899273562Smarcel	},
1900273562Smarcel
1901273562Smarcel	// A method for determining if a DOM node can handle the data expando
1902273562Smarcel	acceptData: function( elem ) {
1903273562Smarcel		if ( elem.nodeName ) {
1904273562Smarcel			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
1905273562Smarcel
1906273562Smarcel			if ( match ) {
1907273562Smarcel				return !(match === true || elem.getAttribute("classid") !== match);
1908273562Smarcel			}
1909273562Smarcel		}
1910273562Smarcel
1911273562Smarcel		return true;
1912273562Smarcel	}
1913273562Smarcel});
1914273562Smarcel
1915273562SmarceljQuery.fn.extend({
1916273562Smarcel	data: function( key, value ) {
1917273562Smarcel		var parts, attr, name,
1918273562Smarcel			data = null;
1919273562Smarcel
1920273562Smarcel		if ( typeof key === "undefined" ) {
1921273562Smarcel			if ( this.length ) {
1922273562Smarcel				data = jQuery.data( this[0] );
1923273562Smarcel
1924273562Smarcel				if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) {
1925273562Smarcel					attr = this[0].attributes;
1926273562Smarcel					for ( var i = 0, l = attr.length; i < l; i++ ) {
1927273562Smarcel						name = attr[i].name;
1928273562Smarcel
1929273562Smarcel						if ( name.indexOf( "data-" ) === 0 ) {
1930273562Smarcel							name = jQuery.camelCase( name.substring(5) );
1931273562Smarcel
1932273562Smarcel							dataAttr( this[0], name, data[ name ] );
1933273562Smarcel						}
1934273562Smarcel					}
1935273562Smarcel					jQuery._data( this[0], "parsedAttrs", true );
1936273562Smarcel				}
1937273562Smarcel			}
1938273562Smarcel
1939273562Smarcel			return data;
1940273562Smarcel
1941273562Smarcel		} else if ( typeof key === "object" ) {
1942273562Smarcel			return this.each(function() {
1943273562Smarcel				jQuery.data( this, key );
1944273562Smarcel			});
1945273562Smarcel		}
1946273562Smarcel
1947273562Smarcel		parts = key.split(".");
1948273562Smarcel		parts[1] = parts[1] ? "." + parts[1] : "";
1949273562Smarcel
1950273562Smarcel		if ( value === undefined ) {
1951273562Smarcel			data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1952273562Smarcel
1953273562Smarcel			// Try to fetch any internally stored data first
1954273562Smarcel			if ( data === undefined && this.length ) {
1955273562Smarcel				data = jQuery.data( this[0], key );
1956273562Smarcel				data = dataAttr( this[0], key, data );
1957273562Smarcel			}
1958273562Smarcel
1959273562Smarcel			return data === undefined && parts[1] ?
1960273562Smarcel				this.data( parts[0] ) :
1961273562Smarcel				data;
1962273562Smarcel
1963273562Smarcel		} else {
1964273562Smarcel			return this.each(function() {
1965273562Smarcel				var $this = jQuery( this ),
1966273562Smarcel					args = [ parts[0], value ];
1967273562Smarcel
1968273562Smarcel				$this.triggerHandler( "setData" + parts[1] + "!", args );
1969273562Smarcel				jQuery.data( this, key, value );
1970273562Smarcel				$this.triggerHandler( "changeData" + parts[1] + "!", args );
1971273562Smarcel			});
1972273562Smarcel		}
1973273562Smarcel	},
1974273562Smarcel
1975273562Smarcel	removeData: function( key ) {
1976273562Smarcel		return this.each(function() {
1977273562Smarcel			jQuery.removeData( this, key );
1978273562Smarcel		});
1979273562Smarcel	}
1980273562Smarcel});
1981273562Smarcel
1982273562Smarcelfunction dataAttr( elem, key, data ) {
1983273562Smarcel	// If nothing was found internally, try to fetch any
1984273562Smarcel	// data from the HTML5 data-* attribute
1985273562Smarcel	if ( data === undefined && elem.nodeType === 1 ) {
1986273562Smarcel
1987273562Smarcel		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
1988273562Smarcel
1989273562Smarcel		data = elem.getAttribute( name );
1990273562Smarcel
1991273562Smarcel		if ( typeof data === "string" ) {
1992273562Smarcel			try {
1993273562Smarcel				data = data === "true" ? true :
1994273562Smarcel				data === "false" ? false :
1995273562Smarcel				data === "null" ? null :
1996273562Smarcel				jQuery.isNumeric( data ) ? parseFloat( data ) :
1997273562Smarcel					rbrace.test( data ) ? jQuery.parseJSON( data ) :
1998273562Smarcel					data;
1999273562Smarcel			} catch( e ) {}
2000273562Smarcel
2001273562Smarcel			// Make sure we set the data so it isn't changed later
2002273562Smarcel			jQuery.data( elem, key, data );
2003273562Smarcel
2004273562Smarcel		} else {
2005273562Smarcel			data = undefined;
2006273562Smarcel		}
2007273562Smarcel	}
2008273562Smarcel
2009273562Smarcel	return data;
2010273562Smarcel}
2011273562Smarcel
2012273562Smarcel// checks a cache object for emptiness
2013273562Smarcelfunction isEmptyDataObject( obj ) {
2014273562Smarcel	for ( var name in obj ) {
2015273562Smarcel
2016273562Smarcel		// if the public data object is empty, the private is still empty
2017273562Smarcel		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
2018273562Smarcel			continue;
2019273562Smarcel		}
2020273562Smarcel		if ( name !== "toJSON" ) {
2021273562Smarcel			return false;
2022273562Smarcel		}
2023273562Smarcel	}
2024273562Smarcel
2025273562Smarcel	return true;
2026273562Smarcel}
2027273562Smarcel
2028273562Smarcel
2029273562Smarcel
2030273562Smarcel
2031273562Smarcelfunction handleQueueMarkDefer( elem, type, src ) {
2032273562Smarcel	var deferDataKey = type + "defer",
2033273562Smarcel		queueDataKey = type + "queue",
2034273562Smarcel		markDataKey = type + "mark",
2035273562Smarcel		defer = jQuery._data( elem, deferDataKey );
2036273562Smarcel	if ( defer &&
2037273562Smarcel		( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
2038273562Smarcel		( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
2039273562Smarcel		// Give room for hard-coded callbacks to fire first
2040273562Smarcel		// and eventually mark/queue something else on the element
2041273562Smarcel		setTimeout( function() {
2042273562Smarcel			if ( !jQuery._data( elem, queueDataKey ) &&
2043273562Smarcel				!jQuery._data( elem, markDataKey ) ) {
2044273562Smarcel				jQuery.removeData( elem, deferDataKey, true );
2045273562Smarcel				defer.fire();
2046273562Smarcel			}
2047273562Smarcel		}, 0 );
2048273562Smarcel	}
2049273562Smarcel}
2050273562Smarcel
2051273562SmarceljQuery.extend({
2052273562Smarcel
2053273562Smarcel	_mark: function( elem, type ) {
2054273562Smarcel		if ( elem ) {
2055273562Smarcel			type = ( type || "fx" ) + "mark";
2056273562Smarcel			jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
2057273562Smarcel		}
2058273562Smarcel	},
2059273562Smarcel
2060273562Smarcel	_unmark: function( force, elem, type ) {
2061273562Smarcel		if ( force !== true ) {
2062273562Smarcel			type = elem;
2063273562Smarcel			elem = force;
2064273562Smarcel			force = false;
2065273562Smarcel		}
2066273562Smarcel		if ( elem ) {
2067273562Smarcel			type = type || "fx";
2068273562Smarcel			var key = type + "mark",
2069273562Smarcel				count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
2070273562Smarcel			if ( count ) {
2071273562Smarcel				jQuery._data( elem, key, count );
2072273562Smarcel			} else {
2073273562Smarcel				jQuery.removeData( elem, key, true );
2074273562Smarcel				handleQueueMarkDefer( elem, type, "mark" );
2075273562Smarcel			}
2076273562Smarcel		}
2077273562Smarcel	},
2078273562Smarcel
2079273562Smarcel	queue: function( elem, type, data ) {
2080273562Smarcel		var q;
2081273562Smarcel		if ( elem ) {
2082273562Smarcel			type = ( type || "fx" ) + "queue";
2083273562Smarcel			q = jQuery._data( elem, type );
2084273562Smarcel
2085273562Smarcel			// Speed up dequeue by getting out quickly if this is just a lookup
2086273562Smarcel			if ( data ) {
2087273562Smarcel				if ( !q || jQuery.isArray(data) ) {
2088273562Smarcel					q = jQuery._data( elem, type, jQuery.makeArray(data) );
2089273562Smarcel				} else {
2090273562Smarcel					q.push( data );
2091273562Smarcel				}
2092273562Smarcel			}
2093273562Smarcel			return q || [];
2094273562Smarcel		}
2095273562Smarcel	},
2096273562Smarcel
2097273562Smarcel	dequeue: function( elem, type ) {
2098273562Smarcel		type = type || "fx";
2099273562Smarcel
2100273562Smarcel		var queue = jQuery.queue( elem, type ),
2101273562Smarcel			fn = queue.shift(),
2102273562Smarcel			hooks = {};
2103273562Smarcel
2104273562Smarcel		// If the fx queue is dequeued, always remove the progress sentinel
2105273562Smarcel		if ( fn === "inprogress" ) {
2106273562Smarcel			fn = queue.shift();
2107273562Smarcel		}
2108273562Smarcel
2109273562Smarcel		if ( fn ) {
2110273562Smarcel			// Add a progress sentinel to prevent the fx queue from being
2111273562Smarcel			// automatically dequeued
2112273562Smarcel			if ( type === "fx" ) {
2113273562Smarcel				queue.unshift( "inprogress" );
2114273562Smarcel			}
2115273562Smarcel
2116273562Smarcel			jQuery._data( elem, type + ".run", hooks );
2117273562Smarcel			fn.call( elem, function() {
2118273562Smarcel				jQuery.dequeue( elem, type );
2119273562Smarcel			}, hooks );
2120273562Smarcel		}
2121273562Smarcel
2122273562Smarcel		if ( !queue.length ) {
2123273562Smarcel			jQuery.removeData( elem, type + "queue " + type + ".run", true );
2124273562Smarcel			handleQueueMarkDefer( elem, type, "queue" );
2125273562Smarcel		}
2126273562Smarcel	}
2127273562Smarcel});
2128273562Smarcel
2129273562SmarceljQuery.fn.extend({
2130273562Smarcel	queue: function( type, data ) {
2131273562Smarcel		if ( typeof type !== "string" ) {
2132273562Smarcel			data = type;
2133273562Smarcel			type = "fx";
2134273562Smarcel		}
2135273562Smarcel
2136273562Smarcel		if ( data === undefined ) {
2137273562Smarcel			return jQuery.queue( this[0], type );
2138273562Smarcel		}
2139273562Smarcel		return this.each(function() {
2140273562Smarcel			var queue = jQuery.queue( this, type, data );
2141273562Smarcel
2142273562Smarcel			if ( type === "fx" && queue[0] !== "inprogress" ) {
2143273562Smarcel				jQuery.dequeue( this, type );
2144273562Smarcel			}
2145273562Smarcel		});
2146273562Smarcel	},
2147273562Smarcel	dequeue: function( type ) {
2148273562Smarcel		return this.each(function() {
2149273562Smarcel			jQuery.dequeue( this, type );
2150273562Smarcel		});
2151273562Smarcel	},
2152273562Smarcel	// Based off of the plugin by Clint Helfers, with permission.
2153273562Smarcel	// http://blindsignals.com/index.php/2009/07/jquery-delay/
2154273562Smarcel	delay: function( time, type ) {
2155273562Smarcel		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
2156273562Smarcel		type = type || "fx";
2157273562Smarcel
2158273562Smarcel		return this.queue( type, function( next, hooks ) {
2159273562Smarcel			var timeout = setTimeout( next, time );
2160273562Smarcel			hooks.stop = function() {
2161273562Smarcel				clearTimeout( timeout );
2162273562Smarcel			};
2163273562Smarcel		});
2164273562Smarcel	},
2165273562Smarcel	clearQueue: function( type ) {
2166273562Smarcel		return this.queue( type || "fx", [] );
2167273562Smarcel	},
2168273562Smarcel	// Get a promise resolved when queues of a certain type
2169273562Smarcel	// are emptied (fx is the type by default)
2170273562Smarcel	promise: function( type, object ) {
2171273562Smarcel		if ( typeof type !== "string" ) {
2172273562Smarcel			object = type;
2173273562Smarcel			type = undefined;
2174273562Smarcel		}
2175273562Smarcel		type = type || "fx";
2176273562Smarcel		var defer = jQuery.Deferred(),
2177273562Smarcel			elements = this,
2178273562Smarcel			i = elements.length,
2179273562Smarcel			count = 1,
2180273562Smarcel			deferDataKey = type + "defer",
2181273562Smarcel			queueDataKey = type + "queue",
2182273562Smarcel			markDataKey = type + "mark",
2183273562Smarcel			tmp;
2184273562Smarcel		function resolve() {
2185273562Smarcel			if ( !( --count ) ) {
2186273562Smarcel				defer.resolveWith( elements, [ elements ] );
2187273562Smarcel			}
2188273562Smarcel		}
2189273562Smarcel		while( i-- ) {
2190273562Smarcel			if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
2191273562Smarcel					( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
2192273562Smarcel						jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
2193273562Smarcel					jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
2194273562Smarcel				count++;
2195273562Smarcel				tmp.add( resolve );
2196273562Smarcel			}
2197273562Smarcel		}
2198273562Smarcel		resolve();
2199273562Smarcel		return defer.promise();
2200273562Smarcel	}
2201273562Smarcel});
2202273562Smarcel
2203273562Smarcel
2204273562Smarcel
2205273562Smarcel
2206273562Smarcelvar rclass = /[\n\t\r]/g,
2207273562Smarcel	rspace = /\s+/,
2208273562Smarcel	rreturn = /\r/g,
2209273562Smarcel	rtype = /^(?:button|input)$/i,
2210273562Smarcel	rfocusable = /^(?:button|input|object|select|textarea)$/i,
2211273562Smarcel	rclickable = /^a(?:rea)?$/i,
2212273562Smarcel	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
2213273562Smarcel	getSetAttribute = jQuery.support.getSetAttribute,
2214273562Smarcel	nodeHook, boolHook, fixSpecified;
2215273562Smarcel
2216273562SmarceljQuery.fn.extend({
2217273562Smarcel	attr: function( name, value ) {
2218273562Smarcel		return jQuery.access( this, name, value, true, jQuery.attr );
2219273562Smarcel	},
2220273562Smarcel
2221273562Smarcel	removeAttr: function( name ) {
2222273562Smarcel		return this.each(function() {
2223273562Smarcel			jQuery.removeAttr( this, name );
2224273562Smarcel		});
2225273562Smarcel	},
2226273562Smarcel
2227273562Smarcel	prop: function( name, value ) {
2228273562Smarcel		return jQuery.access( this, name, value, true, jQuery.prop );
2229273562Smarcel	},
2230273562Smarcel
2231273562Smarcel	removeProp: function( name ) {
2232273562Smarcel		name = jQuery.propFix[ name ] || name;
2233273562Smarcel		return this.each(function() {
2234273562Smarcel			// try/catch handles cases where IE balks (such as removing a property on window)
2235273562Smarcel			try {
2236273562Smarcel				this[ name ] = undefined;
2237273562Smarcel				delete this[ name ];
2238273562Smarcel			} catch( e ) {}
2239273562Smarcel		});
2240273562Smarcel	},
2241273562Smarcel
2242273562Smarcel	addClass: function( value ) {
2243273562Smarcel		var classNames, i, l, elem,
2244273562Smarcel			setClass, c, cl;
2245273562Smarcel
2246273562Smarcel		if ( jQuery.isFunction( value ) ) {
2247273562Smarcel			return this.each(function( j ) {
2248273562Smarcel				jQuery( this ).addClass( value.call(this, j, this.className) );
2249273562Smarcel			});
2250273562Smarcel		}
2251273562Smarcel
2252273562Smarcel		if ( value && typeof value === "string" ) {
2253273562Smarcel			classNames = value.split( rspace );
2254273562Smarcel
2255273562Smarcel			for ( i = 0, l = this.length; i < l; i++ ) {
2256273562Smarcel				elem = this[ i ];
2257273562Smarcel
2258273562Smarcel				if ( elem.nodeType === 1 ) {
2259273562Smarcel					if ( !elem.className && classNames.length === 1 ) {
2260273562Smarcel						elem.className = value;
2261273562Smarcel
2262273562Smarcel					} else {
2263273562Smarcel						setClass = " " + elem.className + " ";
2264273562Smarcel
2265273562Smarcel						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
2266273562Smarcel							if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
2267273562Smarcel								setClass += classNames[ c ] + " ";
2268273562Smarcel							}
2269273562Smarcel						}
2270273562Smarcel						elem.className = jQuery.trim( setClass );
2271273562Smarcel					}
2272273562Smarcel				}
2273273562Smarcel			}
2274273562Smarcel		}
2275273562Smarcel
2276273562Smarcel		return this;
2277273562Smarcel	},
2278273562Smarcel
2279273562Smarcel	removeClass: function( value ) {
2280273562Smarcel		var classNames, i, l, elem, className, c, cl;
2281273562Smarcel
2282273562Smarcel		if ( jQuery.isFunction( value ) ) {
2283273562Smarcel			return this.each(function( j ) {
2284273562Smarcel				jQuery( this ).removeClass( value.call(this, j, this.className) );
2285273562Smarcel			});
2286273562Smarcel		}
2287273562Smarcel
2288273562Smarcel		if ( (value && typeof value === "string") || value === undefined ) {
2289273562Smarcel			classNames = ( value || "" ).split( rspace );
2290273562Smarcel
2291273562Smarcel			for ( i = 0, l = this.length; i < l; i++ ) {
2292273562Smarcel				elem = this[ i ];
2293273562Smarcel
2294273562Smarcel				if ( elem.nodeType === 1 && elem.className ) {
2295273562Smarcel					if ( value ) {
2296273562Smarcel						className = (" " + elem.className + " ").replace( rclass, " " );
2297273562Smarcel						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
2298273562Smarcel							className = className.replace(" " + classNames[ c ] + " ", " ");
2299273562Smarcel						}
2300273562Smarcel						elem.className = jQuery.trim( className );
2301273562Smarcel
2302273562Smarcel					} else {
2303273562Smarcel						elem.className = "";
2304273562Smarcel					}
2305273562Smarcel				}
2306273562Smarcel			}
2307273562Smarcel		}
2308273562Smarcel
2309273562Smarcel		return this;
2310273562Smarcel	},
2311273562Smarcel
2312273562Smarcel	toggleClass: function( value, stateVal ) {
2313273562Smarcel		var type = typeof value,
2314273562Smarcel			isBool = typeof stateVal === "boolean";
2315273562Smarcel
2316273562Smarcel		if ( jQuery.isFunction( value ) ) {
2317273562Smarcel			return this.each(function( i ) {
2318273562Smarcel				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
2319273562Smarcel			});
2320273562Smarcel		}
2321273562Smarcel
2322273562Smarcel		return this.each(function() {
2323273562Smarcel			if ( type === "string" ) {
2324273562Smarcel				// toggle individual class names
2325273562Smarcel				var className,
2326273562Smarcel					i = 0,
2327273562Smarcel					self = jQuery( this ),
2328273562Smarcel					state = stateVal,
2329273562Smarcel					classNames = value.split( rspace );
2330273562Smarcel
2331273562Smarcel				while ( (className = classNames[ i++ ]) ) {
2332273562Smarcel					// check each className given, space seperated list
2333273562Smarcel					state = isBool ? state : !self.hasClass( className );
2334273562Smarcel					self[ state ? "addClass" : "removeClass" ]( className );
2335273562Smarcel				}
2336273562Smarcel
2337273562Smarcel			} else if ( type === "undefined" || type === "boolean" ) {
2338273562Smarcel				if ( this.className ) {
2339273562Smarcel					// store className if set
2340273562Smarcel					jQuery._data( this, "__className__", this.className );
2341273562Smarcel				}
2342273562Smarcel
2343273562Smarcel				// toggle whole className
2344273562Smarcel				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
2345273562Smarcel			}
2346273562Smarcel		});
2347273562Smarcel	},
2348273562Smarcel
2349273562Smarcel	hasClass: function( selector ) {
2350273562Smarcel		var className = " " + selector + " ",
2351273562Smarcel			i = 0,
2352273562Smarcel			l = this.length;
2353273562Smarcel		for ( ; i < l; i++ ) {
2354273562Smarcel			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
2355273562Smarcel				return true;
2356273562Smarcel			}
2357273562Smarcel		}
2358273562Smarcel
2359273562Smarcel		return false;
2360273562Smarcel	},
2361273562Smarcel
2362273562Smarcel	val: function( value ) {
2363273562Smarcel		var hooks, ret, isFunction,
2364273562Smarcel			elem = this[0];
2365273562Smarcel
2366273562Smarcel		if ( !arguments.length ) {
2367273562Smarcel			if ( elem ) {
2368273562Smarcel				hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
2369273562Smarcel
2370273562Smarcel				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
2371273562Smarcel					return ret;
2372273562Smarcel				}
2373273562Smarcel
2374273562Smarcel				ret = elem.value;
2375273562Smarcel
2376273562Smarcel				return typeof ret === "string" ?
2377273562Smarcel					// handle most common string cases
2378273562Smarcel					ret.replace(rreturn, "") :
2379273562Smarcel					// handle cases where value is null/undef or number
2380273562Smarcel					ret == null ? "" : ret;
2381273562Smarcel			}
2382273562Smarcel
2383273562Smarcel			return undefined;
2384273562Smarcel		}
2385273562Smarcel
2386273562Smarcel		isFunction = jQuery.isFunction( value );
2387273562Smarcel
2388273562Smarcel		return this.each(function( i ) {
2389273562Smarcel			var self = jQuery(this), val;
2390273562Smarcel
2391273562Smarcel			if ( this.nodeType !== 1 ) {
2392273562Smarcel				return;
2393273562Smarcel			}
2394273562Smarcel
2395273562Smarcel			if ( isFunction ) {
2396273562Smarcel				val = value.call( this, i, self.val() );
2397273562Smarcel			} else {
2398273562Smarcel				val = value;
2399273562Smarcel			}
2400273562Smarcel
2401273562Smarcel			// Treat null/undefined as ""; convert numbers to string
2402273562Smarcel			if ( val == null ) {
2403273562Smarcel				val = "";
2404273562Smarcel			} else if ( typeof val === "number" ) {
2405273562Smarcel				val += "";
2406273562Smarcel			} else if ( jQuery.isArray( val ) ) {
2407273562Smarcel				val = jQuery.map(val, function ( value ) {
2408273562Smarcel					return value == null ? "" : value + "";
2409273562Smarcel				});
2410273562Smarcel			}
2411273562Smarcel
2412273562Smarcel			hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
2413273562Smarcel
2414273562Smarcel			// If set returns undefined, fall back to normal setting
2415273562Smarcel			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
2416273562Smarcel				this.value = val;
2417273562Smarcel			}
2418273562Smarcel		});
2419273562Smarcel	}
2420273562Smarcel});
2421273562Smarcel
2422273562SmarceljQuery.extend({
2423273562Smarcel	valHooks: {
2424273562Smarcel		option: {
2425273562Smarcel			get: function( elem ) {
2426273562Smarcel				// attributes.value is undefined in Blackberry 4.7 but
2427273562Smarcel				// uses .value. See #6932
2428273562Smarcel				var val = elem.attributes.value;
2429273562Smarcel				return !val || val.specified ? elem.value : elem.text;
2430273562Smarcel			}
2431273562Smarcel		},
2432273562Smarcel		select: {
2433273562Smarcel			get: function( elem ) {
2434273562Smarcel				var value, i, max, option,
2435273562Smarcel					index = elem.selectedIndex,
2436273562Smarcel					values = [],
2437273562Smarcel					options = elem.options,
2438273562Smarcel					one = elem.type === "select-one";
2439273562Smarcel
2440273562Smarcel				// Nothing was selected
2441273562Smarcel				if ( index < 0 ) {
2442273562Smarcel					return null;
2443273562Smarcel				}
2444273562Smarcel
2445273562Smarcel				// Loop through all the selected options
2446273562Smarcel				i = one ? index : 0;
2447273562Smarcel				max = one ? index + 1 : options.length;
2448273562Smarcel				for ( ; i < max; i++ ) {
2449273562Smarcel					option = options[ i ];
2450273562Smarcel
2451273562Smarcel					// Don't return options that are disabled or in a disabled optgroup
2452273562Smarcel					if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
2453273562Smarcel							(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
2454273562Smarcel
2455273562Smarcel						// Get the specific value for the option
2456273562Smarcel						value = jQuery( option ).val();
2457273562Smarcel
2458273562Smarcel						// We don't need an array for one selects
2459273562Smarcel						if ( one ) {
2460273562Smarcel							return value;
2461273562Smarcel						}
2462273562Smarcel
2463273562Smarcel						// Multi-Selects return an array
2464273562Smarcel						values.push( value );
2465273562Smarcel					}
2466273562Smarcel				}
2467273562Smarcel
2468273562Smarcel				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
2469273562Smarcel				if ( one && !values.length && options.length ) {
2470273562Smarcel					return jQuery( options[ index ] ).val();
2471273562Smarcel				}
2472273562Smarcel
2473273562Smarcel				return values;
2474273562Smarcel			},
2475273562Smarcel
2476273562Smarcel			set: function( elem, value ) {
2477273562Smarcel				var values = jQuery.makeArray( value );
2478273562Smarcel
2479273562Smarcel				jQuery(elem).find("option").each(function() {
2480273562Smarcel					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
2481273562Smarcel				});
2482273562Smarcel
2483273562Smarcel				if ( !values.length ) {
2484273562Smarcel					elem.selectedIndex = -1;
2485273562Smarcel				}
2486273562Smarcel				return values;
2487273562Smarcel			}
2488273562Smarcel		}
2489273562Smarcel	},
2490273562Smarcel
2491273562Smarcel	attrFn: {
2492273562Smarcel		val: true,
2493273562Smarcel		css: true,
2494273562Smarcel		html: true,
2495273562Smarcel		text: true,
2496273562Smarcel		data: true,
2497273562Smarcel		width: true,
2498273562Smarcel		height: true,
2499273562Smarcel		offset: true
2500273562Smarcel	},
2501273562Smarcel
2502273562Smarcel	attr: function( elem, name, value, pass ) {
2503273562Smarcel		var ret, hooks, notxml,
2504273562Smarcel			nType = elem.nodeType;
2505273562Smarcel
2506273562Smarcel		// don't get/set attributes on text, comment and attribute nodes
2507273562Smarcel		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2508273562Smarcel			return undefined;
2509273562Smarcel		}
2510273562Smarcel
2511273562Smarcel		if ( pass && name in jQuery.attrFn ) {
2512273562Smarcel			return jQuery( elem )[ name ]( value );
2513273562Smarcel		}
2514273562Smarcel
2515273562Smarcel		// Fallback to prop when attributes are not supported
2516273562Smarcel		if ( !("getAttribute" in elem) ) {
2517273562Smarcel			return jQuery.prop( elem, name, value );
2518273562Smarcel		}
2519273562Smarcel
2520273562Smarcel		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2521273562Smarcel
2522273562Smarcel		// All attributes are lowercase
2523273562Smarcel		// Grab necessary hook if one is defined
2524273562Smarcel		if ( notxml ) {
2525273562Smarcel			name = name.toLowerCase();
2526273562Smarcel			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
2527273562Smarcel		}
2528273562Smarcel
2529273562Smarcel		if ( value !== undefined ) {
2530273562Smarcel
2531273562Smarcel			if ( value === null ) {
2532273562Smarcel				jQuery.removeAttr( elem, name );
2533273562Smarcel				return undefined;
2534273562Smarcel
2535273562Smarcel			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
2536273562Smarcel				return ret;
2537273562Smarcel
2538273562Smarcel			} else {
2539273562Smarcel				elem.setAttribute( name, "" + value );
2540273562Smarcel				return value;
2541273562Smarcel			}
2542273562Smarcel
2543273562Smarcel		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
2544273562Smarcel			return ret;
2545273562Smarcel
2546273562Smarcel		} else {
2547273562Smarcel
2548273562Smarcel			ret = elem.getAttribute( name );
2549273562Smarcel
2550273562Smarcel			// Non-existent attributes return null, we normalize to undefined
2551273562Smarcel			return ret === null ?
2552273562Smarcel				undefined :
2553273562Smarcel				ret;
2554273562Smarcel		}
2555273562Smarcel	},
2556273562Smarcel
2557273562Smarcel	removeAttr: function( elem, value ) {
2558273562Smarcel		var propName, attrNames, name, l,
2559273562Smarcel			i = 0;
2560273562Smarcel
2561273562Smarcel		if ( elem.nodeType === 1 ) {
2562273562Smarcel			attrNames = ( value || "" ).split( rspace );
2563273562Smarcel			l = attrNames.length;
2564273562Smarcel
2565273562Smarcel			for ( ; i < l; i++ ) {
2566273562Smarcel				name = attrNames[ i ].toLowerCase();
2567273562Smarcel				propName = jQuery.propFix[ name ] || name;
2568273562Smarcel
2569273562Smarcel				// See #9699 for explanation of this approach (setting first, then removal)
2570273562Smarcel				jQuery.attr( elem, name, "" );
2571273562Smarcel				elem.removeAttribute( getSetAttribute ? name : propName );
2572273562Smarcel
2573273562Smarcel				// Set corresponding property to false for boolean attributes
2574273562Smarcel				if ( rboolean.test( name ) && propName in elem ) {
2575273562Smarcel					elem[ propName ] = false;
2576273562Smarcel				}
2577273562Smarcel			}
2578273562Smarcel		}
2579273562Smarcel	},
2580273562Smarcel
2581273562Smarcel	attrHooks: {
2582273562Smarcel		type: {
2583273562Smarcel			set: function( elem, value ) {
2584273562Smarcel				// We can't allow the type property to be changed (since it causes problems in IE)
2585273562Smarcel				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
2586273562Smarcel					jQuery.error( "type property can't be changed" );
2587273562Smarcel				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
2588273562Smarcel					// Setting the type on a radio button after the value resets the value in IE6-9
2589273562Smarcel					// Reset value to it's default in case type is set after value
2590273562Smarcel					// This is for element creation
2591273562Smarcel					var val = elem.value;
2592273562Smarcel					elem.setAttribute( "type", value );
2593273562Smarcel					if ( val ) {
2594273562Smarcel						elem.value = val;
2595273562Smarcel					}
2596273562Smarcel					return value;
2597273562Smarcel				}
2598273562Smarcel			}
2599273562Smarcel		},
2600273562Smarcel		// Use the value property for back compat
2601273562Smarcel		// Use the nodeHook for button elements in IE6/7 (#1954)
2602273562Smarcel		value: {
2603273562Smarcel			get: function( elem, name ) {
2604273562Smarcel				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
2605273562Smarcel					return nodeHook.get( elem, name );
2606273562Smarcel				}
2607273562Smarcel				return name in elem ?
2608273562Smarcel					elem.value :
2609273562Smarcel					null;
2610273562Smarcel			},
2611273562Smarcel			set: function( elem, value, name ) {
2612273562Smarcel				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
2613273562Smarcel					return nodeHook.set( elem, value, name );
2614273562Smarcel				}
2615273562Smarcel				// Does not return so that setAttribute is also used
2616273562Smarcel				elem.value = value;
2617273562Smarcel			}
2618273562Smarcel		}
2619273562Smarcel	},
2620273562Smarcel
2621273562Smarcel	propFix: {
2622273562Smarcel		tabindex: "tabIndex",
2623273562Smarcel		readonly: "readOnly",
2624273562Smarcel		"for": "htmlFor",
2625273562Smarcel		"class": "className",
2626273562Smarcel		maxlength: "maxLength",
2627273562Smarcel		cellspacing: "cellSpacing",
2628273562Smarcel		cellpadding: "cellPadding",
2629273562Smarcel		rowspan: "rowSpan",
2630273562Smarcel		colspan: "colSpan",
2631273562Smarcel		usemap: "useMap",
2632273562Smarcel		frameborder: "frameBorder",
2633273562Smarcel		contenteditable: "contentEditable"
2634273562Smarcel	},
2635273562Smarcel
2636273562Smarcel	prop: function( elem, name, value ) {
2637273562Smarcel		var ret, hooks, notxml,
2638273562Smarcel			nType = elem.nodeType;
2639273562Smarcel
2640273562Smarcel		// don't get/set properties on text, comment and attribute nodes
2641273562Smarcel		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2642273562Smarcel			return undefined;
2643273562Smarcel		}
2644273562Smarcel
2645273562Smarcel		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2646273562Smarcel
2647273562Smarcel		if ( notxml ) {
2648273562Smarcel			// Fix name and attach hooks
2649273562Smarcel			name = jQuery.propFix[ name ] || name;
2650273562Smarcel			hooks = jQuery.propHooks[ name ];
2651273562Smarcel		}
2652273562Smarcel
2653273562Smarcel		if ( value !== undefined ) {
2654273562Smarcel			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
2655273562Smarcel				return ret;
2656273562Smarcel
2657273562Smarcel			} else {
2658273562Smarcel				return ( elem[ name ] = value );
2659273562Smarcel			}
2660273562Smarcel
2661273562Smarcel		} else {
2662273562Smarcel			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
2663273562Smarcel				return ret;
2664273562Smarcel
2665273562Smarcel			} else {
2666273562Smarcel				return elem[ name ];
2667273562Smarcel			}
2668273562Smarcel		}
2669273562Smarcel	},
2670273562Smarcel
2671273562Smarcel	propHooks: {
2672273562Smarcel		tabIndex: {
2673273562Smarcel			get: function( elem ) {
2674273562Smarcel				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
2675273562Smarcel				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
2676273562Smarcel				var attributeNode = elem.getAttributeNode("tabindex");
2677273562Smarcel
2678273562Smarcel				return attributeNode && attributeNode.specified ?
2679273562Smarcel					parseInt( attributeNode.value, 10 ) :
2680273562Smarcel					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
2681273562Smarcel						0 :
2682273562Smarcel						undefined;
2683273562Smarcel			}
2684273562Smarcel		}
2685273562Smarcel	}
2686273562Smarcel});
2687273562Smarcel
2688273562Smarcel// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
2689273562SmarceljQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
2690273562Smarcel
2691273562Smarcel// Hook for boolean attributes
2692273562SmarcelboolHook = {
2693273562Smarcel	get: function( elem, name ) {
2694273562Smarcel		// Align boolean attributes with corresponding properties
2695273562Smarcel		// Fall back to attribute presence where some booleans are not supported
2696273562Smarcel		var attrNode,
2697273562Smarcel			property = jQuery.prop( elem, name );
2698273562Smarcel		return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
2699273562Smarcel			name.toLowerCase() :
2700273562Smarcel			undefined;
2701273562Smarcel	},
2702273562Smarcel	set: function( elem, value, name ) {
2703273562Smarcel		var propName;
2704273562Smarcel		if ( value === false ) {
2705273562Smarcel			// Remove boolean attributes when set to false
2706273562Smarcel			jQuery.removeAttr( elem, name );
2707273562Smarcel		} else {
2708273562Smarcel			// value is true since we know at this point it's type boolean and not false
2709273562Smarcel			// Set boolean attributes to the same name and set the DOM property
2710273562Smarcel			propName = jQuery.propFix[ name ] || name;
2711273562Smarcel			if ( propName in elem ) {
2712273562Smarcel				// Only set the IDL specifically if it already exists on the element
2713273562Smarcel				elem[ propName ] = true;
2714273562Smarcel			}
2715273562Smarcel
2716273562Smarcel			elem.setAttribute( name, name.toLowerCase() );
2717273562Smarcel		}
2718273562Smarcel		return name;
2719273562Smarcel	}
2720273562Smarcel};
2721273562Smarcel
2722273562Smarcel// IE6/7 do not support getting/setting some attributes with get/setAttribute
2723273562Smarcelif ( !getSetAttribute ) {
2724273562Smarcel
2725273562Smarcel	fixSpecified = {
2726273562Smarcel		name: true,
2727273562Smarcel		id: true
2728273562Smarcel	};
2729273562Smarcel
2730273562Smarcel	// Use this for any attribute in IE6/7
2731273562Smarcel	// This fixes almost every IE6/7 issue
2732273562Smarcel	nodeHook = jQuery.valHooks.button = {
2733273562Smarcel		get: function( elem, name ) {
2734273562Smarcel			var ret;
2735273562Smarcel			ret = elem.getAttributeNode( name );
2736273562Smarcel			return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
2737273562Smarcel				ret.nodeValue :
2738273562Smarcel				undefined;
2739273562Smarcel		},
2740273562Smarcel		set: function( elem, value, name ) {
2741273562Smarcel			// Set the existing or create a new attribute node
2742273562Smarcel			var ret = elem.getAttributeNode( name );
2743273562Smarcel			if ( !ret ) {
2744273562Smarcel				ret = document.createAttribute( name );
2745273562Smarcel				elem.setAttributeNode( ret );
2746273562Smarcel			}
2747273562Smarcel			return ( ret.nodeValue = value + "" );
2748273562Smarcel		}
2749273562Smarcel	};
2750273562Smarcel
2751273562Smarcel	// Apply the nodeHook to tabindex
2752273562Smarcel	jQuery.attrHooks.tabindex.set = nodeHook.set;
2753273562Smarcel
2754273562Smarcel	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
2755273562Smarcel	// This is for removals
2756273562Smarcel	jQuery.each([ "width", "height" ], function( i, name ) {
2757273562Smarcel		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2758273562Smarcel			set: function( elem, value ) {
2759273562Smarcel				if ( value === "" ) {
2760273562Smarcel					elem.setAttribute( name, "auto" );
2761273562Smarcel					return value;
2762273562Smarcel				}
2763273562Smarcel			}
2764273562Smarcel		});
2765273562Smarcel	});
2766273562Smarcel
2767273562Smarcel	// Set contenteditable to false on removals(#10429)
2768273562Smarcel	// Setting to empty string throws an error as an invalid value
2769273562Smarcel	jQuery.attrHooks.contenteditable = {
2770273562Smarcel		get: nodeHook.get,
2771273562Smarcel		set: function( elem, value, name ) {
2772273562Smarcel			if ( value === "" ) {
2773273562Smarcel				value = "false";
2774273562Smarcel			}
2775273562Smarcel			nodeHook.set( elem, value, name );
2776273562Smarcel		}
2777273562Smarcel	};
2778273562Smarcel}
2779273562Smarcel
2780273562Smarcel
2781273562Smarcel// Some attributes require a special call on IE
2782273562Smarcelif ( !jQuery.support.hrefNormalized ) {
2783273562Smarcel	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
2784273562Smarcel		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2785273562Smarcel			get: function( elem ) {
2786273562Smarcel				var ret = elem.getAttribute( name, 2 );
2787273562Smarcel				return ret === null ? undefined : ret;
2788273562Smarcel			}
2789273562Smarcel		});
2790273562Smarcel	});
2791273562Smarcel}
2792273562Smarcel
2793273562Smarcelif ( !jQuery.support.style ) {
2794273562Smarcel	jQuery.attrHooks.style = {
2795273562Smarcel		get: function( elem ) {
2796273562Smarcel			// Return undefined in the case of empty string
2797273562Smarcel			// Normalize to lowercase since IE uppercases css property names
2798273562Smarcel			return elem.style.cssText.toLowerCase() || undefined;
2799273562Smarcel		},
2800273562Smarcel		set: function( elem, value ) {
2801273562Smarcel			return ( elem.style.cssText = "" + value );
2802273562Smarcel		}
2803273562Smarcel	};
2804273562Smarcel}
2805273562Smarcel
2806273562Smarcel// Safari mis-reports the default selected property of an option
2807273562Smarcel// Accessing the parent's selectedIndex property fixes it
2808273562Smarcelif ( !jQuery.support.optSelected ) {
2809273562Smarcel	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
2810273562Smarcel		get: function( elem ) {
2811273562Smarcel			var parent = elem.parentNode;
2812273562Smarcel
2813273562Smarcel			if ( parent ) {
2814273562Smarcel				parent.selectedIndex;
2815273562Smarcel
2816273562Smarcel				// Make sure that it also works with optgroups, see #5701
2817273562Smarcel				if ( parent.parentNode ) {
2818273562Smarcel					parent.parentNode.selectedIndex;
2819273562Smarcel				}
2820273562Smarcel			}
2821273562Smarcel			return null;
2822273562Smarcel		}
2823273562Smarcel	});
2824273562Smarcel}
2825273562Smarcel
2826273562Smarcel// IE6/7 call enctype encoding
2827273562Smarcelif ( !jQuery.support.enctype ) {
2828273562Smarcel	jQuery.propFix.enctype = "encoding";
2829273562Smarcel}
2830273562Smarcel
2831273562Smarcel// Radios and checkboxes getter/setter
2832273562Smarcelif ( !jQuery.support.checkOn ) {
2833273562Smarcel	jQuery.each([ "radio", "checkbox" ], function() {
2834273562Smarcel		jQuery.valHooks[ this ] = {
2835273562Smarcel			get: function( elem ) {
2836273562Smarcel				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
2837273562Smarcel				return elem.getAttribute("value") === null ? "on" : elem.value;
2838273562Smarcel			}
2839273562Smarcel		};
2840273562Smarcel	});
2841273562Smarcel}
2842273562SmarceljQuery.each([ "radio", "checkbox" ], function() {
2843273562Smarcel	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
2844273562Smarcel		set: function( elem, value ) {
2845273562Smarcel			if ( jQuery.isArray( value ) ) {
2846273562Smarcel				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
2847273562Smarcel			}
2848273562Smarcel		}
2849273562Smarcel	});
2850273562Smarcel});
2851273562Smarcel
2852273562Smarcel
2853273562Smarcel
2854273562Smarcel
2855273562Smarcelvar rnamespaces = /\.(.*)$/,
2856273562Smarcel	rformElems = /^(?:textarea|input|select)$/i,
2857273562Smarcel	rperiod = /\./g,
2858273562Smarcel	rspaces = / /g,
2859273562Smarcel	rescape = /[^\w\s.|`]/g,
2860273562Smarcel	rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
2861273562Smarcel	rhoverHack = /\bhover(\.\S+)?/,
2862273562Smarcel	rkeyEvent = /^key/,
2863273562Smarcel	rmouseEvent = /^(?:mouse|contextmenu)|click/,
2864273562Smarcel	rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
2865273562Smarcel	quickParse = function( selector ) {
2866273562Smarcel		var quick = rquickIs.exec( selector );
2867273562Smarcel		if ( quick ) {
2868273562Smarcel			//   0  1    2   3
2869273562Smarcel			// [ _, tag, id, class ]
2870273562Smarcel			quick[1] = ( quick[1] || "" ).toLowerCase();
2871273562Smarcel			quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
2872273562Smarcel		}
2873273562Smarcel		return quick;
2874273562Smarcel	},
2875273562Smarcel	quickIs = function( elem, m ) {
2876273562Smarcel		return (
2877273562Smarcel			(!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
2878273562Smarcel			(!m[2] || elem.id === m[2]) &&
2879273562Smarcel			(!m[3] || m[3].test( elem.className ))
2880273562Smarcel		);
2881273562Smarcel	},
2882273562Smarcel	hoverHack = function( events ) {
2883273562Smarcel		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
2884273562Smarcel	};
2885273562Smarcel
2886273562Smarcel/*
2887273562Smarcel * Helper functions for managing events -- not part of the public interface.
2888273562Smarcel * Props to Dean Edwards' addEvent library for many of the ideas.
2889273562Smarcel */
2890273562SmarceljQuery.event = {
2891273562Smarcel
2892273562Smarcel	add: function( elem, types, handler, data, selector ) {
2893273562Smarcel
2894273562Smarcel		var elemData, eventHandle, events,
2895273562Smarcel			t, tns, type, namespaces, handleObj,
2896273562Smarcel			handleObjIn, quick, handlers, special;
2897273562Smarcel
2898273562Smarcel		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
2899273562Smarcel		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
2900273562Smarcel			return;
2901273562Smarcel		}
2902273562Smarcel
2903273562Smarcel		// Caller can pass in an object of custom data in lieu of the handler
2904273562Smarcel		if ( handler.handler ) {
2905273562Smarcel			handleObjIn = handler;
2906273562Smarcel			handler = handleObjIn.handler;
2907273562Smarcel		}
2908273562Smarcel
2909273562Smarcel		// Make sure that the handler has a unique ID, used to find/remove it later
2910273562Smarcel		if ( !handler.guid ) {
2911273562Smarcel			handler.guid = jQuery.guid++;
2912273562Smarcel		}
2913273562Smarcel
2914273562Smarcel		// Init the element's event structure and main handler, if this is the first
2915273562Smarcel		events = elemData.events;
2916273562Smarcel		if ( !events ) {
2917273562Smarcel			elemData.events = events = {};
2918273562Smarcel		}
2919273562Smarcel		eventHandle = elemData.handle;
2920273562Smarcel		if ( !eventHandle ) {
2921273562Smarcel			elemData.handle = eventHandle = function( e ) {
2922273562Smarcel				// Discard the second event of a jQuery.event.trigger() and
2923273562Smarcel				// when an event is called after a page has unloaded
2924273562Smarcel				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
2925273562Smarcel					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
2926273562Smarcel					undefined;
2927273562Smarcel			};
2928273562Smarcel			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
2929273562Smarcel			eventHandle.elem = elem;
2930273562Smarcel		}
2931273562Smarcel
2932273562Smarcel		// Handle multiple events separated by a space
2933273562Smarcel		// jQuery(...).bind("mouseover mouseout", fn);
2934273562Smarcel		types = hoverHack(types).split( " " );
2935273562Smarcel		for ( t = 0; t < types.length; t++ ) {
2936273562Smarcel
2937273562Smarcel			tns = rtypenamespace.exec( types[t] ) || [];
2938273562Smarcel			type = tns[1];
2939273562Smarcel			namespaces = ( tns[2] || "" ).split( "." ).sort();
2940273562Smarcel
2941273562Smarcel			// If event changes its type, use the special event handlers for the changed type
2942273562Smarcel			special = jQuery.event.special[ type ] || {};
2943273562Smarcel
2944273562Smarcel			// If selector defined, determine special event api type, otherwise given type
2945273562Smarcel			type = ( selector ? special.delegateType : special.bindType ) || type;
2946273562Smarcel
2947273562Smarcel			// Update special based on newly reset type
2948273562Smarcel			special = jQuery.event.special[ type ] || {};
2949273562Smarcel
2950273562Smarcel			// handleObj is passed to all event handlers
2951273562Smarcel			handleObj = jQuery.extend({
2952273562Smarcel				type: type,
2953273562Smarcel				origType: tns[1],
2954273562Smarcel				data: data,
2955273562Smarcel				handler: handler,
2956273562Smarcel				guid: handler.guid,
2957273562Smarcel				selector: selector,
2958273562Smarcel				namespace: namespaces.join(".")
2959273562Smarcel			}, handleObjIn );
2960273562Smarcel
2961273562Smarcel			// Delegated event; pre-analyze selector so it's processed quickly on event dispatch
2962273562Smarcel			if ( selector ) {
2963273562Smarcel				handleObj.quick = quickParse( selector );
2964273562Smarcel				if ( !handleObj.quick && jQuery.expr.match.POS.test( selector ) ) {
2965273562Smarcel					handleObj.isPositional = true;
2966273562Smarcel				}
2967273562Smarcel			}
2968273562Smarcel
2969273562Smarcel			// Init the event handler queue if we're the first
2970273562Smarcel			handlers = events[ type ];
2971273562Smarcel			if ( !handlers ) {
2972273562Smarcel				handlers = events[ type ] = [];
2973273562Smarcel				handlers.delegateCount = 0;
2974273562Smarcel
2975273562Smarcel				// Only use addEventListener/attachEvent if the special events handler returns false
2976273562Smarcel				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
2977273562Smarcel					// Bind the global event handler to the element
2978273562Smarcel					if ( elem.addEventListener ) {
2979273562Smarcel						elem.addEventListener( type, eventHandle, false );
2980273562Smarcel
2981273562Smarcel					} else if ( elem.attachEvent ) {
2982273562Smarcel						elem.attachEvent( "on" + type, eventHandle );
2983273562Smarcel					}
2984273562Smarcel				}
2985273562Smarcel			}
2986273562Smarcel
2987273562Smarcel			if ( special.add ) {
2988273562Smarcel				special.add.call( elem, handleObj );
2989273562Smarcel
2990273562Smarcel				if ( !handleObj.handler.guid ) {
2991273562Smarcel					handleObj.handler.guid = handler.guid;
2992273562Smarcel				}
2993273562Smarcel			}
2994273562Smarcel
2995273562Smarcel			// Add to the element's handler list, delegates in front
2996273562Smarcel			if ( selector ) {
2997273562Smarcel				handlers.splice( handlers.delegateCount++, 0, handleObj );
2998273562Smarcel			} else {
2999273562Smarcel				handlers.push( handleObj );
3000273562Smarcel			}
3001273562Smarcel
3002273562Smarcel			// Keep track of which events have ever been used, for event optimization
3003273562Smarcel			jQuery.event.global[ type ] = true;
3004273562Smarcel		}
3005273562Smarcel
3006273562Smarcel		// Nullify elem to prevent memory leaks in IE
3007273562Smarcel		elem = null;
3008273562Smarcel	},
3009273562Smarcel
3010273562Smarcel	global: {},
3011273562Smarcel
3012273562Smarcel	// Detach an event or set of events from an element
3013273562Smarcel	remove: function( elem, types, handler, selector ) {
3014273562Smarcel
3015273562Smarcel		var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
3016273562Smarcel			t, tns, type, namespaces, origCount,
3017273562Smarcel			j, events, special, handle, eventType, handleObj;
3018273562Smarcel
3019273562Smarcel		if ( !elemData || !(events = elemData.events) ) {
3020273562Smarcel			return;
3021273562Smarcel		}
3022273562Smarcel
3023273562Smarcel		// Once for each type.namespace in types; type may be omitted
3024273562Smarcel		types = hoverHack( types || "" ).split(" ");
3025273562Smarcel		for ( t = 0; t < types.length; t++ ) {
3026273562Smarcel			tns = rtypenamespace.exec( types[t] ) || [];
3027273562Smarcel			type = tns[1];
3028273562Smarcel			namespaces = tns[2];
3029273562Smarcel
3030273562Smarcel			// Unbind all events (on this namespace, if provided) for the element
3031273562Smarcel			if ( !type ) {
3032273562Smarcel				namespaces = namespaces? "." + namespaces : "";
3033273562Smarcel				for ( j in events ) {
3034273562Smarcel					jQuery.event.remove( elem, j + namespaces, handler, selector );
3035273562Smarcel				}
3036273562Smarcel				return;
3037273562Smarcel			}
3038273562Smarcel
3039273562Smarcel			special = jQuery.event.special[ type ] || {};
3040273562Smarcel			type = ( selector? special.delegateType : special.bindType ) || type;
3041273562Smarcel			eventType = events[ type ] || [];
3042273562Smarcel			origCount = eventType.length;
3043273562Smarcel			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
3044273562Smarcel
3045273562Smarcel			// Only need to loop for special events or selective removal
3046273562Smarcel			if ( handler || namespaces || selector || special.remove ) {
3047273562Smarcel				for ( j = 0; j < eventType.length; j++ ) {
3048273562Smarcel					handleObj = eventType[ j ];
3049273562Smarcel
3050273562Smarcel					if ( !handler || handler.guid === handleObj.guid ) {
3051273562Smarcel						if ( !namespaces || namespaces.test( handleObj.namespace ) ) {
3052273562Smarcel							if ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) {
3053273562Smarcel								eventType.splice( j--, 1 );
3054273562Smarcel
3055273562Smarcel								if ( handleObj.selector ) {
3056273562Smarcel									eventType.delegateCount--;
3057273562Smarcel								}
3058273562Smarcel								if ( special.remove ) {
3059273562Smarcel									special.remove.call( elem, handleObj );
3060273562Smarcel								}
3061273562Smarcel							}
3062273562Smarcel						}
3063273562Smarcel					}
3064273562Smarcel				}
3065273562Smarcel			} else {
3066273562Smarcel				// Removing all events
3067273562Smarcel				eventType.length = 0;
3068273562Smarcel			}
3069273562Smarcel
3070273562Smarcel			// Remove generic event handler if we removed something and no more handlers exist
3071273562Smarcel			// (avoids potential for endless recursion during removal of special event handlers)
3072273562Smarcel			if ( eventType.length === 0 && origCount !== eventType.length ) {
3073273562Smarcel				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
3074273562Smarcel					jQuery.removeEvent( elem, type, elemData.handle );
3075273562Smarcel				}
3076273562Smarcel
3077273562Smarcel				delete events[ type ];
3078273562Smarcel			}
3079273562Smarcel		}
3080273562Smarcel
3081273562Smarcel		// Remove the expando if it's no longer used
3082273562Smarcel		if ( jQuery.isEmptyObject( events ) ) {
3083273562Smarcel			handle = elemData.handle;
3084273562Smarcel			if ( handle ) {
3085273562Smarcel				handle.elem = null;
3086273562Smarcel			}
3087273562Smarcel
3088273562Smarcel			// removeData also checks for emptiness and clears the expando if empty
3089273562Smarcel			// so use it instead of delete
3090273562Smarcel			jQuery.removeData( elem, [ "events", "handle" ], true );
3091273562Smarcel		}
3092273562Smarcel	},
3093273562Smarcel
3094273562Smarcel	// Events that are safe to short-circuit if no handlers are attached.
3095273562Smarcel	// Native DOM events should not be added, they may have inline handlers.
3096273562Smarcel	customEvent: {
3097273562Smarcel		"getData": true,
3098273562Smarcel		"setData": true,
3099273562Smarcel		"changeData": true
3100273562Smarcel	},
3101273562Smarcel
3102273562Smarcel	trigger: function( event, data, elem, onlyHandlers ) {
3103273562Smarcel		// Don't do events on text and comment nodes
3104273562Smarcel		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
3105273562Smarcel			return;
3106273562Smarcel		}
3107273562Smarcel
3108273562Smarcel		// Event object or event type
3109273562Smarcel		var type = event.type || event,
3110273562Smarcel			namespaces = [],
3111273562Smarcel			cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
3112273562Smarcel
3113273562Smarcel		if ( type.indexOf( "!" ) >= 0 ) {
3114273562Smarcel			// Exclusive events trigger only for the exact event (no namespaces)
3115273562Smarcel			type = type.slice(0, -1);
3116273562Smarcel			exclusive = true;
3117273562Smarcel		}
3118273562Smarcel
3119273562Smarcel		if ( type.indexOf( "." ) >= 0 ) {
3120273562Smarcel			// Namespaced trigger; create a regexp to match event type in handle()
3121273562Smarcel			namespaces = type.split(".");
3122273562Smarcel			type = namespaces.shift();
3123273562Smarcel			namespaces.sort();
3124273562Smarcel		}
3125273562Smarcel
3126273562Smarcel		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
3127273562Smarcel			// No jQuery handlers for this event type, and it can't have inline handlers
3128273562Smarcel			return;
3129273562Smarcel		}
3130273562Smarcel
3131273562Smarcel		// Caller can pass in an Event, Object, or just an event type string
3132273562Smarcel		event = typeof event === "object" ?
3133273562Smarcel			// jQuery.Event object
3134273562Smarcel			event[ jQuery.expando ] ? event :
3135273562Smarcel			// Object literal
3136273562Smarcel			new jQuery.Event( type, event ) :
3137273562Smarcel			// Just the event type (string)
3138273562Smarcel			new jQuery.Event( type );
3139273562Smarcel
3140273562Smarcel		event.type = type;
3141273562Smarcel		event.isTrigger = true;
3142273562Smarcel		event.exclusive = exclusive;
3143273562Smarcel		event.namespace = namespaces.join( "." );
3144273562Smarcel		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
3145273562Smarcel		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
3146273562Smarcel
3147273562Smarcel		// triggerHandler() and global events don't bubble or run the default action
3148273562Smarcel		if ( onlyHandlers || !elem ) {
3149273562Smarcel			event.preventDefault();
3150273562Smarcel		}
3151273562Smarcel
3152273562Smarcel		// Handle a global trigger
3153273562Smarcel		if ( !elem ) {
3154273562Smarcel
3155273562Smarcel			// TODO: Stop taunting the data cache; remove global events and always attach to document
3156273562Smarcel			cache = jQuery.cache;
3157273562Smarcel			for ( i in cache ) {
3158273562Smarcel				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
3159273562Smarcel					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
3160273562Smarcel				}
3161273562Smarcel			}
3162273562Smarcel			return;
3163273562Smarcel		}
3164273562Smarcel
3165273562Smarcel		// Clean up the event in case it is being reused
3166273562Smarcel		event.result = undefined;
3167273562Smarcel		if ( !event.target ) {
3168273562Smarcel			event.target = elem;
3169273562Smarcel		}
3170273562Smarcel
3171273562Smarcel		// Clone any incoming data and prepend the event, creating the handler arg list
3172273562Smarcel		data = data != null ? jQuery.makeArray( data ) : [];
3173273562Smarcel		data.unshift( event );
3174273562Smarcel
3175273562Smarcel		// Allow special events to draw outside the lines
3176273562Smarcel		special = jQuery.event.special[ type ] || {};
3177273562Smarcel		if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
3178273562Smarcel			return;
3179273562Smarcel		}
3180273562Smarcel
3181273562Smarcel		// Determine event propagation path in advance, per W3C events spec (#9951)
3182273562Smarcel		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
3183273562Smarcel		eventPath = [[ elem, special.bindType || type ]];
3184273562Smarcel		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
3185273562Smarcel
3186273562Smarcel			bubbleType = special.delegateType || type;
3187273562Smarcel			old = null;
3188273562Smarcel			for ( cur = elem.parentNode; cur; cur = cur.parentNode ) {
3189273562Smarcel				eventPath.push([ cur, bubbleType ]);
3190273562Smarcel				old = cur;
3191273562Smarcel			}
3192273562Smarcel
3193273562Smarcel			// Only add window if we got to document (e.g., not plain obj or detached DOM)
3194273562Smarcel			if ( old && old === elem.ownerDocument ) {
3195273562Smarcel				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
3196273562Smarcel			}
3197273562Smarcel		}
3198273562Smarcel
3199273562Smarcel		// Fire handlers on the event path
3200273562Smarcel		for ( i = 0; i < eventPath.length; i++ ) {
3201273562Smarcel
3202273562Smarcel			cur = eventPath[i][0];
3203273562Smarcel			event.type = eventPath[i][1];
3204273562Smarcel
3205273562Smarcel			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
3206273562Smarcel			if ( handle ) {
3207273562Smarcel				handle.apply( cur, data );
3208273562Smarcel			}
3209273562Smarcel			handle = ontype && cur[ ontype ];
3210273562Smarcel			if ( handle && jQuery.acceptData( cur ) ) {
3211273562Smarcel				handle.apply( cur, data );
3212273562Smarcel			}
3213273562Smarcel
3214273562Smarcel			if ( event.isPropagationStopped() ) {
3215273562Smarcel				break;
3216273562Smarcel			}
3217273562Smarcel		}
3218273562Smarcel		event.type = type;
3219273562Smarcel
3220273562Smarcel		// If nobody prevented the default action, do it now
3221273562Smarcel		if ( !event.isDefaultPrevented() ) {
3222273562Smarcel
3223273562Smarcel			if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
3224273562Smarcel				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
3225273562Smarcel
3226273562Smarcel				// Call a native DOM method on the target with the same name name as the event.
3227273562Smarcel				// Can't use an .isFunction() check here because IE6/7 fails that test.
3228273562Smarcel				// Don't do default actions on window, that's where global variables be (#6170)
3229273562Smarcel				// IE<9 dies on focus/blur to hidden element (#1486)
3230273562Smarcel				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
3231273562Smarcel
3232273562Smarcel					// Don't re-trigger an onFOO event when we call its FOO() method
3233273562Smarcel					old = elem[ ontype ];
3234273562Smarcel
3235273562Smarcel					if ( old ) {
3236273562Smarcel						elem[ ontype ] = null;
3237273562Smarcel					}
3238273562Smarcel
3239273562Smarcel					// Prevent re-triggering of the same event, since we already bubbled it above
3240273562Smarcel					jQuery.event.triggered = type;
3241273562Smarcel					elem[ type ]();
3242273562Smarcel					jQuery.event.triggered = undefined;
3243273562Smarcel
3244273562Smarcel					if ( old ) {
3245273562Smarcel						elem[ ontype ] = old;
3246273562Smarcel					}
3247273562Smarcel				}
3248273562Smarcel			}
3249273562Smarcel		}
3250273562Smarcel
3251273562Smarcel		return event.result;
3252273562Smarcel	},
3253273562Smarcel
3254273562Smarcel	dispatch: function( event ) {
3255273562Smarcel
3256273562Smarcel		// Make a writable jQuery.Event from the native event object
3257273562Smarcel		event = jQuery.event.fix( event || window.event );
3258273562Smarcel
3259273562Smarcel		var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
3260273562Smarcel			delegateCount = handlers.delegateCount,
3261273562Smarcel			args = [].slice.call( arguments, 0 ),
3262273562Smarcel			run_all = !event.exclusive && !event.namespace,
3263273562Smarcel			specialHandle = ( jQuery.event.special[ event.type ] || {} ).handle,
3264273562Smarcel			handlerQueue = [],
3265273562Smarcel			i, j, cur, ret, selMatch, matched, matches, handleObj, sel, hit, related;
3266273562Smarcel
3267273562Smarcel		// Use the fix-ed jQuery.Event rather than the (read-only) native event
3268273562Smarcel		args[0] = event;
3269273562Smarcel		event.delegateTarget = this;
3270273562Smarcel
3271273562Smarcel		// Determine handlers that should run if there are delegated events
3272273562Smarcel		// Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
3273273562Smarcel		if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) {
3274273562Smarcel
3275273562Smarcel			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
3276273562Smarcel				selMatch = {};
3277273562Smarcel				matches = [];
3278273562Smarcel				for ( i = 0; i < delegateCount; i++ ) {
3279273562Smarcel					handleObj = handlers[ i ];
3280273562Smarcel					sel = handleObj.selector;
3281273562Smarcel					hit = selMatch[ sel ];
3282273562Smarcel
3283273562Smarcel					if ( handleObj.isPositional ) {
3284273562Smarcel						// Since .is() does not work for positionals; see http://jsfiddle.net/eJ4yd/3/
3285273562Smarcel						hit = ( hit || (selMatch[ sel ] = jQuery( sel )) ).index( cur ) >= 0;
3286273562Smarcel					} else if ( hit === undefined ) {
3287273562Smarcel						hit = selMatch[ sel ] = ( handleObj.quick ? quickIs( cur, handleObj.quick ) : jQuery( cur ).is( sel ) );
3288273562Smarcel					}
3289273562Smarcel					if ( hit ) {
3290273562Smarcel						matches.push( handleObj );
3291273562Smarcel					}
3292273562Smarcel				}
3293273562Smarcel				if ( matches.length ) {
3294273562Smarcel					handlerQueue.push({ elem: cur, matches: matches });
3295273562Smarcel				}
3296273562Smarcel			}
3297273562Smarcel		}
3298273562Smarcel
3299273562Smarcel		// Add the remaining (directly-bound) handlers
3300273562Smarcel		if ( handlers.length > delegateCount ) {
3301273562Smarcel			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
3302273562Smarcel		}
3303273562Smarcel
3304273562Smarcel		// Run delegates first; they may want to stop propagation beneath us
3305273562Smarcel		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
3306273562Smarcel			matched = handlerQueue[ i ];
3307273562Smarcel			event.currentTarget = matched.elem;
3308273562Smarcel
3309273562Smarcel			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
3310273562Smarcel				handleObj = matched.matches[ j ];
3311273562Smarcel
3312273562Smarcel				// Triggered event must either 1) be non-exclusive and have no namespace, or
3313273562Smarcel				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
3314273562Smarcel				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
3315273562Smarcel
3316273562Smarcel					event.data = handleObj.data;
3317273562Smarcel					event.handleObj = handleObj;
3318273562Smarcel
3319273562Smarcel					ret = ( specialHandle || handleObj.handler ).apply( matched.elem, args );
3320273562Smarcel
3321273562Smarcel					if ( ret !== undefined ) {
3322273562Smarcel						event.result = ret;
3323273562Smarcel						if ( ret === false ) {
3324273562Smarcel							event.preventDefault();
3325273562Smarcel							event.stopPropagation();
3326273562Smarcel						}
3327273562Smarcel					}
3328273562Smarcel				}
3329273562Smarcel			}
3330273562Smarcel		}
3331273562Smarcel
3332273562Smarcel		return event.result;
3333273562Smarcel	},
3334273562Smarcel
3335273562Smarcel	// Includes some event props shared by KeyEvent and MouseEvent
3336273562Smarcel	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
3337273562Smarcel	props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
3338273562Smarcel
3339273562Smarcel	fixHooks: {},
3340273562Smarcel
3341273562Smarcel	keyHooks: {
3342273562Smarcel		props: "char charCode key keyCode".split(" "),
3343273562Smarcel		filter: function( event, original ) {
3344273562Smarcel
3345273562Smarcel			// Add which for key events
3346273562Smarcel			if ( event.which == null ) {
3347273562Smarcel				event.which = original.charCode != null ? original.charCode : original.keyCode;
3348273562Smarcel			}
3349273562Smarcel
3350273562Smarcel			return event;
3351273562Smarcel		}
3352273562Smarcel	},
3353273562Smarcel
3354273562Smarcel	mouseHooks: {
3355273562Smarcel		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement wheelDelta".split(" "),
3356273562Smarcel		filter: function( event, original ) {
3357273562Smarcel			var eventDoc, doc, body,
3358273562Smarcel				button = original.button,
3359273562Smarcel				fromElement = original.fromElement;
3360273562Smarcel
3361273562Smarcel			// Calculate pageX/Y if missing and clientX/Y available
3362273562Smarcel			if ( event.pageX == null && original.clientX != null ) {
3363273562Smarcel				eventDoc = event.target.ownerDocument || document;
3364273562Smarcel				doc = eventDoc.documentElement;
3365273562Smarcel				body = eventDoc.body;
3366273562Smarcel
3367273562Smarcel				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
3368273562Smarcel				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
3369273562Smarcel			}
3370273562Smarcel
3371273562Smarcel			// Add relatedTarget, if necessary
3372273562Smarcel			if ( !event.relatedTarget && fromElement ) {
3373273562Smarcel				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
3374273562Smarcel			}
3375273562Smarcel
3376273562Smarcel			// Add which for click: 1 === left; 2 === middle; 3 === right
3377273562Smarcel			// Note: button is not normalized, so don't use it
3378273562Smarcel			if ( !event.which && button !== undefined ) {
3379273562Smarcel				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
3380273562Smarcel			}
3381273562Smarcel
3382273562Smarcel			return event;
3383273562Smarcel		}
3384273562Smarcel	},
3385273562Smarcel
3386273562Smarcel	fix: function( event ) {
3387273562Smarcel		if ( event[ jQuery.expando ] ) {
3388273562Smarcel			return event;
3389273562Smarcel		}
3390273562Smarcel
3391273562Smarcel		// Create a writable copy of the event object and normalize some properties
3392273562Smarcel		var i, prop,
3393273562Smarcel			originalEvent = event,
3394273562Smarcel			fixHook = jQuery.event.fixHooks[ event.type ] || {},
3395273562Smarcel			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
3396273562Smarcel
3397273562Smarcel		event = jQuery.Event( originalEvent );
3398273562Smarcel
3399273562Smarcel		for ( i = copy.length; i; ) {
3400273562Smarcel			prop = copy[ --i ];
3401273562Smarcel			event[ prop ] = originalEvent[ prop ];
3402273562Smarcel		}
3403273562Smarcel
3404273562Smarcel		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
3405273562Smarcel		if ( !event.target ) {
3406273562Smarcel			event.target = originalEvent.srcElement || document;
3407273562Smarcel		}
3408273562Smarcel
3409273562Smarcel		// Target should not be a text node (#504, Safari)
3410273562Smarcel		if ( event.target.nodeType === 3 ) {
3411273562Smarcel			event.target = event.target.parentNode;
3412273562Smarcel		}
3413273562Smarcel
3414273562Smarcel		// For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
3415273562Smarcel		if ( event.metaKey === undefined ) {
3416273562Smarcel			event.metaKey = event.ctrlKey;
3417273562Smarcel		}
3418273562Smarcel
3419273562Smarcel		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
3420273562Smarcel	},
3421273562Smarcel
3422273562Smarcel	special: {
3423273562Smarcel		ready: {
3424273562Smarcel			// Make sure the ready event is setup
3425273562Smarcel			setup: jQuery.bindReady
3426273562Smarcel		},
3427273562Smarcel
3428273562Smarcel		focus: {
3429273562Smarcel			delegateType: "focusin",
3430273562Smarcel			noBubble: true
3431273562Smarcel		},
3432273562Smarcel		blur: {
3433273562Smarcel			delegateType: "focusout",
3434273562Smarcel			noBubble: true
3435273562Smarcel		},
3436273562Smarcel
3437273562Smarcel		beforeunload: {
3438273562Smarcel			setup: function( data, namespaces, eventHandle ) {
3439273562Smarcel				// We only want to do this special case on windows
3440273562Smarcel				if ( jQuery.isWindow( this ) ) {
3441273562Smarcel					this.onbeforeunload = eventHandle;
3442273562Smarcel				}
3443273562Smarcel			},
3444273562Smarcel
3445273562Smarcel			teardown: function( namespaces, eventHandle ) {
3446273562Smarcel				if ( this.onbeforeunload === eventHandle ) {
3447273562Smarcel					this.onbeforeunload = null;
3448273562Smarcel				}
3449273562Smarcel			}
3450273562Smarcel		}
3451273562Smarcel	},
3452273562Smarcel
3453273562Smarcel	simulate: function( type, elem, event, bubble ) {
3454273562Smarcel		// Piggyback on a donor event to simulate a different one.
3455273562Smarcel		// Fake originalEvent to avoid donor's stopPropagation, but if the
3456273562Smarcel		// simulated event prevents default then we do the same on the donor.
3457273562Smarcel		var e = jQuery.extend(
3458273562Smarcel			new jQuery.Event(),
3459273562Smarcel			event,
3460273562Smarcel			{ type: type,
3461273562Smarcel				isSimulated: true,
3462273562Smarcel				originalEvent: {}
3463273562Smarcel			}
3464273562Smarcel		);
3465273562Smarcel		if ( bubble ) {
3466273562Smarcel			jQuery.event.trigger( e, null, elem );
3467273562Smarcel		} else {
3468273562Smarcel			jQuery.event.dispatch.call( elem, e );
3469273562Smarcel		}
3470273562Smarcel		if ( e.isDefaultPrevented() ) {
3471273562Smarcel			event.preventDefault();
3472273562Smarcel		}
3473273562Smarcel	}
3474273562Smarcel};
3475273562Smarcel
3476273562Smarcel// Some plugins are using, but it's undocumented/deprecated and will be removed.
3477273562Smarcel// The 1.7 special event interface should provide all the hooks needed now.
3478273562SmarceljQuery.event.handle = jQuery.event.dispatch;
3479273562Smarcel
3480273562SmarceljQuery.removeEvent = document.removeEventListener ?
3481273562Smarcel	function( elem, type, handle ) {
3482273562Smarcel		if ( elem.removeEventListener ) {
3483273562Smarcel			elem.removeEventListener( type, handle, false );
3484273562Smarcel		}
3485273562Smarcel	} :
3486273562Smarcel	function( elem, type, handle ) {
3487273562Smarcel		if ( elem.detachEvent ) {
3488273562Smarcel			elem.detachEvent( "on" + type, handle );
3489273562Smarcel		}
3490273562Smarcel	};
3491273562Smarcel
3492273562SmarceljQuery.Event = function( src, props ) {
3493273562Smarcel	// Allow instantiation without the 'new' keyword
3494273562Smarcel	if ( !(this instanceof jQuery.Event) ) {
3495273562Smarcel		return new jQuery.Event( src, props );
3496273562Smarcel	}
3497273562Smarcel
3498273562Smarcel	// Event object
3499273562Smarcel	if ( src && src.type ) {
3500273562Smarcel		this.originalEvent = src;
3501273562Smarcel		this.type = src.type;
3502273562Smarcel
3503273562Smarcel		// Events bubbling up the document may have been marked as prevented
3504273562Smarcel		// by a handler lower down the tree; reflect the correct value.
3505273562Smarcel		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
3506273562Smarcel			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
3507273562Smarcel
3508273562Smarcel	// Event type
3509273562Smarcel	} else {
3510273562Smarcel		this.type = src;
3511273562Smarcel	}
3512273562Smarcel
3513273562Smarcel	// Put explicitly provided properties onto the event object
3514273562Smarcel	if ( props ) {
3515273562Smarcel		jQuery.extend( this, props );
3516273562Smarcel	}
3517273562Smarcel
3518273562Smarcel	// Create a timestamp if incoming event doesn't have one
3519273562Smarcel	this.timeStamp = src && src.timeStamp || jQuery.now();
3520273562Smarcel
3521273562Smarcel	// Mark it as fixed
3522273562Smarcel	this[ jQuery.expando ] = true;
3523273562Smarcel};
3524273562Smarcel
3525273562Smarcelfunction returnFalse() {
3526273562Smarcel	return false;
3527273562Smarcel}
3528273562Smarcelfunction returnTrue() {
3529273562Smarcel	return true;
3530273562Smarcel}
3531273562Smarcel
3532273562Smarcel// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
3533273562Smarcel// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
3534273562SmarceljQuery.Event.prototype = {
3535273562Smarcel	preventDefault: function() {
3536273562Smarcel		this.isDefaultPrevented = returnTrue;
3537273562Smarcel
3538273562Smarcel		var e = this.originalEvent;
3539273562Smarcel		if ( !e ) {
3540273562Smarcel			return;
3541273562Smarcel		}
3542273562Smarcel
3543273562Smarcel		// if preventDefault exists run it on the original event
3544273562Smarcel		if ( e.preventDefault ) {
3545273562Smarcel			e.preventDefault();
3546273562Smarcel
3547273562Smarcel		// otherwise set the returnValue property of the original event to false (IE)
3548273562Smarcel		} else {
3549273562Smarcel			e.returnValue = false;
3550273562Smarcel		}
3551273562Smarcel	},
3552273562Smarcel	stopPropagation: function() {
3553273562Smarcel		this.isPropagationStopped = returnTrue;
3554273562Smarcel
3555273562Smarcel		var e = this.originalEvent;
3556273562Smarcel		if ( !e ) {
3557273562Smarcel			return;
3558273562Smarcel		}
3559273562Smarcel		// if stopPropagation exists run it on the original event
3560273562Smarcel		if ( e.stopPropagation ) {
3561273562Smarcel			e.stopPropagation();
3562273562Smarcel		}
3563273562Smarcel		// otherwise set the cancelBubble property of the original event to true (IE)
3564273562Smarcel		e.cancelBubble = true;
3565273562Smarcel	},
3566273562Smarcel	stopImmediatePropagation: function() {
3567273562Smarcel		this.isImmediatePropagationStopped = returnTrue;
3568273562Smarcel		this.stopPropagation();
3569273562Smarcel	},
3570273562Smarcel	isDefaultPrevented: returnFalse,
3571273562Smarcel	isPropagationStopped: returnFalse,
3572273562Smarcel	isImmediatePropagationStopped: returnFalse
3573273562Smarcel};
3574273562Smarcel
3575273562Smarcel// Create mouseenter/leave events using mouseover/out and event-time checks
3576273562SmarceljQuery.each({
3577273562Smarcel	mouseenter: "mouseover",
3578273562Smarcel	mouseleave: "mouseout"
3579273562Smarcel}, function( orig, fix ) {
3580273562Smarcel	jQuery.event.special[ orig ] = jQuery.event.special[ fix ] = {
3581273562Smarcel		delegateType: fix,
3582273562Smarcel		bindType: fix,
3583273562Smarcel
3584273562Smarcel		handle: function( event ) {
3585273562Smarcel			var target = this,
3586273562Smarcel				related = event.relatedTarget,
3587273562Smarcel				handleObj = event.handleObj,
3588273562Smarcel				selector = handleObj.selector,
3589273562Smarcel				oldType, ret;
3590273562Smarcel
3591273562Smarcel			// For a real mouseover/out, always call the handler; for
3592273562Smarcel			// mousenter/leave call the handler if related is outside the target.
3593273562Smarcel			// NB: No relatedTarget if the mouse left/entered the browser window
3594273562Smarcel			if ( !related || handleObj.origType === event.type || (related !== target && !jQuery.contains( target, related )) ) {
3595273562Smarcel				oldType = event.type;
3596273562Smarcel				event.type = handleObj.origType;
3597273562Smarcel				ret = handleObj.handler.apply( this, arguments );
3598273562Smarcel				event.type = oldType;
3599273562Smarcel			}
3600273562Smarcel			return ret;
3601273562Smarcel		}
3602273562Smarcel	};
3603273562Smarcel});
3604273562Smarcel
3605273562Smarcel// IE submit delegation
3606273562Smarcelif ( !jQuery.support.submitBubbles ) {
3607273562Smarcel
3608273562Smarcel	jQuery.event.special.submit = {
3609273562Smarcel		setup: function() {
3610273562Smarcel			// Only need this for delegated form submit events
3611273562Smarcel			if ( jQuery.nodeName( this, "form" ) ) {
3612273562Smarcel				return false;
3613273562Smarcel			}
3614273562Smarcel
3615273562Smarcel			// Lazy-add a submit handler when a descendant form may potentially be submitted
3616273562Smarcel			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
3617273562Smarcel				// Node name check avoids a VML-related crash in IE (#9807)
3618273562Smarcel				var elem = e.target,
3619273562Smarcel					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
3620273562Smarcel				if ( form && !form._submit_attached ) {
3621273562Smarcel					jQuery.event.add( form, "submit._submit", function( event ) {
3622273562Smarcel						// Form was submitted, bubble the event up the tree
3623273562Smarcel						if ( this.parentNode ) {
3624273562Smarcel							jQuery.event.simulate( "submit", this.parentNode, event, true );
3625273562Smarcel						}
3626273562Smarcel					});
3627273562Smarcel					form._submit_attached = true;
3628273562Smarcel				}
3629273562Smarcel			});
3630273562Smarcel			// return undefined since we don't need an event listener
3631273562Smarcel		},
3632273562Smarcel
3633273562Smarcel		teardown: function() {
3634273562Smarcel			// Only need this for delegated form submit events
3635273562Smarcel			if ( jQuery.nodeName( this, "form" ) ) {
3636273562Smarcel				return false;
3637273562Smarcel			}
3638273562Smarcel
3639273562Smarcel			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
3640273562Smarcel			jQuery.event.remove( this, "._submit" );
3641273562Smarcel		}
3642273562Smarcel	};
3643273562Smarcel}
3644273562Smarcel
3645273562Smarcel// IE change delegation and checkbox/radio fix
3646273562Smarcelif ( !jQuery.support.changeBubbles ) {
3647273562Smarcel
3648273562Smarcel	jQuery.event.special.change = {
3649273562Smarcel
3650273562Smarcel		setup: function() {
3651273562Smarcel
3652273562Smarcel			if ( rformElems.test( this.nodeName ) ) {
3653273562Smarcel				// IE doesn't fire change on a check/radio until blur; trigger it on click
3654273562Smarcel				// after a propertychange. Eat the blur-change in special.change.handle.
3655273562Smarcel				// This still fires onchange a second time for check/radio after blur.
3656273562Smarcel				if ( this.type === "checkbox" || this.type === "radio" ) {
3657273562Smarcel					jQuery.event.add( this, "propertychange._change", function( event ) {
3658273562Smarcel						if ( event.originalEvent.propertyName === "checked" ) {
3659273562Smarcel							this._just_changed = true;
3660273562Smarcel						}
3661273562Smarcel					});
3662273562Smarcel					jQuery.event.add( this, "click._change", function( event ) {
3663273562Smarcel						if ( this._just_changed ) {
3664273562Smarcel							this._just_changed = false;
3665273562Smarcel							jQuery.event.simulate( "change", this, event, true );
3666273562Smarcel						}
3667273562Smarcel					});
3668273562Smarcel				}
3669273562Smarcel				return false;
3670273562Smarcel			}
3671273562Smarcel			// Delegated event; lazy-add a change handler on descendant inputs
3672273562Smarcel			jQuery.event.add( this, "beforeactivate._change", function( e ) {
3673273562Smarcel				var elem = e.target;
3674273562Smarcel
3675273562Smarcel				if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
3676273562Smarcel					jQuery.event.add( elem, "change._change", function( event ) {
3677273562Smarcel						if ( this.parentNode && !event.isSimulated ) {
3678273562Smarcel							jQuery.event.simulate( "change", this.parentNode, event, true );
3679273562Smarcel						}
3680273562Smarcel					});
3681273562Smarcel					elem._change_attached = true;
3682273562Smarcel				}
3683273562Smarcel			});
3684273562Smarcel		},
3685273562Smarcel
3686273562Smarcel		handle: function( event ) {
3687273562Smarcel			var elem = event.target;
3688273562Smarcel
3689273562Smarcel			// Swallow native change events from checkbox/radio, we already triggered them above
3690273562Smarcel			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
3691273562Smarcel				return event.handleObj.handler.apply( this, arguments );
3692273562Smarcel			}
3693273562Smarcel		},
3694273562Smarcel
3695273562Smarcel		teardown: function() {
3696273562Smarcel			jQuery.event.remove( this, "._change" );
3697273562Smarcel
3698273562Smarcel			return rformElems.test( this.nodeName );
3699273562Smarcel		}
3700273562Smarcel	};
3701273562Smarcel}
3702273562Smarcel
3703273562Smarcel// Create "bubbling" focus and blur events
3704273562Smarcelif ( !jQuery.support.focusinBubbles ) {
3705273562Smarcel	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
3706273562Smarcel
3707273562Smarcel		// Attach a single capturing handler while someone wants focusin/focusout
3708273562Smarcel		var attaches = 0,
3709273562Smarcel			handler = function( event ) {
3710273562Smarcel				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
3711273562Smarcel			};
3712273562Smarcel
3713273562Smarcel		jQuery.event.special[ fix ] = {
3714273562Smarcel			setup: function() {
3715273562Smarcel				if ( attaches++ === 0 ) {
3716273562Smarcel					document.addEventListener( orig, handler, true );
3717273562Smarcel				}
3718273562Smarcel			},
3719273562Smarcel			teardown: function() {
3720273562Smarcel				if ( --attaches === 0 ) {
3721273562Smarcel					document.removeEventListener( orig, handler, true );
3722273562Smarcel				}
3723273562Smarcel			}
3724273562Smarcel		};
3725273562Smarcel	});
3726273562Smarcel}
3727273562Smarcel
3728273562SmarceljQuery.fn.extend({
3729273562Smarcel
3730273562Smarcel	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
3731273562Smarcel		var origFn, type;
3732273562Smarcel
3733273562Smarcel		// Types can be a map of types/handlers
3734273562Smarcel		if ( typeof types === "object" ) {
3735273562Smarcel			// ( types-Object, selector, data )
3736273562Smarcel			if ( typeof selector !== "string" ) {
3737273562Smarcel				// ( types-Object, data )
3738273562Smarcel				data = selector;
3739273562Smarcel				selector = undefined;
3740273562Smarcel			}
3741273562Smarcel			for ( type in types ) {
3742273562Smarcel				this.on( type, selector, data, types[ type ], one );
3743273562Smarcel			}
3744273562Smarcel			return this;
3745273562Smarcel		}
3746273562Smarcel
3747273562Smarcel		if ( data == null && fn == null ) {
3748273562Smarcel			// ( types, fn )
3749273562Smarcel			fn = selector;
3750273562Smarcel			data = selector = undefined;
3751273562Smarcel		} else if ( fn == null ) {
3752273562Smarcel			if ( typeof selector === "string" ) {
3753273562Smarcel				// ( types, selector, fn )
3754273562Smarcel				fn = data;
3755273562Smarcel				data = undefined;
3756273562Smarcel			} else {
3757273562Smarcel				// ( types, data, fn )
3758273562Smarcel				fn = data;
3759273562Smarcel				data = selector;
3760273562Smarcel				selector = undefined;
3761273562Smarcel			}
3762273562Smarcel		}
3763273562Smarcel		if ( fn === false ) {
3764273562Smarcel			fn = returnFalse;
3765273562Smarcel		} else if ( !fn ) {
3766273562Smarcel			return this;
3767273562Smarcel		}
3768273562Smarcel
3769273562Smarcel		if ( one === 1 ) {
3770273562Smarcel			origFn = fn;
3771273562Smarcel			fn = function( event ) {
3772273562Smarcel				// Can use an empty set, since event contains the info
3773273562Smarcel				jQuery().off( event );
3774273562Smarcel				return origFn.apply( this, arguments );
3775273562Smarcel			};
3776273562Smarcel			// Use same guid so caller can remove using origFn
3777273562Smarcel			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
3778273562Smarcel		}
3779273562Smarcel		return this.each( function() {
3780273562Smarcel			jQuery.event.add( this, types, fn, data, selector );
3781273562Smarcel		});
3782273562Smarcel	},
3783273562Smarcel	one: function( types, selector, data, fn ) {
3784273562Smarcel		return this.on.call( this, types, selector, data, fn, 1 );
3785273562Smarcel	},
3786273562Smarcel	off: function( types, selector, fn ) {
3787273562Smarcel		if ( types && types.preventDefault && types.handleObj ) {
3788273562Smarcel			// ( event )  dispatched jQuery.Event
3789273562Smarcel			var handleObj = types.handleObj;
3790273562Smarcel			jQuery( types.delegateTarget ).off(
3791273562Smarcel				handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type,
3792273562Smarcel				handleObj.selector,
3793273562Smarcel				handleObj.handler
3794273562Smarcel			);
3795273562Smarcel			return this;
3796273562Smarcel		}
3797273562Smarcel		if ( typeof types === "object" ) {
3798273562Smarcel			// ( types-object [, selector] )
3799273562Smarcel			for ( var type in types ) {
3800273562Smarcel				this.off( type, selector, types[ type ] );
3801273562Smarcel			}
3802273562Smarcel			return this;
3803273562Smarcel		}
3804273562Smarcel		if ( selector === false || typeof selector === "function" ) {
3805273562Smarcel			// ( types [, fn] )
3806273562Smarcel			fn = selector;
3807273562Smarcel			selector = undefined;
3808273562Smarcel		}
3809273562Smarcel		if ( fn === false ) {
3810273562Smarcel			fn = returnFalse;
3811273562Smarcel		}
3812273562Smarcel		return this.each(function() {
3813273562Smarcel			jQuery.event.remove( this, types, fn, selector );
3814273562Smarcel		});
3815273562Smarcel	},
3816273562Smarcel
3817273562Smarcel	bind: function( types, data, fn ) {
3818273562Smarcel		return this.on( types, null, data, fn );
3819273562Smarcel	},
3820273562Smarcel	unbind: function( types, fn ) {
3821273562Smarcel		return this.off( types, null, fn );
3822273562Smarcel	},
3823273562Smarcel
3824273562Smarcel	live: function( types, data, fn ) {
3825273562Smarcel		jQuery( this.context ).on( types, this.selector, data, fn );
3826273562Smarcel		return this;
3827273562Smarcel	},
3828273562Smarcel	die: function( types, fn ) {
3829273562Smarcel		jQuery( this.context ).off( types, this.selector || "**", fn );
3830273562Smarcel		return this;
3831273562Smarcel	},
3832273562Smarcel
3833273562Smarcel	delegate: function( selector, types, data, fn ) {
3834273562Smarcel		return this.on( types, selector, data, fn );
3835273562Smarcel	},
3836273562Smarcel	undelegate: function( selector, types, fn ) {
3837273562Smarcel		// ( namespace ) or ( selector, types [, fn] )
3838273562Smarcel		return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
3839273562Smarcel	},
3840273562Smarcel
3841273562Smarcel	trigger: function( type, data ) {
3842273562Smarcel		return this.each(function() {
3843273562Smarcel			jQuery.event.trigger( type, data, this );
3844273562Smarcel		});
3845273562Smarcel	},
3846273562Smarcel	triggerHandler: function( type, data ) {
3847273562Smarcel		if ( this[0] ) {
3848273562Smarcel			return jQuery.event.trigger( type, data, this[0], true );
3849273562Smarcel		}
3850273562Smarcel	},
3851273562Smarcel
3852273562Smarcel	toggle: function( fn ) {
3853273562Smarcel		// Save reference to arguments for access in closure
3854273562Smarcel		var args = arguments,
3855273562Smarcel			guid = fn.guid || jQuery.guid++,
3856273562Smarcel			i = 0,
3857273562Smarcel			toggler = function( event ) {
3858273562Smarcel				// Figure out which function to execute
3859273562Smarcel				var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
3860273562Smarcel				jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
3861273562Smarcel
3862273562Smarcel				// Make sure that clicks stop
3863273562Smarcel				event.preventDefault();
3864273562Smarcel
3865273562Smarcel				// and execute the function
3866273562Smarcel				return args[ lastToggle ].apply( this, arguments ) || false;
3867273562Smarcel			};
3868273562Smarcel
3869273562Smarcel		// link all the functions, so any of them can unbind this click handler
3870273562Smarcel		toggler.guid = guid;
3871273562Smarcel		while ( i < args.length ) {
3872273562Smarcel			args[ i++ ].guid = guid;
3873273562Smarcel		}
3874273562Smarcel
3875273562Smarcel		return this.click( toggler );
3876273562Smarcel	},
3877273562Smarcel
3878273562Smarcel	hover: function( fnOver, fnOut ) {
3879273562Smarcel		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
3880273562Smarcel	}
3881273562Smarcel});
3882273562Smarcel
3883273562SmarceljQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
3884273562Smarcel	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
3885273562Smarcel	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
3886273562Smarcel
3887273562Smarcel	// Handle event binding
3888273562Smarcel	jQuery.fn[ name ] = function( data, fn ) {
3889273562Smarcel		if ( fn == null ) {
3890273562Smarcel			fn = data;
3891273562Smarcel			data = null;
3892273562Smarcel		}
3893273562Smarcel
3894273562Smarcel		return arguments.length > 0 ?
3895273562Smarcel			this.bind( name, data, fn ) :
3896273562Smarcel			this.trigger( name );
3897273562Smarcel	};
3898273562Smarcel
3899273562Smarcel	if ( jQuery.attrFn ) {
3900273562Smarcel		jQuery.attrFn[ name ] = true;
3901273562Smarcel	}
3902273562Smarcel
3903273562Smarcel	if ( rkeyEvent.test( name ) ) {
3904273562Smarcel		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
3905273562Smarcel	}
3906273562Smarcel
3907273562Smarcel	if ( rmouseEvent.test( name ) ) {
3908273562Smarcel		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
3909273562Smarcel	}
3910273562Smarcel});
3911273562Smarcel
3912273562Smarcel
3913273562Smarcel
3914273562Smarcel/*!
3915273562Smarcel * Sizzle CSS Selector Engine
3916273562Smarcel *  Copyright 2011, The Dojo Foundation
3917273562Smarcel *  Released under the MIT, BSD, and GPL Licenses.
3918273562Smarcel *  More information: http://sizzlejs.com/
3919273562Smarcel */
3920273562Smarcel(function(){
3921273562Smarcel
3922273562Smarcelvar chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
3923273562Smarcel	expando = "sizcache" + (Math.random() + '').replace('.', ''),
3924273562Smarcel	done = 0,
3925273562Smarcel	toString = Object.prototype.toString,
3926273562Smarcel	hasDuplicate = false,
3927273562Smarcel	baseHasDuplicate = true,
3928273562Smarcel	rBackslash = /\\/g,
3929273562Smarcel	rReturn = /\r\n/g,
3930273562Smarcel	rNonWord = /\W/;
3931273562Smarcel
3932273562Smarcel// Here we check if the JavaScript engine is using some sort of
3933273562Smarcel// optimization where it does not always call our comparision
3934273562Smarcel// function. If that is the case, discard the hasDuplicate value.
3935273562Smarcel//   Thus far that includes Google Chrome.
3936273562Smarcel[0, 0].sort(function() {
3937273562Smarcel	baseHasDuplicate = false;
3938273562Smarcel	return 0;
3939273562Smarcel});
3940273562Smarcel
3941273562Smarcelvar Sizzle = function( selector, context, results, seed ) {
3942273562Smarcel	results = results || [];
3943273562Smarcel	context = context || document;
3944273562Smarcel
3945273562Smarcel	var origContext = context;
3946273562Smarcel
3947273562Smarcel	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
3948273562Smarcel		return [];
3949273562Smarcel	}
3950273562Smarcel
3951273562Smarcel	if ( !selector || typeof selector !== "string" ) {
3952273562Smarcel		return results;
3953273562Smarcel	}
3954273562Smarcel
3955273562Smarcel	var m, set, checkSet, extra, ret, cur, pop, i,
3956273562Smarcel		prune = true,
3957273562Smarcel		contextXML = Sizzle.isXML( context ),
3958273562Smarcel		parts = [],
3959273562Smarcel		soFar = selector;
3960273562Smarcel
3961273562Smarcel	// Reset the position of the chunker regexp (start from head)
3962273562Smarcel	do {
3963273562Smarcel		chunker.exec( "" );
3964273562Smarcel		m = chunker.exec( soFar );
3965273562Smarcel
3966273562Smarcel		if ( m ) {
3967273562Smarcel			soFar = m[3];
3968273562Smarcel
3969273562Smarcel			parts.push( m[1] );
3970273562Smarcel
3971273562Smarcel			if ( m[2] ) {
3972273562Smarcel				extra = m[3];
3973273562Smarcel				break;
3974273562Smarcel			}
3975273562Smarcel		}
3976273562Smarcel	} while ( m );
3977273562Smarcel
3978273562Smarcel	if ( parts.length > 1 && origPOS.exec( selector ) ) {
3979273562Smarcel
3980273562Smarcel		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
3981273562Smarcel			set = posProcess( parts[0] + parts[1], context, seed );
3982273562Smarcel
3983273562Smarcel		} else {
3984273562Smarcel			set = Expr.relative[ parts[0] ] ?
3985273562Smarcel				[ context ] :
3986273562Smarcel				Sizzle( parts.shift(), context );
3987273562Smarcel
3988273562Smarcel			while ( parts.length ) {
3989273562Smarcel				selector = parts.shift();
3990273562Smarcel
3991273562Smarcel				if ( Expr.relative[ selector ] ) {
3992273562Smarcel					selector += parts.shift();
3993273562Smarcel				}
3994273562Smarcel
3995273562Smarcel				set = posProcess( selector, set, seed );
3996273562Smarcel			}
3997273562Smarcel		}
3998273562Smarcel
3999273562Smarcel	} else {
4000273562Smarcel		// Take a shortcut and set the context if the root selector is an ID
4001273562Smarcel		// (but not if it'll be faster if the inner selector is an ID)
4002273562Smarcel		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
4003273562Smarcel				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
4004273562Smarcel
4005273562Smarcel			ret = Sizzle.find( parts.shift(), context, contextXML );
4006273562Smarcel			context = ret.expr ?
4007273562Smarcel				Sizzle.filter( ret.expr, ret.set )[0] :
4008273562Smarcel				ret.set[0];
4009273562Smarcel		}
4010273562Smarcel
4011273562Smarcel		if ( context ) {
4012273562Smarcel			ret = seed ?
4013273562Smarcel				{ expr: parts.pop(), set: makeArray(seed) } :
4014273562Smarcel				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
4015273562Smarcel
4016273562Smarcel			set = ret.expr ?
4017273562Smarcel				Sizzle.filter( ret.expr, ret.set ) :
4018273562Smarcel				ret.set;
4019273562Smarcel
4020273562Smarcel			if ( parts.length > 0 ) {
4021273562Smarcel				checkSet = makeArray( set );
4022273562Smarcel
4023273562Smarcel			} else {
4024273562Smarcel				prune = false;
4025273562Smarcel			}
4026273562Smarcel
4027273562Smarcel			while ( parts.length ) {
4028273562Smarcel				cur = parts.pop();
4029273562Smarcel				pop = cur;
4030273562Smarcel
4031273562Smarcel				if ( !Expr.relative[ cur ] ) {
4032273562Smarcel					cur = "";
4033273562Smarcel				} else {
4034273562Smarcel					pop = parts.pop();
4035273562Smarcel				}
4036273562Smarcel
4037273562Smarcel				if ( pop == null ) {
4038273562Smarcel					pop = context;
4039273562Smarcel				}
4040273562Smarcel
4041273562Smarcel				Expr.relative[ cur ]( checkSet, pop, contextXML );
4042273562Smarcel			}
4043273562Smarcel
4044273562Smarcel		} else {
4045273562Smarcel			checkSet = parts = [];
4046273562Smarcel		}
4047273562Smarcel	}
4048273562Smarcel
4049273562Smarcel	if ( !checkSet ) {
4050273562Smarcel		checkSet = set;
4051273562Smarcel	}
4052273562Smarcel
4053273562Smarcel	if ( !checkSet ) {
4054273562Smarcel		Sizzle.error( cur || selector );
4055273562Smarcel	}
4056273562Smarcel
4057273562Smarcel	if ( toString.call(checkSet) === "[object Array]" ) {
4058273562Smarcel		if ( !prune ) {
4059273562Smarcel			results.push.apply( results, checkSet );
4060273562Smarcel
4061273562Smarcel		} else if ( context && context.nodeType === 1 ) {
4062273562Smarcel			for ( i = 0; checkSet[i] != null; i++ ) {
4063273562Smarcel				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
4064273562Smarcel					results.push( set[i] );
4065273562Smarcel				}
4066273562Smarcel			}
4067273562Smarcel
4068273562Smarcel		} else {
4069273562Smarcel			for ( i = 0; checkSet[i] != null; i++ ) {
4070273562Smarcel				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
4071273562Smarcel					results.push( set[i] );
4072273562Smarcel				}
4073273562Smarcel			}
4074273562Smarcel		}
4075273562Smarcel
4076273562Smarcel	} else {
4077273562Smarcel		makeArray( checkSet, results );
4078273562Smarcel	}
4079273562Smarcel
4080273562Smarcel	if ( extra ) {
4081273562Smarcel		Sizzle( extra, origContext, results, seed );
4082273562Smarcel		Sizzle.uniqueSort( results );
4083273562Smarcel	}
4084273562Smarcel
4085273562Smarcel	return results;
4086273562Smarcel};
4087273562Smarcel
4088273562SmarcelSizzle.uniqueSort = function( results ) {
4089273562Smarcel	if ( sortOrder ) {
4090273562Smarcel		hasDuplicate = baseHasDuplicate;
4091273562Smarcel		results.sort( sortOrder );
4092273562Smarcel
4093273562Smarcel		if ( hasDuplicate ) {
4094273562Smarcel			for ( var i = 1; i < results.length; i++ ) {
4095273562Smarcel				if ( results[i] === results[ i - 1 ] ) {
4096273562Smarcel					results.splice( i--, 1 );
4097273562Smarcel				}
4098273562Smarcel			}
4099273562Smarcel		}
4100273562Smarcel	}
4101273562Smarcel
4102273562Smarcel	return results;
4103273562Smarcel};
4104273562Smarcel
4105273562SmarcelSizzle.matches = function( expr, set ) {
4106273562Smarcel	return Sizzle( expr, null, null, set );
4107273562Smarcel};
4108273562Smarcel
4109273562SmarcelSizzle.matchesSelector = function( node, expr ) {
4110273562Smarcel	return Sizzle( expr, null, null, [node] ).length > 0;
4111273562Smarcel};
4112273562Smarcel
4113273562SmarcelSizzle.find = function( expr, context, isXML ) {
4114273562Smarcel	var set, i, len, match, type, left;
4115273562Smarcel
4116273562Smarcel	if ( !expr ) {
4117273562Smarcel		return [];
4118273562Smarcel	}
4119273562Smarcel
4120273562Smarcel	for ( i = 0, len = Expr.order.length; i < len; i++ ) {
4121273562Smarcel		type = Expr.order[i];
4122273562Smarcel
4123273562Smarcel		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
4124273562Smarcel			left = match[1];
4125273562Smarcel			match.splice( 1, 1 );
4126273562Smarcel
4127273562Smarcel			if ( left.substr( left.length - 1 ) !== "\\" ) {
4128273562Smarcel				match[1] = (match[1] || "").replace( rBackslash, "" );
4129273562Smarcel				set = Expr.find[ type ]( match, context, isXML );
4130273562Smarcel
4131273562Smarcel				if ( set != null ) {
4132273562Smarcel					expr = expr.replace( Expr.match[ type ], "" );
4133273562Smarcel					break;
4134273562Smarcel				}
4135273562Smarcel			}
4136273562Smarcel		}
4137273562Smarcel	}
4138273562Smarcel
4139273562Smarcel	if ( !set ) {
4140273562Smarcel		set = typeof context.getElementsByTagName !== "undefined" ?
4141273562Smarcel			context.getElementsByTagName( "*" ) :
4142273562Smarcel			[];
4143273562Smarcel	}
4144273562Smarcel
4145273562Smarcel	return { set: set, expr: expr };
4146273562Smarcel};
4147273562Smarcel
4148273562SmarcelSizzle.filter = function( expr, set, inplace, not ) {
4149273562Smarcel	var match, anyFound,
4150273562Smarcel		type, found, item, filter, left,
4151273562Smarcel		i, pass,
4152273562Smarcel		old = expr,
4153273562Smarcel		result = [],
4154273562Smarcel		curLoop = set,
4155273562Smarcel		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
4156273562Smarcel
4157273562Smarcel	while ( expr && set.length ) {
4158273562Smarcel		for ( type in Expr.filter ) {
4159273562Smarcel			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
4160273562Smarcel				filter = Expr.filter[ type ];
4161273562Smarcel				left = match[1];
4162273562Smarcel
4163273562Smarcel				anyFound = false;
4164273562Smarcel
4165273562Smarcel				match.splice(1,1);
4166273562Smarcel
4167273562Smarcel				if ( left.substr( left.length - 1 ) === "\\" ) {
4168273562Smarcel					continue;
4169273562Smarcel				}
4170273562Smarcel
4171273562Smarcel				if ( curLoop === result ) {
4172273562Smarcel					result = [];
4173273562Smarcel				}
4174273562Smarcel
4175273562Smarcel				if ( Expr.preFilter[ type ] ) {
4176273562Smarcel					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
4177273562Smarcel
4178273562Smarcel					if ( !match ) {
4179273562Smarcel						anyFound = found = true;
4180273562Smarcel
4181273562Smarcel					} else if ( match === true ) {
4182273562Smarcel						continue;
4183273562Smarcel					}
4184273562Smarcel				}
4185273562Smarcel
4186273562Smarcel				if ( match ) {
4187273562Smarcel					for ( i = 0; (item = curLoop[i]) != null; i++ ) {
4188273562Smarcel						if ( item ) {
4189273562Smarcel							found = filter( item, match, i, curLoop );
4190273562Smarcel							pass = not ^ found;
4191273562Smarcel
4192273562Smarcel							if ( inplace && found != null ) {
4193273562Smarcel								if ( pass ) {
4194273562Smarcel									anyFound = true;
4195273562Smarcel
4196273562Smarcel								} else {
4197273562Smarcel									curLoop[i] = false;
4198273562Smarcel								}
4199273562Smarcel
4200273562Smarcel							} else if ( pass ) {
4201273562Smarcel								result.push( item );
4202273562Smarcel								anyFound = true;
4203273562Smarcel							}
4204273562Smarcel						}
4205273562Smarcel					}
4206273562Smarcel				}
4207273562Smarcel
4208273562Smarcel				if ( found !== undefined ) {
4209273562Smarcel					if ( !inplace ) {
4210273562Smarcel						curLoop = result;
4211273562Smarcel					}
4212273562Smarcel
4213273562Smarcel					expr = expr.replace( Expr.match[ type ], "" );
4214273562Smarcel
4215273562Smarcel					if ( !anyFound ) {
4216273562Smarcel						return [];
4217273562Smarcel					}
4218273562Smarcel
4219273562Smarcel					break;
4220273562Smarcel				}
4221273562Smarcel			}
4222273562Smarcel		}
4223273562Smarcel
4224273562Smarcel		// Improper expression
4225273562Smarcel		if ( expr === old ) {
4226273562Smarcel			if ( anyFound == null ) {
4227273562Smarcel				Sizzle.error( expr );
4228273562Smarcel
4229273562Smarcel			} else {
4230273562Smarcel				break;
4231273562Smarcel			}
4232273562Smarcel		}
4233273562Smarcel
4234273562Smarcel		old = expr;
4235273562Smarcel	}
4236273562Smarcel
4237273562Smarcel	return curLoop;
4238273562Smarcel};
4239273562Smarcel
4240273562SmarcelSizzle.error = function( msg ) {
4241273562Smarcel	throw "Syntax error, unrecognized expression: " + msg;
4242273562Smarcel};
4243273562Smarcel
4244273562Smarcel/**
4245273562Smarcel * Utility function for retreiving the text value of an array of DOM nodes
4246273562Smarcel * @param {Array|Element} elem
4247273562Smarcel */
4248273562Smarcelvar getText = Sizzle.getText = function( elem ) {
4249273562Smarcel    var i, node,
4250273562Smarcel		nodeType = elem.nodeType,
4251273562Smarcel		ret = "";
4252273562Smarcel
4253273562Smarcel	if ( nodeType ) {
4254273562Smarcel		if ( nodeType === 1 ) {
4255273562Smarcel			// Use textContent || innerText for elements
4256273562Smarcel			if ( typeof elem.textContent === 'string' ) {
4257273562Smarcel				return elem.textContent;
4258273562Smarcel			} else if ( typeof elem.innerText === 'string' ) {
4259273562Smarcel				// Replace IE's carriage returns
4260273562Smarcel				return elem.innerText.replace( rReturn, '' );
4261273562Smarcel			} else {
4262273562Smarcel				// Traverse it's children
4263273562Smarcel				for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
4264273562Smarcel					ret += getText( elem );
4265273562Smarcel				}
4266273562Smarcel			}
4267273562Smarcel		} else if ( nodeType === 3 || nodeType === 4 ) {
4268273562Smarcel			return elem.nodeValue;
4269273562Smarcel		}
4270273562Smarcel	} else {
4271273562Smarcel
4272273562Smarcel		// If no nodeType, this is expected to be an array
4273273562Smarcel		for ( i = 0; (node = elem[i]); i++ ) {
4274273562Smarcel			// Do not traverse comment nodes
4275273562Smarcel			if ( node.nodeType !== 8 ) {
4276273562Smarcel				ret += getText( node );
4277273562Smarcel			}
4278273562Smarcel		}
4279273562Smarcel	}
4280273562Smarcel	return ret;
4281273562Smarcel};
4282273562Smarcel
4283273562Smarcelvar Expr = Sizzle.selectors = {
4284273562Smarcel	order: [ "ID", "NAME", "TAG" ],
4285273562Smarcel
4286273562Smarcel	match: {
4287273562Smarcel		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
4288273562Smarcel		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
4289273562Smarcel		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
4290273562Smarcel		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
4291273562Smarcel		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
4292273562Smarcel		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
4293273562Smarcel		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
4294273562Smarcel		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
4295273562Smarcel	},
4296273562Smarcel
4297273562Smarcel	leftMatch: {},
4298273562Smarcel
4299273562Smarcel	attrMap: {
4300273562Smarcel		"class": "className",
4301273562Smarcel		"for": "htmlFor"
4302273562Smarcel	},
4303273562Smarcel
4304273562Smarcel	attrHandle: {
4305273562Smarcel		href: function( elem ) {
4306273562Smarcel			return elem.getAttribute( "href" );
4307273562Smarcel		},
4308273562Smarcel		type: function( elem ) {
4309273562Smarcel			return elem.getAttribute( "type" );
4310273562Smarcel		}
4311273562Smarcel	},
4312273562Smarcel
4313273562Smarcel	relative: {
4314273562Smarcel		"+": function(checkSet, part){
4315273562Smarcel			var isPartStr = typeof part === "string",
4316273562Smarcel				isTag = isPartStr && !rNonWord.test( part ),
4317273562Smarcel				isPartStrNotTag = isPartStr && !isTag;
4318273562Smarcel
4319273562Smarcel			if ( isTag ) {
4320273562Smarcel				part = part.toLowerCase();
4321273562Smarcel			}
4322273562Smarcel
4323273562Smarcel			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
4324273562Smarcel				if ( (elem = checkSet[i]) ) {
4325273562Smarcel					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
4326273562Smarcel
4327273562Smarcel					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
4328273562Smarcel						elem || false :
4329273562Smarcel						elem === part;
4330273562Smarcel				}
4331273562Smarcel			}
4332273562Smarcel
4333273562Smarcel			if ( isPartStrNotTag ) {
4334273562Smarcel				Sizzle.filter( part, checkSet, true );
4335273562Smarcel			}
4336273562Smarcel		},
4337273562Smarcel
4338273562Smarcel		">": function( checkSet, part ) {
4339273562Smarcel			var elem,
4340273562Smarcel				isPartStr = typeof part === "string",
4341273562Smarcel				i = 0,
4342273562Smarcel				l = checkSet.length;
4343273562Smarcel
4344273562Smarcel			if ( isPartStr && !rNonWord.test( part ) ) {
4345273562Smarcel				part = part.toLowerCase();
4346273562Smarcel
4347273562Smarcel				for ( ; i < l; i++ ) {
4348273562Smarcel					elem = checkSet[i];
4349273562Smarcel
4350273562Smarcel					if ( elem ) {
4351273562Smarcel						var parent = elem.parentNode;
4352273562Smarcel						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
4353273562Smarcel					}
4354273562Smarcel				}
4355273562Smarcel
4356273562Smarcel			} else {
4357273562Smarcel				for ( ; i < l; i++ ) {
4358273562Smarcel					elem = checkSet[i];
4359273562Smarcel
4360273562Smarcel					if ( elem ) {
4361273562Smarcel						checkSet[i] = isPartStr ?
4362273562Smarcel							elem.parentNode :
4363273562Smarcel							elem.parentNode === part;
4364273562Smarcel					}
4365273562Smarcel				}
4366273562Smarcel
4367273562Smarcel				if ( isPartStr ) {
4368273562Smarcel					Sizzle.filter( part, checkSet, true );
4369273562Smarcel				}
4370273562Smarcel			}
4371273562Smarcel		},
4372273562Smarcel
4373273562Smarcel		"": function(checkSet, part, isXML){
4374273562Smarcel			var nodeCheck,
4375273562Smarcel				doneName = done++,
4376273562Smarcel				checkFn = dirCheck;
4377273562Smarcel
4378273562Smarcel			if ( typeof part === "string" && !rNonWord.test( part ) ) {
4379273562Smarcel				part = part.toLowerCase();
4380273562Smarcel				nodeCheck = part;
4381273562Smarcel				checkFn = dirNodeCheck;
4382273562Smarcel			}
4383273562Smarcel
4384273562Smarcel			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
4385273562Smarcel		},
4386273562Smarcel
4387273562Smarcel		"~": function( checkSet, part, isXML ) {
4388273562Smarcel			var nodeCheck,
4389273562Smarcel				doneName = done++,
4390273562Smarcel				checkFn = dirCheck;
4391273562Smarcel
4392273562Smarcel			if ( typeof part === "string" && !rNonWord.test( part ) ) {
4393273562Smarcel				part = part.toLowerCase();
4394273562Smarcel				nodeCheck = part;
4395273562Smarcel				checkFn = dirNodeCheck;
4396273562Smarcel			}
4397273562Smarcel
4398273562Smarcel			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
4399273562Smarcel		}
4400273562Smarcel	},
4401273562Smarcel
4402273562Smarcel	find: {
4403273562Smarcel		ID: function( match, context, isXML ) {
4404273562Smarcel			if ( typeof context.getElementById !== "undefined" && !isXML ) {
4405273562Smarcel				var m = context.getElementById(match[1]);
4406273562Smarcel				// Check parentNode to catch when Blackberry 4.6 returns
4407273562Smarcel				// nodes that are no longer in the document #6963
4408273562Smarcel				return m && m.parentNode ? [m] : [];
4409273562Smarcel			}
4410273562Smarcel		},
4411273562Smarcel
4412273562Smarcel		NAME: function( match, context ) {
4413273562Smarcel			if ( typeof context.getElementsByName !== "undefined" ) {
4414273562Smarcel				var ret = [],
4415273562Smarcel					results = context.getElementsByName( match[1] );
4416273562Smarcel
4417273562Smarcel				for ( var i = 0, l = results.length; i < l; i++ ) {
4418273562Smarcel					if ( results[i].getAttribute("name") === match[1] ) {
4419273562Smarcel						ret.push( results[i] );
4420273562Smarcel					}
4421273562Smarcel				}
4422273562Smarcel
4423273562Smarcel				return ret.length === 0 ? null : ret;
4424273562Smarcel			}
4425273562Smarcel		},
4426273562Smarcel
4427273562Smarcel		TAG: function( match, context ) {
4428273562Smarcel			if ( typeof context.getElementsByTagName !== "undefined" ) {
4429273562Smarcel				return context.getElementsByTagName( match[1] );
4430273562Smarcel			}
4431273562Smarcel		}
4432273562Smarcel	},
4433273562Smarcel	preFilter: {
4434273562Smarcel		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
4435273562Smarcel			match = " " + match[1].replace( rBackslash, "" ) + " ";
4436273562Smarcel
4437273562Smarcel			if ( isXML ) {
4438273562Smarcel				return match;
4439273562Smarcel			}
4440273562Smarcel
4441273562Smarcel			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
4442273562Smarcel				if ( elem ) {
4443273562Smarcel					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
4444273562Smarcel						if ( !inplace ) {
4445273562Smarcel							result.push( elem );
4446273562Smarcel						}
4447273562Smarcel
4448273562Smarcel					} else if ( inplace ) {
4449273562Smarcel						curLoop[i] = false;
4450273562Smarcel					}
4451273562Smarcel				}
4452273562Smarcel			}
4453273562Smarcel
4454273562Smarcel			return false;
4455273562Smarcel		},
4456273562Smarcel
4457273562Smarcel		ID: function( match ) {
4458273562Smarcel			return match[1].replace( rBackslash, "" );
4459273562Smarcel		},
4460273562Smarcel
4461273562Smarcel		TAG: function( match, curLoop ) {
4462273562Smarcel			return match[1].replace( rBackslash, "" ).toLowerCase();
4463273562Smarcel		},
4464273562Smarcel
4465273562Smarcel		CHILD: function( match ) {
4466273562Smarcel			if ( match[1] === "nth" ) {
4467273562Smarcel				if ( !match[2] ) {
4468273562Smarcel					Sizzle.error( match[0] );
4469273562Smarcel				}
4470273562Smarcel
4471273562Smarcel				match[2] = match[2].replace(/^\+|\s*/g, '');
4472273562Smarcel
4473273562Smarcel				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
4474273562Smarcel				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
4475273562Smarcel					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
4476273562Smarcel					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
4477273562Smarcel
4478273562Smarcel				// calculate the numbers (first)n+(last) including if they are negative
4479273562Smarcel				match[2] = (test[1] + (test[2] || 1)) - 0;
4480273562Smarcel				match[3] = test[3] - 0;
4481273562Smarcel			}
4482273562Smarcel			else if ( match[2] ) {
4483273562Smarcel				Sizzle.error( match[0] );
4484273562Smarcel			}
4485273562Smarcel
4486273562Smarcel			// TODO: Move to normal caching system
4487273562Smarcel			match[0] = done++;
4488273562Smarcel
4489273562Smarcel			return match;
4490273562Smarcel		},
4491273562Smarcel
4492273562Smarcel		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
4493273562Smarcel			var name = match[1] = match[1].replace( rBackslash, "" );
4494273562Smarcel
4495273562Smarcel			if ( !isXML && Expr.attrMap[name] ) {
4496273562Smarcel				match[1] = Expr.attrMap[name];
4497273562Smarcel			}
4498273562Smarcel
4499273562Smarcel			// Handle if an un-quoted value was used
4500273562Smarcel			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
4501273562Smarcel
4502273562Smarcel			if ( match[2] === "~=" ) {
4503273562Smarcel				match[4] = " " + match[4] + " ";
4504273562Smarcel			}
4505273562Smarcel
4506273562Smarcel			return match;
4507273562Smarcel		},
4508273562Smarcel
4509273562Smarcel		PSEUDO: function( match, curLoop, inplace, result, not ) {
4510273562Smarcel			if ( match[1] === "not" ) {
4511273562Smarcel				// If we're dealing with a complex expression, or a simple one
4512273562Smarcel				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
4513273562Smarcel					match[3] = Sizzle(match[3], null, null, curLoop);
4514273562Smarcel
4515273562Smarcel				} else {
4516273562Smarcel					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
4517273562Smarcel
4518273562Smarcel					if ( !inplace ) {
4519273562Smarcel						result.push.apply( result, ret );
4520273562Smarcel					}
4521273562Smarcel
4522273562Smarcel					return false;
4523273562Smarcel				}
4524273562Smarcel
4525273562Smarcel			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
4526273562Smarcel				return true;
4527273562Smarcel			}
4528273562Smarcel
4529273562Smarcel			return match;
4530273562Smarcel		},
4531273562Smarcel
4532273562Smarcel		POS: function( match ) {
4533273562Smarcel			match.unshift( true );
4534273562Smarcel
4535273562Smarcel			return match;
4536273562Smarcel		}
4537273562Smarcel	},
4538273562Smarcel
4539273562Smarcel	filters: {
4540273562Smarcel		enabled: function( elem ) {
4541273562Smarcel			return elem.disabled === false && elem.type !== "hidden";
4542273562Smarcel		},
4543273562Smarcel
4544273562Smarcel		disabled: function( elem ) {
4545273562Smarcel			return elem.disabled === true;
4546273562Smarcel		},
4547273562Smarcel
4548273562Smarcel		checked: function( elem ) {
4549273562Smarcel			return elem.checked === true;
4550273562Smarcel		},
4551273562Smarcel
4552273562Smarcel		selected: function( elem ) {
4553273562Smarcel			// Accessing this property makes selected-by-default
4554273562Smarcel			// options in Safari work properly
4555273562Smarcel			if ( elem.parentNode ) {
4556273562Smarcel				elem.parentNode.selectedIndex;
4557273562Smarcel			}
4558273562Smarcel
4559273562Smarcel			return elem.selected === true;
4560273562Smarcel		},
4561273562Smarcel
4562273562Smarcel		parent: function( elem ) {
4563273562Smarcel			return !!elem.firstChild;
4564273562Smarcel		},
4565273562Smarcel
4566273562Smarcel		empty: function( elem ) {
4567273562Smarcel			return !elem.firstChild;
4568273562Smarcel		},
4569273562Smarcel
4570273562Smarcel		has: function( elem, i, match ) {
4571273562Smarcel			return !!Sizzle( match[3], elem ).length;
4572273562Smarcel		},
4573273562Smarcel
4574273562Smarcel		header: function( elem ) {
4575273562Smarcel			return (/h\d/i).test( elem.nodeName );
4576273562Smarcel		},
4577273562Smarcel
4578273562Smarcel		text: function( elem ) {
4579273562Smarcel			var attr = elem.getAttribute( "type" ), type = elem.type;
4580273562Smarcel			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
4581273562Smarcel			// use getAttribute instead to test this case
4582273562Smarcel			return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
4583273562Smarcel		},
4584273562Smarcel
4585273562Smarcel		radio: function( elem ) {
4586273562Smarcel			return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
4587273562Smarcel		},
4588273562Smarcel
4589273562Smarcel		checkbox: function( elem ) {
4590273562Smarcel			return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
4591273562Smarcel		},
4592273562Smarcel
4593273562Smarcel		file: function( elem ) {
4594273562Smarcel			return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
4595273562Smarcel		},
4596273562Smarcel
4597273562Smarcel		password: function( elem ) {
4598273562Smarcel			return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
4599273562Smarcel		},
4600273562Smarcel
4601273562Smarcel		submit: function( elem ) {
4602273562Smarcel			var name = elem.nodeName.toLowerCase();
4603273562Smarcel			return (name === "input" || name === "button") && "submit" === elem.type;
4604273562Smarcel		},
4605273562Smarcel
4606273562Smarcel		image: function( elem ) {
4607273562Smarcel			return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
4608273562Smarcel		},
4609273562Smarcel
4610273562Smarcel		reset: function( elem ) {
4611273562Smarcel			var name = elem.nodeName.toLowerCase();
4612273562Smarcel			return (name === "input" || name === "button") && "reset" === elem.type;
4613273562Smarcel		},
4614273562Smarcel
4615273562Smarcel		button: function( elem ) {
4616273562Smarcel			var name = elem.nodeName.toLowerCase();
4617273562Smarcel			return name === "input" && "button" === elem.type || name === "button";
4618273562Smarcel		},
4619273562Smarcel
4620273562Smarcel		input: function( elem ) {
4621273562Smarcel			return (/input|select|textarea|button/i).test( elem.nodeName );
4622273562Smarcel		},
4623273562Smarcel
4624273562Smarcel		focus: function( elem ) {
4625273562Smarcel			return elem === elem.ownerDocument.activeElement;
4626273562Smarcel		}
4627273562Smarcel	},
4628273562Smarcel	setFilters: {
4629273562Smarcel		first: function( elem, i ) {
4630273562Smarcel			return i === 0;
4631273562Smarcel		},
4632273562Smarcel
4633273562Smarcel		last: function( elem, i, match, array ) {
4634273562Smarcel			return i === array.length - 1;
4635273562Smarcel		},
4636273562Smarcel
4637273562Smarcel		even: function( elem, i ) {
4638273562Smarcel			return i % 2 === 0;
4639273562Smarcel		},
4640273562Smarcel
4641273562Smarcel		odd: function( elem, i ) {
4642273562Smarcel			return i % 2 === 1;
4643273562Smarcel		},
4644273562Smarcel
4645273562Smarcel		lt: function( elem, i, match ) {
4646273562Smarcel			return i < match[3] - 0;
4647273562Smarcel		},
4648273562Smarcel
4649273562Smarcel		gt: function( elem, i, match ) {
4650273562Smarcel			return i > match[3] - 0;
4651273562Smarcel		},
4652273562Smarcel
4653273562Smarcel		nth: function( elem, i, match ) {
4654273562Smarcel			return match[3] - 0 === i;
4655273562Smarcel		},
4656273562Smarcel
4657273562Smarcel		eq: function( elem, i, match ) {
4658273562Smarcel			return match[3] - 0 === i;
4659273562Smarcel		}
4660273562Smarcel	},
4661273562Smarcel	filter: {
4662273562Smarcel		PSEUDO: function( elem, match, i, array ) {
4663273562Smarcel			var name = match[1],
4664273562Smarcel				filter = Expr.filters[ name ];
4665273562Smarcel
4666273562Smarcel			if ( filter ) {
4667273562Smarcel				return filter( elem, i, match, array );
4668273562Smarcel
4669273562Smarcel			} else if ( name === "contains" ) {
4670273562Smarcel				return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
4671273562Smarcel
4672273562Smarcel			} else if ( name === "not" ) {
4673273562Smarcel				var not = match[3];
4674273562Smarcel
4675273562Smarcel				for ( var j = 0, l = not.length; j < l; j++ ) {
4676273562Smarcel					if ( not[j] === elem ) {
4677273562Smarcel						return false;
4678273562Smarcel					}
4679273562Smarcel				}
4680273562Smarcel
4681273562Smarcel				return true;
4682273562Smarcel
4683273562Smarcel			} else {
4684273562Smarcel				Sizzle.error( name );
4685273562Smarcel			}
4686273562Smarcel		},
4687273562Smarcel
4688273562Smarcel		CHILD: function( elem, match ) {
4689273562Smarcel			var first, last,
4690273562Smarcel				doneName, parent, cache,
4691273562Smarcel				count, diff,
4692273562Smarcel				type = match[1],
4693273562Smarcel				node = elem;
4694273562Smarcel
4695273562Smarcel			switch ( type ) {
4696273562Smarcel				case "only":
4697273562Smarcel				case "first":
4698273562Smarcel					while ( (node = node.previousSibling) )	 {
4699273562Smarcel						if ( node.nodeType === 1 ) {
4700273562Smarcel							return false;
4701273562Smarcel						}
4702273562Smarcel					}
4703273562Smarcel
4704273562Smarcel					if ( type === "first" ) {
4705273562Smarcel						return true;
4706273562Smarcel					}
4707273562Smarcel
4708273562Smarcel					node = elem;
4709273562Smarcel
4710273562Smarcel				case "last":
4711273562Smarcel					while ( (node = node.nextSibling) )	 {
4712273562Smarcel						if ( node.nodeType === 1 ) {
4713273562Smarcel							return false;
4714273562Smarcel						}
4715273562Smarcel					}
4716273562Smarcel
4717273562Smarcel					return true;
4718273562Smarcel
4719273562Smarcel				case "nth":
4720273562Smarcel					first = match[2];
4721273562Smarcel					last = match[3];
4722273562Smarcel
4723273562Smarcel					if ( first === 1 && last === 0 ) {
4724273562Smarcel						return true;
4725273562Smarcel					}
4726273562Smarcel
4727273562Smarcel					doneName = match[0];
4728273562Smarcel					parent = elem.parentNode;
4729273562Smarcel
4730273562Smarcel					if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
4731273562Smarcel						count = 0;
4732273562Smarcel
4733273562Smarcel						for ( node = parent.firstChild; node; node = node.nextSibling ) {
4734273562Smarcel							if ( node.nodeType === 1 ) {
4735273562Smarcel								node.nodeIndex = ++count;
4736273562Smarcel							}
4737273562Smarcel						}
4738273562Smarcel
4739273562Smarcel						parent[ expando ] = doneName;
4740273562Smarcel					}
4741273562Smarcel
4742273562Smarcel					diff = elem.nodeIndex - last;
4743273562Smarcel
4744273562Smarcel					if ( first === 0 ) {
4745273562Smarcel						return diff === 0;
4746273562Smarcel
4747273562Smarcel					} else {
4748273562Smarcel						return ( diff % first === 0 && diff / first >= 0 );
4749273562Smarcel					}
4750273562Smarcel			}
4751273562Smarcel		},
4752273562Smarcel
4753273562Smarcel		ID: function( elem, match ) {
4754273562Smarcel			return elem.nodeType === 1 && elem.getAttribute("id") === match;
4755273562Smarcel		},
4756273562Smarcel
4757273562Smarcel		TAG: function( elem, match ) {
4758273562Smarcel			return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
4759273562Smarcel		},
4760273562Smarcel
4761273562Smarcel		CLASS: function( elem, match ) {
4762273562Smarcel			return (" " + (elem.className || elem.getAttribute("class")) + " ")
4763273562Smarcel				.indexOf( match ) > -1;
4764273562Smarcel		},
4765273562Smarcel
4766273562Smarcel		ATTR: function( elem, match ) {
4767273562Smarcel			var name = match[1],
4768273562Smarcel				result = Sizzle.attr ?
4769273562Smarcel					Sizzle.attr( elem, name ) :
4770273562Smarcel					Expr.attrHandle[ name ] ?
4771273562Smarcel					Expr.attrHandle[ name ]( elem ) :
4772273562Smarcel					elem[ name ] != null ?
4773273562Smarcel						elem[ name ] :
4774273562Smarcel						elem.getAttribute( name ),
4775273562Smarcel				value = result + "",
4776273562Smarcel				type = match[2],
4777273562Smarcel				check = match[4];
4778273562Smarcel
4779273562Smarcel			return result == null ?
4780273562Smarcel				type === "!=" :
4781273562Smarcel				!type && Sizzle.attr ?
4782273562Smarcel				result != null :
4783273562Smarcel				type === "=" ?
4784273562Smarcel				value === check :
4785273562Smarcel				type === "*=" ?
4786273562Smarcel				value.indexOf(check) >= 0 :
4787273562Smarcel				type === "~=" ?
4788273562Smarcel				(" " + value + " ").indexOf(check) >= 0 :
4789273562Smarcel				!check ?
4790273562Smarcel				value && result !== false :
4791273562Smarcel				type === "!=" ?
4792273562Smarcel				value !== check :
4793273562Smarcel				type === "^=" ?
4794273562Smarcel				value.indexOf(check) === 0 :
4795273562Smarcel				type === "$=" ?
4796273562Smarcel				value.substr(value.length - check.length) === check :
4797273562Smarcel				type === "|=" ?
4798273562Smarcel				value === check || value.substr(0, check.length + 1) === check + "-" :
4799273562Smarcel				false;
4800273562Smarcel		},
4801273562Smarcel
4802273562Smarcel		POS: function( elem, match, i, array ) {
4803273562Smarcel			var name = match[2],
4804273562Smarcel				filter = Expr.setFilters[ name ];
4805273562Smarcel
4806273562Smarcel			if ( filter ) {
4807273562Smarcel				return filter( elem, i, match, array );
4808273562Smarcel			}
4809273562Smarcel		}
4810273562Smarcel	}
4811273562Smarcel};
4812273562Smarcel
4813273562Smarcelvar origPOS = Expr.match.POS,
4814273562Smarcel	fescape = function(all, num){
4815273562Smarcel		return "\\" + (num - 0 + 1);
4816273562Smarcel	};
4817273562Smarcel
4818273562Smarcelfor ( var type in Expr.match ) {
4819273562Smarcel	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
4820273562Smarcel	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
4821273562Smarcel}
4822273562Smarcel
4823273562Smarcelvar makeArray = function( array, results ) {
4824273562Smarcel	array = Array.prototype.slice.call( array, 0 );
4825273562Smarcel
4826273562Smarcel	if ( results ) {
4827273562Smarcel		results.push.apply( results, array );
4828273562Smarcel		return results;
4829273562Smarcel	}
4830273562Smarcel
4831273562Smarcel	return array;
4832273562Smarcel};
4833273562Smarcel
4834273562Smarcel// Perform a simple check to determine if the browser is capable of
4835273562Smarcel// converting a NodeList to an array using builtin methods.
4836273562Smarcel// Also verifies that the returned array holds DOM nodes
4837273562Smarcel// (which is not the case in the Blackberry browser)
4838273562Smarceltry {
4839273562Smarcel	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
4840273562Smarcel
4841273562Smarcel// Provide a fallback method if it does not work
4842273562Smarcel} catch( e ) {
4843273562Smarcel	makeArray = function( array, results ) {
4844273562Smarcel		var i = 0,
4845273562Smarcel			ret = results || [];
4846273562Smarcel
4847273562Smarcel		if ( toString.call(array) === "[object Array]" ) {
4848273562Smarcel			Array.prototype.push.apply( ret, array );
4849273562Smarcel
4850273562Smarcel		} else {
4851273562Smarcel			if ( typeof array.length === "number" ) {
4852273562Smarcel				for ( var l = array.length; i < l; i++ ) {
4853273562Smarcel					ret.push( array[i] );
4854273562Smarcel				}
4855273562Smarcel
4856273562Smarcel			} else {
4857273562Smarcel				for ( ; array[i]; i++ ) {
4858273562Smarcel					ret.push( array[i] );
4859273562Smarcel				}
4860273562Smarcel			}
4861273562Smarcel		}
4862273562Smarcel
4863273562Smarcel		return ret;
4864273562Smarcel	};
4865273562Smarcel}
4866273562Smarcel
4867273562Smarcelvar sortOrder, siblingCheck;
4868273562Smarcel
4869273562Smarcelif ( document.documentElement.compareDocumentPosition ) {
4870273562Smarcel	sortOrder = function( a, b ) {
4871273562Smarcel		if ( a === b ) {
4872273562Smarcel			hasDuplicate = true;
4873273562Smarcel			return 0;
4874273562Smarcel		}
4875273562Smarcel
4876273562Smarcel		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
4877273562Smarcel			return a.compareDocumentPosition ? -1 : 1;
4878273562Smarcel		}
4879273562Smarcel
4880273562Smarcel		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
4881273562Smarcel	};
4882273562Smarcel
4883273562Smarcel} else {
4884273562Smarcel	sortOrder = function( a, b ) {
4885273562Smarcel		// The nodes are identical, we can exit early
4886273562Smarcel		if ( a === b ) {
4887273562Smarcel			hasDuplicate = true;
4888273562Smarcel			return 0;
4889273562Smarcel
4890273562Smarcel		// Fallback to using sourceIndex (in IE) if it's available on both nodes
4891273562Smarcel		} else if ( a.sourceIndex && b.sourceIndex ) {
4892273562Smarcel			return a.sourceIndex - b.sourceIndex;
4893273562Smarcel		}
4894273562Smarcel
4895273562Smarcel		var al, bl,
4896273562Smarcel			ap = [],
4897273562Smarcel			bp = [],
4898273562Smarcel			aup = a.parentNode,
4899273562Smarcel			bup = b.parentNode,
4900273562Smarcel			cur = aup;
4901273562Smarcel
4902273562Smarcel		// If the nodes are siblings (or identical) we can do a quick check
4903273562Smarcel		if ( aup === bup ) {
4904273562Smarcel			return siblingCheck( a, b );
4905273562Smarcel
4906273562Smarcel		// If no parents were found then the nodes are disconnected
4907273562Smarcel		} else if ( !aup ) {
4908273562Smarcel			return -1;
4909273562Smarcel
4910273562Smarcel		} else if ( !bup ) {
4911273562Smarcel			return 1;
4912273562Smarcel		}
4913273562Smarcel
4914273562Smarcel		// Otherwise they're somewhere else in the tree so we need
4915273562Smarcel		// to build up a full list of the parentNodes for comparison
4916273562Smarcel		while ( cur ) {
4917273562Smarcel			ap.unshift( cur );
4918273562Smarcel			cur = cur.parentNode;
4919273562Smarcel		}
4920273562Smarcel
4921273562Smarcel		cur = bup;
4922273562Smarcel
4923273562Smarcel		while ( cur ) {
4924273562Smarcel			bp.unshift( cur );
4925273562Smarcel			cur = cur.parentNode;
4926273562Smarcel		}
4927273562Smarcel
4928273562Smarcel		al = ap.length;
4929273562Smarcel		bl = bp.length;
4930273562Smarcel
4931273562Smarcel		// Start walking down the tree looking for a discrepancy
4932273562Smarcel		for ( var i = 0; i < al && i < bl; i++ ) {
4933273562Smarcel			if ( ap[i] !== bp[i] ) {
4934273562Smarcel				return siblingCheck( ap[i], bp[i] );
4935273562Smarcel			}
4936273562Smarcel		}
4937273562Smarcel
4938273562Smarcel		// We ended someplace up the tree so do a sibling check
4939273562Smarcel		return i === al ?
4940273562Smarcel			siblingCheck( a, bp[i], -1 ) :
4941273562Smarcel			siblingCheck( ap[i], b, 1 );
4942273562Smarcel	};
4943273562Smarcel
4944273562Smarcel	siblingCheck = function( a, b, ret ) {
4945273562Smarcel		if ( a === b ) {
4946273562Smarcel			return ret;
4947273562Smarcel		}
4948273562Smarcel
4949273562Smarcel		var cur = a.nextSibling;
4950273562Smarcel
4951273562Smarcel		while ( cur ) {
4952273562Smarcel			if ( cur === b ) {
4953273562Smarcel				return -1;
4954273562Smarcel			}
4955273562Smarcel
4956273562Smarcel			cur = cur.nextSibling;
4957273562Smarcel		}
4958273562Smarcel
4959273562Smarcel		return 1;
4960273562Smarcel	};
4961273562Smarcel}
4962273562Smarcel
4963273562Smarcel// Check to see if the browser returns elements by name when
4964273562Smarcel// querying by getElementById (and provide a workaround)
4965273562Smarcel(function(){
4966273562Smarcel	// We're going to inject a fake input element with a specified name
4967273562Smarcel	var form = document.createElement("div"),
4968273562Smarcel		id = "script" + (new Date()).getTime(),
4969273562Smarcel		root = document.documentElement;
4970273562Smarcel
4971273562Smarcel	form.innerHTML = "<a name='" + id + "'/>";
4972273562Smarcel
4973273562Smarcel	// Inject it into the root element, check its status, and remove it quickly
4974273562Smarcel	root.insertBefore( form, root.firstChild );
4975273562Smarcel
4976273562Smarcel	// The workaround has to do additional checks after a getElementById
4977273562Smarcel	// Which slows things down for other browsers (hence the branching)
4978273562Smarcel	if ( document.getElementById( id ) ) {
4979273562Smarcel		Expr.find.ID = function( match, context, isXML ) {
4980273562Smarcel			if ( typeof context.getElementById !== "undefined" && !isXML ) {
4981273562Smarcel				var m = context.getElementById(match[1]);
4982273562Smarcel
4983273562Smarcel				return m ?
4984273562Smarcel					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
4985273562Smarcel						[m] :
4986273562Smarcel						undefined :
4987273562Smarcel					[];
4988273562Smarcel			}
4989273562Smarcel		};
4990273562Smarcel
4991273562Smarcel		Expr.filter.ID = function( elem, match ) {
4992273562Smarcel			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
4993273562Smarcel
4994273562Smarcel			return elem.nodeType === 1 && node && node.nodeValue === match;
4995273562Smarcel		};
4996273562Smarcel	}
4997273562Smarcel
4998273562Smarcel	root.removeChild( form );
4999273562Smarcel
5000273562Smarcel	// release memory in IE
5001273562Smarcel	root = form = null;
5002273562Smarcel})();
5003273562Smarcel
5004273562Smarcel(function(){
5005273562Smarcel	// Check to see if the browser returns only elements
5006273562Smarcel	// when doing getElementsByTagName("*")
5007273562Smarcel
5008273562Smarcel	// Create a fake element
5009273562Smarcel	var div = document.createElement("div");
5010273562Smarcel	div.appendChild( document.createComment("") );
5011273562Smarcel
5012273562Smarcel	// Make sure no comments are found
5013273562Smarcel	if ( div.getElementsByTagName("*").length > 0 ) {
5014273562Smarcel		Expr.find.TAG = function( match, context ) {
5015273562Smarcel			var results = context.getElementsByTagName( match[1] );
5016273562Smarcel
5017273562Smarcel			// Filter out possible comments
5018273562Smarcel			if ( match[1] === "*" ) {
5019273562Smarcel				var tmp = [];
5020273562Smarcel
5021273562Smarcel				for ( var i = 0; results[i]; i++ ) {
5022273562Smarcel					if ( results[i].nodeType === 1 ) {
5023273562Smarcel						tmp.push( results[i] );
5024273562Smarcel					}
5025273562Smarcel				}
5026273562Smarcel
5027273562Smarcel				results = tmp;
5028273562Smarcel			}
5029273562Smarcel
5030273562Smarcel			return results;
5031273562Smarcel		};
5032273562Smarcel	}
5033273562Smarcel
5034273562Smarcel	// Check to see if an attribute returns normalized href attributes
5035273562Smarcel	div.innerHTML = "<a href='#'></a>";
5036273562Smarcel
5037273562Smarcel	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
5038273562Smarcel			div.firstChild.getAttribute("href") !== "#" ) {
5039273562Smarcel
5040273562Smarcel		Expr.attrHandle.href = function( elem ) {
5041273562Smarcel			return elem.getAttribute( "href", 2 );
5042273562Smarcel		};
5043273562Smarcel	}
5044273562Smarcel
5045273562Smarcel	// release memory in IE
5046273562Smarcel	div = null;
5047273562Smarcel})();
5048273562Smarcel
5049273562Smarcelif ( document.querySelectorAll ) {
5050273562Smarcel	(function(){
5051273562Smarcel		var oldSizzle = Sizzle,
5052273562Smarcel			div = document.createElement("div"),
5053273562Smarcel			id = "__sizzle__";
5054273562Smarcel
5055273562Smarcel		div.innerHTML = "<p class='TEST'></p>";
5056273562Smarcel
5057273562Smarcel		// Safari can't handle uppercase or unicode characters when
5058273562Smarcel		// in quirks mode.
5059273562Smarcel		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
5060273562Smarcel			return;
5061273562Smarcel		}
5062273562Smarcel
5063273562Smarcel		Sizzle = function( query, context, extra, seed ) {
5064273562Smarcel			context = context || document;
5065273562Smarcel
5066273562Smarcel			// Only use querySelectorAll on non-XML documents
5067273562Smarcel			// (ID selectors don't work in non-HTML documents)
5068273562Smarcel			if ( !seed && !Sizzle.isXML(context) ) {
5069273562Smarcel				// See if we find a selector to speed up
5070273562Smarcel				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
5071273562Smarcel
5072273562Smarcel				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
5073273562Smarcel					// Speed-up: Sizzle("TAG")
5074273562Smarcel					if ( match[1] ) {
5075273562Smarcel						return makeArray( context.getElementsByTagName( query ), extra );
5076273562Smarcel
5077273562Smarcel					// Speed-up: Sizzle(".CLASS")
5078273562Smarcel					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
5079273562Smarcel						return makeArray( context.getElementsByClassName( match[2] ), extra );
5080273562Smarcel					}
5081273562Smarcel				}
5082273562Smarcel
5083273562Smarcel				if ( context.nodeType === 9 ) {
5084273562Smarcel					// Speed-up: Sizzle("body")
5085273562Smarcel					// The body element only exists once, optimize finding it
5086273562Smarcel					if ( query === "body" && context.body ) {
5087273562Smarcel						return makeArray( [ context.body ], extra );
5088273562Smarcel
5089273562Smarcel					// Speed-up: Sizzle("#ID")
5090273562Smarcel					} else if ( match && match[3] ) {
5091273562Smarcel						var elem = context.getElementById( match[3] );
5092273562Smarcel
5093273562Smarcel						// Check parentNode to catch when Blackberry 4.6 returns
5094273562Smarcel						// nodes that are no longer in the document #6963
5095273562Smarcel						if ( elem && elem.parentNode ) {
5096273562Smarcel							// Handle the case where IE and Opera return items
5097273562Smarcel							// by name instead of ID
5098273562Smarcel							if ( elem.id === match[3] ) {
5099273562Smarcel								return makeArray( [ elem ], extra );
5100273562Smarcel							}
5101273562Smarcel
5102273562Smarcel						} else {
5103273562Smarcel							return makeArray( [], extra );
5104273562Smarcel						}
5105273562Smarcel					}
5106273562Smarcel
5107273562Smarcel					try {
5108273562Smarcel						return makeArray( context.querySelectorAll(query), extra );
5109273562Smarcel					} catch(qsaError) {}
5110273562Smarcel
5111273562Smarcel				// qSA works strangely on Element-rooted queries
5112273562Smarcel				// We can work around this by specifying an extra ID on the root
5113273562Smarcel				// and working up from there (Thanks to Andrew Dupont for the technique)
5114273562Smarcel				// IE 8 doesn't work on object elements
5115273562Smarcel				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
5116273562Smarcel					var oldContext = context,
5117273562Smarcel						old = context.getAttribute( "id" ),
5118273562Smarcel						nid = old || id,
5119273562Smarcel						hasParent = context.parentNode,
5120273562Smarcel						relativeHierarchySelector = /^\s*[+~]/.test( query );
5121273562Smarcel
5122273562Smarcel					if ( !old ) {
5123273562Smarcel						context.setAttribute( "id", nid );
5124273562Smarcel					} else {
5125273562Smarcel						nid = nid.replace( /'/g, "\\$&" );
5126273562Smarcel					}
5127273562Smarcel					if ( relativeHierarchySelector && hasParent ) {
5128273562Smarcel						context = context.parentNode;
5129273562Smarcel					}
5130273562Smarcel
5131273562Smarcel					try {
5132273562Smarcel						if ( !relativeHierarchySelector || hasParent ) {
5133273562Smarcel							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
5134273562Smarcel						}
5135273562Smarcel
5136273562Smarcel					} catch(pseudoError) {
5137273562Smarcel					} finally {
5138273562Smarcel						if ( !old ) {
5139273562Smarcel							oldContext.removeAttribute( "id" );
5140273562Smarcel						}
5141273562Smarcel					}
5142273562Smarcel				}
5143273562Smarcel			}
5144273562Smarcel
5145273562Smarcel			return oldSizzle(query, context, extra, seed);
5146273562Smarcel		};
5147273562Smarcel
5148273562Smarcel		for ( var prop in oldSizzle ) {
5149273562Smarcel			Sizzle[ prop ] = oldSizzle[ prop ];
5150273562Smarcel		}
5151273562Smarcel
5152273562Smarcel		// release memory in IE
5153273562Smarcel		div = null;
5154273562Smarcel	})();
5155273562Smarcel}
5156273562Smarcel
5157273562Smarcel(function(){
5158273562Smarcel	var html = document.documentElement,
5159273562Smarcel		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
5160273562Smarcel
5161273562Smarcel	if ( matches ) {
5162273562Smarcel		// Check to see if it's possible to do matchesSelector
5163273562Smarcel		// on a disconnected node (IE 9 fails this)
5164273562Smarcel		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
5165273562Smarcel			pseudoWorks = false;
5166273562Smarcel
5167273562Smarcel		try {
5168273562Smarcel			// This should fail with an exception
5169273562Smarcel			// Gecko does not error, returns false instead
5170273562Smarcel			matches.call( document.documentElement, "[test!='']:sizzle" );
5171273562Smarcel
5172273562Smarcel		} catch( pseudoError ) {
5173273562Smarcel			pseudoWorks = true;
5174273562Smarcel		}
5175273562Smarcel
5176273562Smarcel		Sizzle.matchesSelector = function( node, expr ) {
5177273562Smarcel			// Make sure that attribute selectors are quoted
5178273562Smarcel			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
5179273562Smarcel
5180273562Smarcel			if ( !Sizzle.isXML( node ) ) {
5181273562Smarcel				try {
5182273562Smarcel					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
5183273562Smarcel						var ret = matches.call( node, expr );
5184273562Smarcel
5185273562Smarcel						// IE 9's matchesSelector returns false on disconnected nodes
5186273562Smarcel						if ( ret || !disconnectedMatch ||
5187273562Smarcel								// As well, disconnected nodes are said to be in a document
5188273562Smarcel								// fragment in IE 9, so check for that
5189273562Smarcel								node.document && node.document.nodeType !== 11 ) {
5190273562Smarcel							return ret;
5191273562Smarcel						}
5192273562Smarcel					}
5193273562Smarcel				} catch(e) {}
5194273562Smarcel			}
5195273562Smarcel
5196273562Smarcel			return Sizzle(expr, null, null, [node]).length > 0;
5197273562Smarcel		};
5198273562Smarcel	}
5199273562Smarcel})();
5200273562Smarcel
5201273562Smarcel(function(){
5202273562Smarcel	var div = document.createElement("div");
5203273562Smarcel
5204273562Smarcel	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
5205273562Smarcel
5206273562Smarcel	// Opera can't find a second classname (in 9.6)
5207273562Smarcel	// Also, make sure that getElementsByClassName actually exists
5208273562Smarcel	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
5209273562Smarcel		return;
5210273562Smarcel	}
5211273562Smarcel
5212273562Smarcel	// Safari caches class attributes, doesn't catch changes (in 3.2)
5213273562Smarcel	div.lastChild.className = "e";
5214273562Smarcel
5215273562Smarcel	if ( div.getElementsByClassName("e").length === 1 ) {
5216273562Smarcel		return;
5217273562Smarcel	}
5218273562Smarcel
5219273562Smarcel	Expr.order.splice(1, 0, "CLASS");
5220273562Smarcel	Expr.find.CLASS = function( match, context, isXML ) {
5221273562Smarcel		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
5222273562Smarcel			return context.getElementsByClassName(match[1]);
5223273562Smarcel		}
5224273562Smarcel	};
5225273562Smarcel
5226273562Smarcel	// release memory in IE
5227273562Smarcel	div = null;
5228273562Smarcel})();
5229273562Smarcel
5230273562Smarcelfunction dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
5231273562Smarcel	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
5232273562Smarcel		var elem = checkSet[i];
5233273562Smarcel
5234273562Smarcel		if ( elem ) {
5235273562Smarcel			var match = false;
5236273562Smarcel
5237273562Smarcel			elem = elem[dir];
5238273562Smarcel
5239273562Smarcel			while ( elem ) {
5240273562Smarcel				if ( elem[ expando ] === doneName ) {
5241273562Smarcel					match = checkSet[elem.sizset];
5242273562Smarcel					break;
5243273562Smarcel				}
5244273562Smarcel
5245273562Smarcel				if ( elem.nodeType === 1 && !isXML ){
5246273562Smarcel					elem[ expando ] = doneName;
5247273562Smarcel					elem.sizset = i;
5248273562Smarcel				}
5249273562Smarcel
5250273562Smarcel				if ( elem.nodeName.toLowerCase() === cur ) {
5251273562Smarcel					match = elem;
5252273562Smarcel					break;
5253273562Smarcel				}
5254273562Smarcel
5255273562Smarcel				elem = elem[dir];
5256273562Smarcel			}
5257273562Smarcel
5258273562Smarcel			checkSet[i] = match;
5259273562Smarcel		}
5260273562Smarcel	}
5261273562Smarcel}
5262273562Smarcel
5263273562Smarcelfunction dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
5264273562Smarcel	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
5265273562Smarcel		var elem = checkSet[i];
5266273562Smarcel
5267273562Smarcel		if ( elem ) {
5268273562Smarcel			var match = false;
5269273562Smarcel
5270273562Smarcel			elem = elem[dir];
5271273562Smarcel
5272273562Smarcel			while ( elem ) {
5273273562Smarcel				if ( elem[ expando ] === doneName ) {
5274273562Smarcel					match = checkSet[elem.sizset];
5275273562Smarcel					break;
5276273562Smarcel				}
5277273562Smarcel
5278273562Smarcel				if ( elem.nodeType === 1 ) {
5279273562Smarcel					if ( !isXML ) {
5280273562Smarcel						elem[ expando ] = doneName;
5281273562Smarcel						elem.sizset = i;
5282273562Smarcel					}
5283273562Smarcel
5284273562Smarcel					if ( typeof cur !== "string" ) {
5285273562Smarcel						if ( elem === cur ) {
5286273562Smarcel							match = true;
5287273562Smarcel							break;
5288273562Smarcel						}
5289273562Smarcel
5290273562Smarcel					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
5291273562Smarcel						match = elem;
5292273562Smarcel						break;
5293273562Smarcel					}
5294273562Smarcel				}
5295273562Smarcel
5296273562Smarcel				elem = elem[dir];
5297273562Smarcel			}
5298273562Smarcel
5299273562Smarcel			checkSet[i] = match;
5300273562Smarcel		}
5301273562Smarcel	}
5302273562Smarcel}
5303273562Smarcel
5304273562Smarcelif ( document.documentElement.contains ) {
5305273562Smarcel	Sizzle.contains = function( a, b ) {
5306273562Smarcel		return a !== b && (a.contains ? a.contains(b) : true);
5307273562Smarcel	};
5308273562Smarcel
5309273562Smarcel} else if ( document.documentElement.compareDocumentPosition ) {
5310273562Smarcel	Sizzle.contains = function( a, b ) {
5311273562Smarcel		return !!(a.compareDocumentPosition(b) & 16);
5312273562Smarcel	};
5313273562Smarcel
5314273562Smarcel} else {
5315273562Smarcel	Sizzle.contains = function() {
5316273562Smarcel		return false;
5317273562Smarcel	};
5318273562Smarcel}
5319273562Smarcel
5320273562SmarcelSizzle.isXML = function( elem ) {
5321273562Smarcel	// documentElement is verified for cases where it doesn't yet exist
5322273562Smarcel	// (such as loading iframes in IE - #4833)
5323273562Smarcel	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
5324273562Smarcel
5325273562Smarcel	return documentElement ? documentElement.nodeName !== "HTML" : false;
5326273562Smarcel};
5327273562Smarcel
5328273562Smarcelvar posProcess = function( selector, context, seed ) {
5329273562Smarcel	var match,
5330273562Smarcel		tmpSet = [],
5331273562Smarcel		later = "",
5332273562Smarcel		root = context.nodeType ? [context] : context;
5333273562Smarcel
5334273562Smarcel	// Position selectors must be done after the filter
5335273562Smarcel	// And so must :not(positional) so we move all PSEUDOs to the end
5336273562Smarcel	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
5337273562Smarcel		later += match[0];
5338273562Smarcel		selector = selector.replace( Expr.match.PSEUDO, "" );
5339273562Smarcel	}
5340273562Smarcel
5341273562Smarcel	selector = Expr.relative[selector] ? selector + "*" : selector;
5342273562Smarcel
5343273562Smarcel	for ( var i = 0, l = root.length; i < l; i++ ) {
5344273562Smarcel		Sizzle( selector, root[i], tmpSet, seed );
5345273562Smarcel	}
5346273562Smarcel
5347273562Smarcel	return Sizzle.filter( later, tmpSet );
5348273562Smarcel};
5349273562Smarcel
5350273562Smarcel// EXPOSE
5351273562Smarcel// Override sizzle attribute retrieval
5352273562SmarcelSizzle.attr = jQuery.attr;
5353273562SmarcelSizzle.selectors.attrMap = {};
5354273562SmarceljQuery.find = Sizzle;
5355273562SmarceljQuery.expr = Sizzle.selectors;
5356273562SmarceljQuery.expr[":"] = jQuery.expr.filters;
5357273562SmarceljQuery.unique = Sizzle.uniqueSort;
5358273562SmarceljQuery.text = Sizzle.getText;
5359273562SmarceljQuery.isXMLDoc = Sizzle.isXML;
5360273562SmarceljQuery.contains = Sizzle.contains;
5361273562Smarcel
5362273562Smarcel
5363273562Smarcel})();
5364273562Smarcel
5365273562Smarcel
5366273562Smarcelvar runtil = /Until$/,
5367273562Smarcel	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
5368273562Smarcel	// Note: This RegExp should be improved, or likely pulled from Sizzle
5369273562Smarcel	rmultiselector = /,/,
5370273562Smarcel	isSimple = /^.[^:#\[\.,]*$/,
5371273562Smarcel	slice = Array.prototype.slice,
5372273562Smarcel	POS = jQuery.expr.match.POS,
5373273562Smarcel	// methods guaranteed to produce a unique set when starting from a unique set
5374273562Smarcel	guaranteedUnique = {
5375273562Smarcel		children: true,
5376273562Smarcel		contents: true,
5377273562Smarcel		next: true,
5378273562Smarcel		prev: true
5379273562Smarcel	};
5380273562Smarcel
5381273562SmarceljQuery.fn.extend({
5382273562Smarcel	find: function( selector ) {
5383273562Smarcel		var self = this,
5384273562Smarcel			i, l;
5385273562Smarcel
5386273562Smarcel		if ( typeof selector !== "string" ) {
5387273562Smarcel			return jQuery( selector ).filter(function() {
5388273562Smarcel				for ( i = 0, l = self.length; i < l; i++ ) {
5389273562Smarcel					if ( jQuery.contains( self[ i ], this ) ) {
5390273562Smarcel						return true;
5391273562Smarcel					}
5392273562Smarcel				}
5393273562Smarcel			});
5394273562Smarcel		}
5395273562Smarcel
5396273562Smarcel		var ret = this.pushStack( "", "find", selector ),
5397273562Smarcel			length, n, r;
5398273562Smarcel
5399273562Smarcel		for ( i = 0, l = this.length; i < l; i++ ) {
5400273562Smarcel			length = ret.length;
5401273562Smarcel			jQuery.find( selector, this[i], ret );
5402273562Smarcel
5403273562Smarcel			if ( i > 0 ) {
5404273562Smarcel				// Make sure that the results are unique
5405273562Smarcel				for ( n = length; n < ret.length; n++ ) {
5406273562Smarcel					for ( r = 0; r < length; r++ ) {
5407273562Smarcel						if ( ret[r] === ret[n] ) {
5408273562Smarcel							ret.splice(n--, 1);
5409273562Smarcel							break;
5410273562Smarcel						}
5411273562Smarcel					}
5412273562Smarcel				}
5413273562Smarcel			}
5414273562Smarcel		}
5415273562Smarcel
5416273562Smarcel		return ret;
5417273562Smarcel	},
5418273562Smarcel
5419273562Smarcel	has: function( target ) {
5420273562Smarcel		var targets = jQuery( target );
5421273562Smarcel		return this.filter(function() {
5422273562Smarcel			for ( var i = 0, l = targets.length; i < l; i++ ) {
5423273562Smarcel				if ( jQuery.contains( this, targets[i] ) ) {
5424273562Smarcel					return true;
5425273562Smarcel				}
5426273562Smarcel			}
5427273562Smarcel		});
5428273562Smarcel	},
5429273562Smarcel
5430273562Smarcel	not: function( selector ) {
5431273562Smarcel		return this.pushStack( winnow(this, selector, false), "not", selector);
5432273562Smarcel	},
5433273562Smarcel
5434273562Smarcel	filter: function( selector ) {
5435273562Smarcel		return this.pushStack( winnow(this, selector, true), "filter", selector );
5436273562Smarcel	},
5437273562Smarcel
5438273562Smarcel	is: function( selector ) {
5439273562Smarcel		return !!selector && (
5440273562Smarcel			typeof selector === "string" ?
5441273562Smarcel				// If this is a positional selector, check membership in the returned set
5442273562Smarcel				// so $("p:first").is("p:last") won't return true for a doc with two "p".
5443273562Smarcel				POS.test( selector ) ?
5444273562Smarcel					jQuery( selector, this.context ).index( this[0] ) >= 0 :
5445273562Smarcel					jQuery.filter( selector, this ).length > 0 :
5446273562Smarcel				this.filter( selector ).length > 0 );
5447273562Smarcel	},
5448273562Smarcel
5449273562Smarcel	closest: function( selectors, context ) {
5450273562Smarcel		var ret = [], i, l, cur = this[0];
5451273562Smarcel
5452273562Smarcel		// Array (deprecated as of jQuery 1.7)
5453273562Smarcel		if ( jQuery.isArray( selectors ) ) {
5454273562Smarcel			var level = 1;
5455273562Smarcel
5456273562Smarcel			while ( cur && cur.ownerDocument && cur !== context ) {
5457273562Smarcel				for ( i = 0; i < selectors.length; i++ ) {
5458273562Smarcel
5459273562Smarcel					if ( jQuery( cur ).is( selectors[ i ] ) ) {
5460273562Smarcel						ret.push({ selector: selectors[ i ], elem: cur, level: level });
5461273562Smarcel					}
5462273562Smarcel				}
5463273562Smarcel
5464273562Smarcel				cur = cur.parentNode;
5465273562Smarcel				level++;
5466273562Smarcel			}
5467273562Smarcel
5468273562Smarcel			return ret;
5469273562Smarcel		}
5470273562Smarcel
5471273562Smarcel		// String
5472273562Smarcel		var pos = POS.test( selectors ) || typeof selectors !== "string" ?
5473273562Smarcel				jQuery( selectors, context || this.context ) :
5474273562Smarcel				0;
5475273562Smarcel
5476273562Smarcel		for ( i = 0, l = this.length; i < l; i++ ) {
5477273562Smarcel			cur = this[i];
5478273562Smarcel
5479273562Smarcel			while ( cur ) {
5480273562Smarcel				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
5481273562Smarcel					ret.push( cur );
5482273562Smarcel					break;
5483273562Smarcel
5484273562Smarcel				} else {
5485273562Smarcel					cur = cur.parentNode;
5486273562Smarcel					if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
5487273562Smarcel						break;
5488273562Smarcel					}
5489273562Smarcel				}
5490273562Smarcel			}
5491273562Smarcel		}
5492273562Smarcel
5493273562Smarcel		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
5494273562Smarcel
5495273562Smarcel		return this.pushStack( ret, "closest", selectors );
5496273562Smarcel	},
5497273562Smarcel
5498273562Smarcel	// Determine the position of an element within
5499273562Smarcel	// the matched set of elements
5500273562Smarcel	index: function( elem ) {
5501273562Smarcel
5502273562Smarcel		// No argument, return index in parent
5503273562Smarcel		if ( !elem ) {
5504273562Smarcel			return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
5505273562Smarcel		}
5506273562Smarcel
5507273562Smarcel		// index in selector
5508273562Smarcel		if ( typeof elem === "string" ) {
5509273562Smarcel			return jQuery.inArray( this[0], jQuery( elem ) );
5510273562Smarcel		}
5511273562Smarcel
5512273562Smarcel		// Locate the position of the desired element
5513273562Smarcel		return jQuery.inArray(
5514273562Smarcel			// If it receives a jQuery object, the first element is used
5515273562Smarcel			elem.jquery ? elem[0] : elem, this );
5516273562Smarcel	},
5517273562Smarcel
5518273562Smarcel	add: function( selector, context ) {
5519273562Smarcel		var set = typeof selector === "string" ?
5520273562Smarcel				jQuery( selector, context ) :
5521273562Smarcel				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
5522273562Smarcel			all = jQuery.merge( this.get(), set );
5523273562Smarcel
5524273562Smarcel		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
5525273562Smarcel			all :
5526273562Smarcel			jQuery.unique( all ) );
5527273562Smarcel	},
5528273562Smarcel
5529273562Smarcel	andSelf: function() {
5530273562Smarcel		return this.add( this.prevObject );
5531273562Smarcel	}
5532273562Smarcel});
5533273562Smarcel
5534273562Smarcel// A painfully simple check to see if an element is disconnected
5535273562Smarcel// from a document (should be improved, where feasible).
5536273562Smarcelfunction isDisconnected( node ) {
5537273562Smarcel	return !node || !node.parentNode || node.parentNode.nodeType === 11;
5538273562Smarcel}
5539273562Smarcel
5540273562SmarceljQuery.each({
5541273562Smarcel	parent: function( elem ) {
5542273562Smarcel		var parent = elem.parentNode;
5543273562Smarcel		return parent && parent.nodeType !== 11 ? parent : null;
5544273562Smarcel	},
5545273562Smarcel	parents: function( elem ) {
5546273562Smarcel		return jQuery.dir( elem, "parentNode" );
5547273562Smarcel	},
5548273562Smarcel	parentsUntil: function( elem, i, until ) {
5549273562Smarcel		return jQuery.dir( elem, "parentNode", until );
5550273562Smarcel	},
5551273562Smarcel	next: function( elem ) {
5552273562Smarcel		return jQuery.nth( elem, 2, "nextSibling" );
5553273562Smarcel	},
5554273562Smarcel	prev: function( elem ) {
5555273562Smarcel		return jQuery.nth( elem, 2, "previousSibling" );
5556273562Smarcel	},
5557273562Smarcel	nextAll: function( elem ) {
5558273562Smarcel		return jQuery.dir( elem, "nextSibling" );
5559273562Smarcel	},
5560273562Smarcel	prevAll: function( elem ) {
5561273562Smarcel		return jQuery.dir( elem, "previousSibling" );
5562273562Smarcel	},
5563273562Smarcel	nextUntil: function( elem, i, until ) {
5564273562Smarcel		return jQuery.dir( elem, "nextSibling", until );
5565273562Smarcel	},
5566273562Smarcel	prevUntil: function( elem, i, until ) {
5567273562Smarcel		return jQuery.dir( elem, "previousSibling", until );
5568273562Smarcel	},
5569273562Smarcel	siblings: function( elem ) {
5570273562Smarcel		return jQuery.sibling( elem.parentNode.firstChild, elem );
5571273562Smarcel	},
5572273562Smarcel	children: function( elem ) {
5573273562Smarcel		return jQuery.sibling( elem.firstChild );
5574273562Smarcel	},
5575273562Smarcel	contents: function( elem ) {
5576273562Smarcel		return jQuery.nodeName( elem, "iframe" ) ?
5577273562Smarcel			elem.contentDocument || elem.contentWindow.document :
5578273562Smarcel			jQuery.makeArray( elem.childNodes );
5579273562Smarcel	}
5580273562Smarcel}, function( name, fn ) {
5581273562Smarcel	jQuery.fn[ name ] = function( until, selector ) {
5582273562Smarcel		var ret = jQuery.map( this, fn, until ),
5583273562Smarcel			// The variable 'args' was introduced in
5584273562Smarcel			// https://github.com/jquery/jquery/commit/52a0238
5585273562Smarcel			// to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
5586273562Smarcel			// http://code.google.com/p/v8/issues/detail?id=1050
5587273562Smarcel			args = slice.call(arguments);
5588273562Smarcel
5589273562Smarcel		if ( !runtil.test( name ) ) {
5590273562Smarcel			selector = until;
5591273562Smarcel		}
5592273562Smarcel
5593273562Smarcel		if ( selector && typeof selector === "string" ) {
5594273562Smarcel			ret = jQuery.filter( selector, ret );
5595273562Smarcel		}
5596273562Smarcel
5597273562Smarcel		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
5598273562Smarcel
5599273562Smarcel		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
5600273562Smarcel			ret = ret.reverse();
5601273562Smarcel		}
5602273562Smarcel
5603273562Smarcel		return this.pushStack( ret, name, args.join(",") );
5604273562Smarcel	};
5605273562Smarcel});
5606273562Smarcel
5607273562SmarceljQuery.extend({
5608273562Smarcel	filter: function( expr, elems, not ) {
5609273562Smarcel		if ( not ) {
5610273562Smarcel			expr = ":not(" + expr + ")";
5611273562Smarcel		}
5612273562Smarcel
5613273562Smarcel		return elems.length === 1 ?
5614273562Smarcel			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
5615273562Smarcel			jQuery.find.matches(expr, elems);
5616273562Smarcel	},
5617273562Smarcel
5618273562Smarcel	dir: function( elem, dir, until ) {
5619273562Smarcel		var matched = [],
5620273562Smarcel			cur = elem[ dir ];
5621273562Smarcel
5622273562Smarcel		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
5623273562Smarcel			if ( cur.nodeType === 1 ) {
5624273562Smarcel				matched.push( cur );
5625273562Smarcel			}
5626273562Smarcel			cur = cur[dir];
5627273562Smarcel		}
5628273562Smarcel		return matched;
5629273562Smarcel	},
5630273562Smarcel
5631273562Smarcel	nth: function( cur, result, dir, elem ) {
5632273562Smarcel		result = result || 1;
5633273562Smarcel		var num = 0;
5634273562Smarcel
5635273562Smarcel		for ( ; cur; cur = cur[dir] ) {
5636273562Smarcel			if ( cur.nodeType === 1 && ++num === result ) {
5637273562Smarcel				break;
5638273562Smarcel			}
5639273562Smarcel		}
5640273562Smarcel
5641273562Smarcel		return cur;
5642273562Smarcel	},
5643273562Smarcel
5644273562Smarcel	sibling: function( n, elem ) {
5645273562Smarcel		var r = [];
5646273562Smarcel
5647273562Smarcel		for ( ; n; n = n.nextSibling ) {
5648273562Smarcel			if ( n.nodeType === 1 && n !== elem ) {
5649273562Smarcel				r.push( n );
5650273562Smarcel			}
5651273562Smarcel		}
5652273562Smarcel
5653273562Smarcel		return r;
5654273562Smarcel	}
5655273562Smarcel});
5656273562Smarcel
5657273562Smarcel// Implement the identical functionality for filter and not
5658273562Smarcelfunction winnow( elements, qualifier, keep ) {
5659273562Smarcel
5660273562Smarcel	// Can't pass null or undefined to indexOf in Firefox 4
5661273562Smarcel	// Set to 0 to skip string check
5662273562Smarcel	qualifier = qualifier || 0;
5663273562Smarcel
5664273562Smarcel	if ( jQuery.isFunction( qualifier ) ) {
5665273562Smarcel		return jQuery.grep(elements, function( elem, i ) {
5666273562Smarcel			var retVal = !!qualifier.call( elem, i, elem );
5667273562Smarcel			return retVal === keep;
5668273562Smarcel		});
5669273562Smarcel
5670273562Smarcel	} else if ( qualifier.nodeType ) {
5671273562Smarcel		return jQuery.grep(elements, function( elem, i ) {
5672273562Smarcel			return ( elem === qualifier ) === keep;
5673273562Smarcel		});
5674273562Smarcel
5675273562Smarcel	} else if ( typeof qualifier === "string" ) {
5676273562Smarcel		var filtered = jQuery.grep(elements, function( elem ) {
5677273562Smarcel			return elem.nodeType === 1;
5678273562Smarcel		});
5679273562Smarcel
5680273562Smarcel		if ( isSimple.test( qualifier ) ) {
5681273562Smarcel			return jQuery.filter(qualifier, filtered, !keep);
5682273562Smarcel		} else {
5683273562Smarcel			qualifier = jQuery.filter( qualifier, filtered );
5684273562Smarcel		}
5685273562Smarcel	}
5686273562Smarcel
5687273562Smarcel	return jQuery.grep(elements, function( elem, i ) {
5688273562Smarcel		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
5689273562Smarcel	});
5690273562Smarcel}
5691273562Smarcel
5692273562Smarcel
5693273562Smarcel
5694273562Smarcel
5695273562Smarcelfunction createSafeFragment( document ) {
5696273562Smarcel	var list = nodeNames.split( " " ),
5697273562Smarcel	safeFrag = document.createDocumentFragment();
5698273562Smarcel
5699273562Smarcel	if ( safeFrag.createElement ) {
5700273562Smarcel		while ( list.length ) {
5701273562Smarcel			safeFrag.createElement(
5702273562Smarcel				list.pop()
5703273562Smarcel			);
5704273562Smarcel		}
5705273562Smarcel	}
5706273562Smarcel	return safeFrag;
5707273562Smarcel}
5708273562Smarcel
5709273562Smarcelvar nodeNames = "abbr article aside audio canvas datalist details figcaption figure footer " +
5710273562Smarcel		"header hgroup mark meter nav output progress section summary time video",
5711273562Smarcel	rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
5712273562Smarcel	rleadingWhitespace = /^\s+/,
5713273562Smarcel	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
5714273562Smarcel	rtagName = /<([\w:]+)/,
5715273562Smarcel	rtbody = /<tbody/i,
5716273562Smarcel	rhtml = /<|&#?\w+;/,
5717273562Smarcel	rnoInnerhtml = /<(?:script|style)/i,
5718273562Smarcel	rnocache = /<(?:script|object|embed|option|style)/i,
5719273562Smarcel	rnoshimcache = new RegExp("<(?:" + nodeNames.replace(" ", "|") + ")", "i"),
5720273562Smarcel	// checked="checked" or checked
5721273562Smarcel	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5722273562Smarcel	rscriptType = /\/(java|ecma)script/i,
5723273562Smarcel	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
5724273562Smarcel	wrapMap = {
5725273562Smarcel		option: [ 1, "<select multiple='multiple'>", "</select>" ],
5726273562Smarcel		legend: [ 1, "<fieldset>", "</fieldset>" ],
5727273562Smarcel		thead: [ 1, "<table>", "</table>" ],
5728273562Smarcel		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
5729273562Smarcel		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
5730273562Smarcel		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
5731273562Smarcel		area: [ 1, "<map>", "</map>" ],
5732273562Smarcel		_default: [ 0, "", "" ]
5733273562Smarcel	},
5734273562Smarcel	safeFragment = createSafeFragment( document );
5735273562Smarcel
5736273562SmarcelwrapMap.optgroup = wrapMap.option;
5737273562SmarcelwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
5738273562SmarcelwrapMap.th = wrapMap.td;
5739273562Smarcel
5740273562Smarcel// IE can't serialize <link> and <script> tags normally
5741273562Smarcelif ( !jQuery.support.htmlSerialize ) {
5742273562Smarcel	wrapMap._default = [ 1, "div<div>", "</div>" ];
5743273562Smarcel}
5744273562Smarcel
5745273562SmarceljQuery.fn.extend({
5746273562Smarcel	text: function( text ) {
5747273562Smarcel		if ( jQuery.isFunction(text) ) {
5748273562Smarcel			return this.each(function(i) {
5749273562Smarcel				var self = jQuery( this );
5750273562Smarcel
5751273562Smarcel				self.text( text.call(this, i, self.text()) );
5752273562Smarcel			});
5753273562Smarcel		}
5754273562Smarcel
5755273562Smarcel		if ( typeof text !== "object" && text !== undefined ) {
5756273562Smarcel			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
5757273562Smarcel		}
5758273562Smarcel
5759273562Smarcel		return jQuery.text( this );
5760273562Smarcel	},
5761273562Smarcel
5762273562Smarcel	wrapAll: function( html ) {
5763273562Smarcel		if ( jQuery.isFunction( html ) ) {
5764273562Smarcel			return this.each(function(i) {
5765273562Smarcel				jQuery(this).wrapAll( html.call(this, i) );
5766273562Smarcel			});
5767273562Smarcel		}
5768273562Smarcel
5769273562Smarcel		if ( this[0] ) {
5770273562Smarcel			// The elements to wrap the target around
5771273562Smarcel			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
5772273562Smarcel
5773273562Smarcel			if ( this[0].parentNode ) {
5774273562Smarcel				wrap.insertBefore( this[0] );
5775273562Smarcel			}
5776273562Smarcel
5777273562Smarcel			wrap.map(function() {
5778273562Smarcel				var elem = this;
5779273562Smarcel
5780273562Smarcel				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
5781273562Smarcel					elem = elem.firstChild;
5782273562Smarcel				}
5783273562Smarcel
5784273562Smarcel				return elem;
5785273562Smarcel			}).append( this );
5786273562Smarcel		}
5787273562Smarcel
5788273562Smarcel		return this;
5789273562Smarcel	},
5790273562Smarcel
5791273562Smarcel	wrapInner: function( html ) {
5792273562Smarcel		if ( jQuery.isFunction( html ) ) {
5793273562Smarcel			return this.each(function(i) {
5794273562Smarcel				jQuery(this).wrapInner( html.call(this, i) );
5795273562Smarcel			});
5796273562Smarcel		}
5797273562Smarcel
5798273562Smarcel		return this.each(function() {
5799273562Smarcel			var self = jQuery( this ),
5800273562Smarcel				contents = self.contents();
5801273562Smarcel
5802273562Smarcel			if ( contents.length ) {
5803273562Smarcel				contents.wrapAll( html );
5804273562Smarcel
5805273562Smarcel			} else {
5806273562Smarcel				self.append( html );
5807273562Smarcel			}
5808273562Smarcel		});
5809273562Smarcel	},
5810273562Smarcel
5811273562Smarcel	wrap: function( html ) {
5812273562Smarcel		return this.each(function() {
5813273562Smarcel			jQuery( this ).wrapAll( html );
5814273562Smarcel		});
5815273562Smarcel	},
5816273562Smarcel
5817273562Smarcel	unwrap: function() {
5818273562Smarcel		return this.parent().each(function() {
5819273562Smarcel			if ( !jQuery.nodeName( this, "body" ) ) {
5820273562Smarcel				jQuery( this ).replaceWith( this.childNodes );
5821273562Smarcel			}
5822273562Smarcel		}).end();
5823273562Smarcel	},
5824273562Smarcel
5825273562Smarcel	append: function() {
5826273562Smarcel		return this.domManip(arguments, true, function( elem ) {
5827273562Smarcel			if ( this.nodeType === 1 ) {
5828273562Smarcel				this.appendChild( elem );
5829273562Smarcel			}
5830273562Smarcel		});
5831273562Smarcel	},
5832273562Smarcel
5833273562Smarcel	prepend: function() {
5834273562Smarcel		return this.domManip(arguments, true, function( elem ) {
5835273562Smarcel			if ( this.nodeType === 1 ) {
5836273562Smarcel				this.insertBefore( elem, this.firstChild );
5837273562Smarcel			}
5838273562Smarcel		});
5839273562Smarcel	},
5840273562Smarcel
5841273562Smarcel	before: function() {
5842273562Smarcel		if ( this[0] && this[0].parentNode ) {
5843273562Smarcel			return this.domManip(arguments, false, function( elem ) {
5844273562Smarcel				this.parentNode.insertBefore( elem, this );
5845273562Smarcel			});
5846273562Smarcel		} else if ( arguments.length ) {
5847273562Smarcel			var set = jQuery(arguments[0]);
5848273562Smarcel			set.push.apply( set, this.toArray() );
5849273562Smarcel			return this.pushStack( set, "before", arguments );
5850273562Smarcel		}
5851273562Smarcel	},
5852273562Smarcel
5853273562Smarcel	after: function() {
5854273562Smarcel		if ( this[0] && this[0].parentNode ) {
5855273562Smarcel			return this.domManip(arguments, false, function( elem ) {
5856273562Smarcel				this.parentNode.insertBefore( elem, this.nextSibling );
5857273562Smarcel			});
5858273562Smarcel		} else if ( arguments.length ) {
5859273562Smarcel			var set = this.pushStack( this, "after", arguments );
5860273562Smarcel			set.push.apply( set, jQuery(arguments[0]).toArray() );
5861273562Smarcel			return set;
5862273562Smarcel		}
5863273562Smarcel	},
5864273562Smarcel
5865273562Smarcel	// keepData is for internal use only--do not document
5866273562Smarcel	remove: function( selector, keepData ) {
5867273562Smarcel		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
5868273562Smarcel			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
5869273562Smarcel				if ( !keepData && elem.nodeType === 1 ) {
5870273562Smarcel					jQuery.cleanData( elem.getElementsByTagName("*") );
5871273562Smarcel					jQuery.cleanData( [ elem ] );
5872273562Smarcel				}
5873273562Smarcel
5874273562Smarcel				if ( elem.parentNode ) {
5875273562Smarcel					elem.parentNode.removeChild( elem );
5876273562Smarcel				}
5877273562Smarcel			}
5878273562Smarcel		}
5879273562Smarcel
5880273562Smarcel		return this;
5881273562Smarcel	},
5882273562Smarcel
5883273562Smarcel	empty: function() {
5884273562Smarcel		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
5885273562Smarcel			// Remove element nodes and prevent memory leaks
5886273562Smarcel			if ( elem.nodeType === 1 ) {
5887273562Smarcel				jQuery.cleanData( elem.getElementsByTagName("*") );
5888273562Smarcel			}
5889273562Smarcel
5890273562Smarcel			// Remove any remaining nodes
5891273562Smarcel			while ( elem.firstChild ) {
5892273562Smarcel				elem.removeChild( elem.firstChild );
5893273562Smarcel			}
5894273562Smarcel		}
5895273562Smarcel
5896273562Smarcel		return this;
5897273562Smarcel	},
5898273562Smarcel
5899273562Smarcel	clone: function( dataAndEvents, deepDataAndEvents ) {
5900273562Smarcel		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
5901273562Smarcel		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
5902273562Smarcel
5903273562Smarcel		return this.map( function () {
5904273562Smarcel			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
5905273562Smarcel		});
5906273562Smarcel	},
5907273562Smarcel
5908273562Smarcel	html: function( value ) {
5909273562Smarcel		if ( value === undefined ) {
5910273562Smarcel			return this[0] && this[0].nodeType === 1 ?
5911273562Smarcel				this[0].innerHTML.replace(rinlinejQuery, "") :
5912273562Smarcel				null;
5913273562Smarcel
5914273562Smarcel		// See if we can take a shortcut and just use innerHTML
5915273562Smarcel		} else if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
5916273562Smarcel			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
5917273562Smarcel			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
5918273562Smarcel
5919273562Smarcel			value = value.replace(rxhtmlTag, "<$1></$2>");
5920273562Smarcel
5921273562Smarcel			try {
5922273562Smarcel				for ( var i = 0, l = this.length; i < l; i++ ) {
5923273562Smarcel					// Remove element nodes and prevent memory leaks
5924273562Smarcel					if ( this[i].nodeType === 1 ) {
5925273562Smarcel						jQuery.cleanData( this[i].getElementsByTagName("*") );
5926273562Smarcel						this[i].innerHTML = value;
5927273562Smarcel					}
5928273562Smarcel				}
5929273562Smarcel
5930273562Smarcel			// If using innerHTML throws an exception, use the fallback method
5931273562Smarcel			} catch(e) {
5932273562Smarcel				this.empty().append( value );
5933273562Smarcel			}
5934273562Smarcel
5935273562Smarcel		} else if ( jQuery.isFunction( value ) ) {
5936273562Smarcel			this.each(function(i){
5937273562Smarcel				var self = jQuery( this );
5938273562Smarcel
5939273562Smarcel				self.html( value.call(this, i, self.html()) );
5940273562Smarcel			});
5941273562Smarcel
5942273562Smarcel		} else {
5943273562Smarcel			this.empty().append( value );
5944273562Smarcel		}
5945273562Smarcel
5946273562Smarcel		return this;
5947273562Smarcel	},
5948273562Smarcel
5949273562Smarcel	replaceWith: function( value ) {
5950273562Smarcel		if ( this[0] && this[0].parentNode ) {
5951273562Smarcel			// Make sure that the elements are removed from the DOM before they are inserted
5952273562Smarcel			// this can help fix replacing a parent with child elements
5953273562Smarcel			if ( jQuery.isFunction( value ) ) {
5954273562Smarcel				return this.each(function(i) {
5955273562Smarcel					var self = jQuery(this), old = self.html();
5956273562Smarcel					self.replaceWith( value.call( this, i, old ) );
5957273562Smarcel				});
5958273562Smarcel			}
5959273562Smarcel
5960273562Smarcel			if ( typeof value !== "string" ) {
5961273562Smarcel				value = jQuery( value ).detach();
5962273562Smarcel			}
5963273562Smarcel
5964273562Smarcel			return this.each(function() {
5965273562Smarcel				var next = this.nextSibling,
5966273562Smarcel					parent = this.parentNode;
5967273562Smarcel
5968273562Smarcel				jQuery( this ).remove();
5969273562Smarcel
5970273562Smarcel				if ( next ) {
5971273562Smarcel					jQuery(next).before( value );
5972273562Smarcel				} else {
5973273562Smarcel					jQuery(parent).append( value );
5974273562Smarcel				}
5975273562Smarcel			});
5976273562Smarcel		} else {
5977273562Smarcel			return this.length ?
5978273562Smarcel				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
5979273562Smarcel				this;
5980273562Smarcel		}
5981273562Smarcel	},
5982273562Smarcel
5983273562Smarcel	detach: function( selector ) {
5984273562Smarcel		return this.remove( selector, true );
5985273562Smarcel	},
5986273562Smarcel
5987273562Smarcel	domManip: function( args, table, callback ) {
5988273562Smarcel		var results, first, fragment, parent,
5989273562Smarcel			value = args[0],
5990273562Smarcel			scripts = [];
5991273562Smarcel
5992273562Smarcel		// We can't cloneNode fragments that contain checked, in WebKit
5993273562Smarcel		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
5994273562Smarcel			return this.each(function() {
5995273562Smarcel				jQuery(this).domManip( args, table, callback, true );
5996273562Smarcel			});
5997273562Smarcel		}
5998273562Smarcel
5999273562Smarcel		if ( jQuery.isFunction(value) ) {
6000273562Smarcel			return this.each(function(i) {
6001273562Smarcel				var self = jQuery(this);
6002273562Smarcel				args[0] = value.call(this, i, table ? self.html() : undefined);
6003273562Smarcel				self.domManip( args, table, callback );
6004273562Smarcel			});
6005273562Smarcel		}
6006273562Smarcel
6007273562Smarcel		if ( this[0] ) {
6008273562Smarcel			parent = value && value.parentNode;
6009273562Smarcel
6010273562Smarcel			// If we're in a fragment, just use that instead of building a new one
6011273562Smarcel			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
6012273562Smarcel				results = { fragment: parent };
6013273562Smarcel
6014273562Smarcel			} else {
6015273562Smarcel				results = jQuery.buildFragment( args, this, scripts );
6016273562Smarcel			}
6017273562Smarcel
6018273562Smarcel			fragment = results.fragment;
6019273562Smarcel
6020273562Smarcel			if ( fragment.childNodes.length === 1 ) {
6021273562Smarcel				first = fragment = fragment.firstChild;
6022273562Smarcel			} else {
6023273562Smarcel				first = fragment.firstChild;
6024273562Smarcel			}
6025273562Smarcel
6026273562Smarcel			if ( first ) {
6027273562Smarcel				table = table && jQuery.nodeName( first, "tr" );
6028273562Smarcel
6029273562Smarcel				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
6030273562Smarcel					callback.call(
6031273562Smarcel						table ?
6032273562Smarcel							root(this[i], first) :
6033273562Smarcel							this[i],
6034273562Smarcel						// Make sure that we do not leak memory by inadvertently discarding
6035273562Smarcel						// the original fragment (which might have attached data) instead of
6036273562Smarcel						// using it; in addition, use the original fragment object for the last
6037273562Smarcel						// item instead of first because it can end up being emptied incorrectly
6038273562Smarcel						// in certain situations (Bug #8070).
6039273562Smarcel						// Fragments from the fragment cache must always be cloned and never used
6040273562Smarcel						// in place.
6041273562Smarcel						results.cacheable || ( l > 1 && i < lastIndex ) ?
6042273562Smarcel							jQuery.clone( fragment, true, true ) :
6043273562Smarcel							fragment
6044273562Smarcel					);
6045273562Smarcel				}
6046273562Smarcel			}
6047273562Smarcel
6048273562Smarcel			if ( scripts.length ) {
6049273562Smarcel				jQuery.each( scripts, evalScript );
6050273562Smarcel			}
6051273562Smarcel		}
6052273562Smarcel
6053273562Smarcel		return this;
6054273562Smarcel	}
6055273562Smarcel});
6056273562Smarcel
6057273562Smarcelfunction root( elem, cur ) {
6058273562Smarcel	return jQuery.nodeName(elem, "table") ?
6059273562Smarcel		(elem.getElementsByTagName("tbody")[0] ||
6060273562Smarcel		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
6061273562Smarcel		elem;
6062273562Smarcel}
6063273562Smarcel
6064273562Smarcelfunction cloneCopyEvent( src, dest ) {
6065273562Smarcel
6066273562Smarcel	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
6067273562Smarcel		return;
6068273562Smarcel	}
6069273562Smarcel
6070273562Smarcel	var type, i, l,
6071273562Smarcel		oldData = jQuery._data( src ),
6072273562Smarcel		curData = jQuery._data( dest, oldData ),
6073273562Smarcel		events = oldData.events;
6074273562Smarcel
6075273562Smarcel	if ( events ) {
6076273562Smarcel		delete curData.handle;
6077273562Smarcel		curData.events = {};
6078273562Smarcel
6079273562Smarcel		for ( type in events ) {
6080273562Smarcel			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
6081273562Smarcel				jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
6082273562Smarcel			}
6083273562Smarcel		}
6084273562Smarcel	}
6085273562Smarcel
6086273562Smarcel	// make the cloned public data object a copy from the original
6087273562Smarcel	if ( curData.data ) {
6088273562Smarcel		curData.data = jQuery.extend( {}, curData.data );
6089273562Smarcel	}
6090273562Smarcel}
6091273562Smarcel
6092273562Smarcelfunction cloneFixAttributes( src, dest ) {
6093273562Smarcel	var nodeName;
6094273562Smarcel
6095273562Smarcel	// We do not need to do anything for non-Elements
6096273562Smarcel	if ( dest.nodeType !== 1 ) {
6097273562Smarcel		return;
6098273562Smarcel	}
6099273562Smarcel
6100273562Smarcel	// clearAttributes removes the attributes, which we don't want,
6101273562Smarcel	// but also removes the attachEvent events, which we *do* want
6102273562Smarcel	if ( dest.clearAttributes ) {
6103273562Smarcel		dest.clearAttributes();
6104273562Smarcel	}
6105273562Smarcel
6106273562Smarcel	// mergeAttributes, in contrast, only merges back on the
6107273562Smarcel	// original attributes, not the events
6108273562Smarcel	if ( dest.mergeAttributes ) {
6109273562Smarcel		dest.mergeAttributes( src );
6110273562Smarcel	}
6111273562Smarcel
6112273562Smarcel	nodeName = dest.nodeName.toLowerCase();
6113273562Smarcel
6114273562Smarcel	// IE6-8 fail to clone children inside object elements that use
6115273562Smarcel	// the proprietary classid attribute value (rather than the type
6116273562Smarcel	// attribute) to identify the type of content to display
6117273562Smarcel	if ( nodeName === "object" ) {
6118273562Smarcel		dest.outerHTML = src.outerHTML;
6119273562Smarcel
6120273562Smarcel	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
6121273562Smarcel		// IE6-8 fails to persist the checked state of a cloned checkbox
6122273562Smarcel		// or radio button. Worse, IE6-7 fail to give the cloned element
6123273562Smarcel		// a checked appearance if the defaultChecked value isn't also set
6124273562Smarcel		if ( src.checked ) {
6125273562Smarcel			dest.defaultChecked = dest.checked = src.checked;
6126273562Smarcel		}
6127273562Smarcel
6128273562Smarcel		// IE6-7 get confused and end up setting the value of a cloned
6129273562Smarcel		// checkbox/radio button to an empty string instead of "on"
6130273562Smarcel		if ( dest.value !== src.value ) {
6131273562Smarcel			dest.value = src.value;
6132273562Smarcel		}
6133273562Smarcel
6134273562Smarcel	// IE6-8 fails to return the selected option to the default selected
6135273562Smarcel	// state when cloning options
6136273562Smarcel	} else if ( nodeName === "option" ) {
6137273562Smarcel		dest.selected = src.defaultSelected;
6138273562Smarcel
6139273562Smarcel	// IE6-8 fails to set the defaultValue to the correct value when
6140273562Smarcel	// cloning other types of input fields
6141273562Smarcel	} else if ( nodeName === "input" || nodeName === "textarea" ) {
6142273562Smarcel		dest.defaultValue = src.defaultValue;
6143273562Smarcel	}
6144273562Smarcel
6145273562Smarcel	// Event data gets referenced instead of copied if the expando
6146273562Smarcel	// gets copied too
6147273562Smarcel	dest.removeAttribute( jQuery.expando );
6148273562Smarcel}
6149273562Smarcel
6150273562SmarceljQuery.buildFragment = function( args, nodes, scripts ) {
6151273562Smarcel	var fragment, cacheable, cacheresults, doc,
6152273562Smarcel	first = args[ 0 ];
6153273562Smarcel
6154273562Smarcel	// nodes may contain either an explicit document object,
6155273562Smarcel	// a jQuery collection or context object.
6156273562Smarcel	// If nodes[0] contains a valid object to assign to doc
6157273562Smarcel	if ( nodes && nodes[0] ) {
6158273562Smarcel		doc = nodes[0].ownerDocument || nodes[0];
6159273562Smarcel	}
6160273562Smarcel
6161273562Smarcel  // Ensure that an attr object doesn't incorrectly stand in as a document object
6162273562Smarcel	// Chrome and Firefox seem to allow this to occur and will throw exception
6163273562Smarcel	// Fixes #8950
6164273562Smarcel	if ( !doc.createDocumentFragment ) {
6165273562Smarcel		doc = document;
6166273562Smarcel	}
6167273562Smarcel
6168273562Smarcel	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
6169273562Smarcel	// Cloning options loses the selected state, so don't cache them
6170273562Smarcel	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
6171273562Smarcel	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
6172273562Smarcel	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
6173273562Smarcel	if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
6174273562Smarcel		first.charAt(0) === "<" && !rnocache.test( first ) &&
6175273562Smarcel		(jQuery.support.checkClone || !rchecked.test( first )) &&
6176273562Smarcel		(!jQuery.support.unknownElems && rnoshimcache.test( first )) ) {
6177273562Smarcel
6178273562Smarcel		cacheable = true;
6179273562Smarcel
6180273562Smarcel		cacheresults = jQuery.fragments[ first ];
6181273562Smarcel		if ( cacheresults && cacheresults !== 1 ) {
6182273562Smarcel			fragment = cacheresults;
6183273562Smarcel		}
6184273562Smarcel	}
6185273562Smarcel
6186273562Smarcel	if ( !fragment ) {
6187273562Smarcel		fragment = doc.createDocumentFragment();
6188273562Smarcel		jQuery.clean( args, doc, fragment, scripts );
6189273562Smarcel	}
6190273562Smarcel
6191273562Smarcel	if ( cacheable ) {
6192273562Smarcel		jQuery.fragments[ first ] = cacheresults ? fragment : 1;
6193273562Smarcel	}
6194273562Smarcel
6195273562Smarcel	return { fragment: fragment, cacheable: cacheable };
6196273562Smarcel};
6197273562Smarcel
6198273562SmarceljQuery.fragments = {};
6199273562Smarcel
6200273562SmarceljQuery.each({
6201273562Smarcel	appendTo: "append",
6202273562Smarcel	prependTo: "prepend",
6203273562Smarcel	insertBefore: "before",
6204273562Smarcel	insertAfter: "after",
6205273562Smarcel	replaceAll: "replaceWith"
6206273562Smarcel}, function( name, original ) {
6207273562Smarcel	jQuery.fn[ name ] = function( selector ) {
6208273562Smarcel		var ret = [],
6209273562Smarcel			insert = jQuery( selector ),
6210273562Smarcel			parent = this.length === 1 && this[0].parentNode;
6211273562Smarcel
6212273562Smarcel		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
6213273562Smarcel			insert[ original ]( this[0] );
6214273562Smarcel			return this;
6215273562Smarcel
6216273562Smarcel		} else {
6217273562Smarcel			for ( var i = 0, l = insert.length; i < l; i++ ) {
6218273562Smarcel				var elems = ( i > 0 ? this.clone(true) : this ).get();
6219273562Smarcel				jQuery( insert[i] )[ original ]( elems );
6220273562Smarcel				ret = ret.concat( elems );
6221273562Smarcel			}
6222273562Smarcel
6223273562Smarcel			return this.pushStack( ret, name, insert.selector );
6224273562Smarcel		}
6225273562Smarcel	};
6226273562Smarcel});
6227273562Smarcel
6228273562Smarcelfunction getAll( elem ) {
6229273562Smarcel	if ( typeof elem.getElementsByTagName !== "undefined" ) {
6230273562Smarcel		return elem.getElementsByTagName( "*" );
6231273562Smarcel
6232273562Smarcel	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
6233273562Smarcel		return elem.querySelectorAll( "*" );
6234273562Smarcel
6235273562Smarcel	} else {
6236273562Smarcel		return [];
6237273562Smarcel	}
6238273562Smarcel}
6239273562Smarcel
6240273562Smarcel// Used in clean, fixes the defaultChecked property
6241273562Smarcelfunction fixDefaultChecked( elem ) {
6242273562Smarcel	if ( elem.type === "checkbox" || elem.type === "radio" ) {
6243273562Smarcel		elem.defaultChecked = elem.checked;
6244273562Smarcel	}
6245273562Smarcel}
6246273562Smarcel// Finds all inputs and passes them to fixDefaultChecked
6247273562Smarcelfunction findInputs( elem ) {
6248273562Smarcel	var nodeName = ( elem.nodeName || "" ).toLowerCase();
6249273562Smarcel	if ( nodeName === "input" ) {
6250273562Smarcel		fixDefaultChecked( elem );
6251273562Smarcel	// Skip scripts, get other children
6252273562Smarcel	} else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
6253273562Smarcel		jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
6254273562Smarcel	}
6255273562Smarcel}
6256273562Smarcel
6257273562SmarceljQuery.extend({
6258273562Smarcel	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
6259273562Smarcel		var clone = elem.cloneNode(true),
6260273562Smarcel				srcElements,
6261273562Smarcel				destElements,
6262273562Smarcel				i;
6263273562Smarcel
6264273562Smarcel		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
6265273562Smarcel				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
6266273562Smarcel			// IE copies events bound via attachEvent when using cloneNode.
6267273562Smarcel			// Calling detachEvent on the clone will also remove the events
6268273562Smarcel			// from the original. In order to get around this, we use some
6269273562Smarcel			// proprietary methods to clear the events. Thanks to MooTools
6270273562Smarcel			// guys for this hotness.
6271273562Smarcel
6272273562Smarcel			cloneFixAttributes( elem, clone );
6273273562Smarcel
6274273562Smarcel			// Using Sizzle here is crazy slow, so we use getElementsByTagName
6275273562Smarcel			// instead
6276273562Smarcel			srcElements = getAll( elem );
6277273562Smarcel			destElements = getAll( clone );
6278273562Smarcel
6279273562Smarcel			// Weird iteration because IE will replace the length property
6280273562Smarcel			// with an element if you are cloning the body and one of the
6281273562Smarcel			// elements on the page has a name or id of "length"
6282273562Smarcel			for ( i = 0; srcElements[i]; ++i ) {
6283273562Smarcel				// Ensure that the destination node is not null; Fixes #9587
6284273562Smarcel				if ( destElements[i] ) {
6285273562Smarcel					cloneFixAttributes( srcElements[i], destElements[i] );
6286273562Smarcel				}
6287273562Smarcel			}
6288273562Smarcel		}
6289273562Smarcel
6290273562Smarcel		// Copy the events from the original to the clone
6291273562Smarcel		if ( dataAndEvents ) {
6292273562Smarcel			cloneCopyEvent( elem, clone );
6293273562Smarcel
6294273562Smarcel			if ( deepDataAndEvents ) {
6295273562Smarcel				srcElements = getAll( elem );
6296273562Smarcel				destElements = getAll( clone );
6297273562Smarcel
6298273562Smarcel				for ( i = 0; srcElements[i]; ++i ) {
6299273562Smarcel					cloneCopyEvent( srcElements[i], destElements[i] );
6300273562Smarcel				}
6301273562Smarcel			}
6302273562Smarcel		}
6303273562Smarcel
6304273562Smarcel		srcElements = destElements = null;
6305273562Smarcel
6306273562Smarcel		// Return the cloned set
6307273562Smarcel		return clone;
6308273562Smarcel	},
6309273562Smarcel
6310273562Smarcel	clean: function( elems, context, fragment, scripts ) {
6311273562Smarcel		var checkScriptType;
6312273562Smarcel
6313273562Smarcel		context = context || document;
6314273562Smarcel
6315273562Smarcel		// !context.createElement fails in IE with an error but returns typeof 'object'
6316273562Smarcel		if ( typeof context.createElement === "undefined" ) {
6317273562Smarcel			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
6318273562Smarcel		}
6319273562Smarcel
6320273562Smarcel		var ret = [], j;
6321273562Smarcel
6322273562Smarcel		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
6323273562Smarcel			if ( typeof elem === "number" ) {
6324273562Smarcel				elem += "";
6325273562Smarcel			}
6326273562Smarcel
6327273562Smarcel			if ( !elem ) {
6328273562Smarcel				continue;
6329273562Smarcel			}
6330273562Smarcel
6331273562Smarcel			// Convert html string into DOM nodes
6332273562Smarcel			if ( typeof elem === "string" ) {
6333273562Smarcel				if ( !rhtml.test( elem ) ) {
6334273562Smarcel					elem = context.createTextNode( elem );
6335273562Smarcel				} else {
6336273562Smarcel					// Fix "XHTML"-style tags in all browsers
6337273562Smarcel					elem = elem.replace(rxhtmlTag, "<$1></$2>");
6338273562Smarcel
6339273562Smarcel					// Trim whitespace, otherwise indexOf won't work as expected
6340273562Smarcel					var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
6341273562Smarcel						wrap = wrapMap[ tag ] || wrapMap._default,
6342273562Smarcel						depth = wrap[0],
6343273562Smarcel						div = context.createElement("div");
6344273562Smarcel
6345273562Smarcel					// Append wrapper element to unknown element safe doc fragment
6346273562Smarcel					if ( context === document ) {
6347273562Smarcel						// Use the fragment we've already created for this document
6348273562Smarcel						safeFragment.appendChild( div );
6349273562Smarcel					} else {
6350273562Smarcel						// Use a fragment created with the owner document
6351273562Smarcel						createSafeFragment( context ).appendChild( div );
6352273562Smarcel					}
6353273562Smarcel
6354273562Smarcel					// Go to html and back, then peel off extra wrappers
6355273562Smarcel					div.innerHTML = wrap[1] + elem + wrap[2];
6356273562Smarcel
6357273562Smarcel					// Move to the right depth
6358273562Smarcel					while ( depth-- ) {
6359273562Smarcel						div = div.lastChild;
6360273562Smarcel					}
6361273562Smarcel
6362273562Smarcel					// Remove IE's autoinserted <tbody> from table fragments
6363273562Smarcel					if ( !jQuery.support.tbody ) {
6364273562Smarcel
6365273562Smarcel						// String was a <table>, *may* have spurious <tbody>
6366273562Smarcel						var hasBody = rtbody.test(elem),
6367273562Smarcel							tbody = tag === "table" && !hasBody ?
6368273562Smarcel								div.firstChild && div.firstChild.childNodes :
6369273562Smarcel
6370273562Smarcel								// String was a bare <thead> or <tfoot>
6371273562Smarcel								wrap[1] === "<table>" && !hasBody ?
6372273562Smarcel									div.childNodes :
6373273562Smarcel									[];
6374273562Smarcel
6375273562Smarcel						for ( j = tbody.length - 1; j >= 0 ; --j ) {
6376273562Smarcel							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
6377273562Smarcel								tbody[ j ].parentNode.removeChild( tbody[ j ] );
6378273562Smarcel							}
6379273562Smarcel						}
6380273562Smarcel					}
6381273562Smarcel
6382273562Smarcel					// IE completely kills leading whitespace when innerHTML is used
6383273562Smarcel					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
6384273562Smarcel						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
6385273562Smarcel					}
6386273562Smarcel
6387273562Smarcel					elem = div.childNodes;
6388273562Smarcel				}
6389273562Smarcel			}
6390273562Smarcel
6391273562Smarcel			// Resets defaultChecked for any radios and checkboxes
6392273562Smarcel			// about to be appended to the DOM in IE 6/7 (#8060)
6393273562Smarcel			var len;
6394273562Smarcel			if ( !jQuery.support.appendChecked ) {
6395273562Smarcel				if ( elem[0] && typeof (len = elem.length) === "number" ) {
6396273562Smarcel					for ( j = 0; j < len; j++ ) {
6397273562Smarcel						findInputs( elem[j] );
6398273562Smarcel					}
6399273562Smarcel				} else {
6400273562Smarcel					findInputs( elem );
6401273562Smarcel				}
6402273562Smarcel			}
6403273562Smarcel
6404273562Smarcel			if ( elem.nodeType ) {
6405273562Smarcel				ret.push( elem );
6406273562Smarcel			} else {
6407273562Smarcel				ret = jQuery.merge( ret, elem );
6408273562Smarcel			}
6409273562Smarcel		}
6410273562Smarcel
6411273562Smarcel		if ( fragment ) {
6412273562Smarcel			checkScriptType = function( elem ) {
6413273562Smarcel				return !elem.type || rscriptType.test( elem.type );
6414273562Smarcel			};
6415273562Smarcel			for ( i = 0; ret[i]; i++ ) {
6416273562Smarcel				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
6417273562Smarcel					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
6418273562Smarcel
6419273562Smarcel				} else {
6420273562Smarcel					if ( ret[i].nodeType === 1 ) {
6421273562Smarcel						var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
6422273562Smarcel
6423273562Smarcel						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
6424273562Smarcel					}
6425273562Smarcel					fragment.appendChild( ret[i] );
6426273562Smarcel				}
6427273562Smarcel			}
6428273562Smarcel		}
6429273562Smarcel
6430273562Smarcel		return ret;
6431273562Smarcel	},
6432273562Smarcel
6433273562Smarcel	cleanData: function( elems ) {
6434273562Smarcel		var data, id,
6435273562Smarcel			cache = jQuery.cache,
6436273562Smarcel			special = jQuery.event.special,
6437273562Smarcel			deleteExpando = jQuery.support.deleteExpando;
6438273562Smarcel
6439273562Smarcel		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
6440273562Smarcel			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
6441273562Smarcel				continue;
6442273562Smarcel			}
6443273562Smarcel
6444273562Smarcel			id = elem[ jQuery.expando ];
6445273562Smarcel
6446273562Smarcel			if ( id ) {
6447273562Smarcel				data = cache[ id ];
6448273562Smarcel
6449273562Smarcel				if ( data && data.events ) {
6450273562Smarcel					for ( var type in data.events ) {
6451273562Smarcel						if ( special[ type ] ) {
6452273562Smarcel							jQuery.event.remove( elem, type );
6453273562Smarcel
6454273562Smarcel						// This is a shortcut to avoid jQuery.event.remove's overhead
6455273562Smarcel						} else {
6456273562Smarcel							jQuery.removeEvent( elem, type, data.handle );
6457273562Smarcel						}
6458273562Smarcel					}
6459273562Smarcel
6460273562Smarcel					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
6461273562Smarcel					if ( data.handle ) {
6462273562Smarcel						data.handle.elem = null;
6463273562Smarcel					}
6464273562Smarcel				}
6465273562Smarcel
6466273562Smarcel				if ( deleteExpando ) {
6467273562Smarcel					delete elem[ jQuery.expando ];
6468273562Smarcel
6469273562Smarcel				} else if ( elem.removeAttribute ) {
6470273562Smarcel					elem.removeAttribute( jQuery.expando );
6471273562Smarcel				}
6472273562Smarcel
6473273562Smarcel				delete cache[ id ];
6474273562Smarcel			}
6475273562Smarcel		}
6476273562Smarcel	}
6477273562Smarcel});
6478273562Smarcel
6479273562Smarcelfunction evalScript( i, elem ) {
6480273562Smarcel	if ( elem.src ) {
6481273562Smarcel		jQuery.ajax({
6482273562Smarcel			url: elem.src,
6483273562Smarcel			async: false,
6484273562Smarcel			dataType: "script"
6485273562Smarcel		});
6486273562Smarcel	} else {
6487273562Smarcel		jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
6488273562Smarcel	}
6489273562Smarcel
6490273562Smarcel	if ( elem.parentNode ) {
6491273562Smarcel		elem.parentNode.removeChild( elem );
6492273562Smarcel	}
6493273562Smarcel}
6494273562Smarcel
6495273562Smarcel
6496273562Smarcel
6497273562Smarcel
6498273562Smarcelvar ralpha = /alpha\([^)]*\)/i,
6499273562Smarcel	ropacity = /opacity=([^)]*)/,
6500273562Smarcel	// fixed for IE9, see #8346
6501273562Smarcel	rupper = /([A-Z]|^ms)/g,
6502273562Smarcel	rnumpx = /^-?\d+(?:px)?$/i,
6503273562Smarcel	rnum = /^-?\d/,
6504273562Smarcel	rrelNum = /^([\-+])=([\-+.\de]+)/,
6505273562Smarcel
6506273562Smarcel	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6507273562Smarcel	cssWidth = [ "Left", "Right" ],
6508273562Smarcel	cssHeight = [ "Top", "Bottom" ],
6509273562Smarcel	curCSS,
6510273562Smarcel
6511273562Smarcel	getComputedStyle,
6512273562Smarcel	currentStyle;
6513273562Smarcel
6514273562SmarceljQuery.fn.css = function( name, value ) {
6515273562Smarcel	// Setting 'undefined' is a no-op
6516273562Smarcel	if ( arguments.length === 2 && value === undefined ) {
6517273562Smarcel		return this;
6518273562Smarcel	}
6519273562Smarcel
6520273562Smarcel	return jQuery.access( this, name, value, true, function( elem, name, value ) {
6521273562Smarcel		return value !== undefined ?
6522273562Smarcel			jQuery.style( elem, name, value ) :
6523273562Smarcel			jQuery.css( elem, name );
6524273562Smarcel	});
6525273562Smarcel};
6526273562Smarcel
6527273562SmarceljQuery.extend({
6528273562Smarcel	// Add in style property hooks for overriding the default
6529273562Smarcel	// behavior of getting and setting a style property
6530273562Smarcel	cssHooks: {
6531273562Smarcel		opacity: {
6532273562Smarcel			get: function( elem, computed ) {
6533273562Smarcel				if ( computed ) {
6534273562Smarcel					// We should always get a number back from opacity
6535273562Smarcel					var ret = curCSS( elem, "opacity", "opacity" );
6536273562Smarcel					return ret === "" ? "1" : ret;
6537273562Smarcel
6538273562Smarcel				} else {
6539273562Smarcel					return elem.style.opacity;
6540273562Smarcel				}
6541273562Smarcel			}
6542273562Smarcel		}
6543273562Smarcel	},
6544273562Smarcel
6545273562Smarcel	// Exclude the following css properties to add px
6546273562Smarcel	cssNumber: {
6547273562Smarcel		"fillOpacity": true,
6548273562Smarcel		"fontWeight": true,
6549273562Smarcel		"lineHeight": true,
6550273562Smarcel		"opacity": true,
6551273562Smarcel		"orphans": true,
6552273562Smarcel		"widows": true,
6553273562Smarcel		"zIndex": true,
6554273562Smarcel		"zoom": true
6555273562Smarcel	},
6556273562Smarcel
6557273562Smarcel	// Add in properties whose names you wish to fix before
6558273562Smarcel	// setting or getting the value
6559273562Smarcel	cssProps: {
6560273562Smarcel		// normalize float css property
6561273562Smarcel		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
6562273562Smarcel	},
6563273562Smarcel
6564273562Smarcel	// Get and set the style property on a DOM Node
6565273562Smarcel	style: function( elem, name, value, extra ) {
6566273562Smarcel		// Don't set styles on text and comment nodes
6567273562Smarcel		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6568273562Smarcel			return;
6569273562Smarcel		}
6570273562Smarcel
6571273562Smarcel		// Make sure that we're working with the right name
6572273562Smarcel		var ret, type, origName = jQuery.camelCase( name ),
6573273562Smarcel			style = elem.style, hooks = jQuery.cssHooks[ origName ];
6574273562Smarcel
6575273562Smarcel		name = jQuery.cssProps[ origName ] || origName;
6576273562Smarcel
6577273562Smarcel		// Check if we're setting a value
6578273562Smarcel		if ( value !== undefined ) {
6579273562Smarcel			type = typeof value;
6580273562Smarcel
6581273562Smarcel			// convert relative number strings (+= or -=) to relative numbers. #7345
6582273562Smarcel			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
6583273562Smarcel				value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
6584273562Smarcel				// Fixes bug #9237
6585273562Smarcel				type = "number";
6586273562Smarcel			}
6587273562Smarcel
6588273562Smarcel			// Make sure that NaN and null values aren't set. See: #7116
6589273562Smarcel			if ( value == null || type === "number" && isNaN( value ) ) {
6590273562Smarcel				return;
6591273562Smarcel			}
6592273562Smarcel
6593273562Smarcel			// If a number was passed in, add 'px' to the (except for certain CSS properties)
6594273562Smarcel			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
6595273562Smarcel				value += "px";
6596273562Smarcel			}
6597273562Smarcel
6598273562Smarcel			// If a hook was provided, use that value, otherwise just set the specified value
6599273562Smarcel			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
6600273562Smarcel				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
6601273562Smarcel				// Fixes bug #5509
6602273562Smarcel				try {
6603273562Smarcel					style[ name ] = value;
6604273562Smarcel				} catch(e) {}
6605273562Smarcel			}
6606273562Smarcel
6607273562Smarcel		} else {
6608273562Smarcel			// If a hook was provided get the non-computed value from there
6609273562Smarcel			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
6610273562Smarcel				return ret;
6611273562Smarcel			}
6612273562Smarcel
6613273562Smarcel			// Otherwise just get the value from the style object
6614273562Smarcel			return style[ name ];
6615273562Smarcel		}
6616273562Smarcel	},
6617273562Smarcel
6618273562Smarcel	css: function( elem, name, extra ) {
6619273562Smarcel		var ret, hooks;
6620273562Smarcel
6621273562Smarcel		// Make sure that we're working with the right name
6622273562Smarcel		name = jQuery.camelCase( name );
6623273562Smarcel		hooks = jQuery.cssHooks[ name ];
6624273562Smarcel		name = jQuery.cssProps[ name ] || name;
6625273562Smarcel
6626273562Smarcel		// cssFloat needs a special treatment
6627273562Smarcel		if ( name === "cssFloat" ) {
6628273562Smarcel			name = "float";
6629273562Smarcel		}
6630273562Smarcel
6631273562Smarcel		// If a hook was provided get the computed value from there
6632273562Smarcel		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
6633273562Smarcel			return ret;
6634273562Smarcel
6635273562Smarcel		// Otherwise, if a way to get the computed value exists, use that
6636273562Smarcel		} else if ( curCSS ) {
6637273562Smarcel			return curCSS( elem, name );
6638273562Smarcel		}
6639273562Smarcel	},
6640273562Smarcel
6641273562Smarcel	// A method for quickly swapping in/out CSS properties to get correct calculations
6642273562Smarcel	swap: function( elem, options, callback ) {
6643273562Smarcel		var old = {};
6644273562Smarcel
6645273562Smarcel		// Remember the old values, and insert the new ones
6646273562Smarcel		for ( var name in options ) {
6647273562Smarcel			old[ name ] = elem.style[ name ];
6648273562Smarcel			elem.style[ name ] = options[ name ];
6649273562Smarcel		}
6650273562Smarcel
6651273562Smarcel		callback.call( elem );
6652273562Smarcel
6653273562Smarcel		// Revert the old values
6654273562Smarcel		for ( name in options ) {
6655273562Smarcel			elem.style[ name ] = old[ name ];
6656273562Smarcel		}
6657273562Smarcel	}
6658273562Smarcel});
6659273562Smarcel
6660273562Smarcel// DEPRECATED, Use jQuery.css() instead
6661273562SmarceljQuery.curCSS = jQuery.css;
6662273562Smarcel
6663273562SmarceljQuery.each(["height", "width"], function( i, name ) {
6664273562Smarcel	jQuery.cssHooks[ name ] = {
6665273562Smarcel		get: function( elem, computed, extra ) {
6666273562Smarcel			var val;
6667273562Smarcel
6668273562Smarcel			if ( computed ) {
6669273562Smarcel				if ( elem.offsetWidth !== 0 ) {
6670273562Smarcel					return getWH( elem, name, extra );
6671273562Smarcel				} else {
6672273562Smarcel					jQuery.swap( elem, cssShow, function() {
6673273562Smarcel						val = getWH( elem, name, extra );
6674273562Smarcel					});
6675273562Smarcel				}
6676273562Smarcel
6677273562Smarcel				return val;
6678273562Smarcel			}
6679273562Smarcel		},
6680273562Smarcel
6681273562Smarcel		set: function( elem, value ) {
6682273562Smarcel			if ( rnumpx.test( value ) ) {
6683273562Smarcel				// ignore negative width and height values #1599
6684273562Smarcel				value = parseFloat( value );
6685273562Smarcel
6686273562Smarcel				if ( value >= 0 ) {
6687273562Smarcel					return value + "px";
6688273562Smarcel				}
6689273562Smarcel
6690273562Smarcel			} else {
6691273562Smarcel				return value;
6692273562Smarcel			}
6693273562Smarcel		}
6694273562Smarcel	};
6695273562Smarcel});
6696273562Smarcel
6697273562Smarcelif ( !jQuery.support.opacity ) {
6698273562Smarcel	jQuery.cssHooks.opacity = {
6699273562Smarcel		get: function( elem, computed ) {
6700273562Smarcel			// IE uses filters for opacity
6701273562Smarcel			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
6702273562Smarcel				( parseFloat( RegExp.$1 ) / 100 ) + "" :
6703273562Smarcel				computed ? "1" : "";
6704273562Smarcel		},
6705273562Smarcel
6706273562Smarcel		set: function( elem, value ) {
6707273562Smarcel			var style = elem.style,
6708273562Smarcel				currentStyle = elem.currentStyle,
6709273562Smarcel				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
6710273562Smarcel				filter = currentStyle && currentStyle.filter || style.filter || "";
6711273562Smarcel
6712273562Smarcel			// IE has trouble with opacity if it does not have layout
6713273562Smarcel			// Force it by setting the zoom level
6714273562Smarcel			style.zoom = 1;
6715273562Smarcel
6716273562Smarcel			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
6717273562Smarcel			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
6718273562Smarcel
6719273562Smarcel				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
6720273562Smarcel				// if "filter:" is present at all, clearType is disabled, we want to avoid this
6721273562Smarcel				// style.removeAttribute is IE Only, but so apparently is this code path...
6722273562Smarcel				style.removeAttribute( "filter" );
6723273562Smarcel
6724273562Smarcel				// if there there is no filter style applied in a css rule, we are done
6725273562Smarcel				if ( currentStyle && !currentStyle.filter ) {
6726273562Smarcel					return;
6727273562Smarcel				}
6728273562Smarcel			}
6729273562Smarcel
6730273562Smarcel			// otherwise, set new filter values
6731273562Smarcel			style.filter = ralpha.test( filter ) ?
6732273562Smarcel				filter.replace( ralpha, opacity ) :
6733273562Smarcel				filter + " " + opacity;
6734273562Smarcel		}
6735273562Smarcel	};
6736273562Smarcel}
6737273562Smarcel
6738273562SmarceljQuery(function() {
6739273562Smarcel	// This hook cannot be added until DOM ready because the support test
6740273562Smarcel	// for it is not run until after DOM ready
6741273562Smarcel	if ( !jQuery.support.reliableMarginRight ) {
6742273562Smarcel		jQuery.cssHooks.marginRight = {
6743273562Smarcel			get: function( elem, computed ) {
6744273562Smarcel				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
6745273562Smarcel				// Work around by temporarily setting element display to inline-block
6746273562Smarcel				var ret;
6747273562Smarcel				jQuery.swap( elem, { "display": "inline-block" }, function() {
6748273562Smarcel					if ( computed ) {
6749273562Smarcel						ret = curCSS( elem, "margin-right", "marginRight" );
6750273562Smarcel					} else {
6751273562Smarcel						ret = elem.style.marginRight;
6752273562Smarcel					}
6753273562Smarcel				});
6754273562Smarcel				return ret;
6755273562Smarcel			}
6756273562Smarcel		};
6757273562Smarcel	}
6758273562Smarcel});
6759273562Smarcel
6760273562Smarcelif ( document.defaultView && document.defaultView.getComputedStyle ) {
6761273562Smarcel	getComputedStyle = function( elem, name ) {
6762273562Smarcel		var ret, defaultView, computedStyle;
6763273562Smarcel
6764273562Smarcel		name = name.replace( rupper, "-$1" ).toLowerCase();
6765273562Smarcel
6766273562Smarcel		if ( !(defaultView = elem.ownerDocument.defaultView) ) {
6767273562Smarcel			return undefined;
6768273562Smarcel		}
6769273562Smarcel
6770273562Smarcel		if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
6771273562Smarcel			ret = computedStyle.getPropertyValue( name );
6772273562Smarcel			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
6773273562Smarcel				ret = jQuery.style( elem, name );
6774273562Smarcel			}
6775273562Smarcel		}
6776273562Smarcel
6777273562Smarcel		return ret;
6778273562Smarcel	};
6779273562Smarcel}
6780273562Smarcel
6781273562Smarcelif ( document.documentElement.currentStyle ) {
6782273562Smarcel	currentStyle = function( elem, name ) {
6783273562Smarcel		var left, rsLeft, uncomputed,
6784273562Smarcel			ret = elem.currentStyle && elem.currentStyle[ name ],
6785273562Smarcel			style = elem.style;
6786273562Smarcel
6787273562Smarcel		// Avoid setting ret to empty string here
6788273562Smarcel		// so we don't default to auto
6789273562Smarcel		if ( ret === null && style && (uncomputed = style[ name ]) ) {
6790273562Smarcel			ret = uncomputed;
6791273562Smarcel		}
6792273562Smarcel
6793273562Smarcel		// From the awesome hack by Dean Edwards
6794273562Smarcel		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
6795273562Smarcel
6796273562Smarcel		// If we're not dealing with a regular pixel number
6797273562Smarcel		// but a number that has a weird ending, we need to convert it to pixels
6798273562Smarcel		if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
6799273562Smarcel
6800273562Smarcel			// Remember the original values
6801273562Smarcel			left = style.left;
6802273562Smarcel			rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
6803273562Smarcel
6804273562Smarcel			// Put in the new values to get a computed value out
6805273562Smarcel			if ( rsLeft ) {
6806273562Smarcel				elem.runtimeStyle.left = elem.currentStyle.left;
6807273562Smarcel			}
6808273562Smarcel			style.left = name === "fontSize" ? "1em" : ( ret || 0 );
6809273562Smarcel			ret = style.pixelLeft + "px";
6810273562Smarcel
6811273562Smarcel			// Revert the changed values
6812273562Smarcel			style.left = left;
6813273562Smarcel			if ( rsLeft ) {
6814273562Smarcel				elem.runtimeStyle.left = rsLeft;
6815273562Smarcel			}
6816273562Smarcel		}
6817273562Smarcel
6818273562Smarcel		return ret === "" ? "auto" : ret;
6819273562Smarcel	};
6820273562Smarcel}
6821273562Smarcel
6822273562SmarcelcurCSS = getComputedStyle || currentStyle;
6823273562Smarcel
6824273562Smarcelfunction getWH( elem, name, extra ) {
6825273562Smarcel
6826273562Smarcel	// Start with offset property
6827273562Smarcel	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
6828273562Smarcel		which = name === "width" ? cssWidth : cssHeight;
6829273562Smarcel
6830273562Smarcel	if ( val > 0 ) {
6831273562Smarcel		if ( extra !== "border" ) {
6832273562Smarcel			jQuery.each( which, function() {
6833273562Smarcel				if ( !extra ) {
6834273562Smarcel					val -= parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
6835273562Smarcel				}
6836273562Smarcel				if ( extra === "margin" ) {
6837273562Smarcel					val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
6838273562Smarcel				} else {
6839273562Smarcel					val -= parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
6840273562Smarcel				}
6841273562Smarcel			});
6842273562Smarcel		}
6843273562Smarcel
6844273562Smarcel		return val + "px";
6845273562Smarcel	}
6846273562Smarcel
6847273562Smarcel	// Fall back to computed then uncomputed css if necessary
6848273562Smarcel	val = curCSS( elem, name, name );
6849273562Smarcel	if ( val < 0 || val == null ) {
6850273562Smarcel		val = elem.style[ name ] || 0;
6851273562Smarcel	}
6852273562Smarcel	// Normalize "", auto, and prepare for extra
6853273562Smarcel	val = parseFloat( val ) || 0;
6854273562Smarcel
6855273562Smarcel	// Add padding, border, margin
6856273562Smarcel	if ( extra ) {
6857273562Smarcel		jQuery.each( which, function() {
6858273562Smarcel			val += parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
6859273562Smarcel			if ( extra !== "padding" ) {
6860273562Smarcel				val += parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
6861273562Smarcel			}
6862273562Smarcel			if ( extra === "margin" ) {
6863273562Smarcel				val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
6864273562Smarcel			}
6865273562Smarcel		});
6866273562Smarcel	}
6867273562Smarcel
6868273562Smarcel	return val + "px";
6869273562Smarcel}
6870273562Smarcel
6871273562Smarcelif ( jQuery.expr && jQuery.expr.filters ) {
6872273562Smarcel	jQuery.expr.filters.hidden = function( elem ) {
6873273562Smarcel		var width = elem.offsetWidth,
6874273562Smarcel			height = elem.offsetHeight;
6875273562Smarcel
6876273562Smarcel		return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
6877273562Smarcel	};
6878273562Smarcel
6879273562Smarcel	jQuery.expr.filters.visible = function( elem ) {
6880273562Smarcel		return !jQuery.expr.filters.hidden( elem );
6881273562Smarcel	};
6882273562Smarcel}
6883273562Smarcel
6884273562Smarcel
6885273562Smarcel
6886273562Smarcel
6887273562Smarcelvar r20 = /%20/g,
6888273562Smarcel	rbracket = /\[\]$/,
6889273562Smarcel	rCRLF = /\r?\n/g,
6890273562Smarcel	rhash = /#.*$/,
6891273562Smarcel	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
6892273562Smarcel	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
6893273562Smarcel	// #7653, #8125, #8152: local protocol detection
6894273562Smarcel	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
6895273562Smarcel	rnoContent = /^(?:GET|HEAD)$/,
6896273562Smarcel	rprotocol = /^\/\//,
6897273562Smarcel	rquery = /\?/,
6898273562Smarcel	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
6899273562Smarcel	rselectTextarea = /^(?:select|textarea)/i,
6900273562Smarcel	rspacesAjax = /\s+/,
6901273562Smarcel	rts = /([?&])_=[^&]*/,
6902273562Smarcel	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
6903273562Smarcel
6904273562Smarcel	// Keep a copy of the old load method
6905273562Smarcel	_load = jQuery.fn.load,
6906273562Smarcel
6907273562Smarcel	/* Prefilters
6908273562Smarcel	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
6909273562Smarcel	 * 2) These are called:
6910273562Smarcel	 *    - BEFORE asking for a transport
6911273562Smarcel	 *    - AFTER param serialization (s.data is a string if s.processData is true)
6912273562Smarcel	 * 3) key is the dataType
6913273562Smarcel	 * 4) the catchall symbol "*" can be used
6914273562Smarcel	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
6915273562Smarcel	 */
6916273562Smarcel	prefilters = {},
6917273562Smarcel
6918273562Smarcel	/* Transports bindings
6919273562Smarcel	 * 1) key is the dataType
6920273562Smarcel	 * 2) the catchall symbol "*" can be used
6921273562Smarcel	 * 3) selection will start with transport dataType and THEN go to "*" if needed
6922273562Smarcel	 */
6923273562Smarcel	transports = {},
6924273562Smarcel
6925273562Smarcel	// Document location
6926273562Smarcel	ajaxLocation,
6927273562Smarcel
6928273562Smarcel	// Document location segments
6929273562Smarcel	ajaxLocParts,
6930273562Smarcel
6931273562Smarcel	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
6932273562Smarcel	allTypes = ["*/"] + ["*"];
6933273562Smarcel
6934273562Smarcel// #8138, IE may throw an exception when accessing
6935273562Smarcel// a field from window.location if document.domain has been set
6936273562Smarceltry {
6937273562Smarcel	ajaxLocation = location.href;
6938273562Smarcel} catch( e ) {
6939273562Smarcel	// Use the href attribute of an A element
6940273562Smarcel	// since IE will modify it given document.location
6941273562Smarcel	ajaxLocation = document.createElement( "a" );
6942273562Smarcel	ajaxLocation.href = "";
6943273562Smarcel	ajaxLocation = ajaxLocation.href;
6944273562Smarcel}
6945273562Smarcel
6946273562Smarcel// Segment location into parts
6947273562SmarcelajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
6948273562Smarcel
6949273562Smarcel// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
6950273562Smarcelfunction addToPrefiltersOrTransports( structure ) {
6951273562Smarcel
6952273562Smarcel	// dataTypeExpression is optional and defaults to "*"
6953273562Smarcel	return function( dataTypeExpression, func ) {
6954273562Smarcel
6955273562Smarcel		if ( typeof dataTypeExpression !== "string" ) {
6956273562Smarcel			func = dataTypeExpression;
6957273562Smarcel			dataTypeExpression = "*";
6958273562Smarcel		}
6959273562Smarcel
6960273562Smarcel		if ( jQuery.isFunction( func ) ) {
6961273562Smarcel			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
6962273562Smarcel				i = 0,
6963273562Smarcel				length = dataTypes.length,
6964273562Smarcel				dataType,
6965273562Smarcel				list,
6966273562Smarcel				placeBefore;
6967273562Smarcel
6968273562Smarcel			// For each dataType in the dataTypeExpression
6969273562Smarcel			for ( ; i < length; i++ ) {
6970273562Smarcel				dataType = dataTypes[ i ];
6971273562Smarcel				// We control if we're asked to add before
6972273562Smarcel				// any existing element
6973273562Smarcel				placeBefore = /^\+/.test( dataType );
6974273562Smarcel				if ( placeBefore ) {
6975273562Smarcel					dataType = dataType.substr( 1 ) || "*";
6976273562Smarcel				}
6977273562Smarcel				list = structure[ dataType ] = structure[ dataType ] || [];
6978273562Smarcel				// then we add to the structure accordingly
6979273562Smarcel				list[ placeBefore ? "unshift" : "push" ]( func );
6980273562Smarcel			}
6981273562Smarcel		}
6982273562Smarcel	};
6983273562Smarcel}
6984273562Smarcel
6985273562Smarcel// Base inspection function for prefilters and transports
6986273562Smarcelfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
6987273562Smarcel		dataType /* internal */, inspected /* internal */ ) {
6988273562Smarcel
6989273562Smarcel	dataType = dataType || options.dataTypes[ 0 ];
6990273562Smarcel	inspected = inspected || {};
6991273562Smarcel
6992273562Smarcel	inspected[ dataType ] = true;
6993273562Smarcel
6994273562Smarcel	var list = structure[ dataType ],
6995273562Smarcel		i = 0,
6996273562Smarcel		length = list ? list.length : 0,
6997273562Smarcel		executeOnly = ( structure === prefilters ),
6998273562Smarcel		selection;
6999273562Smarcel
7000273562Smarcel	for ( ; i < length && ( executeOnly || !selection ); i++ ) {
7001273562Smarcel		selection = list[ i ]( options, originalOptions, jqXHR );
7002273562Smarcel		// If we got redirected to another dataType
7003273562Smarcel		// we try there if executing only and not done already
7004273562Smarcel		if ( typeof selection === "string" ) {
7005273562Smarcel			if ( !executeOnly || inspected[ selection ] ) {
7006273562Smarcel				selection = undefined;
7007273562Smarcel			} else {
7008273562Smarcel				options.dataTypes.unshift( selection );
7009273562Smarcel				selection = inspectPrefiltersOrTransports(
7010273562Smarcel						structure, options, originalOptions, jqXHR, selection, inspected );
7011273562Smarcel			}
7012273562Smarcel		}
7013273562Smarcel	}
7014273562Smarcel	// If we're only executing or nothing was selected
7015273562Smarcel	// we try the catchall dataType if not done already
7016273562Smarcel	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
7017273562Smarcel		selection = inspectPrefiltersOrTransports(
7018273562Smarcel				structure, options, originalOptions, jqXHR, "*", inspected );
7019273562Smarcel	}
7020273562Smarcel	// unnecessary when only executing (prefilters)
7021273562Smarcel	// but it'll be ignored by the caller in that case
7022273562Smarcel	return selection;
7023273562Smarcel}
7024273562Smarcel
7025273562Smarcel// A special extend for ajax options
7026273562Smarcel// that takes "flat" options (not to be deep extended)
7027273562Smarcel// Fixes #9887
7028273562Smarcelfunction ajaxExtend( target, src ) {
7029273562Smarcel	var key, deep,
7030273562Smarcel		flatOptions = jQuery.ajaxSettings.flatOptions || {};
7031273562Smarcel	for ( key in src ) {
7032273562Smarcel		if ( src[ key ] !== undefined ) {
7033273562Smarcel			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
7034273562Smarcel		}
7035273562Smarcel	}
7036273562Smarcel	if ( deep ) {
7037273562Smarcel		jQuery.extend( true, target, deep );
7038273562Smarcel	}
7039273562Smarcel}
7040273562Smarcel
7041273562SmarceljQuery.fn.extend({
7042273562Smarcel	load: function( url, params, callback ) {
7043273562Smarcel		if ( typeof url !== "string" && _load ) {
7044273562Smarcel			return _load.apply( this, arguments );
7045273562Smarcel
7046273562Smarcel		// Don't do a request if no elements are being requested
7047273562Smarcel		} else if ( !this.length ) {
7048273562Smarcel			return this;
7049273562Smarcel		}
7050273562Smarcel
7051273562Smarcel		var off = url.indexOf( " " );
7052273562Smarcel		if ( off >= 0 ) {
7053273562Smarcel			var selector = url.slice( off, url.length );
7054273562Smarcel			url = url.slice( 0, off );
7055273562Smarcel		}
7056273562Smarcel
7057273562Smarcel		// Default to a GET request
7058273562Smarcel		var type = "GET";
7059273562Smarcel
7060273562Smarcel		// If the second parameter was provided
7061273562Smarcel		if ( params ) {
7062273562Smarcel			// If it's a function
7063273562Smarcel			if ( jQuery.isFunction( params ) ) {
7064273562Smarcel				// We assume that it's the callback
7065273562Smarcel				callback = params;
7066273562Smarcel				params = undefined;
7067273562Smarcel
7068273562Smarcel			// Otherwise, build a param string
7069273562Smarcel			} else if ( typeof params === "object" ) {
7070273562Smarcel				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
7071273562Smarcel				type = "POST";
7072273562Smarcel			}
7073273562Smarcel		}
7074273562Smarcel
7075273562Smarcel		var self = this;
7076273562Smarcel
7077273562Smarcel		// Request the remote document
7078273562Smarcel		jQuery.ajax({
7079273562Smarcel			url: url,
7080273562Smarcel			type: type,
7081273562Smarcel			dataType: "html",
7082273562Smarcel			data: params,
7083273562Smarcel			// Complete callback (responseText is used internally)
7084273562Smarcel			complete: function( jqXHR, status, responseText ) {
7085273562Smarcel				// Store the response as specified by the jqXHR object
7086273562Smarcel				responseText = jqXHR.responseText;
7087273562Smarcel				// If successful, inject the HTML into all the matched elements
7088273562Smarcel				if ( jqXHR.isResolved() ) {
7089273562Smarcel					// #4825: Get the actual response in case
7090273562Smarcel					// a dataFilter is present in ajaxSettings
7091273562Smarcel					jqXHR.done(function( r ) {
7092273562Smarcel						responseText = r;
7093273562Smarcel					});
7094273562Smarcel					// See if a selector was specified
7095273562Smarcel					self.html( selector ?
7096273562Smarcel						// Create a dummy div to hold the results
7097273562Smarcel						jQuery("<div>")
7098273562Smarcel							// inject the contents of the document in, removing the scripts
7099273562Smarcel							// to avoid any 'Permission Denied' errors in IE
7100273562Smarcel							.append(responseText.replace(rscript, ""))
7101273562Smarcel
7102273562Smarcel							// Locate the specified elements
7103273562Smarcel							.find(selector) :
7104273562Smarcel
7105273562Smarcel						// If not, just inject the full result
7106273562Smarcel						responseText );
7107273562Smarcel				}
7108273562Smarcel
7109273562Smarcel				if ( callback ) {
7110273562Smarcel					self.each( callback, [ responseText, status, jqXHR ] );
7111273562Smarcel				}
7112273562Smarcel			}
7113273562Smarcel		});
7114273562Smarcel
7115273562Smarcel		return this;
7116273562Smarcel	},
7117273562Smarcel
7118273562Smarcel	serialize: function() {
7119273562Smarcel		return jQuery.param( this.serializeArray() );
7120273562Smarcel	},
7121273562Smarcel
7122273562Smarcel	serializeArray: function() {
7123273562Smarcel		return this.map(function(){
7124273562Smarcel			return this.elements ? jQuery.makeArray( this.elements ) : this;
7125273562Smarcel		})
7126273562Smarcel		.filter(function(){
7127273562Smarcel			return this.name && !this.disabled &&
7128273562Smarcel				( this.checked || rselectTextarea.test( this.nodeName ) ||
7129273562Smarcel					rinput.test( this.type ) );
7130273562Smarcel		})
7131273562Smarcel		.map(function( i, elem ){
7132273562Smarcel			var val = jQuery( this ).val();
7133273562Smarcel
7134273562Smarcel			return val == null ?
7135273562Smarcel				null :
7136273562Smarcel				jQuery.isArray( val ) ?
7137273562Smarcel					jQuery.map( val, function( val, i ){
7138273562Smarcel						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
7139273562Smarcel					}) :
7140273562Smarcel					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
7141273562Smarcel		}).get();
7142273562Smarcel	}
7143273562Smarcel});
7144273562Smarcel
7145273562Smarcel// Attach a bunch of functions for handling common AJAX events
7146273562SmarceljQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
7147273562Smarcel	jQuery.fn[ o ] = function( f ){
7148273562Smarcel		return this.bind( o, f );
7149273562Smarcel	};
7150273562Smarcel});
7151273562Smarcel
7152273562SmarceljQuery.each( [ "get", "post" ], function( i, method ) {
7153273562Smarcel	jQuery[ method ] = function( url, data, callback, type ) {
7154273562Smarcel		// shift arguments if data argument was omitted
7155273562Smarcel		if ( jQuery.isFunction( data ) ) {
7156273562Smarcel			type = type || callback;
7157273562Smarcel			callback = data;
7158273562Smarcel			data = undefined;
7159273562Smarcel		}
7160273562Smarcel
7161273562Smarcel		return jQuery.ajax({
7162273562Smarcel			type: method,
7163273562Smarcel			url: url,
7164273562Smarcel			data: data,
7165273562Smarcel			success: callback,
7166273562Smarcel			dataType: type
7167273562Smarcel		});
7168273562Smarcel	};
7169273562Smarcel});
7170273562Smarcel
7171273562SmarceljQuery.extend({
7172273562Smarcel
7173273562Smarcel	getScript: function( url, callback ) {
7174273562Smarcel		return jQuery.get( url, undefined, callback, "script" );
7175273562Smarcel	},
7176273562Smarcel
7177273562Smarcel	getJSON: function( url, data, callback ) {
7178273562Smarcel		return jQuery.get( url, data, callback, "json" );
7179273562Smarcel	},
7180273562Smarcel
7181273562Smarcel	// Creates a full fledged settings object into target
7182273562Smarcel	// with both ajaxSettings and settings fields.
7183273562Smarcel	// If target is omitted, writes into ajaxSettings.
7184273562Smarcel	ajaxSetup: function( target, settings ) {
7185273562Smarcel		if ( settings ) {
7186273562Smarcel			// Building a settings object
7187273562Smarcel			ajaxExtend( target, jQuery.ajaxSettings );
7188273562Smarcel		} else {
7189273562Smarcel			// Extending ajaxSettings
7190273562Smarcel			settings = target;
7191273562Smarcel			target = jQuery.ajaxSettings;
7192273562Smarcel		}
7193273562Smarcel		ajaxExtend( target, settings );
7194273562Smarcel		return target;
7195273562Smarcel	},
7196273562Smarcel
7197273562Smarcel	ajaxSettings: {
7198273562Smarcel		url: ajaxLocation,
7199273562Smarcel		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
7200273562Smarcel		global: true,
7201273562Smarcel		type: "GET",
7202273562Smarcel		contentType: "application/x-www-form-urlencoded",
7203273562Smarcel		processData: true,
7204273562Smarcel		async: true,
7205273562Smarcel		/*
7206273562Smarcel		timeout: 0,
7207273562Smarcel		data: null,
7208273562Smarcel		dataType: null,
7209273562Smarcel		username: null,
7210273562Smarcel		password: null,
7211273562Smarcel		cache: null,
7212273562Smarcel		traditional: false,
7213273562Smarcel		headers: {},
7214273562Smarcel		*/
7215273562Smarcel
7216273562Smarcel		accepts: {
7217273562Smarcel			xml: "application/xml, text/xml",
7218273562Smarcel			html: "text/html",
7219273562Smarcel			text: "text/plain",
7220273562Smarcel			json: "application/json, text/javascript",
7221273562Smarcel			"*": allTypes
7222273562Smarcel		},
7223273562Smarcel
7224273562Smarcel		contents: {
7225273562Smarcel			xml: /xml/,
7226273562Smarcel			html: /html/,
7227273562Smarcel			json: /json/
7228273562Smarcel		},
7229273562Smarcel
7230273562Smarcel		responseFields: {
7231273562Smarcel			xml: "responseXML",
7232273562Smarcel			text: "responseText"
7233273562Smarcel		},
7234273562Smarcel
7235273562Smarcel		// List of data converters
7236273562Smarcel		// 1) key format is "source_type destination_type" (a single space in-between)
7237273562Smarcel		// 2) the catchall symbol "*" can be used for source_type
7238273562Smarcel		converters: {
7239273562Smarcel
7240273562Smarcel			// Convert anything to text
7241273562Smarcel			"* text": window.String,
7242273562Smarcel
7243273562Smarcel			// Text to html (true = no transformation)
7244273562Smarcel			"text html": true,
7245273562Smarcel
7246273562Smarcel			// Evaluate text as a json expression
7247273562Smarcel			"text json": jQuery.parseJSON,
7248273562Smarcel
7249273562Smarcel			// Parse text as xml
7250273562Smarcel			"text xml": jQuery.parseXML
7251273562Smarcel		},
7252273562Smarcel
7253273562Smarcel		// For options that shouldn't be deep extended:
7254273562Smarcel		// you can add your own custom options here if
7255273562Smarcel		// and when you create one that shouldn't be
7256273562Smarcel		// deep extended (see ajaxExtend)
7257273562Smarcel		flatOptions: {
7258273562Smarcel			context: true,
7259273562Smarcel			url: true
7260273562Smarcel		}
7261273562Smarcel	},
7262273562Smarcel
7263273562Smarcel	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
7264273562Smarcel	ajaxTransport: addToPrefiltersOrTransports( transports ),
7265273562Smarcel
7266273562Smarcel	// Main method
7267273562Smarcel	ajax: function( url, options ) {
7268273562Smarcel
7269273562Smarcel		// If url is an object, simulate pre-1.5 signature
7270273562Smarcel		if ( typeof url === "object" ) {
7271273562Smarcel			options = url;
7272273562Smarcel			url = undefined;
7273273562Smarcel		}
7274273562Smarcel
7275273562Smarcel		// Force options to be an object
7276273562Smarcel		options = options || {};
7277273562Smarcel
7278273562Smarcel		var // Create the final options object
7279273562Smarcel			s = jQuery.ajaxSetup( {}, options ),
7280273562Smarcel			// Callbacks context
7281273562Smarcel			callbackContext = s.context || s,
7282273562Smarcel			// Context for global events
7283273562Smarcel			// It's the callbackContext if one was provided in the options
7284273562Smarcel			// and if it's a DOM node or a jQuery collection
7285273562Smarcel			globalEventContext = callbackContext !== s &&
7286273562Smarcel				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
7287273562Smarcel						jQuery( callbackContext ) : jQuery.event,
7288273562Smarcel			// Deferreds
7289273562Smarcel			deferred = jQuery.Deferred(),
7290273562Smarcel			completeDeferred = jQuery.Callbacks( "once memory" ),
7291273562Smarcel			// Status-dependent callbacks
7292273562Smarcel			statusCode = s.statusCode || {},
7293273562Smarcel			// ifModified key
7294273562Smarcel			ifModifiedKey,
7295273562Smarcel			// Headers (they are sent all at once)
7296273562Smarcel			requestHeaders = {},
7297273562Smarcel			requestHeadersNames = {},
7298273562Smarcel			// Response headers
7299273562Smarcel			responseHeadersString,
7300273562Smarcel			responseHeaders,
7301273562Smarcel			// transport
7302273562Smarcel			transport,
7303273562Smarcel			// timeout handle
7304273562Smarcel			timeoutTimer,
7305273562Smarcel			// Cross-domain detection vars
7306273562Smarcel			parts,
7307273562Smarcel			// The jqXHR state
7308273562Smarcel			state = 0,
7309273562Smarcel			// To know if global events are to be dispatched
7310273562Smarcel			fireGlobals,
7311273562Smarcel			// Loop variable
7312273562Smarcel			i,
7313273562Smarcel			// Fake xhr
7314273562Smarcel			jqXHR = {
7315273562Smarcel
7316273562Smarcel				readyState: 0,
7317273562Smarcel
7318273562Smarcel				// Caches the header
7319273562Smarcel				setRequestHeader: function( name, value ) {
7320273562Smarcel					if ( !state ) {
7321273562Smarcel						var lname = name.toLowerCase();
7322273562Smarcel						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
7323273562Smarcel						requestHeaders[ name ] = value;
7324273562Smarcel					}
7325273562Smarcel					return this;
7326273562Smarcel				},
7327273562Smarcel
7328273562Smarcel				// Raw string
7329273562Smarcel				getAllResponseHeaders: function() {
7330273562Smarcel					return state === 2 ? responseHeadersString : null;
7331273562Smarcel				},
7332273562Smarcel
7333273562Smarcel				// Builds headers hashtable if needed
7334273562Smarcel				getResponseHeader: function( key ) {
7335273562Smarcel					var match;
7336273562Smarcel					if ( state === 2 ) {
7337273562Smarcel						if ( !responseHeaders ) {
7338273562Smarcel							responseHeaders = {};
7339273562Smarcel							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
7340273562Smarcel								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
7341273562Smarcel							}
7342273562Smarcel						}
7343273562Smarcel						match = responseHeaders[ key.toLowerCase() ];
7344273562Smarcel					}
7345273562Smarcel					return match === undefined ? null : match;
7346273562Smarcel				},
7347273562Smarcel
7348273562Smarcel				// Overrides response content-type header
7349273562Smarcel				overrideMimeType: function( type ) {
7350273562Smarcel					if ( !state ) {
7351273562Smarcel						s.mimeType = type;
7352273562Smarcel					}
7353273562Smarcel					return this;
7354273562Smarcel				},
7355273562Smarcel
7356273562Smarcel				// Cancel the request
7357273562Smarcel				abort: function( statusText ) {
7358273562Smarcel					statusText = statusText || "abort";
7359273562Smarcel					if ( transport ) {
7360273562Smarcel						transport.abort( statusText );
7361273562Smarcel					}
7362273562Smarcel					done( 0, statusText );
7363273562Smarcel					return this;
7364273562Smarcel				}
7365273562Smarcel			};
7366273562Smarcel
7367273562Smarcel		// Callback for when everything is done
7368273562Smarcel		// It is defined here because jslint complains if it is declared
7369273562Smarcel		// at the end of the function (which would be more logical and readable)
7370273562Smarcel		function done( status, nativeStatusText, responses, headers ) {
7371273562Smarcel
7372273562Smarcel			// Called once
7373273562Smarcel			if ( state === 2 ) {
7374273562Smarcel				return;
7375273562Smarcel			}
7376273562Smarcel
7377273562Smarcel			// State is "done" now
7378273562Smarcel			state = 2;
7379273562Smarcel
7380273562Smarcel			// Clear timeout if it exists
7381273562Smarcel			if ( timeoutTimer ) {
7382273562Smarcel				clearTimeout( timeoutTimer );
7383273562Smarcel			}
7384273562Smarcel
7385273562Smarcel			// Dereference transport for early garbage collection
7386273562Smarcel			// (no matter how long the jqXHR object will be used)
7387273562Smarcel			transport = undefined;
7388273562Smarcel
7389273562Smarcel			// Cache response headers
7390273562Smarcel			responseHeadersString = headers || "";
7391273562Smarcel
7392273562Smarcel			// Set readyState
7393273562Smarcel			jqXHR.readyState = status > 0 ? 4 : 0;
7394273562Smarcel
7395273562Smarcel			var isSuccess,
7396273562Smarcel				success,
7397273562Smarcel				error,
7398273562Smarcel				statusText = nativeStatusText,
7399273562Smarcel				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
7400273562Smarcel				lastModified,
7401273562Smarcel				etag;
7402273562Smarcel
7403273562Smarcel			// If successful, handle type chaining
7404273562Smarcel			if ( status >= 200 && status < 300 || status === 304 ) {
7405273562Smarcel
7406273562Smarcel				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
7407273562Smarcel				if ( s.ifModified ) {
7408273562Smarcel
7409273562Smarcel					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
7410273562Smarcel						jQuery.lastModified[ ifModifiedKey ] = lastModified;
7411273562Smarcel					}
7412273562Smarcel					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
7413273562Smarcel						jQuery.etag[ ifModifiedKey ] = etag;
7414273562Smarcel					}
7415273562Smarcel				}
7416273562Smarcel
7417273562Smarcel				// If not modified
7418273562Smarcel				if ( status === 304 ) {
7419273562Smarcel
7420273562Smarcel					statusText = "notmodified";
7421273562Smarcel					isSuccess = true;
7422273562Smarcel
7423273562Smarcel				// If we have data
7424273562Smarcel				} else {
7425273562Smarcel
7426273562Smarcel					try {
7427273562Smarcel						success = ajaxConvert( s, response );
7428273562Smarcel						statusText = "success";
7429273562Smarcel						isSuccess = true;
7430273562Smarcel					} catch(e) {
7431273562Smarcel						// We have a parsererror
7432273562Smarcel						statusText = "parsererror";
7433273562Smarcel						error = e;
7434273562Smarcel					}
7435273562Smarcel				}
7436273562Smarcel			} else {
7437273562Smarcel				// We extract error from statusText
7438273562Smarcel				// then normalize statusText and status for non-aborts
7439273562Smarcel				error = statusText;
7440273562Smarcel				if ( !statusText || status ) {
7441273562Smarcel					statusText = "error";
7442273562Smarcel					if ( status < 0 ) {
7443273562Smarcel						status = 0;
7444273562Smarcel					}
7445273562Smarcel				}
7446273562Smarcel			}
7447273562Smarcel
7448273562Smarcel			// Set data for the fake xhr object
7449273562Smarcel			jqXHR.status = status;
7450273562Smarcel			jqXHR.statusText = "" + ( nativeStatusText || statusText );
7451273562Smarcel
7452273562Smarcel			// Success/Error
7453273562Smarcel			if ( isSuccess ) {
7454273562Smarcel				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
7455273562Smarcel			} else {
7456273562Smarcel				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
7457273562Smarcel			}
7458273562Smarcel
7459273562Smarcel			// Status-dependent callbacks
7460273562Smarcel			jqXHR.statusCode( statusCode );
7461273562Smarcel			statusCode = undefined;
7462273562Smarcel
7463273562Smarcel			if ( fireGlobals ) {
7464273562Smarcel				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
7465273562Smarcel						[ jqXHR, s, isSuccess ? success : error ] );
7466273562Smarcel			}
7467273562Smarcel
7468273562Smarcel			// Complete
7469273562Smarcel			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
7470273562Smarcel
7471273562Smarcel			if ( fireGlobals ) {
7472273562Smarcel				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
7473273562Smarcel				// Handle the global AJAX counter
7474273562Smarcel				if ( !( --jQuery.active ) ) {
7475273562Smarcel					jQuery.event.trigger( "ajaxStop" );
7476273562Smarcel				}
7477273562Smarcel			}
7478273562Smarcel		}
7479273562Smarcel
7480273562Smarcel		// Attach deferreds
7481273562Smarcel		deferred.promise( jqXHR );
7482273562Smarcel		jqXHR.success = jqXHR.done;
7483273562Smarcel		jqXHR.error = jqXHR.fail;
7484273562Smarcel		jqXHR.complete = completeDeferred.add;
7485273562Smarcel
7486273562Smarcel		// Status-dependent callbacks
7487273562Smarcel		jqXHR.statusCode = function( map ) {
7488273562Smarcel			if ( map ) {
7489273562Smarcel				var tmp;
7490273562Smarcel				if ( state < 2 ) {
7491273562Smarcel					for ( tmp in map ) {
7492273562Smarcel						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
7493273562Smarcel					}
7494273562Smarcel				} else {
7495273562Smarcel					tmp = map[ jqXHR.status ];
7496273562Smarcel					jqXHR.then( tmp, tmp );
7497273562Smarcel				}
7498273562Smarcel			}
7499273562Smarcel			return this;
7500273562Smarcel		};
7501273562Smarcel
7502273562Smarcel		// Remove hash character (#7531: and string promotion)
7503273562Smarcel		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
7504273562Smarcel		// We also use the url parameter if available
7505273562Smarcel		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
7506273562Smarcel
7507273562Smarcel		// Extract dataTypes list
7508273562Smarcel		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
7509273562Smarcel
7510273562Smarcel		// Determine if a cross-domain request is in order
7511273562Smarcel		if ( s.crossDomain == null ) {
7512273562Smarcel			parts = rurl.exec( s.url.toLowerCase() );
7513273562Smarcel			s.crossDomain = !!( parts &&
7514273562Smarcel				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
7515273562Smarcel					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
7516273562Smarcel						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
7517273562Smarcel			);
7518273562Smarcel		}
7519273562Smarcel
7520273562Smarcel		// Convert data if not already a string
7521273562Smarcel		if ( s.data && s.processData && typeof s.data !== "string" ) {
7522273562Smarcel			s.data = jQuery.param( s.data, s.traditional );
7523273562Smarcel		}
7524273562Smarcel
7525273562Smarcel		// Apply prefilters
7526273562Smarcel		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
7527273562Smarcel
7528273562Smarcel		// If request was aborted inside a prefiler, stop there
7529273562Smarcel		if ( state === 2 ) {
7530273562Smarcel			return false;
7531273562Smarcel		}
7532273562Smarcel
7533273562Smarcel		// We can fire global events as of now if asked to
7534273562Smarcel		fireGlobals = s.global;
7535273562Smarcel
7536273562Smarcel		// Uppercase the type
7537273562Smarcel		s.type = s.type.toUpperCase();
7538273562Smarcel
7539273562Smarcel		// Determine if request has content
7540273562Smarcel		s.hasContent = !rnoContent.test( s.type );
7541273562Smarcel
7542273562Smarcel		// Watch for a new set of requests
7543273562Smarcel		if ( fireGlobals && jQuery.active++ === 0 ) {
7544273562Smarcel			jQuery.event.trigger( "ajaxStart" );
7545273562Smarcel		}
7546273562Smarcel
7547273562Smarcel		// More options handling for requests with no content
7548273562Smarcel		if ( !s.hasContent ) {
7549273562Smarcel
7550273562Smarcel			// If data is available, append data to url
7551273562Smarcel			if ( s.data ) {
7552273562Smarcel				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
7553273562Smarcel				// #9682: remove data so that it's not used in an eventual retry
7554273562Smarcel				delete s.data;
7555273562Smarcel			}
7556273562Smarcel
7557273562Smarcel			// Get ifModifiedKey before adding the anti-cache parameter
7558273562Smarcel			ifModifiedKey = s.url;
7559273562Smarcel
7560273562Smarcel			// Add anti-cache in url if needed
7561273562Smarcel			if ( s.cache === false ) {
7562273562Smarcel
7563273562Smarcel				var ts = jQuery.now(),
7564273562Smarcel					// try replacing _= if it is there
7565273562Smarcel					ret = s.url.replace( rts, "$1_=" + ts );
7566273562Smarcel
7567273562Smarcel				// if nothing was replaced, add timestamp to the end
7568273562Smarcel				s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
7569273562Smarcel			}
7570273562Smarcel		}
7571273562Smarcel
7572273562Smarcel		// Set the correct header, if data is being sent
7573273562Smarcel		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
7574273562Smarcel			jqXHR.setRequestHeader( "Content-Type", s.contentType );
7575273562Smarcel		}
7576273562Smarcel
7577273562Smarcel		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
7578273562Smarcel		if ( s.ifModified ) {
7579273562Smarcel			ifModifiedKey = ifModifiedKey || s.url;
7580273562Smarcel			if ( jQuery.lastModified[ ifModifiedKey ] ) {
7581273562Smarcel				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
7582273562Smarcel			}
7583273562Smarcel			if ( jQuery.etag[ ifModifiedKey ] ) {
7584273562Smarcel				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
7585273562Smarcel			}
7586273562Smarcel		}
7587273562Smarcel
7588273562Smarcel		// Set the Accepts header for the server, depending on the dataType
7589273562Smarcel		jqXHR.setRequestHeader(
7590273562Smarcel			"Accept",
7591273562Smarcel			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
7592273562Smarcel				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
7593273562Smarcel				s.accepts[ "*" ]
7594273562Smarcel		);
7595273562Smarcel
7596273562Smarcel		// Check for headers option
7597273562Smarcel		for ( i in s.headers ) {
7598273562Smarcel			jqXHR.setRequestHeader( i, s.headers[ i ] );
7599273562Smarcel		}
7600273562Smarcel
7601273562Smarcel		// Allow custom headers/mimetypes and early abort
7602273562Smarcel		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
7603273562Smarcel				// Abort if not done already
7604273562Smarcel				jqXHR.abort();
7605273562Smarcel				return false;
7606273562Smarcel
7607273562Smarcel		}
7608273562Smarcel
7609273562Smarcel		// Install callbacks on deferreds
7610273562Smarcel		for ( i in { success: 1, error: 1, complete: 1 } ) {
7611273562Smarcel			jqXHR[ i ]( s[ i ] );
7612273562Smarcel		}
7613273562Smarcel
7614273562Smarcel		// Get transport
7615273562Smarcel		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
7616273562Smarcel
7617273562Smarcel		// If no transport, we auto-abort
7618273562Smarcel		if ( !transport ) {
7619273562Smarcel			done( -1, "No Transport" );
7620273562Smarcel		} else {
7621273562Smarcel			jqXHR.readyState = 1;
7622273562Smarcel			// Send global event
7623273562Smarcel			if ( fireGlobals ) {
7624273562Smarcel				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
7625273562Smarcel			}
7626273562Smarcel			// Timeout
7627273562Smarcel			if ( s.async && s.timeout > 0 ) {
7628273562Smarcel				timeoutTimer = setTimeout( function(){
7629273562Smarcel					jqXHR.abort( "timeout" );
7630273562Smarcel				}, s.timeout );
7631273562Smarcel			}
7632273562Smarcel
7633273562Smarcel			try {
7634273562Smarcel				state = 1;
7635273562Smarcel				transport.send( requestHeaders, done );
7636273562Smarcel			} catch (e) {
7637273562Smarcel				// Propagate exception as error if not done
7638273562Smarcel				if ( state < 2 ) {
7639273562Smarcel					done( -1, e );
7640273562Smarcel				// Simply rethrow otherwise
7641273562Smarcel				} else {
7642273562Smarcel					jQuery.error( e );
7643273562Smarcel				}
7644273562Smarcel			}
7645273562Smarcel		}
7646273562Smarcel
7647273562Smarcel		return jqXHR;
7648273562Smarcel	},
7649273562Smarcel
7650273562Smarcel	// Serialize an array of form elements or a set of
7651273562Smarcel	// key/values into a query string
7652273562Smarcel	param: function( a, traditional ) {
7653273562Smarcel		var s = [],
7654273562Smarcel			add = function( key, value ) {
7655273562Smarcel				// If value is a function, invoke it and return its value
7656273562Smarcel				value = jQuery.isFunction( value ) ? value() : value;
7657273562Smarcel				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
7658273562Smarcel			};
7659273562Smarcel
7660273562Smarcel		// Set traditional to true for jQuery <= 1.3.2 behavior.
7661273562Smarcel		if ( traditional === undefined ) {
7662273562Smarcel			traditional = jQuery.ajaxSettings.traditional;
7663273562Smarcel		}
7664273562Smarcel
7665273562Smarcel		// If an array was passed in, assume that it is an array of form elements.
7666273562Smarcel		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
7667273562Smarcel			// Serialize the form elements
7668273562Smarcel			jQuery.each( a, function() {
7669273562Smarcel				add( this.name, this.value );
7670273562Smarcel			});
7671273562Smarcel
7672273562Smarcel		} else {
7673273562Smarcel			// If traditional, encode the "old" way (the way 1.3.2 or older
7674273562Smarcel			// did it), otherwise encode params recursively.
7675273562Smarcel			for ( var prefix in a ) {
7676273562Smarcel				buildParams( prefix, a[ prefix ], traditional, add );
7677273562Smarcel			}
7678273562Smarcel		}
7679273562Smarcel
7680273562Smarcel		// Return the resulting serialization
7681273562Smarcel		return s.join( "&" ).replace( r20, "+" );
7682273562Smarcel	}
7683273562Smarcel});
7684273562Smarcel
7685273562Smarcelfunction buildParams( prefix, obj, traditional, add ) {
7686273562Smarcel	if ( jQuery.isArray( obj ) ) {
7687273562Smarcel		// Serialize array item.
7688273562Smarcel		jQuery.each( obj, function( i, v ) {
7689273562Smarcel			if ( traditional || rbracket.test( prefix ) ) {
7690273562Smarcel				// Treat each array item as a scalar.
7691273562Smarcel				add( prefix, v );
7692273562Smarcel
7693273562Smarcel			} else {
7694273562Smarcel				// If array item is non-scalar (array or object), encode its
7695273562Smarcel				// numeric index to resolve deserialization ambiguity issues.
7696273562Smarcel				// Note that rack (as of 1.0.0) can't currently deserialize
7697273562Smarcel				// nested arrays properly, and attempting to do so may cause
7698273562Smarcel				// a server error. Possible fixes are to modify rack's
7699273562Smarcel				// deserialization algorithm or to provide an option or flag
7700273562Smarcel				// to force array serialization to be shallow.
7701273562Smarcel				buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
7702273562Smarcel			}
7703273562Smarcel		});
7704273562Smarcel
7705273562Smarcel	} else if ( !traditional && obj != null && typeof obj === "object" ) {
7706273562Smarcel		// Serialize object item.
7707273562Smarcel		for ( var name in obj ) {
7708273562Smarcel			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
7709273562Smarcel		}
7710273562Smarcel
7711273562Smarcel	} else {
7712273562Smarcel		// Serialize scalar item.
7713273562Smarcel		add( prefix, obj );
7714273562Smarcel	}
7715273562Smarcel}
7716273562Smarcel
7717273562Smarcel// This is still on the jQuery object... for now
7718273562Smarcel// Want to move this to jQuery.ajax some day
7719273562SmarceljQuery.extend({
7720273562Smarcel
7721273562Smarcel	// Counter for holding the number of active queries
7722273562Smarcel	active: 0,
7723273562Smarcel
7724273562Smarcel	// Last-Modified header cache for next request
7725273562Smarcel	lastModified: {},
7726273562Smarcel	etag: {}
7727273562Smarcel
7728273562Smarcel});
7729273562Smarcel
7730273562Smarcel/* Handles responses to an ajax request:
7731273562Smarcel * - sets all responseXXX fields accordingly
7732273562Smarcel * - finds the right dataType (mediates between content-type and expected dataType)
7733273562Smarcel * - returns the corresponding response
7734273562Smarcel */
7735273562Smarcelfunction ajaxHandleResponses( s, jqXHR, responses ) {
7736273562Smarcel
7737273562Smarcel	var contents = s.contents,
7738273562Smarcel		dataTypes = s.dataTypes,
7739273562Smarcel		responseFields = s.responseFields,
7740273562Smarcel		ct,
7741273562Smarcel		type,
7742273562Smarcel		finalDataType,
7743273562Smarcel		firstDataType;
7744273562Smarcel
7745273562Smarcel	// Fill responseXXX fields
7746273562Smarcel	for ( type in responseFields ) {
7747273562Smarcel		if ( type in responses ) {
7748273562Smarcel			jqXHR[ responseFields[type] ] = responses[ type ];
7749273562Smarcel		}
7750273562Smarcel	}
7751273562Smarcel
7752273562Smarcel	// Remove auto dataType and get content-type in the process
7753273562Smarcel	while( dataTypes[ 0 ] === "*" ) {
7754273562Smarcel		dataTypes.shift();
7755273562Smarcel		if ( ct === undefined ) {
7756273562Smarcel			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
7757273562Smarcel		}
7758273562Smarcel	}
7759273562Smarcel
7760273562Smarcel	// Check if we're dealing with a known content-type
7761273562Smarcel	if ( ct ) {
7762273562Smarcel		for ( type in contents ) {
7763273562Smarcel			if ( contents[ type ] && contents[ type ].test( ct ) ) {
7764273562Smarcel				dataTypes.unshift( type );
7765273562Smarcel				break;
7766273562Smarcel			}
7767273562Smarcel		}
7768273562Smarcel	}
7769273562Smarcel
7770273562Smarcel	// Check to see if we have a response for the expected dataType
7771273562Smarcel	if ( dataTypes[ 0 ] in responses ) {
7772273562Smarcel		finalDataType = dataTypes[ 0 ];
7773273562Smarcel	} else {
7774273562Smarcel		// Try convertible dataTypes
7775273562Smarcel		for ( type in responses ) {
7776273562Smarcel			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
7777273562Smarcel				finalDataType = type;
7778273562Smarcel				break;
7779273562Smarcel			}
7780273562Smarcel			if ( !firstDataType ) {
7781273562Smarcel				firstDataType = type;
7782273562Smarcel			}
7783273562Smarcel		}
7784273562Smarcel		// Or just use first one
7785273562Smarcel		finalDataType = finalDataType || firstDataType;
7786273562Smarcel	}
7787273562Smarcel
7788273562Smarcel	// If we found a dataType
7789273562Smarcel	// We add the dataType to the list if needed
7790273562Smarcel	// and return the corresponding response
7791273562Smarcel	if ( finalDataType ) {
7792273562Smarcel		if ( finalDataType !== dataTypes[ 0 ] ) {
7793273562Smarcel			dataTypes.unshift( finalDataType );
7794273562Smarcel		}
7795273562Smarcel		return responses[ finalDataType ];
7796273562Smarcel	}
7797273562Smarcel}
7798273562Smarcel
7799273562Smarcel// Chain conversions given the request and the original response
7800273562Smarcelfunction ajaxConvert( s, response ) {
7801273562Smarcel
7802273562Smarcel	// Apply the dataFilter if provided
7803273562Smarcel	if ( s.dataFilter ) {
7804273562Smarcel		response = s.dataFilter( response, s.dataType );
7805273562Smarcel	}
7806273562Smarcel
7807273562Smarcel	var dataTypes = s.dataTypes,
7808273562Smarcel		converters = {},
7809273562Smarcel		i,
7810273562Smarcel		key,
7811273562Smarcel		length = dataTypes.length,
7812273562Smarcel		tmp,
7813273562Smarcel		// Current and previous dataTypes
7814273562Smarcel		current = dataTypes[ 0 ],
7815273562Smarcel		prev,
7816273562Smarcel		// Conversion expression
7817273562Smarcel		conversion,
7818273562Smarcel		// Conversion function
7819273562Smarcel		conv,
7820273562Smarcel		// Conversion functions (transitive conversion)
7821273562Smarcel		conv1,
7822273562Smarcel		conv2;
7823273562Smarcel
7824273562Smarcel	// For each dataType in the chain
7825273562Smarcel	for ( i = 1; i < length; i++ ) {
7826273562Smarcel
7827273562Smarcel		// Create converters map
7828273562Smarcel		// with lowercased keys
7829273562Smarcel		if ( i === 1 ) {
7830273562Smarcel			for ( key in s.converters ) {
7831273562Smarcel				if ( typeof key === "string" ) {
7832273562Smarcel					converters[ key.toLowerCase() ] = s.converters[ key ];
7833273562Smarcel				}
7834273562Smarcel			}
7835273562Smarcel		}
7836273562Smarcel
7837273562Smarcel		// Get the dataTypes
7838273562Smarcel		prev = current;
7839273562Smarcel		current = dataTypes[ i ];
7840273562Smarcel
7841273562Smarcel		// If current is auto dataType, update it to prev
7842273562Smarcel		if ( current === "*" ) {
7843273562Smarcel			current = prev;
7844273562Smarcel		// If no auto and dataTypes are actually different
7845273562Smarcel		} else if ( prev !== "*" && prev !== current ) {
7846273562Smarcel
7847273562Smarcel			// Get the converter
7848273562Smarcel			conversion = prev + " " + current;
7849273562Smarcel			conv = converters[ conversion ] || converters[ "* " + current ];
7850273562Smarcel
7851273562Smarcel			// If there is no direct converter, search transitively
7852273562Smarcel			if ( !conv ) {
7853273562Smarcel				conv2 = undefined;
7854273562Smarcel				for ( conv1 in converters ) {
7855273562Smarcel					tmp = conv1.split( " " );
7856273562Smarcel					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
7857273562Smarcel						conv2 = converters[ tmp[1] + " " + current ];
7858273562Smarcel						if ( conv2 ) {
7859273562Smarcel							conv1 = converters[ conv1 ];
7860273562Smarcel							if ( conv1 === true ) {
7861273562Smarcel								conv = conv2;
7862273562Smarcel							} else if ( conv2 === true ) {
7863273562Smarcel								conv = conv1;
7864273562Smarcel							}
7865273562Smarcel							break;
7866273562Smarcel						}
7867273562Smarcel					}
7868273562Smarcel				}
7869273562Smarcel			}
7870273562Smarcel			// If we found no converter, dispatch an error
7871273562Smarcel			if ( !( conv || conv2 ) ) {
7872273562Smarcel				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
7873273562Smarcel			}
7874273562Smarcel			// If found converter is not an equivalence
7875273562Smarcel			if ( conv !== true ) {
7876273562Smarcel				// Convert with 1 or 2 converters accordingly
7877273562Smarcel				response = conv ? conv( response ) : conv2( conv1(response) );
7878273562Smarcel			}
7879273562Smarcel		}
7880273562Smarcel	}
7881273562Smarcel	return response;
7882273562Smarcel}
7883273562Smarcel
7884273562Smarcel
7885273562Smarcel
7886273562Smarcel
7887273562Smarcelvar jsc = jQuery.now(),
7888273562Smarcel	jsre = /(\=)\?(&|$)|\?\?/i;
7889273562Smarcel
7890273562Smarcel// Default jsonp settings
7891273562SmarceljQuery.ajaxSetup({
7892273562Smarcel	jsonp: "callback",
7893273562Smarcel	jsonpCallback: function() {
7894273562Smarcel		return jQuery.expando + "_" + ( jsc++ );
7895273562Smarcel	}
7896273562Smarcel});
7897273562Smarcel
7898273562Smarcel// Detect, normalize options and install callbacks for jsonp requests
7899273562SmarceljQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
7900273562Smarcel
7901273562Smarcel	var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
7902273562Smarcel		( typeof s.data === "string" );
7903273562Smarcel
7904273562Smarcel	if ( s.dataTypes[ 0 ] === "jsonp" ||
7905273562Smarcel		s.jsonp !== false && ( jsre.test( s.url ) ||
7906273562Smarcel				inspectData && jsre.test( s.data ) ) ) {
7907273562Smarcel
7908273562Smarcel		var responseContainer,
7909273562Smarcel			jsonpCallback = s.jsonpCallback =
7910273562Smarcel				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
7911273562Smarcel			previous = window[ jsonpCallback ],
7912273562Smarcel			url = s.url,
7913273562Smarcel			data = s.data,
7914273562Smarcel			replace = "$1" + jsonpCallback + "$2";
7915273562Smarcel
7916273562Smarcel		if ( s.jsonp !== false ) {
7917273562Smarcel			url = url.replace( jsre, replace );
7918273562Smarcel			if ( s.url === url ) {
7919273562Smarcel				if ( inspectData ) {
7920273562Smarcel					data = data.replace( jsre, replace );
7921273562Smarcel				}
7922273562Smarcel				if ( s.data === data ) {
7923273562Smarcel					// Add callback manually
7924273562Smarcel					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
7925273562Smarcel				}
7926273562Smarcel			}
7927273562Smarcel		}
7928273562Smarcel
7929273562Smarcel		s.url = url;
7930273562Smarcel		s.data = data;
7931273562Smarcel
7932273562Smarcel		// Install callback
7933273562Smarcel		window[ jsonpCallback ] = function( response ) {
7934273562Smarcel			responseContainer = [ response ];
7935273562Smarcel		};
7936273562Smarcel
7937273562Smarcel		// Clean-up function
7938273562Smarcel		jqXHR.always(function() {
7939273562Smarcel			// Set callback back to previous value
7940273562Smarcel			window[ jsonpCallback ] = previous;
7941273562Smarcel			// Call if it was a function and we have a response
7942273562Smarcel			if ( responseContainer && jQuery.isFunction( previous ) ) {
7943273562Smarcel				window[ jsonpCallback ]( responseContainer[ 0 ] );
7944273562Smarcel			}
7945273562Smarcel		});
7946273562Smarcel
7947273562Smarcel		// Use data converter to retrieve json after script execution
7948273562Smarcel		s.converters["script json"] = function() {
7949273562Smarcel			if ( !responseContainer ) {
7950273562Smarcel				jQuery.error( jsonpCallback + " was not called" );
7951273562Smarcel			}
7952273562Smarcel			return responseContainer[ 0 ];
7953273562Smarcel		};
7954273562Smarcel
7955273562Smarcel		// force json dataType
7956273562Smarcel		s.dataTypes[ 0 ] = "json";
7957273562Smarcel
7958273562Smarcel		// Delegate to script
7959273562Smarcel		return "script";
7960273562Smarcel	}
7961273562Smarcel});
7962273562Smarcel
7963273562Smarcel
7964273562Smarcel
7965273562Smarcel
7966273562Smarcel// Install script dataType
7967273562SmarceljQuery.ajaxSetup({
7968273562Smarcel	accepts: {
7969273562Smarcel		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
7970273562Smarcel	},
7971273562Smarcel	contents: {
7972273562Smarcel		script: /javascript|ecmascript/
7973273562Smarcel	},
7974273562Smarcel	converters: {
7975273562Smarcel		"text script": function( text ) {
7976273562Smarcel			jQuery.globalEval( text );
7977273562Smarcel			return text;
7978273562Smarcel		}
7979273562Smarcel	}
7980273562Smarcel});
7981273562Smarcel
7982273562Smarcel// Handle cache's special case and global
7983273562SmarceljQuery.ajaxPrefilter( "script", function( s ) {
7984273562Smarcel	if ( s.cache === undefined ) {
7985273562Smarcel		s.cache = false;
7986273562Smarcel	}
7987273562Smarcel	if ( s.crossDomain ) {
7988273562Smarcel		s.type = "GET";
7989273562Smarcel		s.global = false;
7990273562Smarcel	}
7991273562Smarcel});
7992273562Smarcel
7993273562Smarcel// Bind script tag hack transport
7994273562SmarceljQuery.ajaxTransport( "script", function(s) {
7995273562Smarcel
7996273562Smarcel	// This transport only deals with cross domain requests
7997273562Smarcel	if ( s.crossDomain ) {
7998273562Smarcel
7999273562Smarcel		var script,
8000273562Smarcel			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
8001273562Smarcel
8002273562Smarcel		return {
8003273562Smarcel
8004273562Smarcel			send: function( _, callback ) {
8005273562Smarcel
8006273562Smarcel				script = document.createElement( "script" );
8007273562Smarcel
8008273562Smarcel				script.async = "async";
8009273562Smarcel
8010273562Smarcel				if ( s.scriptCharset ) {
8011273562Smarcel					script.charset = s.scriptCharset;
8012273562Smarcel				}
8013273562Smarcel
8014273562Smarcel				script.src = s.url;
8015273562Smarcel
8016273562Smarcel				// Attach handlers for all browsers
8017273562Smarcel				script.onload = script.onreadystatechange = function( _, isAbort ) {
8018273562Smarcel
8019273562Smarcel					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
8020273562Smarcel
8021273562Smarcel						// Handle memory leak in IE
8022273562Smarcel						script.onload = script.onreadystatechange = null;
8023273562Smarcel
8024273562Smarcel						// Remove the script
8025273562Smarcel						if ( head && script.parentNode ) {
8026273562Smarcel							head.removeChild( script );
8027273562Smarcel						}
8028273562Smarcel
8029273562Smarcel						// Dereference the script
8030273562Smarcel						script = undefined;
8031273562Smarcel
8032273562Smarcel						// Callback if not abort
8033273562Smarcel						if ( !isAbort ) {
8034273562Smarcel							callback( 200, "success" );
8035273562Smarcel						}
8036273562Smarcel					}
8037273562Smarcel				};
8038273562Smarcel				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
8039273562Smarcel				// This arises when a base node is used (#2709 and #4378).
8040273562Smarcel				head.insertBefore( script, head.firstChild );
8041273562Smarcel			},
8042273562Smarcel
8043273562Smarcel			abort: function() {
8044273562Smarcel				if ( script ) {
8045273562Smarcel					script.onload( 0, 1 );
8046273562Smarcel				}
8047273562Smarcel			}
8048273562Smarcel		};
8049273562Smarcel	}
8050273562Smarcel});
8051273562Smarcel
8052273562Smarcel
8053273562Smarcel
8054273562Smarcel
8055273562Smarcelvar // #5280: Internet Explorer will keep connections alive if we don't abort on unload
8056273562Smarcel	xhrOnUnloadAbort = window.ActiveXObject ? function() {
8057273562Smarcel		// Abort all pending requests
8058273562Smarcel		for ( var key in xhrCallbacks ) {
8059273562Smarcel			xhrCallbacks[ key ]( 0, 1 );
8060273562Smarcel		}
8061273562Smarcel	} : false,
8062273562Smarcel	xhrId = 0,
8063273562Smarcel	xhrCallbacks;
8064273562Smarcel
8065273562Smarcel// Functions to create xhrs
8066273562Smarcelfunction createStandardXHR() {
8067273562Smarcel	try {
8068273562Smarcel		return new window.XMLHttpRequest();
8069273562Smarcel	} catch( e ) {}
8070273562Smarcel}
8071273562Smarcel
8072273562Smarcelfunction createActiveXHR() {
8073273562Smarcel	try {
8074273562Smarcel		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
8075273562Smarcel	} catch( e ) {}
8076273562Smarcel}
8077273562Smarcel
8078273562Smarcel// Create the request object
8079273562Smarcel// (This is still attached to ajaxSettings for backward compatibility)
8080273562SmarceljQuery.ajaxSettings.xhr = window.ActiveXObject ?
8081273562Smarcel	/* Microsoft failed to properly
8082273562Smarcel	 * implement the XMLHttpRequest in IE7 (can't request local files),
8083273562Smarcel	 * so we use the ActiveXObject when it is available
8084273562Smarcel	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
8085273562Smarcel	 * we need a fallback.
8086273562Smarcel	 */
8087273562Smarcel	function() {
8088273562Smarcel		return !this.isLocal && createStandardXHR() || createActiveXHR();
8089273562Smarcel	} :
8090273562Smarcel	// For all other browsers, use the standard XMLHttpRequest object
8091273562Smarcel	createStandardXHR;
8092273562Smarcel
8093273562Smarcel// Determine support properties
8094273562Smarcel(function( xhr ) {
8095273562Smarcel	jQuery.extend( jQuery.support, {
8096273562Smarcel		ajax: !!xhr,
8097273562Smarcel		cors: !!xhr && ( "withCredentials" in xhr )
8098273562Smarcel	});
8099273562Smarcel})( jQuery.ajaxSettings.xhr() );
8100273562Smarcel
8101273562Smarcel// Create transport if the browser can provide an xhr
8102273562Smarcelif ( jQuery.support.ajax ) {
8103273562Smarcel
8104273562Smarcel	jQuery.ajaxTransport(function( s ) {
8105273562Smarcel		// Cross domain only allowed if supported through XMLHttpRequest
8106273562Smarcel		if ( !s.crossDomain || jQuery.support.cors ) {
8107273562Smarcel
8108273562Smarcel			var callback;
8109273562Smarcel
8110273562Smarcel			return {
8111273562Smarcel				send: function( headers, complete ) {
8112273562Smarcel
8113273562Smarcel					// Get a new xhr
8114273562Smarcel					var xhr = s.xhr(),
8115273562Smarcel						handle,
8116273562Smarcel						i;
8117273562Smarcel
8118273562Smarcel					// Open the socket
8119273562Smarcel					// Passing null username, generates a login popup on Opera (#2865)
8120273562Smarcel					if ( s.username ) {
8121273562Smarcel						xhr.open( s.type, s.url, s.async, s.username, s.password );
8122273562Smarcel					} else {
8123273562Smarcel						xhr.open( s.type, s.url, s.async );
8124273562Smarcel					}
8125273562Smarcel
8126273562Smarcel					// Apply custom fields if provided
8127273562Smarcel					if ( s.xhrFields ) {
8128273562Smarcel						for ( i in s.xhrFields ) {
8129273562Smarcel							xhr[ i ] = s.xhrFields[ i ];
8130273562Smarcel						}
8131273562Smarcel					}
8132273562Smarcel
8133273562Smarcel					// Override mime type if needed
8134273562Smarcel					if ( s.mimeType && xhr.overrideMimeType ) {
8135273562Smarcel						xhr.overrideMimeType( s.mimeType );
8136273562Smarcel					}
8137273562Smarcel
8138273562Smarcel					// X-Requested-With header
8139273562Smarcel					// For cross-domain requests, seeing as conditions for a preflight are
8140273562Smarcel					// akin to a jigsaw puzzle, we simply never set it to be sure.
8141273562Smarcel					// (it can always be set on a per-request basis or even using ajaxSetup)
8142273562Smarcel					// For same-domain requests, won't change header if already provided.
8143273562Smarcel					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
8144273562Smarcel						headers[ "X-Requested-With" ] = "XMLHttpRequest";
8145273562Smarcel					}
8146273562Smarcel
8147273562Smarcel					// Need an extra try/catch for cross domain requests in Firefox 3
8148273562Smarcel					try {
8149273562Smarcel						for ( i in headers ) {
8150273562Smarcel							xhr.setRequestHeader( i, headers[ i ] );
8151273562Smarcel						}
8152273562Smarcel					} catch( _ ) {}
8153273562Smarcel
8154273562Smarcel					// Do send the request
8155273562Smarcel					// This may raise an exception which is actually
8156273562Smarcel					// handled in jQuery.ajax (so no try/catch here)
8157273562Smarcel					xhr.send( ( s.hasContent && s.data ) || null );
8158273562Smarcel
8159273562Smarcel					// Listener
8160273562Smarcel					callback = function( _, isAbort ) {
8161273562Smarcel
8162273562Smarcel						var status,
8163273562Smarcel							statusText,
8164273562Smarcel							responseHeaders,
8165273562Smarcel							responses,
8166273562Smarcel							xml;
8167273562Smarcel
8168273562Smarcel						// Firefox throws exceptions when accessing properties
8169273562Smarcel						// of an xhr when a network error occured
8170273562Smarcel						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
8171273562Smarcel						try {
8172273562Smarcel
8173273562Smarcel							// Was never called and is aborted or complete
8174273562Smarcel							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
8175273562Smarcel
8176273562Smarcel								// Only called once
8177273562Smarcel								callback = undefined;
8178273562Smarcel
8179273562Smarcel								// Do not keep as active anymore
8180273562Smarcel								if ( handle ) {
8181273562Smarcel									xhr.onreadystatechange = jQuery.noop;
8182273562Smarcel									if ( xhrOnUnloadAbort ) {
8183273562Smarcel										delete xhrCallbacks[ handle ];
8184273562Smarcel									}
8185273562Smarcel								}
8186273562Smarcel
8187273562Smarcel								// If it's an abort
8188273562Smarcel								if ( isAbort ) {
8189273562Smarcel									// Abort it manually if needed
8190273562Smarcel									if ( xhr.readyState !== 4 ) {
8191273562Smarcel										xhr.abort();
8192273562Smarcel									}
8193273562Smarcel								} else {
8194273562Smarcel									status = xhr.status;
8195273562Smarcel									responseHeaders = xhr.getAllResponseHeaders();
8196273562Smarcel									responses = {};
8197273562Smarcel									xml = xhr.responseXML;
8198273562Smarcel
8199273562Smarcel									// Construct response list
8200273562Smarcel									if ( xml && xml.documentElement /* #4958 */ ) {
8201273562Smarcel										responses.xml = xml;
8202273562Smarcel									}
8203273562Smarcel									responses.text = xhr.responseText;
8204273562Smarcel
8205273562Smarcel									// Firefox throws an exception when accessing
8206273562Smarcel									// statusText for faulty cross-domain requests
8207273562Smarcel									try {
8208273562Smarcel										statusText = xhr.statusText;
8209273562Smarcel									} catch( e ) {
8210273562Smarcel										// We normalize with Webkit giving an empty statusText
8211273562Smarcel										statusText = "";
8212273562Smarcel									}
8213273562Smarcel
8214273562Smarcel									// Filter status for non standard behaviors
8215273562Smarcel
8216273562Smarcel									// If the request is local and we have data: assume a success
8217273562Smarcel									// (success with no data won't get notified, that's the best we
8218273562Smarcel									// can do given current implementations)
8219273562Smarcel									if ( !status && s.isLocal && !s.crossDomain ) {
8220273562Smarcel										status = responses.text ? 200 : 404;
8221273562Smarcel									// IE - #1450: sometimes returns 1223 when it should be 204
8222273562Smarcel									} else if ( status === 1223 ) {
8223273562Smarcel										status = 204;
8224273562Smarcel									}
8225273562Smarcel								}
8226273562Smarcel							}
8227273562Smarcel						} catch( firefoxAccessException ) {
8228273562Smarcel							if ( !isAbort ) {
8229273562Smarcel								complete( -1, firefoxAccessException );
8230273562Smarcel							}
8231273562Smarcel						}
8232273562Smarcel
8233273562Smarcel						// Call complete if needed
8234273562Smarcel						if ( responses ) {
8235273562Smarcel							complete( status, statusText, responses, responseHeaders );
8236273562Smarcel						}
8237273562Smarcel					};
8238273562Smarcel
8239273562Smarcel					// if we're in sync mode or it's in cache
8240273562Smarcel					// and has been retrieved directly (IE6 & IE7)
8241273562Smarcel					// we need to manually fire the callback
8242273562Smarcel					if ( !s.async || xhr.readyState === 4 ) {
8243273562Smarcel						callback();
8244273562Smarcel					} else {
8245273562Smarcel						handle = ++xhrId;
8246273562Smarcel						if ( xhrOnUnloadAbort ) {
8247273562Smarcel							// Create the active xhrs callbacks list if needed
8248273562Smarcel							// and attach the unload handler
8249273562Smarcel							if ( !xhrCallbacks ) {
8250273562Smarcel								xhrCallbacks = {};
8251273562Smarcel								jQuery( window ).unload( xhrOnUnloadAbort );
8252273562Smarcel							}
8253273562Smarcel							// Add to list of active xhrs callbacks
8254273562Smarcel							xhrCallbacks[ handle ] = callback;
8255273562Smarcel						}
8256273562Smarcel						xhr.onreadystatechange = callback;
8257273562Smarcel					}
8258273562Smarcel				},
8259273562Smarcel
8260273562Smarcel				abort: function() {
8261273562Smarcel					if ( callback ) {
8262273562Smarcel						callback(0,1);
8263273562Smarcel					}
8264273562Smarcel				}
8265273562Smarcel			};
8266273562Smarcel		}
8267273562Smarcel	});
8268273562Smarcel}
8269273562Smarcel
8270273562Smarcel
8271273562Smarcel
8272273562Smarcel
8273273562Smarcelvar elemdisplay = {},
8274273562Smarcel	iframe, iframeDoc,
8275273562Smarcel	rfxtypes = /^(?:toggle|show|hide)$/,
8276273562Smarcel	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
8277273562Smarcel	timerId,
8278273562Smarcel	fxAttrs = [
8279273562Smarcel		// height animations
8280273562Smarcel		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
8281273562Smarcel		// width animations
8282273562Smarcel		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
8283273562Smarcel		// opacity animations
8284273562Smarcel		[ "opacity" ]
8285273562Smarcel	],
8286273562Smarcel	fxNow;
8287273562Smarcel
8288273562SmarceljQuery.fn.extend({
8289273562Smarcel	show: function( speed, easing, callback ) {
8290273562Smarcel		var elem, display;
8291273562Smarcel
8292273562Smarcel		if ( speed || speed === 0 ) {
8293273562Smarcel			return this.animate( genFx("show", 3), speed, easing, callback );
8294273562Smarcel
8295273562Smarcel		} else {
8296273562Smarcel			for ( var i = 0, j = this.length; i < j; i++ ) {
8297273562Smarcel				elem = this[ i ];
8298273562Smarcel
8299273562Smarcel				if ( elem.style ) {
8300273562Smarcel					display = elem.style.display;
8301273562Smarcel
8302273562Smarcel					// Reset the inline display of this element to learn if it is
8303273562Smarcel					// being hidden by cascaded rules or not
8304273562Smarcel					if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
8305273562Smarcel						display = elem.style.display = "";
8306273562Smarcel					}
8307273562Smarcel
8308273562Smarcel					// Set elements which have been overridden with display: none
8309273562Smarcel					// in a stylesheet to whatever the default browser style is
8310273562Smarcel					// for such an element
8311273562Smarcel					if ( display === "" && jQuery.css(elem, "display") === "none" ) {
8312273562Smarcel						jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
8313273562Smarcel					}
8314273562Smarcel				}
8315273562Smarcel			}
8316273562Smarcel
8317273562Smarcel			// Set the display of most of the elements in a second loop
8318273562Smarcel			// to avoid the constant reflow
8319273562Smarcel			for ( i = 0; i < j; i++ ) {
8320273562Smarcel				elem = this[ i ];
8321273562Smarcel
8322273562Smarcel				if ( elem.style ) {
8323273562Smarcel					display = elem.style.display;
8324273562Smarcel
8325273562Smarcel					if ( display === "" || display === "none" ) {
8326273562Smarcel						elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
8327273562Smarcel					}
8328273562Smarcel				}
8329273562Smarcel			}
8330273562Smarcel
8331273562Smarcel			return this;
8332273562Smarcel		}
8333273562Smarcel	},
8334273562Smarcel
8335273562Smarcel	hide: function( speed, easing, callback ) {
8336273562Smarcel		if ( speed || speed === 0 ) {
8337273562Smarcel			return this.animate( genFx("hide", 3), speed, easing, callback);
8338273562Smarcel
8339273562Smarcel		} else {
8340273562Smarcel			var elem, display,
8341273562Smarcel				i = 0,
8342273562Smarcel				j = this.length;
8343273562Smarcel
8344273562Smarcel			for ( ; i < j; i++ ) {
8345273562Smarcel				elem = this[i];
8346273562Smarcel				if ( elem.style ) {
8347273562Smarcel					display = jQuery.css( elem, "display" );
8348273562Smarcel
8349273562Smarcel					if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
8350273562Smarcel						jQuery._data( elem, "olddisplay", display );
8351273562Smarcel					}
8352273562Smarcel				}
8353273562Smarcel			}
8354273562Smarcel
8355273562Smarcel			// Set the display of the elements in a second loop
8356273562Smarcel			// to avoid the constant reflow
8357273562Smarcel			for ( i = 0; i < j; i++ ) {
8358273562Smarcel				if ( this[i].style ) {
8359273562Smarcel					this[i].style.display = "none";
8360273562Smarcel				}
8361273562Smarcel			}
8362273562Smarcel
8363273562Smarcel			return this;
8364273562Smarcel		}
8365273562Smarcel	},
8366273562Smarcel
8367273562Smarcel	// Save the old toggle function
8368273562Smarcel	_toggle: jQuery.fn.toggle,
8369273562Smarcel
8370273562Smarcel	toggle: function( fn, fn2, callback ) {
8371273562Smarcel		var bool = typeof fn === "boolean";
8372273562Smarcel
8373273562Smarcel		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
8374273562Smarcel			this._toggle.apply( this, arguments );
8375273562Smarcel
8376273562Smarcel		} else if ( fn == null || bool ) {
8377273562Smarcel			this.each(function() {
8378273562Smarcel				var state = bool ? fn : jQuery(this).is(":hidden");
8379273562Smarcel				jQuery(this)[ state ? "show" : "hide" ]();
8380273562Smarcel			});
8381273562Smarcel
8382273562Smarcel		} else {
8383273562Smarcel			this.animate(genFx("toggle", 3), fn, fn2, callback);
8384273562Smarcel		}
8385273562Smarcel
8386273562Smarcel		return this;
8387273562Smarcel	},
8388273562Smarcel
8389273562Smarcel	fadeTo: function( speed, to, easing, callback ) {
8390273562Smarcel		return this.filter(":hidden").css("opacity", 0).show().end()
8391273562Smarcel					.animate({opacity: to}, speed, easing, callback);
8392273562Smarcel	},
8393273562Smarcel
8394273562Smarcel	animate: function( prop, speed, easing, callback ) {
8395273562Smarcel		var optall = jQuery.speed( speed, easing, callback );
8396273562Smarcel
8397273562Smarcel		if ( jQuery.isEmptyObject( prop ) ) {
8398273562Smarcel			return this.each( optall.complete, [ false ] );
8399273562Smarcel		}
8400273562Smarcel
8401273562Smarcel		// Do not change referenced properties as per-property easing will be lost
8402273562Smarcel		prop = jQuery.extend( {}, prop );
8403273562Smarcel
8404273562Smarcel		function doAnimation() {
8405273562Smarcel			// XXX 'this' does not always have a nodeName when running the
8406273562Smarcel			// test suite
8407273562Smarcel
8408273562Smarcel			if ( optall.queue === false ) {
8409273562Smarcel				jQuery._mark( this );
8410273562Smarcel			}
8411273562Smarcel
8412273562Smarcel			var opt = jQuery.extend( {}, optall ),
8413273562Smarcel				isElement = this.nodeType === 1,
8414273562Smarcel				hidden = isElement && jQuery(this).is(":hidden"),
8415273562Smarcel				name, val, p, e,
8416273562Smarcel				parts, start, end, unit,
8417273562Smarcel				method;
8418273562Smarcel
8419273562Smarcel			// will store per property easing and be used to determine when an animation is complete
8420273562Smarcel			opt.animatedProperties = {};
8421273562Smarcel
8422273562Smarcel			for ( p in prop ) {
8423273562Smarcel
8424273562Smarcel				// property name normalization
8425273562Smarcel				name = jQuery.camelCase( p );
8426273562Smarcel				if ( p !== name ) {
8427273562Smarcel					prop[ name ] = prop[ p ];
8428273562Smarcel					delete prop[ p ];
8429273562Smarcel				}
8430273562Smarcel
8431273562Smarcel				val = prop[ name ];
8432273562Smarcel
8433273562Smarcel				// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
8434273562Smarcel				if ( jQuery.isArray( val ) ) {
8435273562Smarcel					opt.animatedProperties[ name ] = val[ 1 ];
8436273562Smarcel					val = prop[ name ] = val[ 0 ];
8437273562Smarcel				} else {
8438273562Smarcel					opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
8439273562Smarcel				}
8440273562Smarcel
8441273562Smarcel				if ( val === "hide" && hidden || val === "show" && !hidden ) {
8442273562Smarcel					return opt.complete.call( this );
8443273562Smarcel				}
8444273562Smarcel
8445273562Smarcel				if ( isElement && ( name === "height" || name === "width" ) ) {
8446273562Smarcel					// Make sure that nothing sneaks out
8447273562Smarcel					// Record all 3 overflow attributes because IE does not
8448273562Smarcel					// change the overflow attribute when overflowX and
8449273562Smarcel					// overflowY are set to the same value
8450273562Smarcel					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
8451273562Smarcel
8452273562Smarcel					// Set display property to inline-block for height/width
8453273562Smarcel					// animations on inline elements that are having width/height animated
8454273562Smarcel					if ( jQuery.css( this, "display" ) === "inline" &&
8455273562Smarcel							jQuery.css( this, "float" ) === "none" ) {
8456273562Smarcel
8457273562Smarcel						// inline-level elements accept inline-block;
8458273562Smarcel						// block-level elements need to be inline with layout
8459273562Smarcel						if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
8460273562Smarcel							this.style.display = "inline-block";
8461273562Smarcel
8462273562Smarcel						} else {
8463273562Smarcel							this.style.zoom = 1;
8464273562Smarcel						}
8465273562Smarcel					}
8466273562Smarcel				}
8467273562Smarcel			}
8468273562Smarcel
8469273562Smarcel			if ( opt.overflow != null ) {
8470273562Smarcel				this.style.overflow = "hidden";
8471273562Smarcel			}
8472273562Smarcel
8473273562Smarcel			for ( p in prop ) {
8474273562Smarcel				e = new jQuery.fx( this, opt, p );
8475273562Smarcel				val = prop[ p ];
8476273562Smarcel
8477273562Smarcel				if ( rfxtypes.test( val ) ) {
8478273562Smarcel
8479273562Smarcel					// Tracks whether to show or hide based on private
8480273562Smarcel					// data attached to the element
8481273562Smarcel					method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
8482273562Smarcel					if ( method ) {
8483273562Smarcel						jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
8484273562Smarcel						e[ method ]();
8485273562Smarcel					} else {
8486273562Smarcel						e[ val ]();
8487273562Smarcel					}
8488273562Smarcel
8489273562Smarcel				} else {
8490273562Smarcel					parts = rfxnum.exec( val );
8491273562Smarcel					start = e.cur();
8492273562Smarcel
8493273562Smarcel					if ( parts ) {
8494273562Smarcel						end = parseFloat( parts[2] );
8495273562Smarcel						unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
8496273562Smarcel
8497273562Smarcel						// We need to compute starting value
8498273562Smarcel						if ( unit !== "px" ) {
8499273562Smarcel							jQuery.style( this, p, (end || 1) + unit);
8500273562Smarcel							start = ( (end || 1) / e.cur() ) * start;
8501273562Smarcel							jQuery.style( this, p, start + unit);
8502273562Smarcel						}
8503273562Smarcel
8504273562Smarcel						// If a +=/-= token was provided, we're doing a relative animation
8505273562Smarcel						if ( parts[1] ) {
8506273562Smarcel							end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
8507273562Smarcel						}
8508273562Smarcel
8509273562Smarcel						e.custom( start, end, unit );
8510273562Smarcel
8511273562Smarcel					} else {
8512273562Smarcel						e.custom( start, val, "" );
8513273562Smarcel					}
8514273562Smarcel				}
8515273562Smarcel			}
8516273562Smarcel
8517273562Smarcel			// For JS strict compliance
8518273562Smarcel			return true;
8519273562Smarcel		}
8520273562Smarcel
8521273562Smarcel		return optall.queue === false ?
8522273562Smarcel			this.each( doAnimation ) :
8523273562Smarcel			this.queue( optall.queue, doAnimation );
8524273562Smarcel	},
8525273562Smarcel
8526273562Smarcel	stop: function( type, clearQueue, gotoEnd ) {
8527273562Smarcel		if ( typeof type !== "string" ) {
8528273562Smarcel			gotoEnd = clearQueue;
8529273562Smarcel			clearQueue = type;
8530273562Smarcel			type = undefined;
8531273562Smarcel		}
8532273562Smarcel		if ( clearQueue && type !== false ) {
8533273562Smarcel			this.queue( type || "fx", [] );
8534273562Smarcel		}
8535273562Smarcel
8536273562Smarcel		return this.each(function() {
8537273562Smarcel			var i,
8538273562Smarcel				hadTimers = false,
8539273562Smarcel				timers = jQuery.timers,
8540273562Smarcel				data = jQuery._data( this );
8541273562Smarcel
8542273562Smarcel			// clear marker counters if we know they won't be
8543273562Smarcel			if ( !gotoEnd ) {
8544273562Smarcel				jQuery._unmark( true, this );
8545273562Smarcel			}
8546273562Smarcel
8547273562Smarcel			function stopQueue( elem, data, i ) {
8548273562Smarcel				var hooks = data[ i ];
8549273562Smarcel				jQuery.removeData( elem, i, true );
8550273562Smarcel				hooks.stop( gotoEnd );
8551273562Smarcel			}
8552273562Smarcel
8553273562Smarcel			if ( type == null ) {
8554273562Smarcel				for ( i in data ) {
8555273562Smarcel					if ( data[ i ].stop && i.indexOf(".run") === i.length - 4 ) {
8556273562Smarcel						stopQueue( this, data, i );
8557273562Smarcel					}
8558273562Smarcel				}
8559273562Smarcel			} else if ( data[ i = type + ".run" ] && data[ i ].stop ){
8560273562Smarcel				stopQueue( this, data, i );
8561273562Smarcel			}
8562273562Smarcel
8563273562Smarcel			for ( i = timers.length; i--; ) {
8564273562Smarcel				if ( timers[ i ].elem === this && (type == null || timers[ i ].queue === type) ) {
8565273562Smarcel					if ( gotoEnd ) {
8566273562Smarcel
8567273562Smarcel						// force the next step to be the last
8568273562Smarcel						timers[ i ]( true );
8569273562Smarcel					} else {
8570273562Smarcel						timers[ i ].saveState();
8571273562Smarcel					}
8572273562Smarcel					hadTimers = true;
8573273562Smarcel					timers.splice( i, 1 );
8574273562Smarcel				}
8575273562Smarcel			}
8576273562Smarcel
8577273562Smarcel			// start the next in the queue if the last step wasn't forced
8578273562Smarcel			// timers currently will call their complete callbacks, which will dequeue
8579273562Smarcel			// but only if they were gotoEnd
8580273562Smarcel			if ( !( gotoEnd && hadTimers ) ) {
8581273562Smarcel				jQuery.dequeue( this, type );
8582273562Smarcel			}
8583273562Smarcel		});
8584273562Smarcel	}
8585273562Smarcel
8586273562Smarcel});
8587273562Smarcel
8588273562Smarcel// Animations created synchronously will run synchronously
8589273562Smarcelfunction createFxNow() {
8590273562Smarcel	setTimeout( clearFxNow, 0 );
8591273562Smarcel	return ( fxNow = jQuery.now() );
8592273562Smarcel}
8593273562Smarcel
8594273562Smarcelfunction clearFxNow() {
8595273562Smarcel	fxNow = undefined;
8596273562Smarcel}
8597273562Smarcel
8598273562Smarcel// Generate parameters to create a standard animation
8599273562Smarcelfunction genFx( type, num ) {
8600273562Smarcel	var obj = {};
8601273562Smarcel
8602273562Smarcel	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
8603273562Smarcel		obj[ this ] = type;
8604273562Smarcel	});
8605273562Smarcel
8606273562Smarcel	return obj;
8607273562Smarcel}
8608273562Smarcel
8609273562Smarcel// Generate shortcuts for custom animations
8610273562SmarceljQuery.each({
8611273562Smarcel	slideDown: genFx( "show", 1 ),
8612273562Smarcel	slideUp: genFx( "hide", 1 ),
8613273562Smarcel	slideToggle: genFx( "toggle", 1 ),
8614273562Smarcel	fadeIn: { opacity: "show" },
8615273562Smarcel	fadeOut: { opacity: "hide" },
8616273562Smarcel	fadeToggle: { opacity: "toggle" }
8617273562Smarcel}, function( name, props ) {
8618273562Smarcel	jQuery.fn[ name ] = function( speed, easing, callback ) {
8619273562Smarcel		return this.animate( props, speed, easing, callback );
8620273562Smarcel	};
8621273562Smarcel});
8622273562Smarcel
8623273562SmarceljQuery.extend({
8624273562Smarcel	speed: function( speed, easing, fn ) {
8625273562Smarcel		var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
8626273562Smarcel			complete: fn || !fn && easing ||
8627273562Smarcel				jQuery.isFunction( speed ) && speed,
8628273562Smarcel			duration: speed,
8629273562Smarcel			easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
8630273562Smarcel		};
8631273562Smarcel
8632273562Smarcel		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
8633273562Smarcel			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
8634273562Smarcel
8635273562Smarcel		// normalize opt.queue - true/undefined/null -> "fx"
8636273562Smarcel		if ( opt.queue == null || opt.queue === true ) {
8637273562Smarcel			opt.queue = "fx";
8638273562Smarcel		}
8639273562Smarcel
8640273562Smarcel		// Queueing
8641273562Smarcel		opt.old = opt.complete;
8642273562Smarcel
8643273562Smarcel		opt.complete = function( noUnmark ) {
8644273562Smarcel			if ( jQuery.isFunction( opt.old ) ) {
8645273562Smarcel				opt.old.call( this );
8646273562Smarcel			}
8647273562Smarcel
8648273562Smarcel			if ( opt.queue ) {
8649273562Smarcel				jQuery.dequeue( this, opt.queue );
8650273562Smarcel			} else if ( noUnmark !== false ) {
8651273562Smarcel				jQuery._unmark( this );
8652273562Smarcel			}
8653273562Smarcel		};
8654273562Smarcel
8655273562Smarcel		return opt;
8656273562Smarcel	},
8657273562Smarcel
8658273562Smarcel	easing: {
8659273562Smarcel		linear: function( p, n, firstNum, diff ) {
8660273562Smarcel			return firstNum + diff * p;
8661273562Smarcel		},
8662273562Smarcel		swing: function( p, n, firstNum, diff ) {
8663273562Smarcel			return ( ( -Math.cos( p*Math.PI ) / 2 ) + 0.5 ) * diff + firstNum;
8664273562Smarcel		}
8665273562Smarcel	},
8666273562Smarcel
8667273562Smarcel	timers: [],
8668273562Smarcel
8669273562Smarcel	fx: function( elem, options, prop ) {
8670273562Smarcel		this.options = options;
8671273562Smarcel		this.elem = elem;
8672273562Smarcel		this.prop = prop;
8673273562Smarcel
8674273562Smarcel		options.orig = options.orig || {};
8675273562Smarcel	}
8676273562Smarcel
8677273562Smarcel});
8678273562Smarcel
8679273562SmarceljQuery.fx.prototype = {
8680273562Smarcel	// Simple function for setting a style value
8681273562Smarcel	update: function() {
8682273562Smarcel		if ( this.options.step ) {
8683273562Smarcel			this.options.step.call( this.elem, this.now, this );
8684273562Smarcel		}
8685273562Smarcel
8686273562Smarcel		( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
8687273562Smarcel	},
8688273562Smarcel
8689273562Smarcel	// Get the current size
8690273562Smarcel	cur: function() {
8691273562Smarcel		if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
8692273562Smarcel			return this.elem[ this.prop ];
8693273562Smarcel		}
8694273562Smarcel
8695273562Smarcel		var parsed,
8696273562Smarcel			r = jQuery.css( this.elem, this.prop );
8697273562Smarcel		// Empty strings, null, undefined and "auto" are converted to 0,
8698273562Smarcel		// complex values such as "rotate(1rad)" are returned as is,
8699273562Smarcel		// simple values such as "10px" are parsed to Float.
8700273562Smarcel		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
8701273562Smarcel	},
8702273562Smarcel
8703273562Smarcel	// Start an animation from one number to another
8704273562Smarcel	custom: function( from, to, unit ) {
8705273562Smarcel		var self = this,
8706273562Smarcel			fx = jQuery.fx;
8707273562Smarcel
8708273562Smarcel		this.startTime = fxNow || createFxNow();
8709273562Smarcel		this.end = to;
8710273562Smarcel		this.now = this.start = from;
8711273562Smarcel		this.pos = this.state = 0;
8712273562Smarcel		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
8713273562Smarcel
8714273562Smarcel		function t( gotoEnd ) {
8715273562Smarcel			return self.step( gotoEnd );
8716273562Smarcel		}
8717273562Smarcel
8718273562Smarcel		t.queue = this.options.queue;
8719273562Smarcel		t.elem = this.elem;
8720273562Smarcel		t.saveState = function() {
8721273562Smarcel			if ( self.options.hide && jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
8722273562Smarcel				jQuery._data( self.elem, "fxshow" + self.prop, self.start );
8723273562Smarcel			}
8724273562Smarcel		};
8725273562Smarcel
8726273562Smarcel		if ( t() && jQuery.timers.push(t) && !timerId ) {
8727273562Smarcel			timerId = setInterval( fx.tick, fx.interval );
8728273562Smarcel		}
8729273562Smarcel	},
8730273562Smarcel
8731273562Smarcel	// Simple 'show' function
8732273562Smarcel	show: function() {
8733273562Smarcel		var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
8734273562Smarcel
8735273562Smarcel		// Remember where we started, so that we can go back to it later
8736273562Smarcel		this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
8737273562Smarcel		this.options.show = true;
8738273562Smarcel
8739273562Smarcel		// Begin the animation
8740273562Smarcel		// Make sure that we start at a small width/height to avoid any flash of content
8741273562Smarcel		if ( dataShow !== undefined ) {
8742273562Smarcel			// This show is picking up where a previous hide or show left off
8743273562Smarcel			this.custom( this.cur(), dataShow );
8744273562Smarcel		} else {
8745273562Smarcel			this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
8746273562Smarcel		}
8747273562Smarcel
8748273562Smarcel		// Start by showing the element
8749273562Smarcel		jQuery( this.elem ).show();
8750273562Smarcel	},
8751273562Smarcel
8752273562Smarcel	// Simple 'hide' function
8753273562Smarcel	hide: function() {
8754273562Smarcel		// Remember where we started, so that we can go back to it later
8755273562Smarcel		this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
8756273562Smarcel		this.options.hide = true;
8757273562Smarcel
8758273562Smarcel		// Begin the animation
8759273562Smarcel		this.custom( this.cur(), 0 );
8760273562Smarcel	},
8761273562Smarcel
8762273562Smarcel	// Each step of an animation
8763273562Smarcel	step: function( gotoEnd ) {
8764273562Smarcel		var p, n, complete,
8765273562Smarcel			t = fxNow || createFxNow(),
8766273562Smarcel			done = true,
8767273562Smarcel			elem = this.elem,
8768273562Smarcel			options = this.options;
8769273562Smarcel
8770273562Smarcel		if ( gotoEnd || t >= options.duration + this.startTime ) {
8771273562Smarcel			this.now = this.end;
8772273562Smarcel			this.pos = this.state = 1;
8773273562Smarcel			this.update();
8774273562Smarcel
8775273562Smarcel			options.animatedProperties[ this.prop ] = true;
8776273562Smarcel
8777273562Smarcel			for ( p in options.animatedProperties ) {
8778273562Smarcel				if ( options.animatedProperties[ p ] !== true ) {
8779273562Smarcel					done = false;
8780273562Smarcel				}
8781273562Smarcel			}
8782273562Smarcel
8783273562Smarcel			if ( done ) {
8784273562Smarcel				// Reset the overflow
8785273562Smarcel				if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
8786273562Smarcel
8787273562Smarcel					jQuery.each( [ "", "X", "Y" ], function( index, value ) {
8788273562Smarcel						elem.style[ "overflow" + value ] = options.overflow[ index ];
8789273562Smarcel					});
8790273562Smarcel				}
8791273562Smarcel
8792273562Smarcel				// Hide the element if the "hide" operation was done
8793273562Smarcel				if ( options.hide ) {
8794273562Smarcel					jQuery( elem ).hide();
8795273562Smarcel				}
8796273562Smarcel
8797273562Smarcel				// Reset the properties, if the item has been hidden or shown
8798273562Smarcel				if ( options.hide || options.show ) {
8799273562Smarcel					for ( p in options.animatedProperties ) {
8800273562Smarcel						jQuery.style( elem, p, options.orig[ p ] );
8801273562Smarcel						jQuery.removeData( elem, "fxshow" + p, true );
8802273562Smarcel						// Toggle data is no longer needed
8803273562Smarcel						jQuery.removeData( elem, "toggle" + p, true );
8804273562Smarcel					}
8805273562Smarcel				}
8806273562Smarcel
8807273562Smarcel				// Execute the complete function
8808273562Smarcel				// in the event that the complete function throws an exception
8809273562Smarcel				// we must ensure it won't be called twice. #5684
8810273562Smarcel
8811273562Smarcel				complete = options.complete;
8812273562Smarcel				if ( complete ) {
8813273562Smarcel
8814273562Smarcel					options.complete = false;
8815273562Smarcel					complete.call( elem );
8816273562Smarcel				}
8817273562Smarcel			}
8818273562Smarcel
8819273562Smarcel			return false;
8820273562Smarcel
8821273562Smarcel		} else {
8822273562Smarcel			// classical easing cannot be used with an Infinity duration
8823273562Smarcel			if ( options.duration == Infinity ) {
8824273562Smarcel				this.now = t;
8825273562Smarcel			} else {
8826273562Smarcel				n = t - this.startTime;
8827273562Smarcel				this.state = n / options.duration;
8828273562Smarcel
8829273562Smarcel				// Perform the easing function, defaults to swing
8830273562Smarcel				this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
8831273562Smarcel				this.now = this.start + ( (this.end - this.start) * this.pos );
8832273562Smarcel			}
8833273562Smarcel			// Perform the next step of the animation
8834273562Smarcel			this.update();
8835273562Smarcel		}
8836273562Smarcel
8837273562Smarcel		return true;
8838273562Smarcel	}
8839273562Smarcel};
8840273562Smarcel
8841273562SmarceljQuery.extend( jQuery.fx, {
8842273562Smarcel	tick: function() {
8843273562Smarcel		var timer,
8844273562Smarcel			timers = jQuery.timers,
8845273562Smarcel			i = 0;
8846273562Smarcel
8847273562Smarcel		for ( ; i < timers.length; i++ ) {
8848273562Smarcel			timer = timers[ i ];
8849273562Smarcel			// Checks the timer has not already been removed
8850273562Smarcel			if ( !timer() && timers[ i ] === timer ) {
8851273562Smarcel				timers.splice( i--, 1 );
8852273562Smarcel			}
8853273562Smarcel		}
8854273562Smarcel
8855273562Smarcel		if ( !timers.length ) {
8856273562Smarcel			jQuery.fx.stop();
8857273562Smarcel		}
8858273562Smarcel	},
8859273562Smarcel
8860273562Smarcel	interval: 13,
8861273562Smarcel
8862273562Smarcel	stop: function() {
8863273562Smarcel		clearInterval( timerId );
8864273562Smarcel		timerId = null;
8865273562Smarcel	},
8866273562Smarcel
8867273562Smarcel	speeds: {
8868273562Smarcel		slow: 600,
8869273562Smarcel		fast: 200,
8870273562Smarcel		// Default speed
8871273562Smarcel		_default: 400
8872273562Smarcel	},
8873273562Smarcel
8874273562Smarcel	step: {
8875273562Smarcel		opacity: function( fx ) {
8876273562Smarcel			jQuery.style( fx.elem, "opacity", fx.now );
8877273562Smarcel		},
8878273562Smarcel
8879273562Smarcel		_default: function( fx ) {
8880273562Smarcel			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
8881273562Smarcel				fx.elem.style[ fx.prop ] = fx.now + fx.unit;
8882273562Smarcel			} else {
8883273562Smarcel				fx.elem[ fx.prop ] = fx.now;
8884273562Smarcel			}
8885273562Smarcel		}
8886273562Smarcel	}
8887273562Smarcel});
8888273562Smarcel
8889273562Smarcel// Adds width/height step functions
8890273562Smarcel// Do not set anything below 0
8891273562SmarceljQuery.each([ "width", "height" ], function( i, prop ) {
8892273562Smarcel	jQuery.fx.step[ prop ] = function( fx ) {
8893273562Smarcel		jQuery.style( fx.elem, prop, Math.max(0, fx.now) );
8894273562Smarcel	};
8895273562Smarcel});
8896273562Smarcel
8897273562Smarcelif ( jQuery.expr && jQuery.expr.filters ) {
8898273562Smarcel	jQuery.expr.filters.animated = function( elem ) {
8899273562Smarcel		return jQuery.grep(jQuery.timers, function( fn ) {
8900273562Smarcel			return elem === fn.elem;
8901273562Smarcel		}).length;
8902273562Smarcel	};
8903273562Smarcel}
8904273562Smarcel
8905273562Smarcel// Try to restore the default display value of an element
8906273562Smarcelfunction defaultDisplay( nodeName ) {
8907273562Smarcel
8908273562Smarcel	if ( !elemdisplay[ nodeName ] ) {
8909273562Smarcel
8910273562Smarcel		var body = document.body,
8911273562Smarcel			elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
8912273562Smarcel			display = elem.css( "display" );
8913273562Smarcel		elem.remove();
8914273562Smarcel
8915273562Smarcel		// If the simple way fails,
8916273562Smarcel		// get element's real default display by attaching it to a temp iframe
8917273562Smarcel		if ( display === "none" || display === "" ) {
8918273562Smarcel			// No iframe to use yet, so create it
8919273562Smarcel			if ( !iframe ) {
8920273562Smarcel				iframe = document.createElement( "iframe" );
8921273562Smarcel				iframe.frameBorder = iframe.width = iframe.height = 0;
8922273562Smarcel			}
8923273562Smarcel
8924273562Smarcel			body.appendChild( iframe );
8925273562Smarcel
8926273562Smarcel			// Create a cacheable copy of the iframe document on first call.
8927273562Smarcel			// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
8928273562Smarcel			// document to it; WebKit & Firefox won't allow reusing the iframe document.
8929273562Smarcel			if ( !iframeDoc || !iframe.createElement ) {
8930273562Smarcel				iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
8931273562Smarcel				iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
8932273562Smarcel				iframeDoc.close();
8933273562Smarcel			}
8934273562Smarcel
8935273562Smarcel			elem = iframeDoc.createElement( nodeName );
8936273562Smarcel
8937273562Smarcel			iframeDoc.body.appendChild( elem );
8938273562Smarcel
8939273562Smarcel			display = jQuery.css( elem, "display" );
8940273562Smarcel			body.removeChild( iframe );
8941273562Smarcel		}
8942273562Smarcel
8943273562Smarcel		// Store the correct default display
8944273562Smarcel		elemdisplay[ nodeName ] = display;
8945273562Smarcel	}
8946273562Smarcel
8947273562Smarcel	return elemdisplay[ nodeName ];
8948273562Smarcel}
8949273562Smarcel
8950273562Smarcel
8951273562Smarcel
8952273562Smarcel
8953273562Smarcelvar rtable = /^t(?:able|d|h)$/i,
8954273562Smarcel	rroot = /^(?:body|html)$/i;
8955273562Smarcel
8956273562Smarcelif ( "getBoundingClientRect" in document.documentElement ) {
8957273562Smarcel	jQuery.fn.offset = function( options ) {
8958273562Smarcel		var elem = this[0], box;
8959273562Smarcel
8960273562Smarcel		if ( options ) {
8961273562Smarcel			return this.each(function( i ) {
8962273562Smarcel				jQuery.offset.setOffset( this, options, i );
8963273562Smarcel			});
8964273562Smarcel		}
8965273562Smarcel
8966273562Smarcel		if ( !elem || !elem.ownerDocument ) {
8967273562Smarcel			return null;
8968273562Smarcel		}
8969273562Smarcel
8970273562Smarcel		if ( elem === elem.ownerDocument.body ) {
8971273562Smarcel			return jQuery.offset.bodyOffset( elem );
8972273562Smarcel		}
8973273562Smarcel
8974273562Smarcel		try {
8975273562Smarcel			box = elem.getBoundingClientRect();
8976273562Smarcel		} catch(e) {}
8977273562Smarcel
8978273562Smarcel		var doc = elem.ownerDocument,
8979273562Smarcel			docElem = doc.documentElement;
8980273562Smarcel
8981273562Smarcel		// Make sure we're not dealing with a disconnected DOM node
8982273562Smarcel		if ( !box || !jQuery.contains( docElem, elem ) ) {
8983273562Smarcel			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
8984273562Smarcel		}
8985273562Smarcel
8986273562Smarcel		var body = doc.body,
8987273562Smarcel			win = getWindow(doc),
8988273562Smarcel			clientTop  = docElem.clientTop  || body.clientTop  || 0,
8989273562Smarcel			clientLeft = docElem.clientLeft || body.clientLeft || 0,
8990273562Smarcel			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
8991273562Smarcel			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
8992273562Smarcel			top  = box.top  + scrollTop  - clientTop,
8993273562Smarcel			left = box.left + scrollLeft - clientLeft;
8994273562Smarcel
8995273562Smarcel		return { top: top, left: left };
8996273562Smarcel	};
8997273562Smarcel
8998273562Smarcel} else {
8999273562Smarcel	jQuery.fn.offset = function( options ) {
9000273562Smarcel		var elem = this[0];
9001273562Smarcel
9002273562Smarcel		if ( options ) {
9003273562Smarcel			return this.each(function( i ) {
9004273562Smarcel				jQuery.offset.setOffset( this, options, i );
9005273562Smarcel			});
9006273562Smarcel		}
9007273562Smarcel
9008273562Smarcel		if ( !elem || !elem.ownerDocument ) {
9009273562Smarcel			return null;
9010273562Smarcel		}
9011273562Smarcel
9012273562Smarcel		if ( elem === elem.ownerDocument.body ) {
9013273562Smarcel			return jQuery.offset.bodyOffset( elem );
9014273562Smarcel		}
9015273562Smarcel
9016273562Smarcel		var computedStyle,
9017273562Smarcel			offsetParent = elem.offsetParent,
9018273562Smarcel			prevOffsetParent = elem,
9019273562Smarcel			doc = elem.ownerDocument,
9020273562Smarcel			docElem = doc.documentElement,
9021273562Smarcel			body = doc.body,
9022273562Smarcel			defaultView = doc.defaultView,
9023273562Smarcel			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
9024273562Smarcel			top = elem.offsetTop,
9025273562Smarcel			left = elem.offsetLeft;
9026273562Smarcel
9027273562Smarcel		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
9028273562Smarcel			if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
9029273562Smarcel				break;
9030273562Smarcel			}
9031273562Smarcel
9032273562Smarcel			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
9033273562Smarcel			top  -= elem.scrollTop;
9034273562Smarcel			left -= elem.scrollLeft;
9035273562Smarcel
9036273562Smarcel			if ( elem === offsetParent ) {
9037273562Smarcel				top  += elem.offsetTop;
9038273562Smarcel				left += elem.offsetLeft;
9039273562Smarcel
9040273562Smarcel				if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
9041273562Smarcel					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
9042273562Smarcel					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
9043273562Smarcel				}
9044273562Smarcel
9045273562Smarcel				prevOffsetParent = offsetParent;
9046273562Smarcel				offsetParent = elem.offsetParent;
9047273562Smarcel			}
9048273562Smarcel
9049273562Smarcel			if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
9050273562Smarcel				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
9051273562Smarcel				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
9052273562Smarcel			}
9053273562Smarcel
9054273562Smarcel			prevComputedStyle = computedStyle;
9055273562Smarcel		}
9056273562Smarcel
9057273562Smarcel		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
9058273562Smarcel			top  += body.offsetTop;
9059273562Smarcel			left += body.offsetLeft;
9060273562Smarcel		}
9061273562Smarcel
9062273562Smarcel		if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
9063273562Smarcel			top  += Math.max( docElem.scrollTop, body.scrollTop );
9064273562Smarcel			left += Math.max( docElem.scrollLeft, body.scrollLeft );
9065273562Smarcel		}
9066273562Smarcel
9067273562Smarcel		return { top: top, left: left };
9068273562Smarcel	};
9069273562Smarcel}
9070273562Smarcel
9071273562SmarceljQuery.offset = {
9072273562Smarcel
9073273562Smarcel	bodyOffset: function( body ) {
9074273562Smarcel		var top = body.offsetTop,
9075273562Smarcel			left = body.offsetLeft;
9076273562Smarcel
9077273562Smarcel		if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
9078273562Smarcel			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
9079273562Smarcel			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
9080273562Smarcel		}
9081273562Smarcel
9082273562Smarcel		return { top: top, left: left };
9083273562Smarcel	},
9084273562Smarcel
9085273562Smarcel	setOffset: function( elem, options, i ) {
9086273562Smarcel		var position = jQuery.css( elem, "position" );
9087273562Smarcel
9088273562Smarcel		// set position first, in-case top/left are set even on static elem
9089273562Smarcel		if ( position === "static" ) {
9090273562Smarcel			elem.style.position = "relative";
9091273562Smarcel		}
9092273562Smarcel
9093273562Smarcel		var curElem = jQuery( elem ),
9094273562Smarcel			curOffset = curElem.offset(),
9095273562Smarcel			curCSSTop = jQuery.css( elem, "top" ),
9096273562Smarcel			curCSSLeft = jQuery.css( elem, "left" ),
9097273562Smarcel			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
9098273562Smarcel			props = {}, curPosition = {}, curTop, curLeft;
9099273562Smarcel
9100273562Smarcel		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
9101273562Smarcel		if ( calculatePosition ) {
9102273562Smarcel			curPosition = curElem.position();
9103273562Smarcel			curTop = curPosition.top;
9104273562Smarcel			curLeft = curPosition.left;
9105273562Smarcel		} else {
9106273562Smarcel			curTop = parseFloat( curCSSTop ) || 0;
9107273562Smarcel			curLeft = parseFloat( curCSSLeft ) || 0;
9108273562Smarcel		}
9109273562Smarcel
9110273562Smarcel		if ( jQuery.isFunction( options ) ) {
9111273562Smarcel			options = options.call( elem, i, curOffset );
9112273562Smarcel		}
9113273562Smarcel
9114273562Smarcel		if ( options.top != null ) {
9115273562Smarcel			props.top = ( options.top - curOffset.top ) + curTop;
9116273562Smarcel		}
9117273562Smarcel		if ( options.left != null ) {
9118273562Smarcel			props.left = ( options.left - curOffset.left ) + curLeft;
9119273562Smarcel		}
9120273562Smarcel
9121273562Smarcel		if ( "using" in options ) {
9122273562Smarcel			options.using.call( elem, props );
9123273562Smarcel		} else {
9124273562Smarcel			curElem.css( props );
9125273562Smarcel		}
9126273562Smarcel	}
9127273562Smarcel};
9128273562Smarcel
9129273562Smarcel
9130273562SmarceljQuery.fn.extend({
9131273562Smarcel
9132273562Smarcel	position: function() {
9133273562Smarcel		if ( !this[0] ) {
9134273562Smarcel			return null;
9135273562Smarcel		}
9136273562Smarcel
9137273562Smarcel		var elem = this[0],
9138273562Smarcel
9139273562Smarcel		// Get *real* offsetParent
9140273562Smarcel		offsetParent = this.offsetParent(),
9141273562Smarcel
9142273562Smarcel		// Get correct offsets
9143273562Smarcel		offset       = this.offset(),
9144273562Smarcel		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
9145273562Smarcel
9146273562Smarcel		// Subtract element margins
9147273562Smarcel		// note: when an element has margin: auto the offsetLeft and marginLeft
9148273562Smarcel		// are the same in Safari causing offset.left to incorrectly be 0
9149273562Smarcel		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
9150273562Smarcel		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
9151273562Smarcel
9152273562Smarcel		// Add offsetParent borders
9153273562Smarcel		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
9154273562Smarcel		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
9155273562Smarcel
9156273562Smarcel		// Subtract the two offsets
9157273562Smarcel		return {
9158273562Smarcel			top:  offset.top  - parentOffset.top,
9159273562Smarcel			left: offset.left - parentOffset.left
9160273562Smarcel		};
9161273562Smarcel	},
9162273562Smarcel
9163273562Smarcel	offsetParent: function() {
9164273562Smarcel		return this.map(function() {
9165273562Smarcel			var offsetParent = this.offsetParent || document.body;
9166273562Smarcel			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
9167273562Smarcel				offsetParent = offsetParent.offsetParent;
9168273562Smarcel			}
9169273562Smarcel			return offsetParent;
9170273562Smarcel		});
9171273562Smarcel	}
9172273562Smarcel});
9173273562Smarcel
9174273562Smarcel
9175273562Smarcel// Create scrollLeft and scrollTop methods
9176273562SmarceljQuery.each( ["Left", "Top"], function( i, name ) {
9177273562Smarcel	var method = "scroll" + name;
9178273562Smarcel
9179273562Smarcel	jQuery.fn[ method ] = function( val ) {
9180273562Smarcel		var elem, win;
9181273562Smarcel
9182273562Smarcel		if ( val === undefined ) {
9183273562Smarcel			elem = this[ 0 ];
9184273562Smarcel
9185273562Smarcel			if ( !elem ) {
9186273562Smarcel				return null;
9187273562Smarcel			}
9188273562Smarcel
9189273562Smarcel			win = getWindow( elem );
9190273562Smarcel
9191273562Smarcel			// Return the scroll offset
9192273562Smarcel			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
9193273562Smarcel				jQuery.support.boxModel && win.document.documentElement[ method ] ||
9194273562Smarcel					win.document.body[ method ] :
9195273562Smarcel				elem[ method ];
9196273562Smarcel		}
9197273562Smarcel
9198273562Smarcel		// Set the scroll offset
9199273562Smarcel		return this.each(function() {
9200273562Smarcel			win = getWindow( this );
9201273562Smarcel
9202273562Smarcel			if ( win ) {
9203273562Smarcel				win.scrollTo(
9204273562Smarcel					!i ? val : jQuery( win ).scrollLeft(),
9205273562Smarcel					 i ? val : jQuery( win ).scrollTop()
9206273562Smarcel				);
9207273562Smarcel
9208273562Smarcel			} else {
9209273562Smarcel				this[ method ] = val;
9210273562Smarcel			}
9211273562Smarcel		});
9212273562Smarcel	};
9213273562Smarcel});
9214273562Smarcel
9215273562Smarcelfunction getWindow( elem ) {
9216273562Smarcel	return jQuery.isWindow( elem ) ?
9217273562Smarcel		elem :
9218273562Smarcel		elem.nodeType === 9 ?
9219273562Smarcel			elem.defaultView || elem.parentWindow :
9220273562Smarcel			false;
9221273562Smarcel}
9222273562Smarcel
9223273562Smarcel
9224273562Smarcel
9225273562Smarcel
9226273562Smarcel// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
9227273562SmarceljQuery.each([ "Height", "Width" ], function( i, name ) {
9228273562Smarcel
9229273562Smarcel	var type = name.toLowerCase();
9230273562Smarcel
9231273562Smarcel	// innerHeight and innerWidth
9232273562Smarcel	jQuery.fn[ "inner" + name ] = function() {
9233273562Smarcel		var elem = this[0];
9234273562Smarcel		return elem ?
9235273562Smarcel			elem.style ?
9236273562Smarcel			parseFloat( jQuery.css( elem, type, "padding" ) ) :
9237273562Smarcel			this[ type ]() :
9238273562Smarcel			null;
9239273562Smarcel	};
9240273562Smarcel
9241273562Smarcel	// outerHeight and outerWidth
9242273562Smarcel	jQuery.fn[ "outer" + name ] = function( margin ) {
9243273562Smarcel		var elem = this[0];
9244273562Smarcel		return elem ?
9245273562Smarcel			elem.style ?
9246273562Smarcel			parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
9247273562Smarcel			this[ type ]() :
9248273562Smarcel			null;
9249273562Smarcel	};
9250273562Smarcel
9251273562Smarcel	jQuery.fn[ type ] = function( size ) {
9252273562Smarcel		// Get window width or height
9253273562Smarcel		var elem = this[0];
9254273562Smarcel		if ( !elem ) {
9255273562Smarcel			return size == null ? null : this;
9256273562Smarcel		}
9257273562Smarcel
9258273562Smarcel		if ( jQuery.isFunction( size ) ) {
9259273562Smarcel			return this.each(function( i ) {
9260273562Smarcel				var self = jQuery( this );
9261273562Smarcel				self[ type ]( size.call( this, i, self[ type ]() ) );
9262273562Smarcel			});
9263273562Smarcel		}
9264273562Smarcel
9265273562Smarcel		if ( jQuery.isWindow( elem ) ) {
9266273562Smarcel			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
9267273562Smarcel			// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
9268273562Smarcel			var docElemProp = elem.document.documentElement[ "client" + name ],
9269273562Smarcel				body = elem.document.body;
9270273562Smarcel			return elem.document.compatMode === "CSS1Compat" && docElemProp ||
9271273562Smarcel				body && body[ "client" + name ] || docElemProp;
9272273562Smarcel
9273273562Smarcel		// Get document width or height
9274273562Smarcel		} else if ( elem.nodeType === 9 ) {
9275273562Smarcel			// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
9276273562Smarcel			return Math.max(
9277273562Smarcel				elem.documentElement["client" + name],
9278273562Smarcel				elem.body["scroll" + name], elem.documentElement["scroll" + name],
9279273562Smarcel				elem.body["offset" + name], elem.documentElement["offset" + name]
9280273562Smarcel			);
9281273562Smarcel
9282273562Smarcel		// Get or set width or height on the element
9283273562Smarcel		} else if ( size === undefined ) {
9284273562Smarcel			var orig = jQuery.css( elem, type ),
9285273562Smarcel				ret = parseFloat( orig );
9286273562Smarcel
9287273562Smarcel			return jQuery.isNumeric( ret ) ? ret : orig;
9288273562Smarcel
9289273562Smarcel		// Set the width or height on the element (default to pixels if value is unitless)
9290273562Smarcel		} else {
9291273562Smarcel			return this.css( type, typeof size === "string" ? size : size + "px" );
9292273562Smarcel		}
9293273562Smarcel	};
9294273562Smarcel
9295273562Smarcel});
9296273562Smarcel
9297273562Smarcel
9298273562Smarcel// Expose jQuery to the global object
9299273562Smarcelwindow.jQuery = window.$ = jQuery;
9300273562Smarcel})( window );
9301