client/scripts/jquery.js
author Eugen Sawin <sawine@me73.com>
Tue, 04 Oct 2011 22:21:21 +0200
changeset 6 60fb50abe556
permissions -rw-r--r--
Removed tmp file.
sawine@5
     1
/*!
sawine@5
     2
 * jQuery JavaScript Library v1.6.4
sawine@5
     3
 * http://jquery.com/
sawine@5
     4
 *
sawine@5
     5
 * Copyright 2011, John Resig
sawine@5
     6
 * Dual licensed under the MIT or GPL Version 2 licenses.
sawine@5
     7
 * http://jquery.org/license
sawine@5
     8
 *
sawine@5
     9
 * Includes Sizzle.js
sawine@5
    10
 * http://sizzlejs.com/
sawine@5
    11
 * Copyright 2011, The Dojo Foundation
sawine@5
    12
 * Released under the MIT, BSD, and GPL Licenses.
sawine@5
    13
 *
sawine@5
    14
 * Date: Mon Sep 12 18:54:48 2011 -0400
sawine@5
    15
 */
sawine@5
    16
(function( window, undefined ) {
sawine@5
    17
sawine@5
    18
// Use the correct document accordingly with window argument (sandbox)
sawine@5
    19
var document = window.document,
sawine@5
    20
	navigator = window.navigator,
sawine@5
    21
	location = window.location;
sawine@5
    22
var jQuery = (function() {
sawine@5
    23
sawine@5
    24
// Define a local copy of jQuery
sawine@5
    25
var jQuery = function( selector, context ) {
sawine@5
    26
		// The jQuery object is actually just the init constructor 'enhanced'
sawine@5
    27
		return new jQuery.fn.init( selector, context, rootjQuery );
sawine@5
    28
	},
sawine@5
    29
sawine@5
    30
	// Map over jQuery in case of overwrite
sawine@5
    31
	_jQuery = window.jQuery,
sawine@5
    32
sawine@5
    33
	// Map over the $ in case of overwrite
sawine@5
    34
	_$ = window.$,
sawine@5
    35
sawine@5
    36
	// A central reference to the root jQuery(document)
sawine@5
    37
	rootjQuery,
sawine@5
    38
sawine@5
    39
	// A simple way to check for HTML strings or ID strings
sawine@5
    40
	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
sawine@5
    41
	quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
sawine@5
    42
sawine@5
    43
	// Check if a string has a non-whitespace character in it
sawine@5
    44
	rnotwhite = /\S/,
sawine@5
    45
sawine@5
    46
	// Used for trimming whitespace
sawine@5
    47
	trimLeft = /^\s+/,
sawine@5
    48
	trimRight = /\s+$/,
sawine@5
    49
sawine@5
    50
	// Check for digits
sawine@5
    51
	rdigit = /\d/,
sawine@5
    52
sawine@5
    53
	// Match a standalone tag
sawine@5
    54
	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
sawine@5
    55
sawine@5
    56
	// JSON RegExp
sawine@5
    57
	rvalidchars = /^[\],:{}\s]*$/,
sawine@5
    58
	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
sawine@5
    59
	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
sawine@5
    60
	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
sawine@5
    61
sawine@5
    62
	// Useragent RegExp
sawine@5
    63
	rwebkit = /(webkit)[ \/]([\w.]+)/,
sawine@5
    64
	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
sawine@5
    65
	rmsie = /(msie) ([\w.]+)/,
sawine@5
    66
	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
sawine@5
    67
sawine@5
    68
	// Matches dashed string for camelizing
sawine@5
    69
	rdashAlpha = /-([a-z]|[0-9])/ig,
sawine@5
    70
	rmsPrefix = /^-ms-/,
sawine@5
    71
sawine@5
    72
	// Used by jQuery.camelCase as callback to replace()
sawine@5
    73
	fcamelCase = function( all, letter ) {
sawine@5
    74
		return ( letter + "" ).toUpperCase();
sawine@5
    75
	},
sawine@5
    76
sawine@5
    77
	// Keep a UserAgent string for use with jQuery.browser
sawine@5
    78
	userAgent = navigator.userAgent,
sawine@5
    79
sawine@5
    80
	// For matching the engine and version of the browser
sawine@5
    81
	browserMatch,
sawine@5
    82
sawine@5
    83
	// The deferred used on DOM ready
sawine@5
    84
	readyList,
sawine@5
    85
sawine@5
    86
	// The ready event handler
sawine@5
    87
	DOMContentLoaded,
sawine@5
    88
sawine@5
    89
	// Save a reference to some core methods
sawine@5
    90
	toString = Object.prototype.toString,
sawine@5
    91
	hasOwn = Object.prototype.hasOwnProperty,
sawine@5
    92
	push = Array.prototype.push,
sawine@5
    93
	slice = Array.prototype.slice,
sawine@5
    94
	trim = String.prototype.trim,
sawine@5
    95
	indexOf = Array.prototype.indexOf,
sawine@5
    96
sawine@5
    97
	// [[Class]] -> type pairs
sawine@5
    98
	class2type = {};
sawine@5
    99
sawine@5
   100
jQuery.fn = jQuery.prototype = {
sawine@5
   101
	constructor: jQuery,
sawine@5
   102
	init: function( selector, context, rootjQuery ) {
sawine@5
   103
		var match, elem, ret, doc;
sawine@5
   104
sawine@5
   105
		// Handle $(""), $(null), or $(undefined)
sawine@5
   106
		if ( !selector ) {
sawine@5
   107
			return this;
sawine@5
   108
		}
sawine@5
   109
sawine@5
   110
		// Handle $(DOMElement)
sawine@5
   111
		if ( selector.nodeType ) {
sawine@5
   112
			this.context = this[0] = selector;
sawine@5
   113
			this.length = 1;
sawine@5
   114
			return this;
sawine@5
   115
		}
sawine@5
   116
sawine@5
   117
		// The body element only exists once, optimize finding it
sawine@5
   118
		if ( selector === "body" && !context && document.body ) {
sawine@5
   119
			this.context = document;
sawine@5
   120
			this[0] = document.body;
sawine@5
   121
			this.selector = selector;
sawine@5
   122
			this.length = 1;
sawine@5
   123
			return this;
sawine@5
   124
		}
sawine@5
   125
sawine@5
   126
		// Handle HTML strings
sawine@5
   127
		if ( typeof selector === "string" ) {
sawine@5
   128
			// Are we dealing with HTML string or an ID?
sawine@5
   129
			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
sawine@5
   130
				// Assume that strings that start and end with <> are HTML and skip the regex check
sawine@5
   131
				match = [ null, selector, null ];
sawine@5
   132
sawine@5
   133
			} else {
sawine@5
   134
				match = quickExpr.exec( selector );
sawine@5
   135
			}
sawine@5
   136
sawine@5
   137
			// Verify a match, and that no context was specified for #id
sawine@5
   138
			if ( match && (match[1] || !context) ) {
sawine@5
   139
sawine@5
   140
				// HANDLE: $(html) -> $(array)
sawine@5
   141
				if ( match[1] ) {
sawine@5
   142
					context = context instanceof jQuery ? context[0] : context;
sawine@5
   143
					doc = (context ? context.ownerDocument || context : document);
sawine@5
   144
sawine@5
   145
					// If a single string is passed in and it's a single tag
sawine@5
   146
					// just do a createElement and skip the rest
sawine@5
   147
					ret = rsingleTag.exec( selector );
sawine@5
   148
sawine@5
   149
					if ( ret ) {
sawine@5
   150
						if ( jQuery.isPlainObject( context ) ) {
sawine@5
   151
							selector = [ document.createElement( ret[1] ) ];
sawine@5
   152
							jQuery.fn.attr.call( selector, context, true );
sawine@5
   153
sawine@5
   154
						} else {
sawine@5
   155
							selector = [ doc.createElement( ret[1] ) ];
sawine@5
   156
						}
sawine@5
   157
sawine@5
   158
					} else {
sawine@5
   159
						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
sawine@5
   160
						selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
sawine@5
   161
					}
sawine@5
   162
sawine@5
   163
					return jQuery.merge( this, selector );
sawine@5
   164
sawine@5
   165
				// HANDLE: $("#id")
sawine@5
   166
				} else {
sawine@5
   167
					elem = document.getElementById( match[2] );
sawine@5
   168
sawine@5
   169
					// Check parentNode to catch when Blackberry 4.6 returns
sawine@5
   170
					// nodes that are no longer in the document #6963
sawine@5
   171
					if ( elem && elem.parentNode ) {
sawine@5
   172
						// Handle the case where IE and Opera return items
sawine@5
   173
						// by name instead of ID
sawine@5
   174
						if ( elem.id !== match[2] ) {
sawine@5
   175
							return rootjQuery.find( selector );
sawine@5
   176
						}
sawine@5
   177
sawine@5
   178
						// Otherwise, we inject the element directly into the jQuery object
sawine@5
   179
						this.length = 1;
sawine@5
   180
						this[0] = elem;
sawine@5
   181
					}
sawine@5
   182
sawine@5
   183
					this.context = document;
sawine@5
   184
					this.selector = selector;
sawine@5
   185
					return this;
sawine@5
   186
				}
sawine@5
   187
sawine@5
   188
			// HANDLE: $(expr, $(...))
sawine@5
   189
			} else if ( !context || context.jquery ) {
sawine@5
   190
				return (context || rootjQuery).find( selector );
sawine@5
   191
sawine@5
   192
			// HANDLE: $(expr, context)
sawine@5
   193
			// (which is just equivalent to: $(context).find(expr)
sawine@5
   194
			} else {
sawine@5
   195
				return this.constructor( context ).find( selector );
sawine@5
   196
			}
sawine@5
   197
sawine@5
   198
		// HANDLE: $(function)
sawine@5
   199
		// Shortcut for document ready
sawine@5
   200
		} else if ( jQuery.isFunction( selector ) ) {
sawine@5
   201
			return rootjQuery.ready( selector );
sawine@5
   202
		}
sawine@5
   203
sawine@5
   204
		if (selector.selector !== undefined) {
sawine@5
   205
			this.selector = selector.selector;
sawine@5
   206
			this.context = selector.context;
sawine@5
   207
		}
sawine@5
   208
sawine@5
   209
		return jQuery.makeArray( selector, this );
sawine@5
   210
	},
sawine@5
   211
sawine@5
   212
	// Start with an empty selector
sawine@5
   213
	selector: "",
sawine@5
   214
sawine@5
   215
	// The current version of jQuery being used
sawine@5
   216
	jquery: "1.6.4",
sawine@5
   217
sawine@5
   218
	// The default length of a jQuery object is 0
sawine@5
   219
	length: 0,
sawine@5
   220
sawine@5
   221
	// The number of elements contained in the matched element set
sawine@5
   222
	size: function() {
sawine@5
   223
		return this.length;
sawine@5
   224
	},
sawine@5
   225
sawine@5
   226
	toArray: function() {
sawine@5
   227
		return slice.call( this, 0 );
sawine@5
   228
	},
sawine@5
   229
sawine@5
   230
	// Get the Nth element in the matched element set OR
sawine@5
   231
	// Get the whole matched element set as a clean array
sawine@5
   232
	get: function( num ) {
sawine@5
   233
		return num == null ?
sawine@5
   234
sawine@5
   235
			// Return a 'clean' array
sawine@5
   236
			this.toArray() :
sawine@5
   237
sawine@5
   238
			// Return just the object
sawine@5
   239
			( num < 0 ? this[ this.length + num ] : this[ num ] );
sawine@5
   240
	},
sawine@5
   241
sawine@5
   242
	// Take an array of elements and push it onto the stack
sawine@5
   243
	// (returning the new matched element set)
sawine@5
   244
	pushStack: function( elems, name, selector ) {
sawine@5
   245
		// Build a new jQuery matched element set
sawine@5
   246
		var ret = this.constructor();
sawine@5
   247
sawine@5
   248
		if ( jQuery.isArray( elems ) ) {
sawine@5
   249
			push.apply( ret, elems );
sawine@5
   250
sawine@5
   251
		} else {
sawine@5
   252
			jQuery.merge( ret, elems );
sawine@5
   253
		}
sawine@5
   254
sawine@5
   255
		// Add the old object onto the stack (as a reference)
sawine@5
   256
		ret.prevObject = this;
sawine@5
   257
sawine@5
   258
		ret.context = this.context;
sawine@5
   259
sawine@5
   260
		if ( name === "find" ) {
sawine@5
   261
			ret.selector = this.selector + (this.selector ? " " : "") + selector;
sawine@5
   262
		} else if ( name ) {
sawine@5
   263
			ret.selector = this.selector + "." + name + "(" + selector + ")";
sawine@5
   264
		}
sawine@5
   265
sawine@5
   266
		// Return the newly-formed element set
sawine@5
   267
		return ret;
sawine@5
   268
	},
sawine@5
   269
sawine@5
   270
	// Execute a callback for every element in the matched set.
sawine@5
   271
	// (You can seed the arguments with an array of args, but this is
sawine@5
   272
	// only used internally.)
sawine@5
   273
	each: function( callback, args ) {
sawine@5
   274
		return jQuery.each( this, callback, args );
sawine@5
   275
	},
sawine@5
   276
sawine@5
   277
	ready: function( fn ) {
sawine@5
   278
		// Attach the listeners
sawine@5
   279
		jQuery.bindReady();
sawine@5
   280
sawine@5
   281
		// Add the callback
sawine@5
   282
		readyList.done( fn );
sawine@5
   283
sawine@5
   284
		return this;
sawine@5
   285
	},
sawine@5
   286
sawine@5
   287
	eq: function( i ) {
sawine@5
   288
		return i === -1 ?
sawine@5
   289
			this.slice( i ) :
sawine@5
   290
			this.slice( i, +i + 1 );
sawine@5
   291
	},
sawine@5
   292
sawine@5
   293
	first: function() {
sawine@5
   294
		return this.eq( 0 );
sawine@5
   295
	},
sawine@5
   296
sawine@5
   297
	last: function() {
sawine@5
   298
		return this.eq( -1 );
sawine@5
   299
	},
sawine@5
   300
sawine@5
   301
	slice: function() {
sawine@5
   302
		return this.pushStack( slice.apply( this, arguments ),
sawine@5
   303
			"slice", slice.call(arguments).join(",") );
sawine@5
   304
	},
sawine@5
   305
sawine@5
   306
	map: function( callback ) {
sawine@5
   307
		return this.pushStack( jQuery.map(this, function( elem, i ) {
sawine@5
   308
			return callback.call( elem, i, elem );
sawine@5
   309
		}));
sawine@5
   310
	},
sawine@5
   311
sawine@5
   312
	end: function() {
sawine@5
   313
		return this.prevObject || this.constructor(null);
sawine@5
   314
	},
sawine@5
   315
sawine@5
   316
	// For internal use only.
sawine@5
   317
	// Behaves like an Array's method, not like a jQuery method.
sawine@5
   318
	push: push,
sawine@5
   319
	sort: [].sort,
sawine@5
   320
	splice: [].splice
sawine@5
   321
};
sawine@5
   322
sawine@5
   323
// Give the init function the jQuery prototype for later instantiation
sawine@5
   324
jQuery.fn.init.prototype = jQuery.fn;
sawine@5
   325
sawine@5
   326
jQuery.extend = jQuery.fn.extend = function() {
sawine@5
   327
	var options, name, src, copy, copyIsArray, clone,
sawine@5
   328
		target = arguments[0] || {},
sawine@5
   329
		i = 1,
sawine@5
   330
		length = arguments.length,
sawine@5
   331
		deep = false;
sawine@5
   332
sawine@5
   333
	// Handle a deep copy situation
sawine@5
   334
	if ( typeof target === "boolean" ) {
sawine@5
   335
		deep = target;
sawine@5
   336
		target = arguments[1] || {};
sawine@5
   337
		// skip the boolean and the target
sawine@5
   338
		i = 2;
sawine@5
   339
	}
sawine@5
   340
sawine@5
   341
	// Handle case when target is a string or something (possible in deep copy)
sawine@5
   342
	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
sawine@5
   343
		target = {};
sawine@5
   344
	}
sawine@5
   345
sawine@5
   346
	// extend jQuery itself if only one argument is passed
sawine@5
   347
	if ( length === i ) {
sawine@5
   348
		target = this;
sawine@5
   349
		--i;
sawine@5
   350
	}
sawine@5
   351
sawine@5
   352
	for ( ; i < length; i++ ) {
sawine@5
   353
		// Only deal with non-null/undefined values
sawine@5
   354
		if ( (options = arguments[ i ]) != null ) {
sawine@5
   355
			// Extend the base object
sawine@5
   356
			for ( name in options ) {
sawine@5
   357
				src = target[ name ];
sawine@5
   358
				copy = options[ name ];
sawine@5
   359
sawine@5
   360
				// Prevent never-ending loop
sawine@5
   361
				if ( target === copy ) {
sawine@5
   362
					continue;
sawine@5
   363
				}
sawine@5
   364
sawine@5
   365
				// Recurse if we're merging plain objects or arrays
sawine@5
   366
				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
sawine@5
   367
					if ( copyIsArray ) {
sawine@5
   368
						copyIsArray = false;
sawine@5
   369
						clone = src && jQuery.isArray(src) ? src : [];
sawine@5
   370
sawine@5
   371
					} else {
sawine@5
   372
						clone = src && jQuery.isPlainObject(src) ? src : {};
sawine@5
   373
					}
sawine@5
   374
sawine@5
   375
					// Never move original objects, clone them
sawine@5
   376
					target[ name ] = jQuery.extend( deep, clone, copy );
sawine@5
   377
sawine@5
   378
				// Don't bring in undefined values
sawine@5
   379
				} else if ( copy !== undefined ) {
sawine@5
   380
					target[ name ] = copy;
sawine@5
   381
				}
sawine@5
   382
			}
sawine@5
   383
		}
sawine@5
   384
	}
sawine@5
   385
sawine@5
   386
	// Return the modified object
sawine@5
   387
	return target;
sawine@5
   388
};
sawine@5
   389
sawine@5
   390
jQuery.extend({
sawine@5
   391
	noConflict: function( deep ) {
sawine@5
   392
		if ( window.$ === jQuery ) {
sawine@5
   393
			window.$ = _$;
sawine@5
   394
		}
sawine@5
   395
sawine@5
   396
		if ( deep && window.jQuery === jQuery ) {
sawine@5
   397
			window.jQuery = _jQuery;
sawine@5
   398
		}
sawine@5
   399
sawine@5
   400
		return jQuery;
sawine@5
   401
	},
sawine@5
   402
sawine@5
   403
	// Is the DOM ready to be used? Set to true once it occurs.
sawine@5
   404
	isReady: false,
sawine@5
   405
sawine@5
   406
	// A counter to track how many items to wait for before
sawine@5
   407
	// the ready event fires. See #6781
sawine@5
   408
	readyWait: 1,
sawine@5
   409
sawine@5
   410
	// Hold (or release) the ready event
sawine@5
   411
	holdReady: function( hold ) {
sawine@5
   412
		if ( hold ) {
sawine@5
   413
			jQuery.readyWait++;
sawine@5
   414
		} else {
sawine@5
   415
			jQuery.ready( true );
sawine@5
   416
		}
sawine@5
   417
	},
sawine@5
   418
sawine@5
   419
	// Handle when the DOM is ready
sawine@5
   420
	ready: function( wait ) {
sawine@5
   421
		// Either a released hold or an DOMready/load event and not yet ready
sawine@5
   422
		if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
sawine@5
   423
			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
sawine@5
   424
			if ( !document.body ) {
sawine@5
   425
				return setTimeout( jQuery.ready, 1 );
sawine@5
   426
			}
sawine@5
   427
sawine@5
   428
			// Remember that the DOM is ready
sawine@5
   429
			jQuery.isReady = true;
sawine@5
   430
sawine@5
   431
			// If a normal DOM Ready event fired, decrement, and wait if need be
sawine@5
   432
			if ( wait !== true && --jQuery.readyWait > 0 ) {
sawine@5
   433
				return;
sawine@5
   434
			}
sawine@5
   435
sawine@5
   436
			// If there are functions bound, to execute
sawine@5
   437
			readyList.resolveWith( document, [ jQuery ] );
sawine@5
   438
sawine@5
   439
			// Trigger any bound ready events
sawine@5
   440
			if ( jQuery.fn.trigger ) {
sawine@5
   441
				jQuery( document ).trigger( "ready" ).unbind( "ready" );
sawine@5
   442
			}
sawine@5
   443
		}
sawine@5
   444
	},
sawine@5
   445
sawine@5
   446
	bindReady: function() {
sawine@5
   447
		if ( readyList ) {
sawine@5
   448
			return;
sawine@5
   449
		}
sawine@5
   450
sawine@5
   451
		readyList = jQuery._Deferred();
sawine@5
   452
sawine@5
   453
		// Catch cases where $(document).ready() is called after the
sawine@5
   454
		// browser event has already occurred.
sawine@5
   455
		if ( document.readyState === "complete" ) {
sawine@5
   456
			// Handle it asynchronously to allow scripts the opportunity to delay ready
sawine@5
   457
			return setTimeout( jQuery.ready, 1 );
sawine@5
   458
		}
sawine@5
   459
sawine@5
   460
		// Mozilla, Opera and webkit nightlies currently support this event
sawine@5
   461
		if ( document.addEventListener ) {
sawine@5
   462
			// Use the handy event callback
sawine@5
   463
			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
sawine@5
   464
sawine@5
   465
			// A fallback to window.onload, that will always work
sawine@5
   466
			window.addEventListener( "load", jQuery.ready, false );
sawine@5
   467
sawine@5
   468
		// If IE event model is used
sawine@5
   469
		} else if ( document.attachEvent ) {
sawine@5
   470
			// ensure firing before onload,
sawine@5
   471
			// maybe late but safe also for iframes
sawine@5
   472
			document.attachEvent( "onreadystatechange", DOMContentLoaded );
sawine@5
   473
sawine@5
   474
			// A fallback to window.onload, that will always work
sawine@5
   475
			window.attachEvent( "onload", jQuery.ready );
sawine@5
   476
sawine@5
   477
			// If IE and not a frame
sawine@5
   478
			// continually check to see if the document is ready
sawine@5
   479
			var toplevel = false;
sawine@5
   480
sawine@5
   481
			try {
sawine@5
   482
				toplevel = window.frameElement == null;
sawine@5
   483
			} catch(e) {}
sawine@5
   484
sawine@5
   485
			if ( document.documentElement.doScroll && toplevel ) {
sawine@5
   486
				doScrollCheck();
sawine@5
   487
			}
sawine@5
   488
		}
sawine@5
   489
	},
sawine@5
   490
sawine@5
   491
	// See test/unit/core.js for details concerning isFunction.
sawine@5
   492
	// Since version 1.3, DOM methods and functions like alert
sawine@5
   493
	// aren't supported. They return false on IE (#2968).
sawine@5
   494
	isFunction: function( obj ) {
sawine@5
   495
		return jQuery.type(obj) === "function";
sawine@5
   496
	},
sawine@5
   497
sawine@5
   498
	isArray: Array.isArray || function( obj ) {
sawine@5
   499
		return jQuery.type(obj) === "array";
sawine@5
   500
	},
sawine@5
   501
sawine@5
   502
	// A crude way of determining if an object is a window
sawine@5
   503
	isWindow: function( obj ) {
sawine@5
   504
		return obj && typeof obj === "object" && "setInterval" in obj;
sawine@5
   505
	},
sawine@5
   506
sawine@5
   507
	isNaN: function( obj ) {
sawine@5
   508
		return obj == null || !rdigit.test( obj ) || isNaN( obj );
sawine@5
   509
	},
sawine@5
   510
sawine@5
   511
	type: function( obj ) {
sawine@5
   512
		return obj == null ?
sawine@5
   513
			String( obj ) :
sawine@5
   514
			class2type[ toString.call(obj) ] || "object";
sawine@5
   515
	},
sawine@5
   516
sawine@5
   517
	isPlainObject: function( obj ) {
sawine@5
   518
		// Must be an Object.
sawine@5
   519
		// Because of IE, we also have to check the presence of the constructor property.
sawine@5
   520
		// Make sure that DOM nodes and window objects don't pass through, as well
sawine@5
   521
		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
sawine@5
   522
			return false;
sawine@5
   523
		}
sawine@5
   524
sawine@5
   525
		try {
sawine@5
   526
			// Not own constructor property must be Object
sawine@5
   527
			if ( obj.constructor &&
sawine@5
   528
				!hasOwn.call(obj, "constructor") &&
sawine@5
   529
				!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
sawine@5
   530
				return false;
sawine@5
   531
			}
sawine@5
   532
		} catch ( e ) {
sawine@5
   533
			// IE8,9 Will throw exceptions on certain host objects #9897
sawine@5
   534
			return false;
sawine@5
   535
		}
sawine@5
   536
sawine@5
   537
		// Own properties are enumerated firstly, so to speed up,
sawine@5
   538
		// if last one is own, then all properties are own.
sawine@5
   539
sawine@5
   540
		var key;
sawine@5
   541
		for ( key in obj ) {}
sawine@5
   542
sawine@5
   543
		return key === undefined || hasOwn.call( obj, key );
sawine@5
   544
	},
sawine@5
   545
sawine@5
   546
	isEmptyObject: function( obj ) {
sawine@5
   547
		for ( var name in obj ) {
sawine@5
   548
			return false;
sawine@5
   549
		}
sawine@5
   550
		return true;
sawine@5
   551
	},
sawine@5
   552
sawine@5
   553
	error: function( msg ) {
sawine@5
   554
		throw msg;
sawine@5
   555
	},
sawine@5
   556
sawine@5
   557
	parseJSON: function( data ) {
sawine@5
   558
		if ( typeof data !== "string" || !data ) {
sawine@5
   559
			return null;
sawine@5
   560
		}
sawine@5
   561
sawine@5
   562
		// Make sure leading/trailing whitespace is removed (IE can't handle it)
sawine@5
   563
		data = jQuery.trim( data );
sawine@5
   564
sawine@5
   565
		// Attempt to parse using the native JSON parser first
sawine@5
   566
		if ( window.JSON && window.JSON.parse ) {
sawine@5
   567
			return window.JSON.parse( data );
sawine@5
   568
		}
sawine@5
   569
sawine@5
   570
		// Make sure the incoming data is actual JSON
sawine@5
   571
		// Logic borrowed from http://json.org/json2.js
sawine@5
   572
		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
sawine@5
   573
			.replace( rvalidtokens, "]" )
sawine@5
   574
			.replace( rvalidbraces, "")) ) {
sawine@5
   575
sawine@5
   576
			return (new Function( "return " + data ))();
sawine@5
   577
sawine@5
   578
		}
sawine@5
   579
		jQuery.error( "Invalid JSON: " + data );
sawine@5
   580
	},
sawine@5
   581
sawine@5
   582
	// Cross-browser xml parsing
sawine@5
   583
	parseXML: function( data ) {
sawine@5
   584
		var xml, tmp;
sawine@5
   585
		try {
sawine@5
   586
			if ( window.DOMParser ) { // Standard
sawine@5
   587
				tmp = new DOMParser();
sawine@5
   588
				xml = tmp.parseFromString( data , "text/xml" );
sawine@5
   589
			} else { // IE
sawine@5
   590
				xml = new ActiveXObject( "Microsoft.XMLDOM" );
sawine@5
   591
				xml.async = "false";
sawine@5
   592
				xml.loadXML( data );
sawine@5
   593
			}
sawine@5
   594
		} catch( e ) {
sawine@5
   595
			xml = undefined;
sawine@5
   596
		}
sawine@5
   597
		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
sawine@5
   598
			jQuery.error( "Invalid XML: " + data );
sawine@5
   599
		}
sawine@5
   600
		return xml;
sawine@5
   601
	},
sawine@5
   602
sawine@5
   603
	noop: function() {},
sawine@5
   604
sawine@5
   605
	// Evaluates a script in a global context
sawine@5
   606
	// Workarounds based on findings by Jim Driscoll
sawine@5
   607
	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
sawine@5
   608
	globalEval: function( data ) {
sawine@5
   609
		if ( data && rnotwhite.test( data ) ) {
sawine@5
   610
			// We use execScript on Internet Explorer
sawine@5
   611
			// We use an anonymous function so that context is window
sawine@5
   612
			// rather than jQuery in Firefox
sawine@5
   613
			( window.execScript || function( data ) {
sawine@5
   614
				window[ "eval" ].call( window, data );
sawine@5
   615
			} )( data );
sawine@5
   616
		}
sawine@5
   617
	},
sawine@5
   618
sawine@5
   619
	// Convert dashed to camelCase; used by the css and data modules
sawine@5
   620
	// Microsoft forgot to hump their vendor prefix (#9572)
sawine@5
   621
	camelCase: function( string ) {
sawine@5
   622
		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
sawine@5
   623
	},
sawine@5
   624
sawine@5
   625
	nodeName: function( elem, name ) {
sawine@5
   626
		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
sawine@5
   627
	},
sawine@5
   628
sawine@5
   629
	// args is for internal usage only
sawine@5
   630
	each: function( object, callback, args ) {
sawine@5
   631
		var name, i = 0,
sawine@5
   632
			length = object.length,
sawine@5
   633
			isObj = length === undefined || jQuery.isFunction( object );
sawine@5
   634
sawine@5
   635
		if ( args ) {
sawine@5
   636
			if ( isObj ) {
sawine@5
   637
				for ( name in object ) {
sawine@5
   638
					if ( callback.apply( object[ name ], args ) === false ) {
sawine@5
   639
						break;
sawine@5
   640
					}
sawine@5
   641
				}
sawine@5
   642
			} else {
sawine@5
   643
				for ( ; i < length; ) {
sawine@5
   644
					if ( callback.apply( object[ i++ ], args ) === false ) {
sawine@5
   645
						break;
sawine@5
   646
					}
sawine@5
   647
				}
sawine@5
   648
			}
sawine@5
   649
sawine@5
   650
		// A special, fast, case for the most common use of each
sawine@5
   651
		} else {
sawine@5
   652
			if ( isObj ) {
sawine@5
   653
				for ( name in object ) {
sawine@5
   654
					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
sawine@5
   655
						break;
sawine@5
   656
					}
sawine@5
   657
				}
sawine@5
   658
			} else {
sawine@5
   659
				for ( ; i < length; ) {
sawine@5
   660
					if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
sawine@5
   661
						break;
sawine@5
   662
					}
sawine@5
   663
				}
sawine@5
   664
			}
sawine@5
   665
		}
sawine@5
   666
sawine@5
   667
		return object;
sawine@5
   668
	},
sawine@5
   669
sawine@5
   670
	// Use native String.trim function wherever possible
sawine@5
   671
	trim: trim ?
sawine@5
   672
		function( text ) {
sawine@5
   673
			return text == null ?
sawine@5
   674
				"" :
sawine@5
   675
				trim.call( text );
sawine@5
   676
		} :
sawine@5
   677
sawine@5
   678
		// Otherwise use our own trimming functionality
sawine@5
   679
		function( text ) {
sawine@5
   680
			return text == null ?
sawine@5
   681
				"" :
sawine@5
   682
				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
sawine@5
   683
		},
sawine@5
   684
sawine@5
   685
	// results is for internal usage only
sawine@5
   686
	makeArray: function( array, results ) {
sawine@5
   687
		var ret = results || [];
sawine@5
   688
sawine@5
   689
		if ( array != null ) {
sawine@5
   690
			// The window, strings (and functions) also have 'length'
sawine@5
   691
			// The extra typeof function check is to prevent crashes
sawine@5
   692
			// in Safari 2 (See: #3039)
sawine@5
   693
			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
sawine@5
   694
			var type = jQuery.type( array );
sawine@5
   695
sawine@5
   696
			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
sawine@5
   697
				push.call( ret, array );
sawine@5
   698
			} else {
sawine@5
   699
				jQuery.merge( ret, array );
sawine@5
   700
			}
sawine@5
   701
		}
sawine@5
   702
sawine@5
   703
		return ret;
sawine@5
   704
	},
sawine@5
   705
sawine@5
   706
	inArray: function( elem, array ) {
sawine@5
   707
		if ( !array ) {
sawine@5
   708
			return -1;
sawine@5
   709
		}
sawine@5
   710
sawine@5
   711
		if ( indexOf ) {
sawine@5
   712
			return indexOf.call( array, elem );
sawine@5
   713
		}
sawine@5
   714
sawine@5
   715
		for ( var i = 0, length = array.length; i < length; i++ ) {
sawine@5
   716
			if ( array[ i ] === elem ) {
sawine@5
   717
				return i;
sawine@5
   718
			}
sawine@5
   719
		}
sawine@5
   720
sawine@5
   721
		return -1;
sawine@5
   722
	},
sawine@5
   723
sawine@5
   724
	merge: function( first, second ) {
sawine@5
   725
		var i = first.length,
sawine@5
   726
			j = 0;
sawine@5
   727
sawine@5
   728
		if ( typeof second.length === "number" ) {
sawine@5
   729
			for ( var l = second.length; j < l; j++ ) {
sawine@5
   730
				first[ i++ ] = second[ j ];
sawine@5
   731
			}
sawine@5
   732
sawine@5
   733
		} else {
sawine@5
   734
			while ( second[j] !== undefined ) {
sawine@5
   735
				first[ i++ ] = second[ j++ ];
sawine@5
   736
			}
sawine@5
   737
		}
sawine@5
   738
sawine@5
   739
		first.length = i;
sawine@5
   740
sawine@5
   741
		return first;
sawine@5
   742
	},
sawine@5
   743
sawine@5
   744
	grep: function( elems, callback, inv ) {
sawine@5
   745
		var ret = [], retVal;
sawine@5
   746
		inv = !!inv;
sawine@5
   747
sawine@5
   748
		// Go through the array, only saving the items
sawine@5
   749
		// that pass the validator function
sawine@5
   750
		for ( var i = 0, length = elems.length; i < length; i++ ) {
sawine@5
   751
			retVal = !!callback( elems[ i ], i );
sawine@5
   752
			if ( inv !== retVal ) {
sawine@5
   753
				ret.push( elems[ i ] );
sawine@5
   754
			}
sawine@5
   755
		}
sawine@5
   756
sawine@5
   757
		return ret;
sawine@5
   758
	},
sawine@5
   759
sawine@5
   760
	// arg is for internal usage only
sawine@5
   761
	map: function( elems, callback, arg ) {
sawine@5
   762
		var value, key, ret = [],
sawine@5
   763
			i = 0,
sawine@5
   764
			length = elems.length,
sawine@5
   765
			// jquery objects are treated as arrays
sawine@5
   766
			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
sawine@5
   767
sawine@5
   768
		// Go through the array, translating each of the items to their
sawine@5
   769
		if ( isArray ) {
sawine@5
   770
			for ( ; i < length; i++ ) {
sawine@5
   771
				value = callback( elems[ i ], i, arg );
sawine@5
   772
sawine@5
   773
				if ( value != null ) {
sawine@5
   774
					ret[ ret.length ] = value;
sawine@5
   775
				}
sawine@5
   776
			}
sawine@5
   777
sawine@5
   778
		// Go through every key on the object,
sawine@5
   779
		} else {
sawine@5
   780
			for ( key in elems ) {
sawine@5
   781
				value = callback( elems[ key ], key, arg );
sawine@5
   782
sawine@5
   783
				if ( value != null ) {
sawine@5
   784
					ret[ ret.length ] = value;
sawine@5
   785
				}
sawine@5
   786
			}
sawine@5
   787
		}
sawine@5
   788
sawine@5
   789
		// Flatten any nested arrays
sawine@5
   790
		return ret.concat.apply( [], ret );
sawine@5
   791
	},
sawine@5
   792
sawine@5
   793
	// A global GUID counter for objects
sawine@5
   794
	guid: 1,
sawine@5
   795
sawine@5
   796
	// Bind a function to a context, optionally partially applying any
sawine@5
   797
	// arguments.
sawine@5
   798
	proxy: function( fn, context ) {
sawine@5
   799
		if ( typeof context === "string" ) {
sawine@5
   800
			var tmp = fn[ context ];
sawine@5
   801
			context = fn;
sawine@5
   802
			fn = tmp;
sawine@5
   803
		}
sawine@5
   804
sawine@5
   805
		// Quick check to determine if target is callable, in the spec
sawine@5
   806
		// this throws a TypeError, but we will just return undefined.
sawine@5
   807
		if ( !jQuery.isFunction( fn ) ) {
sawine@5
   808
			return undefined;
sawine@5
   809
		}
sawine@5
   810
sawine@5
   811
		// Simulated bind
sawine@5
   812
		var args = slice.call( arguments, 2 ),
sawine@5
   813
			proxy = function() {
sawine@5
   814
				return fn.apply( context, args.concat( slice.call( arguments ) ) );
sawine@5
   815
			};
sawine@5
   816
sawine@5
   817
		// Set the guid of unique handler to the same of original handler, so it can be removed
sawine@5
   818
		proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
sawine@5
   819
sawine@5
   820
		return proxy;
sawine@5
   821
	},
sawine@5
   822
sawine@5
   823
	// Mutifunctional method to get and set values to a collection
sawine@5
   824
	// The value/s can optionally be executed if it's a function
sawine@5
   825
	access: function( elems, key, value, exec, fn, pass ) {
sawine@5
   826
		var length = elems.length;
sawine@5
   827
sawine@5
   828
		// Setting many attributes
sawine@5
   829
		if ( typeof key === "object" ) {
sawine@5
   830
			for ( var k in key ) {
sawine@5
   831
				jQuery.access( elems, k, key[k], exec, fn, value );
sawine@5
   832
			}
sawine@5
   833
			return elems;
sawine@5
   834
		}
sawine@5
   835
sawine@5
   836
		// Setting one attribute
sawine@5
   837
		if ( value !== undefined ) {
sawine@5
   838
			// Optionally, function values get executed if exec is true
sawine@5
   839
			exec = !pass && exec && jQuery.isFunction(value);
sawine@5
   840
sawine@5
   841
			for ( var i = 0; i < length; i++ ) {
sawine@5
   842
				fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
sawine@5
   843
			}
sawine@5
   844
sawine@5
   845
			return elems;
sawine@5
   846
		}
sawine@5
   847
sawine@5
   848
		// Getting an attribute
sawine@5
   849
		return length ? fn( elems[0], key ) : undefined;
sawine@5
   850
	},
sawine@5
   851
sawine@5
   852
	now: function() {
sawine@5
   853
		return (new Date()).getTime();
sawine@5
   854
	},
sawine@5
   855
sawine@5
   856
	// Use of jQuery.browser is frowned upon.
sawine@5
   857
	// More details: http://docs.jquery.com/Utilities/jQuery.browser
sawine@5
   858
	uaMatch: function( ua ) {
sawine@5
   859
		ua = ua.toLowerCase();
sawine@5
   860
sawine@5
   861
		var match = rwebkit.exec( ua ) ||
sawine@5
   862
			ropera.exec( ua ) ||
sawine@5
   863
			rmsie.exec( ua ) ||
sawine@5
   864
			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
sawine@5
   865
			[];
sawine@5
   866
sawine@5
   867
		return { browser: match[1] || "", version: match[2] || "0" };
sawine@5
   868
	},
sawine@5
   869
sawine@5
   870
	sub: function() {
sawine@5
   871
		function jQuerySub( selector, context ) {
sawine@5
   872
			return new jQuerySub.fn.init( selector, context );
sawine@5
   873
		}
sawine@5
   874
		jQuery.extend( true, jQuerySub, this );
sawine@5
   875
		jQuerySub.superclass = this;
sawine@5
   876
		jQuerySub.fn = jQuerySub.prototype = this();
sawine@5
   877
		jQuerySub.fn.constructor = jQuerySub;
sawine@5
   878
		jQuerySub.sub = this.sub;
sawine@5
   879
		jQuerySub.fn.init = function init( selector, context ) {
sawine@5
   880
			if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
sawine@5
   881
				context = jQuerySub( context );
sawine@5
   882
			}
sawine@5
   883
sawine@5
   884
			return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
sawine@5
   885
		};
sawine@5
   886
		jQuerySub.fn.init.prototype = jQuerySub.fn;
sawine@5
   887
		var rootjQuerySub = jQuerySub(document);
sawine@5
   888
		return jQuerySub;
sawine@5
   889
	},
sawine@5
   890
sawine@5
   891
	browser: {}
sawine@5
   892
});
sawine@5
   893
sawine@5
   894
// Populate the class2type map
sawine@5
   895
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
sawine@5
   896
	class2type[ "[object " + name + "]" ] = name.toLowerCase();
sawine@5
   897
});
sawine@5
   898
sawine@5
   899
browserMatch = jQuery.uaMatch( userAgent );
sawine@5
   900
if ( browserMatch.browser ) {
sawine@5
   901
	jQuery.browser[ browserMatch.browser ] = true;
sawine@5
   902
	jQuery.browser.version = browserMatch.version;
sawine@5
   903
}
sawine@5
   904
sawine@5
   905
// Deprecated, use jQuery.browser.webkit instead
sawine@5
   906
if ( jQuery.browser.webkit ) {
sawine@5
   907
	jQuery.browser.safari = true;
sawine@5
   908
}
sawine@5
   909
sawine@5
   910
// IE doesn't match non-breaking spaces with \s
sawine@5
   911
if ( rnotwhite.test( "\xA0" ) ) {
sawine@5
   912
	trimLeft = /^[\s\xA0]+/;
sawine@5
   913
	trimRight = /[\s\xA0]+$/;
sawine@5
   914
}
sawine@5
   915
sawine@5
   916
// All jQuery objects should point back to these
sawine@5
   917
rootjQuery = jQuery(document);
sawine@5
   918
sawine@5
   919
// Cleanup functions for the document ready method
sawine@5
   920
if ( document.addEventListener ) {
sawine@5
   921
	DOMContentLoaded = function() {
sawine@5
   922
		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
sawine@5
   923
		jQuery.ready();
sawine@5
   924
	};
sawine@5
   925
sawine@5
   926
} else if ( document.attachEvent ) {
sawine@5
   927
	DOMContentLoaded = function() {
sawine@5
   928
		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
sawine@5
   929
		if ( document.readyState === "complete" ) {
sawine@5
   930
			document.detachEvent( "onreadystatechange", DOMContentLoaded );
sawine@5
   931
			jQuery.ready();
sawine@5
   932
		}
sawine@5
   933
	};
sawine@5
   934
}
sawine@5
   935
sawine@5
   936
// The DOM ready check for Internet Explorer
sawine@5
   937
function doScrollCheck() {
sawine@5
   938
	if ( jQuery.isReady ) {
sawine@5
   939
		return;
sawine@5
   940
	}
sawine@5
   941
sawine@5
   942
	try {
sawine@5
   943
		// If IE is used, use the trick by Diego Perini
sawine@5
   944
		// http://javascript.nwbox.com/IEContentLoaded/
sawine@5
   945
		document.documentElement.doScroll("left");
sawine@5
   946
	} catch(e) {
sawine@5
   947
		setTimeout( doScrollCheck, 1 );
sawine@5
   948
		return;
sawine@5
   949
	}
sawine@5
   950
sawine@5
   951
	// and execute any waiting functions
sawine@5
   952
	jQuery.ready();
sawine@5
   953
}
sawine@5
   954
sawine@5
   955
return jQuery;
sawine@5
   956
sawine@5
   957
})();
sawine@5
   958
sawine@5
   959
sawine@5
   960
var // Promise methods
sawine@5
   961
	promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ),
sawine@5
   962
	// Static reference to slice
sawine@5
   963
	sliceDeferred = [].slice;
sawine@5
   964
sawine@5
   965
jQuery.extend({
sawine@5
   966
	// Create a simple deferred (one callbacks list)
sawine@5
   967
	_Deferred: function() {
sawine@5
   968
		var // callbacks list
sawine@5
   969
			callbacks = [],
sawine@5
   970
			// stored [ context , args ]
sawine@5
   971
			fired,
sawine@5
   972
			// to avoid firing when already doing so
sawine@5
   973
			firing,
sawine@5
   974
			// flag to know if the deferred has been cancelled
sawine@5
   975
			cancelled,
sawine@5
   976
			// the deferred itself
sawine@5
   977
			deferred  = {
sawine@5
   978
sawine@5
   979
				// done( f1, f2, ...)
sawine@5
   980
				done: function() {
sawine@5
   981
					if ( !cancelled ) {
sawine@5
   982
						var args = arguments,
sawine@5
   983
							i,
sawine@5
   984
							length,
sawine@5
   985
							elem,
sawine@5
   986
							type,
sawine@5
   987
							_fired;
sawine@5
   988
						if ( fired ) {
sawine@5
   989
							_fired = fired;
sawine@5
   990
							fired = 0;
sawine@5
   991
						}
sawine@5
   992
						for ( i = 0, length = args.length; i < length; i++ ) {
sawine@5
   993
							elem = args[ i ];
sawine@5
   994
							type = jQuery.type( elem );
sawine@5
   995
							if ( type === "array" ) {
sawine@5
   996
								deferred.done.apply( deferred, elem );
sawine@5
   997
							} else if ( type === "function" ) {
sawine@5
   998
								callbacks.push( elem );
sawine@5
   999
							}
sawine@5
  1000
						}
sawine@5
  1001
						if ( _fired ) {
sawine@5
  1002
							deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
sawine@5
  1003
						}
sawine@5
  1004
					}
sawine@5
  1005
					return this;
sawine@5
  1006
				},
sawine@5
  1007
sawine@5
  1008
				// resolve with given context and args
sawine@5
  1009
				resolveWith: function( context, args ) {
sawine@5
  1010
					if ( !cancelled && !fired && !firing ) {
sawine@5
  1011
						// make sure args are available (#8421)
sawine@5
  1012
						args = args || [];
sawine@5
  1013
						firing = 1;
sawine@5
  1014
						try {
sawine@5
  1015
							while( callbacks[ 0 ] ) {
sawine@5
  1016
								callbacks.shift().apply( context, args );
sawine@5
  1017
							}
sawine@5
  1018
						}
sawine@5
  1019
						finally {
sawine@5
  1020
							fired = [ context, args ];
sawine@5
  1021
							firing = 0;
sawine@5
  1022
						}
sawine@5
  1023
					}
sawine@5
  1024
					return this;
sawine@5
  1025
				},
sawine@5
  1026
sawine@5
  1027
				// resolve with this as context and given arguments
sawine@5
  1028
				resolve: function() {
sawine@5
  1029
					deferred.resolveWith( this, arguments );
sawine@5
  1030
					return this;
sawine@5
  1031
				},
sawine@5
  1032
sawine@5
  1033
				// Has this deferred been resolved?
sawine@5
  1034
				isResolved: function() {
sawine@5
  1035
					return !!( firing || fired );
sawine@5
  1036
				},
sawine@5
  1037
sawine@5
  1038
				// Cancel
sawine@5
  1039
				cancel: function() {
sawine@5
  1040
					cancelled = 1;
sawine@5
  1041
					callbacks = [];
sawine@5
  1042
					return this;
sawine@5
  1043
				}
sawine@5
  1044
			};
sawine@5
  1045
sawine@5
  1046
		return deferred;
sawine@5
  1047
	},
sawine@5
  1048
sawine@5
  1049
	// Full fledged deferred (two callbacks list)
sawine@5
  1050
	Deferred: function( func ) {
sawine@5
  1051
		var deferred = jQuery._Deferred(),
sawine@5
  1052
			failDeferred = jQuery._Deferred(),
sawine@5
  1053
			promise;
sawine@5
  1054
		// Add errorDeferred methods, then and promise
sawine@5
  1055
		jQuery.extend( deferred, {
sawine@5
  1056
			then: function( doneCallbacks, failCallbacks ) {
sawine@5
  1057
				deferred.done( doneCallbacks ).fail( failCallbacks );
sawine@5
  1058
				return this;
sawine@5
  1059
			},
sawine@5
  1060
			always: function() {
sawine@5
  1061
				return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments );
sawine@5
  1062
			},
sawine@5
  1063
			fail: failDeferred.done,
sawine@5
  1064
			rejectWith: failDeferred.resolveWith,
sawine@5
  1065
			reject: failDeferred.resolve,
sawine@5
  1066
			isRejected: failDeferred.isResolved,
sawine@5
  1067
			pipe: function( fnDone, fnFail ) {
sawine@5
  1068
				return jQuery.Deferred(function( newDefer ) {
sawine@5
  1069
					jQuery.each( {
sawine@5
  1070
						done: [ fnDone, "resolve" ],
sawine@5
  1071
						fail: [ fnFail, "reject" ]
sawine@5
  1072
					}, function( handler, data ) {
sawine@5
  1073
						var fn = data[ 0 ],
sawine@5
  1074
							action = data[ 1 ],
sawine@5
  1075
							returned;
sawine@5
  1076
						if ( jQuery.isFunction( fn ) ) {
sawine@5
  1077
							deferred[ handler ](function() {
sawine@5
  1078
								returned = fn.apply( this, arguments );
sawine@5
  1079
								if ( returned && jQuery.isFunction( returned.promise ) ) {
sawine@5
  1080
									returned.promise().then( newDefer.resolve, newDefer.reject );
sawine@5
  1081
								} else {
sawine@5
  1082
									newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
sawine@5
  1083
								}
sawine@5
  1084
							});
sawine@5
  1085
						} else {
sawine@5
  1086
							deferred[ handler ]( newDefer[ action ] );
sawine@5
  1087
						}
sawine@5
  1088
					});
sawine@5
  1089
				}).promise();
sawine@5
  1090
			},
sawine@5
  1091
			// Get a promise for this deferred
sawine@5
  1092
			// If obj is provided, the promise aspect is added to the object
sawine@5
  1093
			promise: function( obj ) {
sawine@5
  1094
				if ( obj == null ) {
sawine@5
  1095
					if ( promise ) {
sawine@5
  1096
						return promise;
sawine@5
  1097
					}
sawine@5
  1098
					promise = obj = {};
sawine@5
  1099
				}
sawine@5
  1100
				var i = promiseMethods.length;
sawine@5
  1101
				while( i-- ) {
sawine@5
  1102
					obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
sawine@5
  1103
				}
sawine@5
  1104
				return obj;
sawine@5
  1105
			}
sawine@5
  1106
		});
sawine@5
  1107
		// Make sure only one callback list will be used
sawine@5
  1108
		deferred.done( failDeferred.cancel ).fail( deferred.cancel );
sawine@5
  1109
		// Unexpose cancel
sawine@5
  1110
		delete deferred.cancel;
sawine@5
  1111
		// Call given func if any
sawine@5
  1112
		if ( func ) {
sawine@5
  1113
			func.call( deferred, deferred );
sawine@5
  1114
		}
sawine@5
  1115
		return deferred;
sawine@5
  1116
	},
sawine@5
  1117
sawine@5
  1118
	// Deferred helper
sawine@5
  1119
	when: function( firstParam ) {
sawine@5
  1120
		var args = arguments,
sawine@5
  1121
			i = 0,
sawine@5
  1122
			length = args.length,
sawine@5
  1123
			count = length,
sawine@5
  1124
			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
sawine@5
  1125
				firstParam :
sawine@5
  1126
				jQuery.Deferred();
sawine@5
  1127
		function resolveFunc( i ) {
sawine@5
  1128
			return function( value ) {
sawine@5
  1129
				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
sawine@5
  1130
				if ( !( --count ) ) {
sawine@5
  1131
					// Strange bug in FF4:
sawine@5
  1132
					// Values changed onto the arguments object sometimes end up as undefined values
sawine@5
  1133
					// outside the $.when method. Cloning the object into a fresh array solves the issue
sawine@5
  1134
					deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) );
sawine@5
  1135
				}
sawine@5
  1136
			};
sawine@5
  1137
		}
sawine@5
  1138
		if ( length > 1 ) {
sawine@5
  1139
			for( ; i < length; i++ ) {
sawine@5
  1140
				if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) {
sawine@5
  1141
					args[ i ].promise().then( resolveFunc(i), deferred.reject );
sawine@5
  1142
				} else {
sawine@5
  1143
					--count;
sawine@5
  1144
				}
sawine@5
  1145
			}
sawine@5
  1146
			if ( !count ) {
sawine@5
  1147
				deferred.resolveWith( deferred, args );
sawine@5
  1148
			}
sawine@5
  1149
		} else if ( deferred !== firstParam ) {
sawine@5
  1150
			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
sawine@5
  1151
		}
sawine@5
  1152
		return deferred.promise();
sawine@5
  1153
	}
sawine@5
  1154
});
sawine@5
  1155
sawine@5
  1156
sawine@5
  1157
sawine@5
  1158
jQuery.support = (function() {
sawine@5
  1159
sawine@5
  1160
	var div = document.createElement( "div" ),
sawine@5
  1161
		documentElement = document.documentElement,
sawine@5
  1162
		all,
sawine@5
  1163
		a,
sawine@5
  1164
		select,
sawine@5
  1165
		opt,
sawine@5
  1166
		input,
sawine@5
  1167
		marginDiv,
sawine@5
  1168
		support,
sawine@5
  1169
		fragment,
sawine@5
  1170
		body,
sawine@5
  1171
		testElementParent,
sawine@5
  1172
		testElement,
sawine@5
  1173
		testElementStyle,
sawine@5
  1174
		tds,
sawine@5
  1175
		events,
sawine@5
  1176
		eventName,
sawine@5
  1177
		i,
sawine@5
  1178
		isSupported;
sawine@5
  1179
sawine@5
  1180
	// Preliminary tests
sawine@5
  1181
	div.setAttribute("className", "t");
sawine@5
  1182
	div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
sawine@5
  1183
sawine@5
  1184
sawine@5
  1185
	all = div.getElementsByTagName( "*" );
sawine@5
  1186
	a = div.getElementsByTagName( "a" )[ 0 ];
sawine@5
  1187
sawine@5
  1188
	// Can't get basic test support
sawine@5
  1189
	if ( !all || !all.length || !a ) {
sawine@5
  1190
		return {};
sawine@5
  1191
	}
sawine@5
  1192
sawine@5
  1193
	// First batch of supports tests
sawine@5
  1194
	select = document.createElement( "select" );
sawine@5
  1195
	opt = select.appendChild( document.createElement("option") );
sawine@5
  1196
	input = div.getElementsByTagName( "input" )[ 0 ];
sawine@5
  1197
sawine@5
  1198
	support = {
sawine@5
  1199
		// IE strips leading whitespace when .innerHTML is used
sawine@5
  1200
		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
sawine@5
  1201
sawine@5
  1202
		// Make sure that tbody elements aren't automatically inserted
sawine@5
  1203
		// IE will insert them into empty tables
sawine@5
  1204
		tbody: !div.getElementsByTagName( "tbody" ).length,
sawine@5
  1205
sawine@5
  1206
		// Make sure that link elements get serialized correctly by innerHTML
sawine@5
  1207
		// This requires a wrapper element in IE
sawine@5
  1208
		htmlSerialize: !!div.getElementsByTagName( "link" ).length,
sawine@5
  1209
sawine@5
  1210
		// Get the style information from getAttribute
sawine@5
  1211
		// (IE uses .cssText instead)
sawine@5
  1212
		style: /top/.test( a.getAttribute("style") ),
sawine@5
  1213
sawine@5
  1214
		// Make sure that URLs aren't manipulated
sawine@5
  1215
		// (IE normalizes it by default)
sawine@5
  1216
		hrefNormalized: ( a.getAttribute( "href" ) === "/a" ),
sawine@5
  1217
sawine@5
  1218
		// Make sure that element opacity exists
sawine@5
  1219
		// (IE uses filter instead)
sawine@5
  1220
		// Use a regex to work around a WebKit issue. See #5145
sawine@5
  1221
		opacity: /^0.55$/.test( a.style.opacity ),
sawine@5
  1222
sawine@5
  1223
		// Verify style float existence
sawine@5
  1224
		// (IE uses styleFloat instead of cssFloat)
sawine@5
  1225
		cssFloat: !!a.style.cssFloat,
sawine@5
  1226
sawine@5
  1227
		// Make sure that if no value is specified for a checkbox
sawine@5
  1228
		// that it defaults to "on".
sawine@5
  1229
		// (WebKit defaults to "" instead)
sawine@5
  1230
		checkOn: ( input.value === "on" ),
sawine@5
  1231
sawine@5
  1232
		// Make sure that a selected-by-default option has a working selected property.
sawine@5
  1233
		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
sawine@5
  1234
		optSelected: opt.selected,
sawine@5
  1235
sawine@5
  1236
		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
sawine@5
  1237
		getSetAttribute: div.className !== "t",
sawine@5
  1238
sawine@5
  1239
		// Will be defined later
sawine@5
  1240
		submitBubbles: true,
sawine@5
  1241
		changeBubbles: true,
sawine@5
  1242
		focusinBubbles: false,
sawine@5
  1243
		deleteExpando: true,
sawine@5
  1244
		noCloneEvent: true,
sawine@5
  1245
		inlineBlockNeedsLayout: false,
sawine@5
  1246
		shrinkWrapBlocks: false,
sawine@5
  1247
		reliableMarginRight: true
sawine@5
  1248
	};
sawine@5
  1249
sawine@5
  1250
	// Make sure checked status is properly cloned
sawine@5
  1251
	input.checked = true;
sawine@5
  1252
	support.noCloneChecked = input.cloneNode( true ).checked;
sawine@5
  1253
sawine@5
  1254
	// Make sure that the options inside disabled selects aren't marked as disabled
sawine@5
  1255
	// (WebKit marks them as disabled)
sawine@5
  1256
	select.disabled = true;
sawine@5
  1257
	support.optDisabled = !opt.disabled;
sawine@5
  1258
sawine@5
  1259
	// Test to see if it's possible to delete an expando from an element
sawine@5
  1260
	// Fails in Internet Explorer
sawine@5
  1261
	try {
sawine@5
  1262
		delete div.test;
sawine@5
  1263
	} catch( e ) {
sawine@5
  1264
		support.deleteExpando = false;
sawine@5
  1265
	}
sawine@5
  1266
sawine@5
  1267
	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
sawine@5
  1268
		div.attachEvent( "onclick", function() {
sawine@5
  1269
			// Cloning a node shouldn't copy over any
sawine@5
  1270
			// bound event handlers (IE does this)
sawine@5
  1271
			support.noCloneEvent = false;
sawine@5
  1272
		});
sawine@5
  1273
		div.cloneNode( true ).fireEvent( "onclick" );
sawine@5
  1274
	}
sawine@5
  1275
sawine@5
  1276
	// Check if a radio maintains it's value
sawine@5
  1277
	// after being appended to the DOM
sawine@5
  1278
	input = document.createElement("input");
sawine@5
  1279
	input.value = "t";
sawine@5
  1280
	input.setAttribute("type", "radio");
sawine@5
  1281
	support.radioValue = input.value === "t";
sawine@5
  1282
sawine@5
  1283
	input.setAttribute("checked", "checked");
sawine@5
  1284
	div.appendChild( input );
sawine@5
  1285
	fragment = document.createDocumentFragment();
sawine@5
  1286
	fragment.appendChild( div.firstChild );
sawine@5
  1287
sawine@5
  1288
	// WebKit doesn't clone checked state correctly in fragments
sawine@5
  1289
	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
sawine@5
  1290
sawine@5
  1291
	div.innerHTML = "";
sawine@5
  1292
sawine@5
  1293
	// Figure out if the W3C box model works as expected
sawine@5
  1294
	div.style.width = div.style.paddingLeft = "1px";
sawine@5
  1295
sawine@5
  1296
	body = document.getElementsByTagName( "body" )[ 0 ];
sawine@5
  1297
	// We use our own, invisible, body unless the body is already present
sawine@5
  1298
	// in which case we use a div (#9239)
sawine@5
  1299
	testElement = document.createElement( body ? "div" : "body" );
sawine@5
  1300
	testElementStyle = {
sawine@5
  1301
		visibility: "hidden",
sawine@5
  1302
		width: 0,
sawine@5
  1303
		height: 0,
sawine@5
  1304
		border: 0,
sawine@5
  1305
		margin: 0,
sawine@5
  1306
		background: "none"
sawine@5
  1307
	};
sawine@5
  1308
	if ( body ) {
sawine@5
  1309
		jQuery.extend( testElementStyle, {
sawine@5
  1310
			position: "absolute",
sawine@5
  1311
			left: "-1000px",
sawine@5
  1312
			top: "-1000px"
sawine@5
  1313
		});
sawine@5
  1314
	}
sawine@5
  1315
	for ( i in testElementStyle ) {
sawine@5
  1316
		testElement.style[ i ] = testElementStyle[ i ];
sawine@5
  1317
	}
sawine@5
  1318
	testElement.appendChild( div );
sawine@5
  1319
	testElementParent = body || documentElement;
sawine@5
  1320
	testElementParent.insertBefore( testElement, testElementParent.firstChild );
sawine@5
  1321
sawine@5
  1322
	// Check if a disconnected checkbox will retain its checked
sawine@5
  1323
	// value of true after appended to the DOM (IE6/7)
sawine@5
  1324
	support.appendChecked = input.checked;
sawine@5
  1325
sawine@5
  1326
	support.boxModel = div.offsetWidth === 2;
sawine@5
  1327
sawine@5
  1328
	if ( "zoom" in div.style ) {
sawine@5
  1329
		// Check if natively block-level elements act like inline-block
sawine@5
  1330
		// elements when setting their display to 'inline' and giving
sawine@5
  1331
		// them layout
sawine@5
  1332
		// (IE < 8 does this)
sawine@5
  1333
		div.style.display = "inline";
sawine@5
  1334
		div.style.zoom = 1;
sawine@5
  1335
		support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
sawine@5
  1336
sawine@5
  1337
		// Check if elements with layout shrink-wrap their children
sawine@5
  1338
		// (IE 6 does this)
sawine@5
  1339
		div.style.display = "";
sawine@5
  1340
		div.innerHTML = "<div style='width:4px;'></div>";
sawine@5
  1341
		support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
sawine@5
  1342
	}
sawine@5
  1343
sawine@5
  1344
	div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
sawine@5
  1345
	tds = div.getElementsByTagName( "td" );
sawine@5
  1346
sawine@5
  1347
	// Check if table cells still have offsetWidth/Height when they are set
sawine@5
  1348
	// to display:none and there are still other visible table cells in a
sawine@5
  1349
	// table row; if so, offsetWidth/Height are not reliable for use when
sawine@5
  1350
	// determining if an element has been hidden directly using
sawine@5
  1351
	// display:none (it is still safe to use offsets if a parent element is
sawine@5
  1352
	// hidden; don safety goggles and see bug #4512 for more information).
sawine@5
  1353
	// (only IE 8 fails this test)
sawine@5
  1354
	isSupported = ( tds[ 0 ].offsetHeight === 0 );
sawine@5
  1355
sawine@5
  1356
	tds[ 0 ].style.display = "";
sawine@5
  1357
	tds[ 1 ].style.display = "none";
sawine@5
  1358
sawine@5
  1359
	// Check if empty table cells still have offsetWidth/Height
sawine@5
  1360
	// (IE < 8 fail this test)
sawine@5
  1361
	support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
sawine@5
  1362
	div.innerHTML = "";
sawine@5
  1363
sawine@5
  1364
	// Check if div with explicit width and no margin-right incorrectly
sawine@5
  1365
	// gets computed margin-right based on width of container. For more
sawine@5
  1366
	// info see bug #3333
sawine@5
  1367
	// Fails in WebKit before Feb 2011 nightlies
sawine@5
  1368
	// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
sawine@5
  1369
	if ( document.defaultView && document.defaultView.getComputedStyle ) {
sawine@5
  1370
		marginDiv = document.createElement( "div" );
sawine@5
  1371
		marginDiv.style.width = "0";
sawine@5
  1372
		marginDiv.style.marginRight = "0";
sawine@5
  1373
		div.appendChild( marginDiv );
sawine@5
  1374
		support.reliableMarginRight =
sawine@5
  1375
			( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
sawine@5
  1376
	}
sawine@5
  1377
sawine@5
  1378
	// Remove the body element we added
sawine@5
  1379
	testElement.innerHTML = "";
sawine@5
  1380
	testElementParent.removeChild( testElement );
sawine@5
  1381
sawine@5
  1382
	// Technique from Juriy Zaytsev
sawine@5
  1383
	// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
sawine@5
  1384
	// We only care about the case where non-standard event systems
sawine@5
  1385
	// are used, namely in IE. Short-circuiting here helps us to
sawine@5
  1386
	// avoid an eval call (in setAttribute) which can cause CSP
sawine@5
  1387
	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
sawine@5
  1388
	if ( div.attachEvent ) {
sawine@5
  1389
		for( i in {
sawine@5
  1390
			submit: 1,
sawine@5
  1391
			change: 1,
sawine@5
  1392
			focusin: 1
sawine@5
  1393
		} ) {
sawine@5
  1394
			eventName = "on" + i;
sawine@5
  1395
			isSupported = ( eventName in div );
sawine@5
  1396
			if ( !isSupported ) {
sawine@5
  1397
				div.setAttribute( eventName, "return;" );
sawine@5
  1398
				isSupported = ( typeof div[ eventName ] === "function" );
sawine@5
  1399
			}
sawine@5
  1400
			support[ i + "Bubbles" ] = isSupported;
sawine@5
  1401
		}
sawine@5
  1402
	}
sawine@5
  1403
sawine@5
  1404
	// Null connected elements to avoid leaks in IE
sawine@5
  1405
	testElement = fragment = select = opt = body = marginDiv = div = input = null;
sawine@5
  1406
sawine@5
  1407
	return support;
sawine@5
  1408
})();
sawine@5
  1409
sawine@5
  1410
// Keep track of boxModel
sawine@5
  1411
jQuery.boxModel = jQuery.support.boxModel;
sawine@5
  1412
sawine@5
  1413
sawine@5
  1414
sawine@5
  1415
sawine@5
  1416
var rbrace = /^(?:\{.*\}|\[.*\])$/,
sawine@5
  1417
	rmultiDash = /([A-Z])/g;
sawine@5
  1418
sawine@5
  1419
jQuery.extend({
sawine@5
  1420
	cache: {},
sawine@5
  1421
sawine@5
  1422
	// Please use with caution
sawine@5
  1423
	uuid: 0,
sawine@5
  1424
sawine@5
  1425
	// Unique for each copy of jQuery on the page
sawine@5
  1426
	// Non-digits removed to match rinlinejQuery
sawine@5
  1427
	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
sawine@5
  1428
sawine@5
  1429
	// The following elements throw uncatchable exceptions if you
sawine@5
  1430
	// attempt to add expando properties to them.
sawine@5
  1431
	noData: {
sawine@5
  1432
		"embed": true,
sawine@5
  1433
		// Ban all objects except for Flash (which handle expandos)
sawine@5
  1434
		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
sawine@5
  1435
		"applet": true
sawine@5
  1436
	},
sawine@5
  1437
sawine@5
  1438
	hasData: function( elem ) {
sawine@5
  1439
		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
sawine@5
  1440
sawine@5
  1441
		return !!elem && !isEmptyDataObject( elem );
sawine@5
  1442
	},
sawine@5
  1443
sawine@5
  1444
	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
sawine@5
  1445
		if ( !jQuery.acceptData( elem ) ) {
sawine@5
  1446
			return;
sawine@5
  1447
		}
sawine@5
  1448
sawine@5
  1449
		var thisCache, ret,
sawine@5
  1450
			internalKey = jQuery.expando,
sawine@5
  1451
			getByName = typeof name === "string",
sawine@5
  1452
sawine@5
  1453
			// We have to handle DOM nodes and JS objects differently because IE6-7
sawine@5
  1454
			// can't GC object references properly across the DOM-JS boundary
sawine@5
  1455
			isNode = elem.nodeType,
sawine@5
  1456
sawine@5
  1457
			// Only DOM nodes need the global jQuery cache; JS object data is
sawine@5
  1458
			// attached directly to the object so GC can occur automatically
sawine@5
  1459
			cache = isNode ? jQuery.cache : elem,
sawine@5
  1460
sawine@5
  1461
			// Only defining an ID for JS objects if its cache already exists allows
sawine@5
  1462
			// the code to shortcut on the same path as a DOM node with no cache
sawine@5
  1463
			id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
sawine@5
  1464
sawine@5
  1465
		// Avoid doing any more work than we need to when trying to get data on an
sawine@5
  1466
		// object that has no data at all
sawine@5
  1467
		if ( (!id || (pvt && id && (cache[ id ] && !cache[ id ][ internalKey ]))) && getByName && data === undefined ) {
sawine@5
  1468
			return;
sawine@5
  1469
		}
sawine@5
  1470
sawine@5
  1471
		if ( !id ) {
sawine@5
  1472
			// Only DOM nodes need a new unique ID for each element since their data
sawine@5
  1473
			// ends up in the global cache
sawine@5
  1474
			if ( isNode ) {
sawine@5
  1475
				elem[ jQuery.expando ] = id = ++jQuery.uuid;
sawine@5
  1476
			} else {
sawine@5
  1477
				id = jQuery.expando;
sawine@5
  1478
			}
sawine@5
  1479
		}
sawine@5
  1480
sawine@5
  1481
		if ( !cache[ id ] ) {
sawine@5
  1482
			cache[ id ] = {};
sawine@5
  1483
sawine@5
  1484
			// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
sawine@5
  1485
			// metadata on plain JS objects when the object is serialized using
sawine@5
  1486
			// JSON.stringify
sawine@5
  1487
			if ( !isNode ) {
sawine@5
  1488
				cache[ id ].toJSON = jQuery.noop;
sawine@5
  1489
			}
sawine@5
  1490
		}
sawine@5
  1491
sawine@5
  1492
		// An object can be passed to jQuery.data instead of a key/value pair; this gets
sawine@5
  1493
		// shallow copied over onto the existing cache
sawine@5
  1494
		if ( typeof name === "object" || typeof name === "function" ) {
sawine@5
  1495
			if ( pvt ) {
sawine@5
  1496
				cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
sawine@5
  1497
			} else {
sawine@5
  1498
				cache[ id ] = jQuery.extend(cache[ id ], name);
sawine@5
  1499
			}
sawine@5
  1500
		}
sawine@5
  1501
sawine@5
  1502
		thisCache = cache[ id ];
sawine@5
  1503
sawine@5
  1504
		// Internal jQuery data is stored in a separate object inside the object's data
sawine@5
  1505
		// cache in order to avoid key collisions between internal data and user-defined
sawine@5
  1506
		// data
sawine@5
  1507
		if ( pvt ) {
sawine@5
  1508
			if ( !thisCache[ internalKey ] ) {
sawine@5
  1509
				thisCache[ internalKey ] = {};
sawine@5
  1510
			}
sawine@5
  1511
sawine@5
  1512
			thisCache = thisCache[ internalKey ];
sawine@5
  1513
		}
sawine@5
  1514
sawine@5
  1515
		if ( data !== undefined ) {
sawine@5
  1516
			thisCache[ jQuery.camelCase( name ) ] = data;
sawine@5
  1517
		}
sawine@5
  1518
sawine@5
  1519
		// TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
sawine@5
  1520
		// not attempt to inspect the internal events object using jQuery.data, as this
sawine@5
  1521
		// internal data object is undocumented and subject to change.
sawine@5
  1522
		if ( name === "events" && !thisCache[name] ) {
sawine@5
  1523
			return thisCache[ internalKey ] && thisCache[ internalKey ].events;
sawine@5
  1524
		}
sawine@5
  1525
sawine@5
  1526
		// Check for both converted-to-camel and non-converted data property names
sawine@5
  1527
		// If a data property was specified
sawine@5
  1528
		if ( getByName ) {
sawine@5
  1529
sawine@5
  1530
			// First Try to find as-is property data
sawine@5
  1531
			ret = thisCache[ name ];
sawine@5
  1532
sawine@5
  1533
			// Test for null|undefined property data
sawine@5
  1534
			if ( ret == null ) {
sawine@5
  1535
sawine@5
  1536
				// Try to find the camelCased property
sawine@5
  1537
				ret = thisCache[ jQuery.camelCase( name ) ];
sawine@5
  1538
			}
sawine@5
  1539
		} else {
sawine@5
  1540
			ret = thisCache;
sawine@5
  1541
		}
sawine@5
  1542
sawine@5
  1543
		return ret;
sawine@5
  1544
	},
sawine@5
  1545
sawine@5
  1546
	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
sawine@5
  1547
		if ( !jQuery.acceptData( elem ) ) {
sawine@5
  1548
			return;
sawine@5
  1549
		}
sawine@5
  1550
sawine@5
  1551
		var thisCache,
sawine@5
  1552
sawine@5
  1553
			// Reference to internal data cache key
sawine@5
  1554
			internalKey = jQuery.expando,
sawine@5
  1555
sawine@5
  1556
			isNode = elem.nodeType,
sawine@5
  1557
sawine@5
  1558
			// See jQuery.data for more information
sawine@5
  1559
			cache = isNode ? jQuery.cache : elem,
sawine@5
  1560
sawine@5
  1561
			// See jQuery.data for more information
sawine@5
  1562
			id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
sawine@5
  1563
sawine@5
  1564
		// If there is already no cache entry for this object, there is no
sawine@5
  1565
		// purpose in continuing
sawine@5
  1566
		if ( !cache[ id ] ) {
sawine@5
  1567
			return;
sawine@5
  1568
		}
sawine@5
  1569
sawine@5
  1570
		if ( name ) {
sawine@5
  1571
sawine@5
  1572
			thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
sawine@5
  1573
sawine@5
  1574
			if ( thisCache ) {
sawine@5
  1575
sawine@5
  1576
				// Support interoperable removal of hyphenated or camelcased keys
sawine@5
  1577
				if ( !thisCache[ name ] ) {
sawine@5
  1578
					name = jQuery.camelCase( name );
sawine@5
  1579
				}
sawine@5
  1580
sawine@5
  1581
				delete thisCache[ name ];
sawine@5
  1582
sawine@5
  1583
				// If there is no data left in the cache, we want to continue
sawine@5
  1584
				// and let the cache object itself get destroyed
sawine@5
  1585
				if ( !isEmptyDataObject(thisCache) ) {
sawine@5
  1586
					return;
sawine@5
  1587
				}
sawine@5
  1588
			}
sawine@5
  1589
		}
sawine@5
  1590
sawine@5
  1591
		// See jQuery.data for more information
sawine@5
  1592
		if ( pvt ) {
sawine@5
  1593
			delete cache[ id ][ internalKey ];
sawine@5
  1594
sawine@5
  1595
			// Don't destroy the parent cache unless the internal data object
sawine@5
  1596
			// had been the only thing left in it
sawine@5
  1597
			if ( !isEmptyDataObject(cache[ id ]) ) {
sawine@5
  1598
				return;
sawine@5
  1599
			}
sawine@5
  1600
		}
sawine@5
  1601
sawine@5
  1602
		var internalCache = cache[ id ][ internalKey ];
sawine@5
  1603
sawine@5
  1604
		// Browsers that fail expando deletion also refuse to delete expandos on
sawine@5
  1605
		// the window, but it will allow it on all other JS objects; other browsers
sawine@5
  1606
		// don't care
sawine@5
  1607
		// Ensure that `cache` is not a window object #10080
sawine@5
  1608
		if ( jQuery.support.deleteExpando || !cache.setInterval ) {
sawine@5
  1609
			delete cache[ id ];
sawine@5
  1610
		} else {
sawine@5
  1611
			cache[ id ] = null;
sawine@5
  1612
		}
sawine@5
  1613
sawine@5
  1614
		// We destroyed the entire user cache at once because it's faster than
sawine@5
  1615
		// iterating through each key, but we need to continue to persist internal
sawine@5
  1616
		// data if it existed
sawine@5
  1617
		if ( internalCache ) {
sawine@5
  1618
			cache[ id ] = {};
sawine@5
  1619
			// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
sawine@5
  1620
			// metadata on plain JS objects when the object is serialized using
sawine@5
  1621
			// JSON.stringify
sawine@5
  1622
			if ( !isNode ) {
sawine@5
  1623
				cache[ id ].toJSON = jQuery.noop;
sawine@5
  1624
			}
sawine@5
  1625
sawine@5
  1626
			cache[ id ][ internalKey ] = internalCache;
sawine@5
  1627
sawine@5
  1628
		// Otherwise, we need to eliminate the expando on the node to avoid
sawine@5
  1629
		// false lookups in the cache for entries that no longer exist
sawine@5
  1630
		} else if ( isNode ) {
sawine@5
  1631
			// IE does not allow us to delete expando properties from nodes,
sawine@5
  1632
			// nor does it have a removeAttribute function on Document nodes;
sawine@5
  1633
			// we must handle all of these cases
sawine@5
  1634
			if ( jQuery.support.deleteExpando ) {
sawine@5
  1635
				delete elem[ jQuery.expando ];
sawine@5
  1636
			} else if ( elem.removeAttribute ) {
sawine@5
  1637
				elem.removeAttribute( jQuery.expando );
sawine@5
  1638
			} else {
sawine@5
  1639
				elem[ jQuery.expando ] = null;
sawine@5
  1640
			}
sawine@5
  1641
		}
sawine@5
  1642
	},
sawine@5
  1643
sawine@5
  1644
	// For internal use only.
sawine@5
  1645
	_data: function( elem, name, data ) {
sawine@5
  1646
		return jQuery.data( elem, name, data, true );
sawine@5
  1647
	},
sawine@5
  1648
sawine@5
  1649
	// A method for determining if a DOM node can handle the data expando
sawine@5
  1650
	acceptData: function( elem ) {
sawine@5
  1651
		if ( elem.nodeName ) {
sawine@5
  1652
			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
sawine@5
  1653
sawine@5
  1654
			if ( match ) {
sawine@5
  1655
				return !(match === true || elem.getAttribute("classid") !== match);
sawine@5
  1656
			}
sawine@5
  1657
		}
sawine@5
  1658
sawine@5
  1659
		return true;
sawine@5
  1660
	}
sawine@5
  1661
});
sawine@5
  1662
sawine@5
  1663
jQuery.fn.extend({
sawine@5
  1664
	data: function( key, value ) {
sawine@5
  1665
		var data = null;
sawine@5
  1666
sawine@5
  1667
		if ( typeof key === "undefined" ) {
sawine@5
  1668
			if ( this.length ) {
sawine@5
  1669
				data = jQuery.data( this[0] );
sawine@5
  1670
sawine@5
  1671
				if ( this[0].nodeType === 1 ) {
sawine@5
  1672
			    var attr = this[0].attributes, name;
sawine@5
  1673
					for ( var i = 0, l = attr.length; i < l; i++ ) {
sawine@5
  1674
						name = attr[i].name;
sawine@5
  1675
sawine@5
  1676
						if ( name.indexOf( "data-" ) === 0 ) {
sawine@5
  1677
							name = jQuery.camelCase( name.substring(5) );
sawine@5
  1678
sawine@5
  1679
							dataAttr( this[0], name, data[ name ] );
sawine@5
  1680
						}
sawine@5
  1681
					}
sawine@5
  1682
				}
sawine@5
  1683
			}
sawine@5
  1684
sawine@5
  1685
			return data;
sawine@5
  1686
sawine@5
  1687
		} else if ( typeof key === "object" ) {
sawine@5
  1688
			return this.each(function() {
sawine@5
  1689
				jQuery.data( this, key );
sawine@5
  1690
			});
sawine@5
  1691
		}
sawine@5
  1692
sawine@5
  1693
		var parts = key.split(".");
sawine@5
  1694
		parts[1] = parts[1] ? "." + parts[1] : "";
sawine@5
  1695
sawine@5
  1696
		if ( value === undefined ) {
sawine@5
  1697
			data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
sawine@5
  1698
sawine@5
  1699
			// Try to fetch any internally stored data first
sawine@5
  1700
			if ( data === undefined && this.length ) {
sawine@5
  1701
				data = jQuery.data( this[0], key );
sawine@5
  1702
				data = dataAttr( this[0], key, data );
sawine@5
  1703
			}
sawine@5
  1704
sawine@5
  1705
			return data === undefined && parts[1] ?
sawine@5
  1706
				this.data( parts[0] ) :
sawine@5
  1707
				data;
sawine@5
  1708
sawine@5
  1709
		} else {
sawine@5
  1710
			return this.each(function() {
sawine@5
  1711
				var $this = jQuery( this ),
sawine@5
  1712
					args = [ parts[0], value ];
sawine@5
  1713
sawine@5
  1714
				$this.triggerHandler( "setData" + parts[1] + "!", args );
sawine@5
  1715
				jQuery.data( this, key, value );
sawine@5
  1716
				$this.triggerHandler( "changeData" + parts[1] + "!", args );
sawine@5
  1717
			});
sawine@5
  1718
		}
sawine@5
  1719
	},
sawine@5
  1720
sawine@5
  1721
	removeData: function( key ) {
sawine@5
  1722
		return this.each(function() {
sawine@5
  1723
			jQuery.removeData( this, key );
sawine@5
  1724
		});
sawine@5
  1725
	}
sawine@5
  1726
});
sawine@5
  1727
sawine@5
  1728
function dataAttr( elem, key, data ) {
sawine@5
  1729
	// If nothing was found internally, try to fetch any
sawine@5
  1730
	// data from the HTML5 data-* attribute
sawine@5
  1731
	if ( data === undefined && elem.nodeType === 1 ) {
sawine@5
  1732
sawine@5
  1733
		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
sawine@5
  1734
sawine@5
  1735
		data = elem.getAttribute( name );
sawine@5
  1736
sawine@5
  1737
		if ( typeof data === "string" ) {
sawine@5
  1738
			try {
sawine@5
  1739
				data = data === "true" ? true :
sawine@5
  1740
				data === "false" ? false :
sawine@5
  1741
				data === "null" ? null :
sawine@5
  1742
				!jQuery.isNaN( data ) ? parseFloat( data ) :
sawine@5
  1743
					rbrace.test( data ) ? jQuery.parseJSON( data ) :
sawine@5
  1744
					data;
sawine@5
  1745
			} catch( e ) {}
sawine@5
  1746
sawine@5
  1747
			// Make sure we set the data so it isn't changed later
sawine@5
  1748
			jQuery.data( elem, key, data );
sawine@5
  1749
sawine@5
  1750
		} else {
sawine@5
  1751
			data = undefined;
sawine@5
  1752
		}
sawine@5
  1753
	}
sawine@5
  1754
sawine@5
  1755
	return data;
sawine@5
  1756
}
sawine@5
  1757
sawine@5
  1758
// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
sawine@5
  1759
// property to be considered empty objects; this property always exists in
sawine@5
  1760
// order to make sure JSON.stringify does not expose internal metadata
sawine@5
  1761
function isEmptyDataObject( obj ) {
sawine@5
  1762
	for ( var name in obj ) {
sawine@5
  1763
		if ( name !== "toJSON" ) {
sawine@5
  1764
			return false;
sawine@5
  1765
		}
sawine@5
  1766
	}
sawine@5
  1767
sawine@5
  1768
	return true;
sawine@5
  1769
}
sawine@5
  1770
sawine@5
  1771
sawine@5
  1772
sawine@5
  1773
sawine@5
  1774
function handleQueueMarkDefer( elem, type, src ) {
sawine@5
  1775
	var deferDataKey = type + "defer",
sawine@5
  1776
		queueDataKey = type + "queue",
sawine@5
  1777
		markDataKey = type + "mark",
sawine@5
  1778
		defer = jQuery.data( elem, deferDataKey, undefined, true );
sawine@5
  1779
	if ( defer &&
sawine@5
  1780
		( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) &&
sawine@5
  1781
		( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) {
sawine@5
  1782
		// Give room for hard-coded callbacks to fire first
sawine@5
  1783
		// and eventually mark/queue something else on the element
sawine@5
  1784
		setTimeout( function() {
sawine@5
  1785
			if ( !jQuery.data( elem, queueDataKey, undefined, true ) &&
sawine@5
  1786
				!jQuery.data( elem, markDataKey, undefined, true ) ) {
sawine@5
  1787
				jQuery.removeData( elem, deferDataKey, true );
sawine@5
  1788
				defer.resolve();
sawine@5
  1789
			}
sawine@5
  1790
		}, 0 );
sawine@5
  1791
	}
sawine@5
  1792
}
sawine@5
  1793
sawine@5
  1794
jQuery.extend({
sawine@5
  1795
sawine@5
  1796
	_mark: function( elem, type ) {
sawine@5
  1797
		if ( elem ) {
sawine@5
  1798
			type = (type || "fx") + "mark";
sawine@5
  1799
			jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true );
sawine@5
  1800
		}
sawine@5
  1801
	},
sawine@5
  1802
sawine@5
  1803
	_unmark: function( force, elem, type ) {
sawine@5
  1804
		if ( force !== true ) {
sawine@5
  1805
			type = elem;
sawine@5
  1806
			elem = force;
sawine@5
  1807
			force = false;
sawine@5
  1808
		}
sawine@5
  1809
		if ( elem ) {
sawine@5
  1810
			type = type || "fx";
sawine@5
  1811
			var key = type + "mark",
sawine@5
  1812
				count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 );
sawine@5
  1813
			if ( count ) {
sawine@5
  1814
				jQuery.data( elem, key, count, true );
sawine@5
  1815
			} else {
sawine@5
  1816
				jQuery.removeData( elem, key, true );
sawine@5
  1817
				handleQueueMarkDefer( elem, type, "mark" );
sawine@5
  1818
			}
sawine@5
  1819
		}
sawine@5
  1820
	},
sawine@5
  1821
sawine@5
  1822
	queue: function( elem, type, data ) {
sawine@5
  1823
		if ( elem ) {
sawine@5
  1824
			type = (type || "fx") + "queue";
sawine@5
  1825
			var q = jQuery.data( elem, type, undefined, true );
sawine@5
  1826
			// Speed up dequeue by getting out quickly if this is just a lookup
sawine@5
  1827
			if ( data ) {
sawine@5
  1828
				if ( !q || jQuery.isArray(data) ) {
sawine@5
  1829
					q = jQuery.data( elem, type, jQuery.makeArray(data), true );
sawine@5
  1830
				} else {
sawine@5
  1831
					q.push( data );
sawine@5
  1832
				}
sawine@5
  1833
			}
sawine@5
  1834
			return q || [];
sawine@5
  1835
		}
sawine@5
  1836
	},
sawine@5
  1837
sawine@5
  1838
	dequeue: function( elem, type ) {
sawine@5
  1839
		type = type || "fx";
sawine@5
  1840
sawine@5
  1841
		var queue = jQuery.queue( elem, type ),
sawine@5
  1842
			fn = queue.shift(),
sawine@5
  1843
			defer;
sawine@5
  1844
sawine@5
  1845
		// If the fx queue is dequeued, always remove the progress sentinel
sawine@5
  1846
		if ( fn === "inprogress" ) {
sawine@5
  1847
			fn = queue.shift();
sawine@5
  1848
		}
sawine@5
  1849
sawine@5
  1850
		if ( fn ) {
sawine@5
  1851
			// Add a progress sentinel to prevent the fx queue from being
sawine@5
  1852
			// automatically dequeued
sawine@5
  1853
			if ( type === "fx" ) {
sawine@5
  1854
				queue.unshift("inprogress");
sawine@5
  1855
			}
sawine@5
  1856
sawine@5
  1857
			fn.call(elem, function() {
sawine@5
  1858
				jQuery.dequeue(elem, type);
sawine@5
  1859
			});
sawine@5
  1860
		}
sawine@5
  1861
sawine@5
  1862
		if ( !queue.length ) {
sawine@5
  1863
			jQuery.removeData( elem, type + "queue", true );
sawine@5
  1864
			handleQueueMarkDefer( elem, type, "queue" );
sawine@5
  1865
		}
sawine@5
  1866
	}
sawine@5
  1867
});
sawine@5
  1868
sawine@5
  1869
jQuery.fn.extend({
sawine@5
  1870
	queue: function( type, data ) {
sawine@5
  1871
		if ( typeof type !== "string" ) {
sawine@5
  1872
			data = type;
sawine@5
  1873
			type = "fx";
sawine@5
  1874
		}
sawine@5
  1875
sawine@5
  1876
		if ( data === undefined ) {
sawine@5
  1877
			return jQuery.queue( this[0], type );
sawine@5
  1878
		}
sawine@5
  1879
		return this.each(function() {
sawine@5
  1880
			var queue = jQuery.queue( this, type, data );
sawine@5
  1881
sawine@5
  1882
			if ( type === "fx" && queue[0] !== "inprogress" ) {
sawine@5
  1883
				jQuery.dequeue( this, type );
sawine@5
  1884
			}
sawine@5
  1885
		});
sawine@5
  1886
	},
sawine@5
  1887
	dequeue: function( type ) {
sawine@5
  1888
		return this.each(function() {
sawine@5
  1889
			jQuery.dequeue( this, type );
sawine@5
  1890
		});
sawine@5
  1891
	},
sawine@5
  1892
	// Based off of the plugin by Clint Helfers, with permission.
sawine@5
  1893
	// http://blindsignals.com/index.php/2009/07/jquery-delay/
sawine@5
  1894
	delay: function( time, type ) {
sawine@5
  1895
		time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
sawine@5
  1896
		type = type || "fx";
sawine@5
  1897
sawine@5
  1898
		return this.queue( type, function() {
sawine@5
  1899
			var elem = this;
sawine@5
  1900
			setTimeout(function() {
sawine@5
  1901
				jQuery.dequeue( elem, type );
sawine@5
  1902
			}, time );
sawine@5
  1903
		});
sawine@5
  1904
	},
sawine@5
  1905
	clearQueue: function( type ) {
sawine@5
  1906
		return this.queue( type || "fx", [] );
sawine@5
  1907
	},
sawine@5
  1908
	// Get a promise resolved when queues of a certain type
sawine@5
  1909
	// are emptied (fx is the type by default)
sawine@5
  1910
	promise: function( type, object ) {
sawine@5
  1911
		if ( typeof type !== "string" ) {
sawine@5
  1912
			object = type;
sawine@5
  1913
			type = undefined;
sawine@5
  1914
		}
sawine@5
  1915
		type = type || "fx";
sawine@5
  1916
		var defer = jQuery.Deferred(),
sawine@5
  1917
			elements = this,
sawine@5
  1918
			i = elements.length,
sawine@5
  1919
			count = 1,
sawine@5
  1920
			deferDataKey = type + "defer",
sawine@5
  1921
			queueDataKey = type + "queue",
sawine@5
  1922
			markDataKey = type + "mark",
sawine@5
  1923
			tmp;
sawine@5
  1924
		function resolve() {
sawine@5
  1925
			if ( !( --count ) ) {
sawine@5
  1926
				defer.resolveWith( elements, [ elements ] );
sawine@5
  1927
			}
sawine@5
  1928
		}
sawine@5
  1929
		while( i-- ) {
sawine@5
  1930
			if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
sawine@5
  1931
					( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
sawine@5
  1932
						jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
sawine@5
  1933
					jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) {
sawine@5
  1934
				count++;
sawine@5
  1935
				tmp.done( resolve );
sawine@5
  1936
			}
sawine@5
  1937
		}
sawine@5
  1938
		resolve();
sawine@5
  1939
		return defer.promise();
sawine@5
  1940
	}
sawine@5
  1941
});
sawine@5
  1942
sawine@5
  1943
sawine@5
  1944
sawine@5
  1945
sawine@5
  1946
var rclass = /[\n\t\r]/g,
sawine@5
  1947
	rspace = /\s+/,
sawine@5
  1948
	rreturn = /\r/g,
sawine@5
  1949
	rtype = /^(?:button|input)$/i,
sawine@5
  1950
	rfocusable = /^(?:button|input|object|select|textarea)$/i,
sawine@5
  1951
	rclickable = /^a(?:rea)?$/i,
sawine@5
  1952
	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
sawine@5
  1953
	nodeHook, boolHook;
sawine@5
  1954
sawine@5
  1955
jQuery.fn.extend({
sawine@5
  1956
	attr: function( name, value ) {
sawine@5
  1957
		return jQuery.access( this, name, value, true, jQuery.attr );
sawine@5
  1958
	},
sawine@5
  1959
sawine@5
  1960
	removeAttr: function( name ) {
sawine@5
  1961
		return this.each(function() {
sawine@5
  1962
			jQuery.removeAttr( this, name );
sawine@5
  1963
		});
sawine@5
  1964
	},
sawine@5
  1965
	
sawine@5
  1966
	prop: function( name, value ) {
sawine@5
  1967
		return jQuery.access( this, name, value, true, jQuery.prop );
sawine@5
  1968
	},
sawine@5
  1969
	
sawine@5
  1970
	removeProp: function( name ) {
sawine@5
  1971
		name = jQuery.propFix[ name ] || name;
sawine@5
  1972
		return this.each(function() {
sawine@5
  1973
			// try/catch handles cases where IE balks (such as removing a property on window)
sawine@5
  1974
			try {
sawine@5
  1975
				this[ name ] = undefined;
sawine@5
  1976
				delete this[ name ];
sawine@5
  1977
			} catch( e ) {}
sawine@5
  1978
		});
sawine@5
  1979
	},
sawine@5
  1980
sawine@5
  1981
	addClass: function( value ) {
sawine@5
  1982
		var classNames, i, l, elem,
sawine@5
  1983
			setClass, c, cl;
sawine@5
  1984
sawine@5
  1985
		if ( jQuery.isFunction( value ) ) {
sawine@5
  1986
			return this.each(function( j ) {
sawine@5
  1987
				jQuery( this ).addClass( value.call(this, j, this.className) );
sawine@5
  1988
			});
sawine@5
  1989
		}
sawine@5
  1990
sawine@5
  1991
		if ( value && typeof value === "string" ) {
sawine@5
  1992
			classNames = value.split( rspace );
sawine@5
  1993
sawine@5
  1994
			for ( i = 0, l = this.length; i < l; i++ ) {
sawine@5
  1995
				elem = this[ i ];
sawine@5
  1996
sawine@5
  1997
				if ( elem.nodeType === 1 ) {
sawine@5
  1998
					if ( !elem.className && classNames.length === 1 ) {
sawine@5
  1999
						elem.className = value;
sawine@5
  2000
sawine@5
  2001
					} else {
sawine@5
  2002
						setClass = " " + elem.className + " ";
sawine@5
  2003
sawine@5
  2004
						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
sawine@5
  2005
							if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
sawine@5
  2006
								setClass += classNames[ c ] + " ";
sawine@5
  2007
							}
sawine@5
  2008
						}
sawine@5
  2009
						elem.className = jQuery.trim( setClass );
sawine@5
  2010
					}
sawine@5
  2011
				}
sawine@5
  2012
			}
sawine@5
  2013
		}
sawine@5
  2014
sawine@5
  2015
		return this;
sawine@5
  2016
	},
sawine@5
  2017
sawine@5
  2018
	removeClass: function( value ) {
sawine@5
  2019
		var classNames, i, l, elem, className, c, cl;
sawine@5
  2020
sawine@5
  2021
		if ( jQuery.isFunction( value ) ) {
sawine@5
  2022
			return this.each(function( j ) {
sawine@5
  2023
				jQuery( this ).removeClass( value.call(this, j, this.className) );
sawine@5
  2024
			});
sawine@5
  2025
		}
sawine@5
  2026
sawine@5
  2027
		if ( (value && typeof value === "string") || value === undefined ) {
sawine@5
  2028
			classNames = (value || "").split( rspace );
sawine@5
  2029
sawine@5
  2030
			for ( i = 0, l = this.length; i < l; i++ ) {
sawine@5
  2031
				elem = this[ i ];
sawine@5
  2032
sawine@5
  2033
				if ( elem.nodeType === 1 && elem.className ) {
sawine@5
  2034
					if ( value ) {
sawine@5
  2035
						className = (" " + elem.className + " ").replace( rclass, " " );
sawine@5
  2036
						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
sawine@5
  2037
							className = className.replace(" " + classNames[ c ] + " ", " ");
sawine@5
  2038
						}
sawine@5
  2039
						elem.className = jQuery.trim( className );
sawine@5
  2040
sawine@5
  2041
					} else {
sawine@5
  2042
						elem.className = "";
sawine@5
  2043
					}
sawine@5
  2044
				}
sawine@5
  2045
			}
sawine@5
  2046
		}
sawine@5
  2047
sawine@5
  2048
		return this;
sawine@5
  2049
	},
sawine@5
  2050
sawine@5
  2051
	toggleClass: function( value, stateVal ) {
sawine@5
  2052
		var type = typeof value,
sawine@5
  2053
			isBool = typeof stateVal === "boolean";
sawine@5
  2054
sawine@5
  2055
		if ( jQuery.isFunction( value ) ) {
sawine@5
  2056
			return this.each(function( i ) {
sawine@5
  2057
				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
sawine@5
  2058
			});
sawine@5
  2059
		}
sawine@5
  2060
sawine@5
  2061
		return this.each(function() {
sawine@5
  2062
			if ( type === "string" ) {
sawine@5
  2063
				// toggle individual class names
sawine@5
  2064
				var className,
sawine@5
  2065
					i = 0,
sawine@5
  2066
					self = jQuery( this ),
sawine@5
  2067
					state = stateVal,
sawine@5
  2068
					classNames = value.split( rspace );
sawine@5
  2069
sawine@5
  2070
				while ( (className = classNames[ i++ ]) ) {
sawine@5
  2071
					// check each className given, space seperated list
sawine@5
  2072
					state = isBool ? state : !self.hasClass( className );
sawine@5
  2073
					self[ state ? "addClass" : "removeClass" ]( className );
sawine@5
  2074
				}
sawine@5
  2075
sawine@5
  2076
			} else if ( type === "undefined" || type === "boolean" ) {
sawine@5
  2077
				if ( this.className ) {
sawine@5
  2078
					// store className if set
sawine@5
  2079
					jQuery._data( this, "__className__", this.className );
sawine@5
  2080
				}
sawine@5
  2081
sawine@5
  2082
				// toggle whole className
sawine@5
  2083
				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
sawine@5
  2084
			}
sawine@5
  2085
		});
sawine@5
  2086
	},
sawine@5
  2087
sawine@5
  2088
	hasClass: function( selector ) {
sawine@5
  2089
		var className = " " + selector + " ";
sawine@5
  2090
		for ( var i = 0, l = this.length; i < l; i++ ) {
sawine@5
  2091
			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
sawine@5
  2092
				return true;
sawine@5
  2093
			}
sawine@5
  2094
		}
sawine@5
  2095
sawine@5
  2096
		return false;
sawine@5
  2097
	},
sawine@5
  2098
sawine@5
  2099
	val: function( value ) {
sawine@5
  2100
		var hooks, ret,
sawine@5
  2101
			elem = this[0];
sawine@5
  2102
		
sawine@5
  2103
		if ( !arguments.length ) {
sawine@5
  2104
			if ( elem ) {
sawine@5
  2105
				hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
sawine@5
  2106
sawine@5
  2107
				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
sawine@5
  2108
					return ret;
sawine@5
  2109
				}
sawine@5
  2110
sawine@5
  2111
				ret = elem.value;
sawine@5
  2112
sawine@5
  2113
				return typeof ret === "string" ? 
sawine@5
  2114
					// handle most common string cases
sawine@5
  2115
					ret.replace(rreturn, "") : 
sawine@5
  2116
					// handle cases where value is null/undef or number
sawine@5
  2117
					ret == null ? "" : ret;
sawine@5
  2118
			}
sawine@5
  2119
sawine@5
  2120
			return undefined;
sawine@5
  2121
		}
sawine@5
  2122
sawine@5
  2123
		var isFunction = jQuery.isFunction( value );
sawine@5
  2124
sawine@5
  2125
		return this.each(function( i ) {
sawine@5
  2126
			var self = jQuery(this), val;
sawine@5
  2127
sawine@5
  2128
			if ( this.nodeType !== 1 ) {
sawine@5
  2129
				return;
sawine@5
  2130
			}
sawine@5
  2131
sawine@5
  2132
			if ( isFunction ) {
sawine@5
  2133
				val = value.call( this, i, self.val() );
sawine@5
  2134
			} else {
sawine@5
  2135
				val = value;
sawine@5
  2136
			}
sawine@5
  2137
sawine@5
  2138
			// Treat null/undefined as ""; convert numbers to string
sawine@5
  2139
			if ( val == null ) {
sawine@5
  2140
				val = "";
sawine@5
  2141
			} else if ( typeof val === "number" ) {
sawine@5
  2142
				val += "";
sawine@5
  2143
			} else if ( jQuery.isArray( val ) ) {
sawine@5
  2144
				val = jQuery.map(val, function ( value ) {
sawine@5
  2145
					return value == null ? "" : value + "";
sawine@5
  2146
				});
sawine@5
  2147
			}
sawine@5
  2148
sawine@5
  2149
			hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
sawine@5
  2150
sawine@5
  2151
			// If set returns undefined, fall back to normal setting
sawine@5
  2152
			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
sawine@5
  2153
				this.value = val;
sawine@5
  2154
			}
sawine@5
  2155
		});
sawine@5
  2156
	}
sawine@5
  2157
});
sawine@5
  2158
sawine@5
  2159
jQuery.extend({
sawine@5
  2160
	valHooks: {
sawine@5
  2161
		option: {
sawine@5
  2162
			get: function( elem ) {
sawine@5
  2163
				// attributes.value is undefined in Blackberry 4.7 but
sawine@5
  2164
				// uses .value. See #6932
sawine@5
  2165
				var val = elem.attributes.value;
sawine@5
  2166
				return !val || val.specified ? elem.value : elem.text;
sawine@5
  2167
			}
sawine@5
  2168
		},
sawine@5
  2169
		select: {
sawine@5
  2170
			get: function( elem ) {
sawine@5
  2171
				var value,
sawine@5
  2172
					index = elem.selectedIndex,
sawine@5
  2173
					values = [],
sawine@5
  2174
					options = elem.options,
sawine@5
  2175
					one = elem.type === "select-one";
sawine@5
  2176
sawine@5
  2177
				// Nothing was selected
sawine@5
  2178
				if ( index < 0 ) {
sawine@5
  2179
					return null;
sawine@5
  2180
				}
sawine@5
  2181
sawine@5
  2182
				// Loop through all the selected options
sawine@5
  2183
				for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
sawine@5
  2184
					var option = options[ i ];
sawine@5
  2185
sawine@5
  2186
					// Don't return options that are disabled or in a disabled optgroup
sawine@5
  2187
					if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
sawine@5
  2188
							(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
sawine@5
  2189
sawine@5
  2190
						// Get the specific value for the option
sawine@5
  2191
						value = jQuery( option ).val();
sawine@5
  2192
sawine@5
  2193
						// We don't need an array for one selects
sawine@5
  2194
						if ( one ) {
sawine@5
  2195
							return value;
sawine@5
  2196
						}
sawine@5
  2197
sawine@5
  2198
						// Multi-Selects return an array
sawine@5
  2199
						values.push( value );
sawine@5
  2200
					}
sawine@5
  2201
				}
sawine@5
  2202
sawine@5
  2203
				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
sawine@5
  2204
				if ( one && !values.length && options.length ) {
sawine@5
  2205
					return jQuery( options[ index ] ).val();
sawine@5
  2206
				}
sawine@5
  2207
sawine@5
  2208
				return values;
sawine@5
  2209
			},
sawine@5
  2210
sawine@5
  2211
			set: function( elem, value ) {
sawine@5
  2212
				var values = jQuery.makeArray( value );
sawine@5
  2213
sawine@5
  2214
				jQuery(elem).find("option").each(function() {
sawine@5
  2215
					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
sawine@5
  2216
				});
sawine@5
  2217
sawine@5
  2218
				if ( !values.length ) {
sawine@5
  2219
					elem.selectedIndex = -1;
sawine@5
  2220
				}
sawine@5
  2221
				return values;
sawine@5
  2222
			}
sawine@5
  2223
		}
sawine@5
  2224
	},
sawine@5
  2225
sawine@5
  2226
	attrFn: {
sawine@5
  2227
		val: true,
sawine@5
  2228
		css: true,
sawine@5
  2229
		html: true,
sawine@5
  2230
		text: true,
sawine@5
  2231
		data: true,
sawine@5
  2232
		width: true,
sawine@5
  2233
		height: true,
sawine@5
  2234
		offset: true
sawine@5
  2235
	},
sawine@5
  2236
	
sawine@5
  2237
	attrFix: {
sawine@5
  2238
		// Always normalize to ensure hook usage
sawine@5
  2239
		tabindex: "tabIndex"
sawine@5
  2240
	},
sawine@5
  2241
	
sawine@5
  2242
	attr: function( elem, name, value, pass ) {
sawine@5
  2243
		var nType = elem.nodeType;
sawine@5
  2244
		
sawine@5
  2245
		// don't get/set attributes on text, comment and attribute nodes
sawine@5
  2246
		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
sawine@5
  2247
			return undefined;
sawine@5
  2248
		}
sawine@5
  2249
sawine@5
  2250
		if ( pass && name in jQuery.attrFn ) {
sawine@5
  2251
			return jQuery( elem )[ name ]( value );
sawine@5
  2252
		}
sawine@5
  2253
sawine@5
  2254
		// Fallback to prop when attributes are not supported
sawine@5
  2255
		if ( !("getAttribute" in elem) ) {
sawine@5
  2256
			return jQuery.prop( elem, name, value );
sawine@5
  2257
		}
sawine@5
  2258
sawine@5
  2259
		var ret, hooks,
sawine@5
  2260
			notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
sawine@5
  2261
sawine@5
  2262
		// Normalize the name if needed
sawine@5
  2263
		if ( notxml ) {
sawine@5
  2264
			name = jQuery.attrFix[ name ] || name;
sawine@5
  2265
sawine@5
  2266
			hooks = jQuery.attrHooks[ name ];
sawine@5
  2267
sawine@5
  2268
			if ( !hooks ) {
sawine@5
  2269
				// Use boolHook for boolean attributes
sawine@5
  2270
				if ( rboolean.test( name ) ) {
sawine@5
  2271
					hooks = boolHook;
sawine@5
  2272
sawine@5
  2273
				// Use nodeHook if available( IE6/7 )
sawine@5
  2274
				} else if ( nodeHook ) {
sawine@5
  2275
					hooks = nodeHook;
sawine@5
  2276
				}
sawine@5
  2277
			}
sawine@5
  2278
		}
sawine@5
  2279
sawine@5
  2280
		if ( value !== undefined ) {
sawine@5
  2281
sawine@5
  2282
			if ( value === null ) {
sawine@5
  2283
				jQuery.removeAttr( elem, name );
sawine@5
  2284
				return undefined;
sawine@5
  2285
sawine@5
  2286
			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
sawine@5
  2287
				return ret;
sawine@5
  2288
sawine@5
  2289
			} else {
sawine@5
  2290
				elem.setAttribute( name, "" + value );
sawine@5
  2291
				return value;
sawine@5
  2292
			}
sawine@5
  2293
sawine@5
  2294
		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
sawine@5
  2295
			return ret;
sawine@5
  2296
sawine@5
  2297
		} else {
sawine@5
  2298
sawine@5
  2299
			ret = elem.getAttribute( name );
sawine@5
  2300
sawine@5
  2301
			// Non-existent attributes return null, we normalize to undefined
sawine@5
  2302
			return ret === null ?
sawine@5
  2303
				undefined :
sawine@5
  2304
				ret;
sawine@5
  2305
		}
sawine@5
  2306
	},
sawine@5
  2307
sawine@5
  2308
	removeAttr: function( elem, name ) {
sawine@5
  2309
		var propName;
sawine@5
  2310
		if ( elem.nodeType === 1 ) {
sawine@5
  2311
			name = jQuery.attrFix[ name ] || name;
sawine@5
  2312
sawine@5
  2313
			jQuery.attr( elem, name, "" );
sawine@5
  2314
			elem.removeAttribute( name );
sawine@5
  2315
sawine@5
  2316
			// Set corresponding property to false for boolean attributes
sawine@5
  2317
			if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) {
sawine@5
  2318
				elem[ propName ] = false;
sawine@5
  2319
			}
sawine@5
  2320
		}
sawine@5
  2321
	},
sawine@5
  2322
sawine@5
  2323
	attrHooks: {
sawine@5
  2324
		type: {
sawine@5
  2325
			set: function( elem, value ) {
sawine@5
  2326
				// We can't allow the type property to be changed (since it causes problems in IE)
sawine@5
  2327
				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
sawine@5
  2328
					jQuery.error( "type property can't be changed" );
sawine@5
  2329
				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
sawine@5
  2330
					// Setting the type on a radio button after the value resets the value in IE6-9
sawine@5
  2331
					// Reset value to it's default in case type is set after value
sawine@5
  2332
					// This is for element creation
sawine@5
  2333
					var val = elem.value;
sawine@5
  2334
					elem.setAttribute( "type", value );
sawine@5
  2335
					if ( val ) {
sawine@5
  2336
						elem.value = val;
sawine@5
  2337
					}
sawine@5
  2338
					return value;
sawine@5
  2339
				}
sawine@5
  2340
			}
sawine@5
  2341
		},
sawine@5
  2342
		// Use the value property for back compat
sawine@5
  2343
		// Use the nodeHook for button elements in IE6/7 (#1954)
sawine@5
  2344
		value: {
sawine@5
  2345
			get: function( elem, name ) {
sawine@5
  2346
				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
sawine@5
  2347
					return nodeHook.get( elem, name );
sawine@5
  2348
				}
sawine@5
  2349
				return name in elem ?
sawine@5
  2350
					elem.value :
sawine@5
  2351
					null;
sawine@5
  2352
			},
sawine@5
  2353
			set: function( elem, value, name ) {
sawine@5
  2354
				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
sawine@5
  2355
					return nodeHook.set( elem, value, name );
sawine@5
  2356
				}
sawine@5
  2357
				// Does not return so that setAttribute is also used
sawine@5
  2358
				elem.value = value;
sawine@5
  2359
			}
sawine@5
  2360
		}
sawine@5
  2361
	},
sawine@5
  2362
sawine@5
  2363
	propFix: {
sawine@5
  2364
		tabindex: "tabIndex",
sawine@5
  2365
		readonly: "readOnly",
sawine@5
  2366
		"for": "htmlFor",
sawine@5
  2367
		"class": "className",
sawine@5
  2368
		maxlength: "maxLength",
sawine@5
  2369
		cellspacing: "cellSpacing",
sawine@5
  2370
		cellpadding: "cellPadding",
sawine@5
  2371
		rowspan: "rowSpan",
sawine@5
  2372
		colspan: "colSpan",
sawine@5
  2373
		usemap: "useMap",
sawine@5
  2374
		frameborder: "frameBorder",
sawine@5
  2375
		contenteditable: "contentEditable"
sawine@5
  2376
	},
sawine@5
  2377
	
sawine@5
  2378
	prop: function( elem, name, value ) {
sawine@5
  2379
		var nType = elem.nodeType;
sawine@5
  2380
sawine@5
  2381
		// don't get/set properties on text, comment and attribute nodes
sawine@5
  2382
		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
sawine@5
  2383
			return undefined;
sawine@5
  2384
		}
sawine@5
  2385
sawine@5
  2386
		var ret, hooks,
sawine@5
  2387
			notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
sawine@5
  2388
sawine@5
  2389
		if ( notxml ) {
sawine@5
  2390
			// Fix name and attach hooks
sawine@5
  2391
			name = jQuery.propFix[ name ] || name;
sawine@5
  2392
			hooks = jQuery.propHooks[ name ];
sawine@5
  2393
		}
sawine@5
  2394
sawine@5
  2395
		if ( value !== undefined ) {
sawine@5
  2396
			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
sawine@5
  2397
				return ret;
sawine@5
  2398
sawine@5
  2399
			} else {
sawine@5
  2400
				return (elem[ name ] = value);
sawine@5
  2401
			}
sawine@5
  2402
sawine@5
  2403
		} else {
sawine@5
  2404
			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
sawine@5
  2405
				return ret;
sawine@5
  2406
sawine@5
  2407
			} else {
sawine@5
  2408
				return elem[ name ];
sawine@5
  2409
			}
sawine@5
  2410
		}
sawine@5
  2411
	},
sawine@5
  2412
	
sawine@5
  2413
	propHooks: {
sawine@5
  2414
		tabIndex: {
sawine@5
  2415
			get: function( elem ) {
sawine@5
  2416
				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
sawine@5
  2417
				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
sawine@5
  2418
				var attributeNode = elem.getAttributeNode("tabindex");
sawine@5
  2419
sawine@5
  2420
				return attributeNode && attributeNode.specified ?
sawine@5
  2421
					parseInt( attributeNode.value, 10 ) :
sawine@5
  2422
					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
sawine@5
  2423
						0 :
sawine@5
  2424
						undefined;
sawine@5
  2425
			}
sawine@5
  2426
		}
sawine@5
  2427
	}
sawine@5
  2428
});
sawine@5
  2429
sawine@5
  2430
// Add the tabindex propHook to attrHooks for back-compat
sawine@5
  2431
jQuery.attrHooks.tabIndex = jQuery.propHooks.tabIndex;
sawine@5
  2432
sawine@5
  2433
// Hook for boolean attributes
sawine@5
  2434
boolHook = {
sawine@5
  2435
	get: function( elem, name ) {
sawine@5
  2436
		// Align boolean attributes with corresponding properties
sawine@5
  2437
		// Fall back to attribute presence where some booleans are not supported
sawine@5
  2438
		var attrNode;
sawine@5
  2439
		return jQuery.prop( elem, name ) === true || ( attrNode = elem.getAttributeNode( name ) ) && attrNode.nodeValue !== false ?
sawine@5
  2440
			name.toLowerCase() :
sawine@5
  2441
			undefined;
sawine@5
  2442
	},
sawine@5
  2443
	set: function( elem, value, name ) {
sawine@5
  2444
		var propName;
sawine@5
  2445
		if ( value === false ) {
sawine@5
  2446
			// Remove boolean attributes when set to false
sawine@5
  2447
			jQuery.removeAttr( elem, name );
sawine@5
  2448
		} else {
sawine@5
  2449
			// value is true since we know at this point it's type boolean and not false
sawine@5
  2450
			// Set boolean attributes to the same name and set the DOM property
sawine@5
  2451
			propName = jQuery.propFix[ name ] || name;
sawine@5
  2452
			if ( propName in elem ) {
sawine@5
  2453
				// Only set the IDL specifically if it already exists on the element
sawine@5
  2454
				elem[ propName ] = true;
sawine@5
  2455
			}
sawine@5
  2456
sawine@5
  2457
			elem.setAttribute( name, name.toLowerCase() );
sawine@5
  2458
		}
sawine@5
  2459
		return name;
sawine@5
  2460
	}
sawine@5
  2461
};
sawine@5
  2462
sawine@5
  2463
// IE6/7 do not support getting/setting some attributes with get/setAttribute
sawine@5
  2464
if ( !jQuery.support.getSetAttribute ) {
sawine@5
  2465
	
sawine@5
  2466
	// Use this for any attribute in IE6/7
sawine@5
  2467
	// This fixes almost every IE6/7 issue
sawine@5
  2468
	nodeHook = jQuery.valHooks.button = {
sawine@5
  2469
		get: function( elem, name ) {
sawine@5
  2470
			var ret;
sawine@5
  2471
			ret = elem.getAttributeNode( name );
sawine@5
  2472
			// Return undefined if nodeValue is empty string
sawine@5
  2473
			return ret && ret.nodeValue !== "" ?
sawine@5
  2474
				ret.nodeValue :
sawine@5
  2475
				undefined;
sawine@5
  2476
		},
sawine@5
  2477
		set: function( elem, value, name ) {
sawine@5
  2478
			// Set the existing or create a new attribute node
sawine@5
  2479
			var ret = elem.getAttributeNode( name );
sawine@5
  2480
			if ( !ret ) {
sawine@5
  2481
				ret = document.createAttribute( name );
sawine@5
  2482
				elem.setAttributeNode( ret );
sawine@5
  2483
			}
sawine@5
  2484
			return (ret.nodeValue = value + "");
sawine@5
  2485
		}
sawine@5
  2486
	};
sawine@5
  2487
sawine@5
  2488
	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
sawine@5
  2489
	// This is for removals
sawine@5
  2490
	jQuery.each([ "width", "height" ], function( i, name ) {
sawine@5
  2491
		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
sawine@5
  2492
			set: function( elem, value ) {
sawine@5
  2493
				if ( value === "" ) {
sawine@5
  2494
					elem.setAttribute( name, "auto" );
sawine@5
  2495
					return value;
sawine@5
  2496
				}
sawine@5
  2497
			}
sawine@5
  2498
		});
sawine@5
  2499
	});
sawine@5
  2500
}
sawine@5
  2501
sawine@5
  2502
sawine@5
  2503
// Some attributes require a special call on IE
sawine@5
  2504
if ( !jQuery.support.hrefNormalized ) {
sawine@5
  2505
	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
sawine@5
  2506
		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
sawine@5
  2507
			get: function( elem ) {
sawine@5
  2508
				var ret = elem.getAttribute( name, 2 );
sawine@5
  2509
				return ret === null ? undefined : ret;
sawine@5
  2510
			}
sawine@5
  2511
		});
sawine@5
  2512
	});
sawine@5
  2513
}
sawine@5
  2514
sawine@5
  2515
if ( !jQuery.support.style ) {
sawine@5
  2516
	jQuery.attrHooks.style = {
sawine@5
  2517
		get: function( elem ) {
sawine@5
  2518
			// Return undefined in the case of empty string
sawine@5
  2519
			// Normalize to lowercase since IE uppercases css property names
sawine@5
  2520
			return elem.style.cssText.toLowerCase() || undefined;
sawine@5
  2521
		},
sawine@5
  2522
		set: function( elem, value ) {
sawine@5
  2523
			return (elem.style.cssText = "" + value);
sawine@5
  2524
		}
sawine@5
  2525
	};
sawine@5
  2526
}
sawine@5
  2527
sawine@5
  2528
// Safari mis-reports the default selected property of an option
sawine@5
  2529
// Accessing the parent's selectedIndex property fixes it
sawine@5
  2530
if ( !jQuery.support.optSelected ) {
sawine@5
  2531
	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
sawine@5
  2532
		get: function( elem ) {
sawine@5
  2533
			var parent = elem.parentNode;
sawine@5
  2534
sawine@5
  2535
			if ( parent ) {
sawine@5
  2536
				parent.selectedIndex;
sawine@5
  2537
sawine@5
  2538
				// Make sure that it also works with optgroups, see #5701
sawine@5
  2539
				if ( parent.parentNode ) {
sawine@5
  2540
					parent.parentNode.selectedIndex;
sawine@5
  2541
				}
sawine@5
  2542
			}
sawine@5
  2543
			return null;
sawine@5
  2544
		}
sawine@5
  2545
	});
sawine@5
  2546
}
sawine@5
  2547
sawine@5
  2548
// Radios and checkboxes getter/setter
sawine@5
  2549
if ( !jQuery.support.checkOn ) {
sawine@5
  2550
	jQuery.each([ "radio", "checkbox" ], function() {
sawine@5
  2551
		jQuery.valHooks[ this ] = {
sawine@5
  2552
			get: function( elem ) {
sawine@5
  2553
				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
sawine@5
  2554
				return elem.getAttribute("value") === null ? "on" : elem.value;
sawine@5
  2555
			}
sawine@5
  2556
		};
sawine@5
  2557
	});
sawine@5
  2558
}
sawine@5
  2559
jQuery.each([ "radio", "checkbox" ], function() {
sawine@5
  2560
	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
sawine@5
  2561
		set: function( elem, value ) {
sawine@5
  2562
			if ( jQuery.isArray( value ) ) {
sawine@5
  2563
				return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0);
sawine@5
  2564
			}
sawine@5
  2565
		}
sawine@5
  2566
	});
sawine@5
  2567
});
sawine@5
  2568
sawine@5
  2569
sawine@5
  2570
sawine@5
  2571
sawine@5
  2572
var rnamespaces = /\.(.*)$/,
sawine@5
  2573
	rformElems = /^(?:textarea|input|select)$/i,
sawine@5
  2574
	rperiod = /\./g,
sawine@5
  2575
	rspaces = / /g,
sawine@5
  2576
	rescape = /[^\w\s.|`]/g,
sawine@5
  2577
	fcleanup = function( nm ) {
sawine@5
  2578
		return nm.replace(rescape, "\\$&");
sawine@5
  2579
	};
sawine@5
  2580
sawine@5
  2581
/*
sawine@5
  2582
 * A number of helper functions used for managing events.
sawine@5
  2583
 * Many of the ideas behind this code originated from
sawine@5
  2584
 * Dean Edwards' addEvent library.
sawine@5
  2585
 */
sawine@5
  2586
jQuery.event = {
sawine@5
  2587
sawine@5
  2588
	// Bind an event to an element
sawine@5
  2589
	// Original by Dean Edwards
sawine@5
  2590
	add: function( elem, types, handler, data ) {
sawine@5
  2591
		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
sawine@5
  2592
			return;
sawine@5
  2593
		}
sawine@5
  2594
sawine@5
  2595
		if ( handler === false ) {
sawine@5
  2596
			handler = returnFalse;
sawine@5
  2597
		} else if ( !handler ) {
sawine@5
  2598
			// Fixes bug #7229. Fix recommended by jdalton
sawine@5
  2599
			return;
sawine@5
  2600
		}
sawine@5
  2601
sawine@5
  2602
		var handleObjIn, handleObj;
sawine@5
  2603
sawine@5
  2604
		if ( handler.handler ) {
sawine@5
  2605
			handleObjIn = handler;
sawine@5
  2606
			handler = handleObjIn.handler;
sawine@5
  2607
		}
sawine@5
  2608
sawine@5
  2609
		// Make sure that the function being executed has a unique ID
sawine@5
  2610
		if ( !handler.guid ) {
sawine@5
  2611
			handler.guid = jQuery.guid++;
sawine@5
  2612
		}
sawine@5
  2613
sawine@5
  2614
		// Init the element's event structure
sawine@5
  2615
		var elemData = jQuery._data( elem );
sawine@5
  2616
sawine@5
  2617
		// If no elemData is found then we must be trying to bind to one of the
sawine@5
  2618
		// banned noData elements
sawine@5
  2619
		if ( !elemData ) {
sawine@5
  2620
			return;
sawine@5
  2621
		}
sawine@5
  2622
sawine@5
  2623
		var events = elemData.events,
sawine@5
  2624
			eventHandle = elemData.handle;
sawine@5
  2625
sawine@5
  2626
		if ( !events ) {
sawine@5
  2627
			elemData.events = events = {};
sawine@5
  2628
		}
sawine@5
  2629
sawine@5
  2630
		if ( !eventHandle ) {
sawine@5
  2631
			elemData.handle = eventHandle = function( e ) {
sawine@5
  2632
				// Discard the second event of a jQuery.event.trigger() and
sawine@5
  2633
				// when an event is called after a page has unloaded
sawine@5
  2634
				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
sawine@5
  2635
					jQuery.event.handle.apply( eventHandle.elem, arguments ) :
sawine@5
  2636
					undefined;
sawine@5
  2637
			};
sawine@5
  2638
		}
sawine@5
  2639
sawine@5
  2640
		// Add elem as a property of the handle function
sawine@5
  2641
		// This is to prevent a memory leak with non-native events in IE.
sawine@5
  2642
		eventHandle.elem = elem;
sawine@5
  2643
sawine@5
  2644
		// Handle multiple events separated by a space
sawine@5
  2645
		// jQuery(...).bind("mouseover mouseout", fn);
sawine@5
  2646
		types = types.split(" ");
sawine@5
  2647
sawine@5
  2648
		var type, i = 0, namespaces;
sawine@5
  2649
sawine@5
  2650
		while ( (type = types[ i++ ]) ) {
sawine@5
  2651
			handleObj = handleObjIn ?
sawine@5
  2652
				jQuery.extend({}, handleObjIn) :
sawine@5
  2653
				{ handler: handler, data: data };
sawine@5
  2654
sawine@5
  2655
			// Namespaced event handlers
sawine@5
  2656
			if ( type.indexOf(".") > -1 ) {
sawine@5
  2657
				namespaces = type.split(".");
sawine@5
  2658
				type = namespaces.shift();
sawine@5
  2659
				handleObj.namespace = namespaces.slice(0).sort().join(".");
sawine@5
  2660
sawine@5
  2661
			} else {
sawine@5
  2662
				namespaces = [];
sawine@5
  2663
				handleObj.namespace = "";
sawine@5
  2664
			}
sawine@5
  2665
sawine@5
  2666
			handleObj.type = type;
sawine@5
  2667
			if ( !handleObj.guid ) {
sawine@5
  2668
				handleObj.guid = handler.guid;
sawine@5
  2669
			}
sawine@5
  2670
sawine@5
  2671
			// Get the current list of functions bound to this event
sawine@5
  2672
			var handlers = events[ type ],
sawine@5
  2673
				special = jQuery.event.special[ type ] || {};
sawine@5
  2674
sawine@5
  2675
			// Init the event handler queue
sawine@5
  2676
			if ( !handlers ) {
sawine@5
  2677
				handlers = events[ type ] = [];
sawine@5
  2678
sawine@5
  2679
				// Check for a special event handler
sawine@5
  2680
				// Only use addEventListener/attachEvent if the special
sawine@5
  2681
				// events handler returns false
sawine@5
  2682
				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
sawine@5
  2683
					// Bind the global event handler to the element
sawine@5
  2684
					if ( elem.addEventListener ) {
sawine@5
  2685
						elem.addEventListener( type, eventHandle, false );
sawine@5
  2686
sawine@5
  2687
					} else if ( elem.attachEvent ) {
sawine@5
  2688
						elem.attachEvent( "on" + type, eventHandle );
sawine@5
  2689
					}
sawine@5
  2690
				}
sawine@5
  2691
			}
sawine@5
  2692
sawine@5
  2693
			if ( special.add ) {
sawine@5
  2694
				special.add.call( elem, handleObj );
sawine@5
  2695
sawine@5
  2696
				if ( !handleObj.handler.guid ) {
sawine@5
  2697
					handleObj.handler.guid = handler.guid;
sawine@5
  2698
				}
sawine@5
  2699
			}
sawine@5
  2700
sawine@5
  2701
			// Add the function to the element's handler list
sawine@5
  2702
			handlers.push( handleObj );
sawine@5
  2703
sawine@5
  2704
			// Keep track of which events have been used, for event optimization
sawine@5
  2705
			jQuery.event.global[ type ] = true;
sawine@5
  2706
		}
sawine@5
  2707
sawine@5
  2708
		// Nullify elem to prevent memory leaks in IE
sawine@5
  2709
		elem = null;
sawine@5
  2710
	},
sawine@5
  2711
sawine@5
  2712
	global: {},
sawine@5
  2713
sawine@5
  2714
	// Detach an event or set of events from an element
sawine@5
  2715
	remove: function( elem, types, handler, pos ) {
sawine@5
  2716
		// don't do events on text and comment nodes
sawine@5
  2717
		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
sawine@5
  2718
			return;
sawine@5
  2719
		}
sawine@5
  2720
sawine@5
  2721
		if ( handler === false ) {
sawine@5
  2722
			handler = returnFalse;
sawine@5
  2723
		}
sawine@5
  2724
sawine@5
  2725
		var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
sawine@5
  2726
			elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
sawine@5
  2727
			events = elemData && elemData.events;
sawine@5
  2728
sawine@5
  2729
		if ( !elemData || !events ) {
sawine@5
  2730
			return;
sawine@5
  2731
		}
sawine@5
  2732
sawine@5
  2733
		// types is actually an event object here
sawine@5
  2734
		if ( types && types.type ) {
sawine@5
  2735
			handler = types.handler;
sawine@5
  2736
			types = types.type;
sawine@5
  2737
		}
sawine@5
  2738
sawine@5
  2739
		// Unbind all events for the element
sawine@5
  2740
		if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
sawine@5
  2741
			types = types || "";
sawine@5
  2742
sawine@5
  2743
			for ( type in events ) {
sawine@5
  2744
				jQuery.event.remove( elem, type + types );
sawine@5
  2745
			}
sawine@5
  2746
sawine@5
  2747
			return;
sawine@5
  2748
		}
sawine@5
  2749
sawine@5
  2750
		// Handle multiple events separated by a space
sawine@5
  2751
		// jQuery(...).unbind("mouseover mouseout", fn);
sawine@5
  2752
		types = types.split(" ");
sawine@5
  2753
sawine@5
  2754
		while ( (type = types[ i++ ]) ) {
sawine@5
  2755
			origType = type;
sawine@5
  2756
			handleObj = null;
sawine@5
  2757
			all = type.indexOf(".") < 0;
sawine@5
  2758
			namespaces = [];
sawine@5
  2759
sawine@5
  2760
			if ( !all ) {
sawine@5
  2761
				// Namespaced event handlers
sawine@5
  2762
				namespaces = type.split(".");
sawine@5
  2763
				type = namespaces.shift();
sawine@5
  2764
sawine@5
  2765
				namespace = new RegExp("(^|\\.)" +
sawine@5
  2766
					jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
sawine@5
  2767
			}
sawine@5
  2768
sawine@5
  2769
			eventType = events[ type ];
sawine@5
  2770
sawine@5
  2771
			if ( !eventType ) {
sawine@5
  2772
				continue;
sawine@5
  2773
			}
sawine@5
  2774
sawine@5
  2775
			if ( !handler ) {
sawine@5
  2776
				for ( j = 0; j < eventType.length; j++ ) {
sawine@5
  2777
					handleObj = eventType[ j ];
sawine@5
  2778
sawine@5
  2779
					if ( all || namespace.test( handleObj.namespace ) ) {
sawine@5
  2780
						jQuery.event.remove( elem, origType, handleObj.handler, j );
sawine@5
  2781
						eventType.splice( j--, 1 );
sawine@5
  2782
					}
sawine@5
  2783
				}
sawine@5
  2784
sawine@5
  2785
				continue;
sawine@5
  2786
			}
sawine@5
  2787
sawine@5
  2788
			special = jQuery.event.special[ type ] || {};
sawine@5
  2789
sawine@5
  2790
			for ( j = pos || 0; j < eventType.length; j++ ) {
sawine@5
  2791
				handleObj = eventType[ j ];
sawine@5
  2792
sawine@5
  2793
				if ( handler.guid === handleObj.guid ) {
sawine@5
  2794
					// remove the given handler for the given type
sawine@5
  2795
					if ( all || namespace.test( handleObj.namespace ) ) {
sawine@5
  2796
						if ( pos == null ) {
sawine@5
  2797
							eventType.splice( j--, 1 );
sawine@5
  2798
						}
sawine@5
  2799
sawine@5
  2800
						if ( special.remove ) {
sawine@5
  2801
							special.remove.call( elem, handleObj );
sawine@5
  2802
						}
sawine@5
  2803
					}
sawine@5
  2804
sawine@5
  2805
					if ( pos != null ) {
sawine@5
  2806
						break;
sawine@5
  2807
					}
sawine@5
  2808
				}
sawine@5
  2809
			}
sawine@5
  2810
sawine@5
  2811
			// remove generic event handler if no more handlers exist
sawine@5
  2812
			if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
sawine@5
  2813
				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
sawine@5
  2814
					jQuery.removeEvent( elem, type, elemData.handle );
sawine@5
  2815
				}
sawine@5
  2816
sawine@5
  2817
				ret = null;
sawine@5
  2818
				delete events[ type ];
sawine@5
  2819
			}
sawine@5
  2820
		}
sawine@5
  2821
sawine@5
  2822
		// Remove the expando if it's no longer used
sawine@5
  2823
		if ( jQuery.isEmptyObject( events ) ) {
sawine@5
  2824
			var handle = elemData.handle;
sawine@5
  2825
			if ( handle ) {
sawine@5
  2826
				handle.elem = null;
sawine@5
  2827
			}
sawine@5
  2828
sawine@5
  2829
			delete elemData.events;
sawine@5
  2830
			delete elemData.handle;
sawine@5
  2831
sawine@5
  2832
			if ( jQuery.isEmptyObject( elemData ) ) {
sawine@5
  2833
				jQuery.removeData( elem, undefined, true );
sawine@5
  2834
			}
sawine@5
  2835
		}
sawine@5
  2836
	},
sawine@5
  2837
	
sawine@5
  2838
	// Events that are safe to short-circuit if no handlers are attached.
sawine@5
  2839
	// Native DOM events should not be added, they may have inline handlers.
sawine@5
  2840
	customEvent: {
sawine@5
  2841
		"getData": true,
sawine@5
  2842
		"setData": true,
sawine@5
  2843
		"changeData": true
sawine@5
  2844
	},
sawine@5
  2845
sawine@5
  2846
	trigger: function( event, data, elem, onlyHandlers ) {
sawine@5
  2847
		// Event object or event type
sawine@5
  2848
		var type = event.type || event,
sawine@5
  2849
			namespaces = [],
sawine@5
  2850
			exclusive;
sawine@5
  2851
sawine@5
  2852
		if ( type.indexOf("!") >= 0 ) {
sawine@5
  2853
			// Exclusive events trigger only for the exact event (no namespaces)
sawine@5
  2854
			type = type.slice(0, -1);
sawine@5
  2855
			exclusive = true;
sawine@5
  2856
		}
sawine@5
  2857
sawine@5
  2858
		if ( type.indexOf(".") >= 0 ) {
sawine@5
  2859
			// Namespaced trigger; create a regexp to match event type in handle()
sawine@5
  2860
			namespaces = type.split(".");
sawine@5
  2861
			type = namespaces.shift();
sawine@5
  2862
			namespaces.sort();
sawine@5
  2863
		}
sawine@5
  2864
sawine@5
  2865
		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
sawine@5
  2866
			// No jQuery handlers for this event type, and it can't have inline handlers
sawine@5
  2867
			return;
sawine@5
  2868
		}
sawine@5
  2869
sawine@5
  2870
		// Caller can pass in an Event, Object, or just an event type string
sawine@5
  2871
		event = typeof event === "object" ?
sawine@5
  2872
			// jQuery.Event object
sawine@5
  2873
			event[ jQuery.expando ] ? event :
sawine@5
  2874
			// Object literal
sawine@5
  2875
			new jQuery.Event( type, event ) :
sawine@5
  2876
			// Just the event type (string)
sawine@5
  2877
			new jQuery.Event( type );
sawine@5
  2878
sawine@5
  2879
		event.type = type;
sawine@5
  2880
		event.exclusive = exclusive;
sawine@5
  2881
		event.namespace = namespaces.join(".");
sawine@5
  2882
		event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)");
sawine@5
  2883
		
sawine@5
  2884
		// triggerHandler() and global events don't bubble or run the default action
sawine@5
  2885
		if ( onlyHandlers || !elem ) {
sawine@5
  2886
			event.preventDefault();
sawine@5
  2887
			event.stopPropagation();
sawine@5
  2888
		}
sawine@5
  2889
sawine@5
  2890
		// Handle a global trigger
sawine@5
  2891
		if ( !elem ) {
sawine@5
  2892
			// TODO: Stop taunting the data cache; remove global events and always attach to document
sawine@5
  2893
			jQuery.each( jQuery.cache, function() {
sawine@5
  2894
				// internalKey variable is just used to make it easier to find
sawine@5
  2895
				// and potentially change this stuff later; currently it just
sawine@5
  2896
				// points to jQuery.expando
sawine@5
  2897
				var internalKey = jQuery.expando,
sawine@5
  2898
					internalCache = this[ internalKey ];
sawine@5
  2899
				if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
sawine@5
  2900
					jQuery.event.trigger( event, data, internalCache.handle.elem );
sawine@5
  2901
				}
sawine@5
  2902
			});
sawine@5
  2903
			return;
sawine@5
  2904
		}
sawine@5
  2905
sawine@5
  2906
		// Don't do events on text and comment nodes
sawine@5
  2907
		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
sawine@5
  2908
			return;
sawine@5
  2909
		}
sawine@5
  2910
sawine@5
  2911
		// Clean up the event in case it is being reused
sawine@5
  2912
		event.result = undefined;
sawine@5
  2913
		event.target = elem;
sawine@5
  2914
sawine@5
  2915
		// Clone any incoming data and prepend the event, creating the handler arg list
sawine@5
  2916
		data = data != null ? jQuery.makeArray( data ) : [];
sawine@5
  2917
		data.unshift( event );
sawine@5
  2918
sawine@5
  2919
		var cur = elem,
sawine@5
  2920
			// IE doesn't like method names with a colon (#3533, #8272)
sawine@5
  2921
			ontype = type.indexOf(":") < 0 ? "on" + type : "";
sawine@5
  2922
sawine@5
  2923
		// Fire event on the current element, then bubble up the DOM tree
sawine@5
  2924
		do {
sawine@5
  2925
			var handle = jQuery._data( cur, "handle" );
sawine@5
  2926
sawine@5
  2927
			event.currentTarget = cur;
sawine@5
  2928
			if ( handle ) {
sawine@5
  2929
				handle.apply( cur, data );
sawine@5
  2930
			}
sawine@5
  2931
sawine@5
  2932
			// Trigger an inline bound script
sawine@5
  2933
			if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) {
sawine@5
  2934
				event.result = false;
sawine@5
  2935
				event.preventDefault();
sawine@5
  2936
			}
sawine@5
  2937
sawine@5
  2938
			// Bubble up to document, then to window
sawine@5
  2939
			cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window;
sawine@5
  2940
		} while ( cur && !event.isPropagationStopped() );
sawine@5
  2941
sawine@5
  2942
		// If nobody prevented the default action, do it now
sawine@5
  2943
		if ( !event.isDefaultPrevented() ) {
sawine@5
  2944
			var old,
sawine@5
  2945
				special = jQuery.event.special[ type ] || {};
sawine@5
  2946
sawine@5
  2947
			if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) &&
sawine@5
  2948
				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
sawine@5
  2949
sawine@5
  2950
				// Call a native DOM method on the target with the same name name as the event.
sawine@5
  2951
				// Can't use an .isFunction)() check here because IE6/7 fails that test.
sawine@5
  2952
				// IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch.
sawine@5
  2953
				try {
sawine@5
  2954
					if ( ontype && elem[ type ] ) {
sawine@5
  2955
						// Don't re-trigger an onFOO event when we call its FOO() method
sawine@5
  2956
						old = elem[ ontype ];
sawine@5
  2957
sawine@5
  2958
						if ( old ) {
sawine@5
  2959
							elem[ ontype ] = null;
sawine@5
  2960
						}
sawine@5
  2961
sawine@5
  2962
						jQuery.event.triggered = type;
sawine@5
  2963
						elem[ type ]();
sawine@5
  2964
					}
sawine@5
  2965
				} catch ( ieError ) {}
sawine@5
  2966
sawine@5
  2967
				if ( old ) {
sawine@5
  2968
					elem[ ontype ] = old;
sawine@5
  2969
				}
sawine@5
  2970
sawine@5
  2971
				jQuery.event.triggered = undefined;
sawine@5
  2972
			}
sawine@5
  2973
		}
sawine@5
  2974
		
sawine@5
  2975
		return event.result;
sawine@5
  2976
	},
sawine@5
  2977
sawine@5
  2978
	handle: function( event ) {
sawine@5
  2979
		event = jQuery.event.fix( event || window.event );
sawine@5
  2980
		// Snapshot the handlers list since a called handler may add/remove events.
sawine@5
  2981
		var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0),
sawine@5
  2982
			run_all = !event.exclusive && !event.namespace,
sawine@5
  2983
			args = Array.prototype.slice.call( arguments, 0 );
sawine@5
  2984
sawine@5
  2985
		// Use the fix-ed Event rather than the (read-only) native event
sawine@5
  2986
		args[0] = event;
sawine@5
  2987
		event.currentTarget = this;
sawine@5
  2988
sawine@5
  2989
		for ( var j = 0, l = handlers.length; j < l; j++ ) {
sawine@5
  2990
			var handleObj = handlers[ j ];
sawine@5
  2991
sawine@5
  2992
			// Triggered event must 1) be non-exclusive and have no namespace, or
sawine@5
  2993
			// 2) have namespace(s) a subset or equal to those in the bound event.
sawine@5
  2994
			if ( run_all || event.namespace_re.test( handleObj.namespace ) ) {
sawine@5
  2995
				// Pass in a reference to the handler function itself
sawine@5
  2996
				// So that we can later remove it
sawine@5
  2997
				event.handler = handleObj.handler;
sawine@5
  2998
				event.data = handleObj.data;
sawine@5
  2999
				event.handleObj = handleObj;
sawine@5
  3000
sawine@5
  3001
				var ret = handleObj.handler.apply( this, args );
sawine@5
  3002
sawine@5
  3003
				if ( ret !== undefined ) {
sawine@5
  3004
					event.result = ret;
sawine@5
  3005
					if ( ret === false ) {
sawine@5
  3006
						event.preventDefault();
sawine@5
  3007
						event.stopPropagation();
sawine@5
  3008
					}
sawine@5
  3009
				}
sawine@5
  3010
sawine@5
  3011
				if ( event.isImmediatePropagationStopped() ) {
sawine@5
  3012
					break;
sawine@5
  3013
				}
sawine@5
  3014
			}
sawine@5
  3015
		}
sawine@5
  3016
		return event.result;
sawine@5
  3017
	},
sawine@5
  3018
sawine@5
  3019
	props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
sawine@5
  3020
sawine@5
  3021
	fix: function( event ) {
sawine@5
  3022
		if ( event[ jQuery.expando ] ) {
sawine@5
  3023
			return event;
sawine@5
  3024
		}
sawine@5
  3025
sawine@5
  3026
		// store a copy of the original event object
sawine@5
  3027
		// and "clone" to set read-only properties
sawine@5
  3028
		var originalEvent = event;
sawine@5
  3029
		event = jQuery.Event( originalEvent );
sawine@5
  3030
sawine@5
  3031
		for ( var i = this.props.length, prop; i; ) {
sawine@5
  3032
			prop = this.props[ --i ];
sawine@5
  3033
			event[ prop ] = originalEvent[ prop ];
sawine@5
  3034
		}
sawine@5
  3035
sawine@5
  3036
		// Fix target property, if necessary
sawine@5
  3037
		if ( !event.target ) {
sawine@5
  3038
			// Fixes #1925 where srcElement might not be defined either
sawine@5
  3039
			event.target = event.srcElement || document;
sawine@5
  3040
		}
sawine@5
  3041
sawine@5
  3042
		// check if target is a textnode (safari)
sawine@5
  3043
		if ( event.target.nodeType === 3 ) {
sawine@5
  3044
			event.target = event.target.parentNode;
sawine@5
  3045
		}
sawine@5
  3046
sawine@5
  3047
		// Add relatedTarget, if necessary
sawine@5
  3048
		if ( !event.relatedTarget && event.fromElement ) {
sawine@5
  3049
			event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
sawine@5
  3050
		}
sawine@5
  3051
sawine@5
  3052
		// Calculate pageX/Y if missing and clientX/Y available
sawine@5
  3053
		if ( event.pageX == null && event.clientX != null ) {
sawine@5
  3054
			var eventDocument = event.target.ownerDocument || document,
sawine@5
  3055
				doc = eventDocument.documentElement,
sawine@5
  3056
				body = eventDocument.body;
sawine@5
  3057
sawine@5
  3058
			event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
sawine@5
  3059
			event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
sawine@5
  3060
		}
sawine@5
  3061
sawine@5
  3062
		// Add which for key events
sawine@5
  3063
		if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
sawine@5
  3064
			event.which = event.charCode != null ? event.charCode : event.keyCode;
sawine@5
  3065
		}
sawine@5
  3066
sawine@5
  3067
		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
sawine@5
  3068
		if ( !event.metaKey && event.ctrlKey ) {
sawine@5
  3069
			event.metaKey = event.ctrlKey;
sawine@5
  3070
		}
sawine@5
  3071
sawine@5
  3072
		// Add which for click: 1 === left; 2 === middle; 3 === right
sawine@5
  3073
		// Note: button is not normalized, so don't use it
sawine@5
  3074
		if ( !event.which && event.button !== undefined ) {
sawine@5
  3075
			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
sawine@5
  3076
		}
sawine@5
  3077
sawine@5
  3078
		return event;
sawine@5
  3079
	},
sawine@5
  3080
sawine@5
  3081
	// Deprecated, use jQuery.guid instead
sawine@5
  3082
	guid: 1E8,
sawine@5
  3083
sawine@5
  3084
	// Deprecated, use jQuery.proxy instead
sawine@5
  3085
	proxy: jQuery.proxy,
sawine@5
  3086
sawine@5
  3087
	special: {
sawine@5
  3088
		ready: {
sawine@5
  3089
			// Make sure the ready event is setup
sawine@5
  3090
			setup: jQuery.bindReady,
sawine@5
  3091
			teardown: jQuery.noop
sawine@5
  3092
		},
sawine@5
  3093
sawine@5
  3094
		live: {
sawine@5
  3095
			add: function( handleObj ) {
sawine@5
  3096
				jQuery.event.add( this,
sawine@5
  3097
					liveConvert( handleObj.origType, handleObj.selector ),
sawine@5
  3098
					jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
sawine@5
  3099
			},
sawine@5
  3100
sawine@5
  3101
			remove: function( handleObj ) {
sawine@5
  3102
				jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
sawine@5
  3103
			}
sawine@5
  3104
		},
sawine@5
  3105
sawine@5
  3106
		beforeunload: {
sawine@5
  3107
			setup: function( data, namespaces, eventHandle ) {
sawine@5
  3108
				// We only want to do this special case on windows
sawine@5
  3109
				if ( jQuery.isWindow( this ) ) {
sawine@5
  3110
					this.onbeforeunload = eventHandle;
sawine@5
  3111
				}
sawine@5
  3112
			},
sawine@5
  3113
sawine@5
  3114
			teardown: function( namespaces, eventHandle ) {
sawine@5
  3115
				if ( this.onbeforeunload === eventHandle ) {
sawine@5
  3116
					this.onbeforeunload = null;
sawine@5
  3117
				}
sawine@5
  3118
			}
sawine@5
  3119
		}
sawine@5
  3120
	}
sawine@5
  3121
};
sawine@5
  3122
sawine@5
  3123
jQuery.removeEvent = document.removeEventListener ?
sawine@5
  3124
	function( elem, type, handle ) {
sawine@5
  3125
		if ( elem.removeEventListener ) {
sawine@5
  3126
			elem.removeEventListener( type, handle, false );
sawine@5
  3127
		}
sawine@5
  3128
	} :
sawine@5
  3129
	function( elem, type, handle ) {
sawine@5
  3130
		if ( elem.detachEvent ) {
sawine@5
  3131
			elem.detachEvent( "on" + type, handle );
sawine@5
  3132
		}
sawine@5
  3133
	};
sawine@5
  3134
sawine@5
  3135
jQuery.Event = function( src, props ) {
sawine@5
  3136
	// Allow instantiation without the 'new' keyword
sawine@5
  3137
	if ( !this.preventDefault ) {
sawine@5
  3138
		return new jQuery.Event( src, props );
sawine@5
  3139
	}
sawine@5
  3140
sawine@5
  3141
	// Event object
sawine@5
  3142
	if ( src && src.type ) {
sawine@5
  3143
		this.originalEvent = src;
sawine@5
  3144
		this.type = src.type;
sawine@5
  3145
sawine@5
  3146
		// Events bubbling up the document may have been marked as prevented
sawine@5
  3147
		// by a handler lower down the tree; reflect the correct value.
sawine@5
  3148
		this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
sawine@5
  3149
			src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
sawine@5
  3150
sawine@5
  3151
	// Event type
sawine@5
  3152
	} else {
sawine@5
  3153
		this.type = src;
sawine@5
  3154
	}
sawine@5
  3155
sawine@5
  3156
	// Put explicitly provided properties onto the event object
sawine@5
  3157
	if ( props ) {
sawine@5
  3158
		jQuery.extend( this, props );
sawine@5
  3159
	}
sawine@5
  3160
sawine@5
  3161
	// timeStamp is buggy for some events on Firefox(#3843)
sawine@5
  3162
	// So we won't rely on the native value
sawine@5
  3163
	this.timeStamp = jQuery.now();
sawine@5
  3164
sawine@5
  3165
	// Mark it as fixed
sawine@5
  3166
	this[ jQuery.expando ] = true;
sawine@5
  3167
};
sawine@5
  3168
sawine@5
  3169
function returnFalse() {
sawine@5
  3170
	return false;
sawine@5
  3171
}
sawine@5
  3172
function returnTrue() {
sawine@5
  3173
	return true;
sawine@5
  3174
}
sawine@5
  3175
sawine@5
  3176
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
sawine@5
  3177
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
sawine@5
  3178
jQuery.Event.prototype = {
sawine@5
  3179
	preventDefault: function() {
sawine@5
  3180
		this.isDefaultPrevented = returnTrue;
sawine@5
  3181
sawine@5
  3182
		var e = this.originalEvent;
sawine@5
  3183
		if ( !e ) {
sawine@5
  3184
			return;
sawine@5
  3185
		}
sawine@5
  3186
sawine@5
  3187
		// if preventDefault exists run it on the original event
sawine@5
  3188
		if ( e.preventDefault ) {
sawine@5
  3189
			e.preventDefault();
sawine@5
  3190
sawine@5
  3191
		// otherwise set the returnValue property of the original event to false (IE)
sawine@5
  3192
		} else {
sawine@5
  3193
			e.returnValue = false;
sawine@5
  3194
		}
sawine@5
  3195
	},
sawine@5
  3196
	stopPropagation: function() {
sawine@5
  3197
		this.isPropagationStopped = returnTrue;
sawine@5
  3198
sawine@5
  3199
		var e = this.originalEvent;
sawine@5
  3200
		if ( !e ) {
sawine@5
  3201
			return;
sawine@5
  3202
		}
sawine@5
  3203
		// if stopPropagation exists run it on the original event
sawine@5
  3204
		if ( e.stopPropagation ) {
sawine@5
  3205
			e.stopPropagation();
sawine@5
  3206
		}
sawine@5
  3207
		// otherwise set the cancelBubble property of the original event to true (IE)
sawine@5
  3208
		e.cancelBubble = true;
sawine@5
  3209
	},
sawine@5
  3210
	stopImmediatePropagation: function() {
sawine@5
  3211
		this.isImmediatePropagationStopped = returnTrue;
sawine@5
  3212
		this.stopPropagation();
sawine@5
  3213
	},
sawine@5
  3214
	isDefaultPrevented: returnFalse,
sawine@5
  3215
	isPropagationStopped: returnFalse,
sawine@5
  3216
	isImmediatePropagationStopped: returnFalse
sawine@5
  3217
};
sawine@5
  3218
sawine@5
  3219
// Checks if an event happened on an element within another element
sawine@5
  3220
// Used in jQuery.event.special.mouseenter and mouseleave handlers
sawine@5
  3221
var withinElement = function( event ) {
sawine@5
  3222
sawine@5
  3223
	// Check if mouse(over|out) are still within the same parent element
sawine@5
  3224
	var related = event.relatedTarget,
sawine@5
  3225
		inside = false,
sawine@5
  3226
		eventType = event.type;
sawine@5
  3227
sawine@5
  3228
	event.type = event.data;
sawine@5
  3229
sawine@5
  3230
	if ( related !== this ) {
sawine@5
  3231
sawine@5
  3232
		if ( related ) {
sawine@5
  3233
			inside = jQuery.contains( this, related );
sawine@5
  3234
		}
sawine@5
  3235
sawine@5
  3236
		if ( !inside ) {
sawine@5
  3237
sawine@5
  3238
			jQuery.event.handle.apply( this, arguments );
sawine@5
  3239
sawine@5
  3240
			event.type = eventType;
sawine@5
  3241
		}
sawine@5
  3242
	}
sawine@5
  3243
},
sawine@5
  3244
sawine@5
  3245
// In case of event delegation, we only need to rename the event.type,
sawine@5
  3246
// liveHandler will take care of the rest.
sawine@5
  3247
delegate = function( event ) {
sawine@5
  3248
	event.type = event.data;
sawine@5
  3249
	jQuery.event.handle.apply( this, arguments );
sawine@5
  3250
};
sawine@5
  3251
sawine@5
  3252
// Create mouseenter and mouseleave events
sawine@5
  3253
jQuery.each({
sawine@5
  3254
	mouseenter: "mouseover",
sawine@5
  3255
	mouseleave: "mouseout"
sawine@5
  3256
}, function( orig, fix ) {
sawine@5
  3257
	jQuery.event.special[ orig ] = {
sawine@5
  3258
		setup: function( data ) {
sawine@5
  3259
			jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
sawine@5
  3260
		},
sawine@5
  3261
		teardown: function( data ) {
sawine@5
  3262
			jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
sawine@5
  3263
		}
sawine@5
  3264
	};
sawine@5
  3265
});
sawine@5
  3266
sawine@5
  3267
// submit delegation
sawine@5
  3268
if ( !jQuery.support.submitBubbles ) {
sawine@5
  3269
sawine@5
  3270
	jQuery.event.special.submit = {
sawine@5
  3271
		setup: function( data, namespaces ) {
sawine@5
  3272
			if ( !jQuery.nodeName( this, "form" ) ) {
sawine@5
  3273
				jQuery.event.add(this, "click.specialSubmit", function( e ) {
sawine@5
  3274
					// Avoid triggering error on non-existent type attribute in IE VML (#7071)
sawine@5
  3275
					var elem = e.target,
sawine@5
  3276
						type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : "";
sawine@5
  3277
sawine@5
  3278
					if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
sawine@5
  3279
						trigger( "submit", this, arguments );
sawine@5
  3280
					}
sawine@5
  3281
				});
sawine@5
  3282
sawine@5
  3283
				jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
sawine@5
  3284
					var elem = e.target,
sawine@5
  3285
						type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : "";
sawine@5
  3286
sawine@5
  3287
					if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
sawine@5
  3288
						trigger( "submit", this, arguments );
sawine@5
  3289
					}
sawine@5
  3290
				});
sawine@5
  3291
sawine@5
  3292
			} else {
sawine@5
  3293
				return false;
sawine@5
  3294
			}
sawine@5
  3295
		},
sawine@5
  3296
sawine@5
  3297
		teardown: function( namespaces ) {
sawine@5
  3298
			jQuery.event.remove( this, ".specialSubmit" );
sawine@5
  3299
		}
sawine@5
  3300
	};
sawine@5
  3301
sawine@5
  3302
}
sawine@5
  3303
sawine@5
  3304
// change delegation, happens here so we have bind.
sawine@5
  3305
if ( !jQuery.support.changeBubbles ) {
sawine@5
  3306
sawine@5
  3307
	var changeFilters,
sawine@5
  3308
sawine@5
  3309
	getVal = function( elem ) {
sawine@5
  3310
		var type = jQuery.nodeName( elem, "input" ) ? elem.type : "",
sawine@5
  3311
			val = elem.value;
sawine@5
  3312
sawine@5
  3313
		if ( type === "radio" || type === "checkbox" ) {
sawine@5
  3314
			val = elem.checked;
sawine@5
  3315
sawine@5
  3316
		} else if ( type === "select-multiple" ) {
sawine@5
  3317
			val = elem.selectedIndex > -1 ?
sawine@5
  3318
				jQuery.map( elem.options, function( elem ) {
sawine@5
  3319
					return elem.selected;
sawine@5
  3320
				}).join("-") :
sawine@5
  3321
				"";
sawine@5
  3322
sawine@5
  3323
		} else if ( jQuery.nodeName( elem, "select" ) ) {
sawine@5
  3324
			val = elem.selectedIndex;
sawine@5
  3325
		}
sawine@5
  3326
sawine@5
  3327
		return val;
sawine@5
  3328
	},
sawine@5
  3329
sawine@5
  3330
	testChange = function testChange( e ) {
sawine@5
  3331
		var elem = e.target, data, val;
sawine@5
  3332
sawine@5
  3333
		if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
sawine@5
  3334
			return;
sawine@5
  3335
		}
sawine@5
  3336
sawine@5
  3337
		data = jQuery._data( elem, "_change_data" );
sawine@5
  3338
		val = getVal(elem);
sawine@5
  3339
sawine@5
  3340
		// the current data will be also retrieved by beforeactivate
sawine@5
  3341
		if ( e.type !== "focusout" || elem.type !== "radio" ) {
sawine@5
  3342
			jQuery._data( elem, "_change_data", val );
sawine@5
  3343
		}
sawine@5
  3344
sawine@5
  3345
		if ( data === undefined || val === data ) {
sawine@5
  3346
			return;
sawine@5
  3347
		}
sawine@5
  3348
sawine@5
  3349
		if ( data != null || val ) {
sawine@5
  3350
			e.type = "change";
sawine@5
  3351
			e.liveFired = undefined;
sawine@5
  3352
			jQuery.event.trigger( e, arguments[1], elem );
sawine@5
  3353
		}
sawine@5
  3354
	};
sawine@5
  3355
sawine@5
  3356
	jQuery.event.special.change = {
sawine@5
  3357
		filters: {
sawine@5
  3358
			focusout: testChange,
sawine@5
  3359
sawine@5
  3360
			beforedeactivate: testChange,
sawine@5
  3361
sawine@5
  3362
			click: function( e ) {
sawine@5
  3363
				var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
sawine@5
  3364
sawine@5
  3365
				if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) {
sawine@5
  3366
					testChange.call( this, e );
sawine@5
  3367
				}
sawine@5
  3368
			},
sawine@5
  3369
sawine@5
  3370
			// Change has to be called before submit
sawine@5
  3371
			// Keydown will be called before keypress, which is used in submit-event delegation
sawine@5
  3372
			keydown: function( e ) {
sawine@5
  3373
				var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
sawine@5
  3374
sawine@5
  3375
				if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) ||
sawine@5
  3376
					(e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
sawine@5
  3377
					type === "select-multiple" ) {
sawine@5
  3378
					testChange.call( this, e );
sawine@5
  3379
				}
sawine@5
  3380
			},
sawine@5
  3381
sawine@5
  3382
			// Beforeactivate happens also before the previous element is blurred
sawine@5
  3383
			// with this event you can't trigger a change event, but you can store
sawine@5
  3384
			// information
sawine@5
  3385
			beforeactivate: function( e ) {
sawine@5
  3386
				var elem = e.target;
sawine@5
  3387
				jQuery._data( elem, "_change_data", getVal(elem) );
sawine@5
  3388
			}
sawine@5
  3389
		},
sawine@5
  3390
sawine@5
  3391
		setup: function( data, namespaces ) {
sawine@5
  3392
			if ( this.type === "file" ) {
sawine@5
  3393
				return false;
sawine@5
  3394
			}
sawine@5
  3395
sawine@5
  3396
			for ( var type in changeFilters ) {
sawine@5
  3397
				jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
sawine@5
  3398
			}
sawine@5
  3399
sawine@5
  3400
			return rformElems.test( this.nodeName );
sawine@5
  3401
		},
sawine@5
  3402
sawine@5
  3403
		teardown: function( namespaces ) {
sawine@5
  3404
			jQuery.event.remove( this, ".specialChange" );
sawine@5
  3405
sawine@5
  3406
			return rformElems.test( this.nodeName );
sawine@5
  3407
		}
sawine@5
  3408
	};
sawine@5
  3409
sawine@5
  3410
	changeFilters = jQuery.event.special.change.filters;
sawine@5
  3411
sawine@5
  3412
	// Handle when the input is .focus()'d
sawine@5
  3413
	changeFilters.focus = changeFilters.beforeactivate;
sawine@5
  3414
}
sawine@5
  3415
sawine@5
  3416
function trigger( type, elem, args ) {
sawine@5
  3417
	// Piggyback on a donor event to simulate a different one.
sawine@5
  3418
	// Fake originalEvent to avoid donor's stopPropagation, but if the
sawine@5
  3419
	// simulated event prevents default then we do the same on the donor.
sawine@5
  3420
	// Don't pass args or remember liveFired; they apply to the donor event.
sawine@5
  3421
	var event = jQuery.extend( {}, args[ 0 ] );
sawine@5
  3422
	event.type = type;
sawine@5
  3423
	event.originalEvent = {};
sawine@5
  3424
	event.liveFired = undefined;
sawine@5
  3425
	jQuery.event.handle.call( elem, event );
sawine@5
  3426
	if ( event.isDefaultPrevented() ) {
sawine@5
  3427
		args[ 0 ].preventDefault();
sawine@5
  3428
	}
sawine@5
  3429
}
sawine@5
  3430
sawine@5
  3431
// Create "bubbling" focus and blur events
sawine@5
  3432
if ( !jQuery.support.focusinBubbles ) {
sawine@5
  3433
	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
sawine@5
  3434
sawine@5
  3435
		// Attach a single capturing handler while someone wants focusin/focusout
sawine@5
  3436
		var attaches = 0;
sawine@5
  3437
sawine@5
  3438
		jQuery.event.special[ fix ] = {
sawine@5
  3439
			setup: function() {
sawine@5
  3440
				if ( attaches++ === 0 ) {
sawine@5
  3441
					document.addEventListener( orig, handler, true );
sawine@5
  3442
				}
sawine@5
  3443
			},
sawine@5
  3444
			teardown: function() {
sawine@5
  3445
				if ( --attaches === 0 ) {
sawine@5
  3446
					document.removeEventListener( orig, handler, true );
sawine@5
  3447
				}
sawine@5
  3448
			}
sawine@5
  3449
		};
sawine@5
  3450
sawine@5
  3451
		function handler( donor ) {
sawine@5
  3452
			// Donor event is always a native one; fix it and switch its type.
sawine@5
  3453
			// Let focusin/out handler cancel the donor focus/blur event.
sawine@5
  3454
			var e = jQuery.event.fix( donor );
sawine@5
  3455
			e.type = fix;
sawine@5
  3456
			e.originalEvent = {};
sawine@5
  3457
			jQuery.event.trigger( e, null, e.target );
sawine@5
  3458
			if ( e.isDefaultPrevented() ) {
sawine@5
  3459
				donor.preventDefault();
sawine@5
  3460
			}
sawine@5
  3461
		}
sawine@5
  3462
	});
sawine@5
  3463
}
sawine@5
  3464
sawine@5
  3465
jQuery.each(["bind", "one"], function( i, name ) {
sawine@5
  3466
	jQuery.fn[ name ] = function( type, data, fn ) {
sawine@5
  3467
		var handler;
sawine@5
  3468
sawine@5
  3469
		// Handle object literals
sawine@5
  3470
		if ( typeof type === "object" ) {
sawine@5
  3471
			for ( var key in type ) {
sawine@5
  3472
				this[ name ](key, data, type[key], fn);
sawine@5
  3473
			}
sawine@5
  3474
			return this;
sawine@5
  3475
		}
sawine@5
  3476
sawine@5
  3477
		if ( arguments.length === 2 || data === false ) {
sawine@5
  3478
			fn = data;
sawine@5
  3479
			data = undefined;
sawine@5
  3480
		}
sawine@5
  3481
sawine@5
  3482
		if ( name === "one" ) {
sawine@5
  3483
			handler = function( event ) {
sawine@5
  3484
				jQuery( this ).unbind( event, handler );
sawine@5
  3485
				return fn.apply( this, arguments );
sawine@5
  3486
			};
sawine@5
  3487
			handler.guid = fn.guid || jQuery.guid++;
sawine@5
  3488
		} else {
sawine@5
  3489
			handler = fn;
sawine@5
  3490
		}
sawine@5
  3491
sawine@5
  3492
		if ( type === "unload" && name !== "one" ) {
sawine@5
  3493
			this.one( type, data, fn );
sawine@5
  3494
sawine@5
  3495
		} else {
sawine@5
  3496
			for ( var i = 0, l = this.length; i < l; i++ ) {
sawine@5
  3497
				jQuery.event.add( this[i], type, handler, data );
sawine@5
  3498
			}
sawine@5
  3499
		}
sawine@5
  3500
sawine@5
  3501
		return this;
sawine@5
  3502
	};
sawine@5
  3503
});
sawine@5
  3504
sawine@5
  3505
jQuery.fn.extend({
sawine@5
  3506
	unbind: function( type, fn ) {
sawine@5
  3507
		// Handle object literals
sawine@5
  3508
		if ( typeof type === "object" && !type.preventDefault ) {
sawine@5
  3509
			for ( var key in type ) {
sawine@5
  3510
				this.unbind(key, type[key]);
sawine@5
  3511
			}
sawine@5
  3512
sawine@5
  3513
		} else {
sawine@5
  3514
			for ( var i = 0, l = this.length; i < l; i++ ) {
sawine@5
  3515
				jQuery.event.remove( this[i], type, fn );
sawine@5
  3516
			}
sawine@5
  3517
		}
sawine@5
  3518
sawine@5
  3519
		return this;
sawine@5
  3520
	},
sawine@5
  3521
sawine@5
  3522
	delegate: function( selector, types, data, fn ) {
sawine@5
  3523
		return this.live( types, data, fn, selector );
sawine@5
  3524
	},
sawine@5
  3525
sawine@5
  3526
	undelegate: function( selector, types, fn ) {
sawine@5
  3527
		if ( arguments.length === 0 ) {
sawine@5
  3528
			return this.unbind( "live" );
sawine@5
  3529
sawine@5
  3530
		} else {
sawine@5
  3531
			return this.die( types, null, fn, selector );
sawine@5
  3532
		}
sawine@5
  3533
	},
sawine@5
  3534
sawine@5
  3535
	trigger: function( type, data ) {
sawine@5
  3536
		return this.each(function() {
sawine@5
  3537
			jQuery.event.trigger( type, data, this );
sawine@5
  3538
		});
sawine@5
  3539
	},
sawine@5
  3540
sawine@5
  3541
	triggerHandler: function( type, data ) {
sawine@5
  3542
		if ( this[0] ) {
sawine@5
  3543
			return jQuery.event.trigger( type, data, this[0], true );
sawine@5
  3544
		}
sawine@5
  3545
	},
sawine@5
  3546
sawine@5
  3547
	toggle: function( fn ) {
sawine@5
  3548
		// Save reference to arguments for access in closure
sawine@5
  3549
		var args = arguments,
sawine@5
  3550
			guid = fn.guid || jQuery.guid++,
sawine@5
  3551
			i = 0,
sawine@5
  3552
			toggler = function( event ) {
sawine@5
  3553
				// Figure out which function to execute
sawine@5
  3554
				var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
sawine@5
  3555
				jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
sawine@5
  3556
sawine@5
  3557
				// Make sure that clicks stop
sawine@5
  3558
				event.preventDefault();
sawine@5
  3559
sawine@5
  3560
				// and execute the function
sawine@5
  3561
				return args[ lastToggle ].apply( this, arguments ) || false;
sawine@5
  3562
			};
sawine@5
  3563
sawine@5
  3564
		// link all the functions, so any of them can unbind this click handler
sawine@5
  3565
		toggler.guid = guid;
sawine@5
  3566
		while ( i < args.length ) {
sawine@5
  3567
			args[ i++ ].guid = guid;
sawine@5
  3568
		}
sawine@5
  3569
sawine@5
  3570
		return this.click( toggler );
sawine@5
  3571
	},
sawine@5
  3572
sawine@5
  3573
	hover: function( fnOver, fnOut ) {
sawine@5
  3574
		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
sawine@5
  3575
	}
sawine@5
  3576
});
sawine@5
  3577
sawine@5
  3578
var liveMap = {
sawine@5
  3579
	focus: "focusin",
sawine@5
  3580
	blur: "focusout",
sawine@5
  3581
	mouseenter: "mouseover",
sawine@5
  3582
	mouseleave: "mouseout"
sawine@5
  3583
};
sawine@5
  3584
sawine@5
  3585
jQuery.each(["live", "die"], function( i, name ) {
sawine@5
  3586
	jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
sawine@5
  3587
		var type, i = 0, match, namespaces, preType,
sawine@5
  3588
			selector = origSelector || this.selector,
sawine@5
  3589
			context = origSelector ? this : jQuery( this.context );
sawine@5
  3590
sawine@5
  3591
		if ( typeof types === "object" && !types.preventDefault ) {
sawine@5
  3592
			for ( var key in types ) {
sawine@5
  3593
				context[ name ]( key, data, types[key], selector );
sawine@5
  3594
			}
sawine@5
  3595
sawine@5
  3596
			return this;
sawine@5
  3597
		}
sawine@5
  3598
sawine@5
  3599
		if ( name === "die" && !types &&
sawine@5
  3600
					origSelector && origSelector.charAt(0) === "." ) {
sawine@5
  3601
sawine@5
  3602
			context.unbind( origSelector );
sawine@5
  3603
sawine@5
  3604
			return this;
sawine@5
  3605
		}
sawine@5
  3606
sawine@5
  3607
		if ( data === false || jQuery.isFunction( data ) ) {
sawine@5
  3608
			fn = data || returnFalse;
sawine@5
  3609
			data = undefined;
sawine@5
  3610
		}
sawine@5
  3611
sawine@5
  3612
		types = (types || "").split(" ");
sawine@5
  3613
sawine@5
  3614
		while ( (type = types[ i++ ]) != null ) {
sawine@5
  3615
			match = rnamespaces.exec( type );
sawine@5
  3616
			namespaces = "";
sawine@5
  3617
sawine@5
  3618
			if ( match )  {
sawine@5
  3619
				namespaces = match[0];
sawine@5
  3620
				type = type.replace( rnamespaces, "" );
sawine@5
  3621
			}
sawine@5
  3622
sawine@5
  3623
			if ( type === "hover" ) {
sawine@5
  3624
				types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
sawine@5
  3625
				continue;
sawine@5
  3626
			}
sawine@5
  3627
sawine@5
  3628
			preType = type;
sawine@5
  3629
sawine@5
  3630
			if ( liveMap[ type ] ) {
sawine@5
  3631
				types.push( liveMap[ type ] + namespaces );
sawine@5
  3632
				type = type + namespaces;
sawine@5
  3633
sawine@5
  3634
			} else {
sawine@5
  3635
				type = (liveMap[ type ] || type) + namespaces;
sawine@5
  3636
			}
sawine@5
  3637
sawine@5
  3638
			if ( name === "live" ) {
sawine@5
  3639
				// bind live handler
sawine@5
  3640
				for ( var j = 0, l = context.length; j < l; j++ ) {
sawine@5
  3641
					jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
sawine@5
  3642
						{ data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
sawine@5
  3643
				}
sawine@5
  3644
sawine@5
  3645
			} else {
sawine@5
  3646
				// unbind live handler
sawine@5
  3647
				context.unbind( "live." + liveConvert( type, selector ), fn );
sawine@5
  3648
			}
sawine@5
  3649
		}
sawine@5
  3650
sawine@5
  3651
		return this;
sawine@5
  3652
	};
sawine@5
  3653
});
sawine@5
  3654
sawine@5
  3655
function liveHandler( event ) {
sawine@5
  3656
	var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
sawine@5
  3657
		elems = [],
sawine@5
  3658
		selectors = [],
sawine@5
  3659
		events = jQuery._data( this, "events" );
sawine@5
  3660
sawine@5
  3661
	// Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
sawine@5
  3662
	if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
sawine@5
  3663
		return;
sawine@5
  3664
	}
sawine@5
  3665
sawine@5
  3666
	if ( event.namespace ) {
sawine@5
  3667
		namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
sawine@5
  3668
	}
sawine@5
  3669
sawine@5
  3670
	event.liveFired = this;
sawine@5
  3671
sawine@5
  3672
	var live = events.live.slice(0);
sawine@5
  3673
sawine@5
  3674
	for ( j = 0; j < live.length; j++ ) {
sawine@5
  3675
		handleObj = live[j];
sawine@5
  3676
sawine@5
  3677
		if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
sawine@5
  3678
			selectors.push( handleObj.selector );
sawine@5
  3679
sawine@5
  3680
		} else {
sawine@5
  3681
			live.splice( j--, 1 );
sawine@5
  3682
		}
sawine@5
  3683
	}
sawine@5
  3684
sawine@5
  3685
	match = jQuery( event.target ).closest( selectors, event.currentTarget );
sawine@5
  3686
sawine@5
  3687
	for ( i = 0, l = match.length; i < l; i++ ) {
sawine@5
  3688
		close = match[i];
sawine@5
  3689
sawine@5
  3690
		for ( j = 0; j < live.length; j++ ) {
sawine@5
  3691
			handleObj = live[j];
sawine@5
  3692
sawine@5
  3693
			if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {
sawine@5
  3694
				elem = close.elem;
sawine@5
  3695
				related = null;
sawine@5
  3696
sawine@5
  3697
				// Those two events require additional checking
sawine@5
  3698
				if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
sawine@5
  3699
					event.type = handleObj.preType;
sawine@5
  3700
					related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
sawine@5
  3701
sawine@5
  3702
					// Make sure not to accidentally match a child element with the same selector
sawine@5
  3703
					if ( related && jQuery.contains( elem, related ) ) {
sawine@5
  3704
						related = elem;
sawine@5
  3705
					}
sawine@5
  3706
				}
sawine@5
  3707
sawine@5
  3708
				if ( !related || related !== elem ) {
sawine@5
  3709
					elems.push({ elem: elem, handleObj: handleObj, level: close.level });
sawine@5
  3710
				}
sawine@5
  3711
			}
sawine@5
  3712
		}
sawine@5
  3713
	}
sawine@5
  3714
sawine@5
  3715
	for ( i = 0, l = elems.length; i < l; i++ ) {
sawine@5
  3716
		match = elems[i];
sawine@5
  3717
sawine@5
  3718
		if ( maxLevel && match.level > maxLevel ) {
sawine@5
  3719
			break;
sawine@5
  3720
		}
sawine@5
  3721
sawine@5
  3722
		event.currentTarget = match.elem;
sawine@5
  3723
		event.data = match.handleObj.data;
sawine@5
  3724
		event.handleObj = match.handleObj;
sawine@5
  3725
sawine@5
  3726
		ret = match.handleObj.origHandler.apply( match.elem, arguments );
sawine@5
  3727
sawine@5
  3728
		if ( ret === false || event.isPropagationStopped() ) {
sawine@5
  3729
			maxLevel = match.level;
sawine@5
  3730
sawine@5
  3731
			if ( ret === false ) {
sawine@5
  3732
				stop = false;
sawine@5
  3733
			}
sawine@5
  3734
			if ( event.isImmediatePropagationStopped() ) {
sawine@5
  3735
				break;
sawine@5
  3736
			}
sawine@5
  3737
		}
sawine@5
  3738
	}
sawine@5
  3739
sawine@5
  3740
	return stop;
sawine@5
  3741
}
sawine@5
  3742
sawine@5
  3743
function liveConvert( type, selector ) {
sawine@5
  3744
	return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&");
sawine@5
  3745
}
sawine@5
  3746
sawine@5
  3747
jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
sawine@5
  3748
	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
sawine@5
  3749
	"change select submit keydown keypress keyup error").split(" "), function( i, name ) {
sawine@5
  3750
sawine@5
  3751
	// Handle event binding
sawine@5
  3752
	jQuery.fn[ name ] = function( data, fn ) {
sawine@5
  3753
		if ( fn == null ) {
sawine@5
  3754
			fn = data;
sawine@5
  3755
			data = null;
sawine@5
  3756
		}
sawine@5
  3757
sawine@5
  3758
		return arguments.length > 0 ?
sawine@5
  3759
			this.bind( name, data, fn ) :
sawine@5
  3760
			this.trigger( name );
sawine@5
  3761
	};
sawine@5
  3762
sawine@5
  3763
	if ( jQuery.attrFn ) {
sawine@5
  3764
		jQuery.attrFn[ name ] = true;
sawine@5
  3765
	}
sawine@5
  3766
});
sawine@5
  3767
sawine@5
  3768
sawine@5
  3769
sawine@5
  3770
/*!
sawine@5
  3771
 * Sizzle CSS Selector Engine
sawine@5
  3772
 *  Copyright 2011, The Dojo Foundation
sawine@5
  3773
 *  Released under the MIT, BSD, and GPL Licenses.
sawine@5
  3774
 *  More information: http://sizzlejs.com/
sawine@5
  3775
 */
sawine@5
  3776
(function(){
sawine@5
  3777
sawine@5
  3778
var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
sawine@5
  3779
	done = 0,
sawine@5
  3780
	toString = Object.prototype.toString,
sawine@5
  3781
	hasDuplicate = false,
sawine@5
  3782
	baseHasDuplicate = true,
sawine@5
  3783
	rBackslash = /\\/g,
sawine@5
  3784
	rNonWord = /\W/;
sawine@5
  3785
sawine@5
  3786
// Here we check if the JavaScript engine is using some sort of
sawine@5
  3787
// optimization where it does not always call our comparision
sawine@5
  3788
// function. If that is the case, discard the hasDuplicate value.
sawine@5
  3789
//   Thus far that includes Google Chrome.
sawine@5
  3790
[0, 0].sort(function() {
sawine@5
  3791
	baseHasDuplicate = false;
sawine@5
  3792
	return 0;
sawine@5
  3793
});
sawine@5
  3794
sawine@5
  3795
var Sizzle = function( selector, context, results, seed ) {
sawine@5
  3796
	results = results || [];
sawine@5
  3797
	context = context || document;
sawine@5
  3798
sawine@5
  3799
	var origContext = context;
sawine@5
  3800
sawine@5
  3801
	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
sawine@5
  3802
		return [];
sawine@5
  3803
	}
sawine@5
  3804
	
sawine@5
  3805
	if ( !selector || typeof selector !== "string" ) {
sawine@5
  3806
		return results;
sawine@5
  3807
	}
sawine@5
  3808
sawine@5
  3809
	var m, set, checkSet, extra, ret, cur, pop, i,
sawine@5
  3810
		prune = true,
sawine@5
  3811
		contextXML = Sizzle.isXML( context ),
sawine@5
  3812
		parts = [],
sawine@5
  3813
		soFar = selector;
sawine@5
  3814
	
sawine@5
  3815
	// Reset the position of the chunker regexp (start from head)
sawine@5
  3816
	do {
sawine@5
  3817
		chunker.exec( "" );
sawine@5
  3818
		m = chunker.exec( soFar );
sawine@5
  3819
sawine@5
  3820
		if ( m ) {
sawine@5
  3821
			soFar = m[3];
sawine@5
  3822
		
sawine@5
  3823
			parts.push( m[1] );
sawine@5
  3824
		
sawine@5
  3825
			if ( m[2] ) {
sawine@5
  3826
				extra = m[3];
sawine@5
  3827
				break;
sawine@5
  3828
			}
sawine@5
  3829
		}
sawine@5
  3830
	} while ( m );
sawine@5
  3831
sawine@5
  3832
	if ( parts.length > 1 && origPOS.exec( selector ) ) {
sawine@5
  3833
sawine@5
  3834
		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
sawine@5
  3835
			set = posProcess( parts[0] + parts[1], context );
sawine@5
  3836
sawine@5
  3837
		} else {
sawine@5
  3838
			set = Expr.relative[ parts[0] ] ?
sawine@5
  3839
				[ context ] :
sawine@5
  3840
				Sizzle( parts.shift(), context );
sawine@5
  3841
sawine@5
  3842
			while ( parts.length ) {
sawine@5
  3843
				selector = parts.shift();
sawine@5
  3844
sawine@5
  3845
				if ( Expr.relative[ selector ] ) {
sawine@5
  3846
					selector += parts.shift();
sawine@5
  3847
				}
sawine@5
  3848
				
sawine@5
  3849
				set = posProcess( selector, set );
sawine@5
  3850
			}
sawine@5
  3851
		}
sawine@5
  3852
sawine@5
  3853
	} else {
sawine@5
  3854
		// Take a shortcut and set the context if the root selector is an ID
sawine@5
  3855
		// (but not if it'll be faster if the inner selector is an ID)
sawine@5
  3856
		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
sawine@5
  3857
				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
sawine@5
  3858
sawine@5
  3859
			ret = Sizzle.find( parts.shift(), context, contextXML );
sawine@5
  3860
			context = ret.expr ?
sawine@5
  3861
				Sizzle.filter( ret.expr, ret.set )[0] :
sawine@5
  3862
				ret.set[0];
sawine@5
  3863
		}
sawine@5
  3864
sawine@5
  3865
		if ( context ) {
sawine@5
  3866
			ret = seed ?
sawine@5
  3867
				{ expr: parts.pop(), set: makeArray(seed) } :
sawine@5
  3868
				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
sawine@5
  3869
sawine@5
  3870
			set = ret.expr ?
sawine@5
  3871
				Sizzle.filter( ret.expr, ret.set ) :
sawine@5
  3872
				ret.set;
sawine@5
  3873
sawine@5
  3874
			if ( parts.length > 0 ) {
sawine@5
  3875
				checkSet = makeArray( set );
sawine@5
  3876
sawine@5
  3877
			} else {
sawine@5
  3878
				prune = false;
sawine@5
  3879
			}
sawine@5
  3880
sawine@5
  3881
			while ( parts.length ) {
sawine@5
  3882
				cur = parts.pop();
sawine@5
  3883
				pop = cur;
sawine@5
  3884
sawine@5
  3885
				if ( !Expr.relative[ cur ] ) {
sawine@5
  3886
					cur = "";
sawine@5
  3887
				} else {
sawine@5
  3888
					pop = parts.pop();
sawine@5
  3889
				}
sawine@5
  3890
sawine@5
  3891
				if ( pop == null ) {
sawine@5
  3892
					pop = context;
sawine@5
  3893
				}
sawine@5
  3894
sawine@5
  3895
				Expr.relative[ cur ]( checkSet, pop, contextXML );
sawine@5
  3896
			}
sawine@5
  3897
sawine@5
  3898
		} else {
sawine@5
  3899
			checkSet = parts = [];
sawine@5
  3900
		}
sawine@5
  3901
	}
sawine@5
  3902
sawine@5
  3903
	if ( !checkSet ) {
sawine@5
  3904
		checkSet = set;
sawine@5
  3905
	}
sawine@5
  3906
sawine@5
  3907
	if ( !checkSet ) {
sawine@5
  3908
		Sizzle.error( cur || selector );
sawine@5
  3909
	}
sawine@5
  3910
sawine@5
  3911
	if ( toString.call(checkSet) === "[object Array]" ) {
sawine@5
  3912
		if ( !prune ) {
sawine@5
  3913
			results.push.apply( results, checkSet );
sawine@5
  3914
sawine@5
  3915
		} else if ( context && context.nodeType === 1 ) {
sawine@5
  3916
			for ( i = 0; checkSet[i] != null; i++ ) {
sawine@5
  3917
				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
sawine@5
  3918
					results.push( set[i] );
sawine@5
  3919
				}
sawine@5
  3920
			}
sawine@5
  3921
sawine@5
  3922
		} else {
sawine@5
  3923
			for ( i = 0; checkSet[i] != null; i++ ) {
sawine@5
  3924
				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
sawine@5
  3925
					results.push( set[i] );
sawine@5
  3926
				}
sawine@5
  3927
			}
sawine@5
  3928
		}
sawine@5
  3929
sawine@5
  3930
	} else {
sawine@5
  3931
		makeArray( checkSet, results );
sawine@5
  3932
	}
sawine@5
  3933
sawine@5
  3934
	if ( extra ) {
sawine@5
  3935
		Sizzle( extra, origContext, results, seed );
sawine@5
  3936
		Sizzle.uniqueSort( results );
sawine@5
  3937
	}
sawine@5
  3938
sawine@5
  3939
	return results;
sawine@5
  3940
};
sawine@5
  3941
sawine@5
  3942
Sizzle.uniqueSort = function( results ) {
sawine@5
  3943
	if ( sortOrder ) {
sawine@5
  3944
		hasDuplicate = baseHasDuplicate;
sawine@5
  3945
		results.sort( sortOrder );
sawine@5
  3946
sawine@5
  3947
		if ( hasDuplicate ) {
sawine@5
  3948
			for ( var i = 1; i < results.length; i++ ) {
sawine@5
  3949
				if ( results[i] === results[ i - 1 ] ) {
sawine@5
  3950
					results.splice( i--, 1 );
sawine@5
  3951
				}
sawine@5
  3952
			}
sawine@5
  3953
		}
sawine@5
  3954
	}
sawine@5
  3955
sawine@5
  3956
	return results;
sawine@5
  3957
};
sawine@5
  3958
sawine@5
  3959
Sizzle.matches = function( expr, set ) {
sawine@5
  3960
	return Sizzle( expr, null, null, set );
sawine@5
  3961
};
sawine@5
  3962
sawine@5
  3963
Sizzle.matchesSelector = function( node, expr ) {
sawine@5
  3964
	return Sizzle( expr, null, null, [node] ).length > 0;
sawine@5
  3965
};
sawine@5
  3966
sawine@5
  3967
Sizzle.find = function( expr, context, isXML ) {
sawine@5
  3968
	var set;
sawine@5
  3969
sawine@5
  3970
	if ( !expr ) {
sawine@5
  3971
		return [];
sawine@5
  3972
	}
sawine@5
  3973
sawine@5
  3974
	for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
sawine@5
  3975
		var match,
sawine@5
  3976
			type = Expr.order[i];
sawine@5
  3977
		
sawine@5
  3978
		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
sawine@5
  3979
			var left = match[1];
sawine@5
  3980
			match.splice( 1, 1 );
sawine@5
  3981
sawine@5
  3982
			if ( left.substr( left.length - 1 ) !== "\\" ) {
sawine@5
  3983
				match[1] = (match[1] || "").replace( rBackslash, "" );
sawine@5
  3984
				set = Expr.find[ type ]( match, context, isXML );
sawine@5
  3985
sawine@5
  3986
				if ( set != null ) {
sawine@5
  3987
					expr = expr.replace( Expr.match[ type ], "" );
sawine@5
  3988
					break;
sawine@5
  3989
				}
sawine@5
  3990
			}
sawine@5
  3991
		}
sawine@5
  3992
	}
sawine@5
  3993
sawine@5
  3994
	if ( !set ) {
sawine@5
  3995
		set = typeof context.getElementsByTagName !== "undefined" ?
sawine@5
  3996
			context.getElementsByTagName( "*" ) :
sawine@5
  3997
			[];
sawine@5
  3998
	}
sawine@5
  3999
sawine@5
  4000
	return { set: set, expr: expr };
sawine@5
  4001
};
sawine@5
  4002
sawine@5
  4003
Sizzle.filter = function( expr, set, inplace, not ) {
sawine@5
  4004
	var match, anyFound,
sawine@5
  4005
		old = expr,
sawine@5
  4006
		result = [],
sawine@5
  4007
		curLoop = set,
sawine@5
  4008
		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
sawine@5
  4009
sawine@5
  4010
	while ( expr && set.length ) {
sawine@5
  4011
		for ( var type in Expr.filter ) {
sawine@5
  4012
			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
sawine@5
  4013
				var found, item,
sawine@5
  4014
					filter = Expr.filter[ type ],
sawine@5
  4015
					left = match[1];
sawine@5
  4016
sawine@5
  4017
				anyFound = false;
sawine@5
  4018
sawine@5
  4019
				match.splice(1,1);
sawine@5
  4020
sawine@5
  4021
				if ( left.substr( left.length - 1 ) === "\\" ) {
sawine@5
  4022
					continue;
sawine@5
  4023
				}
sawine@5
  4024
sawine@5
  4025
				if ( curLoop === result ) {
sawine@5
  4026
					result = [];
sawine@5
  4027
				}
sawine@5
  4028
sawine@5
  4029
				if ( Expr.preFilter[ type ] ) {
sawine@5
  4030
					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
sawine@5
  4031
sawine@5
  4032
					if ( !match ) {
sawine@5
  4033
						anyFound = found = true;
sawine@5
  4034
sawine@5
  4035
					} else if ( match === true ) {
sawine@5
  4036
						continue;
sawine@5
  4037
					}
sawine@5
  4038
				}
sawine@5
  4039
sawine@5
  4040
				if ( match ) {
sawine@5
  4041
					for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
sawine@5
  4042
						if ( item ) {
sawine@5
  4043
							found = filter( item, match, i, curLoop );
sawine@5
  4044
							var pass = not ^ !!found;
sawine@5
  4045
sawine@5
  4046
							if ( inplace && found != null ) {
sawine@5
  4047
								if ( pass ) {
sawine@5
  4048
									anyFound = true;
sawine@5
  4049
sawine@5
  4050
								} else {
sawine@5
  4051
									curLoop[i] = false;
sawine@5
  4052
								}
sawine@5
  4053
sawine@5
  4054
							} else if ( pass ) {
sawine@5
  4055
								result.push( item );
sawine@5
  4056
								anyFound = true;
sawine@5
  4057
							}
sawine@5
  4058
						}
sawine@5
  4059
					}
sawine@5
  4060
				}
sawine@5
  4061
sawine@5
  4062
				if ( found !== undefined ) {
sawine@5
  4063
					if ( !inplace ) {
sawine@5
  4064
						curLoop = result;
sawine@5
  4065
					}
sawine@5
  4066
sawine@5
  4067
					expr = expr.replace( Expr.match[ type ], "" );
sawine@5
  4068
sawine@5
  4069
					if ( !anyFound ) {
sawine@5
  4070
						return [];
sawine@5
  4071
					}
sawine@5
  4072
sawine@5
  4073
					break;
sawine@5
  4074
				}
sawine@5
  4075
			}
sawine@5
  4076
		}
sawine@5
  4077
sawine@5
  4078
		// Improper expression
sawine@5
  4079
		if ( expr === old ) {
sawine@5
  4080
			if ( anyFound == null ) {
sawine@5
  4081
				Sizzle.error( expr );
sawine@5
  4082
sawine@5
  4083
			} else {
sawine@5
  4084
				break;
sawine@5
  4085
			}
sawine@5
  4086
		}
sawine@5
  4087
sawine@5
  4088
		old = expr;
sawine@5
  4089
	}
sawine@5
  4090
sawine@5
  4091
	return curLoop;
sawine@5
  4092
};
sawine@5
  4093
sawine@5
  4094
Sizzle.error = function( msg ) {
sawine@5
  4095
	throw "Syntax error, unrecognized expression: " + msg;
sawine@5
  4096
};
sawine@5
  4097
sawine@5
  4098
var Expr = Sizzle.selectors = {
sawine@5
  4099
	order: [ "ID", "NAME", "TAG" ],
sawine@5
  4100
sawine@5
  4101
	match: {
sawine@5
  4102
		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
sawine@5
  4103
		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
sawine@5
  4104
		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
sawine@5
  4105
		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
sawine@5
  4106
		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
sawine@5
  4107
		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
sawine@5
  4108
		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
sawine@5
  4109
		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
sawine@5
  4110
	},
sawine@5
  4111
sawine@5
  4112
	leftMatch: {},
sawine@5
  4113
sawine@5
  4114
	attrMap: {
sawine@5
  4115
		"class": "className",
sawine@5
  4116
		"for": "htmlFor"
sawine@5
  4117
	},
sawine@5
  4118
sawine@5
  4119
	attrHandle: {
sawine@5
  4120
		href: function( elem ) {
sawine@5
  4121
			return elem.getAttribute( "href" );
sawine@5
  4122
		},
sawine@5
  4123
		type: function( elem ) {
sawine@5
  4124
			return elem.getAttribute( "type" );
sawine@5
  4125
		}
sawine@5
  4126
	},
sawine@5
  4127
sawine@5
  4128
	relative: {
sawine@5
  4129
		"+": function(checkSet, part){
sawine@5
  4130
			var isPartStr = typeof part === "string",
sawine@5
  4131
				isTag = isPartStr && !rNonWord.test( part ),
sawine@5
  4132
				isPartStrNotTag = isPartStr && !isTag;
sawine@5
  4133
sawine@5
  4134
			if ( isTag ) {
sawine@5
  4135
				part = part.toLowerCase();
sawine@5
  4136
			}
sawine@5
  4137
sawine@5
  4138
			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
sawine@5
  4139
				if ( (elem = checkSet[i]) ) {
sawine@5
  4140
					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
sawine@5
  4141
sawine@5
  4142
					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
sawine@5
  4143
						elem || false :
sawine@5
  4144
						elem === part;
sawine@5
  4145
				}
sawine@5
  4146
			}
sawine@5
  4147
sawine@5
  4148
			if ( isPartStrNotTag ) {
sawine@5
  4149
				Sizzle.filter( part, checkSet, true );
sawine@5
  4150
			}
sawine@5
  4151
		},
sawine@5
  4152
sawine@5
  4153
		">": function( checkSet, part ) {
sawine@5
  4154
			var elem,
sawine@5
  4155
				isPartStr = typeof part === "string",
sawine@5
  4156
				i = 0,
sawine@5
  4157
				l = checkSet.length;
sawine@5
  4158
sawine@5
  4159
			if ( isPartStr && !rNonWord.test( part ) ) {
sawine@5
  4160
				part = part.toLowerCase();
sawine@5
  4161
sawine@5
  4162
				for ( ; i < l; i++ ) {
sawine@5
  4163
					elem = checkSet[i];
sawine@5
  4164
sawine@5
  4165
					if ( elem ) {
sawine@5
  4166
						var parent = elem.parentNode;
sawine@5
  4167
						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
sawine@5
  4168
					}
sawine@5
  4169
				}
sawine@5
  4170
sawine@5
  4171
			} else {
sawine@5
  4172
				for ( ; i < l; i++ ) {
sawine@5
  4173
					elem = checkSet[i];
sawine@5
  4174
sawine@5
  4175
					if ( elem ) {
sawine@5
  4176
						checkSet[i] = isPartStr ?
sawine@5
  4177
							elem.parentNode :
sawine@5
  4178
							elem.parentNode === part;
sawine@5
  4179
					}
sawine@5
  4180
				}
sawine@5
  4181
sawine@5
  4182
				if ( isPartStr ) {
sawine@5
  4183
					Sizzle.filter( part, checkSet, true );
sawine@5
  4184
				}
sawine@5
  4185
			}
sawine@5
  4186
		},
sawine@5
  4187
sawine@5
  4188
		"": function(checkSet, part, isXML){
sawine@5
  4189
			var nodeCheck,
sawine@5
  4190
				doneName = done++,
sawine@5
  4191
				checkFn = dirCheck;
sawine@5
  4192
sawine@5
  4193
			if ( typeof part === "string" && !rNonWord.test( part ) ) {
sawine@5
  4194
				part = part.toLowerCase();
sawine@5
  4195
				nodeCheck = part;
sawine@5
  4196
				checkFn = dirNodeCheck;
sawine@5
  4197
			}
sawine@5
  4198
sawine@5
  4199
			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
sawine@5
  4200
		},
sawine@5
  4201
sawine@5
  4202
		"~": function( checkSet, part, isXML ) {
sawine@5
  4203
			var nodeCheck,
sawine@5
  4204
				doneName = done++,
sawine@5
  4205
				checkFn = dirCheck;
sawine@5
  4206
sawine@5
  4207
			if ( typeof part === "string" && !rNonWord.test( part ) ) {
sawine@5
  4208
				part = part.toLowerCase();
sawine@5
  4209
				nodeCheck = part;
sawine@5
  4210
				checkFn = dirNodeCheck;
sawine@5
  4211
			}
sawine@5
  4212
sawine@5
  4213
			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
sawine@5
  4214
		}
sawine@5
  4215
	},
sawine@5
  4216
sawine@5
  4217
	find: {
sawine@5
  4218
		ID: function( match, context, isXML ) {
sawine@5
  4219
			if ( typeof context.getElementById !== "undefined" && !isXML ) {
sawine@5
  4220
				var m = context.getElementById(match[1]);
sawine@5
  4221
				// Check parentNode to catch when Blackberry 4.6 returns
sawine@5
  4222
				// nodes that are no longer in the document #6963
sawine@5
  4223
				return m && m.parentNode ? [m] : [];
sawine@5
  4224
			}
sawine@5
  4225
		},
sawine@5
  4226
sawine@5
  4227
		NAME: function( match, context ) {
sawine@5
  4228
			if ( typeof context.getElementsByName !== "undefined" ) {
sawine@5
  4229
				var ret = [],
sawine@5
  4230
					results = context.getElementsByName( match[1] );
sawine@5
  4231
sawine@5
  4232
				for ( var i = 0, l = results.length; i < l; i++ ) {
sawine@5
  4233
					if ( results[i].getAttribute("name") === match[1] ) {
sawine@5
  4234
						ret.push( results[i] );
sawine@5
  4235
					}
sawine@5
  4236
				}
sawine@5
  4237
sawine@5
  4238
				return ret.length === 0 ? null : ret;
sawine@5
  4239
			}
sawine@5
  4240
		},
sawine@5
  4241
sawine@5
  4242
		TAG: function( match, context ) {
sawine@5
  4243
			if ( typeof context.getElementsByTagName !== "undefined" ) {
sawine@5
  4244
				return context.getElementsByTagName( match[1] );
sawine@5
  4245
			}
sawine@5
  4246
		}
sawine@5
  4247
	},
sawine@5
  4248
	preFilter: {
sawine@5
  4249
		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
sawine@5
  4250
			match = " " + match[1].replace( rBackslash, "" ) + " ";
sawine@5
  4251
sawine@5
  4252
			if ( isXML ) {
sawine@5
  4253
				return match;
sawine@5
  4254
			}
sawine@5
  4255
sawine@5
  4256
			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
sawine@5
  4257
				if ( elem ) {
sawine@5
  4258
					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
sawine@5
  4259
						if ( !inplace ) {
sawine@5
  4260
							result.push( elem );
sawine@5
  4261
						}
sawine@5
  4262
sawine@5
  4263
					} else if ( inplace ) {
sawine@5
  4264
						curLoop[i] = false;
sawine@5
  4265
					}
sawine@5
  4266
				}
sawine@5
  4267
			}
sawine@5
  4268
sawine@5
  4269
			return false;
sawine@5
  4270
		},
sawine@5
  4271
sawine@5
  4272
		ID: function( match ) {
sawine@5
  4273
			return match[1].replace( rBackslash, "" );
sawine@5
  4274
		},
sawine@5
  4275
sawine@5
  4276
		TAG: function( match, curLoop ) {
sawine@5
  4277
			return match[1].replace( rBackslash, "" ).toLowerCase();
sawine@5
  4278
		},
sawine@5
  4279
sawine@5
  4280
		CHILD: function( match ) {
sawine@5
  4281
			if ( match[1] === "nth" ) {
sawine@5
  4282
				if ( !match[2] ) {
sawine@5
  4283
					Sizzle.error( match[0] );
sawine@5
  4284
				}
sawine@5
  4285
sawine@5
  4286
				match[2] = match[2].replace(/^\+|\s*/g, '');
sawine@5
  4287
sawine@5
  4288
				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
sawine@5
  4289
				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
sawine@5
  4290
					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
sawine@5
  4291
					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
sawine@5
  4292
sawine@5
  4293
				// calculate the numbers (first)n+(last) including if they are negative
sawine@5
  4294
				match[2] = (test[1] + (test[2] || 1)) - 0;
sawine@5
  4295
				match[3] = test[3] - 0;
sawine@5
  4296
			}
sawine@5
  4297
			else if ( match[2] ) {
sawine@5
  4298
				Sizzle.error( match[0] );
sawine@5
  4299
			}
sawine@5
  4300
sawine@5
  4301
			// TODO: Move to normal caching system
sawine@5
  4302
			match[0] = done++;
sawine@5
  4303
sawine@5
  4304
			return match;
sawine@5
  4305
		},
sawine@5
  4306
sawine@5
  4307
		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
sawine@5
  4308
			var name = match[1] = match[1].replace( rBackslash, "" );
sawine@5
  4309
			
sawine@5
  4310
			if ( !isXML && Expr.attrMap[name] ) {
sawine@5
  4311
				match[1] = Expr.attrMap[name];
sawine@5
  4312
			}
sawine@5
  4313
sawine@5
  4314
			// Handle if an un-quoted value was used
sawine@5
  4315
			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
sawine@5
  4316
sawine@5
  4317
			if ( match[2] === "~=" ) {
sawine@5
  4318
				match[4] = " " + match[4] + " ";
sawine@5
  4319
			}
sawine@5
  4320
sawine@5
  4321
			return match;
sawine@5
  4322
		},
sawine@5
  4323
sawine@5
  4324
		PSEUDO: function( match, curLoop, inplace, result, not ) {
sawine@5
  4325
			if ( match[1] === "not" ) {
sawine@5
  4326
				// If we're dealing with a complex expression, or a simple one
sawine@5
  4327
				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
sawine@5
  4328
					match[3] = Sizzle(match[3], null, null, curLoop);
sawine@5
  4329
sawine@5
  4330
				} else {
sawine@5
  4331
					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
sawine@5
  4332
sawine@5
  4333
					if ( !inplace ) {
sawine@5
  4334
						result.push.apply( result, ret );
sawine@5
  4335
					}
sawine@5
  4336
sawine@5
  4337
					return false;
sawine@5
  4338
				}
sawine@5
  4339
sawine@5
  4340
			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
sawine@5
  4341
				return true;
sawine@5
  4342
			}
sawine@5
  4343
			
sawine@5
  4344
			return match;
sawine@5
  4345
		},
sawine@5
  4346
sawine@5
  4347
		POS: function( match ) {
sawine@5
  4348
			match.unshift( true );
sawine@5
  4349
sawine@5
  4350
			return match;
sawine@5
  4351
		}
sawine@5
  4352
	},
sawine@5
  4353
	
sawine@5
  4354
	filters: {
sawine@5
  4355
		enabled: function( elem ) {
sawine@5
  4356
			return elem.disabled === false && elem.type !== "hidden";
sawine@5
  4357
		},
sawine@5
  4358
sawine@5
  4359
		disabled: function( elem ) {
sawine@5
  4360
			return elem.disabled === true;
sawine@5
  4361
		},
sawine@5
  4362
sawine@5
  4363
		checked: function( elem ) {
sawine@5
  4364
			return elem.checked === true;
sawine@5
  4365
		},
sawine@5
  4366
		
sawine@5
  4367
		selected: function( elem ) {
sawine@5
  4368
			// Accessing this property makes selected-by-default
sawine@5
  4369
			// options in Safari work properly
sawine@5
  4370
			if ( elem.parentNode ) {
sawine@5
  4371
				elem.parentNode.selectedIndex;
sawine@5
  4372
			}
sawine@5
  4373
			
sawine@5
  4374
			return elem.selected === true;
sawine@5
  4375
		},
sawine@5
  4376
sawine@5
  4377
		parent: function( elem ) {
sawine@5
  4378
			return !!elem.firstChild;
sawine@5
  4379
		},
sawine@5
  4380
sawine@5
  4381
		empty: function( elem ) {
sawine@5
  4382
			return !elem.firstChild;
sawine@5
  4383
		},
sawine@5
  4384
sawine@5
  4385
		has: function( elem, i, match ) {
sawine@5
  4386
			return !!Sizzle( match[3], elem ).length;
sawine@5
  4387
		},
sawine@5
  4388
sawine@5
  4389
		header: function( elem ) {
sawine@5
  4390
			return (/h\d/i).test( elem.nodeName );
sawine@5
  4391
		},
sawine@5
  4392
sawine@5
  4393
		text: function( elem ) {
sawine@5
  4394
			var attr = elem.getAttribute( "type" ), type = elem.type;
sawine@5
  4395
			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 
sawine@5
  4396
			// use getAttribute instead to test this case
sawine@5
  4397
			return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
sawine@5
  4398
		},
sawine@5
  4399
sawine@5
  4400
		radio: function( elem ) {
sawine@5
  4401
			return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
sawine@5
  4402
		},
sawine@5
  4403
sawine@5
  4404
		checkbox: function( elem ) {
sawine@5
  4405
			return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
sawine@5
  4406
		},
sawine@5
  4407
sawine@5
  4408
		file: function( elem ) {
sawine@5
  4409
			return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
sawine@5
  4410
		},
sawine@5
  4411
sawine@5
  4412
		password: function( elem ) {
sawine@5
  4413
			return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
sawine@5
  4414
		},
sawine@5
  4415
sawine@5
  4416
		submit: function( elem ) {
sawine@5
  4417
			var name = elem.nodeName.toLowerCase();
sawine@5
  4418
			return (name === "input" || name === "button") && "submit" === elem.type;
sawine@5
  4419
		},
sawine@5
  4420
sawine@5
  4421
		image: function( elem ) {
sawine@5
  4422
			return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
sawine@5
  4423
		},
sawine@5
  4424
sawine@5
  4425
		reset: function( elem ) {
sawine@5
  4426
			var name = elem.nodeName.toLowerCase();
sawine@5
  4427
			return (name === "input" || name === "button") && "reset" === elem.type;
sawine@5
  4428
		},
sawine@5
  4429
sawine@5
  4430
		button: function( elem ) {
sawine@5
  4431
			var name = elem.nodeName.toLowerCase();
sawine@5
  4432
			return name === "input" && "button" === elem.type || name === "button";
sawine@5
  4433
		},
sawine@5
  4434
sawine@5
  4435
		input: function( elem ) {
sawine@5
  4436
			return (/input|select|textarea|button/i).test( elem.nodeName );
sawine@5
  4437
		},
sawine@5
  4438
sawine@5
  4439
		focus: function( elem ) {
sawine@5
  4440
			return elem === elem.ownerDocument.activeElement;
sawine@5
  4441
		}
sawine@5
  4442
	},
sawine@5
  4443
	setFilters: {
sawine@5
  4444
		first: function( elem, i ) {
sawine@5
  4445
			return i === 0;
sawine@5
  4446
		},
sawine@5
  4447
sawine@5
  4448
		last: function( elem, i, match, array ) {
sawine@5
  4449
			return i === array.length - 1;
sawine@5
  4450
		},
sawine@5
  4451
sawine@5
  4452
		even: function( elem, i ) {
sawine@5
  4453
			return i % 2 === 0;
sawine@5
  4454
		},
sawine@5
  4455
sawine@5
  4456
		odd: function( elem, i ) {
sawine@5
  4457
			return i % 2 === 1;
sawine@5
  4458
		},
sawine@5
  4459
sawine@5
  4460
		lt: function( elem, i, match ) {
sawine@5
  4461
			return i < match[3] - 0;
sawine@5
  4462
		},
sawine@5
  4463
sawine@5
  4464
		gt: function( elem, i, match ) {
sawine@5
  4465
			return i > match[3] - 0;
sawine@5
  4466
		},
sawine@5
  4467
sawine@5
  4468
		nth: function( elem, i, match ) {
sawine@5
  4469
			return match[3] - 0 === i;
sawine@5
  4470
		},
sawine@5
  4471
sawine@5
  4472
		eq: function( elem, i, match ) {
sawine@5
  4473
			return match[3] - 0 === i;
sawine@5
  4474
		}
sawine@5
  4475
	},
sawine@5
  4476
	filter: {
sawine@5
  4477
		PSEUDO: function( elem, match, i, array ) {
sawine@5
  4478
			var name = match[1],
sawine@5
  4479
				filter = Expr.filters[ name ];
sawine@5
  4480
sawine@5
  4481
			if ( filter ) {
sawine@5
  4482
				return filter( elem, i, match, array );
sawine@5
  4483
sawine@5
  4484
			} else if ( name === "contains" ) {
sawine@5
  4485
				return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
sawine@5
  4486
sawine@5
  4487
			} else if ( name === "not" ) {
sawine@5
  4488
				var not = match[3];
sawine@5
  4489
sawine@5
  4490
				for ( var j = 0, l = not.length; j < l; j++ ) {
sawine@5
  4491
					if ( not[j] === elem ) {
sawine@5
  4492
						return false;
sawine@5
  4493
					}
sawine@5
  4494
				}
sawine@5
  4495
sawine@5
  4496
				return true;
sawine@5
  4497
sawine@5
  4498
			} else {
sawine@5
  4499
				Sizzle.error( name );
sawine@5
  4500
			}
sawine@5
  4501
		},
sawine@5
  4502
sawine@5
  4503
		CHILD: function( elem, match ) {
sawine@5
  4504
			var type = match[1],
sawine@5
  4505
				node = elem;
sawine@5
  4506
sawine@5
  4507
			switch ( type ) {
sawine@5
  4508
				case "only":
sawine@5
  4509
				case "first":
sawine@5
  4510
					while ( (node = node.previousSibling) )	 {
sawine@5
  4511
						if ( node.nodeType === 1 ) { 
sawine@5
  4512
							return false; 
sawine@5
  4513
						}
sawine@5
  4514
					}
sawine@5
  4515
sawine@5
  4516
					if ( type === "first" ) { 
sawine@5
  4517
						return true; 
sawine@5
  4518
					}
sawine@5
  4519
sawine@5
  4520
					node = elem;
sawine@5
  4521
sawine@5
  4522
				case "last":
sawine@5
  4523
					while ( (node = node.nextSibling) )	 {
sawine@5
  4524
						if ( node.nodeType === 1 ) { 
sawine@5
  4525
							return false; 
sawine@5
  4526
						}
sawine@5
  4527
					}
sawine@5
  4528
sawine@5
  4529
					return true;
sawine@5
  4530
sawine@5
  4531
				case "nth":
sawine@5
  4532
					var first = match[2],
sawine@5
  4533
						last = match[3];
sawine@5
  4534
sawine@5
  4535
					if ( first === 1 && last === 0 ) {
sawine@5
  4536
						return true;
sawine@5
  4537
					}
sawine@5
  4538
					
sawine@5
  4539
					var doneName = match[0],
sawine@5
  4540
						parent = elem.parentNode;
sawine@5
  4541
	
sawine@5
  4542
					if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
sawine@5
  4543
						var count = 0;
sawine@5
  4544
						
sawine@5
  4545
						for ( node = parent.firstChild; node; node = node.nextSibling ) {
sawine@5
  4546
							if ( node.nodeType === 1 ) {
sawine@5
  4547
								node.nodeIndex = ++count;
sawine@5
  4548
							}
sawine@5
  4549
						} 
sawine@5
  4550
sawine@5
  4551
						parent.sizcache = doneName;
sawine@5
  4552
					}
sawine@5
  4553
					
sawine@5
  4554
					var diff = elem.nodeIndex - last;
sawine@5
  4555
sawine@5
  4556
					if ( first === 0 ) {
sawine@5
  4557
						return diff === 0;
sawine@5
  4558
sawine@5
  4559
					} else {
sawine@5
  4560
						return ( diff % first === 0 && diff / first >= 0 );
sawine@5
  4561
					}
sawine@5
  4562
			}
sawine@5
  4563
		},
sawine@5
  4564
sawine@5
  4565
		ID: function( elem, match ) {
sawine@5
  4566
			return elem.nodeType === 1 && elem.getAttribute("id") === match;
sawine@5
  4567
		},
sawine@5
  4568
sawine@5
  4569
		TAG: function( elem, match ) {
sawine@5
  4570
			return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
sawine@5
  4571
		},
sawine@5
  4572
		
sawine@5
  4573
		CLASS: function( elem, match ) {
sawine@5
  4574
			return (" " + (elem.className || elem.getAttribute("class")) + " ")
sawine@5
  4575
				.indexOf( match ) > -1;
sawine@5
  4576
		},
sawine@5
  4577
sawine@5
  4578
		ATTR: function( elem, match ) {
sawine@5
  4579
			var name = match[1],
sawine@5
  4580
				result = Expr.attrHandle[ name ] ?
sawine@5
  4581
					Expr.attrHandle[ name ]( elem ) :
sawine@5
  4582
					elem[ name ] != null ?
sawine@5
  4583
						elem[ name ] :
sawine@5
  4584
						elem.getAttribute( name ),
sawine@5
  4585
				value = result + "",
sawine@5
  4586
				type = match[2],
sawine@5
  4587
				check = match[4];
sawine@5
  4588
sawine@5
  4589
			return result == null ?
sawine@5
  4590
				type === "!=" :
sawine@5
  4591
				type === "=" ?
sawine@5
  4592
				value === check :
sawine@5
  4593
				type === "*=" ?
sawine@5
  4594
				value.indexOf(check) >= 0 :
sawine@5
  4595
				type === "~=" ?
sawine@5
  4596
				(" " + value + " ").indexOf(check) >= 0 :
sawine@5
  4597
				!check ?
sawine@5
  4598
				value && result !== false :
sawine@5
  4599
				type === "!=" ?
sawine@5
  4600
				value !== check :
sawine@5
  4601
				type === "^=" ?
sawine@5
  4602
				value.indexOf(check) === 0 :
sawine@5
  4603
				type === "$=" ?
sawine@5
  4604
				value.substr(value.length - check.length) === check :
sawine@5
  4605
				type === "|=" ?
sawine@5
  4606
				value === check || value.substr(0, check.length + 1) === check + "-" :
sawine@5
  4607
				false;
sawine@5
  4608
		},
sawine@5
  4609
sawine@5
  4610
		POS: function( elem, match, i, array ) {
sawine@5
  4611
			var name = match[2],
sawine@5
  4612
				filter = Expr.setFilters[ name ];
sawine@5
  4613
sawine@5
  4614
			if ( filter ) {
sawine@5
  4615
				return filter( elem, i, match, array );
sawine@5
  4616
			}
sawine@5
  4617
		}
sawine@5
  4618
	}
sawine@5
  4619
};
sawine@5
  4620
sawine@5
  4621
var origPOS = Expr.match.POS,
sawine@5
  4622
	fescape = function(all, num){
sawine@5
  4623
		return "\\" + (num - 0 + 1);
sawine@5
  4624
	};
sawine@5
  4625
sawine@5
  4626
for ( var type in Expr.match ) {
sawine@5
  4627
	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
sawine@5
  4628
	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
sawine@5
  4629
}
sawine@5
  4630
sawine@5
  4631
var makeArray = function( array, results ) {
sawine@5
  4632
	array = Array.prototype.slice.call( array, 0 );
sawine@5
  4633
sawine@5
  4634
	if ( results ) {
sawine@5
  4635
		results.push.apply( results, array );
sawine@5
  4636
		return results;
sawine@5
  4637
	}
sawine@5
  4638
	
sawine@5
  4639
	return array;
sawine@5
  4640
};
sawine@5
  4641
sawine@5
  4642
// Perform a simple check to determine if the browser is capable of
sawine@5
  4643
// converting a NodeList to an array using builtin methods.
sawine@5
  4644
// Also verifies that the returned array holds DOM nodes
sawine@5
  4645
// (which is not the case in the Blackberry browser)
sawine@5
  4646
try {
sawine@5
  4647
	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
sawine@5
  4648
sawine@5
  4649
// Provide a fallback method if it does not work
sawine@5
  4650
} catch( e ) {
sawine@5
  4651
	makeArray = function( array, results ) {
sawine@5
  4652
		var i = 0,
sawine@5
  4653
			ret = results || [];
sawine@5
  4654
sawine@5
  4655
		if ( toString.call(array) === "[object Array]" ) {
sawine@5
  4656
			Array.prototype.push.apply( ret, array );
sawine@5
  4657
sawine@5
  4658
		} else {
sawine@5
  4659
			if ( typeof array.length === "number" ) {
sawine@5
  4660
				for ( var l = array.length; i < l; i++ ) {
sawine@5
  4661
					ret.push( array[i] );
sawine@5
  4662
				}
sawine@5
  4663
sawine@5
  4664
			} else {
sawine@5
  4665
				for ( ; array[i]; i++ ) {
sawine@5
  4666
					ret.push( array[i] );
sawine@5
  4667
				}
sawine@5
  4668
			}
sawine@5
  4669
		}
sawine@5
  4670
sawine@5
  4671
		return ret;
sawine@5
  4672
	};
sawine@5
  4673
}
sawine@5
  4674
sawine@5
  4675
var sortOrder, siblingCheck;
sawine@5
  4676
sawine@5
  4677
if ( document.documentElement.compareDocumentPosition ) {
sawine@5
  4678
	sortOrder = function( a, b ) {
sawine@5
  4679
		if ( a === b ) {
sawine@5
  4680
			hasDuplicate = true;
sawine@5
  4681
			return 0;
sawine@5
  4682
		}
sawine@5
  4683
sawine@5
  4684
		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
sawine@5
  4685
			return a.compareDocumentPosition ? -1 : 1;
sawine@5
  4686
		}
sawine@5
  4687
sawine@5
  4688
		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
sawine@5
  4689
	};
sawine@5
  4690
sawine@5
  4691
} else {
sawine@5
  4692
	sortOrder = function( a, b ) {
sawine@5
  4693
		// The nodes are identical, we can exit early
sawine@5
  4694
		if ( a === b ) {
sawine@5
  4695
			hasDuplicate = true;
sawine@5
  4696
			return 0;
sawine@5
  4697
sawine@5
  4698
		// Fallback to using sourceIndex (in IE) if it's available on both nodes
sawine@5
  4699
		} else if ( a.sourceIndex && b.sourceIndex ) {
sawine@5
  4700
			return a.sourceIndex - b.sourceIndex;
sawine@5
  4701
		}
sawine@5
  4702
sawine@5
  4703
		var al, bl,
sawine@5
  4704
			ap = [],
sawine@5
  4705
			bp = [],
sawine@5
  4706
			aup = a.parentNode,
sawine@5
  4707
			bup = b.parentNode,
sawine@5
  4708
			cur = aup;
sawine@5
  4709
sawine@5
  4710
		// If the nodes are siblings (or identical) we can do a quick check
sawine@5
  4711
		if ( aup === bup ) {
sawine@5
  4712
			return siblingCheck( a, b );
sawine@5
  4713
sawine@5
  4714
		// If no parents were found then the nodes are disconnected
sawine@5
  4715
		} else if ( !aup ) {
sawine@5
  4716
			return -1;
sawine@5
  4717
sawine@5
  4718
		} else if ( !bup ) {
sawine@5
  4719
			return 1;
sawine@5
  4720
		}
sawine@5
  4721
sawine@5
  4722
		// Otherwise they're somewhere else in the tree so we need
sawine@5
  4723
		// to build up a full list of the parentNodes for comparison
sawine@5
  4724
		while ( cur ) {
sawine@5
  4725
			ap.unshift( cur );
sawine@5
  4726
			cur = cur.parentNode;
sawine@5
  4727
		}
sawine@5
  4728
sawine@5
  4729
		cur = bup;
sawine@5
  4730
sawine@5
  4731
		while ( cur ) {
sawine@5
  4732
			bp.unshift( cur );
sawine@5
  4733
			cur = cur.parentNode;
sawine@5
  4734
		}
sawine@5
  4735
sawine@5
  4736
		al = ap.length;
sawine@5
  4737
		bl = bp.length;
sawine@5
  4738
sawine@5
  4739
		// Start walking down the tree looking for a discrepancy
sawine@5
  4740
		for ( var i = 0; i < al && i < bl; i++ ) {
sawine@5
  4741
			if ( ap[i] !== bp[i] ) {
sawine@5
  4742
				return siblingCheck( ap[i], bp[i] );
sawine@5
  4743
			}
sawine@5
  4744
		}
sawine@5
  4745
sawine@5
  4746
		// We ended someplace up the tree so do a sibling check
sawine@5
  4747
		return i === al ?
sawine@5
  4748
			siblingCheck( a, bp[i], -1 ) :
sawine@5
  4749
			siblingCheck( ap[i], b, 1 );
sawine@5
  4750
	};
sawine@5
  4751
sawine@5
  4752
	siblingCheck = function( a, b, ret ) {
sawine@5
  4753
		if ( a === b ) {
sawine@5
  4754
			return ret;
sawine@5
  4755
		}
sawine@5
  4756
sawine@5
  4757
		var cur = a.nextSibling;
sawine@5
  4758
sawine@5
  4759
		while ( cur ) {
sawine@5
  4760
			if ( cur === b ) {
sawine@5
  4761
				return -1;
sawine@5
  4762
			}
sawine@5
  4763
sawine@5
  4764
			cur = cur.nextSibling;
sawine@5
  4765
		}
sawine@5
  4766
sawine@5
  4767
		return 1;
sawine@5
  4768
	};
sawine@5
  4769
}
sawine@5
  4770
sawine@5
  4771
// Utility function for retreiving the text value of an array of DOM nodes
sawine@5
  4772
Sizzle.getText = function( elems ) {
sawine@5
  4773
	var ret = "", elem;
sawine@5
  4774
sawine@5
  4775
	for ( var i = 0; elems[i]; i++ ) {
sawine@5
  4776
		elem = elems[i];
sawine@5
  4777
sawine@5
  4778
		// Get the text from text nodes and CDATA nodes
sawine@5
  4779
		if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
sawine@5
  4780
			ret += elem.nodeValue;
sawine@5
  4781
sawine@5
  4782
		// Traverse everything else, except comment nodes
sawine@5
  4783
		} else if ( elem.nodeType !== 8 ) {
sawine@5
  4784
			ret += Sizzle.getText( elem.childNodes );
sawine@5
  4785
		}
sawine@5
  4786
	}
sawine@5
  4787
sawine@5
  4788
	return ret;
sawine@5
  4789
};
sawine@5
  4790
sawine@5
  4791
// Check to see if the browser returns elements by name when
sawine@5
  4792
// querying by getElementById (and provide a workaround)
sawine@5
  4793
(function(){
sawine@5
  4794
	// We're going to inject a fake input element with a specified name
sawine@5
  4795
	var form = document.createElement("div"),
sawine@5
  4796
		id = "script" + (new Date()).getTime(),
sawine@5
  4797
		root = document.documentElement;
sawine@5
  4798
sawine@5
  4799
	form.innerHTML = "<a name='" + id + "'/>";
sawine@5
  4800
sawine@5
  4801
	// Inject it into the root element, check its status, and remove it quickly
sawine@5
  4802
	root.insertBefore( form, root.firstChild );
sawine@5
  4803
sawine@5
  4804
	// The workaround has to do additional checks after a getElementById
sawine@5
  4805
	// Which slows things down for other browsers (hence the branching)
sawine@5
  4806
	if ( document.getElementById( id ) ) {
sawine@5
  4807
		Expr.find.ID = function( match, context, isXML ) {
sawine@5
  4808
			if ( typeof context.getElementById !== "undefined" && !isXML ) {
sawine@5
  4809
				var m = context.getElementById(match[1]);
sawine@5
  4810
sawine@5
  4811
				return m ?
sawine@5
  4812
					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
sawine@5
  4813
						[m] :
sawine@5
  4814
						undefined :
sawine@5
  4815
					[];
sawine@5
  4816
			}
sawine@5
  4817
		};
sawine@5
  4818
sawine@5
  4819
		Expr.filter.ID = function( elem, match ) {
sawine@5
  4820
			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
sawine@5
  4821
sawine@5
  4822
			return elem.nodeType === 1 && node && node.nodeValue === match;
sawine@5
  4823
		};
sawine@5
  4824
	}
sawine@5
  4825
sawine@5
  4826
	root.removeChild( form );
sawine@5
  4827
sawine@5
  4828
	// release memory in IE
sawine@5
  4829
	root = form = null;
sawine@5
  4830
})();
sawine@5
  4831
sawine@5
  4832
(function(){
sawine@5
  4833
	// Check to see if the browser returns only elements
sawine@5
  4834
	// when doing getElementsByTagName("*")
sawine@5
  4835
sawine@5
  4836
	// Create a fake element
sawine@5
  4837
	var div = document.createElement("div");
sawine@5
  4838
	div.appendChild( document.createComment("") );
sawine@5
  4839
sawine@5
  4840
	// Make sure no comments are found
sawine@5
  4841
	if ( div.getElementsByTagName("*").length > 0 ) {
sawine@5
  4842
		Expr.find.TAG = function( match, context ) {
sawine@5
  4843
			var results = context.getElementsByTagName( match[1] );
sawine@5
  4844
sawine@5
  4845
			// Filter out possible comments
sawine@5
  4846
			if ( match[1] === "*" ) {
sawine@5
  4847
				var tmp = [];
sawine@5
  4848
sawine@5
  4849
				for ( var i = 0; results[i]; i++ ) {
sawine@5
  4850
					if ( results[i].nodeType === 1 ) {
sawine@5
  4851
						tmp.push( results[i] );
sawine@5
  4852
					}
sawine@5
  4853
				}
sawine@5
  4854
sawine@5
  4855
				results = tmp;
sawine@5
  4856
			}
sawine@5
  4857
sawine@5
  4858
			return results;
sawine@5
  4859
		};
sawine@5
  4860
	}
sawine@5
  4861
sawine@5
  4862
	// Check to see if an attribute returns normalized href attributes
sawine@5
  4863
	div.innerHTML = "<a href='#'></a>";
sawine@5
  4864
sawine@5
  4865
	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
sawine@5
  4866
			div.firstChild.getAttribute("href") !== "#" ) {
sawine@5
  4867
sawine@5
  4868
		Expr.attrHandle.href = function( elem ) {
sawine@5
  4869
			return elem.getAttribute( "href", 2 );
sawine@5
  4870
		};
sawine@5
  4871
	}
sawine@5
  4872
sawine@5
  4873
	// release memory in IE
sawine@5
  4874
	div = null;
sawine@5
  4875
})();
sawine@5
  4876
sawine@5
  4877
if ( document.querySelectorAll ) {
sawine@5
  4878
	(function(){
sawine@5
  4879
		var oldSizzle = Sizzle,
sawine@5
  4880
			div = document.createElement("div"),
sawine@5
  4881
			id = "__sizzle__";
sawine@5
  4882
sawine@5
  4883
		div.innerHTML = "<p class='TEST'></p>";
sawine@5
  4884
sawine@5
  4885
		// Safari can't handle uppercase or unicode characters when
sawine@5
  4886
		// in quirks mode.
sawine@5
  4887
		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
sawine@5
  4888
			return;
sawine@5
  4889
		}
sawine@5
  4890
	
sawine@5
  4891
		Sizzle = function( query, context, extra, seed ) {
sawine@5
  4892
			context = context || document;
sawine@5
  4893
sawine@5
  4894
			// Only use querySelectorAll on non-XML documents
sawine@5
  4895
			// (ID selectors don't work in non-HTML documents)
sawine@5
  4896
			if ( !seed && !Sizzle.isXML(context) ) {
sawine@5
  4897
				// See if we find a selector to speed up
sawine@5
  4898
				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
sawine@5
  4899
				
sawine@5
  4900
				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
sawine@5
  4901
					// Speed-up: Sizzle("TAG")
sawine@5
  4902
					if ( match[1] ) {
sawine@5
  4903
						return makeArray( context.getElementsByTagName( query ), extra );
sawine@5
  4904
					
sawine@5
  4905
					// Speed-up: Sizzle(".CLASS")
sawine@5
  4906
					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
sawine@5
  4907
						return makeArray( context.getElementsByClassName( match[2] ), extra );
sawine@5
  4908
					}
sawine@5
  4909
				}
sawine@5
  4910
				
sawine@5
  4911
				if ( context.nodeType === 9 ) {
sawine@5
  4912
					// Speed-up: Sizzle("body")
sawine@5
  4913
					// The body element only exists once, optimize finding it
sawine@5
  4914
					if ( query === "body" && context.body ) {
sawine@5
  4915
						return makeArray( [ context.body ], extra );
sawine@5
  4916
						
sawine@5
  4917
					// Speed-up: Sizzle("#ID")
sawine@5
  4918
					} else if ( match && match[3] ) {
sawine@5
  4919
						var elem = context.getElementById( match[3] );
sawine@5
  4920
sawine@5
  4921
						// Check parentNode to catch when Blackberry 4.6 returns
sawine@5
  4922
						// nodes that are no longer in the document #6963
sawine@5
  4923
						if ( elem && elem.parentNode ) {
sawine@5
  4924
							// Handle the case where IE and Opera return items
sawine@5
  4925
							// by name instead of ID
sawine@5
  4926
							if ( elem.id === match[3] ) {
sawine@5
  4927
								return makeArray( [ elem ], extra );
sawine@5
  4928
							}
sawine@5
  4929
							
sawine@5
  4930
						} else {
sawine@5
  4931
							return makeArray( [], extra );
sawine@5
  4932
						}
sawine@5
  4933
					}
sawine@5
  4934
					
sawine@5
  4935
					try {
sawine@5
  4936
						return makeArray( context.querySelectorAll(query), extra );
sawine@5
  4937
					} catch(qsaError) {}
sawine@5
  4938
sawine@5
  4939
				// qSA works strangely on Element-rooted queries
sawine@5
  4940
				// We can work around this by specifying an extra ID on the root
sawine@5
  4941
				// and working up from there (Thanks to Andrew Dupont for the technique)
sawine@5
  4942
				// IE 8 doesn't work on object elements
sawine@5
  4943
				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
sawine@5
  4944
					var oldContext = context,
sawine@5
  4945
						old = context.getAttribute( "id" ),
sawine@5
  4946
						nid = old || id,
sawine@5
  4947
						hasParent = context.parentNode,
sawine@5
  4948
						relativeHierarchySelector = /^\s*[+~]/.test( query );
sawine@5
  4949
sawine@5
  4950
					if ( !old ) {
sawine@5
  4951
						context.setAttribute( "id", nid );
sawine@5
  4952
					} else {
sawine@5
  4953
						nid = nid.replace( /'/g, "\\$&" );
sawine@5
  4954
					}
sawine@5
  4955
					if ( relativeHierarchySelector && hasParent ) {
sawine@5
  4956
						context = context.parentNode;
sawine@5
  4957
					}
sawine@5
  4958
sawine@5
  4959
					try {
sawine@5
  4960
						if ( !relativeHierarchySelector || hasParent ) {
sawine@5
  4961
							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
sawine@5
  4962
						}
sawine@5
  4963
sawine@5
  4964
					} catch(pseudoError) {
sawine@5
  4965
					} finally {
sawine@5
  4966
						if ( !old ) {
sawine@5
  4967
							oldContext.removeAttribute( "id" );
sawine@5
  4968
						}
sawine@5
  4969
					}
sawine@5
  4970
				}
sawine@5
  4971
			}
sawine@5
  4972
		
sawine@5
  4973
			return oldSizzle(query, context, extra, seed);
sawine@5
  4974
		};
sawine@5
  4975
sawine@5
  4976
		for ( var prop in oldSizzle ) {
sawine@5
  4977
			Sizzle[ prop ] = oldSizzle[ prop ];
sawine@5
  4978
		}
sawine@5
  4979
sawine@5
  4980
		// release memory in IE
sawine@5
  4981
		div = null;
sawine@5
  4982
	})();
sawine@5
  4983
}
sawine@5
  4984
sawine@5
  4985
(function(){
sawine@5
  4986
	var html = document.documentElement,
sawine@5
  4987
		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
sawine@5
  4988
sawine@5
  4989
	if ( matches ) {
sawine@5
  4990
		// Check to see if it's possible to do matchesSelector
sawine@5
  4991
		// on a disconnected node (IE 9 fails this)
sawine@5
  4992
		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
sawine@5
  4993
			pseudoWorks = false;
sawine@5
  4994
sawine@5
  4995
		try {
sawine@5
  4996
			// This should fail with an exception
sawine@5
  4997
			// Gecko does not error, returns false instead
sawine@5
  4998
			matches.call( document.documentElement, "[test!='']:sizzle" );
sawine@5
  4999
	
sawine@5
  5000
		} catch( pseudoError ) {
sawine@5
  5001
			pseudoWorks = true;
sawine@5
  5002
		}
sawine@5
  5003
sawine@5
  5004
		Sizzle.matchesSelector = function( node, expr ) {
sawine@5
  5005
			// Make sure that attribute selectors are quoted
sawine@5
  5006
			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
sawine@5
  5007
sawine@5
  5008
			if ( !Sizzle.isXML( node ) ) {
sawine@5
  5009
				try { 
sawine@5
  5010
					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
sawine@5
  5011
						var ret = matches.call( node, expr );
sawine@5
  5012
sawine@5
  5013
						// IE 9's matchesSelector returns false on disconnected nodes
sawine@5
  5014
						if ( ret || !disconnectedMatch ||
sawine@5
  5015
								// As well, disconnected nodes are said to be in a document
sawine@5
  5016
								// fragment in IE 9, so check for that
sawine@5
  5017
								node.document && node.document.nodeType !== 11 ) {
sawine@5
  5018
							return ret;
sawine@5
  5019
						}
sawine@5
  5020
					}
sawine@5
  5021
				} catch(e) {}
sawine@5
  5022
			}
sawine@5
  5023
sawine@5
  5024
			return Sizzle(expr, null, null, [node]).length > 0;
sawine@5
  5025
		};
sawine@5
  5026
	}
sawine@5
  5027
})();
sawine@5
  5028
sawine@5
  5029
(function(){
sawine@5
  5030
	var div = document.createElement("div");
sawine@5
  5031
sawine@5
  5032
	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
sawine@5
  5033
sawine@5
  5034
	// Opera can't find a second classname (in 9.6)
sawine@5
  5035
	// Also, make sure that getElementsByClassName actually exists
sawine@5
  5036
	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
sawine@5
  5037
		return;
sawine@5
  5038
	}
sawine@5
  5039
sawine@5
  5040
	// Safari caches class attributes, doesn't catch changes (in 3.2)
sawine@5
  5041
	div.lastChild.className = "e";
sawine@5
  5042
sawine@5
  5043
	if ( div.getElementsByClassName("e").length === 1 ) {
sawine@5
  5044
		return;
sawine@5
  5045
	}
sawine@5
  5046
	
sawine@5
  5047
	Expr.order.splice(1, 0, "CLASS");
sawine@5
  5048
	Expr.find.CLASS = function( match, context, isXML ) {
sawine@5
  5049
		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
sawine@5
  5050
			return context.getElementsByClassName(match[1]);
sawine@5
  5051
		}
sawine@5
  5052
	};
sawine@5
  5053
sawine@5
  5054
	// release memory in IE
sawine@5
  5055
	div = null;
sawine@5
  5056
})();
sawine@5
  5057
sawine@5
  5058
function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
sawine@5
  5059
	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
sawine@5
  5060
		var elem = checkSet[i];
sawine@5
  5061
sawine@5
  5062
		if ( elem ) {
sawine@5
  5063
			var match = false;
sawine@5
  5064
sawine@5
  5065
			elem = elem[dir];
sawine@5
  5066
sawine@5
  5067
			while ( elem ) {
sawine@5
  5068
				if ( elem.sizcache === doneName ) {
sawine@5
  5069
					match = checkSet[elem.sizset];
sawine@5
  5070
					break;
sawine@5
  5071
				}
sawine@5
  5072
sawine@5
  5073
				if ( elem.nodeType === 1 && !isXML ){
sawine@5
  5074
					elem.sizcache = doneName;
sawine@5
  5075
					elem.sizset = i;
sawine@5
  5076
				}
sawine@5
  5077
sawine@5
  5078
				if ( elem.nodeName.toLowerCase() === cur ) {
sawine@5
  5079
					match = elem;
sawine@5
  5080
					break;
sawine@5
  5081
				}
sawine@5
  5082
sawine@5
  5083
				elem = elem[dir];
sawine@5
  5084
			}
sawine@5
  5085
sawine@5
  5086
			checkSet[i] = match;
sawine@5
  5087
		}
sawine@5
  5088
	}
sawine@5
  5089
}
sawine@5
  5090
sawine@5
  5091
function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
sawine@5
  5092
	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
sawine@5
  5093
		var elem = checkSet[i];
sawine@5
  5094
sawine@5
  5095
		if ( elem ) {
sawine@5
  5096
			var match = false;
sawine@5
  5097
			
sawine@5
  5098
			elem = elem[dir];
sawine@5
  5099
sawine@5
  5100
			while ( elem ) {
sawine@5
  5101
				if ( elem.sizcache === doneName ) {
sawine@5
  5102
					match = checkSet[elem.sizset];
sawine@5
  5103
					break;
sawine@5
  5104
				}
sawine@5
  5105
sawine@5
  5106
				if ( elem.nodeType === 1 ) {
sawine@5
  5107
					if ( !isXML ) {
sawine@5
  5108
						elem.sizcache = doneName;
sawine@5
  5109
						elem.sizset = i;
sawine@5
  5110
					}
sawine@5
  5111
sawine@5
  5112
					if ( typeof cur !== "string" ) {
sawine@5
  5113
						if ( elem === cur ) {
sawine@5
  5114
							match = true;
sawine@5
  5115
							break;
sawine@5
  5116
						}
sawine@5
  5117
sawine@5
  5118
					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
sawine@5
  5119
						match = elem;
sawine@5
  5120
						break;
sawine@5
  5121
					}
sawine@5
  5122
				}
sawine@5
  5123
sawine@5
  5124
				elem = elem[dir];
sawine@5
  5125
			}
sawine@5
  5126
sawine@5
  5127
			checkSet[i] = match;
sawine@5
  5128
		}
sawine@5
  5129
	}
sawine@5
  5130
}
sawine@5
  5131
sawine@5
  5132
if ( document.documentElement.contains ) {
sawine@5
  5133
	Sizzle.contains = function( a, b ) {
sawine@5
  5134
		return a !== b && (a.contains ? a.contains(b) : true);
sawine@5
  5135
	};
sawine@5
  5136
sawine@5
  5137
} else if ( document.documentElement.compareDocumentPosition ) {
sawine@5
  5138
	Sizzle.contains = function( a, b ) {
sawine@5
  5139
		return !!(a.compareDocumentPosition(b) & 16);
sawine@5
  5140
	};
sawine@5
  5141
sawine@5
  5142
} else {
sawine@5
  5143
	Sizzle.contains = function() {
sawine@5
  5144
		return false;
sawine@5
  5145
	};
sawine@5
  5146
}
sawine@5
  5147
sawine@5
  5148
Sizzle.isXML = function( elem ) {
sawine@5
  5149
	// documentElement is verified for cases where it doesn't yet exist
sawine@5
  5150
	// (such as loading iframes in IE - #4833) 
sawine@5
  5151
	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
sawine@5
  5152
sawine@5
  5153
	return documentElement ? documentElement.nodeName !== "HTML" : false;
sawine@5
  5154
};
sawine@5
  5155
sawine@5
  5156
var posProcess = function( selector, context ) {
sawine@5
  5157
	var match,
sawine@5
  5158
		tmpSet = [],
sawine@5
  5159
		later = "",
sawine@5
  5160
		root = context.nodeType ? [context] : context;
sawine@5
  5161
sawine@5
  5162
	// Position selectors must be done after the filter
sawine@5
  5163
	// And so must :not(positional) so we move all PSEUDOs to the end
sawine@5
  5164
	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
sawine@5
  5165
		later += match[0];
sawine@5
  5166
		selector = selector.replace( Expr.match.PSEUDO, "" );
sawine@5
  5167
	}
sawine@5
  5168
sawine@5
  5169
	selector = Expr.relative[selector] ? selector + "*" : selector;
sawine@5
  5170
sawine@5
  5171
	for ( var i = 0, l = root.length; i < l; i++ ) {
sawine@5
  5172
		Sizzle( selector, root[i], tmpSet );
sawine@5
  5173
	}
sawine@5
  5174
sawine@5
  5175
	return Sizzle.filter( later, tmpSet );
sawine@5
  5176
};
sawine@5
  5177
sawine@5
  5178
// EXPOSE
sawine@5
  5179
jQuery.find = Sizzle;
sawine@5
  5180
jQuery.expr = Sizzle.selectors;
sawine@5
  5181
jQuery.expr[":"] = jQuery.expr.filters;
sawine@5
  5182
jQuery.unique = Sizzle.uniqueSort;
sawine@5
  5183
jQuery.text = Sizzle.getText;
sawine@5
  5184
jQuery.isXMLDoc = Sizzle.isXML;
sawine@5
  5185
jQuery.contains = Sizzle.contains;
sawine@5
  5186
sawine@5
  5187
sawine@5
  5188
})();
sawine@5
  5189
sawine@5
  5190
sawine@5
  5191
var runtil = /Until$/,
sawine@5
  5192
	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
sawine@5
  5193
	// Note: This RegExp should be improved, or likely pulled from Sizzle
sawine@5
  5194
	rmultiselector = /,/,
sawine@5
  5195
	isSimple = /^.[^:#\[\.,]*$/,
sawine@5
  5196
	slice = Array.prototype.slice,
sawine@5
  5197
	POS = jQuery.expr.match.POS,
sawine@5
  5198
	// methods guaranteed to produce a unique set when starting from a unique set
sawine@5
  5199
	guaranteedUnique = {
sawine@5
  5200
		children: true,
sawine@5
  5201
		contents: true,
sawine@5
  5202
		next: true,
sawine@5
  5203
		prev: true
sawine@5
  5204
	};
sawine@5
  5205
sawine@5
  5206
jQuery.fn.extend({
sawine@5
  5207
	find: function( selector ) {
sawine@5
  5208
		var self = this,
sawine@5
  5209
			i, l;
sawine@5
  5210
sawine@5
  5211
		if ( typeof selector !== "string" ) {
sawine@5
  5212
			return jQuery( selector ).filter(function() {
sawine@5
  5213
				for ( i = 0, l = self.length; i < l; i++ ) {
sawine@5
  5214
					if ( jQuery.contains( self[ i ], this ) ) {
sawine@5
  5215
						return true;
sawine@5
  5216
					}
sawine@5
  5217
				}
sawine@5
  5218
			});
sawine@5
  5219
		}
sawine@5
  5220
sawine@5
  5221
		var ret = this.pushStack( "", "find", selector ),
sawine@5
  5222
			length, n, r;
sawine@5
  5223
sawine@5
  5224
		for ( i = 0, l = this.length; i < l; i++ ) {
sawine@5
  5225
			length = ret.length;
sawine@5
  5226
			jQuery.find( selector, this[i], ret );
sawine@5
  5227
sawine@5
  5228
			if ( i > 0 ) {
sawine@5
  5229
				// Make sure that the results are unique
sawine@5
  5230
				for ( n = length; n < ret.length; n++ ) {
sawine@5
  5231
					for ( r = 0; r < length; r++ ) {
sawine@5
  5232
						if ( ret[r] === ret[n] ) {
sawine@5
  5233
							ret.splice(n--, 1);
sawine@5
  5234
							break;
sawine@5
  5235
						}
sawine@5
  5236
					}
sawine@5
  5237
				}
sawine@5
  5238
			}
sawine@5
  5239
		}
sawine@5
  5240
sawine@5
  5241
		return ret;
sawine@5
  5242
	},
sawine@5
  5243
sawine@5
  5244
	has: function( target ) {
sawine@5
  5245
		var targets = jQuery( target );
sawine@5
  5246
		return this.filter(function() {
sawine@5
  5247
			for ( var i = 0, l = targets.length; i < l; i++ ) {
sawine@5
  5248
				if ( jQuery.contains( this, targets[i] ) ) {
sawine@5
  5249
					return true;
sawine@5
  5250
				}
sawine@5
  5251
			}
sawine@5
  5252
		});
sawine@5
  5253
	},
sawine@5
  5254
sawine@5
  5255
	not: function( selector ) {
sawine@5
  5256
		return this.pushStack( winnow(this, selector, false), "not", selector);
sawine@5
  5257
	},
sawine@5
  5258
sawine@5
  5259
	filter: function( selector ) {
sawine@5
  5260
		return this.pushStack( winnow(this, selector, true), "filter", selector );
sawine@5
  5261
	},
sawine@5
  5262
sawine@5
  5263
	is: function( selector ) {
sawine@5
  5264
		return !!selector && ( typeof selector === "string" ?
sawine@5
  5265
			jQuery.filter( selector, this ).length > 0 :
sawine@5
  5266
			this.filter( selector ).length > 0 );
sawine@5
  5267
	},
sawine@5
  5268
sawine@5
  5269
	closest: function( selectors, context ) {
sawine@5
  5270
		var ret = [], i, l, cur = this[0];
sawine@5
  5271
		
sawine@5
  5272
		// Array
sawine@5
  5273
		if ( jQuery.isArray( selectors ) ) {
sawine@5
  5274
			var match, selector,
sawine@5
  5275
				matches = {},
sawine@5
  5276
				level = 1;
sawine@5
  5277
sawine@5
  5278
			if ( cur && selectors.length ) {
sawine@5
  5279
				for ( i = 0, l = selectors.length; i < l; i++ ) {
sawine@5
  5280
					selector = selectors[i];
sawine@5
  5281
sawine@5
  5282
					if ( !matches[ selector ] ) {
sawine@5
  5283
						matches[ selector ] = POS.test( selector ) ?
sawine@5
  5284
							jQuery( selector, context || this.context ) :
sawine@5
  5285
							selector;
sawine@5
  5286
					}
sawine@5
  5287
				}
sawine@5
  5288
sawine@5
  5289
				while ( cur && cur.ownerDocument && cur !== context ) {
sawine@5
  5290
					for ( selector in matches ) {
sawine@5
  5291
						match = matches[ selector ];
sawine@5
  5292
sawine@5
  5293
						if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) {
sawine@5
  5294
							ret.push({ selector: selector, elem: cur, level: level });
sawine@5
  5295
						}
sawine@5
  5296
					}
sawine@5
  5297
sawine@5
  5298
					cur = cur.parentNode;
sawine@5
  5299
					level++;
sawine@5
  5300
				}
sawine@5
  5301
			}
sawine@5
  5302
sawine@5
  5303
			return ret;
sawine@5
  5304
		}
sawine@5
  5305
sawine@5
  5306
		// String
sawine@5
  5307
		var pos = POS.test( selectors ) || typeof selectors !== "string" ?
sawine@5
  5308
				jQuery( selectors, context || this.context ) :
sawine@5
  5309
				0;
sawine@5
  5310
sawine@5
  5311
		for ( i = 0, l = this.length; i < l; i++ ) {
sawine@5
  5312
			cur = this[i];
sawine@5
  5313
sawine@5
  5314
			while ( cur ) {
sawine@5
  5315
				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
sawine@5
  5316
					ret.push( cur );
sawine@5
  5317
					break;
sawine@5
  5318
sawine@5
  5319
				} else {
sawine@5
  5320
					cur = cur.parentNode;
sawine@5
  5321
					if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
sawine@5
  5322
						break;
sawine@5
  5323
					}
sawine@5
  5324
				}
sawine@5
  5325
			}
sawine@5
  5326
		}
sawine@5
  5327
sawine@5
  5328
		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
sawine@5
  5329
sawine@5
  5330
		return this.pushStack( ret, "closest", selectors );
sawine@5
  5331
	},
sawine@5
  5332
sawine@5
  5333
	// Determine the position of an element within
sawine@5
  5334
	// the matched set of elements
sawine@5
  5335
	index: function( elem ) {
sawine@5
  5336
sawine@5
  5337
		// No argument, return index in parent
sawine@5
  5338
		if ( !elem ) {
sawine@5
  5339
			return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
sawine@5
  5340
		}
sawine@5
  5341
sawine@5
  5342
		// index in selector
sawine@5
  5343
		if ( typeof elem === "string" ) {
sawine@5
  5344
			return jQuery.inArray( this[0], jQuery( elem ) );
sawine@5
  5345
		}
sawine@5
  5346
sawine@5
  5347
		// Locate the position of the desired element
sawine@5
  5348
		return jQuery.inArray(
sawine@5
  5349
			// If it receives a jQuery object, the first element is used
sawine@5
  5350
			elem.jquery ? elem[0] : elem, this );
sawine@5
  5351
	},
sawine@5
  5352
sawine@5
  5353
	add: function( selector, context ) {
sawine@5
  5354
		var set = typeof selector === "string" ?
sawine@5
  5355
				jQuery( selector, context ) :
sawine@5
  5356
				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
sawine@5
  5357
			all = jQuery.merge( this.get(), set );
sawine@5
  5358
sawine@5
  5359
		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
sawine@5
  5360
			all :
sawine@5
  5361
			jQuery.unique( all ) );
sawine@5
  5362
	},
sawine@5
  5363
sawine@5
  5364
	andSelf: function() {
sawine@5
  5365
		return this.add( this.prevObject );
sawine@5
  5366
	}
sawine@5
  5367
});
sawine@5
  5368
sawine@5
  5369
// A painfully simple check to see if an element is disconnected
sawine@5
  5370
// from a document (should be improved, where feasible).
sawine@5
  5371
function isDisconnected( node ) {
sawine@5
  5372
	return !node || !node.parentNode || node.parentNode.nodeType === 11;
sawine@5
  5373
}
sawine@5
  5374
sawine@5
  5375
jQuery.each({
sawine@5
  5376
	parent: function( elem ) {
sawine@5
  5377
		var parent = elem.parentNode;
sawine@5
  5378
		return parent && parent.nodeType !== 11 ? parent : null;
sawine@5
  5379
	},
sawine@5
  5380
	parents: function( elem ) {
sawine@5
  5381
		return jQuery.dir( elem, "parentNode" );
sawine@5
  5382
	},
sawine@5
  5383
	parentsUntil: function( elem, i, until ) {
sawine@5
  5384
		return jQuery.dir( elem, "parentNode", until );
sawine@5
  5385
	},
sawine@5
  5386
	next: function( elem ) {
sawine@5
  5387
		return jQuery.nth( elem, 2, "nextSibling" );
sawine@5
  5388
	},
sawine@5
  5389
	prev: function( elem ) {
sawine@5
  5390
		return jQuery.nth( elem, 2, "previousSibling" );
sawine@5
  5391
	},
sawine@5
  5392
	nextAll: function( elem ) {
sawine@5
  5393
		return jQuery.dir( elem, "nextSibling" );
sawine@5
  5394
	},
sawine@5
  5395
	prevAll: function( elem ) {
sawine@5
  5396
		return jQuery.dir( elem, "previousSibling" );
sawine@5
  5397
	},
sawine@5
  5398
	nextUntil: function( elem, i, until ) {
sawine@5
  5399
		return jQuery.dir( elem, "nextSibling", until );
sawine@5
  5400
	},
sawine@5
  5401
	prevUntil: function( elem, i, until ) {
sawine@5
  5402
		return jQuery.dir( elem, "previousSibling", until );
sawine@5
  5403
	},
sawine@5
  5404
	siblings: function( elem ) {
sawine@5
  5405
		return jQuery.sibling( elem.parentNode.firstChild, elem );
sawine@5
  5406
	},
sawine@5
  5407
	children: function( elem ) {
sawine@5
  5408
		return jQuery.sibling( elem.firstChild );
sawine@5
  5409
	},
sawine@5
  5410
	contents: function( elem ) {
sawine@5
  5411
		return jQuery.nodeName( elem, "iframe" ) ?
sawine@5
  5412
			elem.contentDocument || elem.contentWindow.document :
sawine@5
  5413
			jQuery.makeArray( elem.childNodes );
sawine@5
  5414
	}
sawine@5
  5415
}, function( name, fn ) {
sawine@5
  5416
	jQuery.fn[ name ] = function( until, selector ) {
sawine@5
  5417
		var ret = jQuery.map( this, fn, until ),
sawine@5
  5418
			// The variable 'args' was introduced in
sawine@5
  5419
			// https://github.com/jquery/jquery/commit/52a0238
sawine@5
  5420
			// to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
sawine@5
  5421
			// http://code.google.com/p/v8/issues/detail?id=1050
sawine@5
  5422
			args = slice.call(arguments);
sawine@5
  5423
sawine@5
  5424
		if ( !runtil.test( name ) ) {
sawine@5
  5425
			selector = until;
sawine@5
  5426
		}
sawine@5
  5427
sawine@5
  5428
		if ( selector && typeof selector === "string" ) {
sawine@5
  5429
			ret = jQuery.filter( selector, ret );
sawine@5
  5430
		}
sawine@5
  5431
sawine@5
  5432
		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
sawine@5
  5433
sawine@5
  5434
		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
sawine@5
  5435
			ret = ret.reverse();
sawine@5
  5436
		}
sawine@5
  5437
sawine@5
  5438
		return this.pushStack( ret, name, args.join(",") );
sawine@5
  5439
	};
sawine@5
  5440
});
sawine@5
  5441
sawine@5
  5442
jQuery.extend({
sawine@5
  5443
	filter: function( expr, elems, not ) {
sawine@5
  5444
		if ( not ) {
sawine@5
  5445
			expr = ":not(" + expr + ")";
sawine@5
  5446
		}
sawine@5
  5447
sawine@5
  5448
		return elems.length === 1 ?
sawine@5
  5449
			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
sawine@5
  5450
			jQuery.find.matches(expr, elems);
sawine@5
  5451
	},
sawine@5
  5452
sawine@5
  5453
	dir: function( elem, dir, until ) {
sawine@5
  5454
		var matched = [],
sawine@5
  5455
			cur = elem[ dir ];
sawine@5
  5456
sawine@5
  5457
		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
sawine@5
  5458
			if ( cur.nodeType === 1 ) {
sawine@5
  5459
				matched.push( cur );
sawine@5
  5460
			}
sawine@5
  5461
			cur = cur[dir];
sawine@5
  5462
		}
sawine@5
  5463
		return matched;
sawine@5
  5464
	},
sawine@5
  5465
sawine@5
  5466
	nth: function( cur, result, dir, elem ) {
sawine@5
  5467
		result = result || 1;
sawine@5
  5468
		var num = 0;
sawine@5
  5469
sawine@5
  5470
		for ( ; cur; cur = cur[dir] ) {
sawine@5
  5471
			if ( cur.nodeType === 1 && ++num === result ) {
sawine@5
  5472
				break;
sawine@5
  5473
			}
sawine@5
  5474
		}
sawine@5
  5475
sawine@5
  5476
		return cur;
sawine@5
  5477
	},
sawine@5
  5478
sawine@5
  5479
	sibling: function( n, elem ) {
sawine@5
  5480
		var r = [];
sawine@5
  5481
sawine@5
  5482
		for ( ; n; n = n.nextSibling ) {
sawine@5
  5483
			if ( n.nodeType === 1 && n !== elem ) {
sawine@5
  5484
				r.push( n );
sawine@5
  5485
			}
sawine@5
  5486
		}
sawine@5
  5487
sawine@5
  5488
		return r;
sawine@5
  5489
	}
sawine@5
  5490
});
sawine@5
  5491
sawine@5
  5492
// Implement the identical functionality for filter and not
sawine@5
  5493
function winnow( elements, qualifier, keep ) {
sawine@5
  5494
sawine@5
  5495
	// Can't pass null or undefined to indexOf in Firefox 4
sawine@5
  5496
	// Set to 0 to skip string check
sawine@5
  5497
	qualifier = qualifier || 0;
sawine@5
  5498
sawine@5
  5499
	if ( jQuery.isFunction( qualifier ) ) {
sawine@5
  5500
		return jQuery.grep(elements, function( elem, i ) {
sawine@5
  5501
			var retVal = !!qualifier.call( elem, i, elem );
sawine@5
  5502
			return retVal === keep;
sawine@5
  5503
		});
sawine@5
  5504
sawine@5
  5505
	} else if ( qualifier.nodeType ) {
sawine@5
  5506
		return jQuery.grep(elements, function( elem, i ) {
sawine@5
  5507
			return (elem === qualifier) === keep;
sawine@5
  5508
		});
sawine@5
  5509
sawine@5
  5510
	} else if ( typeof qualifier === "string" ) {
sawine@5
  5511
		var filtered = jQuery.grep(elements, function( elem ) {
sawine@5
  5512
			return elem.nodeType === 1;
sawine@5
  5513
		});
sawine@5
  5514
sawine@5
  5515
		if ( isSimple.test( qualifier ) ) {
sawine@5
  5516
			return jQuery.filter(qualifier, filtered, !keep);
sawine@5
  5517
		} else {
sawine@5
  5518
			qualifier = jQuery.filter( qualifier, filtered );
sawine@5
  5519
		}
sawine@5
  5520
	}
sawine@5
  5521
sawine@5
  5522
	return jQuery.grep(elements, function( elem, i ) {
sawine@5
  5523
		return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
sawine@5
  5524
	});
sawine@5
  5525
}
sawine@5
  5526
sawine@5
  5527
sawine@5
  5528
sawine@5
  5529
sawine@5
  5530
var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
sawine@5
  5531
	rleadingWhitespace = /^\s+/,
sawine@5
  5532
	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
sawine@5
  5533
	rtagName = /<([\w:]+)/,
sawine@5
  5534
	rtbody = /<tbody/i,
sawine@5
  5535
	rhtml = /<|&#?\w+;/,
sawine@5
  5536
	rnocache = /<(?:script|object|embed|option|style)/i,
sawine@5
  5537
	// checked="checked" or checked
sawine@5
  5538
	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
sawine@5
  5539
	rscriptType = /\/(java|ecma)script/i,
sawine@5
  5540
	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
sawine@5
  5541
	wrapMap = {
sawine@5
  5542
		option: [ 1, "<select multiple='multiple'>", "</select>" ],
sawine@5
  5543
		legend: [ 1, "<fieldset>", "</fieldset>" ],
sawine@5
  5544
		thead: [ 1, "<table>", "</table>" ],
sawine@5
  5545
		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
sawine@5
  5546
		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
sawine@5
  5547
		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
sawine@5
  5548
		area: [ 1, "<map>", "</map>" ],
sawine@5
  5549
		_default: [ 0, "", "" ]
sawine@5
  5550
	};
sawine@5
  5551
sawine@5
  5552
wrapMap.optgroup = wrapMap.option;
sawine@5
  5553
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
sawine@5
  5554
wrapMap.th = wrapMap.td;
sawine@5
  5555
sawine@5
  5556
// IE can't serialize <link> and <script> tags normally
sawine@5
  5557
if ( !jQuery.support.htmlSerialize ) {
sawine@5
  5558
	wrapMap._default = [ 1, "div<div>", "</div>" ];
sawine@5
  5559
}
sawine@5
  5560
sawine@5
  5561
jQuery.fn.extend({
sawine@5
  5562
	text: function( text ) {
sawine@5
  5563
		if ( jQuery.isFunction(text) ) {
sawine@5
  5564
			return this.each(function(i) {
sawine@5
  5565
				var self = jQuery( this );
sawine@5
  5566
sawine@5
  5567
				self.text( text.call(this, i, self.text()) );
sawine@5
  5568
			});
sawine@5
  5569
		}
sawine@5
  5570
sawine@5
  5571
		if ( typeof text !== "object" && text !== undefined ) {
sawine@5
  5572
			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
sawine@5
  5573
		}
sawine@5
  5574
sawine@5
  5575
		return jQuery.text( this );
sawine@5
  5576
	},
sawine@5
  5577
sawine@5
  5578
	wrapAll: function( html ) {
sawine@5
  5579
		if ( jQuery.isFunction( html ) ) {
sawine@5
  5580
			return this.each(function(i) {
sawine@5
  5581
				jQuery(this).wrapAll( html.call(this, i) );
sawine@5
  5582
			});
sawine@5
  5583
		}
sawine@5
  5584
sawine@5
  5585
		if ( this[0] ) {
sawine@5
  5586
			// The elements to wrap the target around
sawine@5
  5587
			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
sawine@5
  5588
sawine@5
  5589
			if ( this[0].parentNode ) {
sawine@5
  5590
				wrap.insertBefore( this[0] );
sawine@5
  5591
			}
sawine@5
  5592
sawine@5
  5593
			wrap.map(function() {
sawine@5
  5594
				var elem = this;
sawine@5
  5595
sawine@5
  5596
				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
sawine@5
  5597
					elem = elem.firstChild;
sawine@5
  5598
				}
sawine@5
  5599
sawine@5
  5600
				return elem;
sawine@5
  5601
			}).append( this );
sawine@5
  5602
		}
sawine@5
  5603
sawine@5
  5604
		return this;
sawine@5
  5605
	},
sawine@5
  5606
sawine@5
  5607
	wrapInner: function( html ) {
sawine@5
  5608
		if ( jQuery.isFunction( html ) ) {
sawine@5
  5609
			return this.each(function(i) {
sawine@5
  5610
				jQuery(this).wrapInner( html.call(this, i) );
sawine@5
  5611
			});
sawine@5
  5612
		}
sawine@5
  5613
sawine@5
  5614
		return this.each(function() {
sawine@5
  5615
			var self = jQuery( this ),
sawine@5
  5616
				contents = self.contents();
sawine@5
  5617
sawine@5
  5618
			if ( contents.length ) {
sawine@5
  5619
				contents.wrapAll( html );
sawine@5
  5620
sawine@5
  5621
			} else {
sawine@5
  5622
				self.append( html );
sawine@5
  5623
			}
sawine@5
  5624
		});
sawine@5
  5625
	},
sawine@5
  5626
sawine@5
  5627
	wrap: function( html ) {
sawine@5
  5628
		return this.each(function() {
sawine@5
  5629
			jQuery( this ).wrapAll( html );
sawine@5
  5630
		});
sawine@5
  5631
	},
sawine@5
  5632
sawine@5
  5633
	unwrap: function() {
sawine@5
  5634
		return this.parent().each(function() {
sawine@5
  5635
			if ( !jQuery.nodeName( this, "body" ) ) {
sawine@5
  5636
				jQuery( this ).replaceWith( this.childNodes );
sawine@5
  5637
			}
sawine@5
  5638
		}).end();
sawine@5
  5639
	},
sawine@5
  5640
sawine@5
  5641
	append: function() {
sawine@5
  5642
		return this.domManip(arguments, true, function( elem ) {
sawine@5
  5643
			if ( this.nodeType === 1 ) {
sawine@5
  5644
				this.appendChild( elem );
sawine@5
  5645
			}
sawine@5
  5646
		});
sawine@5
  5647
	},
sawine@5
  5648
sawine@5
  5649
	prepend: function() {
sawine@5
  5650
		return this.domManip(arguments, true, function( elem ) {
sawine@5
  5651
			if ( this.nodeType === 1 ) {
sawine@5
  5652
				this.insertBefore( elem, this.firstChild );
sawine@5
  5653
			}
sawine@5
  5654
		});
sawine@5
  5655
	},
sawine@5
  5656
sawine@5
  5657
	before: function() {
sawine@5
  5658
		if ( this[0] && this[0].parentNode ) {
sawine@5
  5659
			return this.domManip(arguments, false, function( elem ) {
sawine@5
  5660
				this.parentNode.insertBefore( elem, this );
sawine@5
  5661
			});
sawine@5
  5662
		} else if ( arguments.length ) {
sawine@5
  5663
			var set = jQuery(arguments[0]);
sawine@5
  5664
			set.push.apply( set, this.toArray() );
sawine@5
  5665
			return this.pushStack( set, "before", arguments );
sawine@5
  5666
		}
sawine@5
  5667
	},
sawine@5
  5668
sawine@5
  5669
	after: function() {
sawine@5
  5670
		if ( this[0] && this[0].parentNode ) {
sawine@5
  5671
			return this.domManip(arguments, false, function( elem ) {
sawine@5
  5672
				this.parentNode.insertBefore( elem, this.nextSibling );
sawine@5
  5673
			});
sawine@5
  5674
		} else if ( arguments.length ) {
sawine@5
  5675
			var set = this.pushStack( this, "after", arguments );
sawine@5
  5676
			set.push.apply( set, jQuery(arguments[0]).toArray() );
sawine@5
  5677
			return set;
sawine@5
  5678
		}
sawine@5
  5679
	},
sawine@5
  5680
sawine@5
  5681
	// keepData is for internal use only--do not document
sawine@5
  5682
	remove: function( selector, keepData ) {
sawine@5
  5683
		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
sawine@5
  5684
			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
sawine@5
  5685
				if ( !keepData && elem.nodeType === 1 ) {
sawine@5
  5686
					jQuery.cleanData( elem.getElementsByTagName("*") );
sawine@5
  5687
					jQuery.cleanData( [ elem ] );
sawine@5
  5688
				}
sawine@5
  5689
sawine@5
  5690
				if ( elem.parentNode ) {
sawine@5
  5691
					elem.parentNode.removeChild( elem );
sawine@5
  5692
				}
sawine@5
  5693
			}
sawine@5
  5694
		}
sawine@5
  5695
sawine@5
  5696
		return this;
sawine@5
  5697
	},
sawine@5
  5698
sawine@5
  5699
	empty: function() {
sawine@5
  5700
		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
sawine@5
  5701
			// Remove element nodes and prevent memory leaks
sawine@5
  5702
			if ( elem.nodeType === 1 ) {
sawine@5
  5703
				jQuery.cleanData( elem.getElementsByTagName("*") );
sawine@5
  5704
			}
sawine@5
  5705
sawine@5
  5706
			// Remove any remaining nodes
sawine@5
  5707
			while ( elem.firstChild ) {
sawine@5
  5708
				elem.removeChild( elem.firstChild );
sawine@5
  5709
			}
sawine@5
  5710
		}
sawine@5
  5711
sawine@5
  5712
		return this;
sawine@5
  5713
	},
sawine@5
  5714
sawine@5
  5715
	clone: function( dataAndEvents, deepDataAndEvents ) {
sawine@5
  5716
		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
sawine@5
  5717
		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
sawine@5
  5718
sawine@5
  5719
		return this.map( function () {
sawine@5
  5720
			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
sawine@5
  5721
		});
sawine@5
  5722
	},
sawine@5
  5723
sawine@5
  5724
	html: function( value ) {
sawine@5
  5725
		if ( value === undefined ) {
sawine@5
  5726
			return this[0] && this[0].nodeType === 1 ?
sawine@5
  5727
				this[0].innerHTML.replace(rinlinejQuery, "") :
sawine@5
  5728
				null;
sawine@5
  5729
sawine@5
  5730
		// See if we can take a shortcut and just use innerHTML
sawine@5
  5731
		} else if ( typeof value === "string" && !rnocache.test( value ) &&
sawine@5
  5732
			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
sawine@5
  5733
			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
sawine@5
  5734
sawine@5
  5735
			value = value.replace(rxhtmlTag, "<$1></$2>");
sawine@5
  5736
sawine@5
  5737
			try {
sawine@5
  5738
				for ( var i = 0, l = this.length; i < l; i++ ) {
sawine@5
  5739
					// Remove element nodes and prevent memory leaks
sawine@5
  5740
					if ( this[i].nodeType === 1 ) {
sawine@5
  5741
						jQuery.cleanData( this[i].getElementsByTagName("*") );
sawine@5
  5742
						this[i].innerHTML = value;
sawine@5
  5743
					}
sawine@5
  5744
				}
sawine@5
  5745
sawine@5
  5746
			// If using innerHTML throws an exception, use the fallback method
sawine@5
  5747
			} catch(e) {
sawine@5
  5748
				this.empty().append( value );
sawine@5
  5749
			}
sawine@5
  5750
sawine@5
  5751
		} else if ( jQuery.isFunction( value ) ) {
sawine@5
  5752
			this.each(function(i){
sawine@5
  5753
				var self = jQuery( this );
sawine@5
  5754
sawine@5
  5755
				self.html( value.call(this, i, self.html()) );
sawine@5
  5756
			});
sawine@5
  5757
sawine@5
  5758
		} else {
sawine@5
  5759
			this.empty().append( value );
sawine@5
  5760
		}
sawine@5
  5761
sawine@5
  5762
		return this;
sawine@5
  5763
	},
sawine@5
  5764
sawine@5
  5765
	replaceWith: function( value ) {
sawine@5
  5766
		if ( this[0] && this[0].parentNode ) {
sawine@5
  5767
			// Make sure that the elements are removed from the DOM before they are inserted
sawine@5
  5768
			// this can help fix replacing a parent with child elements
sawine@5
  5769
			if ( jQuery.isFunction( value ) ) {
sawine@5
  5770
				return this.each(function(i) {
sawine@5
  5771
					var self = jQuery(this), old = self.html();
sawine@5
  5772
					self.replaceWith( value.call( this, i, old ) );
sawine@5
  5773
				});
sawine@5
  5774
			}
sawine@5
  5775
sawine@5
  5776
			if ( typeof value !== "string" ) {
sawine@5
  5777
				value = jQuery( value ).detach();
sawine@5
  5778
			}
sawine@5
  5779
sawine@5
  5780
			return this.each(function() {
sawine@5
  5781
				var next = this.nextSibling,
sawine@5
  5782
					parent = this.parentNode;
sawine@5
  5783
sawine@5
  5784
				jQuery( this ).remove();
sawine@5
  5785
sawine@5
  5786
				if ( next ) {
sawine@5
  5787
					jQuery(next).before( value );
sawine@5
  5788
				} else {
sawine@5
  5789
					jQuery(parent).append( value );
sawine@5
  5790
				}
sawine@5
  5791
			});
sawine@5
  5792
		} else {
sawine@5
  5793
			return this.length ?
sawine@5
  5794
				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
sawine@5
  5795
				this;
sawine@5
  5796
		}
sawine@5
  5797
	},
sawine@5
  5798
sawine@5
  5799
	detach: function( selector ) {
sawine@5
  5800
		return this.remove( selector, true );
sawine@5
  5801
	},
sawine@5
  5802
sawine@5
  5803
	domManip: function( args, table, callback ) {
sawine@5
  5804
		var results, first, fragment, parent,
sawine@5
  5805
			value = args[0],
sawine@5
  5806
			scripts = [];
sawine@5
  5807
sawine@5
  5808
		// We can't cloneNode fragments that contain checked, in WebKit
sawine@5
  5809
		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
sawine@5
  5810
			return this.each(function() {
sawine@5
  5811
				jQuery(this).domManip( args, table, callback, true );
sawine@5
  5812
			});
sawine@5
  5813
		}
sawine@5
  5814
sawine@5
  5815
		if ( jQuery.isFunction(value) ) {
sawine@5
  5816
			return this.each(function(i) {
sawine@5
  5817
				var self = jQuery(this);
sawine@5
  5818
				args[0] = value.call(this, i, table ? self.html() : undefined);
sawine@5
  5819
				self.domManip( args, table, callback );
sawine@5
  5820
			});
sawine@5
  5821
		}
sawine@5
  5822
sawine@5
  5823
		if ( this[0] ) {
sawine@5
  5824
			parent = value && value.parentNode;
sawine@5
  5825
sawine@5
  5826
			// If we're in a fragment, just use that instead of building a new one
sawine@5
  5827
			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
sawine@5
  5828
				results = { fragment: parent };
sawine@5
  5829
sawine@5
  5830
			} else {
sawine@5
  5831
				results = jQuery.buildFragment( args, this, scripts );
sawine@5
  5832
			}
sawine@5
  5833
sawine@5
  5834
			fragment = results.fragment;
sawine@5
  5835
sawine@5
  5836
			if ( fragment.childNodes.length === 1 ) {
sawine@5
  5837
				first = fragment = fragment.firstChild;
sawine@5
  5838
			} else {
sawine@5
  5839
				first = fragment.firstChild;
sawine@5
  5840
			}
sawine@5
  5841
sawine@5
  5842
			if ( first ) {
sawine@5
  5843
				table = table && jQuery.nodeName( first, "tr" );
sawine@5
  5844
sawine@5
  5845
				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
sawine@5
  5846
					callback.call(
sawine@5
  5847
						table ?
sawine@5
  5848
							root(this[i], first) :
sawine@5
  5849
							this[i],
sawine@5
  5850
						// Make sure that we do not leak memory by inadvertently discarding
sawine@5
  5851
						// the original fragment (which might have attached data) instead of
sawine@5
  5852
						// using it; in addition, use the original fragment object for the last
sawine@5
  5853
						// item instead of first because it can end up being emptied incorrectly
sawine@5
  5854
						// in certain situations (Bug #8070).
sawine@5
  5855
						// Fragments from the fragment cache must always be cloned and never used
sawine@5
  5856
						// in place.
sawine@5
  5857
						results.cacheable || (l > 1 && i < lastIndex) ?
sawine@5
  5858
							jQuery.clone( fragment, true, true ) :
sawine@5
  5859
							fragment
sawine@5
  5860
					);
sawine@5
  5861
				}
sawine@5
  5862
			}
sawine@5
  5863
sawine@5
  5864
			if ( scripts.length ) {
sawine@5
  5865
				jQuery.each( scripts, evalScript );
sawine@5
  5866
			}
sawine@5
  5867
		}
sawine@5
  5868
sawine@5
  5869
		return this;
sawine@5
  5870
	}
sawine@5
  5871
});
sawine@5
  5872
sawine@5
  5873
function root( elem, cur ) {
sawine@5
  5874
	return jQuery.nodeName(elem, "table") ?
sawine@5
  5875
		(elem.getElementsByTagName("tbody")[0] ||
sawine@5
  5876
		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
sawine@5
  5877
		elem;
sawine@5
  5878
}
sawine@5
  5879
sawine@5
  5880
function cloneCopyEvent( src, dest ) {
sawine@5
  5881
sawine@5
  5882
	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
sawine@5
  5883
		return;
sawine@5
  5884
	}
sawine@5
  5885
sawine@5
  5886
	var internalKey = jQuery.expando,
sawine@5
  5887
		oldData = jQuery.data( src ),
sawine@5
  5888
		curData = jQuery.data( dest, oldData );
sawine@5
  5889
sawine@5
  5890
	// Switch to use the internal data object, if it exists, for the next
sawine@5
  5891
	// stage of data copying
sawine@5
  5892
	if ( (oldData = oldData[ internalKey ]) ) {
sawine@5
  5893
		var events = oldData.events;
sawine@5
  5894
				curData = curData[ internalKey ] = jQuery.extend({}, oldData);
sawine@5
  5895
sawine@5
  5896
		if ( events ) {
sawine@5
  5897
			delete curData.handle;
sawine@5
  5898
			curData.events = {};
sawine@5
  5899
sawine@5
  5900
			for ( var type in events ) {
sawine@5
  5901
				for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
sawine@5
  5902
					jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
sawine@5
  5903
				}
sawine@5
  5904
			}
sawine@5
  5905
		}
sawine@5
  5906
	}
sawine@5
  5907
}
sawine@5
  5908
sawine@5
  5909
function cloneFixAttributes( src, dest ) {
sawine@5
  5910
	var nodeName;
sawine@5
  5911
sawine@5
  5912
	// We do not need to do anything for non-Elements
sawine@5
  5913
	if ( dest.nodeType !== 1 ) {
sawine@5
  5914
		return;
sawine@5
  5915
	}
sawine@5
  5916
sawine@5
  5917
	// clearAttributes removes the attributes, which we don't want,
sawine@5
  5918
	// but also removes the attachEvent events, which we *do* want
sawine@5
  5919
	if ( dest.clearAttributes ) {
sawine@5
  5920
		dest.clearAttributes();
sawine@5
  5921
	}
sawine@5
  5922
sawine@5
  5923
	// mergeAttributes, in contrast, only merges back on the
sawine@5
  5924
	// original attributes, not the events
sawine@5
  5925
	if ( dest.mergeAttributes ) {
sawine@5
  5926
		dest.mergeAttributes( src );
sawine@5
  5927
	}
sawine@5
  5928
sawine@5
  5929
	nodeName = dest.nodeName.toLowerCase();
sawine@5
  5930
sawine@5
  5931
	// IE6-8 fail to clone children inside object elements that use
sawine@5
  5932
	// the proprietary classid attribute value (rather than the type
sawine@5
  5933
	// attribute) to identify the type of content to display
sawine@5
  5934
	if ( nodeName === "object" ) {
sawine@5
  5935
		dest.outerHTML = src.outerHTML;
sawine@5
  5936
sawine@5
  5937
	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
sawine@5
  5938
		// IE6-8 fails to persist the checked state of a cloned checkbox
sawine@5
  5939
		// or radio button. Worse, IE6-7 fail to give the cloned element
sawine@5
  5940
		// a checked appearance if the defaultChecked value isn't also set
sawine@5
  5941
		if ( src.checked ) {
sawine@5
  5942
			dest.defaultChecked = dest.checked = src.checked;
sawine@5
  5943
		}
sawine@5
  5944
sawine@5
  5945
		// IE6-7 get confused and end up setting the value of a cloned
sawine@5
  5946
		// checkbox/radio button to an empty string instead of "on"
sawine@5
  5947
		if ( dest.value !== src.value ) {
sawine@5
  5948
			dest.value = src.value;
sawine@5
  5949
		}
sawine@5
  5950
sawine@5
  5951
	// IE6-8 fails to return the selected option to the default selected
sawine@5
  5952
	// state when cloning options
sawine@5
  5953
	} else if ( nodeName === "option" ) {
sawine@5
  5954
		dest.selected = src.defaultSelected;
sawine@5
  5955
sawine@5
  5956
	// IE6-8 fails to set the defaultValue to the correct value when
sawine@5
  5957
	// cloning other types of input fields
sawine@5
  5958
	} else if ( nodeName === "input" || nodeName === "textarea" ) {
sawine@5
  5959
		dest.defaultValue = src.defaultValue;
sawine@5
  5960
	}
sawine@5
  5961
sawine@5
  5962
	// Event data gets referenced instead of copied if the expando
sawine@5
  5963
	// gets copied too
sawine@5
  5964
	dest.removeAttribute( jQuery.expando );
sawine@5
  5965
}
sawine@5
  5966
sawine@5
  5967
jQuery.buildFragment = function( args, nodes, scripts ) {
sawine@5
  5968
	var fragment, cacheable, cacheresults, doc;
sawine@5
  5969
sawine@5
  5970
  // nodes may contain either an explicit document object,
sawine@5
  5971
  // a jQuery collection or context object.
sawine@5
  5972
  // If nodes[0] contains a valid object to assign to doc
sawine@5
  5973
  if ( nodes && nodes[0] ) {
sawine@5
  5974
    doc = nodes[0].ownerDocument || nodes[0];
sawine@5
  5975
  }
sawine@5
  5976
sawine@5
  5977
  // Ensure that an attr object doesn't incorrectly stand in as a document object
sawine@5
  5978
	// Chrome and Firefox seem to allow this to occur and will throw exception
sawine@5
  5979
	// Fixes #8950
sawine@5
  5980
	if ( !doc.createDocumentFragment ) {
sawine@5
  5981
		doc = document;
sawine@5
  5982
	}
sawine@5
  5983
sawine@5
  5984
	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
sawine@5
  5985
	// Cloning options loses the selected state, so don't cache them
sawine@5
  5986
	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
sawine@5
  5987
	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
sawine@5
  5988
	if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
sawine@5
  5989
		args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
sawine@5
  5990
sawine@5
  5991
		cacheable = true;
sawine@5
  5992
sawine@5
  5993
		cacheresults = jQuery.fragments[ args[0] ];
sawine@5
  5994
		if ( cacheresults && cacheresults !== 1 ) {
sawine@5
  5995
			fragment = cacheresults;
sawine@5
  5996
		}
sawine@5
  5997
	}
sawine@5
  5998
sawine@5
  5999
	if ( !fragment ) {
sawine@5
  6000
		fragment = doc.createDocumentFragment();
sawine@5
  6001
		jQuery.clean( args, doc, fragment, scripts );
sawine@5
  6002
	}
sawine@5
  6003
sawine@5
  6004
	if ( cacheable ) {
sawine@5
  6005
		jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
sawine@5
  6006
	}
sawine@5
  6007
sawine@5
  6008
	return { fragment: fragment, cacheable: cacheable };
sawine@5
  6009
};
sawine@5
  6010
sawine@5
  6011
jQuery.fragments = {};
sawine@5
  6012
sawine@5
  6013
jQuery.each({
sawine@5
  6014
	appendTo: "append",
sawine@5
  6015
	prependTo: "prepend",
sawine@5
  6016
	insertBefore: "before",
sawine@5
  6017
	insertAfter: "after",
sawine@5
  6018
	replaceAll: "replaceWith"
sawine@5
  6019
}, function( name, original ) {
sawine@5
  6020
	jQuery.fn[ name ] = function( selector ) {
sawine@5
  6021
		var ret = [],
sawine@5
  6022
			insert = jQuery( selector ),
sawine@5
  6023
			parent = this.length === 1 && this[0].parentNode;
sawine@5
  6024
sawine@5
  6025
		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
sawine@5
  6026
			insert[ original ]( this[0] );
sawine@5
  6027
			return this;
sawine@5
  6028
sawine@5
  6029
		} else {
sawine@5
  6030
			for ( var i = 0, l = insert.length; i < l; i++ ) {
sawine@5
  6031
				var elems = (i > 0 ? this.clone(true) : this).get();
sawine@5
  6032
				jQuery( insert[i] )[ original ]( elems );
sawine@5
  6033
				ret = ret.concat( elems );
sawine@5
  6034
			}
sawine@5
  6035
sawine@5
  6036
			return this.pushStack( ret, name, insert.selector );
sawine@5
  6037
		}
sawine@5
  6038
	};
sawine@5
  6039
});
sawine@5
  6040
sawine@5
  6041
function getAll( elem ) {
sawine@5
  6042
	if ( "getElementsByTagName" in elem ) {
sawine@5
  6043
		return elem.getElementsByTagName( "*" );
sawine@5
  6044
sawine@5
  6045
	} else if ( "querySelectorAll" in elem ) {
sawine@5
  6046
		return elem.querySelectorAll( "*" );
sawine@5
  6047
sawine@5
  6048
	} else {
sawine@5
  6049
		return [];
sawine@5
  6050
	}
sawine@5
  6051
}
sawine@5
  6052
sawine@5
  6053
// Used in clean, fixes the defaultChecked property
sawine@5
  6054
function fixDefaultChecked( elem ) {
sawine@5
  6055
	if ( elem.type === "checkbox" || elem.type === "radio" ) {
sawine@5
  6056
		elem.defaultChecked = elem.checked;
sawine@5
  6057
	}
sawine@5
  6058
}
sawine@5
  6059
// Finds all inputs and passes them to fixDefaultChecked
sawine@5
  6060
function findInputs( elem ) {
sawine@5
  6061
	if ( jQuery.nodeName( elem, "input" ) ) {
sawine@5
  6062
		fixDefaultChecked( elem );
sawine@5
  6063
	} else if ( "getElementsByTagName" in elem ) {
sawine@5
  6064
		jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
sawine@5
  6065
	}
sawine@5
  6066
}
sawine@5
  6067
sawine@5
  6068
jQuery.extend({
sawine@5
  6069
	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
sawine@5
  6070
		var clone = elem.cloneNode(true),
sawine@5
  6071
				srcElements,
sawine@5
  6072
				destElements,
sawine@5
  6073
				i;
sawine@5
  6074
sawine@5
  6075
		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
sawine@5
  6076
				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
sawine@5
  6077
			// IE copies events bound via attachEvent when using cloneNode.
sawine@5
  6078
			// Calling detachEvent on the clone will also remove the events
sawine@5
  6079
			// from the original. In order to get around this, we use some
sawine@5
  6080
			// proprietary methods to clear the events. Thanks to MooTools
sawine@5
  6081
			// guys for this hotness.
sawine@5
  6082
sawine@5
  6083
			cloneFixAttributes( elem, clone );
sawine@5
  6084
sawine@5
  6085
			// Using Sizzle here is crazy slow, so we use getElementsByTagName
sawine@5
  6086
			// instead
sawine@5
  6087
			srcElements = getAll( elem );
sawine@5
  6088
			destElements = getAll( clone );
sawine@5
  6089
sawine@5
  6090
			// Weird iteration because IE will replace the length property
sawine@5
  6091
			// with an element if you are cloning the body and one of the
sawine@5
  6092
			// elements on the page has a name or id of "length"
sawine@5
  6093
			for ( i = 0; srcElements[i]; ++i ) {
sawine@5
  6094
				// Ensure that the destination node is not null; Fixes #9587
sawine@5
  6095
				if ( destElements[i] ) {
sawine@5
  6096
					cloneFixAttributes( srcElements[i], destElements[i] );
sawine@5
  6097
				}
sawine@5
  6098
			}
sawine@5
  6099
		}
sawine@5
  6100
sawine@5
  6101
		// Copy the events from the original to the clone
sawine@5
  6102
		if ( dataAndEvents ) {
sawine@5
  6103
			cloneCopyEvent( elem, clone );
sawine@5
  6104
sawine@5
  6105
			if ( deepDataAndEvents ) {
sawine@5
  6106
				srcElements = getAll( elem );
sawine@5
  6107
				destElements = getAll( clone );
sawine@5
  6108
sawine@5
  6109
				for ( i = 0; srcElements[i]; ++i ) {
sawine@5
  6110
					cloneCopyEvent( srcElements[i], destElements[i] );
sawine@5
  6111
				}
sawine@5
  6112
			}
sawine@5
  6113
		}
sawine@5
  6114
sawine@5
  6115
		srcElements = destElements = null;
sawine@5
  6116
sawine@5
  6117
		// Return the cloned set
sawine@5
  6118
		return clone;
sawine@5
  6119
	},
sawine@5
  6120
sawine@5
  6121
	clean: function( elems, context, fragment, scripts ) {
sawine@5
  6122
		var checkScriptType;
sawine@5
  6123
sawine@5
  6124
		context = context || document;
sawine@5
  6125
sawine@5
  6126
		// !context.createElement fails in IE with an error but returns typeof 'object'
sawine@5
  6127
		if ( typeof context.createElement === "undefined" ) {
sawine@5
  6128
			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
sawine@5
  6129
		}
sawine@5
  6130
sawine@5
  6131
		var ret = [], j;
sawine@5
  6132
sawine@5
  6133
		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
sawine@5
  6134
			if ( typeof elem === "number" ) {
sawine@5
  6135
				elem += "";
sawine@5
  6136
			}
sawine@5
  6137
sawine@5
  6138
			if ( !elem ) {
sawine@5
  6139
				continue;
sawine@5
  6140
			}
sawine@5
  6141
sawine@5
  6142
			// Convert html string into DOM nodes
sawine@5
  6143
			if ( typeof elem === "string" ) {
sawine@5
  6144
				if ( !rhtml.test( elem ) ) {
sawine@5
  6145
					elem = context.createTextNode( elem );
sawine@5
  6146
				} else {
sawine@5
  6147
					// Fix "XHTML"-style tags in all browsers
sawine@5
  6148
					elem = elem.replace(rxhtmlTag, "<$1></$2>");
sawine@5
  6149
sawine@5
  6150
					// Trim whitespace, otherwise indexOf won't work as expected
sawine@5
  6151
					var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
sawine@5
  6152
						wrap = wrapMap[ tag ] || wrapMap._default,
sawine@5
  6153
						depth = wrap[0],
sawine@5
  6154
						div = context.createElement("div");
sawine@5
  6155
sawine@5
  6156
					// Go to html and back, then peel off extra wrappers
sawine@5
  6157
					div.innerHTML = wrap[1] + elem + wrap[2];
sawine@5
  6158
sawine@5
  6159
					// Move to the right depth
sawine@5
  6160
					while ( depth-- ) {
sawine@5
  6161
						div = div.lastChild;
sawine@5
  6162
					}
sawine@5
  6163
sawine@5
  6164
					// Remove IE's autoinserted <tbody> from table fragments
sawine@5
  6165
					if ( !jQuery.support.tbody ) {
sawine@5
  6166
sawine@5
  6167
						// String was a <table>, *may* have spurious <tbody>
sawine@5
  6168
						var hasBody = rtbody.test(elem),
sawine@5
  6169
							tbody = tag === "table" && !hasBody ?
sawine@5
  6170
								div.firstChild && div.firstChild.childNodes :
sawine@5
  6171
sawine@5
  6172
								// String was a bare <thead> or <tfoot>
sawine@5
  6173
								wrap[1] === "<table>" && !hasBody ?
sawine@5
  6174
									div.childNodes :
sawine@5
  6175
									[];
sawine@5
  6176
sawine@5
  6177
						for ( j = tbody.length - 1; j >= 0 ; --j ) {
sawine@5
  6178
							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
sawine@5
  6179
								tbody[ j ].parentNode.removeChild( tbody[ j ] );
sawine@5
  6180
							}
sawine@5
  6181
						}
sawine@5
  6182
					}
sawine@5
  6183
sawine@5
  6184
					// IE completely kills leading whitespace when innerHTML is used
sawine@5
  6185
					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
sawine@5
  6186
						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
sawine@5
  6187
					}
sawine@5
  6188
sawine@5
  6189
					elem = div.childNodes;
sawine@5
  6190
				}
sawine@5
  6191
			}
sawine@5
  6192
sawine@5
  6193
			// Resets defaultChecked for any radios and checkboxes
sawine@5
  6194
			// about to be appended to the DOM in IE 6/7 (#8060)
sawine@5
  6195
			var len;
sawine@5
  6196
			if ( !jQuery.support.appendChecked ) {
sawine@5
  6197
				if ( elem[0] && typeof (len = elem.length) === "number" ) {
sawine@5
  6198
					for ( j = 0; j < len; j++ ) {
sawine@5
  6199
						findInputs( elem[j] );
sawine@5
  6200
					}
sawine@5
  6201
				} else {
sawine@5
  6202
					findInputs( elem );
sawine@5
  6203
				}
sawine@5
  6204
			}
sawine@5
  6205
sawine@5
  6206
			if ( elem.nodeType ) {
sawine@5
  6207
				ret.push( elem );
sawine@5
  6208
			} else {
sawine@5
  6209
				ret = jQuery.merge( ret, elem );
sawine@5
  6210
			}
sawine@5
  6211
		}
sawine@5
  6212
sawine@5
  6213
		if ( fragment ) {
sawine@5
  6214
			checkScriptType = function( elem ) {
sawine@5
  6215
				return !elem.type || rscriptType.test( elem.type );
sawine@5
  6216
			};
sawine@5
  6217
			for ( i = 0; ret[i]; i++ ) {
sawine@5
  6218
				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
sawine@5
  6219
					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
sawine@5
  6220
sawine@5
  6221
				} else {
sawine@5
  6222
					if ( ret[i].nodeType === 1 ) {
sawine@5
  6223
						var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
sawine@5
  6224
sawine@5
  6225
						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
sawine@5
  6226
					}
sawine@5
  6227
					fragment.appendChild( ret[i] );
sawine@5
  6228
				}
sawine@5
  6229
			}
sawine@5
  6230
		}
sawine@5
  6231
sawine@5
  6232
		return ret;
sawine@5
  6233
	},
sawine@5
  6234
sawine@5
  6235
	cleanData: function( elems ) {
sawine@5
  6236
		var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
sawine@5
  6237
			deleteExpando = jQuery.support.deleteExpando;
sawine@5
  6238
sawine@5
  6239
		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
sawine@5
  6240
			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
sawine@5
  6241
				continue;
sawine@5
  6242
			}
sawine@5
  6243
sawine@5
  6244
			id = elem[ jQuery.expando ];
sawine@5
  6245
sawine@5
  6246
			if ( id ) {
sawine@5
  6247
				data = cache[ id ] && cache[ id ][ internalKey ];
sawine@5
  6248
sawine@5
  6249
				if ( data && data.events ) {
sawine@5
  6250
					for ( var type in data.events ) {
sawine@5
  6251
						if ( special[ type ] ) {
sawine@5
  6252
							jQuery.event.remove( elem, type );
sawine@5
  6253
sawine@5
  6254
						// This is a shortcut to avoid jQuery.event.remove's overhead
sawine@5
  6255
						} else {
sawine@5
  6256
							jQuery.removeEvent( elem, type, data.handle );
sawine@5
  6257
						}
sawine@5
  6258
					}
sawine@5
  6259
sawine@5
  6260
					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
sawine@5
  6261
					if ( data.handle ) {
sawine@5
  6262
						data.handle.elem = null;
sawine@5
  6263
					}
sawine@5
  6264
				}
sawine@5
  6265
sawine@5
  6266
				if ( deleteExpando ) {
sawine@5
  6267
					delete elem[ jQuery.expando ];
sawine@5
  6268
sawine@5
  6269
				} else if ( elem.removeAttribute ) {
sawine@5
  6270
					elem.removeAttribute( jQuery.expando );
sawine@5
  6271
				}
sawine@5
  6272
sawine@5
  6273
				delete cache[ id ];
sawine@5
  6274
			}
sawine@5
  6275
		}
sawine@5
  6276
	}
sawine@5
  6277
});
sawine@5
  6278
sawine@5
  6279
function evalScript( i, elem ) {
sawine@5
  6280
	if ( elem.src ) {
sawine@5
  6281
		jQuery.ajax({
sawine@5
  6282
			url: elem.src,
sawine@5
  6283
			async: false,
sawine@5
  6284
			dataType: "script"
sawine@5
  6285
		});
sawine@5
  6286
	} else {
sawine@5
  6287
		jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
sawine@5
  6288
	}
sawine@5
  6289
sawine@5
  6290
	if ( elem.parentNode ) {
sawine@5
  6291
		elem.parentNode.removeChild( elem );
sawine@5
  6292
	}
sawine@5
  6293
}
sawine@5
  6294
sawine@5
  6295
sawine@5
  6296
sawine@5
  6297
sawine@5
  6298
var ralpha = /alpha\([^)]*\)/i,
sawine@5
  6299
	ropacity = /opacity=([^)]*)/,
sawine@5
  6300
	// fixed for IE9, see #8346
sawine@5
  6301
	rupper = /([A-Z]|^ms)/g,
sawine@5
  6302
	rnumpx = /^-?\d+(?:px)?$/i,
sawine@5
  6303
	rnum = /^-?\d/,
sawine@5
  6304
	rrelNum = /^([\-+])=([\-+.\de]+)/,
sawine@5
  6305
sawine@5
  6306
	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
sawine@5
  6307
	cssWidth = [ "Left", "Right" ],
sawine@5
  6308
	cssHeight = [ "Top", "Bottom" ],
sawine@5
  6309
	curCSS,
sawine@5
  6310
sawine@5
  6311
	getComputedStyle,
sawine@5
  6312
	currentStyle;
sawine@5
  6313
sawine@5
  6314
jQuery.fn.css = function( name, value ) {
sawine@5
  6315
	// Setting 'undefined' is a no-op
sawine@5
  6316
	if ( arguments.length === 2 && value === undefined ) {
sawine@5
  6317
		return this;
sawine@5
  6318
	}
sawine@5
  6319
sawine@5
  6320
	return jQuery.access( this, name, value, true, function( elem, name, value ) {
sawine@5
  6321
		return value !== undefined ?
sawine@5
  6322
			jQuery.style( elem, name, value ) :
sawine@5
  6323
			jQuery.css( elem, name );
sawine@5
  6324
	});
sawine@5
  6325
};
sawine@5
  6326
sawine@5
  6327
jQuery.extend({
sawine@5
  6328
	// Add in style property hooks for overriding the default
sawine@5
  6329
	// behavior of getting and setting a style property
sawine@5
  6330
	cssHooks: {
sawine@5
  6331
		opacity: {
sawine@5
  6332
			get: function( elem, computed ) {
sawine@5
  6333
				if ( computed ) {
sawine@5
  6334
					// We should always get a number back from opacity
sawine@5
  6335
					var ret = curCSS( elem, "opacity", "opacity" );
sawine@5
  6336
					return ret === "" ? "1" : ret;
sawine@5
  6337
sawine@5
  6338
				} else {
sawine@5
  6339
					return elem.style.opacity;
sawine@5
  6340
				}
sawine@5
  6341
			}
sawine@5
  6342
		}
sawine@5
  6343
	},
sawine@5
  6344
sawine@5
  6345
	// Exclude the following css properties to add px
sawine@5
  6346
	cssNumber: {
sawine@5
  6347
		"fillOpacity": true,
sawine@5
  6348
		"fontWeight": true,
sawine@5
  6349
		"lineHeight": true,
sawine@5
  6350
		"opacity": true,
sawine@5
  6351
		"orphans": true,
sawine@5
  6352
		"widows": true,
sawine@5
  6353
		"zIndex": true,
sawine@5
  6354
		"zoom": true
sawine@5
  6355
	},
sawine@5
  6356
sawine@5
  6357
	// Add in properties whose names you wish to fix before
sawine@5
  6358
	// setting or getting the value
sawine@5
  6359
	cssProps: {
sawine@5
  6360
		// normalize float css property
sawine@5
  6361
		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
sawine@5
  6362
	},
sawine@5
  6363
sawine@5
  6364
	// Get and set the style property on a DOM Node
sawine@5
  6365
	style: function( elem, name, value, extra ) {
sawine@5
  6366
		// Don't set styles on text and comment nodes
sawine@5
  6367
		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
sawine@5
  6368
			return;
sawine@5
  6369
		}
sawine@5
  6370
sawine@5
  6371
		// Make sure that we're working with the right name
sawine@5
  6372
		var ret, type, origName = jQuery.camelCase( name ),
sawine@5
  6373
			style = elem.style, hooks = jQuery.cssHooks[ origName ];
sawine@5
  6374
sawine@5
  6375
		name = jQuery.cssProps[ origName ] || origName;
sawine@5
  6376
sawine@5
  6377
		// Check if we're setting a value
sawine@5
  6378
		if ( value !== undefined ) {
sawine@5
  6379
			type = typeof value;
sawine@5
  6380
sawine@5
  6381
			// convert relative number strings (+= or -=) to relative numbers. #7345
sawine@5
  6382
			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
sawine@5
  6383
				value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
sawine@5
  6384
				// Fixes bug #9237
sawine@5
  6385
				type = "number";
sawine@5
  6386
			}
sawine@5
  6387
sawine@5
  6388
			// Make sure that NaN and null values aren't set. See: #7116
sawine@5
  6389
			if ( value == null || type === "number" && isNaN( value ) ) {
sawine@5
  6390
				return;
sawine@5
  6391
			}
sawine@5
  6392
sawine@5
  6393
			// If a number was passed in, add 'px' to the (except for certain CSS properties)
sawine@5
  6394
			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
sawine@5
  6395
				value += "px";
sawine@5
  6396
			}
sawine@5
  6397
sawine@5
  6398
			// If a hook was provided, use that value, otherwise just set the specified value
sawine@5
  6399
			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
sawine@5
  6400
				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
sawine@5
  6401
				// Fixes bug #5509
sawine@5
  6402
				try {
sawine@5
  6403
					style[ name ] = value;
sawine@5
  6404
				} catch(e) {}
sawine@5
  6405
			}
sawine@5
  6406
sawine@5
  6407
		} else {
sawine@5
  6408
			// If a hook was provided get the non-computed value from there
sawine@5
  6409
			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
sawine@5
  6410
				return ret;
sawine@5
  6411
			}
sawine@5
  6412
sawine@5
  6413
			// Otherwise just get the value from the style object
sawine@5
  6414
			return style[ name ];
sawine@5
  6415
		}
sawine@5
  6416
	},
sawine@5
  6417
sawine@5
  6418
	css: function( elem, name, extra ) {
sawine@5
  6419
		var ret, hooks;
sawine@5
  6420
sawine@5
  6421
		// Make sure that we're working with the right name
sawine@5
  6422
		name = jQuery.camelCase( name );
sawine@5
  6423
		hooks = jQuery.cssHooks[ name ];
sawine@5
  6424
		name = jQuery.cssProps[ name ] || name;
sawine@5
  6425
sawine@5
  6426
		// cssFloat needs a special treatment
sawine@5
  6427
		if ( name === "cssFloat" ) {
sawine@5
  6428
			name = "float";
sawine@5
  6429
		}
sawine@5
  6430
sawine@5
  6431
		// If a hook was provided get the computed value from there
sawine@5
  6432
		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
sawine@5
  6433
			return ret;
sawine@5
  6434
sawine@5
  6435
		// Otherwise, if a way to get the computed value exists, use that
sawine@5
  6436
		} else if ( curCSS ) {
sawine@5
  6437
			return curCSS( elem, name );
sawine@5
  6438
		}
sawine@5
  6439
	},
sawine@5
  6440
sawine@5
  6441
	// A method for quickly swapping in/out CSS properties to get correct calculations
sawine@5
  6442
	swap: function( elem, options, callback ) {
sawine@5
  6443
		var old = {};
sawine@5
  6444
sawine@5
  6445
		// Remember the old values, and insert the new ones
sawine@5
  6446
		for ( var name in options ) {
sawine@5
  6447
			old[ name ] = elem.style[ name ];
sawine@5
  6448
			elem.style[ name ] = options[ name ];
sawine@5
  6449
		}
sawine@5
  6450
sawine@5
  6451
		callback.call( elem );
sawine@5
  6452
sawine@5
  6453
		// Revert the old values
sawine@5
  6454
		for ( name in options ) {
sawine@5
  6455
			elem.style[ name ] = old[ name ];
sawine@5
  6456
		}
sawine@5
  6457
	}
sawine@5
  6458
});
sawine@5
  6459
sawine@5
  6460
// DEPRECATED, Use jQuery.css() instead
sawine@5
  6461
jQuery.curCSS = jQuery.css;
sawine@5
  6462
sawine@5
  6463
jQuery.each(["height", "width"], function( i, name ) {
sawine@5
  6464
	jQuery.cssHooks[ name ] = {
sawine@5
  6465
		get: function( elem, computed, extra ) {
sawine@5
  6466
			var val;
sawine@5
  6467
sawine@5
  6468
			if ( computed ) {
sawine@5
  6469
				if ( elem.offsetWidth !== 0 ) {
sawine@5
  6470
					return getWH( elem, name, extra );
sawine@5
  6471
				} else {
sawine@5
  6472
					jQuery.swap( elem, cssShow, function() {
sawine@5
  6473
						val = getWH( elem, name, extra );
sawine@5
  6474
					});
sawine@5
  6475
				}
sawine@5
  6476
sawine@5
  6477
				return val;
sawine@5
  6478
			}
sawine@5
  6479
		},
sawine@5
  6480
sawine@5
  6481
		set: function( elem, value ) {
sawine@5
  6482
			if ( rnumpx.test( value ) ) {
sawine@5
  6483
				// ignore negative width and height values #1599
sawine@5
  6484
				value = parseFloat( value );
sawine@5
  6485
sawine@5
  6486
				if ( value >= 0 ) {
sawine@5
  6487
					return value + "px";
sawine@5
  6488
				}
sawine@5
  6489
sawine@5
  6490
			} else {
sawine@5
  6491
				return value;
sawine@5
  6492
			}
sawine@5
  6493
		}
sawine@5
  6494
	};
sawine@5
  6495
});
sawine@5
  6496
sawine@5
  6497
if ( !jQuery.support.opacity ) {
sawine@5
  6498
	jQuery.cssHooks.opacity = {
sawine@5
  6499
		get: function( elem, computed ) {
sawine@5
  6500
			// IE uses filters for opacity
sawine@5
  6501
			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
sawine@5
  6502
				( parseFloat( RegExp.$1 ) / 100 ) + "" :
sawine@5
  6503
				computed ? "1" : "";
sawine@5
  6504
		},
sawine@5
  6505
sawine@5
  6506
		set: function( elem, value ) {
sawine@5
  6507
			var style = elem.style,
sawine@5
  6508
				currentStyle = elem.currentStyle,
sawine@5
  6509
				opacity = jQuery.isNaN( value ) ? "" : "alpha(opacity=" + value * 100 + ")",
sawine@5
  6510
				filter = currentStyle && currentStyle.filter || style.filter || "";
sawine@5
  6511
sawine@5
  6512
			// IE has trouble with opacity if it does not have layout
sawine@5
  6513
			// Force it by setting the zoom level
sawine@5
  6514
			style.zoom = 1;
sawine@5
  6515
sawine@5
  6516
			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
sawine@5
  6517
			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
sawine@5
  6518
sawine@5
  6519
				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
sawine@5
  6520
				// if "filter:" is present at all, clearType is disabled, we want to avoid this
sawine@5
  6521
				// style.removeAttribute is IE Only, but so apparently is this code path...
sawine@5
  6522
				style.removeAttribute( "filter" );
sawine@5
  6523
sawine@5
  6524
				// if there there is no filter style applied in a css rule, we are done
sawine@5
  6525
				if ( currentStyle && !currentStyle.filter ) {
sawine@5
  6526
					return;
sawine@5
  6527
				}
sawine@5
  6528
			}
sawine@5
  6529
sawine@5
  6530
			// otherwise, set new filter values
sawine@5
  6531
			style.filter = ralpha.test( filter ) ?
sawine@5
  6532
				filter.replace( ralpha, opacity ) :
sawine@5
  6533
				filter + " " + opacity;
sawine@5
  6534
		}
sawine@5
  6535
	};
sawine@5
  6536
}
sawine@5
  6537
sawine@5
  6538
jQuery(function() {
sawine@5
  6539
	// This hook cannot be added until DOM ready because the support test
sawine@5
  6540
	// for it is not run until after DOM ready
sawine@5
  6541
	if ( !jQuery.support.reliableMarginRight ) {
sawine@5
  6542
		jQuery.cssHooks.marginRight = {
sawine@5
  6543
			get: function( elem, computed ) {
sawine@5
  6544
				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
sawine@5
  6545
				// Work around by temporarily setting element display to inline-block
sawine@5
  6546
				var ret;
sawine@5
  6547
				jQuery.swap( elem, { "display": "inline-block" }, function() {
sawine@5
  6548
					if ( computed ) {
sawine@5
  6549
						ret = curCSS( elem, "margin-right", "marginRight" );
sawine@5
  6550
					} else {
sawine@5
  6551
						ret = elem.style.marginRight;
sawine@5
  6552
					}
sawine@5
  6553
				});
sawine@5
  6554
				return ret;
sawine@5
  6555
			}
sawine@5
  6556
		};
sawine@5
  6557
	}
sawine@5
  6558
});
sawine@5
  6559
sawine@5
  6560
if ( document.defaultView && document.defaultView.getComputedStyle ) {
sawine@5
  6561
	getComputedStyle = function( elem, name ) {
sawine@5
  6562
		var ret, defaultView, computedStyle;
sawine@5
  6563
sawine@5
  6564
		name = name.replace( rupper, "-$1" ).toLowerCase();
sawine@5
  6565
sawine@5
  6566
		if ( !(defaultView = elem.ownerDocument.defaultView) ) {
sawine@5
  6567
			return undefined;
sawine@5
  6568
		}
sawine@5
  6569
sawine@5
  6570
		if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
sawine@5
  6571
			ret = computedStyle.getPropertyValue( name );
sawine@5
  6572
			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
sawine@5
  6573
				ret = jQuery.style( elem, name );
sawine@5
  6574
			}
sawine@5
  6575
		}
sawine@5
  6576
sawine@5
  6577
		return ret;
sawine@5
  6578
	};
sawine@5
  6579
}
sawine@5
  6580
sawine@5
  6581
if ( document.documentElement.currentStyle ) {
sawine@5
  6582
	currentStyle = function( elem, name ) {
sawine@5
  6583
		var left,
sawine@5
  6584
			ret = elem.currentStyle && elem.currentStyle[ name ],
sawine@5
  6585
			rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
sawine@5
  6586
			style = elem.style;
sawine@5
  6587
sawine@5
  6588
		// From the awesome hack by Dean Edwards
sawine@5
  6589
		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
sawine@5
  6590
sawine@5
  6591
		// If we're not dealing with a regular pixel number
sawine@5
  6592
		// but a number that has a weird ending, we need to convert it to pixels
sawine@5
  6593
		if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
sawine@5
  6594
			// Remember the original values
sawine@5
  6595
			left = style.left;
sawine@5
  6596
sawine@5
  6597
			// Put in the new values to get a computed value out
sawine@5
  6598
			if ( rsLeft ) {
sawine@5
  6599
				elem.runtimeStyle.left = elem.currentStyle.left;
sawine@5
  6600
			}
sawine@5
  6601
			style.left = name === "fontSize" ? "1em" : (ret || 0);
sawine@5
  6602
			ret = style.pixelLeft + "px";
sawine@5
  6603
sawine@5
  6604
			// Revert the changed values
sawine@5
  6605
			style.left = left;
sawine@5
  6606
			if ( rsLeft ) {
sawine@5
  6607
				elem.runtimeStyle.left = rsLeft;
sawine@5
  6608
			}
sawine@5
  6609
		}
sawine@5
  6610
sawine@5
  6611
		return ret === "" ? "auto" : ret;
sawine@5
  6612
	};
sawine@5
  6613
}
sawine@5
  6614
sawine@5
  6615
curCSS = getComputedStyle || currentStyle;
sawine@5
  6616
sawine@5
  6617
function getWH( elem, name, extra ) {
sawine@5
  6618
sawine@5
  6619
	// Start with offset property
sawine@5
  6620
	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
sawine@5
  6621
		which = name === "width" ? cssWidth : cssHeight;
sawine@5
  6622
sawine@5
  6623
	if ( val > 0 ) {
sawine@5
  6624
		if ( extra !== "border" ) {
sawine@5
  6625
			jQuery.each( which, function() {
sawine@5
  6626
				if ( !extra ) {
sawine@5
  6627
					val -= parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
sawine@5
  6628
				}
sawine@5
  6629
				if ( extra === "margin" ) {
sawine@5
  6630
					val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
sawine@5
  6631
				} else {
sawine@5
  6632
					val -= parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
sawine@5
  6633
				}
sawine@5
  6634
			});
sawine@5
  6635
		}
sawine@5
  6636
sawine@5
  6637
		return val + "px";
sawine@5
  6638
	}
sawine@5
  6639
sawine@5
  6640
	// Fall back to computed then uncomputed css if necessary
sawine@5
  6641
	val = curCSS( elem, name, name );
sawine@5
  6642
	if ( val < 0 || val == null ) {
sawine@5
  6643
		val = elem.style[ name ] || 0;
sawine@5
  6644
	}
sawine@5
  6645
	// Normalize "", auto, and prepare for extra
sawine@5
  6646
	val = parseFloat( val ) || 0;
sawine@5
  6647
sawine@5
  6648
	// Add padding, border, margin
sawine@5
  6649
	if ( extra ) {
sawine@5
  6650
		jQuery.each( which, function() {
sawine@5
  6651
			val += parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
sawine@5
  6652
			if ( extra !== "padding" ) {
sawine@5
  6653
				val += parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
sawine@5
  6654
			}
sawine@5
  6655
			if ( extra === "margin" ) {
sawine@5
  6656
				val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
sawine@5
  6657
			}
sawine@5
  6658
		});
sawine@5
  6659
	}
sawine@5
  6660
sawine@5
  6661
	return val + "px";
sawine@5
  6662
}
sawine@5
  6663
sawine@5
  6664
if ( jQuery.expr && jQuery.expr.filters ) {
sawine@5
  6665
	jQuery.expr.filters.hidden = function( elem ) {
sawine@5
  6666
		var width = elem.offsetWidth,
sawine@5
  6667
			height = elem.offsetHeight;
sawine@5
  6668
sawine@5
  6669
		return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
sawine@5
  6670
	};
sawine@5
  6671
sawine@5
  6672
	jQuery.expr.filters.visible = function( elem ) {
sawine@5
  6673
		return !jQuery.expr.filters.hidden( elem );
sawine@5
  6674
	};
sawine@5
  6675
}
sawine@5
  6676
sawine@5
  6677
sawine@5
  6678
sawine@5
  6679
sawine@5
  6680
var r20 = /%20/g,
sawine@5
  6681
	rbracket = /\[\]$/,
sawine@5
  6682
	rCRLF = /\r?\n/g,
sawine@5
  6683
	rhash = /#.*$/,
sawine@5
  6684
	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
sawine@5
  6685
	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
sawine@5
  6686
	// #7653, #8125, #8152: local protocol detection
sawine@5
  6687
	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
sawine@5
  6688
	rnoContent = /^(?:GET|HEAD)$/,
sawine@5
  6689
	rprotocol = /^\/\//,
sawine@5
  6690
	rquery = /\?/,
sawine@5
  6691
	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
sawine@5
  6692
	rselectTextarea = /^(?:select|textarea)/i,
sawine@5
  6693
	rspacesAjax = /\s+/,
sawine@5
  6694
	rts = /([?&])_=[^&]*/,
sawine@5
  6695
	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
sawine@5
  6696
sawine@5
  6697
	// Keep a copy of the old load method
sawine@5
  6698
	_load = jQuery.fn.load,
sawine@5
  6699
sawine@5
  6700
	/* Prefilters
sawine@5
  6701
	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
sawine@5
  6702
	 * 2) These are called:
sawine@5
  6703
	 *    - BEFORE asking for a transport
sawine@5
  6704
	 *    - AFTER param serialization (s.data is a string if s.processData is true)
sawine@5
  6705
	 * 3) key is the dataType
sawine@5
  6706
	 * 4) the catchall symbol "*" can be used
sawine@5
  6707
	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
sawine@5
  6708
	 */
sawine@5
  6709
	prefilters = {},
sawine@5
  6710
sawine@5
  6711
	/* Transports bindings
sawine@5
  6712
	 * 1) key is the dataType
sawine@5
  6713
	 * 2) the catchall symbol "*" can be used
sawine@5
  6714
	 * 3) selection will start with transport dataType and THEN go to "*" if needed
sawine@5
  6715
	 */
sawine@5
  6716
	transports = {},
sawine@5
  6717
sawine@5
  6718
	// Document location
sawine@5
  6719
	ajaxLocation,
sawine@5
  6720
sawine@5
  6721
	// Document location segments
sawine@5
  6722
	ajaxLocParts,
sawine@5
  6723
	
sawine@5
  6724
	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
sawine@5
  6725
	allTypes = ["*/"] + ["*"];
sawine@5
  6726
sawine@5
  6727
// #8138, IE may throw an exception when accessing
sawine@5
  6728
// a field from window.location if document.domain has been set
sawine@5
  6729
try {
sawine@5
  6730
	ajaxLocation = location.href;
sawine@5
  6731
} catch( e ) {
sawine@5
  6732
	// Use the href attribute of an A element
sawine@5
  6733
	// since IE will modify it given document.location
sawine@5
  6734
	ajaxLocation = document.createElement( "a" );
sawine@5
  6735
	ajaxLocation.href = "";
sawine@5
  6736
	ajaxLocation = ajaxLocation.href;
sawine@5
  6737
}
sawine@5
  6738
sawine@5
  6739
// Segment location into parts
sawine@5
  6740
ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
sawine@5
  6741
sawine@5
  6742
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
sawine@5
  6743
function addToPrefiltersOrTransports( structure ) {
sawine@5
  6744
sawine@5
  6745
	// dataTypeExpression is optional and defaults to "*"
sawine@5
  6746
	return function( dataTypeExpression, func ) {
sawine@5
  6747
sawine@5
  6748
		if ( typeof dataTypeExpression !== "string" ) {
sawine@5
  6749
			func = dataTypeExpression;
sawine@5
  6750
			dataTypeExpression = "*";
sawine@5
  6751
		}
sawine@5
  6752
sawine@5
  6753
		if ( jQuery.isFunction( func ) ) {
sawine@5
  6754
			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
sawine@5
  6755
				i = 0,
sawine@5
  6756
				length = dataTypes.length,
sawine@5
  6757
				dataType,
sawine@5
  6758
				list,
sawine@5
  6759
				placeBefore;
sawine@5
  6760
sawine@5
  6761
			// For each dataType in the dataTypeExpression
sawine@5
  6762
			for(; i < length; i++ ) {
sawine@5
  6763
				dataType = dataTypes[ i ];
sawine@5
  6764
				// We control if we're asked to add before
sawine@5
  6765
				// any existing element
sawine@5
  6766
				placeBefore = /^\+/.test( dataType );
sawine@5
  6767
				if ( placeBefore ) {
sawine@5
  6768
					dataType = dataType.substr( 1 ) || "*";
sawine@5
  6769
				}
sawine@5
  6770
				list = structure[ dataType ] = structure[ dataType ] || [];
sawine@5
  6771
				// then we add to the structure accordingly
sawine@5
  6772
				list[ placeBefore ? "unshift" : "push" ]( func );
sawine@5
  6773
			}
sawine@5
  6774
		}
sawine@5
  6775
	};
sawine@5
  6776
}
sawine@5
  6777
sawine@5
  6778
// Base inspection function for prefilters and transports
sawine@5
  6779
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
sawine@5
  6780
		dataType /* internal */, inspected /* internal */ ) {
sawine@5
  6781
sawine@5
  6782
	dataType = dataType || options.dataTypes[ 0 ];
sawine@5
  6783
	inspected = inspected || {};
sawine@5
  6784
sawine@5
  6785
	inspected[ dataType ] = true;
sawine@5
  6786
sawine@5
  6787
	var list = structure[ dataType ],
sawine@5
  6788
		i = 0,
sawine@5
  6789
		length = list ? list.length : 0,
sawine@5
  6790
		executeOnly = ( structure === prefilters ),
sawine@5
  6791
		selection;
sawine@5
  6792
sawine@5
  6793
	for(; i < length && ( executeOnly || !selection ); i++ ) {
sawine@5
  6794
		selection = list[ i ]( options, originalOptions, jqXHR );
sawine@5
  6795
		// If we got redirected to another dataType
sawine@5
  6796
		// we try there if executing only and not done already
sawine@5
  6797
		if ( typeof selection === "string" ) {
sawine@5
  6798
			if ( !executeOnly || inspected[ selection ] ) {
sawine@5
  6799
				selection = undefined;
sawine@5
  6800
			} else {
sawine@5
  6801
				options.dataTypes.unshift( selection );
sawine@5
  6802
				selection = inspectPrefiltersOrTransports(
sawine@5
  6803
						structure, options, originalOptions, jqXHR, selection, inspected );
sawine@5
  6804
			}
sawine@5
  6805
		}
sawine@5
  6806
	}
sawine@5
  6807
	// If we're only executing or nothing was selected
sawine@5
  6808
	// we try the catchall dataType if not done already
sawine@5
  6809
	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
sawine@5
  6810
		selection = inspectPrefiltersOrTransports(
sawine@5
  6811
				structure, options, originalOptions, jqXHR, "*", inspected );
sawine@5
  6812
	}
sawine@5
  6813
	// unnecessary when only executing (prefilters)
sawine@5
  6814
	// but it'll be ignored by the caller in that case
sawine@5
  6815
	return selection;
sawine@5
  6816
}
sawine@5
  6817
sawine@5
  6818
// A special extend for ajax options
sawine@5
  6819
// that takes "flat" options (not to be deep extended)
sawine@5
  6820
// Fixes #9887
sawine@5
  6821
function ajaxExtend( target, src ) {
sawine@5
  6822
	var key, deep,
sawine@5
  6823
		flatOptions = jQuery.ajaxSettings.flatOptions || {};
sawine@5
  6824
	for( key in src ) {
sawine@5
  6825
		if ( src[ key ] !== undefined ) {
sawine@5
  6826
			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
sawine@5
  6827
		}
sawine@5
  6828
	}
sawine@5
  6829
	if ( deep ) {
sawine@5
  6830
		jQuery.extend( true, target, deep );
sawine@5
  6831
	}
sawine@5
  6832
}
sawine@5
  6833
sawine@5
  6834
jQuery.fn.extend({
sawine@5
  6835
	load: function( url, params, callback ) {
sawine@5
  6836
		if ( typeof url !== "string" && _load ) {
sawine@5
  6837
			return _load.apply( this, arguments );
sawine@5
  6838
sawine@5
  6839
		// Don't do a request if no elements are being requested
sawine@5
  6840
		} else if ( !this.length ) {
sawine@5
  6841
			return this;
sawine@5
  6842
		}
sawine@5
  6843
sawine@5
  6844
		var off = url.indexOf( " " );
sawine@5
  6845
		if ( off >= 0 ) {
sawine@5
  6846
			var selector = url.slice( off, url.length );
sawine@5
  6847
			url = url.slice( 0, off );
sawine@5
  6848
		}
sawine@5
  6849
sawine@5
  6850
		// Default to a GET request
sawine@5
  6851
		var type = "GET";
sawine@5
  6852
sawine@5
  6853
		// If the second parameter was provided
sawine@5
  6854
		if ( params ) {
sawine@5
  6855
			// If it's a function
sawine@5
  6856
			if ( jQuery.isFunction( params ) ) {
sawine@5
  6857
				// We assume that it's the callback
sawine@5
  6858
				callback = params;
sawine@5
  6859
				params = undefined;
sawine@5
  6860
sawine@5
  6861
			// Otherwise, build a param string
sawine@5
  6862
			} else if ( typeof params === "object" ) {
sawine@5
  6863
				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
sawine@5
  6864
				type = "POST";
sawine@5
  6865
			}
sawine@5
  6866
		}
sawine@5
  6867
sawine@5
  6868
		var self = this;
sawine@5
  6869
sawine@5
  6870
		// Request the remote document
sawine@5
  6871
		jQuery.ajax({
sawine@5
  6872
			url: url,
sawine@5
  6873
			type: type,
sawine@5
  6874
			dataType: "html",
sawine@5
  6875
			data: params,
sawine@5
  6876
			// Complete callback (responseText is used internally)
sawine@5
  6877
			complete: function( jqXHR, status, responseText ) {
sawine@5
  6878
				// Store the response as specified by the jqXHR object
sawine@5
  6879
				responseText = jqXHR.responseText;
sawine@5
  6880
				// If successful, inject the HTML into all the matched elements
sawine@5
  6881
				if ( jqXHR.isResolved() ) {
sawine@5
  6882
					// #4825: Get the actual response in case
sawine@5
  6883
					// a dataFilter is present in ajaxSettings
sawine@5
  6884
					jqXHR.done(function( r ) {
sawine@5
  6885
						responseText = r;
sawine@5
  6886
					});
sawine@5
  6887
					// See if a selector was specified
sawine@5
  6888
					self.html( selector ?
sawine@5
  6889
						// Create a dummy div to hold the results
sawine@5
  6890
						jQuery("<div>")
sawine@5
  6891
							// inject the contents of the document in, removing the scripts
sawine@5
  6892
							// to avoid any 'Permission Denied' errors in IE
sawine@5
  6893
							.append(responseText.replace(rscript, ""))
sawine@5
  6894
sawine@5
  6895
							// Locate the specified elements
sawine@5
  6896
							.find(selector) :
sawine@5
  6897
sawine@5
  6898
						// If not, just inject the full result
sawine@5
  6899
						responseText );
sawine@5
  6900
				}
sawine@5
  6901
sawine@5
  6902
				if ( callback ) {
sawine@5
  6903
					self.each( callback, [ responseText, status, jqXHR ] );
sawine@5
  6904
				}
sawine@5
  6905
			}
sawine@5
  6906
		});
sawine@5
  6907
sawine@5
  6908
		return this;
sawine@5
  6909
	},
sawine@5
  6910
sawine@5
  6911
	serialize: function() {
sawine@5
  6912
		return jQuery.param( this.serializeArray() );
sawine@5
  6913
	},
sawine@5
  6914
sawine@5
  6915
	serializeArray: function() {
sawine@5
  6916
		return this.map(function(){
sawine@5
  6917
			return this.elements ? jQuery.makeArray( this.elements ) : this;
sawine@5
  6918
		})
sawine@5
  6919
		.filter(function(){
sawine@5
  6920
			return this.name && !this.disabled &&
sawine@5
  6921
				( this.checked || rselectTextarea.test( this.nodeName ) ||
sawine@5
  6922
					rinput.test( this.type ) );
sawine@5
  6923
		})
sawine@5
  6924
		.map(function( i, elem ){
sawine@5
  6925
			var val = jQuery( this ).val();
sawine@5
  6926
sawine@5
  6927
			return val == null ?
sawine@5
  6928
				null :
sawine@5
  6929
				jQuery.isArray( val ) ?
sawine@5
  6930
					jQuery.map( val, function( val, i ){
sawine@5
  6931
						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
sawine@5
  6932
					}) :
sawine@5
  6933
					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
sawine@5
  6934
		}).get();
sawine@5
  6935
	}
sawine@5
  6936
});
sawine@5
  6937
sawine@5
  6938
// Attach a bunch of functions for handling common AJAX events
sawine@5
  6939
jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
sawine@5
  6940
	jQuery.fn[ o ] = function( f ){
sawine@5
  6941
		return this.bind( o, f );
sawine@5
  6942
	};
sawine@5
  6943
});
sawine@5
  6944
sawine@5
  6945
jQuery.each( [ "get", "post" ], function( i, method ) {
sawine@5
  6946
	jQuery[ method ] = function( url, data, callback, type ) {
sawine@5
  6947
		// shift arguments if data argument was omitted
sawine@5
  6948
		if ( jQuery.isFunction( data ) ) {
sawine@5
  6949
			type = type || callback;
sawine@5
  6950
			callback = data;
sawine@5
  6951
			data = undefined;
sawine@5
  6952
		}
sawine@5
  6953
sawine@5
  6954
		return jQuery.ajax({
sawine@5
  6955
			type: method,
sawine@5
  6956
			url: url,
sawine@5
  6957
			data: data,
sawine@5
  6958
			success: callback,
sawine@5
  6959
			dataType: type
sawine@5
  6960
		});
sawine@5
  6961
	};
sawine@5
  6962
});
sawine@5
  6963
sawine@5
  6964
jQuery.extend({
sawine@5
  6965
sawine@5
  6966
	getScript: function( url, callback ) {
sawine@5
  6967
		return jQuery.get( url, undefined, callback, "script" );
sawine@5
  6968
	},
sawine@5
  6969
sawine@5
  6970
	getJSON: function( url, data, callback ) {
sawine@5
  6971
		return jQuery.get( url, data, callback, "json" );
sawine@5
  6972
	},
sawine@5
  6973
sawine@5
  6974
	// Creates a full fledged settings object into target
sawine@5
  6975
	// with both ajaxSettings and settings fields.
sawine@5
  6976
	// If target is omitted, writes into ajaxSettings.
sawine@5
  6977
	ajaxSetup: function( target, settings ) {
sawine@5
  6978
		if ( settings ) {
sawine@5
  6979
			// Building a settings object
sawine@5
  6980
			ajaxExtend( target, jQuery.ajaxSettings );
sawine@5
  6981
		} else {
sawine@5
  6982
			// Extending ajaxSettings
sawine@5
  6983
			settings = target;
sawine@5
  6984
			target = jQuery.ajaxSettings;
sawine@5
  6985
		}
sawine@5
  6986
		ajaxExtend( target, settings );
sawine@5
  6987
		return target;
sawine@5
  6988
	},
sawine@5
  6989
sawine@5
  6990
	ajaxSettings: {
sawine@5
  6991
		url: ajaxLocation,
sawine@5
  6992
		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
sawine@5
  6993
		global: true,
sawine@5
  6994
		type: "GET",
sawine@5
  6995
		contentType: "application/x-www-form-urlencoded",
sawine@5
  6996
		processData: true,
sawine@5
  6997
		async: true,
sawine@5
  6998
		/*
sawine@5
  6999
		timeout: 0,
sawine@5
  7000
		data: null,
sawine@5
  7001
		dataType: null,
sawine@5
  7002
		username: null,
sawine@5
  7003
		password: null,
sawine@5
  7004
		cache: null,
sawine@5
  7005
		traditional: false,
sawine@5
  7006
		headers: {},
sawine@5
  7007
		*/
sawine@5
  7008
sawine@5
  7009
		accepts: {
sawine@5
  7010
			xml: "application/xml, text/xml",
sawine@5
  7011
			html: "text/html",
sawine@5
  7012
			text: "text/plain",
sawine@5
  7013
			json: "application/json, text/javascript",
sawine@5
  7014
			"*": allTypes
sawine@5
  7015
		},
sawine@5
  7016
sawine@5
  7017
		contents: {
sawine@5
  7018
			xml: /xml/,
sawine@5
  7019
			html: /html/,
sawine@5
  7020
			json: /json/
sawine@5
  7021
		},
sawine@5
  7022
sawine@5
  7023
		responseFields: {
sawine@5
  7024
			xml: "responseXML",
sawine@5
  7025
			text: "responseText"
sawine@5
  7026
		},
sawine@5
  7027
sawine@5
  7028
		// List of data converters
sawine@5
  7029
		// 1) key format is "source_type destination_type" (a single space in-between)
sawine@5
  7030
		// 2) the catchall symbol "*" can be used for source_type
sawine@5
  7031
		converters: {
sawine@5
  7032
sawine@5
  7033
			// Convert anything to text
sawine@5
  7034
			"* text": window.String,
sawine@5
  7035
sawine@5
  7036
			// Text to html (true = no transformation)
sawine@5
  7037
			"text html": true,
sawine@5
  7038
sawine@5
  7039
			// Evaluate text as a json expression
sawine@5
  7040
			"text json": jQuery.parseJSON,
sawine@5
  7041
sawine@5
  7042
			// Parse text as xml
sawine@5
  7043
			"text xml": jQuery.parseXML
sawine@5
  7044
		},
sawine@5
  7045
sawine@5
  7046
		// For options that shouldn't be deep extended:
sawine@5
  7047
		// you can add your own custom options here if
sawine@5
  7048
		// and when you create one that shouldn't be
sawine@5
  7049
		// deep extended (see ajaxExtend)
sawine@5
  7050
		flatOptions: {
sawine@5
  7051
			context: true,
sawine@5
  7052
			url: true
sawine@5
  7053
		}
sawine@5
  7054
	},
sawine@5
  7055
sawine@5
  7056
	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
sawine@5
  7057
	ajaxTransport: addToPrefiltersOrTransports( transports ),
sawine@5
  7058
sawine@5
  7059
	// Main method
sawine@5
  7060
	ajax: function( url, options ) {
sawine@5
  7061
sawine@5
  7062
		// If url is an object, simulate pre-1.5 signature
sawine@5
  7063
		if ( typeof url === "object" ) {
sawine@5
  7064
			options = url;
sawine@5
  7065
			url = undefined;
sawine@5
  7066
		}
sawine@5
  7067
sawine@5
  7068
		// Force options to be an object
sawine@5
  7069
		options = options || {};
sawine@5
  7070
sawine@5
  7071
		var // Create the final options object
sawine@5
  7072
			s = jQuery.ajaxSetup( {}, options ),
sawine@5
  7073
			// Callbacks context
sawine@5
  7074
			callbackContext = s.context || s,
sawine@5
  7075
			// Context for global events
sawine@5
  7076
			// It's the callbackContext if one was provided in the options
sawine@5
  7077
			// and if it's a DOM node or a jQuery collection
sawine@5
  7078
			globalEventContext = callbackContext !== s &&
sawine@5
  7079
				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
sawine@5
  7080
						jQuery( callbackContext ) : jQuery.event,
sawine@5
  7081
			// Deferreds
sawine@5
  7082
			deferred = jQuery.Deferred(),
sawine@5
  7083
			completeDeferred = jQuery._Deferred(),
sawine@5
  7084
			// Status-dependent callbacks
sawine@5
  7085
			statusCode = s.statusCode || {},
sawine@5
  7086
			// ifModified key
sawine@5
  7087
			ifModifiedKey,
sawine@5
  7088
			// Headers (they are sent all at once)
sawine@5
  7089
			requestHeaders = {},
sawine@5
  7090
			requestHeadersNames = {},
sawine@5
  7091
			// Response headers
sawine@5
  7092
			responseHeadersString,
sawine@5
  7093
			responseHeaders,
sawine@5
  7094
			// transport
sawine@5
  7095
			transport,
sawine@5
  7096
			// timeout handle
sawine@5
  7097
			timeoutTimer,
sawine@5
  7098
			// Cross-domain detection vars
sawine@5
  7099
			parts,
sawine@5
  7100
			// The jqXHR state
sawine@5
  7101
			state = 0,
sawine@5
  7102
			// To know if global events are to be dispatched
sawine@5
  7103
			fireGlobals,
sawine@5
  7104
			// Loop variable
sawine@5
  7105
			i,
sawine@5
  7106
			// Fake xhr
sawine@5
  7107
			jqXHR = {
sawine@5
  7108
sawine@5
  7109
				readyState: 0,
sawine@5
  7110
sawine@5
  7111
				// Caches the header
sawine@5
  7112
				setRequestHeader: function( name, value ) {
sawine@5
  7113
					if ( !state ) {
sawine@5
  7114
						var lname = name.toLowerCase();
sawine@5
  7115
						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
sawine@5
  7116
						requestHeaders[ name ] = value;
sawine@5
  7117
					}
sawine@5
  7118
					return this;
sawine@5
  7119
				},
sawine@5
  7120
sawine@5
  7121
				// Raw string
sawine@5
  7122
				getAllResponseHeaders: function() {
sawine@5
  7123
					return state === 2 ? responseHeadersString : null;
sawine@5
  7124
				},
sawine@5
  7125
sawine@5
  7126
				// Builds headers hashtable if needed
sawine@5
  7127
				getResponseHeader: function( key ) {
sawine@5
  7128
					var match;
sawine@5
  7129
					if ( state === 2 ) {
sawine@5
  7130
						if ( !responseHeaders ) {
sawine@5
  7131
							responseHeaders = {};
sawine@5
  7132
							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
sawine@5
  7133
								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
sawine@5
  7134
							}
sawine@5
  7135
						}
sawine@5
  7136
						match = responseHeaders[ key.toLowerCase() ];
sawine@5
  7137
					}
sawine@5
  7138
					return match === undefined ? null : match;
sawine@5
  7139
				},
sawine@5
  7140
sawine@5
  7141
				// Overrides response content-type header
sawine@5
  7142
				overrideMimeType: function( type ) {
sawine@5
  7143
					if ( !state ) {
sawine@5
  7144
						s.mimeType = type;
sawine@5
  7145
					}
sawine@5
  7146
					return this;
sawine@5
  7147
				},
sawine@5
  7148
sawine@5
  7149
				// Cancel the request
sawine@5
  7150
				abort: function( statusText ) {
sawine@5
  7151
					statusText = statusText || "abort";
sawine@5
  7152
					if ( transport ) {
sawine@5
  7153
						transport.abort( statusText );
sawine@5
  7154
					}
sawine@5
  7155
					done( 0, statusText );
sawine@5
  7156
					return this;
sawine@5
  7157
				}
sawine@5
  7158
			};
sawine@5
  7159
sawine@5
  7160
		// Callback for when everything is done
sawine@5
  7161
		// It is defined here because jslint complains if it is declared
sawine@5
  7162
		// at the end of the function (which would be more logical and readable)
sawine@5
  7163
		function done( status, nativeStatusText, responses, headers ) {
sawine@5
  7164
sawine@5
  7165
			// Called once
sawine@5
  7166
			if ( state === 2 ) {
sawine@5
  7167
				return;
sawine@5
  7168
			}
sawine@5
  7169
sawine@5
  7170
			// State is "done" now
sawine@5
  7171
			state = 2;
sawine@5
  7172
sawine@5
  7173
			// Clear timeout if it exists
sawine@5
  7174
			if ( timeoutTimer ) {
sawine@5
  7175
				clearTimeout( timeoutTimer );
sawine@5
  7176
			}
sawine@5
  7177
sawine@5
  7178
			// Dereference transport for early garbage collection
sawine@5
  7179
			// (no matter how long the jqXHR object will be used)
sawine@5
  7180
			transport = undefined;
sawine@5
  7181
sawine@5
  7182
			// Cache response headers
sawine@5
  7183
			responseHeadersString = headers || "";
sawine@5
  7184
sawine@5
  7185
			// Set readyState
sawine@5
  7186
			jqXHR.readyState = status > 0 ? 4 : 0;
sawine@5
  7187
sawine@5
  7188
			var isSuccess,
sawine@5
  7189
				success,
sawine@5
  7190
				error,
sawine@5
  7191
				statusText = nativeStatusText,
sawine@5
  7192
				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
sawine@5
  7193
				lastModified,
sawine@5
  7194
				etag;
sawine@5
  7195
sawine@5
  7196
			// If successful, handle type chaining
sawine@5
  7197
			if ( status >= 200 && status < 300 || status === 304 ) {
sawine@5
  7198
sawine@5
  7199
				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
sawine@5
  7200
				if ( s.ifModified ) {
sawine@5
  7201
sawine@5
  7202
					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
sawine@5
  7203
						jQuery.lastModified[ ifModifiedKey ] = lastModified;
sawine@5
  7204
					}
sawine@5
  7205
					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
sawine@5
  7206
						jQuery.etag[ ifModifiedKey ] = etag;
sawine@5
  7207
					}
sawine@5
  7208
				}
sawine@5
  7209
sawine@5
  7210
				// If not modified
sawine@5
  7211
				if ( status === 304 ) {
sawine@5
  7212
sawine@5
  7213
					statusText = "notmodified";
sawine@5
  7214
					isSuccess = true;
sawine@5
  7215
sawine@5
  7216
				// If we have data
sawine@5
  7217
				} else {
sawine@5
  7218
sawine@5
  7219
					try {
sawine@5
  7220
						success = ajaxConvert( s, response );
sawine@5
  7221
						statusText = "success";
sawine@5
  7222
						isSuccess = true;
sawine@5
  7223
					} catch(e) {
sawine@5
  7224
						// We have a parsererror
sawine@5
  7225
						statusText = "parsererror";
sawine@5
  7226
						error = e;
sawine@5
  7227
					}
sawine@5
  7228
				}
sawine@5
  7229
			} else {
sawine@5
  7230
				// We extract error from statusText
sawine@5
  7231
				// then normalize statusText and status for non-aborts
sawine@5
  7232
				error = statusText;
sawine@5
  7233
				if( !statusText || status ) {
sawine@5
  7234
					statusText = "error";
sawine@5
  7235
					if ( status < 0 ) {
sawine@5
  7236
						status = 0;
sawine@5
  7237
					}
sawine@5
  7238
				}
sawine@5
  7239
			}
sawine@5
  7240
sawine@5
  7241
			// Set data for the fake xhr object
sawine@5
  7242
			jqXHR.status = status;
sawine@5
  7243
			jqXHR.statusText = "" + ( nativeStatusText || statusText );
sawine@5
  7244
sawine@5
  7245
			// Success/Error
sawine@5
  7246
			if ( isSuccess ) {
sawine@5
  7247
				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
sawine@5
  7248
			} else {
sawine@5
  7249
				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
sawine@5
  7250
			}
sawine@5
  7251
sawine@5
  7252
			// Status-dependent callbacks
sawine@5
  7253
			jqXHR.statusCode( statusCode );
sawine@5
  7254
			statusCode = undefined;
sawine@5
  7255
sawine@5
  7256
			if ( fireGlobals ) {
sawine@5
  7257
				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
sawine@5
  7258
						[ jqXHR, s, isSuccess ? success : error ] );
sawine@5
  7259
			}
sawine@5
  7260
sawine@5
  7261
			// Complete
sawine@5
  7262
			completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
sawine@5
  7263
sawine@5
  7264
			if ( fireGlobals ) {
sawine@5
  7265
				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
sawine@5
  7266
				// Handle the global AJAX counter
sawine@5
  7267
				if ( !( --jQuery.active ) ) {
sawine@5
  7268
					jQuery.event.trigger( "ajaxStop" );
sawine@5
  7269
				}
sawine@5
  7270
			}
sawine@5
  7271
		}
sawine@5
  7272
sawine@5
  7273
		// Attach deferreds
sawine@5
  7274
		deferred.promise( jqXHR );
sawine@5
  7275
		jqXHR.success = jqXHR.done;
sawine@5
  7276
		jqXHR.error = jqXHR.fail;
sawine@5
  7277
		jqXHR.complete = completeDeferred.done;
sawine@5
  7278
sawine@5
  7279
		// Status-dependent callbacks
sawine@5
  7280
		jqXHR.statusCode = function( map ) {
sawine@5
  7281
			if ( map ) {
sawine@5
  7282
				var tmp;
sawine@5
  7283
				if ( state < 2 ) {
sawine@5
  7284
					for( tmp in map ) {
sawine@5
  7285
						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
sawine@5
  7286
					}
sawine@5
  7287
				} else {
sawine@5
  7288
					tmp = map[ jqXHR.status ];
sawine@5
  7289
					jqXHR.then( tmp, tmp );
sawine@5
  7290
				}
sawine@5
  7291
			}
sawine@5
  7292
			return this;
sawine@5
  7293
		};
sawine@5
  7294
sawine@5
  7295
		// Remove hash character (#7531: and string promotion)
sawine@5
  7296
		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
sawine@5
  7297
		// We also use the url parameter if available
sawine@5
  7298
		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
sawine@5
  7299
sawine@5
  7300
		// Extract dataTypes list
sawine@5
  7301
		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
sawine@5
  7302
sawine@5
  7303
		// Determine if a cross-domain request is in order
sawine@5
  7304
		if ( s.crossDomain == null ) {
sawine@5
  7305
			parts = rurl.exec( s.url.toLowerCase() );
sawine@5
  7306
			s.crossDomain = !!( parts &&
sawine@5
  7307
				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
sawine@5
  7308
					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
sawine@5
  7309
						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
sawine@5
  7310
			);
sawine@5
  7311
		}
sawine@5
  7312
sawine@5
  7313
		// Convert data if not already a string
sawine@5
  7314
		if ( s.data && s.processData && typeof s.data !== "string" ) {
sawine@5
  7315
			s.data = jQuery.param( s.data, s.traditional );
sawine@5
  7316
		}
sawine@5
  7317
sawine@5
  7318
		// Apply prefilters
sawine@5
  7319
		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
sawine@5
  7320
sawine@5
  7321
		// If request was aborted inside a prefiler, stop there
sawine@5
  7322
		if ( state === 2 ) {
sawine@5
  7323
			return false;
sawine@5
  7324
		}
sawine@5
  7325
sawine@5
  7326
		// We can fire global events as of now if asked to
sawine@5
  7327
		fireGlobals = s.global;
sawine@5
  7328
sawine@5
  7329
		// Uppercase the type
sawine@5
  7330
		s.type = s.type.toUpperCase();
sawine@5
  7331
sawine@5
  7332
		// Determine if request has content
sawine@5
  7333
		s.hasContent = !rnoContent.test( s.type );
sawine@5
  7334
sawine@5
  7335
		// Watch for a new set of requests
sawine@5
  7336
		if ( fireGlobals && jQuery.active++ === 0 ) {
sawine@5
  7337
			jQuery.event.trigger( "ajaxStart" );
sawine@5
  7338
		}
sawine@5
  7339
sawine@5
  7340
		// More options handling for requests with no content
sawine@5
  7341
		if ( !s.hasContent ) {
sawine@5
  7342
sawine@5
  7343
			// If data is available, append data to url
sawine@5
  7344
			if ( s.data ) {
sawine@5
  7345
				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
sawine@5
  7346
				// #9682: remove data so that it's not used in an eventual retry
sawine@5
  7347
				delete s.data;
sawine@5
  7348
			}
sawine@5
  7349
sawine@5
  7350
			// Get ifModifiedKey before adding the anti-cache parameter
sawine@5
  7351
			ifModifiedKey = s.url;
sawine@5
  7352
sawine@5
  7353
			// Add anti-cache in url if needed
sawine@5
  7354
			if ( s.cache === false ) {
sawine@5
  7355
sawine@5
  7356
				var ts = jQuery.now(),
sawine@5
  7357
					// try replacing _= if it is there
sawine@5
  7358
					ret = s.url.replace( rts, "$1_=" + ts );
sawine@5
  7359
sawine@5
  7360
				// if nothing was replaced, add timestamp to the end
sawine@5
  7361
				s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
sawine@5
  7362
			}
sawine@5
  7363
		}
sawine@5
  7364
sawine@5
  7365
		// Set the correct header, if data is being sent
sawine@5
  7366
		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
sawine@5
  7367
			jqXHR.setRequestHeader( "Content-Type", s.contentType );
sawine@5
  7368
		}
sawine@5
  7369
sawine@5
  7370
		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
sawine@5
  7371
		if ( s.ifModified ) {
sawine@5
  7372
			ifModifiedKey = ifModifiedKey || s.url;
sawine@5
  7373
			if ( jQuery.lastModified[ ifModifiedKey ] ) {
sawine@5
  7374
				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
sawine@5
  7375
			}
sawine@5
  7376
			if ( jQuery.etag[ ifModifiedKey ] ) {
sawine@5
  7377
				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
sawine@5
  7378
			}
sawine@5
  7379
		}
sawine@5
  7380
sawine@5
  7381
		// Set the Accepts header for the server, depending on the dataType
sawine@5
  7382
		jqXHR.setRequestHeader(
sawine@5
  7383
			"Accept",
sawine@5
  7384
			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
sawine@5
  7385
				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
sawine@5
  7386
				s.accepts[ "*" ]
sawine@5
  7387
		);
sawine@5
  7388
sawine@5
  7389
		// Check for headers option
sawine@5
  7390
		for ( i in s.headers ) {
sawine@5
  7391
			jqXHR.setRequestHeader( i, s.headers[ i ] );
sawine@5
  7392
		}
sawine@5
  7393
sawine@5
  7394
		// Allow custom headers/mimetypes and early abort
sawine@5
  7395
		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
sawine@5
  7396
				// Abort if not done already
sawine@5
  7397
				jqXHR.abort();
sawine@5
  7398
				return false;
sawine@5
  7399
sawine@5
  7400
		}
sawine@5
  7401
sawine@5
  7402
		// Install callbacks on deferreds
sawine@5
  7403
		for ( i in { success: 1, error: 1, complete: 1 } ) {
sawine@5
  7404
			jqXHR[ i ]( s[ i ] );
sawine@5
  7405
		}
sawine@5
  7406
sawine@5
  7407
		// Get transport
sawine@5
  7408
		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
sawine@5
  7409
sawine@5
  7410
		// If no transport, we auto-abort
sawine@5
  7411
		if ( !transport ) {
sawine@5
  7412
			done( -1, "No Transport" );
sawine@5
  7413
		} else {
sawine@5
  7414
			jqXHR.readyState = 1;
sawine@5
  7415
			// Send global event
sawine@5
  7416
			if ( fireGlobals ) {
sawine@5
  7417
				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
sawine@5
  7418
			}
sawine@5
  7419
			// Timeout
sawine@5
  7420
			if ( s.async && s.timeout > 0 ) {
sawine@5
  7421
				timeoutTimer = setTimeout( function(){
sawine@5
  7422
					jqXHR.abort( "timeout" );
sawine@5
  7423
				}, s.timeout );
sawine@5
  7424
			}
sawine@5
  7425
sawine@5
  7426
			try {
sawine@5
  7427
				state = 1;
sawine@5
  7428
				transport.send( requestHeaders, done );
sawine@5
  7429
			} catch (e) {
sawine@5
  7430
				// Propagate exception as error if not done
sawine@5
  7431
				if ( state < 2 ) {
sawine@5
  7432
					done( -1, e );
sawine@5
  7433
				// Simply rethrow otherwise
sawine@5
  7434
				} else {
sawine@5
  7435
					jQuery.error( e );
sawine@5
  7436
				}
sawine@5
  7437
			}
sawine@5
  7438
		}
sawine@5
  7439
sawine@5
  7440
		return jqXHR;
sawine@5
  7441
	},
sawine@5
  7442
sawine@5
  7443
	// Serialize an array of form elements or a set of
sawine@5
  7444
	// key/values into a query string
sawine@5
  7445
	param: function( a, traditional ) {
sawine@5
  7446
		var s = [],
sawine@5
  7447
			add = function( key, value ) {
sawine@5
  7448
				// If value is a function, invoke it and return its value
sawine@5
  7449
				value = jQuery.isFunction( value ) ? value() : value;
sawine@5
  7450
				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
sawine@5
  7451
			};
sawine@5
  7452
sawine@5
  7453
		// Set traditional to true for jQuery <= 1.3.2 behavior.
sawine@5
  7454
		if ( traditional === undefined ) {
sawine@5
  7455
			traditional = jQuery.ajaxSettings.traditional;
sawine@5
  7456
		}
sawine@5
  7457
sawine@5
  7458
		// If an array was passed in, assume that it is an array of form elements.
sawine@5
  7459
		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
sawine@5
  7460
			// Serialize the form elements
sawine@5
  7461
			jQuery.each( a, function() {
sawine@5
  7462
				add( this.name, this.value );
sawine@5
  7463
			});
sawine@5
  7464
sawine@5
  7465
		} else {
sawine@5
  7466
			// If traditional, encode the "old" way (the way 1.3.2 or older
sawine@5
  7467
			// did it), otherwise encode params recursively.
sawine@5
  7468
			for ( var prefix in a ) {
sawine@5
  7469
				buildParams( prefix, a[ prefix ], traditional, add );
sawine@5
  7470
			}
sawine@5
  7471
		}
sawine@5
  7472
sawine@5
  7473
		// Return the resulting serialization
sawine@5
  7474
		return s.join( "&" ).replace( r20, "+" );
sawine@5
  7475
	}
sawine@5
  7476
});
sawine@5
  7477
sawine@5
  7478
function buildParams( prefix, obj, traditional, add ) {
sawine@5
  7479
	if ( jQuery.isArray( obj ) ) {
sawine@5
  7480
		// Serialize array item.
sawine@5
  7481
		jQuery.each( obj, function( i, v ) {
sawine@5
  7482
			if ( traditional || rbracket.test( prefix ) ) {
sawine@5
  7483
				// Treat each array item as a scalar.
sawine@5
  7484
				add( prefix, v );
sawine@5
  7485
sawine@5
  7486
			} else {
sawine@5
  7487
				// If array item is non-scalar (array or object), encode its
sawine@5
  7488
				// numeric index to resolve deserialization ambiguity issues.
sawine@5
  7489
				// Note that rack (as of 1.0.0) can't currently deserialize
sawine@5
  7490
				// nested arrays properly, and attempting to do so may cause
sawine@5
  7491
				// a server error. Possible fixes are to modify rack's
sawine@5
  7492
				// deserialization algorithm or to provide an option or flag
sawine@5
  7493
				// to force array serialization to be shallow.
sawine@5
  7494
				buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
sawine@5
  7495
			}
sawine@5
  7496
		});
sawine@5
  7497
sawine@5
  7498
	} else if ( !traditional && obj != null && typeof obj === "object" ) {
sawine@5
  7499
		// Serialize object item.
sawine@5
  7500
		for ( var name in obj ) {
sawine@5
  7501
			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
sawine@5
  7502
		}
sawine@5
  7503
sawine@5
  7504
	} else {
sawine@5
  7505
		// Serialize scalar item.
sawine@5
  7506
		add( prefix, obj );
sawine@5
  7507
	}
sawine@5
  7508
}
sawine@5
  7509
sawine@5
  7510
// This is still on the jQuery object... for now
sawine@5
  7511
// Want to move this to jQuery.ajax some day
sawine@5
  7512
jQuery.extend({
sawine@5
  7513
sawine@5
  7514
	// Counter for holding the number of active queries
sawine@5
  7515
	active: 0,
sawine@5
  7516
sawine@5
  7517
	// Last-Modified header cache for next request
sawine@5
  7518
	lastModified: {},
sawine@5
  7519
	etag: {}
sawine@5
  7520
sawine@5
  7521
});
sawine@5
  7522
sawine@5
  7523
/* Handles responses to an ajax request:
sawine@5
  7524
 * - sets all responseXXX fields accordingly
sawine@5
  7525
 * - finds the right dataType (mediates between content-type and expected dataType)
sawine@5
  7526
 * - returns the corresponding response
sawine@5
  7527
 */
sawine@5
  7528
function ajaxHandleResponses( s, jqXHR, responses ) {
sawine@5
  7529
sawine@5
  7530
	var contents = s.contents,
sawine@5
  7531
		dataTypes = s.dataTypes,
sawine@5
  7532
		responseFields = s.responseFields,
sawine@5
  7533
		ct,
sawine@5
  7534
		type,
sawine@5
  7535
		finalDataType,
sawine@5
  7536
		firstDataType;
sawine@5
  7537
sawine@5
  7538
	// Fill responseXXX fields
sawine@5
  7539
	for( type in responseFields ) {
sawine@5
  7540
		if ( type in responses ) {
sawine@5
  7541
			jqXHR[ responseFields[type] ] = responses[ type ];
sawine@5
  7542
		}
sawine@5
  7543
	}
sawine@5
  7544
sawine@5
  7545
	// Remove auto dataType and get content-type in the process
sawine@5
  7546
	while( dataTypes[ 0 ] === "*" ) {
sawine@5
  7547
		dataTypes.shift();
sawine@5
  7548
		if ( ct === undefined ) {
sawine@5
  7549
			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
sawine@5
  7550
		}
sawine@5
  7551
	}
sawine@5
  7552
sawine@5
  7553
	// Check if we're dealing with a known content-type
sawine@5
  7554
	if ( ct ) {
sawine@5
  7555
		for ( type in contents ) {
sawine@5
  7556
			if ( contents[ type ] && contents[ type ].test( ct ) ) {
sawine@5
  7557
				dataTypes.unshift( type );
sawine@5
  7558
				break;
sawine@5
  7559
			}
sawine@5
  7560
		}
sawine@5
  7561
	}
sawine@5
  7562
sawine@5
  7563
	// Check to see if we have a response for the expected dataType
sawine@5
  7564
	if ( dataTypes[ 0 ] in responses ) {
sawine@5
  7565
		finalDataType = dataTypes[ 0 ];
sawine@5
  7566
	} else {
sawine@5
  7567
		// Try convertible dataTypes
sawine@5
  7568
		for ( type in responses ) {
sawine@5
  7569
			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
sawine@5
  7570
				finalDataType = type;
sawine@5
  7571
				break;
sawine@5
  7572
			}
sawine@5
  7573
			if ( !firstDataType ) {
sawine@5
  7574
				firstDataType = type;
sawine@5
  7575
			}
sawine@5
  7576
		}
sawine@5
  7577
		// Or just use first one
sawine@5
  7578
		finalDataType = finalDataType || firstDataType;
sawine@5
  7579
	}
sawine@5
  7580
sawine@5
  7581
	// If we found a dataType
sawine@5
  7582
	// We add the dataType to the list if needed
sawine@5
  7583
	// and return the corresponding response
sawine@5
  7584
	if ( finalDataType ) {
sawine@5
  7585
		if ( finalDataType !== dataTypes[ 0 ] ) {
sawine@5
  7586
			dataTypes.unshift( finalDataType );
sawine@5
  7587
		}
sawine@5
  7588
		return responses[ finalDataType ];
sawine@5
  7589
	}
sawine@5
  7590
}
sawine@5
  7591
sawine@5
  7592
// Chain conversions given the request and the original response
sawine@5
  7593
function ajaxConvert( s, response ) {
sawine@5
  7594
sawine@5
  7595
	// Apply the dataFilter if provided
sawine@5
  7596
	if ( s.dataFilter ) {
sawine@5
  7597
		response = s.dataFilter( response, s.dataType );
sawine@5
  7598
	}
sawine@5
  7599
sawine@5
  7600
	var dataTypes = s.dataTypes,
sawine@5
  7601
		converters = {},
sawine@5
  7602
		i,
sawine@5
  7603
		key,
sawine@5
  7604
		length = dataTypes.length,
sawine@5
  7605
		tmp,
sawine@5
  7606
		// Current and previous dataTypes
sawine@5
  7607
		current = dataTypes[ 0 ],
sawine@5
  7608
		prev,
sawine@5
  7609
		// Conversion expression
sawine@5
  7610
		conversion,
sawine@5
  7611
		// Conversion function
sawine@5
  7612
		conv,
sawine@5
  7613
		// Conversion functions (transitive conversion)
sawine@5
  7614
		conv1,
sawine@5
  7615
		conv2;
sawine@5
  7616
sawine@5
  7617
	// For each dataType in the chain
sawine@5
  7618
	for( i = 1; i < length; i++ ) {
sawine@5
  7619
sawine@5
  7620
		// Create converters map
sawine@5
  7621
		// with lowercased keys
sawine@5
  7622
		if ( i === 1 ) {
sawine@5
  7623
			for( key in s.converters ) {
sawine@5
  7624
				if( typeof key === "string" ) {
sawine@5
  7625
					converters[ key.toLowerCase() ] = s.converters[ key ];
sawine@5
  7626
				}
sawine@5
  7627
			}
sawine@5
  7628
		}
sawine@5
  7629
sawine@5
  7630
		// Get the dataTypes
sawine@5
  7631
		prev = current;
sawine@5
  7632
		current = dataTypes[ i ];
sawine@5
  7633
sawine@5
  7634
		// If current is auto dataType, update it to prev
sawine@5
  7635
		if( current === "*" ) {
sawine@5
  7636
			current = prev;
sawine@5
  7637
		// If no auto and dataTypes are actually different
sawine@5
  7638
		} else if ( prev !== "*" && prev !== current ) {
sawine@5
  7639
sawine@5
  7640
			// Get the converter
sawine@5
  7641
			conversion = prev + " " + current;
sawine@5
  7642
			conv = converters[ conversion ] || converters[ "* " + current ];
sawine@5
  7643
sawine@5
  7644
			// If there is no direct converter, search transitively
sawine@5
  7645
			if ( !conv ) {
sawine@5
  7646
				conv2 = undefined;
sawine@5
  7647
				for( conv1 in converters ) {
sawine@5
  7648
					tmp = conv1.split( " " );
sawine@5
  7649
					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
sawine@5
  7650
						conv2 = converters[ tmp[1] + " " + current ];
sawine@5
  7651
						if ( conv2 ) {
sawine@5
  7652
							conv1 = converters[ conv1 ];
sawine@5
  7653
							if ( conv1 === true ) {
sawine@5
  7654
								conv = conv2;
sawine@5
  7655
							} else if ( conv2 === true ) {
sawine@5
  7656
								conv = conv1;
sawine@5
  7657
							}
sawine@5
  7658
							break;
sawine@5
  7659
						}
sawine@5
  7660
					}
sawine@5
  7661
				}
sawine@5
  7662
			}
sawine@5
  7663
			// If we found no converter, dispatch an error
sawine@5
  7664
			if ( !( conv || conv2 ) ) {
sawine@5
  7665
				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
sawine@5
  7666
			}
sawine@5
  7667
			// If found converter is not an equivalence
sawine@5
  7668
			if ( conv !== true ) {
sawine@5
  7669
				// Convert with 1 or 2 converters accordingly
sawine@5
  7670
				response = conv ? conv( response ) : conv2( conv1(response) );
sawine@5
  7671
			}
sawine@5
  7672
		}
sawine@5
  7673
	}
sawine@5
  7674
	return response;
sawine@5
  7675
}
sawine@5
  7676
sawine@5
  7677
sawine@5
  7678
sawine@5
  7679
sawine@5
  7680
var jsc = jQuery.now(),
sawine@5
  7681
	jsre = /(\=)\?(&|$)|\?\?/i;
sawine@5
  7682
sawine@5
  7683
// Default jsonp settings
sawine@5
  7684
jQuery.ajaxSetup({
sawine@5
  7685
	jsonp: "callback",
sawine@5
  7686
	jsonpCallback: function() {
sawine@5
  7687
		return jQuery.expando + "_" + ( jsc++ );
sawine@5
  7688
	}
sawine@5
  7689
});
sawine@5
  7690
sawine@5
  7691
// Detect, normalize options and install callbacks for jsonp requests
sawine@5
  7692
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
sawine@5
  7693
sawine@5
  7694
	var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
sawine@5
  7695
		( typeof s.data === "string" );
sawine@5
  7696
sawine@5
  7697
	if ( s.dataTypes[ 0 ] === "jsonp" ||
sawine@5
  7698
		s.jsonp !== false && ( jsre.test( s.url ) ||
sawine@5
  7699
				inspectData && jsre.test( s.data ) ) ) {
sawine@5
  7700
sawine@5
  7701
		var responseContainer,
sawine@5
  7702
			jsonpCallback = s.jsonpCallback =
sawine@5
  7703
				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
sawine@5
  7704
			previous = window[ jsonpCallback ],
sawine@5
  7705
			url = s.url,
sawine@5
  7706
			data = s.data,
sawine@5
  7707
			replace = "$1" + jsonpCallback + "$2";
sawine@5
  7708
sawine@5
  7709
		if ( s.jsonp !== false ) {
sawine@5
  7710
			url = url.replace( jsre, replace );
sawine@5
  7711
			if ( s.url === url ) {
sawine@5
  7712
				if ( inspectData ) {
sawine@5
  7713
					data = data.replace( jsre, replace );
sawine@5
  7714
				}
sawine@5
  7715
				if ( s.data === data ) {
sawine@5
  7716
					// Add callback manually
sawine@5
  7717
					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
sawine@5
  7718
				}
sawine@5
  7719
			}
sawine@5
  7720
		}
sawine@5
  7721
sawine@5
  7722
		s.url = url;
sawine@5
  7723
		s.data = data;
sawine@5
  7724
sawine@5
  7725
		// Install callback
sawine@5
  7726
		window[ jsonpCallback ] = function( response ) {
sawine@5
  7727
			responseContainer = [ response ];
sawine@5
  7728
		};
sawine@5
  7729
sawine@5
  7730
		// Clean-up function
sawine@5
  7731
		jqXHR.always(function() {
sawine@5
  7732
			// Set callback back to previous value
sawine@5
  7733
			window[ jsonpCallback ] = previous;
sawine@5
  7734
			// Call if it was a function and we have a response
sawine@5
  7735
			if ( responseContainer && jQuery.isFunction( previous ) ) {
sawine@5
  7736
				window[ jsonpCallback ]( responseContainer[ 0 ] );
sawine@5
  7737
			}
sawine@5
  7738
		});
sawine@5
  7739
sawine@5
  7740
		// Use data converter to retrieve json after script execution
sawine@5
  7741
		s.converters["script json"] = function() {
sawine@5
  7742
			if ( !responseContainer ) {
sawine@5
  7743
				jQuery.error( jsonpCallback + " was not called" );
sawine@5
  7744
			}
sawine@5
  7745
			return responseContainer[ 0 ];
sawine@5
  7746
		};
sawine@5
  7747
sawine@5
  7748
		// force json dataType
sawine@5
  7749
		s.dataTypes[ 0 ] = "json";
sawine@5
  7750
sawine@5
  7751
		// Delegate to script
sawine@5
  7752
		return "script";
sawine@5
  7753
	}
sawine@5
  7754
});
sawine@5
  7755
sawine@5
  7756
sawine@5
  7757
sawine@5
  7758
sawine@5
  7759
// Install script dataType
sawine@5
  7760
jQuery.ajaxSetup({
sawine@5
  7761
	accepts: {
sawine@5
  7762
		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
sawine@5
  7763
	},
sawine@5
  7764
	contents: {
sawine@5
  7765
		script: /javascript|ecmascript/
sawine@5
  7766
	},
sawine@5
  7767
	converters: {
sawine@5
  7768
		"text script": function( text ) {
sawine@5
  7769
			jQuery.globalEval( text );
sawine@5
  7770
			return text;
sawine@5
  7771
		}
sawine@5
  7772
	}
sawine@5
  7773
});
sawine@5
  7774
sawine@5
  7775
// Handle cache's special case and global
sawine@5
  7776
jQuery.ajaxPrefilter( "script", function( s ) {
sawine@5
  7777
	if ( s.cache === undefined ) {
sawine@5
  7778
		s.cache = false;
sawine@5
  7779
	}
sawine@5
  7780
	if ( s.crossDomain ) {
sawine@5
  7781
		s.type = "GET";
sawine@5
  7782
		s.global = false;
sawine@5
  7783
	}
sawine@5
  7784
});
sawine@5
  7785
sawine@5
  7786
// Bind script tag hack transport
sawine@5
  7787
jQuery.ajaxTransport( "script", function(s) {
sawine@5
  7788
sawine@5
  7789
	// This transport only deals with cross domain requests
sawine@5
  7790
	if ( s.crossDomain ) {
sawine@5
  7791
sawine@5
  7792
		var script,
sawine@5
  7793
			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
sawine@5
  7794
sawine@5
  7795
		return {
sawine@5
  7796
sawine@5
  7797
			send: function( _, callback ) {
sawine@5
  7798
sawine@5
  7799
				script = document.createElement( "script" );
sawine@5
  7800
sawine@5
  7801
				script.async = "async";
sawine@5
  7802
sawine@5
  7803
				if ( s.scriptCharset ) {
sawine@5
  7804
					script.charset = s.scriptCharset;
sawine@5
  7805
				}
sawine@5
  7806
sawine@5
  7807
				script.src = s.url;
sawine@5
  7808
sawine@5
  7809
				// Attach handlers for all browsers
sawine@5
  7810
				script.onload = script.onreadystatechange = function( _, isAbort ) {
sawine@5
  7811
sawine@5
  7812
					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
sawine@5
  7813
sawine@5
  7814
						// Handle memory leak in IE
sawine@5
  7815
						script.onload = script.onreadystatechange = null;
sawine@5
  7816
sawine@5
  7817
						// Remove the script
sawine@5
  7818
						if ( head && script.parentNode ) {
sawine@5
  7819
							head.removeChild( script );
sawine@5
  7820
						}
sawine@5
  7821
sawine@5
  7822
						// Dereference the script
sawine@5
  7823
						script = undefined;
sawine@5
  7824
sawine@5
  7825
						// Callback if not abort
sawine@5
  7826
						if ( !isAbort ) {
sawine@5
  7827
							callback( 200, "success" );
sawine@5
  7828
						}
sawine@5
  7829
					}
sawine@5
  7830
				};
sawine@5
  7831
				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
sawine@5
  7832
				// This arises when a base node is used (#2709 and #4378).
sawine@5
  7833
				head.insertBefore( script, head.firstChild );
sawine@5
  7834
			},
sawine@5
  7835
sawine@5
  7836
			abort: function() {
sawine@5
  7837
				if ( script ) {
sawine@5
  7838
					script.onload( 0, 1 );
sawine@5
  7839
				}
sawine@5
  7840
			}
sawine@5
  7841
		};
sawine@5
  7842
	}
sawine@5
  7843
});
sawine@5
  7844
sawine@5
  7845
sawine@5
  7846
sawine@5
  7847
sawine@5
  7848
var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
sawine@5
  7849
	xhrOnUnloadAbort = window.ActiveXObject ? function() {
sawine@5
  7850
		// Abort all pending requests
sawine@5
  7851
		for ( var key in xhrCallbacks ) {
sawine@5
  7852
			xhrCallbacks[ key ]( 0, 1 );
sawine@5
  7853
		}
sawine@5
  7854
	} : false,
sawine@5
  7855
	xhrId = 0,
sawine@5
  7856
	xhrCallbacks;
sawine@5
  7857
sawine@5
  7858
// Functions to create xhrs
sawine@5
  7859
function createStandardXHR() {
sawine@5
  7860
	try {
sawine@5
  7861
		return new window.XMLHttpRequest();
sawine@5
  7862
	} catch( e ) {}
sawine@5
  7863
}
sawine@5
  7864
sawine@5
  7865
function createActiveXHR() {
sawine@5
  7866
	try {
sawine@5
  7867
		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
sawine@5
  7868
	} catch( e ) {}
sawine@5
  7869
}
sawine@5
  7870
sawine@5
  7871
// Create the request object
sawine@5
  7872
// (This is still attached to ajaxSettings for backward compatibility)
sawine@5
  7873
jQuery.ajaxSettings.xhr = window.ActiveXObject ?
sawine@5
  7874
	/* Microsoft failed to properly
sawine@5
  7875
	 * implement the XMLHttpRequest in IE7 (can't request local files),
sawine@5
  7876
	 * so we use the ActiveXObject when it is available
sawine@5
  7877
	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
sawine@5
  7878
	 * we need a fallback.
sawine@5
  7879
	 */
sawine@5
  7880
	function() {
sawine@5
  7881
		return !this.isLocal && createStandardXHR() || createActiveXHR();
sawine@5
  7882
	} :
sawine@5
  7883
	// For all other browsers, use the standard XMLHttpRequest object
sawine@5
  7884
	createStandardXHR;
sawine@5
  7885
sawine@5
  7886
// Determine support properties
sawine@5
  7887
(function( xhr ) {
sawine@5
  7888
	jQuery.extend( jQuery.support, {
sawine@5
  7889
		ajax: !!xhr,
sawine@5
  7890
		cors: !!xhr && ( "withCredentials" in xhr )
sawine@5
  7891
	});
sawine@5
  7892
})( jQuery.ajaxSettings.xhr() );
sawine@5
  7893
sawine@5
  7894
// Create transport if the browser can provide an xhr
sawine@5
  7895
if ( jQuery.support.ajax ) {
sawine@5
  7896
sawine@5
  7897
	jQuery.ajaxTransport(function( s ) {
sawine@5
  7898
		// Cross domain only allowed if supported through XMLHttpRequest
sawine@5
  7899
		if ( !s.crossDomain || jQuery.support.cors ) {
sawine@5
  7900
sawine@5
  7901
			var callback;
sawine@5
  7902
sawine@5
  7903
			return {
sawine@5
  7904
				send: function( headers, complete ) {
sawine@5
  7905
sawine@5
  7906
					// Get a new xhr
sawine@5
  7907
					var xhr = s.xhr(),
sawine@5
  7908
						handle,
sawine@5
  7909
						i;
sawine@5
  7910
sawine@5
  7911
					// Open the socket
sawine@5
  7912
					// Passing null username, generates a login popup on Opera (#2865)
sawine@5
  7913
					if ( s.username ) {
sawine@5
  7914
						xhr.open( s.type, s.url, s.async, s.username, s.password );
sawine@5
  7915
					} else {
sawine@5
  7916
						xhr.open( s.type, s.url, s.async );
sawine@5
  7917
					}
sawine@5
  7918
sawine@5
  7919
					// Apply custom fields if provided
sawine@5
  7920
					if ( s.xhrFields ) {
sawine@5
  7921
						for ( i in s.xhrFields ) {
sawine@5
  7922
							xhr[ i ] = s.xhrFields[ i ];
sawine@5
  7923
						}
sawine@5
  7924
					}
sawine@5
  7925
sawine@5
  7926
					// Override mime type if needed
sawine@5
  7927
					if ( s.mimeType && xhr.overrideMimeType ) {
sawine@5
  7928
						xhr.overrideMimeType( s.mimeType );
sawine@5
  7929
					}
sawine@5
  7930
sawine@5
  7931
					// X-Requested-With header
sawine@5
  7932
					// For cross-domain requests, seeing as conditions for a preflight are
sawine@5
  7933
					// akin to a jigsaw puzzle, we simply never set it to be sure.
sawine@5
  7934
					// (it can always be set on a per-request basis or even using ajaxSetup)
sawine@5
  7935
					// For same-domain requests, won't change header if already provided.
sawine@5
  7936
					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
sawine@5
  7937
						headers[ "X-Requested-With" ] = "XMLHttpRequest";
sawine@5
  7938
					}
sawine@5
  7939
sawine@5
  7940
					// Need an extra try/catch for cross domain requests in Firefox 3
sawine@5
  7941
					try {
sawine@5
  7942
						for ( i in headers ) {
sawine@5
  7943
							xhr.setRequestHeader( i, headers[ i ] );
sawine@5
  7944
						}
sawine@5
  7945
					} catch( _ ) {}
sawine@5
  7946
sawine@5
  7947
					// Do send the request
sawine@5
  7948
					// This may raise an exception which is actually
sawine@5
  7949
					// handled in jQuery.ajax (so no try/catch here)
sawine@5
  7950
					xhr.send( ( s.hasContent && s.data ) || null );
sawine@5
  7951
sawine@5
  7952
					// Listener
sawine@5
  7953
					callback = function( _, isAbort ) {
sawine@5
  7954
sawine@5
  7955
						var status,
sawine@5
  7956
							statusText,
sawine@5
  7957
							responseHeaders,
sawine@5
  7958
							responses,
sawine@5
  7959
							xml;
sawine@5
  7960
sawine@5
  7961
						// Firefox throws exceptions when accessing properties
sawine@5
  7962
						// of an xhr when a network error occured
sawine@5
  7963
						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
sawine@5
  7964
						try {
sawine@5
  7965
sawine@5
  7966
							// Was never called and is aborted or complete
sawine@5
  7967
							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
sawine@5
  7968
sawine@5
  7969
								// Only called once
sawine@5
  7970
								callback = undefined;
sawine@5
  7971
sawine@5
  7972
								// Do not keep as active anymore
sawine@5
  7973
								if ( handle ) {
sawine@5
  7974
									xhr.onreadystatechange = jQuery.noop;
sawine@5
  7975
									if ( xhrOnUnloadAbort ) {
sawine@5
  7976
										delete xhrCallbacks[ handle ];
sawine@5
  7977
									}
sawine@5
  7978
								}
sawine@5
  7979
sawine@5
  7980
								// If it's an abort
sawine@5
  7981
								if ( isAbort ) {
sawine@5
  7982
									// Abort it manually if needed
sawine@5
  7983
									if ( xhr.readyState !== 4 ) {
sawine@5
  7984
										xhr.abort();
sawine@5
  7985
									}
sawine@5
  7986
								} else {
sawine@5
  7987
									status = xhr.status;
sawine@5
  7988
									responseHeaders = xhr.getAllResponseHeaders();
sawine@5
  7989
									responses = {};
sawine@5
  7990
									xml = xhr.responseXML;
sawine@5
  7991
sawine@5
  7992
									// Construct response list
sawine@5
  7993
									if ( xml && xml.documentElement /* #4958 */ ) {
sawine@5
  7994
										responses.xml = xml;
sawine@5
  7995
									}
sawine@5
  7996
									responses.text = xhr.responseText;
sawine@5
  7997
sawine@5
  7998
									// Firefox throws an exception when accessing
sawine@5
  7999
									// statusText for faulty cross-domain requests
sawine@5
  8000
									try {
sawine@5
  8001
										statusText = xhr.statusText;
sawine@5
  8002
									} catch( e ) {
sawine@5
  8003
										// We normalize with Webkit giving an empty statusText
sawine@5
  8004
										statusText = "";
sawine@5
  8005
									}
sawine@5
  8006
sawine@5
  8007
									// Filter status for non standard behaviors
sawine@5
  8008
sawine@5
  8009
									// If the request is local and we have data: assume a success
sawine@5
  8010
									// (success with no data won't get notified, that's the best we
sawine@5
  8011
									// can do given current implementations)
sawine@5
  8012
									if ( !status && s.isLocal && !s.crossDomain ) {
sawine@5
  8013
										status = responses.text ? 200 : 404;
sawine@5
  8014
									// IE - #1450: sometimes returns 1223 when it should be 204
sawine@5
  8015
									} else if ( status === 1223 ) {
sawine@5
  8016
										status = 204;
sawine@5
  8017
									}
sawine@5
  8018
								}
sawine@5
  8019
							}
sawine@5
  8020
						} catch( firefoxAccessException ) {
sawine@5
  8021
							if ( !isAbort ) {
sawine@5
  8022
								complete( -1, firefoxAccessException );
sawine@5
  8023
							}
sawine@5
  8024
						}
sawine@5
  8025
sawine@5
  8026
						// Call complete if needed
sawine@5
  8027
						if ( responses ) {
sawine@5
  8028
							complete( status, statusText, responses, responseHeaders );
sawine@5
  8029
						}
sawine@5
  8030
					};
sawine@5
  8031
sawine@5
  8032
					// if we're in sync mode or it's in cache
sawine@5
  8033
					// and has been retrieved directly (IE6 & IE7)
sawine@5
  8034
					// we need to manually fire the callback
sawine@5
  8035
					if ( !s.async || xhr.readyState === 4 ) {
sawine@5
  8036
						callback();
sawine@5
  8037
					} else {
sawine@5
  8038
						handle = ++xhrId;
sawine@5
  8039
						if ( xhrOnUnloadAbort ) {
sawine@5
  8040
							// Create the active xhrs callbacks list if needed
sawine@5
  8041
							// and attach the unload handler
sawine@5
  8042
							if ( !xhrCallbacks ) {
sawine@5
  8043
								xhrCallbacks = {};
sawine@5
  8044
								jQuery( window ).unload( xhrOnUnloadAbort );
sawine@5
  8045
							}
sawine@5
  8046
							// Add to list of active xhrs callbacks
sawine@5
  8047
							xhrCallbacks[ handle ] = callback;
sawine@5
  8048
						}
sawine@5
  8049
						xhr.onreadystatechange = callback;
sawine@5
  8050
					}
sawine@5
  8051
				},
sawine@5
  8052
sawine@5
  8053
				abort: function() {
sawine@5
  8054
					if ( callback ) {
sawine@5
  8055
						callback(0,1);
sawine@5
  8056
					}
sawine@5
  8057
				}
sawine@5
  8058
			};
sawine@5
  8059
		}
sawine@5
  8060
	});
sawine@5
  8061
}
sawine@5
  8062
sawine@5
  8063
sawine@5
  8064
sawine@5
  8065
sawine@5
  8066
var elemdisplay = {},
sawine@5
  8067
	iframe, iframeDoc,
sawine@5
  8068
	rfxtypes = /^(?:toggle|show|hide)$/,
sawine@5
  8069
	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
sawine@5
  8070
	timerId,
sawine@5
  8071
	fxAttrs = [
sawine@5
  8072
		// height animations
sawine@5
  8073
		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
sawine@5
  8074
		// width animations
sawine@5
  8075
		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
sawine@5
  8076
		// opacity animations
sawine@5
  8077
		[ "opacity" ]
sawine@5
  8078
	],
sawine@5
  8079
	fxNow;
sawine@5
  8080
sawine@5
  8081
jQuery.fn.extend({
sawine@5
  8082
	show: function( speed, easing, callback ) {
sawine@5
  8083
		var elem, display;
sawine@5
  8084
sawine@5
  8085
		if ( speed || speed === 0 ) {
sawine@5
  8086
			return this.animate( genFx("show", 3), speed, easing, callback);
sawine@5
  8087
sawine@5
  8088
		} else {
sawine@5
  8089
			for ( var i = 0, j = this.length; i < j; i++ ) {
sawine@5
  8090
				elem = this[i];
sawine@5
  8091
sawine@5
  8092
				if ( elem.style ) {
sawine@5
  8093
					display = elem.style.display;
sawine@5
  8094
sawine@5
  8095
					// Reset the inline display of this element to learn if it is
sawine@5
  8096
					// being hidden by cascaded rules or not
sawine@5
  8097
					if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
sawine@5
  8098
						display = elem.style.display = "";
sawine@5
  8099
					}
sawine@5
  8100
sawine@5
  8101
					// Set elements which have been overridden with display: none
sawine@5
  8102
					// in a stylesheet to whatever the default browser style is
sawine@5
  8103
					// for such an element
sawine@5
  8104
					if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
sawine@5
  8105
						jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
sawine@5
  8106
					}
sawine@5
  8107
				}
sawine@5
  8108
			}
sawine@5
  8109
sawine@5
  8110
			// Set the display of most of the elements in a second loop
sawine@5
  8111
			// to avoid the constant reflow
sawine@5
  8112
			for ( i = 0; i < j; i++ ) {
sawine@5
  8113
				elem = this[i];
sawine@5
  8114
sawine@5
  8115
				if ( elem.style ) {
sawine@5
  8116
					display = elem.style.display;
sawine@5
  8117
sawine@5
  8118
					if ( display === "" || display === "none" ) {
sawine@5
  8119
						elem.style.display = jQuery._data(elem, "olddisplay") || "";
sawine@5
  8120
					}
sawine@5
  8121
				}
sawine@5
  8122
			}
sawine@5
  8123
sawine@5
  8124
			return this;
sawine@5
  8125
		}
sawine@5
  8126
	},
sawine@5
  8127
sawine@5
  8128
	hide: function( speed, easing, callback ) {
sawine@5
  8129
		if ( speed || speed === 0 ) {
sawine@5
  8130
			return this.animate( genFx("hide", 3), speed, easing, callback);
sawine@5
  8131
sawine@5
  8132
		} else {
sawine@5
  8133
			for ( var i = 0, j = this.length; i < j; i++ ) {
sawine@5
  8134
				if ( this[i].style ) {
sawine@5
  8135
					var display = jQuery.css( this[i], "display" );
sawine@5
  8136
sawine@5
  8137
					if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
sawine@5
  8138
						jQuery._data( this[i], "olddisplay", display );
sawine@5
  8139
					}
sawine@5
  8140
				}
sawine@5
  8141
			}
sawine@5
  8142
sawine@5
  8143
			// Set the display of the elements in a second loop
sawine@5
  8144
			// to avoid the constant reflow
sawine@5
  8145
			for ( i = 0; i < j; i++ ) {
sawine@5
  8146
				if ( this[i].style ) {
sawine@5
  8147
					this[i].style.display = "none";
sawine@5
  8148
				}
sawine@5
  8149
			}
sawine@5
  8150
sawine@5
  8151
			return this;
sawine@5
  8152
		}
sawine@5
  8153
	},
sawine@5
  8154
sawine@5
  8155
	// Save the old toggle function
sawine@5
  8156
	_toggle: jQuery.fn.toggle,
sawine@5
  8157
sawine@5
  8158
	toggle: function( fn, fn2, callback ) {
sawine@5
  8159
		var bool = typeof fn === "boolean";
sawine@5
  8160
sawine@5
  8161
		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
sawine@5
  8162
			this._toggle.apply( this, arguments );
sawine@5
  8163
sawine@5
  8164
		} else if ( fn == null || bool ) {
sawine@5
  8165
			this.each(function() {
sawine@5
  8166
				var state = bool ? fn : jQuery(this).is(":hidden");
sawine@5
  8167
				jQuery(this)[ state ? "show" : "hide" ]();
sawine@5
  8168
			});
sawine@5
  8169
sawine@5
  8170
		} else {
sawine@5
  8171
			this.animate(genFx("toggle", 3), fn, fn2, callback);
sawine@5
  8172
		}
sawine@5
  8173
sawine@5
  8174
		return this;
sawine@5
  8175
	},
sawine@5
  8176
sawine@5
  8177
	fadeTo: function( speed, to, easing, callback ) {
sawine@5
  8178
		return this.filter(":hidden").css("opacity", 0).show().end()
sawine@5
  8179
					.animate({opacity: to}, speed, easing, callback);
sawine@5
  8180
	},
sawine@5
  8181
sawine@5
  8182
	animate: function( prop, speed, easing, callback ) {
sawine@5
  8183
		var optall = jQuery.speed(speed, easing, callback);
sawine@5
  8184
sawine@5
  8185
		if ( jQuery.isEmptyObject( prop ) ) {
sawine@5
  8186
			return this.each( optall.complete, [ false ] );
sawine@5
  8187
		}
sawine@5
  8188
sawine@5
  8189
		// Do not change referenced properties as per-property easing will be lost
sawine@5
  8190
		prop = jQuery.extend( {}, prop );
sawine@5
  8191
sawine@5
  8192
		return this[ optall.queue === false ? "each" : "queue" ](function() {
sawine@5
  8193
			// XXX 'this' does not always have a nodeName when running the
sawine@5
  8194
			// test suite
sawine@5
  8195
sawine@5
  8196
			if ( optall.queue === false ) {
sawine@5
  8197
				jQuery._mark( this );
sawine@5
  8198
			}
sawine@5
  8199
sawine@5
  8200
			var opt = jQuery.extend( {}, optall ),
sawine@5
  8201
				isElement = this.nodeType === 1,
sawine@5
  8202
				hidden = isElement && jQuery(this).is(":hidden"),
sawine@5
  8203
				name, val, p,
sawine@5
  8204
				display, e,
sawine@5
  8205
				parts, start, end, unit;
sawine@5
  8206
sawine@5
  8207
			// will store per property easing and be used to determine when an animation is complete
sawine@5
  8208
			opt.animatedProperties = {};
sawine@5
  8209
sawine@5
  8210
			for ( p in prop ) {
sawine@5
  8211
sawine@5
  8212
				// property name normalization
sawine@5
  8213
				name = jQuery.camelCase( p );
sawine@5
  8214
				if ( p !== name ) {
sawine@5
  8215
					prop[ name ] = prop[ p ];
sawine@5
  8216
					delete prop[ p ];
sawine@5
  8217
				}
sawine@5
  8218
sawine@5
  8219
				val = prop[ name ];
sawine@5
  8220
sawine@5
  8221
				// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
sawine@5
  8222
				if ( jQuery.isArray( val ) ) {
sawine@5
  8223
					opt.animatedProperties[ name ] = val[ 1 ];
sawine@5
  8224
					val = prop[ name ] = val[ 0 ];
sawine@5
  8225
				} else {
sawine@5
  8226
					opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
sawine@5
  8227
				}
sawine@5
  8228
sawine@5
  8229
				if ( val === "hide" && hidden || val === "show" && !hidden ) {
sawine@5
  8230
					return opt.complete.call( this );
sawine@5
  8231
				}
sawine@5
  8232
sawine@5
  8233
				if ( isElement && ( name === "height" || name === "width" ) ) {
sawine@5
  8234
					// Make sure that nothing sneaks out
sawine@5
  8235
					// Record all 3 overflow attributes because IE does not
sawine@5
  8236
					// change the overflow attribute when overflowX and
sawine@5
  8237
					// overflowY are set to the same value
sawine@5
  8238
					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
sawine@5
  8239
sawine@5
  8240
					// Set display property to inline-block for height/width
sawine@5
  8241
					// animations on inline elements that are having width/height
sawine@5
  8242
					// animated
sawine@5
  8243
					if ( jQuery.css( this, "display" ) === "inline" &&
sawine@5
  8244
							jQuery.css( this, "float" ) === "none" ) {
sawine@5
  8245
						if ( !jQuery.support.inlineBlockNeedsLayout ) {
sawine@5
  8246
							this.style.display = "inline-block";
sawine@5
  8247
sawine@5
  8248
						} else {
sawine@5
  8249
							display = defaultDisplay( this.nodeName );
sawine@5
  8250
sawine@5
  8251
							// inline-level elements accept inline-block;
sawine@5
  8252
							// block-level elements need to be inline with layout
sawine@5
  8253
							if ( display === "inline" ) {
sawine@5
  8254
								this.style.display = "inline-block";
sawine@5
  8255
sawine@5
  8256
							} else {
sawine@5
  8257
								this.style.display = "inline";
sawine@5
  8258
								this.style.zoom = 1;
sawine@5
  8259
							}
sawine@5
  8260
						}
sawine@5
  8261
					}
sawine@5
  8262
				}
sawine@5
  8263
			}
sawine@5
  8264
sawine@5
  8265
			if ( opt.overflow != null ) {
sawine@5
  8266
				this.style.overflow = "hidden";
sawine@5
  8267
			}
sawine@5
  8268
sawine@5
  8269
			for ( p in prop ) {
sawine@5
  8270
				e = new jQuery.fx( this, opt, p );
sawine@5
  8271
				val = prop[ p ];
sawine@5
  8272
sawine@5
  8273
				if ( rfxtypes.test(val) ) {
sawine@5
  8274
					e[ val === "toggle" ? hidden ? "show" : "hide" : val ]();
sawine@5
  8275
sawine@5
  8276
				} else {
sawine@5
  8277
					parts = rfxnum.exec( val );
sawine@5
  8278
					start = e.cur();
sawine@5
  8279
sawine@5
  8280
					if ( parts ) {
sawine@5
  8281
						end = parseFloat( parts[2] );
sawine@5
  8282
						unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
sawine@5
  8283
sawine@5
  8284
						// We need to compute starting value
sawine@5
  8285
						if ( unit !== "px" ) {
sawine@5
  8286
							jQuery.style( this, p, (end || 1) + unit);
sawine@5
  8287
							start = ((end || 1) / e.cur()) * start;
sawine@5
  8288
							jQuery.style( this, p, start + unit);
sawine@5
  8289
						}
sawine@5
  8290
sawine@5
  8291
						// If a +=/-= token was provided, we're doing a relative animation
sawine@5
  8292
						if ( parts[1] ) {
sawine@5
  8293
							end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
sawine@5
  8294
						}
sawine@5
  8295
sawine@5
  8296
						e.custom( start, end, unit );
sawine@5
  8297
sawine@5
  8298
					} else {
sawine@5
  8299
						e.custom( start, val, "" );
sawine@5
  8300
					}
sawine@5
  8301
				}
sawine@5
  8302
			}
sawine@5
  8303
sawine@5
  8304
			// For JS strict compliance
sawine@5
  8305
			return true;
sawine@5
  8306
		});
sawine@5
  8307
	},
sawine@5
  8308
sawine@5
  8309
	stop: function( clearQueue, gotoEnd ) {
sawine@5
  8310
		if ( clearQueue ) {
sawine@5
  8311
			this.queue([]);
sawine@5
  8312
		}
sawine@5
  8313
sawine@5
  8314
		this.each(function() {
sawine@5
  8315
			var timers = jQuery.timers,
sawine@5
  8316
				i = timers.length;
sawine@5
  8317
			// clear marker counters if we know they won't be
sawine@5
  8318
			if ( !gotoEnd ) {
sawine@5
  8319
				jQuery._unmark( true, this );
sawine@5
  8320
			}
sawine@5
  8321
			while ( i-- ) {
sawine@5
  8322
				if ( timers[i].elem === this ) {
sawine@5
  8323
					if (gotoEnd) {
sawine@5
  8324
						// force the next step to be the last
sawine@5
  8325
						timers[i](true);
sawine@5
  8326
					}
sawine@5
  8327
sawine@5
  8328
					timers.splice(i, 1);
sawine@5
  8329
				}
sawine@5
  8330
			}
sawine@5
  8331
		});
sawine@5
  8332
sawine@5
  8333
		// start the next in the queue if the last step wasn't forced
sawine@5
  8334
		if ( !gotoEnd ) {
sawine@5
  8335
			this.dequeue();
sawine@5
  8336
		}
sawine@5
  8337
sawine@5
  8338
		return this;
sawine@5
  8339
	}
sawine@5
  8340
sawine@5
  8341
});
sawine@5
  8342
sawine@5
  8343
// Animations created synchronously will run synchronously
sawine@5
  8344
function createFxNow() {
sawine@5
  8345
	setTimeout( clearFxNow, 0 );
sawine@5
  8346
	return ( fxNow = jQuery.now() );
sawine@5
  8347
}
sawine@5
  8348
sawine@5
  8349
function clearFxNow() {
sawine@5
  8350
	fxNow = undefined;
sawine@5
  8351
}
sawine@5
  8352
sawine@5
  8353
// Generate parameters to create a standard animation
sawine@5
  8354
function genFx( type, num ) {
sawine@5
  8355
	var obj = {};
sawine@5
  8356
sawine@5
  8357
	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
sawine@5
  8358
		obj[ this ] = type;
sawine@5
  8359
	});
sawine@5
  8360
sawine@5
  8361
	return obj;
sawine@5
  8362
}
sawine@5
  8363
sawine@5
  8364
// Generate shortcuts for custom animations
sawine@5
  8365
jQuery.each({
sawine@5
  8366
	slideDown: genFx("show", 1),
sawine@5
  8367
	slideUp: genFx("hide", 1),
sawine@5
  8368
	slideToggle: genFx("toggle", 1),
sawine@5
  8369
	fadeIn: { opacity: "show" },
sawine@5
  8370
	fadeOut: { opacity: "hide" },
sawine@5
  8371
	fadeToggle: { opacity: "toggle" }
sawine@5
  8372
}, function( name, props ) {
sawine@5
  8373
	jQuery.fn[ name ] = function( speed, easing, callback ) {
sawine@5
  8374
		return this.animate( props, speed, easing, callback );
sawine@5
  8375
	};
sawine@5
  8376
});
sawine@5
  8377
sawine@5
  8378
jQuery.extend({
sawine@5
  8379
	speed: function( speed, easing, fn ) {
sawine@5
  8380
		var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
sawine@5
  8381
			complete: fn || !fn && easing ||
sawine@5
  8382
				jQuery.isFunction( speed ) && speed,
sawine@5
  8383
			duration: speed,
sawine@5
  8384
			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
sawine@5
  8385
		};
sawine@5
  8386
sawine@5
  8387
		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
sawine@5
  8388
			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
sawine@5
  8389
sawine@5
  8390
		// Queueing
sawine@5
  8391
		opt.old = opt.complete;
sawine@5
  8392
		opt.complete = function( noUnmark ) {
sawine@5
  8393
			if ( jQuery.isFunction( opt.old ) ) {
sawine@5
  8394
				opt.old.call( this );
sawine@5
  8395
			}
sawine@5
  8396
sawine@5
  8397
			if ( opt.queue !== false ) {
sawine@5
  8398
				jQuery.dequeue( this );
sawine@5
  8399
			} else if ( noUnmark !== false ) {
sawine@5
  8400
				jQuery._unmark( this );
sawine@5
  8401
			}
sawine@5
  8402
		};
sawine@5
  8403
sawine@5
  8404
		return opt;
sawine@5
  8405
	},
sawine@5
  8406
sawine@5
  8407
	easing: {
sawine@5
  8408
		linear: function( p, n, firstNum, diff ) {
sawine@5
  8409
			return firstNum + diff * p;
sawine@5
  8410
		},
sawine@5
  8411
		swing: function( p, n, firstNum, diff ) {
sawine@5
  8412
			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
sawine@5
  8413
		}
sawine@5
  8414
	},
sawine@5
  8415
sawine@5
  8416
	timers: [],
sawine@5
  8417
sawine@5
  8418
	fx: function( elem, options, prop ) {
sawine@5
  8419
		this.options = options;
sawine@5
  8420
		this.elem = elem;
sawine@5
  8421
		this.prop = prop;
sawine@5
  8422
sawine@5
  8423
		options.orig = options.orig || {};
sawine@5
  8424
	}
sawine@5
  8425
sawine@5
  8426
});
sawine@5
  8427
sawine@5
  8428
jQuery.fx.prototype = {
sawine@5
  8429
	// Simple function for setting a style value
sawine@5
  8430
	update: function() {
sawine@5
  8431
		if ( this.options.step ) {
sawine@5
  8432
			this.options.step.call( this.elem, this.now, this );
sawine@5
  8433
		}
sawine@5
  8434
sawine@5
  8435
		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
sawine@5
  8436
	},
sawine@5
  8437
sawine@5
  8438
	// Get the current size
sawine@5
  8439
	cur: function() {
sawine@5
  8440
		if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
sawine@5
  8441
			return this.elem[ this.prop ];
sawine@5
  8442
		}
sawine@5
  8443
sawine@5
  8444
		var parsed,
sawine@5
  8445
			r = jQuery.css( this.elem, this.prop );
sawine@5
  8446
		// Empty strings, null, undefined and "auto" are converted to 0,
sawine@5
  8447
		// complex values such as "rotate(1rad)" are returned as is,
sawine@5
  8448
		// simple values such as "10px" are parsed to Float.
sawine@5
  8449
		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
sawine@5
  8450
	},
sawine@5
  8451
sawine@5
  8452
	// Start an animation from one number to another
sawine@5
  8453
	custom: function( from, to, unit ) {
sawine@5
  8454
		var self = this,
sawine@5
  8455
			fx = jQuery.fx;
sawine@5
  8456
sawine@5
  8457
		this.startTime = fxNow || createFxNow();
sawine@5
  8458
		this.start = from;
sawine@5
  8459
		this.end = to;
sawine@5
  8460
		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
sawine@5
  8461
		this.now = this.start;
sawine@5
  8462
		this.pos = this.state = 0;
sawine@5
  8463
sawine@5
  8464
		function t( gotoEnd ) {
sawine@5
  8465
			return self.step(gotoEnd);
sawine@5
  8466
		}
sawine@5
  8467
sawine@5
  8468
		t.elem = this.elem;
sawine@5
  8469
sawine@5
  8470
		if ( t() && jQuery.timers.push(t) && !timerId ) {
sawine@5
  8471
			timerId = setInterval( fx.tick, fx.interval );
sawine@5
  8472
		}
sawine@5
  8473
	},
sawine@5
  8474
sawine@5
  8475
	// Simple 'show' function
sawine@5
  8476
	show: function() {
sawine@5
  8477
		// Remember where we started, so that we can go back to it later
sawine@5
  8478
		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
sawine@5
  8479
		this.options.show = true;
sawine@5
  8480
sawine@5
  8481
		// Begin the animation
sawine@5
  8482
		// Make sure that we start at a small width/height to avoid any
sawine@5
  8483
		// flash of content
sawine@5
  8484
		this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
sawine@5
  8485
sawine@5
  8486
		// Start by showing the element
sawine@5
  8487
		jQuery( this.elem ).show();
sawine@5
  8488
	},
sawine@5
  8489
sawine@5
  8490
	// Simple 'hide' function
sawine@5
  8491
	hide: function() {
sawine@5
  8492
		// Remember where we started, so that we can go back to it later
sawine@5
  8493
		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
sawine@5
  8494
		this.options.hide = true;
sawine@5
  8495
sawine@5
  8496
		// Begin the animation
sawine@5
  8497
		this.custom(this.cur(), 0);
sawine@5
  8498
	},
sawine@5
  8499
sawine@5
  8500
	// Each step of an animation
sawine@5
  8501
	step: function( gotoEnd ) {
sawine@5
  8502
		var t = fxNow || createFxNow(),
sawine@5
  8503
			done = true,
sawine@5
  8504
			elem = this.elem,
sawine@5
  8505
			options = this.options,
sawine@5
  8506
			i, n;
sawine@5
  8507
sawine@5
  8508
		if ( gotoEnd || t >= options.duration + this.startTime ) {
sawine@5
  8509
			this.now = this.end;
sawine@5
  8510
			this.pos = this.state = 1;
sawine@5
  8511
			this.update();
sawine@5
  8512
sawine@5
  8513
			options.animatedProperties[ this.prop ] = true;
sawine@5
  8514
sawine@5
  8515
			for ( i in options.animatedProperties ) {
sawine@5
  8516
				if ( options.animatedProperties[i] !== true ) {
sawine@5
  8517
					done = false;
sawine@5
  8518
				}
sawine@5
  8519
			}
sawine@5
  8520
sawine@5
  8521
			if ( done ) {
sawine@5
  8522
				// Reset the overflow
sawine@5
  8523
				if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
sawine@5
  8524
sawine@5
  8525
					jQuery.each( [ "", "X", "Y" ], function (index, value) {
sawine@5
  8526
						elem.style[ "overflow" + value ] = options.overflow[index];
sawine@5
  8527
					});
sawine@5
  8528
				}
sawine@5
  8529
sawine@5
  8530
				// Hide the element if the "hide" operation was done
sawine@5
  8531
				if ( options.hide ) {
sawine@5
  8532
					jQuery(elem).hide();
sawine@5
  8533
				}
sawine@5
  8534
sawine@5
  8535
				// Reset the properties, if the item has been hidden or shown
sawine@5
  8536
				if ( options.hide || options.show ) {
sawine@5
  8537
					for ( var p in options.animatedProperties ) {
sawine@5
  8538
						jQuery.style( elem, p, options.orig[p] );
sawine@5
  8539
					}
sawine@5
  8540
				}
sawine@5
  8541
sawine@5
  8542
				// Execute the complete function
sawine@5
  8543
				options.complete.call( elem );
sawine@5
  8544
			}
sawine@5
  8545
sawine@5
  8546
			return false;
sawine@5
  8547
sawine@5
  8548
		} else {
sawine@5
  8549
			// classical easing cannot be used with an Infinity duration
sawine@5
  8550
			if ( options.duration == Infinity ) {
sawine@5
  8551
				this.now = t;
sawine@5
  8552
			} else {
sawine@5
  8553
				n = t - this.startTime;
sawine@5
  8554
				this.state = n / options.duration;
sawine@5
  8555
sawine@5
  8556
				// Perform the easing function, defaults to swing
sawine@5
  8557
				this.pos = jQuery.easing[ options.animatedProperties[ this.prop ] ]( this.state, n, 0, 1, options.duration );
sawine@5
  8558
				this.now = this.start + ((this.end - this.start) * this.pos);
sawine@5
  8559
			}
sawine@5
  8560
			// Perform the next step of the animation
sawine@5
  8561
			this.update();
sawine@5
  8562
		}
sawine@5
  8563
sawine@5
  8564
		return true;
sawine@5
  8565
	}
sawine@5
  8566
};
sawine@5
  8567
sawine@5
  8568
jQuery.extend( jQuery.fx, {
sawine@5
  8569
	tick: function() {
sawine@5
  8570
		for ( var timers = jQuery.timers, i = 0 ; i < timers.length ; ++i ) {
sawine@5
  8571
			if ( !timers[i]() ) {
sawine@5
  8572
				timers.splice(i--, 1);
sawine@5
  8573
			}
sawine@5
  8574
		}
sawine@5
  8575
sawine@5
  8576
		if ( !timers.length ) {
sawine@5
  8577
			jQuery.fx.stop();
sawine@5
  8578
		}
sawine@5
  8579
	},
sawine@5
  8580
sawine@5
  8581
	interval: 13,
sawine@5
  8582
sawine@5
  8583
	stop: function() {
sawine@5
  8584
		clearInterval( timerId );
sawine@5
  8585
		timerId = null;
sawine@5
  8586
	},
sawine@5
  8587
sawine@5
  8588
	speeds: {
sawine@5
  8589
		slow: 600,
sawine@5
  8590
		fast: 200,
sawine@5
  8591
		// Default speed
sawine@5
  8592
		_default: 400
sawine@5
  8593
	},
sawine@5
  8594
sawine@5
  8595
	step: {
sawine@5
  8596
		opacity: function( fx ) {
sawine@5
  8597
			jQuery.style( fx.elem, "opacity", fx.now );
sawine@5
  8598
		},
sawine@5
  8599
sawine@5
  8600
		_default: function( fx ) {
sawine@5
  8601
			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
sawine@5
  8602
				fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
sawine@5
  8603
			} else {
sawine@5
  8604
				fx.elem[ fx.prop ] = fx.now;
sawine@5
  8605
			}
sawine@5
  8606
		}
sawine@5
  8607
	}
sawine@5
  8608
});
sawine@5
  8609
sawine@5
  8610
if ( jQuery.expr && jQuery.expr.filters ) {
sawine@5
  8611
	jQuery.expr.filters.animated = function( elem ) {
sawine@5
  8612
		return jQuery.grep(jQuery.timers, function( fn ) {
sawine@5
  8613
			return elem === fn.elem;
sawine@5
  8614
		}).length;
sawine@5
  8615
	};
sawine@5
  8616
}
sawine@5
  8617
sawine@5
  8618
// Try to restore the default display value of an element
sawine@5
  8619
function defaultDisplay( nodeName ) {
sawine@5
  8620
sawine@5
  8621
	if ( !elemdisplay[ nodeName ] ) {
sawine@5
  8622
sawine@5
  8623
		var body = document.body,
sawine@5
  8624
			elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
sawine@5
  8625
			display = elem.css( "display" );
sawine@5
  8626
sawine@5
  8627
		elem.remove();
sawine@5
  8628
sawine@5
  8629
		// If the simple way fails,
sawine@5
  8630
		// get element's real default display by attaching it to a temp iframe
sawine@5
  8631
		if ( display === "none" || display === "" ) {
sawine@5
  8632
			// No iframe to use yet, so create it
sawine@5
  8633
			if ( !iframe ) {
sawine@5
  8634
				iframe = document.createElement( "iframe" );
sawine@5
  8635
				iframe.frameBorder = iframe.width = iframe.height = 0;
sawine@5
  8636
			}
sawine@5
  8637
sawine@5
  8638
			body.appendChild( iframe );
sawine@5
  8639
sawine@5
  8640
			// Create a cacheable copy of the iframe document on first call.
sawine@5
  8641
			// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
sawine@5
  8642
			// document to it; WebKit & Firefox won't allow reusing the iframe document.
sawine@5
  8643
			if ( !iframeDoc || !iframe.createElement ) {
sawine@5
  8644
				iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
sawine@5
  8645
				iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
sawine@5
  8646
				iframeDoc.close();
sawine@5
  8647
			}
sawine@5
  8648
sawine@5
  8649
			elem = iframeDoc.createElement( nodeName );
sawine@5
  8650
sawine@5
  8651
			iframeDoc.body.appendChild( elem );
sawine@5
  8652
sawine@5
  8653
			display = jQuery.css( elem, "display" );
sawine@5
  8654
sawine@5
  8655
			body.removeChild( iframe );
sawine@5
  8656
		}
sawine@5
  8657
sawine@5
  8658
		// Store the correct default display
sawine@5
  8659
		elemdisplay[ nodeName ] = display;
sawine@5
  8660
	}
sawine@5
  8661
sawine@5
  8662
	return elemdisplay[ nodeName ];
sawine@5
  8663
}
sawine@5
  8664
sawine@5
  8665
sawine@5
  8666
sawine@5
  8667
sawine@5
  8668
var rtable = /^t(?:able|d|h)$/i,
sawine@5
  8669
	rroot = /^(?:body|html)$/i;
sawine@5
  8670
sawine@5
  8671
if ( "getBoundingClientRect" in document.documentElement ) {
sawine@5
  8672
	jQuery.fn.offset = function( options ) {
sawine@5
  8673
		var elem = this[0], box;
sawine@5
  8674
sawine@5
  8675
		if ( options ) {
sawine@5
  8676
			return this.each(function( i ) {
sawine@5
  8677
				jQuery.offset.setOffset( this, options, i );
sawine@5
  8678
			});
sawine@5
  8679
		}
sawine@5
  8680
sawine@5
  8681
		if ( !elem || !elem.ownerDocument ) {
sawine@5
  8682
			return null;
sawine@5
  8683
		}
sawine@5
  8684
sawine@5
  8685
		if ( elem === elem.ownerDocument.body ) {
sawine@5
  8686
			return jQuery.offset.bodyOffset( elem );
sawine@5
  8687
		}
sawine@5
  8688
sawine@5
  8689
		try {
sawine@5
  8690
			box = elem.getBoundingClientRect();
sawine@5
  8691
		} catch(e) {}
sawine@5
  8692
sawine@5
  8693
		var doc = elem.ownerDocument,
sawine@5
  8694
			docElem = doc.documentElement;
sawine@5
  8695
sawine@5
  8696
		// Make sure we're not dealing with a disconnected DOM node
sawine@5
  8697
		if ( !box || !jQuery.contains( docElem, elem ) ) {
sawine@5
  8698
			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
sawine@5
  8699
		}
sawine@5
  8700
sawine@5
  8701
		var body = doc.body,
sawine@5
  8702
			win = getWindow(doc),
sawine@5
  8703
			clientTop  = docElem.clientTop  || body.clientTop  || 0,
sawine@5
  8704
			clientLeft = docElem.clientLeft || body.clientLeft || 0,
sawine@5
  8705
			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
sawine@5
  8706
			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
sawine@5
  8707
			top  = box.top  + scrollTop  - clientTop,
sawine@5
  8708
			left = box.left + scrollLeft - clientLeft;
sawine@5
  8709
sawine@5
  8710
		return { top: top, left: left };
sawine@5
  8711
	};
sawine@5
  8712
sawine@5
  8713
} else {
sawine@5
  8714
	jQuery.fn.offset = function( options ) {
sawine@5
  8715
		var elem = this[0];
sawine@5
  8716
sawine@5
  8717
		if ( options ) {
sawine@5
  8718
			return this.each(function( i ) {
sawine@5
  8719
				jQuery.offset.setOffset( this, options, i );
sawine@5
  8720
			});
sawine@5
  8721
		}
sawine@5
  8722
sawine@5
  8723
		if ( !elem || !elem.ownerDocument ) {
sawine@5
  8724
			return null;
sawine@5
  8725
		}
sawine@5
  8726
sawine@5
  8727
		if ( elem === elem.ownerDocument.body ) {
sawine@5
  8728
			return jQuery.offset.bodyOffset( elem );
sawine@5
  8729
		}
sawine@5
  8730
sawine@5
  8731
		jQuery.offset.initialize();
sawine@5
  8732
sawine@5
  8733
		var computedStyle,
sawine@5
  8734
			offsetParent = elem.offsetParent,
sawine@5
  8735
			prevOffsetParent = elem,
sawine@5
  8736
			doc = elem.ownerDocument,
sawine@5
  8737
			docElem = doc.documentElement,
sawine@5
  8738
			body = doc.body,
sawine@5
  8739
			defaultView = doc.defaultView,
sawine@5
  8740
			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
sawine@5
  8741
			top = elem.offsetTop,
sawine@5
  8742
			left = elem.offsetLeft;
sawine@5
  8743
sawine@5
  8744
		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
sawine@5
  8745
			if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
sawine@5
  8746
				break;
sawine@5
  8747
			}
sawine@5
  8748
sawine@5
  8749
			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
sawine@5
  8750
			top  -= elem.scrollTop;
sawine@5
  8751
			left -= elem.scrollLeft;
sawine@5
  8752
sawine@5
  8753
			if ( elem === offsetParent ) {
sawine@5
  8754
				top  += elem.offsetTop;
sawine@5
  8755
				left += elem.offsetLeft;
sawine@5
  8756
sawine@5
  8757
				if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
sawine@5
  8758
					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
sawine@5
  8759
					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
sawine@5
  8760
				}
sawine@5
  8761
sawine@5
  8762
				prevOffsetParent = offsetParent;
sawine@5
  8763
				offsetParent = elem.offsetParent;
sawine@5
  8764
			}
sawine@5
  8765
sawine@5
  8766
			if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
sawine@5
  8767
				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
sawine@5
  8768
				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
sawine@5
  8769
			}
sawine@5
  8770
sawine@5
  8771
			prevComputedStyle = computedStyle;
sawine@5
  8772
		}
sawine@5
  8773
sawine@5
  8774
		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
sawine@5
  8775
			top  += body.offsetTop;
sawine@5
  8776
			left += body.offsetLeft;
sawine@5
  8777
		}
sawine@5
  8778
sawine@5
  8779
		if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
sawine@5
  8780
			top  += Math.max( docElem.scrollTop, body.scrollTop );
sawine@5
  8781
			left += Math.max( docElem.scrollLeft, body.scrollLeft );
sawine@5
  8782
		}
sawine@5
  8783
sawine@5
  8784
		return { top: top, left: left };
sawine@5
  8785
	};
sawine@5
  8786
}
sawine@5
  8787
sawine@5
  8788
jQuery.offset = {
sawine@5
  8789
	initialize: function() {
sawine@5
  8790
		var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
sawine@5
  8791
			html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
sawine@5
  8792
sawine@5
  8793
		jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
sawine@5
  8794
sawine@5
  8795
		container.innerHTML = html;
sawine@5
  8796
		body.insertBefore( container, body.firstChild );
sawine@5
  8797
		innerDiv = container.firstChild;
sawine@5
  8798
		checkDiv = innerDiv.firstChild;
sawine@5
  8799
		td = innerDiv.nextSibling.firstChild.firstChild;
sawine@5
  8800
sawine@5
  8801
		this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
sawine@5
  8802
		this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
sawine@5
  8803
sawine@5
  8804
		checkDiv.style.position = "fixed";
sawine@5
  8805
		checkDiv.style.top = "20px";
sawine@5
  8806
sawine@5
  8807
		// safari subtracts parent border width here which is 5px
sawine@5
  8808
		this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
sawine@5
  8809
		checkDiv.style.position = checkDiv.style.top = "";
sawine@5
  8810
sawine@5
  8811
		innerDiv.style.overflow = "hidden";
sawine@5
  8812
		innerDiv.style.position = "relative";
sawine@5
  8813
sawine@5
  8814
		this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
sawine@5
  8815
sawine@5
  8816
		this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
sawine@5
  8817
sawine@5
  8818
		body.removeChild( container );
sawine@5
  8819
		jQuery.offset.initialize = jQuery.noop;
sawine@5
  8820
	},
sawine@5
  8821
sawine@5
  8822
	bodyOffset: function( body ) {
sawine@5
  8823
		var top = body.offsetTop,
sawine@5
  8824
			left = body.offsetLeft;
sawine@5
  8825
sawine@5
  8826
		jQuery.offset.initialize();
sawine@5
  8827
sawine@5
  8828
		if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
sawine@5
  8829
			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
sawine@5
  8830
			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
sawine@5
  8831
		}
sawine@5
  8832
sawine@5
  8833
		return { top: top, left: left };
sawine@5
  8834
	},
sawine@5
  8835
sawine@5
  8836
	setOffset: function( elem, options, i ) {
sawine@5
  8837
		var position = jQuery.css( elem, "position" );
sawine@5
  8838
sawine@5
  8839
		// set position first, in-case top/left are set even on static elem
sawine@5
  8840
		if ( position === "static" ) {
sawine@5
  8841
			elem.style.position = "relative";
sawine@5
  8842
		}
sawine@5
  8843
sawine@5
  8844
		var curElem = jQuery( elem ),
sawine@5
  8845
			curOffset = curElem.offset(),
sawine@5
  8846
			curCSSTop = jQuery.css( elem, "top" ),
sawine@5
  8847
			curCSSLeft = jQuery.css( elem, "left" ),
sawine@5
  8848
			calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
sawine@5
  8849
			props = {}, curPosition = {}, curTop, curLeft;
sawine@5
  8850
sawine@5
  8851
		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
sawine@5
  8852
		if ( calculatePosition ) {
sawine@5
  8853
			curPosition = curElem.position();
sawine@5
  8854
			curTop = curPosition.top;
sawine@5
  8855
			curLeft = curPosition.left;
sawine@5
  8856
		} else {
sawine@5
  8857
			curTop = parseFloat( curCSSTop ) || 0;
sawine@5
  8858
			curLeft = parseFloat( curCSSLeft ) || 0;
sawine@5
  8859
		}
sawine@5
  8860
sawine@5
  8861
		if ( jQuery.isFunction( options ) ) {
sawine@5
  8862
			options = options.call( elem, i, curOffset );
sawine@5
  8863
		}
sawine@5
  8864
sawine@5
  8865
		if (options.top != null) {
sawine@5
  8866
			props.top = (options.top - curOffset.top) + curTop;
sawine@5
  8867
		}
sawine@5
  8868
		if (options.left != null) {
sawine@5
  8869
			props.left = (options.left - curOffset.left) + curLeft;
sawine@5
  8870
		}
sawine@5
  8871
sawine@5
  8872
		if ( "using" in options ) {
sawine@5
  8873
			options.using.call( elem, props );
sawine@5
  8874
		} else {
sawine@5
  8875
			curElem.css( props );
sawine@5
  8876
		}
sawine@5
  8877
	}
sawine@5
  8878
};
sawine@5
  8879
sawine@5
  8880
sawine@5
  8881
jQuery.fn.extend({
sawine@5
  8882
	position: function() {
sawine@5
  8883
		if ( !this[0] ) {
sawine@5
  8884
			return null;
sawine@5
  8885
		}
sawine@5
  8886
sawine@5
  8887
		var elem = this[0],
sawine@5
  8888
sawine@5
  8889
		// Get *real* offsetParent
sawine@5
  8890
		offsetParent = this.offsetParent(),
sawine@5
  8891
sawine@5
  8892
		// Get correct offsets
sawine@5
  8893
		offset       = this.offset(),
sawine@5
  8894
		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
sawine@5
  8895
sawine@5
  8896
		// Subtract element margins
sawine@5
  8897
		// note: when an element has margin: auto the offsetLeft and marginLeft
sawine@5
  8898
		// are the same in Safari causing offset.left to incorrectly be 0
sawine@5
  8899
		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
sawine@5
  8900
		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
sawine@5
  8901
sawine@5
  8902
		// Add offsetParent borders
sawine@5
  8903
		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
sawine@5
  8904
		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
sawine@5
  8905
sawine@5
  8906
		// Subtract the two offsets
sawine@5
  8907
		return {
sawine@5
  8908
			top:  offset.top  - parentOffset.top,
sawine@5
  8909
			left: offset.left - parentOffset.left
sawine@5
  8910
		};
sawine@5
  8911
	},
sawine@5
  8912
sawine@5
  8913
	offsetParent: function() {
sawine@5
  8914
		return this.map(function() {
sawine@5
  8915
			var offsetParent = this.offsetParent || document.body;
sawine@5
  8916
			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
sawine@5
  8917
				offsetParent = offsetParent.offsetParent;
sawine@5
  8918
			}
sawine@5
  8919
			return offsetParent;
sawine@5
  8920
		});
sawine@5
  8921
	}
sawine@5
  8922
});
sawine@5
  8923
sawine@5
  8924
sawine@5
  8925
// Create scrollLeft and scrollTop methods
sawine@5
  8926
jQuery.each( ["Left", "Top"], function( i, name ) {
sawine@5
  8927
	var method = "scroll" + name;
sawine@5
  8928
sawine@5
  8929
	jQuery.fn[ method ] = function( val ) {
sawine@5
  8930
		var elem, win;
sawine@5
  8931
sawine@5
  8932
		if ( val === undefined ) {
sawine@5
  8933
			elem = this[ 0 ];
sawine@5
  8934
sawine@5
  8935
			if ( !elem ) {
sawine@5
  8936
				return null;
sawine@5
  8937
			}
sawine@5
  8938
sawine@5
  8939
			win = getWindow( elem );
sawine@5
  8940
sawine@5
  8941
			// Return the scroll offset
sawine@5
  8942
			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
sawine@5
  8943
				jQuery.support.boxModel && win.document.documentElement[ method ] ||
sawine@5
  8944
					win.document.body[ method ] :
sawine@5
  8945
				elem[ method ];
sawine@5
  8946
		}
sawine@5
  8947
sawine@5
  8948
		// Set the scroll offset
sawine@5
  8949
		return this.each(function() {
sawine@5
  8950
			win = getWindow( this );
sawine@5
  8951
sawine@5
  8952
			if ( win ) {
sawine@5
  8953
				win.scrollTo(
sawine@5
  8954
					!i ? val : jQuery( win ).scrollLeft(),
sawine@5
  8955
					 i ? val : jQuery( win ).scrollTop()
sawine@5
  8956
				);
sawine@5
  8957
sawine@5
  8958
			} else {
sawine@5
  8959
				this[ method ] = val;
sawine@5
  8960
			}
sawine@5
  8961
		});
sawine@5
  8962
	};
sawine@5
  8963
});
sawine@5
  8964
sawine@5
  8965
function getWindow( elem ) {
sawine@5
  8966
	return jQuery.isWindow( elem ) ?
sawine@5
  8967
		elem :
sawine@5
  8968
		elem.nodeType === 9 ?
sawine@5
  8969
			elem.defaultView || elem.parentWindow :
sawine@5
  8970
			false;
sawine@5
  8971
}
sawine@5
  8972
sawine@5
  8973
sawine@5
  8974
sawine@5
  8975
sawine@5
  8976
// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
sawine@5
  8977
jQuery.each([ "Height", "Width" ], function( i, name ) {
sawine@5
  8978
sawine@5
  8979
	var type = name.toLowerCase();
sawine@5
  8980
sawine@5
  8981
	// innerHeight and innerWidth
sawine@5
  8982
	jQuery.fn[ "inner" + name ] = function() {
sawine@5
  8983
		var elem = this[0];
sawine@5
  8984
		return elem && elem.style ?
sawine@5
  8985
			parseFloat( jQuery.css( elem, type, "padding" ) ) :
sawine@5
  8986
			null;
sawine@5
  8987
	};
sawine@5
  8988
sawine@5
  8989
	// outerHeight and outerWidth
sawine@5
  8990
	jQuery.fn[ "outer" + name ] = function( margin ) {
sawine@5
  8991
		var elem = this[0];
sawine@5
  8992
		return elem && elem.style ?
sawine@5
  8993
			parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
sawine@5
  8994
			null;
sawine@5
  8995
	};
sawine@5
  8996
sawine@5
  8997
	jQuery.fn[ type ] = function( size ) {
sawine@5
  8998
		// Get window width or height
sawine@5
  8999
		var elem = this[0];
sawine@5
  9000
		if ( !elem ) {
sawine@5
  9001
			return size == null ? null : this;
sawine@5
  9002
		}
sawine@5
  9003
sawine@5
  9004
		if ( jQuery.isFunction( size ) ) {
sawine@5
  9005
			return this.each(function( i ) {
sawine@5
  9006
				var self = jQuery( this );
sawine@5
  9007
				self[ type ]( size.call( this, i, self[ type ]() ) );
sawine@5
  9008
			});
sawine@5
  9009
		}
sawine@5
  9010
sawine@5
  9011
		if ( jQuery.isWindow( elem ) ) {
sawine@5
  9012
			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
sawine@5
  9013
			// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
sawine@5
  9014
			var docElemProp = elem.document.documentElement[ "client" + name ],
sawine@5
  9015
				body = elem.document.body;
sawine@5
  9016
			return elem.document.compatMode === "CSS1Compat" && docElemProp ||
sawine@5
  9017
				body && body[ "client" + name ] || docElemProp;
sawine@5
  9018
sawine@5
  9019
		// Get document width or height
sawine@5
  9020
		} else if ( elem.nodeType === 9 ) {
sawine@5
  9021
			// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
sawine@5
  9022
			return Math.max(
sawine@5
  9023
				elem.documentElement["client" + name],
sawine@5
  9024
				elem.body["scroll" + name], elem.documentElement["scroll" + name],
sawine@5
  9025
				elem.body["offset" + name], elem.documentElement["offset" + name]
sawine@5
  9026
			);
sawine@5
  9027
sawine@5
  9028
		// Get or set width or height on the element
sawine@5
  9029
		} else if ( size === undefined ) {
sawine@5
  9030
			var orig = jQuery.css( elem, type ),
sawine@5
  9031
				ret = parseFloat( orig );
sawine@5
  9032
sawine@5
  9033
			return jQuery.isNaN( ret ) ? orig : ret;
sawine@5
  9034
sawine@5
  9035
		// Set the width or height on the element (default to pixels if value is unitless)
sawine@5
  9036
		} else {
sawine@5
  9037
			return this.css( type, typeof size === "string" ? size : size + "px" );
sawine@5
  9038
		}
sawine@5
  9039
	};
sawine@5
  9040
sawine@5
  9041
});
sawine@5
  9042
sawine@5
  9043
sawine@5
  9044
// Expose jQuery to the global object
sawine@5
  9045
window.jQuery = window.$ = jQuery;
sawine@5
  9046
})(window);