1beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik/*!
24a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair * jQuery JavaScript Library v1.8.3
3beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik * http://jquery.com/
4beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik *
5beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik * Includes Sizzle.js
6beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik * http://sizzlejs.com/
7beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik *
84a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair * Copyright 2012 jQuery Foundation and other contributors
94a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair * Released under the MIT license
104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair * http://jquery.org/license
114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair *
124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair * Date: Tue Nov 13 2012 08:20:33 GMT-0500 (Eastern Standard Time)
13beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik */
14beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik(function( window, undefined ) {
154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairvar
164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// A central reference to the root jQuery(document)
174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rootjQuery,
18beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// The deferred used on DOM ready
204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	readyList,
21beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Use the correct document accordingly with window argument (sandbox)
234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	document = window.document,
244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	location = window.location,
254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	navigator = window.navigator,
26beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
27beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Map over jQuery in case of overwrite
28beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	_jQuery = window.jQuery,
29beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
30beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Map over the $ in case of overwrite
31beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	_$ = window.$,
32beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Save a reference to some core methods
344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	core_push = Array.prototype.push,
354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	core_slice = Array.prototype.slice,
364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	core_indexOf = Array.prototype.indexOf,
374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	core_toString = Object.prototype.toString,
384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	core_hasOwn = Object.prototype.hasOwnProperty,
394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	core_trim = String.prototype.trim,
404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Define a local copy of jQuery
424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	jQuery = function( selector, context ) {
434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// The jQuery object is actually just the init constructor 'enhanced'
444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return new jQuery.fn.init( selector, context, rootjQuery );
454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	},
46beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Used for matching numbers
484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
49beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Used for detecting and trimming whitespace
514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	core_rnotwhite = /\S/,
524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	core_rspace = /\s+/,
53beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// A simple way to check for HTML strings
584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
60beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
61beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Match a standalone tag
624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
63beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
64beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// JSON RegExp
65beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rvalidchars = /^[\],:{}\s]*$/,
66beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
69beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
70beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Matches dashed string for camelizing
71beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rmsPrefix = /^-ms-/,
724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rdashAlpha = /-([\da-z])/gi,
73beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
74beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Used by jQuery.camelCase as callback to replace()
75beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	fcamelCase = function( all, letter ) {
76beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return ( letter + "" ).toUpperCase();
77beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
78beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// The ready event handler and self cleanup method
804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	DOMContentLoaded = function() {
814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( document.addEventListener ) {
824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			jQuery.ready();
844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} else if ( document.readyState === "complete" ) {
854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// we're here because readyState === "complete" in oldIE
864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// which is good enough for us to call the dom ready!
874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			document.detachEvent( "onreadystatechange", DOMContentLoaded );
884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			jQuery.ready();
894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	},
91beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
92beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// [[Class]] -> type pairs
93beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	class2type = {};
94beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
95beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.fn = jQuery.prototype = {
96beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	constructor: jQuery,
97beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	init: function( selector, context, rootjQuery ) {
98beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var match, elem, ret, doc;
99beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Handle $(""), $(null), $(undefined), $(false)
101beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !selector ) {
102beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return this;
103beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
104beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
105beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Handle $(DOMElement)
106beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( selector.nodeType ) {
107beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			this.context = this[0] = selector;
108beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			this.length = 1;
109beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return this;
110beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
111beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
112beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Handle HTML strings
113beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( typeof selector === "string" ) {
114beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
115beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Assume that strings that start and end with <> are HTML and skip the regex check
116beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				match = [ null, selector, null ];
117beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
118beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else {
1194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				match = rquickExpr.exec( selector );
120beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
121beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Match html or make sure no context is specified for #id
123beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( match && (match[1] || !context) ) {
124beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
125beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// HANDLE: $(html) -> $(array)
126beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( match[1] ) {
127beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					context = context instanceof jQuery ? context[0] : context;
1284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					doc = ( context && context.nodeType ? context.ownerDocument || context : document );
129beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// scripts is true for back-compat
1314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					selector = jQuery.parseHTML( match[1], doc, true );
1324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
1334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						this.attr.call( selector, context, true );
134beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
135beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
136beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					return jQuery.merge( this, selector );
137beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// HANDLE: $(#id)
139beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				} else {
140beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					elem = document.getElementById( match[2] );
141beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
142beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// Check parentNode to catch when Blackberry 4.6 returns
143beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// nodes that are no longer in the document #6963
144beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( elem && elem.parentNode ) {
145beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						// Handle the case where IE and Opera return items
146beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						// by name instead of ID
147beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						if ( elem.id !== match[2] ) {
148beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							return rootjQuery.find( selector );
149beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
150beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
151beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						// Otherwise, we inject the element directly into the jQuery object
152beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						this.length = 1;
153beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						this[0] = elem;
154beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
155beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
156beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					this.context = document;
157beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					this.selector = selector;
158beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					return this;
159beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
160beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
161beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// HANDLE: $(expr, $(...))
162beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else if ( !context || context.jquery ) {
163beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return ( context || rootjQuery ).find( selector );
164beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
165beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// HANDLE: $(expr, context)
166beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// (which is just equivalent to: $(context).find(expr)
167beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else {
168beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return this.constructor( context ).find( selector );
169beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
170beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
171beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// HANDLE: $(function)
172beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Shortcut for document ready
173beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else if ( jQuery.isFunction( selector ) ) {
174beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return rootjQuery.ready( selector );
175beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
176beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
177beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( selector.selector !== undefined ) {
178beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			this.selector = selector.selector;
179beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			this.context = selector.context;
180beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
181beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
182beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery.makeArray( selector, this );
183beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
184beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
185beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Start with an empty selector
186beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	selector: "",
187beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
188beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// The current version of jQuery being used
1894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	jquery: "1.8.3",
190beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
191beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// The default length of a jQuery object is 0
192beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	length: 0,
193beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
194beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// The number of elements contained in the matched element set
195beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	size: function() {
196beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.length;
197beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
198beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
199beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	toArray: function() {
2004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return core_slice.call( this );
201beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
202beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
203beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Get the Nth element in the matched element set OR
204beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Get the whole matched element set as a clean array
205beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	get: function( num ) {
206beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return num == null ?
207beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
208beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Return a 'clean' array
209beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			this.toArray() :
210beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
211beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Return just the object
212beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			( num < 0 ? this[ this.length + num ] : this[ num ] );
213beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
214beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
215beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Take an array of elements and push it onto the stack
216beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// (returning the new matched element set)
217beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	pushStack: function( elems, name, selector ) {
218beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Build a new jQuery matched element set
2204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var ret = jQuery.merge( this.constructor(), elems );
221beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
222beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Add the old object onto the stack (as a reference)
223beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		ret.prevObject = this;
224beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
225beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		ret.context = this.context;
226beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
227beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( name === "find" ) {
228beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
229beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else if ( name ) {
230beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			ret.selector = this.selector + "." + name + "(" + selector + ")";
231beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
232beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
233beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Return the newly-formed element set
234beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return ret;
235beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
236beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
237beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Execute a callback for every element in the matched set.
238beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// (You can seed the arguments with an array of args, but this is
239beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// only used internally.)
240beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	each: function( callback, args ) {
241beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery.each( this, callback, args );
242beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
243beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
244beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	ready: function( fn ) {
245beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Add the callback
2464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		jQuery.ready.promise().done( fn );
247beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
248beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this;
249beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
250beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
251beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	eq: function( i ) {
252beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		i = +i;
253beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return i === -1 ?
254beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			this.slice( i ) :
255beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			this.slice( i, i + 1 );
256beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
257beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
258beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	first: function() {
259beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.eq( 0 );
260beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
261beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
262beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	last: function() {
263beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.eq( -1 );
264beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
265beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
266beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	slice: function() {
2674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return this.pushStack( core_slice.apply( this, arguments ),
2684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			"slice", core_slice.call(arguments).join(",") );
269beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
270beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
271beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	map: function( callback ) {
272beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.pushStack( jQuery.map(this, function( elem, i ) {
273beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return callback.call( elem, i, elem );
274beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}));
275beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
276beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
277beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	end: function() {
278beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.prevObject || this.constructor(null);
279beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
280beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
281beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// For internal use only.
282beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Behaves like an Array's method, not like a jQuery method.
2834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	push: core_push,
284beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	sort: [].sort,
285beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	splice: [].splice
286beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik};
287beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
288beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Give the init function the jQuery prototype for later instantiation
289beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.fn.init.prototype = jQuery.fn;
290beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
291beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.extend = jQuery.fn.extend = function() {
292beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	var options, name, src, copy, copyIsArray, clone,
293beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		target = arguments[0] || {},
294beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		i = 1,
295beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		length = arguments.length,
296beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		deep = false;
297beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
298beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Handle a deep copy situation
299beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( typeof target === "boolean" ) {
300beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		deep = target;
301beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		target = arguments[1] || {};
302beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// skip the boolean and the target
303beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		i = 2;
304beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
305beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
306beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Handle case when target is a string or something (possible in deep copy)
307beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
308beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		target = {};
309beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
310beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
311beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// extend jQuery itself if only one argument is passed
312beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( length === i ) {
313beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		target = this;
314beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		--i;
315beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
316beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
317beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	for ( ; i < length; i++ ) {
318beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Only deal with non-null/undefined values
319beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( (options = arguments[ i ]) != null ) {
320beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Extend the base object
321beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			for ( name in options ) {
322beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				src = target[ name ];
323beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				copy = options[ name ];
324beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
325beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Prevent never-ending loop
326beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( target === copy ) {
327beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					continue;
328beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
329beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
330beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Recurse if we're merging plain objects or arrays
331beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
332beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( copyIsArray ) {
333beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						copyIsArray = false;
334beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						clone = src && jQuery.isArray(src) ? src : [];
335beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
336beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					} else {
337beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						clone = src && jQuery.isPlainObject(src) ? src : {};
338beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
339beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
340beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// Never move original objects, clone them
341beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					target[ name ] = jQuery.extend( deep, clone, copy );
342beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
343beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Don't bring in undefined values
344beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				} else if ( copy !== undefined ) {
345beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					target[ name ] = copy;
346beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
347beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
348beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
349beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
350beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
351beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Return the modified object
352beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	return target;
353beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik};
354beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
355beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.extend({
356beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	noConflict: function( deep ) {
357beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( window.$ === jQuery ) {
358beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			window.$ = _$;
359beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
360beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
361beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( deep && window.jQuery === jQuery ) {
362beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			window.jQuery = _jQuery;
363beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
364beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
365beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery;
366beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
367beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
368beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Is the DOM ready to be used? Set to true once it occurs.
369beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	isReady: false,
370beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
371beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// A counter to track how many items to wait for before
372beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// the ready event fires. See #6781
373beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	readyWait: 1,
374beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
375beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Hold (or release) the ready event
376beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	holdReady: function( hold ) {
377beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( hold ) {
378beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.readyWait++;
379beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else {
380beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.ready( true );
381beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
382beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
383beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
384beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Handle when the DOM is ready
385beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	ready: function( wait ) {
386beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Abort if there are pending holds or we're already ready
3884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
389beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return;
390beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
391beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
3934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !document.body ) {
394beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return setTimeout( jQuery.ready, 1 );
395beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
396beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Remember that the DOM is ready
3984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		jQuery.isReady = true;
399beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
4004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// If a normal DOM Ready event fired, decrement, and wait if need be
4014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( wait !== true && --jQuery.readyWait > 0 ) {
4024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return;
4034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
404beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
4054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// If there are functions bound, to execute
4064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		readyList.resolveWith( document, [ jQuery ] );
407beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
4084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Trigger any bound ready events
4094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( jQuery.fn.trigger ) {
4104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			jQuery( document ).trigger("ready").off("ready");
411beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
412beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
413beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
414beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// See test/unit/core.js for details concerning isFunction.
415beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Since version 1.3, DOM methods and functions like alert
416beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// aren't supported. They return false on IE (#2968).
417beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	isFunction: function( obj ) {
418beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery.type(obj) === "function";
419beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
420beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
421beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	isArray: Array.isArray || function( obj ) {
422beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery.type(obj) === "array";
423beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
424beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
425beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	isWindow: function( obj ) {
4264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return obj != null && obj == obj.window;
427beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
428beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
429beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	isNumeric: function( obj ) {
430beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return !isNaN( parseFloat(obj) ) && isFinite( obj );
431beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
432beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
433beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	type: function( obj ) {
434beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return obj == null ?
435beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			String( obj ) :
4364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			class2type[ core_toString.call(obj) ] || "object";
437beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
438beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
439beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	isPlainObject: function( obj ) {
440beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Must be an Object.
441beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Because of IE, we also have to check the presence of the constructor property.
442beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Make sure that DOM nodes and window objects don't pass through, as well
443beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
444beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return false;
445beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
446beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
447beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		try {
448beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Not own constructor property must be Object
449beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( obj.constructor &&
4504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				!core_hasOwn.call(obj, "constructor") &&
4514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				!core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
452beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return false;
453beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
454beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} catch ( e ) {
455beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// IE8,9 Will throw exceptions on certain host objects #9897
456beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return false;
457beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
458beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
459beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Own properties are enumerated firstly, so to speed up,
460beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// if last one is own, then all properties are own.
461beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
462beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var key;
463beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		for ( key in obj ) {}
464beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
4654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return key === undefined || core_hasOwn.call( obj, key );
466beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
467beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
468beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	isEmptyObject: function( obj ) {
4694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var name;
4704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		for ( name in obj ) {
471beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return false;
472beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
473beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return true;
474beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
475beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
476beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	error: function( msg ) {
477beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		throw new Error( msg );
478beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
479beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
4804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// data: string of html
4814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// context (optional): If specified, the fragment will be created in this context, defaults to document
4824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// scripts (optional): If true, will include scripts passed in the html string
4834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	parseHTML: function( data, context, scripts ) {
4844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var parsed;
4854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !data || typeof data !== "string" ) {
4864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return null;
4874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
4884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( typeof context === "boolean" ) {
4894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			scripts = context;
4904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			context = 0;
4914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
4924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		context = context || document;
4934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
4944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Single tag
4954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( (parsed = rsingleTag.exec( data )) ) {
4964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return [ context.createElement( parsed[1] ) ];
4974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
4984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
4994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
5004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return jQuery.merge( [],
5014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			(parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
5024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	},
5034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
504beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	parseJSON: function( data ) {
5054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !data || typeof data !== "string") {
506beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return null;
507beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
508beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
509beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Make sure leading/trailing whitespace is removed (IE can't handle it)
510beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		data = jQuery.trim( data );
511beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
512beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Attempt to parse using the native JSON parser first
513beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( window.JSON && window.JSON.parse ) {
514beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return window.JSON.parse( data );
515beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
516beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
517beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Make sure the incoming data is actual JSON
518beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Logic borrowed from http://json.org/json2.js
519beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
520beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			.replace( rvalidtokens, "]" )
521beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			.replace( rvalidbraces, "")) ) {
522beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
523beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return ( new Function( "return " + data ) )();
524beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
525beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
526beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		jQuery.error( "Invalid JSON: " + data );
527beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
528beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
529beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Cross-browser xml parsing
530beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	parseXML: function( data ) {
531beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var xml, tmp;
5324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !data || typeof data !== "string" ) {
5334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return null;
5344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
535beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		try {
536beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( window.DOMParser ) { // Standard
537beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				tmp = new DOMParser();
538beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				xml = tmp.parseFromString( data , "text/xml" );
539beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else { // IE
540beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				xml = new ActiveXObject( "Microsoft.XMLDOM" );
541beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				xml.async = "false";
542beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				xml.loadXML( data );
543beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
544beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} catch( e ) {
545beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			xml = undefined;
546beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
547beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
548beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.error( "Invalid XML: " + data );
549beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
550beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return xml;
551beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
552beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
553beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	noop: function() {},
554beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
555beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Evaluates a script in a global context
556beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Workarounds based on findings by Jim Driscoll
557beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
558beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	globalEval: function( data ) {
5594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( data && core_rnotwhite.test( data ) ) {
560beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// We use execScript on Internet Explorer
561beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// We use an anonymous function so that context is window
562beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// rather than jQuery in Firefox
563beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			( window.execScript || function( data ) {
564beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				window[ "eval" ].call( window, data );
565beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} )( data );
566beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
567beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
568beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
569beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Convert dashed to camelCase; used by the css and data modules
570beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Microsoft forgot to hump their vendor prefix (#9572)
571beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	camelCase: function( string ) {
572beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
573beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
574beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
575beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	nodeName: function( elem, name ) {
5764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
577beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
578beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
579beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// args is for internal usage only
5804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	each: function( obj, callback, args ) {
5814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var name,
5824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			i = 0,
5834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			length = obj.length,
5844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			isObj = length === undefined || jQuery.isFunction( obj );
585beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
586beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( args ) {
587beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( isObj ) {
5884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				for ( name in obj ) {
5894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( callback.apply( obj[ name ], args ) === false ) {
590beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						break;
591beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
592beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
593beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else {
594beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				for ( ; i < length; ) {
5954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( callback.apply( obj[ i++ ], args ) === false ) {
596beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						break;
597beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
598beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
599beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
600beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
601beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// A special, fast, case for the most common use of each
602beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else {
603beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( isObj ) {
6044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				for ( name in obj ) {
6054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
606beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						break;
607beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
608beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
609beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else {
610beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				for ( ; i < length; ) {
6114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
612beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						break;
613beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
614beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
615beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
616beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
617beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return obj;
619beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
620beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
621beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Use native String.trim function wherever possible
6224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
623beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		function( text ) {
624beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return text == null ?
625beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				"" :
6264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				core_trim.call( text );
627beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} :
628beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
629beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Otherwise use our own trimming functionality
630beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		function( text ) {
631beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return text == null ?
632beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				"" :
6334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				( text + "" ).replace( rtrim, "" );
634beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
635beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
636beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// results is for internal usage only
6374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	makeArray: function( arr, results ) {
6384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var type,
6394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			ret = results || [];
640beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( arr != null ) {
642beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// The window, strings (and functions) also have 'length'
643beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
6444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			type = jQuery.type( arr );
645beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
6474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				core_push.call( ret, arr );
648beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else {
6494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery.merge( ret, arr );
650beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
651beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
652beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
653beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return ret;
654beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
655beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	inArray: function( elem, arr, i ) {
657beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var len;
658beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( arr ) {
6604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( core_indexOf ) {
6614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return core_indexOf.call( arr, elem, i );
662beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
663beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			len = arr.length;
665beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
666beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
667beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			for ( ; i < len; i++ ) {
668beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Skip accessing in sparse arrays
6694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( i in arr && arr[ i ] === elem ) {
670beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					return i;
671beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
672beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
673beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
674beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
675beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return -1;
676beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
677beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
678beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	merge: function( first, second ) {
6794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var l = second.length,
6804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			i = first.length,
681beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			j = 0;
682beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( typeof l === "number" ) {
6844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			for ( ; j < l; j++ ) {
685beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				first[ i++ ] = second[ j ];
686beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
687beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
688beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else {
689beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			while ( second[j] !== undefined ) {
690beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				first[ i++ ] = second[ j++ ];
691beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
692beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
693beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
694beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		first.length = i;
695beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
696beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return first;
697beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
698beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
699beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	grep: function( elems, callback, inv ) {
7004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var retVal,
7014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			ret = [],
7024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			i = 0,
7034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			length = elems.length;
704beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		inv = !!inv;
705beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
706beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Go through the array, only saving the items
707beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// that pass the validator function
7084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		for ( ; i < length; i++ ) {
709beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			retVal = !!callback( elems[ i ], i );
710beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( inv !== retVal ) {
711beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				ret.push( elems[ i ] );
712beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
713beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
714beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
715beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return ret;
716beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
717beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
718beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// arg is for internal usage only
719beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	map: function( elems, callback, arg ) {
7204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var value, key,
7214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			ret = [],
722beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			i = 0,
723beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			length = elems.length,
724beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// jquery objects are treated as arrays
725beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
726beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
727beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Go through the array, translating each of the items to their
728beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( isArray ) {
729beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			for ( ; i < length; i++ ) {
730beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				value = callback( elems[ i ], i, arg );
731beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
732beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( value != null ) {
733beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					ret[ ret.length ] = value;
734beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
735beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
736beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
737beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Go through every key on the object,
738beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else {
739beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			for ( key in elems ) {
740beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				value = callback( elems[ key ], key, arg );
741beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
742beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( value != null ) {
743beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					ret[ ret.length ] = value;
744beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
745beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
746beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
747beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
748beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Flatten any nested arrays
749beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return ret.concat.apply( [], ret );
750beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
751beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
752beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// A global GUID counter for objects
753beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	guid: 1,
754beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
755beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Bind a function to a context, optionally partially applying any
756beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// arguments.
757beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	proxy: function( fn, context ) {
7584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var tmp, args, proxy;
7594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
760beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( typeof context === "string" ) {
7614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			tmp = fn[ context ];
762beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			context = fn;
763beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			fn = tmp;
764beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
765beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
766beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Quick check to determine if target is callable, in the spec
767beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// this throws a TypeError, but we will just return undefined.
768beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !jQuery.isFunction( fn ) ) {
769beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return undefined;
770beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
771beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
772beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Simulated bind
7734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		args = core_slice.call( arguments, 2 );
7744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		proxy = function() {
7754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
7764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		};
777beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
778beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Set the guid of unique handler to the same of original handler, so it can be removed
7794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
780beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
781beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return proxy;
782beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
783beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Multifunctional method to get and set values of a collection
785beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// The value/s can optionally be executed if it's a function
7864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
7874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var exec,
7884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			bulk = key == null,
7894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			i = 0,
7904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			length = elems.length;
791beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Sets many values
7934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( key && typeof key === "object" ) {
7944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			for ( i in key ) {
7954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
796beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			chainable = 1;
798beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Sets one value
8004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} else if ( value !== undefined ) {
801beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Optionally, function values get executed if exec is true
8024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			exec = pass === undefined && jQuery.isFunction( value );
8034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
8044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( bulk ) {
8054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Bulk operations only iterate when executing function values
8064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( exec ) {
8074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					exec = fn;
8084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					fn = function( elem, key, value ) {
8094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						return exec.call( jQuery( elem ), value );
8104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					};
8114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
8124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Otherwise they run against the entire set
8134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				} else {
8144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					fn.call( elems, value );
8154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					fn = null;
8164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
8174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
818beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( fn ) {
8204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				for (; i < length; i++ ) {
8214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
8224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
823beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
824beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			chainable = 1;
826beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
827beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return chainable ?
8294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			elems :
8304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
8314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Gets
8324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			bulk ?
8334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				fn.call( elems ) :
8344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				length ? fn( elems[0], key ) : emptyGet;
835beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
836beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
837beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	now: function() {
838beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return ( new Date() ).getTime();
8394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
8404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair});
841beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.ready.promise = function( obj ) {
8434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( !readyList ) {
844beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		readyList = jQuery.Deferred();
846beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Catch cases where $(document).ready() is called after the browser event has already occurred.
8484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// we once tried to use readyState "interactive" here, but it caused issues like the one
8494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
8504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( document.readyState === "complete" ) {
8514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Handle it asynchronously to allow scripts the opportunity to delay ready
8524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			setTimeout( jQuery.ready, 1 );
853beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Standards-based browsers support DOMContentLoaded
8554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} else if ( document.addEventListener ) {
8564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Use the handy event callback
8574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
858beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// A fallback to window.onload, that will always work
8604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			window.addEventListener( "load", jQuery.ready, false );
861beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// If IE event model is used
8634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} else {
8644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Ensure firing before onload, maybe late but safe also for iframes
8654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			document.attachEvent( "onreadystatechange", DOMContentLoaded );
866beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// A fallback to window.onload, that will always work
8684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			window.attachEvent( "onload", jQuery.ready );
869beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// If IE and not a frame
8714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// continually check to see if the document is ready
8724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var top = false;
873beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			try {
8754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				top = window.frameElement == null && document.documentElement;
8764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			} catch(e) {}
877beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( top && top.doScroll ) {
8794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				(function doScrollCheck() {
8804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( !jQuery.isReady ) {
881beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						try {
8834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							// Use the trick by Diego Perini
8844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							// http://javascript.nwbox.com/IEContentLoaded/
8854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							top.doScroll("left");
8864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						} catch(e) {
8874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							return setTimeout( doScrollCheck, 50 );
8884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
889beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// and execute any waiting functions
8914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						jQuery.ready();
8924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
8934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				})();
8944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
895beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
896beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
8974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return readyList.promise( obj );
8984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair};
899beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// Populate the class2type map
9014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
9024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	class2type[ "[object " + name + "]" ] = name.toLowerCase();
9034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair});
904beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// All jQuery objects should point back to these
9064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairrootjQuery = jQuery(document);
9074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// String to Object options format cache
9084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairvar optionsCache = {};
9094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
9104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// Convert String-formatted options into Object-formatted ones and store in cache
9114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction createOptions( options ) {
9124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var object = optionsCache[ options ] = {};
9134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	jQuery.each( options.split( core_rspace ), function( _, flag ) {
9144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		object[ flag ] = true;
9154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	});
916beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	return object;
917beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
918beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
919beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik/*
920beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik * Create a callback list using the following parameters:
921beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik *
9224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair *	options: an optional list of space-separated options that will change how
9234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair *			the callback list behaves or a more traditional option object
924beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik *
925beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik * By default a callback list will act like an event callback list and can be
926beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik * "fired" multiple times.
927beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik *
9284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair * Possible options:
929beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik *
930beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik *	once:			will ensure the callback list can only be fired once (like a Deferred)
931beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik *
932beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik *	memory:			will keep track of previous values and will call any callback added
933beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik *					after the list has been fired right away with the latest "memorized"
934beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik *					values (like a Deferred)
935beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik *
936beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik *	unique:			will ensure a callback can only be added once (no duplicate in the list)
937beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik *
938beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik *	stopOnFalse:	interrupt callings when a callback returns false
939beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik *
940beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik */
9414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.Callbacks = function( options ) {
942beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Convert options from String-formatted to Object-formatted if needed
944beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// (we check in cache first)
9454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	options = typeof options === "string" ?
9464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		( optionsCache[ options ] || createOptions( options ) ) :
9474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		jQuery.extend( {}, options );
948beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var // Last fire value (for non-forgettable lists)
950beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		memory,
9514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Flag to know if list was already fired
9524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		fired,
953beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Flag to know if list is currently firing
954beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		firing,
955beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// First callback to fire (used internally by add and fireWith)
956beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		firingStart,
957beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// End of the loop when firing
958beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		firingLength,
959beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Index of currently firing callback (modified by remove if needed)
960beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		firingIndex,
9614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Actual callback list
9624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		list = [],
9634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Stack of fire calls for repeatable lists
9644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		stack = !options.once && [],
965beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Fire callbacks
9664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		fire = function( data ) {
9674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			memory = options.memory && data;
9684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			fired = true;
969beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			firingIndex = firingStart || 0;
970beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			firingStart = 0;
971beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			firingLength = list.length;
9724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			firing = true;
973beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
9744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
9754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					memory = false; // To prevent further calls using add
976beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					break;
977beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
978beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
979beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			firing = false;
980beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( list ) {
9814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( stack ) {
9824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( stack.length ) {
9834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						fire( stack.shift() );
984beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
9854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				} else if ( memory ) {
986beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					list = [];
9874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				} else {
9884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					self.disable();
989beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
990beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
991beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
992beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Actual Callbacks object
993beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		self = {
994beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Add a callback or a collection of callbacks to the list
995beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			add: function() {
996beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( list ) {
9974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// First, we save the current length
9984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					var start = list.length;
9994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					(function add( args ) {
10004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						jQuery.each( args, function( _, arg ) {
10014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							var type = jQuery.type( arg );
10024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							if ( type === "function" ) {
10034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								if ( !options.unique || !self.has( arg ) ) {
10044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair									list.push( arg );
10054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								}
10064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							} else if ( arg && arg.length && type !== "string" ) {
10074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								// Inspect recursively
10084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								add( arg );
10094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							}
10104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						});
10114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					})( arguments );
1012beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// Do we need to add the callbacks to the
1013beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// current firing batch?
1014beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( firing ) {
1015beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						firingLength = list.length;
1016beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// With memory, if we're not firing then
10174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// we should call right away
10184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					} else if ( memory ) {
10194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						firingStart = start;
10204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						fire( memory );
1021beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
1022beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
1023beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return this;
1024beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			},
1025beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Remove a callback from the list
1026beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			remove: function() {
1027beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( list ) {
10284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					jQuery.each( arguments, function( _, arg ) {
10294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						var index;
10304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
10314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							list.splice( index, 1 );
10324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							// Handle firing indexes
10334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							if ( firing ) {
10344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								if ( index <= firingLength ) {
10354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair									firingLength--;
1036beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik								}
10374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								if ( index <= firingIndex ) {
10384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair									firingIndex--;
1039beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik								}
1040beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							}
1041beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
10424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					});
1043beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
1044beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return this;
1045beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			},
1046beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Control if a given callback is in the list
1047beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			has: function( fn ) {
10484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return jQuery.inArray( fn, list ) > -1;
1049beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			},
1050beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Remove all callbacks from the list
1051beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			empty: function() {
1052beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				list = [];
1053beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return this;
1054beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			},
1055beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Have the list do nothing anymore
1056beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			disable: function() {
1057beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				list = stack = memory = undefined;
1058beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return this;
1059beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			},
1060beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Is it disabled?
1061beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			disabled: function() {
1062beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return !list;
1063beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			},
1064beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Lock the list in its current state
1065beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			lock: function() {
1066beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				stack = undefined;
10674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( !memory ) {
1068beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					self.disable();
1069beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
1070beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return this;
1071beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			},
1072beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Is it locked?
1073beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			locked: function() {
1074beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return !stack;
1075beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			},
1076beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Call all callbacks with the given context and arguments
1077beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			fireWith: function( context, args ) {
10784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				args = args || [];
10794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				args = [ context, args.slice ? args.slice() : args ];
10804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( list && ( !fired || stack ) ) {
1081beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( firing ) {
10824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						stack.push( args );
10834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					} else {
10844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						fire( args );
1085beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
1086beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
1087beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return this;
1088beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			},
1089beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Call all the callbacks with the given arguments
1090beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			fire: function() {
1091beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				self.fireWith( this, arguments );
1092beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return this;
1093beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			},
1094beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// To know if the callbacks have already been called at least once
1095beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			fired: function() {
10964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return !!fired;
1097beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
1098beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		};
1099beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1100beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	return self;
1101beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik};
1102beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.extend({
1103beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1104beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	Deferred: function( func ) {
11054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var tuples = [
11064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// action, add listener, listener list, final state
11074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
11084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
11094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				[ "notify", "progress", jQuery.Callbacks("memory") ]
11104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			],
1111beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			state = "pending",
1112beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			promise = {
1113beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				state: function() {
1114beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					return state;
1115beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				},
1116beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				always: function() {
11174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					deferred.done( arguments ).fail( arguments );
1118beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					return this;
1119beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				},
11204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				then: function( /* fnDone, fnFail, fnProgress */ ) {
11214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					var fns = arguments;
1122beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					return jQuery.Deferred(function( newDefer ) {
11234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						jQuery.each( tuples, function( i, tuple ) {
11244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							var action = tuple[ 0 ],
11254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								fn = fns[ i ];
11264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							// deferred[ done | fail | progress ] for forwarding actions to newDefer
11274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
11284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								function() {
11294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair									var returned = fn.apply( this, arguments );
1130beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									if ( returned && jQuery.isFunction( returned.promise ) ) {
11314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair										returned.promise()
11324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair											.done( newDefer.resolve )
11334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair											.fail( newDefer.reject )
11344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair											.progress( newDefer.notify );
1135beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									} else {
1136beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
1137beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									}
11384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								} :
11394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								newDefer[ action ]
11404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							);
1141beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						});
11424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						fns = null;
1143beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}).promise();
1144beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				},
1145beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Get a promise for this deferred
1146beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// If obj is provided, the promise aspect is added to the object
1147beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				promise: function( obj ) {
11484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					return obj != null ? jQuery.extend( obj, promise ) : promise;
1149beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
1150beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			},
11514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			deferred = {};
1152beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
11534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Keep pipe for back-compat
11544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		promise.pipe = promise.then;
11554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
11564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Add list-specific methods
11574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		jQuery.each( tuples, function( i, tuple ) {
11584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var list = tuple[ 2 ],
11594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				stateString = tuple[ 3 ];
1160beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
11614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// promise[ done | fail | progress ] = list.add
11624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			promise[ tuple[1] ] = list.add;
11634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
11644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Handle state
11654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( stateString ) {
11664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				list.add(function() {
11674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// state = [ resolved | rejected ]
11684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					state = stateString;
11694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
11704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// [ reject_list | resolve_list ].disable; progress_list.lock
11714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
11724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
11734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
11744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// deferred[ resolve | reject | notify ] = list.fire
11754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			deferred[ tuple[0] ] = list.fire;
11764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			deferred[ tuple[0] + "With" ] = list.fireWith;
11774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		});
11784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
11794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Make the deferred a promise
11804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		promise.promise( deferred );
1181beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1182beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Call given func if any
1183beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( func ) {
1184beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			func.call( deferred, deferred );
1185beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1186beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1187beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// All done!
1188beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return deferred;
1189beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
1190beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1191beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Deferred helper
11924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	when: function( subordinate /* , ..., subordinateN */ ) {
11934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var i = 0,
11944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			resolveValues = core_slice.call( arguments ),
11954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			length = resolveValues.length,
11964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
11974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// the count of uncompleted subordinates
11984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
11994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
12004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
12014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
12024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
12034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Update function for both resolve and progress values
12044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			updateFunc = function( i, contexts, values ) {
12054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return function( value ) {
12064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					contexts[ i ] = this;
12074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
12084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if( values === progressValues ) {
12094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						deferred.notifyWith( contexts, values );
12104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					} else if ( !( --remaining ) ) {
12114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						deferred.resolveWith( contexts, values );
12124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
12134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				};
12144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			},
12154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
12164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			progressValues, progressContexts, resolveContexts;
12174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
12184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// add listeners to Deferred subordinates; treat others as resolved
1219beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( length > 1 ) {
12204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			progressValues = new Array( length );
12214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			progressContexts = new Array( length );
12224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			resolveContexts = new Array( length );
1223beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			for ( ; i < length; i++ ) {
12244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
12254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					resolveValues[ i ].promise()
12264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						.done( updateFunc( i, resolveContexts, resolveValues ) )
12274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						.fail( deferred.reject )
12284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						.progress( updateFunc( i, progressContexts, progressValues ) );
1229beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				} else {
12304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					--remaining;
1231beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
1232beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
1233beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
12344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
12354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// if we're not waiting on anything, resolve the master
12364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !remaining ) {
12374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			deferred.resolveWith( resolveContexts, resolveValues );
12384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
12394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
12404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return deferred.promise();
1241beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
1242beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
12434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.support = (function() {
1244beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1245beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	var support,
1246beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		all,
1247beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		a,
1248beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		select,
1249beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		opt,
1250beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		input,
1251beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		fragment,
1252beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		eventName,
1253beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		i,
1254beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		isSupported,
12554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		clickFn,
12564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		div = document.createElement("div");
1257beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
12584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Setup
12594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	div.setAttribute( "className", "t" );
12604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
1261beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
12624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Support tests won't run in some limited or non-browser environments
12634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	all = div.getElementsByTagName("*");
12644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	a = div.getElementsByTagName("a")[ 0 ];
12654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( !all || !a || !all.length ) {
1266beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return {};
1267beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
1268beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
12694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// First batch of tests
12704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	select = document.createElement("select");
1271beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	opt = select.appendChild( document.createElement("option") );
12724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	input = div.getElementsByTagName("input")[ 0 ];
1273beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
12744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	a.style.cssText = "top:1px;float:left;opacity:.5";
1275beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	support = {
1276beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// IE strips leading whitespace when .innerHTML is used
1277beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
1278beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1279beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Make sure that tbody elements aren't automatically inserted
1280beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// IE will insert them into empty tables
1281beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		tbody: !div.getElementsByTagName("tbody").length,
1282beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1283beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Make sure that link elements get serialized correctly by innerHTML
1284beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// This requires a wrapper element in IE
1285beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		htmlSerialize: !!div.getElementsByTagName("link").length,
1286beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1287beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Get the style information from getAttribute
1288beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// (IE uses .cssText instead)
1289beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		style: /top/.test( a.getAttribute("style") ),
1290beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1291beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Make sure that URLs aren't manipulated
1292beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// (IE normalizes it by default)
1293beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		hrefNormalized: ( a.getAttribute("href") === "/a" ),
1294beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1295beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Make sure that element opacity exists
1296beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// (IE uses filter instead)
1297beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Use a regex to work around a WebKit issue. See #5145
12984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		opacity: /^0.5/.test( a.style.opacity ),
1299beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1300beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Verify style float existence
1301beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// (IE uses styleFloat instead of cssFloat)
1302beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		cssFloat: !!a.style.cssFloat,
1303beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1304beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Make sure that if no value is specified for a checkbox
1305beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// that it defaults to "on".
1306beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// (WebKit defaults to "" instead)
1307beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		checkOn: ( input.value === "on" ),
1308beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1309beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Make sure that a selected-by-default option has a working selected property.
1310beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
1311beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		optSelected: opt.selected,
1312beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1313beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
1314beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		getSetAttribute: div.className !== "t",
1315beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
13164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Tests for enctype support on a form (#6743)
1317beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		enctype: !!document.createElement("form").enctype,
1318beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1319beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Makes sure cloning an html5 element does not cause problems
1320beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Where outerHTML is undefined, this still works
1321beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
1322beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
13234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
13244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		boxModel: ( document.compatMode === "CSS1Compat" ),
13254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
1326beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Will be defined later
1327beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		submitBubbles: true,
1328beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		changeBubbles: true,
1329beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		focusinBubbles: false,
1330beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		deleteExpando: true,
1331beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		noCloneEvent: true,
1332beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		inlineBlockNeedsLayout: false,
1333beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		shrinkWrapBlocks: false,
13344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		reliableMarginRight: true,
13354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		boxSizingReliable: true,
13364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		pixelPosition: false
1337beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
1338beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1339beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Make sure checked status is properly cloned
1340beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	input.checked = true;
1341beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	support.noCloneChecked = input.cloneNode( true ).checked;
1342beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1343beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Make sure that the options inside disabled selects aren't marked as disabled
1344beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// (WebKit marks them as disabled)
1345beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	select.disabled = true;
1346beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	support.optDisabled = !opt.disabled;
1347beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1348beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Test to see if it's possible to delete an expando from an element
1349beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Fails in Internet Explorer
1350beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	try {
1351beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		delete div.test;
1352beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	} catch( e ) {
1353beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		support.deleteExpando = false;
1354beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
1355beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1356beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
13574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		div.attachEvent( "onclick", clickFn = function() {
1358beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Cloning a node shouldn't copy over any
1359beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// bound event handlers (IE does this)
1360beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			support.noCloneEvent = false;
1361beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
13624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		div.cloneNode( true ).fireEvent("onclick");
13634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		div.detachEvent( "onclick", clickFn );
1364beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
1365beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1366beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Check if a radio maintains its value
1367beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// after being appended to the DOM
1368beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	input = document.createElement("input");
1369beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	input.value = "t";
13704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	input.setAttribute( "type", "radio" );
1371beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	support.radioValue = input.value === "t";
1372beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
13734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	input.setAttribute( "checked", "checked" );
13744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
13754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// #11217 - WebKit loses check when the name is after the checked attribute
13764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	input.setAttribute( "name", "t" );
13774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
1378beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	div.appendChild( input );
1379beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	fragment = document.createDocumentFragment();
1380beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	fragment.appendChild( div.lastChild );
1381beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1382beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// WebKit doesn't clone checked state correctly in fragments
1383beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
1384beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1385beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Check if a disconnected checkbox will retain its checked
1386beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// value of true after appended to the DOM (IE6/7)
1387beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	support.appendChecked = input.checked;
1388beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1389beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	fragment.removeChild( input );
1390beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	fragment.appendChild( div );
1391beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1392beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Technique from Juriy Zaytsev
1393beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
1394beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// We only care about the case where non-standard event systems
1395beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// are used, namely in IE. Short-circuiting here helps us to
1396beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// avoid an eval call (in setAttribute) which can cause CSP
1397beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
1398beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( div.attachEvent ) {
13994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		for ( i in {
14004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			submit: true,
14014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			change: true,
14024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			focusin: true
1403beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}) {
1404beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			eventName = "on" + i;
1405beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			isSupported = ( eventName in div );
1406beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( !isSupported ) {
1407beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				div.setAttribute( eventName, "return;" );
1408beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				isSupported = ( typeof div[ eventName ] === "function" );
1409beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
1410beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			support[ i + "Bubbles" ] = isSupported;
1411beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1412beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
1413beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1414beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Run tests that need a body at doc ready
1415beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery(function() {
14164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var container, div, tds, marginDiv,
14174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
1418beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			body = document.getElementsByTagName("body")[0];
1419beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1420beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !body ) {
1421beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Return for frameset docs that don't have a body
1422beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return;
1423beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1424beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1425beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		container = document.createElement("div");
14264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
1427beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		body.insertBefore( container, body.firstChild );
1428beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1429beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Construct the test element
1430beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		div = document.createElement("div");
1431beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		container.appendChild( div );
1432beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1433beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Check if table cells still have offsetWidth/Height when they are set
1434beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// to display:none and there are still other visible table cells in a
1435beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// table row; if so, offsetWidth/Height are not reliable for use when
1436beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// determining if an element has been hidden directly using
1437beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// display:none (it is still safe to use offsets if a parent element is
1438beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// hidden; don safety goggles and see bug #4512 for more information).
1439beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// (only IE 8 fails this test)
14404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
14414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		tds = div.getElementsByTagName("td");
14424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
1443beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		isSupported = ( tds[ 0 ].offsetHeight === 0 );
1444beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1445beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		tds[ 0 ].style.display = "";
1446beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		tds[ 1 ].style.display = "none";
1447beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1448beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Check if empty table cells still have offsetWidth/Height
1449beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// (IE <= 8 fail this test)
1450beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
1451beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
14524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Check box-sizing and margin behavior
1453beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		div.innerHTML = "";
14544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
14554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		support.boxSizing = ( div.offsetWidth === 4 );
14564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
14574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
14584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// NOTE: To any future maintainer, we've window.getComputedStyle
14594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// because jsdom on node.js will break without it.
14604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( window.getComputedStyle ) {
14614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
14624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
14634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
14644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Check if div with explicit width and no margin-right incorrectly
14654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// gets computed margin-right based on width of container. For more
14664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// info see bug #3333
14674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Fails in WebKit before Feb 2011 nightlies
14684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
14694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			marginDiv = document.createElement("div");
14704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			marginDiv.style.cssText = div.style.cssText = divReset;
14714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			marginDiv.style.marginRight = marginDiv.style.width = "0";
14724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			div.style.width = "1px";
14734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			div.appendChild( marginDiv );
14744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			support.reliableMarginRight =
14754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
14764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
1477beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1478beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( typeof div.style.zoom !== "undefined" ) {
1479beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Check if natively block-level elements act like inline-block
1480beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// elements when setting their display to 'inline' and giving
1481beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// them layout
1482beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// (IE < 8 does this)
14834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			div.innerHTML = "";
14844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
14854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
1486beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1487beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Check if elements with layout shrink-wrap their children
1488beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// (IE 6 does this)
14894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			div.style.display = "block";
14904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			div.style.overflow = "visible";
14914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			div.innerHTML = "<div></div>";
14924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			div.firstChild.style.width = "5px";
14934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
1494beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
14954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			container.style.zoom = 1;
14964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
1497beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
14984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Null elements to avoid leaks in IE
1499beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		body.removeChild( container );
15004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		container = div = tds = marginDiv = null;
1501beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	});
1502beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
15034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Null elements to avoid leaks in IE
15044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	fragment.removeChild( div );
15054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	all = a = select = opt = input = fragment = div = null;
15064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
1507beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	return support;
1508beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik})();
15094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairvar rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
1510beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rmultiDash = /([A-Z])/g;
1511beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1512beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.extend({
1513beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	cache: {},
1514beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
15154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	deletedIds: [],
15164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
15174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Remove at next major release (1.9/2.0)
1518beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	uuid: 0,
1519beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1520beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Unique for each copy of jQuery on the page
1521beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Non-digits removed to match rinlinejQuery
1522beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
1523beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1524beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// The following elements throw uncatchable exceptions if you
1525beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// attempt to add expando properties to them.
1526beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	noData: {
1527beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		"embed": true,
1528beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Ban all objects except for Flash (which handle expandos)
1529beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
1530beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		"applet": true
1531beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
1532beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1533beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	hasData: function( elem ) {
1534beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
1535beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return !!elem && !isEmptyDataObject( elem );
1536beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
1537beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1538beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
1539beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !jQuery.acceptData( elem ) ) {
1540beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return;
1541beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1542beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
15434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var thisCache, ret,
1544beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			internalKey = jQuery.expando,
1545beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			getByName = typeof name === "string",
1546beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1547beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// We have to handle DOM nodes and JS objects differently because IE6-7
1548beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// can't GC object references properly across the DOM-JS boundary
1549beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			isNode = elem.nodeType,
1550beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1551beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Only DOM nodes need the global jQuery cache; JS object data is
1552beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// attached directly to the object so GC can occur automatically
1553beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			cache = isNode ? jQuery.cache : elem,
1554beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1555beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Only defining an ID for JS objects if its cache already exists allows
1556beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// the code to shortcut on the same path as a DOM node with no cache
15574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
1558beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1559beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Avoid doing any more work than we need to when trying to get data on an
1560beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// object that has no data at all
15614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
1562beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return;
1563beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1564beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1565beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !id ) {
1566beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Only DOM nodes need a new unique ID for each element since their data
1567beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// ends up in the global cache
1568beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( isNode ) {
15694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;
1570beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else {
1571beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				id = internalKey;
1572beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
1573beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1574beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1575beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !cache[ id ] ) {
1576beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			cache[ id ] = {};
1577beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1578beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Avoids exposing jQuery metadata on plain JS objects when the object
1579beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// is serialized using JSON.stringify
1580beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( !isNode ) {
1581beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				cache[ id ].toJSON = jQuery.noop;
1582beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
1583beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1584beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1585beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// An object can be passed to jQuery.data instead of a key/value pair; this gets
1586beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// shallow copied over onto the existing cache
1587beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( typeof name === "object" || typeof name === "function" ) {
1588beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( pvt ) {
1589beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				cache[ id ] = jQuery.extend( cache[ id ], name );
1590beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else {
1591beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
1592beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
1593beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1594beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
15954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		thisCache = cache[ id ];
1596beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1597beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// jQuery data() is stored in a separate object inside the object's internal data
1598beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// cache in order to avoid key collisions between internal data and user-defined
1599beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// data.
1600beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !pvt ) {
1601beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( !thisCache.data ) {
1602beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				thisCache.data = {};
1603beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
1604beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1605beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			thisCache = thisCache.data;
1606beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1607beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1608beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( data !== undefined ) {
1609beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			thisCache[ jQuery.camelCase( name ) ] = data;
1610beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1611beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1612beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Check for both converted-to-camel and non-converted data property names
1613beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// If a data property was specified
1614beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( getByName ) {
1615beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1616beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// First Try to find as-is property data
1617beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			ret = thisCache[ name ];
1618beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1619beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Test for null|undefined property data
1620beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( ret == null ) {
1621beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1622beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Try to find the camelCased property
1623beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				ret = thisCache[ jQuery.camelCase( name ) ];
1624beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
1625beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else {
1626beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			ret = thisCache;
1627beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1628beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1629beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return ret;
1630beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
1631beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1632beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
1633beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !jQuery.acceptData( elem ) ) {
1634beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return;
1635beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1636beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1637beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var thisCache, i, l,
1638beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1639beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			isNode = elem.nodeType,
1640beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1641beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// See jQuery.data for more information
1642beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			cache = isNode ? jQuery.cache : elem,
16434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
1644beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1645beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// If there is already no cache entry for this object, there is no
1646beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// purpose in continuing
1647beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !cache[ id ] ) {
1648beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return;
1649beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1650beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1651beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( name ) {
1652beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1653beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			thisCache = pvt ? cache[ id ] : cache[ id ].data;
1654beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1655beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( thisCache ) {
1656beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1657beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Support array or space separated string names for data keys
1658beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( !jQuery.isArray( name ) ) {
1659beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1660beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// try the string as a key before any manipulation
1661beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( name in thisCache ) {
1662beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						name = [ name ];
1663beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					} else {
1664beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1665beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						// split the camel cased version by spaces unless a key with the spaces exists
1666beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						name = jQuery.camelCase( name );
1667beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						if ( name in thisCache ) {
1668beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							name = [ name ];
1669beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						} else {
16704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							name = name.split(" ");
1671beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
1672beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
1673beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
1674beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1675beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				for ( i = 0, l = name.length; i < l; i++ ) {
1676beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					delete thisCache[ name[i] ];
1677beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
1678beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1679beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// If there is no data left in the cache, we want to continue
1680beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// and let the cache object itself get destroyed
1681beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
1682beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					return;
1683beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
1684beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
1685beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1686beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1687beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// See jQuery.data for more information
1688beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !pvt ) {
1689beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			delete cache[ id ].data;
1690beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1691beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Don't destroy the parent cache unless the internal data object
1692beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// had been the only thing left in it
16934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( !isEmptyDataObject( cache[ id ] ) ) {
1694beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return;
1695beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
1696beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1697beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
16984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Destroy the cache
16994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( isNode ) {
17004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			jQuery.cleanData( [ elem ], true );
17014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
17024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
17034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} else if ( jQuery.support.deleteExpando || cache != cache.window ) {
1704beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			delete cache[ id ];
17054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
17064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// When all else fails, null
1707beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else {
1708beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			cache[ id ] = null;
1709beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1710beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
1711beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1712beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// For internal use only.
1713beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	_data: function( elem, name, data ) {
1714beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery.data( elem, name, data, true );
1715beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
1716beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1717beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// A method for determining if a DOM node can handle the data expando
1718beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	acceptData: function( elem ) {
17194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
1720beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
17214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// nodes accept data unless otherwise specified; rejection can be conditional
17224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return !noData || noData !== true && elem.getAttribute("classid") === noData;
1723beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
1724beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
1725beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1726beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.fn.extend({
1727beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	data: function( key, value ) {
17284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var parts, part, attr, name, l,
17294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			elem = this[0],
17304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			i = 0,
1731beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			data = null;
1732beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
17334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Gets all values
17344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( key === undefined ) {
1735beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( this.length ) {
17364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				data = jQuery.data( elem );
1737beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
17384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
17394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					attr = elem.attributes;
17404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					for ( l = attr.length; i < l; i++ ) {
1741beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						name = attr[i].name;
1742beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
17434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						if ( !name.indexOf( "data-" ) ) {
1744beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							name = jQuery.camelCase( name.substring(5) );
1745beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
17464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							dataAttr( elem, name, data[ name ] );
1747beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
1748beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
17494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					jQuery._data( elem, "parsedAttrs", true );
1750beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
1751beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
1752beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1753beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return data;
17544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
1755beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
17564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Sets multiple values
17574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( typeof key === "object" ) {
1758beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return this.each(function() {
1759beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jQuery.data( this, key );
1760beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			});
1761beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1762beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
17634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		parts = key.split( ".", 2 );
1764beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		parts[1] = parts[1] ? "." + parts[1] : "";
17654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		part = parts[1] + "!";
1766beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
17674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return jQuery.access( this, function( value ) {
1768beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
17694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( value === undefined ) {
17704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				data = this.triggerHandler( "getData" + part, [ parts[0] ] );
1771beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
17724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Try to fetch any internally stored data first
17734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( data === undefined && elem ) {
17744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					data = jQuery.data( elem, key );
17754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					data = dataAttr( elem, key, data );
17764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
1777beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
17784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return data === undefined && parts[1] ?
17794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					this.data( parts[0] ) :
17804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					data;
17814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
17824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
17834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			parts[1] = value;
17844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			this.each(function() {
17854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				var self = jQuery( this );
1786beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
17874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				self.triggerHandler( "setData" + part, parts );
1788beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jQuery.data( this, key, value );
17894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				self.triggerHandler( "changeData" + part, parts );
1790beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			});
17914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}, null, value, arguments.length > 1, null, false );
1792beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
1793beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1794beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	removeData: function( key ) {
1795beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.each(function() {
1796beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.removeData( this, key );
1797beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
1798beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
1799beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
1800beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1801beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikfunction dataAttr( elem, key, data ) {
1802beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// If nothing was found internally, try to fetch any
1803beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// data from the HTML5 data-* attribute
1804beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( data === undefined && elem.nodeType === 1 ) {
1805beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1806beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
1807beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1808beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		data = elem.getAttribute( name );
1809beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1810beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( typeof data === "string" ) {
1811beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			try {
1812beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				data = data === "true" ? true :
1813beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				data === "false" ? false :
1814beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				data === "null" ? null :
18154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Only convert to a number if it doesn't change the string
18164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				+data + "" === data ? +data :
18174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				rbrace.test( data ) ? jQuery.parseJSON( data ) :
1818beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					data;
1819beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} catch( e ) {}
1820beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1821beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Make sure we set the data so it isn't changed later
1822beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.data( elem, key, data );
1823beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1824beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else {
1825beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			data = undefined;
1826beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1827beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
1828beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1829beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	return data;
1830beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
1831beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1832beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// checks a cache object for emptiness
1833beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikfunction isEmptyDataObject( obj ) {
18344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var name;
18354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	for ( name in obj ) {
1836beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1837beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// if the public data object is empty, the private is still empty
1838beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
1839beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			continue;
1840beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1841beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( name !== "toJSON" ) {
1842beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return false;
1843beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1844beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
1845beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1846beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	return true;
1847beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
1848beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.extend({
1849beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	queue: function( elem, type, data ) {
18504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var queue;
18514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
1852beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( elem ) {
1853beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			type = ( type || "fx" ) + "queue";
18544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			queue = jQuery._data( elem, type );
1855beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1856beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Speed up dequeue by getting out quickly if this is just a lookup
1857beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( data ) {
18584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( !queue || jQuery.isArray(data) ) {
18594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					queue = jQuery._data( elem, type, jQuery.makeArray(data) );
1860beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				} else {
18614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					queue.push( data );
1862beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
1863beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
18644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return queue || [];
1865beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1866beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
1867beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1868beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	dequeue: function( elem, type ) {
1869beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		type = type || "fx";
1870beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1871beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var queue = jQuery.queue( elem, type ),
18724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			startLength = queue.length,
1873beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			fn = queue.shift(),
18744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			hooks = jQuery._queueHooks( elem, type ),
18754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			next = function() {
18764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery.dequeue( elem, type );
18774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			};
1878beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1879beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// If the fx queue is dequeued, always remove the progress sentinel
1880beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( fn === "inprogress" ) {
1881beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			fn = queue.shift();
18824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			startLength--;
1883beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1884beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1885beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( fn ) {
18864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
1887beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Add a progress sentinel to prevent the fx queue from being
1888beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// automatically dequeued
1889beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( type === "fx" ) {
1890beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				queue.unshift( "inprogress" );
1891beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
1892beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
18934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// clear up the last queue stop function
18944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			delete hooks.stop;
18954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			fn.call( elem, next, hooks );
1896beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1897beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
18984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !startLength && hooks ) {
18994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			hooks.empty.fire();
1900beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
19014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	},
19024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
19034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// not intended for public consumption - generates a queueHooks object, or returns the current one
19044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	_queueHooks: function( elem, type ) {
19054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var key = type + "queueHooks";
19064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return jQuery._data( elem, key ) || jQuery._data( elem, key, {
19074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			empty: jQuery.Callbacks("once memory").add(function() {
19084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery.removeData( elem, type + "queue", true );
19094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery.removeData( elem, key, true );
19104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			})
19114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		});
1912beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
1913beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
1914beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1915beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.fn.extend({
1916beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	queue: function( type, data ) {
19174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var setter = 2;
19184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
1919beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( typeof type !== "string" ) {
1920beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			data = type;
1921beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			type = "fx";
19224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			setter--;
1923beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1924beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
19254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( arguments.length < setter ) {
1926beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return jQuery.queue( this[0], type );
1927beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1928beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
19294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return data === undefined ?
19304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			this :
19314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			this.each(function() {
19324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				var queue = jQuery.queue( this, type, data );
19334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
19344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// ensure a hooks for this queue
19354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery._queueHooks( this, type );
19364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
19374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( type === "fx" && queue[0] !== "inprogress" ) {
19384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					jQuery.dequeue( this, type );
19394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
19404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			});
1941beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
1942beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	dequeue: function( type ) {
1943beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.each(function() {
1944beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.dequeue( this, type );
1945beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
1946beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
1947beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Based off of the plugin by Clint Helfers, with permission.
1948beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// http://blindsignals.com/index.php/2009/07/jquery-delay/
1949beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	delay: function( time, type ) {
1950beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
1951beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		type = type || "fx";
1952beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
1953beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.queue( type, function( next, hooks ) {
1954beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			var timeout = setTimeout( next, time );
1955beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			hooks.stop = function() {
1956beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				clearTimeout( timeout );
1957beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			};
1958beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
1959beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
1960beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	clearQueue: function( type ) {
1961beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.queue( type || "fx", [] );
1962beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
1963beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Get a promise resolved when queues of a certain type
1964beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// are emptied (fx is the type by default)
19654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	promise: function( type, obj ) {
19664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var tmp,
19674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			count = 1,
19684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			defer = jQuery.Deferred(),
19694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			elements = this,
19704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			i = this.length,
19714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			resolve = function() {
19724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( !( --count ) ) {
19734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					defer.resolveWith( elements, [ elements ] );
19744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
19754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			};
19764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
1977beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( typeof type !== "string" ) {
19784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			obj = type;
1979beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			type = undefined;
1980beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1981beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		type = type || "fx";
19824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
1983beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		while( i-- ) {
19844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			tmp = jQuery._data( elements[ i ], type + "queueHooks" );
19854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( tmp && tmp.empty ) {
1986beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				count++;
19874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				tmp.empty.add( resolve );
1988beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
1989beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
1990beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		resolve();
19914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return defer.promise( obj );
1992beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
1993beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
19944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairvar nodeHook, boolHook, fixSpecified,
19954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rclass = /[\t\r\n]/g,
1996beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rreturn = /\r/g,
1997beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rtype = /^(?:button|input)$/i,
1998beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rfocusable = /^(?:button|input|object|select|textarea)$/i,
19994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rclickable = /^a(?:rea|)$/i,
2000beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
20014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	getSetAttribute = jQuery.support.getSetAttribute;
2002beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2003beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.fn.extend({
2004beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	attr: function( name, value ) {
20054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
2006beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
2007beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2008beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	removeAttr: function( name ) {
2009beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.each(function() {
2010beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.removeAttr( this, name );
2011beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
2012beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
2013beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2014beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	prop: function( name, value ) {
20154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
2016beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
2017beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2018beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	removeProp: function( name ) {
2019beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		name = jQuery.propFix[ name ] || name;
2020beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.each(function() {
2021beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// try/catch handles cases where IE balks (such as removing a property on window)
2022beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			try {
2023beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				this[ name ] = undefined;
2024beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				delete this[ name ];
2025beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} catch( e ) {}
2026beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
2027beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
2028beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2029beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	addClass: function( value ) {
2030beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var classNames, i, l, elem,
2031beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			setClass, c, cl;
2032beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2033beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( jQuery.isFunction( value ) ) {
2034beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return this.each(function( j ) {
2035beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jQuery( this ).addClass( value.call(this, j, this.className) );
2036beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			});
2037beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2038beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2039beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( value && typeof value === "string" ) {
20404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			classNames = value.split( core_rspace );
2041beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2042beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			for ( i = 0, l = this.length; i < l; i++ ) {
2043beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				elem = this[ i ];
2044beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2045beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( elem.nodeType === 1 ) {
2046beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( !elem.className && classNames.length === 1 ) {
2047beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						elem.className = value;
2048beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2049beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					} else {
2050beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						setClass = " " + elem.className + " ";
2051beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2052beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
20534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							if ( setClass.indexOf( " " + classNames[ c ] + " " ) < 0 ) {
2054beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik								setClass += classNames[ c ] + " ";
2055beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							}
2056beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
2057beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						elem.className = jQuery.trim( setClass );
2058beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
2059beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
2060beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2061beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2062beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2063beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this;
2064beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
2065beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2066beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	removeClass: function( value ) {
20674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var removes, className, elem, c, cl, i, l;
2068beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2069beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( jQuery.isFunction( value ) ) {
2070beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return this.each(function( j ) {
2071beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jQuery( this ).removeClass( value.call(this, j, this.className) );
2072beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			});
2073beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2074beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( (value && typeof value === "string") || value === undefined ) {
20754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			removes = ( value || "" ).split( core_rspace );
2076beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2077beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			for ( i = 0, l = this.length; i < l; i++ ) {
2078beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				elem = this[ i ];
2079beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( elem.nodeType === 1 && elem.className ) {
2080beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
20814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					className = (" " + elem.className + " ").replace( rclass, " " );
20824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
20834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// loop over each item in the removal list
20844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					for ( c = 0, cl = removes.length; c < cl; c++ ) {
20854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// Remove until there is nothing to remove,
20864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						while ( className.indexOf(" " + removes[ c ] + " ") >= 0 ) {
20874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							className = className.replace( " " + removes[ c ] + " " , " " );
20884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
2089beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
20904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					elem.className = value ? jQuery.trim( className ) : "";
2091beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
2092beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2093beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2094beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2095beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this;
2096beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
2097beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2098beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	toggleClass: function( value, stateVal ) {
2099beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var type = typeof value,
2100beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			isBool = typeof stateVal === "boolean";
2101beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2102beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( jQuery.isFunction( value ) ) {
2103beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return this.each(function( i ) {
2104beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
2105beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			});
2106beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2107beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2108beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.each(function() {
2109beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( type === "string" ) {
2110beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// toggle individual class names
2111beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				var className,
2112beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					i = 0,
2113beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					self = jQuery( this ),
2114beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					state = stateVal,
21154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					classNames = value.split( core_rspace );
2116beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2117beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				while ( (className = classNames[ i++ ]) ) {
21184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// check each className given, space separated list
2119beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					state = isBool ? state : !self.hasClass( className );
2120beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					self[ state ? "addClass" : "removeClass" ]( className );
2121beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
2122beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2123beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else if ( type === "undefined" || type === "boolean" ) {
2124beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( this.className ) {
2125beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// store className if set
2126beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					jQuery._data( this, "__className__", this.className );
2127beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
2128beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2129beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// toggle whole className
2130beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
2131beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2132beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
2133beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
2134beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2135beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	hasClass: function( selector ) {
2136beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var className = " " + selector + " ",
2137beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			i = 0,
2138beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			l = this.length;
2139beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		for ( ; i < l; i++ ) {
21404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
2141beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return true;
2142beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2143beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2144beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2145beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return false;
2146beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
2147beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2148beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	val: function( value ) {
2149beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var hooks, ret, isFunction,
2150beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			elem = this[0];
2151beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2152beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !arguments.length ) {
2153beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( elem ) {
21544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
2155beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2156beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
2157beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					return ret;
2158beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
2159beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2160beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				ret = elem.value;
2161beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2162beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return typeof ret === "string" ?
2163beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// handle most common string cases
2164beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					ret.replace(rreturn, "") :
2165beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// handle cases where value is null/undef or number
2166beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					ret == null ? "" : ret;
2167beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2168beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2169beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return;
2170beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2171beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2172beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		isFunction = jQuery.isFunction( value );
2173beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2174beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.each(function( i ) {
21754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var val,
21764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				self = jQuery(this);
2177beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2178beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( this.nodeType !== 1 ) {
2179beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return;
2180beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2181beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2182beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( isFunction ) {
2183beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				val = value.call( this, i, self.val() );
2184beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else {
2185beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				val = value;
2186beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2187beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2188beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Treat null/undefined as ""; convert numbers to string
2189beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( val == null ) {
2190beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				val = "";
2191beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else if ( typeof val === "number" ) {
2192beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				val += "";
2193beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else if ( jQuery.isArray( val ) ) {
2194beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				val = jQuery.map(val, function ( value ) {
2195beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					return value == null ? "" : value + "";
2196beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				});
2197beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2198beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
21994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
2200beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2201beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// If set returns undefined, fall back to normal setting
2202beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
2203beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				this.value = val;
2204beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2205beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
2206beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
2207beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
2208beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2209beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.extend({
2210beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	valHooks: {
2211beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		option: {
2212beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			get: function( elem ) {
2213beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// attributes.value is undefined in Blackberry 4.7 but
2214beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// uses .value. See #6932
2215beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				var val = elem.attributes.value;
2216beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return !val || val.specified ? elem.value : elem.text;
2217beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2218beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
2219beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		select: {
2220beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			get: function( elem ) {
22214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				var value, option,
2222beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					options = elem.options,
22234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					index = elem.selectedIndex,
22244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					one = elem.type === "select-one" || index < 0,
22254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					values = one ? null : [],
22264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					max = one ? index + 1 : options.length,
22274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					i = index < 0 ?
22284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						max :
22294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						one ? index : 0;
2230beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2231beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Loop through all the selected options
2232beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				for ( ; i < max; i++ ) {
2233beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					option = options[ i ];
2234beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
22354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// oldIE doesn't update selected after form reset (#2551)
22364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( ( option.selected || i === index ) &&
22374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							// Don't return options that are disabled or in a disabled optgroup
22384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
22394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
2240beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2241beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						// Get the specific value for the option
2242beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						value = jQuery( option ).val();
2243beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2244beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						// We don't need an array for one selects
2245beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						if ( one ) {
2246beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							return value;
2247beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
2248beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2249beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						// Multi-Selects return an array
2250beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						values.push( value );
2251beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
2252beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
2253beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2254beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return values;
2255beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			},
2256beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2257beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			set: function( elem, value ) {
2258beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				var values = jQuery.makeArray( value );
2259beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2260beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jQuery(elem).find("option").each(function() {
2261beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
2262beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				});
2263beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2264beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( !values.length ) {
2265beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					elem.selectedIndex = -1;
2266beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
2267beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return values;
2268beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2269beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2270beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
2271beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
22724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
22734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	attrFn: {},
2274beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2275beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	attr: function( elem, name, value, pass ) {
2276beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var ret, hooks, notxml,
2277beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			nType = elem.nodeType;
2278beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2279beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// don't get/set attributes on text, comment and attribute nodes
2280beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2281beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return;
2282beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2283beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
22844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
2285beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return jQuery( elem )[ name ]( value );
2286beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2287beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2288beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Fallback to prop when attributes are not supported
2289beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( typeof elem.getAttribute === "undefined" ) {
2290beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return jQuery.prop( elem, name, value );
2291beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2292beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2293beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2294beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2295beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// All attributes are lowercase
2296beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Grab necessary hook if one is defined
2297beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( notxml ) {
2298beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			name = name.toLowerCase();
2299beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
2300beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2301beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2302beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( value !== undefined ) {
2303beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2304beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( value === null ) {
2305beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jQuery.removeAttr( elem, name );
2306beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return;
2307beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2308beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
2309beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return ret;
2310beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2311beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else {
23124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				elem.setAttribute( name, value + "" );
2313beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return value;
2314beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2315beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2316beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
2317beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return ret;
2318beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2319beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else {
2320beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2321beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			ret = elem.getAttribute( name );
2322beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2323beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Non-existent attributes return null, we normalize to undefined
2324beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return ret === null ?
2325beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				undefined :
2326beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				ret;
2327beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2328beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
2329beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2330beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	removeAttr: function( elem, value ) {
23314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var propName, attrNames, name, isBool,
2332beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			i = 0;
2333beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2334beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( value && elem.nodeType === 1 ) {
2335beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
23364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			attrNames = value.split( core_rspace );
23374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
23384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			for ( ; i < attrNames.length; i++ ) {
2339beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				name = attrNames[ i ];
2340beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2341beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( name ) {
2342beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					propName = jQuery.propFix[ name ] || name;
23434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					isBool = rboolean.test( name );
2344beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2345beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// See #9699 for explanation of this approach (setting first, then removal)
23464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Do not do this for boolean attributes (see #10870)
23474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( !isBool ) {
23484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						jQuery.attr( elem, name, "" );
23494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
2350beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					elem.removeAttribute( getSetAttribute ? name : propName );
2351beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2352beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// Set corresponding property to false for boolean attributes
23534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( isBool && propName in elem ) {
2354beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						elem[ propName ] = false;
2355beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
2356beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
2357beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2358beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2359beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
2360beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2361beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	attrHooks: {
2362beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		type: {
2363beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			set: function( elem, value ) {
2364beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// We can't allow the type property to be changed (since it causes problems in IE)
2365beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
2366beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					jQuery.error( "type property can't be changed" );
2367beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
2368beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// Setting the type on a radio button after the value resets the value in IE6-9
2369beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// Reset value to it's default in case type is set after value
2370beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// This is for element creation
2371beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					var val = elem.value;
2372beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					elem.setAttribute( "type", value );
2373beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( val ) {
2374beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						elem.value = val;
2375beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
2376beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					return value;
2377beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
2378beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2379beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
2380beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Use the value property for back compat
2381beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Use the nodeHook for button elements in IE6/7 (#1954)
2382beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		value: {
2383beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			get: function( elem, name ) {
2384beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
2385beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					return nodeHook.get( elem, name );
2386beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
2387beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return name in elem ?
2388beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					elem.value :
2389beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					null;
2390beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			},
2391beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			set: function( elem, value, name ) {
2392beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
2393beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					return nodeHook.set( elem, value, name );
2394beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
2395beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Does not return so that setAttribute is also used
2396beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				elem.value = value;
2397beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2398beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2399beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
2400beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2401beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	propFix: {
2402beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		tabindex: "tabIndex",
2403beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		readonly: "readOnly",
2404beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		"for": "htmlFor",
2405beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		"class": "className",
2406beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		maxlength: "maxLength",
2407beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		cellspacing: "cellSpacing",
2408beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		cellpadding: "cellPadding",
2409beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		rowspan: "rowSpan",
2410beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		colspan: "colSpan",
2411beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		usemap: "useMap",
2412beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		frameborder: "frameBorder",
2413beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		contenteditable: "contentEditable"
2414beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
2415beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2416beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	prop: function( elem, name, value ) {
2417beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var ret, hooks, notxml,
2418beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			nType = elem.nodeType;
2419beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2420beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// don't get/set properties on text, comment and attribute nodes
2421beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2422beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return;
2423beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2424beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2425beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2426beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2427beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( notxml ) {
2428beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Fix name and attach hooks
2429beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			name = jQuery.propFix[ name ] || name;
2430beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			hooks = jQuery.propHooks[ name ];
2431beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2432beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2433beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( value !== undefined ) {
2434beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
2435beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return ret;
2436beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2437beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else {
2438beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return ( elem[ name ] = value );
2439beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2440beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2441beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else {
2442beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
2443beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return ret;
2444beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2445beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else {
2446beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return elem[ name ];
2447beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2448beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2449beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
2450beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2451beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	propHooks: {
2452beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		tabIndex: {
2453beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			get: function( elem ) {
2454beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
2455beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
2456beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				var attributeNode = elem.getAttributeNode("tabindex");
2457beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2458beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return attributeNode && attributeNode.specified ?
2459beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					parseInt( attributeNode.value, 10 ) :
2460beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
2461beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						0 :
2462beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						undefined;
2463beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2464beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2465beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
2466beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
2467beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2468beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Hook for boolean attributes
2469beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikboolHook = {
2470beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	get: function( elem, name ) {
2471beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Align boolean attributes with corresponding properties
2472beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Fall back to attribute presence where some booleans are not supported
2473beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var attrNode,
2474beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			property = jQuery.prop( elem, name );
2475beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
2476beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			name.toLowerCase() :
2477beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			undefined;
2478beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
2479beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	set: function( elem, value, name ) {
2480beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var propName;
2481beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( value === false ) {
2482beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Remove boolean attributes when set to false
2483beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.removeAttr( elem, name );
2484beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else {
2485beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// value is true since we know at this point it's type boolean and not false
2486beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Set boolean attributes to the same name and set the DOM property
2487beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			propName = jQuery.propFix[ name ] || name;
2488beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( propName in elem ) {
2489beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Only set the IDL specifically if it already exists on the element
2490beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				elem[ propName ] = true;
2491beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2492beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2493beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			elem.setAttribute( name, name.toLowerCase() );
2494beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2495beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return name;
2496beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
2497beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik};
2498beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2499beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// IE6/7 do not support getting/setting some attributes with get/setAttribute
2500beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikif ( !getSetAttribute ) {
2501beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2502beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	fixSpecified = {
2503beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		name: true,
25044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		id: true,
25054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		coords: true
2506beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
2507beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2508beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Use this for any attribute in IE6/7
2509beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// This fixes almost every IE6/7 issue
2510beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	nodeHook = jQuery.valHooks.button = {
2511beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		get: function( elem, name ) {
2512beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			var ret;
2513beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			ret = elem.getAttributeNode( name );
25144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ?
25154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				ret.value :
2516beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				undefined;
2517beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
2518beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		set: function( elem, value, name ) {
2519beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Set the existing or create a new attribute node
2520beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			var ret = elem.getAttributeNode( name );
2521beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( !ret ) {
2522beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				ret = document.createAttribute( name );
2523beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				elem.setAttributeNode( ret );
2524beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
25254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return ( ret.value = value + "" );
2526beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2527beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
2528beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2529beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
2530beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// This is for removals
2531beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.each([ "width", "height" ], function( i, name ) {
2532beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2533beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			set: function( elem, value ) {
2534beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( value === "" ) {
2535beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					elem.setAttribute( name, "auto" );
2536beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					return value;
2537beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
2538beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2539beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
2540beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	});
2541beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2542beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Set contenteditable to false on removals(#10429)
2543beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Setting to empty string throws an error as an invalid value
2544beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.attrHooks.contenteditable = {
2545beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		get: nodeHook.get,
2546beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		set: function( elem, value, name ) {
2547beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( value === "" ) {
2548beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				value = "false";
2549beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2550beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			nodeHook.set( elem, value, name );
2551beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2552beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
2553beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
2554beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2555beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2556beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Some attributes require a special call on IE
2557beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikif ( !jQuery.support.hrefNormalized ) {
2558beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
2559beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2560beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			get: function( elem ) {
2561beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				var ret = elem.getAttribute( name, 2 );
2562beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return ret === null ? undefined : ret;
2563beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2564beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
2565beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	});
2566beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
2567beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2568beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikif ( !jQuery.support.style ) {
2569beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.attrHooks.style = {
2570beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		get: function( elem ) {
2571beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Return undefined in the case of empty string
2572beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Normalize to lowercase since IE uppercases css property names
2573beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return elem.style.cssText.toLowerCase() || undefined;
2574beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
2575beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		set: function( elem, value ) {
25764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return ( elem.style.cssText = value + "" );
2577beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2578beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
2579beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
2580beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2581beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Safari mis-reports the default selected property of an option
2582beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Accessing the parent's selectedIndex property fixes it
2583beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikif ( !jQuery.support.optSelected ) {
2584beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
2585beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		get: function( elem ) {
2586beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			var parent = elem.parentNode;
2587beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2588beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( parent ) {
2589beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				parent.selectedIndex;
2590beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2591beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Make sure that it also works with optgroups, see #5701
2592beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( parent.parentNode ) {
2593beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					parent.parentNode.selectedIndex;
2594beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
2595beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2596beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return null;
2597beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2598beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	});
2599beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
2600beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2601beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// IE6/7 call enctype encoding
2602beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikif ( !jQuery.support.enctype ) {
2603beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.propFix.enctype = "encoding";
2604beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
2605beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2606beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Radios and checkboxes getter/setter
2607beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikif ( !jQuery.support.checkOn ) {
2608beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.each([ "radio", "checkbox" ], function() {
2609beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		jQuery.valHooks[ this ] = {
2610beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			get: function( elem ) {
2611beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
2612beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return elem.getAttribute("value") === null ? "on" : elem.value;
2613beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2614beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		};
2615beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	});
2616beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
2617beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.each([ "radio", "checkbox" ], function() {
2618beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
2619beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		set: function( elem, value ) {
2620beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( jQuery.isArray( value ) ) {
2621beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
2622beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2623beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2624beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	});
2625beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
2626beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikvar rformElems = /^(?:textarea|input|select)$/i,
26274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
26284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
2629beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rkeyEvent = /^key/,
2630beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rmouseEvent = /^(?:mouse|contextmenu)|click/,
2631beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
2632beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	hoverHack = function( events ) {
2633beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
2634beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
2635beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2636beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik/*
2637beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik * Helper functions for managing events -- not part of the public interface.
2638beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik * Props to Dean Edwards' addEvent library for many of the ideas.
2639beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik */
2640beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.event = {
2641beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2642beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	add: function( elem, types, handler, data, selector ) {
2643beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2644beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var elemData, eventHandle, events,
2645beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			t, tns, type, namespaces, handleObj,
26464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			handleObjIn, handlers, special;
2647beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2648beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
2649beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
2650beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return;
2651beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2652beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2653beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Caller can pass in an object of custom data in lieu of the handler
2654beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( handler.handler ) {
2655beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			handleObjIn = handler;
2656beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			handler = handleObjIn.handler;
26574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			selector = handleObjIn.selector;
2658beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2659beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2660beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Make sure that the handler has a unique ID, used to find/remove it later
2661beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !handler.guid ) {
2662beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			handler.guid = jQuery.guid++;
2663beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2664beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2665beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Init the element's event structure and main handler, if this is the first
2666beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		events = elemData.events;
2667beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !events ) {
2668beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			elemData.events = events = {};
2669beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2670beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		eventHandle = elemData.handle;
2671beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !eventHandle ) {
2672beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			elemData.handle = eventHandle = function( e ) {
2673beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Discard the second event of a jQuery.event.trigger() and
2674beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// when an event is called after a page has unloaded
2675beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
2676beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
2677beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					undefined;
2678beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			};
2679beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
2680beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			eventHandle.elem = elem;
2681beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2682beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2683beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Handle multiple events separated by a space
2684beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// jQuery(...).bind("mouseover mouseout", fn);
2685beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		types = jQuery.trim( hoverHack(types) ).split( " " );
2686beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		for ( t = 0; t < types.length; t++ ) {
2687beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2688beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			tns = rtypenamespace.exec( types[t] ) || [];
2689beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			type = tns[1];
2690beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			namespaces = ( tns[2] || "" ).split( "." ).sort();
2691beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2692beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// If event changes its type, use the special event handlers for the changed type
2693beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			special = jQuery.event.special[ type ] || {};
2694beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2695beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// If selector defined, determine special event api type, otherwise given type
2696beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			type = ( selector ? special.delegateType : special.bindType ) || type;
2697beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2698beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Update special based on newly reset type
2699beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			special = jQuery.event.special[ type ] || {};
2700beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2701beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// handleObj is passed to all event handlers
2702beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			handleObj = jQuery.extend({
2703beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				type: type,
2704beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				origType: tns[1],
2705beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				data: data,
2706beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				handler: handler,
2707beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				guid: handler.guid,
2708beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				selector: selector,
27094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
2710beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				namespace: namespaces.join(".")
2711beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}, handleObjIn );
2712beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2713beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Init the event handler queue if we're the first
2714beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			handlers = events[ type ];
2715beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( !handlers ) {
2716beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				handlers = events[ type ] = [];
2717beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				handlers.delegateCount = 0;
2718beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2719beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Only use addEventListener/attachEvent if the special events handler returns false
2720beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
2721beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// Bind the global event handler to the element
2722beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( elem.addEventListener ) {
2723beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						elem.addEventListener( type, eventHandle, false );
2724beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2725beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					} else if ( elem.attachEvent ) {
2726beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						elem.attachEvent( "on" + type, eventHandle );
2727beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
2728beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
2729beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2730beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2731beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( special.add ) {
2732beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				special.add.call( elem, handleObj );
2733beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2734beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( !handleObj.handler.guid ) {
2735beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					handleObj.handler.guid = handler.guid;
2736beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
2737beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2738beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2739beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Add to the element's handler list, delegates in front
2740beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( selector ) {
2741beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				handlers.splice( handlers.delegateCount++, 0, handleObj );
2742beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else {
2743beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				handlers.push( handleObj );
2744beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2745beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2746beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Keep track of which events have ever been used, for event optimization
2747beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.event.global[ type ] = true;
2748beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2749beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2750beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Nullify elem to prevent memory leaks in IE
2751beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		elem = null;
2752beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
2753beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2754beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	global: {},
2755beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2756beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Detach an event or set of events from an element
2757beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	remove: function( elem, types, handler, selector, mappedTypes ) {
2758beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
27594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var t, tns, type, origType, namespaces, origCount,
27604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			j, events, special, eventType, handleObj,
27614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			elemData = jQuery.hasData( elem ) && jQuery._data( elem );
2762beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2763beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !elemData || !(events = elemData.events) ) {
2764beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return;
2765beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2766beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2767beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Once for each type.namespace in types; type may be omitted
2768beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
2769beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		for ( t = 0; t < types.length; t++ ) {
2770beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			tns = rtypenamespace.exec( types[t] ) || [];
2771beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			type = origType = tns[1];
2772beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			namespaces = tns[2];
2773beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2774beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Unbind all events (on this namespace, if provided) for the element
2775beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( !type ) {
2776beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				for ( type in events ) {
2777beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
2778beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
2779beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				continue;
2780beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2781beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2782beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			special = jQuery.event.special[ type ] || {};
2783beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			type = ( selector? special.delegateType : special.bindType ) || type;
2784beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			eventType = events[ type ] || [];
2785beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			origCount = eventType.length;
27864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
2787beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2788beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Remove matching events
2789beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			for ( j = 0; j < eventType.length; j++ ) {
2790beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				handleObj = eventType[ j ];
2791beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2792beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( ( mappedTypes || origType === handleObj.origType ) &&
2793beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					 ( !handler || handler.guid === handleObj.guid ) &&
2794beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
2795beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
2796beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					eventType.splice( j--, 1 );
2797beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2798beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( handleObj.selector ) {
2799beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						eventType.delegateCount--;
2800beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
2801beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( special.remove ) {
2802beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						special.remove.call( elem, handleObj );
2803beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
2804beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
2805beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2806beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2807beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Remove generic event handler if we removed something and no more handlers exist
2808beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// (avoids potential for endless recursion during removal of special event handlers)
2809beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( eventType.length === 0 && origCount !== eventType.length ) {
28104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
2811beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					jQuery.removeEvent( elem, type, elemData.handle );
2812beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
2813beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2814beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				delete events[ type ];
2815beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2816beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2817beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2818beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Remove the expando if it's no longer used
2819beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( jQuery.isEmptyObject( events ) ) {
28204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			delete elemData.handle;
2821beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2822beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// removeData also checks for emptiness and clears the expando if empty
2823beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// so use it instead of delete
28244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			jQuery.removeData( elem, "events", true );
2825beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2826beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
2827beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2828beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Events that are safe to short-circuit if no handlers are attached.
2829beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Native DOM events should not be added, they may have inline handlers.
2830beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	customEvent: {
2831beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		"getData": true,
2832beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		"setData": true,
2833beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		"changeData": true
2834beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
2835beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2836beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	trigger: function( event, data, elem, onlyHandlers ) {
2837beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Don't do events on text and comment nodes
2838beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
2839beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return;
2840beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2841beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2842beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Event object or event type
28434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
28444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			type = event.type || event,
28454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			namespaces = [];
2846beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2847beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// focus/blur morphs to focusin/out; ensure we're not firing them right now
2848beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
2849beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return;
2850beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2851beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2852beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( type.indexOf( "!" ) >= 0 ) {
2853beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Exclusive events trigger only for the exact event (no namespaces)
2854beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			type = type.slice(0, -1);
2855beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			exclusive = true;
2856beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2857beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2858beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( type.indexOf( "." ) >= 0 ) {
2859beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Namespaced trigger; create a regexp to match event type in handle()
2860beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			namespaces = type.split(".");
2861beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			type = namespaces.shift();
2862beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			namespaces.sort();
2863beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2864beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2865beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
2866beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// No jQuery handlers for this event type, and it can't have inline handlers
2867beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return;
2868beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2869beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2870beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Caller can pass in an Event, Object, or just an event type string
2871beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		event = typeof event === "object" ?
2872beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// jQuery.Event object
2873beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			event[ jQuery.expando ] ? event :
2874beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Object literal
2875beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			new jQuery.Event( type, event ) :
2876beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Just the event type (string)
2877beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			new jQuery.Event( type );
2878beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2879beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		event.type = type;
2880beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		event.isTrigger = true;
2881beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		event.exclusive = exclusive;
2882beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		event.namespace = namespaces.join( "." );
28834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
2884beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
2885beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2886beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Handle a global trigger
2887beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !elem ) {
2888beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2889beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// TODO: Stop taunting the data cache; remove global events and always attach to document
2890beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			cache = jQuery.cache;
2891beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			for ( i in cache ) {
2892beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
2893beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
2894beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
2895beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2896beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return;
2897beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2898beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2899beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Clean up the event in case it is being reused
2900beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		event.result = undefined;
2901beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !event.target ) {
2902beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			event.target = elem;
2903beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2904beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2905beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Clone any incoming data and prepend the event, creating the handler arg list
2906beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		data = data != null ? jQuery.makeArray( data ) : [];
2907beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		data.unshift( event );
2908beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2909beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Allow special events to draw outside the lines
2910beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		special = jQuery.event.special[ type ] || {};
2911beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
2912beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return;
2913beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2914beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2915beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Determine event propagation path in advance, per W3C events spec (#9951)
2916beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
2917beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		eventPath = [[ elem, special.bindType || type ]];
2918beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
2919beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2920beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			bubbleType = special.delegateType || type;
2921beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
29224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			for ( old = elem; cur; cur = cur.parentNode ) {
2923beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				eventPath.push([ cur, bubbleType ]);
2924beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				old = cur;
2925beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2926beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2927beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Only add window if we got to document (e.g., not plain obj or detached DOM)
29284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( old === (elem.ownerDocument || document) ) {
2929beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
2930beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2931beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2932beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2933beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Fire handlers on the event path
2934beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
2935beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2936beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			cur = eventPath[i][0];
2937beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			event.type = eventPath[i][1];
2938beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2939beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
2940beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( handle ) {
2941beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				handle.apply( cur, data );
2942beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2943beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Note that this is a bare JS function and not a jQuery handler
2944beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			handle = ontype && cur[ ontype ];
29454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
2946beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				event.preventDefault();
2947beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2948beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2949beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		event.type = type;
2950beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2951beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// If nobody prevented the default action, do it now
2952beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
2953beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2954beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
2955beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
2956beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2957beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Call a native DOM method on the target with the same name name as the event.
2958beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Can't use an .isFunction() check here because IE6/7 fails that test.
2959beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Don't do default actions on window, that's where global variables be (#6170)
2960beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// IE<9 dies on focus/blur to hidden element (#1486)
2961beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
2962beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2963beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// Don't re-trigger an onFOO event when we call its FOO() method
2964beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					old = elem[ ontype ];
2965beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2966beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( old ) {
2967beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						elem[ ontype ] = null;
2968beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
2969beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2970beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// Prevent re-triggering of the same event, since we already bubbled it above
2971beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					jQuery.event.triggered = type;
2972beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					elem[ type ]();
2973beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					jQuery.event.triggered = undefined;
2974beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2975beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( old ) {
2976beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						elem[ ontype ] = old;
2977beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
2978beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
2979beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
2980beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
2981beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2982beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return event.result;
2983beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
2984beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2985beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	dispatch: function( event ) {
2986beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2987beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Make a writable jQuery.Event from the native event object
2988beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		event = jQuery.event.fix( event || window.event );
2989beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
29904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,
29914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
2992beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			delegateCount = handlers.delegateCount,
29934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			args = core_slice.call( arguments ),
2994beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			run_all = !event.exclusive && !event.namespace,
29954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			special = jQuery.event.special[ event.type ] || {},
29964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			handlerQueue = [];
2997beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
2998beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Use the fix-ed jQuery.Event rather than the (read-only) native event
2999beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		args[0] = event;
3000beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		event.delegateTarget = this;
3001beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
30024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Call the preDispatch hook for the mapped type, and let it bail if desired
30034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
30044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return;
30054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
3006beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
30074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Determine handlers that should run if there are delegated events
30084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Avoid non-left-click bubbling in Firefox (#3861)
30094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( delegateCount && !(event.button && event.type === "click") ) {
3010beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3011beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
30124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
30134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
30144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( cur.disabled !== true || event.type !== "click" ) {
30154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					selMatch = {};
30164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					matches = [];
30174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					for ( i = 0; i < delegateCount; i++ ) {
30184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						handleObj = handlers[ i ];
30194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						sel = handleObj.selector;
30204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
30214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						if ( selMatch[ sel ] === undefined ) {
30224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							selMatch[ sel ] = handleObj.needsContext ?
30234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								jQuery( sel, this ).index( cur ) >= 0 :
30244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								jQuery.find( sel, this, null, [ cur ] ).length;
30254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
30264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						if ( selMatch[ sel ] ) {
30274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							matches.push( handleObj );
30284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
3029beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
30304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( matches.length ) {
30314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						handlerQueue.push({ elem: cur, matches: matches });
3032beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
3033beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
3034beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
3035beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3036beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3037beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Add the remaining (directly-bound) handlers
3038beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( handlers.length > delegateCount ) {
3039beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
3040beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3041beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3042beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Run delegates first; they may want to stop propagation beneath us
3043beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
3044beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			matched = handlerQueue[ i ];
3045beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			event.currentTarget = matched.elem;
3046beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3047beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
3048beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				handleObj = matched.matches[ j ];
3049beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3050beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Triggered event must either 1) be non-exclusive and have no namespace, or
3051beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
3052beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
3053beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3054beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					event.data = handleObj.data;
3055beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					event.handleObj = handleObj;
3056beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3057beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
3058beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							.apply( matched.elem, args );
3059beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3060beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( ret !== undefined ) {
3061beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						event.result = ret;
3062beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						if ( ret === false ) {
3063beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							event.preventDefault();
3064beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							event.stopPropagation();
3065beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
3066beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
3067beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
3068beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
3069beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3070beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
30714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Call the postDispatch hook for the mapped type
30724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( special.postDispatch ) {
30734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			special.postDispatch.call( this, event );
30744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
30754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
3076beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return event.result;
3077beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
3078beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3079beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Includes some event props shared by KeyEvent and MouseEvent
3080beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
3081beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
3082beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3083beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	fixHooks: {},
3084beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3085beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	keyHooks: {
3086beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		props: "char charCode key keyCode".split(" "),
3087beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		filter: function( event, original ) {
3088beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3089beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Add which for key events
3090beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( event.which == null ) {
3091beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				event.which = original.charCode != null ? original.charCode : original.keyCode;
3092beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
3093beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3094beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return event;
3095beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3096beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
3097beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3098beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	mouseHooks: {
3099beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
3100beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		filter: function( event, original ) {
3101beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			var eventDoc, doc, body,
3102beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				button = original.button,
3103beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				fromElement = original.fromElement;
3104beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3105beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Calculate pageX/Y if missing and clientX/Y available
3106beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( event.pageX == null && original.clientX != null ) {
3107beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				eventDoc = event.target.ownerDocument || document;
3108beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				doc = eventDoc.documentElement;
3109beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				body = eventDoc.body;
3110beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3111beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
3112beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
3113beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
3114beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3115beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Add relatedTarget, if necessary
3116beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( !event.relatedTarget && fromElement ) {
3117beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
3118beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
3119beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3120beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Add which for click: 1 === left; 2 === middle; 3 === right
3121beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Note: button is not normalized, so don't use it
3122beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( !event.which && button !== undefined ) {
3123beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
3124beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
3125beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3126beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return event;
3127beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3128beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
3129beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3130beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	fix: function( event ) {
3131beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( event[ jQuery.expando ] ) {
3132beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return event;
3133beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3134beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3135beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Create a writable copy of the event object and normalize some properties
3136beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var i, prop,
3137beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			originalEvent = event,
3138beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			fixHook = jQuery.event.fixHooks[ event.type ] || {},
3139beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
3140beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3141beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		event = jQuery.Event( originalEvent );
3142beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3143beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		for ( i = copy.length; i; ) {
3144beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			prop = copy[ --i ];
3145beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			event[ prop ] = originalEvent[ prop ];
3146beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3147beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3148beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
3149beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !event.target ) {
3150beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			event.target = originalEvent.srcElement || document;
3151beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3152beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3153beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Target should not be a text node (#504, Safari)
3154beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( event.target.nodeType === 3 ) {
3155beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			event.target = event.target.parentNode;
3156beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3157beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
31584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
31594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		event.metaKey = !!event.metaKey;
3160beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3161beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
3162beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
3163beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3164beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	special: {
3165beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		load: {
3166beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Prevent triggered image.load events from bubbling to window.load
3167beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			noBubble: true
3168beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
3169beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3170beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		focus: {
3171beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			delegateType: "focusin"
3172beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
3173beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		blur: {
3174beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			delegateType: "focusout"
3175beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
3176beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3177beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		beforeunload: {
3178beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			setup: function( data, namespaces, eventHandle ) {
3179beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// We only want to do this special case on windows
3180beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( jQuery.isWindow( this ) ) {
3181beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					this.onbeforeunload = eventHandle;
3182beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
3183beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			},
3184beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3185beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			teardown: function( namespaces, eventHandle ) {
3186beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( this.onbeforeunload === eventHandle ) {
3187beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					this.onbeforeunload = null;
3188beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
3189beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
3190beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3191beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
3192beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3193beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	simulate: function( type, elem, event, bubble ) {
3194beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Piggyback on a donor event to simulate a different one.
3195beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Fake originalEvent to avoid donor's stopPropagation, but if the
3196beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// simulated event prevents default then we do the same on the donor.
3197beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var e = jQuery.extend(
3198beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			new jQuery.Event(),
3199beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			event,
3200beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			{ type: type,
3201beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				isSimulated: true,
3202beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				originalEvent: {}
3203beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
3204beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		);
3205beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( bubble ) {
3206beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.event.trigger( e, null, elem );
3207beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else {
3208beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.event.dispatch.call( elem, e );
3209beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3210beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( e.isDefaultPrevented() ) {
3211beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			event.preventDefault();
3212beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3213beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
3214beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik};
3215beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3216beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Some plugins are using, but it's undocumented/deprecated and will be removed.
3217beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// The 1.7 special event interface should provide all the hooks needed now.
3218beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.event.handle = jQuery.event.dispatch;
3219beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3220beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.removeEvent = document.removeEventListener ?
3221beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	function( elem, type, handle ) {
3222beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( elem.removeEventListener ) {
3223beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			elem.removeEventListener( type, handle, false );
3224beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3225beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	} :
3226beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	function( elem, type, handle ) {
32274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var name = "on" + type;
32284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
3229beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( elem.detachEvent ) {
32304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
32314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// #8545, #7054, preventing memory leaks for custom events in IE6-8
32324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// detachEvent needed property on element, by name of that event, to properly expose it to GC
32334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( typeof elem[ name ] === "undefined" ) {
32344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				elem[ name ] = null;
32354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
32364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
32374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			elem.detachEvent( name, handle );
3238beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3239beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
3240beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3241beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.Event = function( src, props ) {
3242beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Allow instantiation without the 'new' keyword
3243beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( !(this instanceof jQuery.Event) ) {
3244beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return new jQuery.Event( src, props );
3245beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
3246beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3247beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Event object
3248beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( src && src.type ) {
3249beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		this.originalEvent = src;
3250beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		this.type = src.type;
3251beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3252beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Events bubbling up the document may have been marked as prevented
3253beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// by a handler lower down the tree; reflect the correct value.
3254beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
3255beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
3256beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3257beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Event type
3258beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	} else {
3259beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		this.type = src;
3260beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
3261beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3262beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Put explicitly provided properties onto the event object
3263beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( props ) {
3264beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		jQuery.extend( this, props );
3265beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
3266beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3267beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Create a timestamp if incoming event doesn't have one
3268beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	this.timeStamp = src && src.timeStamp || jQuery.now();
3269beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3270beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Mark it as fixed
3271beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	this[ jQuery.expando ] = true;
3272beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik};
3273beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3274beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikfunction returnFalse() {
3275beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	return false;
3276beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
3277beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikfunction returnTrue() {
3278beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	return true;
3279beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
3280beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3281beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
3282beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
3283beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.Event.prototype = {
3284beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	preventDefault: function() {
3285beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		this.isDefaultPrevented = returnTrue;
3286beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3287beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var e = this.originalEvent;
3288beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !e ) {
3289beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return;
3290beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3291beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3292beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// if preventDefault exists run it on the original event
3293beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( e.preventDefault ) {
3294beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			e.preventDefault();
3295beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3296beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// otherwise set the returnValue property of the original event to false (IE)
3297beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else {
3298beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			e.returnValue = false;
3299beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3300beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
3301beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	stopPropagation: function() {
3302beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		this.isPropagationStopped = returnTrue;
3303beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3304beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var e = this.originalEvent;
3305beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !e ) {
3306beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return;
3307beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3308beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// if stopPropagation exists run it on the original event
3309beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( e.stopPropagation ) {
3310beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			e.stopPropagation();
3311beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3312beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// otherwise set the cancelBubble property of the original event to true (IE)
3313beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		e.cancelBubble = true;
3314beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
3315beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	stopImmediatePropagation: function() {
3316beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		this.isImmediatePropagationStopped = returnTrue;
3317beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		this.stopPropagation();
3318beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
3319beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	isDefaultPrevented: returnFalse,
3320beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	isPropagationStopped: returnFalse,
3321beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	isImmediatePropagationStopped: returnFalse
3322beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik};
3323beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3324beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Create mouseenter/leave events using mouseover/out and event-time checks
3325beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.each({
3326beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	mouseenter: "mouseover",
3327beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	mouseleave: "mouseout"
3328beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}, function( orig, fix ) {
3329beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.event.special[ orig ] = {
3330beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		delegateType: fix,
3331beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		bindType: fix,
3332beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3333beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		handle: function( event ) {
33344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var ret,
33354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				target = this,
3336beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				related = event.relatedTarget,
3337beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				handleObj = event.handleObj,
33384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				selector = handleObj.selector;
3339beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3340beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// For mousenter/leave call the handler if related is outside the target.
3341beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// NB: No relatedTarget if the mouse left/entered the browser window
3342beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
3343beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				event.type = handleObj.origType;
3344beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				ret = handleObj.handler.apply( this, arguments );
3345beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				event.type = fix;
3346beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
3347beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return ret;
3348beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3349beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
3350beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
3351beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3352beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// IE submit delegation
3353beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikif ( !jQuery.support.submitBubbles ) {
3354beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3355beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.event.special.submit = {
3356beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		setup: function() {
3357beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Only need this for delegated form submit events
3358beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( jQuery.nodeName( this, "form" ) ) {
3359beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return false;
3360beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
3361beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3362beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Lazy-add a submit handler when a descendant form may potentially be submitted
3363beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
3364beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Node name check avoids a VML-related crash in IE (#9807)
3365beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				var elem = e.target,
3366beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
33674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( form && !jQuery._data( form, "_submit_attached" ) ) {
3368beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					jQuery.event.add( form, "submit._submit", function( event ) {
33694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						event._submit_bubble = true;
3370beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					});
33714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					jQuery._data( form, "_submit_attached", true );
3372beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
3373beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			});
3374beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// return undefined since we don't need an event listener
3375beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
3376beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
33774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		postDispatch: function( event ) {
33784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// If form was submitted by the user, bubble the event up the tree
33794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( event._submit_bubble ) {
33804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				delete event._submit_bubble;
33814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( this.parentNode && !event.isTrigger ) {
33824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					jQuery.event.simulate( "submit", this.parentNode, event, true );
33834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
33844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
33854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		},
33864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
3387beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		teardown: function() {
3388beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Only need this for delegated form submit events
3389beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( jQuery.nodeName( this, "form" ) ) {
3390beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return false;
3391beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
3392beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3393beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
3394beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.event.remove( this, "._submit" );
3395beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3396beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
3397beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
3398beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3399beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// IE change delegation and checkbox/radio fix
3400beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikif ( !jQuery.support.changeBubbles ) {
3401beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3402beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.event.special.change = {
3403beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3404beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		setup: function() {
3405beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3406beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( rformElems.test( this.nodeName ) ) {
3407beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// IE doesn't fire change on a check/radio until blur; trigger it on click
3408beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// after a propertychange. Eat the blur-change in special.change.handle.
3409beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// This still fires onchange a second time for check/radio after blur.
3410beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( this.type === "checkbox" || this.type === "radio" ) {
3411beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					jQuery.event.add( this, "propertychange._change", function( event ) {
3412beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						if ( event.originalEvent.propertyName === "checked" ) {
3413beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							this._just_changed = true;
3414beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
3415beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					});
3416beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					jQuery.event.add( this, "click._change", function( event ) {
3417beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						if ( this._just_changed && !event.isTrigger ) {
3418beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							this._just_changed = false;
3419beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
34204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// Allow triggered, simulated change events (#11500)
34214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						jQuery.event.simulate( "change", this, event, true );
3422beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					});
3423beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
3424beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return false;
3425beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
3426beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Delegated event; lazy-add a change handler on descendant inputs
3427beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.event.add( this, "beforeactivate._change", function( e ) {
3428beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				var elem = e.target;
3429beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
34304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
3431beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					jQuery.event.add( elem, "change._change", function( event ) {
3432beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
3433beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							jQuery.event.simulate( "change", this.parentNode, event, true );
3434beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
3435beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					});
34364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					jQuery._data( elem, "_change_attached", true );
3437beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
3438beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			});
3439beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
3440beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3441beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		handle: function( event ) {
3442beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			var elem = event.target;
3443beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3444beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Swallow native change events from checkbox/radio, we already triggered them above
3445beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
3446beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return event.handleObj.handler.apply( this, arguments );
3447beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
3448beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
3449beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3450beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		teardown: function() {
3451beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.event.remove( this, "._change" );
3452beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
34534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return !rformElems.test( this.nodeName );
3454beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3455beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
3456beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
3457beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3458beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Create "bubbling" focus and blur events
3459beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikif ( !jQuery.support.focusinBubbles ) {
3460beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
3461beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3462beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Attach a single capturing handler while someone wants focusin/focusout
3463beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var attaches = 0,
3464beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			handler = function( event ) {
3465beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
3466beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			};
3467beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3468beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		jQuery.event.special[ fix ] = {
3469beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			setup: function() {
3470beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( attaches++ === 0 ) {
3471beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					document.addEventListener( orig, handler, true );
3472beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
3473beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			},
3474beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			teardown: function() {
3475beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( --attaches === 0 ) {
3476beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					document.removeEventListener( orig, handler, true );
3477beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
3478beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
3479beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		};
3480beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	});
3481beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
3482beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3483beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.fn.extend({
3484beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3485beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
3486beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var origFn, type;
3487beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3488beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Types can be a map of types/handlers
3489beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( typeof types === "object" ) {
3490beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// ( types-Object, selector, data )
34914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( typeof selector !== "string" ) { // && selector != null
3492beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// ( types-Object, data )
34934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				data = data || selector;
3494beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				selector = undefined;
3495beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
3496beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			for ( type in types ) {
3497beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				this.on( type, selector, data, types[ type ], one );
3498beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
3499beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return this;
3500beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3501beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3502beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( data == null && fn == null ) {
3503beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// ( types, fn )
3504beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			fn = selector;
3505beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			data = selector = undefined;
3506beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else if ( fn == null ) {
3507beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( typeof selector === "string" ) {
3508beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// ( types, selector, fn )
3509beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				fn = data;
3510beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				data = undefined;
3511beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else {
3512beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// ( types, data, fn )
3513beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				fn = data;
3514beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				data = selector;
3515beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				selector = undefined;
3516beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
3517beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3518beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( fn === false ) {
3519beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			fn = returnFalse;
3520beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else if ( !fn ) {
3521beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return this;
3522beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3523beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3524beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( one === 1 ) {
3525beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			origFn = fn;
3526beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			fn = function( event ) {
3527beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Can use an empty set, since event contains the info
3528beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jQuery().off( event );
3529beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return origFn.apply( this, arguments );
3530beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			};
3531beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Use same guid so caller can remove using origFn
3532beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
3533beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3534beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.each( function() {
3535beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.event.add( this, types, fn, data, selector );
3536beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
3537beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
3538beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	one: function( types, selector, data, fn ) {
35394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return this.on( types, selector, data, fn, 1 );
3540beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
3541beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	off: function( types, selector, fn ) {
35424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var handleObj, type;
3543beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( types && types.preventDefault && types.handleObj ) {
3544beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// ( event )  dispatched jQuery.Event
35454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			handleObj = types.handleObj;
3546beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery( types.delegateTarget ).off(
35474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
3548beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				handleObj.selector,
3549beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				handleObj.handler
3550beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			);
3551beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return this;
3552beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3553beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( typeof types === "object" ) {
3554beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// ( types-object [, selector] )
35554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			for ( type in types ) {
3556beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				this.off( type, selector, types[ type ] );
3557beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
3558beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return this;
3559beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3560beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( selector === false || typeof selector === "function" ) {
3561beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// ( types [, fn] )
3562beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			fn = selector;
3563beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			selector = undefined;
3564beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3565beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( fn === false ) {
3566beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			fn = returnFalse;
3567beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3568beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.each(function() {
3569beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.event.remove( this, types, fn, selector );
3570beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
3571beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
3572beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3573beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	bind: function( types, data, fn ) {
3574beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.on( types, null, data, fn );
3575beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
3576beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	unbind: function( types, fn ) {
3577beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.off( types, null, fn );
3578beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
3579beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3580beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	live: function( types, data, fn ) {
3581beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		jQuery( this.context ).on( types, this.selector, data, fn );
3582beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this;
3583beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
3584beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	die: function( types, fn ) {
3585beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		jQuery( this.context ).off( types, this.selector || "**", fn );
3586beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this;
3587beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
3588beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3589beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	delegate: function( selector, types, data, fn ) {
3590beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.on( types, selector, data, fn );
3591beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
3592beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	undelegate: function( selector, types, fn ) {
3593beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// ( namespace ) or ( selector, types [, fn] )
35944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
3595beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
3596beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3597beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	trigger: function( type, data ) {
3598beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.each(function() {
3599beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.event.trigger( type, data, this );
3600beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
3601beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
3602beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	triggerHandler: function( type, data ) {
3603beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( this[0] ) {
3604beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return jQuery.event.trigger( type, data, this[0], true );
3605beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3606beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
3607beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3608beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	toggle: function( fn ) {
3609beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Save reference to arguments for access in closure
3610beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var args = arguments,
3611beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			guid = fn.guid || jQuery.guid++,
3612beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			i = 0,
3613beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			toggler = function( event ) {
3614beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Figure out which function to execute
3615beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
3616beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
3617beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3618beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Make sure that clicks stop
3619beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				event.preventDefault();
3620beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3621beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// and execute the function
3622beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return args[ lastToggle ].apply( this, arguments ) || false;
3623beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			};
3624beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3625beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// link all the functions, so any of them can unbind this click handler
3626beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		toggler.guid = guid;
3627beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		while ( i < args.length ) {
3628beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			args[ i++ ].guid = guid;
3629beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3630beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3631beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.click( toggler );
3632beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
3633beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3634beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	hover: function( fnOver, fnOut ) {
3635beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
3636beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
3637beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
3638beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3639beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
3640beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
3641beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
3642beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3643beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Handle event binding
3644beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.fn[ name ] = function( data, fn ) {
3645beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( fn == null ) {
3646beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			fn = data;
3647beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			data = null;
3648beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3649beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3650beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return arguments.length > 0 ?
3651beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			this.on( name, null, data, fn ) :
3652beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			this.trigger( name );
3653beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
3654beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3655beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( rkeyEvent.test( name ) ) {
3656beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
3657beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
3658beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3659beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( rmouseEvent.test( name ) ) {
3660beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
3661beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
3662beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
3663beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik/*!
3664beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik * Sizzle CSS Selector Engine
36654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair * Copyright 2012 jQuery Foundation and other contributors
36664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair * Released under the MIT license
36674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair * http://sizzlejs.com/
3668beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik */
36694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair(function( window, undefined ) {
3670beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
36714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairvar cachedruns,
36724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	assertGetIdNotName,
36734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	Expr,
36744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	getText,
36754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	isXML,
36764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	contains,
36774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	compile,
36784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	sortOrder,
36794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	hasDuplicate,
36804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	outermostContext,
3681beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
36824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	baseHasDuplicate = true,
36834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	strundefined = "undefined",
3684beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
36854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	expando = ( "sizcache" + Math.random() ).replace( ".", "" ),
3686beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
36874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	Token = String,
36884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	document = window.document,
36894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	docElem = document.documentElement,
36904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	dirruns = 0,
36914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	done = 0,
36924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	pop = [].pop,
36934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	push = [].push,
36944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	slice = [].slice,
36954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Use a stripped-down indexOf if a native one is unavailable
36964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	indexOf = [].indexOf || function( elem ) {
36974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var i = 0,
36984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			len = this.length;
36994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		for ( ; i < len; i++ ) {
37004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( this[i] === elem ) {
37014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return i;
3702beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
3703beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
37044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return -1;
37054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	},
3706beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
37074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Augment a function for special use by Sizzle
37084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	markFunction = function( fn, value ) {
37094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		fn[ expando ] = value == null || value;
37104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return fn;
37114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	},
3712beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
37134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	createCache = function() {
37144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var cache = {},
37154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			keys = [];
3716beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
37174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return markFunction(function( key, value ) {
37184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Only keep the most recent entries
37194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( keys.push( key ) > Expr.cacheLength ) {
37204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				delete cache[ keys.shift() ];
37214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
3722beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
37234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Retrieve with (key + " ") to avoid collision with native Object.prototype properties (see Issue #157)
37244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return (cache[ key + " " ] = value);
37254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}, cache );
37264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	},
3727beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
37284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	classCache = createCache(),
37294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	tokenCache = createCache(),
37304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	compilerCache = createCache(),
3731beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
37324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Regex
3733beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
37344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
37354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	whitespace = "[\\x20\\t\\r\\n\\f]",
37364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// http://www.w3.org/TR/css3-syntax/#characters
37374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",
3738beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
37394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Loosely modeled on CSS identifier characters
37404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)
37414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
37424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	identifier = characterEncoding.replace( "w", "w#" ),
3743beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
37444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
37454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	operators = "([*^$|!~]?=)",
37464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
37474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
3748beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
37494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Prefer arguments not in parens/brackets,
37504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	//   then attribute selectors and non-pseudos (denoted by :),
37514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	//   then anything else
37524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// These preferences are here to reduce the number of selectors
37534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	//   needing tokenize in the PSEUDO preFilter
37544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)",
3755beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
37564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// For matchExpr.POS and matchExpr.needsContext
37574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	pos = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
37584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)",
3759beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
37604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
37614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
3762beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
37634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
37644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
37654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rpseudo = new RegExp( pseudos ),
3766beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
37674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Easily-parseable/retrievable ID or TAG or CLASS selectors
37684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,
3769beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
37704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rnot = /^:not/,
37714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rsibling = /[\x20\t\r\n\f]*[+~]/,
37724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rendsWithNot = /:not\($/,
3773beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
37744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rheader = /h\d/i,
37754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rinputs = /input|select|textarea|button/i,
3776beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
37774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rbackslash = /\\(?!\\)/g,
3778beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
37794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	matchExpr = {
37804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"ID": new RegExp( "^#(" + characterEncoding + ")" ),
37814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
37824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
37834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
37844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"ATTR": new RegExp( "^" + attributes ),
37854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"PSEUDO": new RegExp( "^" + pseudos ),
37864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"POS": new RegExp( pos, "i" ),
37874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"CHILD": new RegExp( "^:(only|nth|first|last)-child(?:\\(" + whitespace +
37884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
37894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
37904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// For use in libraries implementing .is()
37914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" )
37924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	},
3793beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
37944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Support
3795beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
37964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Used for testing something on an element
37974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	assert = function( fn ) {
37984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var div = document.createElement("div");
3799beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
38004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		try {
38014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return fn( div );
38024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} catch (e) {
38034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return false;
38044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} finally {
38054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// release memory in IE
38064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			div = null;
38074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
38084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	},
38094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
38104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Check if getElementsByTagName("*") returns only elements
38114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	assertTagNameNoComments = assert(function( div ) {
38124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		div.appendChild( document.createComment("") );
38134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return !div.getElementsByTagName("*").length;
38144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}),
38154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
38164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Check if getAttribute returns normalized href attributes
38174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	assertHrefNotNormalized = assert(function( div ) {
38184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		div.innerHTML = "<a href='#'></a>";
38194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
38204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			div.firstChild.getAttribute("href") === "#";
38214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}),
38224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
38234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Check if attributes should be retrieved by attribute nodes
38244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	assertAttributes = assert(function( div ) {
38254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		div.innerHTML = "<select></select>";
38264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var type = typeof div.lastChild.getAttribute("multiple");
38274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// IE8 returns a string for some attributes even when not present
38284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return type !== "boolean" && type !== "string";
38294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}),
38304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
38314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Check if getElementsByClassName can be trusted
38324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	assertUsableClassName = assert(function( div ) {
38334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Opera can't find a second classname (in 9.6)
38344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
38354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
38364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return false;
3837beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3838beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
38394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Safari 3.2 caches class attributes and doesn't catch changes
38404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		div.lastChild.className = "e";
38414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return div.getElementsByClassName("e").length === 2;
38424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}),
3843beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
38444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Check if getElementById returns elements by name
38454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Check if getElementsByName privileges form controls or returns elements by ID
38464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	assertUsableName = assert(function( div ) {
38474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Inject content
38484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		div.id = expando + 0;
38494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
38504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		docElem.insertBefore( div, docElem.firstChild );
3851beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
38524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Test
38534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var pass = document.getElementsByName &&
38544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// buggy browsers will return fewer than the correct 2
38554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			document.getElementsByName( expando ).length === 2 +
38564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// buggy browsers will return more than the correct 0
38574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			document.getElementsByName( expando + 0 ).length;
38584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		assertGetIdNotName = !document.getElementById( expando );
3859beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
38604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Cleanup
38614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		docElem.removeChild( div );
3862beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
38634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return pass;
38644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	});
38654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
38664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// If slice is not available, provide a backup
38674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairtry {
38684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	slice.call( docElem.childNodes, 0 )[0].nodeType;
38694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair} catch ( e ) {
38704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	slice = function( i ) {
38714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var elem,
38724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			results = [];
38734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		for ( ; (elem = this[i]); i++ ) {
38744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			results.push( elem );
3875beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
38764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return results;
38774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	};
38784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
38794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
38804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction Sizzle( selector, context, results, seed ) {
38814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	results = results || [];
38824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	context = context || document;
38834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var match, elem, xml, m,
38844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		nodeType = context.nodeType;
38854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
38864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( !selector || typeof selector !== "string" ) {
38874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return results;
3888beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
3889beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
38904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( nodeType !== 1 && nodeType !== 9 ) {
38914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return [];
38924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
3893beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
38944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	xml = isXML( context );
3895beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
38964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( !xml && !seed ) {
38974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( (match = rquickExpr.exec( selector )) ) {
38984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Speed-up: Sizzle("#ID")
38994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( (m = match[1]) ) {
39004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( nodeType === 9 ) {
39014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					elem = context.getElementById( m );
39024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Check parentNode to catch when Blackberry 4.6 returns
39034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// nodes that are no longer in the document #6963
39044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( elem && elem.parentNode ) {
39054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// Handle the case where IE, Opera, and Webkit return items
39064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// by name instead of ID
39074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						if ( elem.id === m ) {
39084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							results.push( elem );
39094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							return results;
39104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
39114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					} else {
39124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						return results;
39134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
39144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				} else {
39154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Context is not a document
39164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
39174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						contains( context, elem ) && elem.id === m ) {
39184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						results.push( elem );
39194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						return results;
39204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
39214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
3922beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
39234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Speed-up: Sizzle("TAG")
39244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			} else if ( match[2] ) {
39254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
39264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return results;
3927beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
39284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Speed-up: Sizzle(".CLASS")
39294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			} else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {
39304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
39314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return results;
3932beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
3933beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
3934beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
3935beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
39364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// All others
39374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return select( selector.replace( rtrim, "$1" ), context, results, seed, xml );
39384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
3939beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
39404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairSizzle.matches = function( expr, elements ) {
39414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return Sizzle( expr, null, null, elements );
3942beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik};
3943beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
39444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairSizzle.matchesSelector = function( elem, expr ) {
39454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return Sizzle( expr, null, null, [ elem ] ).length > 0;
39464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair};
3947beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
39484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// Returns a function to use in pseudos for input types
39494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction createInputPseudo( type ) {
39504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return function( elem ) {
39514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var name = elem.nodeName.toLowerCase();
39524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return name === "input" && elem.type === type;
39534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	};
39544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
3955beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
39564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// Returns a function to use in pseudos for buttons
39574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction createButtonPseudo( type ) {
39584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return function( elem ) {
39594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var name = elem.nodeName.toLowerCase();
39604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return (name === "input" || name === "button") && elem.type === type;
39614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	};
39624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
3963beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
39644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// Returns a function to use in pseudos for positionals
39654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction createPositionalPseudo( fn ) {
39664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return markFunction(function( argument ) {
39674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		argument = +argument;
39684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return markFunction(function( seed, matches ) {
39694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var j,
39704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				matchIndexes = fn( [], seed.length, argument ),
39714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				i = matchIndexes.length;
3972beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
39734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Match elements found at the specified indexes
39744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			while ( i-- ) {
39754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( seed[ (j = matchIndexes[i]) ] ) {
39764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					seed[j] = !(matches[j] = seed[j]);
3977beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
3978beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
39794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		});
39804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	});
39814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
3982beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3983beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik/**
39844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair * Utility function for retrieving the text value of an array of DOM nodes
3985beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik * @param {Array|Element} elem
3986beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik */
39874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairgetText = Sizzle.getText = function( elem ) {
39884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var node,
39894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		ret = "",
39904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		i = 0,
39914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		nodeType = elem.nodeType;
3992beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
3993beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( nodeType ) {
39944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
39954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Use textContent for elements
39964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// innerText usage removed for consistency of new lines (see #11153)
39974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( typeof elem.textContent === "string" ) {
3998beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return elem.textContent;
3999beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else {
40004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Traverse its children
40014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
4002beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					ret += getText( elem );
4003beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
4004beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
4005beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else if ( nodeType === 3 || nodeType === 4 ) {
4006beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return elem.nodeValue;
4007beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
40084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Do not include comment or processing instruction nodes
4009beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	} else {
4010beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
4011beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// If no nodeType, this is expected to be an array
40124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		for ( ; (node = elem[i]); i++ ) {
4013beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Do not traverse comment nodes
40144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			ret += getText( node );
4015beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
4016beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
4017beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	return ret;
4018beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik};
4019beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
40204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairisXML = Sizzle.isXML = function( elem ) {
40214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// documentElement is verified for cases where it doesn't yet exist
40224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// (such as loading iframes in IE - #4833)
40234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
40244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return documentElement ? documentElement.nodeName !== "HTML" : false;
40254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair};
4026beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
40274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// Element contains another
40284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclaircontains = Sizzle.contains = docElem.contains ?
40294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	function( a, b ) {
40304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var adown = a.nodeType === 9 ? a.documentElement : a,
40314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			bup = b && b.parentNode;
40324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );
40334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	} :
40344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	docElem.compareDocumentPosition ?
40354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	function( a, b ) {
40364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return b && !!( a.compareDocumentPosition( b ) & 16 );
40374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	} :
40384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	function( a, b ) {
40394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		while ( (b = b.parentNode) ) {
40404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( b === a ) {
40414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return true;
40424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
40434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
40444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return false;
40454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	};
4046beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
40474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairSizzle.attr = function( elem, name ) {
40484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var val,
40494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		xml = isXML( elem );
4050beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
40514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( !xml ) {
40524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		name = name.toLowerCase();
40534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
40544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( (val = Expr.attrHandle[ name ]) ) {
40554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return val( elem );
40564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
40574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( xml || assertAttributes ) {
40584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return elem.getAttribute( name );
40594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
40604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	val = elem.getAttributeNode( name );
40614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return val ?
40624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		typeof elem[ name ] === "boolean" ?
40634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			elem[ name ] ? name : null :
40644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			val.specified ? val.value : null :
40654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		null;
40664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair};
4067beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
40684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairExpr = Sizzle.selectors = {
4069beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
40704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Can be adjusted by the user
40714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	cacheLength: 50,
4072beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
40734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	createPseudo: markFunction,
4074beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
40754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	match: matchExpr,
4076beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
40774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// IE6/7 return a modified href
40784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	attrHandle: assertHrefNotNormalized ?
40794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		{} :
40804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		{
40814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			"href": function( elem ) {
40824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return elem.getAttribute( "href", 2 );
40834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			},
40844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			"type": function( elem ) {
40854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return elem.getAttribute("type");
4086beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
4087beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
4088beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
40894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	find: {
40904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"ID": assertGetIdNotName ?
40914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			function( id, context, xml ) {
40924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( typeof context.getElementById !== strundefined && !xml ) {
40934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					var m = context.getElementById( id );
40944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Check parentNode to catch when Blackberry 4.6 returns
40954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// nodes that are no longer in the document #6963
40964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					return m && m.parentNode ? [m] : [];
40974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
40984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			} :
40994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			function( id, context, xml ) {
41004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( typeof context.getElementById !== strundefined && !xml ) {
41014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					var m = context.getElementById( id );
4102beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
41034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					return m ?
41044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
41054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							[m] :
41064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							undefined :
41074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						[];
41084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
41094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			},
4110beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
41114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"TAG": assertTagNameNoComments ?
41124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			function( tag, context ) {
41134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( typeof context.getElementsByTagName !== strundefined ) {
41144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					return context.getElementsByTagName( tag );
4115beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
41164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			} :
41174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			function( tag, context ) {
41184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				var results = context.getElementsByTagName( tag );
4119beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
41204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Filter out possible comments
41214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( tag === "*" ) {
41224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					var elem,
41234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						tmp = [],
41244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						i = 0;
4125beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
41264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					for ( ; (elem = results[i]); i++ ) {
41274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						if ( elem.nodeType === 1 ) {
41284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							tmp.push( elem );
41294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
4130beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
4131beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
41324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					return tmp;
4133beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
41344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return results;
41354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			},
4136beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
41374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"NAME": assertUsableName && function( tag, context ) {
41384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( typeof context.getElementsByName !== strundefined ) {
41394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return context.getElementsByName( name );
4140beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
4141beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
4142beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
41434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"CLASS": assertUsableClassName && function( className, context, xml ) {
41444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( typeof context.getElementsByClassName !== strundefined && !xml ) {
41454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return context.getElementsByClassName( className );
4146beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
4147beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
4148beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
4149beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
41504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	relative: {
41514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		">": { dir: "parentNode", first: true },
41524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		" ": { dir: "parentNode" },
41534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"+": { dir: "previousSibling", first: true },
41544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"~": { dir: "previousSibling" }
4155beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
4156beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
41574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	preFilter: {
41584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"ATTR": function( match ) {
41594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			match[1] = match[1].replace( rbackslash, "" );
4160beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
41614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Move the given value to match[3] whether quoted or unquoted
41624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );
4163beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
41644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( match[2] === "~=" ) {
41654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				match[3] = " " + match[3] + " ";
4166beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
4167beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
41684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return match.slice( 0, 4 );
4169beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
4170beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
41714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"CHILD": function( match ) {
41724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			/* matches from matchExpr["CHILD"]
41734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				1 type (only|nth|...)
41744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
41754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				3 xn-component of xn+y argument ([+-]?\d*n|)
41764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				4 sign of xn-component
41774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				5 x of xn-component
41784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				6 sign of y-component
41794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				7 y of y-component
41804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			*/
41814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			match[1] = match[1].toLowerCase();
4182beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
4183beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( match[1] === "nth" ) {
41844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// nth-child requires argument
4185beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( !match[2] ) {
4186beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					Sizzle.error( match[0] );
4187beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
4188beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
41894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// numeric x and y parameters for Expr.filter.CHILD
41904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// remember that false/true cast respectively to 0/1
41914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) );
41924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" );
4193beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
41944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// other types prohibit arguments
41954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			} else if ( match[2] ) {
4196beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				Sizzle.error( match[0] );
4197beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
4198beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
4199beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return match;
4200beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
4201beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
42024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"PSEUDO": function( match ) {
42034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var unquoted, excess;
42044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( matchExpr["CHILD"].test( match[0] ) ) {
42054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return null;
4206beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
4207beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
42084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( match[3] ) {
42094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				match[2] = match[3];
42104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			} else if ( (unquoted = match[4]) ) {
42114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Only check arguments that contain a pseudo
42124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( rpseudo.test(unquoted) &&
42134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Get excess from tokenize (recursively)
42144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					(excess = tokenize( unquoted, true )) &&
42154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// advance to the next closing parenthesis
42164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
4217beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
42184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// excess is a negative index
42194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					unquoted = unquoted.slice( 0, excess );
42204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					match[0] = match[0].slice( 0, excess );
4221beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
42224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				match[2] = unquoted;
4223beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
4224beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
42254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Return only captures needed by the pseudo filter method (type and argument)
42264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return match.slice( 0, 3 );
4227beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
4228beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
4229beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
42304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	filter: {
42314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"ID": assertGetIdNotName ?
42324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			function( id ) {
42334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				id = id.replace( rbackslash, "" );
42344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return function( elem ) {
42354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					return elem.getAttribute("id") === id;
42364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				};
42374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			} :
42384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			function( id ) {
42394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				id = id.replace( rbackslash, "" );
42404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return function( elem ) {
42414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
42424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					return node && node.value === id;
42434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				};
42444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			},
4245beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
42464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"TAG": function( nodeName ) {
42474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( nodeName === "*" ) {
42484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return function() { return true; };
4249beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
42504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();
4251beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
42524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return function( elem ) {
42534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
42544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			};
4255beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
4256beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
42574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"CLASS": function( className ) {
42584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var pattern = classCache[ expando ][ className + " " ];
4259beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
42604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return pattern ||
42614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
42624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				classCache( className, function( elem ) {
42634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
42644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				});
4265beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
4266beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
42674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"ATTR": function( name, operator, check ) {
42684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return function( elem, context ) {
42694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				var result = Sizzle.attr( elem, name );
4270beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
42714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( result == null ) {
42724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					return operator === "!=";
42734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
42744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( !operator ) {
42754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					return true;
42764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
4277beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
42784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				result += "";
4279beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
42804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return operator === "=" ? result === check :
42814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					operator === "!=" ? result !== check :
42824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					operator === "^=" ? check && result.indexOf( check ) === 0 :
42834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					operator === "*=" ? check && result.indexOf( check ) > -1 :
42844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					operator === "$=" ? check && result.substr( result.length - check.length ) === check :
42854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
42864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" :
42874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					false;
42884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			};
4289beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
4290beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
42914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"CHILD": function( type, argument, first, last ) {
4292beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
42934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( type === "nth" ) {
42944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return function( elem ) {
42954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					var node, diff,
42964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						parent = elem.parentNode;
4297beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
42984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( first === 1 && last === 0 ) {
42994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						return true;
43004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
4301beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
43024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( parent ) {
43034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						diff = 0;
43044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						for ( node = parent.firstChild; node; node = node.nextSibling ) {
43054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							if ( node.nodeType === 1 ) {
43064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								diff++;
43074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								if ( elem === node ) {
43084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair									break;
43094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								}
43104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							}
43114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
43124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
4313beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
43144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Incorporate the offset (or cast to NaN), then check against cycle size
43154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					diff -= last;
43164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					return diff === first || ( diff % first === 0 && diff / first >= 0 );
43174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				};
43184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
4319beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
43204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return function( elem ) {
43214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				var node = elem;
4322beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
43234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				switch ( type ) {
43244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					case "only":
43254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					case "first":
43264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						while ( (node = node.previousSibling) ) {
43274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							if ( node.nodeType === 1 ) {
43284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								return false;
43294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							}
43304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
4331beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
43324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						if ( type === "first" ) {
43334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							return true;
43344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
4335beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
43364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						node = elem;
4337beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
43384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						/* falls through */
43394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					case "last":
43404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						while ( (node = node.nextSibling) ) {
43414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							if ( node.nodeType === 1 ) {
43424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								return false;
43434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							}
43444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
4345beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
43464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						return true;
43474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
43484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			};
4349beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
4350beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
43514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"PSEUDO": function( pseudo, argument ) {
43524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// pseudo-class names are case-insensitive
43534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// http://www.w3.org/TR/selectors/#pseudo-classes
43544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
43554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Remember that setFilters inherits from pseudos
43564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var args,
43574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
43584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					Sizzle.error( "unsupported pseudo: " + pseudo );
43594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
43604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// The user may use createPseudo to indicate that
43614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// arguments are needed to create the filter function
43624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// just as Sizzle does
43634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( fn[ expando ] ) {
43644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return fn( argument );
43654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
43664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
43674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// But maintain support for old signatures
43684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( fn.length > 1 ) {
43694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				args = [ pseudo, pseudo, "", argument ];
43704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
43714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					markFunction(function( seed, matches ) {
43724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						var idx,
43734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							matched = fn( seed, argument ),
43744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							i = matched.length;
43754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						while ( i-- ) {
43764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							idx = indexOf.call( seed, matched[i] );
43774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							seed[ idx ] = !( matches[ idx ] = matched[i] );
43784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
43794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}) :
43804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					function( elem ) {
43814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						return fn( elem, 0, args );
43824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					};
43834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
4384beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
43854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return fn;
4386beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
4387beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
4388beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
43894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	pseudos: {
43904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"not": markFunction(function( selector ) {
43914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Trim the selector passed to compile
43924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// to avoid treating leading and trailing
43934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// spaces as combinators
43944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var input = [],
43954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				results = [],
43964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				matcher = compile( selector.replace( rtrim, "$1" ) );
4397beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
43984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return matcher[ expando ] ?
43994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				markFunction(function( seed, matches, context, xml ) {
44004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					var elem,
44014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						unmatched = matcher( seed, null, xml, [] ),
44024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						i = seed.length;
4403beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
44044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Match elements unmatched by `matcher`
44054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					while ( i-- ) {
44064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						if ( (elem = unmatched[i]) ) {
44074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							seed[i] = !(matches[i] = elem);
44084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
4409beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
44104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}) :
44114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				function( elem, context, xml ) {
44124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					input[0] = elem;
44134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					matcher( input, null, xml, results );
44144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					return !results.pop();
44154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				};
44164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}),
4417beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
44184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"has": markFunction(function( selector ) {
44194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return function( elem ) {
44204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return Sizzle( selector, elem ).length > 0;
44214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			};
44224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}),
4423beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
44244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"contains": markFunction(function( text ) {
44254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return function( elem ) {
44264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
44274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			};
44284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}),
44294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
44304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"enabled": function( elem ) {
44314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return elem.disabled === false;
4432beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
4433beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
44344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"disabled": function( elem ) {
44354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return elem.disabled === true;
44364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		},
4437beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
44384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"checked": function( elem ) {
44394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// In CSS3, :checked should return both checked and selected elements
44404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
44414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var nodeName = elem.nodeName.toLowerCase();
44424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
44434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		},
4444beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
44454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"selected": function( elem ) {
44464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Accessing this property makes selected-by-default
44474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// options in Safari work properly
44484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( elem.parentNode ) {
44494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				elem.parentNode.selectedIndex;
44504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
4451beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
44524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return elem.selected === true;
44534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		},
4454beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
44554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"parent": function( elem ) {
44564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return !Expr.pseudos["empty"]( elem );
44574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		},
4458beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
44594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"empty": function( elem ) {
44604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// http://www.w3.org/TR/selectors/#empty-pseudo
44614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
44624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			//   not comment, processing instructions, or others
44634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Thanks to Diego Perini for the nodeName shortcut
44644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			//   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
44654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var nodeType;
44664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			elem = elem.firstChild;
44674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			while ( elem ) {
44684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {
44694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					return false;
44704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
44714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				elem = elem.nextSibling;
44724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
44734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return true;
44744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		},
4475beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
44764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"header": function( elem ) {
44774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return rheader.test( elem.nodeName );
44784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		},
4479beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
44804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"text": function( elem ) {
44814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var type, attr;
44824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
44834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// use getAttribute instead to test this case
44844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return elem.nodeName.toLowerCase() === "input" &&
44854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				(type = elem.type) === "text" &&
44864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type );
44874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		},
4488beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
44894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Input types
44904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"radio": createInputPseudo("radio"),
44914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"checkbox": createInputPseudo("checkbox"),
44924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"file": createInputPseudo("file"),
44934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"password": createInputPseudo("password"),
44944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"image": createInputPseudo("image"),
4495beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
44964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"submit": createButtonPseudo("submit"),
44974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"reset": createButtonPseudo("reset"),
4498beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
44994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"button": function( elem ) {
45004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var name = elem.nodeName.toLowerCase();
45014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return name === "input" && elem.type === "button" || name === "button";
4502beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
4503beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
45044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"input": function( elem ) {
45054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return rinputs.test( elem.nodeName );
4506beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
45074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
45084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"focus": function( elem ) {
45094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var doc = elem.ownerDocument;
45104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
4511beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
4512beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
45134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"active": function( elem ) {
45144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return elem === elem.ownerDocument.activeElement;
4515beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
4516beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
45174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Positional types
45184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"first": createPositionalPseudo(function() {
45194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return [ 0 ];
45204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}),
4521beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
45224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"last": createPositionalPseudo(function( matchIndexes, length ) {
45234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return [ length - 1 ];
45244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}),
4525beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
45264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
45274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return [ argument < 0 ? argument + length : argument ];
45284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}),
4529beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
45304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"even": createPositionalPseudo(function( matchIndexes, length ) {
45314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			for ( var i = 0; i < length; i += 2 ) {
45324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				matchIndexes.push( i );
45334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
45344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return matchIndexes;
45354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}),
4536beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
45374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"odd": createPositionalPseudo(function( matchIndexes, length ) {
45384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			for ( var i = 1; i < length; i += 2 ) {
45394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				matchIndexes.push( i );
45404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
45414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return matchIndexes;
45424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}),
4543beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
45444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
45454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			for ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) {
45464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				matchIndexes.push( i );
45474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
45484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return matchIndexes;
45494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}),
45504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
45514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
45524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			for ( var i = argument < 0 ? argument + length : argument; ++i < length; ) {
45534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				matchIndexes.push( i );
45544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
45554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return matchIndexes;
45564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		})
4557beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
4558beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik};
4559beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
45604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction siblingCheck( a, b, ret ) {
45614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( a === b ) {
45624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return ret;
45634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
4564beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
45654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var cur = a.nextSibling;
4566beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
45674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	while ( cur ) {
45684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( cur === b ) {
45694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return -1;
4570beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
4571beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
45724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		cur = cur.nextSibling;
45734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
4574beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
45754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return 1;
45764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
4577beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
45784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairsortOrder = docElem.compareDocumentPosition ?
45794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	function( a, b ) {
4580beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( a === b ) {
4581beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			hasDuplicate = true;
4582beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return 0;
4583beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
4584beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
45854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return ( !a.compareDocumentPosition || !b.compareDocumentPosition ?
45864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			a.compareDocumentPosition :
45874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			a.compareDocumentPosition(b) & 4
45884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		) ? -1 : 1;
45894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	} :
45904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	function( a, b ) {
4591beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// The nodes are identical, we can exit early
4592beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( a === b ) {
4593beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			hasDuplicate = true;
4594beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return 0;
4595beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
4596beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Fallback to using sourceIndex (in IE) if it's available on both nodes
4597beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else if ( a.sourceIndex && b.sourceIndex ) {
4598beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return a.sourceIndex - b.sourceIndex;
4599beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
4600beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
4601beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var al, bl,
4602beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			ap = [],
4603beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			bp = [],
4604beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			aup = a.parentNode,
4605beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			bup = b.parentNode,
4606beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			cur = aup;
4607beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
4608beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// If the nodes are siblings (or identical) we can do a quick check
4609beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( aup === bup ) {
4610beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return siblingCheck( a, b );
4611beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
4612beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// If no parents were found then the nodes are disconnected
4613beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else if ( !aup ) {
4614beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return -1;
4615beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
4616beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else if ( !bup ) {
4617beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return 1;
4618beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
4619beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
4620beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Otherwise they're somewhere else in the tree so we need
4621beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// to build up a full list of the parentNodes for comparison
4622beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		while ( cur ) {
4623beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			ap.unshift( cur );
4624beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			cur = cur.parentNode;
4625beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
4626beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
4627beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		cur = bup;
4628beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
4629beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		while ( cur ) {
4630beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			bp.unshift( cur );
4631beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			cur = cur.parentNode;
4632beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
4633beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
4634beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		al = ap.length;
4635beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		bl = bp.length;
4636beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
4637beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Start walking down the tree looking for a discrepancy
4638beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		for ( var i = 0; i < al && i < bl; i++ ) {
4639beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( ap[i] !== bp[i] ) {
4640beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return siblingCheck( ap[i], bp[i] );
4641beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
4642beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
4643beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
4644beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// We ended someplace up the tree so do a sibling check
4645beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return i === al ?
4646beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			siblingCheck( a, bp[i], -1 ) :
4647beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			siblingCheck( ap[i], b, 1 );
4648beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
4649beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
46504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// Always assume the presence of duplicates if sort doesn't
46514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// pass them to our comparison function (as in Google Chrome).
46524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair[0, 0].sort( sortOrder );
46534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairbaseHasDuplicate = !hasDuplicate;
46544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
46554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// Document sorting and removing duplicates
46564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairSizzle.uniqueSort = function( results ) {
46574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var elem,
46584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		duplicates = [],
46594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		i = 1,
46604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		j = 0;
46614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
46624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	hasDuplicate = baseHasDuplicate;
46634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	results.sort( sortOrder );
46644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
46654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( hasDuplicate ) {
46664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		for ( ; (elem = results[i]); i++ ) {
46674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( elem === results[ i - 1 ] ) {
46684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				j = duplicates.push( i );
46694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
46704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
46714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		while ( j-- ) {
46724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			results.splice( duplicates[ j ], 1 );
4673beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
46744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
4675beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
46764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return results;
46774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair};
4678beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
46794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairSizzle.error = function( msg ) {
46804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	throw new Error( "Syntax error, unrecognized expression: " + msg );
46814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair};
46824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
46834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction tokenize( selector, parseOnly ) {
46844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var matched, match, tokens, type,
46854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		soFar, groups, preFilters,
46864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		cached = tokenCache[ expando ][ selector + " " ];
46874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
46884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( cached ) {
46894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return parseOnly ? 0 : cached.slice( 0 );
46904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
46914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
46924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	soFar = selector;
46934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	groups = [];
46944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	preFilters = Expr.preFilter;
46954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
46964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	while ( soFar ) {
46974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
46984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Comma and first run
46994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !matched || (match = rcomma.exec( soFar )) ) {
47004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( match ) {
47014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Don't consume trailing commas as valid
47024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				soFar = soFar.slice( match[0].length ) || soFar;
4703beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
47044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			groups.push( tokens = [] );
47054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
47064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
47074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		matched = false;
47084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
47094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Combinators
47104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( (match = rcombinators.exec( soFar )) ) {
47114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			tokens.push( matched = new Token( match.shift() ) );
47124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			soFar = soFar.slice( matched.length );
4713beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
47144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Cast descendant combinators to space
47154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			matched.type = match[0].replace( rtrim, " " );
47164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
47174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
47184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Filters
47194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		for ( type in Expr.filter ) {
47204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
47214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				(match = preFilters[ type ]( match ))) ) {
47224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
47234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				tokens.push( matched = new Token( match.shift() ) );
47244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				soFar = soFar.slice( matched.length );
47254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				matched.type = type;
47264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				matched.matches = match;
47274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
47284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
47294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
47304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !matched ) {
47314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			break;
47324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
47334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
47344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
47354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Return the length of the invalid excess
47364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// if we're just parsing
47374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Otherwise, throw an error or return tokens
47384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return parseOnly ?
47394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		soFar.length :
47404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		soFar ?
47414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			Sizzle.error( selector ) :
47424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Cache the tokens
47434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			tokenCache( selector, groups ).slice( 0 );
47444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
47454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
47464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction addCombinator( matcher, combinator, base ) {
47474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var dir = combinator.dir,
47484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		checkNonElements = base && combinator.dir === "parentNode",
47494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		doneName = done++;
47504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
47514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return combinator.first ?
47524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Check against closest ancestor/preceding element
47534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		function( elem, context, xml ) {
47544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			while ( (elem = elem[ dir ]) ) {
47554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( checkNonElements || elem.nodeType === 1  ) {
47564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					return matcher( elem, context, xml );
47574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
47584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
47594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} :
47604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
47614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Check against all ancestor/preceding elements
47624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		function( elem, context, xml ) {
47634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
47644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( !xml ) {
47654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				var cache,
47664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					dirkey = dirruns + " " + doneName + " ",
47674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					cachedkey = dirkey + cachedruns;
47684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				while ( (elem = elem[ dir ]) ) {
47694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( checkNonElements || elem.nodeType === 1 ) {
47704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						if ( (cache = elem[ expando ]) === cachedkey ) {
47714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							return elem.sizset;
47724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						} else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {
47734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							if ( elem.sizset ) {
47744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								return elem;
47754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							}
47764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						} else {
47774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							elem[ expando ] = cachedkey;
47784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							if ( matcher( elem, context, xml ) ) {
47794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								elem.sizset = true;
47804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								return elem;
47814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							}
47824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							elem.sizset = false;
47834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
47844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
47854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
47864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			} else {
47874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				while ( (elem = elem[ dir ]) ) {
47884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( checkNonElements || elem.nodeType === 1 ) {
47894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						if ( matcher( elem, context, xml ) ) {
47904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							return elem;
47914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
47924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
47934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
47944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
47954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		};
47964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
47974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
47984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction elementMatcher( matchers ) {
47994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return matchers.length > 1 ?
48004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		function( elem, context, xml ) {
48014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var i = matchers.length;
48024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			while ( i-- ) {
48034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( !matchers[i]( elem, context, xml ) ) {
48044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					return false;
48054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
48064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
48074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return true;
48084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} :
48094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		matchers[0];
48104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
48114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
48124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction condense( unmatched, map, filter, context, xml ) {
48134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var elem,
48144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		newUnmatched = [],
48154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		i = 0,
48164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		len = unmatched.length,
48174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		mapped = map != null;
48184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
48194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	for ( ; i < len; i++ ) {
48204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( (elem = unmatched[i]) ) {
48214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( !filter || filter( elem, context, xml ) ) {
48224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				newUnmatched.push( elem );
48234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( mapped ) {
48244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					map.push( i );
48254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
48264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
4827beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
48284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
4829beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
48304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return newUnmatched;
4831beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
4832beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
48334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
48344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( postFilter && !postFilter[ expando ] ) {
48354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		postFilter = setMatcher( postFilter );
48364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
48374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( postFinder && !postFinder[ expando ] ) {
48384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		postFinder = setMatcher( postFinder, postSelector );
48394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
48404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return markFunction(function( seed, results, context, xml ) {
48414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var temp, i, elem,
48424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			preMap = [],
48434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			postMap = [],
48444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			preexisting = results.length,
4845beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
48464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Get initial elements from seed or context
48474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
4848beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
48494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Prefilter to get matcher input, preserving a map for seed-results synchronization
48504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			matcherIn = preFilter && ( seed || !selector ) ?
48514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				condense( elems, preMap, preFilter, context, xml ) :
48524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				elems,
4853beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
48544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			matcherOut = matcher ?
48554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
48564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
4857beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
48584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// ...intermediate processing is necessary
48594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					[] :
4860beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
48614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// ...otherwise use results directly
48624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					results :
48634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				matcherIn;
4864beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
48654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Find primary matches
48664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( matcher ) {
48674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			matcher( matcherIn, matcherOut, context, xml );
48684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
4869beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
48704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Apply postFilter
48714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( postFilter ) {
48724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			temp = condense( matcherOut, postMap );
48734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			postFilter( temp, [], context, xml );
4874beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
48754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Un-match failing elements by moving them back to matcherIn
48764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			i = temp.length;
48774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			while ( i-- ) {
48784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( (elem = temp[i]) ) {
48794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
48804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
48814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
48824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
4883beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
48844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( seed ) {
48854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( postFinder || preFilter ) {
48864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( postFinder ) {
48874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Get the final matcherOut by condensing this intermediate into postFinder contexts
48884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					temp = [];
48894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					i = matcherOut.length;
48904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					while ( i-- ) {
48914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						if ( (elem = matcherOut[i]) ) {
48924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							// Restore matcherIn since elem is not yet a final match
48934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							temp.push( (matcherIn[i] = elem) );
48944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
48954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
48964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					postFinder( null, (matcherOut = []), temp, xml );
48974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
4898beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
48994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Move matched elements from seed to results to keep them synchronized
49004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				i = matcherOut.length;
49014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				while ( i-- ) {
49024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( (elem = matcherOut[i]) &&
49034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
4904beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
49054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						seed[temp] = !(results[temp] = elem);
4906beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
4907beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
4908beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
4909beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
49104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Add elements to results, through postFinder if defined
49114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} else {
49124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			matcherOut = condense(
49134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				matcherOut === results ?
49144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					matcherOut.splice( preexisting, matcherOut.length ) :
49154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					matcherOut
49164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			);
49174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( postFinder ) {
49184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				postFinder( null, results, matcherOut, xml );
49194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			} else {
49204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				push.apply( results, matcherOut );
49214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
49224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
49234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	});
49244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
4925beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
49264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction matcherFromTokens( tokens ) {
49274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var checkContext, matcher, j,
49284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		len = tokens.length,
49294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		leadingRelative = Expr.relative[ tokens[0].type ],
49304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		implicitRelative = leadingRelative || Expr.relative[" "],
49314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		i = leadingRelative ? 1 : 0,
49324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
49334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// The foundational matcher ensures that elements are reachable from top-level context(s)
49344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		matchContext = addCombinator( function( elem ) {
49354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return elem === checkContext;
49364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}, implicitRelative, true ),
49374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		matchAnyContext = addCombinator( function( elem ) {
49384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return indexOf.call( checkContext, elem ) > -1;
49394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}, implicitRelative, true ),
49404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		matchers = [ function( elem, context, xml ) {
49414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
49424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				(checkContext = context).nodeType ?
49434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					matchContext( elem, context, xml ) :
49444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					matchAnyContext( elem, context, xml ) );
49454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} ];
49464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
49474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	for ( ; i < len; i++ ) {
49484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
49494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
49504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} else {
49514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
49524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
49534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Return special upon seeing a positional matcher
49544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( matcher[ expando ] ) {
49554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Find the next relative operator (if any) for proper handling
49564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				j = ++i;
49574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				for ( ; j < len; j++ ) {
49584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( Expr.relative[ tokens[j].type ] ) {
49594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						break;
49604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
49614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
49624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return setMatcher(
49634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					i > 1 && elementMatcher( matchers ),
49644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ),
49654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					matcher,
49664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					i < j && matcherFromTokens( tokens.slice( i, j ) ),
49674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
49684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					j < len && tokens.join("")
49694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				);
49704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
49714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			matchers.push( matcher );
49724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
4973beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
4974beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
49754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return elementMatcher( matchers );
49764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
4977beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
49784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {
49794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var bySet = setMatchers.length > 0,
49804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		byElement = elementMatchers.length > 0,
49814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		superMatcher = function( seed, context, xml, results, expandContext ) {
49824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var elem, j, matcher,
49834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				setMatched = [],
49844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				matchedCount = 0,
49854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				i = "0",
49864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				unmatched = seed && [],
49874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				outermost = expandContext != null,
49884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				contextBackup = outermostContext,
49894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// We must always have either seed elements or context
49904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
49914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Nested matchers should use non-integer dirruns
49924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);
49934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
49944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( outermost ) {
49954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				outermostContext = context !== document && context;
49964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				cachedruns = superMatcher.el;
49974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
49984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
49994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Add elements passing elementMatchers directly to results
50004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			for ( ; (elem = elems[i]) != null; i++ ) {
50014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( byElement && elem ) {
50024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					for ( j = 0; (matcher = elementMatchers[j]); j++ ) {
50034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						if ( matcher( elem, context, xml ) ) {
50044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							results.push( elem );
50054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							break;
5006beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
5007beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
50084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( outermost ) {
50094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						dirruns = dirrunsUnique;
50104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						cachedruns = ++superMatcher.el;
5011beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
50124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
5013beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
50144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Track unmatched elements for set filters
50154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( bySet ) {
50164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// They will have gone through all possible matchers
50174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( (elem = !matcher && elem) ) {
50184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						matchedCount--;
50194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
5020beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
50214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Lengthen the array for every element, matched or not
50224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( seed ) {
50234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						unmatched.push( elem );
5024beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
5025beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
5026beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
5027beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
50284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Apply set filters to unmatched elements
50294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			matchedCount += i;
50304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( bySet && i !== matchedCount ) {
50314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				for ( j = 0; (matcher = setMatchers[j]); j++ ) {
50324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					matcher( unmatched, setMatched, context, xml );
50334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
5034beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
50354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( seed ) {
50364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Reintegrate element matches to eliminate the need for sorting
50374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( matchedCount > 0 ) {
50384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						while ( i-- ) {
50394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							if ( !(unmatched[i] || setMatched[i]) ) {
50404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								setMatched[i] = pop.call( results );
50414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							}
50424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
50434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
5044beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
50454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Discard index placeholder values to get only actual matches
50464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					setMatched = condense( setMatched );
50474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
5048beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
50494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Add matches to results
50504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				push.apply( results, setMatched );
5051beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
50524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Seedless set matches succeeding multiple successful matchers stipulate sorting
50534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( outermost && !seed && setMatched.length > 0 &&
50544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					( matchedCount + setMatchers.length ) > 1 ) {
5055beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
50564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					Sizzle.uniqueSort( results );
50574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
50584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
5059beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
50604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Override manipulation of globals by nested matchers
50614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( outermost ) {
50624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				dirruns = dirrunsUnique;
50634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				outermostContext = contextBackup;
5064beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
5065beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
50664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return unmatched;
5067beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		};
5068beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
50694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	superMatcher.el = 0;
50704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return bySet ?
50714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		markFunction( superMatcher ) :
50724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		superMatcher;
50734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
5074beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
50754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclaircompile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
50764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var i,
50774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		setMatchers = [],
50784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		elementMatchers = [],
50794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		cached = compilerCache[ expando ][ selector + " " ];
50804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
50814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( !cached ) {
50824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Generate a function of recursive functions that can be used to check each element
50834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !group ) {
50844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			group = tokenize( selector );
50854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
50864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		i = group.length;
50874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		while ( i-- ) {
50884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			cached = matcherFromTokens( group[i] );
50894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( cached[ expando ] ) {
50904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				setMatchers.push( cached );
50914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			} else {
50924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				elementMatchers.push( cached );
50934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
50944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
5095beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
50964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Cache the compiled function
50974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
5098beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
50994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return cached;
51004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair};
5101beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
51024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction multipleContexts( selector, contexts, results ) {
51034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var i = 0,
51044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		len = contexts.length;
51054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	for ( ; i < len; i++ ) {
51064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		Sizzle( selector, contexts[i], results );
5107beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
51084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return results;
51094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
5110beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
51114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction select( selector, context, results, seed, xml ) {
51124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var i, tokens, token, type, find,
51134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		match = tokenize( selector ),
51144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		j = match.length;
5115beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
51164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( !seed ) {
51174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Try to minimize operations if there is only one group
51184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( match.length === 1 ) {
5119beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
51204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Take a shortcut and set the context if the root selector is an ID
51214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			tokens = match[0] = match[0].slice( 0 );
51224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
51234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					context.nodeType === 9 && !xml &&
51244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					Expr.relative[ tokens[1].type ] ) {
5125beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
51264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context, xml )[0];
51274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( !context ) {
51284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					return results;
5129beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
5130beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
51314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				selector = selector.slice( tokens.shift().length );
51324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
51334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
51344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Fetch a seed set for right-to-left matching
51354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			for ( i = matchExpr["POS"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {
51364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				token = tokens[i];
5137beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
51384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Abort if we hit a combinator
51394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( Expr.relative[ (type = token.type) ] ) {
5140beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					break;
5141beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
51424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( (find = Expr.find[ type ]) ) {
51434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Search, expanding context for leading sibling combinators
51444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( (seed = find(
51454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						token.matches[0].replace( rbackslash, "" ),
51464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						rsibling.test( tokens[0].type ) && context.parentNode || context,
51474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						xml
51484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					)) ) {
51494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
51504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// If seed is empty or no tokens remain, we can return early
51514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						tokens.splice( i, 1 );
51524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						selector = seed.length && tokens.join("");
51534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						if ( !selector ) {
51544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							push.apply( results, slice.call( seed, 0 ) );
51554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							return results;
51564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
5157beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
51584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						break;
51594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
51604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
5161beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
5162beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5163beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
51644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
51654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Compile and execute a filtering function
51664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Provide `match` to avoid retokenization if we modified the selector above
51674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	compile( selector, match )(
51684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		seed,
51694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		context,
51704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		xml,
51714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		results,
51724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		rsibling.test( selector )
51734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	);
51744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return results;
5175beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
5176beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
51774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairif ( document.querySelectorAll ) {
51784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	(function() {
51794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var disconnectedMatch,
51804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			oldSelect = select,
51814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			rescape = /'|\\/g,
51824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
51834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
51844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// qSa(:focus) reports false when true (Chrome 21), no need to also add to buggyMatches since matches checks buggyQSA
51854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// A support test would require too much code (would include document ready)
51864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			rbuggyQSA = [ ":focus" ],
51874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
51884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
51894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// A support test would require too much code (would include document ready)
51904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// just skip matchesSelector for :active
51914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			rbuggyMatches = [ ":active" ],
51924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			matches = docElem.matchesSelector ||
51934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				docElem.mozMatchesSelector ||
51944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				docElem.webkitMatchesSelector ||
51954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				docElem.oMatchesSelector ||
51964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				docElem.msMatchesSelector;
51974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
51984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Build QSA regex
51994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Regex strategy adopted from Diego Perini
52004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		assert(function( div ) {
52014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Select is set to empty string on purpose
52024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// This is to test IE's treatment of not explictly
52034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// setting a boolean content attribute,
52044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// since its presence should be enough
52054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// http://bugs.jquery.com/ticket/12359
52064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			div.innerHTML = "<select><option selected=''></option></select>";
52074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
52084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// IE8 - Some boolean attributes are not treated correctly
52094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( !div.querySelectorAll("[selected]").length ) {
52104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
52114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
52124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
52134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Webkit/Opera - :checked should return selected option elements
52144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
52154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// IE8 throws error here (do not put tests after this one)
52164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( !div.querySelectorAll(":checked").length ) {
52174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				rbuggyQSA.push(":checked");
52184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
52194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		});
5220beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
52214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		assert(function( div ) {
5222beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
52234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Opera 10-12/IE9 - ^= $= *= and empty values
52244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Should not select anything
52254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			div.innerHTML = "<p test=''></p>";
52264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( div.querySelectorAll("[test^='']").length ) {
52274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
52284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
5229beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
52304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
52314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// IE8 throws error here (do not put tests after this one)
52324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			div.innerHTML = "<input type='hidden'/>";
52334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( !div.querySelectorAll(":enabled").length ) {
52344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				rbuggyQSA.push(":enabled", ":disabled");
52354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
52364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		});
5237beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
52384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// rbuggyQSA always contains :focus, so no need for a length check
52394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		rbuggyQSA = /* rbuggyQSA.length && */ new RegExp( rbuggyQSA.join("|") );
5240beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
52414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		select = function( selector, context, results, seed, xml ) {
52424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Only use querySelectorAll when not filtering,
52434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// when this is not xml,
52444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// and when no QSA bugs apply
52454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( !seed && !xml && !rbuggyQSA.test( selector ) ) {
52464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				var groups, i,
52474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					old = true,
52484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					nid = expando,
52494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					newContext = context,
52504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					newSelector = context.nodeType === 9 && selector;
52514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
52524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// qSA works strangely on Element-rooted queries
52534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// We can work around this by specifying an extra ID on the root
52544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// and working up from there (Thanks to Andrew Dupont for the technique)
52554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// IE 8 doesn't work on object elements
52564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
52574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					groups = tokenize( selector );
52584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
52594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( (old = context.getAttribute("id")) ) {
52604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						nid = old.replace( rescape, "\\$&" );
52614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					} else {
52624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						context.setAttribute( "id", nid );
52634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
52644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					nid = "[id='" + nid + "'] ";
52654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
52664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					i = groups.length;
52674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					while ( i-- ) {
52684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						groups[i] = nid + groups[i].join("");
5269beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
52704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					newContext = rsibling.test( selector ) && context.parentNode || context;
52714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					newSelector = groups.join(",");
5272beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
5273beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
52744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( newSelector ) {
52754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					try {
52764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						push.apply( results, slice.call( newContext.querySelectorAll(
52774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							newSelector
52784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						), 0 ) );
52794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						return results;
52804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					} catch(qsaError) {
52814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					} finally {
52824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						if ( !old ) {
52834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							context.removeAttribute("id");
52844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
52854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
52864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
5287beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
5288beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
52894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return oldSelect( selector, context, results, seed, xml );
52904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		};
5291beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
52924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( matches ) {
52934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			assert(function( div ) {
52944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Check to see if it's possible to do matchesSelector
52954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// on a disconnected node (IE 9)
52964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				disconnectedMatch = matches.call( div, "div" );
5297beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
52984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// This should fail with an exception
52994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Gecko does not error, returns false instead
53004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				try {
53014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					matches.call( div, "[test!='']:sizzle" );
53024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					rbuggyMatches.push( "!=", pseudos );
53034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				} catch ( e ) {}
53044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			});
5305beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
53064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// rbuggyMatches always contains :active and :focus, so no need for a length check
53074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );
5308beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
53094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			Sizzle.matchesSelector = function( elem, expr ) {
53104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Make sure that attribute selectors are quoted
53114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				expr = expr.replace( rattributeQuotes, "='$1']" );
5312beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
53134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// rbuggyMatches always contains :active, so no need for an existence check
53144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && !rbuggyQSA.test( expr ) ) {
53154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					try {
53164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						var ret = matches.call( elem, expr );
5317beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
53184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// IE 9's matchesSelector returns false on disconnected nodes
53194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						if ( ret || disconnectedMatch ||
53204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								// As well, disconnected nodes are said to be in a document
53214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								// fragment in IE 9
53224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								elem.document && elem.document.nodeType !== 11 ) {
53234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							return ret;
53244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
53254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					} catch(e) {}
53264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
5327beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
53284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return Sizzle( expr, null, null, [ elem ] ).length > 0;
53294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			};
53304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
53314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	})();
53324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
5333beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
53344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// Deprecated
53354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairExpr.pseudos["nth"] = Expr.pseudos["eq"];
5336beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
53374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// Back-compat
53384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction setFilters() {}
53394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairExpr.filters = setFilters.prototype = Expr.pseudos;
53404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairExpr.setFilters = new setFilters();
5341beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5342beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Override sizzle attribute retrieval
5343beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikSizzle.attr = jQuery.attr;
5344beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.find = Sizzle;
5345beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.expr = Sizzle.selectors;
53464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.expr[":"] = jQuery.expr.pseudos;
5347beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.unique = Sizzle.uniqueSort;
5348beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.text = Sizzle.getText;
5349beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.isXMLDoc = Sizzle.isXML;
5350beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.contains = Sizzle.contains;
5351beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5352beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
53534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair})( window );
5354beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikvar runtil = /Until$/,
53554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rparentsprev = /^(?:parents|prev(?:Until|All))/,
5356beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	isSimple = /^.[^:#\[\.,]*$/,
53574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rneedsContext = jQuery.expr.match.needsContext,
5358beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// methods guaranteed to produce a unique set when starting from a unique set
5359beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	guaranteedUnique = {
5360beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		children: true,
5361beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		contents: true,
5362beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		next: true,
5363beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		prev: true
5364beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
5365beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5366beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.fn.extend({
5367beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	find: function( selector ) {
53684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var i, l, length, n, r, ret,
53694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			self = this;
5370beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5371beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( typeof selector !== "string" ) {
5372beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return jQuery( selector ).filter(function() {
5373beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				for ( i = 0, l = self.length; i < l; i++ ) {
5374beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( jQuery.contains( self[ i ], this ) ) {
5375beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						return true;
5376beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
5377beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
5378beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			});
5379beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5380beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
53814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		ret = this.pushStack( "", "find", selector );
5382beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5383beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		for ( i = 0, l = this.length; i < l; i++ ) {
5384beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			length = ret.length;
5385beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.find( selector, this[i], ret );
5386beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5387beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( i > 0 ) {
5388beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Make sure that the results are unique
5389beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				for ( n = length; n < ret.length; n++ ) {
5390beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					for ( r = 0; r < length; r++ ) {
5391beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						if ( ret[r] === ret[n] ) {
5392beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							ret.splice(n--, 1);
5393beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							break;
5394beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
5395beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
5396beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
5397beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
5398beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5399beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5400beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return ret;
5401beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5402beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5403beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	has: function( target ) {
54044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var i,
54054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			targets = jQuery( target, this ),
54064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			len = targets.length;
54074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
5408beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.filter(function() {
54094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			for ( i = 0; i < len; i++ ) {
5410beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( jQuery.contains( this, targets[i] ) ) {
5411beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					return true;
5412beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
5413beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
5414beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
5415beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5416beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5417beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	not: function( selector ) {
5418beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.pushStack( winnow(this, selector, false), "not", selector);
5419beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5420beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5421beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	filter: function( selector ) {
5422beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.pushStack( winnow(this, selector, true), "filter", selector );
5423beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5424beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5425beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	is: function( selector ) {
54264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return !!selector && (
5427beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			typeof selector === "string" ?
54284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// If this is a positional/relative selector, check membership in the returned set
5429beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// so $("p:first").is("p:last") won't return true for a doc with two "p".
54304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				rneedsContext.test( selector ) ?
5431beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					jQuery( selector, this.context ).index( this[0] ) >= 0 :
5432beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					jQuery.filter( selector, this ).length > 0 :
5433beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				this.filter( selector ).length > 0 );
5434beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5435beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5436beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	closest: function( selectors, context ) {
54374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var cur,
54384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			i = 0,
54394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			l = this.length,
54404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			ret = [],
54414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
5442beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jQuery( selectors, context || this.context ) :
5443beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				0;
5444beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
54454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		for ( ; i < l; i++ ) {
5446beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			cur = this[i];
5447beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
54484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
5449beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
5450beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					ret.push( cur );
5451beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					break;
5452beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
54534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				cur = cur.parentNode;
5454beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
5455beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5456beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5457beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
5458beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5459beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.pushStack( ret, "closest", selectors );
5460beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5461beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5462beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Determine the position of an element within
5463beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// the matched set of elements
5464beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	index: function( elem ) {
5465beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5466beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// No argument, return index in parent
5467beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !elem ) {
5468beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
5469beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5470beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5471beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// index in selector
5472beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( typeof elem === "string" ) {
5473beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return jQuery.inArray( this[0], jQuery( elem ) );
5474beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5475beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5476beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Locate the position of the desired element
5477beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery.inArray(
5478beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// If it receives a jQuery object, the first element is used
5479beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			elem.jquery ? elem[0] : elem, this );
5480beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5481beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5482beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	add: function( selector, context ) {
5483beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var set = typeof selector === "string" ?
5484beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jQuery( selector, context ) :
5485beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
5486beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			all = jQuery.merge( this.get(), set );
5487beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5488beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
5489beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			all :
5490beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.unique( all ) );
5491beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5492beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
54934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	addBack: function( selector ) {
54944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return this.add( selector == null ?
54954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			this.prevObject : this.prevObject.filter(selector)
54964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		);
5497beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
5498beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
5499beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
55004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.fn.andSelf = jQuery.fn.addBack;
55014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
5502beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// A painfully simple check to see if an element is disconnected
5503beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// from a document (should be improved, where feasible).
5504beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikfunction isDisconnected( node ) {
5505beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	return !node || !node.parentNode || node.parentNode.nodeType === 11;
5506beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
5507beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
55084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction sibling( cur, dir ) {
55094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	do {
55104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		cur = cur[ dir ];
55114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	} while ( cur && cur.nodeType !== 1 );
55124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
55134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return cur;
55144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
55154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
5516beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.each({
5517beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	parent: function( elem ) {
5518beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var parent = elem.parentNode;
5519beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return parent && parent.nodeType !== 11 ? parent : null;
5520beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5521beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	parents: function( elem ) {
5522beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery.dir( elem, "parentNode" );
5523beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5524beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	parentsUntil: function( elem, i, until ) {
5525beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery.dir( elem, "parentNode", until );
5526beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5527beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	next: function( elem ) {
55284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return sibling( elem, "nextSibling" );
5529beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5530beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	prev: function( elem ) {
55314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return sibling( elem, "previousSibling" );
5532beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5533beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	nextAll: function( elem ) {
5534beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery.dir( elem, "nextSibling" );
5535beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5536beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	prevAll: function( elem ) {
5537beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery.dir( elem, "previousSibling" );
5538beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5539beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	nextUntil: function( elem, i, until ) {
5540beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery.dir( elem, "nextSibling", until );
5541beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5542beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	prevUntil: function( elem, i, until ) {
5543beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery.dir( elem, "previousSibling", until );
5544beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5545beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	siblings: function( elem ) {
55464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
5547beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5548beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	children: function( elem ) {
5549beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery.sibling( elem.firstChild );
5550beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5551beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	contents: function( elem ) {
5552beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery.nodeName( elem, "iframe" ) ?
5553beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			elem.contentDocument || elem.contentWindow.document :
55544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			jQuery.merge( [], elem.childNodes );
5555beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
5556beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}, function( name, fn ) {
5557beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.fn[ name ] = function( until, selector ) {
5558beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var ret = jQuery.map( this, fn, until );
5559beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5560beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !runtil.test( name ) ) {
5561beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			selector = until;
5562beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5563beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5564beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( selector && typeof selector === "string" ) {
5565beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			ret = jQuery.filter( selector, ret );
5566beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5567beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5568beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
5569beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
55704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( this.length > 1 && rparentsprev.test( name ) ) {
5571beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			ret = ret.reverse();
5572beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5573beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
55744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return this.pushStack( ret, name, core_slice.call( arguments ).join(",") );
5575beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
5576beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
5577beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5578beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.extend({
5579beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	filter: function( expr, elems, not ) {
5580beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( not ) {
5581beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			expr = ":not(" + expr + ")";
5582beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5583beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5584beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return elems.length === 1 ?
5585beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
5586beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.find.matches(expr, elems);
5587beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5588beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5589beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	dir: function( elem, dir, until ) {
5590beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var matched = [],
5591beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			cur = elem[ dir ];
5592beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5593beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
5594beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( cur.nodeType === 1 ) {
5595beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				matched.push( cur );
5596beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
5597beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			cur = cur[dir];
5598beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5599beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return matched;
5600beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5601beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5602beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	sibling: function( n, elem ) {
5603beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var r = [];
5604beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5605beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		for ( ; n; n = n.nextSibling ) {
5606beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( n.nodeType === 1 && n !== elem ) {
5607beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				r.push( n );
5608beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
5609beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5610beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5611beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return r;
5612beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
5613beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
5614beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5615beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Implement the identical functionality for filter and not
5616beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikfunction winnow( elements, qualifier, keep ) {
5617beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5618beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Can't pass null or undefined to indexOf in Firefox 4
5619beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Set to 0 to skip string check
5620beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	qualifier = qualifier || 0;
5621beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5622beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( jQuery.isFunction( qualifier ) ) {
5623beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery.grep(elements, function( elem, i ) {
5624beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			var retVal = !!qualifier.call( elem, i, elem );
5625beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return retVal === keep;
5626beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
5627beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5628beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	} else if ( qualifier.nodeType ) {
5629beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery.grep(elements, function( elem, i ) {
5630beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return ( elem === qualifier ) === keep;
5631beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
5632beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5633beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	} else if ( typeof qualifier === "string" ) {
5634beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var filtered = jQuery.grep(elements, function( elem ) {
5635beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return elem.nodeType === 1;
5636beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
5637beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5638beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( isSimple.test( qualifier ) ) {
5639beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return jQuery.filter(qualifier, filtered, !keep);
5640beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else {
5641beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			qualifier = jQuery.filter( qualifier, filtered );
5642beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5643beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
5644beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5645beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	return jQuery.grep(elements, function( elem, i ) {
5646beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
5647beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	});
5648beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
5649beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikfunction createSafeFragment( document ) {
5650beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	var list = nodeNames.split( "|" ),
5651beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	safeFrag = document.createDocumentFragment();
5652beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5653beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( safeFrag.createElement ) {
5654beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		while ( list.length ) {
5655beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			safeFrag.createElement(
5656beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				list.pop()
5657beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			);
5658beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5659beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
5660beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	return safeFrag;
5661beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
5662beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
56634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairvar nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
5664beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
56654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
5666beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rleadingWhitespace = /^\s+/,
56674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
5668beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rtagName = /<([\w:]+)/,
5669beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rtbody = /<tbody/i,
5670beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rhtml = /<|&#?\w+;/,
56714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rnoInnerhtml = /<(?:script|style|link)/i,
5672beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rnocache = /<(?:script|object|embed|option|style)/i,
56734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
56744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rcheckableType = /^(?:checkbox|radio)$/,
5675beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// checked="checked" or checked
5676beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5677beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rscriptType = /\/(java|ecma)script/i,
56784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
5679beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	wrapMap = {
5680beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		option: [ 1, "<select multiple='multiple'>", "</select>" ],
5681beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		legend: [ 1, "<fieldset>", "</fieldset>" ],
5682beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		thead: [ 1, "<table>", "</table>" ],
5683beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
5684beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
5685beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
5686beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		area: [ 1, "<map>", "</map>" ],
5687beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		_default: [ 0, "", "" ]
5688beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
56894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	safeFragment = createSafeFragment( document ),
56904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	fragmentDiv = safeFragment.appendChild( document.createElement("div") );
5691beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5692beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikwrapMap.optgroup = wrapMap.option;
5693beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
5694beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikwrapMap.th = wrapMap.td;
5695beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
56964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
56974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// unless wrapped in a div with non-breaking characters in front of it.
5698beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikif ( !jQuery.support.htmlSerialize ) {
56994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	wrapMap._default = [ 1, "X<div>", "</div>" ];
5700beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
5701beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5702beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.fn.extend({
57034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	text: function( value ) {
57044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return jQuery.access( this, function( value ) {
57054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return value === undefined ?
57064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery.text( this ) :
57074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
57084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}, null, value, arguments.length );
5709beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5710beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5711beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	wrapAll: function( html ) {
5712beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( jQuery.isFunction( html ) ) {
5713beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return this.each(function(i) {
5714beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jQuery(this).wrapAll( html.call(this, i) );
5715beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			});
5716beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5717beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5718beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( this[0] ) {
5719beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// The elements to wrap the target around
5720beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
5721beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5722beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( this[0].parentNode ) {
5723beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				wrap.insertBefore( this[0] );
5724beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
5725beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5726beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			wrap.map(function() {
5727beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				var elem = this;
5728beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5729beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
5730beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					elem = elem.firstChild;
5731beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
5732beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5733beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return elem;
5734beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}).append( this );
5735beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5736beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5737beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this;
5738beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5739beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5740beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	wrapInner: function( html ) {
5741beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( jQuery.isFunction( html ) ) {
5742beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return this.each(function(i) {
5743beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jQuery(this).wrapInner( html.call(this, i) );
5744beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			});
5745beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5746beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5747beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.each(function() {
5748beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			var self = jQuery( this ),
5749beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				contents = self.contents();
5750beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5751beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( contents.length ) {
5752beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				contents.wrapAll( html );
5753beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5754beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else {
5755beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				self.append( html );
5756beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
5757beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
5758beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5759beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5760beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	wrap: function( html ) {
5761beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var isFunction = jQuery.isFunction( html );
5762beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5763beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.each(function(i) {
5764beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
5765beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
5766beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5767beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5768beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	unwrap: function() {
5769beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.parent().each(function() {
5770beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( !jQuery.nodeName( this, "body" ) ) {
5771beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jQuery( this ).replaceWith( this.childNodes );
5772beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
5773beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}).end();
5774beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5775beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5776beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	append: function() {
5777beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.domManip(arguments, true, function( elem ) {
57784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( this.nodeType === 1 || this.nodeType === 11 ) {
5779beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				this.appendChild( elem );
5780beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
5781beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
5782beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5783beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5784beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	prepend: function() {
5785beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.domManip(arguments, true, function( elem ) {
57864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( this.nodeType === 1 || this.nodeType === 11 ) {
5787beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				this.insertBefore( elem, this.firstChild );
5788beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
5789beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
5790beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5791beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5792beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	before: function() {
57934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !isDisconnected( this[0] ) ) {
5794beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return this.domManip(arguments, false, function( elem ) {
5795beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				this.parentNode.insertBefore( elem, this );
5796beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			});
57974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
57984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
57994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( arguments.length ) {
5800beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			var set = jQuery.clean( arguments );
58014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
5802beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5803beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5804beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5805beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	after: function() {
58064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !isDisconnected( this[0] ) ) {
5807beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return this.domManip(arguments, false, function( elem ) {
5808beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				this.parentNode.insertBefore( elem, this.nextSibling );
5809beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			});
58104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
58114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
58124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( arguments.length ) {
58134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var set = jQuery.clean( arguments );
58144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
5815beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5816beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5817beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5818beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// keepData is for internal use only--do not document
5819beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	remove: function( selector, keepData ) {
58204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var elem,
58214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			i = 0;
58224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
58234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		for ( ; (elem = this[i]) != null; i++ ) {
5824beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
5825beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( !keepData && elem.nodeType === 1 ) {
5826beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					jQuery.cleanData( elem.getElementsByTagName("*") );
5827beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					jQuery.cleanData( [ elem ] );
5828beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
5829beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5830beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( elem.parentNode ) {
5831beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					elem.parentNode.removeChild( elem );
5832beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
5833beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
5834beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5835beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5836beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this;
5837beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5838beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5839beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	empty: function() {
58404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var elem,
58414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			i = 0;
58424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
58434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		for ( ; (elem = this[i]) != null; i++ ) {
5844beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Remove element nodes and prevent memory leaks
5845beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( elem.nodeType === 1 ) {
5846beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jQuery.cleanData( elem.getElementsByTagName("*") );
5847beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
5848beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5849beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Remove any remaining nodes
5850beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			while ( elem.firstChild ) {
5851beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				elem.removeChild( elem.firstChild );
5852beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
5853beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5854beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5855beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this;
5856beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5857beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5858beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	clone: function( dataAndEvents, deepDataAndEvents ) {
5859beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
5860beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
5861beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5862beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.map( function () {
5863beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
5864beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
5865beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5866beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5867beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	html: function( value ) {
58684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return jQuery.access( this, function( value ) {
58694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var elem = this[0] || {},
58704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				i = 0,
58714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				l = this.length;
5872beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
58734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( value === undefined ) {
58744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return elem.nodeType === 1 ?
58754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					elem.innerHTML.replace( rinlinejQuery, "" ) :
58764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					undefined;
58774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
5878beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
58794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// See if we can take a shortcut and just use innerHTML
58804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
58814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
58824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
58834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
5884beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
58854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				value = value.replace( rxhtmlTag, "<$1></$2>" );
5886beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
58874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				try {
58884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					for (; i < l; i++ ) {
58894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// Remove element nodes and prevent memory leaks
58904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						elem = this[i] || {};
58914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						if ( elem.nodeType === 1 ) {
58924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							jQuery.cleanData( elem.getElementsByTagName( "*" ) );
58934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							elem.innerHTML = value;
58944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
58954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
5896beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
58974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					elem = 0;
5898beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
58994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// If using innerHTML throws an exception, use the fallback method
59004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				} catch(e) {}
59014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
5902beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
59034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( elem ) {
59044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				this.empty().append( value );
59054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
59064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}, null, value, arguments.length );
5907beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5908beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5909beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	replaceWith: function( value ) {
59104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !isDisconnected( this[0] ) ) {
5911beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Make sure that the elements are removed from the DOM before they are inserted
5912beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// this can help fix replacing a parent with child elements
5913beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( jQuery.isFunction( value ) ) {
5914beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return this.each(function(i) {
5915beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					var self = jQuery(this), old = self.html();
5916beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					self.replaceWith( value.call( this, i, old ) );
5917beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				});
5918beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
5919beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5920beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( typeof value !== "string" ) {
5921beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				value = jQuery( value ).detach();
5922beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
5923beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5924beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return this.each(function() {
5925beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				var next = this.nextSibling,
5926beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					parent = this.parentNode;
5927beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5928beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jQuery( this ).remove();
5929beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5930beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( next ) {
5931beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					jQuery(next).before( value );
5932beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				} else {
5933beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					jQuery(parent).append( value );
5934beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
5935beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			});
5936beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
59374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
59384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return this.length ?
59394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
59404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			this;
5941beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5942beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5943beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	detach: function( selector ) {
5944beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.remove( selector, true );
5945beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
5946beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5947beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	domManip: function( args, table, callback ) {
59484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
59494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Flatten any nested arrays
59504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		args = [].concat.apply( [], args );
59514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
59524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var results, first, fragment, iNoClone,
59534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			i = 0,
5954beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			value = args[0],
59554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			scripts = [],
59564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			l = this.length;
5957beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5958beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// We can't cloneNode fragments that contain checked, in WebKit
59594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
5960beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return this.each(function() {
59614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery(this).domManip( args, table, callback );
5962beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			});
5963beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5964beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5965beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( jQuery.isFunction(value) ) {
5966beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return this.each(function(i) {
5967beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				var self = jQuery(this);
59684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				args[0] = value.call( this, i, table ? self.html() : undefined );
5969beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				self.domManip( args, table, callback );
5970beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			});
5971beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
5972beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5973beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( this[0] ) {
59744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			results = jQuery.buildFragment( args, this, scripts );
5975beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			fragment = results.fragment;
59764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			first = fragment.firstChild;
5977beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5978beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( fragment.childNodes.length === 1 ) {
59794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				fragment = first;
5980beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
5981beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
5982beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( first ) {
5983beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				table = table && jQuery.nodeName( first, "tr" );
5984beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
59854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Use the original fragment for the last item instead of the first because it can end up
59864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// being emptied incorrectly in certain situations (#8070).
59874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Fragments from the fragment cache must always be cloned and never used in place.
59884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
5989beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					callback.call(
59904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						table && jQuery.nodeName( this[i], "table" ) ?
59914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							findOrAppend( this[i], "tbody" ) :
5992beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							this[i],
59934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						i === iNoClone ?
59944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							fragment :
59954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							jQuery.clone( fragment, true, true )
5996beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					);
5997beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
5998beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
5999beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
60004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Fix #11809: Avoid leaking memory
60014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			fragment = first = null;
60024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
6003beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( scripts.length ) {
60044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery.each( scripts, function( i, elem ) {
60054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( elem.src ) {
60064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						if ( jQuery.ajax ) {
60074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							jQuery.ajax({
60084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								url: elem.src,
60094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								type: "GET",
60104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								dataType: "script",
60114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								async: false,
60124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								global: false,
60134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								"throws": true
60144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							});
60154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						} else {
60164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							jQuery.error("no ajax");
60174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
60184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					} else {
60194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
60204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
60214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
60224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( elem.parentNode ) {
60234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						elem.parentNode.removeChild( elem );
60244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
60254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				});
6026beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
6027beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
6028beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6029beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this;
6030beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
6031beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
6032beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
60334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction findOrAppend( elem, tag ) {
60344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
6035beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
6036beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6037beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikfunction cloneCopyEvent( src, dest ) {
6038beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6039beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
6040beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return;
6041beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
6042beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6043beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	var type, i, l,
6044beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		oldData = jQuery._data( src ),
6045beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		curData = jQuery._data( dest, oldData ),
6046beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		events = oldData.events;
6047beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6048beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( events ) {
6049beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		delete curData.handle;
6050beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		curData.events = {};
6051beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6052beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		for ( type in events ) {
6053beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
60544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery.event.add( dest, type, events[ type ][ i ] );
6055beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
6056beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
6057beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
6058beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6059beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// make the cloned public data object a copy from the original
6060beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( curData.data ) {
6061beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		curData.data = jQuery.extend( {}, curData.data );
6062beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
6063beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
6064beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6065beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikfunction cloneFixAttributes( src, dest ) {
6066beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	var nodeName;
6067beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6068beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// We do not need to do anything for non-Elements
6069beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( dest.nodeType !== 1 ) {
6070beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return;
6071beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
6072beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6073beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// clearAttributes removes the attributes, which we don't want,
6074beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// but also removes the attachEvent events, which we *do* want
6075beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( dest.clearAttributes ) {
6076beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		dest.clearAttributes();
6077beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
6078beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6079beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// mergeAttributes, in contrast, only merges back on the
6080beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// original attributes, not the events
6081beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( dest.mergeAttributes ) {
6082beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		dest.mergeAttributes( src );
6083beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
6084beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6085beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	nodeName = dest.nodeName.toLowerCase();
6086beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6087beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( nodeName === "object" ) {
60884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// IE6-10 improperly clones children of object elements using classid.
60894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// IE10 throws NoModificationAllowedError if parent is null, #12132.
60904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( dest.parentNode ) {
60914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			dest.outerHTML = src.outerHTML;
60924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
6093beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
60944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// This path appears unavoidable for IE9. When cloning an object
60954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// element in IE9, the outerHTML strategy above is not sufficient.
60964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// If the src has innerHTML and the destination does not,
60974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// copy the src.innerHTML into the dest.innerHTML. #10324
60984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
60994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			dest.innerHTML = src.innerHTML;
61004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
61014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
61024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	} else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
6103beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// IE6-8 fails to persist the checked state of a cloned checkbox
6104beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// or radio button. Worse, IE6-7 fail to give the cloned element
6105beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// a checked appearance if the defaultChecked value isn't also set
61064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
61074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		dest.defaultChecked = dest.checked = src.checked;
6108beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6109beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// IE6-7 get confused and end up setting the value of a cloned
6110beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// checkbox/radio button to an empty string instead of "on"
6111beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( dest.value !== src.value ) {
6112beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			dest.value = src.value;
6113beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
6114beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6115beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// IE6-8 fails to return the selected option to the default selected
6116beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// state when cloning options
6117beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	} else if ( nodeName === "option" ) {
6118beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		dest.selected = src.defaultSelected;
6119beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6120beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// IE6-8 fails to set the defaultValue to the correct value when
6121beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// cloning other types of input fields
6122beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	} else if ( nodeName === "input" || nodeName === "textarea" ) {
6123beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		dest.defaultValue = src.defaultValue;
61244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
61254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// IE blanks contents when cloning scripts
61264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	} else if ( nodeName === "script" && dest.text !== src.text ) {
61274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		dest.text = src.text;
6128beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
6129beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6130beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Event data gets referenced instead of copied if the expando
6131beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// gets copied too
6132beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	dest.removeAttribute( jQuery.expando );
6133beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
6134beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
61354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.buildFragment = function( args, context, scripts ) {
61364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var fragment, cacheable, cachehit,
61374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		first = args[ 0 ];
6138beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
61394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Set context from what may come in as undefined or a jQuery collection or a node
61404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
61414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
61424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	context = context || document;
61434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	context = !context.nodeType && context[0] || context;
61444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	context = context.ownerDocument || context;
6145beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6146beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
6147beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Cloning options loses the selected state, so don't cache them
6148beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
6149beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
6150beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
61514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
6152beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		first.charAt(0) === "<" && !rnocache.test( first ) &&
6153beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		(jQuery.support.checkClone || !rchecked.test( first )) &&
6154beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
6155beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
61564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Mark cacheable and look for a hit
6157beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		cacheable = true;
61584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		fragment = jQuery.fragments[ first ];
61594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		cachehit = fragment !== undefined;
6160beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
6161beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6162beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( !fragment ) {
61634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		fragment = context.createDocumentFragment();
61644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		jQuery.clean( args, context, fragment, scripts );
6165beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
61664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Update the cache, but only store false
61674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// unless this is a second parsing of the same content
61684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( cacheable ) {
61694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			jQuery.fragments[ first ] = cachehit && fragment;
61704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
6171beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
6172beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6173beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	return { fragment: fragment, cacheable: cacheable };
6174beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik};
6175beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6176beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.fragments = {};
6177beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6178beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.each({
6179beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	appendTo: "append",
6180beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	prependTo: "prepend",
6181beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	insertBefore: "before",
6182beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	insertAfter: "after",
6183beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	replaceAll: "replaceWith"
6184beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}, function( name, original ) {
6185beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.fn[ name ] = function( selector ) {
61864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var elems,
61874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			i = 0,
61884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			ret = [],
6189beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			insert = jQuery( selector ),
61904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			l = insert.length,
6191beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			parent = this.length === 1 && this[0].parentNode;
6192beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
61934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {
6194beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			insert[ original ]( this[0] );
6195beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return this;
6196beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else {
61974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			for ( ; i < l; i++ ) {
61984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				elems = ( i > 0 ? this.clone(true) : this ).get();
6199beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jQuery( insert[i] )[ original ]( elems );
6200beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				ret = ret.concat( elems );
6201beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
6202beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6203beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return this.pushStack( ret, name, insert.selector );
6204beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
6205beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
6206beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
6207beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6208beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikfunction getAll( elem ) {
6209beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( typeof elem.getElementsByTagName !== "undefined" ) {
6210beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return elem.getElementsByTagName( "*" );
6211beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6212beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
6213beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return elem.querySelectorAll( "*" );
6214beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6215beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	} else {
6216beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return [];
6217beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
6218beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
6219beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6220beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Used in clean, fixes the defaultChecked property
6221beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikfunction fixDefaultChecked( elem ) {
62224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( rcheckableType.test( elem.type ) ) {
6223beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		elem.defaultChecked = elem.checked;
6224beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
6225beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
6226beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6227beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.extend({
6228beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
6229beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var srcElements,
6230beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			destElements,
6231beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			i,
62324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			clone;
62334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
62344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
62354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			clone = elem.cloneNode( true );
62364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
62374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// IE<=8 does not properly clone detached, unknown element nodes
62384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} else {
62394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			fragmentDiv.innerHTML = elem.outerHTML;
62404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
62414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
6242beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6243beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
6244beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
6245beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// IE copies events bound via attachEvent when using cloneNode.
6246beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Calling detachEvent on the clone will also remove the events
6247beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// from the original. In order to get around this, we use some
6248beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// proprietary methods to clear the events. Thanks to MooTools
6249beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// guys for this hotness.
6250beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6251beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			cloneFixAttributes( elem, clone );
6252beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6253beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Using Sizzle here is crazy slow, so we use getElementsByTagName instead
6254beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			srcElements = getAll( elem );
6255beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			destElements = getAll( clone );
6256beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6257beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Weird iteration because IE will replace the length property
6258beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// with an element if you are cloning the body and one of the
6259beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// elements on the page has a name or id of "length"
6260beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			for ( i = 0; srcElements[i]; ++i ) {
6261beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Ensure that the destination node is not null; Fixes #9587
6262beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( destElements[i] ) {
6263beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					cloneFixAttributes( srcElements[i], destElements[i] );
6264beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
6265beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
6266beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
6267beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6268beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Copy the events from the original to the clone
6269beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( dataAndEvents ) {
6270beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			cloneCopyEvent( elem, clone );
6271beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6272beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( deepDataAndEvents ) {
6273beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				srcElements = getAll( elem );
6274beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				destElements = getAll( clone );
6275beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6276beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				for ( i = 0; srcElements[i]; ++i ) {
6277beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					cloneCopyEvent( srcElements[i], destElements[i] );
6278beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
6279beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
6280beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
6281beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6282beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		srcElements = destElements = null;
6283beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6284beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Return the cloned set
6285beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return clone;
6286beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
6287beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6288beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	clean: function( elems, context, fragment, scripts ) {
62894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
62904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			safe = context === document && safeFragment,
62914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			ret = [];
6292beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
62934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Ensure that context is a document
62944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !context || typeof context.createDocumentFragment === "undefined" ) {
62954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			context = document;
6296beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
6297beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
62984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Use the already-created safe fragment if context permits
62994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		for ( i = 0; (elem = elems[i]) != null; i++ ) {
6300beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( typeof elem === "number" ) {
6301beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				elem += "";
6302beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
6303beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6304beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( !elem ) {
6305beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				continue;
6306beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
6307beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6308beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Convert html string into DOM nodes
6309beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( typeof elem === "string" ) {
6310beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( !rhtml.test( elem ) ) {
6311beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					elem = context.createTextNode( elem );
6312beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				} else {
63134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Ensure a safe container in which to render the html
63144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					safe = safe || createSafeFragment( context );
63154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					div = context.createElement("div");
63164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					safe.appendChild( div );
63174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
6318beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// Fix "XHTML"-style tags in all browsers
6319beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					elem = elem.replace(rxhtmlTag, "<$1></$2>");
6320beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6321beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// Go to html and back, then peel off extra wrappers
63224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
63234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					wrap = wrapMap[ tag ] || wrapMap._default;
63244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					depth = wrap[0];
6325beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					div.innerHTML = wrap[1] + elem + wrap[2];
6326beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6327beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// Move to the right depth
6328beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					while ( depth-- ) {
6329beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						div = div.lastChild;
6330beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
6331beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6332beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// Remove IE's autoinserted <tbody> from table fragments
6333beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( !jQuery.support.tbody ) {
6334beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6335beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						// String was a <table>, *may* have spurious <tbody>
63364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						hasBody = rtbody.test(elem);
6337beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							tbody = tag === "table" && !hasBody ?
6338beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik								div.firstChild && div.firstChild.childNodes :
6339beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6340beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik								// String was a bare <thead> or <tfoot>
6341beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik								wrap[1] === "<table>" && !hasBody ?
6342beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									div.childNodes :
6343beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									[];
6344beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6345beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						for ( j = tbody.length - 1; j >= 0 ; --j ) {
6346beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
6347beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik								tbody[ j ].parentNode.removeChild( tbody[ j ] );
6348beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							}
6349beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
6350beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
6351beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6352beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// IE completely kills leading whitespace when innerHTML is used
6353beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
6354beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
6355beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
6356beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6357beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					elem = div.childNodes;
6358beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
63594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Take out of fragment container (we need a fresh div each time)
63604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					div.parentNode.removeChild( div );
6361beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
6362beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
6363beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6364beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( elem.nodeType ) {
6365beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				ret.push( elem );
6366beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else {
63674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery.merge( ret, elem );
63684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
63694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
63704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
63714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Fix #11356: Clear elements from safeFragment
63724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( div ) {
63734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			elem = div = safe = null;
63744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
63754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
63764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Reset defaultChecked for any radios and checkboxes
63774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// about to be appended to the DOM in IE 6/7 (#8060)
63784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !jQuery.support.appendChecked ) {
63794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			for ( i = 0; (elem = ret[i]) != null; i++ ) {
63804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( jQuery.nodeName( elem, "input" ) ) {
63814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					fixDefaultChecked( elem );
63824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				} else if ( typeof elem.getElementsByTagName !== "undefined" ) {
63834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
63844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
6385beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
6386beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
6387beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
63884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Append elements to a provided document fragment
6389beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( fragment ) {
63904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Special handling of each script element
63914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			handleScript = function( elem ) {
63924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Check if we consider it executable
63934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( !elem.type || rscriptType.test( elem.type ) ) {
63944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Detach the script and store it in the scripts array (if provided) or the fragment
63954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Return truthy to indicate that it has been handled
63964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					return scripts ?
63974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
63984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						fragment.appendChild( elem );
63994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
6400beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			};
6401beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
64024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			for ( i = 0; (elem = ret[i]) != null; i++ ) {
64034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Check if we're done after handling an executable script
64044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
64054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Append to fragment and handle embedded scripts
64064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					fragment.appendChild( elem );
64074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( typeof elem.getElementsByTagName !== "undefined" ) {
64084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
64094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
6410beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
64114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// Splice the scripts into ret after their former ancestor and advance our index beyond them
6412beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
64134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						i += jsTags.length;
6414beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
6415beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
6416beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
6417beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
6418beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6419beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return ret;
6420beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
6421beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
64224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	cleanData: function( elems, /* internal */ acceptData ) {
64234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var data, id, elem, type,
64244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			i = 0,
64254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			internalKey = jQuery.expando,
6426beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			cache = jQuery.cache,
64274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			deleteExpando = jQuery.support.deleteExpando,
64284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			special = jQuery.event.special;
6429beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
64304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		for ( ; (elem = elems[i]) != null; i++ ) {
6431beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
64324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( acceptData || jQuery.acceptData( elem ) ) {
6433beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
64344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				id = elem[ internalKey ];
64354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				data = id && cache[ id ];
6436beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
64374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( data ) {
64384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( data.events ) {
64394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						for ( type in data.events ) {
64404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							if ( special[ type ] ) {
64414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								jQuery.event.remove( elem, type );
6442beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
64434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							// This is a shortcut to avoid jQuery.event.remove's overhead
64444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							} else {
64454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								jQuery.removeEvent( elem, type, data.handle );
64464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							}
6447beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
6448beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
6449beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
64504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Remove cache only if it was not already removed by jQuery.event.remove
64514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( cache[ id ] ) {
6452beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
64534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						delete cache[ id ];
6454beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
64554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// IE does not allow us to delete expando properties from nodes,
64564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// nor does it have a removeAttribute function on Document nodes;
64574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// we must handle all of these cases
64584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						if ( deleteExpando ) {
64594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							delete elem[ internalKey ];
64604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
64614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						} else if ( elem.removeAttribute ) {
64624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							elem.removeAttribute( internalKey );
6463beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
64644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						} else {
64654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							elem[ internalKey ] = null;
64664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
64674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
64684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						jQuery.deletedIds.push( id );
64694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
64704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
6471beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
6472beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
6473beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
6474beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
64754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// Limit scope pollution from any deprecated API
64764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair(function() {
64774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
64784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairvar matched, browser;
64794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
64804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// Use of jQuery.browser is frowned upon.
64814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// More details: http://api.jquery.com/jQuery.browser
64824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// jQuery.uaMatch maintained for back-compat
64834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.uaMatch = function( ua ) {
64844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	ua = ua.toLowerCase();
64854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
64864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
64874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
64884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
64894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		/(msie) ([\w.]+)/.exec( ua ) ||
64904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
64914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		[];
64924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
64934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return {
64944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		browser: match[ 1 ] || "",
64954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		version: match[ 2 ] || "0"
64964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	};
64974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair};
6498beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
64994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairmatched = jQuery.uaMatch( navigator.userAgent );
65004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairbrowser = {};
6501beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
65024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairif ( matched.browser ) {
65034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	browser[ matched.browser ] = true;
65044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	browser.version = matched.version;
65054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
65064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
65074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// Chrome is Webkit, but Webkit is also Safari.
65084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairif ( browser.chrome ) {
65094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	browser.webkit = true;
65104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair} else if ( browser.webkit ) {
65114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	browser.safari = true;
6512beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
6513beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
65144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.browser = browser;
6515beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
65164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.sub = function() {
65174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	function jQuerySub( selector, context ) {
65184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return new jQuerySub.fn.init( selector, context );
65194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
65204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	jQuery.extend( true, jQuerySub, this );
65214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	jQuerySub.superclass = this;
65224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	jQuerySub.fn = jQuerySub.prototype = this();
65234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	jQuerySub.fn.constructor = jQuerySub;
65244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	jQuerySub.sub = this.sub;
65254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	jQuerySub.fn.init = function init( selector, context ) {
65264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
65274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			context = jQuerySub( context );
65284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
6529beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
65304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
65314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	};
65324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	jQuerySub.fn.init.prototype = jQuerySub.fn;
65334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var rootjQuerySub = jQuerySub(document);
65344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return jQuerySub;
65354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair};
6536beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
65374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair})();
65384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairvar curCSS, iframe, iframeDoc,
65394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	ralpha = /alpha\([^)]*\)/i,
6540beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	ropacity = /opacity=([^)]*)/,
65414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rposition = /^(top|right|bottom|left)$/,
65424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
65434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
65444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
65454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rmargin = /^margin/,
65464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
65474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
65484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
65494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	elemdisplay = { BODY: "block" },
6550beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6551beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
65524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	cssNormalTransform = {
65534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		letterSpacing: 0,
65544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		fontWeight: 400
65554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	},
6556beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
65574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
65584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
6559beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
65604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	eventsToggle = jQuery.fn.toggle;
65614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
65624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// return a css property mapped to a potentially vendor prefixed property
65634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction vendorPropName( style, name ) {
65644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
65654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// shortcut for names that are not vendor prefixed
65664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( name in style ) {
65674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return name;
6568beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
6569beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
65704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// check for vendor prefixed names
65714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var capName = name.charAt(0).toUpperCase() + name.slice(1),
65724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		origName = name,
65734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		i = cssPrefixes.length;
65744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
65754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	while ( i-- ) {
65764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		name = cssPrefixes[ i ] + capName;
65774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( name in style ) {
65784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return name;
65794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
65804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
65814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
65824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return origName;
65834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
65844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
65854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction isHidden( elem, el ) {
65864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	elem = el || elem;
65874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
65884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
65894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
65904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction showHide( elements, show ) {
65914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var elem, display,
65924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		values = [],
65934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		index = 0,
65944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		length = elements.length;
65954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
65964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	for ( ; index < length; index++ ) {
65974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		elem = elements[ index ];
65984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !elem.style ) {
65994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			continue;
66004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
66014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		values[ index ] = jQuery._data( elem, "olddisplay" );
66024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( show ) {
66034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Reset the inline display of this element to learn if it is
66044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// being hidden by cascaded rules or not
66054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( !values[ index ] && elem.style.display === "none" ) {
66064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				elem.style.display = "";
66074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
66084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
66094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Set elements which have been overridden with display: none
66104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// in a stylesheet to whatever the default browser style is
66114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// for such an element
66124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( elem.style.display === "" && isHidden( elem ) ) {
66134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
66144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
66154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} else {
66164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			display = curCSS( elem, "display" );
66174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
66184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( !values[ index ] && display !== "none" ) {
66194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery._data( elem, "olddisplay", display );
66204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
66214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
66224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
66234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
66244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Set the display of most of the elements in a second loop
66254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// to avoid the constant reflow
66264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	for ( index = 0; index < length; index++ ) {
66274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		elem = elements[ index ];
66284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !elem.style ) {
66294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			continue;
66304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
66314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
66324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			elem.style.display = show ? values[ index ] || "" : "none";
66334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
66344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
66354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
66364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return elements;
66374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
66384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
66394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.fn.extend({
66404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	css: function( name, value ) {
66414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return jQuery.access( this, function( elem, name, value ) {
66424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return value !== undefined ?
66434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery.style( elem, name, value ) :
66444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery.css( elem, name );
66454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}, name, value, arguments.length > 1 );
66464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	},
66474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	show: function() {
66484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return showHide( this, true );
66494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	},
66504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	hide: function() {
66514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return showHide( this );
66524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	},
66534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	toggle: function( state, fn2 ) {
66544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var bool = typeof state === "boolean";
66554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
66564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {
66574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return eventsToggle.apply( this, arguments );
66584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
66594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
66604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return this.each(function() {
66614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( bool ? state : isHidden( this ) ) {
66624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery( this ).show();
66634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			} else {
66644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery( this ).hide();
66654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
66664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		});
66674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
66684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair});
6669beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6670beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.extend({
6671beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Add in style property hooks for overriding the default
6672beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// behavior of getting and setting a style property
6673beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	cssHooks: {
6674beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		opacity: {
6675beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			get: function( elem, computed ) {
6676beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( computed ) {
6677beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// We should always get a number back from opacity
66784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					var ret = curCSS( elem, "opacity" );
6679beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					return ret === "" ? "1" : ret;
6680beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6681beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
6682beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
6683beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
6684beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
6685beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6686beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Exclude the following css properties to add px
6687beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	cssNumber: {
6688beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		"fillOpacity": true,
6689beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		"fontWeight": true,
6690beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		"lineHeight": true,
6691beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		"opacity": true,
6692beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		"orphans": true,
6693beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		"widows": true,
6694beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		"zIndex": true,
6695beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		"zoom": true
6696beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
6697beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6698beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Add in properties whose names you wish to fix before
6699beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// setting or getting the value
6700beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	cssProps: {
6701beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// normalize float css property
6702beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
6703beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
6704beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6705beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Get and set the style property on a DOM Node
6706beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	style: function( elem, name, value, extra ) {
6707beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Don't set styles on text and comment nodes
6708beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6709beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return;
6710beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
6711beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6712beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Make sure that we're working with the right name
67134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var ret, type, hooks,
67144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			origName = jQuery.camelCase( name ),
67154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			style = elem.style;
67164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
67174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
6718beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
67194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// gets hook for the prefixed version
67204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// followed by the unprefixed version
67214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6722beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6723beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Check if we're setting a value
6724beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( value !== undefined ) {
6725beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			type = typeof value;
6726beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6727beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// convert relative number strings (+= or -=) to relative numbers. #7345
6728beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
67294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
6730beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Fixes bug #9237
6731beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				type = "number";
6732beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
6733beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6734beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Make sure that NaN and null values aren't set. See: #7116
6735beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( value == null || type === "number" && isNaN( value ) ) {
6736beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return;
6737beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
6738beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6739beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// If a number was passed in, add 'px' to the (except for certain CSS properties)
6740beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
6741beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				value += "px";
6742beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
6743beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6744beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// If a hook was provided, use that value, otherwise just set the specified value
67454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
6746beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
6747beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Fixes bug #5509
6748beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				try {
6749beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					style[ name ] = value;
6750beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				} catch(e) {}
6751beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
6752beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6753beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else {
6754beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// If a hook was provided get the non-computed value from there
6755beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
6756beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return ret;
6757beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
6758beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6759beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Otherwise just get the value from the style object
6760beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return style[ name ];
6761beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
6762beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
6763beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
67644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	css: function( elem, name, numeric, extra ) {
67654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var val, num, hooks,
67664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			origName = jQuery.camelCase( name );
6767beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6768beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Make sure that we're working with the right name
67694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
6770beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
67714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// gets hook for the prefixed version
67724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// followed by the unprefixed version
67734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6774beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6775beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// If a hook was provided get the computed value from there
67764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( hooks && "get" in hooks ) {
67774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			val = hooks.get( elem, true, extra );
67784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
67794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
67804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Otherwise, if a way to get the computed value exists, use that
67814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( val === undefined ) {
67824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			val = curCSS( elem, name );
67834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
67844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
67854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		//convert "normal" to computed value
67864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( val === "normal" && name in cssNormalTransform ) {
67874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			val = cssNormalTransform[ name ];
67884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
67894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
67904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Return, converting to number if forced or a qualifier was provided and val looks numeric
67914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( numeric || extra !== undefined ) {
67924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			num = parseFloat( val );
67934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
67944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
67954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return val;
67964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	},
67974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
67984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// A method for quickly swapping in/out CSS properties to get correct calculations
67994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	swap: function( elem, options, callback ) {
68004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var ret, name,
68014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			old = {};
68024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
68034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Remember the old values, and insert the new ones
68044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		for ( name in options ) {
68054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			old[ name ] = elem.style[ name ];
68064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			elem.style[ name ] = options[ name ];
68074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
68084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
68094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		ret = callback.call( elem );
68104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
68114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Revert the old values
68124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		for ( name in options ) {
68134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			elem.style[ name ] = old[ name ];
68144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
68154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
68164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return ret;
68174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
68184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair});
68194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
68204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// NOTE: To any future maintainer, we've window.getComputedStyle
68214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// because jsdom on node.js will break without it.
68224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairif ( window.getComputedStyle ) {
68234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	curCSS = function( elem, name ) {
68244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var ret, width, minWidth, maxWidth,
68254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			computed = window.getComputedStyle( elem, null ),
68264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			style = elem.style;
68274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
68284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( computed ) {
68294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
68304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// getPropertyValue is only needed for .css('filter') in IE9, see #12537
68314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			ret = computed.getPropertyValue( name ) || computed[ name ];
68324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
68334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
68344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				ret = jQuery.style( elem, name );
68354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
68364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
68374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// A tribute to the "awesome hack by Dean Edwards"
68384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
68394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
68404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
68414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
68424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				width = style.width;
68434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				minWidth = style.minWidth;
68444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				maxWidth = style.maxWidth;
68454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
68464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				style.minWidth = style.maxWidth = style.width = ret;
68474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				ret = computed.width;
68484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
68494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				style.width = width;
68504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				style.minWidth = minWidth;
68514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				style.maxWidth = maxWidth;
68524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
68534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
68544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
68554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return ret;
68564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	};
68574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair} else if ( document.documentElement.currentStyle ) {
68584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	curCSS = function( elem, name ) {
68594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var left, rsLeft,
68604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			ret = elem.currentStyle && elem.currentStyle[ name ],
68614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			style = elem.style;
68624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
68634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Avoid setting ret to empty string here
68644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// so we don't default to auto
68654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( ret == null && style && style[ name ] ) {
68664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			ret = style[ name ];
68674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
68684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
68694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// From the awesome hack by Dean Edwards
68704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
68714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
68724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// If we're not dealing with a regular pixel number
68734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// but a number that has a weird ending, we need to convert it to pixels
68744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// but not position css attributes, as those are proportional to the parent element instead
68754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
68764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
68774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
68784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Remember the original values
68794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			left = style.left;
68804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
68814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
68824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Put in the new values to get a computed value out
68834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( rsLeft ) {
68844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				elem.runtimeStyle.left = elem.currentStyle.left;
68854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
68864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			style.left = name === "fontSize" ? "1em" : ret;
68874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			ret = style.pixelLeft + "px";
68884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
68894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Revert the changed values
68904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			style.left = left;
68914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( rsLeft ) {
68924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				elem.runtimeStyle.left = rsLeft;
68934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
68944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
68954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
68964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return ret === "" ? "auto" : ret;
68974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	};
68984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
68994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
69004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction setPositiveNumber( elem, value, subtract ) {
69014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var matches = rnumsplit.exec( value );
69024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return matches ?
69034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
69044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			value;
69054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
69064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
69074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
69084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var i = extra === ( isBorderBox ? "border" : "content" ) ?
69094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// If we already have the right measurement, avoid augmentation
69104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		4 :
69114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Otherwise initialize for horizontal or vertical properties
69124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		name === "width" ? 1 : 0,
69134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
69144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		val = 0;
69154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
69164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	for ( ; i < 4; i += 2 ) {
69174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// both box models exclude margin, so add it if we want it
69184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( extra === "margin" ) {
69194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// we use jQuery.css instead of curCSS here
69204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// because of the reliableMarginRight CSS hook!
69214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			val += jQuery.css( elem, extra + cssExpand[ i ], true );
69224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
69234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
69244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// From this point on we use curCSS for maximum performance (relevant in animations)
69254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( isBorderBox ) {
69264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// border-box includes padding, so remove it if we want content
69274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( extra === "content" ) {
69284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
69294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
69304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
69314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// at this point, extra isn't border nor margin, so remove border
69324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( extra !== "margin" ) {
69334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
69344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
69354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} else {
69364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// at this point, extra isn't content, so add padding
69374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
69384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
69394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// at this point, extra isn't content nor padding, so add border
69404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( extra !== "padding" ) {
69414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
69424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
69434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
69444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
69454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
69464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return val;
69474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
69484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
69494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction getWidthOrHeight( elem, name, extra ) {
69504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
69514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Start with offset property, which is equivalent to the border-box value
69524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
69534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		valueIsBorderBox = true,
69544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box";
69554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
69564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// some non-html elements return undefined for offsetWidth, so check for null/undefined
69574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
69584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
69594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( val <= 0 || val == null ) {
69604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Fall back to computed then uncomputed css if necessary
69614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		val = curCSS( elem, name );
69624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( val < 0 || val == null ) {
69634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			val = elem.style[ name ];
69644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
69654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
69664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Computed unit is not pixels. Stop here and return.
69674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( rnumnonpx.test(val) ) {
69684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return val;
69694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
69704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
69714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// we need the check for style in case a browser which returns unreliable values
69724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// for getComputedStyle silently falls back to the reliable elem.style
69734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
69744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
69754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Normalize "", auto, and prepare for extra
69764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		val = parseFloat( val ) || 0;
69774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
69784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
69794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// use the active box-sizing model to add/subtract irrelevant styles
69804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return ( val +
69814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		augmentWidthOrHeight(
69824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			elem,
69834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			name,
69844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			extra || ( isBorderBox ? "border" : "content" ),
69854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			valueIsBorderBox
69864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		)
69874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	) + "px";
69884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
6989beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
6990beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
69914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// Try to determine the default display value of an element
69924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction css_defaultDisplay( nodeName ) {
69934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( elemdisplay[ nodeName ] ) {
69944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return elemdisplay[ nodeName ];
69954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
6996beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
69974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ),
69984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		display = elem.css("display");
69994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	elem.remove();
70004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
70014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// If the simple way fails,
70024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// get element's real default display by attaching it to a temp iframe
70034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( display === "none" || display === "" ) {
70044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Use the already-created iframe if possible
70054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		iframe = document.body.appendChild(
70064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			iframe || jQuery.extend( document.createElement("iframe"), {
70074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				frameBorder: 0,
70084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				width: 0,
70094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				height: 0
70104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			})
70114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		);
70124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
70134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Create a cacheable copy of the iframe document on first call.
70144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
70154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// document to it; WebKit & Firefox won't allow reusing the iframe document.
70164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !iframeDoc || !iframe.createElement ) {
70174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
70184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			iframeDoc.write("<!doctype html><html><body>");
70194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			iframeDoc.close();
7020beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7021beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
70224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
7023beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
70244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		display = curCSS( elem, "display" );
70254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		document.body.removeChild( iframe );
7026beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
7027beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
70284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Store the correct default display
70294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	elemdisplay[ nodeName ] = display;
7030beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
70314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return display;
70324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
70334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
70344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.each([ "height", "width" ], function( i, name ) {
7035beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.cssHooks[ name ] = {
7036beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		get: function( elem, computed, extra ) {
7037beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( computed ) {
70384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// certain elements can have dimension info if we invisibly show them
70394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// however, it must have a current display style that would benefit from this
70404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) {
70414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					return jQuery.swap( elem, cssShow, function() {
70424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						return getWidthOrHeight( elem, name, extra );
7043beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					});
70444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				} else {
70454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					return getWidthOrHeight( elem, name, extra );
7046beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
7047beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7048beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
7049beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
70504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		set: function( elem, value, extra ) {
70514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return setPositiveNumber( elem, value, extra ?
70524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				augmentWidthOrHeight(
70534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					elem,
70544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					name,
70554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					extra,
70564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
70574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				) : 0
70584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			);
7059beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7060beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
7061beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
7062beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7063beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikif ( !jQuery.support.opacity ) {
7064beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.cssHooks.opacity = {
7065beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		get: function( elem, computed ) {
7066beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// IE uses filters for opacity
7067beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
70684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
7069beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				computed ? "1" : "";
7070beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
7071beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7072beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		set: function( elem, value ) {
7073beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			var style = elem.style,
7074beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				currentStyle = elem.currentStyle,
7075beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
7076beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				filter = currentStyle && currentStyle.filter || style.filter || "";
7077beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7078beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// IE has trouble with opacity if it does not have layout
7079beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Force it by setting the zoom level
7080beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			style.zoom = 1;
7081beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7082beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
70834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
70844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				style.removeAttribute ) {
7085beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7086beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
7087beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// if "filter:" is present at all, clearType is disabled, we want to avoid this
7088beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// style.removeAttribute is IE Only, but so apparently is this code path...
7089beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				style.removeAttribute( "filter" );
7090beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7091beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// if there there is no filter style applied in a css rule, we are done
7092beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( currentStyle && !currentStyle.filter ) {
7093beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					return;
7094beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
7095beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7096beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7097beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// otherwise, set new filter values
7098beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			style.filter = ralpha.test( filter ) ?
7099beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				filter.replace( ralpha, opacity ) :
7100beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				filter + " " + opacity;
7101beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7102beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
7103beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
7104beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
71054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// These hooks cannot be added until DOM ready because the support test
71064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// for it is not run until after DOM ready
7107beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery(function() {
7108beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( !jQuery.support.reliableMarginRight ) {
7109beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		jQuery.cssHooks.marginRight = {
7110beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			get: function( elem, computed ) {
7111beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
7112beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Work around by temporarily setting element display to inline-block
71134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return jQuery.swap( elem, { "display": "inline-block" }, function() {
7114beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( computed ) {
71154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						return curCSS( elem, "marginRight" );
7116beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
7117beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				});
7118beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7119beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		};
7120beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
7121beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
71224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
71234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// getComputedStyle returns percent when specified for top/left/bottom/right
71244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// rather than make the css module depend on the offset module, we just check for it here
71254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
71264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		jQuery.each( [ "top", "left" ], function( i, prop ) {
71274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			jQuery.cssHooks[ prop ] = {
71284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				get: function( elem, computed ) {
71294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( computed ) {
71304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						var ret = curCSS( elem, prop );
71314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// if curCSS returns percentage, fallback to offset
71324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret;
71334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
71344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
71354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			};
71364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		});
71374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
7138beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
71394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair});
7140beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
71414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairif ( jQuery.expr && jQuery.expr.filters ) {
71424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	jQuery.expr.filters.hidden = function( elem ) {
71434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none");
71444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	};
7145beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
71464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	jQuery.expr.filters.visible = function( elem ) {
71474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return !jQuery.expr.filters.hidden( elem );
7148beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
7149beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
7150beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
71514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// These hooks are used by animate to expand properties
71524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.each({
71534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	margin: "",
71544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	padding: "",
71554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	border: "Width"
71564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}, function( prefix, suffix ) {
71574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	jQuery.cssHooks[ prefix + suffix ] = {
71584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		expand: function( value ) {
71594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var i,
7160beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
71614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// assumes a single number if not a string
71624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				parts = typeof value === "string" ? value.split(" ") : [ value ],
71634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				expanded = {};
7164beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
71654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			for ( i = 0; i < 4; i++ ) {
71664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				expanded[ prefix + cssExpand[ i ] + suffix ] =
71674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
7168beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7169beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
71704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return expanded;
7171beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7172beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
7173beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
71744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( !rmargin.test( prefix ) ) {
71754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
71764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
71774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair});
71784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairvar r20 = /%20/g,
71794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rbracket = /\[\]$/,
71804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rCRLF = /\r?\n/g,
71814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
71824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rselectTextarea = /^(?:select|textarea)/i;
7183beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
71844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.fn.extend({
71854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	serialize: function() {
71864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return jQuery.param( this.serializeArray() );
71874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	},
71884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	serializeArray: function() {
71894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return this.map(function(){
71904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return this.elements ? jQuery.makeArray( this.elements ) : this;
71914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		})
71924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		.filter(function(){
71934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return this.name && !this.disabled &&
71944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				( this.checked || rselectTextarea.test( this.nodeName ) ||
71954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					rinput.test( this.type ) );
71964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		})
71974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		.map(function( i, elem ){
71984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var val = jQuery( this ).val();
7199beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
72004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return val == null ?
72014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				null :
72024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery.isArray( val ) ?
72034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					jQuery.map( val, function( val, i ){
72044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
72054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}) :
72064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
72074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}).get();
72084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
72094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair});
7210beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
72114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair//Serialize an array of form elements or a set of
72124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair//key/values into a query string
72134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.param = function( a, traditional ) {
72144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var prefix,
72154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		s = [],
72164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		add = function( key, value ) {
72174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// If value is a function, invoke it and return its value
72184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
72194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
72204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		};
7221beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
72224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Set traditional to true for jQuery <= 1.3.2 behavior.
72234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( traditional === undefined ) {
72244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
7225beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
7226beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
72274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// If an array was passed in, assume that it is an array of form elements.
72284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
72294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Serialize the form elements
72304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		jQuery.each( a, function() {
72314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			add( this.name, this.value );
72324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		});
7233beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
72344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	} else {
72354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// If traditional, encode the "old" way (the way 1.3.2 or older
72364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// did it), otherwise encode params recursively.
72374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		for ( prefix in a ) {
72384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			buildParams( prefix, a[ prefix ], traditional, add );
7239beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7240beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
7241beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
72424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Return the resulting serialization
72434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return s.join( "&" ).replace( r20, "+" );
72444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair};
7245beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
72464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction buildParams( prefix, obj, traditional, add ) {
72474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var name;
7248beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
72494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( jQuery.isArray( obj ) ) {
72504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Serialize array item.
72514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		jQuery.each( obj, function( i, v ) {
72524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( traditional || rbracket.test( prefix ) ) {
72534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Treat each array item as a scalar.
72544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				add( prefix, v );
7255beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
72564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			} else {
72574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// If array item is non-scalar (array or object), encode its
72584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// numeric index to resolve deserialization ambiguity issues.
72594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Note that rack (as of 1.0.0) can't currently deserialize
72604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// nested arrays properly, and attempting to do so may cause
72614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// a server error. Possible fixes are to modify rack's
72624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// deserialization algorithm or to provide an option or flag
72634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// to force array serialization to be shallow.
72644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
72654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
72664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		});
7267beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
72684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
72694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Serialize object item.
72704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		for ( name in obj ) {
72714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
72724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
7273beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
72744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	} else {
72754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Serialize scalar item.
72764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		add( prefix, obj );
72774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
72784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
72794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairvar
72804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Document location
72814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	ajaxLocParts,
72824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	ajaxLocation,
7283beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7284beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rhash = /#.*$/,
7285beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
7286beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// #7653, #8125, #8152: local protocol detection
7287beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
7288beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rnoContent = /^(?:GET|HEAD)$/,
7289beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rprotocol = /^\/\//,
7290beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rquery = /\?/,
7291beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
7292beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rts = /([?&])_=[^&]*/,
72934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
7294beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7295beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Keep a copy of the old load method
7296beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	_load = jQuery.fn.load,
7297beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7298beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	/* Prefilters
7299beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
7300beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	 * 2) These are called:
7301beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	 *    - BEFORE asking for a transport
7302beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	 *    - AFTER param serialization (s.data is a string if s.processData is true)
7303beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	 * 3) key is the dataType
7304beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	 * 4) the catchall symbol "*" can be used
7305beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
7306beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	 */
7307beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	prefilters = {},
7308beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7309beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	/* Transports bindings
7310beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	 * 1) key is the dataType
7311beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	 * 2) the catchall symbol "*" can be used
7312beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	 * 3) selection will start with transport dataType and THEN go to "*" if needed
7313beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	 */
7314beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	transports = {},
7315beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7316beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
7317beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	allTypes = ["*/"] + ["*"];
7318beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7319beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// #8138, IE may throw an exception when accessing
7320beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// a field from window.location if document.domain has been set
7321beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craiktry {
7322beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	ajaxLocation = location.href;
7323beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik} catch( e ) {
7324beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Use the href attribute of an A element
7325beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// since IE will modify it given document.location
7326beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	ajaxLocation = document.createElement( "a" );
7327beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	ajaxLocation.href = "";
7328beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	ajaxLocation = ajaxLocation.href;
7329beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
7330beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7331beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Segment location into parts
7332beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
7333beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7334beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
7335beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikfunction addToPrefiltersOrTransports( structure ) {
7336beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7337beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// dataTypeExpression is optional and defaults to "*"
7338beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	return function( dataTypeExpression, func ) {
7339beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7340beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( typeof dataTypeExpression !== "string" ) {
7341beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			func = dataTypeExpression;
7342beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			dataTypeExpression = "*";
7343beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7344beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
73454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var dataType, list, placeBefore,
73464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),
73474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			i = 0,
73484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			length = dataTypes.length;
7349beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
73504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( jQuery.isFunction( func ) ) {
7351beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// For each dataType in the dataTypeExpression
7352beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			for ( ; i < length; i++ ) {
7353beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				dataType = dataTypes[ i ];
7354beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// We control if we're asked to add before
7355beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// any existing element
7356beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				placeBefore = /^\+/.test( dataType );
7357beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( placeBefore ) {
7358beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					dataType = dataType.substr( 1 ) || "*";
7359beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
7360beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				list = structure[ dataType ] = structure[ dataType ] || [];
7361beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// then we add to the structure accordingly
7362beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				list[ placeBefore ? "unshift" : "push" ]( func );
7363beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7364beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7365beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
7366beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
7367beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7368beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Base inspection function for prefilters and transports
7369beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
7370beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		dataType /* internal */, inspected /* internal */ ) {
7371beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7372beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	dataType = dataType || options.dataTypes[ 0 ];
7373beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	inspected = inspected || {};
7374beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7375beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	inspected[ dataType ] = true;
7376beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
73774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var selection,
73784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		list = structure[ dataType ],
7379beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		i = 0,
7380beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		length = list ? list.length : 0,
73814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		executeOnly = ( structure === prefilters );
7382beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7383beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	for ( ; i < length && ( executeOnly || !selection ); i++ ) {
7384beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		selection = list[ i ]( options, originalOptions, jqXHR );
7385beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// If we got redirected to another dataType
7386beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// we try there if executing only and not done already
7387beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( typeof selection === "string" ) {
7388beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( !executeOnly || inspected[ selection ] ) {
7389beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				selection = undefined;
7390beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else {
7391beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				options.dataTypes.unshift( selection );
7392beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				selection = inspectPrefiltersOrTransports(
7393beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						structure, options, originalOptions, jqXHR, selection, inspected );
7394beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7395beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7396beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
7397beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// If we're only executing or nothing was selected
7398beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// we try the catchall dataType if not done already
7399beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
7400beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		selection = inspectPrefiltersOrTransports(
7401beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				structure, options, originalOptions, jqXHR, "*", inspected );
7402beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
7403beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// unnecessary when only executing (prefilters)
7404beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// but it'll be ignored by the caller in that case
7405beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	return selection;
7406beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
7407beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7408beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// A special extend for ajax options
7409beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// that takes "flat" options (not to be deep extended)
7410beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Fixes #9887
7411beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikfunction ajaxExtend( target, src ) {
7412beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	var key, deep,
7413beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		flatOptions = jQuery.ajaxSettings.flatOptions || {};
7414beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	for ( key in src ) {
7415beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( src[ key ] !== undefined ) {
7416beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
7417beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7418beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
7419beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( deep ) {
7420beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		jQuery.extend( true, target, deep );
7421beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
7422beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
7423beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
74244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.fn.load = function( url, params, callback ) {
74254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( typeof url !== "string" && _load ) {
74264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return _load.apply( this, arguments );
74274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
7428beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
74294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Don't do a request if no elements are being requested
74304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( !this.length ) {
74314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return this;
74324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
7433beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
74344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var selector, type, response,
74354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		self = this,
74364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		off = url.indexOf(" ");
74374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
74384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( off >= 0 ) {
74394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		selector = url.slice( off, url.length );
74404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		url = url.slice( 0, off );
74414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
74424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
74434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// If it's a function
74444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( jQuery.isFunction( params ) ) {
7445beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
74464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// We assume that it's the callback
74474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		callback = params;
74484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		params = undefined;
74494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
74504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Otherwise, build a param string
74514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	} else if ( params && typeof params === "object" ) {
74524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		type = "POST";
74534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
7454beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
74554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Request the remote document
74564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	jQuery.ajax({
74574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		url: url,
7458beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
74594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// if "type" variable is undefined, then "GET" method will be used
74604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		type: type,
74614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		dataType: "html",
74624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		data: params,
74634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		complete: function( jqXHR, status ) {
74644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( callback ) {
74654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
7466beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7467beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
74684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}).done(function( responseText ) {
7469beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
74704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Save response for use in complete callback
74714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		response = arguments;
7472beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
74734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// See if a selector was specified
74744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		self.html( selector ?
7475beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
74764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Create a dummy div to hold the results
74774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			jQuery("<div>")
7478beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
74794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// inject the contents of the document in, removing the scripts
74804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// to avoid any 'Permission Denied' errors in IE
74814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				.append( responseText.replace( rscript, "" ) )
7482beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
74834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Locate the specified elements
74844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				.find( selector ) :
7485beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
74864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// If not, just inject the full result
74874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			responseText );
7488beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
74894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	});
7490beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
74914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return this;
74924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair};
7493beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7494beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Attach a bunch of functions for handling common AJAX events
7495beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
7496beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.fn[ o ] = function( f ){
7497beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.on( o, f );
7498beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
7499beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
7500beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7501beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.each( [ "get", "post" ], function( i, method ) {
7502beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery[ method ] = function( url, data, callback, type ) {
7503beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// shift arguments if data argument was omitted
7504beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( jQuery.isFunction( data ) ) {
7505beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			type = type || callback;
7506beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			callback = data;
7507beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			data = undefined;
7508beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7509beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7510beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery.ajax({
7511beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			type: method,
7512beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			url: url,
7513beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			data: data,
7514beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			success: callback,
7515beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			dataType: type
7516beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
7517beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
7518beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
7519beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7520beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.extend({
7521beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7522beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	getScript: function( url, callback ) {
7523beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery.get( url, undefined, callback, "script" );
7524beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
7525beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7526beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	getJSON: function( url, data, callback ) {
7527beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery.get( url, data, callback, "json" );
7528beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
7529beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7530beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Creates a full fledged settings object into target
7531beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// with both ajaxSettings and settings fields.
7532beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// If target is omitted, writes into ajaxSettings.
7533beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	ajaxSetup: function( target, settings ) {
7534beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( settings ) {
7535beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Building a settings object
7536beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			ajaxExtend( target, jQuery.ajaxSettings );
7537beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else {
7538beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Extending ajaxSettings
7539beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			settings = target;
7540beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			target = jQuery.ajaxSettings;
7541beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7542beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		ajaxExtend( target, settings );
7543beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return target;
7544beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
7545beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7546beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	ajaxSettings: {
7547beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		url: ajaxLocation,
7548beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
7549beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		global: true,
7550beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		type: "GET",
75514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
7552beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		processData: true,
7553beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		async: true,
7554beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		/*
7555beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		timeout: 0,
7556beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		data: null,
7557beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		dataType: null,
7558beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		username: null,
7559beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		password: null,
7560beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		cache: null,
75614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		throws: false,
7562beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		traditional: false,
7563beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		headers: {},
7564beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		*/
7565beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7566beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		accepts: {
7567beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			xml: "application/xml, text/xml",
7568beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			html: "text/html",
7569beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			text: "text/plain",
7570beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			json: "application/json, text/javascript",
7571beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			"*": allTypes
7572beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
7573beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7574beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		contents: {
7575beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			xml: /xml/,
7576beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			html: /html/,
7577beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			json: /json/
7578beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
7579beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7580beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		responseFields: {
7581beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			xml: "responseXML",
7582beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			text: "responseText"
7583beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
7584beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7585beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// List of data converters
7586beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// 1) key format is "source_type destination_type" (a single space in-between)
7587beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// 2) the catchall symbol "*" can be used for source_type
7588beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		converters: {
7589beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7590beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Convert anything to text
7591beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			"* text": window.String,
7592beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7593beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Text to html (true = no transformation)
7594beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			"text html": true,
7595beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7596beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Evaluate text as a json expression
7597beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			"text json": jQuery.parseJSON,
7598beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7599beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Parse text as xml
7600beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			"text xml": jQuery.parseXML
7601beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		},
7602beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7603beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// For options that shouldn't be deep extended:
7604beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// you can add your own custom options here if
7605beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// and when you create one that shouldn't be
7606beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// deep extended (see ajaxExtend)
7607beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		flatOptions: {
7608beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			context: true,
7609beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			url: true
7610beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7611beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
7612beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7613beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
7614beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	ajaxTransport: addToPrefiltersOrTransports( transports ),
7615beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7616beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Main method
7617beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	ajax: function( url, options ) {
7618beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7619beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// If url is an object, simulate pre-1.5 signature
7620beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( typeof url === "object" ) {
7621beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			options = url;
7622beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			url = undefined;
7623beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7624beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7625beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Force options to be an object
7626beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		options = options || {};
7627beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
76284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var // ifModified key
76294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			ifModifiedKey,
76304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Response headers
76314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			responseHeadersString,
76324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			responseHeaders,
76334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// transport
76344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			transport,
76354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// timeout handle
76364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			timeoutTimer,
76374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Cross-domain detection vars
76384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			parts,
76394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// To know if global events are to be dispatched
76404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			fireGlobals,
76414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Loop variable
76424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			i,
76434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Create the final options object
7644beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			s = jQuery.ajaxSetup( {}, options ),
7645beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Callbacks context
7646beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			callbackContext = s.context || s,
7647beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Context for global events
7648beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// It's the callbackContext if one was provided in the options
7649beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// and if it's a DOM node or a jQuery collection
7650beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			globalEventContext = callbackContext !== s &&
7651beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
7652beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						jQuery( callbackContext ) : jQuery.event,
7653beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Deferreds
7654beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			deferred = jQuery.Deferred(),
7655beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			completeDeferred = jQuery.Callbacks( "once memory" ),
7656beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Status-dependent callbacks
7657beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			statusCode = s.statusCode || {},
7658beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Headers (they are sent all at once)
7659beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			requestHeaders = {},
7660beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			requestHeadersNames = {},
7661beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// The jqXHR state
7662beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			state = 0,
76634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Default abort message
76644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			strAbort = "canceled",
7665beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Fake xhr
7666beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jqXHR = {
7667beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7668beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				readyState: 0,
7669beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7670beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Caches the header
7671beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				setRequestHeader: function( name, value ) {
7672beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( !state ) {
7673beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						var lname = name.toLowerCase();
7674beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
7675beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						requestHeaders[ name ] = value;
7676beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
7677beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					return this;
7678beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				},
7679beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7680beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Raw string
7681beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				getAllResponseHeaders: function() {
7682beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					return state === 2 ? responseHeadersString : null;
7683beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				},
7684beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7685beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Builds headers hashtable if needed
7686beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				getResponseHeader: function( key ) {
7687beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					var match;
7688beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( state === 2 ) {
7689beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						if ( !responseHeaders ) {
7690beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							responseHeaders = {};
7691beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
7692beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
7693beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							}
7694beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
7695beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						match = responseHeaders[ key.toLowerCase() ];
7696beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
7697beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					return match === undefined ? null : match;
7698beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				},
7699beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7700beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Overrides response content-type header
7701beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				overrideMimeType: function( type ) {
7702beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( !state ) {
7703beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						s.mimeType = type;
7704beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
7705beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					return this;
7706beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				},
7707beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7708beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Cancel the request
7709beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				abort: function( statusText ) {
77104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					statusText = statusText || strAbort;
7711beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( transport ) {
7712beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						transport.abort( statusText );
7713beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
7714beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					done( 0, statusText );
7715beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					return this;
7716beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
7717beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			};
7718beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7719beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Callback for when everything is done
7720beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// It is defined here because jslint complains if it is declared
7721beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// at the end of the function (which would be more logical and readable)
7722beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		function done( status, nativeStatusText, responses, headers ) {
77234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var isSuccess, success, error, response, modified,
77244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				statusText = nativeStatusText;
7725beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7726beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Called once
7727beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( state === 2 ) {
7728beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				return;
7729beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7730beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7731beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// State is "done" now
7732beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			state = 2;
7733beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7734beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Clear timeout if it exists
7735beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( timeoutTimer ) {
7736beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				clearTimeout( timeoutTimer );
7737beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7738beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7739beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Dereference transport for early garbage collection
7740beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// (no matter how long the jqXHR object will be used)
7741beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			transport = undefined;
7742beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7743beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Cache response headers
7744beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			responseHeadersString = headers || "";
7745beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7746beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Set readyState
7747beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jqXHR.readyState = status > 0 ? 4 : 0;
7748beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
77494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Get response data
77504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( responses ) {
77514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				response = ajaxHandleResponses( s, jqXHR, responses );
77524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
7753beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7754beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// If successful, handle type chaining
7755beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( status >= 200 && status < 300 || status === 304 ) {
7756beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7757beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
7758beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( s.ifModified ) {
7759beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
77604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					modified = jqXHR.getResponseHeader("Last-Modified");
77614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( modified ) {
77624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						jQuery.lastModified[ ifModifiedKey ] = modified;
7763beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
77644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					modified = jqXHR.getResponseHeader("Etag");
77654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( modified ) {
77664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						jQuery.etag[ ifModifiedKey ] = modified;
7767beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
7768beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
7769beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7770beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// If not modified
7771beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( status === 304 ) {
7772beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7773beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					statusText = "notmodified";
7774beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					isSuccess = true;
7775beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7776beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// If we have data
7777beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				} else {
7778beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
77794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					isSuccess = ajaxConvert( s, response );
77804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					statusText = isSuccess.state;
77814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					success = isSuccess.data;
77824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					error = isSuccess.error;
77834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					isSuccess = !error;
7784beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
7785beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else {
7786beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// We extract error from statusText
7787beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// then normalize statusText and status for non-aborts
7788beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				error = statusText;
7789beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( !statusText || status ) {
7790beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					statusText = "error";
7791beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( status < 0 ) {
7792beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						status = 0;
7793beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
7794beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
7795beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7796beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7797beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Set data for the fake xhr object
7798beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jqXHR.status = status;
77994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
7800beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7801beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Success/Error
7802beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( isSuccess ) {
7803beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
7804beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else {
7805beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
7806beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7807beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7808beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Status-dependent callbacks
7809beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jqXHR.statusCode( statusCode );
7810beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			statusCode = undefined;
7811beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7812beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( fireGlobals ) {
7813beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
7814beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						[ jqXHR, s, isSuccess ? success : error ] );
7815beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7816beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7817beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Complete
7818beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
7819beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7820beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( fireGlobals ) {
7821beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
7822beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Handle the global AJAX counter
7823beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( !( --jQuery.active ) ) {
7824beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					jQuery.event.trigger( "ajaxStop" );
7825beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
7826beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7827beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7828beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7829beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Attach deferreds
7830beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		deferred.promise( jqXHR );
7831beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		jqXHR.success = jqXHR.done;
7832beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		jqXHR.error = jqXHR.fail;
7833beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		jqXHR.complete = completeDeferred.add;
7834beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7835beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Status-dependent callbacks
7836beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		jqXHR.statusCode = function( map ) {
7837beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( map ) {
7838beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				var tmp;
7839beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( state < 2 ) {
7840beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					for ( tmp in map ) {
7841beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
7842beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
7843beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				} else {
7844beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					tmp = map[ jqXHR.status ];
78454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					jqXHR.always( tmp );
7846beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
7847beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7848beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return this;
7849beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		};
7850beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7851beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Remove hash character (#7531: and string promotion)
7852beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
7853beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// We also use the url parameter if available
7854beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
7855beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7856beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Extract dataTypes list
78574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace );
7858beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
78594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// A cross-domain request is in order when we have a protocol:host:port mismatch
7860beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( s.crossDomain == null ) {
7861beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			parts = rurl.exec( s.url.toLowerCase() );
7862beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			s.crossDomain = !!( parts &&
78634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
7864beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
7865beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
7866beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			);
7867beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7868beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7869beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Convert data if not already a string
7870beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( s.data && s.processData && typeof s.data !== "string" ) {
7871beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			s.data = jQuery.param( s.data, s.traditional );
7872beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7873beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7874beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Apply prefilters
7875beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
7876beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
78774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// If request was aborted inside a prefilter, stop there
7878beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( state === 2 ) {
78794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return jqXHR;
7880beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7881beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7882beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// We can fire global events as of now if asked to
7883beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		fireGlobals = s.global;
7884beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7885beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Uppercase the type
7886beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		s.type = s.type.toUpperCase();
7887beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7888beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Determine if request has content
7889beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		s.hasContent = !rnoContent.test( s.type );
7890beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7891beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Watch for a new set of requests
7892beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( fireGlobals && jQuery.active++ === 0 ) {
7893beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.event.trigger( "ajaxStart" );
7894beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7895beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7896beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// More options handling for requests with no content
7897beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !s.hasContent ) {
7898beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7899beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// If data is available, append data to url
7900beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( s.data ) {
7901beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
7902beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// #9682: remove data so that it's not used in an eventual retry
7903beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				delete s.data;
7904beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7905beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7906beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Get ifModifiedKey before adding the anti-cache parameter
7907beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			ifModifiedKey = s.url;
7908beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7909beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Add anti-cache in url if needed
7910beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( s.cache === false ) {
7911beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7912beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				var ts = jQuery.now(),
7913beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// try replacing _= if it is there
7914beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					ret = s.url.replace( rts, "$1_=" + ts );
7915beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7916beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// if nothing was replaced, add timestamp to the end
7917beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
7918beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7919beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7920beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7921beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Set the correct header, if data is being sent
7922beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
7923beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jqXHR.setRequestHeader( "Content-Type", s.contentType );
7924beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7925beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7926beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
7927beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( s.ifModified ) {
7928beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			ifModifiedKey = ifModifiedKey || s.url;
7929beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( jQuery.lastModified[ ifModifiedKey ] ) {
7930beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
7931beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7932beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( jQuery.etag[ ifModifiedKey ] ) {
7933beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
7934beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7935beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7936beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7937beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Set the Accepts header for the server, depending on the dataType
7938beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		jqXHR.setRequestHeader(
7939beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			"Accept",
7940beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
7941beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
7942beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				s.accepts[ "*" ]
7943beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		);
7944beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7945beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Check for headers option
7946beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		for ( i in s.headers ) {
7947beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jqXHR.setRequestHeader( i, s.headers[ i ] );
7948beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7949beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7950beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Allow custom headers/mimetypes and early abort
7951beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
79524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Abort if not done already and return
79534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return jqXHR.abort();
7954beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7955beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7956beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
79574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// aborting is no longer a cancellation
79584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		strAbort = "abort";
79594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
7960beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Install callbacks on deferreds
7961beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		for ( i in { success: 1, error: 1, complete: 1 } ) {
7962beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jqXHR[ i ]( s[ i ] );
7963beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7964beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7965beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Get transport
7966beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
7967beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7968beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// If no transport, we auto-abort
7969beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !transport ) {
7970beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			done( -1, "No Transport" );
7971beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else {
7972beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jqXHR.readyState = 1;
7973beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Send global event
7974beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( fireGlobals ) {
7975beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
7976beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7977beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// Timeout
7978beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( s.async && s.timeout > 0 ) {
7979beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				timeoutTimer = setTimeout( function(){
7980beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					jqXHR.abort( "timeout" );
7981beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}, s.timeout );
7982beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7983beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7984beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			try {
7985beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				state = 1;
7986beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				transport.send( requestHeaders, done );
7987beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} catch (e) {
7988beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Propagate exception as error if not done
7989beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( state < 2 ) {
7990beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					done( -1, e );
7991beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Simply rethrow otherwise
7992beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				} else {
7993beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					throw e;
7994beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
7995beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
7996beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
7997beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
7998beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jqXHR;
7999beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
8000beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8001beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Counter for holding the number of active queries
8002beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	active: 0,
8003beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8004beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Last-Modified header cache for next request
8005beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	lastModified: {},
8006beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	etag: {}
8007beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8008beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
8009beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8010beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik/* Handles responses to an ajax request:
8011beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik * - sets all responseXXX fields accordingly
8012beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik * - finds the right dataType (mediates between content-type and expected dataType)
8013beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik * - returns the corresponding response
8014beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik */
8015beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikfunction ajaxHandleResponses( s, jqXHR, responses ) {
8016beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
80174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var ct, type, finalDataType, firstDataType,
80184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		contents = s.contents,
8019beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		dataTypes = s.dataTypes,
80204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		responseFields = s.responseFields;
8021beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8022beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Fill responseXXX fields
8023beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	for ( type in responseFields ) {
8024beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( type in responses ) {
8025beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jqXHR[ responseFields[type] ] = responses[ type ];
8026beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
8027beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
8028beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8029beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Remove auto dataType and get content-type in the process
8030beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	while( dataTypes[ 0 ] === "*" ) {
8031beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		dataTypes.shift();
8032beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( ct === undefined ) {
8033beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
8034beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
8035beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
8036beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8037beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Check if we're dealing with a known content-type
8038beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( ct ) {
8039beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		for ( type in contents ) {
8040beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( contents[ type ] && contents[ type ].test( ct ) ) {
8041beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				dataTypes.unshift( type );
8042beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				break;
8043beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
8044beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
8045beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
8046beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8047beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Check to see if we have a response for the expected dataType
8048beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( dataTypes[ 0 ] in responses ) {
8049beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		finalDataType = dataTypes[ 0 ];
8050beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	} else {
8051beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Try convertible dataTypes
8052beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		for ( type in responses ) {
8053beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
8054beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				finalDataType = type;
8055beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				break;
8056beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
8057beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( !firstDataType ) {
8058beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				firstDataType = type;
8059beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
8060beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
8061beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Or just use first one
8062beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		finalDataType = finalDataType || firstDataType;
8063beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
8064beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8065beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// If we found a dataType
8066beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// We add the dataType to the list if needed
8067beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// and return the corresponding response
8068beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( finalDataType ) {
8069beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( finalDataType !== dataTypes[ 0 ] ) {
8070beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			dataTypes.unshift( finalDataType );
8071beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
8072beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return responses[ finalDataType ];
8073beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
8074beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
8075beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8076beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Chain conversions given the request and the original response
8077beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikfunction ajaxConvert( s, response ) {
8078beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
80794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var conv, conv2, current, tmp,
80804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Work with a copy of dataTypes in case we need to modify it for conversion
80814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		dataTypes = s.dataTypes.slice(),
80824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		prev = dataTypes[ 0 ],
80834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		converters = {},
80844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		i = 0;
80854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
8086beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// Apply the dataFilter if provided
8087beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( s.dataFilter ) {
8088beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		response = s.dataFilter( response, s.dataType );
8089beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
8090beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
80914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Create converters map with lowercased keys
80924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( dataTypes[ 1 ] ) {
80934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		for ( conv in s.converters ) {
80944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			converters[ conv.toLowerCase() ] = s.converters[ conv ];
80954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
80964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
80974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
80984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Convert to each sequential dataType, tolerating list modification
80994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	for ( ; (current = dataTypes[++i]); ) {
81004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
81014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// There's only work to do if current dataType is non-auto
81024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( current !== "*" ) {
81034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
81044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Convert response if prev dataType is non-auto and differs from current
81054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( prev !== "*" && prev !== current ) {
81064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
81074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Seek a direct converter
81084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
81094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
81104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// If none found, seek a pair
81114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( !conv ) {
81124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					for ( conv2 in converters ) {
81134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
81144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// If conv2 outputs current
81154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						tmp = conv2.split(" ");
81164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						if ( tmp[ 1 ] === current ) {
81174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
81184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							// If prev can be converted to accepted input
81194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							conv = converters[ prev + " " + tmp[ 0 ] ] ||
81204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								converters[ "* " + tmp[ 0 ] ];
81214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							if ( conv ) {
81224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								// Condense equivalence converters
81234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								if ( conv === true ) {
81244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair									conv = converters[ conv2 ];
81254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
81264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								// Otherwise, insert the intermediate dataType
81274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								} else if ( converters[ conv2 ] !== true ) {
81284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair									current = tmp[ 0 ];
81294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair									dataTypes.splice( i--, 0, current );
81304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								}
81314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
81324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair								break;
8133beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							}
8134beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
8135beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
8136beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
8137beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
81384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Apply converter (if not an equivalence)
81394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( conv !== true ) {
8140beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
81414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Unless errors are allowed to bubble, catch and return them
81424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( conv && s["throws"] ) {
81434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						response = conv( response );
81444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					} else {
81454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						try {
81464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							response = conv( response );
81474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						} catch ( e ) {
81484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair							return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
81494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						}
81504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					}
81514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
81524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
8153beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
81544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Update prev for next iteration
81554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			prev = current;
81564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
81574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
8158beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
81594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return { state: "success", data: response };
81604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
81614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairvar oldCallbacks = [],
81624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rquestion = /\?/,
81634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rjsonp = /(=)\?(?=&|$)|\?\?/,
81644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	nonce = jQuery.now();
8165beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8166beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Default jsonp settings
8167beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.ajaxSetup({
8168beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jsonp: "callback",
8169beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jsonpCallback: function() {
81704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
81714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		this[ callback ] = true;
81724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return callback;
8173beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
8174beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
8175beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8176beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Detect, normalize options and install callbacks for jsonp requests
8177beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
8178beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
81794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var callbackName, overwritten, responseContainer,
81804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		data = s.data,
81814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		url = s.url,
81824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		hasCallback = s.jsonp !== false,
81834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		replaceInUrl = hasCallback && rjsonp.test( url ),
81844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		replaceInData = hasCallback && !replaceInUrl && typeof data === "string" &&
81854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			!( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") &&
81864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			rjsonp.test( data );
81874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
81884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Handle iff the expected data type is "jsonp" or we have a parameter to set
81894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) {
81904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
81914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Get callback name, remembering preexisting value associated with it
81924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
81934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			s.jsonpCallback() :
81944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			s.jsonpCallback;
81954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		overwritten = window[ callbackName ];
81964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
81974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Insert callback into url or form data
81984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( replaceInUrl ) {
81994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			s.url = url.replace( rjsonp, "$1" + callbackName );
82004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} else if ( replaceInData ) {
82014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			s.data = data.replace( rjsonp, "$1" + callbackName );
82024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} else if ( hasCallback ) {
82034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
82044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
8205beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
82064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Use data converter to retrieve json after script execution
82074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		s.converters["script json"] = function() {
82084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( !responseContainer ) {
82094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery.error( callbackName + " was not called" );
8210beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
82114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return responseContainer[ 0 ];
82124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		};
8213beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
82144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// force json dataType
82154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		s.dataTypes[ 0 ] = "json";
8216beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8217beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Install callback
82184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		window[ callbackName ] = function() {
82194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			responseContainer = arguments;
8220beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		};
8221beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
82224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Clean-up function (fires after converters)
8223beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		jqXHR.always(function() {
82244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Restore preexisting value
82254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			window[ callbackName ] = overwritten;
82264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
82274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Save back as free
82284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( s[ callbackName ] ) {
82294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// make sure that re-using the options doesn't screw things around
82304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				s.jsonpCallback = originalSettings.jsonpCallback;
82314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
82324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// save the callback name for future use
82334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				oldCallbacks.push( callbackName );
8234beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
8235beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
82364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Call if it was a function and we have a response
82374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
82384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				overwritten( responseContainer[ 0 ] );
8239beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
8240beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
82414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			responseContainer = overwritten = undefined;
82424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		});
8243beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8244beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Delegate to script
8245beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return "script";
8246beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
8247beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
8248beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Install script dataType
8249beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.ajaxSetup({
8250beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	accepts: {
8251beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
8252beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
8253beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	contents: {
8254beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		script: /javascript|ecmascript/
8255beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
8256beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	converters: {
8257beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		"text script": function( text ) {
8258beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			jQuery.globalEval( text );
8259beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return text;
8260beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
8261beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
8262beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
8263beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8264beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Handle cache's special case and global
8265beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.ajaxPrefilter( "script", function( s ) {
8266beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( s.cache === undefined ) {
8267beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		s.cache = false;
8268beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
8269beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( s.crossDomain ) {
8270beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		s.type = "GET";
8271beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		s.global = false;
8272beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
8273beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
8274beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8275beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Bind script tag hack transport
8276beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.ajaxTransport( "script", function(s) {
8277beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8278beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// This transport only deals with cross domain requests
8279beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	if ( s.crossDomain ) {
8280beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8281beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var script,
8282beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
8283beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8284beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return {
8285beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8286beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			send: function( _, callback ) {
8287beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8288beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				script = document.createElement( "script" );
8289beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8290beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				script.async = "async";
8291beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8292beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( s.scriptCharset ) {
8293beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					script.charset = s.scriptCharset;
8294beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
8295beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8296beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				script.src = s.url;
8297beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8298beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Attach handlers for all browsers
8299beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				script.onload = script.onreadystatechange = function( _, isAbort ) {
8300beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8301beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
8302beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8303beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						// Handle memory leak in IE
8304beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						script.onload = script.onreadystatechange = null;
8305beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8306beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						// Remove the script
8307beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						if ( head && script.parentNode ) {
8308beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							head.removeChild( script );
8309beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
8310beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8311beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						// Dereference the script
8312beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						script = undefined;
8313beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8314beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						// Callback if not abort
8315beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						if ( !isAbort ) {
8316beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							callback( 200, "success" );
8317beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
8318beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
8319beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				};
8320beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
8321beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				// This arises when a base node is used (#2709 and #4378).
8322beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				head.insertBefore( script, head.firstChild );
8323beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			},
8324beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8325beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			abort: function() {
8326beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( script ) {
8327beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					script.onload( 0, 1 );
8328beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
8329beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
8330beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		};
8331beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
8332beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
83334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairvar xhrCallbacks,
83344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// #5280: Internet Explorer will keep connections alive if we don't abort on unload
8335beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	xhrOnUnloadAbort = window.ActiveXObject ? function() {
8336beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Abort all pending requests
8337beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		for ( var key in xhrCallbacks ) {
8338beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			xhrCallbacks[ key ]( 0, 1 );
8339beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
8340beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	} : false,
83414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	xhrId = 0;
8342beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8343beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Functions to create xhrs
8344beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikfunction createStandardXHR() {
8345beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	try {
8346beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return new window.XMLHttpRequest();
8347beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	} catch( e ) {}
8348beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
8349beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8350beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikfunction createActiveXHR() {
8351beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	try {
8352beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
8353beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	} catch( e ) {}
8354beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
8355beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8356beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Create the request object
8357beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// (This is still attached to ajaxSettings for backward compatibility)
8358beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.ajaxSettings.xhr = window.ActiveXObject ?
8359beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	/* Microsoft failed to properly
8360beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	 * implement the XMLHttpRequest in IE7 (can't request local files),
8361beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	 * so we use the ActiveXObject when it is available
8362beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
8363beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	 * we need a fallback.
8364beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	 */
8365beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	function() {
8366beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return !this.isLocal && createStandardXHR() || createActiveXHR();
8367beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	} :
8368beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	// For all other browsers, use the standard XMLHttpRequest object
8369beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	createStandardXHR;
8370beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8371beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Determine support properties
8372beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik(function( xhr ) {
8373beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.extend( jQuery.support, {
8374beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		ajax: !!xhr,
8375beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		cors: !!xhr && ( "withCredentials" in xhr )
8376beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	});
8377beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik})( jQuery.ajaxSettings.xhr() );
8378beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8379beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Create transport if the browser can provide an xhr
8380beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikif ( jQuery.support.ajax ) {
8381beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8382beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.ajaxTransport(function( s ) {
8383beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Cross domain only allowed if supported through XMLHttpRequest
8384beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !s.crossDomain || jQuery.support.cors ) {
8385beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8386beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			var callback;
8387beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8388beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return {
8389beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				send: function( headers, complete ) {
8390beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8391beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// Get a new xhr
83924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					var handle, i,
83934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						xhr = s.xhr();
8394beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8395beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// Open the socket
8396beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// Passing null username, generates a login popup on Opera (#2865)
8397beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( s.username ) {
8398beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						xhr.open( s.type, s.url, s.async, s.username, s.password );
8399beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					} else {
8400beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						xhr.open( s.type, s.url, s.async );
8401beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
8402beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8403beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// Apply custom fields if provided
8404beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( s.xhrFields ) {
8405beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						for ( i in s.xhrFields ) {
8406beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							xhr[ i ] = s.xhrFields[ i ];
8407beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
8408beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
8409beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8410beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// Override mime type if needed
8411beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( s.mimeType && xhr.overrideMimeType ) {
8412beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						xhr.overrideMimeType( s.mimeType );
8413beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
8414beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8415beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// X-Requested-With header
8416beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// For cross-domain requests, seeing as conditions for a preflight are
8417beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// akin to a jigsaw puzzle, we simply never set it to be sure.
8418beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// (it can always be set on a per-request basis or even using ajaxSetup)
8419beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// For same-domain requests, won't change header if already provided.
8420beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
8421beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						headers[ "X-Requested-With" ] = "XMLHttpRequest";
8422beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
8423beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8424beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// Need an extra try/catch for cross domain requests in Firefox 3
8425beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					try {
8426beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						for ( i in headers ) {
8427beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							xhr.setRequestHeader( i, headers[ i ] );
8428beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
8429beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					} catch( _ ) {}
8430beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8431beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// Do send the request
8432beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// This may raise an exception which is actually
8433beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// handled in jQuery.ajax (so no try/catch here)
8434beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					xhr.send( ( s.hasContent && s.data ) || null );
8435beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8436beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					// Listener
8437beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					callback = function( _, isAbort ) {
8438beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8439beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						var status,
8440beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							statusText,
8441beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							responseHeaders,
8442beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							responses,
8443beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							xml;
8444beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8445beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						// Firefox throws exceptions when accessing properties
84464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// of an xhr when a network error occurred
8447beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
8448beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						try {
8449beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8450beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							// Was never called and is aborted or complete
8451beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
8452beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8453beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik								// Only called once
8454beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik								callback = undefined;
8455beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8456beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik								// Do not keep as active anymore
8457beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik								if ( handle ) {
8458beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									xhr.onreadystatechange = jQuery.noop;
8459beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									if ( xhrOnUnloadAbort ) {
8460beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik										delete xhrCallbacks[ handle ];
8461beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									}
8462beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik								}
8463beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8464beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik								// If it's an abort
8465beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik								if ( isAbort ) {
8466beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									// Abort it manually if needed
8467beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									if ( xhr.readyState !== 4 ) {
8468beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik										xhr.abort();
8469beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									}
8470beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik								} else {
8471beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									status = xhr.status;
8472beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									responseHeaders = xhr.getAllResponseHeaders();
8473beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									responses = {};
8474beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									xml = xhr.responseXML;
8475beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8476beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									// Construct response list
8477beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									if ( xml && xml.documentElement /* #4958 */ ) {
8478beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik										responses.xml = xml;
8479beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									}
84804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
84814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair									// When requesting binary data, IE6-9 will throw an exception
84824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair									// on any attempt to access responseText (#11426)
84834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair									try {
84844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair										responses.text = xhr.responseText;
84854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair									} catch( e ) {
84864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair									}
8487beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8488beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									// Firefox throws an exception when accessing
8489beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									// statusText for faulty cross-domain requests
8490beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									try {
8491beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik										statusText = xhr.statusText;
8492beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									} catch( e ) {
8493beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik										// We normalize with Webkit giving an empty statusText
8494beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik										statusText = "";
8495beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									}
8496beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8497beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									// Filter status for non standard behaviors
8498beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8499beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									// If the request is local and we have data: assume a success
8500beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									// (success with no data won't get notified, that's the best we
8501beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									// can do given current implementations)
8502beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									if ( !status && s.isLocal && !s.crossDomain ) {
8503beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik										status = responses.text ? 200 : 404;
8504beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									// IE - #1450: sometimes returns 1223 when it should be 204
8505beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									} else if ( status === 1223 ) {
8506beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik										status = 204;
8507beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik									}
8508beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik								}
8509beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							}
8510beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						} catch( firefoxAccessException ) {
8511beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							if ( !isAbort ) {
8512beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik								complete( -1, firefoxAccessException );
8513beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							}
8514beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
8515beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8516beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						// Call complete if needed
8517beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						if ( responses ) {
8518beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							complete( status, statusText, responses, responseHeaders );
8519beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
8520beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					};
8521beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
85224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( !s.async ) {
85234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// if we're in sync mode we fire the callback
8524beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						callback();
85254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					} else if ( xhr.readyState === 4 ) {
85264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// (IE6 & IE7) if it's in cache and has been
85274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// retrieved directly we need to fire the callback
85284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						setTimeout( callback, 0 );
8529beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					} else {
8530beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						handle = ++xhrId;
8531beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						if ( xhrOnUnloadAbort ) {
8532beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							// Create the active xhrs callbacks list if needed
8533beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							// and attach the unload handler
8534beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							if ( !xhrCallbacks ) {
8535beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik								xhrCallbacks = {};
8536beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik								jQuery( window ).unload( xhrOnUnloadAbort );
8537beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							}
8538beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							// Add to list of active xhrs callbacks
8539beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik							xhrCallbacks[ handle ] = callback;
8540beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						}
8541beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						xhr.onreadystatechange = callback;
8542beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
8543beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				},
8544beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8545beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				abort: function() {
8546beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					if ( callback ) {
8547beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik						callback(0,1);
8548beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
8549beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
8550beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			};
8551beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
8552beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	});
8553beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
85544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairvar fxNow, timerId,
8555beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	rfxtypes = /^(?:toggle|show|hide)$/,
85564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
85574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	rrun = /queueHooks$/,
85584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	animationPrefilters = [ defaultPrefilter ],
85594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	tweeners = {
85604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		"*": [function( prop, value ) {
85614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var end, unit,
85624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				tween = this.createTween( prop, value ),
85634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				parts = rfxnum.exec( value ),
85644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				target = tween.cur(),
85654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				start = +target || 0,
85664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				scale = 1,
85674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				maxIterations = 20;
85684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
85694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( parts ) {
85704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				end = +parts[2];
85714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
85724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
85734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// We need to compute starting value
85744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( unit !== "px" && start ) {
85754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Iteratively approximate from a nonzero starting point
85764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Prefer the current property, because this process will be trivial if it uses the same units
85774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Fallback to end or a simple constant
85784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					start = jQuery.css( tween.elem, prop, true ) || end || 1;
85794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
85804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					do {
85814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// If previous iteration zeroed out, double until we get *something*
85824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// Use a string for doubling factor so we don't accidentally see scale as unchanged below
85834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						scale = scale || ".5";
85844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
85854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						// Adjust and apply
85864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						start = start / scale;
85874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						jQuery.style( tween.elem, prop, start + unit );
85884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
85894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Update scale, tolerating zero or NaN from tween.cur()
85904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
85914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
85924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
85934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
85944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				tween.unit = unit;
85954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				tween.start = start;
85964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// If a +=/-= token was provided, we're doing a relative animation
85974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
85984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
85994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return tween;
86004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}]
86014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	};
8602beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
86034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// Animations created synchronously will run synchronously
86044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction createFxNow() {
86054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	setTimeout(function() {
86064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		fxNow = undefined;
86074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}, 0 );
86084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return ( fxNow = jQuery.now() );
86094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
8610beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
86114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction createTweens( animation, props ) {
86124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	jQuery.each( props, function( prop, value ) {
86134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
86144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			index = 0,
86154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			length = collection.length;
86164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		for ( ; index < length; index++ ) {
86174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( collection[ index ].call( animation, prop, value ) ) {
8618beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
86194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// we're done with this property
86204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return;
8621beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
86224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
86234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	});
86244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
8625beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
86264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction Animation( elem, properties, options ) {
86274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var result,
86284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		index = 0,
86294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		tweenerIndex = 0,
86304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		length = animationPrefilters.length,
86314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		deferred = jQuery.Deferred().always( function() {
86324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// don't match elem in the :animated selector
86334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			delete tick.elem;
86344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}),
86354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		tick = function() {
86364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var currentTime = fxNow || createFxNow(),
86374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
86384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
86394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				temp = remaining / animation.duration || 0,
86404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				percent = 1 - temp,
86414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				index = 0,
86424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				length = animation.tweens.length;
86434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
86444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			for ( ; index < length ; index++ ) {
86454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				animation.tweens[ index ].run( percent );
86464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
86474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
86484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			deferred.notifyWith( elem, [ animation, percent, remaining ]);
86494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
86504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( percent < 1 && length ) {
86514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return remaining;
86524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			} else {
86534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				deferred.resolveWith( elem, [ animation ] );
86544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return false;
86554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
86564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		},
86574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		animation = deferred.promise({
86584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			elem: elem,
86594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			props: jQuery.extend( {}, properties ),
86604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			opts: jQuery.extend( true, { specialEasing: {} }, options ),
86614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			originalProperties: properties,
86624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			originalOptions: options,
86634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			startTime: fxNow || createFxNow(),
86644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			duration: options.duration,
86654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			tweens: [],
86664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			createTween: function( prop, end, easing ) {
86674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				var tween = jQuery.Tween( elem, animation.opts, prop, end,
86684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						animation.opts.specialEasing[ prop ] || animation.opts.easing );
86694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				animation.tweens.push( tween );
86704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return tween;
86714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			},
86724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			stop: function( gotoEnd ) {
86734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				var index = 0,
86744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// if we are going to the end, we want to run all the tweens
86754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// otherwise we skip this part
86764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					length = gotoEnd ? animation.tweens.length : 0;
8677beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
86784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				for ( ; index < length ; index++ ) {
86794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					animation.tweens[ index ].run( 1 );
86804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
8681beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
86824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// resolve when we played the last frame
86834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// otherwise, reject
86844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( gotoEnd ) {
86854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					deferred.resolveWith( elem, [ animation, gotoEnd ] );
86864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				} else {
86874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					deferred.rejectWith( elem, [ animation, gotoEnd ] );
8688beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
86894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return this;
8690beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
86914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}),
86924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		props = animation.props;
8693beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
86944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	propFilter( props, animation.opts.specialEasing );
86954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
86964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	for ( ; index < length ; index++ ) {
86974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
86984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( result ) {
86994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return result;
8700beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
87014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
8702beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
87034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	createTweens( animation, props );
8704beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
87054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( jQuery.isFunction( animation.opts.start ) ) {
87064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		animation.opts.start.call( elem, animation );
87074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
8708beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
87094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	jQuery.fx.timer(
87104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		jQuery.extend( tick, {
87114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			anim: animation,
87124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			queue: animation.opts.queue,
87134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			elem: elem
87144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		})
87154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	);
8716beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
87174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// attach callbacks from options
87184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return animation.progress( animation.opts.progress )
87194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		.done( animation.opts.done, animation.opts.complete )
87204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		.fail( animation.opts.fail )
87214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		.always( animation.opts.always );
87224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
8723beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
87244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction propFilter( props, specialEasing ) {
87254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var index, name, easing, value, hooks;
8726beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
87274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// camelCase, specialEasing and expand cssHook pass
87284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	for ( index in props ) {
87294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		name = jQuery.camelCase( index );
87304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		easing = specialEasing[ name ];
87314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		value = props[ index ];
87324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( jQuery.isArray( value ) ) {
87334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			easing = value[ 1 ];
87344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			value = props[ index ] = value[ 0 ];
8735beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
8736beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
87374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( index !== name ) {
87384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			props[ name ] = value;
87394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			delete props[ index ];
87404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
8741beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
87424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		hooks = jQuery.cssHooks[ name ];
87434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( hooks && "expand" in hooks ) {
87444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			value = hooks.expand( value );
87454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			delete props[ name ];
8746beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
87474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// not quite $.extend, this wont overwrite keys already present.
87484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// also - reusing 'index' from above because we have the correct "name"
87494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			for ( index in value ) {
87504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( !( index in props ) ) {
87514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					props[ index ] = value[ index ];
87524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					specialEasing[ index ] = easing;
87534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
87544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
87554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} else {
87564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			specialEasing[ name ] = easing;
87574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
87584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
87594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
8760beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
87614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.Animation = jQuery.extend( Animation, {
8762beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
87634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	tweener: function( props, callback ) {
87644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( jQuery.isFunction( props ) ) {
87654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			callback = props;
87664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			props = [ "*" ];
8767beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else {
87684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			props = props.split(" ");
8769beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
8770beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
87714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var prop,
87724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			index = 0,
87734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			length = props.length;
8774beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
87754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		for ( ; index < length ; index++ ) {
87764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			prop = props[ index ];
87774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			tweeners[ prop ] = tweeners[ prop ] || [];
87784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			tweeners[ prop ].unshift( callback );
87794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
8780beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
8781beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
87824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	prefilter: function( callback, prepend ) {
87834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( prepend ) {
87844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			animationPrefilters.unshift( callback );
87854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} else {
87864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			animationPrefilters.push( callback );
87874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
87884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
87894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair});
8790beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
87914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction defaultPrefilter( elem, props, opts ) {
87924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var index, prop, value, length, dataShow, toggle, tween, hooks, oldfire,
87934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		anim = this,
87944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		style = elem.style,
87954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		orig = {},
87964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		handled = [],
87974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		hidden = elem.nodeType && isHidden( elem );
87984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
87994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// handle queue: false promises
88004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( !opts.queue ) {
88014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		hooks = jQuery._queueHooks( elem, "fx" );
88024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( hooks.unqueued == null ) {
88034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			hooks.unqueued = 0;
88044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			oldfire = hooks.empty.fire;
88054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			hooks.empty.fire = function() {
88064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( !hooks.unqueued ) {
88074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					oldfire();
88084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
88094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			};
8810beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
88114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		hooks.unqueued++;
8812beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
88134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		anim.always(function() {
88144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// doing this makes sure that the complete handler will be called
88154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// before this completes
88164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			anim.always(function() {
88174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				hooks.unqueued--;
88184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( !jQuery.queue( elem, "fx" ).length ) {
88194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					hooks.empty.fire();
88204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
88214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			});
88224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		});
88234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
8824beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
88254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// height/width overflow pass
88264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
88274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Make sure that nothing sneaks out
88284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Record all 3 overflow attributes because IE does not
88294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// change the overflow attribute when overflowX and
88304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// overflowY are set to the same value
88314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
8832beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
88334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Set display property to inline-block for height/width
88344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// animations on inline elements that are having width/height animated
88354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( jQuery.css( elem, "display" ) === "inline" &&
88364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery.css( elem, "float" ) === "none" ) {
88374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
88384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// inline-level elements accept inline-block;
88394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// block-level elements need to be inline with layout
88404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
88414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				style.display = "inline-block";
88424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
88434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			} else {
88444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				style.zoom = 1;
8845beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
88464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
88474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
8848beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
88494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( opts.overflow ) {
88504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		style.overflow = "hidden";
88514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !jQuery.support.shrinkWrapBlocks ) {
88524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			anim.done(function() {
88534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				style.overflow = opts.overflow[ 0 ];
88544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				style.overflowX = opts.overflow[ 1 ];
88554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				style.overflowY = opts.overflow[ 2 ];
88564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			});
88574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
88584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
8859beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
8860beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
88614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// show/hide pass
88624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	for ( index in props ) {
88634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		value = props[ index ];
88644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( rfxtypes.exec( value ) ) {
88654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			delete props[ index ];
88664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			toggle = toggle || value === "toggle";
88674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( value === ( hidden ? "hide" : "show" ) ) {
88684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				continue;
88694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
88704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			handled.push( index );
88714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
88724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
8873beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
88744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	length = handled.length;
88754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( length ) {
88764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
88774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( "hidden" in dataShow ) {
88784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			hidden = dataShow.hidden;
88794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
8880beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
88814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// store state if its toggle - enables .stop().toggle() to "reverse"
88824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( toggle ) {
88834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			dataShow.hidden = !hidden;
88844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
88854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( hidden ) {
88864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			jQuery( elem ).show();
88874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} else {
88884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			anim.done(function() {
88894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery( elem ).hide();
88904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			});
88914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
88924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		anim.done(function() {
88934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var prop;
88944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			jQuery.removeData( elem, "fxshow", true );
88954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			for ( prop in orig ) {
88964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery.style( elem, prop, orig[ prop ] );
88974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
88984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		});
88994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		for ( index = 0 ; index < length ; index++ ) {
89004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			prop = handled[ index ];
89014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
89024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
8903beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
89044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( !( prop in dataShow ) ) {
89054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				dataShow[ prop ] = tween.start;
89064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( hidden ) {
89074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					tween.end = tween.start;
89084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					tween.start = prop === "width" || prop === "height" ? 1 : 0;
8909beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
89104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
89114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
89124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
89134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
8914beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
89154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction Tween( elem, options, prop, end, easing ) {
89164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return new Tween.prototype.init( elem, options, prop, end, easing );
89174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair}
89184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.Tween = Tween;
89194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
89204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairTween.prototype = {
89214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	constructor: Tween,
89224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	init: function( elem, options, prop, end, easing, unit ) {
89234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		this.elem = elem;
89244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		this.prop = prop;
89254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		this.easing = easing || "swing";
89264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		this.options = options;
89274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		this.start = this.now = this.cur();
89284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		this.end = end;
89294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
89304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	},
89314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	cur: function() {
89324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var hooks = Tween.propHooks[ this.prop ];
89334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
89344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return hooks && hooks.get ?
89354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			hooks.get( this ) :
89364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			Tween.propHooks._default.get( this );
89374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	},
89384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	run: function( percent ) {
89394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var eased,
89404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			hooks = Tween.propHooks[ this.prop ];
89414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
89424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( this.options.duration ) {
89434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			this.pos = eased = jQuery.easing[ this.easing ](
89444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				percent, this.options.duration * percent, 0, 1, this.options.duration
89454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			);
89464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} else {
89474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			this.pos = eased = percent;
89484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
89494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		this.now = ( this.end - this.start ) * eased + this.start;
8950beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
89514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( this.options.step ) {
89524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			this.options.step.call( this.elem, this.now, this );
89534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
8954beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
89554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( hooks && hooks.set ) {
89564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			hooks.set( this );
89574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		} else {
89584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			Tween.propHooks._default.set( this );
89594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
89604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return this;
89614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
89624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair};
8963beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
89644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairTween.prototype.init.prototype = Tween.prototype;
8965beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
89664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairTween.propHooks = {
89674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	_default: {
89684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		get: function( tween ) {
89694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var result;
8970beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
89714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( tween.elem[ tween.prop ] != null &&
89724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
89734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return tween.elem[ tween.prop ];
8974beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
8975beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
89764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// passing any value as a 4th parameter to .css will automatically
89774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// attempt a parseFloat and fallback to a string if the parse fails
89784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// so, simple values such as "10px" are parsed to Float.
89794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// complex values such as "rotate(1rad)" are returned as is.
89804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			result = jQuery.css( tween.elem, tween.prop, false, "" );
89814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// Empty strings, null, undefined and "auto" are converted to 0.
89824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return !result || result === "auto" ? 0 : result;
89834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		},
89844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		set: function( tween ) {
89854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// use step hook for back compat - use cssHook if its there - use .style if its
89864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// available and use plain properties where available
89874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( jQuery.fx.step[ tween.prop ] ) {
89884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery.fx.step[ tween.prop ]( tween );
89894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
89904a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
89914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			} else {
89924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				tween.elem[ tween.prop ] = tween.now;
89934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}
89944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
89954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
89964a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair};
8997beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
89984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// Remove in 2.0 - this supports IE8's panic based approach
89994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// to setting things on disconnected nodes
9000beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
90014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
90024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	set: function( tween ) {
90034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( tween.elem.nodeType && tween.elem.parentNode ) {
90044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			tween.elem[ tween.prop ] = tween.now;
90054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}
90064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
90074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair};
9008beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
90094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
90104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var cssFn = jQuery.fn[ name ];
90114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	jQuery.fn[ name ] = function( speed, easing, callback ) {
90124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return speed == null || typeof speed === "boolean" ||
90134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// special check for .toggle( handler, handler, ... )
90144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?
90154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			cssFn.apply( this, arguments ) :
90164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			this.animate( genFx( name, true ), speed, easing, callback );
90174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	};
90184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair});
9019beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
90204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.fn.extend({
90214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	fadeTo: function( speed, to, easing, callback ) {
9022beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
90234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// show any hidden elements after setting opacity to 0
90244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return this.filter( isHidden ).css( "opacity", 0 ).show()
9025beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
90264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			// animate to the value specified
90274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			.end().animate({ opacity: to }, speed, easing, callback );
90284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	},
90294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	animate: function( prop, speed, easing, callback ) {
90304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var empty = jQuery.isEmptyObject( prop ),
90314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			optall = jQuery.speed( speed, easing, callback ),
90324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			doAnimation = function() {
90334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Operate on a copy of prop so per-property easing won't be lost
90344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
9035beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
90364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Empty animations resolve immediately
90374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( empty ) {
90384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					anim.stop( true );
90394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
90404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			};
9041beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
90424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return empty || optall.queue === false ?
9043beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			this.each( doAnimation ) :
9044beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			this.queue( optall.queue, doAnimation );
9045beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
9046beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	stop: function( type, clearQueue, gotoEnd ) {
90474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		var stopQueue = function( hooks ) {
90484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var stop = hooks.stop;
90494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			delete hooks.stop;
90504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			stop( gotoEnd );
90514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		};
90524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
9053beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( typeof type !== "string" ) {
9054beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			gotoEnd = clearQueue;
9055beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			clearQueue = type;
9056beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			type = undefined;
9057beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
9058beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( clearQueue && type !== false ) {
9059beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			this.queue( type || "fx", [] );
9060beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
9061beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9062beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.each(function() {
90634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var dequeue = true,
90644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				index = type != null && type + "queueHooks",
9065beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				timers = jQuery.timers,
9066beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				data = jQuery._data( this );
9067beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
90684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( index ) {
90694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( data[ index ] && data[ index ].stop ) {
90704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					stopQueue( data[ index ] );
90714a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
90724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			} else {
9073beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				for ( index in data ) {
90744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
90754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						stopQueue( data[ index ] );
9076beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					}
9077beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
9078beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
9079beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9080beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			for ( index = timers.length; index--; ) {
9081beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
90824a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					timers[ index ].anim.stop( gotoEnd );
90834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					dequeue = false;
9084beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik					timers.splice( index, 1 );
9085beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				}
9086beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
9087beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9088beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// start the next in the queue if the last step wasn't forced
9089beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// timers currently will call their complete callbacks, which will dequeue
9090beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			// but only if they were gotoEnd
90914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( dequeue || !gotoEnd ) {
9092beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jQuery.dequeue( this, type );
9093beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
9094beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
9095beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
9096beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
9097beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9098beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Generate parameters to create a standard animation
90994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairfunction genFx( type, includeWidth ) {
91004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var which,
91014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		attrs = { height: type },
91024a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		i = 0;
91034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
91044a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// if we include width, step value is 1 to do all cssExpand values,
91054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// if we don't include width, step value is 2 to skip over Left and Right
91064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	includeWidth = includeWidth? 1 : 0;
91074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	for( ; i < 4 ; i += 2 - includeWidth ) {
91084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		which = cssExpand[ i ];
91094a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
91104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
9111beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
91124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( includeWidth ) {
91134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		attrs.opacity = attrs.width = type;
91144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
9115beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
91164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return attrs;
9117beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
9118beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9119beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Generate shortcuts for custom animations
9120beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.each({
91214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	slideDown: genFx("show"),
91224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	slideUp: genFx("hide"),
91234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	slideToggle: genFx("toggle"),
9124beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	fadeIn: { opacity: "show" },
9125beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	fadeOut: { opacity: "hide" },
9126beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	fadeToggle: { opacity: "toggle" }
9127beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}, function( name, props ) {
9128beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.fn[ name ] = function( speed, easing, callback ) {
9129beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.animate( props, speed, easing, callback );
9130beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
9131beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
9132beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
91334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.speed = function( speed, easing, fn ) {
91344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
91354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		complete: fn || !fn && easing ||
91364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			jQuery.isFunction( speed ) && speed,
91374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		duration: speed,
91384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
91394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	};
9140beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
91414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
91424a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
9143beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
91444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// normalize opt.queue - true/undefined/null -> "fx"
91454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( opt.queue == null || opt.queue === true ) {
91464a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		opt.queue = "fx";
9147beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
9148beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
91494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Queueing
91504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	opt.old = opt.complete;
9151beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
91524a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	opt.complete = function() {
91534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( jQuery.isFunction( opt.old ) ) {
91544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			opt.old.call( this );
9155beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
9156beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
91574a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( opt.queue ) {
91584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			jQuery.dequeue( this, opt.queue );
9159beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
91604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	};
9161beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
91624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return opt;
91634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair};
9164beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
91654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.easing = {
91664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	linear: function( p ) {
91674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return p;
9168beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
91694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	swing: function( p ) {
91704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return 0.5 - Math.cos( p*Math.PI ) / 2;
9171beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
9172beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik};
9173beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
91744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.timers = [];
91754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.fx = Tween.prototype.init;
91764a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.fx.tick = function() {
91774a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var timer,
91784a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		timers = jQuery.timers,
91794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		i = 0;
9180beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
91814a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	fxNow = jQuery.now();
9182beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
91834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	for ( ; i < timers.length; i++ ) {
91844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		timer = timers[ i ];
91854a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// Checks the timer has not already been removed
91864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		if ( !timer() && timers[ i ] === timer ) {
91874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			timers.splice( i--, 1 );
9188beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
91894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
9190beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
91914a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( !timers.length ) {
91924a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		jQuery.fx.stop();
91934a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
91944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	fxNow = undefined;
91954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair};
9196beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
91974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.fx.timer = function( timer ) {
91984a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( timer() && jQuery.timers.push( timer ) && !timerId ) {
91994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
92004a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
92014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair};
9202beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
92034a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.fx.interval = 13;
9204beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
92054a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.fx.stop = function() {
92064a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	clearInterval( timerId );
92074a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	timerId = null;
92084a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair};
9209beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
92104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.fx.speeds = {
92114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	slow: 600,
92124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	fast: 200,
92134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Default speed
92144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	_default: 400
92154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair};
9216beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
92174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// Back Compat <1.8 extension point
92184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.fx.step = {};
9219beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9220beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikif ( jQuery.expr && jQuery.expr.filters ) {
9221beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.expr.filters.animated = function( elem ) {
9222beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return jQuery.grep(jQuery.timers, function( fn ) {
9223beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			return elem === fn.elem;
9224beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}).length;
9225beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
9226beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
92274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairvar rroot = /^(?:body|html)$/i;
9228beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
92294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.fn.offset = function( options ) {
92304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( arguments.length ) {
92314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return options === undefined ?
92324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			this :
92334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			this.each(function( i ) {
9234beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				jQuery.offset.setOffset( this, options, i );
9235beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			});
92364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
9237beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
92384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft,
92394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		box = { top: 0, left: 0 },
92404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		elem = this[ 0 ],
92414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		doc = elem && elem.ownerDocument;
9242beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
92434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( !doc ) {
92444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return;
92454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
9246beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
92474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( (body = doc.body) === elem ) {
92484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return jQuery.offset.bodyOffset( elem );
92494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
9250beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
92514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	docElem = doc.documentElement;
9252beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
92534a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// Make sure it's not a disconnected DOM node
92544a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( !jQuery.contains( docElem, elem ) ) {
92554a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return box;
92564a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
9257beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
92584a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// If we don't have gBCR, just use 0,0 rather than error
92594a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	// BlackBerry 5, iOS 3 (original iPhone)
92604a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	if ( typeof elem.getBoundingClientRect !== "undefined" ) {
92614a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		box = elem.getBoundingClientRect();
92624a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	}
92634a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	win = getWindow( doc );
92644a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	clientTop  = docElem.clientTop  || body.clientTop  || 0;
92654a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	clientLeft = docElem.clientLeft || body.clientLeft || 0;
92664a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	scrollTop  = win.pageYOffset || docElem.scrollTop;
92674a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	scrollLeft = win.pageXOffset || docElem.scrollLeft;
92684a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	return {
92694a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		top: box.top  + scrollTop  - clientTop,
92704a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		left: box.left + scrollLeft - clientLeft
9271beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
92724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair};
9273beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9274beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.offset = {
9275beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9276beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	bodyOffset: function( body ) {
9277beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var top = body.offsetTop,
9278beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			left = body.offsetLeft;
9279beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9280beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
9281beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
9282beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
9283beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
9284beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9285beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return { top: top, left: left };
9286beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
9287beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9288beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	setOffset: function( elem, options, i ) {
9289beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var position = jQuery.css( elem, "position" );
9290beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9291beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// set position first, in-case top/left are set even on static elem
9292beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( position === "static" ) {
9293beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			elem.style.position = "relative";
9294beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
9295beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9296beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var curElem = jQuery( elem ),
9297beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			curOffset = curElem.offset(),
9298beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			curCSSTop = jQuery.css( elem, "top" ),
9299beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			curCSSLeft = jQuery.css( elem, "left" ),
9300beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
9301beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			props = {}, curPosition = {}, curTop, curLeft;
9302beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9303beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
9304beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( calculatePosition ) {
9305beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			curPosition = curElem.position();
9306beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			curTop = curPosition.top;
9307beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			curLeft = curPosition.left;
9308beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else {
9309beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			curTop = parseFloat( curCSSTop ) || 0;
9310beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			curLeft = parseFloat( curCSSLeft ) || 0;
9311beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
9312beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9313beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( jQuery.isFunction( options ) ) {
9314beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			options = options.call( elem, i, curOffset );
9315beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
9316beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9317beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( options.top != null ) {
9318beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			props.top = ( options.top - curOffset.top ) + curTop;
9319beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
9320beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( options.left != null ) {
9321beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			props.left = ( options.left - curOffset.left ) + curLeft;
9322beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
9323beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9324beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( "using" in options ) {
9325beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			options.using.call( elem, props );
9326beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		} else {
9327beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			curElem.css( props );
9328beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
9329beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
9330beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik};
9331beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9332beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9333beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris CraikjQuery.fn.extend({
9334beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9335beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	position: function() {
9336beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		if ( !this[0] ) {
93374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return;
9338beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		}
9339beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9340beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		var elem = this[0],
9341beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9342beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Get *real* offsetParent
9343beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		offsetParent = this.offsetParent(),
9344beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9345beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Get correct offsets
9346beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		offset       = this.offset(),
9347beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
9348beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9349beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Subtract element margins
9350beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// note: when an element has margin: auto the offsetLeft and marginLeft
9351beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// are the same in Safari causing offset.left to incorrectly be 0
9352beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
9353beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
9354beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9355beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Add offsetParent borders
9356beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
9357beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
9358beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9359beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		// Subtract the two offsets
9360beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return {
9361beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			top:  offset.top  - parentOffset.top,
9362beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			left: offset.left - parentOffset.left
9363beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		};
9364beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	},
9365beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9366beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	offsetParent: function() {
9367beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		return this.map(function() {
9368beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			var offsetParent = this.offsetParent || document.body;
9369beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
9370beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				offsetParent = offsetParent.offsetParent;
9371beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
93724a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return offsetParent || document.body;
9373beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		});
9374beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	}
9375beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
9376beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9377beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9378beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Create scrollLeft and scrollTop methods
93794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
93804a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	var top = /Y/.test( prop );
9381beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9382beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	jQuery.fn[ method ] = function( val ) {
93834a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		return jQuery.access( this, function( elem, method, val ) {
93844a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var win = getWindow( elem );
9385beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
93864a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			if ( val === undefined ) {
93874a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return win ? (prop in win) ? win[ prop ] :
93884a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					win.document.documentElement[ method ] :
93894a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					elem[ method ];
9390beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
9391beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9392beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			if ( win ) {
9393beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				win.scrollTo(
93944a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					!top ? val : jQuery( win ).scrollLeft(),
93954a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					 top ? val : jQuery( win ).scrollTop()
9396beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik				);
9397beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9398beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			} else {
93994a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				elem[ method ] = val;
9400beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			}
94014a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		}, method, val, arguments.length, null );
9402beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	};
9403beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
9404beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9405beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikfunction getWindow( elem ) {
9406beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	return jQuery.isWindow( elem ) ?
9407beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		elem :
9408beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik		elem.nodeType === 9 ?
9409beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			elem.defaultView || elem.parentWindow :
9410beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik			false;
9411beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
94124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
94134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan SinclairjQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
94144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
94154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		// margin is only for outerHeight, outerWidth
94164a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		jQuery.fn[ funcName ] = function( margin, value ) {
94174a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
94184a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
94194a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
94204a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			return jQuery.access( this, function( elem, type, value ) {
94214a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				var doc;
94224a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
94234a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( jQuery.isWindow( elem ) ) {
94244a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
94254a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// isn't a whole lot we can do. See pull request at this URL for discussion:
94264a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// https://github.com/jquery/jquery/pull/764
94274a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					return elem.document.documentElement[ "client" + name ];
94284a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
94294a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
94304a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				// Get document width or height
94314a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				if ( elem.nodeType === 9 ) {
94324a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					doc = elem.documentElement;
94334a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
94344a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
94354a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
94364a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					return Math.max(
94374a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
94384a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						elem.body[ "offset" + name ], doc[ "offset" + name ],
94394a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair						doc[ "client" + name ]
94404a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					);
94414a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				}
9442beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
94434a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair				return value === undefined ?
94444a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Get width or height on the element, requesting but not forcing parseFloat
94454a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					jQuery.css( elem, type, value, extra ) :
9446beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
94474a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					// Set width or height on the element
94484a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair					jQuery.style( elem, type, value, extra );
94494a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair			}, type, chainable ? margin : undefined, chainable, null );
94504a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair		};
94514a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair	});
9452beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik});
9453beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Expose jQuery to the global object
9454beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikwindow.jQuery = window.$ = jQuery;
9455beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9456beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Expose jQuery as an AMD module, but only for AMD loaders that
9457beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// understand the issues with loading multiple versions of jQuery
9458beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// in a page that all might call define(). The loader will indicate
9459beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// they have special allowances for multiple jQuery versions by
9460beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// specifying define.amd.jQuery = true. Register as a named module,
9461beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// since jQuery can be concatenated with other files that may use define,
9462beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// but not use a proper concatenation script that understands anonymous
9463beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// AMD modules. A named AMD is safest and most robust way to register.
9464beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Lowercase jquery is used because AMD module names are derived from
9465beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// file names, and jQuery is normally delivered in a lowercase file name.
9466beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// Do this after creating the global so that if an AMD module wants to call
9467beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik// noConflict to hide this version of jQuery, it will work.
9468beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craikif ( typeof define === "function" && define.amd && define.amd.jQuery ) {
9469beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik	define( "jquery", [], function () { return jQuery; } );
9470beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik}
9471beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik
9472beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik})( window );
9473