<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,5 +1,9 @@
 # Live Query ChangeLog
 
+## 1.1
+
+* Updated to better integrate with jQuery 1.3 (no longer supports jQuery &lt; 1.3)
+
 ## 1.0.3
 
 * LiveQueries are run as soon as they are created to avoid potential flash of content issues</diff>
      <filename>ChangeLog.markdown</filename>
    </modified>
    <modified>
      <diff>@@ -2,7 +2,7 @@
 
 Live Query utilizes the power of jQuery selectors by binding events or firing callbacks for matched elements auto-magically, even after the page has been loaded and the DOM updated.
 
-* Requires jQuery 1.1.3+
+* Requires jQuery 1.3+
 * Docs: [http://docs.jquery.com/Plugins/livequery](http://docs.jquery.com/Plugins/livequery)
 
 
@@ -10,4 +10,4 @@ Live Query utilizes the power of jQuery selectors by binding events or firing ca
 
 The Live Query plugin is dual licensed *(just like jQuery)* under the [MIT](http://www.opensource.org/licenses/mit-license.php) and [GPL](http://www.opensource.org/licenses/gpl-license.php) licenses.
 
-Copyright (c) 2008 [Brandon Aaron](http://brandonaaron.net)
\ No newline at end of file
+Copyright (c) 2009 [Brandon Aaron](http://brandonaaron.net)
\ No newline at end of file</diff>
      <filename>README.markdown</filename>
    </modified>
    <modified>
      <diff>@@ -1,22 +1,22 @@
-/*! Copyright (c) 2008 Brandon Aaron (http://brandonaaron.net)
- * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 
+/*! Copyright (c) 2009 Brandon Aaron (http://brandonaaron.net)
+ * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
  * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
  *
- * Version: 1.0.3
- * Requires jQuery 1.1.3+
+ * Version: 1.1.0-pre
+ * Requires jQuery 1.3+
  * Docs: http://docs.jquery.com/Plugins/livequery
  */
 
 (function($) {
-	
+
 $.extend($.fn, {
 	livequery: function(type, fn, fn2) {
 		var self = this, q;
-		
+
 		// Handle different call patterns
 		if ($.isFunction(type))
 			fn2 = fn, fn = type, type = undefined;
-			
+
 		// See if Live Query already exists
 		$.each( $.livequery.queries, function(i, query) {
 			if ( self.selector == query.selector &amp;&amp; self.context == query.context &amp;&amp;
@@ -24,34 +24,34 @@ $.extend($.fn, {
 					// Found the query, exit the each loop
 					return (q = query) &amp;&amp; false;
 		});
-		
+
 		// Create new Live Query if it wasn't found
 		q = q || new $.livequery(this.selector, this.context, type, fn, fn2);
-		
+
 		// Make sure it is running
 		q.stopped = false;
-		
+
 		// Run it immediately for the first time
 		q.run();
-		
+
 		// Contnue the chain
 		return this;
 	},
-	
+
 	expire: function(type, fn, fn2) {
 		var self = this;
-		
+
 		// Handle different call patterns
 		if ($.isFunction(type))
 			fn2 = fn, fn = type, type = undefined;
-			
+
 		// Find the Live Query based on arguments and stop it
 		$.each( $.livequery.queries, function(i, query) {
-			if ( self.selector == query.selector &amp;&amp; self.context == query.context &amp;&amp; 
+			if ( self.selector == query.selector &amp;&amp; self.context == query.context &amp;&amp;
 				(!type || type == query.type) &amp;&amp; (!fn || fn.$lqguid == query.fn.$lqguid) &amp;&amp; (!fn2 || fn2.$lqguid == query.fn2.$lqguid) &amp;&amp; !this.stopped )
 					$.livequery.stop(query.id);
 		});
-		
+
 		// Continue the chain
 		return this;
 	}
@@ -59,20 +59,20 @@ $.extend($.fn, {
 
 $.livequery = function(selector, context, type, fn, fn2) {
 	this.selector = selector;
-	this.context  = context || document;
+	this.context  = context;
 	this.type     = type;
 	this.fn       = fn;
 	this.fn2      = fn2;
 	this.elements = [];
 	this.stopped  = false;
-	
+
 	// The id is the index of the Live Query in $.livequery.queries
 	this.id = $.livequery.queries.push(this)-1;
-	
+
 	// Mark the functions for matching later on
 	fn.$lqguid = fn.$lqguid || $.livequery.guid++;
 	if (fn2) fn2.$lqguid = fn2.$lqguid || $.livequery.guid++;
-	
+
 	// Return the Live Query
 	return this;
 };
@@ -80,7 +80,7 @@ $.livequery = function(selector, context, type, fn, fn2) {
 $.livequery.prototype = {
 	stop: function() {
 		var query = this;
-		
+
 		if ( this.type )
 			// Unbind all bound events
 			this.elements.unbind(this.type, this.fn);
@@ -89,30 +89,30 @@ $.livequery.prototype = {
 			this.elements.each(function(i, el) {
 				query.fn2.apply(el);
 			});
-			
+
 		// Clear out matched elements
 		this.elements = [];
-		
+
 		// Stop the Live Query from running until restarted
 		this.stopped = true;
 	},
-	
+
 	run: function() {
 		// Short-circuit if stopped
 		if ( this.stopped ) return;
 		var query = this;
-		
+
 		var oEls = this.elements,
 			els  = $(this.selector, this.context),
 			nEls = els.not(oEls);
-		
+
 		// Set elements to the latest set of matched elements
 		this.elements = els;
-		
+
 		if (this.type) {
 			// Bind events to newly matched elements
 			nEls.bind(this.type, this.fn);
-			
+
 			// Unbind events to elements no longer matched
 			if (oEls.length &gt; 0)
 				$.each(oEls, function(i, el) {
@@ -125,7 +125,7 @@ $.livequery.prototype = {
 			nEls.each(function() {
 				query.fn.apply(this);
 			});
-			
+
 			// Call the second function for elements no longer matched
 			if ( this.fn2 &amp;&amp; oEls.length &gt; 0 )
 				$.each(oEls, function(i, el) {
@@ -142,7 +142,7 @@ $.extend($.livequery, {
 	queue: [],
 	running: false,
 	timeout: null,
-	
+
 	checkQueue: function() {
 		if ( $.livequery.running &amp;&amp; $.livequery.queue.length ) {
 			var length = $.livequery.queue.length;
@@ -151,41 +151,41 @@ $.extend($.livequery, {
 				$.livequery.queries[ $.livequery.queue.shift() ].run();
 		}
 	},
-	
+
 	pause: function() {
 		// Don't run anymore Live Queries until restarted
 		$.livequery.running = false;
 	},
-	
+
 	play: function() {
 		// Restart Live Queries
 		$.livequery.running = true;
 		// Request a run of the Live Queries
 		$.livequery.run();
 	},
-	
+
 	registerPlugin: function() {
 		$.each( arguments, function(i,n) {
 			// Short-circuit if the method doesn't exist
 			if (!$.fn[n]) return;
-			
+
 			// Save a reference to the original method
 			var old = $.fn[n];
-			
+
 			// Create a new method
 			$.fn[n] = function() {
 				// Call the original method
 				var r = old.apply(this, arguments);
-				
+
 				// Request a run of the Live Queries
 				$.livequery.run();
-				
+
 				// Return the original methods result
 				return r;
 			}
 		});
 	},
-	
+
 	run: function(id) {
 		if (id != undefined) {
 			// Put the particular Live Query in the queue if it doesn't already exist
@@ -198,13 +198,13 @@ $.extend($.livequery, {
 				if ( $.inArray(id, $.livequery.queue) &lt; 0 )
 					$.livequery.queue.push( id );
 			});
-		
+
 		// Clear timeout if it already exists
 		if ($.livequery.timeout) clearTimeout($.livequery.timeout);
 		// Create a timeout to check the queue and actually run the Live Queries
 		$.livequery.timeout = setTimeout($.livequery.checkQueue, 20);
 	},
-	
+
 	stop: function(id) {
 		if (id != undefined)
 			// Stop are particular Live Query
@@ -223,28 +223,4 @@ $.livequery.registerPlugin('append', 'prepend', 'after', 'before', 'wrap', 'attr
 // Run Live Queries when the Document is ready
 $(function() { $.livequery.play(); });
 
-
-// Save a reference to the original init method
-var init = $.prototype.init;
-
-// Create a new init method that exposes two new properties: selector and context
-$.prototype.init = function(a,c) {
-	// Call the original init and save the result
-	var r = init.apply(this, arguments);
-	
-	// Copy over properties if they exist already
-	if (a &amp;&amp; a.selector)
-		r.context = a.context, r.selector = a.selector;
-		
-	// Set properties
-	if ( typeof a == 'string' )
-		r.context = c || document, r.selector = a;
-	
-	// Return the result
-	return r;
-};
-
-// Give the init function the jQuery prototype for later instantiation (needed after Rev 4091)
-$.prototype.init.prototype = $.prototype;
-	
 })(jQuery);
\ No newline at end of file</diff>
      <filename>jquery.livequery.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,37 +1,36 @@
-(function(){
-/*
- * jQuery 1.2.2-pre - New Wave Javascript
+/*!
+ * jQuery JavaScript Library v1.3rc2
+ * http://jquery.com/
  *
- * Copyright (c) 2007 John Resig (jquery.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
  *
- * $Date: 2007-12-20 07:36:56 -0600 (Thu, 20 Dec 2007) $
- * $Rev: 4251 $
+ * Date: 2009-01-12 12:22:44 -0600 (Mon, 12 Jan 2009)
+ * Revision: 6099
  */
+(function(){
 
-// Map over jQuery in case of overwrite
-if ( window.jQuery )
-	var _jQuery = window.jQuery;
-
-var jQuery = window.jQuery = function( selector, context ) {
-	// The jQuery object is actually just the init constructor 'enhanced'
-	return new jQuery.prototype.init( selector, context );
-};
-
-// Map over the $ in case of overwrite
-if ( window.$ )
-	var _$ = window.$;
-	
-// Map the jQuery namespace to the '$' one
-window.$ = jQuery;
-
-// A simple way to check for HTML strings or ID strings
-// (both of which we optimize for)
-var quickExpr = /^[^&lt;]*(&lt;(.|\s)+&gt;)[^&gt;]*$|^#(\w+)$/;
+var 
+	// Will speed up references to window, and allows munging its name.
+	window = this,
+	// Will speed up references to undefined, and allows munging its name.
+	undefined,
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	jQuery = window.jQuery = window.$ = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context );
+	},
 
-// Is it a simple selector
-var isSimple = /^.[^:#\[\.]*$/;
+	// A simple way to check for HTML strings or ID strings
+	// (both of which we optimize for)
+	quickExpr = /^[^&lt;]*(&lt;(.|\s)+&gt;)[^&gt;]*$|^#([\w-]+)$/,
+	// Is it a simple selector
+	isSimple = /^.[^:#\[\.,]*$/;
 
 jQuery.fn = jQuery.prototype = {
 	init: function( selector, context ) {
@@ -42,10 +41,11 @@ jQuery.fn = jQuery.prototype = {
 		if ( selector.nodeType ) {
 			this[0] = selector;
 			this.length = 1;
+			this.context = selector;
 			return this;
-
+		}
 		// Handle HTML strings
-		} else if ( typeof selector == &quot;string&quot; ) {
+		if ( typeof selector === &quot;string&quot; ) {
 			// Are we dealing with HTML string or an ID?
 			var match = quickExpr.exec( selector );
 
@@ -61,60 +61,55 @@ jQuery.fn = jQuery.prototype = {
 					var elem = document.getElementById( match[3] );
 
 					// Make sure an element was located
-					if ( elem )
+					if ( elem ){
 						// Handle the case where IE and Opera return items
 						// by name instead of ID
 						if ( elem.id != match[3] )
 							return jQuery().find( selector );
 
 						// Otherwise, we inject the element directly into the jQuery object
-						else {
-							this[0] = elem;
-							this.length = 1;
-							return this;
-						}
-
-					else
-						selector = [];
+						var ret = jQuery( elem );
+						ret.context = document;
+						ret.selector = selector;
+						return ret;
+					}
+					selector = [];
 				}
 
 			// HANDLE: $(expr, [context])
 			// (which is just equivalent to: $(content).find(expr)
 			} else
-				return new jQuery( context ).find( selector );
+				return jQuery( context ).find( selector );
 
 		// HANDLE: $(function)
 		// Shortcut for document ready
 		} else if ( jQuery.isFunction( selector ) )
-			return new jQuery( document )[ jQuery.fn.ready ? &quot;ready&quot; : &quot;load&quot; ]( selector );
+			return jQuery( document ).ready( selector );
 
-		return this.setArray(
-			// HANDLE: $(array)
-			selector.constructor == Array &amp;&amp; selector ||
-
-			// HANDLE: $(arraylike)
-			// Watch for when an array-like object, contains DOM nodes, is passed in as the selector
-			(selector.jquery || selector.length &amp;&amp; selector != window &amp;&amp; !selector.nodeType &amp;&amp; selector[0] != undefined &amp;&amp; selector[0].nodeType) &amp;&amp; jQuery.makeArray( selector ) ||
+		// Make sure that old selector state is passed along
+		if ( selector.selector &amp;&amp; selector.context ) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
 
-			// HANDLE: $(*)
-			[ selector ] );
+		return this.setArray(jQuery.makeArray(selector));
 	},
-	
+
+	// Start with an empty selector
+	selector: &quot;&quot;,
+
 	// The current version of jQuery being used
-	jquery: &quot;@VERSION&quot;,
+	jquery: &quot;1.3rc2&quot;,
 
 	// The number of elements contained in the matched element set
 	size: function() {
 		return this.length;
 	},
-	
-	// The number of elements contained in the matched element set
-	length: 0,
 
 	// Get the Nth element in the matched element set OR
 	// Get the whole matched element set as a clean array
 	get: function( num ) {
-		return num == undefined ?
+		return num === undefined ?
 
 			// Return a 'clean' array
 			jQuery.makeArray( this ) :
@@ -122,20 +117,27 @@ jQuery.fn = jQuery.prototype = {
 			// Return just the object
 			this[ num ];
 	},
-	
+
 	// Take an array of elements and push it onto the stack
 	// (returning the new matched element set)
-	pushStack: function( elems ) {
+	pushStack: function( elems, name, selector ) {
 		// Build a new jQuery matched element set
 		var ret = jQuery( elems );
 
 		// Add the old object onto the stack (as a reference)
 		ret.prevObject = this;
 
+		ret.context = this.context;
+
+		if ( name === &quot;find&quot; )
+			ret.selector = this.selector + (this.selector ? &quot; &quot; : &quot;&quot;) + selector;
+		else if ( name )
+			ret.selector = this.selector + &quot;.&quot; + name + &quot;(&quot; + selector + &quot;)&quot;;
+
 		// Return the newly-formed element set
 		return ret;
 	},
-	
+
 	// Force the current matched set of elements to become
 	// the specified array of elements (destroying the stack in the process)
 	// You should use pushStack() in order to do this, but maintain the stack
@@ -144,7 +146,7 @@ jQuery.fn = jQuery.prototype = {
 		// is a super-fast way to populate an object with array-like properties
 		this.length = 0;
 		Array.prototype.push.apply( this, elems );
-		
+
 		return this;
 	},
 
@@ -155,33 +157,29 @@ jQuery.fn = jQuery.prototype = {
 		return jQuery.each( this, callback, args );
 	},
 
-	// Determine the position of an element within 
+	// Determine the position of an element within
 	// the matched set of elements
 	index: function( elem ) {
-		var ret = -1;
-
 		// Locate the position of the desired element
-		this.each(function(i){
-			if ( this == elem )
-				ret = i;
-		});
-
-		return ret;
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem &amp;&amp; elem.jquery ? elem[0] : elem
+		, this );
 	},
 
 	attr: function( name, value, type ) {
 		var options = name;
-		
+
 		// Look for the case where we're accessing a style value
-		if ( name.constructor == String )
-			if ( value == undefined )
-				return this.length &amp;&amp; jQuery[ type || &quot;attr&quot; ]( this[0], name ) || undefined;
+		if ( typeof name === &quot;string&quot; )
+			if ( value === undefined )
+				return this[0] &amp;&amp; jQuery[ type || &quot;attr&quot; ]( this[0], name );
 
 			else {
 				options = {};
 				options[ name ] = value;
 			}
-		
+
 		// Check to see if we're setting style values
 		return this.each(function(i){
 			// Set all the styles
@@ -203,7 +201,7 @@ jQuery.fn = jQuery.prototype = {
 	},
 
 	text: function( text ) {
-		if ( typeof text != &quot;object&quot; &amp;&amp; text != null )
+		if ( typeof text !== &quot;object&quot; &amp;&amp; text != null )
 			return this.empty().append( (this[0] &amp;&amp; this[0].ownerDocument || document).createTextNode( text ) );
 
 		var ret = &quot;&quot;;
@@ -221,20 +219,22 @@ jQuery.fn = jQuery.prototype = {
 	},
 
 	wrapAll: function( html ) {
-		if ( this[0] )
+		if ( this[0] ) {
 			// The elements to wrap the target around
-			jQuery( html, this[0].ownerDocument )
-				.clone()
-				.insertBefore( this[0] )
-				.map(function(){
-					var elem = this;
+			var wrap = jQuery( html, this[0].ownerDocument ).clone();
+
+			if ( this[0].parentNode )
+				wrap.insertBefore( this[0] );
 
-					while ( elem.firstChild )
-						elem = elem.firstChild;
+			wrap.map(function(){
+				var elem = this;
 
-					return elem;
-				})
-				.append(this);
+				while ( elem.firstChild )
+					elem = elem.firstChild;
+
+				return elem;
+			}).append(this);
+		}
 
 		return this;
 	},
@@ -252,27 +252,27 @@ jQuery.fn = jQuery.prototype = {
 	},
 
 	append: function() {
-		return this.domManip(arguments, true, false, function(elem){
+		return this.domManip(arguments, true, function(elem){
 			if (this.nodeType == 1)
 				this.appendChild( elem );
 		});
 	},
 
 	prepend: function() {
-		return this.domManip(arguments, true, true, function(elem){
+		return this.domManip(arguments, true, function(elem){
 			if (this.nodeType == 1)
 				this.insertBefore( elem, this.firstChild );
 		});
 	},
-	
+
 	before: function() {
-		return this.domManip(arguments, false, false, function(elem){
+		return this.domManip(arguments, false, function(elem){
 			this.parentNode.insertBefore( elem, this );
 		});
 	},
 
 	after: function() {
-		return this.domManip(arguments, false, true, function(elem){
+		return this.domManip(arguments, false, function(elem){
 			this.parentNode.insertBefore( elem, this.nextSibling );
 		});
 	},
@@ -281,34 +281,43 @@ jQuery.fn = jQuery.prototype = {
 		return this.prevObject || jQuery( [] );
 	},
 
+	// For internal use only.
+	// Behaves like an Array's .push method, not like a jQuery method.
+	push: [].push,
+
 	find: function( selector ) {
-		var elems = jQuery.map(this, function(elem){
-			return jQuery.find( selector, elem );
-		});
+		if ( this.length === 1 &amp;&amp; !/,/.test(selector) ) {
+			var ret = this.pushStack( [], &quot;find&quot;, selector );
+			ret.length = 0;
+			jQuery.find( selector, this[0], ret );
+			return ret;
+		} else {
+			var elems = jQuery.map(this, function(elem){
+				return jQuery.find( selector, elem );
+			});
 
-		return this.pushStack( /[^+&gt;] [^+&gt;]/.test( selector ) || selector.indexOf(&quot;..&quot;) &gt; -1 ?
-			jQuery.unique( elems ) :
-			elems );
+			return this.pushStack( /[^+&gt;] [^+&gt;]/.test( selector ) ?
+				jQuery.unique( elems ) :
+				elems, &quot;find&quot;, selector );
+		}
 	},
 
 	clone: function( events ) {
 		// Do the clone
 		var ret = this.map(function(){
-			if ( jQuery.browser.msie &amp;&amp; !jQuery.isXMLDoc(this) ) {
+			if ( !jQuery.support.noCloneEvent &amp;&amp; !jQuery.isXMLDoc(this) ) {
 				// IE copies events bound via attachEvent when
 				// using cloneNode. Calling detachEvent on the
 				// clone will also remove the events from the orignal
 				// In order to get around this, we use innerHTML.
-				// Unfortunately, this means some modifications to 
-				// attributes in IE that are actually only stored 
+				// Unfortunately, this means some modifications to
+				// attributes in IE that are actually only stored
 				// as properties will not be copied (such as the
 				// the name attribute on an input).
 				var clone = this.cloneNode(true),
-					container = document.createElement(&quot;div&quot;),
-					container2 = document.createElement(&quot;div&quot;);
+					container = document.createElement(&quot;div&quot;);
 				container.appendChild(clone);
-				container2.innerHTML = container.innerHTML;
-				return container2.firstChild;
+				return jQuery.clean([container.innerHTML])[0];
 			} else
 				return this.cloneNode(true);
 		});
@@ -317,13 +326,15 @@ jQuery.fn = jQuery.prototype = {
 		// removeData doesn't work here, IE removes it from the original as well
 		// this is primarily for IE but the data expando shouldn't be copied over in any browser
 		var clone = ret.find(&quot;*&quot;).andSelf().each(function(){
-			if ( this[ expando ] != undefined )
+			if ( this[ expando ] !== undefined )
 				this[ expando ] = null;
 		});
-		
+
 		// Copy the events from the original to the clone
 		if ( events === true )
 			this.find(&quot;*&quot;).andSelf().each(function(i){
+				if (this.nodeType == 3)
+					return;
 				var events = jQuery.data( this, &quot;events&quot; );
 
 				for ( var type in events )
@@ -342,14 +353,29 @@ jQuery.fn = jQuery.prototype = {
 				return selector.call( elem, i );
 			}) ||
 
-			jQuery.multiFilter( selector, this ) );
+			jQuery.multiFilter( selector, jQuery.grep(this, function(elem){
+				return elem.nodeType === 1;
+			}) ), &quot;filter&quot;, selector );
+	},
+
+	closest: function( selector ) {
+		var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null;
+
+		return this.map(function(){
+			var cur = this;
+			while ( cur &amp;&amp; cur.ownerDocument ) {
+				if ( pos ? pos.index(cur) &gt; -1 : jQuery(cur).is(selector) )
+					return cur;
+				cur = cur.parentNode;
+			}
+		});
 	},
 
 	not: function( selector ) {
-		if ( selector.constructor == String )
+		if ( typeof selector === &quot;string&quot; )
 			// test special case where just one selector is passed in
 			if ( isSimple.test( selector ) )
-				return this.pushStack( jQuery.multiFilter( selector, this, true ) );
+				return this.pushStack( jQuery.multiFilter( selector, this, true ), &quot;not&quot;, selector );
 			else
 				selector = jQuery.multiFilter( selector, this );
 
@@ -360,37 +386,37 @@ jQuery.fn = jQuery.prototype = {
 	},
 
 	add: function( selector ) {
-		return !selector ? this : this.pushStack( jQuery.merge( 
+		return this.pushStack( jQuery.unique( jQuery.merge(
 			this.get(),
-			selector.constructor == String ? 
-				jQuery( selector ).get() :
-				selector.length != undefined &amp;&amp; (!selector.nodeName || jQuery.nodeName(selector, &quot;form&quot;)) ?
-					selector : [selector] ) );
+			typeof selector === &quot;string&quot; ?
+				jQuery( selector ) :
+				jQuery.makeArray( selector )
+		)));
 	},
 
 	is: function( selector ) {
-		return selector ?
-			jQuery.multiFilter( selector, this ).length &gt; 0 :
-			false;
+		return !!selector &amp;&amp; jQuery.multiFilter( selector, this ).length &gt; 0;
 	},
 
 	hasClass: function( selector ) {
-		return this.is( &quot;.&quot; + selector );
+		return !!selector &amp;&amp; this.is( &quot;.&quot; + selector );
 	},
-	
-	val: function( value ) {
-		if ( value == undefined ) {
 
-			if ( this.length ) {
-				var elem = this[0];
+	val: function( value ) {
+		if ( value === undefined ) {			
+			var elem = this[0];
 
+			if ( elem ) {
+				if( jQuery.nodeName( elem, 'option' ) )
+					return (elem.attributes.value || {}).specified ? elem.value : elem.text;
+				
 				// We need to handle select boxes special
 				if ( jQuery.nodeName( elem, &quot;select&quot; ) ) {
 					var index = elem.selectedIndex,
 						values = [],
 						options = elem.options,
 						one = elem.type == &quot;select-one&quot;;
-					
+
 					// Nothing was selected
 					if ( index &lt; 0 )
 						return null;
@@ -401,40 +427,41 @@ jQuery.fn = jQuery.prototype = {
 
 						if ( option.selected ) {
 							// Get the specifc value for the option
-							value = jQuery.browser.msie &amp;&amp; !option.attributes.value.specified ? option.text : option.value;
-							
+							value = jQuery(option).val();
+
 							// We don't need an array for one selects
 							if ( one )
 								return value;
-							
+
 							// Multi-Selects return an array
 							values.push( value );
 						}
 					}
-					
-					return values;
-					
+
+					return values;				
+				}
+
 				// Everything else, we just grab the value
-				} else
-					return (this[0].value || &quot;&quot;).replace(/\r/g, &quot;&quot;);
+				return (elem.value || &quot;&quot;).replace(/\r/g, &quot;&quot;);
 
 			}
 
 			return undefined;
 		}
 
+		if ( typeof value === &quot;number&quot; )
+			value += '';
+
 		return this.each(function(){
 			if ( this.nodeType != 1 )
 				return;
 
-			if ( value.constructor == Array &amp;&amp; /radio|checkbox/.test( this.type ) )
+			if ( jQuery.isArray(value) &amp;&amp; /radio|checkbox/.test( this.type ) )
 				this.checked = (jQuery.inArray(this.value, value) &gt;= 0 ||
 					jQuery.inArray(this.name, value) &gt;= 0);
 
 			else if ( jQuery.nodeName( this, &quot;select&quot; ) ) {
-				var values = value.constructor == Array ?
-					value :
-					[ value ];
+				var values = jQuery.makeArray(value);
 
 				jQuery( &quot;option&quot;, this ).each(function(){
 					this.selected = (jQuery.inArray( this.value, values ) &gt;= 0 ||
@@ -448,10 +475,10 @@ jQuery.fn = jQuery.prototype = {
 				this.value = value;
 		});
 	},
-	
+
 	html: function( value ) {
-		return value == undefined ?
-			(this.length ?
+		return value === undefined ?
+			(this[0] ?
 				this[0].innerHTML :
 				null) :
 			this.empty().append( value );
@@ -462,11 +489,12 @@ jQuery.fn = jQuery.prototype = {
 	},
 
 	eq: function( i ) {
-		return this.slice( i, i + 1 );
+		return this.slice( i, +i + 1 );
 	},
 
 	slice: function() {
-		return this.pushStack( Array.prototype.slice.apply( this, arguments ) );
+		return this.pushStack( Array.prototype.slice.apply( this, arguments ),
+			&quot;slice&quot;, Array.prototype.slice.call(arguments).join(&quot;,&quot;) );
 	},
 
 	map: function( callback ) {
@@ -478,50 +506,35 @@ jQuery.fn = jQuery.prototype = {
 	andSelf: function() {
 		return this.add( this.prevObject );
 	},
-	
-	domManip: function( args, table, reverse, callback ) {
-		var clone = this.length &gt; 1, elems; 
-
-		return this.each(function(){
-			if ( !elems ) {
-				elems = jQuery.clean( args, this.ownerDocument );
-
-				if ( reverse )
-					elems.reverse();
-			}
-
-			var obj = this;
-
-			if ( table &amp;&amp; jQuery.nodeName( this, &quot;table&quot; ) &amp;&amp; jQuery.nodeName( elems[0], &quot;tr&quot; ) )
-				obj = this.getElementsByTagName(&quot;tbody&quot;)[0] || this.appendChild( this.ownerDocument.createElement(&quot;tbody&quot;) );
 
-			var scripts = jQuery( [] );
+	domManip: function( args, table, callback ) {
+		if ( this[0] ) {
+			var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(),
+				scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ),
+				first = fragment.firstChild,
+				extra = this.length &gt; 1 ? fragment.cloneNode(true) : fragment;
 
-			jQuery.each(elems, function(){
-				var elem = clone ?
-					jQuery( this ).clone( true )[0] :
-					this;
-
-				// execute all scripts after the elements have been injected
-				if ( jQuery.nodeName( elem, &quot;script&quot; ) ) {
-					scripts = scripts.add( elem );
-				} else {
-					// Remove any inner scripts for later evaluation
-					if ( elem.nodeType == 1 )
-						scripts = scripts.add( jQuery( &quot;script&quot;, elem ).remove() );
-
-					// Inject the elements into the document
-					callback.call( obj, elem );
-				}
-			});
+			if ( first )
+				for ( var i = 0, l = this.length; i &lt; l; i++ )
+					callback.call( root(this[i], first), i &gt; 0 ? extra.cloneNode(true) : fragment );
+			
+			if ( scripts )
+				jQuery.each( scripts, evalScript );
+		}
 
-			scripts.each( evalScript );
-		});
+		return this;
+		
+		function root( elem, cur ) {
+			return table &amp;&amp; jQuery.nodeName(elem, &quot;table&quot;) &amp;&amp; jQuery.nodeName(cur, &quot;tr&quot;) ?
+				(elem.getElementsByTagName(&quot;tbody&quot;)[0] ||
+				elem.appendChild(elem.ownerDocument.createElement(&quot;tbody&quot;))) :
+				elem;
+		}
 	}
 };
 
 // Give the init function the jQuery prototype for later instantiation
-jQuery.prototype.init.prototype = jQuery.prototype;
+jQuery.fn.init.prototype = jQuery.fn;
 
 function evalScript( i, elem ) {
 	if ( elem.src )
@@ -538,12 +551,16 @@ function evalScript( i, elem ) {
 		elem.parentNode.removeChild( elem );
 }
 
+function now(){
+	return +new Date;
+}
+
 jQuery.extend = jQuery.fn.extend = function() {
 	// copy reference to target object
 	var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
 
 	// Handle a deep copy situation
-	if ( target.constructor == Boolean ) {
+	if ( typeof target === &quot;boolean&quot; ) {
 		deep = target;
 		target = arguments[1] || {};
 		// skip the boolean and the target
@@ -551,13 +568,13 @@ jQuery.extend = jQuery.fn.extend = function() {
 	}
 
 	// Handle case when target is a string or something (possible in deep copy)
-	if ( typeof target != &quot;object&quot; &amp;&amp; typeof target != &quot;function&quot; )
+	if ( typeof target !== &quot;object&quot; &amp;&amp; !jQuery.isFunction(target) )
 		target = {};
 
 	// extend jQuery itself if only one argument is passed
-	if ( length == 1 ) {
+	if ( length == i ) {
 		target = this;
-		i = 0;
+		--i;
 	}
 
 	for ( ; i &lt; length; i++ )
@@ -565,17 +582,22 @@ jQuery.extend = jQuery.fn.extend = function() {
 		if ( (options = arguments[ i ]) != null )
 			// Extend the base object
 			for ( var name in options ) {
+				var src = target[ name ], copy = options[ name ];
+
 				// Prevent never-ending loop
-				if ( target === options[ name ] )
+				if ( target === copy )
 					continue;
 
 				// Recurse if we're merging object values
-				if ( deep &amp;&amp; options[ name ] &amp;&amp; typeof options[ name ] == &quot;object&quot; &amp;&amp; target[ name ] &amp;&amp; !options[ name ].nodeType )
-					target[ name ] = jQuery.extend( target[ name ], options[ name ] );
+				if ( deep &amp;&amp; copy &amp;&amp; typeof copy === &quot;object&quot; &amp;&amp; !copy.nodeType )
+					target[ name ] = jQuery.extend( deep, 
+						// Never move original objects, clone them
+						src || ( copy.length != null ? [ ] : { } )
+					, copy );
 
 				// Don't bring in undefined values
-				else if ( options[ name ] != undefined )
-					target[ name ] = options[ name ];
+				else if ( copy !== undefined )
+					target[ name ] = copy;
 
 			}
 
@@ -583,10 +605,11 @@ jQuery.extend = jQuery.fn.extend = function() {
 	return target;
 };
 
-var expando = &quot;jQuery&quot; + (new Date()).getTime(), uuid = 0, windowData = {};
-
 // exclude the following css properties to add px
-var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i;
+var	exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
+	// cache defaultView
+	defaultView = document.defaultView || {},
+	toString = Object.prototype.toString;
 
 jQuery.extend({
 	noConflict: function( deep ) {
@@ -598,13 +621,17 @@ jQuery.extend({
 		return jQuery;
 	},
 
-	// This may seem like some crazy code, but trust me when I say that this
-	// is the only cross-browser way to do this. --John
-	isFunction: function( fn ) {
-		return !!fn &amp;&amp; typeof fn != &quot;string&quot; &amp;&amp; !fn.nodeName &amp;&amp; 
-			fn.constructor != Array &amp;&amp; /function/i.test( fn + &quot;&quot; );
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return toString.call(obj) === &quot;[object Function]&quot;;
 	},
-	
+
+	isArray: function( obj ) {
+		return toString.call(obj) === &quot;[object Array]&quot;;
+	},
+
 	// check if an element is in a (or is an) XML document
 	isXMLDoc: function( elem ) {
 		return elem.documentElement &amp;&amp; !elem.body ||
@@ -622,12 +649,14 @@ jQuery.extend({
 				script = document.createElement(&quot;script&quot;);
 
 			script.type = &quot;text/javascript&quot;;
-			if ( jQuery.browser.msie )
-				script.text = data;
-			else
+			if ( jQuery.support.scriptEval )
 				script.appendChild( document.createTextNode( data ) );
+			else
+				script.text = data;
 
-			head.appendChild( script );
+			// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+			// This arises when a base node is used (#2709).
+			head.insertBefore( script, head.firstChild );
 			head.removeChild( script );
 		}
 	},
@@ -635,108 +664,44 @@ jQuery.extend({
 	nodeName: function( elem, name ) {
 		return elem.nodeName &amp;&amp; elem.nodeName.toUpperCase() == name.toUpperCase();
 	},
-	
-	cache: {},
-	
-	data: function( elem, name, data ) {
-		elem = elem == window ?
-			windowData :
-			elem;
-
-		var id = elem[ expando ];
-
-		// Compute a unique ID for the element
-		if ( !id ) 
-			id = elem[ expando ] = ++uuid;
-
-		// Only generate the data cache if we're
-		// trying to access or manipulate it
-		if ( name &amp;&amp; !jQuery.cache[ id ] )
-			jQuery.cache[ id ] = {};
-		
-		// Prevent overriding the named cache with undefined values
-		if ( data != undefined )
-			jQuery.cache[ id ][ name ] = data;
-		
-		// Return the named cache data, or the ID for the element	
-		return name ?
-			jQuery.cache[ id ][ name ] :
-			id;
-	},
-	
-	removeData: function( elem, name ) {
-		elem = elem == window ?
-			windowData :
-			elem;
-
-		var id = elem[ expando ];
-
-		// If we want to remove a specific section of the element's data
-		if ( name ) {
-			if ( jQuery.cache[ id ] ) {
-				// Remove the section of cache data
-				delete jQuery.cache[ id ][ name ];
-
-				// If we've removed all the data, remove the element's cache
-				name = &quot;&quot;;
-
-				for ( name in jQuery.cache[ id ] )
-					break;
-
-				if ( !name )
-					jQuery.removeData( elem );
-			}
-
-		// Otherwise, we want to remove all of the element's data
-		} else {
-			// Clean up the element expando
-			try {
-				delete elem[ expando ];
-			} catch(e){
-				// IE has trouble directly removing the expando
-				// but it's ok with using removeAttribute
-				if ( elem.removeAttribute )
-					elem.removeAttribute( expando );
-			}
-
-			// Completely remove the data cache
-			delete jQuery.cache[ id ];
-		}
-	},
 
 	// args is for internal usage only
 	each: function( object, callback, args ) {
+		var name, i = 0, length = object.length;
+
 		if ( args ) {
-			if ( object.length == undefined )
-				for ( var name in object )
-					callback.apply( object[ name ], args );
-			else
-				for ( var i = 0, length = object.length; i &lt; length; i++ )
-					if ( callback.apply( object[ i ], args ) === false )
+			if ( length === undefined ) {
+				for ( name in object )
+					if ( callback.apply( object[ name ], args ) === false )
+						break;
+			} else
+				for ( ; i &lt; length; )
+					if ( callback.apply( object[ i++ ], args ) === false )
 						break;
 
 		// A special, fast, case for the most common use of each
 		} else {
-			if ( object.length == undefined )
-				for ( var name in object )
-					callback.call( object[ name ], name, object[ name ] );
-			else
-				for ( var i = 0, length = object.length, value = object[0]; 
+			if ( length === undefined ) {
+				for ( name in object )
+					if ( callback.call( object[ name ], name, object[ name ] ) === false )
+						break;
+			} else
+				for ( var value = object[0];
 					i &lt; length &amp;&amp; callback.call( value, i, value ) !== false; value = object[++i] ){}
 		}
 
 		return object;
 	},
-	
+
 	prop: function( elem, value, type, i, name ) {
-			// Handle executable functions
-			if ( jQuery.isFunction( value ) )
-				value = value.call( elem, i );
-				
-			// Handle passing in a number to a CSS property
-			return value &amp;&amp; value.constructor == Number &amp;&amp; type == &quot;curCSS&quot; &amp;&amp; !exclude.test( name ) ?
-				value + &quot;px&quot; :
-				value;
+		// Handle executable functions
+		if ( jQuery.isFunction( value ) )
+			value = value.call( elem, i );
+
+		// Handle passing in a number to a CSS property
+		return typeof value === &quot;number&quot; &amp;&amp; type == &quot;curCSS&quot; &amp;&amp; !exclude.test( name ) ?
+			value + &quot;px&quot; :
+			value;
 	},
 
 	className: {
@@ -751,14 +716,14 @@ jQuery.extend({
 		// internal only, use removeClass(&quot;class&quot;)
 		remove: function( elem, classNames ) {
 			if (elem.nodeType == 1)
-				elem.className = classNames != undefined ?
+				elem.className = classNames !== undefined ?
 					jQuery.grep(elem.className.split(/\s+/), function(className){
-						return !jQuery.className.has( classNames, className );	
+						return !jQuery.className.has( classNames, className );
 					}).join(&quot; &quot;) :
 					&quot;&quot;;
 		},
 
-		// internal only, use is(&quot;.class&quot;)
+		// internal only, use hasClass(&quot;class&quot;)
 		has: function( elem, className ) {
 			return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) &gt; -1;
 		}
@@ -783,7 +748,7 @@ jQuery.extend({
 	css: function( elem, name, force ) {
 		if ( name == &quot;width&quot; || name == &quot;height&quot; ) {
 			var val, props = { position: &quot;absolute&quot;, visibility: &quot;hidden&quot;, display:&quot;block&quot; }, which = name == &quot;width&quot; ? [ &quot;Left&quot;, &quot;Right&quot; ] : [ &quot;Top&quot;, &quot;Bottom&quot; ];
-		
+
 			function getWH() {
 				val = name == &quot;width&quot; ? elem.offsetWidth : elem.offsetHeight;
 				var padding = 0, border = 0;
@@ -793,53 +758,38 @@ jQuery.extend({
 				});
 				val -= Math.round(padding + border);
 			}
-		
+
 			if ( jQuery(elem).is(&quot;:visible&quot;) )
 				getWH();
 			else
 				jQuery.swap( elem, props, getWH );
-			
+
 			return Math.max(0, val);
 		}
-		
+
 		return jQuery.curCSS( elem, name, force );
 	},
 
 	curCSS: function( elem, name, force ) {
-		var ret;
-
-		// A helper method for determining if an element's values are broken
-		function color( elem ) {
-			if ( !jQuery.browser.safari )
-				return false;
-
-			var ret = document.defaultView.getComputedStyle( elem, null );
-			return !ret || ret.getPropertyValue(&quot;color&quot;) == &quot;&quot;;
-		}
+		var ret, style = elem.style;
 
 		// We need to handle opacity special in IE
-		if ( name == &quot;opacity&quot; &amp;&amp; jQuery.browser.msie ) {
-			ret = jQuery.attr( elem.style, &quot;opacity&quot; );
+		if ( name == &quot;opacity&quot; &amp;&amp; !jQuery.support.opacity ) {
+			ret = jQuery.attr( style, &quot;opacity&quot; );
 
 			return ret == &quot;&quot; ?
 				&quot;1&quot; :
 				ret;
 		}
-		// Opera sometimes will give the wrong display answer, this fixes it, see #2037
-		if ( jQuery.browser.opera &amp;&amp; name == &quot;display&quot; ) {
-			var save = elem.style.display;
-			elem.style.display = &quot;block&quot;;
-			elem.style.display = save;
-		}
-		
+
 		// Make sure we're using the right name for getting the float value
 		if ( name.match( /float/i ) )
 			name = styleFloat;
 
-		if ( !force &amp;&amp; elem.style[ name ] )
-			ret = elem.style[ name ];
+		if ( !force &amp;&amp; style &amp;&amp; style[ name ] )
+			ret = style[ name ];
 
-		else if ( document.defaultView &amp;&amp; document.defaultView.getComputedStyle ) {
+		else if ( defaultView.getComputedStyle ) {
 
 			// Only &quot;float&quot; is needed here
 			if ( name.match( /float/i ) )
@@ -847,39 +797,10 @@ jQuery.extend({
 
 			name = name.replace( /([A-Z])/g, &quot;-$1&quot; ).toLowerCase();
 
-			var getComputedStyle = document.defaultView.getComputedStyle( elem, null );
-
-			if ( getComputedStyle &amp;&amp; !color( elem ) )
-				ret = getComputedStyle.getPropertyValue( name );
+			var computedStyle = defaultView.getComputedStyle( elem, null );
 
-			// If the element isn't reporting its values properly in Safari
-			// then some display: none elements are involved
-			else {
-				var swap = [], stack = [];
-
-				// Locate all of the parent display: none elements
-				for ( var a = elem; a &amp;&amp; color(a); a = a.parentNode )
-					stack.unshift(a);
-
-				// Go through and make them visible, but in reverse
-				// (It would be better if we knew the exact display type that they had)
-				for ( var i = 0; i &lt; stack.length; i++ )
-					if ( color( stack[ i ] ) ) {
-						swap[ i ] = stack[ i ].style.display;
-						stack[ i ].style.display = &quot;block&quot;;
-					}
-
-				// Since we flip the display style, we have to handle that
-				// one special, otherwise get the value
-				ret = name == &quot;display&quot; &amp;&amp; swap[ stack.length - 1 ] != null ?
-					&quot;none&quot; :
-					( getComputedStyle &amp;&amp; getComputedStyle.getPropertyValue( name ) ) || &quot;&quot;;
-
-				// Finally, revert the display styles back
-				for ( var i = 0; i &lt; swap.length; i++ )
-					if ( swap[ i ] != null )
-						stack[ i ].style.display = swap[ i ];
-			}
+			if ( computedStyle )
+				ret = computedStyle.getPropertyValue( name );
 
 			// We should always get a number back from opacity
 			if ( name == &quot;opacity&quot; &amp;&amp; ret == &quot;&quot; )
@@ -899,195 +820,238 @@ jQuery.extend({
 			// but a number that has a weird ending, we need to convert it to pixels
 			if ( !/^\d+(px)?$/i.test( ret ) &amp;&amp; /^\d/.test( ret ) ) {
 				// Remember the original values
-				var style = elem.style.left, runtimeStyle = elem.runtimeStyle.left;
+				var left = style.left, rsLeft = elem.runtimeStyle.left;
 
 				// Put in the new values to get a computed value out
 				elem.runtimeStyle.left = elem.currentStyle.left;
-				elem.style.left = ret || 0;
-				ret = elem.style.pixelLeft + &quot;px&quot;;
+				style.left = ret || 0;
+				ret = style.pixelLeft + &quot;px&quot;;
 
 				// Revert the changed values
-				elem.style.left = style;
-				elem.runtimeStyle.left = runtimeStyle;
+				style.left = left;
+				elem.runtimeStyle.left = rsLeft;
 			}
 		}
 
 		return ret;
 	},
-	
-	clean: function( elems, context ) {
-		var ret = [];
+
+	clean: function( elems, context, fragment ) {
 		context = context || document;
+
 		// !context.createElement fails in IE with an error but returns typeof 'object'
-		if (typeof context.createElement == 'undefined') 
+		if ( typeof context.createElement === &quot;undefined&quot; )
 			context = context.ownerDocument || context[0] &amp;&amp; context[0].ownerDocument || document;
 
+		// If a single string is passed in and it's a single tag
+		// just do a createElement and skip the rest
+		if ( !fragment &amp;&amp; elems.length === 1 &amp;&amp; typeof elems[0] === &quot;string&quot; ) {
+			var match = /^&lt;(\w+)\s*\/?&gt;$/.exec(elems[0]);
+			if ( match )
+				return [ context.createElement( match[1] ) ];
+		}
+
+		var ret = [], scripts = [], div = context.createElement(&quot;div&quot;);
+
 		jQuery.each(elems, function(i, elem){
+			if ( typeof elem === &quot;number&quot; )
+				elem += '';
+
 			if ( !elem )
 				return;
 
-			if ( elem.constructor == Number )
-				elem = elem.toString();
-			
 			// Convert html string into DOM nodes
-			if ( typeof elem == &quot;string&quot; ) {
+			if ( typeof elem === &quot;string&quot; ) {
 				// Fix &quot;XHTML&quot;-style tags in all browsers
 				elem = elem.replace(/(&lt;(\w+)[^&gt;]*?)\/&gt;/g, function(all, front, tag){
-					return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area)$/i) ?
+					return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
 						all :
 						front + &quot;&gt;&lt;/&quot; + tag + &quot;&gt;&quot;;
 				});
 
 				// Trim whitespace, otherwise indexOf won't work as expected
-				var tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement(&quot;div&quot;);
+				var tags = jQuery.trim( elem ).toLowerCase();
 
 				var wrap =
 					// option or optgroup
 					!tags.indexOf(&quot;&lt;opt&quot;) &amp;&amp;
 					[ 1, &quot;&lt;select multiple='multiple'&gt;&quot;, &quot;&lt;/select&gt;&quot; ] ||
-					
+
 					!tags.indexOf(&quot;&lt;leg&quot;) &amp;&amp;
 					[ 1, &quot;&lt;fieldset&gt;&quot;, &quot;&lt;/fieldset&gt;&quot; ] ||
-					
+
 					tags.match(/^&lt;(thead|tbody|tfoot|colg|cap)/) &amp;&amp;
 					[ 1, &quot;&lt;table&gt;&quot;, &quot;&lt;/table&gt;&quot; ] ||
-					
+
 					!tags.indexOf(&quot;&lt;tr&quot;) &amp;&amp;
 					[ 2, &quot;&lt;table&gt;&lt;tbody&gt;&quot;, &quot;&lt;/tbody&gt;&lt;/table&gt;&quot; ] ||
-					
+
 				 	// &lt;thead&gt; matched above
 					(!tags.indexOf(&quot;&lt;td&quot;) || !tags.indexOf(&quot;&lt;th&quot;)) &amp;&amp;
 					[ 3, &quot;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&quot;, &quot;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&quot; ] ||
-					
+
 					!tags.indexOf(&quot;&lt;col&quot;) &amp;&amp;
 					[ 2, &quot;&lt;table&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;colgroup&gt;&quot;, &quot;&lt;/colgroup&gt;&lt;/table&gt;&quot; ] ||
 
 					// IE can't serialize &lt;link&gt; and &lt;script&gt; tags normally
-					jQuery.browser.msie &amp;&amp;
+					!jQuery.support.htmlSerialize &amp;&amp;
 					[ 1, &quot;div&lt;div&gt;&quot;, &quot;&lt;/div&gt;&quot; ] ||
-					
+
 					[ 0, &quot;&quot;, &quot;&quot; ];
 
 				// Go to html and back, then peel off extra wrappers
 				div.innerHTML = wrap[1] + elem + wrap[2];
-				
+
 				// Move to the right depth
 				while ( wrap[0]-- )
 					div = div.lastChild;
-				
+
 				// Remove IE's autoinserted &lt;tbody&gt; from table fragments
-				if ( jQuery.browser.msie ) {
-					
+				if ( !jQuery.support.tbody ) {
+
 					// String was a &lt;table&gt;, *may* have spurious &lt;tbody&gt;
 					var tbody = !tags.indexOf(&quot;&lt;table&quot;) &amp;&amp; tags.indexOf(&quot;&lt;tbody&quot;) &lt; 0 ?
 						div.firstChild &amp;&amp; div.firstChild.childNodes :
-						
+
 						// String was a bare &lt;thead&gt; or &lt;tfoot&gt;
 						wrap[1] == &quot;&lt;table&gt;&quot; &amp;&amp; tags.indexOf(&quot;&lt;tbody&quot;) &lt; 0 ?
 							div.childNodes :
 							[];
-				
+
 					for ( var j = tbody.length - 1; j &gt;= 0 ; --j )
 						if ( jQuery.nodeName( tbody[ j ], &quot;tbody&quot; ) &amp;&amp; !tbody[ j ].childNodes.length )
 							tbody[ j ].parentNode.removeChild( tbody[ j ] );
-					
-					// IE completely kills leading whitespace when innerHTML is used	
-					if ( /^\s/.test( elem ) )	
-						div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
-				
-				}
+
+					}
+
+				// IE completely kills leading whitespace when innerHTML is used
+				if ( !jQuery.support.leadingWhitespace &amp;&amp; /^\s/.test( elem ) )
+					div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
 				
 				elem = jQuery.makeArray( div.childNodes );
 			}
 
-			if ( elem.length === 0 &amp;&amp; (!jQuery.nodeName( elem, &quot;form&quot; ) &amp;&amp; !jQuery.nodeName( elem, &quot;select&quot; )) )
-				return;
-
-			if ( elem[0] == undefined || jQuery.nodeName( elem, &quot;form&quot; ) || elem.options )
+			if ( elem.nodeType )
 				ret.push( elem );
-
 			else
 				ret = jQuery.merge( ret, elem );
 
 		});
 
+		if ( fragment ) {
+			for ( var i = 0; ret[i]; i++ ) {
+				if ( jQuery.nodeName( ret[i], &quot;script&quot; ) &amp;&amp; (!ret[i].type || ret[i].type.toLowerCase() === &quot;text/javascript&quot;) ) {
+					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+				} else {
+					if ( ret[i].nodeType === 1 )
+						ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName(&quot;script&quot;))) );
+					fragment.appendChild( ret[i] );
+				}
+			}
+			
+			return scripts;
+		}
+
 		return ret;
 	},
-	
+
 	attr: function( elem, name, value ) {
 		// don't set attributes on text and comment nodes
 		if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
 			return undefined;
 
-		var fix = jQuery.isXMLDoc( elem ) ?
-			{} :
-			jQuery.props;
+		var notxml = !jQuery.isXMLDoc( elem ),
+			// Whether we are setting (or getting)
+			set = value !== undefined;
 
-		// Safari mis-reports the default selected property of a hidden option
-		// Accessing the parent's selectedIndex property fixes it
-		if ( name == &quot;selected&quot; &amp;&amp; jQuery.browser.safari )
-			elem.parentNode.selectedIndex;
-		
-		// Certain attributes only work when accessed via the old DOM 0 way
-		if ( fix[ name ] ) {
-			if ( value != undefined )
-				elem[ fix[ name ] ] = value;
+		// Try to normalize/fix the name
+		name = notxml &amp;&amp; jQuery.props[ name ] || name;
 
-			return elem[ fix[ name ] ];
+		// Only do all the following if this is a node (faster for style)
+		// IE elem.getAttribute passes even for style
+		if ( elem.tagName ) {
 
-		} else if ( jQuery.browser.msie &amp;&amp; name == &quot;style&quot; )
-			return jQuery.attr( elem.style, &quot;cssText&quot;, value );
+			// These attributes require special treatment
+			var special = /href|src|style/.test( name );
 
-		else if ( value == undefined &amp;&amp; jQuery.browser.msie &amp;&amp; jQuery.nodeName( elem, &quot;form&quot; ) &amp;&amp; (name == &quot;action&quot; || name == &quot;method&quot;) )
-			return elem.getAttributeNode( name ).nodeValue;
+			// Safari mis-reports the default selected property of a hidden option
+			// Accessing the parent's selectedIndex property fixes it
+			if ( name == &quot;selected&quot; &amp;&amp; elem.parentNode )
+				elem.parentNode.selectedIndex;
 
-		// IE elem.getAttribute passes even for style
-		else if ( elem.tagName ) {
+			// If applicable, access the attribute via the DOM 0 way
+			if ( name in elem &amp;&amp; notxml &amp;&amp; !special ) {
+				if ( set ){
+					// We can't allow the type property to be changed (since it causes problems in IE)
+					if ( name == &quot;type&quot; &amp;&amp; jQuery.nodeName( elem, &quot;input&quot; ) &amp;&amp; elem.parentNode )
+						throw &quot;type property can't be changed&quot;;
+
+					elem[ name ] = value;
+				}
+
+				// browsers index elements by id/name on forms, give priority to attributes.
+				if( jQuery.nodeName( elem, &quot;form&quot; ) &amp;&amp; elem.getAttributeNode(name) )
+					return elem.getAttributeNode( name ).nodeValue;
+
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				if ( name == &quot;tabIndex&quot; ) {
+					var attributeNode = elem.getAttributeNode( &quot;tabIndex&quot; );
+					return attributeNode &amp;&amp; attributeNode.specified
+						? attributeNode.value
+						: elem.nodeName.match(/^(a|area|button|input|object|select|textarea)$/i)
+							? 0
+							: undefined;
+				}
+
+				return elem[ name ];
+			}
 
-			if ( value != undefined ) {
-				// We can't allow the type property to be changed (since it causes problems in IE)
-				if ( name == &quot;type&quot; &amp;&amp; jQuery.nodeName( elem, &quot;input&quot; ) &amp;&amp; elem.parentNode )
-					throw &quot;type property can't be changed&quot;;
+			if ( !jQuery.support.style &amp;&amp; notxml &amp;&amp;  name == &quot;style&quot; )
+				return jQuery.attr( elem.style, &quot;cssText&quot;, value );
 
+			if ( set )
 				// convert the value to a string (all browsers do this but IE) see #1070
 				elem.setAttribute( name, &quot;&quot; + value );
-			}
 
-			if ( jQuery.browser.msie &amp;&amp; /href|src/.test( name ) &amp;&amp; !jQuery.isXMLDoc( elem ) ) 
-				return elem.getAttribute( name, 2 );
+			var attr = !jQuery.support.hrefNormalized &amp;&amp; notxml &amp;&amp; special
+					// Some attributes require a special call on IE
+					? elem.getAttribute( name, 2 )
+					: elem.getAttribute( name );
 
-			return elem.getAttribute( name );
+			// Non-existent attributes return null, we normalize to undefined
+			return attr === null ? undefined : attr;
+		}
 
 		// elem is actually elem.style ... set the style
-		} else {
-			// IE actually uses filters for opacity
-			if ( name == &quot;opacity&quot; &amp;&amp; jQuery.browser.msie ) {
-				if ( value != undefined ) {
-					// IE has trouble with opacity if it does not have layout
-					// Force it by setting the zoom level
-					elem.zoom = 1; 
-	
-					// Set the alpha filter to set the opacity
-					elem.filter = (elem.filter || &quot;&quot;).replace( /alpha\([^)]*\)/, &quot;&quot; ) +
-						(parseFloat( value ).toString() == &quot;NaN&quot; ? &quot;&quot; : &quot;alpha(opacity=&quot; + value * 100 + &quot;)&quot;);
-				}
-	
-				return elem.filter &amp;&amp; elem.filter.indexOf(&quot;opacity=&quot;) &gt;= 0 ?
-					(parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() :
-					&quot;&quot;;
-			}
 
-			name = name.replace(/-([a-z])/ig, function(all, letter){
-				return letter.toUpperCase();
-			});
+		// IE uses filters for opacity
+		if ( !jQuery.support.opacity &amp;&amp; name == &quot;opacity&quot; ) {
+			if ( set ) {
+				// IE has trouble with opacity if it does not have layout
+				// Force it by setting the zoom level
+				elem.zoom = 1;
 
-			if ( value != undefined )
-				elem[ name ] = value;
+				// Set the alpha filter to set the opacity
+				elem.filter = (elem.filter || &quot;&quot;).replace( /alpha\([^)]*\)/, &quot;&quot; ) +
+					(parseInt( value ) + '' == &quot;NaN&quot; ? &quot;&quot; : &quot;alpha(opacity=&quot; + value * 100 + &quot;)&quot;);
+			}
 
-			return elem[ name ];
+			return elem.filter &amp;&amp; elem.filter.indexOf(&quot;opacity=&quot;) &gt;= 0 ?
+				(parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
+				&quot;&quot;;
 		}
+
+		name = name.replace(/-([a-z])/ig, function(all, letter){
+			return letter.toUpperCase();
+		});
+
+		if ( set )
+			elem[ name ] = value;
+
+		return elem[ name ];
 	},
-	
+
 	trim: function( text ) {
 		return (text || &quot;&quot;).replace( /^\s+|\s+$/g, &quot;&quot; );
 	},
@@ -1095,19 +1059,23 @@ jQuery.extend({
 	makeArray: function( array ) {
 		var ret = [];
 
-		// Need to use typeof to fight Safari childNodes crashes
-		if ( typeof array != &quot;array&quot; )
-			for ( var i = 0, length = array.length; i &lt; length; i++ )
-				ret.push( array[ i ] );
-		else
-			ret = array.slice( 0 );
+		if( array != null ){
+			var i = array.length;
+			// The window, strings (and functions) also have 'length'
+			if( i == null || typeof array === &quot;string&quot; || jQuery.isFunction(array) || array.setInterval )
+				ret[0] = array;
+			else
+				while( i )
+					ret[--i] = array[i];
+		}
 
 		return ret;
 	},
 
 	inArray: function( elem, array ) {
 		for ( var i = 0, length = array.length; i &lt; length; i++ )
-			if ( array[ i ] == elem )
+		// Use === because on IE, window == document
+			if ( array[ i ] === elem )
 				return i;
 
 		return -1;
@@ -1116,17 +1084,17 @@ jQuery.extend({
 	merge: function( first, second ) {
 		// We have to loop this way because IE &amp; Opera overwrite the length
 		// expando of getElementsByTagName
-
+		var i = 0, elem, pos = first.length;
 		// Also, we need to make sure that the correct elements are being returned
 		// (IE returns comment nodes in a '*' query)
-		if ( jQuery.browser.msie ) {
-			for ( var i = 0; second[ i ]; i++ )
-				if ( second[ i ].nodeType != 8 )
-					first.push( second[ i ] );
+		if ( !jQuery.support.getAll ) {
+			while ( (elem = second[ i++ ]) != null )
+				if ( elem.nodeType != 8 )
+					first[ pos++ ] = elem;
 
 		} else
-			for ( var i = 0; second[ i ]; i++ )
-				first.push( second[ i ] );
+			while ( (elem = second[ i++ ]) != null )
+				first[ pos++ ] = elem;
 
 		return first;
 	},
@@ -1153,17 +1121,12 @@ jQuery.extend({
 	},
 
 	grep: function( elems, callback, inv ) {
-		// If a string is passed in for the function, make a function
-		// for it (a handy shortcut)
-		if ( typeof callback == &quot;string&quot; )
-			callback = eval(&quot;false||function(a,i){return &quot; + callback + &quot;}&quot;);
-
 		var ret = [];
 
 		// Go through the array, only saving the items
 		// that pass the validator function
 		for ( var i = 0, length = elems.length; i &lt; length; i++ )
-			if ( !inv &amp;&amp; callback( elems[ i ], i ) || inv &amp;&amp; !callback( elems[ i ], i ) )
+			if ( !inv != !callback( elems[ i ], i ) )
 				ret.push( elems[ i ] );
 
 		return ret;
@@ -1177,78 +1140,47 @@ jQuery.extend({
 		for ( var i = 0, length = elems.length; i &lt; length; i++ ) {
 			var value = callback( elems[ i ], i );
 
-			if ( value !== null &amp;&amp; value != undefined ) {
-				if ( value.constructor != Array )
-					value = [ value ];
-
-				ret = ret.concat( value );
-			}
+			if ( value != null )
+				ret[ ret.length ] = value;
 		}
 
-		return ret;
+		return ret.concat.apply( [], ret );
 	}
 });
 
+// Use of jQuery.browser is deprecated.
+// It's included for backwards compatibility and plugins,
+// although they should work to migrate away.
+
 var userAgent = navigator.userAgent.toLowerCase();
 
 // Figure out what browser is being used
 jQuery.browser = {
-	version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
+	version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
 	safari: /webkit/.test( userAgent ),
 	opera: /opera/.test( userAgent ),
 	msie: /msie/.test( userAgent ) &amp;&amp; !/opera/.test( userAgent ),
 	mozilla: /mozilla/.test( userAgent ) &amp;&amp; !/(compatible|webkit)/.test( userAgent )
 };
 
-var styleFloat = jQuery.browser.msie ?
-	&quot;styleFloat&quot; :
-	&quot;cssFloat&quot;;
-	
-jQuery.extend({
-	// Check to see if the W3C box model is being used
-	boxModel: !jQuery.browser.msie || document.compatMode == &quot;CSS1Compat&quot;,
-	
-	props: {
-		&quot;for&quot;: &quot;htmlFor&quot;,
-		&quot;class&quot;: &quot;className&quot;,
-		&quot;float&quot;: styleFloat,
-		cssFloat: styleFloat,
-		styleFloat: styleFloat,
-		innerHTML: &quot;innerHTML&quot;,
-		className: &quot;className&quot;,
-		value: &quot;value&quot;,
-		disabled: &quot;disabled&quot;,
-		checked: &quot;checked&quot;,
-		readonly: &quot;readOnly&quot;,
-		selected: &quot;selected&quot;,
-		maxlength: &quot;maxLength&quot;,
-		selectedIndex: &quot;selectedIndex&quot;,
-		defaultValue: &quot;defaultValue&quot;,
-		tagName: &quot;tagName&quot;,
-		nodeName: &quot;nodeName&quot;
-	}
-});
-
 jQuery.each({
-	parent: &quot;elem.parentNode&quot;,
-	parents: &quot;jQuery.dir(elem,'parentNode')&quot;,
-	next: &quot;jQuery.nth(elem,2,'nextSibling')&quot;,
-	prev: &quot;jQuery.nth(elem,2,'previousSibling')&quot;,
-	nextAll: &quot;jQuery.dir(elem,'nextSibling')&quot;,
-	prevAll: &quot;jQuery.dir(elem,'previousSibling')&quot;,
-	siblings: &quot;jQuery.sibling(elem.parentNode.firstChild,elem)&quot;,
-	children: &quot;jQuery.sibling(elem.firstChild)&quot;,
-	contents: &quot;jQuery.nodeName(elem,'iframe')?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes)&quot;
+	parent: function(elem){return elem.parentNode;},
+	parents: function(elem){return jQuery.dir(elem,&quot;parentNode&quot;);},
+	next: function(elem){return jQuery.nth(elem,2,&quot;nextSibling&quot;);},
+	prev: function(elem){return jQuery.nth(elem,2,&quot;previousSibling&quot;);},
+	nextAll: function(elem){return jQuery.dir(elem,&quot;nextSibling&quot;);},
+	prevAll: function(elem){return jQuery.dir(elem,&quot;previousSibling&quot;);},
+	siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
+	children: function(elem){return jQuery.sibling(elem.firstChild);},
+	contents: function(elem){return jQuery.nodeName(elem,&quot;iframe&quot;)?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
 }, function(name, fn){
-	fn = eval(&quot;false||function(elem){return &quot; + fn + &quot;}&quot;);
-
 	jQuery.fn[ name ] = function( selector ) {
 		var ret = jQuery.map( this, fn );
 
 		if ( selector &amp;&amp; typeof selector == &quot;string&quot; )
 			ret = jQuery.multiFilter( selector, ret );
 
-		return this.pushStack( jQuery.unique( ret ) );
+		return this.pushStack( jQuery.unique( ret ), name, selector );
 	};
 });
 
@@ -1272,7 +1204,7 @@ jQuery.each({
 jQuery.each({
 	removeAttr: function( name ) {
 		jQuery.attr( this, name, &quot;&quot; );
-		if (this.nodeType == 1) 
+		if (this.nodeType == 1)
 			this.removeAttribute( name );
 	},
 
@@ -1284,14 +1216,16 @@ jQuery.each({
 		jQuery.className.remove( this, classNames );
 	},
 
-	toggleClass: function( classNames ) {
-		jQuery.className[ jQuery.className.has( this, classNames ) ? &quot;remove&quot; : &quot;add&quot; ]( this, classNames );
+	toggleClass: function( classNames, state ) {
+		if( typeof state !== &quot;boolean&quot; )
+			state = !jQuery.className.has( this, classNames );
+		jQuery.className[ state ? &quot;add&quot; : &quot;remove&quot; ]( this, classNames );
 	},
 
 	remove: function( selector ) {
-		if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) {
+		if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
 			// Prevent memory leaks
-			jQuery( &quot;*&quot;, this ).add(this).each(function(){
+			jQuery( &quot;*&quot;, this ).add([this]).each(function(){
 				jQuery.event.remove(this);
 				jQuery.removeData(this);
 			});
@@ -1303,7 +1237,7 @@ jQuery.each({
 	empty: function() {
 		// Remove element nodes and prevent memory leaks
 		jQuery( &quot;&gt;*&quot;, this ).remove();
-		
+
 		// Remove any remaining nodes
 		while ( this.firstChild )
 			this.removeChild( this.firstChild );
@@ -1314,484 +1248,1048 @@ jQuery.each({
 	};
 });
 
-jQuery.each([ &quot;Height&quot;, &quot;Width&quot; ], function(i, name){
-	var type = name.toLowerCase();
-	
-	jQuery.fn[ type ] = function( size ) {
-		// Get window width or height
-		return this[0] == window ?
-			// Opera reports document.body.client[Width/Height] properly in both quirks and standards
-			jQuery.browser.opera &amp;&amp; document.body[ &quot;client&quot; + name ] || 
-			
-			// Safari reports inner[Width/Height] just fine (Mozilla and Opera include scroll bar widths)
-			jQuery.browser.safari &amp;&amp; window[ &quot;inner&quot; + name ] ||
-			
-			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
-			document.compatMode == &quot;CSS1Compat&quot; &amp;&amp; document.documentElement[ &quot;client&quot; + name ] || document.body[ &quot;client&quot; + name ] :
-		
-			// Get document width or height
-			this[0] == document ?
-				// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
-				Math.max( 
-					Math.max(document.body[&quot;scroll&quot; + name], document.documentElement[&quot;scroll&quot; + name]), 
-					Math.max(document.body[&quot;offset&quot; + name], document.documentElement[&quot;offset&quot; + name]) 
-				) :
+// Helper function used by the dimensions and offset modules
+function num(elem, prop) {
+	return elem[0] &amp;&amp; parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
+}
+var expando = &quot;jQuery&quot; + now(), uuid = 0, windowData = {};
 
-				// Get or set width or height on the element
-				size == undefined ?
-					// Get width or height on the element
-					(this.length ? jQuery.css( this[0], type ) : null) :
+jQuery.extend({
+	cache: {},
 
-					// Set the width or height on the element (default to pixels if value is unitless)
-					this.css( type, size.constructor == String ? size : size + &quot;px&quot; );
-	};
-});
+	data: function( elem, name, data ) {
+		elem = elem == window ?
+			windowData :
+			elem;
 
-var chars = jQuery.browser.safari &amp;&amp; parseInt(jQuery.browser.version) &lt; 417 ?
-		&quot;(?:[\\w*_-]|\\\\.)&quot; :
-		&quot;(?:[\\w\u0128-\uFFFF*_-]|\\\\.)&quot;,
-	quickChild = new RegExp(&quot;^&gt;\\s*(&quot; + chars + &quot;+)&quot;),
-	quickID = new RegExp(&quot;^(&quot; + chars + &quot;+)(#)(&quot; + chars + &quot;+)&quot;),
-	quickClass = new RegExp(&quot;^([#.]?)(&quot; + chars + &quot;*)&quot;);
+		var id = elem[ expando ];
 
-jQuery.extend({
-	expr: {
-		&quot;&quot;: &quot;m[2]=='*'||jQuery.nodeName(a,m[2])&quot;,
-		&quot;#&quot;: &quot;a.getAttribute('id')==m[2]&quot;,
-		&quot;:&quot;: {
-			// Position Checks
-			lt: &quot;i&lt;m[3]-0&quot;,
-			gt: &quot;i&gt;m[3]-0&quot;,
-			nth: &quot;m[3]-0==i&quot;,
-			eq: &quot;m[3]-0==i&quot;,
-			first: &quot;i==0&quot;,
-			last: &quot;i==r.length-1&quot;,
-			even: &quot;i%2==0&quot;,
-			odd: &quot;i%2&quot;,
-
-			// Child Checks
-			&quot;first-child&quot;: &quot;a.parentNode.getElementsByTagName('*')[0]==a&quot;,
-			&quot;last-child&quot;: &quot;jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a&quot;,
-			&quot;only-child&quot;: &quot;!jQuery.nth(a.parentNode.lastChild,2,'previousSibling')&quot;,
-
-			// Parent Checks
-			parent: &quot;a.firstChild&quot;,
-			empty: &quot;!a.firstChild&quot;,
-
-			// Text Check
-			contains: &quot;(a.textContent||a.innerText||jQuery(a).text()||'').indexOf(m[3])&gt;=0&quot;,
-
-			// Visibility
-			visible: '&quot;hidden&quot;!=a.type&amp;&amp;jQuery.css(a,&quot;display&quot;)!=&quot;none&quot;&amp;&amp;jQuery.css(a,&quot;visibility&quot;)!=&quot;hidden&quot;',
-			hidden: '&quot;hidden&quot;==a.type||jQuery.css(a,&quot;display&quot;)==&quot;none&quot;||jQuery.css(a,&quot;visibility&quot;)==&quot;hidden&quot;',
-
-			// Form attributes
-			enabled: &quot;!a.disabled&quot;,
-			disabled: &quot;a.disabled&quot;,
-			checked: &quot;a.checked&quot;,
-			selected: &quot;a.selected||jQuery.attr(a,'selected')&quot;,
-
-			// Form elements
-			text: &quot;'text'==a.type&quot;,
-			radio: &quot;'radio'==a.type&quot;,
-			checkbox: &quot;'checkbox'==a.type&quot;,
-			file: &quot;'file'==a.type&quot;,
-			password: &quot;'password'==a.type&quot;,
-			submit: &quot;'submit'==a.type&quot;,
-			image: &quot;'image'==a.type&quot;,
-			reset: &quot;'reset'==a.type&quot;,
-			button: '&quot;button&quot;==a.type||jQuery.nodeName(a,&quot;button&quot;)',
-			input: &quot;/input|select|textarea|button/i.test(a.nodeName)&quot;,
-
-			// :has()
-			has: &quot;jQuery.find(m[3],a).length&quot;,
-
-			// :header
-			header: &quot;/h\\d/i.test(a.nodeName)&quot;,
-
-			// :animated
-			animated: &quot;jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length&quot;
+		// Compute a unique ID for the element
+		if ( !id )
+			id = elem[ expando ] = ++uuid;
+
+		// Only generate the data cache if we're
+		// trying to access or manipulate it
+		if ( name &amp;&amp; !jQuery.cache[ id ] )
+			jQuery.cache[ id ] = {};
+
+		// Prevent overriding the named cache with undefined values
+		if ( data !== undefined )
+			jQuery.cache[ id ][ name ] = data;
+
+		// Return the named cache data, or the ID for the element
+		return name ?
+			jQuery.cache[ id ][ name ] :
+			id;
+	},
+
+	removeData: function( elem, name ) {
+		elem = elem == window ?
+			windowData :
+			elem;
+
+		var id = elem[ expando ];
+
+		// If we want to remove a specific section of the element's data
+		if ( name ) {
+			if ( jQuery.cache[ id ] ) {
+				// Remove the section of cache data
+				delete jQuery.cache[ id ][ name ];
+
+				// If we've removed all the data, remove the element's cache
+				name = &quot;&quot;;
+
+				for ( name in jQuery.cache[ id ] )
+					break;
+
+				if ( !name )
+					jQuery.removeData( elem );
+			}
+
+		// Otherwise, we want to remove all of the element's data
+		} else {
+			// Clean up the element expando
+			try {
+				delete elem[ expando ];
+			} catch(e){
+				// IE has trouble directly removing the expando
+				// but it's ok with using removeAttribute
+				if ( elem.removeAttribute )
+					elem.removeAttribute( expando );
+			}
+
+			// Completely remove the data cache
+			delete jQuery.cache[ id ];
 		}
 	},
+	queue: function( elem, type, data ) {
+		if ( elem ){
+	
+			type = (type || &quot;fx&quot;) + &quot;queue&quot;;
+	
+			var q = jQuery.data( elem, type );
 	
-	// The regular expressions that power the parsing engine
-	parse: [
-		// Match: [@value='test'], [@foo]
-		/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?&quot;?)(.*?)\4 *\]/,
+			if ( !q || jQuery.isArray(data) )
+				q = jQuery.data( elem, type, jQuery.makeArray(data) );
+			else if( data )
+				q.push( data );
+	
+		}
+		return q;
+	},
 
-		// Match: :contains('foo')
-		/^(:)([\w-]+)\(&quot;?'?(.*?(\(.*?\))?[^(]*?)&quot;?'?\)/,
+	dequeue: function( elem, type ){
+		var queue = jQuery.queue( elem, type ),
+			fn = queue.shift();
+		
+		if( !type || type === &quot;fx&quot; )
+			fn = queue[0];
+			
+		if( fn !== undefined )
+			fn.call(elem);
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ){
+		var parts = key.split(&quot;.&quot;);
+		parts[1] = parts[1] ? &quot;.&quot; + parts[1] : &quot;&quot;;
+
+		if ( value === undefined ) {
+			var data = this.triggerHandler(&quot;getData&quot; + parts[1] + &quot;!&quot;, [parts[0]]);
 
-		// Match: :even, :last-chlid, #id, .class
-		new RegExp(&quot;^([:.#]*)(&quot; + chars + &quot;+)&quot;)
-	],
+			if ( data === undefined &amp;&amp; this.length )
+				data = jQuery.data( this[0], key );
 
-	multiFilter: function( expr, elems, not ) {
-		var old, cur = [];
+			return data === undefined &amp;&amp; parts[1] ?
+				this.data( parts[0] ) :
+				data;
+		} else
+			return this.trigger(&quot;setData&quot; + parts[1] + &quot;!&quot;, [parts[0], value]).each(function(){
+				jQuery.data( this, key, value );
+			});
+	},
 
-		while ( expr &amp;&amp; expr != old ) {
-			old = expr;
-			var f = jQuery.filter( expr, elems, not );
-			expr = f.t.replace(/^\s*,\s*/, &quot;&quot; );
-			cur = not ? elems = f.r : jQuery.merge( cur, f.r );
+	removeData: function( key ){
+		return this.each(function(){
+			jQuery.removeData( this, key );
+		});
+	},
+	queue: function(type, data){
+		if ( typeof type !== &quot;string&quot; ) {
+			data = type;
+			type = &quot;fx&quot;;
 		}
 
-		return cur;
+		if ( data === undefined )
+			return jQuery.queue( this[0], type );
+
+		return this.each(function(){
+			var queue = jQuery.queue( this, type, data );
+			
+			 if( type == &quot;fx&quot; &amp;&amp; queue.length == 1 )
+				queue[0].call(this);
+		});
 	},
+	dequeue: function(type){
+		return this.each(function(){
+			jQuery.dequeue( this, type );
+		});
+	}
+});/*!
+ * Sizzle CSS Selector Engine - v0.9.1
+ *  Copyright 2009, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
 
-	find: function( t, context ) {
-		// Quickly handle non-string expressions
-		if ( typeof t != &quot;string&quot; )
-			return [ t ];
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|[^[\]]+)+\]|\\.|[^ &gt;+~,(\[]+)+|[&gt;+~])(\s*,\s*)?/g,
+	done = 0,
+	toString = Object.prototype.toString;
 
-		// check to make sure context is a DOM element or a document
-		if ( context &amp;&amp; context.nodeType != 1 &amp;&amp; context.nodeType != 9)
-			return [ ];
+var Sizzle = function(selector, context, results, seed) {
+	results = results || [];
+	context = context || document;
 
-		// Set the correct context (if none is provided)
-		context = context || document;
+	if ( context.nodeType !== 1 &amp;&amp; context.nodeType !== 9 )
+		return [];
+	
+	if ( !selector || typeof selector !== &quot;string&quot; ) {
+		return results;
+	}
 
-		// Initialize the search
-		var ret = [context], done = [], last, nodeName;
+	var parts = [], m, set, checkSet, check, mode, extra, prune = true;
+	
+	// Reset the position of the chunker regexp (start from head)
+	chunker.lastIndex = 0;
+	
+	while ( (m = chunker.exec(selector)) !== null ) {
+		parts.push( m[1] );
+		
+		if ( m[2] ) {
+			extra = RegExp.rightContext;
+			break;
+		}
+	}
 
-		// Continue while a selector expression exists, and while
-		// we're no longer looping upon ourselves
-		while ( t &amp;&amp; last != t ) {
-			var r = [];
-			last = t;
+	if ( parts.length &gt; 1 &amp;&amp; Expr.match.POS.exec( selector ) ) {
+		if ( parts.length === 2 &amp;&amp; Expr.relative[ parts[0] ] ) {
+			var later = &quot;&quot;, match;
 
-			t = jQuery.trim(t);
+			// Position selectors must be done after the filter
+			while ( (match = Expr.match.POS.exec( selector )) ) {
+				later += match[0];
+				selector = selector.replace( Expr.match.POS, &quot;&quot; );
+			}
 
-			var foundToken = false;
+			set = Sizzle.filter( later, Sizzle( selector, context ) );
+		} else {
+			set = Expr.relative[ parts[0] ] ?
+				[ context ] :
+				Sizzle( parts.shift(), context );
 
-			// An attempt at speeding up child selectors that
-			// point to a specific element tag
-			var re = quickChild;
-			var m = re.exec(t);
+			while ( parts.length ) {
+				var tmpSet = [];
 
-			if ( m ) {
-				nodeName = m[1].toUpperCase();
+				selector = parts.shift();
+				if ( Expr.relative[ selector ] )
+					selector += parts.shift();
 
-				// Perform our own iteration and filter
-				for ( var i = 0; ret[i]; i++ )
-					for ( var c = ret[i].firstChild; c; c = c.nextSibling )
-						if ( c.nodeType == 1 &amp;&amp; (nodeName == &quot;*&quot; || c.nodeName.toUpperCase() == nodeName) )
-							r.push( c );
+				for ( var i = 0, l = set.length; i &lt; l; i++ ) {
+					Sizzle( selector, set[i], tmpSet );
+				}
 
-				ret = r;
-				t = t.replace( re, &quot;&quot; );
-				if ( t.indexOf(&quot; &quot;) == 0 ) continue;
-				foundToken = true;
+				set = tmpSet;
+			}
+		}
+	} else {
+		var ret = seed ?
+			{ expr: parts.pop(), set: makeArray(seed) } :
+			Sizzle.find( parts.pop(), parts.length === 1 &amp;&amp; context.parentNode ? context.parentNode : context );
+		set = Sizzle.filter( ret.expr, ret.set );
+
+		if ( parts.length &gt; 0 ) {
+			checkSet = makeArray(set);
+		} else {
+			prune = false;
+		}
+
+		while ( parts.length ) {
+			var cur = parts.pop(), pop = cur;
+
+			if ( !Expr.relative[ cur ] ) {
+				cur = &quot;&quot;;
 			} else {
-				re = /^([&gt;+~])\s*(\w*)/i;
-
-				if ( (m = re.exec(t)) != null ) {
-					r = [];
-
-					var merge = {};
-					nodeName = m[2].toUpperCase();
-					m = m[1];
-
-					for ( var j = 0, rl = ret.length; j &lt; rl; j++ ) {
-						var n = m == &quot;~&quot; || m == &quot;+&quot; ? ret[j].nextSibling : ret[j].firstChild;
-						for ( ; n; n = n.nextSibling )
-							if ( n.nodeType == 1 ) {
-								var id = jQuery.data(n);
-
-								if ( m == &quot;~&quot; &amp;&amp; merge[id] ) break;
-								
-								if (!nodeName || n.nodeName.toUpperCase() == nodeName ) {
-									if ( m == &quot;~&quot; ) merge[id] = true;
-									r.push( n );
-								}
-								
-								if ( m == &quot;+&quot; ) break;
-							}
-					}
+				pop = parts.pop();
+			}
 
-					ret = r;
+			if ( pop == null ) {
+				pop = context;
+			}
 
-					// And remove the token
-					t = jQuery.trim( t.replace( re, &quot;&quot; ) );
-					foundToken = true;
+			Expr.relative[ cur ]( checkSet, pop, isXML(context) );
+		}
+	}
+
+	if ( !checkSet ) {
+		checkSet = set;
+	}
+
+	if ( !checkSet ) {
+		throw &quot;Syntax error, unrecognized expression: &quot; + (cur || selector);
+	}
+
+	if ( toString.call(checkSet) === &quot;[object Array]&quot; ) {
+		if ( !prune ) {
+			results.push.apply( results, checkSet );
+		} else if ( context.nodeType === 1 ) {
+			for ( var i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] &amp;&amp; (checkSet[i] === true || checkSet[i].nodeType === 1 &amp;&amp; contains(context, checkSet[i])) ) {
+					results.push( set[i] );
+				}
+			}
+		} else {
+			for ( var i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] &amp;&amp; checkSet[i].nodeType === 1 ) {
+					results.push( set[i] );
 				}
 			}
+		}
+	} else {
+		makeArray( checkSet, results );
+	}
 
-			// See if there's still an expression, and that we haven't already
-			// matched a token
-			if ( t &amp;&amp; !foundToken ) {
-				// Handle multiple expressions
-				if ( !t.indexOf(&quot;,&quot;) ) {
-					// Clean the result set
-					if ( context == ret[0] ) ret.shift();
+	if ( extra ) {
+		Sizzle( extra, context, results, seed );
+	}
 
-					// Merge the result sets
-					done = jQuery.merge( done, ret );
+	return results;
+};
 
-					// Reset the context
-					r = ret = [context];
+Sizzle.matches = function(expr, set){
+	return Sizzle(expr, null, null, set);
+};
 
-					// Touch up the selector string
-					t = &quot; &quot; + t.substr(1,t.length);
+Sizzle.find = function(expr, context){
+	var set, match;
 
-				} else {
-					// Optimize for the case nodeName#idName
-					var re2 = quickID;
-					var m = re2.exec(t);
-					
-					// Re-organize the results, so that they're consistent
-					if ( m ) {
-						m = [ 0, m[2], m[3], m[1] ];
-
-					} else {
-						// Otherwise, do a traditional filter check for
-						// ID, class, and element selectors
-						re2 = quickClass;
-						m = re2.exec(t);
-					}
+	if ( !expr ) {
+		return [];
+	}
 
-					m[2] = m[2].replace(/\\/g, &quot;&quot;);
+	for ( var i = 0, l = Expr.order.length; i &lt; l; i++ ) {
+		var type = Expr.order[i], match;
+		
+		if ( (match = Expr.match[ type ].exec( expr )) ) {
+			var left = RegExp.leftContext;
+
+			if ( left.substr( left.length - 1 ) !== &quot;\\&quot; ) {
+				match[1] = (match[1] || &quot;&quot;).replace(/\\/g, &quot;&quot;);
+				set = Expr.find[ type ]( match, context );
+				if ( set != null ) {
+					expr = expr.replace( Expr.match[ type ], &quot;&quot; );
+					break;
+				}
+			}
+		}
+	}
 
-					var elem = ret[ret.length-1];
+	if ( !set ) {
+		set = context.getElementsByTagName(&quot;*&quot;);
+	}
 
-					// Try to do a global search by ID, where we can
-					if ( m[1] == &quot;#&quot; &amp;&amp; elem &amp;&amp; elem.getElementById &amp;&amp; !jQuery.isXMLDoc(elem) ) {
-						// Optimization for HTML document case
-						var oid = elem.getElementById(m[2]);
-						
-						// Do a quick check for the existence of the actual ID attribute
-						// to avoid selecting by the name attribute in IE
-						// also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form
-						if ( (jQuery.browser.msie||jQuery.browser.opera) &amp;&amp; oid &amp;&amp; typeof oid.id == &quot;string&quot; &amp;&amp; oid.id != m[2] )
-							oid = jQuery('[@id=&quot;'+m[2]+'&quot;]', elem)[0];
-
-						// Do a quick check for node name (where applicable) so
-						// that div#foo searches will be really fast
-						ret = r = oid &amp;&amp; (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];
-					} else {
-						// We need to find all descendant elements
-						for ( var i = 0; ret[i]; i++ ) {
-							// Grab the tag name being searched for
-							var tag = m[1] == &quot;#&quot; &amp;&amp; m[3] ? m[3] : m[1] != &quot;&quot; || m[0] == &quot;&quot; ? &quot;*&quot; : m[2];
+	return {set: set, expr: expr};
+};
 
-							// Handle IE7 being really dumb about &lt;object&gt;s
-							if ( tag == &quot;*&quot; &amp;&amp; ret[i].nodeName.toLowerCase() == &quot;object&quot; )
-								tag = &quot;param&quot;;
+Sizzle.filter = function(expr, set, inplace, not){
+	var old = expr, result = [], curLoop = set, match, anyFound;
 
-							r = jQuery.merge( r, ret[i].getElementsByTagName( tag ));
-						}
+	while ( expr &amp;&amp; set.length ) {
+		for ( var type in Expr.filter ) {
+			if ( (match = Expr.match[ type ].exec( expr )) != null ) {
+				var filter = Expr.filter[ type ], goodArray = null, goodPos = 0, found, item;
+				anyFound = false;
 
-						// It's faster to filter by class and be done with it
-						if ( m[1] == &quot;.&quot; )
-							r = jQuery.classFilter( r, m[2] );
+				if ( curLoop == result ) {
+					result = [];
+				}
 
-						// Same with ID filtering
-						if ( m[1] == &quot;#&quot; ) {
-							var tmp = [];
+				if ( Expr.preFilter[ type ] ) {
+					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not );
+
+					if ( !match ) {
+						anyFound = found = true;
+					} else if ( match === true ) {
+						continue;
+					} else if ( match[0] === true ) {
+						goodArray = [];
+						var last = null, elem;
+						for ( var i = 0; (elem = curLoop[i]) !== undefined; i++ ) {
+							if ( elem &amp;&amp; last !== elem ) {
+								goodArray.push( elem );
+								last = elem;
+							}
+						}
+					}
+				}
 
-							// Try to find the element with the ID
-							for ( var i = 0; r[i]; i++ )
-								if ( r[i].getAttribute(&quot;id&quot;) == m[2] ) {
-									tmp = [ r[i] ];
-									break;
+				if ( match ) {
+					for ( var i = 0; (item = curLoop[i]) !== undefined; i++ ) {
+						if ( item ) {
+							if ( goodArray &amp;&amp; item != goodArray[goodPos] ) {
+								goodPos++;
+							}
+	
+							found = filter( item, match, goodPos, goodArray );
+							var pass = not ^ !!found;
+
+							if ( inplace &amp;&amp; found != null ) {
+								if ( pass ) {
+									anyFound = true;
+								} else {
+									curLoop[i] = false;
 								}
-
-							r = tmp;
+							} else if ( pass ) {
+								result.push( item );
+								anyFound = true;
+							}
 						}
+					}
+				}
 
-						ret = r;
+				if ( found !== undefined ) {
+					if ( !inplace ) {
+						curLoop = result;
 					}
 
-					t = t.replace( re2, &quot;&quot; );
-				}
+					expr = expr.replace( Expr.match[ type ], &quot;&quot; );
 
-			}
+					if ( !anyFound ) {
+						return [];
+					}
 
-			// If a selector string still exists
-			if ( t ) {
-				// Attempt to filter it
-				var val = jQuery.filter(t,r);
-				ret = r = val.r;
-				t = jQuery.trim(val.t);
+					break;
+				}
 			}
 		}
 
-		// An error occurred with the selector;
-		// just return an empty set instead
-		if ( t )
-			ret = [];
+		expr = expr.replace(/\s*,\s*/, &quot;&quot;);
 
-		// Remove the root context
-		if ( ret &amp;&amp; context == ret[0] )
-			ret.shift();
+		// Improper expression
+		if ( expr == old ) {
+			if ( anyFound == null ) {
+				throw &quot;Syntax error, unrecognized expression: &quot; + expr;
+			} else {
+				break;
+			}
+		}
 
-		// And combine the results
-		done = jQuery.merge( done, ret );
+		old = expr;
+	}
 
-		return done;
-	},
+	return curLoop;
+};
 
-	classFilter: function(r,m,not){
-		m = &quot; &quot; + m + &quot; &quot;;
-		var tmp = [];
-		for ( var i = 0; r[i]; i++ ) {
-			var pass = (&quot; &quot; + r[i].className + &quot; &quot;).indexOf( m ) &gt;= 0;
-			if ( !not &amp;&amp; pass || not &amp;&amp; !pass )
-				tmp.push( r[i] );
-		}
-		return tmp;
+var Expr = Sizzle.selectors = {
+	order: [ &quot;ID&quot;, &quot;NAME&quot;, &quot;TAG&quot; ],
+	match: {
+		ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
+		CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
+		NAME: /\[name=['&quot;]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['&quot;]*\]/,
+		ATTR: /\[((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['&quot;]*)(.*?)\3|)\]/,
+		TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,
+		CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
+		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
+		PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['&quot;]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
 	},
+	attrMap: {
+		&quot;class&quot;: &quot;className&quot;,
+		&quot;for&quot;: &quot;htmlFor&quot;
+	},
+	relative: {
+		&quot;+&quot;: function(checkSet, part){
+			for ( var i = 0, l = checkSet.length; i &lt; l; i++ ) {
+				var elem = checkSet[i];
+				if ( elem ) {
+					var cur = elem.previousSibling;
+					while ( cur &amp;&amp; cur.nodeType !== 1 ) {
+						cur = cur.previousSibling;
+					}
+					checkSet[i] = typeof part === &quot;string&quot; ?
+						cur || false :
+						cur === part;
+				}
+			}
 
-	filter: function(t,r,not) {
-		var last;
+			if ( typeof part === &quot;string&quot; ) {
+				Sizzle.filter( part, checkSet, true );
+			}
+		},
+		&quot;&gt;&quot;: function(checkSet, part, isXML){
+			if ( typeof part === &quot;string&quot; &amp;&amp; !/\W/.test(part) ) {
+				part = isXML ? part : part.toUpperCase();
+
+				for ( var i = 0, l = checkSet.length; i &lt; l; i++ ) {
+					var elem = checkSet[i];
+					if ( elem ) {
+						var parent = elem.parentNode;
+						checkSet[i] = parent.nodeName === part ? parent : false;
+					}
+				}
+			} else {
+				for ( var i = 0, l = checkSet.length; i &lt; l; i++ ) {
+					var elem = checkSet[i];
+					if ( elem ) {
+						checkSet[i] = typeof part === &quot;string&quot; ?
+							elem.parentNode :
+							elem.parentNode === part;
+					}
+				}
 
-		// Look for common filter expressions
-		while ( t &amp;&amp; t != last ) {
-			last = t;
+				if ( typeof part === &quot;string&quot; ) {
+					Sizzle.filter( part, checkSet, true );
+				}
+			}
+		},
+		&quot;&quot;: function(checkSet, part, isXML){
+			var doneName = &quot;done&quot; + (done++), checkFn = dirCheck;
 
-			var p = jQuery.parse, m;
+			if ( !part.match(/\W/) ) {
+				var nodeCheck = part = isXML ? part : part.toUpperCase();
+				checkFn = dirNodeCheck;
+			}
 
-			for ( var i = 0; p[i]; i++ ) {
-				m = p[i].exec( t );
+			checkFn(&quot;parentNode&quot;, part, doneName, checkSet, nodeCheck);
+		},
+		&quot;~&quot;: function(checkSet, part, isXML){
+			var doneName = &quot;done&quot; + (done++), checkFn = dirCheck;
 
-				if ( m ) {
-					// Remove what we just matched
-					t = t.substring( m[0].length );
+			if ( typeof part === &quot;string&quot; &amp;&amp; !part.match(/\W/) ) {
+				var nodeCheck = part = isXML ? part : part.toUpperCase();
+				checkFn = dirNodeCheck;
+			}
 
-					m[2] = m[2].replace(/\\/g, &quot;&quot;);
-					break;
+			checkFn(&quot;previousSibling&quot;, part, doneName, checkSet, nodeCheck);
+		}
+	},
+	find: {
+		ID: function(match, context){
+			if ( context.getElementById ) {
+				var m = context.getElementById(match[1]);
+				return m ? [m] : [];
+			}
+		},
+		NAME: function(match, context){
+			return context.getElementsByName ? context.getElementsByName(match[1]) : null;
+		},
+		TAG: function(match, context){
+			return context.getElementsByTagName(match[1]);
+		}
+	},
+	preFilter: {
+		CLASS: function(match, curLoop, inplace, result, not){
+			match = &quot; &quot; + match[1].replace(/\\/g, &quot;&quot;) + &quot; &quot;;
+
+			for ( var i = 0; curLoop[i]; i++ ) {
+				if ( not ^ (&quot; &quot; + curLoop[i].className + &quot; &quot;).indexOf(match) &gt;= 0 ) {
+					if ( !inplace )
+						result.push( curLoop[i] );
+				} else if ( inplace ) {
+					curLoop[i] = false;
 				}
 			}
 
-			if ( !m )
-				break;
+			return false;
+		},
+		ID: function(match){
+			return match[1].replace(/\\/g, &quot;&quot;);
+		},
+		TAG: function(match, curLoop){
+			for ( var i = 0; !curLoop[i]; i++ ){}
+			return isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
+		},
+		CHILD: function(match){
+			if ( match[1] == &quot;nth&quot; ) {
+				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+				var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
+					match[2] == &quot;even&quot; &amp;&amp; &quot;2n&quot; || match[2] == &quot;odd&quot; &amp;&amp; &quot;2n+1&quot; ||
+					!/\D/.test( match[2] ) &amp;&amp; &quot;0n+&quot; + match[2] || match[2]);
+
+				// calculate the numbers (first)n+(last) including if they are negative
+				match[2] = (test[1] + (test[2] || 1)) - 0;
+				match[3] = test[3] - 0;
+			}
 
-			// :not() is a special case that can be optimized by
-			// keeping it out of the expression list
-			if ( m[1] == &quot;:&quot; &amp;&amp; m[2] == &quot;not&quot; )
-				// optimize if only one selector found (most common case)
-				r = isSimple.test( m[3] ) ?
-					jQuery.filter(m[3], r, true).r :
-					jQuery( r ).not( m[3] );
+			// TODO: Move to normal caching system
+			match[0] = &quot;done&quot; + (done++);
 
-			// We can get a big speed boost by filtering by class here
-			else if ( m[1] == &quot;.&quot; )
-				r = jQuery.classFilter(r, m[2], not);
+			return match;
+		},
+		ATTR: function(match){
+			var name = match[1];
+			
+			if ( Expr.attrMap[name] ) {
+				match[1] = Expr.attrMap[name];
+			}
 
-			else if ( m[1] == &quot;[&quot; ) {
-				var tmp = [], type = m[3];
-				
-				for ( var i = 0, rl = r.length; i &lt; rl; i++ ) {
-					var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ];
-					
-					if ( z == null || /href|src|selected/.test(m[2]) )
-						z = jQuery.attr(a,m[2]) || '';
-
-					if ( (type == &quot;&quot; &amp;&amp; !!z ||
-						 type == &quot;=&quot; &amp;&amp; z == m[5] ||
-						 type == &quot;!=&quot; &amp;&amp; z != m[5] ||
-						 type == &quot;^=&quot; &amp;&amp; z &amp;&amp; !z.indexOf(m[5]) ||
-						 type == &quot;$=&quot; &amp;&amp; z.substr(z.length - m[5].length) == m[5] ||
-						 (type == &quot;*=&quot; || type == &quot;~=&quot;) &amp;&amp; z.indexOf(m[5]) &gt;= 0) ^ not )
-							tmp.push( a );
+			if ( match[2] === &quot;~=&quot; ) {
+				match[4] = &quot; &quot; + match[4] + &quot; &quot;;
+			}
+
+			return match;
+		},
+		PSEUDO: function(match, curLoop, inplace, result, not){
+			if ( match[1] === &quot;not&quot; ) {
+				// If we're dealing with a complex expression, or a simple one
+				if ( match[3].match(chunker).length &gt; 1 ) {
+					match[3] = Sizzle(match[3], null, null, curLoop);
+				} else {
+					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+					if ( !inplace ) {
+						result.push.apply( result, ret );
+					}
+					return false;
 				}
-				
-				r = tmp;
-
-			// We can get a speed boost by handling nth-child here
-			} else if ( m[1] == &quot;:&quot; &amp;&amp; m[2] == &quot;nth-child&quot; ) {
-				var merge = {}, tmp = [],
-					// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
-					test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
-						m[3] == &quot;even&quot; &amp;&amp; &quot;2n&quot; || m[3] == &quot;odd&quot; &amp;&amp; &quot;2n+1&quot; ||
-						!/\D/.test(m[3]) &amp;&amp; &quot;0n+&quot; + m[3] || m[3]),
-					// calculate the numbers (first)n+(last) including if they are negative
-					first = (test[1] + (test[2] || 1)) - 0, last = test[3] - 0;
- 
-				// loop through all the elements left in the jQuery object
-				for ( var i = 0, rl = r.length; i &lt; rl; i++ ) {
-					var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode);
-
-					if ( !merge[id] ) {
-						var c = 1;
-
-						for ( var n = parentNode.firstChild; n; n = n.nextSibling )
-							if ( n.nodeType == 1 )
-								n.nodeIndex = c++;
-
-						merge[id] = true;
+			} else if ( Expr.match.POS.test( match[0] ) ) {
+				return true;
+			}
+			
+			return match;
+		},
+		POS: function(match){
+			match.unshift( true );
+			return match;
+		}
+	},
+	filters: {
+		enabled: function(elem){
+			return elem.disabled === false &amp;&amp; elem.type !== &quot;hidden&quot;;
+		},
+		disabled: function(elem){
+			return elem.disabled === true;
+		},
+		checked: function(elem){
+			return elem.checked === true;
+		},
+		selected: function(elem){
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			elem.parentNode.selectedIndex;
+			return elem.selected === true;
+		},
+		parent: function(elem){
+			return !!elem.firstChild;
+		},
+		empty: function(elem){
+			return !elem.firstChild;
+		},
+		has: function(elem, i, match){
+			return !!Sizzle( match[3], elem ).length;
+		},
+		header: function(elem){
+			return /h\d/i.test( elem.nodeName );
+		},
+		text: function(elem){
+			return &quot;text&quot; === elem.type;
+		},
+		radio: function(elem){
+			return &quot;radio&quot; === elem.type;
+		},
+		checkbox: function(elem){
+			return &quot;checkbox&quot; === elem.type;
+		},
+		file: function(elem){
+			return &quot;file&quot; === elem.type;
+		},
+		password: function(elem){
+			return &quot;password&quot; === elem.type;
+		},
+		submit: function(elem){
+			return &quot;submit&quot; === elem.type;
+		},
+		image: function(elem){
+			return &quot;image&quot; === elem.type;
+		},
+		reset: function(elem){
+			return &quot;reset&quot; === elem.type;
+		},
+		button: function(elem){
+			return &quot;button&quot; === elem.type || elem.nodeName.toUpperCase() === &quot;BUTTON&quot;;
+		},
+		input: function(elem){
+			return /input|select|textarea|button/i.test(elem.nodeName);
+		}
+	},
+	setFilters: {
+		first: function(elem, i){
+			return i === 0;
+		},
+		last: function(elem, i, match, array){
+			return i === array.length - 1;
+		},
+		even: function(elem, i){
+			return i % 2 === 0;
+		},
+		odd: function(elem, i){
+			return i % 2 === 1;
+		},
+		lt: function(elem, i, match){
+			return i &lt; match[3] - 0;
+		},
+		gt: function(elem, i, match){
+			return i &gt; match[3] - 0;
+		},
+		nth: function(elem, i, match){
+			return match[3] - 0 == i;
+		},
+		eq: function(elem, i, match){
+			return match[3] - 0 == i;
+		}
+	},
+	filter: {
+		CHILD: function(elem, match){
+			var type = match[1], parent = elem.parentNode;
+
+			var doneName = &quot;child&quot; + parent.childNodes.length;
+			
+			if ( parent &amp;&amp; (!parent[ doneName ] || !elem.nodeIndex) ) {
+				var count = 1;
+
+				for ( var node = parent.firstChild; node; node = node.nextSibling ) {
+					if ( node.nodeType == 1 ) {
+						node.nodeIndex = count++;
 					}
+				}
 
-					var add = false;
+				parent[ doneName ] = count - 1;
+			}
+
+			if ( type == &quot;first&quot; ) {
+				return elem.nodeIndex == 1;
+			} else if ( type == &quot;last&quot; ) {
+				return elem.nodeIndex == parent[ doneName ];
+			} else if ( type == &quot;only&quot; ) {
+				return parent[ doneName ] == 1;
+			} else if ( type == &quot;nth&quot; ) {
+				var add = false, first = match[2], last = match[3];
+
+				if ( first == 1 &amp;&amp; last == 0 ) {
+					return true;
+				}
 
-					if ( first == 0 ) {
-						if ( node.nodeIndex == last )
-							add = true;
-					} else if ( (node.nodeIndex - last) % first == 0 &amp;&amp; (node.nodeIndex - last) / first &gt;= 0 )
+				if ( first == 0 ) {
+					if ( elem.nodeIndex == last ) {
 						add = true;
+					}
+				} else if ( (elem.nodeIndex - last) % first == 0 &amp;&amp; (elem.nodeIndex - last) / first &gt;= 0 ) {
+					add = true;
+				}
 
-					if ( add ^ not )
-						tmp.push( node );
+				return add;
+			}
+		},
+		PSEUDO: function(elem, match, i, array){
+			var name = match[1], filter = Expr.filters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			} else if ( name === &quot;contains&quot; ) {
+				return (elem.textContent || elem.innerText || &quot;&quot;).indexOf(match[3]) &gt;= 0;
+			} else if ( name === &quot;not&quot; ) {
+				var not = match[3];
+
+				for ( var i = 0, l = not.length; i &lt; l; i++ ) {
+					if ( not[i] === elem ) {
+						return false;
+					}
 				}
 
-				r = tmp;
+				return true;
+			}
+		},
+		ID: function(elem, match){
+			return elem.nodeType === 1 &amp;&amp; elem.getAttribute(&quot;id&quot;) === match;
+		},
+		TAG: function(elem, match){
+			return (match === &quot;*&quot; &amp;&amp; elem.nodeType === 1) || elem.nodeName === match;
+		},
+		CLASS: function(elem, match){
+			return match.test( elem.className );
+		},
+		ATTR: function(elem, match){
+			var result = elem[ match[1] ] || elem.getAttribute( match[1] ), value = result + &quot;&quot;, type = match[2], check = match[4];
+			return result == null ?
+				false :
+				type === &quot;=&quot; ?
+				value === check :
+				type === &quot;*=&quot; ?
+				value.indexOf(check) &gt;= 0 :
+				type === &quot;~=&quot; ?
+				(&quot; &quot; + value + &quot; &quot;).indexOf(check) &gt;= 0 :
+				!match[4] ?
+				result :
+				type === &quot;!=&quot; ?
+				value != check :
+				type === &quot;^=&quot; ?
+				value.indexOf(check) === 0 :
+				type === &quot;$=&quot; ?
+				value.substr(value.length - check.length) === check :
+				type === &quot;|=&quot; ?
+				value === check || value.substr(0, check.length + 1) === check + &quot;-&quot; :
+				false;
+		},
+		POS: function(elem, match, i, array){
+			var name = match[2], filter = Expr.setFilters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			}
+		}
+	}
+};
+
+for ( var type in Expr.match ) {
+	Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
+}
+
+var makeArray = function(array, results) {
+	array = Array.prototype.slice.call( array );
+
+	if ( results ) {
+		results.push.apply( results, array );
+		return results;
+	}
+	
+	return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+try {
+	Array.prototype.slice.call( document.documentElement.childNodes );
+
+// Provide a fallback method if it does not work
+} catch(e){
+	makeArray = function(array, results) {
+		var ret = results || [];
 
-			// Otherwise, find the expression to execute
+		if ( toString.call(array) === &quot;[object Array]&quot; ) {
+			Array.prototype.push.apply( ret, array );
+		} else {
+			if ( typeof array.length === &quot;number&quot; ) {
+				for ( var i = 0, l = array.length; i &lt; l; i++ ) {
+					ret.push( array[i] );
+				}
 			} else {
-				var f = jQuery.expr[m[1]];
-				if ( typeof f != &quot;string&quot; )
-					f = jQuery.expr[m[1]][m[2]];
+				for ( var i = 0; array[i]; i++ ) {
+					ret.push( array[i] );
+				}
+			}
+		}
 
-				// Build a custom macro to enclose it
-				f = eval(&quot;false||function(a,i){return &quot; + f + &quot;}&quot;);
+		return ret;
+	};
+}
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+	// We're going to inject a fake input element with a specified name
+	var form = document.createElement(&quot;form&quot;),
+		id = &quot;script&quot; + (new Date).getTime();
+	form.innerHTML = &quot;&lt;input name='&quot; + id + &quot;'/&gt;&quot;;
+
+	// Inject it into the root element, check its status, and remove it quickly
+	var root = document.documentElement;
+	root.insertBefore( form, root.firstChild );
+
+	// The workaround has to do additional checks after a getElementById
+	// Which slows things down for other browsers (hence the branching)
+	if ( !!document.getElementById( id ) ) {
+		Expr.find.ID = function(match, context){
+			if ( context.getElementById ) {
+				var m = context.getElementById(match[1]);
+				return m ? m.id === match[1] || m.getAttributeNode &amp;&amp; m.getAttributeNode(&quot;id&quot;).nodeValue === match[1] ? [m] : undefined : [];
+			}
+		};
+
+		Expr.filter.ID = function(elem, match){
+			var node = elem.getAttributeNode &amp;&amp; elem.getAttributeNode(&quot;id&quot;);
+			return elem.nodeType === 1 &amp;&amp; node &amp;&amp; node.nodeValue === match;
+		};
+	}
+
+	root.removeChild( form );
+})();
+
+// Check to see if the browser returns only elements
+// when doing getElementsByTagName(&quot;*&quot;)
+(function(){
+	// Create a fake element
+	var div = document.createElement(&quot;div&quot;);
+	div.appendChild( document.createComment(&quot;&quot;) );
+
+	// Make sure no comments are found
+	if ( div.getElementsByTagName(&quot;*&quot;).length &gt; 0 ) {
+		Expr.find.TAG = function(match, context){
+			var results = context.getElementsByTagName(match[1]);
+
+			// Filter out possible comments
+			if ( match[1] === &quot;*&quot; ) {
+				var tmp = [];
+
+				for ( var i = 0; results[i]; i++ ) {
+					if ( results[i].nodeType === 1 ) {
+						tmp.push( results[i] );
+					}
+				}
 
-				// Execute it against the current filter
-				r = jQuery.grep( r, f, not );
+				results = tmp;
 			}
+
+			return results;
+		};
+	}
+})();
+
+if ( document.querySelectorAll ) (function(){
+	var oldSizzle = Sizzle;
+	
+	Sizzle = function(query, context, extra, seed){
+		context = context || document;
+
+		if ( !seed &amp;&amp; context.nodeType === 9 ) {
+			try {
+				return makeArray( context.querySelectorAll(query), extra );
+			} catch(e){}
 		}
+		
+		return oldSizzle(query, context, extra, seed);
+	};
 
-		// Return an array of filtered elements (r)
-		// and the modified expression string (t)
-		return { r: r, t: t };
-	},
+	Sizzle.find = oldSizzle.find;
+	Sizzle.filter = oldSizzle.filter;
+	Sizzle.selectors = oldSizzle.selectors;
+	Sizzle.matches = oldSizzle.matches;
+})();
 
-	dir: function( elem, dir ){
-		var matched = [];
-		var cur = elem[dir];
-		while ( cur &amp;&amp; cur != document ) {
-			if ( cur.nodeType == 1 )
-				matched.push( cur );
-			cur = cur[dir];
+if ( document.documentElement.getElementsByClassName ) {
+	Expr.order.splice(1, 0, &quot;CLASS&quot;);
+	Expr.find.CLASS = function(match, context) {
+		return context.getElementsByClassName(match[1]);
+	};
+}
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck ) {
+	for ( var i = 0, l = checkSet.length; i &lt; l; i++ ) {
+		var elem = checkSet[i];
+		if ( elem ) {
+			elem = elem[dir];
+			var match = false;
+
+			while ( elem &amp;&amp; elem.nodeType ) {
+				var done = elem[doneName];
+				if ( done ) {
+					match = checkSet[ done ];
+					break;
+				}
+
+				if ( elem.nodeType === 1 )
+					elem[doneName] = i;
+
+				if ( elem.nodeName === cur ) {
+					match = elem;
+					break;
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
 		}
-		return matched;
-	},
-	
-	nth: function(cur,result,dir,elem){
-		result = result || 1;
-		var num = 0;
+	}
+}
 
-		for ( ; cur; cur = cur[dir] )
-			if ( cur.nodeType == 1 &amp;&amp; ++num == result )
-				break;
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck ) {
+	for ( var i = 0, l = checkSet.length; i &lt; l; i++ ) {
+		var elem = checkSet[i];
+		if ( elem ) {
+			elem = elem[dir];
+			var match = false;
 
-		return cur;
-	},
-	
-	sibling: function( n, elem ) {
-		var r = [];
+			while ( elem &amp;&amp; elem.nodeType ) {
+				if ( elem[doneName] ) {
+					match = checkSet[ elem[doneName] ];
+					break;
+				}
+
+				if ( elem.nodeType === 1 ) {
+					elem[doneName] = i;
 
-		for ( ; n; n = n.nextSibling ) {
-			if ( n.nodeType == 1 &amp;&amp; (!elem || n != elem) )
-				r.push( n );
+					if ( typeof cur !== &quot;string&quot; ) {
+						if ( elem === cur ) {
+							match = true;
+							break;
+						}
+
+					} else if ( Sizzle.filter( cur, [elem] ).length &gt; 0 ) {
+						match = elem;
+						break;
+					}
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
 		}
+	}
+}
+
+var contains = document.compareDocumentPosition ?  function(a, b){
+	return a.compareDocumentPosition(b) &amp; 16;
+} : function(a, b){
+	return a !== b &amp;&amp; (a.contains ? a.contains(b) : true);
+};
+
+var isXML = function(elem){
+	return elem.documentElement &amp;&amp; !elem.body ||
+		elem.tagName &amp;&amp; elem.ownerDocument &amp;&amp; !elem.ownerDocument.body;
+};
+
+// EXPOSE
+jQuery.find = Sizzle;
+jQuery.filter = Sizzle.filter;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[&quot;:&quot;] = jQuery.expr.filters;
+
+Sizzle.selectors.filters.hidden = function(elem){
+	return &quot;hidden&quot; === elem.type ||
+		jQuery.css(elem, &quot;display&quot;) === &quot;none&quot; ||
+		jQuery.css(elem, &quot;visibility&quot;) === &quot;hidden&quot;;
+};
+
+Sizzle.selectors.filters.visible = function(elem){
+	return &quot;hidden&quot; !== elem.type &amp;&amp;
+		jQuery.css(elem, &quot;display&quot;) !== &quot;none&quot; &amp;&amp;
+		jQuery.css(elem, &quot;visibility&quot;) !== &quot;hidden&quot;;
+};
+
+Sizzle.selectors.filters.animated = function(elem){
+	return jQuery.grep(jQuery.timers, function(fn){
+		return elem === fn.elem;
+	}).length;
+};
 
-		return r;
+jQuery.multiFilter = function( expr, elems, not ) {
+	if ( not ) {
+		expr = &quot;:not(&quot; + expr + &quot;)&quot;;
 	}
-});
 
+	return Sizzle.matches(expr, elems);
+};
+
+jQuery.dir = function( elem, dir ){
+	var matched = [], cur = elem[dir];
+	while ( cur &amp;&amp; cur != document ) {
+		if ( cur.nodeType == 1 )
+			matched.push( cur );
+		cur = cur[dir];
+	}
+	return matched;
+};
+
+jQuery.nth = function(cur, result, dir, elem){
+	result = result || 1;
+	var num = 0;
+
+	for ( ; cur; cur = cur[dir] )
+		if ( cur.nodeType == 1 &amp;&amp; ++num == result )
+			break;
+
+	return cur;
+};
+
+jQuery.sibling = function(n, elem){
+	var r = [];
+
+	for ( ; n; n = n.nextSibling ) {
+		if ( n.nodeType == 1 &amp;&amp; n != elem )
+			r.push( n );
+	}
+
+	return r;
+};
+
+return;
+
+window.Sizzle = Sizzle;
+
+})();
 /*
  * A number of helper functions used for managing events.
- * Many of the ideas behind this code orignated from 
+ * Many of the ideas behind this code originated from
  * Dean Edwards' addEvent library.
  */
 jQuery.event = {
@@ -1804,80 +2302,78 @@ jQuery.event = {
 
 		// For whatever reason, IE has trouble passing the window object
 		// around, causing it to be cloned in the process
-		if ( jQuery.browser.msie &amp;&amp; elem.setInterval != undefined )
+		if ( elem.setInterval &amp;&amp; elem != window )
 			elem = window;
 
 		// Make sure that the function being executed has a unique ID
 		if ( !handler.guid )
 			handler.guid = this.guid++;
-			
-		// if data is passed, bind to handler 
-		if( data != undefined ) { 
-			// Create temporary function pointer to original handler 
-			var fn = handler; 
-
-			// Create unique handler function, wrapped around original handler 
-			handler = function() { 
-				// Pass arguments and context to original handler 
-				return fn.apply(this, arguments); 
-			};
 
-			// Store data in unique handler 
-			handler.data = data;
+		// if data is passed, bind to handler
+		if ( data !== undefined ) {
+			// Create temporary function pointer to original handler
+			var fn = handler;
 
-			// Set the guid of unique handler to the same of original handler, so it can be removed 
-			handler.guid = fn.guid;
+			// Create unique handler function, wrapped around original handler
+			handler = this.proxy( fn );
+
+			// Store data in unique handler
+			handler.data = data;
 		}
 
 		// Init the element's event structure
 		var events = jQuery.data(elem, &quot;events&quot;) || jQuery.data(elem, &quot;events&quot;, {}),
 			handle = jQuery.data(elem, &quot;handle&quot;) || jQuery.data(elem, &quot;handle&quot;, function(){
-				// returned undefined or false
-				var val;
-
 				// Handle the second event of a trigger and when
 				// an event is called after a page has unloaded
-				if ( typeof jQuery == &quot;undefined&quot; || jQuery.event.triggered )
-					return val;
-		
-				val = jQuery.event.handle.apply(elem, arguments);
-		
-				return val;
+				return typeof jQuery !== &quot;undefined&quot; &amp;&amp; !jQuery.event.triggered ?
+					jQuery.event.handle.apply(arguments.callee.elem, arguments) :
+					undefined;
 			});
+		// Add elem as a property of the handle function
+		// This is to prevent a memory leak with non-native
+		// event in IE.
+		handle.elem = elem;
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind(&quot;mouseover mouseout&quot;, fn);
+		jQuery.each(types.split(/\s+/), function(index, type) {
+			// Namespaced event handlers
+			var namespaces = type.split(&quot;.&quot;);
+			type = namespaces.shift();
+			handler.type = namespaces.slice().sort().join(&quot;.&quot;);
+
+			// Get the current list of functions bound to this event
+			var handlers = events[type];
 			
-			// Handle multiple events seperated by a space
-			// jQuery(...).bind(&quot;mouseover mouseout&quot;, fn);
-			jQuery.each(types.split(/\s+/), function(index, type) {
-				// Namespaced event handlers
-				var parts = type.split(&quot;.&quot;);
-				type = parts[0];
-				handler.type = parts[1];
-
-				// Get the current list of functions bound to this event
-				var handlers = events[type];
-
-				// Init the event handler queue
-				if (!handlers) {
-					handlers = events[type] = {};
-		
-					// Check for a special event handler
-					// Only use addEventListener/attachEvent if the special
-					// events handler returns false
-					if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem) === false ) {
-						// Bind the global event handler to the element
-						if (elem.addEventListener)
-							elem.addEventListener(type, handle, false);
-						else if (elem.attachEvent)
-							elem.attachEvent(&quot;on&quot; + type, handle);
-					}
+			if ( jQuery.event.specialAll[type] )
+				jQuery.event.specialAll[type].setup.call(elem, data, namespaces);
+
+			// Init the event handler queue
+			if (!handlers) {
+				handlers = events[type] = {};
+
+				// Check for a special event handler
+				// Only use addEventListener/attachEvent if the special
+				// events handler returns false
+				if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) {
+					// Bind the global event handler to the element
+					if (elem.addEventListener)
+						elem.addEventListener(type, handle, false);
+					else if (elem.attachEvent)
+						elem.attachEvent(&quot;on&quot; + type, handle);
 				}
+			}
 
-				// Add the function to the element's handler list
-				handlers[handler.guid] = handler;
+			// Add the function to the element's handler list
+			handlers[handler.guid] = handler;
 
-				// Keep track of which events have been used, for global triggering
-				jQuery.event.global[type] = true;
-			});
+			// Keep track of which events have been used, for global triggering
+			jQuery.event.global[type] = true;
+		});
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
 	},
 
 	guid: 1,
@@ -1893,39 +2389,43 @@ jQuery.event = {
 
 		if ( events ) {
 			// Unbind all events for the element
-			if ( types == undefined )
+			if ( types === undefined || (typeof types === &quot;string&quot; &amp;&amp; types.charAt(0) == &quot;.&quot;) )
 				for ( var type in events )
-					this.remove( elem, type );
+					this.remove( elem, type + (types || &quot;&quot;) );
 			else {
 				// types is actually an event object here
 				if ( types.type ) {
 					handler = types.handler;
 					types = types.type;
 				}
-				
+
 				// Handle multiple events seperated by a space
 				// jQuery(...).unbind(&quot;mouseover mouseout&quot;, fn);
 				jQuery.each(types.split(/\s+/), function(index, type){
 					// Namespaced event handlers
-					var parts = type.split(&quot;.&quot;);
-					type = parts[0];
-					
+					var namespaces = type.split(&quot;.&quot;);
+					type = namespaces.shift();
+					var namespace = RegExp(&quot;(^|\\.)&quot; + namespaces.slice().sort().join(&quot;.*\\.&quot;) + &quot;(\\.|$)&quot;);
+
 					if ( events[type] ) {
 						// remove the given handler for the given type
 						if ( handler )
 							delete events[type][handler.guid];
-			
+
 						// remove all handlers for the given type
 						else
-							for ( handler in events[type] )
+							for ( var handle in events[type] )
 								// Handle the removal of namespaced events
-								if ( !parts[1] || events[type][handler].type == parts[1] )
-									delete events[type][handler];
+								if ( namespace.test(events[type][handle].type) )
+									delete events[type][handle];
+									
+						if ( jQuery.event.specialAll[type] )
+							jQuery.event.specialAll[type].teardown.call(elem, namespaces);
 
 						// remove generic event handler if no more handlers exist
 						for ( ret in events[type] ) break;
 						if ( !ret ) {
-							if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem) === false ) {
+							if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem, namespaces) === false ) {
 								if (elem.removeEventListener)
 									elem.removeEventListener(type, jQuery.data(elem, &quot;handle&quot;), false);
 								else if (elem.detachEvent)
@@ -1941,155 +2441,156 @@ jQuery.event = {
 			// Remove the expando if it's no longer used
 			for ( ret in events ) break;
 			if ( !ret ) {
+				var handle = jQuery.data( elem, &quot;handle&quot; );
+				if ( handle ) handle.elem = null;
 				jQuery.removeData( elem, &quot;events&quot; );
 				jQuery.removeData( elem, &quot;handle&quot; );
 			}
 		}
 	},
 
-	trigger: function(type, data, elem, donative, extra) {
-		// Clone the incoming data, if any
-		data = jQuery.makeArray(data || []);
+	// bubbling is internal
+	trigger: function( event, data, elem, bubbling ) {
+		// Event object or event type
+		var type = event.type || event;
+
+		if( !bubbling ){
+			event = typeof event === &quot;object&quot; ?
+				// jQuery.Event object
+				event[expando] ? event :
+				// Object literal
+				jQuery.extend( jQuery.Event(type), event ) :
+				// Just the event type (string)
+				jQuery.Event(type);
+
+			if ( type.indexOf(&quot;!&quot;) &gt;= 0 ) {
+				event.type = type = type.slice(0, -1);
+				event.exclusive = true;
+			}
 
-		// Handle a global trigger
-		if ( !elem ) {
-			// Only trigger if we've ever bound an event for it
-			if ( this.global[type] )
-				jQuery(&quot;*&quot;).add([window, document]).trigger(type, data);
+			// Handle a global trigger
+			if ( !elem ) {
+				// Don't bubble custom events when global (to avoid too much overhead)
+				event.stopPropagation();
+				// Only trigger if we've ever bound an event for it
+				if ( this.global[type] )
+					jQuery.each( jQuery.cache, function(){
+						if ( this.events &amp;&amp; this.events[type] )
+							jQuery.event.trigger( event, data, this.handle.elem );
+					});
+			}
+
+			// Handle triggering a single element
 
-		// Handle triggering a single element
-		} else {
 			// don't do events on text and comment nodes
-			if ( elem.nodeType == 3 || elem.nodeType == 8 )
+			if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 )
 				return undefined;
-
-			var val, ret, fn = jQuery.isFunction( elem[ type ] || null ),
-				// Check to see if we need to provide a fake event, or not
-				event = !data[0] || !data[0].preventDefault;
 			
-			// Pass along a fake event
-			if ( event )
-				data.unshift( this.fix({ type: type, target: elem }) );
-
-			// Enforce the right trigger type
-			data[0].type = type;
-
-			// Trigger the event
-			if ( jQuery.isFunction( jQuery.data(elem, &quot;handle&quot;) ) )
-				val = jQuery.data(elem, &quot;handle&quot;).apply( elem, data );
-
-			// Handle triggering native .onfoo handlers
-			if ( !fn &amp;&amp; elem[&quot;on&quot;+type] &amp;&amp; elem[&quot;on&quot;+type].apply( elem, data ) === false )
-				val = false;
-
-			// Extra functions don't get the custom event object
-			if ( event )
-				data.shift();
-
-			// Handle triggering of extra function
-			if ( extra &amp;&amp; jQuery.isFunction( extra ) ) {
-				// call the extra function and tack the current return value on the end for possible inspection
-				var ret = extra.apply( elem, data.concat( val ) );
-				// if anything is returned, give it precedence and have it overwrite the previous value
-				if (ret !== undefined)
-					val = ret;
-			}
+			// Clean up in case it is reused
+			event.result = undefined;
+			event.target = elem;
+			
+			// Clone the incoming data, if any
+			data = jQuery.makeArray(data);
+			data.unshift( event );
+		}
 
-			// Trigger the native events (except for clicks on links)
-			if ( fn &amp;&amp; donative !== false &amp;&amp; val !== false &amp;&amp; !(jQuery.nodeName(elem, 'a') &amp;&amp; type == &quot;click&quot;) ) {
-				this.triggered = true;
-				try {
-					elem[ type ]();
-				// prevent IE from throwing an error for some hidden elements
-				} catch (e) {}
-			}
+		event.currentTarget = elem;
+
+		// Trigger the event, it is assumed that &quot;handle&quot; is a function
+		var handle = jQuery.data(elem, &quot;handle&quot;);
+		if ( handle )
+			handle.apply( elem, data );
 
-			this.triggered = false;
+		// Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
+		if ( (!elem[type] || (jQuery.nodeName(elem, 'a') &amp;&amp; type == &quot;click&quot;)) &amp;&amp; elem[&quot;on&quot;+type] &amp;&amp; elem[&quot;on&quot;+type].apply( elem, data ) === false )
+			event.result = false;
+
+		// Trigger the native events (except for clicks on links)
+		if ( !bubbling &amp;&amp; elem[type] &amp;&amp; !event.isDefaultPrevented() &amp;&amp; !(jQuery.nodeName(elem, 'a') &amp;&amp; type == &quot;click&quot;) ) {
+			this.triggered = true;
+			try {
+				elem[ type ]();
+			// prevent IE from throwing an error for some hidden elements
+			} catch (e) {}
 		}
 
-		return val;
+		this.triggered = false;
+
+		if ( !event.isPropagationStopped() ) {
+			var parent = elem.parentNode || elem.ownerDocument;
+			if ( parent )
+				jQuery.event.trigger(event, data, parent, true);
+		}
 	},
 
 	handle: function(event) {
 		// returned undefined or false
-		var val;
+		var all, handlers;
 
-		// Empty object is for triggered events with no data
-		event = jQuery.event.fix( event || window.event || {} ); 
+		event = arguments[0] = jQuery.event.fix( event || window.event );
 
 		// Namespaced event handlers
-		var parts = event.type.split(&quot;.&quot;);
-		event.type = parts[0];
+		var namespaces = event.type.split(&quot;.&quot;);
+		event.type = namespaces.shift();
 
-		var handlers = jQuery.data(this, &quot;events&quot;) &amp;&amp; jQuery.data(this, &quot;events&quot;)[event.type], args = Array.prototype.slice.call( arguments, 1 );
-		args.unshift( event );
+		// Cache this now, all = true means, any handler
+		all = !namespaces.length &amp;&amp; !event.exclusive;
+		
+		var namespace = RegExp(&quot;(^|\\.)&quot; + namespaces.slice().sort().join(&quot;.*\\.&quot;) + &quot;(\\.|$)&quot;);
+
+		handlers = ( jQuery.data(this, &quot;events&quot;) || {} )[event.type];
 
 		for ( var j in handlers ) {
 			var handler = handlers[j];
-			// Pass in a reference to the handler function itself
-			// So that we can later remove it
-			args[0].handler = handler;
-			args[0].data = handler.data;
 
 			// Filter the functions by class
-			if ( !parts[1] || handler.type == parts[1] ) {
-				var ret = handler.apply( this, args );
+			if ( all || namespace.test(handler.type) ) {
+				// Pass in a reference to the handler function itself
+				// So that we can later remove it
+				event.handler = handler;
+				event.data = handler.data;
+
+				var ret = handler.apply(this, arguments);
+
+				if( ret !== undefined ){
+					event.result = ret;
+					if ( ret === false ) {
+						event.preventDefault();
+						event.stopPropagation();
+					}
+				}
 
-				if ( val !== false )
-					val = ret;
+				if( event.isImmediatePropagationStopped() )
+					break;
 
-				if ( ret === false ) {
-					event.preventDefault();
-					event.stopPropagation();
-				}
 			}
 		}
-
-		// Clean up added properties in IE to prevent memory leak
-		if (jQuery.browser.msie)
-			event.target = event.preventDefault = event.stopPropagation =
-				event.handler = event.data = null;
-
-		return val;
 	},
 
+	props: &quot;altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which&quot;.split(&quot; &quot;),
+
 	fix: function(event) {
-		// Short-circuit if the event has already been fixed by jQuery.event.fix
-		if ( event[ expando ] )
+		if ( event[expando] )
 			return event;
-			
-		// store a copy of the original event object 
-		// and clone to set read-only properties
+
+		// store a copy of the original event object
+		// and &quot;clone&quot; to set read-only properties
 		var originalEvent = event;
-		event = jQuery.extend({}, originalEvent);
-		
-		// Mark the event as fixed by jQuery.event.fix
-		event[ expando ] = true;
-		
-		// add preventDefault and stopPropagation since 
-		// they will not work on the clone
-		event.preventDefault = function() {
-			// if preventDefault exists run it on the original event
-			if (originalEvent.preventDefault)
-				originalEvent.preventDefault();
-			// otherwise set the returnValue property of the original event to false (IE)
-			originalEvent.returnValue = false;
-		};
-		event.stopPropagation = function() {
-			// if stopPropagation exists run it on the original event
-			if (originalEvent.stopPropagation)
-				originalEvent.stopPropagation();
-			// otherwise set the cancelBubble property of the original event to true (IE)
-			originalEvent.cancelBubble = true;
-		};
-		
+		event = jQuery.Event( originalEvent );
+
+		for ( var i = this.props.length, prop; i; ){
+			prop = this.props[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
 		// Fix target property, if necessary
 		if ( !event.target )
 			event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
-				
+
 		// check if target is a textnode (safari)
 		if ( event.target.nodeType == 3 )
-			event.target = originalEvent.target.parentNode;
+			event.target = event.target.parentNode;
 
 		// Add relatedTarget, if necessary
 		if ( !event.relatedTarget &amp;&amp; event.fromElement )
@@ -2101,11 +2602,11 @@ jQuery.event = {
 			event.pageX = event.clientX + (doc &amp;&amp; doc.scrollLeft || body &amp;&amp; body.scrollLeft || 0) - (doc.clientLeft || 0);
 			event.pageY = event.clientY + (doc &amp;&amp; doc.scrollTop || body &amp;&amp; body.scrollTop || 0) - (doc.clientTop || 0);
 		}
-			
+
 		// Add which for key events
-		if ( !event.which &amp;&amp; (event.charCode || event.keyCode) )
+		if ( !event.which &amp;&amp; ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
 			event.which = event.charCode || event.keyCode;
-		
+
 		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
 		if ( !event.metaKey &amp;&amp; event.ctrlKey )
 			event.metaKey = event.ctrlKey;
@@ -2114,80 +2615,157 @@ jQuery.event = {
 		// Note: button is not normalized, so don't use it
 		if ( !event.which &amp;&amp; event.button )
 			event.which = (event.button &amp; 1 ? 1 : ( event.button &amp; 2 ? 3 : ( event.button &amp; 4 ? 2 : 0 ) ));
-			
+
 		return event;
 	},
-	
+
+	proxy: function( fn, proxy ){
+		proxy = proxy || function(){ return fn.apply(this, arguments); };
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
+		// So proxy can be declared as an argument
+		return proxy;
+	},
+
 	special: {
 		ready: {
-			setup: function() {
-				// Make sure the ready event is setup
-				bindReady();
-				return;
-			},
-			
-			teardown: function() { return; }
-		},
-		
-		mouseenter: {
-			setup: function() {
-				if ( jQuery.browser.msie ) return false;
-				jQuery(this).bind(&quot;mouseover&quot;, jQuery.event.special.mouseenter.handler);
-				return true;
-			},
-		
-			teardown: function() {
-				if ( jQuery.browser.msie ) return false;
-				jQuery(this).unbind(&quot;mouseover&quot;, jQuery.event.special.mouseenter.handler);
-				return true;
-			},
-			
-			handler: function(event) {
-				// If we actually just moused on to a sub-element, ignore it
-				if ( withinElement(event, this) ) return true;
-				// Execute the right handlers by setting the event type to mouseenter
-				arguments[0].type = &quot;mouseenter&quot;;
-				return jQuery.event.handle.apply(this, arguments);
-			}
-		},
+			// Make sure the ready event is setup
+			setup: bindReady,
+			teardown: function() {}
+		}
+	},
 	
-		mouseleave: {
-			setup: function() {
-				if ( jQuery.browser.msie ) return false;
-				jQuery(this).bind(&quot;mouseout&quot;, jQuery.event.special.mouseleave.handler);
-				return true;
-			},
-		
-			teardown: function() {
-				if ( jQuery.browser.msie ) return false;
-				jQuery(this).unbind(&quot;mouseout&quot;, jQuery.event.special.mouseleave.handler);
-				return true;
+	specialAll: {
+		live: {
+			setup: function( selector, namespaces ){
+				jQuery.event.add( this, namespaces[0], liveHandler );
 			},
-			
-			handler: function(event) {
-				// If we actually just moused on to a sub-element, ignore it
-				if ( withinElement(event, this) ) return true;
-				// Execute the right handlers by setting the event type to mouseleave
-				arguments[0].type = &quot;mouseleave&quot;;
-				return jQuery.event.handle.apply(this, arguments);
+			teardown:  function( namespaces ){
+				if ( namespaces.length ) {
+					var remove = 0, name = RegExp(&quot;(^|\\.)&quot; + namespaces[0] + &quot;(\\.|$)&quot;);
+					
+					jQuery.each( (jQuery.data(this, &quot;events&quot;).live || {}), function(){
+						if ( name.test(this.type) )
+							remove++;
+					});
+					
+					if ( remove &lt; 1 )
+						jQuery.event.remove( this, namespaces[0], liveHandler );
+				}
 			}
 		}
 	}
 };
 
+jQuery.Event = function( src ){
+	// Allow instantiation without the 'new' keyword
+	if( !this.preventDefault )
+		return new jQuery.Event(src);
+	
+	// Event object
+	if( src &amp;&amp; src.type ){
+		this.originalEvent = src;
+		this.type = src.type;
+		this.timeStamp = src.timeStamp;
+	// Event type
+	}else
+		this.type = src;
+
+	if( !this.timeStamp )
+		this.timeStamp = now();
+	
+	// Mark it as fixed
+	this[expando] = true;
+};
+
+function returnFalse(){
+	return false;
+}
+function returnTrue(){
+	return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if( !e )
+			return;
+		// if preventDefault exists run it on the original event
+		if (e.preventDefault)
+			e.preventDefault();
+		// otherwise set the returnValue property of the original event to false (IE)
+		e.returnValue = false;
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if( !e )
+			return;
+		// if stopPropagation exists run it on the original event
+		if (e.stopPropagation)
+			e.stopPropagation();
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation:function(){
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+// Checks if an event happened on an element within another element
+// Used in jQuery.event.special.mouseenter and mouseleave handlers
+var withinElement = function(event) {
+	// Check if mouse(over|out) are still within the same parent element
+	var parent = event.relatedTarget;
+	// Traverse up the tree
+	while ( parent &amp;&amp; parent != this )
+		try { parent = parent.parentNode; }
+		catch(e) { parent = this; }
+	
+	if( parent != this ){
+		// set the correct event type
+		event.type = event.data;
+		// handle event if we actually just moused on to a non sub-element
+		jQuery.event.handle.apply( this, arguments );
+	}
+};
+	
+jQuery.each({ 
+	mouseover: 'mouseenter', 
+	mouseout: 'mouseleave'
+}, function( orig, fix ){
+	jQuery.event.special[ fix ] = {
+		setup: function(){
+			jQuery.event.add( this, orig, withinElement, fix );
+		},
+		teardown: function(){
+			jQuery.event.remove( this, orig, withinElement );
+		}
+	};			   
+});
+
 jQuery.fn.extend({
 	bind: function( type, data, fn ) {
 		return type == &quot;unload&quot; ? this.one(type, data, fn) : this.each(function(){
 			jQuery.event.add( this, type, fn || data, fn &amp;&amp; data );
 		});
 	},
-	
+
 	one: function( type, data, fn ) {
+		var one = jQuery.event.proxy( fn || data, function(event) {
+			jQuery(this).unbind(event, one);
+			return (fn || data).apply( this, arguments );
+		});
 		return this.each(function(){
-			jQuery.event.add( this, type, function(event) {
-				jQuery(this).unbind(event);
-				return (fn || data).apply( this, arguments);
-			}, fn &amp;&amp; data);
+			jQuery.event.add( this, type, one, fn &amp;&amp; data);
 		});
 	},
 
@@ -2197,38 +2775,46 @@ jQuery.fn.extend({
 		});
 	},
 
-	trigger: function( type, data, fn ) {
+	trigger: function( type, data ) {
 		return this.each(function(){
-			jQuery.event.trigger( type, data, this, true, fn );
+			jQuery.event.trigger( type, data, this );
 		});
 	},
 
-	triggerHandler: function( type, data, fn ) {
-		if ( this[0] )
-			return jQuery.event.trigger( type, data, this[0], false, fn );
-		return undefined;
+	triggerHandler: function( type, data ) {
+		if( this[0] ){
+			var event = jQuery.Event(type);
+			event.preventDefault();
+			event.stopPropagation();
+			jQuery.event.trigger( event, data, this[0] );
+			return event.result;
+		}		
 	},
 
-	toggle: function() {
+	toggle: function( fn ) {
 		// Save reference to arguments for access in closure
-		var args = arguments;
+		var args = arguments, i = 1;
 
-		return this.click(function(event) {
+		// link all the functions, so any of them can unbind this click handler
+		while( i &lt; args.length )
+			jQuery.event.proxy( fn, args[i++] );
+
+		return this.click( jQuery.event.proxy( fn, function(event) {
 			// Figure out which function to execute
-			this.lastToggle = 0 == this.lastToggle ? 1 : 0;
-			
+			this.lastToggle = ( this.lastToggle || 0 ) % i;
+
 			// Make sure that clicks stop
 			event.preventDefault();
-			
+
 			// and execute the function
-			return args[this.lastToggle].apply( this, arguments ) || false;
-		});
+			return args[ this.lastToggle++ ].apply( this, arguments ) || false;
+		}));
 	},
 
 	hover: function(fnOver, fnOut) {
-		return this.bind('mouseenter', fnOver).bind('mouseleave', fnOut);
+		return this.mouseenter(fnOver).mouseleave(fnOut);
 	},
-	
+
 	ready: function(fn) {
 		// Attach the listeners
 		bindReady();
@@ -2237,16 +2823,56 @@ jQuery.fn.extend({
 		if ( jQuery.isReady )
 			// Execute the function immediately
 			fn.call( document, jQuery );
-			
+
 		// Otherwise, remember the function for later
 		else
 			// Add the function to the wait list
-			jQuery.readyList.push( function() { return fn.call(this, jQuery); } );
+			jQuery.readyList.push( fn );
+
+		return this;
+	},
 	
+	live: function( type, fn ){
+		var proxy = jQuery.event.proxy( fn );
+		proxy.guid += this.selector + type;
+
+		jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy );
+
+		return this;
+	},
+	
+	die: function( type, fn ){
+		jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null );
 		return this;
 	}
 });
 
+function liveHandler( event ){
+	var check = RegExp(&quot;(^|\\.)&quot; + event.type + &quot;(\\.|$)&quot;),
+		stop = true,
+		elems = [];
+
+	jQuery.each(jQuery.data(this, &quot;events&quot;).live || [], function(i, fn){
+		if ( check.test(fn.type) ) {
+			var elem = jQuery(event.target).closest(fn.data)[0];
+			if ( elem )
+				elems.push({ elem: elem, fn: fn });
+		}
+	});
+
+	jQuery.each(elems, function(){
+		if ( !event.isImmediatePropagationStopped() &amp;&amp;
+			this.fn.call(this.elem, event, this.fn.data) === false )
+				stop = false;
+	});
+
+	return stop;
+}
+
+function liveConvert(type, selector){
+	return [&quot;live&quot;, type, selector.replace(/\./g, &quot;`&quot;).replace(/ /g, &quot;|&quot;)].join(&quot;.&quot;);
+}
+
 jQuery.extend({
 	isReady: false,
 	readyList: [],
@@ -2256,20 +2882,20 @@ jQuery.extend({
 		if ( !jQuery.isReady ) {
 			// Remember that the DOM is ready
 			jQuery.isReady = true;
-			
+
 			// If there are functions bound, to execute
 			if ( jQuery.readyList ) {
 				// Execute all of them
 				jQuery.each( jQuery.readyList, function(){
-					this.apply( document );
+					this.call( document, jQuery );
 				});
-				
+
 				// Reset the list of functions
 				jQuery.readyList = null;
 			}
-		
+
 			// Trigger any bound ready events
-			$(document).triggerHandler(&quot;ready&quot;);
+			jQuery(document).triggerHandler(&quot;ready&quot;);
 		}
 	}
 });
@@ -2280,53 +2906,39 @@ function bindReady(){
 	if ( readyBound ) return;
 	readyBound = true;
 
-	// Mozilla, Opera (see further below for it) and webkit nightlies currently support this event
-	if ( document.addEventListener &amp;&amp; !jQuery.browser.opera)
+	// Mozilla, Opera and webkit nightlies currently support this event
+	if ( document.addEventListener ) {
 		// Use the handy event callback
-		document.addEventListener( &quot;DOMContentLoaded&quot;, jQuery.ready, false );
-	
-	// If IE is used and is not in a frame
-	// Continually check to see if the document is ready
-	if ( jQuery.browser.msie &amp;&amp; window == top ) (function(){
-		if (jQuery.isReady) return;
-		try {
-			// If IE is used, use the trick by Diego Perini
-			// http://javascript.nwbox.com/IEContentLoaded/
-			document.documentElement.doScroll(&quot;left&quot;);
-		} catch( error ) {
-			setTimeout( arguments.callee, 0 );
-			return;
-		}
-		// and execute any waiting functions
-		jQuery.ready();
-	})();
-
-	if ( jQuery.browser.opera )
-		document.addEventListener( &quot;DOMContentLoaded&quot;, function () {
-			if (jQuery.isReady) return;
-			for (var i = 0; i &lt; document.styleSheets.length; i++)
-				if (document.styleSheets[i].disabled) {
-					setTimeout( arguments.callee, 0 );
-					return;
-				}
-			// and execute any waiting functions
+		document.addEventListener( &quot;DOMContentLoaded&quot;, function(){
+			document.removeEventListener( &quot;DOMContentLoaded&quot;, arguments.callee, false );
 			jQuery.ready();
-		}, false);
-
-	if ( jQuery.browser.safari ) {
-		var numStyles;
-		(function(){
-			if (jQuery.isReady) return;
-			if ( document.readyState != &quot;loaded&quot; &amp;&amp; document.readyState != &quot;complete&quot; ) {
-				setTimeout( arguments.callee, 0 );
-				return;
+		}, false );
+
+	// If IE event model is used
+	} else if ( document.attachEvent ) {
+		// ensure firing before onload,
+		// maybe late but safe also for iframes
+		document.attachEvent(&quot;onreadystatechange&quot;, function(){
+			if ( document.readyState === &quot;complete&quot; ) {
+				document.detachEvent( &quot;onreadystatechange&quot;, arguments.callee );
+				jQuery.ready();
 			}
-			if ( numStyles === undefined )
-				numStyles = jQuery(&quot;style, link[rel=stylesheet]&quot;).length;
-			if ( document.styleSheets.length != numStyles ) {
+		});
+
+		// If IE and not an iframe
+		// continually check to see if the document is ready
+		if ( document.documentElement.doScroll &amp;&amp; !window.frameElement ) (function(){
+			if ( jQuery.isReady ) return;
+
+			try {
+				// If IE is used, use the trick by Diego Perini
+				// http://javascript.nwbox.com/IEContentLoaded/
+				document.documentElement.doScroll(&quot;left&quot;);
+			} catch( error ) {
 				setTimeout( arguments.callee, 0 );
 				return;
 			}
+
 			// and execute any waiting functions
 			jQuery.ready();
 		})();
@@ -2337,36 +2949,144 @@ function bindReady(){
 }
 
 jQuery.each( (&quot;blur,focus,load,resize,scroll,unload,click,dblclick,&quot; +
-	&quot;mousedown,mouseup,mousemove,mouseover,mouseout,change,select,&quot; + 
-	&quot;submit,keydown,keypress,keyup,error&quot;).split(&quot;,&quot;), function(i, name){
-	
+	&quot;mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,&quot; +
+	&quot;change,select,submit,keydown,keypress,keyup,error&quot;).split(&quot;,&quot;), function(i, name){
+
 	// Handle event binding
 	jQuery.fn[name] = function(fn){
 		return fn ? this.bind(name, fn) : this.trigger(name);
 	};
 });
 
-// Checks if an event happened on an element within another element
-// Used in jQuery.event.special.mouseenter and mouseleave handlers
-var withinElement = function(event, elem) {
-	// Check if mouse(over|out) are still within the same parent element
-	var parent = event.relatedTarget;
-	// Traverse up the tree
-	while ( parent &amp;&amp; parent != elem ) try { parent = parent.parentNode } catch(error) { parent = elem; };
-	// Return true if we actually just moused on to a sub-element
-	return parent == elem;
-};
-
 // Prevent memory leaks in IE
 // And prevent errors on refresh with events like mouseover in other browsers
 // Window isn't included so as not to unbind existing unload events
-jQuery(window).bind(&quot;unload&quot;, function() {
-	jQuery(&quot;*&quot;).add(document).unbind();
-});
+jQuery( window ).bind( 'unload', function(){ 
+	for ( var id in jQuery.cache )
+		// Skip the window
+		if ( id != 1 &amp;&amp; jQuery.cache[ id ].handle )
+			jQuery.event.remove( jQuery.cache[ id ].handle.elem );
+}); 
+(function(){
+
+	jQuery.support = {};
+
+	var root = document.documentElement,
+		script = document.createElement(&quot;script&quot;),
+		div = document.createElement(&quot;div&quot;),
+		id = &quot;script&quot; + (new Date).getTime();
+
+	div.style.display = &quot;none&quot;;
+	div.innerHTML = '   &lt;link/&gt;&lt;table&gt;&lt;/table&gt;&lt;a href=&quot;/a&quot; style=&quot;color:red;float:left;opacity:.5;&quot;&gt;a&lt;/a&gt;&lt;select&gt;&lt;option&gt;text&lt;/option&gt;&lt;/select&gt;&lt;object&gt;&lt;param&gt;&lt;/object&gt;';
+
+	var all = div.getElementsByTagName(&quot;*&quot;),
+		a = div.getElementsByTagName(&quot;a&quot;)[0];
+
+	// Can't get basic test support
+	if ( !all || !all.length || !a ) {
+		return;
+	}
+
+	jQuery.support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: div.firstChild.nodeType == 3,
+		
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName(&quot;tbody&quot;).length,
+		
+		// Make sure that you can get all elements in an &lt;object&gt; element
+		// IE 7 always returns no results
+		objectAll: !!div.getElementsByTagName(&quot;object&quot;)[0]
+			.getElementsByTagName(&quot;*&quot;).length,
+		
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName(&quot;link&quot;).length,
+		
+		// Get the style information from getAttribute
+		// (IE uses .cssText insted)
+		style: /red/.test( a.getAttribute(&quot;style&quot;) ),
+		
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: a.getAttribute(&quot;href&quot;) === &quot;/a&quot;,
+		
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		opacity: a.style.opacity === &quot;0.5&quot;,
+		
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Will be defined later
+		scriptEval: false,
+		noCloneEvent: true,
+		boxModel: null
+	};
+	
+	script.type = &quot;text/javascript&quot;;
+	try {
+		script.appendChild( document.createTextNode( &quot;window.&quot; + id + &quot;=1;&quot; ) );
+	} catch(e){}
+
+	root.insertBefore( script, root.firstChild );
+	
+	// Make sure that the execution of code works by injecting a script
+	// tag with appendChild/createTextNode
+	// (IE doesn't support this, fails, and uses .text instead)
+	if ( window[ id ] ) {
+		jQuery.support.scriptEval = true;
+		delete window[ id ];
+	}
+
+	root.removeChild( script );
+
+	if ( div.attachEvent &amp;&amp; div.fireEvent ) {
+		div.attachEvent(&quot;onclick&quot;, function(){
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			jQuery.support.noCloneEvent = false;
+			div.detachEvent(&quot;onclick&quot;, arguments.callee);
+		});
+		div.cloneNode(true).fireEvent(&quot;onclick&quot;);
+	}
+
+	// Figure out if the W3C box model works as expected
+	// document.body must exist before we can do this
+	jQuery(function(){
+		var div = document.createElement(&quot;div&quot;);
+		div.style.width = &quot;1px&quot;;
+		div.style.paddingLeft = &quot;1px&quot;;
+
+		document.body.appendChild( div );
+		jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
+		document.body.removeChild( div );
+	});
+})();
+
+var styleFloat = jQuery.support.cssFloat ? &quot;cssFloat&quot; : &quot;styleFloat&quot;;
+
+jQuery.props = {
+	&quot;for&quot;: &quot;htmlFor&quot;,
+	&quot;class&quot;: &quot;className&quot;,
+	&quot;float&quot;: styleFloat,
+	cssFloat: styleFloat,
+	styleFloat: styleFloat,
+	readonly: &quot;readOnly&quot;,
+	maxlength: &quot;maxLength&quot;,
+	cellspacing: &quot;cellSpacing&quot;,
+	rowspan: &quot;rowSpan&quot;,
+	tabindex: &quot;tabIndex&quot;
+};
 jQuery.fn.extend({
+	// Keep a copy of the old load
+	_load: jQuery.fn.load,
+
 	load: function( url, params, callback ) {
-		if ( jQuery.isFunction( url ) )
-			return this.bind(&quot;load&quot;, url);
+		if ( typeof url !== &quot;string&quot; )
+			return this._load( url );
 
 		var off = url.indexOf(&quot; &quot;);
 		if ( off &gt;= 0 ) {
@@ -2374,8 +3094,6 @@ jQuery.fn.extend({
 			url = url.slice(0, off);
 		}
 
-		callback = callback || function(){};
-
 		// Default to a GET request
 		var type = &quot;GET&quot;;
 
@@ -2388,7 +3106,7 @@ jQuery.fn.extend({
 				params = null;
 
 			// Otherwise, build a param string
-			} else {
+			} else if( typeof params === &quot;object&quot; ) {
 				params = jQuery.param( params );
 				type = &quot;POST&quot;;
 			}
@@ -2418,7 +3136,8 @@ jQuery.fn.extend({
 						// If not, just inject the full result
 						res.responseText );
 
-				self.each( callback, [res.responseText, status, res] );
+				if( callback )
+					self.each( callback, [res.responseText, status, res] );
 			}
 		});
 		return this;
@@ -2429,18 +3148,17 @@ jQuery.fn.extend({
 	},
 	serializeArray: function() {
 		return this.map(function(){
-			return jQuery.nodeName(this, &quot;form&quot;) ?
-				jQuery.makeArray(this.elements) : this;
+			return this.elements ? jQuery.makeArray(this.elements) : this;
 		})
 		.filter(function(){
-			return this.name &amp;&amp; !this.disabled &amp;&amp; 
-				(this.checked || /select|textarea/i.test(this.nodeName) || 
+			return this.name &amp;&amp; !this.disabled &amp;&amp;
+				(this.checked || /select|textarea/i.test(this.nodeName) ||
 					/text|hidden|password/i.test(this.type));
 		})
 		.map(function(i, elem){
 			var val = jQuery(this).val();
 			return val == null ? null :
-				val.constructor == Array ?
+				jQuery.isArray(val) ?
 					jQuery.map( val, function(val, i){
 						return {name: elem.name, value: val};
 					}) :
@@ -2456,16 +3174,17 @@ jQuery.each( &quot;ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend&quot;.sp
 	};
 });
 
-var jsc = (new Date).getTime();
+var jsc = now();
 
 jQuery.extend({
+  
 	get: function( url, data, callback, type ) {
 		// shift arguments if data argument was ommited
 		if ( jQuery.isFunction( data ) ) {
 			callback = data;
 			data = null;
 		}
-		
+
 		return jQuery.ajax({
 			type: &quot;GET&quot;,
 			url: url,
@@ -2503,32 +3222,52 @@ jQuery.extend({
 	},
 
 	ajaxSettings: {
+		url: location.href,
 		global: true,
 		type: &quot;GET&quot;,
-		timeout: 0,
 		contentType: &quot;application/x-www-form-urlencoded&quot;,
 		processData: true,
 		async: true,
-		data: null
+		/*
+		timeout: 0,
+		data: null,
+		username: null,
+		password: null,
+		*/
+		// Create the request object; Microsoft failed to properly
+		// implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
+		// This function can be overriden by calling jQuery.ajaxSetup
+		xhr:function(){
+			return window.ActiveXObject ? new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;) : new XMLHttpRequest();
+		},
+		accepts: {
+			xml: &quot;application/xml, text/xml&quot;,
+			html: &quot;text/html&quot;,
+			script: &quot;text/javascript, application/javascript&quot;,
+			json: &quot;application/json, text/javascript&quot;,
+			text: &quot;text/plain&quot;,
+			_default: &quot;*/*&quot;
+		}
 	},
-	
+
 	// Last-Modified header cache for next request
 	lastModified: {},
 
 	ajax: function( s ) {
-		var jsonp, jsre = /=\?(&amp;|$)/g, status, data;
-
 		// Extend the settings, but re-extend 's' so that it can be
 		// checked again later (in the test suite, specifically)
 		s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
 
+		var jsonp, jsre = /=\?(&amp;|$)/g, status, data,
+			type = s.type.toUpperCase();
+
 		// convert data if not already a string
-		if ( s.data &amp;&amp; s.processData &amp;&amp; typeof s.data != &quot;string&quot; )
+		if ( s.data &amp;&amp; s.processData &amp;&amp; typeof s.data !== &quot;string&quot; )
 			s.data = jQuery.param(s.data);
 
 		// Handle JSONP Parameter Callbacks
 		if ( s.dataType == &quot;jsonp&quot; ) {
-			if ( s.type.toLowerCase() == &quot;get&quot; ) {
+			if ( type == &quot;GET&quot; ) {
 				if ( !s.url.match(jsre) )
 					s.url += (s.url.match(/\?/) ? &quot;&amp;&quot; : &quot;?&quot;) + (s.jsonp || &quot;callback&quot;) + &quot;=?&quot;;
 			} else if ( !s.data || !s.data.match(jsre) )
@@ -2565,8 +3304,8 @@ jQuery.extend({
 		if ( s.dataType == &quot;script&quot; &amp;&amp; s.cache == null )
 			s.cache = false;
 
-		if ( s.cache === false &amp;&amp; s.type.toLowerCase() == &quot;get&quot; ) {
-			var ts = (new Date()).getTime();
+		if ( s.cache === false &amp;&amp; type == &quot;GET&quot; ) {
+			var ts = now();
 			// try replacing _= if it is there
 			var ret = s.url.replace(/(\?|&amp;)_=.*?(&amp;|$)/, &quot;$1_=&quot; + ts + &quot;$2&quot;);
 			// if nothing was replaced, add timestamp to the end
@@ -2574,7 +3313,7 @@ jQuery.extend({
 		}
 
 		// If data is available, append data to url for get requests
-		if ( s.data &amp;&amp; s.type.toLowerCase() == &quot;get&quot; ) {
+		if ( s.data &amp;&amp; type == &quot;GET&quot; ) {
 			s.url += (s.url.match(/\?/) ? &quot;&amp;&quot; : &quot;?&quot;) + s.data;
 
 			// IE likes to send both get and post data, prevent this
@@ -2585,9 +3324,14 @@ jQuery.extend({
 		if ( s.global &amp;&amp; ! jQuery.active++ )
 			jQuery.event.trigger( &quot;ajaxStart&quot; );
 
+		// Matches an absolute URL, and saves the domain
+		var parts = /^(\w+:)?\/\/([^\/?#]+)/.exec( s.url );
+
 		// If we're requesting a remote document
 		// and trying to load JSON or Script with a GET
-		if ( (!s.url.indexOf(&quot;http&quot;) || !s.url.indexOf(&quot;//&quot;)) &amp;&amp; ( s.dataType == &quot;script&quot; || s.dataType ==&quot;json&quot; ) &amp;&amp; s.type.toLowerCase() == &quot;get&quot; ) {
+		if ( s.dataType == &quot;script&quot; &amp;&amp; type == &quot;GET&quot; &amp;&amp; parts
+			&amp;&amp; ( parts[1] &amp;&amp; parts[1] != location.protocol || parts[2] != location.host )){
+
 			var head = document.getElementsByTagName(&quot;head&quot;)[0];
 			var script = document.createElement(&quot;script&quot;);
 			script.src = s.url;
@@ -2600,7 +3344,7 @@ jQuery.extend({
 
 				// Attach handlers for all browsers
 				script.onload = script.onreadystatechange = function(){
-					if ( !done &amp;&amp; (!this.readyState || 
+					if ( !done &amp;&amp; (!this.readyState ||
 							this.readyState == &quot;loaded&quot; || this.readyState == &quot;complete&quot;) ) {
 						done = true;
 						success();
@@ -2618,57 +3362,81 @@ jQuery.extend({
 
 		var requestDone = false;
 
-		// Create the request object; Microsoft failed to properly
-		// implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
-		var xml = window.ActiveXObject ? new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;) : new XMLHttpRequest();
+		// Create the request object
+		var xhr = s.xhr();
 
 		// Open the socket
-		xml.open(s.type, s.url, s.async);
+		// Passing null username, generates a login popup on Opera (#2865)
+		if( s.username )
+			xhr.open(type, s.url, s.async, s.username, s.password);
+		else
+			xhr.open(type, s.url, s.async);
 
 		// Need an extra try/catch for cross domain requests in Firefox 3
 		try {
 			// Set the correct header, if data is being sent
 			if ( s.data )
-				xml.setRequestHeader(&quot;Content-Type&quot;, s.contentType);
+				xhr.setRequestHeader(&quot;Content-Type&quot;, s.contentType);
 
 			// Set the If-Modified-Since header, if ifModified mode.
 			if ( s.ifModified )
-				xml.setRequestHeader(&quot;If-Modified-Since&quot;,
+				xhr.setRequestHeader(&quot;If-Modified-Since&quot;,
 					jQuery.lastModified[s.url] || &quot;Thu, 01 Jan 1970 00:00:00 GMT&quot; );
 
 			// Set header so the called script knows that it's an XMLHttpRequest
-			xml.setRequestHeader(&quot;X-Requested-With&quot;, &quot;XMLHttpRequest&quot;);
+			xhr.setRequestHeader(&quot;X-Requested-With&quot;, &quot;XMLHttpRequest&quot;);
+
+			// Set the Accepts header for the server, depending on the dataType
+			xhr.setRequestHeader(&quot;Accept&quot;, s.dataType &amp;&amp; s.accepts[ s.dataType ] ?
+				s.accepts[ s.dataType ] + &quot;, */*&quot; :
+				s.accepts._default );
 		} catch(e){}
 
-		// Allow custom headers/mimetypes
-		if ( s.beforeSend )
-			s.beforeSend(xml);
-			
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend &amp;&amp; s.beforeSend(xhr, s) === false ) {
+			// Handle the global AJAX counter
+			if ( s.global &amp;&amp; ! --jQuery.active )
+				jQuery.event.trigger( &quot;ajaxStop&quot; );
+			// close opended socket
+			xhr.abort();
+			return false;
+		}
+
 		if ( s.global )
-			jQuery.event.trigger(&quot;ajaxSend&quot;, [xml, s]);
+			jQuery.event.trigger(&quot;ajaxSend&quot;, [xhr, s]);
 
 		// Wait for a response to come back
 		var onreadystatechange = function(isTimeout){
+			// The request was aborted, clear the interval and decrement jQuery.active
+			if (xhr.readyState == 0) {
+				if (ival) {
+					// clear poll interval
+					clearInterval(ival);
+					ival = null;
+					// Handle the global AJAX counter
+					if ( s.global &amp;&amp; ! --jQuery.active )
+						jQuery.event.trigger( &quot;ajaxStop&quot; );
+				}
 			// The transfer is complete and the data is available, or the request timed out
-			if ( !requestDone &amp;&amp; xml &amp;&amp; (xml.readyState == 4 || isTimeout == &quot;timeout&quot;) ) {
+			} else if ( !requestDone &amp;&amp; xhr &amp;&amp; (xhr.readyState == 4 || isTimeout == &quot;timeout&quot;) ) {
 				requestDone = true;
-				
+
 				// clear poll interval
 				if (ival) {
 					clearInterval(ival);
 					ival = null;
 				}
-				
-				status = isTimeout == &quot;timeout&quot; &amp;&amp; &quot;timeout&quot; ||
-					!jQuery.httpSuccess( xml ) &amp;&amp; &quot;error&quot; ||
-					s.ifModified &amp;&amp; jQuery.httpNotModified( xml, s.url ) &amp;&amp; &quot;notmodified&quot; ||
+
+				status = isTimeout == &quot;timeout&quot; ? &quot;timeout&quot; :
+					!jQuery.httpSuccess( xhr ) ? &quot;error&quot; :
+					s.ifModified &amp;&amp; jQuery.httpNotModified( xhr, s.url ) ? &quot;notmodified&quot; :
 					&quot;success&quot;;
 
 				if ( status == &quot;success&quot; ) {
 					// Watch for, and catch, XML document parse errors
 					try {
 						// process the data (runs the xml through httpData regardless of callback)
-						data = jQuery.httpData( xml, s.dataType );
+						data = jQuery.httpData( xhr, s.dataType, s );
 					} catch(e) {
 						status = &quot;parsererror&quot;;
 					}
@@ -2679,52 +3447,53 @@ jQuery.extend({
 					// Cache Last-Modified header, if ifModified mode.
 					var modRes;
 					try {
-						modRes = xml.getResponseHeader(&quot;Last-Modified&quot;);
+						modRes = xhr.getResponseHeader(&quot;Last-Modified&quot;);
 					} catch(e) {} // swallow exception thrown by FF if header is not available
-	
+
 					if ( s.ifModified &amp;&amp; modRes )
 						jQuery.lastModified[s.url] = modRes;
 
 					// JSONP handles its own success callback
 					if ( !jsonp )
-						success();	
+						success();
 				} else
-					jQuery.handleError(s, xml, status);
+					jQuery.handleError(s, xhr, status);
 
 				// Fire the complete handlers
 				complete();
 
 				// Stop memory leaks
 				if ( s.async )
-					xml = null;
+					xhr = null;
 			}
 		};
-		
+
 		if ( s.async ) {
 			// don't attach the handler to the request, just poll it instead
-			var ival = setInterval(onreadystatechange, 13); 
+			var ival = setInterval(onreadystatechange, 13);
 
 			// Timeout checker
 			if ( s.timeout &gt; 0 )
 				setTimeout(function(){
 					// Check to see if the request is still happening
-					if ( xml ) {
-						// Cancel the request
-						xml.abort();
-	
+					if ( xhr ) {
 						if( !requestDone )
 							onreadystatechange( &quot;timeout&quot; );
+
+						// Cancel the request
+						if ( xhr )
+							xhr.abort();
 					}
 				}, s.timeout);
 		}
-			
+
 		// Send the data
 		try {
-			xml.send(s.data);
+			xhr.send(s.data);
 		} catch(e) {
-			jQuery.handleError(s, xml, null, e);
+			jQuery.handleError(s, xhr, null, e);
 		}
-		
+
 		// firefox 1.5 doesn't fire statechange for sync requests
 		if ( !s.async )
 			onreadystatechange();
@@ -2736,92 +3505,103 @@ jQuery.extend({
 
 			// Fire the global callback
 			if ( s.global )
-				jQuery.event.trigger( &quot;ajaxSuccess&quot;, [xml, s] );
+				jQuery.event.trigger( &quot;ajaxSuccess&quot;, [xhr, s] );
 		}
 
 		function complete(){
 			// Process result
 			if ( s.complete )
-				s.complete(xml, status);
+				s.complete(xhr, status);
 
 			// The request was completed
 			if ( s.global )
-				jQuery.event.trigger( &quot;ajaxComplete&quot;, [xml, s] );
+				jQuery.event.trigger( &quot;ajaxComplete&quot;, [xhr, s] );
 
 			// Handle the global AJAX counter
 			if ( s.global &amp;&amp; ! --jQuery.active )
 				jQuery.event.trigger( &quot;ajaxStop&quot; );
 		}
-		
+
 		// return XMLHttpRequest to allow aborting the request etc.
-		return xml;
+		return xhr;
 	},
 
-	handleError: function( s, xml, status, e ) {
+	handleError: function( s, xhr, status, e ) {
 		// If a local callback was specified, fire it
-		if ( s.error ) s.error( xml, status, e );
+		if ( s.error ) s.error( xhr, status, e );
 
 		// Fire the global callback
 		if ( s.global )
-			jQuery.event.trigger( &quot;ajaxError&quot;, [xml, s, e] );
+			jQuery.event.trigger( &quot;ajaxError&quot;, [xhr, s, e] );
 	},
 
 	// Counter for holding the number of active queries
 	active: 0,
 
 	// Determines if an XMLHttpRequest was successful or not
-	httpSuccess: function( r ) {
+	httpSuccess: function( xhr ) {
 		try {
 			// IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
-			return !r.status &amp;&amp; location.protocol == &quot;file:&quot; ||
-				( r.status &gt;= 200 &amp;&amp; r.status &lt; 300 ) || r.status == 304 || r.status == 1223 ||
-				jQuery.browser.safari &amp;&amp; r.status == undefined;
+			return !xhr.status &amp;&amp; location.protocol == &quot;file:&quot; ||
+				( xhr.status &gt;= 200 &amp;&amp; xhr.status &lt; 300 ) || xhr.status == 304 || xhr.status == 1223;
 		} catch(e){}
 		return false;
 	},
 
 	// Determines if an XMLHttpRequest returns NotModified
-	httpNotModified: function( xml, url ) {
+	httpNotModified: function( xhr, url ) {
 		try {
-			var xmlRes = xml.getResponseHeader(&quot;Last-Modified&quot;);
+			var xhrRes = xhr.getResponseHeader(&quot;Last-Modified&quot;);
 
 			// Firefox always returns 200. check Last-Modified date
-			return xml.status == 304 || xmlRes == jQuery.lastModified[url] ||
-				jQuery.browser.safari &amp;&amp; xml.status == undefined;
+			return xhr.status == 304 || xhrRes == jQuery.lastModified[url];
 		} catch(e){}
 		return false;
 	},
 
-	httpData: function( r, type ) {
-		var ct = r.getResponseHeader(&quot;content-type&quot;);
-		var xml = type == &quot;xml&quot; || !type &amp;&amp; ct &amp;&amp; ct.indexOf(&quot;xml&quot;) &gt;= 0;
-		var data = xml ? r.responseXML : r.responseText;
+	httpData: function( xhr, type, s ) {
+		var ct = xhr.getResponseHeader(&quot;content-type&quot;),
+			xml = type == &quot;xml&quot; || !type &amp;&amp; ct &amp;&amp; ct.indexOf(&quot;xml&quot;) &gt;= 0,
+			data = xml ? xhr.responseXML : xhr.responseText;
 
 		if ( xml &amp;&amp; data.documentElement.tagName == &quot;parsererror&quot; )
 			throw &quot;parsererror&quot;;
+			
+		// Allow a pre-filtering function to sanitize the response
+		// s != null is checked to keep backwards compatibility
+		if( s &amp;&amp; s.dataFilter )
+			data = s.dataFilter( data, type );
 
-		// If the type is &quot;script&quot;, eval it in global context
-		if ( type == &quot;script&quot; )
-			jQuery.globalEval( data );
+		// The filter can actually parse the response
+		if( typeof data === &quot;string&quot; ){
 
-		// Get the JavaScript object, if JSON is used.
-		if ( type == &quot;json&quot; )
-			data = eval(&quot;(&quot; + data + &quot;)&quot;);
+			// If the type is &quot;script&quot;, eval it in global context
+			if ( type == &quot;script&quot; )
+				jQuery.globalEval( data );
 
+			// Get the JavaScript object, if JSON is used.
+			if ( type == &quot;json&quot; )
+				data = window[&quot;eval&quot;](&quot;(&quot; + data + &quot;)&quot;);
+		}
+		
 		return data;
 	},
 
 	// Serialize an array of form elements or a set of
 	// key/values into a query string
 	param: function( a ) {
-		var s = [];
+		var s = [ ];
+
+		function add( key, value ){
+			s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
+		};
 
 		// If an array was passed in, assume that it is an array
 		// of form elements
-		if ( a.constructor == Array || a.jquery )
+		if ( jQuery.isArray(a) || a.jquery )
 			// Serialize the form elements
 			jQuery.each( a, function(){
-				s.push( encodeURIComponent(this.name) + &quot;=&quot; + encodeURIComponent( this.value ) );
+				add( this.name, this.value );
 			});
 
 		// Otherwise, assume that it's an object of key/value pairs
@@ -2829,101 +3609,119 @@ jQuery.extend({
 			// Serialize the key/values
 			for ( var j in a )
 				// If the value is an array then the key names need to be repeated
-				if ( a[j] &amp;&amp; a[j].constructor == Array )
+				if ( jQuery.isArray(a[j]) )
 					jQuery.each( a[j], function(){
-						s.push( encodeURIComponent(j) + &quot;=&quot; + encodeURIComponent( this ) );
+						add( j, this );
 					});
 				else
-					s.push( encodeURIComponent(j) + &quot;=&quot; + encodeURIComponent( a[j] ) );
+					add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] );
 
 		// Return the resulting serialization
 		return s.join(&quot;&amp;&quot;).replace(/%20/g, &quot;+&quot;);
 	}
 
 });
+var elemdisplay = {},
+	fxAttrs = [
+		// height animations
+		[ &quot;height&quot;, &quot;marginTop&quot;, &quot;marginBottom&quot;, &quot;paddingTop&quot;, &quot;paddingBottom&quot; ],
+		// width animations
+		[ &quot;width&quot;, &quot;marginLeft&quot;, &quot;marginRight&quot;, &quot;paddingLeft&quot;, &quot;paddingRight&quot; ],
+		// opacity animations
+		[ &quot;opacity&quot; ]
+	];
+
+function genFx( type, num ){
+	var obj = {};
+	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function(){
+		obj[ this ] = type;
+	});
+	return obj;
+}
+
 jQuery.fn.extend({
 	show: function(speed,callback){
-		return speed ?
-			this.animate({
-				height: &quot;show&quot;, width: &quot;show&quot;, opacity: &quot;show&quot;
-			}, speed, callback) :
-			
-			this.filter(&quot;:hidden&quot;).each(function(){
-				this.style.display = this.oldblock || &quot;&quot;;
-				if ( jQuery.css(this,&quot;display&quot;) == &quot;none&quot; ) {
-					var elem = jQuery(&quot;&lt;&quot; + this.tagName + &quot; /&gt;&quot;).appendTo(&quot;body&quot;);
-					this.style.display = elem.css(&quot;display&quot;);
-					elem.remove();
+		if ( speed ) {
+			return this.animate( genFx(&quot;show&quot;, 3), speed, callback);
+		} else {
+			for ( var i = 0, l = this.length; i &lt; l; i++ ){
+				var old = jQuery.data(this[i], &quot;olddisplay&quot;);
+				
+				this[i].style.display = old || &quot;&quot;;
+				
+				if ( jQuery.css(this[i], &quot;display&quot;) === &quot;none&quot; ) {
+					var tagName = this[i].tagName, display;
+					
+					if ( elemdisplay[ tagName ] ) {
+						display = elemdisplay[ tagName ];
+					} else {
+						var elem = jQuery(&quot;&lt;&quot; + tagName + &quot; /&gt;&quot;).appendTo(&quot;body&quot;);
+						
+						display = elem.css(&quot;display&quot;);
+						if ( display === &quot;none&quot; )
+							display = &quot;block&quot;;
+						
+						elem.remove();
+						
+						elemdisplay[ tagName ] = display;
+					}
+					
+					this[i].style.display = jQuery.data(this[i], &quot;olddisplay&quot;, display);
 				}
-			}).end();
+			}
+			
+			return this;
+		}
 	},
-	
+
 	hide: function(speed,callback){
-		return speed ?
-			this.animate({
-				height: &quot;hide&quot;, width: &quot;hide&quot;, opacity: &quot;hide&quot;
-			}, speed, callback) :
-			
-			this.filter(&quot;:visible&quot;).each(function(){
-				this.oldblock = this.oldblock || jQuery.css(this,&quot;display&quot;);
-				this.style.display = &quot;none&quot;;
-			}).end();
+		if ( speed ) {
+			return this.animate( genFx(&quot;hide&quot;, 3), speed, callback);
+		} else {
+			for ( var i = 0, l = this.length; i &lt; l; i++ ){
+				var old = jQuery.data(this[i], &quot;olddisplay&quot;);
+				if ( !old &amp;&amp; old !== &quot;none&quot; )
+					jQuery.data(this[i], &quot;olddisplay&quot;, jQuery.css(this[i], &quot;display&quot;));
+				this[i].style.display = &quot;none&quot;;
+			}
+			return this;
+		}
 	},
 
 	// Save the old toggle function
 	_toggle: jQuery.fn.toggle,
-	
+
 	toggle: function( fn, fn2 ){
+		var bool = typeof fn === &quot;boolean&quot;;
+
 		return jQuery.isFunction(fn) &amp;&amp; jQuery.isFunction(fn2) ?
-			this._toggle( fn, fn2 ) :
-			fn ?
-				this.animate({
-					height: &quot;toggle&quot;, width: &quot;toggle&quot;, opacity: &quot;toggle&quot;
-				}, fn, fn2) :
+			this._toggle.apply( this, arguments ) :
+			fn == null || bool ?
 				this.each(function(){
-					jQuery(this)[ jQuery(this).is(&quot;:hidden&quot;) ? &quot;show&quot; : &quot;hide&quot; ]();
-				});
-	},
-	
-	slideDown: function(speed,callback){
-		return this.animate({height: &quot;show&quot;}, speed, callback);
-	},
-	
-	slideUp: function(speed,callback){
-		return this.animate({height: &quot;hide&quot;}, speed, callback);
+					var state = bool ? fn : jQuery(this).is(&quot;:hidden&quot;);
+					jQuery(this)[ state ? &quot;show&quot; : &quot;hide&quot; ]();
+				}) :
+				this.animate(genFx(&quot;toggle&quot;, 3), fn, fn2);
 	},
 
-	slideToggle: function(speed, callback){
-		return this.animate({height: &quot;toggle&quot;}, speed, callback);
-	},
-	
-	fadeIn: function(speed, callback){
-		return this.animate({opacity: &quot;show&quot;}, speed, callback);
-	},
-	
-	fadeOut: function(speed, callback){
-		return this.animate({opacity: &quot;hide&quot;}, speed, callback);
-	},
-	
 	fadeTo: function(speed,to,callback){
 		return this.animate({opacity: to}, speed, callback);
 	},
-	
+
 	animate: function( prop, speed, easing, callback ) {
 		var optall = jQuery.speed(speed, easing, callback);
 
 		return this[ optall.queue === false ? &quot;each&quot; : &quot;queue&quot; ](function(){
-			if ( this.nodeType != 1)
-				return false;
-
-			var opt = jQuery.extend({}, optall);
-			var hidden = jQuery(this).is(&quot;:hidden&quot;), self = this;
-			
-			for ( var p in prop ) {
+		
+			var opt = jQuery.extend({}, optall), p,
+				hidden = this.nodeType == 1 &amp;&amp; jQuery(this).is(&quot;:hidden&quot;),
+				self = this;
+	
+			for ( p in prop ) {
 				if ( prop[p] == &quot;hide&quot; &amp;&amp; hidden || prop[p] == &quot;show&quot; &amp;&amp; !hidden )
-					return jQuery.isFunction(opt.complete) &amp;&amp; opt.complete.apply(this);
+					return opt.complete.call(this);
 
-				if ( p == &quot;height&quot; || p == &quot;width&quot; ) {
+				if ( ( p == &quot;height&quot; || p == &quot;width&quot; ) &amp;&amp; this.style ) {
 					// Store display property
 					opt.display = jQuery.css(this, &quot;display&quot;);
 
@@ -2936,7 +3734,7 @@ jQuery.fn.extend({
 				this.style.overflow = &quot;hidden&quot;;
 
 			opt.curAnim = jQuery.extend({}, prop);
-			
+
 			jQuery.each( prop, function(name, val){
 				var e = new jQuery.fx( self, opt, name );
 
@@ -2971,30 +3769,6 @@ jQuery.fn.extend({
 			return true;
 		});
 	},
-	
-	queue: function(type, fn){
-		if ( jQuery.isFunction(type) || ( type &amp;&amp; type.constructor == Array )) {
-			fn = type;
-			type = &quot;fx&quot;;
-		}
-
-		if ( !type || (typeof type == &quot;string&quot; &amp;&amp; !fn) )
-			return queue( this[0], type );
-
-		return this.each(function(){
-			if ( this.nodeType != 1)
-				return;
-
-			if ( fn.constructor == Array )
-				queue(this, type, fn);
-			else {
-				queue(this, type).push( fn );
-			
-				if ( queue(this, type).length == 1 )
-					fn.apply(this);
-			}
-		});
-	},
 
 	stop: function(clearQueue, gotoEnd){
 		var timers = jQuery.timers;
@@ -3022,60 +3796,44 @@ jQuery.fn.extend({
 
 });
 
-var queue = function( elem, type, array ) {
-	if ( !elem )
-		return undefined;
-
-	type = type || &quot;fx&quot;;
-
-	var q = jQuery.data( elem, type + &quot;queue&quot; );
-
-	if ( !q || array )
-		q = jQuery.data( elem, type + &quot;queue&quot;, 
-			array ? jQuery.makeArray(array) : [] );
-
-	return q;
-};
-
-jQuery.fn.dequeue = function(type){
-	type = type || &quot;fx&quot;;
-
-	return this.each(function(){
-		var q = queue(this, type);
-
-		q.shift();
-
-		if ( q.length )
-			q[0].apply( this );
-	});
-};
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx(&quot;show&quot;, 1),
+	slideUp: genFx(&quot;hide&quot;, 1),
+	slideToggle: genFx(&quot;toggle&quot;, 1),
+	fadeIn: { opacity: &quot;show&quot; },
+	fadeOut: { opacity: &quot;hide&quot; }
+}, function( name, props ){
+	jQuery.fn[ name ] = function( speed, callback ){
+		return this.animate( props, speed, callback );
+	};
+});
 
 jQuery.extend({
-	
+
 	speed: function(speed, easing, fn) {
-		var opt = speed &amp;&amp; speed.constructor == Object ? speed : {
-			complete: fn || !fn &amp;&amp; easing || 
+		var opt = typeof speed === &quot;object&quot; ? speed : {
+			complete: fn || !fn &amp;&amp; easing ||
 				jQuery.isFunction( speed ) &amp;&amp; speed,
 			duration: speed,
-			easing: fn &amp;&amp; easing || easing &amp;&amp; easing.constructor != Function &amp;&amp; easing
+			easing: fn &amp;&amp; easing || easing &amp;&amp; !jQuery.isFunction(easing) &amp;&amp; easing
 		};
 
-		opt.duration = (opt.duration &amp;&amp; opt.duration.constructor == Number ? 
-			opt.duration : 
-			{ slow: 600, fast: 200 }[opt.duration]) || 400;
-	
+		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === &quot;number&quot; ? opt.duration :
+			jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
+
 		// Queueing
 		opt.old = opt.complete;
 		opt.complete = function(){
 			if ( opt.queue !== false )
 				jQuery(this).dequeue();
 			if ( jQuery.isFunction( opt.old ) )
-				opt.old.apply( this );
+				opt.old.call( this );
 		};
-	
+
 		return opt;
 	},
-	
+
 	easing: {
 		linear: function( p, n, firstNum, diff ) {
 			return firstNum + diff * p;
@@ -3084,7 +3842,7 @@ jQuery.extend({
 			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
 		}
 	},
-	
+
 	timers: [],
 	timerId: null,
 
@@ -3104,18 +3862,18 @@ jQuery.fx.prototype = {
 	// Simple function for setting a style value
 	update: function(){
 		if ( this.options.step )
-			this.options.step.apply( this.elem, [ this.now, this ] );
+			this.options.step.call( this.elem, this.now, this );
 
 		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
 
 		// Set display property to block for height/width animations
-		if ( this.prop == &quot;height&quot; || this.prop == &quot;width&quot; )
+		if ( ( this.prop == &quot;height&quot; || this.prop == &quot;width&quot; ) &amp;&amp; this.elem.style )
 			this.elem.style.display = &quot;block&quot;;
 	},
 
 	// Get the current size
 	cur: function(force){
-		if ( this.elem[this.prop] != null &amp;&amp; this.elem.style[this.prop] == null )
+		if ( this.elem[this.prop] != null &amp;&amp; (!this.elem.style || this.elem.style[this.prop] == null) )
 			return this.elem[ this.prop ];
 
 		var r = parseFloat(jQuery.css(this.elem, this.prop, force));
@@ -3124,13 +3882,12 @@ jQuery.fx.prototype = {
 
 	// Start an animation from one number to another
 	custom: function(from, to, unit){
-		this.startTime = (new Date()).getTime();
+		this.startTime = now();
 		this.start = from;
 		this.end = to;
 		this.unit = unit || this.unit || &quot;px&quot;;
 		this.now = this.start;
 		this.pos = this.state = 0;
-		this.update();
 
 		var self = this;
 		function t(gotoEnd){
@@ -3141,10 +3898,10 @@ jQuery.fx.prototype = {
 
 		jQuery.timers.push(t);
 
-		if ( jQuery.timerId == null ) {
+		if ( t() &amp;&amp; jQuery.timerId == null ) {
 			jQuery.timerId = setInterval(function(){
 				var timers = jQuery.timers;
-				
+
 				for ( var i = 0; i &lt; timers.length; i++ )
 					if ( !timers[i]() )
 						timers.splice(i--, 1);
@@ -3164,13 +3921,10 @@ jQuery.fx.prototype = {
 		this.options.show = true;
 
 		// Begin the animation
-		this.custom(0, this.cur());
-
 		// Make sure that we start at a small width/height to avoid any
 		// flash of content
-		if ( this.prop == &quot;width&quot; || this.prop == &quot;height&quot; )
-			this.elem.style[this.prop] = &quot;1px&quot;;
-		
+		this.custom(this.prop == &quot;width&quot; || this.prop == &quot;height&quot; ? 1 : 0, this.cur());
+
 		// Start by showing the element
 		jQuery(this.elem).show();
 	},
@@ -3187,9 +3941,9 @@ jQuery.fx.prototype = {
 
 	// Each step of an animation
 	step: function(gotoEnd){
-		var t = (new Date()).getTime();
+		var t = now();
 
-		if ( gotoEnd || t &gt; this.options.duration + this.startTime ) {
+		if ( gotoEnd || t &gt;= this.options.duration + this.startTime ) {
 			this.now = this.end;
 			this.pos = this.state = 1;
 			this.update();
@@ -3205,7 +3959,7 @@ jQuery.fx.prototype = {
 				if ( this.options.display != null ) {
 					// Reset the overflow
 					this.elem.style.overflow = this.options.overflow;
-				
+
 					// Reset the display
 					this.elem.style.display = this.options.display;
 					if ( jQuery.css(this.elem, &quot;display&quot;) == &quot;none&quot; )
@@ -3214,7 +3968,7 @@ jQuery.fx.prototype = {
 
 				// Hide the element if the &quot;hide&quot; operation was done
 				if ( this.options.hide )
-					this.elem.style.display = &quot;none&quot;;
+					jQuery(this.elem).hide();
 
 				// Reset the properties, if the item has been hidden or shown
 				if ( this.options.hide || this.options.show )
@@ -3222,10 +3976,9 @@ jQuery.fx.prototype = {
 						jQuery.attr(this.elem.style, p, this.options.orig[p]);
 			}
 
-			// If a callback was provided, execute it
-			if ( done &amp;&amp; jQuery.isFunction( this.options.complete ) )
+			if ( done )
 				// Execute the complete function
-				this.options.complete.apply( this.elem );
+				this.options.complete.call( this.elem );
 
 			return false;
 		} else {
@@ -3245,119 +3998,229 @@ jQuery.fx.prototype = {
 
 };
 
-jQuery.fx.step = {
-	scrollLeft: function(fx){
-		fx.elem.scrollLeft = fx.now;
+jQuery.extend( jQuery.fx, {
+	speeds:{
+		slow: 600,
+ 		fast: 200,
+ 		// Default speed
+ 		_default: 400
 	},
+	step: {
 
-	scrollTop: function(fx){
-		fx.elem.scrollTop = fx.now;
-	},
+		opacity: function(fx){
+			jQuery.attr(fx.elem.style, &quot;opacity&quot;, fx.now);
+		},
+
+		_default: function(fx){
+			if ( fx.elem.style &amp;&amp; fx.elem.style[ fx.prop ] != null )
+				fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+			else
+				fx.elem[ fx.prop ] = fx.now;
+		}
+	}
+});
+if ( document.documentElement[&quot;getBoundingClientRect&quot;] )
+	jQuery.fn.offset = function() {
+		if ( !this[0] ) return { top: 0, left: 0 };
+		if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
+		var box  = this[0].getBoundingClientRect(), doc = this[0].ownerDocument, body = doc.body, docElem = doc.documentElement,
+			clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
+			top  = box.top  + (self.pageYOffset || jQuery.boxModel &amp;&amp; docElem.scrollTop  || body.scrollTop ) - clientTop,
+			left = box.left + (self.pageXOffset || jQuery.boxModel &amp;&amp; docElem.scrollLeft || body.scrollLeft) - clientLeft;
+		return { top: top, left: left };
+	};
+else 
+	jQuery.fn.offset = function() {
+		if ( !this[0] ) return { top: 0, left: 0 };
+		if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
+		jQuery.offset.initialized || jQuery.offset.initialize();
+
+		var elem = this[0], offsetParent = elem.offsetParent, prevOffsetParent = elem,
+			doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
+			body = doc.body, defaultView = doc.defaultView,
+			prevComputedStyle = defaultView.getComputedStyle(elem, null),
+			top = elem.offsetTop, left = elem.offsetLeft;
+
+		while ( (elem = elem.parentNode) &amp;&amp; elem !== body &amp;&amp; elem !== docElem ) {
+			computedStyle = defaultView.getComputedStyle(elem, null);
+			top -= elem.scrollTop, left -= elem.scrollLeft;
+			if ( elem === offsetParent ) {
+				top += elem.offsetTop, left += elem.offsetLeft;
+				if ( jQuery.offset.doesNotAddBorder &amp;&amp; !(jQuery.offset.doesAddBorderForTableAndCells &amp;&amp; /^t(able|d|h)$/i.test(elem.tagName)) )
+					top  += parseInt( computedStyle.borderTopWidth,  10) || 0,
+					left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
+				prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
+			}
+			if ( jQuery.offset.subtractsBorderForOverflowNotVisible &amp;&amp; computedStyle.overflow !== &quot;visible&quot; )
+				top  += parseInt( computedStyle.borderTopWidth,  10) || 0,
+				left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
+			prevComputedStyle = computedStyle;
+		}
+
+		if ( prevComputedStyle.position === &quot;relative&quot; || prevComputedStyle.position === &quot;static&quot; )
+			top  += body.offsetTop,
+			left += body.offsetLeft;
+
+		if ( prevComputedStyle.position === &quot;fixed&quot; )
+			top  += Math.max(docElem.scrollTop, body.scrollTop),
+			left += Math.max(docElem.scrollLeft, body.scrollLeft);
+
+		return { top: top, left: left };
+	};
+
+jQuery.offset = {
+	initialize: function() {
+		if ( this.initialized ) return;
+		var body = document.body, container = document.createElement('div'), innerDiv, checkDiv, table, td, rules, prop, bodyMarginTop = body.style.marginTop,
+			html = '&lt;div style=&quot;position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;table style=&quot;position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;&quot;cellpadding=&quot;0&quot;cellspacing=&quot;0&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;';
+
+		rules = { position: 'absolute', top: 0, left: 0, margin: 0, border: 0, width: '1px', height: '1px', visibility: 'hidden' };
+		for ( prop in rules ) container.style[prop] = rules[prop];
+
+		container.innerHTML = html;
+		body.insertBefore(container, body.firstChild);
+		innerDiv = container.firstChild, checkDiv = innerDiv.firstChild, td = innerDiv.nextSibling.firstChild.firstChild;
 
-	opacity: function(fx){
-		jQuery.attr(fx.elem.style, &quot;opacity&quot;, fx.now);
+		this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
+		this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
+
+		innerDiv.style.overflow = 'hidden', innerDiv.style.position = 'relative';
+		this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
+
+		body.style.marginTop = '1px';
+		this.doesNotIncludeMarginInBodyOffset = (body.offsetTop === 0);
+		body.style.marginTop = bodyMarginTop;
+
+		body.removeChild(container);
+		this.initialized = true;
 	},
 
-	_default: function(fx){
-		fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+	bodyOffset: function(body) {
+		jQuery.offset.initialized || jQuery.offset.initialize();
+		var top = body.offsetTop, left = body.offsetLeft;
+		if ( jQuery.offset.doesNotIncludeMarginInBodyOffset )
+			top  += parseInt( jQuery.curCSS(body, 'marginTop',  true), 10 ) || 0,
+			left += parseInt( jQuery.curCSS(body, 'marginLeft', true), 10 ) || 0;
+		return { top: top, left: left };
 	}
 };
-// The Offset Method
-// Originally By Brandon Aaron, part of the Dimension Plugin
-// http://jquery.com/plugins/project/dimensions
-jQuery.fn.offset = function() {
-	var left = 0, top = 0, elem = this[0], results;
-	
-	if ( elem ) with ( jQuery.browser ) {
-		var parent       = elem.parentNode, 
-		    offsetChild  = elem,
-		    offsetParent = elem.offsetParent, 
-		    doc          = elem.ownerDocument,
-		    safari2      = safari &amp;&amp; parseInt(version) &lt; 522,
-		    fixed        = jQuery.css(elem, &quot;position&quot;) == &quot;fixed&quot;;
-	
-		// Use getBoundingClientRect if available
-		if ( elem.getBoundingClientRect ) {
-			var box = elem.getBoundingClientRect();
-		
-			// Add the document scroll offsets
-			add(box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
-				box.top  + Math.max(doc.documentElement.scrollTop,  doc.body.scrollTop));
-		
-			// IE adds the HTML element's border, by default it is medium which is 2px
-			// IE 6 and 7 quirks mode the border width is overwritable by the following css html { border: 0; }
-			// IE 7 standards mode, the border is always 2px
-			// This border/offset is typically represented by the clientLeft and clientTop properties
-			// However, in IE6 and 7 quirks mode the clientLeft and clientTop properties are not updated when overwriting it via CSS
-			// Therefore this method will be off by 2px in IE while in quirksmode
-			add( -doc.documentElement.clientLeft, -doc.documentElement.clientTop );
-	
-		// Otherwise loop through the offsetParents and parentNodes
-		} else {
-		
-			// Initial element offsets
-			add( elem.offsetLeft, elem.offsetTop );
-			
-			// Get parent offsets
-			while ( offsetParent ) {
-				// Add offsetParent offsets
-				add( offsetParent.offsetLeft, offsetParent.offsetTop );
-			
-				// Mozilla and Safari &gt; 2 does not include the border on offset parents
-				// However Mozilla adds the border for table or table cells
-				if ( mozilla &amp;&amp; !/^t(able|d|h)$/i.test(offsetParent.tagName) || safari &amp;&amp; !safari2 )
-					border( offsetParent );
-					
-				// Add the document scroll offsets if position is fixed on any offsetParent
-				if ( !fixed &amp;&amp; jQuery.css(offsetParent, &quot;position&quot;) == &quot;fixed&quot; )
-					fixed = true;
-			
-				// Set offsetChild to previous offsetParent unless it is the body element
-				offsetChild  = /^body$/i.test(offsetParent.tagName) ? offsetChild : offsetParent;
-				// Get next offsetParent
-				offsetParent = offsetParent.offsetParent;
-			}
-		
-			// Get parent scroll offsets
-			while ( parent &amp;&amp; parent.tagName &amp;&amp; !/^body|html$/i.test(parent.tagName) ) {
-				// Remove parent scroll UNLESS that parent is inline or a table to work around Opera inline/table scrollLeft/Top bug
-				if ( !/^inline|table.*$/i.test(jQuery.css(parent, &quot;display&quot;)) )
-					// Subtract parent scroll offsets
-					add( -parent.scrollLeft, -parent.scrollTop );
-			
-				// Mozilla does not add the border for a parent that has overflow != visible
-				if ( mozilla &amp;&amp; jQuery.css(parent, &quot;overflow&quot;) != &quot;visible&quot; )
-					border( parent );
-			
-				// Get next parent
-				parent = parent.parentNode;
-			}
-		
-			// Safari &lt;= 2 doubles body offsets with a fixed position element/offsetParent or absolutely positioned offsetChild
-			// Mozilla doubles body offsets with a non-absolutely positioned offsetChild
-			if ( (safari2 &amp;&amp; (fixed || jQuery.css(offsetChild, &quot;position&quot;) == &quot;absolute&quot;)) || 
-				(mozilla &amp;&amp; jQuery.css(offsetChild, &quot;position&quot;) != &quot;absolute&quot;) )
-					add( -doc.body.offsetLeft, -doc.body.offsetTop );
-			
-			// Add the document scroll offsets if position is fixed
-			if ( fixed )
-				add(Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
-					Math.max(doc.documentElement.scrollTop,  doc.body.scrollTop));
+
+
+jQuery.fn.extend({
+	position: function() {
+		var left = 0, top = 0, results;
+
+		if ( this[0] ) {
+			// Get *real* offsetParent
+			var offsetParent = this.offsetParent(),
+
+			// Get correct offsets
+			offset       = this.offset(),
+			parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+			// Subtract element margins
+			// note: when an element has margin: auto the offsetLeft and marginLeft 
+			// are the same in Safari causing offset.left to incorrectly be 0
+			offset.top  -= num( this, 'marginTop'  );
+			offset.left -= num( this, 'marginLeft' );
+
+			// Add offsetParent borders
+			parentOffset.top  += num( offsetParent, 'borderTopWidth'  );
+			parentOffset.left += num( offsetParent, 'borderLeftWidth' );
+
+			// Subtract the two offsets
+			results = {
+				top:  offset.top  - parentOffset.top,
+				left: offset.left - parentOffset.left
+			};
 		}
 
-		// Return an object with top and left properties
-		results = { top: top, left: left };
-	}
+		return results;
+	},
 
-	function border(elem) {
-		add( jQuery.curCSS(elem, &quot;borderLeftWidth&quot;, true), jQuery.curCSS(elem, &quot;borderTopWidth&quot;, true) );
+	offsetParent: function() {
+		var offsetParent = this[0].offsetParent || document.body;
+		while ( offsetParent &amp;&amp; (!/^body|html$/i.test(offsetParent.tagName) &amp;&amp; jQuery.css(offsetParent, 'position') == 'static') )
+			offsetParent = offsetParent.offsetParent;
+		return jQuery(offsetParent);
 	}
+});
 
-	function add(l, t) {
-		left += parseInt(l) || 0;
-		top += parseInt(t) || 0;
-	}
 
-	return results;
-};
-})();
+// Create scrollLeft and scrollTop methods
+jQuery.each( ['Left', 'Top'], function(i, name) {
+	var method = 'scroll' + name;
+	
+	jQuery.fn[ method ] = function(val) {
+		if (!this[0]) return null;
+
+		return val !== undefined ?
+
+			// Set the scroll offset
+			this.each(function() {
+				this == window || this == document ?
+					window.scrollTo(
+						!i ? val : jQuery(window).scrollLeft(),
+						 i ? val : jQuery(window).scrollTop()
+					) :
+					this[ method ] = val;
+			}) :
+
+			// Return the scroll offset
+			this[0] == window || this[0] == document ?
+				self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
+					jQuery.boxModel &amp;&amp; document.documentElement[ method ] ||
+					document.body[ method ] :
+				this[0][ method ];
+	};
+});
+// Create innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ &quot;Height&quot;, &quot;Width&quot; ], function(i, name){
+
+	var tl = i ? &quot;Left&quot;  : &quot;Top&quot;,  // top or left
+		br = i ? &quot;Right&quot; : &quot;Bottom&quot;; // bottom or right
+
+	// innerHeight and innerWidth
+	jQuery.fn[&quot;inner&quot; + name] = function(){
+		return this[ name.toLowerCase() ]() +
+			num(this, &quot;padding&quot; + tl) +
+			num(this, &quot;padding&quot; + br);
+	};
+
+	// outerHeight and outerWidth
+	jQuery.fn[&quot;outer&quot; + name] = function(margin) {
+		return this[&quot;inner&quot; + name]() +
+			num(this, &quot;border&quot; + tl + &quot;Width&quot;) +
+			num(this, &quot;border&quot; + br + &quot;Width&quot;) +
+			(margin ?
+				num(this, &quot;margin&quot; + tl) + num(this, &quot;margin&quot; + br) : 0);
+	};
+	
+	var type = name.toLowerCase();
+
+	jQuery.fn[ type ] = function( size ) {
+		// Get window width or height
+		return this[0] == window ?
+			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+			document.compatMode == &quot;CSS1Compat&quot; &amp;&amp; document.documentElement[ &quot;client&quot; + name ] ||
+			document.body[ &quot;client&quot; + name ] :
+
+			// Get document width or height
+			this[0] == document ?
+				// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+				Math.max(
+					document.documentElement[&quot;client&quot; + name],
+					document.body[&quot;scroll&quot; + name], document.documentElement[&quot;scroll&quot; + name],
+					document.body[&quot;offset&quot; + name], document.documentElement[&quot;offset&quot; + name]
+				) :
+
+				// Get or set width or height on the element
+				size === undefined ?
+					// Get width or height on the element
+					(this.length ? jQuery.css( this[0], type ) : null) :
+
+					// Set the width or height on the element (default to pixels if value is unitless)
+					this.css( type, typeof size === &quot;string&quot; ? size : size + &quot;px&quot; );
+	};
+
+});})();</diff>
      <filename>test/jquery.js</filename>
    </modified>
    <modified>
      <diff>@@ -16,13 +16,13 @@
 		&lt;script src=&quot;../jquery.livequery.js&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
 		&lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;
 			$(function() {
-				// var anim = (function() {
-				// 	var el = $('#anim');
-				// 	return function() {
-				// 		el.toggle(1000, anim);
-				// 	};
-				// })();
-				// anim();
+				var anim = (function() {
+					var el = $('#anim');
+					return function() {
+						el.toggle(1000, anim);
+					};
+				})();
+				anim();
 				
 				/*** Example 1-1 ***/
 				var example1_1 = function() {
@@ -31,29 +31,30 @@
 						.blur();
 					return false;
 				};
-				$('input[@name=example1-1-add]')
+				$('input[name=example1-1-add]')
 					.bind('click', function() {
 						$('ul#example1-1')
 							.append('&lt;li&gt;&lt;a href=&quot;#listitem&quot;&gt;List Item&lt;/a&gt;&lt;/li&gt;');
 						this.blur();
 					});
-				$('input[@name=example1-1-expire]')
+				$('input[name=example1-1-expire]')
 					.bind('click', function() {
-						$('ul#example1-1 a')
+						$('body #example1-1 a')
 							.expire('click');
 						this.blur();
 						this.disabled = true;
-						$('input[@name=example1-1-restart]').attr('disabled', false);
+						$('input[name=example1-1-restart]').attr('disabled', false);
 					});
-				$('input[@name=example1-1-restart]')
+				$('input[name=example1-1-restart]')
 					.bind('click', function() {
-						$('ul#example1-1 a')
+						$('body #example1-1 a')
 							.livequery('click', example1_1);
-						$('input[@name=example1-1-expire]')[0].disabled = false;
-						$('input[@name=example1-1-restart]').attr('disabled', true).blur();
+						$('input[name=example1-1-expire]')[0].disabled = false;
+						$('input[name=example1-1-restart]').attr('disabled', true).blur();
 					});
-				$('ul#example1-1 a')
-					.livequery('click', example1_1);
+				$('#example1-1', 'body')
+					.find('a')
+						.livequery('click', example1_1);
 				
 				/*** Example 1-2 ***/
 				var matched = function() {
@@ -64,46 +65,48 @@
 					$('small', this)
 						.remove();
 				};
-				$('input[@name=example1-2-add]')
+				$('input[name=example1-2-add]')
 					.bind('click', function() {
 						$('ul#example1-2')
 							.append('&lt;li&gt;List Item&lt;/li&gt;');
 						this.blur();
 					});
-				$('input[@name=example1-2-expire]')
+				$('input[name=example1-2-expire]')
 					.bind('click', function() {
-						$('ul#example1-2 li')
+						$('body #example1-2 li')
 							.expire(matched, unmatched);
 						this.blur();
 						this.disabled = true;
-						$('input[@name=example1-2-restart]').attr('disabled', false);
+						$('input[name=example1-2-restart]').attr('disabled', false);
 					});
-				$('input[@name=example1-2-restart]')
+				$('input[name=example1-2-restart]')
 					.bind('click', function() {
-						$('ul#example1-2 li')
+						$('body #example1-2 li')
 							.livequery(matched, unmatched);
-						$('input[@name=example1-2-expire]')[0].disabled = false;
-						$('input[@name=example1-2-restart]').attr('disabled', true).blur();
+						$('input[name=example1-2-expire]')[0].disabled = false;
+						$('input[name=example1-2-restart]').attr('disabled', true).blur();
 					});
-				$('ul#example1-2 li')
-					.livequery(matched, unmatched);
+				$('#example1-2', 'body')
+					.find('li')
+						.livequery(matched, unmatched);
 			});
 		&lt;/script&gt;
 	&lt;/head&gt;
 	&lt;body&gt;
-		&lt;!-- &lt;div id=&quot;anim&quot;&gt;&lt;/div&gt; --&gt;
+		&lt;div id=&quot;anim&quot;&gt;&lt;/div&gt;
 		&lt;h1&gt;Live Query: Unordered List Examples (Using Function References)&lt;/h1&gt;
 		&lt;p&gt;A common use-case is when a new list item is added to an unordered list and an event should be bound to it or a script notified of the change.&lt;/p&gt;
 		
 		&lt;h2&gt;Binding an event to each list item&lt;/h2&gt;
 		&lt;p&gt;The list below uses a live query to bind a click event to each list item that changes the text to read 'Clicked'. Expiring the Live Query unbinds the events.&lt;/p&gt;
-&lt;pre&gt;&lt;code&gt;$('ul#example1-1 a')
-	.livequery('click', function() { 
-		$(this)
-			.text('Clicked')
-			.blur();
-		return false;
-	});
+&lt;pre&gt;&lt;code&gt;$('#example1-1', 'body')
+	.find('a')
+		.livequery('click', function() {
+			$(this)
+				.text('Clicked')
+				.blur();
+			return false;
+		});
 &lt;/code&gt;&lt;/pre&gt;
 		&lt;p&gt;&lt;input type=&quot;button&quot; name=&quot;example1-1-add&quot; value=&quot;Add New Item&quot;&gt; &lt;input type=&quot;button&quot; name=&quot;example1-1-expire&quot; value=&quot;Expire Live Query&quot;&gt; &lt;input type=&quot;button&quot; name=&quot;example1-1-restart&quot; disabled=&quot;disabled&quot; value=&quot;Restart Live Query&quot;&gt;&lt;p&gt;
 		&lt;ul id=&quot;example1-1&quot;&gt;
@@ -123,8 +126,9 @@ var unmatched = function() {
 	$('small', this)
 		.remove();
 };
-$('ul#example1-2 li')
-	.livequery(matched, unmatched);
+$('#example1-2', 'body')
+	.find('li')
+		.livequery(matched, unmatched);
 &lt;/code&gt;&lt;/pre&gt;
 		&lt;p&gt;&lt;input type=&quot;button&quot; name=&quot;example1-2-add&quot; value=&quot;Add New Item&quot;&gt; &lt;input type=&quot;button&quot; name=&quot;example1-2-expire&quot; value=&quot;Expire Live Query&quot;&gt; &lt;input type=&quot;button&quot; name=&quot;example1-2-restart&quot; disabled=&quot;disabled&quot; value=&quot;Restart Live Query&quot;&gt;&lt;p&gt;
 		&lt;ul id=&quot;example1-2&quot;&gt;</diff>
      <filename>test/test.html</filename>
    </modified>
    <modified>
      <diff>@@ -16,13 +16,13 @@
 		&lt;script src=&quot;../jquery.livequery.js&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
 		&lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;
 			$(function() {
-				// var anim = (function() {
-				// 	var el = $('#anim');
-				// 	return function() {
-				// 		el.toggle(1000, anim);
-				// 	};
-				// })();
-				// anim();
+				var anim = (function() {
+					var el = $('#anim');
+					return function() {
+						el.toggle(1000, anim);
+					};
+				})();
+				anim();
 				
 				/*** Example 1-1 ***/
 				var example1_1 = function() {
@@ -31,39 +31,40 @@
 						.blur();
 					return false;
 				};
-				$('input[@name=example1-1-add]')
+				$('input[name=example1-1-add]')
 					.bind('click', function() {
 						$('ul#example1-1')
 							.append('&lt;li&gt;&lt;a href=&quot;#listitem&quot;&gt;List Item&lt;/a&gt;&lt;/li&gt;');
 						this.blur();
 					});
-				$('input[@name=example1-1-expire]')
+				$('input[name=example1-1-expire]')
 					.bind('click', function() {
-						$('ul#example1-1 a')
+						$('body #example1-1 a')
 							.expire('click');
 						this.blur();
 						this.disabled = true;
-						$('input[@name=example1-1-restart]').attr('disabled', false);
+						$('input[name=example1-1-restart]').attr('disabled', false);
 					});
-				$('input[@name=example1-1-restart]')
+				$('input[name=example1-1-restart]')
 					.bind('click', function() {
-						$('ul#example1-1 a')
+						$('body #example1-1 a')
 							.livequery('click', function() {
 								$(this)
 									.text('Clicked')
 									.blur();
 								return false;
 							});
-						$('input[@name=example1-1-expire]')[0].disabled = false;
-						$('input[@name=example1-1-restart]').attr('disabled', true).blur();
-					});
-				$('ul#example1-1 a')
-					.livequery('click', function() {
-						$(this)
-							.text('Clicked')
-							.blur();
-						return false;
+						$('input[name=example1-1-expire]')[0].disabled = false;
+						$('input[name=example1-1-restart]').attr('disabled', true).blur();
 					});
+				$('#example1-1', 'body')
+					.find('a')
+						.livequery('click', function() {
+							$(this)
+								.text('Clicked')
+								.blur();
+							return false;
+						});
 				
 				/*** Example 1-2 ***/
 				var matched = function() {
@@ -74,23 +75,23 @@
 					$('small', this)
 						.remove();
 				};
-				$('input[@name=example1-2-add]')
+				$('input[name=example1-2-add]')
 					.bind('click', function() {
 						$('ul#example1-2')
 							.append('&lt;li&gt;List Item&lt;/li&gt;');
 						this.blur();
 					});
-				$('input[@name=example1-2-expire]')
+				$('input[name=example1-2-expire]')
 					.bind('click', function() {
-						$('ul#example1-2 li')
+						$('body #example1-2 li')
 							.expire();
 						this.blur();
 						this.disabled = true;
-						$('input[@name=example1-2-restart]').attr('disabled', false);
+						$('input[name=example1-2-restart]').attr('disabled', false);
 					});
-				$('input[@name=example1-2-restart]')
+				$('input[name=example1-2-restart]')
 					.bind('click', function() {
-						$('ul#example1-2 li')
+						$('body #example1-2 li')
 							.livequery(function() {
 								$(this)
 									.append('&lt;small&gt;&amp;nbsp;(Updated)&lt;/small&gt;');
@@ -98,34 +99,36 @@
 								$('small', this)
 									.remove();
 							});
-						$('input[@name=example1-2-expire]')[0].disabled = false;
-						$('input[@name=example1-2-restart]').attr('disabled', true).blur();
-					});
-				$('ul#example1-2 li')
-					.livequery(function() {
-						$(this)
-							.append('&lt;small&gt;&amp;nbsp;(Updated)&lt;/small&gt;');
-					}, function() {
-						$('small', this)
-							.remove();
+						$('input[name=example1-2-expire]')[0].disabled = false;
+						$('input[name=example1-2-restart]').attr('disabled', true).blur();
 					});
+				$('body #example1-2')
+					.find('li')
+						.livequery(function() {
+							$(this)
+								.append('&lt;small&gt;&amp;nbsp;(Updated)&lt;/small&gt;');
+						}, function() {
+							$('small', this)
+								.remove();
+						});
 			});
 		&lt;/script&gt;
 	&lt;/head&gt;
 	&lt;body&gt;
-		&lt;!-- &lt;div id=&quot;anim&quot;&gt;&lt;/div&gt; --&gt;
+		&lt;div id=&quot;anim&quot;&gt;&lt;/div&gt;
 		&lt;h1&gt;Live Query: Unordered List Examples (Using Anonymous Functions)&lt;/h1&gt;
 		&lt;p&gt;A common use-case is when a new list item is added to an unordered list and an event should be bound to it or a script notified of the change.&lt;/p&gt;
 		
 		&lt;h2&gt;Binding an event to each list item&lt;/h2&gt;
 		&lt;p&gt;The list below uses a live query to bind a click event to each list item that changes the text to read 'Clicked'. Expiring the Live Query unbinds the events.&lt;/p&gt;
-&lt;pre&gt;&lt;code&gt;$('ul#example1-1 a')
-	.livequery('click', function() { 
-		$(this)
-			.text('Clicked')
-			.blur();
-		return false;
-	});
+&lt;pre&gt;&lt;code&gt;$('ul#example1-1', 'body')
+	.find('a')
+		.livequery('click', function() {
+			$(this)
+				.text('Clicked')
+				.blur();
+			return false;
+		});
 &lt;/code&gt;&lt;/pre&gt;
 		&lt;p&gt;&lt;input type=&quot;button&quot; name=&quot;example1-1-add&quot; value=&quot;Add New Item&quot;&gt; &lt;input type=&quot;button&quot; name=&quot;example1-1-expire&quot; value=&quot;Expire Live Query&quot;&gt; &lt;input type=&quot;button&quot; name=&quot;example1-1-restart&quot; disabled=&quot;disabled&quot; value=&quot;Restart Live Query&quot;&gt;&lt;p&gt;
 		&lt;ul id=&quot;example1-1&quot;&gt;
@@ -145,8 +148,9 @@ var unmatched = function() {
 	$('small', this)
 		.remove();
 };
-$('ul#example1-2 li')
-	.livequery(matched, unmatched);
+$('#example1-2', 'body')
+	.find('li')
+		.livequery(matched, unmatched);
 &lt;/code&gt;&lt;/pre&gt;
 		&lt;p&gt;&lt;input type=&quot;button&quot; name=&quot;example1-2-add&quot; value=&quot;Add New Item&quot;&gt; &lt;input type=&quot;button&quot; name=&quot;example1-2-expire&quot; value=&quot;Expire Live Query&quot;&gt; &lt;input type=&quot;button&quot; name=&quot;example1-2-restart&quot; disabled=&quot;disabled&quot; value=&quot;Restart Live Query&quot;&gt;&lt;p&gt;
 		&lt;ul id=&quot;example1-2&quot;&gt;</diff>
      <filename>test/test2.html</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>2f1a1af282e06292faae3a779fdb9f26ebbb8e47</id>
    </parent>
  </parents>
  <author>
    <name>Brandon Aaron</name>
    <email>brandon.aaron@gmail.com</email>
  </author>
  <url>http://github.com/brandonaaron/livequery/commit/e634549f1e13b5418fb8d75572866846a332ec8d</url>
  <id>e634549f1e13b5418fb8d75572866846a332ec8d</id>
  <committed-date>2009-01-12T19:51:34-08:00</committed-date>
  <authored-date>2009-01-12T19:51:34-08:00</authored-date>
  <message>better integration with jQuery 1.3, older versions of jQuery are no longer supported</message>
  <tree>773cfa4ee17e5dd6d9cfaa4db962e219128f4780</tree>
  <committer>
    <name>Brandon Aaron</name>
    <email>brandon.aaron@gmail.com</email>
  </committer>
</commit>
