[Checkins] SVN: jquery.javascript/trunk/ Upgrade jQuery libraries to version 1.2.6

Dan Korostelev nadako at gmail.com
Mon Dec 15 17:17:37 EST 2008


Log message for revision 94088:
  Upgrade jQuery libraries to version 1.2.6

Changed:
  U   jquery.javascript/trunk/CHANGES.txt
  U   jquery.javascript/trunk/setup.py
  D   jquery.javascript/trunk/src/jquery/javascript/js/jquery-1.1.2.js
  U   jquery.javascript/trunk/src/jquery/javascript/js/jquery.js
  U   jquery.javascript/trunk/src/jquery/javascript/js/jquery.pack.js

-=-
Modified: jquery.javascript/trunk/CHANGES.txt
===================================================================
--- jquery.javascript/trunk/CHANGES.txt	2008-12-15 21:16:58 UTC (rev 94087)
+++ jquery.javascript/trunk/CHANGES.txt	2008-12-15 22:17:37 UTC (rev 94088)
@@ -2,6 +2,10 @@
 CHANGES
 =======
 
+1.2.6 (unreleased)
+
+- Upgrade jQuery version to 1.2.6
+
 1.0.0 (2007-10-30)
 ------------------
 

Modified: jquery.javascript/trunk/setup.py
===================================================================
--- jquery.javascript/trunk/setup.py	2008-12-15 21:16:58 UTC (rev 94087)
+++ jquery.javascript/trunk/setup.py	2008-12-15 22:17:37 UTC (rev 94088)
@@ -22,7 +22,7 @@
     return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
 
 setup(name='jquery.javascript',
-      version='1.1.0',
+      version='1.2.6dev',
       author = "Roger Ineichen and the Zope Community",
       author_email = "zope3-dev at zope.org",
       description = "JQuery integration into Zope 3 via Viewlets",

Deleted: jquery.javascript/trunk/src/jquery/javascript/js/jquery-1.1.2.js
===================================================================
--- jquery.javascript/trunk/src/jquery/javascript/js/jquery-1.1.2.js	2008-12-15 21:16:58 UTC (rev 94087)
+++ jquery.javascript/trunk/src/jquery/javascript/js/jquery-1.1.2.js	2008-12-15 22:17:37 UTC (rev 94088)
@@ -1,2245 +0,0 @@
-/* prevent execution of jQuery if included more than once */
-if(typeof window.jQuery == "undefined") {
-/*
- * jQuery 1.1.2 - New Wave Javascript
- *
- * Copyright (c) 2007 John Resig (jquery.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * $Date: 2007-02-28 12:03:00 -0500 (Wed, 28 Feb 2007) $
- * $Rev: 1465 $
- */
-
-// Global undefined variable
-window.undefined = window.undefined;
-var jQuery = function(a,c) {
-	// If the context is global, return a new object
-	if ( window == this )
-		return new jQuery(a,c);
-
-	// Make sure that a selection was provided
-	a = a || document;
-	
-	// HANDLE: $(function)
-	// Shortcut for document ready
-	if ( jQuery.isFunction(a) )
-		return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( a );
-	
-	// Handle HTML strings
-	if ( typeof a  == "string" ) {
-		// HANDLE: $(html) -> $(array)
-		var m = /^[^<]*(<(.|\s)+>)[^>]*$/.exec(a);
-		if ( m )
-			a = jQuery.clean( [ m[1] ] );
-		
-		// HANDLE: $(expr)
-		else
-			return new jQuery( c ).find( a );
-	}
-	
-	return this.setArray(
-		// HANDLE: $(array)
-		a.constructor == Array && a ||
-
-		// HANDLE: $(arraylike)
-		// Watch for when an array-like object is passed as the selector
-		(a.jquery || a.length && a != window && !a.nodeType && a[0] != undefined && a[0].nodeType) && jQuery.makeArray( a ) ||
-
-		// HANDLE: $(*)
-		[ a ] );
-};
-
-// Map over the $ in case of overwrite
-if ( typeof $ != "undefined" )
-	jQuery._$ = $;
-	
-// Map the jQuery namespace to the '$' one
-var $ = jQuery;
-
-jQuery.fn = jQuery.prototype = {
-	jquery: "1.1.2",
-
-	size: function() {
-		return this.length;
-	},
-	
-	length: 0,
-
-	get: function( num ) {
-		return num == undefined ?
-
-			// Return a 'clean' array
-			jQuery.makeArray( this ) :
-
-			// Return just the object
-			this[num];
-	},
-	pushStack: function( a ) {
-		var ret = jQuery(a);
-		ret.prevObject = this;
-		return ret;
-	},
-	setArray: function( a ) {
-		this.length = 0;
-		[].push.apply( this, a );
-		return this;
-	},
-	each: function( fn, args ) {
-		return jQuery.each( this, fn, args );
-	},
-	index: function( obj ) {
-		var pos = -1;
-		this.each(function(i){
-			if ( this == obj ) pos = i;
-		});
-		return pos;
-	},
-
-	attr: function( key, value, type ) {
-		var obj = key;
-		
-		// Look for the case where we're accessing a style value
-		if ( key.constructor == String )
-			if ( value == undefined )
-				return this.length && jQuery[ type || "attr" ]( this[0], key ) || undefined;
-			else {
-				obj = {};
-				obj[ key ] = value;
-			}
-		
-		// Check to see if we're setting style values
-		return this.each(function(index){
-			// Set all the styles
-			for ( var prop in obj )
-				jQuery.attr(
-					type ? this.style : this,
-					prop, jQuery.prop(this, obj[prop], type, index, prop)
-				);
-		});
-	},
-
-	css: function( key, value ) {
-		return this.attr( key, value, "curCSS" );
-	},
-
-	text: function(e) {
-		if ( typeof e == "string" )
-			return this.empty().append( document.createTextNode( e ) );
-
-		var t = "";
-		jQuery.each( e || this, function(){
-			jQuery.each( this.childNodes, function(){
-				if ( this.nodeType != 8 )
-					t += this.nodeType != 1 ?
-						this.nodeValue : jQuery.fn.text([ this ]);
-			});
-		});
-		return t;
-	},
-
-	wrap: function() {
-		// The elements to wrap the target around
-		var a = jQuery.clean(arguments);
-
-		// Wrap each of the matched elements individually
-		return this.each(function(){
-			// Clone the structure that we're using to wrap
-			var b = a[0].cloneNode(true);
-
-			// Insert it before the element to be wrapped
-			this.parentNode.insertBefore( b, this );
-
-			// Find the deepest point in the wrap structure
-			while ( b.firstChild )
-				b = b.firstChild;
-
-			// Move the matched element to within the wrap structure
-			b.appendChild( this );
-		});
-	},
-	append: function() {
-		return this.domManip(arguments, true, 1, function(a){
-			this.appendChild( a );
-		});
-	},
-	prepend: function() {
-		return this.domManip(arguments, true, -1, function(a){
-			this.insertBefore( a, this.firstChild );
-		});
-	},
-	before: function() {
-		return this.domManip(arguments, false, 1, function(a){
-			this.parentNode.insertBefore( a, this );
-		});
-	},
-	after: function() {
-		return this.domManip(arguments, false, -1, function(a){
-			this.parentNode.insertBefore( a, this.nextSibling );
-		});
-	},
-	end: function() {
-		return this.prevObject || jQuery([]);
-	},
-	find: function(t) {
-		return this.pushStack( jQuery.map( this, function(a){
-			return jQuery.find(t,a);
-		}), t );
-	},
-	clone: function(deep) {
-		return this.pushStack( jQuery.map( this, function(a){
-			var a = a.cloneNode( deep != undefined ? deep : true );
-			a.$events = null; // drop $events expando to avoid firing incorrect events
-			return a;
-		}) );
-	},
-
-	filter: function(t) {
-		return this.pushStack(
-			jQuery.isFunction( t ) &&
-			jQuery.grep(this, function(el, index){
-				return t.apply(el, [index])
-			}) ||
-
-			jQuery.multiFilter(t,this) );
-	},
-
-	not: function(t) {
-		return this.pushStack(
-			t.constructor == String &&
-			jQuery.multiFilter(t, this, true) ||
-
-			jQuery.grep(this, function(a) {
-				return ( t.constructor == Array || t.jquery )
-					? jQuery.inArray( a, t ) < 0
-					: a != t;
-			})
-		);
-	},
-
-	add: function(t) {
-		return this.pushStack( jQuery.merge(
-			this.get(),
-			t.constructor == String ?
-				jQuery(t).get() :
-				t.length != undefined && (!t.nodeName || t.nodeName == "FORM") ?
-					t : [t] )
-		);
-	},
-	is: function(expr) {
-		return expr ? jQuery.filter(expr,this).r.length > 0 : false;
-	},
-
-	val: function( val ) {
-		return val == undefined ?
-			( this.length ? this[0].value : null ) :
-			this.attr( "value", val );
-	},
-
-	html: function( val ) {
-		return val == undefined ?
-			( this.length ? this[0].innerHTML : null ) :
-			this.empty().append( val );
-	},
-	domManip: function(args, table, dir, fn){
-		var clone = this.length > 1; 
-		var a = jQuery.clean(args);
-		if ( dir < 0 )
-			a.reverse();
-
-		return this.each(function(){
-			var obj = this;
-
-			if ( table && jQuery.nodeName(this, "table") && jQuery.nodeName(a[0], "tr") )
-				obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody"));
-
-			jQuery.each( a, function(){
-				fn.apply( obj, [ clone ? this.cloneNode(true) : this ] );
-			});
-
-		});
-	}
-};
-
-jQuery.extend = jQuery.fn.extend = function() {
-	// copy reference to target object
-	var target = arguments[0],
-		a = 1;
-
-	// extend jQuery itself if only one argument is passed
-	if ( arguments.length == 1 ) {
-		target = this;
-		a = 0;
-	}
-	var prop;
-	while (prop = arguments[a++])
-		// Extend the base object
-		for ( var i in prop ) target[i] = prop[i];
-
-	// Return the modified object
-	return target;
-};
-
-jQuery.extend({
-	noConflict: function() {
-		if ( jQuery._$ )
-			$ = jQuery._$;
-		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 && typeof fn != "string" && !fn.nodeName && 
-			typeof fn[0] == "undefined" && /function/i.test( fn + "" );
-	},
-	
-	// check if an element is in a XML document
-	isXMLDoc: function(elem) {
-		return elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
-	},
-
-	nodeName: function( elem, name ) {
-		return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
-	},
-	// args is for internal usage only
-	each: function( obj, fn, args ) {
-		if ( obj.length == undefined )
-			for ( var i in obj )
-				fn.apply( obj[i], args || [i, obj[i]] );
-		else
-			for ( var i = 0, ol = obj.length; i < ol; i++ )
-				if ( fn.apply( obj[i], args || [i, obj[i]] ) === false ) break;
-		return obj;
-	},
-	
-	prop: function(elem, value, type, index, prop){
-			// Handle executable functions
-			if ( jQuery.isFunction( value ) )
-				value = value.call( elem, [index] );
-				
-			// exclude the following css properties to add px
-			var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i;
-
-			// Handle passing in a number to a CSS property
-			return value && value.constructor == Number && type == "curCSS" && !exclude.test(prop) ?
-				value + "px" :
-				value;
-	},
-
-	className: {
-		// internal only, use addClass("class")
-		add: function( elem, c ){
-			jQuery.each( c.split(/\s+/), function(i, cur){
-				if ( !jQuery.className.has( elem.className, cur ) )
-					elem.className += ( elem.className ? " " : "" ) + cur;
-			});
-		},
-
-		// internal only, use removeClass("class")
-		remove: function( elem, c ){
-			elem.className = c ?
-				jQuery.grep( elem.className.split(/\s+/), function(cur){
-					return !jQuery.className.has( c, cur );	
-				}).join(" ") : "";
-		},
-
-		// internal only, use is(".class")
-		has: function( t, c ) {
-			t = t.className || t;
-			// escape regex characters
-			c = c.replace(/([\.\\\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:])/g, "\\$1");
-			return t && new RegExp("(^|\\s)" + c + "(\\s|$)").test( t );
-		}
-	},
-	swap: function(e,o,f) {
-		for ( var i in o ) {
-			e.style["old"+i] = e.style[i];
-			e.style[i] = o[i];
-		}
-		f.apply( e, [] );
-		for ( var i in o )
-			e.style[i] = e.style["old"+i];
-	},
-
-	css: function(e,p) {
-		if ( p == "height" || p == "width" ) {
-			var old = {}, oHeight, oWidth, d = ["Top","Bottom","Right","Left"];
-
-			jQuery.each( d, function(){
-				old["padding" + this] = 0;
-				old["border" + this + "Width"] = 0;
-			});
-
-			jQuery.swap( e, old, function() {
-				if (jQuery.css(e,"display") != "none") {
-					oHeight = e.offsetHeight;
-					oWidth = e.offsetWidth;
-				} else {
-					e = jQuery(e.cloneNode(true))
-						.find(":radio").removeAttr("checked").end()
-						.css({
-							visibility: "hidden", position: "absolute", display: "block", right: "0", left: "0"
-						}).appendTo(e.parentNode)[0];
-
-					var parPos = jQuery.css(e.parentNode,"position");
-					if ( parPos == "" || parPos == "static" )
-						e.parentNode.style.position = "relative";
-
-					oHeight = e.clientHeight;
-					oWidth = e.clientWidth;
-
-					if ( parPos == "" || parPos == "static" )
-						e.parentNode.style.position = "static";
-
-					e.parentNode.removeChild(e);
-				}
-			});
-
-			return p == "height" ? oHeight : oWidth;
-		}
-
-		return jQuery.curCSS( e, p );
-	},
-
-	curCSS: function(elem, prop, force) {
-		var ret;
-		
-		if (prop == "opacity" && jQuery.browser.msie)
-			return jQuery.attr(elem.style, "opacity");
-			
-		if (prop == "float" || prop == "cssFloat")
-		    prop = jQuery.browser.msie ? "styleFloat" : "cssFloat";
-
-		if (!force && elem.style[prop])
-			ret = elem.style[prop];
-
-		else if (document.defaultView && document.defaultView.getComputedStyle) {
-
-			if (prop == "cssFloat" || prop == "styleFloat")
-				prop = "float";
-
-			prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase();
-			var cur = document.defaultView.getComputedStyle(elem, null);
-
-			if ( cur )
-				ret = cur.getPropertyValue(prop);
-			else if ( prop == "display" )
-				ret = "none";
-			else
-				jQuery.swap(elem, { display: "block" }, function() {
-				    var c = document.defaultView.getComputedStyle(this, "");
-				    ret = c && c.getPropertyValue(prop) || "";
-				});
-
-		} else if (elem.currentStyle) {
-
-			var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();});
-			ret = elem.currentStyle[prop] || elem.currentStyle[newProp];
-			
-		}
-
-		return ret;
-	},
-	
-	clean: function(a) {
-		var r = [];
-
-		jQuery.each( a, function(i,arg){
-			if ( !arg ) return;
-
-			if ( arg.constructor == Number )
-				arg = arg.toString();
-			
-			 // Convert html string into DOM nodes
-			if ( typeof arg == "string" ) {
-				// Trim whitespace, otherwise indexOf won't work as expected
-				var s = jQuery.trim(arg), div = document.createElement("div"), tb = [];
-
-				var wrap =
-					 // option or optgroup
-					!s.indexOf("<opt") &&
-					[1, "<select>", "</select>"] ||
-					
-					(!s.indexOf("<thead") || !s.indexOf("<tbody") || !s.indexOf("<tfoot")) &&
-					[1, "<table>", "</table>"] ||
-					
-					!s.indexOf("<tr") &&
-					[2, "<table><tbody>", "</tbody></table>"] ||
-					
-				 	// <thead> matched above
-					(!s.indexOf("<td") || !s.indexOf("<th")) &&
-					[3, "<table><tbody><tr>", "</tr></tbody></table>"] ||
-					
-					[0,"",""];
-
-				// Go to html and back, then peel off extra wrappers
-				div.innerHTML = wrap[1] + s + wrap[2];
-				
-				// Move to the right depth
-				while ( wrap[0]-- )
-					div = div.firstChild;
-				
-				// Remove IE's autoinserted <tbody> from table fragments
-				if ( jQuery.browser.msie ) {
-					
-					// String was a <table>, *may* have spurious <tbody>
-					if ( !s.indexOf("<table") && s.indexOf("<tbody") < 0 ) 
-						tb = div.firstChild && div.firstChild.childNodes;
-						
-					// String was a bare <thead> or <tfoot>
-					else if ( wrap[1] == "<table>" && s.indexOf("<tbody") < 0 )
-						tb = div.childNodes;
-
-					for ( var n = tb.length-1; n >= 0 ; --n )
-						if ( jQuery.nodeName(tb[n], "tbody") && !tb[n].childNodes.length )
-							tb[n].parentNode.removeChild(tb[n]);
-					
-				}
-				
-				arg = [];
-				for (var i=0, l=div.childNodes.length; i<l; i++)
-					arg.push(div.childNodes[i]);
-			}
-
-			if ( arg.length === 0 && !jQuery.nodeName(arg, "form") )
-				return;
-			
-			if ( arg[0] == undefined || jQuery.nodeName(arg, "form") )
-				r.push( arg );
-			else
-				r = jQuery.merge( r, arg );
-
-		});
-
-		return r;
-	},
-	
-	attr: function(elem, name, value){
-		var fix = jQuery.isXMLDoc(elem) ? {} : {
-			"for": "htmlFor",
-			"class": "className",
-			"float": jQuery.browser.msie ? "styleFloat" : "cssFloat",
-			cssFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat",
-			innerHTML: "innerHTML",
-			className: "className",
-			value: "value",
-			disabled: "disabled",
-			checked: "checked",
-			readonly: "readOnly",
-			selected: "selected"
-		};
-		
-		// IE actually uses filters for opacity ... elem is actually elem.style
-		if ( name == "opacity" && jQuery.browser.msie && 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
-			return elem.filter = elem.filter.replace(/alpha\([^\)]*\)/gi,"") +
-				( value == 1 ? "" : "alpha(opacity=" + value * 100 + ")" );
-
-		} else if ( name == "opacity" && jQuery.browser.msie )
-			return elem.filter ? 
-				parseFloat( elem.filter.match(/alpha\(opacity=(.*)\)/)[1] ) / 100 : 1;
-		
-		// Mozilla doesn't play well with opacity 1
-		if ( name == "opacity" && jQuery.browser.mozilla && value == 1 )
-			value = 0.9999;
-			
-
-		// Certain attributes only work when accessed via the old DOM 0 way
-		if ( fix[name] ) {
-			if ( value != undefined ) elem[fix[name]] = value;
-			return elem[fix[name]];
-
-		} else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName(elem, "form") && (name == "action" || name == "method") )
-			return elem.getAttributeNode(name).nodeValue;
-
-		// IE elem.getAttribute passes even for style
-		else if ( elem.tagName ) {
-			if ( value != undefined ) elem.setAttribute( name, value );
-			if ( jQuery.browser.msie && /href|src/.test(name) && !jQuery.isXMLDoc(elem) ) 
-				return elem.getAttribute( name, 2 );
-			return elem.getAttribute( name );
-
-		// elem is actually elem.style ... set the style
-		} else {
-			name = name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});
-			if ( value != undefined ) elem[name] = value;
-			return elem[name];
-		}
-	},
-	trim: function(t){
-		return t.replace(/^\s+|\s+$/g, "");
-	},
-
-	makeArray: function( a ) {
-		var r = [];
-
-		if ( a.constructor != Array )
-			for ( var i = 0, al = a.length; i < al; i++ )
-				r.push( a[i] );
-		else
-			r = a.slice( 0 );
-
-		return r;
-	},
-
-	inArray: function( b, a ) {
-		for ( var i = 0, al = a.length; i < al; i++ )
-			if ( a[i] == b )
-				return i;
-		return -1;
-	},
-	merge: function(first, second) {
-		var r = [].slice.call( first, 0 );
-
-		// Now check for duplicates between the two arrays
-		// and only add the unique items
-		for ( var i = 0, sl = second.length; i < sl; i++ )
-			// Check for duplicates
-			if ( jQuery.inArray( second[i], r ) == -1 )
-				// The item is unique, add it
-				first.push( second[i] );
-
-		return first;
-	},
-	grep: function(elems, fn, inv) {
-		// If a string is passed in for the function, make a function
-		// for it (a handy shortcut)
-		if ( typeof fn == "string" )
-			fn = new Function("a","i","return " + fn);
-
-		var result = [];
-
-		// Go through the array, only saving the items
-		// that pass the validator function
-		for ( var i = 0, el = elems.length; i < el; i++ )
-			if ( !inv && fn(elems[i],i) || inv && !fn(elems[i],i) )
-				result.push( elems[i] );
-
-		return result;
-	},
-	map: function(elems, fn) {
-		// If a string is passed in for the function, make a function
-		// for it (a handy shortcut)
-		if ( typeof fn == "string" )
-			fn = new Function("a","return " + fn);
-
-		var result = [], r = [];
-
-		// Go through the array, translating each of the items to their
-		// new value (or values).
-		for ( var i = 0, el = elems.length; i < el; i++ ) {
-			var val = fn(elems[i],i);
-
-			if ( val !== null && val != undefined ) {
-				if ( val.constructor != Array ) val = [val];
-				result = result.concat( val );
-			}
-		}
-
-		var r = result.length ? [ result[0] ] : [];
-
-		check: for ( var i = 1, rl = result.length; i < rl; i++ ) {
-			for ( var j = 0; j < i; j++ )
-				if ( result[i] == r[j] )
-					continue check;
-
-			r.push( result[i] );
-		}
-
-		return r;
-	}
-});
- 
-/*
- * Whether the W3C compliant box model is being used.
- *
- * @property
- * @name $.boxModel
- * @type Boolean
- * @cat JavaScript
- */
-new function() {
-	var b = navigator.userAgent.toLowerCase();
-
-	// Figure out what browser is being used
-	jQuery.browser = {
-		safari: /webkit/.test(b),
-		opera: /opera/.test(b),
-		msie: /msie/.test(b) && !/opera/.test(b),
-		mozilla: /mozilla/.test(b) && !/(compatible|webkit)/.test(b)
-	};
-
-	// Check to see if the W3C box model is being used
-	jQuery.boxModel = !jQuery.browser.msie || document.compatMode == "CSS1Compat";
-};
-
-jQuery.each({
-	parent: "a.parentNode",
-	parents: "jQuery.parents(a)",
-	next: "jQuery.nth(a,2,'nextSibling')",
-	prev: "jQuery.nth(a,2,'previousSibling')",
-	siblings: "jQuery.sibling(a.parentNode.firstChild,a)",
-	children: "jQuery.sibling(a.firstChild)"
-}, function(i,n){
-	jQuery.fn[ i ] = function(a) {
-		var ret = jQuery.map(this,n);
-		if ( a && typeof a == "string" )
-			ret = jQuery.multiFilter(a,ret);
-		return this.pushStack( ret );
-	};
-});
-
-jQuery.each({
-	appendTo: "append",
-	prependTo: "prepend",
-	insertBefore: "before",
-	insertAfter: "after"
-}, function(i,n){
-	jQuery.fn[ i ] = function(){
-		var a = arguments;
-		return this.each(function(){
-			for ( var j = 0, al = a.length; j < al; j++ )
-				jQuery(a[j])[n]( this );
-		});
-	};
-});
-
-jQuery.each( {
-	removeAttr: function( key ) {
-		jQuery.attr( this, key, "" );
-		this.removeAttribute( key );
-	},
-	addClass: function(c){
-		jQuery.className.add(this,c);
-	},
-	removeClass: function(c){
-		jQuery.className.remove(this,c);
-	},
-	toggleClass: function( c ){
-		jQuery.className[ jQuery.className.has(this,c) ? "remove" : "add" ](this, c);
-	},
-	remove: function(a){
-		if ( !a || jQuery.filter( a, [this] ).r.length )
-			this.parentNode.removeChild( this );
-	},
-	empty: function() {
-		while ( this.firstChild )
-			this.removeChild( this.firstChild );
-	}
-}, function(i,n){
-	jQuery.fn[ i ] = function() {
-		return this.each( n, arguments );
-	};
-});
-
-jQuery.each( [ "eq", "lt", "gt", "contains" ], function(i,n){
-	jQuery.fn[ n ] = function(num,fn) {
-		return this.filter( ":" + n + "(" + num + ")", fn );
-	};
-});
-
-jQuery.each( [ "height", "width" ], function(i,n){
-	jQuery.fn[ n ] = function(h) {
-		return h == undefined ?
-			( this.length ? jQuery.css( this[0], n ) : null ) :
-			this.css( n, h.constructor == String ? h : h + "px" );
-	};
-});
-jQuery.extend({
-	expr: {
-		"": "m[2]=='*'||jQuery.nodeName(a,m[2])",
-		"#": "a.getAttribute('id')==m[2]",
-		":": {
-			// Position Checks
-			lt: "i<m[3]-0",
-			gt: "i>m[3]-0",
-			nth: "m[3]-0==i",
-			eq: "m[3]-0==i",
-			first: "i==0",
-			last: "i==r.length-1",
-			even: "i%2==0",
-			odd: "i%2",
-
-			// Child Checks
-			"nth-child": "jQuery.nth(a.parentNode.firstChild,m[3],'nextSibling',a)==a",
-			"first-child": "jQuery.nth(a.parentNode.firstChild,1,'nextSibling')==a",
-			"last-child": "jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a",
-			"only-child": "jQuery.sibling(a.parentNode.firstChild).length==1",
-
-			// Parent Checks
-			parent: "a.firstChild",
-			empty: "!a.firstChild",
-
-			// Text Check
-			contains: "jQuery.fn.text.apply([a]).indexOf(m[3])>=0",
-
-			// Visibility
-			visible: 'a.type!="hidden"&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"',
-			hidden: 'a.type=="hidden"||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"',
-
-			// Form attributes
-			enabled: "!a.disabled",
-			disabled: "a.disabled",
-			checked: "a.checked",
-			selected: "a.selected||jQuery.attr(a,'selected')",
-
-			// Form elements
-			text: "a.type=='text'",
-			radio: "a.type=='radio'",
-			checkbox: "a.type=='checkbox'",
-			file: "a.type=='file'",
-			password: "a.type=='password'",
-			submit: "a.type=='submit'",
-			image: "a.type=='image'",
-			reset: "a.type=='reset'",
-			button: 'a.type=="button"||jQuery.nodeName(a,"button")',
-			input: "/input|select|textarea|button/i.test(a.nodeName)"
-		},
-		".": "jQuery.className.has(a,m[2])",
-		"@": {
-			"=": "z==m[4]",
-			"!=": "z!=m[4]",
-			"^=": "z&&!z.indexOf(m[4])",
-			"$=": "z&&z.substr(z.length - m[4].length,m[4].length)==m[4]",
-			"*=": "z&&z.indexOf(m[4])>=0",
-			"": "z",
-			_resort: function(m){
-				return ["", m[1], m[3], m[2], m[5]];
-			},
-			_prefix: "z=a[m[3]];if(!z||/href|src/.test(m[3]))z=jQuery.attr(a,m[3]);"
-		},
-		"[": "jQuery.find(m[2],a).length"
-	},
-	
-	// The regular expressions that power the parsing engine
-	parse: [
-		// Match: [@value='test'], [@foo]
-		/^\[ *(@)([a-z0-9_-]*) *([!*$^=]*) *('?"?)(.*?)\4 *\]/i,
-
-		// Match: [div], [div p]
-		/^(\[)\s*(.*?(\[.*?\])?[^[]*?)\s*\]/,
-
-		// Match: :contains('foo')
-		/^(:)([a-z0-9_-]*)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/i,
-
-		// Match: :even, :last-chlid
-		/^([:.#]*)([a-z0-9_*-]*)/i
-	],
-
-	token: [
-		/^(\/?\.\.)/, "a.parentNode",
-		/^(>|\/)/, "jQuery.sibling(a.firstChild)",
-		/^(\+)/, "jQuery.nth(a,2,'nextSibling')",
-		/^(~)/, function(a){
-			var s = jQuery.sibling(a.parentNode.firstChild);
-			return s.slice(jQuery.inArray(a,s) + 1);
-		}
-	],
-
-	multiFilter: function( expr, elems, not ) {
-		var old, cur = [];
-
-		while ( expr && expr != old ) {
-			old = expr;
-			var f = jQuery.filter( expr, elems, not );
-			expr = f.t.replace(/^\s*,\s*/, "" );
-			cur = not ? elems = f.r : jQuery.merge( cur, f.r );
-		}
-
-		return cur;
-	},
-	find: function( t, context ) {
-		// Quickly handle non-string expressions
-		if ( typeof t != "string" )
-			return [ t ];
-
-		// Make sure that the context is a DOM Element
-		if ( context && !context.nodeType )
-			context = null;
-
-		// Set the correct context (if none is provided)
-		context = context || document;
-
-		// Handle the common XPath // expression
-		if ( !t.indexOf("//") ) {
-			context = context.documentElement;
-			t = t.substr(2,t.length);
-
-		// And the / root expression
-		} else if ( !t.indexOf("/") ) {
-			context = context.documentElement;
-			t = t.substr(1,t.length);
-			if ( t.indexOf("/") >= 1 )
-				t = t.substr(t.indexOf("/"),t.length);
-		}
-
-		// Initialize the search
-		var ret = [context], done = [], last = null;
-
-		// Continue while a selector expression exists, and while
-		// we're no longer looping upon ourselves
-		while ( t && last != t ) {
-			var r = [];
-			last = t;
-
-			t = jQuery.trim(t).replace( /^\/\//i, "" );
-
-			var foundToken = false;
-
-			// An attempt at speeding up child selectors that
-			// point to a specific element tag
-			var re = /^[\/>]\s*([a-z0-9*-]+)/i;
-			var m = re.exec(t);
-
-			if ( m ) {
-				// Perform our own iteration and filter
-				jQuery.each( ret, function(){
-					for ( var c = this.firstChild; c; c = c.nextSibling )
-						if ( c.nodeType == 1 && ( jQuery.nodeName(c, m[1]) || m[1] == "*" ) )
-							r.push( c );
-				});
-
-				ret = r;
-				t = t.replace( re, "" );
-				if ( t.indexOf(" ") == 0 ) continue;
-				foundToken = true;
-			} else {
-				// Look for pre-defined expression tokens
-				for ( var i = 0; i < jQuery.token.length; i += 2 ) {
-					// Attempt to match each, individual, token in
-					// the specified order
-					var re = jQuery.token[i];
-					var m = re.exec(t);
-
-					// If the token match was found
-					if ( m ) {
-						// Map it against the token's handler
-						r = ret = jQuery.map( ret, jQuery.isFunction( jQuery.token[i+1] ) ?
-							jQuery.token[i+1] :
-							function(a){ return eval(jQuery.token[i+1]); });
-
-						// And remove the token
-						t = jQuery.trim( t.replace( re, "" ) );
-						foundToken = true;
-						break;
-					}
-				}
-			}
-
-			// See if there's still an expression, and that we haven't already
-			// matched a token
-			if ( t && !foundToken ) {
-				// Handle multiple expressions
-				if ( !t.indexOf(",") ) {
-					// Clean the result set
-					if ( ret[0] == context ) ret.shift();
-
-					// Merge the result sets
-					jQuery.merge( done, ret );
-
-					// Reset the context
-					r = ret = [context];
-
-					// Touch up the selector string
-					t = " " + t.substr(1,t.length);
-
-				} else {
-					// Optomize for the case nodeName#idName
-					var re2 = /^([a-z0-9_-]+)(#)([a-z0-9\\*_-]*)/i;
-					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 = /^([#.]?)([a-z0-9\\*_-]*)/i;
-						m = re2.exec(t);
-					}
-
-					// Try to do a global search by ID, where we can
-					if ( m[1] == "#" && ret[ret.length-1].getElementById ) {
-						// Optimization for HTML document case
-						var oid = ret[ret.length-1].getElementById(m[2]);
-						
-						// Do a quick check for the existence of the actual ID attribute
-						// to avoid selecting by the name attribute in IE
-						if ( jQuery.browser.msie && oid && oid.id != m[2] )
-							oid = jQuery('[@id="'+m[2]+'"]', ret[ret.length-1])[0];
-
-						// Do a quick check for node name (where applicable) so
-						// that div#foo searches will be really fast
-						ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];
-
-					} else {
-						// Pre-compile a regular expression to handle class searches
-						if ( m[1] == "." )
-							var rec = new RegExp("(^|\\s)" + m[2] + "(\\s|$)");
-
-						// We need to find all descendant elements, it is more
-						// efficient to use getAll() when we are already further down
-						// the tree - we try to recognize that here
-						jQuery.each( ret, function(){
-							// Grab the tag name being searched for
-							var tag = m[1] != "" || m[0] == "" ? "*" : m[2];
-
-							// Handle IE7 being really dumb about <object>s
-							if ( jQuery.nodeName(this, "object") && tag == "*" )
-								tag = "param";
-
-							jQuery.merge( r,
-								m[1] != "" && ret.length != 1 ?
-									jQuery.getAll( this, [], m[1], m[2], rec ) :
-									this.getElementsByTagName( tag )
-							);
-						});
-
-						// It's faster to filter by class and be done with it
-						if ( m[1] == "." && ret.length == 1 )
-							r = jQuery.grep( r, function(e) {
-								return rec.test(e.className);
-							});
-
-						// Same with ID filtering
-						if ( m[1] == "#" && ret.length == 1 ) {
-							// Remember, then wipe out, the result set
-							var tmp = r;
-							r = [];
-
-							// Then try to find the element with the ID
-							jQuery.each( tmp, function(){
-								if ( this.getAttribute("id") == m[2] ) {
-									r = [ this ];
-									return false;
-								}
-							});
-						}
-
-						ret = r;
-					}
-
-					t = t.replace( re2, "" );
-				}
-
-			}
-
-			// 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);
-			}
-		}
-
-		// Remove the root context
-		if ( ret && ret[0] == context ) ret.shift();
-
-		// And combine the results
-		jQuery.merge( done, ret );
-
-		return done;
-	},
-
-	filter: function(t,r,not) {
-		// Look for common filter expressions
-		while ( t && /^[a-z[({<*:.#]/i.test(t) ) {
-
-			var p = jQuery.parse, m;
-
-			jQuery.each( p, function(i,re){
-		
-				// Look for, and replace, string-like sequences
-				// and finally build a regexp out of it
-				m = re.exec( t );
-
-				if ( m ) {
-					// Remove what we just matched
-					t = t.substring( m[0].length );
-
-					// Re-organize the first match
-					if ( jQuery.expr[ m[1] ]._resort )
-						m = jQuery.expr[ m[1] ]._resort( m );
-
-					return false;
-				}
-			});
-
-			// :not() is a special case that can be optimized by
-			// keeping it out of the expression list
-			if ( m[1] == ":" && m[2] == "not" )
-				r = jQuery.filter(m[3], r, true).r;
-
-			// Handle classes as a special case (this will help to
-			// improve the speed, as the regexp will only be compiled once)
-			else if ( m[1] == "." ) {
-
-				var re = new RegExp("(^|\\s)" + m[2] + "(\\s|$)");
-				r = jQuery.grep( r, function(e){
-					return re.test(e.className || "");
-				}, not);
-
-			// Otherwise, find the expression to execute
-			} else {
-				var f = jQuery.expr[m[1]];
-				if ( typeof f != "string" )
-					f = jQuery.expr[m[1]][m[2]];
-
-				// Build a custom macro to enclose it
-				eval("f = function(a,i){" +
-					( jQuery.expr[ m[1] ]._prefix || "" ) +
-					"return " + f + "}");
-
-				// Execute it against the current filter
-				r = jQuery.grep( r, f, not );
-			}
-		}
-
-		// Return an array of filtered elements (r)
-		// and the modified expression string (t)
-		return { r: r, t: t };
-	},
-	
-	getAll: function( o, r, token, name, re ) {
-		for ( var s = o.firstChild; s; s = s.nextSibling )
-			if ( s.nodeType == 1 ) {
-				var add = true;
-
-				if ( token == "." )
-					add = s.className && re.test(s.className);
-				else if ( token == "#" )
-					add = s.getAttribute("id") == name;
-	
-				if ( add )
-					r.push( s );
-
-				if ( token == "#" && r.length ) break;
-
-				if ( s.firstChild )
-					jQuery.getAll( s, r, token, name, re );
-			}
-
-		return r;
-	},
-	parents: function( elem ){
-		var matched = [];
-		var cur = elem.parentNode;
-		while ( cur && cur != document ) {
-			matched.push( cur );
-			cur = cur.parentNode;
-		}
-		return matched;
-	},
-	nth: function(cur,result,dir,elem){
-		result = result || 1;
-		var num = 0;
-		for ( ; cur; cur = cur[dir] ) {
-			if ( cur.nodeType == 1 ) num++;
-			if ( num == result || result == "even" && num % 2 == 0 && num > 1 && cur == elem ||
-				result == "odd" && num % 2 == 1 && cur == elem ) return cur;
-		}
-	},
-	sibling: function( n, elem ) {
-		var r = [];
-
-		for ( ; n; n = n.nextSibling ) {
-			if ( n.nodeType == 1 && (!elem || n != elem) )
-				r.push( n );
-		}
-
-		return r;
-	}
-});
-/*
- * A number of helper functions used for managing events.
- * Many of the ideas behind this code orignated from 
- * Dean Edwards' addEvent library.
- */
-jQuery.event = {
-
-	// Bind an event to an element
-	// Original by Dean Edwards
-	add: function(element, type, handler, data) {
-		// For whatever reason, IE has trouble passing the window object
-		// around, causing it to be cloned in the process
-		if ( jQuery.browser.msie && element.setInterval != undefined )
-			element = window;
-
-		// if data is passed, bind to handler
-		if( data ) 
-			handler.data = data;
-
-		// Make sure that the function being executed has a unique ID
-		if ( !handler.guid )
-			handler.guid = this.guid++;
-
-		// Init the element's event structure
-		if (!element.$events)
-			element.$events = {};
-
-		// Get the current list of functions bound to this event
-		var handlers = element.$events[type];
-
-		// If it hasn't been initialized yet
-		if (!handlers) {
-			// Init the event handler queue
-			handlers = element.$events[type] = {};
-
-			// Remember an existing handler, if it's already there
-			if (element["on" + type])
-				handlers[0] = element["on" + type];
-		}
-
-		// Add the function to the element's handler list
-		handlers[handler.guid] = handler;
-
-		// And bind the global event handler to the element
-		element["on" + type] = this.handle;
-
-		// Remember the function in a global list (for triggering)
-		if (!this.global[type])
-			this.global[type] = [];
-		this.global[type].push( element );
-	},
-
-	guid: 1,
-	global: {},
-
-	// Detach an event or set of events from an element
-	remove: function(element, type, handler) {
-		if (element.$events) {
-			var i,j,k;
-			if ( type && type.type ) { // type is actually an event object here
-				handler = type.handler;
-				type    = type.type;
-			}
-			
-			if (type && element.$events[type])
-				// remove the given handler for the given type
-				if ( handler )
-					delete element.$events[type][handler.guid];
-					
-				// remove all handlers for the given type
-				else
-					for ( i in element.$events[type] )
-						delete element.$events[type][i];
-						
-			// remove all handlers		
-			else
-				for ( j in element.$events )
-					this.remove( element, j );
-			
-			// remove event handler if no more handlers exist
-			for ( k in element.$events[type] )
-				if (k) {
-					k = true;
-					break;
-				}
-			if (!k) element["on" + type] = null;
-		}
-	},
-
-	trigger: function(type, data, element) {
-		// Clone the incoming data, if any
-		data = jQuery.makeArray(data || []);
-
-		// Handle a global trigger
-		if ( !element )
-			jQuery.each( this.global[type] || [], function(){
-				jQuery.event.trigger( type, data, this );
-			});
-
-		// Handle triggering a single element
-		else {
-			var handler = element["on" + type ], val,
-				fn = jQuery.isFunction( element[ type ] );
-
-			if ( handler ) {
-				// Pass along a fake event
-				data.unshift( this.fix({ type: type, target: element }) );
-	
-				// Trigger the event
-				if ( (val = handler.apply( element, data )) !== false )
-					this.triggered = true;
-			}
-
-			if ( fn && val !== false )
-				element[ type ]();
-
-			this.triggered = false;
-		}
-	},
-
-	handle: function(event) {
-		// Handle the second event of a trigger and when
-		// an event is called after a page has unloaded
-		if ( typeof jQuery == "undefined" || jQuery.event.triggered ) return;
-
-		// Empty object is for triggered events with no data
-		event = jQuery.event.fix( event || window.event || {} ); 
-
-		// returned undefined or false
-		var returnValue;
-
-		var c = this.$events[event.type];
-
-		var args = [].slice.call( arguments, 1 );
-		args.unshift( event );
-
-		for ( var j in c ) {
-			// Pass in a reference to the handler function itself
-			// So that we can later remove it
-			args[0].handler = c[j];
-			args[0].data = c[j].data;
-
-			if ( c[j].apply( this, args ) === false ) {
-				event.preventDefault();
-				event.stopPropagation();
-				returnValue = false;
-			}
-		}
-
-		// 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 returnValue;
-	},
-
-	fix: function(event) {
-		// Fix target property, if necessary
-		if ( !event.target && event.srcElement )
-			event.target = event.srcElement;
-
-		// Calculate pageX/Y if missing and clientX/Y available
-		if ( event.pageX == undefined && event.clientX != undefined ) {
-			var e = document.documentElement, b = document.body;
-			event.pageX = event.clientX + (e.scrollLeft || b.scrollLeft);
-			event.pageY = event.clientY + (e.scrollTop || b.scrollTop);
-		}
-				
-		// check if target is a textnode (safari)
-		if (jQuery.browser.safari && event.target.nodeType == 3) {
-			// store a copy of the original event object 
-			// and clone because target is read only
-			var originalEvent = event;
-			event = jQuery.extend({}, originalEvent);
-			
-			// get parentnode from textnode
-			event.target = originalEvent.target.parentNode;
-			
-			// add preventDefault and stopPropagation since 
-			// they will not work on the clone
-			event.preventDefault = function() {
-				return originalEvent.preventDefault();
-			};
-			event.stopPropagation = function() {
-				return originalEvent.stopPropagation();
-			};
-		}
-		
-		// fix preventDefault and stopPropagation
-		if (!event.preventDefault)
-			event.preventDefault = function() {
-				this.returnValue = false;
-			};
-			
-		if (!event.stopPropagation)
-			event.stopPropagation = function() {
-				this.cancelBubble = true;
-			};
-			
-		return event;
-	}
-};
-
-jQuery.fn.extend({
-	bind: function( type, data, fn ) {
-		return this.each(function(){
-			jQuery.event.add( this, type, fn || data, data );
-		});
-	},
-	one: function( type, data, fn ) {
-		return this.each(function(){
-			jQuery.event.add( this, type, function(event) {
-				jQuery(this).unbind(event);
-				return (fn || data).apply( this, arguments);
-			}, data);
-		});
-	},
-	unbind: function( type, fn ) {
-		return this.each(function(){
-			jQuery.event.remove( this, type, fn );
-		});
-	},
-	trigger: function( type, data ) {
-		return this.each(function(){
-			jQuery.event.trigger( type, data, this );
-		});
-	},
-	toggle: function() {
-		// Save reference to arguments for access in closure
-		var a = arguments;
-
-		return this.click(function(e) {
-			// Figure out which function to execute
-			this.lastToggle = this.lastToggle == 0 ? 1 : 0;
-			
-			// Make sure that clicks stop
-			e.preventDefault();
-			
-			// and execute the function
-			return a[this.lastToggle].apply( this, [e] ) || false;
-		});
-	},
-	hover: function(f,g) {
-		
-		// A private function for handling mouse 'hovering'
-		function handleHover(e) {
-			// Check if mouse(over|out) are still within the same parent element
-			var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
-	
-			// Traverse up the tree
-			while ( p && p != this ) try { p = p.parentNode } catch(e) { p = this; };
-			
-			// If we actually just moused on to a sub-element, ignore it
-			if ( p == this ) return false;
-			
-			// Execute the right function
-			return (e.type == "mouseover" ? f : g).apply(this, [e]);
-		}
-		
-		// Bind the function to the two event listeners
-		return this.mouseover(handleHover).mouseout(handleHover);
-	},
-	ready: function(f) {
-		// If the DOM is already ready
-		if ( jQuery.isReady )
-			// Execute the function immediately
-			f.apply( document, [jQuery] );
-			
-		// Otherwise, remember the function for later
-		else {
-			// Add the function to the wait list
-			jQuery.readyList.push( function() { return f.apply(this, [jQuery]) } );
-		}
-	
-		return this;
-	}
-});
-
-jQuery.extend({
-	/*
-	 * All the code that makes DOM Ready work nicely.
-	 */
-	isReady: false,
-	readyList: [],
-	
-	// Handle when the DOM is ready
-	ready: function() {
-		// Make sure that the DOM is not already loaded
-		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 );
-				});
-				
-				// Reset the list of functions
-				jQuery.readyList = null;
-			}
-			// Remove event lisenter to avoid memory leak
-			if ( jQuery.browser.mozilla || jQuery.browser.opera )
-				document.removeEventListener( "DOMContentLoaded", jQuery.ready, false );
-		}
-	}
-});
-
-new function(){
-
-	jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
-		"mousedown,mouseup,mousemove,mouseover,mouseout,change,select," + 
-		"submit,keydown,keypress,keyup,error").split(","), function(i,o){
-		
-		// Handle event binding
-		jQuery.fn[o] = function(f){
-			return f ? this.bind(o, f) : this.trigger(o);
-		};
-			
-	});
-	
-	// If Mozilla is used
-	if ( jQuery.browser.mozilla || jQuery.browser.opera )
-		// Use the handy event callback
-		document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
-	
-	// If IE is used, use the excellent hack by Matthias Miller
-	// http://www.outofhanwell.com/blog/index.php?title=the_window_onload_problem_revisited
-	else if ( jQuery.browser.msie ) {
-	
-		// Only works if you document.write() it
-		document.write("<scr" + "ipt id=__ie_init defer=true " + 
-			"src=//:><\/script>");
-	
-		// Use the defer script hack
-		var script = document.getElementById("__ie_init");
-		
-		// script does not exist if jQuery is loaded dynamically
-		if ( script ) 
-			script.onreadystatechange = function() {
-				if ( this.readyState != "complete" ) return;
-				this.parentNode.removeChild( this );
-				jQuery.ready();
-			};
-	
-		// Clear from memory
-		script = null;
-	
-	// If Safari  is used
-	} else if ( jQuery.browser.safari )
-		// Continually check to see if the document.readyState is valid
-		jQuery.safariTimer = setInterval(function(){
-			// loaded and complete are both valid states
-			if ( document.readyState == "loaded" || 
-				document.readyState == "complete" ) {
-	
-				// If either one are found, remove the timer
-				clearInterval( jQuery.safariTimer );
-				jQuery.safariTimer = null;
-	
-				// and execute any waiting functions
-				jQuery.ready();
-			}
-		}, 10); 
-
-	// A fallback to window.onload, that will always work
-	jQuery.event.add( window, "load", jQuery.ready );
-	
-};
-
-// Clean up after IE to avoid memory leaks
-if (jQuery.browser.msie)
-	jQuery(window).one("unload", function() {
-		var global = jQuery.event.global;
-		for ( var type in global ) {
-			var els = global[type], i = els.length;
-			if ( i && type != 'unload' )
-				do
-					jQuery.event.remove(els[i-1], type);
-				while (--i);
-		}
-	});
-jQuery.fn.extend({
-	loadIfModified: function( url, params, callback ) {
-		this.load( url, params, callback, 1 );
-	},
-	load: function( url, params, callback, ifModified ) {
-		if ( jQuery.isFunction( url ) )
-			return this.bind("load", url);
-
-		callback = callback || function(){};
-
-		// Default to a GET request
-		var type = "GET";
-
-		// If the second parameter was provided
-		if ( params )
-			// If it's a function
-			if ( jQuery.isFunction( params ) ) {
-				// We assume that it's the callback
-				callback = params;
-				params = null;
-
-			// Otherwise, build a param string
-			} else {
-				params = jQuery.param( params );
-				type = "POST";
-			}
-
-		var self = this;
-
-		// Request the remote document
-		jQuery.ajax({
-			url: url,
-			type: type,
-			data: params,
-			ifModified: ifModified,
-			complete: function(res, status){
-				if ( status == "success" || !ifModified && status == "notmodified" )
-					// Inject the HTML into all the matched elements
-					self.attr("innerHTML", res.responseText)
-					  // Execute all the scripts inside of the newly-injected HTML
-					  .evalScripts()
-					  // Execute callback
-					  .each( callback, [res.responseText, status, res] );
-				else
-					callback.apply( self, [res.responseText, status, res] );
-			}
-		});
-		return this;
-	},
-	serialize: function() {
-		return jQuery.param( this );
-	},
-	evalScripts: function() {
-		return this.find("script").each(function(){
-			if ( this.src )
-				jQuery.getScript( this.src );
-			else
-				jQuery.globalEval( this.text || this.textContent || this.innerHTML || "" );
-		}).end();
-	}
-
-});
-
-// If IE is used, create a wrapper for the XMLHttpRequest object
-if ( !window.XMLHttpRequest )
-	XMLHttpRequest = function(){
-		return new ActiveXObject("Microsoft.XMLHTTP");
-	};
-
-// Attach a bunch of functions for handling common AJAX events
-
-jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
-	jQuery.fn[o] = function(f){
-		return this.bind(o, f);
-	};
-});
-
-jQuery.extend({
-	get: function( url, data, callback, type, ifModified ) {
-		// shift arguments if data argument was ommited
-		if ( jQuery.isFunction( data ) ) {
-			callback = data;
-			data = null;
-		}
-		
-		return jQuery.ajax({
-			url: url,
-			data: data,
-			success: callback,
-			dataType: type,
-			ifModified: ifModified
-		});
-	},
-	getIfModified: function( url, data, callback, type ) {
-		return jQuery.get(url, data, callback, type, 1);
-	},
-	getScript: function( url, callback ) {
-		return jQuery.get(url, null, callback, "script");
-	},
-	getJSON: function( url, data, callback ) {
-		return jQuery.get(url, data, callback, "json");
-	},
-	post: function( url, data, callback, type ) {
-		if ( jQuery.isFunction( data ) ) {
-			callback = data;
-			data = {};
-		}
-
-		return jQuery.ajax({
-			type: "POST",
-			url: url,
-			data: data,
-			success: callback,
-			dataType: type
-		});
-	},
-
-	// timeout (ms)
-	//timeout: 0,
-	ajaxTimeout: function( timeout ) {
-		jQuery.ajaxSettings.timeout = timeout;
-	},
-	ajaxSetup: function( settings ) {
-		jQuery.extend( jQuery.ajaxSettings, settings );
-	},
-
-	ajaxSettings: {
-		global: true,
-		type: "GET",
-		timeout: 0,
-		contentType: "application/x-www-form-urlencoded",
-		processData: true,
-		async: true,
-		data: null
-	},
-	
-	// Last-Modified header cache for next request
-	lastModified: {},
-	ajax: function( s ) {
-		// TODO introduce global settings, allowing the client to modify them for all requests, not only timeout
-		s = jQuery.extend({}, jQuery.ajaxSettings, s);
-
-		// if data available
-		if ( s.data ) {
-			// convert data if not already a string
-			if (s.processData && typeof s.data != "string")
-    			s.data = jQuery.param(s.data);
-			// append data to url for get requests
-			if( s.type.toLowerCase() == "get" ) {
-				// "?" + data or "&" + data (in case there are already params)
-				s.url += ((s.url.indexOf("?") > -1) ? "&" : "?") + s.data;
-				// IE likes to send both get and post data, prevent this
-				s.data = null;
-			}
-		}
-
-		// Watch for a new set of requests
-		if ( s.global && ! jQuery.active++ )
-			jQuery.event.trigger( "ajaxStart" );
-
-		var requestDone = false;
-
-		// Create the request object
-		var xml = new XMLHttpRequest();
-
-		// Open the socket
-		xml.open(s.type, s.url, s.async);
-
-		// Set the correct header, if data is being sent
-		if ( s.data )
-			xml.setRequestHeader("Content-Type", s.contentType);
-
-		// Set the If-Modified-Since header, if ifModified mode.
-		if ( s.ifModified )
-			xml.setRequestHeader("If-Modified-Since",
-				jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
-
-		// Set header so the called script knows that it's an XMLHttpRequest
-		xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");
-
-		// Make sure the browser sends the right content length
-		if ( xml.overrideMimeType )
-			xml.setRequestHeader("Connection", "close");
-			
-		// Allow custom headers/mimetypes
-		if( s.beforeSend )
-			s.beforeSend(xml);
-			
-		if ( s.global )
-		    jQuery.event.trigger("ajaxSend", [xml, s]);
-
-		// Wait for a response to come back
-		var onreadystatechange = function(isTimeout){
-			// The transfer is complete and the data is available, or the request timed out
-			if ( xml && (xml.readyState == 4 || isTimeout == "timeout") ) {
-				requestDone = true;
-				
-				// clear poll interval
-				if (ival) {
-					clearInterval(ival);
-					ival = null;
-				}
-				
-				var status;
-				try {
-					status = jQuery.httpSuccess( xml ) && isTimeout != "timeout" ?
-						s.ifModified && jQuery.httpNotModified( xml, s.url ) ? "notmodified" : "success" : "error";
-					// Make sure that the request was successful or notmodified
-					if ( status != "error" ) {
-						// Cache Last-Modified header, if ifModified mode.
-						var modRes;
-						try {
-							modRes = xml.getResponseHeader("Last-Modified");
-						} catch(e) {} // swallow exception thrown by FF if header is not available
-	
-						if ( s.ifModified && modRes )
-							jQuery.lastModified[s.url] = modRes;
-	
-						// process the data (runs the xml through httpData regardless of callback)
-						var data = jQuery.httpData( xml, s.dataType );
-	
-						// If a local callback was specified, fire it and pass it the data
-						if ( s.success )
-							s.success( data, status );
-	
-						// Fire the global callback
-						if( s.global )
-							jQuery.event.trigger( "ajaxSuccess", [xml, s] );
-					} else
-						jQuery.handleError(s, xml, status);
-				} catch(e) {
-					status = "error";
-					jQuery.handleError(s, xml, status, e);
-				}
-
-				// The request was completed
-				if( s.global )
-					jQuery.event.trigger( "ajaxComplete", [xml, s] );
-
-				// Handle the global AJAX counter
-				if ( s.global && ! --jQuery.active )
-					jQuery.event.trigger( "ajaxStop" );
-
-				// Process result
-				if ( s.complete )
-					s.complete(xml, status);
-
-				// Stop memory leaks
-				if(s.async)
-					xml = null;
-			}
-		};
-		
-		// don't attach the handler to the request, just poll it instead
-		var ival = setInterval(onreadystatechange, 13); 
-
-		// Timeout checker
-		if ( s.timeout > 0 )
-			setTimeout(function(){
-				// Check to see if the request is still happening
-				if ( xml ) {
-					// Cancel the request
-					xml.abort();
-
-					if( !requestDone )
-						onreadystatechange( "timeout" );
-				}
-			}, s.timeout);
-			
-		// Send the data
-		try {
-			xml.send(s.data);
-		} catch(e) {
-			jQuery.handleError(s, xml, null, e);
-		}
-		
-		// firefox 1.5 doesn't fire statechange for sync requests
-		if ( !s.async )
-			onreadystatechange();
-		
-		// return XMLHttpRequest to allow aborting the request etc.
-		return xml;
-	},
-
-	handleError: function( s, xml, status, e ) {
-		// If a local callback was specified, fire it
-		if ( s.error ) s.error( xml, status, e );
-
-		// Fire the global callback
-		if ( s.global )
-			jQuery.event.trigger( "ajaxError", [xml, s, e] );
-	},
-
-	// Counter for holding the number of active queries
-	active: 0,
-
-	// Determines if an XMLHttpRequest was successful or not
-	httpSuccess: function( r ) {
-		try {
-			return !r.status && location.protocol == "file:" ||
-				( r.status >= 200 && r.status < 300 ) || r.status == 304 ||
-				jQuery.browser.safari && r.status == undefined;
-		} catch(e){}
-		return false;
-	},
-
-	// Determines if an XMLHttpRequest returns NotModified
-	httpNotModified: function( xml, url ) {
-		try {
-			var xmlRes = xml.getResponseHeader("Last-Modified");
-
-			// Firefox always returns 200. check Last-Modified date
-			return xml.status == 304 || xmlRes == jQuery.lastModified[url] ||
-				jQuery.browser.safari && xml.status == undefined;
-		} catch(e){}
-		return false;
-	},
-
-	/* Get the data out of an XMLHttpRequest.
-	 * Return parsed XML if content-type header is "xml" and type is "xml" or omitted,
-	 * otherwise return plain text.
-	 * (String) data - The type of data that you're expecting back,
-	 * (e.g. "xml", "html", "script")
-	 */
-	httpData: function( r, type ) {
-		var ct = r.getResponseHeader("content-type");
-		var data = !type && ct && ct.indexOf("xml") >= 0;
-		data = type == "xml" || data ? r.responseXML : r.responseText;
-
-		// If the type is "script", eval it in global context
-		if ( type == "script" )
-			jQuery.globalEval( data );
-
-		// Get the JavaScript object, if JSON is used.
-		if ( type == "json" )
-			eval( "data = " + data );
-
-		// evaluate scripts within html
-		if ( type == "html" )
-			jQuery("<div>").html(data).evalScripts();
-
-		return data;
-	},
-
-	// Serialize an array of form elements or a set of
-	// key/values into a query string
-	param: function( a ) {
-		var s = [];
-
-		// If an array was passed in, assume that it is an array
-		// of form elements
-		if ( a.constructor == Array || a.jquery )
-			// Serialize the form elements
-			jQuery.each( a, function(){
-				s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );
-			});
-
-		// Otherwise, assume that it's an object of key/value pairs
-		else
-			// 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] && a[j].constructor == Array )
-					jQuery.each( a[j], function(){
-						s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) );
-					});
-				else
-					s.push( encodeURIComponent(j) + "=" + encodeURIComponent( a[j] ) );
-
-		// Return the resulting serialization
-		return s.join("&");
-	},
-	
-	// evalulates a script in global context
-	// not reliable for safari
-	globalEval: function( data ) {
-		if ( window.execScript )
-			window.execScript( data );
-		else if ( jQuery.browser.safari )
-			// safari doesn't provide a synchronous global eval
-			window.setTimeout( data, 0 );
-		else
-			eval.call( window, data );
-	}
-
-});
-jQuery.fn.extend({
-
-	show: function(speed,callback){
-		var hidden = this.filter(":hidden");
-		speed ?
-			hidden.animate({
-				height: "show", width: "show", opacity: "show"
-			}, speed, callback) :
-			
-			hidden.each(function(){
-				this.style.display = this.oldblock ? this.oldblock : "";
-				if ( jQuery.css(this,"display") == "none" )
-					this.style.display = "block";
-			});
-		return this;
-	},
-
-	hide: function(speed,callback){
-		var visible = this.filter(":visible");
-		speed ?
-			visible.animate({
-				height: "hide", width: "hide", opacity: "hide"
-			}, speed, callback) :
-			
-			visible.each(function(){
-				this.oldblock = this.oldblock || jQuery.css(this,"display");
-				if ( this.oldblock == "none" )
-					this.oldblock = "block";
-				this.style.display = "none";
-			});
-		return this;
-	},
-
-	// Save the old toggle function
-	_toggle: jQuery.fn.toggle,
-	toggle: function( fn, fn2 ){
-		var args = arguments;
-		return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
-			this._toggle( fn, fn2 ) :
-			this.each(function(){
-				jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]
-					.apply( jQuery(this), args );
-			});
-	},
-	slideDown: function(speed,callback){
-		return this.animate({height: "show"}, speed, callback);
-	},
-	slideUp: function(speed,callback){
-		return this.animate({height: "hide"}, speed, callback);
-	},
-	slideToggle: function(speed, callback){
-		return this.each(function(){
-			var state = jQuery(this).is(":hidden") ? "show" : "hide";
-			jQuery(this).animate({height: state}, speed, callback);
-		});
-	},
-	fadeIn: function(speed, callback){
-		return this.animate({opacity: "show"}, speed, callback);
-	},
-	fadeOut: function(speed, callback){
-		return this.animate({opacity: "hide"}, speed, callback);
-	},
-	fadeTo: function(speed,to,callback){
-		return this.animate({opacity: to}, speed, callback);
-	},
-	animate: function( prop, speed, easing, callback ) {
-		return this.queue(function(){
-		
-			this.curAnim = jQuery.extend({}, prop);
-			var opt = jQuery.speed(speed, easing, callback);
-			
-			for ( var p in prop ) {
-				var e = new jQuery.fx( this, opt, p );
-				if ( prop[p].constructor == Number )
-					e.custom( e.cur(), prop[p] );
-				else
-					e[ prop[p] ]( prop );
-			}
-			
-		});
-	},
-	queue: function(type,fn){
-		if ( !fn ) {
-			fn = type;
-			type = "fx";
-		}
-	
-		return this.each(function(){
-			if ( !this.queue )
-				this.queue = {};
-	
-			if ( !this.queue[type] )
-				this.queue[type] = [];
-	
-			this.queue[type].push( fn );
-		
-			if ( this.queue[type].length == 1 )
-				fn.apply(this);
-		});
-	}
-
-});
-
-jQuery.extend({
-	
-	speed: function(speed, easing, fn) {
-		var opt = speed && speed.constructor == Object ? speed : {
-			complete: fn || !fn && easing || 
-				jQuery.isFunction( speed ) && speed,
-			duration: speed,
-			easing: fn && easing || easing && easing.constructor != Function && easing
-		};
-
-		opt.duration = (opt.duration && opt.duration.constructor == Number ? 
-			opt.duration : 
-			{ slow: 600, fast: 200 }[opt.duration]) || 400;
-	
-		// Queueing
-		opt.old = opt.complete;
-		opt.complete = function(){
-			jQuery.dequeue(this, "fx");
-			if ( jQuery.isFunction( opt.old ) )
-				opt.old.apply( this );
-		};
-	
-		return opt;
-	},
-	
-	easing: {},
-	
-	queue: {},
-	
-	dequeue: function(elem,type){
-		type = type || "fx";
-	
-		if ( elem.queue && elem.queue[type] ) {
-			// Remove self
-			elem.queue[type].shift();
-	
-			// Get next function
-			var f = elem.queue[type][0];
-		
-			if ( f ) f.apply( elem );
-		}
-	},
-
-	/*
-	 * I originally wrote fx() as a clone of moo.fx and in the process
-	 * of making it small in size the code became illegible to sane
-	 * people. You've been warned.
-	 */
-	
-	fx: function( elem, options, prop ){
-
-		var z = this;
-
-		// The styles
-		var y = elem.style;
-		
-		// Store display property
-		var oldDisplay = jQuery.css(elem, "display");
-
-		// Make sure that nothing sneaks out
-		y.overflow = "hidden";
-
-		// Simple function for setting a style value
-		z.a = function(){
-			if ( options.step )
-				options.step.apply( elem, [ z.now ] );
-
-			if ( prop == "opacity" )
-				jQuery.attr(y, "opacity", z.now); // Let attr handle opacity
-			else if ( parseInt(z.now) ) // My hate for IE will never die
-				y[prop] = parseInt(z.now) + "px";
-			
-			y.display = "block"; // Set display property to block for animation
-		};
-
-		// Figure out the maximum number to run to
-		z.max = function(){
-			return parseFloat( jQuery.css(elem,prop) );
-		};
-
-		// Get the current size
-		z.cur = function(){
-			var r = parseFloat( jQuery.curCSS(elem, prop) );
-			return r && r > -10000 ? r : z.max();
-		};
-
-		// Start an animation from one number to another
-		z.custom = function(from,to){
-			z.startTime = (new Date()).getTime();
-			z.now = from;
-			z.a();
-
-			z.timer = setInterval(function(){
-				z.step(from, to);
-			}, 13);
-		};
-
-		// Simple 'show' function
-		z.show = function(){
-			if ( !elem.orig ) elem.orig = {};
-
-			// Remember where we started, so that we can go back to it later
-			elem.orig[prop] = this.cur();
-
-			options.show = true;
-
-			// Begin the animation
-			z.custom(0, elem.orig[prop]);
-
-			// Stupid IE, look what you made me do
-			if ( prop != "opacity" )
-				y[prop] = "1px";
-		};
-
-		// Simple 'hide' function
-		z.hide = function(){
-			if ( !elem.orig ) elem.orig = {};
-
-			// Remember where we started, so that we can go back to it later
-			elem.orig[prop] = this.cur();
-
-			options.hide = true;
-
-			// Begin the animation
-			z.custom(elem.orig[prop], 0);
-		};
-		
-		//Simple 'toggle' function
-		z.toggle = function() {
-			if ( !elem.orig ) elem.orig = {};
-
-			// Remember where we started, so that we can go back to it later
-			elem.orig[prop] = this.cur();
-
-			if(oldDisplay == "none")  {
-				options.show = true;
-				
-				// Stupid IE, look what you made me do
-				if ( prop != "opacity" )
-					y[prop] = "1px";
-
-				// Begin the animation
-				z.custom(0, elem.orig[prop]);	
-			} else {
-				options.hide = true;
-
-				// Begin the animation
-				z.custom(elem.orig[prop], 0);
-			}		
-		};
-
-		// Each step of an animation
-		z.step = function(firstNum, lastNum){
-			var t = (new Date()).getTime();
-
-			if (t > options.duration + z.startTime) {
-				// Stop the timer
-				clearInterval(z.timer);
-				z.timer = null;
-
-				z.now = lastNum;
-				z.a();
-
-				if (elem.curAnim) elem.curAnim[ prop ] = true;
-
-				var done = true;
-				for ( var i in elem.curAnim )
-					if ( elem.curAnim[i] !== true )
-						done = false;
-
-				if ( done ) {
-					// Reset the overflow
-					y.overflow = "";
-					
-					// Reset the display
-					y.display = oldDisplay;
-					if (jQuery.css(elem, "display") == "none")
-						y.display = "block";
-
-					// Hide the element if the "hide" operation was done
-					if ( options.hide ) 
-						y.display = "none";
-
-					// Reset the properties, if the item has been hidden or shown
-					if ( options.hide || options.show )
-						for ( var p in elem.curAnim )
-							if (p == "opacity")
-								jQuery.attr(y, p, elem.orig[p]);
-							else
-								y[p] = "";
-				}
-
-				// If a callback was provided, execute it
-				if ( done && jQuery.isFunction( options.complete ) )
-					// Execute the complete function
-					options.complete.apply( elem );
-			} else {
-				var n = t - this.startTime;
-				// Figure out where in the animation we are and set the number
-				var p = n / options.duration;
-				
-				// If the easing function exists, then use it 
-				z.now = options.easing && jQuery.easing[options.easing] ?
-					jQuery.easing[options.easing](p, n,  firstNum, (lastNum-firstNum), options.duration) :
-					// else use default linear easing
-					((-Math.cos(p*Math.PI)/2) + 0.5) * (lastNum-firstNum) + firstNum;
-
-				// Perform the next step of the animation
-				z.a();
-			}
-		};
-	
-	}
-});
-}

Modified: jquery.javascript/trunk/src/jquery/javascript/js/jquery.js
===================================================================
--- jquery.javascript/trunk/src/jquery/javascript/js/jquery.js	2008-12-15 21:16:58 UTC (rev 94087)
+++ jquery.javascript/trunk/src/jquery/javascript/js/jquery.js	2008-12-15 22:17:37 UTC (rev 94088)
@@ -1,240 +1,101 @@
-/* prevent execution of jQuery if included more than once */
-if(typeof window.jQuery == "undefined") {
+(function(){
 /*
- * jQuery @VERSION - New Wave Javascript
+ * jQuery 1.2.6 - New Wave Javascript
  *
- * Copyright (c) 2007 John Resig (jquery.com)
+ * Copyright (c) 2008 John Resig (jquery.com)
  * Dual licensed under the MIT (MIT-LICENSE.txt)
  * and GPL (GPL-LICENSE.txt) licenses.
  *
- * $Date: 2007-01-23 18:02:32 +0100 (Di, 23 Jan 2007) $
- * $Rev: 1173 $
+ * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
+ * $Rev: 5685 $
  */
 
-// Global undefined variable
-window.undefined = window.undefined;
+// Map over jQuery in case of overwrite
+var _jQuery = window.jQuery,
+// Map over the $ in case of overwrite
+	_$ = window.$;
 
-/**
- * Create a new jQuery Object
- *
- * @constructor
- * @private
- * @name jQuery
- * @param String|Function|Element|Array<Element>|jQuery a selector
- * @param jQuery|Element|Array<Element> c context
- * @cat Core
- */
-var jQuery = function(a,c) {
-	// If the context is global, return a new object
-	if ( window == this )
-		return new jQuery(a,c);
+var jQuery = window.jQuery = window.$ = function( selector, context ) {
+	// The jQuery object is actually just the init constructor 'enhanced'
+	return new jQuery.fn.init( selector, context );
+};
 
-	// Make sure that a selection was provided
-	a = a || document;
-	
-	// HANDLE: $(function)
-	// Shortcut for document ready
-	if ( jQuery.isFunction(a) )
-		return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( a );
-	
-	// Handle HTML strings
-	if ( typeof a  == "string" ) {
-		// HANDLE: $(html) -> $(array)
-		var m = /^[^<]*(<(.|\n)+>)[^>]*$/.exec(a);
-		if ( m )
-			a = jQuery.clean( [ m[1] ] );
-		
-		// HANDLE: $(expr)
-		else
-			return new jQuery( c ).find( a );
-	}
-	
-	return this.setArray(
-		// HANDLE: $(array)
-		a.constructor == Array && a ||
+// A simple way to check for HTML strings or ID strings
+// (both of which we optimize for)
+var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,
 
-		// HANDLE: $(arraylike)
-		// Watch for when an array-like object is passed as the selector
-		(a.jquery || a.length && a != window && !a.nodeType && a[0] != undefined && a[0].nodeType) && jQuery.makeArray( a ) ||
+// Is it a simple selector
+	isSimple = /^.[^:#\[\.]*$/,
 
-		// HANDLE: $(*)
-		[ a ] );
-};
+// Will speed up references to undefined, and allows munging its name.
+	undefined;
 
-// Map over the $ in case of overwrite
-if ( typeof $ != "undefined" )
-	jQuery._$ = $;
-	
-// Map the jQuery namespace to the '$' one
-var $ = jQuery;
+jQuery.fn = jQuery.prototype = {
+	init: function( selector, context ) {
+		// Make sure that a selection was provided
+		selector = selector || document;
 
-/**
- * This function accepts a string containing a CSS or
- * basic XPath selector which is then used to match a set of elements.
- *
- * The core functionality of jQuery centers around this function.
- * Everything in jQuery is based upon this, or uses this in some way.
- * The most basic use of this function is to pass in an expression
- * (usually consisting of CSS or XPath), which then finds all matching
- * elements.
- *
- * By default, $() looks for DOM elements within the context of the
- * current HTML document.
- *
- * @example $("div > p")
- * @desc Finds all p elements that are children of a div element.
- * @before <p>one</p> <div><p>two</p></div> <p>three</p>
- * @result [ <p>two</p> ]
- *
- * @example $("input:radio", document.forms[0])
- * @desc Searches for all inputs of type radio within the first form in the document
- *
- * @example $("div", xml.responseXML)
- * @desc This finds all div elements within the specified XML document.
- *
- * @name $
- * @param String expr An expression to search with
- * @param Element|jQuery context (optional) A DOM Element, Document or jQuery to use as context
- * @cat Core
- * @type jQuery
- * @see $(Element)
- * @see $(Element<Array>)
- */
- 
-/**
- * Create DOM elements on-the-fly from the provided String of raw HTML.
- *
- * @example $("<div><p>Hello</p></div>").appendTo("#body")
- * @desc Creates a div element (and all of its contents) dynamically, 
- * and appends it to the element with the ID of body. Internally, an
- * element is created and it's innerHTML property set to the given markup.
- * It is therefore both quite flexible and limited. 
- *
- * @name $
- * @param String html A string of HTML to create on the fly.
- * @cat Core
- * @type jQuery
- * @see appendTo(String)
- */
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+		// Handle HTML strings
+		if ( typeof selector == "string" ) {
+			// Are we dealing with HTML string or an ID?
+			var match = quickExpr.exec( selector );
 
-/**
- * Wrap jQuery functionality around a single or multiple DOM Element(s).
- *
- * This function also accepts XML Documents and Window objects
- * as valid arguments (even though they are not DOM Elements).
- *
- * @example $(document.body).background( "black" );
- * @desc Sets the background color of the page to black.
- *
- * @example $( myForm.elements ).hide()
- * @desc Hides all the input elements within a form
- *
- * @name $
- * @param Element|Array<Element> elems DOM element(s) to be encapsulated by a jQuery object.
- * @cat Core
- * @type jQuery
- */
+			// Verify a match, and that no context was specified for #id
+			if ( match && (match[1] || !context) ) {
 
-/**
- * A shorthand for $(document).ready(), allowing you to bind a function
- * to be executed when the DOM document has finished loading. This function
- * behaves just like $(document).ready(), in that it should be used to wrap
- * all of the other $() operations on your page. While this function is,
- * technically, chainable - there really isn't much use for chaining against it.
- * You can have as many $(document).ready events on your page as you like.
- *
- * See ready(Function) for details about the ready event. 
- * 
- * @example $(function(){
- *   // Document is ready
- * });
- * @desc Executes the function when the DOM is ready to be used.
- *
- * @example jQuery(function($) {
- *   // Your code using failsafe $ alias here...
- * });
- * @desc Uses both the shortcut for $(document).ready() and the argument
- * to write failsafe jQuery code using the $ alias, without relying on the
- * global alias.
- *
- * @name $
- * @param Function fn The function to execute when the DOM is ready.
- * @cat Core
- * @type jQuery
- * @see ready(Function)
- */
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] )
+					selector = jQuery.clean( [ match[1] ], context );
 
-jQuery.fn = jQuery.prototype = {
-	/**
-	 * The current version of jQuery.
-	 *
-	 * @private
-	 * @property
-	 * @name jquery
-	 * @type String
-	 * @cat Core
-	 */
-	jquery: "@VERSION",
+				// HANDLE: $("#id")
+				else {
+					var elem = document.getElementById( match[3] );
 
-	/**
-	 * The number of elements currently matched.
-	 *
-	 * @example $("img").length;
-	 * @before <img src="test1.jpg"/> <img src="test2.jpg"/>
-	 * @result 2
-	 *
-	 * @property
-	 * @name length
-	 * @type Number
-	 * @cat Core
-	 */
+					// Make sure an element was located
+					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 );
 
-	/**
-	 * The number of elements currently matched.
-	 *
-	 * @example $("img").size();
-	 * @before <img src="test1.jpg"/> <img src="test2.jpg"/>
-	 * @result 2
-	 *
-	 * @name size
-	 * @type Number
-	 * @cat Core
-	 */
+						// Otherwise, we inject the element directly into the jQuery object
+						return jQuery( elem );
+					}
+					selector = [];
+				}
+
+			// HANDLE: $(expr, [context])
+			// (which is just equivalent to: $(content).find(expr)
+			} else
+				return jQuery( context ).find( selector );
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) )
+			return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector );
+
+		return this.setArray(jQuery.makeArray(selector));
+	},
+
+	// The current version of jQuery being used
+	jquery: "1.2.6",
+
+	// 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,
 
-	/**
-	 * Access all matched elements. This serves as a backwards-compatible
-	 * way of accessing all matched elements (other than the jQuery object
-	 * itself, which is, in fact, an array of elements).
-	 *
-	 * @example $("img").get();
-	 * @before <img src="test1.jpg"/> <img src="test2.jpg"/>
-	 * @result [ <img src="test1.jpg"/> <img src="test2.jpg"/> ]
-	 * @desc Selects all images in the document and returns the DOM Elements as an Array
-	 *
-	 * @name get
-	 * @type Array<Element>
-	 * @cat Core
-	 */
-
-	/**
-	 * Access a single matched element. num is used to access the
-	 * Nth element matched.
-	 *
-	 * @example $("img").get(0);
-	 * @before <img src="test1.jpg"/> <img src="test2.jpg"/>
-	 * @result [ <img src="test1.jpg"/> ]
-	 * @desc Selects all images in the document and returns the first one
-	 *
-	 * @name get
-	 * @type Element
-	 * @param Number num Access the element in the Nth position.
-	 * @cat Core
-	 */
+	// 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 ?
 
@@ -242,2104 +103,1350 @@
 			jQuery.makeArray( this ) :
 
 			// Return just the object
-			this[num];
+			this[ num ];
 	},
-	
-	/**
-	 * Set the jQuery object to an array of elements, while maintaining
-	 * the stack.
-	 *
-	 * @example $("img").pushStack([ document.body ]);
-	 * @result $("img").pushStack() == [ document.body ]
-	 *
-	 * @private
-	 * @name pushStack
-	 * @type jQuery
-	 * @param Elements elems An array of elements
-	 * @cat Core
-	 */
-	pushStack: function( a ) {
-		var ret = jQuery(a);
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems ) {
+		// Build a new jQuery matched element set
+		var ret = jQuery( elems );
+
+		// Add the old object onto the stack (as a reference)
 		ret.prevObject = this;
+
+		// Return the newly-formed element set
 		return ret;
 	},
-	
-	/**
-	 * Set the jQuery object to an array of elements. This operation is
-	 * completely destructive - be sure to use .pushStack() if you wish to maintain
-	 * the jQuery stack.
-	 *
-	 * @example $("img").setArray([ document.body ]);
-	 * @result $("img").setArray() == [ document.body ]
-	 *
-	 * @private
-	 * @name setArray
-	 * @type jQuery
-	 * @param Elements elems An array of elements
-	 * @cat Core
-	 */
-	setArray: function( a ) {
+
+	// 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
+	setArray: function( elems ) {
+		// Resetting the length to 0, then using the native Array push
+		// is a super-fast way to populate an object with array-like properties
 		this.length = 0;
-		[].push.apply( this, a );
+		Array.prototype.push.apply( this, elems );
+
 		return this;
 	},
 
-	/**
-	 * Execute a function within the context of every matched element.
-	 * This means that every time the passed-in function is executed
-	 * (which is once for every element matched) the 'this' keyword
-	 * points to the specific element.
-	 *
-	 * Additionally, the function, when executed, is passed a single
-	 * argument representing the position of the element in the matched
-	 * set.
-	 *
-	 * @example $("img").each(function(i){
-	 *   this.src = "test" + i + ".jpg";
-	 * });
-	 * @before <img/><img/>
-	 * @result <img src="test0.jpg"/><img src="test1.jpg"/>
-	 * @desc Iterates over two images and sets their src property
-	 *
-	 * @name each
-	 * @type jQuery
-	 * @param Function fn A function to execute
-	 * @cat Core
-	 */
-	each: function( fn, args ) {
-		return jQuery.each( this, fn, args );
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
 	},
 
-	/**
-	 * Searches every matched element for the object and returns
-	 * the index of the element, if found, starting with zero. 
-	 * Returns -1 if the object wasn't found.
-	 *
-	 * @example $("*").index( $('#foobar')[0] ) 
-	 * @before <div id="foobar"><b></b><span id="foo"></span></div>
-	 * @result 0
-	 * @desc Returns the index for the element with ID foobar
-	 *
-	 * @example $("*").index( $('#foo')[0] ) 
-	 * @before <div id="foobar"><b></b><span id="foo"></span></div>
-	 * @result 2
-	 * @desc Returns the index for the element with ID foo within another element
-	 *
-	 * @example $("*").index( $('#bar')[0] ) 
-	 * @before <div id="foobar"><b></b><span id="foo"></span></div>
-	 * @result -1
-	 * @desc Returns -1, as there is no element with ID bar
-	 *
-	 * @name index
-	 * @type Number
-	 * @param Element subject Object to search for
-	 * @cat Core
-	 */
-	index: function( obj ) {
-		var pos = -1;
-		this.each(function(i){
-			if ( this == obj ) pos = i;
-		});
-		return pos;
+	// 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
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem && elem.jquery ? elem[0] : elem
+		, this );
 	},
 
-	/**
-	 * Access a property on the first matched element.
-	 * This method makes it easy to retrieve a property value
-	 * from the first matched element.
-	 *
-	 * @example $("img").attr("src");
-	 * @before <img src="test.jpg"/>
-	 * @result test.jpg
-	 * @desc Returns the src attribute from the first image in the document.
-	 *
-	 * @name attr
-	 * @type Object
-	 * @param String name The name of the property to access.
-	 * @cat DOM/Attributes
-	 */
+	attr: function( name, value, type ) {
+		var options = name;
 
-	/**
-	 * Set a key/value object as properties to all matched elements.
-	 *
-	 * This serves as the best way to set a large number of properties
-	 * on all matched elements.
-	 *
-	 * @example $("img").attr({ src: "test.jpg", alt: "Test Image" });
-	 * @before <img/>
-	 * @result <img src="test.jpg" alt="Test Image"/>
-	 * @desc Sets src and alt attributes to all images.
-	 *
-	 * @name attr
-	 * @type jQuery
-	 * @param Map properties Key/value pairs to set as object properties.
-	 * @cat DOM/Attributes
-	 */
-
-	/**
-	 * Set a single property to a value, on all matched elements.
-	 *
-	 * Can compute values provided as ${formula}, see second example.
-	 *
-	 * Note that you can't set the name property of input elements in IE.
-	 * Use $(html) or .append(html) or .html(html) to create elements
-	 * on the fly including the name property.
-	 *
-	 * @example $("img").attr("src","test.jpg");
-	 * @before <img/>
-	 * @result <img src="test.jpg"/>
-	 * @desc Sets src attribute to all images.
-	 *
-	 * @example $("img").attr("title", "${this.src}");
-	 * @before <img src="test.jpg" />
-	 * @result <img src="test.jpg" title="test.jpg" />
-	 * @desc Sets title attribute from src attribute, a shortcut for attr(String,Function)
-	 *
-	 * @name attr
-	 * @type jQuery
-	 * @param String key The name of the property to set.
-	 * @param Object value The value to set the property to.
-	 * @cat DOM/Attributes
-	 */
-	 
-	/**
-	 * Set a single property to a computed value, on all matched elements.
-	 *
-	 * Instead of a value, a function is provided, that computes the value.
-	 *
-	 * @example $("img").attr("title", function() { return this.src });
-	 * @before <img src="test.jpg" />
-	 * @result <img src="test.jpg" title="test.jpg" />
-	 * @desc Sets title attribute from src attribute.
-	 *
-	 * @example $("img").attr("title", function(index) { return this.title + (i + 1); });
-	 * @before <img title="pic" /><img title="pic" /><img title="pic" />
-	 * @result <img title="pic1" /><img title="pic2" /><img title="pic3" />
-	 * @desc Enumerate title attribute.
-	 *
-	 * @name attr
-	 * @type jQuery
-	 * @param String key The name of the property to set.
-	 * @param Function value A function returning the value to set.
-	 * 	 	  Scope: Current element, argument: Index of current element
-	 * @cat DOM/Attributes
-	 */
-	attr: function( key, value, type ) {
-		var obj = key;
-		
 		// Look for the case where we're accessing a style value
-		if ( key.constructor == String )
-			if ( value == undefined )
-				return this.length && jQuery[ type || "attr" ]( this[0], key ) || undefined;
+		if ( name.constructor == String )
+			if ( value === undefined )
+				return this[0] && jQuery[ type || "attr" ]( this[0], name );
+
 			else {
-				obj = {};
-				obj[ key ] = value;
+				options = {};
+				options[ name ] = value;
 			}
-		
+
 		// Check to see if we're setting style values
-		return this.each(function(index){
+		return this.each(function(i){
 			// Set all the styles
-			for ( var prop in obj )
+			for ( name in options )
 				jQuery.attr(
-					type ? this.style : this,
-					prop, jQuery.prop(this, obj[prop], type, index, prop)
+					type ?
+						this.style :
+						this,
+					name, jQuery.prop( this, options[ name ], type, i, name )
 				);
 		});
 	},
 
-	/**
-	 * Access a style property on the first matched element.
-	 * This method makes it easy to retrieve a style property value
-	 * from the first matched element.
-	 *
-	 * @example $("p").css("color");
-	 * @before <p style="color:red;">Test Paragraph.</p>
-	 * @result "red"
-	 * @desc Retrieves the color style of the first paragraph
-	 *
-	 * @example $("p").css("font-weight");
-	 * @before <p style="font-weight: bold;">Test Paragraph.</p>
-	 * @result "bold"
-	 * @desc Retrieves the font-weight style of the first paragraph.
-	 *
-	 * @name css
-	 * @type String
-	 * @param String name The name of the property to access.
-	 * @cat CSS
-	 */
-
-	/**
-	 * Set a key/value object as style properties to all matched elements.
-	 *
-	 * This serves as the best way to set a large number of style properties
-	 * on all matched elements.
-	 *
-	 * @example $("p").css({ color: "red", background: "blue" });
-	 * @before <p>Test Paragraph.</p>
-	 * @result <p style="color:red; background:blue;">Test Paragraph.</p>
-	 * @desc Sets color and background styles to all p elements.
-	 *
-	 * @name css
-	 * @type jQuery
-	 * @param Map properties Key/value pairs to set as style properties.
-	 * @cat CSS
-	 */
-
-	/**
-	 * Set a single style property to a value, on all matched elements.
-	 * If a number is provided, it is automatically converted into a pixel value.
-	 *
-	 * @example $("p").css("color","red");
-	 * @before <p>Test Paragraph.</p>
-	 * @result <p style="color:red;">Test Paragraph.</p>
-	 * @desc Changes the color of all paragraphs to red
-	 *
-	 * @example $("p").css("left",30);
-	 * @before <p>Test Paragraph.</p>
-	 * @result <p style="left:30px;">Test Paragraph.</p>
-	 * @desc Changes the left of all paragraphs to "30px"
-	 *
-	 * @name css
-	 * @type jQuery
-	 * @param String key The name of the property to set.
-	 * @param String|Number value The value to set the property to.
-	 * @cat CSS
-	 */
 	css: function( key, value ) {
+		// ignore negative width and height values
+		if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
+			value = undefined;
 		return this.attr( key, value, "curCSS" );
 	},
 
-	/**
-	 * Get the text contents of all matched elements. The result is
-	 * a string that contains the combined text contents of all matched
-	 * elements. This method works on both HTML and XML documents.
-	 *
-	 * @example $("p").text();
-	 * @before <p><b>Test</b> Paragraph.</p><p>Paraparagraph</p>
-	 * @result Test Paragraph.Paraparagraph
-	 * @desc Gets the concatenated text of all paragraphs
-	 *
-	 * @name text
-	 * @type String
-	 * @cat DOM/Attributes
-	 */
+	text: function( text ) {
+		if ( typeof text != "object" && text != null )
+			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
 
-	/**
-	 * Set the text contents of all matched elements.
-	 *
-	 * Similar to html(), but escapes HTML (replace "<" and ">" with their
-	 * HTML entities).
-	 *
-	 * @example $("p").text("<b>Some</b> new text.");
-	 * @before <p>Test Paragraph.</p>
-	 * @result <p>&lt;b&gt;Some&lt;/b&gt; new text.</p>
-	 * @desc Sets the text of all paragraphs.
-	 *
-	 * @example $("p").text("<b>Some</b> new text.", true);
-	 * @before <p>Test Paragraph.</p>
-	 * @result <p>Some new text.</p>
-	 * @desc Sets the text of all paragraphs.
-	 *
-	 * @name text
-	 * @type String
-	 * @param String val The text value to set the contents of the element to.
-	 * @cat DOM/Attributes
-	 */
-	text: function(e) {
-		if ( typeof e == "string" )
-			return this.empty().append( document.createTextNode( e ) );
+		var ret = "";
 
-		var t = "";
-		jQuery.each( e || this, function(){
+		jQuery.each( text || this, function(){
 			jQuery.each( this.childNodes, function(){
 				if ( this.nodeType != 8 )
-					t += this.nodeType != 1 ?
-						this.nodeValue : jQuery.fn.text([ this ]);
+					ret += this.nodeType != 1 ?
+						this.nodeValue :
+						jQuery.fn.text( [ this ] );
 			});
 		});
-		return t;
+
+		return ret;
 	},
 
-	/**
-	 * Wrap all matched elements with a structure of other elements.
-	 * This wrapping process is most useful for injecting additional
-	 * stucture into a document, without ruining the original semantic
-	 * qualities of a document.
-	 *
-	 * This works by going through the first element
-	 * provided (which is generated, on the fly, from the provided HTML)
-	 * and finds the deepest ancestor element within its
-	 * structure - it is that element that will en-wrap everything else.
-	 *
-	 * This does not work with elements that contain text. Any necessary text
-	 * must be added after the wrapping is done.
-	 *
-	 * @example $("p").wrap("<div class='wrap'></div>");
-	 * @before <p>Test Paragraph.</p>
-	 * @result <div class='wrap'><p>Test Paragraph.</p></div>
-	 * 
-	 * @name wrap
-	 * @type jQuery
-	 * @param String html A string of HTML, that will be created on the fly and wrapped around the target.
-	 * @cat DOM/Manipulation
-	 */
+	wrapAll: function( html ) {
+		if ( this[0] )
+			// The elements to wrap the target around
+			jQuery( html, this[0].ownerDocument )
+				.clone()
+				.insertBefore( this[0] )
+				.map(function(){
+					var elem = this;
 
-	/**
-	 * Wrap all matched elements with a structure of other elements.
-	 * This wrapping process is most useful for injecting additional
-	 * stucture into a document, without ruining the original semantic
-	 * qualities of a document.
-	 *
-	 * This works by going through the first element
-	 * provided and finding the deepest ancestor element within its
-	 * structure - it is that element that will en-wrap everything else.
-	 *
- 	 * This does not work with elements that contain text. Any necessary text
-	 * must be added after the wrapping is done.
-	 *
-	 * @example $("p").wrap( document.getElementById('content') );
-	 * @before <p>Test Paragraph.</p><div id="content"></div>
-	 * @result <div id="content"><p>Test Paragraph.</p></div>
-	 *
-	 * @name wrap
-	 * @type jQuery
-	 * @param Element elem A DOM element that will be wrapped around the target.
-	 * @cat DOM/Manipulation
-	 */
-	wrap: function() {
-		// The elements to wrap the target around
-		var a = jQuery.clean(arguments);
+					while ( elem.firstChild )
+						elem = elem.firstChild;
 
-		// Wrap each of the matched elements individually
-		return this.each(function(){
-			// Clone the structure that we're using to wrap
-			var b = a[0].cloneNode(true);
+					return elem;
+				})
+				.append(this);
 
-			// Insert it before the element to be wrapped
-			this.parentNode.insertBefore( b, this );
+		return this;
+	},
 
-			// Find the deepest point in the wrap structure
-			while ( b.firstChild )
-				b = b.firstChild;
+	wrapInner: function( html ) {
+		return this.each(function(){
+			jQuery( this ).contents().wrapAll( html );
+		});
+	},
 
-			// Move the matched element to within the wrap structure
-			b.appendChild( this );
+	wrap: function( html ) {
+		return this.each(function(){
+			jQuery( this ).wrapAll( html );
 		});
 	},
 
-	/**
-	 * Append content to the inside of every matched element.
-	 *
-	 * This operation is similar to doing an appendChild to all the
-	 * specified elements, adding them into the document.
-	 *
-	 * @example $("p").append("<b>Hello</b>");
-	 * @before <p>I would like to say: </p>
-	 * @result <p>I would like to say: <b>Hello</b></p>
-	 * @desc Appends some HTML to all paragraphs.
-	 *
-	 * @example $("p").append( $("#foo")[0] );
-	 * @before <p>I would like to say: </p><b id="foo">Hello</b>
-	 * @result <p>I would like to say: <b id="foo">Hello</b></p>
-	 * @desc Appends an Element to all paragraphs.
-	 *
-	 * @example $("p").append( $("b") );
-	 * @before <p>I would like to say: </p><b>Hello</b>
-	 * @result <p>I would like to say: <b>Hello</b></p>
-	 * @desc Appends a jQuery object (similar to an Array of DOM Elements) to all paragraphs.
-	 *
-	 * @name append
-	 * @type jQuery
-	 * @param <Content> content Content to append to the target
-	 * @cat DOM/Manipulation
-	 * @see prepend(<Content>)
-	 * @see before(<Content>)
-	 * @see after(<Content>)
-	 */
 	append: function() {
-		return this.domManip(arguments, true, 1, function(a){
-			this.appendChild( a );
+		return this.domManip(arguments, true, false, function(elem){
+			if (this.nodeType == 1)
+				this.appendChild( elem );
 		});
 	},
 
-	/**
-	 * Prepend content to the inside of every matched element.
-	 *
-	 * This operation is the best way to insert elements
-	 * inside, at the beginning, of all matched elements.
-	 *
-	 * @example $("p").prepend("<b>Hello</b>");
-	 * @before <p>I would like to say: </p>
-	 * @result <p><b>Hello</b>I would like to say: </p>
-	 * @desc Prepends some HTML to all paragraphs.
-	 *
-	 * @example $("p").prepend( $("#foo")[0] );
-	 * @before <p>I would like to say: </p><b id="foo">Hello</b>
-	 * @result <p><b id="foo">Hello</b>I would like to say: </p>
-	 * @desc Prepends an Element to all paragraphs.
-	 *	
-	 * @example $("p").prepend( $("b") );
-	 * @before <p>I would like to say: </p><b>Hello</b>
-	 * @result <p><b>Hello</b>I would like to say: </p>
-	 * @desc Prepends a jQuery object (similar to an Array of DOM Elements) to all paragraphs.
-	 *
-	 * @name prepend
-	 * @type jQuery
-	 * @param <Content> content Content to prepend to the target.
-	 * @cat DOM/Manipulation
-	 * @see append(<Content>)
-	 * @see before(<Content>)
-	 * @see after(<Content>)
-	 */
 	prepend: function() {
-		return this.domManip(arguments, true, -1, function(a){
-			this.insertBefore( a, this.firstChild );
+		return this.domManip(arguments, true, true, function(elem){
+			if (this.nodeType == 1)
+				this.insertBefore( elem, this.firstChild );
 		});
 	},
-	
-	/**
-	 * Insert content before each of the matched elements.
-	 *
-	 * @example $("p").before("<b>Hello</b>");
-	 * @before <p>I would like to say: </p>
-	 * @result <b>Hello</b><p>I would like to say: </p>
-	 * @desc Inserts some HTML before all paragraphs.
-	 *
-	 * @example $("p").before( $("#foo")[0] );
-	 * @before <p>I would like to say: </p><b id="foo">Hello</b>
-	 * @result <b id="foo">Hello</b><p>I would like to say: </p>
-	 * @desc Inserts an Element before all paragraphs.
-	 *
-	 * @example $("p").before( $("b") );
-	 * @before <p>I would like to say: </p><b>Hello</b>
-	 * @result <b>Hello</b><p>I would like to say: </p>
-	 * @desc Inserts a jQuery object (similar to an Array of DOM Elements) before all paragraphs.
-	 *
-	 * @name before
-	 * @type jQuery
-	 * @param <Content> content Content to insert before each target.
-	 * @cat DOM/Manipulation
-	 * @see append(<Content>)
-	 * @see prepend(<Content>)
-	 * @see after(<Content>)
-	 */
+
 	before: function() {
-		return this.domManip(arguments, false, 1, function(a){
-			this.parentNode.insertBefore( a, this );
+		return this.domManip(arguments, false, false, function(elem){
+			this.parentNode.insertBefore( elem, this );
 		});
 	},
 
-	/**
-	 * Insert content after each of the matched elements.
-	 *
-	 * @example $("p").after("<b>Hello</b>");
-	 * @before <p>I would like to say: </p>
-	 * @result <p>I would like to say: </p><b>Hello</b>
-	 * @desc Inserts some HTML after all paragraphs.
-	 *
-	 * @example $("p").after( $("#foo")[0] );
-	 * @before <b id="foo">Hello</b><p>I would like to say: </p>
-	 * @result <p>I would like to say: </p><b id="foo">Hello</b>
-	 * @desc Inserts an Element after all paragraphs.
-	 *
-	 * @example $("p").after( $("b") );
-	 * @before <b>Hello</b><p>I would like to say: </p>
-	 * @result <p>I would like to say: </p><b>Hello</b>
-	 * @desc Inserts a jQuery object (similar to an Array of DOM Elements) after all paragraphs.
-	 *
-	 * @name after
-	 * @type jQuery
-	 * @param <Content> content Content to insert after each target.
-	 * @cat DOM/Manipulation
-	 * @see append(<Content>)
-	 * @see prepend(<Content>)
-	 * @see before(<Content>)
-	 */
 	after: function() {
-		return this.domManip(arguments, false, -1, function(a){
-			this.parentNode.insertBefore( a, this.nextSibling );
+		return this.domManip(arguments, false, true, function(elem){
+			this.parentNode.insertBefore( elem, this.nextSibling );
 		});
 	},
 
-	/**
-	 * End the most recent 'destructive' operation, reverting the list of matched elements
-	 * back to its previous state. After an end operation, the list of matched elements will
-	 * revert to the last state of matched elements.
-	 *
-	 * If there was no destructive operation before, an empty set is returned.
-	 *
-	 * @example $("p").find("span").end();
-	 * @before <p><span>Hello</span>, how are you?</p>
-	 * @result [ <p>...</p> ]
-	 * @desc Selects all paragraphs, finds span elements inside these, and reverts the
-	 * selection back to the paragraphs.
-	 *
-	 * @name end
-	 * @type jQuery
-	 * @cat DOM/Traversing
-	 */
 	end: function() {
-		return this.prevObject || jQuery([]);
+		return this.prevObject || jQuery( [] );
 	},
 
-	/**
-	 * Searches for all elements that match the specified expression.
-	 
-	 * This method is a good way to find additional descendant
-	 * elements with which to process.
-	 *
-	 * All searching is done using a jQuery expression. The expression can be
-	 * written using CSS 1-3 Selector syntax, or basic XPath.
-	 *
-	 * @example $("p").find("span");
-	 * @before <p><span>Hello</span>, how are you?</p>
-	 * @result [ <span>Hello</span> ]
-	 * @desc Starts with all paragraphs and searches for descendant span
-	 * elements, same as $("p span")
-	 *
-	 * @name find
-	 * @type jQuery
-	 * @param String expr An expression to search with.
-	 * @cat DOM/Traversing
-	 */
-	find: function(t) {
-		return this.pushStack( jQuery.map( this, function(a){
-			return jQuery.find(t,a);
-		}), t );
+	find: function( selector ) {
+		var elems = jQuery.map(this, function(elem){
+			return jQuery.find( selector, elem );
+		});
+
+		return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ?
+			jQuery.unique( elems ) :
+			elems );
 	},
 
-	/**
-	 * Clone matched DOM Elements and select the clones. 
-	 *
-	 * This is useful for moving copies of the elements to another
-	 * location in the DOM.
-	 *
-	 * @example $("b").clone().prependTo("p");
-	 * @before <b>Hello</b><p>, how are you?</p>
-	 * @result <b>Hello</b><p><b>Hello</b>, how are you?</p>
-	 * @desc Clones all b elements (and selects the clones) and prepends them to all paragraphs.
-	 *
-	 * @name clone
-	 * @type jQuery
-	 * @param Boolean deep (Optional) Set to false if you don't want to clone all descendant nodes, in addition to the element itself.
-	 * @cat DOM/Manipulation
-	 */
-	clone: function(deep) {
-		return this.pushStack( jQuery.map( this, function(a){
-			return a.cloneNode( deep != undefined ? deep : true );
-		}) );
+	clone: function( events ) {
+		// Do the clone
+		var ret = this.map(function(){
+			if ( jQuery.browser.msie && !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
+				// as properties will not be copied (such as the
+				// the name attribute on an input).
+				var clone = this.cloneNode(true),
+					container = document.createElement("div");
+				container.appendChild(clone);
+				return jQuery.clean([container.innerHTML])[0];
+			} else
+				return this.cloneNode(true);
+		});
+
+		// Need to set the expando to null on the cloned set if it exists
+		// 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("*").andSelf().each(function(){
+			if ( this[ expando ] != undefined )
+				this[ expando ] = null;
+		});
+
+		// Copy the events from the original to the clone
+		if ( events === true )
+			this.find("*").andSelf().each(function(i){
+				if (this.nodeType == 3)
+					return;
+				var events = jQuery.data( this, "events" );
+
+				for ( var type in events )
+					for ( var handler in events[ type ] )
+						jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data );
+			});
+
+		// Return the cloned set
+		return ret;
 	},
 
-	/**
-	 * Removes all elements from the set of matched elements that do not
-	 * match the specified expression(s). This method is used to narrow down
-	 * the results of a search.
-	 *
-	 * Provide a comma-separated list of expressions to apply multiple filters at once.
-	 *
-	 * @example $("p").filter(".selected")
-	 * @before <p class="selected">Hello</p><p>How are you?</p>
-	 * @result [ <p class="selected">Hello</p> ]
-	 * @desc Selects all paragraphs and removes those without a class "selected".
-	 *
-	 * @example $("p").filter(".selected, :first")
-	 * @before <p>Hello</p><p>Hello Again</p><p class="selected">And Again</p>
-	 * @result [ <p>Hello</p>, <p class="selected">And Again</p> ]
-	 * @desc Selects all paragraphs and removes those without class "selected" and being the first one.
-	 *
-	 * @name filter
-	 * @type jQuery
-	 * @param String expression Expression(s) to search with.
-	 * @cat DOM/Traversing
-	 */
-	 
-	/**
-	 * Removes all elements from the set of matched elements that do not
-	 * pass the specified filter. This method is used to narrow down
-	 * the results of a search.
-	 *
-	 * @example $("p").filter(function(index) {
-	 *   return $("ol", this).length == 0;
-	 * })
-	 * @before <p><ol><li>Hello</li></ol></p><p>How are you?</p>
-	 * @result [ <p>How are you?</p> ]
-	 * @desc Remove all elements that have a child ol element
-	 *
-	 * @name filter
-	 * @type jQuery
-	 * @param Function filter A function to use for filtering
-	 * @cat DOM/Traversing
-	 */
-	filter: function(t) {
+	filter: function( selector ) {
 		return this.pushStack(
-			jQuery.isFunction( t ) &&
-			jQuery.grep(this, function(el, index){
-				return t.apply(el, [index])
+			jQuery.isFunction( selector ) &&
+			jQuery.grep(this, function(elem, i){
+				return selector.call( elem, i );
 			}) ||
 
-			jQuery.multiFilter(t,this) );
+			jQuery.multiFilter( selector, this ) );
 	},
 
-	/**
-	 * Removes the specified Element from the set of matched elements. This
-	 * method is used to remove a single Element from a jQuery object.
-	 *
-	 * @example $("p").not( $("#selected")[0] )
-	 * @before <p>Hello</p><p id="selected">Hello Again</p>
-	 * @result [ <p>Hello</p> ]
-	 * @desc Removes the element with the ID "selected" from the set of all paragraphs.
-	 *
-	 * @name not
-	 * @type jQuery
-	 * @param Element el An element to remove from the set
-	 * @cat DOM/Traversing
-	 */
+	not: function( selector ) {
+		if ( selector.constructor == String )
+			// test special case where just one selector is passed in
+			if ( isSimple.test( selector ) )
+				return this.pushStack( jQuery.multiFilter( selector, this, true ) );
+			else
+				selector = jQuery.multiFilter( selector, this );
 
-	/**
-	 * Removes elements matching the specified expression from the set
-	 * of matched elements. This method is used to remove one or more
-	 * elements from a jQuery object.
-	 *
-	 * @example $("p").not("#selected")
-	 * @before <p>Hello</p><p id="selected">Hello Again</p>
-	 * @result [ <p>Hello</p> ]
-	 * @desc Removes the element with the ID "selected" from the set of all paragraphs.
-	 *
-	 * @name not
-	 * @type jQuery
-	 * @param String expr An expression with which to remove matching elements
-	 * @cat DOM/Traversing
-	 */
+		var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
+		return this.filter(function() {
+			return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
+		});
+	},
 
-	/**
-	 * Removes any elements inside the array of elements from the set
-	 * of matched elements. This method is used to remove one or more
-	 * elements from a jQuery object.
-	 *
-	 * @example $("p").not( $("div p.selected") )
-	 * @before <div><p>Hello</p><p class="selected">Hello Again</p></div>
-	 * @result [ <p>Hello</p> ]
-	 * @desc Removes all elements that match "div p.selected" from the total set of all paragraphs.
-	 *
-	 * @name not
-	 * @type jQuery
-	 * @param jQuery elems A set of elements to remove from the jQuery set of matched elements.
-	 * @cat DOM/Traversing
-	 */
-	not: function(t) {
-		return this.pushStack(
-			t.constructor == String &&
-			jQuery.multiFilter(t, this, true) ||
+	add: function( selector ) {
+		return this.pushStack( jQuery.unique( jQuery.merge(
+			this.get(),
+			typeof selector == 'string' ?
+				jQuery( selector ) :
+				jQuery.makeArray( selector )
+		)));
+	},
 
-			jQuery.grep(this, function(a) {
-				return ( t.constructor == Array || t.jquery )
-					? jQuery.inArray( a, t ) < 0
-					: a != t;
-			})
-		);
+	is: function( selector ) {
+		return !!selector && jQuery.multiFilter( selector, this ).length > 0;
 	},
 
-	/**
-	 * Adds more elements, matched by the given expression,
-	 * to the set of matched elements.
-	 *
-	 * @example $("p").add("span")
-	 * @before <p>Hello</p><span>Hello Again</span>
-	 * @result [ <p>Hello</p>, <span>Hello Again</span> ]
-	 *
-	 * @name add
-	 * @type jQuery
-	 * @param String expr An expression whose matched elements are added
-	 * @cat DOM/Traversing
-	 */
-	 
-	/**
-	 * Adds more elements, created on the fly, to the set of
-	 * matched elements.
-	 *
-	 * @example $("p").add("<span>Again</span>")
-	 * @before <p>Hello</p>
-	 * @result [ <p>Hello</p>, <span>Again</span> ]
-	 *
-	 * @name add
-	 * @type jQuery
-	 * @param String html A string of HTML to create on the fly.
-	 * @cat DOM/Traversing
-	 */
+	hasClass: function( selector ) {
+		return this.is( "." + selector );
+	},
 
-	/**
-	 * Adds one or more Elements to the set of matched elements.
-	 *
-	 * @example $("p").add( document.getElementById("a") )
-	 * @before <p>Hello</p><p><span id="a">Hello Again</span></p>
-	 * @result [ <p>Hello</p>, <span id="a">Hello Again</span> ]
-	 *
-	 * @example $("p").add( document.forms[0].elements )
-	 * @before <p>Hello</p><p><form><input/><button/></form>
-	 * @result [ <p>Hello</p>, <input/>, <button/> ]
-	 *
-	 * @name add
-	 * @type jQuery
-	 * @param Element|Array<Element> elements One or more Elements to add
-	 * @cat DOM/Traversing
-	 */
-	add: function(t) {
-		return this.pushStack( jQuery.merge(
-			this.get(),
-			t.constructor == String ?
-				jQuery(t).get() :
-				t.length != undefined && (!t.nodeName || t.nodeName == "FORM") ?
-					t : [t] )
-		);
+	val: function( value ) {
+		if ( value == undefined ) {
+
+			if ( this.length ) {
+				var elem = this[0];
+
+				// We need to handle select boxes special
+				if ( jQuery.nodeName( elem, "select" ) ) {
+					var index = elem.selectedIndex,
+						values = [],
+						options = elem.options,
+						one = elem.type == "select-one";
+
+					// Nothing was selected
+					if ( index < 0 )
+						return null;
+
+					// Loop through all the selected options
+					for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
+						var option = options[ i ];
+
+						if ( option.selected ) {
+							// Get the specifc value for the option
+							value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value;
+
+							// We don't need an array for one selects
+							if ( one )
+								return value;
+
+							// Multi-Selects return an array
+							values.push( value );
+						}
+					}
+
+					return values;
+
+				// Everything else, we just grab the value
+				} else
+					return (this[0].value || "").replace(/\r/g, "");
+
+			}
+
+			return undefined;
+		}
+
+		if( value.constructor == Number )
+			value += '';
+
+		return this.each(function(){
+			if ( this.nodeType != 1 )
+				return;
+
+			if ( value.constructor == Array && /radio|checkbox/.test( this.type ) )
+				this.checked = (jQuery.inArray(this.value, value) >= 0 ||
+					jQuery.inArray(this.name, value) >= 0);
+
+			else if ( jQuery.nodeName( this, "select" ) ) {
+				var values = jQuery.makeArray(value);
+
+				jQuery( "option", this ).each(function(){
+					this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
+						jQuery.inArray( this.text, values ) >= 0);
+				});
+
+				if ( !values.length )
+					this.selectedIndex = -1;
+
+			} else
+				this.value = value;
+		});
 	},
 
-	/**
-	 * Checks the current selection against an expression and returns true,
-	 * if at least one element of the selection fits the given expression.
-	 *
-	 * Does return false, if no element fits or the expression is not valid.
-	 *
-	 * filter(String) is used internally, therefore all rules that apply there
-	 * apply here, too.
-	 *
-	 * @example $("input[@type='checkbox']").parent().is("form")
-	 * @before <form><input type="checkbox" /></form>
-	 * @result true
-	 * @desc Returns true, because the parent of the input is a form element
-	 * 
-	 * @example $("input[@type='checkbox']").parent().is("form")
-	 * @before <form><p><input type="checkbox" /></p></form>
-	 * @result false
-	 * @desc Returns false, because the parent of the input is a p element
-	 *
-	 * @name is
-	 * @type Boolean
-	 * @param String expr The expression with which to filter
-	 * @cat DOM/Traversing
-	 */
-	is: function(expr) {
-		return expr ? jQuery.filter(expr,this).r.length > 0 : false;
+	html: function( value ) {
+		return value == undefined ?
+			(this[0] ?
+				this[0].innerHTML :
+				null) :
+			this.empty().append( value );
 	},
-	
-	/**
-	 * Get the current value of the first matched element.
-	 *
-	 * @example $("input").val();
-	 * @before <input type="text" value="some text"/>
-	 * @result "some text"
-	 *
-	 * @name val
-	 * @type String
-	 * @cat DOM/Attributes
-	 */
-	
-	/**
-	 * Set the value of every matched element.
-	 *
-	 * @example $("input").val("test");
-	 * @before <input type="text" value="some text"/>
-	 * @result <input type="text" value="test"/>
-	 *
-	 * @name val
-	 * @type jQuery
-	 * @param String val Set the property to the specified value.
-	 * @cat DOM/Attributes
-	 */
-	val: function( val ) {
-		return val == undefined ?
-			( this.length ? this[0].value : null ) :
-			this.attr( "value", val );
+
+	replaceWith: function( value ) {
+		return this.after( value ).remove();
 	},
-	
-	/**
-	 * Get the html contents of the first matched element.
-	 * This property is not available on XML documents.
-	 *
-	 * @example $("div").html();
-	 * @before <div><input/></div>
-	 * @result <input/>
-	 *
-	 * @name html
-	 * @type String
-	 * @cat DOM/Attributes
-	 */
-	
-	/**
-	 * Set the html contents of every matched element.
-	 * This property is not available on XML documents.
-	 *
-	 * @example $("div").html("<b>new stuff</b>");
-	 * @before <div><input/></div>
-	 * @result <div><b>new stuff</b></div>
-	 *
-	 * @name html
-	 * @type jQuery
-	 * @param String val Set the html contents to the specified value.
-	 * @cat DOM/Attributes
-	 */
-	html: function( val ) {
-		return val == undefined ?
-			( this.length ? this[0].innerHTML : null ) :
-			this.empty().append( val );
+
+	eq: function( i ) {
+		return this.slice( i, i + 1 );
 	},
-	
-	/**
-	 * @private
-	 * @name domManip
-	 * @param Array args
-	 * @param Boolean table Insert TBODY in TABLEs if one is not found.
-	 * @param Number dir If dir<0, process args in reverse order.
-	 * @param Function fn The function doing the DOM manipulation.
-	 * @type jQuery
-	 * @cat Core
-	 */
-	domManip: function(args, table, dir, fn){
-		var clone = this.length > 1; 
-		var a = jQuery.clean(args);
-		if ( dir < 0 )
-			a.reverse();
 
+	slice: function() {
+		return this.pushStack( Array.prototype.slice.apply( this, arguments ) );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function(elem, i){
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	andSelf: function() {
+		return this.add( this.prevObject );
+	},
+
+	data: function( key, value ){
+		var parts = key.split(".");
+		parts[1] = parts[1] ? "." + parts[1] : "";
+
+		if ( value === undefined ) {
+			var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+			if ( data === undefined && this.length )
+				data = jQuery.data( this[0], key );
+
+			return data === undefined && parts[1] ?
+				this.data( parts[0] ) :
+				data;
+		} else
+			return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
+				jQuery.data( this, key, value );
+			});
+	},
+
+	removeData: function( key ){
 		return this.each(function(){
+			jQuery.removeData( this, key );
+		});
+	},
+
+	domManip: function( args, table, reverse, callback ) {
+		var clone = this.length > 1, elems;
+
+		return this.each(function(){
+			if ( !elems ) {
+				elems = jQuery.clean( args, this.ownerDocument );
+
+				if ( reverse )
+					elems.reverse();
+			}
+
 			var obj = this;
 
-			if ( table && jQuery.nodeName(this, "table") && jQuery.nodeName(a[0], "tr") )
-				obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody"));
+			if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) )
+				obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") );
 
-			jQuery.each( a, function(){
-				fn.apply( obj, [ clone ? this.cloneNode(true) : this ] );
+			var scripts = jQuery( [] );
+
+			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, "script" ) )
+					scripts = scripts.add( elem );
+				else {
+					// Remove any inner scripts for later evaluation
+					if ( elem.nodeType == 1 )
+						scripts = scripts.add( jQuery( "script", elem ).remove() );
+
+					// Inject the elements into the document
+					callback.call( obj, elem );
+				}
 			});
 
+			scripts.each( evalScript );
 		});
 	}
 };
 
-/**
- * Extends the jQuery object itself. Can be used to add functions into
- * the jQuery namespace and to add plugin methods (plugins).
- * 
- * @example jQuery.fn.extend({
- *   check: function() {
- *     return this.each(function() { this.checked = true; });
- *   },
- *   uncheck: function() {
- *     return this.each(function() { this.checked = false; });
- *   }
- * });
- * $("input[@type=checkbox]").check();
- * $("input[@type=radio]").uncheck();
- * @desc Adds two plugin methods.
- *
- * @example jQuery.extend({
- *   min: function(a, b) { return a < b ? a : b; },
- *   max: function(a, b) { return a > b ? a : b; }
- * });
- * @desc Adds two functions into the jQuery namespace
- *
- * @name $.extend
- * @param Object prop The object that will be merged into the jQuery object
- * @type Object
- * @cat Core
- */
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
 
-/**
- * Extend one object with one or more others, returning the original,
- * modified, object. This is a great utility for simple inheritance.
- * 
- * @example var settings = { validate: false, limit: 5, name: "foo" };
- * var options = { validate: true, name: "bar" };
- * jQuery.extend(settings, options);
- * @result settings == { validate: true, limit: 5, name: "bar" }
- * @desc Merge settings and options, modifying settings
- *
- * @example var defaults = { validate: false, limit: 5, name: "foo" };
- * var options = { validate: true, name: "bar" };
- * var settings = jQuery.extend({}, defaults, options);
- * @result settings == { validate: true, limit: 5, name: "bar" }
- * @desc Merge defaults and options, without modifying the defaults
- *
- * @name $.extend
- * @param Object target The object to extend
- * @param Object prop1 The object that will be merged into the first.
- * @param Object propN (optional) More objects to merge into the first
- * @type Object
- * @cat JavaScript
- */
+function evalScript( i, elem ) {
+	if ( elem.src )
+		jQuery.ajax({
+			url: elem.src,
+			async: false,
+			dataType: "script"
+		});
+
+	else
+		jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
+
+	if ( elem.parentNode )
+		elem.parentNode.removeChild( elem );
+}
+
+function now(){
+	return +new Date;
+}
+
 jQuery.extend = jQuery.fn.extend = function() {
 	// copy reference to target object
-	var target = arguments[0],
-		a = 1;
+	var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
 
+	// Handle a deep copy situation
+	if ( target.constructor == Boolean ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target != "object" && typeof target != "function" )
+		target = {};
+
 	// extend jQuery itself if only one argument is passed
-	if ( arguments.length == 1 ) {
+	if ( length == i ) {
 		target = this;
-		a = 0;
+		--i;
 	}
-	var prop;
-	while (prop = arguments[a++])
-		// Extend the base object
-		for ( var i in prop ) target[i] = prop[i];
 
+	for ( ; i < length; i++ )
+		// Only deal with non-null/undefined values
+		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 === copy )
+					continue;
+
+				// Recurse if we're merging object values
+				if ( deep && copy && typeof copy == "object" && !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 ( copy !== undefined )
+					target[ name ] = copy;
+
+			}
+
 	// Return the modified object
 	return target;
 };
 
+var expando = "jQuery" + now(), uuid = 0, windowData = {},
+	// exclude the following css properties to add px
+	exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
+	// cache defaultView
+	defaultView = document.defaultView || {};
+
 jQuery.extend({
-	/**
-	 * Run this function to give control of the $ variable back
-	 * to whichever library first implemented it. This helps to make 
-	 * sure that jQuery doesn't conflict with the $ object
-	 * of other libraries.
-	 *
-	 * By using this function, you will only be able to access jQuery
-	 * using the 'jQuery' variable. For example, where you used to do
-	 * $("div p"), you now must do jQuery("div p").
-	 *
-	 * @example jQuery.noConflict();
-	 * // Do something with jQuery
-	 * jQuery("div p").hide();
-	 * // Do something with another library's $()
-	 * $("content").style.display = 'none';
-	 * @desc Maps the original object that was referenced by $ back to $
-	 *
-	 * @example jQuery.noConflict();
-	 * (function($) { 
-	 *   $(function() {
-	 *     // more code using $ as alias to jQuery
-	 *   });
-	 * })(jQuery);
-	 * // other code using $ as an alias to the other library
-	 * @desc Reverts the $ alias and then creates and executes a
-	 * function to provide the $ as a jQuery alias inside the functions
-	 * scope. Inside the function the original $ object is not available.
-	 * This works well for most plugins that don't rely on any other library.
-	 * 
-	 *
-	 * @name $.noConflict
-	 * @type undefined
-	 * @cat Core 
-	 */
-	noConflict: function() {
-		if ( jQuery._$ )
-			$ = jQuery._$;
+	noConflict: function( deep ) {
+		window.$ = _$;
+
+		if ( deep )
+			window.jQuery = _jQuery;
+
 		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
+	// See test/unit/core.js for details concerning this function.
 	isFunction: function( fn ) {
-		return !!fn && typeof fn != "string" &&
-			typeof fn[0] == "undefined" && /function/i.test( fn + "" );
+		return !!fn && typeof fn != "string" && !fn.nodeName &&
+			fn.constructor != Array && /^[\s[]?function/.test( fn + "" );
 	},
 
+	// check if an element is in a (or is an) XML document
+	isXMLDoc: function( elem ) {
+		return elem.documentElement && !elem.body ||
+			elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
+	},
+
+	// Evalulates a script in a global context
+	globalEval: function( data ) {
+		data = jQuery.trim( data );
+
+		if ( data ) {
+			// Inspired by code by Andrea Giammarchi
+			// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
+			var head = document.getElementsByTagName("head")[0] || document.documentElement,
+				script = document.createElement("script");
+
+			script.type = "text/javascript";
+			if ( jQuery.browser.msie )
+				script.text = data;
+			else
+				script.appendChild( document.createTextNode( data ) );
+
+			// 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 );
+		}
+	},
+
 	nodeName: function( elem, name ) {
 		return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
 	},
 
-	/**
-	 * A generic iterator function, which can be used to seemlessly
-	 * iterate over both objects and arrays. This function is not the same
-	 * as $().each() - which is used to iterate, exclusively, over a jQuery
-	 * object. This function can be used to iterate over anything.
-	 *
-	 * The callback has two arguments:the key (objects) or index (arrays) as first
-	 * the first, and the value as the second.
-	 *
-	 * @example $.each( [0,1,2], function(i, n){
-	 *   alert( "Item #" + i + ": " + n );
-	 * });
-	 * @desc This is an example of iterating over the items in an array,
-	 * accessing both the current item and its index.
-	 *
-	 * @example $.each( { name: "John", lang: "JS" }, function(i, n){
-	 *   alert( "Name: " + i + ", Value: " + n );
-	 * });
-	 *
-	 * @desc This is an example of iterating over the properties in an
-	 * Object, accessing both the current item and its key.
-	 *
-	 * @name $.each
-	 * @param Object obj The object, or array, to iterate over.
-	 * @param Function fn The function that will be executed on every object.
-	 * @type Object
-	 * @cat JavaScript
-	 */
+	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 && !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 = "";
+
+				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( obj, fn, args ) {
-		if ( obj.length == undefined )
-			for ( var i in obj )
-				fn.apply( obj[i], args || [i, obj[i]] );
-		else
-			for ( var i = 0, ol = obj.length; i < ol; i++ )
-				if ( fn.apply( obj[i], args || [i, obj[i]] ) === false ) break;
-		return obj;
+	each: function( object, callback, args ) {
+		var name, i = 0, length = object.length;
+
+		if ( args ) {
+			if ( length == undefined ) {
+				for ( name in object )
+					if ( callback.apply( object[ name ], args ) === false )
+						break;
+			} else
+				for ( ; i < length; )
+					if ( callback.apply( object[ i++ ], args ) === false )
+						break;
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( length == undefined ) {
+				for ( name in object )
+					if ( callback.call( object[ name ], name, object[ name ] ) === false )
+						break;
+			} else
+				for ( var value = object[0];
+					i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
+		}
+
+		return object;
 	},
-	
-	prop: function(elem, value, type, index, prop){
-			// Handle executable functions
-			if ( jQuery.isFunction( value ) )
-				return value.call( elem, [index] );
-				
-			// exclude the following css properties to add px
-			var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i;
 
-			// Handle passing in a number to a CSS property
-			if ( value.constructor == Number && type == "curCSS" && !exclude.test(prop) )
-				return value + "px";
+	prop: function( elem, value, type, i, name ) {
+		// Handle executable functions
+		if ( jQuery.isFunction( value ) )
+			value = value.call( elem, i );
 
-			return value;
+		// Handle passing in a number to a CSS property
+		return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ?
+			value + "px" :
+			value;
 	},
 
 	className: {
 		// internal only, use addClass("class")
-		add: function( elem, c ){
-			jQuery.each( c.split(/\s+/), function(i, cur){
-				if ( !jQuery.className.has( elem.className, cur ) )
-					elem.className += ( elem.className ? " " : "" ) + cur;
+		add: function( elem, classNames ) {
+			jQuery.each((classNames || "").split(/\s+/), function(i, className){
+				if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
+					elem.className += (elem.className ? " " : "") + className;
 			});
 		},
 
 		// internal only, use removeClass("class")
-		remove: function( elem, c ){
-			elem.className = c ?
-				jQuery.grep( elem.className.split(/\s+/), function(cur){
-					return !jQuery.className.has( c, cur );	
-				}).join(" ") : "";
+		remove: function( elem, classNames ) {
+			if (elem.nodeType == 1)
+				elem.className = classNames != undefined ?
+					jQuery.grep(elem.className.split(/\s+/), function(className){
+						return !jQuery.className.has( classNames, className );
+					}).join(" ") :
+					"";
 		},
 
-		// internal only, use is(".class")
-		has: function( t, c ) {
-			t = t.className || t;
-			return t && new RegExp("(^|\\s)" + c + "(\\s|$)").test( t );
+		// internal only, use hasClass("class")
+		has: function( elem, className ) {
+			return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
 		}
 	},
 
-	/**
-	 * Swap in/out style options.
-	 * @private
-	 */
-	swap: function(e,o,f) {
-		for ( var i in o ) {
-			e.style["old"+i] = e.style[i];
-			e.style[i] = o[i];
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var old = {};
+		// Remember the old values, and insert the new ones
+		for ( var name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
 		}
-		f.apply( e, [] );
-		for ( var i in o )
-			e.style[i] = e.style["old"+i];
+
+		callback.call( elem );
+
+		// Revert the old values
+		for ( var name in options )
+			elem.style[ name ] = old[ name ];
 	},
 
-	css: function(e,p) {
-		if ( p == "height" || p == "width" ) {
-			var old = {}, oHeight, oWidth, d = ["Top","Bottom","Right","Left"];
+	css: function( elem, name, force ) {
+		if ( name == "width" || name == "height" ) {
+			var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
 
-			jQuery.each( d, function(){
-				old["padding" + this] = 0;
-				old["border" + this + "Width"] = 0;
-			});
+			function getWH() {
+				val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
+				var padding = 0, border = 0;
+				jQuery.each( which, function() {
+					padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
+					border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
+				});
+				val -= Math.round(padding + border);
+			}
 
-			jQuery.swap( e, old, function() {
-				if (jQuery.css(e,"display") != "none") {
-					oHeight = e.offsetHeight;
-					oWidth = e.offsetWidth;
-				} else {
-					e = jQuery(e.cloneNode(true))
-						.find(":radio").removeAttr("checked").end()
-						.css({
-							visibility: "hidden", position: "absolute", display: "block", right: "0", left: "0"
-						}).appendTo(e.parentNode)[0];
+			if ( jQuery(elem).is(":visible") )
+				getWH();
+			else
+				jQuery.swap( elem, props, getWH );
 
-					var parPos = jQuery.css(e.parentNode,"position");
-					if ( parPos == "" || parPos == "static" )
-						e.parentNode.style.position = "relative";
+			return Math.max(0, val);
+		}
 
-					oHeight = e.clientHeight;
-					oWidth = e.clientWidth;
+		return jQuery.curCSS( elem, name, force );
+	},
 
-					if ( parPos == "" || parPos == "static" )
-						e.parentNode.style.position = "static";
+	curCSS: function( elem, name, force ) {
+		var ret, style = elem.style;
 
-					e.parentNode.removeChild(e);
-				}
-			});
+		// A helper method for determining if an element's values are broken
+		function color( elem ) {
+			if ( !jQuery.browser.safari )
+				return false;
 
-			return p == "height" ? oHeight : oWidth;
+			// defaultView is cached
+			var ret = defaultView.getComputedStyle( elem, null );
+			return !ret || ret.getPropertyValue("color") == "";
 		}
 
-		return jQuery.curCSS( e, p );
-	},
+		// We need to handle opacity special in IE
+		if ( name == "opacity" && jQuery.browser.msie ) {
+			ret = jQuery.attr( style, "opacity" );
 
-	curCSS: function(elem, prop, force) {
-		var ret;
-		
-		if (prop == "opacity" && jQuery.browser.msie)
-			return jQuery.attr(elem.style, "opacity");
-			
-		if (prop == "float" || prop == "cssFloat")
-		    prop = jQuery.browser.msie ? "styleFloat" : "cssFloat";
+			return ret == "" ?
+				"1" :
+				ret;
+		}
+		// Opera sometimes will give the wrong display answer, this fixes it, see #2037
+		if ( jQuery.browser.opera && name == "display" ) {
+			var save = style.outline;
+			style.outline = "0 solid black";
+			style.outline = save;
+		}
 
-		if (!force && elem.style[prop])
-			ret = elem.style[prop];
+		// Make sure we're using the right name for getting the float value
+		if ( name.match( /float/i ) )
+			name = styleFloat;
 
-		else if (document.defaultView && document.defaultView.getComputedStyle) {
+		if ( !force && style && style[ name ] )
+			ret = style[ name ];
 
-			if (prop == "cssFloat" || prop == "styleFloat")
-				prop = "float";
+		else if ( defaultView.getComputedStyle ) {
 
-			prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase();
-			var cur = document.defaultView.getComputedStyle(elem, null);
+			// Only "float" is needed here
+			if ( name.match( /float/i ) )
+				name = "float";
 
-			if ( cur )
-				ret = cur.getPropertyValue(prop);
-			else if ( prop == "display" )
-				ret = "none";
-			else
-				jQuery.swap(elem, { display: "block" }, function() {
-				    var c = document.defaultView.getComputedStyle(this, "");
-				    ret = c && c.getPropertyValue(prop) || "";
-				});
+			name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
 
-		} else if (elem.currentStyle) {
+			var computedStyle = defaultView.getComputedStyle( elem, null );
 
-			var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();});
-			ret = elem.currentStyle[prop] || elem.currentStyle[newProp];
-			
+			if ( computedStyle && !color( elem ) )
+				ret = computedStyle.getPropertyValue( name );
+
+			// If the element isn't reporting its values properly in Safari
+			// then some display: none elements are involved
+			else {
+				var swap = [], stack = [], a = elem, i = 0;
+
+				// Locate all of the parent display: none elements
+				for ( ; a && 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 ( ; i < stack.length; i++ )
+					if ( color( stack[ i ] ) ) {
+						swap[ i ] = stack[ i ].style.display;
+						stack[ i ].style.display = "block";
+					}
+
+				// Since we flip the display style, we have to handle that
+				// one special, otherwise get the value
+				ret = name == "display" && swap[ stack.length - 1 ] != null ?
+					"none" :
+					( computedStyle && computedStyle.getPropertyValue( name ) ) || "";
+
+				// Finally, revert the display styles back
+				for ( i = 0; i < swap.length; i++ )
+					if ( swap[ i ] != null )
+						stack[ i ].style.display = swap[ i ];
+			}
+
+			// We should always get a number back from opacity
+			if ( name == "opacity" && ret == "" )
+				ret = "1";
+
+		} else if ( elem.currentStyle ) {
+			var camelCase = name.replace(/\-(\w)/g, function(all, letter){
+				return letter.toUpperCase();
+			});
+
+			ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
+
+			// From the awesome hack by Dean Edwards
+			// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+			// If we're not dealing with a regular pixel number
+			// but a number that has a weird ending, we need to convert it to pixels
+			if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
+				// Remember the original values
+				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;
+				style.left = ret || 0;
+				ret = style.pixelLeft + "px";
+
+				// Revert the changed values
+				style.left = left;
+				elem.runtimeStyle.left = rsLeft;
+			}
 		}
 
 		return ret;
 	},
-	
-	clean: function(a) {
-		var r = [];
 
-		jQuery.each( a, function(i,arg){
-			if ( !arg ) return;
+	clean: function( elems, context ) {
+		var ret = [];
+		context = context || document;
+		// !context.createElement fails in IE with an error but returns typeof 'object'
+		if (typeof context.createElement == 'undefined')
+			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
 
-			if ( arg.constructor == Number )
-				arg = arg.toString();
-			
-			 // Convert html string into DOM nodes
-			if ( typeof arg == "string" ) {
+		jQuery.each(elems, function(i, elem){
+			if ( !elem )
+				return;
+
+			if ( elem.constructor == Number )
+				elem += '';
+
+			// Convert html string into DOM nodes
+			if ( typeof elem == "string" ) {
+				// Fix "XHTML"-style tags in all browsers
+				elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
+					return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
+						all :
+						front + "></" + tag + ">";
+				});
+
 				// Trim whitespace, otherwise indexOf won't work as expected
-				var s = jQuery.trim(arg), div = document.createElement("div"), tb = [];
+				var tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement("div");
 
 				var wrap =
-					 // option or optgroup
-					!s.indexOf("<opt") &&
-					[1, "<select>", "</select>"] ||
-					
-					(!s.indexOf("<thead") || !s.indexOf("<tbody") || !s.indexOf("<tfoot")) &&
-					[1, "<table>", "</table>"] ||
-					
-					!s.indexOf("<tr") &&
-					[2, "<table><tbody>", "</tbody></table>"] ||
-					
+					// option or optgroup
+					!tags.indexOf("<opt") &&
+					[ 1, "<select multiple='multiple'>", "</select>" ] ||
+
+					!tags.indexOf("<leg") &&
+					[ 1, "<fieldset>", "</fieldset>" ] ||
+
+					tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
+					[ 1, "<table>", "</table>" ] ||
+
+					!tags.indexOf("<tr") &&
+					[ 2, "<table><tbody>", "</tbody></table>" ] ||
+
 				 	// <thead> matched above
-					(!s.indexOf("<td") || !s.indexOf("<th")) &&
-					[3, "<table><tbody><tr>", "</tr></tbody></table>"] ||
-					
-					[0,"",""];
+					(!tags.indexOf("<td") || !tags.indexOf("<th")) &&
+					[ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
 
+					!tags.indexOf("<col") &&
+					[ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
+
+					// IE can't serialize <link> and <script> tags normally
+					jQuery.browser.msie &&
+					[ 1, "div<div>", "</div>" ] ||
+
+					[ 0, "", "" ];
+
 				// Go to html and back, then peel off extra wrappers
-				div.innerHTML = wrap[1] + s + wrap[2];
-				
+				div.innerHTML = wrap[1] + elem + wrap[2];
+
 				// Move to the right depth
 				while ( wrap[0]-- )
-					div = div.firstChild;
-				
+					div = div.lastChild;
+
 				// Remove IE's autoinserted <tbody> from table fragments
 				if ( jQuery.browser.msie ) {
-					
+
 					// String was a <table>, *may* have spurious <tbody>
-					if ( !s.indexOf("<table") && s.indexOf("<tbody") < 0 ) 
-						tb = div.firstChild && div.firstChild.childNodes;
-						
-					// String was a bare <thead> or <tfoot>
-					else if ( wrap[1] == "<table>" && s.indexOf("<tbody") < 0 )
-						tb = div.childNodes;
+					var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ?
+						div.firstChild && div.firstChild.childNodes :
 
-					for ( var n = tb.length-1; n >= 0 ; --n )
-						if ( jQuery.nodeName(tb[n], "tbody") && !tb[n].childNodes.length )
-							tb[n].parentNode.removeChild(tb[n]);
-					
+						// String was a bare <thead> or <tfoot>
+						wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ?
+							div.childNodes :
+							[];
+
+					for ( var j = tbody.length - 1; j >= 0 ; --j )
+						if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !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 );
+
 				}
-				
-				arg = div.childNodes;
+
+				elem = jQuery.makeArray( div.childNodes );
 			}
 
-			if ( arg.length === 0 )
+			if ( elem.length === 0 && (!jQuery.nodeName( elem, "form" ) && !jQuery.nodeName( elem, "select" )) )
 				return;
-			
-			if ( arg[0] == undefined )
-				r.push( arg );
+
+			if ( elem[0] == undefined || jQuery.nodeName( elem, "form" ) || elem.options )
+				ret.push( elem );
+
 			else
-				r = jQuery.merge( r, arg );
+				ret = jQuery.merge( ret, elem );
 
 		});
 
-		return r;
+		return ret;
 	},
-	
-	attr: function(elem, name, value){
-		var fix = {
-			"for": "htmlFor",
-			"class": "className",
-			"float": jQuery.browser.msie ? "styleFloat" : "cssFloat",
-			cssFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat",
-			innerHTML: "innerHTML",
-			className: "className",
-			value: "value",
-			disabled: "disabled",
-			checked: "checked",
-			readonly: "readOnly",
-			selected: "selected"
-		};
-		
-		// IE actually uses filters for opacity ... elem is actually elem.style
-		if ( name == "opacity" && jQuery.browser.msie && 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
-			return elem.filter = elem.filter.replace(/alpha\([^\)]*\)/gi,"") +
-				( value == 1 ? "" : "alpha(opacity=" + value * 100 + ")" );
+	attr: function( elem, name, value ) {
+		// don't set attributes on text and comment nodes
+		if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
+			return undefined;
 
-		} else if ( name == "opacity" && jQuery.browser.msie )
-			return elem.filter ? 
-				parseFloat( elem.filter.match(/alpha\(opacity=(.*)\)/)[1] ) / 100 : 1;
-		
-		// Mozilla doesn't play well with opacity 1
-		if ( name == "opacity" && jQuery.browser.mozilla && value == 1 )
-			value = 0.9999;
+		var notxml = !jQuery.isXMLDoc( elem ),
+			// Whether we are setting (or getting)
+			set = value !== undefined,
+			msie = jQuery.browser.msie;
 
-		// Certain attributes only work when accessed via the old DOM 0 way
-		if ( fix[name] ) {
-			if ( value != undefined ) elem[fix[name]] = value;
-			return elem[fix[name]];
+		// Try to normalize/fix the name
+		name = notxml && jQuery.props[ name ] || name;
 
-		} else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName(elem, "form") && (name == "action" || name == "method") )
-			return elem.getAttributeNode(name).nodeValue;
-
+		// Only do all the following if this is a node (faster for style)
 		// IE elem.getAttribute passes even for style
-		else if ( elem.tagName ) {
-			if ( value != undefined ) elem.setAttribute( name, value );
-			return elem.getAttribute( name );
+		if ( elem.tagName ) {
 
-		} else {
-			name = name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});
-			if ( value != undefined ) elem[name] = value;
-			return elem[name];
+			// These attributes require special treatment
+			var special = /href|src|style/.test( name );
+
+			// Safari mis-reports the default selected property of a hidden option
+			// Accessing the parent's selectedIndex property fixes it
+			if ( name == "selected" && jQuery.browser.safari )
+				elem.parentNode.selectedIndex;
+
+			// If applicable, access the attribute via the DOM 0 way
+			if ( name in elem && notxml && !special ) {
+				if ( set ){
+					// We can't allow the type property to be changed (since it causes problems in IE)
+					if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
+						throw "type property can't be changed";
+
+					elem[ name ] = value;
+				}
+
+				// browsers index elements by id/name on forms, give priority to attributes.
+				if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
+					return elem.getAttributeNode( name ).nodeValue;
+
+				return elem[ name ];
+			}
+
+			if ( msie && notxml &&  name == "style" )
+				return jQuery.attr( elem.style, "cssText", value );
+
+			if ( set )
+				// convert the value to a string (all browsers do this but IE) see #1070
+				elem.setAttribute( name, "" + value );
+
+			var attr = msie && notxml && special
+					// Some attributes require a special call on IE
+					? elem.getAttribute( name, 2 )
+					: 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
+
+		// IE uses filters for opacity
+		if ( msie && name == "opacity" ) {
+			if ( set ) {
+				// 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 || "").replace( /alpha\([^)]*\)/, "" ) +
+					(parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
+			}
+
+			return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
+				(parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
+				"";
+		}
+
+		name = name.replace(/-([a-z])/ig, function(all, letter){
+			return letter.toUpperCase();
+		});
+
+		if ( set )
+			elem[ name ] = value;
+
+		return elem[ name ];
 	},
-	
-	/**
-	 * Remove the whitespace from the beginning and end of a string.
-	 *
-	 * @example $.trim("  hello, how are you?  ");
-	 * @result "hello, how are you?"
-	 *
-	 * @name $.trim
-	 * @type String
-	 * @param String str The string to trim.
-	 * @cat JavaScript
-	 */
-	trim: function(t){
-		return t.replace(/^\s+|\s+$/g, "");
+
+	trim: function( text ) {
+		return (text || "").replace( /^\s+|\s+$/g, "" );
 	},
 
-	makeArray: function( a ) {
-		var r = [];
+	makeArray: function( array ) {
+		var ret = [];
 
-		if ( a.constructor != Array )
-			for ( var i = 0, al = a.length; i < al; i++ )
-				r.push( a[i] );
-		else
-			r = a.slice( 0 );
+		if( array != null ){
+			var i = array.length;
+			//the window, strings and functions also have 'length'
+			if( i == null || array.split || array.setInterval || array.call )
+				ret[0] = array;
+			else
+				while( i )
+					ret[--i] = array[i];
+		}
 
-		return r;
+		return ret;
 	},
 
-	inArray: function( b, a ) {
-		for ( var i = 0, al = a.length; i < al; i++ )
-			if ( a[i] == b )
+	inArray: function( elem, array ) {
+		for ( var i = 0, length = array.length; i < length; i++ )
+		// Use === because on IE, window == document
+			if ( array[ i ] === elem )
 				return i;
+
 		return -1;
 	},
 
-	/**
-	 * Merge two arrays together, removing all duplicates.
-	 *
-	 * The result is the altered first argument with
-	 * the unique elements from the second array added.
-	 *
-	 * @example $.merge( [0,1,2], [2,3,4] )
-	 * @result [0,1,2,3,4]
-	 * @desc Merges two arrays, removing the duplicate 2
-	 *
-	 * @example var array = [3,2,1];
-	 * $.merge( array, [4,3,2] )
-	 * @result array == [3,2,1,4]
-	 * @desc Merges two arrays, removing the duplicates 3 and 2
-	 *
-	 * @name $.merge
-	 * @type Array
-	 * @param Array first The first array to merge, the unique elements of second added.
-	 * @param Array second The second array to merge into the first, unaltered.
-	 * @cat JavaScript
-	 */
-	merge: function(first, second) {
-		var r = [].slice.call( first, 0 );
+	merge: function( first, second ) {
+		// We have to loop this way because IE & 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 ) {
+			while ( elem = second[ i++ ] )
+				if ( elem.nodeType != 8 )
+					first[ pos++ ] = elem;
 
-		// Now check for duplicates between the two arrays
-		// and only add the unique items
-		for ( var i = 0, sl = second.length; i < sl; i++ )
-			// Check for duplicates
-			if ( jQuery.inArray( second[i], r ) == -1 )
-				// The item is unique, add it
-				first.push( second[i] );
+		} else
+			while ( elem = second[ i++ ] )
+				first[ pos++ ] = elem;
 
 		return first;
 	},
 
-	/**
-	 * Filter items out of an array, by using a filter function.
-	 *
-	 * The specified function will be passed two arguments: The
-	 * current array item and the index of the item in the array. The
-	 * function must return 'true' to keep the item in the array, 
-	 * false to remove it.
-	 *
-	 * @example $.grep( [0,1,2], function(i){
-	 *   return i > 0;
-	 * });
-	 * @result [1, 2]
-	 *
-	 * @name $.grep
-	 * @type Array
-	 * @param Array array The Array to find items in.
-	 * @param Function fn The function to process each item against.
-	 * @param Boolean inv Invert the selection - select the opposite of the function.
-	 * @cat JavaScript
-	 */
-	grep: function(elems, fn, inv) {
-		// If a string is passed in for the function, make a function
-		// for it (a handy shortcut)
-		if ( typeof fn == "string" )
-			fn = new Function("a","i","return " + fn);
+	unique: function( array ) {
+		var ret = [], done = {};
 
-		var result = [];
+		try {
 
+			for ( var i = 0, length = array.length; i < length; i++ ) {
+				var id = jQuery.data( array[ i ] );
+
+				if ( !done[ id ] ) {
+					done[ id ] = true;
+					ret.push( array[ i ] );
+				}
+			}
+
+		} catch( e ) {
+			ret = array;
+		}
+
+		return ret;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var ret = [];
+
 		// Go through the array, only saving the items
 		// that pass the validator function
-		for ( var i = 0, el = elems.length; i < el; i++ )
-			if ( !inv && fn(elems[i],i) || inv && !fn(elems[i],i) )
-				result.push( elems[i] );
+		for ( var i = 0, length = elems.length; i < length; i++ )
+			if ( !inv != !callback( elems[ i ], i ) )
+				ret.push( elems[ i ] );
 
-		return result;
+		return ret;
 	},
 
-	/**
-	 * Translate all items in an array to another array of items.
-	 *
-	 * The translation function that is provided to this method is 
-	 * called for each item in the array and is passed one argument: 
-	 * The item to be translated.
-	 *
-	 * The function can then return the translated value, 'null'
-	 * (to remove the item), or  an array of values - which will
-	 * be flattened into the full array.
-	 *
-	 * @example $.map( [0,1,2], function(i){
-	 *   return i + 4;
-	 * });
-	 * @result [4, 5, 6]
-	 * @desc Maps the original array to a new one and adds 4 to each value.
-	 *
-	 * @example $.map( [0,1,2], function(i){
-	 *   return i > 0 ? i + 1 : null;
-	 * });
-	 * @result [2, 3]
-	 * @desc Maps the original array to a new one and adds 1 to each
-	 * value if it is bigger then zero, otherwise it's removed-
-	 * 
-	 * @example $.map( [0,1,2], function(i){
-	 *   return [ i, i + 1 ];
-	 * });
-	 * @result [0, 1, 1, 2, 2, 3]
-	 * @desc Maps the original array to a new one, each element is added
-	 * with it's original value and the value plus one.
-	 *
-	 * @name $.map
-	 * @type Array
-	 * @param Array array The Array to translate.
-	 * @param Function fn The function to process each item against.
-	 * @cat JavaScript
-	 */
-	map: function(elems, fn) {
-		// If a string is passed in for the function, make a function
-		// for it (a handy shortcut)
-		if ( typeof fn == "string" )
-			fn = new Function("a","return " + fn);
+	map: function( elems, callback ) {
+		var ret = [];
 
-		var result = [], r = [];
-
 		// Go through the array, translating each of the items to their
 		// new value (or values).
-		for ( var i = 0, el = elems.length; i < el; i++ ) {
-			var val = fn(elems[i],i);
+		for ( var i = 0, length = elems.length; i < length; i++ ) {
+			var value = callback( elems[ i ], i );
 
-			if ( val !== null && val != undefined ) {
-				if ( val.constructor != Array ) val = [val];
-				result = result.concat( val );
-			}
+			if ( value != null )
+				ret[ ret.length ] = value;
 		}
 
-		var r = result.length ? [ result[0] ] : [];
-
-		check: for ( var i = 1, rl = result.length; i < rl; i++ ) {
-			for ( var j = 0; j < i; j++ )
-				if ( result[i] == r[j] )
-					continue check;
-
-			r.push( result[i] );
-		}
-
-		return r;
+		return ret.concat.apply( [], ret );
 	}
 });
 
-/**
- * Contains flags for the useragent, read from navigator.userAgent.
- * Available flags are: safari, opera, msie, mozilla
- *
- * This property is available before the DOM is ready, therefore you can
- * use it to add ready events only for certain browsers.
- *
- * There are situations where object detections is not reliable enough, in that
- * cases it makes sense to use browser detection. Simply try to avoid both!
- *
- * A combination of browser and object detection yields quite reliable results.
- *
- * @example $.browser.msie
- * @desc Returns true if the current useragent is some version of microsoft's internet explorer
- *
- * @example if($.browser.safari) { $( function() { alert("this is safari!"); } ); }
- * @desc Alerts "this is safari!" only for safari browsers
- *
- * @property
- * @name $.browser
- * @type Boolean
- * @cat JavaScript
- */
- 
-/*
- * Whether the W3C compliant box model is being used.
- *
- * @property
- * @name $.boxModel
- * @type Boolean
- * @cat JavaScript
- */
-new function() {
-	var b = navigator.userAgent.toLowerCase();
+var userAgent = navigator.userAgent.toLowerCase();
 
-	// Figure out what browser is being used
-	jQuery.browser = {
-		safari: /webkit/.test(b),
-		opera: /opera/.test(b),
-		msie: /msie/.test(b) && !/opera/.test(b),
-		mozilla: /mozilla/.test(b) && !/(compatible|webkit)/.test(b)
-	};
-
-	// Check to see if the W3C box model is being used
-	jQuery.boxModel = !jQuery.browser.msie || document.compatMode == "CSS1Compat";
+// Figure out what browser is being used
+jQuery.browser = {
+	version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
+	safari: /webkit/.test( userAgent ),
+	opera: /opera/.test( userAgent ),
+	msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
+	mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
 };
 
-/**
- * Get a set of elements containing the unique parents of the matched
- * set of elements.
- *
- * Can be filtered with an optional expressions.
- *
- * @example $("p").parent()
- * @before <div><p>Hello</p><p>Hello</p></div>
- * @result [ <div><p>Hello</p><p>Hello</p></div> ]
- * @desc Find the parent element of each paragraph.
- *
- * @example $("p").parent(".selected")
- * @before <div><p>Hello</p></div><div class="selected"><p>Hello Again</p></div>
- * @result [ <div class="selected"><p>Hello Again</p></div> ]
- * @desc Find the parent element of each paragraph with a class "selected".
- *
- * @name parent
- * @type jQuery
- * @param String expr (optional) An expression to filter the parents with
- * @cat DOM/Traversing
- */
+var styleFloat = jQuery.browser.msie ?
+	"styleFloat" :
+	"cssFloat";
 
-/**
- * Get a set of elements containing the unique ancestors of the matched
- * set of elements (except for the root element).
- *
- * Can be filtered with an optional expressions.
- *
- * @example $("span").parents()
- * @before <html><body><div><p><span>Hello</span></p><span>Hello Again</span></div></body></html>
- * @result [ <body>...</body>, <div>...</div>, <p><span>Hello</span></p> ]
- * @desc Find all parent elements of each span.
- *
- * @example $("span").parents("p")
- * @before <html><body><div><p><span>Hello</span></p><span>Hello Again</span></div></body></html>
- * @result [ <p><span>Hello</span></p> ]
- * @desc Find all parent elements of each span that is a paragraph.
- *
- * @name parents
- * @type jQuery
- * @param String expr (optional) An expression to filter the ancestors with
- * @cat DOM/Traversing
- */
+jQuery.extend({
+	// Check to see if the W3C box model is being used
+	boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",
 
-/**
- * Get a set of elements containing the unique next siblings of each of the
- * matched set of elements.
- *
- * It only returns the very next sibling, not all next siblings.
- *
- * Can be filtered with an optional expressions.
- *
- * @example $("p").next()
- * @before <p>Hello</p><p>Hello Again</p><div><span>And Again</span></div>
- * @result [ <p>Hello Again</p>, <div><span>And Again</span></div> ]
- * @desc Find the very next sibling of each paragraph.
- *
- * @example $("p").next(".selected")
- * @before <p>Hello</p><p class="selected">Hello Again</p><div><span>And Again</span></div>
- * @result [ <p class="selected">Hello Again</p> ]
- * @desc Find the very next sibling of each paragraph that has a class "selected".
- *
- * @name next
- * @type jQuery
- * @param String expr (optional) An expression to filter the next Elements with
- * @cat DOM/Traversing
- */
+	props: {
+		"for": "htmlFor",
+		"class": "className",
+		"float": styleFloat,
+		cssFloat: styleFloat,
+		styleFloat: styleFloat,
+		readonly: "readOnly",
+		maxlength: "maxLength",
+		cellspacing: "cellSpacing"
+	}
+});
 
-/**
- * Get a set of elements containing the unique previous siblings of each of the
- * matched set of elements.
- *
- * Can be filtered with an optional expressions.
- *
- * It only returns the immediately previous sibling, not all previous siblings.
- *
- * @example $("p").prev()
- * @before <p>Hello</p><div><span>Hello Again</span></div><p>And Again</p>
- * @result [ <div><span>Hello Again</span></div> ]
- * @desc Find the very previous sibling of each paragraph.
- *
- * @example $("p").prev(".selected")
- * @before <div><span>Hello</span></div><p class="selected">Hello Again</p><p>And Again</p>
- * @result [ <div><span>Hello</span></div> ]
- * @desc Find the very previous sibling of each paragraph that has a class "selected".
- *
- * @name prev
- * @type jQuery
- * @param String expr (optional) An expression to filter the previous Elements with
- * @cat DOM/Traversing
- */
+jQuery.each({
+	parent: function(elem){return elem.parentNode;},
+	parents: function(elem){return jQuery.dir(elem,"parentNode");},
+	next: function(elem){return jQuery.nth(elem,2,"nextSibling");},
+	prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},
+	nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},
+	prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},
+	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,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
+}, function(name, fn){
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = jQuery.map( this, fn );
 
-/**
- * Get a set of elements containing all of the unique siblings of each of the
- * matched set of elements.
- *
- * Can be filtered with an optional expressions.
- *
- * @example $("div").siblings()
- * @before <p>Hello</p><div><span>Hello Again</span></div><p>And Again</p>
- * @result [ <p>Hello</p>, <p>And Again</p> ]
- * @desc Find all siblings of each div.
- *
- * @example $("div").siblings(".selected")
- * @before <div><span>Hello</span></div><p class="selected">Hello Again</p><p>And Again</p>
- * @result [ <p class="selected">Hello Again</p> ]
- * @desc Find all siblings with a class "selected" of each div.
- *
- * @name siblings
- * @type jQuery
- * @param String expr (optional) An expression to filter the sibling Elements with
- * @cat DOM/Traversing
- */
+		if ( selector && typeof selector == "string" )
+			ret = jQuery.multiFilter( selector, ret );
 
-/**
- * Get a set of elements containing all of the unique children of each of the
- * matched set of elements.
- *
- * Can be filtered with an optional expressions.
- *
- * @example $("div").children()
- * @before <p>Hello</p><div><span>Hello Again</span></div><p>And Again</p>
- * @result [ <span>Hello Again</span> ]
- * @desc Find all children of each div.
- *
- * @example $("div").children(".selected")
- * @before <div><span>Hello</span><p class="selected">Hello Again</p><p>And Again</p></div>
- * @result [ <p class="selected">Hello Again</p> ]
- * @desc Find all children with a class "selected" of each div.
- *
- * @name children
- * @type jQuery
- * @param String expr (optional) An expression to filter the child Elements with
- * @cat DOM/Traversing
- */
-jQuery.each({
-	parent: "a.parentNode",
-	parents: "jQuery.parents(a)",
-	next: "jQuery.nth(a,2,'nextSibling')",
-	prev: "jQuery.nth(a,2,'previousSibling')",
-	siblings: "jQuery.sibling(a.parentNode.firstChild,a)",
-	children: "jQuery.sibling(a.firstChild)"
-}, function(i,n){
-	jQuery.fn[ i ] = function(a) {
-		var ret = jQuery.map(this,n);
-		if ( a && typeof a == "string" )
-			ret = jQuery.multiFilter(a,ret);
-		return this.pushStack( ret );
+		return this.pushStack( jQuery.unique( ret ) );
 	};
 });
 
-/**
- * Append all of the matched elements to another, specified, set of elements.
- * This operation is, essentially, the reverse of doing a regular
- * $(A).append(B), in that instead of appending B to A, you're appending
- * A to B.
- *
- * @example $("p").appendTo("#foo");
- * @before <p>I would like to say: </p><div id="foo"></div>
- * @result <div id="foo"><p>I would like to say: </p></div>
- * @desc Appends all paragraphs to the element with the ID "foo"
- *
- * @name appendTo
- * @type jQuery
- * @param <Content> content Content to append to the selected element to.
- * @cat DOM/Manipulation
- * @see append(<Content>)
- */
-
-/**
- * Prepend all of the matched elements to another, specified, set of elements.
- * This operation is, essentially, the reverse of doing a regular
- * $(A).prepend(B), in that instead of prepending B to A, you're prepending
- * A to B.
- *
- * @example $("p").prependTo("#foo");
- * @before <p>I would like to say: </p><div id="foo"><b>Hello</b></div>
- * @result <div id="foo"><p>I would like to say: </p><b>Hello</b></div>
- * @desc Prepends all paragraphs to the element with the ID "foo"
- *
- * @name prependTo
- * @type jQuery
- * @param <Content> content Content to prepend to the selected element to.
- * @cat DOM/Manipulation
- * @see prepend(<Content>)
- */
-
-/**
- * Insert all of the matched elements before another, specified, set of elements.
- * This operation is, essentially, the reverse of doing a regular
- * $(A).before(B), in that instead of inserting B before A, you're inserting
- * A before B.
- *
- * @example $("p").insertBefore("#foo");
- * @before <div id="foo">Hello</div><p>I would like to say: </p>
- * @result <p>I would like to say: </p><div id="foo">Hello</div>
- * @desc Same as $("#foo").before("p")
- *
- * @name insertBefore
- * @type jQuery
- * @param <Content> content Content to insert the selected element before.
- * @cat DOM/Manipulation
- * @see before(<Content>)
- */
-
-/**
- * Insert all of the matched elements after another, specified, set of elements.
- * This operation is, essentially, the reverse of doing a regular
- * $(A).after(B), in that instead of inserting B after A, you're inserting
- * A after B.
- *
- * @example $("p").insertAfter("#foo");
- * @before <p>I would like to say: </p><div id="foo">Hello</div>
- * @result <div id="foo">Hello</div><p>I would like to say: </p>
- * @desc Same as $("#foo").after("p")
- *
- * @name insertAfter
- * @type jQuery
- * @param <Content> content Content to insert the selected element after.
- * @cat DOM/Manipulation
- * @see after(<Content>)
- */
-
 jQuery.each({
 	appendTo: "append",
 	prependTo: "prepend",
 	insertBefore: "before",
-	insertAfter: "after"
-}, function(i,n){
-	jQuery.fn[ i ] = function(){
-		var a = arguments;
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function(name, original){
+	jQuery.fn[ name ] = function() {
+		var args = arguments;
+
 		return this.each(function(){
-			for ( var j = 0, al = a.length; j < al; j++ )
-				jQuery(a[j])[n]( this );
+			for ( var i = 0, length = args.length; i < length; i++ )
+				jQuery( args[ i ] )[ original ]( this );
 		});
 	};
 });
 
-/**
- * Remove an attribute from each of the matched elements.
- *
- * @example $("input").removeAttr("disabled")
- * @before <input disabled="disabled"/>
- * @result <input/>
- *
- * @name removeAttr
- * @type jQuery
- * @param String name The name of the attribute to remove.
- * @cat DOM/Attributes
- */
+jQuery.each({
+	removeAttr: function( name ) {
+		jQuery.attr( this, name, "" );
+		if (this.nodeType == 1)
+			this.removeAttribute( name );
+	},
 
-/**
- * Adds the specified class(es) to each of the set of matched elements.
- *
- * @example $("p").addClass("selected")
- * @before <p>Hello</p>
- * @result [ <p class="selected">Hello</p> ]
- *
- * @example $("p").addClass("selected highlight")
- * @before <p>Hello</p>
- * @result [ <p class="selected highlight">Hello</p> ]
- *
- * @name addClass
- * @type jQuery
- * @param String class One or more CSS classes to add to the elements
- * @cat DOM/Attributes
- * @see removeClass(String)
- */
+	addClass: function( classNames ) {
+		jQuery.className.add( this, classNames );
+	},
 
-/**
- * Removes all or the specified class(es) from the set of matched elements.
- *
- * @example $("p").removeClass()
- * @before <p class="selected">Hello</p>
- * @result [ <p>Hello</p> ]
- *
- * @example $("p").removeClass("selected")
- * @before <p class="selected first">Hello</p>
- * @result [ <p class="first">Hello</p> ]
- *
- * @example $("p").removeClass("selected highlight")
- * @before <p class="highlight selected first">Hello</p>
- * @result [ <p class="first">Hello</p> ]
- *
- * @name removeClass
- * @type jQuery
- * @param String class (optional) One or more CSS classes to remove from the elements
- * @cat DOM/Attributes
- * @see addClass(String)
- */
+	removeClass: function( classNames ) {
+		jQuery.className.remove( this, classNames );
+	},
 
-/**
- * Adds the specified class if it is not present, removes it if it is
- * present.
- *
- * @example $("p").toggleClass("selected")
- * @before <p>Hello</p><p class="selected">Hello Again</p>
- * @result [ <p class="selected">Hello</p>, <p>Hello Again</p> ]
- *
- * @name toggleClass
- * @type jQuery
- * @param String class A CSS class with which to toggle the elements
- * @cat DOM/Attributes
- */
+	toggleClass: function( classNames ) {
+		jQuery.className[ jQuery.className.has( this, classNames ) ? "remove" : "add" ]( this, classNames );
+	},
 
-/**
- * Removes all matched elements from the DOM. This does NOT remove them from the
- * jQuery object, allowing you to use the matched elements further.
- *
- * Can be filtered with an optional expressions.
- *
- * @example $("p").remove();
- * @before <p>Hello</p> how are <p>you?</p>
- * @result how are
- *
- * @example $("p").remove(".hello");
- * @before <p class="hello">Hello</p> how are <p>you?</p>
- * @result how are <p>you?</p>
- *
- * @name remove
- * @type jQuery
- * @param String expr (optional) A jQuery expression to filter elements by.
- * @cat DOM/Manipulation
- */
-
-/**
- * Removes all child nodes from the set of matched elements.
- *
- * @example $("p").empty()
- * @before <p>Hello, <span>Person</span> <a href="#">and person</a></p>
- * @result [ <p></p> ]
- *
- * @name empty
- * @type jQuery
- * @cat DOM/Manipulation
- */
-
-jQuery.each( {
-	removeAttr: function( key ) {
-		jQuery.attr( this, key, "" );
-		this.removeAttribute( key );
+	remove: function( selector ) {
+		if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) {
+			// Prevent memory leaks
+			jQuery( "*", this ).add(this).each(function(){
+				jQuery.event.remove(this);
+				jQuery.removeData(this);
+			});
+			if (this.parentNode)
+				this.parentNode.removeChild( this );
+		}
 	},
-	addClass: function(c){
-		jQuery.className.add(this,c);
-	},
-	removeClass: function(c){
-		jQuery.className.remove(this,c);
-	},
-	toggleClass: function( c ){
-		jQuery.className[ jQuery.className.has(this,c) ? "remove" : "add" ](this, c);
-	},
-	remove: function(a){
-		if ( !a || jQuery.filter( a, [this] ).r.length )
-			this.parentNode.removeChild( this );
-	},
+
 	empty: function() {
+		// Remove element nodes and prevent memory leaks
+		jQuery( ">*", this ).remove();
+
+		// Remove any remaining nodes
 		while ( this.firstChild )
 			this.removeChild( this.firstChild );
 	}
-}, function(i,n){
-	jQuery.fn[ i ] = function() {
-		return this.each( n, arguments );
+}, function(name, fn){
+	jQuery.fn[ name ] = function(){
+		return this.each( fn, arguments );
 	};
 });
 
-/**
- * Reduce the set of matched elements to a single element.
- * The position of the element in the set of matched elements
- * starts at 0 and goes to length - 1.
- *
- * @example $("p").eq(1)
- * @before <p>This is just a test.</p><p>So is this</p>
- * @result [ <p>So is this</p> ]
- *
- * @name eq
- * @type jQuery
- * @param Number pos The index of the element that you wish to limit to.
- * @cat Core
- */
+jQuery.each([ "Height", "Width" ], function(i, name){
+	var type = name.toLowerCase();
 
-/**
- * Reduce the set of matched elements to all elements before a given position.
- * The position of the element in the set of matched elements
- * starts at 0 and goes to length - 1.
- *
- * @example $("p").lt(1)
- * @before <p>This is just a test.</p><p>So is this</p>
- * @result [ <p>This is just a test.</p> ]
- *
- * @name lt
- * @type jQuery
- * @param Number pos Reduce the set to all elements below this position.
- * @cat Core
- */
+	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 && document.body[ "client" + name ] ||
 
-/**
- * Reduce the set of matched elements to all elements after a given position.
- * The position of the element in the set of matched elements
- * starts at 0 and goes to length - 1.
- *
- * @example $("p").gt(0)
- * @before <p>This is just a test.</p><p>So is this</p>
- * @result [ <p>So is this</p> ]
- *
- * @name gt
- * @type jQuery
- * @param Number pos Reduce the set to all elements after this position.
- * @cat Core
- */
+			// Safari reports inner[Width/Height] just fine (Mozilla and Opera include scroll bar widths)
+			jQuery.browser.safari && window[ "inner" + name ] ||
 
-/**
- * Filter the set of elements to those that contain the specified text.
- *
- * @example $("p").contains("test")
- * @before <p>This is just a test.</p><p>So is this</p>
- * @result [ <p>This is just a test.</p> ]
- *
- * @name contains
- * @type jQuery
- * @param String str The string that will be contained within the text of an element.
- * @cat DOM/Traversing
- */
-jQuery.each( [ "eq", "lt", "gt", "contains" ], function(i,n){
-	jQuery.fn[ n ] = function(num,fn) {
-		return this.filter( ":" + n + "(" + num + ")", fn );
-	};
-});
+			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+			document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] :
 
-/**
- * Get the current computed, pixel, width of the first matched element.
- *
- * @example $("p").width();
- * @before <p>This is just a test.</p>
- * @result 300
- *
- * @name width
- * @type String
- * @cat CSS
- */
+			// 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["scroll" + name], document.documentElement["scroll" + name]),
+					Math.max(document.body["offset" + name], document.documentElement["offset" + name])
+				) :
 
-/**
- * Set the CSS width of every matched element. If no explicit unit
- * was specified (like 'em' or '%') then "px" is added to the width.
- *
- * @example $("p").width(20);
- * @before <p>This is just a test.</p>
- * @result <p style="width:20px;">This is just a test.</p>
- *
- * @example $("p").width("20em");
- * @before <p>This is just a test.</p>
- * @result <p style="width:20em;">This is just a test.</p>
- *
- * @name width
- * @type jQuery
- * @param String|Number val Set the CSS property to the specified value.
- * @cat CSS
- */
- 
-/**
- * Get the current computed, pixel, height of the first matched element.
- *
- * @example $("p").height();
- * @before <p>This is just a test.</p>
- * @result 300
- *
- * @name height
- * @type String
- * @cat CSS
- */
+				// 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 CSS width of every matched element. If no explicit unit
- * was specified (like 'em' or '%') then "px" is added to the width.
- *
- * @example $("p").height(20);
- * @before <p>This is just a test.</p>
- * @result <p style="height:20px;">This is just a test.</p>
- *
- * @example $("p").height("20em");
- * @before <p>This is just a test.</p>
- * @result <p style="height:20em;">This is just a test.</p>
- *
- * @name height
- * @type jQuery
- * @param String|Number val Set the CSS property to the specified value.
- * @cat CSS
- */
-
-jQuery.each( [ "height", "width" ], function(i,n){
-	jQuery.fn[ n ] = function(h) {
-		return h == undefined ?
-			( this.length ? jQuery.css( this[0], n ) : null ) :
-			this.css( n, h.constructor == String ? h : h + "px" );
+					// Set the width or height on the element (default to pixels if value is unitless)
+					this.css( type, size.constructor == String ? size : size + "px" );
 	};
 });
+
+// Helper function used by the dimensions and offset modules
+function num(elem, prop) {
+	return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
+}var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ?
+		"(?:[\\w*_-]|\\\\.)" :
+		"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",
+	quickChild = new RegExp("^>\\s*(" + chars + "+)"),
+	quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),
+	quickClass = new RegExp("^([#.]?)(" + chars + "*)");
+
 jQuery.extend({
 	expr: {
-		"": "m[2]=='*'||jQuery.nodeName(a,m[2])",
-		"#": "a.getAttribute('id')==m[2]",
+		"": function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},
+		"#": function(a,i,m){return a.getAttribute("id")==m[2];},
 		":": {
 			// Position Checks
-			lt: "i<m[3]-0",
-			gt: "i>m[3]-0",
-			nth: "m[3]-0==i",
-			eq: "m[3]-0==i",
-			first: "i==0",
-			last: "i==r.length-1",
-			even: "i%2==0",
-			odd: "i%2",
+			lt: function(a,i,m){return i<m[3]-0;},
+			gt: function(a,i,m){return i>m[3]-0;},
+			nth: function(a,i,m){return m[3]-0==i;},
+			eq: function(a,i,m){return m[3]-0==i;},
+			first: function(a,i){return i==0;},
+			last: function(a,i,m,r){return i==r.length-1;},
+			even: function(a,i){return i%2==0;},
+			odd: function(a,i){return i%2;},
 
 			// Child Checks
-			"nth-child": "jQuery.nth(a.parentNode.firstChild,m[3],'nextSibling',a)==a",
-			"first-child": "jQuery.nth(a.parentNode.firstChild,1,'nextSibling')==a",
-			"last-child": "jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a",
-			"only-child": "jQuery.sibling(a.parentNode.firstChild).length==1",
+			"first-child": function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},
+			"last-child": function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},
+			"only-child": function(a){return !jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},
 
 			// Parent Checks
-			parent: "a.firstChild",
-			empty: "!a.firstChild",
+			parent: function(a){return a.firstChild;},
+			empty: function(a){return !a.firstChild;},
 
 			// Text Check
-			contains: "jQuery.fn.text.apply([a]).indexOf(m[3])>=0",
+			contains: function(a,i,m){return (a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},
 
 			// Visibility
-			visible: 'a.type!="hidden"&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"',
-			hidden: 'a.type=="hidden"||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"',
+			visible: function(a){return "hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},
+			hidden: function(a){return "hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},
 
 			// Form attributes
-			enabled: "!a.disabled",
-			disabled: "a.disabled",
-			checked: "a.checked",
-			selected: "a.selected||jQuery.attr(a,'selected')",
+			enabled: function(a){return !a.disabled;},
+			disabled: function(a){return a.disabled;},
+			checked: function(a){return a.checked;},
+			selected: function(a){return a.selected||jQuery.attr(a,"selected");},
 
 			// Form elements
-			text: "a.type=='text'",
-			radio: "a.type=='radio'",
-			checkbox: "a.type=='checkbox'",
-			file: "a.type=='file'",
-			password: "a.type=='password'",
-			submit: "a.type=='submit'",
-			image: "a.type=='image'",
-			reset: "a.type=='reset'",
-			button: 'a.type=="button"||jQuery.nodeName(a,"button")',
-			input: "/input|select|textarea|button/i.test(a.nodeName)"
-		},
-		".": "jQuery.className.has(a,m[2])",
-		"@": {
-			"=": "z==m[4]",
-			"!=": "z!=m[4]",
-			"^=": "z&&!z.indexOf(m[4])",
-			"$=": "z&&z.substr(z.length - m[4].length,m[4].length)==m[4]",
-			"*=": "z&&z.indexOf(m[4])>=0",
-			"": "z",
-			_resort: function(m){
-				return ["", m[1], m[3], m[2], m[5]];
-			},
-			_prefix: "z=a[m[3]]||jQuery.attr(a,m[3]);"
-		},
-		"[": "jQuery.find(m[2],a).length"
+			text: function(a){return "text"==a.type;},
+			radio: function(a){return "radio"==a.type;},
+			checkbox: function(a){return "checkbox"==a.type;},
+			file: function(a){return "file"==a.type;},
+			password: function(a){return "password"==a.type;},
+			submit: function(a){return "submit"==a.type;},
+			image: function(a){return "image"==a.type;},
+			reset: function(a){return "reset"==a.type;},
+			button: function(a){return "button"==a.type||jQuery.nodeName(a,"button");},
+			input: function(a){return /input|select|textarea|button/i.test(a.nodeName);},
+
+			// :has()
+			has: function(a,i,m){return jQuery.find(m[3],a).length;},
+
+			// :header
+			header: function(a){return /h\d/i.test(a.nodeName);},
+
+			// :animated
+			animated: function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}
+		}
 	},
-	
+
 	// The regular expressions that power the parsing engine
 	parse: [
 		// Match: [@value='test'], [@foo]
-		/^\[ *(@)([a-z0-9_-]*) *([!*$^=]*) *('?"?)(.*?)\4 *\]/i,
+		/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,
 
-		// Match: [div], [div p]
-		/^(\[)\s*(.*?(\[.*?\])?[^[]*?)\s*\]/,
-
 		// Match: :contains('foo')
-		/^(:)([a-z0-9_-]*)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/i,
+		/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,
 
-		// Match: :even, :last-chlid
-		/^([:.#]*)([a-z0-9_*-]*)/i
+		// Match: :even, :last-child, #id, .class
+		new RegExp("^([:.#]*)(" + chars + "+)")
 	],
 
-	token: [
-		/^(\/?\.\.)/, "a.parentNode",
-		/^(>|\/)/, "jQuery.sibling(a.firstChild)",
-		/^(\+)/, "jQuery.nth(a,2,'nextSibling')",
-		/^(~)/, function(a){
-			var s = jQuery.sibling(a.parentNode.firstChild);
-			return s.slice(0, jQuery.inArray(a,s));
-		}
-	],
-
 	multiFilter: function( expr, elems, not ) {
 		var old, cur = [];
 
@@ -2353,39 +1460,20 @@
 		return cur;
 	},
 
-	/**
-	 * @name $.find
-	 * @type Array<Element>
-	 * @private
-	 * @cat Core
-	 */
 	find: function( t, context ) {
 		// Quickly handle non-string expressions
 		if ( typeof t != "string" )
 			return [ t ];
 
-		// Make sure that the context is a DOM Element
-		if ( context && !context.nodeType )
-			context = null;
+		// check to make sure context is a DOM element or a document
+		if ( context && context.nodeType != 1 && context.nodeType != 9)
+			return [ ];
 
 		// Set the correct context (if none is provided)
 		context = context || document;
 
-		// Handle the common XPath // expression
-		if ( !t.indexOf("//") ) {
-			context = context.documentElement;
-			t = t.substr(2,t.length);
-
-		// And the / root expression
-		} else if ( !t.indexOf("/") ) {
-			context = context.documentElement;
-			t = t.substr(1,t.length);
-			if ( t.indexOf("/") >= 1 )
-				t = t.substr(t.indexOf("/"),t.length);
-		}
-
 		// Initialize the search
-		var ret = [context], done = [], last = null;
+		var ret = [context], done = [], last, nodeName;
 
 		// Continue while a selector expression exists, and while
 		// we're no longer looping upon ourselves
@@ -2393,47 +1481,61 @@
 			var r = [];
 			last = t;
 
-			t = jQuery.trim(t).replace( /^\/\//i, "" );
+			t = jQuery.trim(t);
 
-			var foundToken = false;
+			var foundToken = false,
 
 			// An attempt at speeding up child selectors that
 			// point to a specific element tag
-			var re = /^[\/>]\s*([a-z0-9*-]+)/i;
-			var m = re.exec(t);
+				re = quickChild,
 
+				m = re.exec(t);
+
 			if ( m ) {
+				nodeName = m[1].toUpperCase();
+
 				// Perform our own iteration and filter
-				jQuery.each( ret, function(){
-					for ( var c = this.firstChild; c; c = c.nextSibling )
-						if ( c.nodeType == 1 && ( jQuery.nodeName(c, m[1]) || m[1] == "*" ) )
+				for ( var i = 0; ret[i]; i++ )
+					for ( var c = ret[i].firstChild; c; c = c.nextSibling )
+						if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName) )
 							r.push( c );
-				});
 
 				ret = r;
 				t = t.replace( re, "" );
 				if ( t.indexOf(" ") == 0 ) continue;
 				foundToken = true;
 			} else {
-				// Look for pre-defined expression tokens
-				for ( var i = 0; i < jQuery.token.length; i += 2 ) {
-					// Attempt to match each, individual, token in
-					// the specified order
-					var re = jQuery.token[i];
-					var m = re.exec(t);
+				re = /^([>+~])\s*(\w*)/i;
 
-					// If the token match was found
-					if ( m ) {
-						// Map it against the token's handler
-						r = ret = jQuery.map( ret, jQuery.isFunction( jQuery.token[i+1] ) ?
-							jQuery.token[i+1] :
-							function(a){ return eval(jQuery.token[i+1]); });
+				if ( (m = re.exec(t)) != null ) {
+					r = [];
 
-						// And remove the token
-						t = jQuery.trim( t.replace( re, "" ) );
-						foundToken = true;
-						break;
+					var merge = {};
+					nodeName = m[2].toUpperCase();
+					m = m[1];
+
+					for ( var j = 0, rl = ret.length; j < rl; j++ ) {
+						var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild;
+						for ( ; n; n = n.nextSibling )
+							if ( n.nodeType == 1 ) {
+								var id = jQuery.data(n);
+
+								if ( m == "~" && merge[id] ) break;
+
+								if (!nodeName || n.nodeName.toUpperCase() == nodeName ) {
+									if ( m == "~" ) merge[id] = true;
+									r.push( n );
+								}
+
+								if ( m == "+" ) break;
+							}
 					}
+
+					ret = r;
+
+					// And remove the token
+					t = jQuery.trim( t.replace( re, "" ) );
+					foundToken = true;
 				}
 			}
 
@@ -2443,10 +1545,10 @@
 				// Handle multiple expressions
 				if ( !t.indexOf(",") ) {
 					// Clean the result set
-					if ( ret[0] == context ) ret.shift();
+					if ( context == ret[0] ) ret.shift();
 
 					// Merge the result sets
-					jQuery.merge( done, ret );
+					done = jQuery.merge( done, ret );
 
 					// Reset the context
 					r = ret = [context];
@@ -2455,73 +1557,68 @@
 					t = " " + t.substr(1,t.length);
 
 				} else {
-					// Optomize for the case nodeName#idName
-					var re2 = /^([a-z0-9_-]+)(#)([a-z0-9\\*_-]*)/i;
+					// 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] ];
+						m = [ 0, m[2], m[3], m[1] ];
 
 					} else {
 						// Otherwise, do a traditional filter check for
 						// ID, class, and element selectors
-						re2 = /^([#.]?)([a-z0-9\\*_-]*)/i;
+						re2 = quickClass;
 						m = re2.exec(t);
 					}
 
+					m[2] = m[2].replace(/\\/g, "");
+
+					var elem = ret[ret.length-1];
+
 					// Try to do a global search by ID, where we can
-					if ( m[1] == "#" && ret[ret.length-1].getElementById ) {
+					if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) {
 						// Optimization for HTML document case
-						var oid = ret[ret.length-1].getElementById(m[2]);
+						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) && oid && typeof oid.id == "string" && oid.id != m[2] )
+							oid = jQuery('[@id="'+m[2]+'"]', elem)[0];
+
 						// Do a quick check for node name (where applicable) so
 						// that div#foo searches will be really fast
-						ret = r = oid && 
-						  (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];
-
+						ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];
 					} else {
-						// Pre-compile a regular expression to handle class searches
-						if ( m[1] == "." )
-							var rec = new RegExp("(^|\\s)" + m[2] + "(\\s|$)");
-
-						// We need to find all descendant elements, it is more
-						// efficient to use getAll() when we are already further down
-						// the tree - we try to recognize that here
-						jQuery.each( ret, function(){
+						// 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] != "" || m[0] == "" ? "*" : m[2];
+							var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2];
 
 							// Handle IE7 being really dumb about <object>s
-							if ( jQuery.nodeName(this, "object") && tag == "*" )
+							if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" )
 								tag = "param";
 
-							jQuery.merge( r,
-								m[1] != "" && ret.length != 1 ?
-									jQuery.getAll( this, [], m[1], m[2], rec ) :
-									this.getElementsByTagName( tag )
-							);
-						});
+							r = jQuery.merge( r, ret[i].getElementsByTagName( tag ));
+						}
 
 						// It's faster to filter by class and be done with it
-						if ( m[1] == "." && ret.length == 1 )
-							r = jQuery.grep( r, function(e) {
-								return rec.test(e.className);
-							});
+						if ( m[1] == "." )
+							r = jQuery.classFilter( r, m[2] );
 
 						// Same with ID filtering
-						if ( m[1] == "#" && ret.length == 1 ) {
-							// Remember, then wipe out, the result set
-							var tmp = r;
-							r = [];
+						if ( m[1] == "#" ) {
+							var tmp = [];
 
-							// Then try to find the element with the ID
-							jQuery.each( tmp, function(){
-								if ( this.getAttribute("id") == m[2] ) {
-									r = [ this ];
-									return false;
+							// Try to find the element with the ID
+							for ( var i = 0; r[i]; i++ )
+								if ( r[i].getAttribute("id") == m[2] ) {
+									tmp = [ r[i] ];
+									break;
 								}
-							});
+
+							r = tmp;
 						}
 
 						ret = r;
@@ -2541,66 +1638,139 @@
 			}
 		}
 
+		// An error occurred with the selector;
+		// just return an empty set instead
+		if ( t )
+			ret = [];
+
 		// Remove the root context
-		if ( ret && ret[0] == context ) ret.shift();
+		if ( ret && context == ret[0] )
+			ret.shift();
 
 		// And combine the results
-		jQuery.merge( done, ret );
+		done = jQuery.merge( done, ret );
 
 		return done;
 	},
 
+	classFilter: function(r,m,not){
+		m = " " + m + " ";
+		var tmp = [];
+		for ( var i = 0; r[i]; i++ ) {
+			var pass = (" " + r[i].className + " ").indexOf( m ) >= 0;
+			if ( !not && pass || not && !pass )
+				tmp.push( r[i] );
+		}
+		return tmp;
+	},
+
 	filter: function(t,r,not) {
+		var last;
+
 		// Look for common filter expressions
-		while ( t && /^[a-z[({<*:.#]/i.test(t) ) {
+		while ( t && t != last ) {
+			last = t;
 
 			var p = jQuery.parse, m;
 
-			jQuery.each( p, function(i,re){
-		
-				// Look for, and replace, string-like sequences
-				// and finally build a regexp out of it
-				m = re.exec( t );
+			for ( var i = 0; p[i]; i++ ) {
+				m = p[i].exec( t );
 
 				if ( m ) {
 					// Remove what we just matched
 					t = t.substring( m[0].length );
 
-					// Re-organize the first match
-					if ( jQuery.expr[ m[1] ]._resort )
-						m = jQuery.expr[ m[1] ]._resort( m );
-
-					return false;
+					m[2] = m[2].replace(/\\/g, "");
+					break;
 				}
-			});
+			}
 
+			if ( !m )
+				break;
+
 			// :not() is a special case that can be optimized by
 			// keeping it out of the expression list
 			if ( m[1] == ":" && m[2] == "not" )
-				r = jQuery.filter(m[3], r, true).r;
+				// 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] );
 
-			// Handle classes as a special case (this will help to
-			// improve the speed, as the regexp will only be compiled once)
-			else if ( m[1] == "." ) {
+			// We can get a big speed boost by filtering by class here
+			else if ( m[1] == "." )
+				r = jQuery.classFilter(r, m[2], not);
 
-				var re = new RegExp("(^|\\s)" + m[2] + "(\\s|$)");
-				r = jQuery.grep( r, function(e){
-					return re.test(e.className || "");
-				}, not);
+			else if ( m[1] == "[" ) {
+				var tmp = [], type = m[3];
 
+				for ( var i = 0, rl = r.length; i < 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 == "" && !!z ||
+						 type == "=" && z == m[5] ||
+						 type == "!=" && z != m[5] ||
+						 type == "^=" && z && !z.indexOf(m[5]) ||
+						 type == "$=" && z.substr(z.length - m[5].length) == m[5] ||
+						 (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not )
+							tmp.push( a );
+				}
+
+				r = tmp;
+
+			// We can get a speed boost by handling nth-child here
+			} else if ( m[1] == ":" && m[2] == "nth-child" ) {
+				var merge = {}, tmp = [],
+					// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+					test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
+						m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" ||
+						!/\D/.test(m[3]) && "0n+" + 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 < 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;
+					}
+
+					var add = false;
+
+					if ( first == 0 ) {
+						if ( node.nodeIndex == last )
+							add = true;
+					} else if ( (node.nodeIndex - last) % first == 0 && (node.nodeIndex - last) / first >= 0 )
+						add = true;
+
+					if ( add ^ not )
+						tmp.push( node );
+				}
+
+				r = tmp;
+
 			// Otherwise, find the expression to execute
 			} else {
-				var f = jQuery.expr[m[1]];
-				if ( typeof f != "string" )
-					f = jQuery.expr[m[1]][m[2]];
+				var fn = jQuery.expr[ m[1] ];
+				if ( typeof fn == "object" )
+					fn = fn[ m[2] ];
 
-				// Build a custom macro to enclose it
-				eval("f = function(a,i){" +
-					( jQuery.expr[ m[1] ]._prefix || "" ) +
-					"return " + f + "}");
+				if ( typeof fn == "string" )
+					fn = eval("false||function(a,i){return " + fn + ";}");
 
 				// Execute it against the current filter
-				r = jQuery.grep( r, f, not );
+				r = jQuery.grep( r, function(elem, i){
+					return fn(elem, i, m, r);
+				}, not );
 			}
 		}
 
@@ -2608,84 +1778,34 @@
 		// and the modified expression string (t)
 		return { r: r, t: t };
 	},
-	
-	getAll: function( o, r, token, name, re ) {
-		for ( var s = o.firstChild; s; s = s.nextSibling )
-			if ( s.nodeType == 1 ) {
-				var add = true;
 
-				if ( token == "." )
-					add = s.className && re.test(s.className);
-				else if ( token == "#" )
-					add = s.getAttribute("id") == name;
-	
-				if ( add )
-					r.push( s );
-
-				if ( token == "#" && r.length ) break;
-
-				if ( s.firstChild )
-					jQuery.getAll( s, r, token, name, re );
-			}
-
-		return r;
-	},
-
-	/**
-	 * All ancestors of a given element.
-	 *
-	 * @private
-	 * @name $.parents
-	 * @type Array<Element>
-	 * @param Element elem The element to find the ancestors of.
-	 * @cat DOM/Traversing
-	 */
-	parents: function( elem ){
-		var matched = [];
-		var cur = elem.parentNode;
+	dir: function( elem, dir ){
+		var matched = [],
+			cur = elem[dir];
 		while ( cur && cur != document ) {
-			matched.push( cur );
-			cur = cur.parentNode;
+			if ( cur.nodeType == 1 )
+				matched.push( cur );
+			cur = cur[dir];
 		}
 		return matched;
 	},
-	
-	/**
-	 * A handy, and fast, way to traverse in a particular direction and find
-	 * a specific element.
-	 *
-	 * @private
-	 * @name $.nth
-	 * @type DOMElement
-	 * @param DOMElement cur The element to search from.
-	 * @param String|Number num The Nth result to match. Can be a number or a string (like 'even' or 'odd').
-	 * @param String dir The direction to move in (pass in something like 'previousSibling' or 'nextSibling').
-	 * @cat DOM/Traversing
-	 */
+
 	nth: function(cur,result,dir,elem){
 		result = result || 1;
 		var num = 0;
-		for ( ; cur; cur = cur[dir] ) {
-			if ( cur.nodeType == 1 ) num++;
-			if ( num == result || result == "even" && num % 2 == 0 && num > 1 && cur == elem ||
-				result == "odd" && num % 2 == 1 && cur == elem ) return cur;
-		}
+
+		for ( ; cur; cur = cur[dir] )
+			if ( cur.nodeType == 1 && ++num == result )
+				break;
+
+		return cur;
 	},
-	
-	/**
-	 * All elements on a specified axis.
-	 *
-	 * @private
-	 * @name $.sibling
-	 * @type Array
-	 * @param Element elem The element to find all the siblings of (including itself).
-	 * @cat DOM/Traversing
-	 */
+
 	sibling: function( n, elem ) {
 		var r = [];
 
 		for ( ; n; n = n.nextSibling ) {
-			if ( n.nodeType == 1 && (!elem || n != elem) )
+			if ( n.nodeType == 1 && n != elem )
 				r.push( n );
 		}
 
@@ -2694,1523 +1814,618 @@
 });
 /*
  * 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 orignated from
  * Dean Edwards' addEvent library.
  */
 jQuery.event = {
 
 	// Bind an event to an element
 	// Original by Dean Edwards
-	add: function(element, type, handler, data) {
+	add: function(elem, types, handler, data) {
+		if ( elem.nodeType == 3 || elem.nodeType == 8 )
+			return;
+
 		// For whatever reason, IE has trouble passing the window object
 		// around, causing it to be cloned in the process
-		if ( jQuery.browser.msie && element.setInterval != undefined )
-			element = window;
+		if ( jQuery.browser.msie && elem.setInterval )
+			elem = window;
 
-		// if data is passed, bind to handler
-		if( data ) 
-			handler.data = data;
-
 		// 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 = this.proxy( fn, function() {
+				// Pass arguments and context to original handler
+				return fn.apply(this, arguments);
+			});
+
+			// Store data in unique handler
+			handler.data = data;
+		}
+
 		// Init the element's event structure
-		if (!element.events)
-			element.events = {};
+		var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
+			handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
+				// Handle the second event of a trigger and when
+				// an event is called after a page has unloaded
+				if ( typeof jQuery != "undefined" && !jQuery.event.triggered )
+					return jQuery.event.handle.apply(arguments.callee.elem, arguments);
+			});
+		// 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;
 
-		// Get the current list of functions bound to this event
-		var handlers = element.events[type];
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		jQuery.each(types.split(/\s+/), function(index, type) {
+			// Namespaced event handlers
+			var parts = type.split(".");
+			type = parts[0];
+			handler.type = parts[1];
 
-		// If it hasn't been initialized yet
-		if (!handlers) {
+			// Get the current list of functions bound to this event
+			var handlers = events[type];
+
 			// Init the event handler queue
-			handlers = element.events[type] = {};
+			if (!handlers) {
+				handlers = events[type] = {};
 
-			// Remember an existing handler, if it's already there
-			if (element["on" + type])
-				handlers[0] = element["on" + 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("on" + 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;
 
-		// And bind the global event handler to the element
-		element["on" + type] = this.handle;
+			// Keep track of which events have been used, for global triggering
+			jQuery.event.global[type] = true;
+		});
 
-		// Remember the function in a global list (for triggering)
-		if (!this.global[type])
-			this.global[type] = [];
-		this.global[type].push( element );
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
 	},
 
 	guid: 1,
 	global: {},
 
 	// Detach an event or set of events from an element
-	remove: function(element, type, handler) {
-		if (element.events)
-			if ( type && type.type )
-				delete element.events[ type.type ][ type.handler.guid ];
-			else if (type && element.events[type])
-				if ( handler )
-					delete element.events[type][handler.guid];
-				else
-					for ( var i in element.events[type] )
-						delete element.events[type][i];
-			else
-				for ( var j in element.events )
-					this.remove( element, j );
+	remove: function(elem, types, handler) {
+		// don't do events on text and comment nodes
+		if ( elem.nodeType == 3 || elem.nodeType == 8 )
+			return;
+
+		var events = jQuery.data(elem, "events"), ret, index;
+
+		if ( events ) {
+			// Unbind all events for the element
+			if ( types == undefined || (typeof types == "string" && types.charAt(0) == ".") )
+				for ( var type in events )
+					this.remove( elem, type + (types || "") );
+			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("mouseover mouseout", fn);
+				jQuery.each(types.split(/\s+/), function(index, type){
+					// Namespaced event handlers
+					var parts = type.split(".");
+					type = parts[0];
+
+					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] )
+								// Handle the removal of namespaced events
+								if ( !parts[1] || events[type][handler].type == parts[1] )
+									delete events[type][handler];
+
+						// 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 (elem.removeEventListener)
+									elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
+								else if (elem.detachEvent)
+									elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
+							}
+							ret = null;
+							delete events[type];
+						}
+					}
+				});
+			}
+
+			// Remove the expando if it's no longer used
+			for ( ret in events ) break;
+			if ( !ret ) {
+				var handle = jQuery.data( elem, "handle" );
+				if ( handle ) handle.elem = null;
+				jQuery.removeData( elem, "events" );
+				jQuery.removeData( elem, "handle" );
+			}
+		}
 	},
 
-	trigger: function(type,data,element) {
+	trigger: function(type, data, elem, donative, extra) {
 		// Clone the incoming data, if any
-		data = jQuery.makeArray(data || []);
+		data = jQuery.makeArray(data);
 
+		if ( type.indexOf("!") >= 0 ) {
+			type = type.slice(0, -1);
+			var exclusive = true;
+		}
+
 		// Handle a global trigger
-		if ( !element )
-			jQuery.each( this.global[type] || [], function(){
-				jQuery.event.trigger( type, data, this );
-			});
+		if ( !elem ) {
+			// Only trigger if we've ever bound an event for it
+			if ( this.global[type] )
+				jQuery("*").add([window, document]).trigger(type, data);
 
 		// Handle triggering a single element
-		else {
-			var handler = element["on" + type ], val,
-				fn = jQuery.isFunction( element[ type ] );
+		} else {
+			// don't do events on text and comment nodes
+			if ( elem.nodeType == 3 || elem.nodeType == 8 )
+				return undefined;
 
-			if ( handler ) {
-				// Pass along a fake event
-				data.unshift( this.fix({ type: type, target: element }) );
-	
-				// Trigger the event
-				if ( (val = handler.apply( element, data )) !== false )
-					this.triggered = true;
+			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({
+					type: type,
+					target: elem,
+					preventDefault: function(){},
+					stopPropagation: function(){},
+					timeStamp: now()
+				});
+				data[0][expando] = true; // no need to fix fake event
 			}
 
-			if ( fn && val !== false )
-				element[ type ]();
+			// Enforce the right trigger type
+			data[0].type = type;
+			if ( exclusive )
+				data[0].exclusive = true;
 
+			// Trigger the event, it is assumed that "handle" is a function
+			var handle = jQuery.data(elem, "handle");
+			if ( handle )
+				val = handle.apply( elem, data );
+
+			// Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
+			if ( (!fn || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+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 && jQuery.isFunction( extra ) ) {
+				// call the extra function and tack the current return value on the end for possible inspection
+				ret = extra.apply( elem, val == null ? data : data.concat( val ) );
+				// if anything is returned, give it precedence and have it overwrite the previous value
+				if (ret !== undefined)
+					val = ret;
+			}
+
+			// Trigger the native events (except for clicks on links)
+			if ( fn && donative !== false && val !== false && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
+				this.triggered = true;
+				try {
+					elem[ type ]();
+				// prevent IE from throwing an error for some hidden elements
+				} catch (e) {}
+			}
+
 			this.triggered = false;
 		}
+
+		return val;
 	},
 
 	handle: function(event) {
-		// Handle the second event of a trigger and when
-		// an event is called after a page has unloaded
-		if ( typeof jQuery == "undefined" || jQuery.event.triggered ) return;
+		// returned undefined or false
+		var val, ret, namespace, 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 );
 
-		// returned undefined or false
-		var returnValue;
+		// Namespaced event handlers
+		namespace = event.type.split(".");
+		event.type = namespace[0];
+		namespace = namespace[1];
+		// Cache this now, all = true means, any handler
+		all = !namespace && !event.exclusive;
 
-		var c = this.events[event.type];
+		handlers = ( jQuery.data(this, "events") || {} )[event.type];
 
-		var args = [].slice.call( arguments, 1 );
-		args.unshift( event );
+		for ( var j in handlers ) {
+			var handler = handlers[j];
 
-		for ( var j in c ) {
-			// Pass in a reference to the handler function itself
-			// So that we can later remove it
-			args[0].handler = c[j];
-			args[0].data = c[j].data;
+			// Filter the functions by class
+			if ( all || handler.type == namespace ) {
+				// Pass in a reference to the handler function itself
+				// So that we can later remove it
+				event.handler = handler;
+				event.data = handler.data;
 
-			if ( c[j].apply( this, args ) === false ) {
-				event.preventDefault();
-				event.stopPropagation();
-				returnValue = false;
+				ret = handler.apply( this, arguments );
+
+				if ( val !== false )
+					val = ret;
+
+				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 returnValue;
+		return val;
 	},
 
 	fix: function(event) {
+		if ( event[expando] == true )
+			return event;
+
+		// store a copy of the original event object
+		// and "clone" to set read-only properties
+		var originalEvent = event;
+		event = { originalEvent: originalEvent };
+		var props = "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 timeStamp toElement type view wheelDelta which".split(" ");
+		for ( var i=props.length; i; i-- )
+			event[ props[i] ] = originalEvent[ props[i] ];
+
+		// Mark it as fixed
+		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;
+		};
+
+		// Fix timeStamp
+		event.timeStamp = event.timeStamp || now();
+
 		// Fix target property, if necessary
-		if ( !event.target && event.srcElement )
-			event.target = event.srcElement;
+		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 = event.target.parentNode;
+
+		// Add relatedTarget, if necessary
+		if ( !event.relatedTarget && event.fromElement )
+			event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
+
 		// Calculate pageX/Y if missing and clientX/Y available
-		if ( event.pageX == undefined && event.clientX != undefined ) {
-			var e = document.documentElement, b = document.body;
-			event.pageX = event.clientX + (e.scrollLeft || b.scrollLeft);
-			event.pageY = event.clientY + (e.scrollTop || b.scrollTop);
+		if ( event.pageX == null && event.clientX != null ) {
+			var doc = document.documentElement, body = document.body;
+			event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
+			event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
 		}
-				
-		// check if target is a textnode (safari)
-		if (jQuery.browser.safari && event.target.nodeType == 3) {
-			// store a copy of the original event object 
-			// and clone because target is read only
-			var originalEvent = event;
-			event = jQuery.extend({}, originalEvent);
-			
-			// get parentnode from textnode
-			event.target = originalEvent.target.parentNode;
-			
-			// add preventDefault and stopPropagation since 
-			// they will not work on the clone
-			event.preventDefault = function() {
-				return originalEvent.preventDefault();
-			};
-			event.stopPropagation = function() {
-				return originalEvent.stopPropagation();
-			};
-		}
-		
-		// fix preventDefault and stopPropagation
-		if (!event.preventDefault)
-			event.preventDefault = function() {
-				this.returnValue = false;
-			};
-			
-		if (!event.stopPropagation)
-			event.stopPropagation = function() {
-				this.cancelBubble = true;
-			};
-			
+
+		// Add which for key events
+		if ( !event.which && ((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 && event.ctrlKey )
+			event.metaKey = event.ctrlKey;
+
+		// Add which for click: 1 == left; 2 == middle; 3 == right
+		// Note: button is not normalized, so don't use it
+		if ( !event.which && event.button )
+			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+
 		return event;
+	},
+
+	proxy: function( fn, proxy ){
+		// 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("mouseover", jQuery.event.special.mouseenter.handler);
+				return true;
+			},
+
+			teardown: function() {
+				if ( jQuery.browser.msie ) return false;
+				jQuery(this).unbind("mouseover", 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
+				event.type = "mouseenter";
+				return jQuery.event.handle.apply(this, arguments);
+			}
+		},
+
+		mouseleave: {
+			setup: function() {
+				if ( jQuery.browser.msie ) return false;
+				jQuery(this).bind("mouseout", jQuery.event.special.mouseleave.handler);
+				return true;
+			},
+
+			teardown: function() {
+				if ( jQuery.browser.msie ) return false;
+				jQuery(this).unbind("mouseout", jQuery.event.special.mouseleave.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 mouseleave
+				event.type = "mouseleave";
+				return jQuery.event.handle.apply(this, arguments);
+			}
+		}
 	}
 };
 
 jQuery.fn.extend({
-
-	/**
-	 * Binds a handler to a particular event (like click) for each matched element.
-	 * The event handler is passed an event object that you can use to prevent
-	 * default behaviour. To stop both default action and event bubbling, your handler
-	 * has to return false.
-	 *
-	 * In most cases, you can define your event handlers as anonymous functions
-	 * (see first example). In cases where that is not possible, you can pass additional
-	 * data as the second paramter (and the handler function as the third), see 
-	 * second example.
-	 *
-	 * @example $("p").bind("click", function(){
-	 *   alert( $(this).text() );
-	 * });
-	 * @before <p>Hello</p>
-	 * @result alert("Hello")
-	 *
-	 * @example function handler(event) {
-	 *   alert(event.data.foo);
-	 * }
-	 * $("p").bind("click", {foo: "bar"}, handler)
-	 * @result alert("bar")
-	 * @desc Pass some additional data to the event handler.
-	 *
-	 * @example $("form").bind("submit", function() { return false; })
-	 * @desc Cancel a default action and prevent it from bubbling by returning false
-	 * from your function.
-	 *
-	 * @example $("form").bind("submit", function(event){
-	 *   event.preventDefault();
-	 * });
-	 * @desc Cancel only the default action by using the preventDefault method.
-	 *
-	 *
-	 * @example $("form").bind("submit", function(event){
-	 *   event.stopPropagation();
-	 * });
-	 * @desc Stop only an event from bubbling by using the stopPropagation method.
-	 *
-	 * @name bind
-	 * @type jQuery
-	 * @param String type An event type
-	 * @param Object data (optional) Additional data passed to the event handler as event.data
-	 * @param Function fn A function to bind to the event on each of the set of matched elements
-	 * @cat Events
-	 */
 	bind: function( type, data, fn ) {
-		return this.each(function(){
-			jQuery.event.add( this, type, fn || data, data );
+		return type == "unload" ? this.one(type, data, fn) : this.each(function(){
+			jQuery.event.add( this, type, fn || data, fn && data );
 		});
 	},
-	
-	/**
-	 * Binds a handler to a particular event (like click) for each matched element.
-	 * The handler is executed only once for each element. Otherwise, the same rules
-	 * as described in bind() apply.
-	 The event handler is passed an event object that you can use to prevent
-	 * default behaviour. To stop both default action and event bubbling, your handler
-	 * has to return false.
-	 *
-	 * In most cases, you can define your event handlers as anonymous functions
-	 * (see first example). In cases where that is not possible, you can pass additional
-	 * data as the second paramter (and the handler function as the third), see 
-	 * second example.
-	 *
-	 * @example $("p").one("click", function(){
-	 *   alert( $(this).text() );
-	 * });
-	 * @before <p>Hello</p>
-	 * @result alert("Hello")
-	 *
-	 * @name one
-	 * @type jQuery
-	 * @param String type An event type
-	 * @param Object data (optional) Additional data passed to the event handler as event.data
-	 * @param Function fn A function to bind to the event on each of the set of matched elements
-	 * @cat Events
-	 */
+
 	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);
-			}, data);
+			jQuery.event.add( this, type, one, fn && data);
 		});
 	},
 
-	/**
-	 * The opposite of bind, removes a bound event from each of the matched
-	 * elements.
-	 *
-	 * Without any arguments, all bound events are removed.
-	 *
-	 * If the type is provided, all bound events of that type are removed.
-	 *
-	 * If the function that was passed to bind is provided as the second argument,
-	 * only that specific event handler is removed.
-	 *
-	 * @example $("p").unbind()
-	 * @before <p onclick="alert('Hello');">Hello</p>
-	 * @result [ <p>Hello</p> ]
-	 *
-	 * @example $("p").unbind( "click" )
-	 * @before <p onclick="alert('Hello');">Hello</p>
-	 * @result [ <p>Hello</p> ]
-	 *
-	 * @example $("p").unbind( "click", function() { alert("Hello"); } )
-	 * @before <p onclick="alert('Hello');">Hello</p>
-	 * @result [ <p>Hello</p> ]
-	 *
-	 * @name unbind
-	 * @type jQuery
-	 * @param String type (optional) An event type
-	 * @param Function fn (optional) A function to unbind from the event on each of the set of matched elements
-	 * @cat Events
-	 */
 	unbind: function( type, fn ) {
 		return this.each(function(){
 			jQuery.event.remove( this, type, fn );
 		});
 	},
 
-	/**
-	 * Trigger a type of event on every matched element.
-	 *
-	 * @example $("p").trigger("click")
-	 * @before <p click="alert('hello')">Hello</p>
-	 * @result alert('hello')
-	 *
-	 * @name trigger
-	 * @type jQuery
-	 * @param String type An event type to trigger.
-	 * @cat Events
-	 */
-	trigger: function( type, data ) {
+	trigger: function( type, data, fn ) {
 		return this.each(function(){
-			jQuery.event.trigger( type, data, this );
+			jQuery.event.trigger( type, data, this, true, fn );
 		});
 	},
 
-	/**
-	 * Toggle between two function calls every other click.
-	 * Whenever a matched element is clicked, the first specified function 
-	 * is fired, when clicked again, the second is fired. All subsequent 
-	 * clicks continue to rotate through the two functions.
-	 *
-	 * Use unbind("click") to remove.
-	 *
-	 * @example $("p").toggle(function(){
-	 *   $(this).addClass("selected");
-	 * },function(){
-	 *   $(this).removeClass("selected");
-	 * });
-	 * 
-	 * @name toggle
-	 * @type jQuery
-	 * @param Function even The function to execute on every even click.
-	 * @param Function odd The function to execute on every odd click.
-	 * @cat Events
-	 */
-	toggle: function() {
+	triggerHandler: function( type, data, fn ) {
+		return this[0] && jQuery.event.trigger( type, data, this[0], false, fn );
+	},
+
+	toggle: function( fn ) {
 		// Save reference to arguments for access in closure
-		var a = arguments;
+		var args = arguments, i = 1;
 
-		return this.click(function(e) {
+		// link all the functions, so any of them can unbind this click handler
+		while( i < 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 = this.lastToggle == 0 ? 1 : 0;
-			
+			this.lastToggle = ( this.lastToggle || 0 ) % i;
+
 			// Make sure that clicks stop
-			e.preventDefault();
-			
+			event.preventDefault();
+
 			// and execute the function
-			return a[this.lastToggle].apply( this, [e] ) || false;
-		});
+			return args[ this.lastToggle++ ].apply( this, arguments ) || false;
+		}));
 	},
-	
-	/**
-	 * A method for simulating hovering (moving the mouse on, and off,
-	 * an object). This is a custom method which provides an 'in' to a 
-	 * frequent task.
-	 *
-	 * Whenever the mouse cursor is moved over a matched 
-	 * element, the first specified function is fired. Whenever the mouse 
-	 * moves off of the element, the second specified function fires. 
-	 * Additionally, checks are in place to see if the mouse is still within 
-	 * the specified element itself (for example, an image inside of a div), 
-	 * and if it is, it will continue to 'hover', and not move out 
-	 * (a common error in using a mouseout event handler).
-	 *
-	 * @example $("p").hover(function(){
-	 *   $(this).addClass("over");
-	 * },function(){
-	 *   $(this).addClass("out");
-	 * });
-	 *
-	 * @name hover
-	 * @type jQuery
-	 * @param Function over The function to fire whenever the mouse is moved over a matched element.
-	 * @param Function out The function to fire whenever the mouse is moved off of a matched element.
-	 * @cat Events
-	 */
-	hover: function(f,g) {
-		
-		// A private function for handling mouse 'hovering'
-		function handleHover(e) {
-			// Check if mouse(over|out) are still within the same parent element
-			var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
-	
-			// Traverse up the tree
-			while ( p && p != this ) try { p = p.parentNode } catch(e) { p = this; };
-			
-			// If we actually just moused on to a sub-element, ignore it
-			if ( p == this ) return false;
-			
-			// Execute the right function
-			return (e.type == "mouseover" ? f : g).apply(this, [e]);
-		}
-		
-		// Bind the function to the two event listeners
-		return this.mouseover(handleHover).mouseout(handleHover);
+
+	hover: function(fnOver, fnOut) {
+		return this.bind('mouseenter', fnOver).bind('mouseleave', fnOut);
 	},
-	
-	/**
-	 * Bind a function to be executed whenever the DOM is ready to be
-	 * traversed and manipulated. This is probably the most important 
-	 * function included in the event module, as it can greatly improve
-	 * the response times of your web applications.
-	 *
-	 * In a nutshell, this is a solid replacement for using window.onload, 
-	 * and attaching a function to that. By using this method, your bound Function 
-	 * will be called the instant the DOM is ready to be read and manipulated, 
-	 * which is exactly what 99.99% of all Javascript code needs to run.
-	 *
-	 * There is one argument passed to the ready event handler: A reference to
-	 * the jQuery function. You can name that argument whatever you like, and
-	 * can therefore stick with the $ alias without risc of naming collisions.
-	 * 
-	 * Please ensure you have no code in your &lt;body&gt; onload event handler, 
-	 * otherwise $(document).ready() may not fire.
-	 *
-	 * You can have as many $(document).ready events on your page as you like.
-	 * The functions are then executed in the order they were added.
-	 *
-	 * @example $(document).ready(function(){ Your code here... });
-	 *
-	 * @example jQuery(function($) {
-	 *   // Your code using failsafe $ alias here...
-	 * });
-	 * @desc Uses both the shortcut for $(document).ready() and the argument
-	 * to write failsafe jQuery code using the $ alias, without relying on the
-	 * global alias.
-	 *
-	 * @name ready
-	 * @type jQuery
-	 * @param Function fn The function to be executed when the DOM is ready.
-	 * @cat Events
-	 * @see $.noConflict()
-	 * @see $(Function)
-	 */
-	ready: function(f) {
+
+	ready: function(fn) {
+		// Attach the listeners
+		bindReady();
+
 		// If the DOM is already ready
 		if ( jQuery.isReady )
 			// Execute the function immediately
-			f.apply( document, [jQuery] );
-			
+			fn.call( document, jQuery );
+
 		// Otherwise, remember the function for later
-		else {
+		else
 			// Add the function to the wait list
-			jQuery.readyList.push( function() { return f.apply(this, [jQuery]) } );
-		}
-	
+			jQuery.readyList.push( function() { return fn.call(this, jQuery); } );
+
 		return this;
 	}
 });
 
 jQuery.extend({
-	/*
-	 * All the code that makes DOM Ready work nicely.
-	 */
 	isReady: false,
 	readyList: [],
-	
 	// Handle when the DOM is ready
 	ready: function() {
 		// Make sure that the DOM is not already loaded
 		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 );
 				});
-				
+
 				// Reset the list of functions
 				jQuery.readyList = null;
 			}
-			// Remove event lisenter to avoid memory leak
-			if ( jQuery.browser.mozilla || jQuery.browser.opera )
-				document.removeEventListener( "DOMContentLoaded", jQuery.ready, false );
+
+			// Trigger any bound ready events
+			jQuery(document).triggerHandler("ready");
 		}
 	}
 });
 
-new function(){
+var readyBound = false;
 
-	/**
-	 * Bind a function to the scroll event of each matched element.
-	 *
-	 * @example $("p").scroll( function() { alert("Hello"); } );
-	 * @before <p>Hello</p>
-	 * @result <p onscroll="alert('Hello');">Hello</p>
-	 *
-	 * @name scroll
-	 * @type jQuery
-	 * @param Function fn A function to bind to the scroll event on each of the matched elements.
-	 * @cat Events
-	 */
+function bindReady(){
+	if ( readyBound ) return;
+	readyBound = true;
 
-	/**
-	 * Bind a function to the submit event of each matched element.
-	 *
-	 * @example $("#myform").submit( function() {
-	 *   return $("input", this).val().length > 0;
-	 * } );
-	 * @before <form id="myform"><input /></form>
-	 * @desc Prevents the form submission when the input has no value entered.
-	 *
-	 * @name submit
-	 * @type jQuery
-	 * @param Function fn A function to bind to the submit event on each of the matched elements.
-	 * @cat Events
-	 */
-
-	/**
-	 * Trigger the submit event of each matched element. This causes all of the functions
-	 * that have been bound to thet submit event to be executed.
-	 *
-	 * Note: This does not execute the submit method of the form element! If you need to
-	 * submit the form via code, you have to use the DOM method, eg. $("form")[0].submit();
-	 *
-	 * @example $("form").submit();
-	 * @desc Triggers all submit events registered for forms, but does not submit the form
-	 *
-	 * @name submit
-	 * @type jQuery
-	 * @cat Events
-	 */
-
-	/**
-	 * Bind a function to the focus event of each matched element.
-	 *
-	 * @example $("p").focus( function() { alert("Hello"); } );
-	 * @before <p>Hello</p>
-	 * @result <p onfocus="alert('Hello');">Hello</p>
-	 *
-	 * @name focus
-	 * @type jQuery
-	 * @param Function fn A function to bind to the focus event on each of the matched elements.
-	 * @cat Events
-	 */
-
-	/**
-	 * Trigger the focus event of each matched element. This causes all of the functions
-	 * that have been bound to thet focus event to be executed.
-	 *
-	 * Note: This does not execute the focus method of the underlying elements! If you need to
-	 * focus an element via code, you have to use the DOM method, eg. $("#myinput")[0].focus();
-	 *
-	 * @example $("p").focus();
-	 * @before <p onfocus="alert('Hello');">Hello</p>
-	 * @result alert('Hello');
-	 *
-	 * @name focus
-	 * @type jQuery
-	 * @cat Events
-	 */
-
-	/**
-	 * Bind a function to the keydown event of each matched element.
-	 *
-	 * @example $("p").keydown( function() { alert("Hello"); } );
-	 * @before <p>Hello</p>
-	 * @result <p onkeydown="alert('Hello');">Hello</p>
-	 *
-	 * @name keydown
-	 * @type jQuery
-	 * @param Function fn A function to bind to the keydown event on each of the matched elements.
-	 * @cat Events
-	 */
-
-	/**
-	 * Bind a function to the dblclick event of each matched element.
-	 *
-	 * @example $("p").dblclick( function() { alert("Hello"); } );
-	 * @before <p>Hello</p>
-	 * @result <p ondblclick="alert('Hello');">Hello</p>
-	 *
-	 * @name dblclick
-	 * @type jQuery
-	 * @param Function fn A function to bind to the dblclick event on each of the matched elements.
-	 * @cat Events
-	 */
-
-	/**
-	 * Bind a function to the keypress event of each matched element.
-	 *
-	 * @example $("p").keypress( function() { alert("Hello"); } );
-	 * @before <p>Hello</p>
-	 * @result <p onkeypress="alert('Hello');">Hello</p>
-	 *
-	 * @name keypress
-	 * @type jQuery
-	 * @param Function fn A function to bind to the keypress event on each of the matched elements.
-	 * @cat Events
-	 */
-
-	/**
-	 * Bind a function to the error event of each matched element.
-	 *
-	 * @example $("p").error( function() { alert("Hello"); } );
-	 * @before <p>Hello</p>
-	 * @result <p onerror="alert('Hello');">Hello</p>
-	 *
-	 * @name error
-	 * @type jQuery
-	 * @param Function fn A function to bind to the error event on each of the matched elements.
-	 * @cat Events
-	 */
-
-	/**
-	 * Bind a function to the blur event of each matched element.
-	 *
-	 * @example $("p").blur( function() { alert("Hello"); } );
-	 * @before <p>Hello</p>
-	 * @result <p onblur="alert('Hello');">Hello</p>
-	 *
-	 * @name blur
-	 * @type jQuery
-	 * @param Function fn A function to bind to the blur event on each of the matched elements.
-	 * @cat Events
-	 */
-
-	/**
-	 * Trigger the blur event of each matched element. This causes all of the functions
-	 * that have been bound to thet blur event to be executed.
-	 *
-	 * Note: This does not execute the blur method of the underlying elements! If you need to
-	 * blur an element via code, you have to use the DOM method, eg. $("#myinput")[0].blur();
-	 *
-	 * @example $("p").blur();
-	 * @before <p onblur="alert('Hello');">Hello</p>
-	 * @result alert('Hello');
-	 *
-	 * @name blur
-	 * @type jQuery
-	 * @cat Events
-	 */
-
-	/**
-	 * Bind a function to the load event of each matched element.
-	 *
-	 * @example $("p").load( function() { alert("Hello"); } );
-	 * @before <p>Hello</p>
-	 * @result <p onload="alert('Hello');">Hello</p>
-	 *
-	 * @name load
-	 * @type jQuery
-	 * @param Function fn A function to bind to the load event on each of the matched elements.
-	 * @cat Events
-	 */
-
-	/**
-	 * Bind a function to the select event of each matched element.
-	 *
-	 * @example $("p").select( function() { alert("Hello"); } );
-	 * @before <p>Hello</p>
-	 * @result <p onselect="alert('Hello');">Hello</p>
-	 *
-	 * @name select
-	 * @type jQuery
-	 * @param Function fn A function to bind to the select event on each of the matched elements.
-	 * @cat Events
-	 */
-
-	/**
-	 * Trigger the select event of each matched element. This causes all of the functions
-	 * that have been bound to thet select event to be executed.
-	 *
-	 * @example $("p").select();
-	 * @before <p onselect="alert('Hello');">Hello</p>
-	 * @result alert('Hello');
-	 *
-	 * @name select
-	 * @type jQuery
-	 * @cat Events
-	 */
-
-	/**
-	 * Bind a function to the mouseup event of each matched element.
-	 *
-	 * @example $("p").mouseup( function() { alert("Hello"); } );
-	 * @before <p>Hello</p>
-	 * @result <p onmouseup="alert('Hello');">Hello</p>
-	 *
-	 * @name mouseup
-	 * @type jQuery
-	 * @param Function fn A function to bind to the mouseup event on each of the matched elements.
-	 * @cat Events
-	 */
-
-	/**
-	 * Bind a function to the unload event of each matched element.
-	 *
-	 * @example $("p").unload( function() { alert("Hello"); } );
-	 * @before <p>Hello</p>
-	 * @result <p onunload="alert('Hello');">Hello</p>
-	 *
-	 * @name unload
-	 * @type jQuery
-	 * @param Function fn A function to bind to the unload event on each of the matched elements.
-	 * @cat Events
-	 */
-
-	/**
-	 * Bind a function to the change event of each matched element.
-	 *
-	 * @example $("p").change( function() { alert("Hello"); } );
-	 * @before <p>Hello</p>
-	 * @result <p onchange="alert('Hello');">Hello</p>
-	 *
-	 * @name change
-	 * @type jQuery
-	 * @param Function fn A function to bind to the change event on each of the matched elements.
-	 * @cat Events
-	 */
-
-	/**
-	 * Bind a function to the mouseout event of each matched element.
-	 *
-	 * @example $("p").mouseout( function() { alert("Hello"); } );
-	 * @before <p>Hello</p>
-	 * @result <p onmouseout="alert('Hello');">Hello</p>
-	 *
-	 * @name mouseout
-	 * @type jQuery
-	 * @param Function fn A function to bind to the mouseout event on each of the matched elements.
-	 * @cat Events
-	 */
-
-	/**
-	 * Bind a function to the keyup event of each matched element.
-	 *
-	 * @example $("p").keyup( function() { alert("Hello"); } );
-	 * @before <p>Hello</p>
-	 * @result <p onkeyup="alert('Hello');">Hello</p>
-	 *
-	 * @name keyup
-	 * @type jQuery
-	 * @param Function fn A function to bind to the keyup event on each of the matched elements.
-	 * @cat Events
-	 */
-
-	/**
-	 * Bind a function to the click event of each matched element.
-	 *
-	 * @example $("p").click( function() { alert("Hello"); } );
-	 * @before <p>Hello</p>
-	 * @result <p onclick="alert('Hello');">Hello</p>
-	 *
-	 * @name click
-	 * @type jQuery
-	 * @param Function fn A function to bind to the click event on each of the matched elements.
-	 * @cat Events
-	 */
-
-	/**
-	 * Trigger the click event of each matched element. This causes all of the functions
-	 * that have been bound to thet click event to be executed.
-	 *
-	 * @example $("p").click();
-	 * @before <p onclick="alert('Hello');">Hello</p>
-	 * @result alert('Hello');
-	 *
-	 * @name click
-	 * @type jQuery
-	 * @cat Events
-	 */
-
-	/**
-	 * Bind a function to the resize event of each matched element.
-	 *
-	 * @example $("p").resize( function() { alert("Hello"); } );
-	 * @before <p>Hello</p>
-	 * @result <p onresize="alert('Hello');">Hello</p>
-	 *
-	 * @name resize
-	 * @type jQuery
-	 * @param Function fn A function to bind to the resize event on each of the matched elements.
-	 * @cat Events
-	 */
-
-	/**
-	 * Bind a function to the mousemove event of each matched element.
-	 *
-	 * @example $("p").mousemove( function() { alert("Hello"); } );
-	 * @before <p>Hello</p>
-	 * @result <p onmousemove="alert('Hello');">Hello</p>
-	 *
-	 * @name mousemove
-	 * @type jQuery
-	 * @param Function fn A function to bind to the mousemove event on each of the matched elements.
-	 * @cat Events
-	 */
-
-	/**
-	 * Bind a function to the mousedown event of each matched element.
-	 *
-	 * @example $("p").mousedown( function() { alert("Hello"); } );
-	 * @before <p>Hello</p>
-	 * @result <p onmousedown="alert('Hello');">Hello</p>
-	 *
-	 * @name mousedown
-	 * @type jQuery
-	 * @param Function fn A function to bind to the mousedown event on each of the matched elements.
-	 * @cat Events
-	 */
-	 
-	/**
-	 * Bind a function to the mouseover event of each matched element.
-	 *
-	 * @example $("p").mouseover( function() { alert("Hello"); } );
-	 * @before <p>Hello</p>
-	 * @result <p onmouseover="alert('Hello');">Hello</p>
-	 *
-	 * @name mouseover
-	 * @type jQuery
-	 * @param Function fn A function to bind to the mousedown event on each of the matched elements.
-	 * @cat Events
-	 */
-	jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
-		"mousedown,mouseup,mousemove,mouseover,mouseout,change,select," + 
-		"submit,keydown,keypress,keyup,error").split(","), function(i,o){
-		
-		// Handle event binding
-		jQuery.fn[o] = function(f){
-			return f ? this.bind(o, f) : this.trigger(o);
-		};
-			
-	});
-	
-	// If Mozilla is used
-	if ( jQuery.browser.mozilla || jQuery.browser.opera )
+	// Mozilla, Opera (see further below for it) and webkit nightlies currently support this event
+	if ( document.addEventListener && !jQuery.browser.opera)
 		// Use the handy event callback
 		document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
-	
-	// If IE is used, use the excellent hack by Matthias Miller
-	// http://www.outofhanwell.com/blog/index.php?title=the_window_onload_problem_revisited
-	else if ( jQuery.browser.msie ) {
-	
-		// Only works if you document.write() it
-		document.write("<scr" + "ipt id=__ie_init defer=true " + 
-			"src=//:><\/script>");
-	
-		// Use the defer script hack
-		var script = document.getElementById("__ie_init");
-		
-		// script does not exist if jQuery is loaded dynamically
-		if ( script ) 
-			script.onreadystatechange = function() {
-				if ( this.readyState != "complete" ) return;
-				this.parentNode.removeChild( this );
-				jQuery.ready();
-			};
-	
-		// Clear from memory
-		script = null;
-	
-	// If Safari  is used
-	} else if ( jQuery.browser.safari )
-		// Continually check to see if the document.readyState is valid
-		jQuery.safariTimer = setInterval(function(){
-			// loaded and complete are both valid states
-			if ( document.readyState == "loaded" || 
-				document.readyState == "complete" ) {
-	
-				// If either one are found, remove the timer
-				clearInterval( jQuery.safariTimer );
-				jQuery.safariTimer = null;
-	
-				// and execute any waiting functions
-				jQuery.ready();
-			}
-		}, 10); 
 
-	// A fallback to window.onload, that will always work
-	jQuery.event.add( window, "load", jQuery.ready );
-	
-};
-
-// Clean up after IE to avoid memory leaks
-if (jQuery.browser.msie)
-	jQuery(window).one("unload", function() {
-		var global = jQuery.event.global;
-		for ( var type in global ) {
-			var els = global[type], i = els.length;
-			if ( i && type != 'unload' )
-				do
-					jQuery.event.remove(els[i-1], type);
-				while (--i);
+	// If IE is used and is not in a frame
+	// Continually check to see if the document is ready
+	if ( jQuery.browser.msie && 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("left");
+		} catch( error ) {
+			setTimeout( arguments.callee, 0 );
+			return;
 		}
-	});
-jQuery.fn.extend({
+		// and execute any waiting functions
+		jQuery.ready();
+	})();
 
-	/**
-	 * Displays each of the set of matched elements if they are hidden.
-	 *
-	 * @example $("p").show()
-	 * @before <p style="display: none">Hello</p>
-	 * @result [ <p style="display: block">Hello</p> ]
-	 *
-	 * @name show
-	 * @type jQuery
-	 * @cat Effects
-	 */
-	
-	/**
-	 * Show all matched elements using a graceful animation and firing an
-	 * optional callback after completion.
-	 *
-	 * The height, width, and opacity of each of the matched elements 
-	 * are changed dynamically according to the specified speed.
-	 *
-	 * @example $("p").show("slow");
-	 *
-	 * @example $("p").show("slow",function(){
-	 *   alert("Animation Done.");
-	 * });
-	 *
-	 * @name show
-	 * @type jQuery
-	 * @param String|Number speed A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).
-	 * @param Function callback (optional) A function to be executed whenever the animation completes.
-	 * @cat Effects
-	 * @see hide(String|Number,Function)
-	 */
-	show: function(speed,callback){
-		var hidden = this.filter(":hidden");
-		speed ?
-			hidden.animate({
-				height: "show", width: "show", opacity: "show"
-			}, speed, callback) :
-			
-			hidden.each(function(){
-				this.style.display = this.oldblock ? this.oldblock : "";
-				if ( jQuery.css(this,"display") == "none" )
-					this.style.display = "block";
-			});
-		return this;
-	},
-	
-	/**
-	 * Hides each of the set of matched elements if they are shown.
-	 *
-	 * @example $("p").hide()
-	 * @before <p>Hello</p>
-	 * @result [ <p style="display: none">Hello</p> ]
-	 *
-	 * @name hide
-	 * @type jQuery
-	 * @cat Effects
-	 */
-	
-	/**
-	 * Hide all matched elements using a graceful animation and firing an
-	 * optional callback after completion.
-	 *
-	 * The height, width, and opacity of each of the matched elements 
-	 * are changed dynamically according to the specified speed.
-	 *
-	 * @example $("p").hide("slow");
-	 *
-	 * @example $("p").hide("slow",function(){
-	 *   alert("Animation Done.");
-	 * });
-	 *
-	 * @name hide
-	 * @type jQuery
-	 * @param String|Number speed A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).
-	 * @param Function callback (optional) A function to be executed whenever the animation completes.
-	 * @cat Effects
-	 * @see show(String|Number,Function)
-	 */
-	hide: function(speed,callback){
-		var visible = this.filter(":visible");
-		speed ?
-			visible.animate({
-				height: "hide", width: "hide", opacity: "hide"
-			}, speed, callback) :
-			
-			visible.each(function(){
-				this.oldblock = this.oldblock || jQuery.css(this,"display");
-				if ( this.oldblock == "none" )
-					this.oldblock = "block";
-				this.style.display = "none";
-			});
-		return this;
-	},
+	if ( jQuery.browser.opera )
+		document.addEventListener( "DOMContentLoaded", function () {
+			if (jQuery.isReady) return;
+			for (var i = 0; i < document.styleSheets.length; i++)
+				if (document.styleSheets[i].disabled) {
+					setTimeout( arguments.callee, 0 );
+					return;
+				}
+			// and execute any waiting functions
+			jQuery.ready();
+		}, false);
 
-	// Save the old toggle function
-	_toggle: jQuery.fn.toggle,
-	
-	/**
-	 * Toggles each of the set of matched elements. If they are shown,
-	 * toggle makes them hidden. If they are hidden, toggle
-	 * makes them shown.
-	 *
-	 * @example $("p").toggle()
-	 * @before <p>Hello</p><p style="display: none">Hello Again</p>
-	 * @result [ <p style="display: none">Hello</p>, <p style="display: block">Hello Again</p> ]
-	 *
-	 * @name toggle
-	 * @type jQuery
-	 * @cat Effects
-	 */
-	toggle: function( fn, fn2 ){
-		var args = arguments;
-		return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
-			this._toggle( fn, fn2 ) :
-			this.each(function(){
-				jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]
-					.apply( jQuery(this), args );
-			});
-	},
-	
-	/**
-	 * Reveal all matched elements by adjusting their height and firing an
-	 * optional callback after completion.
-	 *
-	 * Only the height is adjusted for this animation, causing all matched
-	 * elements to be revealed in a "sliding" manner.
-	 *
-	 * @example $("p").slideDown("slow");
-	 *
-	 * @example $("p").slideDown("slow",function(){
-	 *   alert("Animation Done.");
-	 * });
-	 *
-	 * @name slideDown
-	 * @type jQuery
-	 * @param String|Number speed (optional) A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).
-	 * @param Function callback (optional) A function to be executed whenever the animation completes.
-	 * @cat Effects
-	 * @see slideUp(String|Number,Function)
-	 * @see slideToggle(String|Number,Function)
-	 */
-	slideDown: function(speed,callback){
-		return this.animate({height: "show"}, speed, callback);
-	},
-	
-	/**
-	 * Hide all matched elements by adjusting their height and firing an
-	 * optional callback after completion.
-	 *
-	 * Only the height is adjusted for this animation, causing all matched
-	 * elements to be hidden in a "sliding" manner.
-	 *
-	 * @example $("p").slideUp("slow");
-	 *
-	 * @example $("p").slideUp("slow",function(){
-	 *   alert("Animation Done.");
-	 * });
-	 *
-	 * @name slideUp
-	 * @type jQuery
-	 * @param String|Number speed (optional) A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).
-	 * @param Function callback (optional) A function to be executed whenever the animation completes.
-	 * @cat Effects
-	 * @see slideDown(String|Number,Function)
-	 * @see slideToggle(String|Number,Function)
-	 */
-	slideUp: function(speed,callback){
-		return this.animate({height: "hide"}, speed, callback);
-	},
-
-	/**
-	 * Toggle the visibility of all matched elements by adjusting their height and firing an
-	 * optional callback after completion.
-	 *
-	 * Only the height is adjusted for this animation, causing all matched
-	 * elements to be hidden in a "sliding" manner.
-	 *
-	 * @example $("p").slideToggle("slow");
-	 *
-	 * @example $("p").slideToggle("slow",function(){
-	 *   alert("Animation Done.");
-	 * });
-	 *
-	 * @name slideToggle
-	 * @type jQuery
-	 * @param String|Number speed (optional) A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).
-	 * @param Function callback (optional) A function to be executed whenever the animation completes.
-	 * @cat Effects
-	 * @see slideDown(String|Number,Function)
-	 * @see slideUp(String|Number,Function)
-	 */
-	slideToggle: function(speed, callback){
-		return this.each(function(){
-			var state = jQuery(this).is(":hidden") ? "show" : "hide";
-			jQuery(this).animate({height: state}, speed, callback);
-		});
-	},
-	
-	/**
-	 * Fade in all matched elements by adjusting their opacity and firing an
-	 * optional callback after completion.
-	 *
-	 * Only the opacity is adjusted for this animation, meaning that
-	 * all of the matched elements should already have some form of height
-	 * and width associated with them.
-	 *
-	 * @example $("p").fadeIn("slow");
-	 *
-	 * @example $("p").fadeIn("slow",function(){
-	 *   alert("Animation Done.");
-	 * });
-	 *
-	 * @name fadeIn
-	 * @type jQuery
-	 * @param String|Number speed (optional) A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).
-	 * @param Function callback (optional) A function to be executed whenever the animation completes.
-	 * @cat Effects
-	 * @see fadeOut(String|Number,Function)
-	 * @see fadeTo(String|Number,Number,Function)
-	 */
-	fadeIn: function(speed, callback){
-		return this.animate({opacity: "show"}, speed, callback);
-	},
-	
-	/**
-	 * Fade out all matched elements by adjusting their opacity and firing an
-	 * optional callback after completion.
-	 *
-	 * Only the opacity is adjusted for this animation, meaning that
-	 * all of the matched elements should already have some form of height
-	 * and width associated with them.
-	 *
-	 * @example $("p").fadeOut("slow");
-	 *
-	 * @example $("p").fadeOut("slow",function(){
-	 *   alert("Animation Done.");
-	 * });
-	 *
-	 * @name fadeOut
-	 * @type jQuery
-	 * @param String|Number speed (optional) A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).
-	 * @param Function callback (optional) A function to be executed whenever the animation completes.
-	 * @cat Effects
-	 * @see fadeIn(String|Number,Function)
-	 * @see fadeTo(String|Number,Number,Function)
-	 */
-	fadeOut: function(speed, callback){
-		return this.animate({opacity: "hide"}, speed, callback);
-	},
-	
-	/**
-	 * Fade the opacity of all matched elements to a specified opacity and firing an
-	 * optional callback after completion.
-	 *
-	 * Only the opacity is adjusted for this animation, meaning that
-	 * all of the matched elements should already have some form of height
-	 * and width associated with them.
-	 *
-	 * @example $("p").fadeTo("slow", 0.5);
-	 *
-	 * @example $("p").fadeTo("slow", 0.5, function(){
-	 *   alert("Animation Done.");
-	 * });
-	 *
-	 * @name fadeTo
-	 * @type jQuery
-	 * @param String|Number speed A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).
-	 * @param Number opacity The opacity to fade to (a number from 0 to 1).
-	 * @param Function callback (optional) A function to be executed whenever the animation completes.
-	 * @cat Effects
-	 * @see fadeIn(String|Number,Function)
-	 * @see fadeOut(String|Number,Function)
-	 */
-	fadeTo: function(speed,to,callback){
-		return this.animate({opacity: to}, speed, callback);
-	},
-	
-	/**
-	 * A function for making your own, custom, animations. The key aspect of
-	 * this function is the object of style properties that will be animated,
-	 * and to what end. Each key within the object represents a style property
-	 * that will also be animated (for example: "height", "top", or "opacity").
-	 *
-	 * The value associated with the key represents to what end the property
-	 * will be animated. If a number is provided as the value, then the style
-	 * property will be transitioned from its current state to that new number.
-	 * Oterwise if the string "hide", "show", or "toggle" is provided, a default
-	 * animation will be constructed for that property.
-	 *
-	 * @example $("p").animate({
-	 *   height: 'toggle', opacity: 'toggle'
-	 * }, "slow");
-	 *
-	 * @example $("p").animate({
-	 *   left: 50, opacity: 'show'
-	 * }, 500);
-	 *
-	 * @example $("p").animate({
-	 *   opacity: 'show'
-	 * }, "slow", "easein");
-	 * @desc An example of using an 'easing' function to provide a different style of animation. This will only work if you have a plugin that provides this easing function (Only 'linear' is provided by default, with jQuery).
-	 *
-	 * @name animate
-	 * @type jQuery
-	 * @param Hash params A set of style attributes that you wish to animate, and to what end.
-	 * @param String|Number speed (optional) A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).
-	 * @param String easing (optional) The name of the easing effect that you want to use (Plugin Required).
-	 * @param Function callback (optional) A function to be executed whenever the animation completes.
-	 * @cat Effects
-	 */
-	animate: function( prop, speed, easing, callback ) {
-		return this.queue(function(){
-		
-			this.curAnim = jQuery.extend({}, prop);
-			var opt = jQuery.speed(speed, easing, callback);
-			
-			for ( var p in prop ) {
-				var e = new jQuery.fx( this, opt, p );
-				if ( prop[p].constructor == Number )
-					e.custom( e.cur(), prop[p] );
-				else
-					e[ prop[p] ]( prop );
+	if ( jQuery.browser.safari ) {
+		var numStyles;
+		(function(){
+			if (jQuery.isReady) return;
+			if ( document.readyState != "loaded" && document.readyState != "complete" ) {
+				setTimeout( arguments.callee, 0 );
+				return;
 			}
-			
-		});
-	},
-	
-	/**
-	 *
-	 * @private
-	 */
-	queue: function(type,fn){
-		if ( !fn ) {
-			fn = type;
-			type = "fx";
-		}
-	
-		return this.each(function(){
-			if ( !this.queue )
-				this.queue = {};
-	
-			if ( !this.queue[type] )
-				this.queue[type] = [];
-	
-			this.queue[type].push( fn );
-		
-			if ( this.queue[type].length == 1 )
-				fn.apply(this);
-		});
+			if ( numStyles === undefined )
+				numStyles = jQuery("style, link[rel=stylesheet]").length;
+			if ( document.styleSheets.length != numStyles ) {
+				setTimeout( arguments.callee, 0 );
+				return;
+			}
+			// and execute any waiting functions
+			jQuery.ready();
+		})();
 	}
 
-});
+	// A fallback to window.onload, that will always work
+	jQuery.event.add( window, "load", jQuery.ready );
+}
 
-jQuery.extend({
-	
-	speed: function(speed, easing, fn) {
-		var opt = speed && speed.constructor == Object ? speed : {
-			complete: fn || !fn && easing || 
-				jQuery.isFunction( speed ) && speed,
-			duration: speed,
-			easing: fn && easing || easing && easing.constructor != Function && easing
-		};
+jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
+	"mousedown,mouseup,mousemove,mouseover,mouseout,change,select," +
+	"submit,keydown,keypress,keyup,error").split(","), function(i, name){
 
-		opt.duration = (opt.duration && opt.duration.constructor == Number ? 
-			opt.duration : 
-			{ slow: 600, fast: 200 }[opt.duration]) || 400;
-	
-		// Queueing
-		opt.old = opt.complete;
-		opt.complete = function(){
-			jQuery.dequeue(this, "fx");
-			if ( jQuery.isFunction( opt.old ) )
-				opt.old.apply( this );
-		};
-	
-		return opt;
-	},
-	
-	easing: {},
-	
-	queue: {},
-	
-	dequeue: function(elem,type){
-		type = type || "fx";
-	
-		if ( elem.queue && elem.queue[type] ) {
-			// Remove self
-			elem.queue[type].shift();
-	
-			// Get next function
-			var f = elem.queue[type][0];
-		
-			if ( f ) f.apply( elem );
-		}
-	},
+	// Handle event binding
+	jQuery.fn[name] = function(fn){
+		return fn ? this.bind(name, fn) : this.trigger(name);
+	};
+});
 
-	/*
-	 * I originally wrote fx() as a clone of moo.fx and in the process
-	 * of making it small in size the code became illegible to sane
-	 * people. You've been warned.
-	 */
-	
-	fx: function( elem, options, prop ){
+// 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 && 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;
+};
 
-		var z = this;
-
-		// The styles
-		var y = elem.style;
-		
-		// Store display property
-		var oldDisplay = jQuery.css(elem, "display");
-
-		// Set display property to block for animation
-		y.display = "block";
-
-		// Make sure that nothing sneaks out
-		y.overflow = "hidden";
-
-		// Simple function for setting a style value
-		z.a = function(){
-			if ( options.step )
-				options.step.apply( elem, [ z.now ] );
-
-			if ( prop == "opacity" )
-				jQuery.attr(y, "opacity", z.now); // Let attr handle opacity
-			else if ( parseInt(z.now) ) // My hate for IE will never die
-				y[prop] = parseInt(z.now) + "px";
-		};
-
-		// Figure out the maximum number to run to
-		z.max = function(){
-			return parseFloat( jQuery.css(elem,prop) );
-		};
-
-		// Get the current size
-		z.cur = function(){
-			var r = parseFloat( jQuery.curCSS(elem, prop) );
-			return r && r > -10000 ? r : z.max();
-		};
-
-		// Start an animation from one number to another
-		z.custom = function(from,to){
-			z.startTime = (new Date()).getTime();
-			z.now = from;
-			z.a();
-
-			z.timer = setInterval(function(){
-				z.step(from, to);
-			}, 13);
-		};
-
-		// Simple 'show' function
-		z.show = function(){
-			if ( !elem.orig ) elem.orig = {};
-
-			// Remember where we started, so that we can go back to it later
-			elem.orig[prop] = this.cur();
-
-			options.show = true;
-
-			// Begin the animation
-			z.custom(0, elem.orig[prop]);
-
-			// Stupid IE, look what you made me do
-			if ( prop != "opacity" )
-				y[prop] = "1px";
-		};
-
-		// Simple 'hide' function
-		z.hide = function(){
-			if ( !elem.orig ) elem.orig = {};
-
-			// Remember where we started, so that we can go back to it later
-			elem.orig[prop] = this.cur();
-
-			options.hide = true;
-
-			// Begin the animation
-			z.custom(elem.orig[prop], 0);
-		};
-		
-		//Simple 'toggle' function
-		z.toggle = function() {
-			if ( !elem.orig ) elem.orig = {};
-
-			// Remember where we started, so that we can go back to it later
-			elem.orig[prop] = this.cur();
-
-			if(oldDisplay == "none")  {
-				options.show = true;
-				
-				// Stupid IE, look what you made me do
-				if ( prop != "opacity" )
-					y[prop] = "1px";
-
-				// Begin the animation
-				z.custom(0, elem.orig[prop]);	
-			} else {
-				options.hide = true;
-
-				// Begin the animation
-				z.custom(elem.orig[prop], 0);
-			}		
-		};
-
-		// Each step of an animation
-		z.step = function(firstNum, lastNum){
-			var t = (new Date()).getTime();
-
-			if (t > options.duration + z.startTime) {
-				// Stop the timer
-				clearInterval(z.timer);
-				z.timer = null;
-
-				z.now = lastNum;
-				z.a();
-
-				if (elem.curAnim) elem.curAnim[ prop ] = true;
-
-				var done = true;
-				for ( var i in elem.curAnim )
-					if ( elem.curAnim[i] !== true )
-						done = false;
-
-				if ( done ) {
-					// Reset the overflow
-					y.overflow = "";
-					
-					// Reset the display
-					y.display = oldDisplay;
-					if (jQuery.css(elem, "display") == "none")
-						y.display = "block";
-
-					// Hide the element if the "hide" operation was done
-					if ( options.hide ) 
-						y.display = "none";
-
-					// Reset the properties, if the item has been hidden or shown
-					if ( options.hide || options.show )
-						for ( var p in elem.curAnim )
-							if (p == "opacity")
-								jQuery.attr(y, p, elem.orig[p]);
-							else
-								y[p] = "";
-				}
-
-				// If a callback was provided, execute it
-				if ( done && jQuery.isFunction( options.complete ) )
-					// Execute the complete function
-					options.complete.apply( elem );
-			} else {
-				var n = t - this.startTime;
-				// Figure out where in the animation we are and set the number
-				var p = n / options.duration;
-				
-				// If the easing function exists, then use it 
-				z.now = options.easing && jQuery.easing[options.easing] ?
-					jQuery.easing[options.easing](p, n,  firstNum, (lastNum-firstNum), options.duration) :
-					// else use default linear easing
-					((-Math.cos(p*Math.PI)/2) + 0.5) * (lastNum-firstNum) + firstNum;
-
-				// Perform the next step of the animation
-				z.a();
-			}
-		};
-	
-	}
+// 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("unload", function() {
+	jQuery("*").add(document).unbind();
 });
 jQuery.fn.extend({
+	// Keep a copy of the old load
+	_load: jQuery.fn.load,
 
-	/**
-	 * Load HTML from a remote file and inject it into the DOM, only if it's
-	 * been modified by the server.
-	 *
-	 * @example $("#feeds").loadIfModified("feeds.html");
-	 * @before <div id="feeds"></div>
-	 * @result <div id="feeds"><b>45</b> feeds found.</div>
-	 *
-	 * @name loadIfModified
-	 * @type jQuery
-	 * @param String url The URL of the HTML file to load.
-	 * @param Map params (optional) Key/value pairs that will be sent to the server.
-	 * @param Function callback (optional) A function to be executed whenever the data is loaded (parameters: responseText, status and response itself).
-	 * @cat Ajax
-	 */
-	loadIfModified: function( url, params, callback ) {
-		this.load( url, params, callback, 1 );
-	},
+	load: function( url, params, callback ) {
+		if ( typeof url != 'string' )
+			return this._load( url );
 
-	/**
-	 * Load HTML from a remote file and inject it into the DOM.
-	 *
-	 * Note: Avoid to use this to load scripts, instead use $.getScript.
-	 * IE strips script tags when there aren't any other characters in front of it.
-	 *
-	 * @example $("#feeds").load("feeds.html");
-	 * @before <div id="feeds"></div>
-	 * @result <div id="feeds"><b>45</b> feeds found.</div>
-	 *
- 	 * @example $("#feeds").load("feeds.html",
- 	 *   {limit: 25},
- 	 *   function() { alert("The last 25 entries in the feed have been loaded"); }
- 	 * );
-	 * @desc Same as above, but with an additional parameter
-	 * and a callback that is executed when the data was loaded.
-	 *
-	 * @name load
-	 * @type jQuery
-	 * @param String url The URL of the HTML file to load.
-	 * @param Object params (optional) A set of key/value pairs that will be sent as data to the server.
-	 * @param Function callback (optional) A function to be executed whenever the data is loaded (parameters: responseText, status and response itself).
-	 * @cat Ajax
-	 */
-	load: function( url, params, callback, ifModified ) {
-		if ( jQuery.isFunction( url ) )
-			return this.bind("load", url);
+		var off = url.indexOf(" ");
+		if ( off >= 0 ) {
+			var selector = url.slice(off, url.length);
+			url = url.slice(0, off);
+		}
 
 		callback = callback || function(){};
 
@@ -4237,324 +2452,90 @@
 		jQuery.ajax({
 			url: url,
 			type: type,
+			dataType: "html",
 			data: params,
-			ifModified: ifModified,
 			complete: function(res, status){
-				if ( status == "success" || !ifModified && status == "notmodified" )
-					// Inject the HTML into all the matched elements
-					self.attr("innerHTML", res.responseText)
-					  // Execute all the scripts inside of the newly-injected HTML
-					  .evalScripts()
-					  // Execute callback
-					  .each( callback, [res.responseText, status, res] );
-				else
-					callback.apply( self, [res.responseText, status, res] );
+				// If successful, inject the HTML into all the matched elements
+				if ( status == "success" || status == "notmodified" )
+					// See if a selector was specified
+					self.html( selector ?
+						// Create a dummy div to hold the results
+						jQuery("<div/>")
+							// inject the contents of the document in, removing the scripts
+							// to avoid any 'Permission Denied' errors in IE
+							.append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
+
+							// Locate the specified elements
+							.find(selector) :
+
+						// If not, just inject the full result
+						res.responseText );
+
+				self.each( callback, [res.responseText, status, res] );
 			}
 		});
 		return this;
 	},
 
-	/**
-	 * Serializes a set of input elements into a string of data.
-	 * This will serialize all given elements.
-	 *
-	 * A serialization similar to the form submit of a browser is
-	 * provided by the form plugin. It also takes multiple-selects 
-	 * into account, while this method recognizes only a single option.
-	 *
-	 * @example $("input[@type=text]").serialize();
-	 * @before <input type='text' name='name' value='John'/>
-	 * <input type='text' name='location' value='Boston'/>
-	 * @after name=John&location=Boston
-	 * @desc Serialize a selection of input elements to a string
-	 *
-	 * @name serialize
-	 * @type String
-	 * @cat Ajax
-	 */
 	serialize: function() {
-		return jQuery.param( this );
+		return jQuery.param(this.serializeArray());
 	},
-
-	/**
-	 * Evaluate all script tags inside this jQuery. If they have a src attribute,
-	 * the script is loaded, otherwise it's content is evaluated.
-	 *
-	 * @name evalScripts
-	 * @type jQuery
-	 * @private
-	 * @cat Ajax
-	 */
-	evalScripts: function() {
-		return this.find("script").each(function(){
-			if ( this.src )
-				jQuery.getScript( this.src );
-			else
-				jQuery.globalEval( this.text || this.textContent || this.innerHTML || "" );
-		}).end();
+	serializeArray: function() {
+		return this.map(function(){
+			return jQuery.nodeName(this, "form") ?
+				jQuery.makeArray(this.elements) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				(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.map( val, function(val, i){
+						return {name: elem.name, value: val};
+					}) :
+					{name: elem.name, value: val};
+		}).get();
 	}
-
 });
 
-// If IE is used, create a wrapper for the XMLHttpRequest object
-if ( !window.XMLHttpRequest )
-	XMLHttpRequest = function(){
-		return new ActiveXObject("Microsoft.XMLHTTP");
-	};
-
 // Attach a bunch of functions for handling common AJAX events
-
-/**
- * Attach a function to be executed whenever an AJAX request begins
- * and there is none already active.
- *
- * @example $("#loading").ajaxStart(function(){
- *   $(this).show();
- * });
- * @desc Show a loading message whenever an AJAX request starts
- * (and none is already active).
- *
- * @name ajaxStart
- * @type jQuery
- * @param Function callback The function to execute.
- * @cat Ajax
- */
-
-/**
- * Attach a function to be executed whenever all AJAX requests have ended.
- *
- * @example $("#loading").ajaxStop(function(){
- *   $(this).hide();
- * });
- * @desc Hide a loading message after all the AJAX requests have stopped.
- *
- * @name ajaxStop
- * @type jQuery
- * @param Function callback The function to execute.
- * @cat Ajax
- */
-
-/**
- * Attach a function to be executed whenever an AJAX request completes.
- *
- * The XMLHttpRequest and settings used for that request are passed
- * as arguments to the callback.
- *
- * @example $("#msg").ajaxComplete(function(request, settings){
- *   $(this).append("<li>Request Complete.</li>");
- * });
- * @desc Show a message when an AJAX request completes.
- *
- * @name ajaxComplete
- * @type jQuery
- * @param Function callback The function to execute.
- * @cat Ajax
- */
-
-/**
- * Attach a function to be executed whenever an AJAX request completes
- * successfully.
- *
- * The XMLHttpRequest and settings used for that request are passed
- * as arguments to the callback.
- *
- * @example $("#msg").ajaxSuccess(function(request, settings){
- *   $(this).append("<li>Successful Request!</li>");
- * });
- * @desc Show a message when an AJAX request completes successfully.
- *
- * @name ajaxSuccess
- * @type jQuery
- * @param Function callback The function to execute.
- * @cat Ajax
- */
-
-/**
- * Attach a function to be executed whenever an AJAX request fails.
- *
- * The XMLHttpRequest and settings used for that request are passed
- * as arguments to the callback. A third argument, an exception object,
- * is passed if an exception occured while processing the request.
- *
- * @example $("#msg").ajaxError(function(request, settings){
- *   $(this).append("<li>Error requesting page " + settings.url + "</li>");
- * });
- * @desc Show a message when an AJAX request fails.
- *
- * @name ajaxError
- * @type jQuery
- * @param Function callback The function to execute.
- * @cat Ajax
- */
- 
-/**
- * Attach a function to be executed before an AJAX request is sent.
- *
- * The XMLHttpRequest and settings used for that request are passed
- * as arguments to the callback.
- *
- * @example $("#msg").ajaxSend(function(request, settings){
- *   $(this).append("<li>Starting request at " + settings.url + "</li>");
- * });
- * @desc Show a message before an AJAX request is sent.
- *
- * @name ajaxSend
- * @type jQuery
- * @param Function callback The function to execute.
- * @cat Ajax
- */
 jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
 	jQuery.fn[o] = function(f){
 		return this.bind(o, f);
 	};
 });
 
-jQuery.extend({
+var jsc = now();
 
-	/**
-	 * Load a remote page using an HTTP GET request.
-	 *
-	 * @example $.get("test.cgi");
-	 *
-	 * @example $.get("test.cgi", { name: "John", time: "2pm" } );
-	 *
-	 * @example $.get("test.cgi", function(data){
-	 *   alert("Data Loaded: " + data);
-	 * });
-	 *
-	 * @example $.get("test.cgi",
-	 *   { name: "John", time: "2pm" },
-	 *   function(data){
-	 *     alert("Data Loaded: " + data);
-	 *   }
-	 * );
-	 *
-	 * @name $.get
-	 * @type XMLHttpRequest
-	 * @param String url The URL of the page to load.
-	 * @param Map params (optional) Key/value pairs that will be sent to the server.
-	 * @param Function callback (optional) A function to be executed whenever the data is loaded.
-	 * @cat Ajax
-	 */
-	get: function( url, data, callback, type, ifModified ) {
+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: "GET",
 			url: url,
 			data: data,
 			success: callback,
-			dataType: type,
-			ifModified: ifModified
+			dataType: type
 		});
 	},
 
-	/**
-	 * Load a remote page using an HTTP GET request, only if it hasn't
-	 * been modified since it was last retrieved.
-	 *
-	 * @example $.getIfModified("test.html");
-	 *
-	 * @example $.getIfModified("test.html", { name: "John", time: "2pm" } );
-	 *
-	 * @example $.getIfModified("test.cgi", function(data){
-	 *   alert("Data Loaded: " + data);
-	 * });
-	 *
-	 * @example $.getifModified("test.cgi",
-	 *   { name: "John", time: "2pm" },
-	 *   function(data){
-	 *     alert("Data Loaded: " + data);
-	 *   }
-	 * );
-	 *
-	 * @name $.getIfModified
-	 * @type XMLHttpRequest
-	 * @param String url The URL of the page to load.
-	 * @param Map params (optional) Key/value pairs that will be sent to the server.
-	 * @param Function callback (optional) A function to be executed whenever the data is loaded.
-	 * @cat Ajax
-	 */
-	getIfModified: function( url, data, callback, type ) {
-		return jQuery.get(url, data, callback, type, 1);
-	},
-
-	/**
-	 * Loads, and executes, a remote JavaScript file using an HTTP GET request.
-	 *
-	 * Warning: Safari <= 2.0.x is unable to evalulate scripts in a global
-	 * context synchronously. If you load functions via getScript, make sure
-	 * to call them after a delay.
-	 *
-	 * @example $.getScript("test.js");
-	 *
-	 * @example $.getScript("test.js", function(){
-	 *   alert("Script loaded and executed.");
-	 * });
-	 *
-	 * @name $.getScript
-	 * @type XMLHttpRequest
-	 * @param String url The URL of the page to load.
-	 * @param Function callback (optional) A function to be executed whenever the data is loaded.
-	 * @cat Ajax
-	 */
 	getScript: function( url, callback ) {
 		return jQuery.get(url, null, callback, "script");
 	},
 
-	/**
-	 * Load JSON data using an HTTP GET request.
-	 *
-	 * @example $.getJSON("test.js", function(json){
-	 *   alert("JSON Data: " + json.users[3].name);
-	 * });
-	 *
-	 * @example $.getJSON("test.js",
-	 *   { name: "John", time: "2pm" },
-	 *   function(json){
-	 *     alert("JSON Data: " + json.users[3].name);
-	 *   }
-	 * );
-	 *
-	 * @name $.getJSON
-	 * @type XMLHttpRequest
-	 * @param String url The URL of the page to load.
-	 * @param Map params (optional) Key/value pairs that will be sent to the server.
-	 * @param Function callback A function to be executed whenever the data is loaded.
-	 * @cat Ajax
-	 */
 	getJSON: function( url, data, callback ) {
 		return jQuery.get(url, data, callback, "json");
 	},
 
-	/**
-	 * Load a remote page using an HTTP POST request.
-	 *
-	 * @example $.post("test.cgi");
-	 *
-	 * @example $.post("test.cgi", { name: "John", time: "2pm" } );
-	 *
-	 * @example $.post("test.cgi", function(data){
-	 *   alert("Data Loaded: " + data);
-	 * });
-	 *
-	 * @example $.post("test.cgi",
-	 *   { name: "John", time: "2pm" },
-	 *   function(data){
-	 *     alert("Data Loaded: " + data);
-	 *   }
-	 * );
-	 *
-	 * @name $.post
-	 * @type XMLHttpRequest
-	 * @param String url The URL of the page to load.
-	 * @param Map params (optional) Key/value pairs that will be sent to the server.
-	 * @param Function callback (optional) A function to be executed whenever the data is loaded.
-	 * @cat Ajax
-	 */
 	post: function( url, data, callback, type ) {
 		if ( jQuery.isFunction( data ) ) {
 			callback = data;
@@ -4570,384 +2551,350 @@
 		});
 	},
 
-	// timeout (ms)
-	//timeout: 0,
-
-	/**
-	 * Set the timeout of all AJAX requests to a specific amount of time.
-	 * This will make all future AJAX requests timeout after a specified amount
-	 * of time.
-	 *
-	 * Set to null or 0 to disable timeouts (default).
-	 *
-	 * You can manually abort requests with the XMLHttpRequest's (returned by
-	 * all ajax functions) abort() method.
-	 *
-	 * Deprecated. Use $.ajaxSetup instead.
-	 *
-	 * @example $.ajaxTimeout( 5000 );
-	 * @desc Make all AJAX requests timeout after 5 seconds.
-	 *
-	 * @name $.ajaxTimeout
-	 * @type undefined
-	 * @param Number time How long before an AJAX request times out.
-	 * @cat Ajax
-	 */
-	ajaxTimeout: function( timeout ) {
-		jQuery.ajaxSettings.timeout = timeout;
-	},
-	
-	/**
-	 * Setup global settings for AJAX requests.
-	 *
-	 * See $.ajax for a description of all available options.
-	 *
-	 * @example $.ajaxSetup( {
-	 *   url: "/xmlhttp/",
-	 *   global: false,
-	 *   type: "POST"
-	 * } );
-	 * $.ajax({ data: myData });
-	 * @desc Sets the defaults for AJAX requests to the url "/xmlhttp/",
-	 * disables global handlers and uses POST instead of GET. The following
-	 * AJAX requests then sends some data without having to set anything else.
-	 *
-	 * @name $.ajaxSetup
-	 * @type undefined
-	 * @param Map settings Key/value pairs to use for all AJAX requests
-	 * @cat Ajax
-	 */
 	ajaxSetup: function( settings ) {
 		jQuery.extend( jQuery.ajaxSettings, settings );
 	},
 
 	ajaxSettings: {
+		url: location.href,
 		global: true,
 		type: "GET",
 		timeout: 0,
 		contentType: "application/x-www-form-urlencoded",
 		processData: true,
 		async: true,
-		data: null
+		data: null,
+		username: null,
+		password: null,
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			script: "text/javascript, application/javascript",
+			json: "application/json, text/javascript",
+			text: "text/plain",
+			_default: "*/*"
+		}
 	},
-	
+
 	// Last-Modified header cache for next request
 	lastModified: {},
 
-	/**
-	 * Load a remote page using an HTTP request.
-	 *
-	 * This is jQuery's low-level AJAX implementation. See $.get, $.post etc. for
-	 * higher-level abstractions.
-	 *
-	 * $.ajax() returns the XMLHttpRequest that it creates. In most cases you won't
-	 * need that object to manipulate directly, but it is available if you need to
-	 * abort the request manually.
-	 *
-	 * Note: Make sure the server sends the right mimetype (eg. xml as
-	 * "text/xml"). Sending the wrong mimetype will get you into serious
-	 * trouble that jQuery can't solve.
-	 *
-	 * Supported datatypes are (see dataType option):
-	 *
-	 * "xml": Returns a XML document that can be processed via jQuery.
-	 *
-	 * "html": Returns HTML as plain text, included script tags are evaluated.
-	 *
-	 * "script": Evaluates the response as Javascript and returns it as plain text.
-	 *
-	 * "json": Evaluates the response as JSON and returns a Javascript Object
-	 *
-	 * $.ajax() takes one argument, an object of key/value pairs, that are
-	 * used to initalize and handle the request. These are all the key/values that can
-	 * be used:
-	 *
-	 * (String) url - The URL to request.
-	 *
-	 * (String) type - The type of request to make ("POST" or "GET"), default is "GET".
-	 *
-	 * (String) dataType - The type of data that you're expecting back from
-	 * the server. No default: If the server sends xml, the responseXML, otherwise
-	 * the responseText is passed to the success callback.
-	 *
-	 * (Boolean) ifModified - Allow the request to be successful only if the
-	 * response has changed since the last request. This is done by checking the
-	 * Last-Modified header. Default value is false, ignoring the header.
-	 *
-	 * (Number) timeout - Local timeout to override global timeout, eg. to give a
-	 * single request a longer timeout while all others timeout after 1 second.
-	 * See $.ajaxTimeout() for global timeouts.
-	 *
-	 * (Boolean) global - Whether to trigger global AJAX event handlers for
-	 * this request, default is true. Set to false to prevent that global handlers
-	 * like ajaxStart or ajaxStop are triggered.
-	 *
-	 * (Function) error - A function to be called if the request fails. The
-	 * function gets passed tree arguments: The XMLHttpRequest object, a
-	 * string describing the type of error that occurred and an optional
-	 * exception object, if one occured.
-	 *
-	 * (Function) success - A function to be called if the request succeeds. The
-	 * function gets passed one argument: The data returned from the server,
-	 * formatted according to the 'dataType' parameter.
-	 *
-	 * (Function) complete - A function to be called when the request finishes. The
-	 * function gets passed two arguments: The XMLHttpRequest object and a
-	 * string describing the type of success of the request.
-	 *
- 	 * (Object|String) data - Data to be sent to the server. Converted to a query
-	 * string, if not already a string. Is appended to the url for GET-requests.
-	 * See processData option to prevent this automatic processing.
-	 *
-	 * (String) contentType - When sending data to the server, use this content-type.
-	 * Default is "application/x-www-form-urlencoded", which is fine for most cases.
-	 *
-	 * (Boolean) processData - By default, data passed in to the data option as an object
-	 * other as string will be processed and transformed into a query string, fitting to
-	 * the default content-type "application/x-www-form-urlencoded". If you want to send
-	 * DOMDocuments, set this option to false.
-	 *
-	 * (Boolean) async - By default, all requests are sent asynchronous (set to true).
-	 * If you need synchronous requests, set this option to false.
-	 *
-	 * (Function) beforeSend - A pre-callback to set custom headers etc., the
-	 * XMLHttpRequest is passed as the only argument.
-	 *
-	 * @example $.ajax({
-	 *   type: "GET",
-	 *   url: "test.js",
-	 *   dataType: "script"
-	 * })
-	 * @desc Load and execute a JavaScript file.
-	 *
-	 * @example $.ajax({
-	 *   type: "POST",
-	 *   url: "some.php",
-	 *   data: "name=John&location=Boston",
-	 *   success: function(msg){
-	 *     alert( "Data Saved: " + msg );
-	 *   }
-	 * });
-	 * @desc Save some data to the server and notify the user once its complete.
-	 *
-	 * @example var html = $.ajax({
-	 *  url: "some.php",
-	 *  async: false
-	 * }).responseText;
-	 * @desc Loads data synchronously. Blocks the browser while the requests is active.
-	 * It is better to block user interaction with others means when synchronization is
-	 * necessary, instead to block the complete browser.
-	 *
-	 * @example var xmlDocument = [create xml document];
-	 * $.ajax({
-	 *   url: "page.php",
-	 *   processData: false,
-	 *   data: xmlDocument,
-	 *   success: handleResponse
-	 * });
-	 * @desc Sends an xml document as data to the server. By setting the processData
-	 * option to false, the automatic conversion of data to strings is prevented.
-	 * 
-	 * @name $.ajax
-	 * @type XMLHttpRequest
-	 * @param Map properties Key/value pairs to initialize the request with.
-	 * @cat Ajax
-	 * @see ajaxSetup(Map)
-	 */
 	ajax: function( s ) {
-		// TODO introduce global settings, allowing the client to modify them for all requests, not only timeout
-		s = jQuery.extend({}, jQuery.ajaxSettings, s);
+		// 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));
 
-		// if data available
-		if ( s.data ) {
-			// convert data if not already a string
-			if (s.processData && typeof s.data != "string")
-    			s.data = jQuery.param(s.data);
-			// append data to url for get requests
-			if( s.type.toLowerCase() == "get" )
-				// "?" + data or "&" + data (in case there are already params)
-				s.url += ((s.url.indexOf("?") > -1) ? "&" : "?") + s.data;
+		var jsonp, jsre = /=\?(&|$)/g, status, data,
+			type = s.type.toUpperCase();
+
+		// convert data if not already a string
+		if ( s.data && s.processData && typeof s.data != "string" )
+			s.data = jQuery.param(s.data);
+
+		// Handle JSONP Parameter Callbacks
+		if ( s.dataType == "jsonp" ) {
+			if ( type == "GET" ) {
+				if ( !s.url.match(jsre) )
+					s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
+			} else if ( !s.data || !s.data.match(jsre) )
+				s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
+			s.dataType = "json";
 		}
 
+		// Build temporary JSONP function
+		if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
+			jsonp = "jsonp" + jsc++;
+
+			// Replace the =? sequence both in the query string and the data
+			if ( s.data )
+				s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
+			s.url = s.url.replace(jsre, "=" + jsonp + "$1");
+
+			// We need to make sure
+			// that a JSONP style response is executed properly
+			s.dataType = "script";
+
+			// Handle JSONP-style loading
+			window[ jsonp ] = function(tmp){
+				data = tmp;
+				success();
+				complete();
+				// Garbage collect
+				window[ jsonp ] = undefined;
+				try{ delete window[ jsonp ]; } catch(e){}
+				if ( head )
+					head.removeChild( script );
+			};
+		}
+
+		if ( s.dataType == "script" && s.cache == null )
+			s.cache = false;
+
+		if ( s.cache === false && type == "GET" ) {
+			var ts = now();
+			// try replacing _= if it is there
+			var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
+			// if nothing was replaced, add timestamp to the end
+			s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
+		}
+
+		// If data is available, append data to url for get requests
+		if ( s.data && type == "GET" ) {
+			s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
+
+			// IE likes to send both get and post data, prevent this
+			s.data = null;
+		}
+
 		// Watch for a new set of requests
 		if ( s.global && ! jQuery.active++ )
 			jQuery.event.trigger( "ajaxStart" );
 
+		// Matches an absolute URL, and saves the domain
+		var remote = /^(?:\w+:)?\/\/([^\/?#]+)/;
+
+		// If we're requesting a remote document
+		// and trying to load JSON or Script with a GET
+		if ( s.dataType == "script" && type == "GET"
+				&& remote.test(s.url) && remote.exec(s.url)[1] != location.host ){
+			var head = document.getElementsByTagName("head")[0];
+			var script = document.createElement("script");
+			script.src = s.url;
+			if (s.scriptCharset)
+				script.charset = s.scriptCharset;
+
+			// Handle Script loading
+			if ( !jsonp ) {
+				var done = false;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function(){
+					if ( !done && (!this.readyState ||
+							this.readyState == "loaded" || this.readyState == "complete") ) {
+						done = true;
+						success();
+						complete();
+						head.removeChild( script );
+					}
+				};
+			}
+
+			head.appendChild(script);
+
+			// We handle everything using the script element injection
+			return undefined;
+		}
+
 		var requestDone = false;
 
-		// Create the request object
-		var xml = new XMLHttpRequest();
+		// Create the request object; Microsoft failed to properly
+		// implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
+		var xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
 
 		// 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);
 
-		// Set the correct header, if data is being sent
-		if ( s.data )
-			xml.setRequestHeader("Content-Type", s.contentType);
+		// 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 )
+				xhr.setRequestHeader("Content-Type", s.contentType);
 
-		// Set the If-Modified-Since header, if ifModified mode.
-		if ( s.ifModified )
-			xml.setRequestHeader("If-Modified-Since",
-				jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
+			// Set the If-Modified-Since header, if ifModified mode.
+			if ( s.ifModified )
+				xhr.setRequestHeader("If-Modified-Since",
+					jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
 
-		// Set header so the called script knows that it's an XMLHttpRequest
-		xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+			// Set header so the called script knows that it's an XMLHttpRequest
+			xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
 
-		// Make sure the browser sends the right content length
-		if ( xml.overrideMimeType )
-			xml.setRequestHeader("Connection", "close");
-			
+			// Set the Accepts header for the server, depending on the dataType
+			xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
+				s.accepts[ s.dataType ] + ", */*" :
+				s.accepts._default );
+		} catch(e){}
+
 		// Allow custom headers/mimetypes
-		if( s.beforeSend )
-			s.beforeSend(xml);
-			
+		if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
+			// cleanup active request counter
+			s.global && jQuery.active--;
+			// close opended socket
+			xhr.abort();
+			return false;
+		}
+
 		if ( s.global )
-		    jQuery.event.trigger("ajaxSend", [xml, s]);
+			jQuery.event.trigger("ajaxSend", [xhr, s]);
 
 		// Wait for a response to come back
 		var onreadystatechange = function(isTimeout){
 			// The transfer is complete and the data is available, or the request timed out
-			if ( xml && (xml.readyState == 4 || isTimeout == "timeout") ) {
+			if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
 				requestDone = true;
-				var status;
-				try {
-					status = jQuery.httpSuccess( xml ) && isTimeout != "timeout" ?
-						s.ifModified && jQuery.httpNotModified( xml, s.url ) ? "notmodified" : "success" : "error";
-					// Make sure that the request was successful or notmodified
-					if ( status != "error" ) {
-						// Cache Last-Modified header, if ifModified mode.
-						var modRes;
-						try {
-							modRes = xml.getResponseHeader("Last-Modified");
-						} catch(e) {} // swallow exception thrown by FF if header is not available
-	
-						if ( s.ifModified && modRes )
-							jQuery.lastModified[s.url] = modRes;
-	
+
+				// clear poll interval
+				if (ival) {
+					clearInterval(ival);
+					ival = null;
+				}
+
+				status = isTimeout == "timeout" && "timeout" ||
+					!jQuery.httpSuccess( xhr ) && "error" ||
+					s.ifModified && jQuery.httpNotModified( xhr, s.url ) && "notmodified" ||
+					"success";
+
+				if ( status == "success" ) {
+					// Watch for, and catch, XML document parse errors
+					try {
 						// process the data (runs the xml through httpData regardless of callback)
-						var data = jQuery.httpData( xml, s.dataType );
-	
-						// If a local callback was specified, fire it and pass it the data
-						if ( s.success )
-							s.success( data, status );
-	
-						// Fire the global callback
-						if( s.global )
-							jQuery.event.trigger( "ajaxSuccess", [xml, s] );
-					} else
-						jQuery.handleError(s, xml, status);
-				} catch(e) {
-					status = "error";
-					jQuery.handleError(s, xml, status, e);
+						data = jQuery.httpData( xhr, s.dataType, s.dataFilter );
+					} catch(e) {
+						status = "parsererror";
+					}
 				}
 
-				// The request was completed
-				if( s.global )
-					jQuery.event.trigger( "ajaxComplete", [xml, s] );
+				// Make sure that the request was successful or notmodified
+				if ( status == "success" ) {
+					// Cache Last-Modified header, if ifModified mode.
+					var modRes;
+					try {
+						modRes = xhr.getResponseHeader("Last-Modified");
+					} catch(e) {} // swallow exception thrown by FF if header is not available
 
-				// Handle the global AJAX counter
-				if ( s.global && ! --jQuery.active )
-					jQuery.event.trigger( "ajaxStop" );
+					if ( s.ifModified && modRes )
+						jQuery.lastModified[s.url] = modRes;
 
-				// Process result
-				if ( s.complete )
-					s.complete(xml, status);
+					// JSONP handles its own success callback
+					if ( !jsonp )
+						success();
+				} else
+					jQuery.handleError(s, xhr, status);
 
+				// Fire the complete handlers
+				complete();
+
 				// Stop memory leaks
-				xml.onreadystatechange = function(){};
-				xml = null;
+				if ( s.async )
+					xhr = null;
 			}
 		};
-		xml.onreadystatechange = onreadystatechange;
 
-		// Timeout checker
-		if ( s.timeout > 0 )
-			setTimeout(function(){
-				// Check to see if the request is still happening
-				if ( xml ) {
-					// Cancel the request
-					xml.abort();
+		if ( s.async ) {
+			// don't attach the handler to the request, just poll it instead
+			var ival = setInterval(onreadystatechange, 13);
 
-					if( !requestDone )
-						onreadystatechange( "timeout" );
-				}
-			}, s.timeout);
-			
-		// save non-leaking reference 
-		var xml2 = xml;
+			// Timeout checker
+			if ( s.timeout > 0 )
+				setTimeout(function(){
+					// Check to see if the request is still happening
+					if ( xhr ) {
+						// Cancel the request
+						xhr.abort();
 
+						if( !requestDone )
+							onreadystatechange( "timeout" );
+					}
+				}, s.timeout);
+		}
+
 		// Send the data
 		try {
-			xml2.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();
-		
+
+		function success(){
+			// If a local callback was specified, fire it and pass it the data
+			if ( s.success )
+				s.success( data, status );
+
+			// Fire the global callback
+			if ( s.global )
+				jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
+		}
+
+		function complete(){
+			// Process result
+			if ( s.complete )
+				s.complete(xhr, status);
+
+			// The request was completed
+			if ( s.global )
+				jQuery.event.trigger( "ajaxComplete", [xhr, s] );
+
+			// Handle the global AJAX counter
+			if ( s.global && ! --jQuery.active )
+				jQuery.event.trigger( "ajaxStop" );
+		}
+
 		// return XMLHttpRequest to allow aborting the request etc.
-		return xml2;
+		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( "ajaxError", [xml, s, e] );
+			jQuery.event.trigger( "ajaxError", [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 {
-			return !r.status && location.protocol == "file:" ||
-				( r.status >= 200 && r.status < 300 ) || r.status == 304 ||
-				jQuery.browser.safari && r.status == undefined;
+			// IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
+			return !xhr.status && location.protocol == "file:" ||
+				( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223 ||
+				jQuery.browser.safari && xhr.status == undefined;
 		} catch(e){}
 		return false;
 	},
 
 	// Determines if an XMLHttpRequest returns NotModified
-	httpNotModified: function( xml, url ) {
+	httpNotModified: function( xhr, url ) {
 		try {
-			var xmlRes = xml.getResponseHeader("Last-Modified");
+			var xhrRes = xhr.getResponseHeader("Last-Modified");
 
 			// Firefox always returns 200. check Last-Modified date
-			return xml.status == 304 || xmlRes == jQuery.lastModified[url] ||
-				jQuery.browser.safari && xml.status == undefined;
+			return xhr.status == 304 || xhrRes == jQuery.lastModified[url] ||
+				jQuery.browser.safari && xhr.status == undefined;
 		} catch(e){}
 		return false;
 	},
 
-	/* Get the data out of an XMLHttpRequest.
-	 * Return parsed XML if content-type header is "xml" and type is "xml" or omitted,
-	 * otherwise return plain text.
-	 * (String) data - The type of data that you're expecting back,
-	 * (e.g. "xml", "html", "script")
-	 */
-	httpData: function( r, type ) {
-		var ct = r.getResponseHeader("content-type");
-		var data = !type && ct && ct.indexOf("xml") >= 0;
-		data = type == "xml" || data ? r.responseXML : r.responseText;
+	httpData: function( xhr, type, filter ) {
+		var ct = xhr.getResponseHeader("content-type"),
+			xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
+			data = xml ? xhr.responseXML : xhr.responseText;
 
+		if ( xml && data.documentElement.tagName == "parsererror" )
+			throw "parsererror";
+			
+		// Allow a pre-filtering function to sanitize the response
+		if( filter )
+			data = filter( data, type );
+
 		// If the type is "script", eval it in global context
 		if ( type == "script" )
 			jQuery.globalEval( data );
 
 		// Get the JavaScript object, if JSON is used.
 		if ( type == "json" )
-			eval( "data = " + data );
+			data = eval("(" + data + ")");
 
-		// evaluate scripts within html
-		if ( type == "html" )
-			jQuery("<div>").html(data).evalScripts();
-
 		return data;
 	},
 
@@ -4974,23 +2921,629 @@
 						s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) );
 					});
 				else
-					s.push( encodeURIComponent(j) + "=" + encodeURIComponent( a[j] ) );
+					s.push( encodeURIComponent(j) + "=" + encodeURIComponent( jQuery.isFunction(a[j]) ? a[j]() : a[j] ) );
 
 		// Return the resulting serialization
-		return s.join("&");
+		return s.join("&").replace(/%20/g, "+");
+	}
+
+});
+jQuery.fn.extend({
+	show: function(speed,callback){
+		return speed ?
+			this.animate({
+				height: "show", width: "show", opacity: "show"
+			}, speed, callback) :
+
+			this.filter(":hidden").each(function(){
+				this.style.display = this.oldblock || "";
+				if ( jQuery.css(this,"display") == "none" ) {
+					var elem = jQuery("<" + this.tagName + " />").appendTo("body");
+					this.style.display = elem.css("display");
+					// handle an edge condition where css is - div { display:none; } or similar
+					if (this.style.display == "none")
+						this.style.display = "block";
+					elem.remove();
+				}
+			}).end();
 	},
-	
-	// evalulates a script in global context
-	// not reliable for safari
-	globalEval: function( data ) {
-		if ( window.execScript )
-			window.execScript( data );
-		else if ( jQuery.browser.safari )
-			// safari doesn't provide a synchronous global eval
-			window.setTimeout( data, 0 );
-		else
-			eval.call( window, data );
+
+	hide: function(speed,callback){
+		return speed ?
+			this.animate({
+				height: "hide", width: "hide", opacity: "hide"
+			}, speed, callback) :
+
+			this.filter(":visible").each(function(){
+				this.oldblock = this.oldblock || jQuery.css(this,"display");
+				this.style.display = "none";
+			}).end();
+	},
+
+	// Save the old toggle function
+	_toggle: jQuery.fn.toggle,
+
+	toggle: function( fn, fn2 ){
+		return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
+			this._toggle.apply( this, arguments ) :
+			fn ?
+				this.animate({
+					height: "toggle", width: "toggle", opacity: "toggle"
+				}, fn, fn2) :
+				this.each(function(){
+					jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
+				});
+	},
+
+	slideDown: function(speed,callback){
+		return this.animate({height: "show"}, speed, callback);
+	},
+
+	slideUp: function(speed,callback){
+		return this.animate({height: "hide"}, speed, callback);
+	},
+
+	slideToggle: function(speed, callback){
+		return this.animate({height: "toggle"}, speed, callback);
+	},
+
+	fadeIn: function(speed, callback){
+		return this.animate({opacity: "show"}, speed, callback);
+	},
+
+	fadeOut: function(speed, callback){
+		return this.animate({opacity: "hide"}, 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 ? "each" : "queue" ](function(){
+			if ( this.nodeType != 1)
+				return false;
+
+			var opt = jQuery.extend({}, optall), p,
+				hidden = jQuery(this).is(":hidden"), self = this;
+
+			for ( p in prop ) {
+				if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
+					return opt.complete.call(this);
+
+				if ( p == "height" || p == "width" ) {
+					// Store display property
+					opt.display = jQuery.css(this, "display");
+
+					// Make sure that nothing sneaks out
+					opt.overflow = this.style.overflow;
+				}
+			}
+
+			if ( opt.overflow != null )
+				this.style.overflow = "hidden";
+
+			opt.curAnim = jQuery.extend({}, prop);
+
+			jQuery.each( prop, function(name, val){
+				var e = new jQuery.fx( self, opt, name );
+
+				if ( /toggle|show|hide/.test(val) )
+					e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
+				else {
+					var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
+						start = e.cur(true) || 0;
+
+					if ( parts ) {
+						var end = parseFloat(parts[2]),
+							unit = parts[3] || "px";
+
+						// We need to compute starting value
+						if ( unit != "px" ) {
+							self.style[ name ] = (end || 1) + unit;
+							start = ((end || 1) / e.cur(true)) * start;
+							self.style[ name ] = start + unit;
+						}
+
+						// If a +=/-= token was provided, we're doing a relative animation
+						if ( parts[1] )
+							end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
+
+						e.custom( start, end, unit );
+					} else
+						e.custom( start, val, "" );
+				}
+			});
+
+			// For JS strict compliance
+			return true;
+		});
+	},
+
+	queue: function(type, fn){
+		if ( jQuery.isFunction(type) || ( type && type.constructor == Array )) {
+			fn = type;
+			type = "fx";
+		}
+
+		if ( !type || (typeof type == "string" && !fn) )
+			return queue( this[0], type );
+
+		return this.each(function(){
+			if ( fn.constructor == Array )
+				queue(this, type, fn);
+			else {
+				queue(this, type).push( fn );
+
+				if ( queue(this, type).length == 1 )
+					fn.call(this);
+			}
+		});
+	},
+
+	stop: function(clearQueue, gotoEnd){
+		var timers = jQuery.timers;
+
+		if (clearQueue)
+			this.queue([]);
+
+		this.each(function(){
+			// go in reverse order so anything added to the queue during the loop is ignored
+			for ( var i = timers.length - 1; i >= 0; i-- )
+				if ( timers[i].elem == this ) {
+					if (gotoEnd)
+						// force the next step to be the last
+						timers[i](true);
+					timers.splice(i, 1);
+				}
+		});
+
+		// start the next in the queue if the last step wasn't forced
+		if (!gotoEnd)
+			this.dequeue();
+
+		return this;
 	}
 
 });
-}
+
+var queue = function( elem, type, array ) {
+	if ( elem ){
+
+		type = type || "fx";
+
+		var q = jQuery.data( elem, type + "queue" );
+
+		if ( !q || array )
+			q = jQuery.data( elem, type + "queue", jQuery.makeArray(array) );
+
+	}
+	return q;
+};
+
+jQuery.fn.dequeue = function(type){
+	type = type || "fx";
+
+	return this.each(function(){
+		var q = queue(this, type);
+
+		q.shift();
+
+		if ( q.length )
+			q[0].call( this );
+	});
+};
+
+jQuery.extend({
+
+	speed: function(speed, easing, fn) {
+		var opt = speed && speed.constructor == Object ? speed : {
+			complete: fn || !fn && easing ||
+				jQuery.isFunction( speed ) && speed,
+			duration: speed,
+			easing: fn && easing || easing && easing.constructor != Function && easing
+		};
+
+		opt.duration = (opt.duration && opt.duration.constructor == Number ?
+			opt.duration :
+			jQuery.fx.speeds[opt.duration]) || jQuery.fx.speeds.def;
+
+		// Queueing
+		opt.old = opt.complete;
+		opt.complete = function(){
+			if ( opt.queue !== false )
+				jQuery(this).dequeue();
+			if ( jQuery.isFunction( opt.old ) )
+				opt.old.call( this );
+		};
+
+		return opt;
+	},
+
+	easing: {
+		linear: function( p, n, firstNum, diff ) {
+			return firstNum + diff * p;
+		},
+		swing: function( p, n, firstNum, diff ) {
+			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
+		}
+	},
+
+	timers: [],
+	timerId: null,
+
+	fx: function( elem, options, prop ){
+		this.options = options;
+		this.elem = elem;
+		this.prop = prop;
+
+		if ( !options.orig )
+			options.orig = {};
+	}
+
+});
+
+jQuery.fx.prototype = {
+
+	// Simple function for setting a style value
+	update: function(){
+		if ( this.options.step )
+			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 == "height" || this.prop == "width" )
+			this.elem.style.display = "block";
+	},
+
+	// Get the current size
+	cur: function(force){
+		if ( this.elem[this.prop] != null && this.elem.style[this.prop] == null )
+			return this.elem[ this.prop ];
+
+		var r = parseFloat(jQuery.css(this.elem, this.prop, force));
+		return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
+	},
+
+	// Start an animation from one number to another
+	custom: function(from, to, unit){
+		this.startTime = now();
+		this.start = from;
+		this.end = to;
+		this.unit = unit || this.unit || "px";
+		this.now = this.start;
+		this.pos = this.state = 0;
+		this.update();
+
+		var self = this;
+		function t(gotoEnd){
+			return self.step(gotoEnd);
+		}
+
+		t.elem = this.elem;
+
+		jQuery.timers.push(t);
+
+		if ( jQuery.timerId == null ) {
+			jQuery.timerId = setInterval(function(){
+				var timers = jQuery.timers;
+
+				for ( var i = 0; i < timers.length; i++ )
+					if ( !timers[i]() )
+						timers.splice(i--, 1);
+
+				if ( !timers.length ) {
+					clearInterval( jQuery.timerId );
+					jQuery.timerId = null;
+				}
+			}, 13);
+		}
+	},
+
+	// Simple 'show' function
+	show: function(){
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
+		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 == "width" || this.prop == "height" )
+			this.elem.style[this.prop] = "1px";
+
+		// Start by showing the element
+		jQuery(this.elem).show();
+	},
+
+	// Simple 'hide' function
+	hide: function(){
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
+		this.options.hide = true;
+
+		// Begin the animation
+		this.custom(this.cur(), 0);
+	},
+
+	// Each step of an animation
+	step: function(gotoEnd){
+		var t = now();
+
+		if ( gotoEnd || t > this.options.duration + this.startTime ) {
+			this.now = this.end;
+			this.pos = this.state = 1;
+			this.update();
+
+			this.options.curAnim[ this.prop ] = true;
+
+			var done = true;
+			for ( var i in this.options.curAnim )
+				if ( this.options.curAnim[i] !== true )
+					done = false;
+
+			if ( done ) {
+				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, "display") == "none" )
+						this.elem.style.display = "block";
+				}
+
+				// Hide the element if the "hide" operation was done
+				if ( this.options.hide )
+					this.elem.style.display = "none";
+
+				// Reset the properties, if the item has been hidden or shown
+				if ( this.options.hide || this.options.show )
+					for ( var p in this.options.curAnim )
+						jQuery.attr(this.elem.style, p, this.options.orig[p]);
+			}
+
+			if ( done )
+				// Execute the complete function
+				this.options.complete.call( this.elem );
+
+			return false;
+		} else {
+			var n = t - this.startTime;
+			this.state = n / this.options.duration;
+
+			// Perform the easing function, defaults to swing
+			this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
+			this.now = this.start + ((this.end - this.start) * this.pos);
+
+			// Perform the next step of the animation
+			this.update();
+		}
+
+		return true;
+	}
+
+};
+
+jQuery.extend( jQuery.fx, {
+	speeds:{
+		slow: 600,
+ 		fast: 200,
+ 		// Default speed
+ 		def: 400
+	},
+	step: {
+		scrollLeft: function(fx){
+			fx.elem.scrollLeft = fx.now;
+		},
+
+		scrollTop: function(fx){
+			fx.elem.scrollTop = fx.now;
+		},
+
+		opacity: function(fx){
+			jQuery.attr(fx.elem.style, "opacity", fx.now);
+		},
+
+		_default: function(fx){
+			fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+		}
+	}
+});
+// 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 && parseInt(version) < 522 && !/adobeair/i.test(userAgent),
+		    css          = jQuery.curCSS,
+		    fixed        = css(elem, "position") == "fixed";
+
+		// 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 > 2 does not include the border on offset parents
+				// However Mozilla adds the border for table or table cells
+				if ( mozilla && !/^t(able|d|h)$/i.test(offsetParent.tagName) || safari && !safari2 )
+					border( offsetParent );
+
+				// Add the document scroll offsets if position is fixed on any offsetParent
+				if ( !fixed && css(offsetParent, "position") == "fixed" )
+					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 && parent.tagName && !/^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(css(parent, "display")) )
+					// Subtract parent scroll offsets
+					add( -parent.scrollLeft, -parent.scrollTop );
+
+				// Mozilla does not add the border for a parent that has overflow != visible
+				if ( mozilla && css(parent, "overflow") != "visible" )
+					border( parent );
+
+				// Get next parent
+				parent = parent.parentNode;
+			}
+
+			// Safari <= 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 && (fixed || css(offsetChild, "position") == "absolute")) ||
+				(mozilla && css(offsetChild, "position") != "absolute") )
+					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));
+		}
+
+		// Return an object with top and left properties
+		results = { top: top, left: left };
+	}
+
+	function border(elem) {
+		add( jQuery.curCSS(elem, "borderLeftWidth", true), jQuery.curCSS(elem, "borderTopWidth", true) );
+	}
+
+	function add(l, t) {
+		left += parseInt(l, 10) || 0;
+		top += parseInt(t, 10) || 0;
+	}
+
+	return results;
+};
+
+
+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 results;
+	},
+
+	offsetParent: function() {
+		var offsetParent = this[0].offsetParent;
+		while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
+			offsetParent = offsetParent.offsetParent;
+		return jQuery(offsetParent);
+	}
+});
+
+
+// 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;
+
+		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 && document.documentElement[ method ] ||
+					document.body[ method ] :
+				this[0][ method ];
+	};
+});
+// Create innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function(i, name){
+
+	var tl = i ? "Left"  : "Top",  // top or left
+		br = i ? "Right" : "Bottom"; // bottom or right
+
+	// innerHeight and innerWidth
+	jQuery.fn["inner" + name] = function(){
+		return this[ name.toLowerCase() ]() +
+			num(this, "padding" + tl) +
+			num(this, "padding" + br);
+	};
+
+	// outerHeight and outerWidth
+	jQuery.fn["outer" + name] = function(margin) {
+		return this["inner" + name]() +
+			num(this, "border" + tl + "Width") +
+			num(this, "border" + br + "Width") +
+			(margin ?
+				num(this, "margin" + tl) + num(this, "margin" + br) : 0);
+	};
+
+});})();

Modified: jquery.javascript/trunk/src/jquery/javascript/js/jquery.pack.js
===================================================================
--- jquery.javascript/trunk/src/jquery/javascript/js/jquery.pack.js	2008-12-15 21:16:58 UTC (rev 94087)
+++ jquery.javascript/trunk/src/jquery/javascript/js/jquery.pack.js	2008-12-15 22:17:37 UTC (rev 94088)
@@ -1 +1,11 @@
-eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('k(1A 1z.6=="Q"){1z.Q=1z.Q;u 6=l(a,c){k(1z==7)q 1p 6(a,c);a=a||11;k(6.1r(a))q 1p 6(11)[6.C.23?"23":"2F"](a);k(1A a=="21"){u m=/^[^<]*(<(.|\\n)+>)[^>]*$/.2C(a);k(m)a=6.3U([m[1]]);H q 1p 6(c).2n(a)}q 7.69(a.1i==2v&&a||(a.3e||a.G&&a!=1z&&!a.1Z&&a[0]!=Q&&a[0].1Z)&&6.3F(a)||[a])};k(1A $!="Q")6.2O$=$;u $=6;6.C=6.8I={3e:"@8l",8o:l(){q 7.G},G:0,2b:l(1O){q 1O==Q?6.3F(7):7[1O]},2m:l(a){u K=6(a);K.63=7;q K},69:l(a){7.G=0;[].1h.14(7,a);q 7},I:l(C,1t){q 6.I(7,C,1t)},2d:l(19){u 4I=-1;7.I(l(i){k(7==19)4I=i});q 4I},1D:l(1T,O,v){u 19=1T;k(1T.1i==3m)k(O==Q)q 7.G&&6[v||"1D"](7[0],1T)||Q;H{19={};19[1T]=O}q 7.I(l(2d){N(u F 1E 19)6.1D(v?7.1l:7,F,6.F(7,19[F],v,2d,F))})},1f:l
 (1T,O){q 7.1D(1T,O,"2P")},2A:l(e){k(1A e=="21")q 7.3j().3W(11.8q(e));u t="";6.I(e||7,l(){6.I(7.37,l(){k(7.1Z!=8)t+=7.1Z!=1?7.65:6.C.2A([7])})});q t},2D:l(){u a=6.3U(1w);q 7.I(l(){u b=a[0].3u(T);7.V.2U(b,7);22(b.18)b=b.18;b.4v(7)})},3W:l(){q 7.2W(1w,T,1,l(a){7.4v(a)})},5q:l(){q 7.2W(1w,T,-1,l(a){7.2U(a,7.18)})},5g:l(){q 7.2W(1w,12,1,l(a){7.V.2U(a,7)})},5h:l(){q 7.2W(1w,12,-1,l(a){7.V.2U(a,7.2g)})},4D:l(){q 7.63||6([])},2n:l(t){q 7.2m(6.2Q(7,l(a){q 6.2n(t,a)}),t)},4t:l(4E){q 7.2m(6.2Q(7,l(a){q a.3u(4E!=Q?4E:T)}))},1y:l(t){q 7.2m(6.1r(t)&&6.2k(7,l(2J,2d){q t.14(2J,[2d])})||6.3s(t,7))},2c:l(t){q 7.2m(t.1i==3m&&6.3s(t,7,T)||6.2k(7,l(a){q(t.1i==2v||t.3e)?6.3g(a,t)<0:a!=t}))},1H:l(t){q 7.2m(6.2i(7.2b(),t.1i==3m?6(t).2b():t.G!=Q&&(!t.1q||t.1q=="8r")?t:[t]))},46:l(1o){q 1o?6.1y(1o,7).r.G>0:12},17:l(17){q 17==Q?(7.G?7[0].O:1b):7.1D("O",17)},4R:l(17){q 17==Q?(7.G?7[0].2z:1b):7.3j().3W(17)},2W:l(1t,1P,3C,C){u 4t=7.G>1;u a=6.3U(1t);k(3C<0)a.8s();q 7.I(l(){u 19=7;k(1P&&6.1q(7,"1P")&&6.1q(
 a[0],"3T"))19=7.5F("20")[0]||7.4v(11.6h("20"));6.I(a,l(){C.14(19,[4t?7.3u(T):7])})})}};6.1u=6.C.1u=l(){u 1N=1w[0],a=1;k(1w.G==1){1N=7;a=0}u F;22(F=1w[a++])N(u i 1E F)1N[i]=F[i];q 1N};6.1u({8v:l(){k(6.2O$)$=6.2O$;q 6},1r:l(C){q!!C&&1A C!="21"&&1A C[0]=="Q"&&/l/i.1v(C+"")},1q:l(B,W){q B.1q&&B.1q.3I()==W.3I()},I:l(19,C,1t){k(19.G==Q)N(u i 1E 19)C.14(19[i],1t||[i,19[i]]);H N(u i=0,6m=19.G;i<6m;i++)k(C.14(19[i],1t||[i,19[i]])===12)4o;q 19},F:l(B,O,v,2d,F){k(6.1r(O))q O.3q(B,[2d]);u 6n=/z-?2d|7w-?7v|1a|66|8x-?28/i;k(O.1i==3M&&v=="2P"&&!6n.1v(F))q O+"4f";q O},15:{1H:l(B,c){6.I(c.3N(/\\s+/),l(i,M){k(!6.15.2R(B.15,M))B.15+=(B.15?" ":"")+M})},2f:l(B,c){B.15=c?6.2k(B.15.3N(/\\s+/),l(M){q!6.15.2R(c,M)}).55(" "):""},2R:l(t,c){t=t.15||t;q t&&1p 4l("(^|\\\\s)"+c+"(\\\\s|$)").1v(t)}},44:l(e,o,f){N(u i 1E o){e.1l["1K"+i]=e.1l[i];e.1l[i]=o[i]}f.14(e,[]);N(u i 1E o)e.1l[i]=e.1l["1K"+i]},1f:l(e,p){k(p=="28"||p=="3Y"){u 1K={},40,3f,d=["7I","8z","8A","8B"];6.I(d,l(){1K["8C"+7]=0;1K["8E"+7+"8F"]=0
 });6.44(e,1K,l(){k(6.1f(e,"1e")!="1S"){40=e.6D;3f=e.70}H{e=6(e.3u(T)).2n(":4g").5i("2T").4D().1f({4e:"1G",3X:"6q",1e:"2t",8H:"0",6r:"0"}).5e(e.V)[0];u 3c=6.1f(e.V,"3X");k(3c==""||3c=="43")e.V.1l.3X="6s";40=e.6t;3f=e.6u;k(3c==""||3c=="43")e.V.1l.3X="43";e.V.3a(e)}});q p=="28"?40:3f}q 6.2P(e,p)},2P:l(B,F,4Z){u K;k(F=="1a"&&6.U.1k)q 6.1D(B.1l,"1a");k(F=="4L"||F=="2u")F=6.U.1k?"3P":"2u";k(!4Z&&B.1l[F])K=B.1l[F];H k(11.3V&&11.3V.45){k(F=="2u"||F=="3P")F="4L";F=F.1U(/([A-Z])/g,"-$1").4Q();u M=11.3V.45(B,1b);k(M)K=M.53(F);H k(F=="1e")K="1S";H 6.44(B,{1e:"2t"},l(){u c=11.3V.45(7,"");K=c&&c.53(F)||""})}H k(B.4T){u 54=F.1U(/\\-(\\w)/g,l(m,c){q c.3I()});K=B.4T[F]||B.4T[54]}q K},3U:l(a){u r=[];6.I(a,l(i,1L){k(!1L)q;k(1L.1i==3M)1L=1L.8m();k(1A 1L=="21"){u s=6.33(1L),1Y=11.6h("1Y"),2a=[];u 2D=!s.16("<1n")&&[1,"<3S>","</3S>"]||(!s.16("<6x")||!s.16("<20")||!s.16("<6z"))&&[1,"<1P>","</1P>"]||!s.16("<3T")&&[2,"<1P><20>","</20></1P>"]||(!s.16("<6A")||!s.16("<6C"))&&[3,"<1P><20><3T>","</3T></20
 ></1P>"]||[0,"",""];1Y.2z=2D[1]+s+2D[2];22(2D[0]--)1Y=1Y.18;k(6.U.1k){k(!s.16("<1P")&&s.16("<20")<0)2a=1Y.18&&1Y.18.37;H k(2D[1]=="<1P>"&&s.16("<20")<0)2a=1Y.37;N(u n=2a.G-1;n>=0;--n)k(6.1q(2a[n],"20")&&!2a[n].37.G)2a[n].V.3a(2a[n])}1L=1Y.37}k(1L.G===0)q;k(1L[0]==Q)r.1h(1L);H r=6.2i(r,1L)});q r},1D:l(B,W,O){u 2q={"N":"6F","6G":"15","4L":6.U.1k?"3P":"2u",2u:6.U.1k?"3P":"2u",2z:"2z",15:"15",O:"O",2S:"2S",2T:"2T",6J:"6K",2Y:"2Y"};k(W=="1a"&&6.U.1k&&O!=Q){B.66=1;q B.1y=B.1y.1U(/4H\\([^\\)]*\\)/6L,"")+(O==1?"":"4H(1a="+O*57+")")}H k(W=="1a"&&6.U.1k)q B.1y?49(B.1y.6M(/4H\\(1a=(.*)\\)/)[1])/57:1;k(W=="1a"&&6.U.2X&&O==1)O=0.7X;k(2q[W]){k(O!=Q)B[2q[W]]=O;q B[2q[W]]}H k(O==Q&&6.U.1k&&6.1q(B,"5z")&&(W=="6P"||W=="7V"))q B.6R(W).65;H k(B.6S){k(O!=Q)B.7R(W,O);q B.3A(W)}H{W=W.1U(/-([a-z])/7Q,l(z,b){q b.3I()});k(O!=Q)B[W]=O;q B[W]}},33:l(t){q t.1U(/^\\s+|\\s+$/g,"")},3F:l(a){u r=[];k(a.1i!=2v)N(u i=0,2s=a.G;i<2s;i++)r.1h(a[i]);H r=a.3G(0);q r},3g:l(b,a){N(u i=0,2s=a.G;i<2s;i++)k(a[i]==b)q i
 ;q-1},2i:l(2x,3K){u r=[].3G.3q(2x,0);N(u i=0,60=3K.G;i<60;i++)k(6.3g(3K[i],r)==-1)2x.1h(3K[i]);q 2x},2k:l(1R,C,48){k(1A C=="21")C=1p 4M("a","i","q "+C);u 1d=[];N(u i=0,2J=1R.G;i<2J;i++)k(!48&&C(1R[i],i)||48&&!C(1R[i],i))1d.1h(1R[i]);q 1d},2Q:l(1R,C){k(1A C=="21")C=1p 4M("a","q "+C);u 1d=[],r=[];N(u i=0,2J=1R.G;i<2J;i++){u 17=C(1R[i],i);k(17!==1b&&17!=Q){k(17.1i!=2v)17=[17];1d=1d.6Y(17)}}u r=1d.G?[1d[0]]:[];5d:N(u i=1,5R=1d.G;i<5R;i++){N(u j=0;j<i;j++)k(1d[i]==r[j])5A 5d;r.1h(1d[i])}q r}});1p l(){u b=7H.71.4Q();6.U={2H:/5P/.1v(b),38:/38/.1v(b),1k:/1k/.1v(b)&&!/38/.1v(b),2X:/2X/.1v(b)&&!/(73|5P)/.1v(b)};6.74=!6.U.1k||11.75=="7B"};6.I({5o:"a.V",4q:"6.4q(a)",77:"6.24(a,2,\'2g\')",7z:"6.24(a,2,\'5n\')",78:"6.2E(a.V.18,a)",7a:"6.2E(a.18)"},l(i,n){6.C[i]=l(a){u K=6.2Q(7,n);k(a&&1A a=="21")K=6.3s(a,K);q 7.2m(K)}});6.I({5e:"3W",7c:"5q",2U:"5g",7e:"5h"},l(i,n){6.C[i]=l(){u a=1w;q 7.I(l(){N(u j=0,2s=a.G;j<2s;j++)6(a[j])[n](7)})}});6.I({5i:l(1T){6.1D(7,1T,"");7.7g(1T)},7h:l(c){6.15.1H(7
 ,c)},7i:l(c){6.15.2f(7,c)},7k:l(c){6.15[6.15.2R(7,c)?"2f":"1H"](7,c)},2f:l(a){k(!a||6.1y(a,[7]).r.G)7.V.3a(7)},3j:l(){22(7.18)7.3a(7.18)}},l(i,n){6.C[i]=l(){q 7.I(n,1w)}});6.I(["5m","5k","5l","5r"],l(i,n){6.C[n]=l(1O,C){q 7.1y(":"+n+"("+1O+")",C)}});6.I(["28","3Y"],l(i,n){6.C[n]=l(h){q h==Q?(7.G?6.1f(7[0],n):1b):7.1f(n,h.1i==3m?h:h+"4f")}});6.1u({1o:{"":"m[2]==\'*\'||6.1q(a,m[2])","#":"a.3A(\'3Z\')==m[2]",":":{5k:"i<m[3]-0",5l:"i>m[3]-0",24:"m[3]-0==i",5m:"m[3]-0==i",2x:"i==0",2Z:"i==r.G-1",5L:"i%2==0",5M:"i%2","24-3i":"6.24(a.V.18,m[3],\'2g\',a)==a","2x-3i":"6.24(a.V.18,1,\'2g\')==a","2Z-3i":"6.24(a.V.7m,1,\'5n\')==a","7n-3i":"6.2E(a.V.18).G==1",5o:"a.18",3j:"!a.18",5r:"6.C.2A.14([a]).16(m[3])>=0",3b:\'a.v!="1G"&&6.1f(a,"1e")!="1S"&&6.1f(a,"4e")!="1G"\',1G:\'a.v=="1G"||6.1f(a,"1e")=="1S"||6.1f(a,"4e")=="1G"\',7p:"!a.2S",2S:"a.2S",2T:"a.2T",2Y:"a.2Y||6.1D(a,\'2Y\')",2A:"a.v==\'2A\'",4g:"a.v==\'4g\'",58:"a.v==\'58\'",42:"a.v==\'42\'",59:"a.v==\'59\'",4P:"a.v==\'4P\'",5v:"a.v=
 =\'5v\'",5w:"a.v==\'5w\'",3r:\'a.v=="3r"||6.1q(a,"3r")\',5x:"/5x|3S|7r|3r/i.1v(a.1q)"},".":"6.15.2R(a,m[2])","@":{"=":"z==m[4]","!=":"z!=m[4]","^=":"z&&!z.16(m[4])","$=":"z&&z.30(z.G - m[4].G,m[4].G)==m[4]","*=":"z&&z.16(m[4])>=0","":"z",4V:l(m){q["",m[1],m[3],m[2],m[5]]},5J:"z=a[m[3]]||6.1D(a,m[3]);"},"[":"6.2n(m[2],a).G"},5H:[/^\\[ *(@)([a-2l-3w-]*) *([!*$^=]*) *(\'?"?)(.*?)\\4 *\\]/i,/^(\\[)\\s*(.*?(\\[.*?\\])?[^[]*?)\\s*\\]/,/^(:)([a-2l-3w-]*)\\("?\'?(.*?(\\(.*?\\))?[^(]*?)"?\'?\\)/i,/^([:.#]*)([a-2l-3w*-]*)/i],1M:[/^(\\/?\\.\\.)/,"a.V",/^(>|\\/)/,"6.2E(a.18)",/^(\\+)/,"6.24(a,2,\'2g\')",/^(~)/,l(a){u s=6.2E(a.V.18);q s.3G(0,6.3g(a,s))}],3s:l(1o,1R,2c){u 1K,M=[];22(1o&&1o!=1K){1K=1o;u f=6.1y(1o,1R,2c);1o=f.t.1U(/^\\s*,\\s*/,"");M=2c?1R=f.r:6.2i(M,f.r)}q M},2n:l(t,1s){k(1A t!="21")q[t];k(1s&&!1s.1Z)1s=1b;1s=1s||11;k(!t.16("//")){1s=1s.4y;t=t.30(2,t.G)}H k(!t.16("/")){1s=1s.4y;t=t.30(1,t.G);k(t.16("/")>=1)t=t.30(t.16("/"),t.G)}u K=[1s],29=[],2Z=1b;22(t&&2Z!=t){u r=[];2Z=t;
 t=6.33(t).1U(/^\\/\\//i,"");u 3v=12;u 1B=/^[\\/>]\\s*([a-2l-9*-]+)/i;u m=1B.2C(t);k(m){6.I(K,l(){N(u c=7.18;c;c=c.2g)k(c.1Z==1&&(6.1q(c,m[1])||m[1]=="*"))r.1h(c)});K=r;t=t.1U(1B,"");k(t.16(" ")==0)5A;3v=T}H{N(u i=0;i<6.1M.G;i+=2){u 1B=6.1M[i];u m=1B.2C(t);k(m){r=K=6.2Q(K,6.1r(6.1M[i+1])?6.1M[i+1]:l(a){q 41(6.1M[i+1])});t=6.33(t.1U(1B,""));3v=T;4o}}}k(t&&!3v){k(!t.16(",")){k(K[0]==1s)K.4s();6.2i(29,K);r=K=[1s];t=" "+t.30(1,t.G)}H{u 32=/^([a-2l-3w-]+)(#)([a-2l-9\\\\*2O-]*)/i;u m=32.2C(t);k(m){m=[0,m[2],m[3],m[1]]}H{32=/^([#.]?)([a-2l-9\\\\*2O-]*)/i;m=32.2C(t)}k(m[1]=="#"&&K[K.G-1].4N){u 3x=K[K.G-1].4N(m[2]);K=r=3x&&(!m[3]||6.1q(3x,m[3]))?[3x]:[]}H{k(m[1]==".")u 4i=1p 4l("(^|\\\\s)"+m[2]+"(\\\\s|$)");6.I(K,l(){u 3z=m[1]!=""||m[0]==""?"*":m[2];k(6.1q(7,"7u")&&3z=="*")3z="39";6.2i(r,m[1]!=""&&K.G!=1?6.4p(7,[],m[1],m[2],4i):7.5F(3z))});k(m[1]=="."&&K.G==1)r=6.2k(r,l(e){q 4i.1v(e.15)});k(m[1]=="#"&&K.G==1){u 5G=r;r=[];6.I(5G,l(){k(7.3A("3Z")==m[2]){r=[7];q 12}})}K=r}t=t.1U(32,"")}}
 k(t){u 17=6.1y(t,r);K=r=17.r;t=6.33(17.t)}}k(K&&K[0]==1s)K.4s();6.2i(29,K);q 29},1y:l(t,r,2c){22(t&&/^[a-z[({<*:.#]/i.1v(t)){u p=6.5H,m;6.I(p,l(i,1B){m=1B.2C(t);k(m){t=t.7x(m[0].G);k(6.1o[m[1]].4V)m=6.1o[m[1]].4V(m);q 12}});k(m[1]==":"&&m[2]=="2c")r=6.1y(m[3],r,T).r;H k(m[1]=="."){u 1B=1p 4l("(^|\\\\s)"+m[2]+"(\\\\s|$)");r=6.2k(r,l(e){q 1B.1v(e.15||"")},2c)}H{u f=6.1o[m[1]];k(1A f!="21")f=6.1o[m[1]][m[2]];41("f = l(a,i){"+(6.1o[m[1]].5J||"")+"q "+f+"}");r=6.2k(r,f,2c)}}q{r:r,t:t}},4p:l(o,r,1M,W,1B){N(u s=o.18;s;s=s.2g)k(s.1Z==1){u 1H=T;k(1M==".")1H=s.15&&1B.1v(s.15);H k(1M=="#")1H=s.3A("3Z")==W;k(1H)r.1h(s);k(1M=="#"&&r.G)4o;k(s.18)6.4p(s,r,1M,W,1B)}q r},4q:l(B){u 4C=[];u M=B.V;22(M&&M!=11){4C.1h(M);M=M.V}q 4C},24:l(M,1d,3C,B){1d=1d||1;u 1O=0;N(;M;M=M[3C]){k(M.1Z==1)1O++;k(1O==1d||1d=="5L"&&1O%2==0&&1O>1&&M==B||1d=="5M"&&1O%2==1&&M==B)q M}},2E:l(n,B){u r=[];N(;n;n=n.2g){k(n.1Z==1&&(!B||n!=B))r.1h(n)}q r}});6.E={1H:l(R,v,1m,D){k(6.U.1k&&R.4b!=Q)R=1z;k(D)1m.D=D;k(!1m.2h)1m.2h=
 7.2h++;k(!R.1J)R.1J={};u 35=R.1J[v];k(!35){35=R.1J[v]={};k(R["3E"+v])35[0]=R["3E"+v]}35[1m.2h]=1m;R["3E"+v]=7.5S;k(!7.1g[v])7.1g[v]=[];7.1g[v].1h(R)},2h:1,1g:{},2f:l(R,v,1m){k(R.1J)k(v&&v.v)4u R.1J[v.v][v.1m.2h];H k(v&&R.1J[v])k(1m)4u R.1J[v][1m.2h];H N(u i 1E R.1J[v])4u R.1J[v][i];H N(u j 1E R.1J)7.2f(R,j)},1Q:l(v,D,R){D=6.3F(D||[]);k(!R)6.I(7.1g[v]||[],l(){6.E.1Q(v,D,7)});H{u 1m=R["3E"+v],17,C=6.1r(R[v]);k(1m){D.5T(7.2q({v:v,1N:R}));k((17=1m.14(R,D))!==12)7.4w=T}k(C&&17!==12)R[v]();7.4w=12}},5S:l(E){k(1A 6=="Q"||6.E.4w)q;E=6.E.2q(E||1z.E||{});u 3L;u c=7.1J[E.v];u 1t=[].3G.3q(1w,1);1t.5T(E);N(u j 1E c){1t[0].1m=c[j];1t[0].D=c[j].D;k(c[j].14(7,1t)===12){E.2o();E.2y();3L=12}}k(6.U.1k)E.1N=E.2o=E.2y=E.1m=E.D=1b;q 3L},2q:l(E){k(!E.1N&&E.5U)E.1N=E.5U;k(E.5V==Q&&E.5Y!=Q){u e=11.4y,b=11.7G;E.5V=E.5Y+(e.5Z||b.5Z);E.7K=E.7L+(e.61||b.61)}k(6.U.2H&&E.1N.1Z==3){u 36=E;E=6.1u({},36);E.1N=36.1N.V;E.2o=l(){q 36.2o()};E.2y=l(){q 36.2y()}}k(!E.2o)E.2o=l(){7.3L=12};k(!E.2y)E.2y=l(){7.7O=T};q
  E}};6.C.1u({3Q:l(v,D,C){q 7.I(l(){6.E.1H(7,v,C||D,D)})},6o:l(v,D,C){q 7.I(l(){6.E.1H(7,v,l(E){6(7).64(E);q(C||D).14(7,1w)},D)})},64:l(v,C){q 7.I(l(){6.E.2f(7,v,C)})},1Q:l(v,D){q 7.I(l(){6.E.1Q(v,D,7)})},3p:l(){u a=1w;q 7.6b(l(e){7.4F=7.4F==0?1:0;e.2o();q a[7.4F].14(7,[e])||12})},7S:l(f,g){l 4J(e){u p=(e.v=="3R"?e.7T:e.7W)||e.7Y;22(p&&p!=7)2B{p=p.V}2w(e){p=7};k(p==7)q 12;q(e.v=="3R"?f:g).14(7,[e])}q 7.3R(4J).6c(4J)},23:l(f){k(6.3O)f.14(11,[6]);H{6.2V.1h(l(){q f.14(7,[6])})}q 7}});6.1u({3O:12,2V:[],23:l(){k(!6.3O){6.3O=T;k(6.2V){6.I(6.2V,l(){7.14(11)});6.2V=1b}k(6.U.2X||6.U.38)11.80("6f",6.23,12)}}});1p l(){6.I(("81,82,2F,83,84,4Y,6b,85,"+"86,87,88,3R,6c,8a,3S,"+"4P,8c,8e,8f,2K").3N(","),l(i,o){6.C[o]=l(f){q f?7.3Q(o,f):7.1Q(o)}});k(6.U.2X||6.U.38)11.8g("6f",6.23,12);H k(6.U.1k){11.8h("<8i"+"8k 3Z=62 8p=T "+"4B=//:><\\/2e>");u 2e=11.4N("62");k(2e)2e.2p=l(){k(7.3y!="1X")q;7.V.3a(7);6.23()};2e=1b}H k(6.U.2H)6.4W=4b(l(){k(11.3y=="8t"||11.3y=="1X"){5u(6.4W);6.4W=1b;6.23()}},10);6
 .E.1H(1z,"2F",6.23)};k(6.U.1k)6(1z).6o("4Y",l(){u 1g=6.E.1g;N(u v 1E 1g){u 4X=1g[v],i=4X.G;k(i&&v!=\'4Y\')6p 6.E.2f(4X[i-1],v);22(--i)}});6.C.1u({1I:l(P,J){u 1G=7.1y(":1G");P?1G.27({28:"1I",3Y:"1I",1a:"1I"},P,J):1G.I(l(){7.1l.1e=7.2L?7.2L:"";k(6.1f(7,"1e")=="1S")7.1l.1e="2t"});q 7},1C:l(P,J){u 3b=7.1y(":3b");P?3b.27({28:"1C",3Y:"1C",1a:"1C"},P,J):3b.I(l(){7.2L=7.2L||6.1f(7,"1e");k(7.2L=="1S")7.2L="2t";7.1l.1e="1S"});q 7},52:6.C.3p,3p:l(C,4S){u 1t=1w;q 6.1r(C)&&6.1r(4S)?7.52(C,4S):7.I(l(){6(7)[6(7).46(":1G")?"1I":"1C"].14(6(7),1t)})},6w:l(P,J){q 7.27({28:"1I"},P,J)},6y:l(P,J){q 7.27({28:"1C"},P,J)},6B:l(P,J){q 7.I(l(){u 56=6(7).46(":1G")?"1I":"1C";6(7).27({28:56},P,J)})},6E:l(P,J){q 7.27({1a:"1I"},P,J)},6H:l(P,J){q 7.27({1a:"1C"},P,J)},6I:l(P,3n,J){q 7.27({1a:3n},P,J)},27:l(F,P,1j,J){q 7.1F(l(){7.2r=6.1u({},F);u 1n=6.P(P,1j,J);N(u p 1E F){u e=1p 6.31(7,1n,p);k(F[p].1i==3M)e.2M(e.M(),F[p]);H e[F[p]](F)}})},1F:l(v,C){k(!C){C=v;v="31"}q 7.I(l(){k(!7.1F)7.1F={};k(!7.1F[v])7.1F[v]
 =[];7.1F[v].1h(C);k(7.1F[v].G==1)C.14(7)})}});6.1u({P:l(P,1j,C){u 1n=P&&P.1i==6N?P:{1X:C||!C&&1j||6.1r(P)&&P,25:P,1j:C&&1j||1j&&1j.1i!=4M&&1j};1n.25=(1n.25&&1n.25.1i==3M?1n.25:{6T:6V,6W:51}[1n.25])||6X;1n.1K=1n.1X;1n.1X=l(){6.5W(7,"31");k(6.1r(1n.1K))1n.1K.14(7)};q 1n},1j:{},1F:{},5W:l(B,v){v=v||"31";k(B.1F&&B.1F[v]){B.1F[v].4s();u f=B.1F[v][0];k(f)f.14(B)}},31:l(B,1c,F){u z=7;u y=B.1l;u 4h=6.1f(B,"1e");y.1e="2t";y.5y="1G";z.a=l(){k(1c.3t)1c.3t.14(B,[z.2j]);k(F=="1a")6.1D(y,"1a",z.2j);H k(5f(z.2j))y[F]=5f(z.2j)+"4f"};z.5j=l(){q 49(6.1f(B,F))};z.M=l(){u r=49(6.2P(B,F));q r&&r>-7f?r:z.5j()};z.2M=l(4c,3n){z.4m=(1p 5s()).5t();z.2j=4c;z.a();z.47=4b(l(){z.3t(4c,3n)},13)};z.1I=l(){k(!B.1x)B.1x={};B.1x[F]=7.M();1c.1I=T;z.2M(0,B.1x[F]);k(F!="1a")y[F]="5p"};z.1C=l(){k(!B.1x)B.1x={};B.1x[F]=7.M();1c.1C=T;z.2M(B.1x[F],0)};z.3p=l(){k(!B.1x)B.1x={};B.1x[F]=7.M();k(4h=="1S"){1c.1I=T;k(F!="1a")y[F]="5p";z.2M(0,B.1x[F])}H{1c.1C=T;z.2M(B.1x[F],0)}};z.3t=l(34,3D){u t=(1p 5s()).5t();k(t>1c.25+z
 .4m){5u(z.47);z.47=1b;z.2j=3D;z.a();k(B.2r)B.2r[F]=T;u 29=T;N(u i 1E B.2r)k(B.2r[i]!==T)29=12;k(29){y.5y="";y.1e=4h;k(6.1f(B,"1e")=="1S")y.1e="2t";k(1c.1C)y.1e="1S";k(1c.1C||1c.1I)N(u p 1E B.2r)k(p=="1a")6.1D(y,p,B.1x[p]);H y[p]=""}k(29&&6.1r(1c.1X))1c.1X.14(B)}H{u n=t-7.4m;u p=n/1c.25;z.2j=1c.1j&&6.1j[1c.1j]?6.1j[1c.1j](p,n,34,(3D-34),1c.25):((-5K.7A(p*5K.7C)/2)+0.5)*(3D-34)+34;z.a()}}}});6.C.1u({7D:l(S,1W,J){7.2F(S,1W,J,1)},2F:l(S,1W,J,1V){k(6.1r(S))q 7.3Q("2F",S);J=J||l(){};u v="6k";k(1W)k(6.1r(1W)){J=1W;1W=1b}H{1W=6.39(1W);v="6e"}u 4x=7;6.3d({S:S,v:v,D:1W,1V:1V,1X:l(2I,Y){k(Y=="2G"||!1V&&Y=="5I")4x.1D("2z",2I.3J).4U().I(J,[2I.3J,Y,2I]);H J.14(4x,[2I.3J,Y,2I])}});q 7},7J:l(){q 6.39(7)},4U:l(){q 7.2n("2e").I(l(){k(7.4B)6.6d(7.4B);H 6.4d(7.2A||7.7N||7.2z||"")}).4D()}});k(!1z.3o)3o=l(){q 1p 7P("7U.7Z")};6.I("6a,5Q,5O,6g,5N,5D".3N(","),l(i,o){6.C[o]=l(f){q 7.3Q(o,f)}});6.1u({2b:l(S,D,J,v,1V){k(6.1r(D)){J=D;D=1b}q 6.3d({S:S,D:D,2G:J,4r:v,1V:1V})},89:l(S,D,J,v){q 6.2b(S,D,J,v,1
 )},6d:l(S,J){q 6.2b(S,1b,J,"2e")},8b:l(S,D,J){q 6.2b(S,D,J,"68")},8d:l(S,D,J,v){k(6.1r(D)){J=D;D={}}q 6.3d({v:"6e",S:S,D:D,2G:J,4r:v})},8j:l(26){6.3H.26=26},8n:l(6j){6.1u(6.3H,6j)},3H:{1g:T,v:"6k",26:0,5a:"8u/x-8w-5z-8D",50:T,4G:T,D:1b},3k:{},3d:l(s){s=6.1u({},6.3H,s);k(s.D){k(s.50&&1A s.D!="21")s.D=6.39(s.D);k(s.v.4Q()=="2b")s.S+=((s.S.16("?")>-1)?"&":"?")+s.D}k(s.1g&&!6.4O++)6.E.1Q("6a");u 4z=12;u L=1p 3o();L.6O(s.v,s.S,s.4G);k(s.D)L.3h("6Q-6U",s.5a);k(s.1V)L.3h("6Z-4A-72",6.3k[s.S]||"76, 79 7b 7d 4a:4a:4a 7j");L.3h("X-7l-7o","3o");k(L.7q)L.3h("7s","7t");k(s.5B)s.5B(L);k(s.1g)6.E.1Q("5D",[L,s]);u 2p=l(4k){k(L&&(L.3y==4||4k=="26")){4z=T;u Y;2B{Y=6.6l(L)&&4k!="26"?s.1V&&6.6i(L,s.S)?"5I":"2G":"2K";k(Y!="2K"){u 3B;2B{3B=L.4j("67-4A")}2w(e){}k(s.1V&&3B)6.3k[s.S]=3B;u D=6.5E(L,s.4r);k(s.2G)s.2G(D,Y);k(s.1g)6.E.1Q("5N",[L,s])}H 6.3l(s,L,Y)}2w(e){Y="2K";6.3l(s,L,Y,e)}k(s.1g)6.E.1Q("5O",[L,s]);k(s.1g&&!--6.4O)6.E.1Q("5Q");k(s.1X)s.1X(L,Y);L.2p=l(){};L=1b}};L.2p=2p;k(s.26>0)5c(l(){k
 (L){L.7F();k(!4z)2p("26")}},s.26);u 4K=L;2B{4K.7M(s.D)}2w(e){6.3l(s,L,1b,e)}k(!s.4G)2p();q 4K},3l:l(s,L,Y,e){k(s.2K)s.2K(L,Y,e);k(s.1g)6.E.1Q("6g",[L,s,e])},4O:0,6l:l(r){2B{q!r.Y&&8y.8G=="42:"||(r.Y>=51&&r.Y<6v)||r.Y==5b||6.U.2H&&r.Y==Q}2w(e){}q 12},6i:l(L,S){2B{u 5X=L.4j("67-4A");q L.Y==5b||5X==6.3k[S]||6.U.2H&&L.Y==Q}2w(e){}q 12},5E:l(r,v){u 4n=r.4j("7y-v");u D=!v&&4n&&4n.16("L")>=0;D=v=="L"||D?r.7E:r.3J;k(v=="2e")6.4d(D);k(v=="68")41("D = "+D);k(v=="4R")6("<1Y>").4R(D).4U();q D},39:l(a){u s=[];k(a.1i==2v||a.3e)6.I(a,l(){s.1h(2N(7.W)+"="+2N(7.O))});H N(u j 1E a)k(a[j]&&a[j].1i==2v)6.I(a[j],l(){s.1h(2N(j)+"="+2N(7))});H s.1h(2N(j)+"="+2N(a[j]));q s.55("&")},4d:l(D){k(1z.5C)1z.5C(D);H k(6.U.2H)1z.5c(D,0);H 41.3q(1z,D)}})}',62,541,'||||||jQuery|this|||||||||||||if|function|||||return||||var|type||||||elem|fn|data|event|prop|length|else|each|callback|ret|xml|cur|for|value|speed|undefined|element|url|true|browser|parentNode|name||status|||document|false||apply|className|indexOf
 |val|firstChild|obj|opacity|null|options|result|display|css|global|push|constructor|easing|msie|style|handler|opt|expr|new|nodeName|isFunction|context|args|extend|test|arguments|orig|filter|window|typeof|re|hide|attr|in|queue|hidden|add|show|events|old|arg|token|target|num|table|trigger|elems|none|key|replace|ifModified|params|complete|div|nodeType|tbody|string|while|ready|nth|duration|timeout|animate|height|done|tb|get|not|index|script|remove|nextSibling|guid|merge|now|grep|z0|pushStack|find|preventDefault|onreadystatechange|fix|curAnim|al|block|cssFloat|Array|catch|first|stopPropagation|innerHTML|text|try|exec|wrap|sibling|load|success|safari|res|el|error|oldblock|custom|encodeURIComponent|_|curCSS|map|has|disabled|checked|insertBefore|readyList|domManip|mozilla|selected|last|substr|fx|re2|trim|firstNum|handlers|originalEvent|childNodes|opera|param|removeChild|visible|parPos|ajax|jquery|oWidth|inArray|setRequestHeader|child|empty|lastModified|handleError|String|to|XMLHttpR
 equest|toggle|call|button|multiFilter|step|cloneNode|foundToken|9_|oid|readyState|tag|getAttribute|modRes|dir|lastNum|on|makeArray|slice|ajaxSettings|toUpperCase|responseText|second|returnValue|Number|split|isReady|styleFloat|bind|mouseover|select|tr|clean|defaultView|append|position|width|id|oHeight|eval|file|static|swap|getComputedStyle|is|timer|inv|parseFloat|00|setInterval|from|globalEval|visibility|px|radio|oldDisplay|rec|getResponseHeader|isTimeout|RegExp|startTime|ct|break|getAll|parents|dataType|shift|clone|delete|appendChild|triggered|self|documentElement|requestDone|Modified|src|matched|end|deep|lastToggle|async|alpha|pos|handleHover|xml2|float|Function|getElementById|active|submit|toLowerCase|html|fn2|currentStyle|evalScripts|_resort|safariTimer|els|unload|force|processData|200|_toggle|getPropertyValue|newProp|join|state|100|checkbox|password|contentType|304|setTimeout|check|appendTo|parseInt|before|after|removeAttr|max|lt|gt|eq|previousSibling|parent|1px|prepend|
 contains|Date|getTime|clearInterval|image|reset|input|overflow|form|continue|beforeSend|execScript|ajaxSend|httpData|getElementsByTagName|tmp|parse|notmodified|_prefix|Math|even|odd|ajaxSuccess|ajaxComplete|webkit|ajaxStop|rl|handle|unshift|srcElement|pageX|dequeue|xmlRes|clientX|scrollLeft|sl|scrollTop|__ie_init|prevObject|unbind|nodeValue|zoom|Last|json|setArray|ajaxStart|click|mouseout|getScript|POST|DOMContentLoaded|ajaxError|createElement|httpNotModified|settings|GET|httpSuccess|ol|exclude|one|do|absolute|left|relative|clientHeight|clientWidth|300|slideDown|thead|slideUp|tfoot|td|slideToggle|th|offsetHeight|fadeIn|htmlFor|class|fadeOut|fadeTo|readonly|readOnly|gi|match|Object|open|action|Content|getAttributeNode|tagName|slow|Type|600|fast|400|concat|If|offsetWidth|userAgent|Since|compatible|boxModel|compatMode|Thu|next|siblings|01|children|Jan|prependTo|1970|insertAfter|10000|removeAttribute|addClass|removeClass|GMT|toggleClass|Requested|lastChild|only|With|enabled|over
 rideMimeType|textarea|Connection|close|object|weight|font|substring|content|prev|cos|CSS1Compat|PI|loadIfModified|responseXML|abort|body|navigator|Top|serialize|pageY|clientY|send|textContent|cancelBubble|ActiveXObject|ig|setAttribute|hover|fromElement|Microsoft|method|toElement|9999|relatedTarget|XMLHTTP|removeEventListener|blur|focus|resize|scroll|dblclick|mousedown|mouseup|mousemove|getIfModified|change|getJSON|keydown|post|keypress|keyup|addEventListener|write|scr|ajaxTimeout|ipt|VERSION|toString|ajaxSetup|size|defer|createTextNode|FORM|reverse|loaded|application|noConflict|www|line|location|Bottom|Right|Left|padding|urlencoded|border|Width|protocol|right|prototype'.split('|'),0,{}))
+/*
+ * jQuery 1.2.6 - New Wave Javascript
+ *
+ * Copyright (c) 2008 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
+ * $Rev: 5685 $
+ */
+eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(H(){J w=1b.4M,3m$=1b.$;J D=1b.4M=1b.$=H(a,b){I 2B D.17.5j(a,b)};J u=/^[^<]*(<(.|\\s)+>)[^>]*$|^#(\\w+)$/,62=/^.[^:#\\[\\.]*$/,12;D.17=D.44={5j:H(d,b){d=d||S;G(d.16){7[0]=d;7.K=1;I 7}G(1j d=="23"){J c=u.2D(d);G(c&&(c[1]||!b)){G(c[1])d=D.4h([c[1]],b);N{J a=S.61(c[3]);G(a){G(a.2v!=c[3])I D().2q(d);I D(a)}d=[]}}N I D(b).2q(d)}N G(D.1D(d))I D(S)[D.17.27?"27":"43"](d);I 7.6Y(D.2d(d))},5w:"1.2.6",8G:H(){I 7.K},K:0,3p:H(a){I a==12?D.2d(7):7[a]},2I:H(b){J a=D(b);a.5n=7;I a},6Y:H(a){7.K=0;2p.44.1p.1w(7,a);I 7},P:H(a,b){I D.P(7,a,b)},5i:H(b){J a=-1;I D.2L(b&&b.5w?b[0]:b,7)},1K:H(c,a,b){J d=c;G(c.1q==56)G(a===12)I 7[0]&&D[b||"1K"](7[0],c);N{d={};d[c]=a}I 7.P(H(i){R(
 c 1n d)D.1K(b?7.V:7,c,D.1i(7,d[c],b,i,c))})},1g:H(b,a){G((b==\'2h\'||b==\'1Z\')&&3d(a)<0)a=12;I 7.1K(b,a,"2a")},1r:H(b){G(1j b!="49"&&b!=U)I 7.4E().3v((7[0]&&7[0].2z||S).5F(b));J a="";D.P(b||7,H(){D.P(7.3t,H(){G(7.16!=8)a+=7.16!=1?7.76:D.17.1r([7])})});I a},5z:H(b){G(7[0])D(b,7[0].2z).5y().39(7[0]).2l(H(){J a=7;1B(a.1x)a=a.1x;I a}).3v(7);I 7},8Y:H(a){I 7.P(H(){D(7).6Q().5z(a)})},8R:H(a){I 7.P(H(){D(7).5z(a)})},3v:H(){I 7.3W(19,M,Q,H(a){G(7.16==1)7.3U(a)})},6F:H(){I 7.3W(19,M,M,H(a){G(7.16==1)7.39(a,7.1x)})},6E:H(){I 7.3W(19,Q,Q,H(a){7.1d.39(a,7)})},5q:H(){I 7.3W(19,Q,M,H(a){7.1d.39(a,7.2H)})},3l:H(){I 7.5n||D([])},2q:H(b){J c=D.2l(7,H(a){I D.2q(b,a)});I 7.2I(/[^+>] [^+>]/.11(b)||b.1h("..")>-1?D.4r(c):c)},5y:H(e){J f=7.2l(H(){G(D.14.1f&&!D.4n(7)){J a=7.6o(M),5h=S.3h("1v");5h.3U(a);I D.4h([5h.4H])[0]}N I 7.6o(M)});J d=f.2q("*").5c().P(H(){G(7[E]!=12)7[E]=U});G(e===M)7.2q("*").5c().P(H(i){G(7.16==3)I;J c=D.L(7,"3w");R(J a 1n c)R(J b 1n c[a])D.W.1e(d[i],a,c[a][b],c[a][b].L)});I 
 f},1E:H(b){I 7.2I(D.1D(b)&&D.3C(7,H(a,i){I b.1k(a,i)})||D.3g(b,7))},4Y:H(b){G(b.1q==56)G(62.11(b))I 7.2I(D.3g(b,7,M));N b=D.3g(b,7);J a=b.K&&b[b.K-1]!==12&&!b.16;I 7.1E(H(){I a?D.2L(7,b)<0:7!=b})},1e:H(a){I 7.2I(D.4r(D.2R(7.3p(),1j a==\'23\'?D(a):D.2d(a))))},3F:H(a){I!!a&&D.3g(a,7).K>0},7T:H(a){I 7.3F("."+a)},6e:H(b){G(b==12){G(7.K){J c=7[0];G(D.Y(c,"2A")){J e=c.64,63=[],15=c.15,2V=c.O=="2A-2V";G(e<0)I U;R(J i=2V?e:0,2f=2V?e+1:15.K;i<2f;i++){J d=15[i];G(d.2W){b=D.14.1f&&!d.at.2x.an?d.1r:d.2x;G(2V)I b;63.1p(b)}}I 63}N I(7[0].2x||"").1o(/\\r/g,"")}I 12}G(b.1q==4L)b+=\'\';I 7.P(H(){G(7.16!=1)I;G(b.1q==2p&&/5O|5L/.11(7.O))7.4J=(D.2L(7.2x,b)>=0||D.2L(7.34,b)>=0);N G(D.Y(7,"2A")){J a=D.2d(b);D("9R",7).P(H(){7.2W=(D.2L(7.2x,a)>=0||D.2L(7.1r,a)>=0)});G(!a.K)7.64=-1}N 7.2x=b})},2K:H(a){I a==12?(7[0]?7[0].4H:U):7.4E().3v(a)},7b:H(a){I 7.5q(a).21()},79:H(i){I 7.3s(i,i+1)},3s:H(){I 7.2I(2p.44.3s.1w(7,19))},2l:H(b){I 7.2I(D.2l(7,H(a,i){I b.1k(a,i,a)}))},5c:H(){I 7.1e(7.5n)},L:H(d,b){J a=
 d.1R(".");a[1]=a[1]?"."+a[1]:"";G(b===12){J c=7.5C("9z"+a[1]+"!",[a[0]]);G(c===12&&7.K)c=D.L(7[0],d);I c===12&&a[1]?7.L(a[0]):c}N I 7.1P("9u"+a[1]+"!",[a[0],b]).P(H(){D.L(7,d,b)})},3b:H(a){I 7.P(H(){D.3b(7,a)})},3W:H(g,f,h,d){J e=7.K>1,3x;I 7.P(H(){G(!3x){3x=D.4h(g,7.2z);G(h)3x.9o()}J b=7;G(f&&D.Y(7,"1T")&&D.Y(3x[0],"4F"))b=7.3H("22")[0]||7.3U(7.2z.3h("22"));J c=D([]);D.P(3x,H(){J a=e?D(7).5y(M)[0]:7;G(D.Y(a,"1m"))c=c.1e(a);N{G(a.16==1)c=c.1e(D("1m",a).21());d.1k(b,a)}});c.P(6T)})}};D.17.5j.44=D.17;H 6T(i,a){G(a.4d)D.3Y({1a:a.4d,31:Q,1O:"1m"});N D.5u(a.1r||a.6O||a.4H||"");G(a.1d)a.1d.37(a)}H 1z(){I+2B 8J}D.1l=D.17.1l=H(){J b=19[0]||{},i=1,K=19.K,4x=Q,15;G(b.1q==8I){4x=b;b=19[1]||{};i=2}G(1j b!="49"&&1j b!="H")b={};G(K==i){b=7;--i}R(;i<K;i++)G((15=19[i])!=U)R(J c 1n 15){J a=b[c],2w=15[c];G(b===2w)6M;G(4x&&2w&&1j 2w=="49"&&!2w.16)b[c]=D.1l(4x,a||(2w.K!=U?[]:{}),2w);N G(2w!==12)b[c]=2w}I b};J E="4M"+1z(),6K=0,5r={},6G=/z-?5i|8B-?8A|1y|6B|8v-?1Z/i,3P=S.3P||{};D.1l({8u:H(a){1b.$=
 3m$;G(a)1b.4M=w;I D},1D:H(a){I!!a&&1j a!="23"&&!a.Y&&a.1q!=2p&&/^[\\s[]?H/.11(a+"")},4n:H(a){I a.1C&&!a.1c||a.2j&&a.2z&&!a.2z.1c},5u:H(a){a=D.3k(a);G(a){J b=S.3H("6w")[0]||S.1C,1m=S.3h("1m");1m.O="1r/4t";G(D.14.1f)1m.1r=a;N 1m.3U(S.5F(a));b.39(1m,b.1x);b.37(1m)}},Y:H(b,a){I b.Y&&b.Y.2r()==a.2r()},1Y:{},L:H(c,d,b){c=c==1b?5r:c;J a=c[E];G(!a)a=c[E]=++6K;G(d&&!D.1Y[a])D.1Y[a]={};G(b!==12)D.1Y[a][d]=b;I d?D.1Y[a][d]:a},3b:H(c,b){c=c==1b?5r:c;J a=c[E];G(b){G(D.1Y[a]){2U D.1Y[a][b];b="";R(b 1n D.1Y[a])1X;G(!b)D.3b(c)}}N{1U{2U c[E]}1V(e){G(c.5l)c.5l(E)}2U D.1Y[a]}},P:H(d,a,c){J e,i=0,K=d.K;G(c){G(K==12){R(e 1n d)G(a.1w(d[e],c)===Q)1X}N R(;i<K;)G(a.1w(d[i++],c)===Q)1X}N{G(K==12){R(e 1n d)G(a.1k(d[e],e,d[e])===Q)1X}N R(J b=d[0];i<K&&a.1k(b,i,b)!==Q;b=d[++i]){}}I d},1i:H(b,a,c,i,d){G(D.1D(a))a=a.1k(b,i);I a&&a.1q==4L&&c=="2a"&&!6G.11(d)?a+"2X":a},1F:{1e:H(c,b){D.P((b||"").1R(/\\s+/),H(i,a){G(c.16==1&&!D.1F.3T(c.1F,a))c.1F+=(c.1F?" ":"")+a})},21:H(c,b){G(c.16==1)c.1F=b!=12?D.3C(c.1F.1R
 (/\\s+/),H(a){I!D.1F.3T(b,a)}).6s(" "):""},3T:H(b,a){I D.2L(a,(b.1F||b).6r().1R(/\\s+/))>-1}},6q:H(b,c,a){J e={};R(J d 1n c){e[d]=b.V[d];b.V[d]=c[d]}a.1k(b);R(J d 1n c)b.V[d]=e[d]},1g:H(d,e,c){G(e=="2h"||e=="1Z"){J b,3X={30:"5x",5g:"1G",18:"3I"},35=e=="2h"?["5e","6k"]:["5G","6i"];H 5b(){b=e=="2h"?d.8f:d.8c;J a=0,2C=0;D.P(35,H(){a+=3d(D.2a(d,"57"+7,M))||0;2C+=3d(D.2a(d,"2C"+7+"4b",M))||0});b-=29.83(a+2C)}G(D(d).3F(":4j"))5b();N D.6q(d,3X,5b);I 29.2f(0,b)}I D.2a(d,e,c)},2a:H(f,l,k){J e,V=f.V;H 3E(b){G(!D.14.2k)I Q;J a=3P.54(b,U);I!a||a.52("3E")==""}G(l=="1y"&&D.14.1f){e=D.1K(V,"1y");I e==""?"1":e}G(D.14.2G&&l=="18"){J d=V.50;V.50="0 7Y 7W";V.50=d}G(l.1I(/4i/i))l=y;G(!k&&V&&V[l])e=V[l];N G(3P.54){G(l.1I(/4i/i))l="4i";l=l.1o(/([A-Z])/g,"-$1").3y();J c=3P.54(f,U);G(c&&!3E(f))e=c.52(l);N{J g=[],2E=[],a=f,i=0;R(;a&&3E(a);a=a.1d)2E.6h(a);R(;i<2E.K;i++)G(3E(2E[i])){g[i]=2E[i].V.18;2E[i].V.18="3I"}e=l=="18"&&g[2E.K-1]!=U?"2F":(c&&c.52(l))||"";R(i=0;i<g.K;i++)G(g[i]!=U)2E[i].V.18=g[i]}
 G(l=="1y"&&e=="")e="1"}N G(f.4g){J h=l.1o(/\\-(\\w)/g,H(a,b){I b.2r()});e=f.4g[l]||f.4g[h];G(!/^\\d+(2X)?$/i.11(e)&&/^\\d/.11(e)){J j=V.1A,66=f.65.1A;f.65.1A=f.4g.1A;V.1A=e||0;e=V.aM+"2X";V.1A=j;f.65.1A=66}}I e},4h:H(l,h){J k=[];h=h||S;G(1j h.3h==\'12\')h=h.2z||h[0]&&h[0].2z||S;D.P(l,H(i,d){G(!d)I;G(d.1q==4L)d+=\'\';G(1j d=="23"){d=d.1o(/(<(\\w+)[^>]*?)\\/>/g,H(b,a,c){I c.1I(/^(aK|4f|7E|aG|4T|7A|aB|3n|az|ay|av)$/i)?b:a+"></"+c+">"});J f=D.3k(d).3y(),1v=h.3h("1v");J e=!f.1h("<au")&&[1,"<2A 7w=\'7w\'>","</2A>"]||!f.1h("<ar")&&[1,"<7v>","</7v>"]||f.1I(/^<(aq|22|am|ak|ai)/)&&[1,"<1T>","</1T>"]||!f.1h("<4F")&&[2,"<1T><22>","</22></1T>"]||(!f.1h("<af")||!f.1h("<ad"))&&[3,"<1T><22><4F>","</4F></22></1T>"]||!f.1h("<7E")&&[2,"<1T><22></22><7q>","</7q></1T>"]||D.14.1f&&[1,"1v<1v>","</1v>"]||[0,"",""];1v.4H=e[1]+d+e[2];1B(e[0]--)1v=1v.5T;G(D.14.1f){J g=!f.1h("<1T")&&f.1h("<22")<0?1v.1x&&1v.1x.3t:e[1]=="<1T>"&&f.1h("<22")<0?1v.3t:[];R(J j=g.K-1;j>=0;--j)G(D.Y(g[j],"22")&&!g[j].3t.K)g[j]
 .1d.37(g[j]);G(/^\\s/.11(d))1v.39(h.5F(d.1I(/^\\s*/)[0]),1v.1x)}d=D.2d(1v.3t)}G(d.K===0&&(!D.Y(d,"3V")&&!D.Y(d,"2A")))I;G(d[0]==12||D.Y(d,"3V")||d.15)k.1p(d);N k=D.2R(k,d)});I k},1K:H(d,f,c){G(!d||d.16==3||d.16==8)I 12;J e=!D.4n(d),40=c!==12,1f=D.14.1f;f=e&&D.3X[f]||f;G(d.2j){J g=/5Q|4d|V/.11(f);G(f=="2W"&&D.14.2k)d.1d.64;G(f 1n d&&e&&!g){G(40){G(f=="O"&&D.Y(d,"4T")&&d.1d)7p"O a3 a1\'t 9V 9U";d[f]=c}G(D.Y(d,"3V")&&d.7i(f))I d.7i(f).76;I d[f]}G(1f&&e&&f=="V")I D.1K(d.V,"9T",c);G(40)d.9Q(f,""+c);J h=1f&&e&&g?d.4G(f,2):d.4G(f);I h===U?12:h}G(1f&&f=="1y"){G(40){d.6B=1;d.1E=(d.1E||"").1o(/7f\\([^)]*\\)/,"")+(3r(c)+\'\'=="9L"?"":"7f(1y="+c*7a+")")}I d.1E&&d.1E.1h("1y=")>=0?(3d(d.1E.1I(/1y=([^)]*)/)[1])/7a)+\'\':""}f=f.1o(/-([a-z])/9H,H(a,b){I b.2r()});G(40)d[f]=c;I d[f]},3k:H(a){I(a||"").1o(/^\\s+|\\s+$/g,"")},2d:H(b){J a=[];G(b!=U){J i=b.K;G(i==U||b.1R||b.4I||b.1k)a[0]=b;N 1B(i)a[--i]=b[i]}I a},2L:H(b,a){R(J i=0,K=a.K;i<K;i++)G(a[i]===b)I i;I-1},2R:H(a,b){J i=0,T,2S=a.K;G(D.14.1f
 ){1B(T=b[i++])G(T.16!=8)a[2S++]=T}N 1B(T=b[i++])a[2S++]=T;I a},4r:H(a){J c=[],2o={};1U{R(J i=0,K=a.K;i<K;i++){J b=D.L(a[i]);G(!2o[b]){2o[b]=M;c.1p(a[i])}}}1V(e){c=a}I c},3C:H(c,a,d){J b=[];R(J i=0,K=c.K;i<K;i++)G(!d!=!a(c[i],i))b.1p(c[i]);I b},2l:H(d,a){J c=[];R(J i=0,K=d.K;i<K;i++){J b=a(d[i],i);G(b!=U)c[c.K]=b}I c.7d.1w([],c)}});J v=9B.9A.3y();D.14={5B:(v.1I(/.+(?:9y|9x|9w|9v)[\\/: ]([\\d.]+)/)||[])[1],2k:/75/.11(v),2G:/2G/.11(v),1f:/1f/.11(v)&&!/2G/.11(v),42:/42/.11(v)&&!/(9s|75)/.11(v)};J y=D.14.1f?"7o":"72";D.1l({71:!D.14.1f||S.70=="6Z",3X:{"R":"9n","9k":"1F","4i":y,72:y,7o:y,9h:"9f",9e:"9d",9b:"99"}});D.P({6W:H(a){I a.1d},97:H(a){I D.4S(a,"1d")},95:H(a){I D.3a(a,2,"2H")},91:H(a){I D.3a(a,2,"4l")},8Z:H(a){I D.4S(a,"2H")},8X:H(a){I D.4S(a,"4l")},8W:H(a){I D.5v(a.1d.1x,a)},8V:H(a){I D.5v(a.1x)},6Q:H(a){I D.Y(a,"8U")?a.8T||a.8S.S:D.2d(a.3t)}},H(c,d){D.17[c]=H(b){J a=D.2l(7,d);G(b&&1j b=="23")a=D.3g(b,a);I 7.2I(D.4r(a))}});D.P({6P:"3v",8Q:"6F",39:"6E",8P:"5q",8O:"7b"},H(c,b
 ){D.17[c]=H(){J a=19;I 7.P(H(){R(J i=0,K=a.K;i<K;i++)D(a[i])[b](7)})}});D.P({8N:H(a){D.1K(7,a,"");G(7.16==1)7.5l(a)},8M:H(a){D.1F.1e(7,a)},8L:H(a){D.1F.21(7,a)},8K:H(a){D.1F[D.1F.3T(7,a)?"21":"1e"](7,a)},21:H(a){G(!a||D.1E(a,[7]).r.K){D("*",7).1e(7).P(H(){D.W.21(7);D.3b(7)});G(7.1d)7.1d.37(7)}},4E:H(){D(">*",7).21();1B(7.1x)7.37(7.1x)}},H(a,b){D.17[a]=H(){I 7.P(b,19)}});D.P(["6N","4b"],H(i,c){J b=c.3y();D.17[b]=H(a){I 7[0]==1b?D.14.2G&&S.1c["5t"+c]||D.14.2k&&1b["5s"+c]||S.70=="6Z"&&S.1C["5t"+c]||S.1c["5t"+c]:7[0]==S?29.2f(29.2f(S.1c["4y"+c],S.1C["4y"+c]),29.2f(S.1c["2i"+c],S.1C["2i"+c])):a==12?(7.K?D.1g(7[0],b):U):7.1g(b,a.1q==56?a:a+"2X")}});H 25(a,b){I a[0]&&3r(D.2a(a[0],b,M),10)||0}J C=D.14.2k&&3r(D.14.5B)<8H?"(?:[\\\\w*3m-]|\\\\\\\\.)":"(?:[\\\\w\\8F-\\8E*3m-]|\\\\\\\\.)",6L=2B 4v("^>\\\\s*("+C+"+)"),6J=2B 4v("^("+C+"+)(#)("+C+"+)"),6I=2B 4v("^([#.]?)("+C+"*)");D.1l({6H:{"":H(a,i,m){I m[2]=="*"||D.Y(a,m[2])},"#":H(a,i,m){I a.4G("2v")==m[2]},":":{8D:H(a,i,m){I i<m[3]-0},8
 C:H(a,i,m){I i>m[3]-0},3a:H(a,i,m){I m[3]-0==i},79:H(a,i,m){I m[3]-0==i},3o:H(a,i){I i==0},3S:H(a,i,m,r){I i==r.K-1},6D:H(a,i){I i%2==0},6C:H(a,i){I i%2},"3o-4u":H(a){I a.1d.3H("*")[0]==a},"3S-4u":H(a){I D.3a(a.1d.5T,1,"4l")==a},"8z-4u":H(a){I!D.3a(a.1d.5T,2,"4l")},6W:H(a){I a.1x},4E:H(a){I!a.1x},8y:H(a,i,m){I(a.6O||a.8x||D(a).1r()||"").1h(m[3])>=0},4j:H(a){I"1G"!=a.O&&D.1g(a,"18")!="2F"&&D.1g(a,"5g")!="1G"},1G:H(a){I"1G"==a.O||D.1g(a,"18")=="2F"||D.1g(a,"5g")=="1G"},8w:H(a){I!a.3R},3R:H(a){I a.3R},4J:H(a){I a.4J},2W:H(a){I a.2W||D.1K(a,"2W")},1r:H(a){I"1r"==a.O},5O:H(a){I"5O"==a.O},5L:H(a){I"5L"==a.O},5p:H(a){I"5p"==a.O},3Q:H(a){I"3Q"==a.O},5o:H(a){I"5o"==a.O},6A:H(a){I"6A"==a.O},6z:H(a){I"6z"==a.O},2s:H(a){I"2s"==a.O||D.Y(a,"2s")},4T:H(a){I/4T|2A|6y|2s/i.11(a.Y)},3T:H(a,i,m){I D.2q(m[3],a).K},8t:H(a){I/h\\d/i.11(a.Y)},8s:H(a){I D.3C(D.3O,H(b){I a==b.T}).K}}},6x:[/^(\\[) *@?([\\w-]+) *([!*$^~=]*) *(\'?"?)(.*?)\\4 *\\]/,/^(:)([\\w-]+)\\("?\'?(.*?(\\(.*?\\))?[^(]*?)"?\'?\\)/,
 2B 4v("^([:.#]*)("+C+"+)")],3g:H(a,c,b){J d,1t=[];1B(a&&a!=d){d=a;J f=D.1E(a,c,b);a=f.t.1o(/^\\s*,\\s*/,"");1t=b?c=f.r:D.2R(1t,f.r)}I 1t},2q:H(t,o){G(1j t!="23")I[t];G(o&&o.16!=1&&o.16!=9)I[];o=o||S;J d=[o],2o=[],3S,Y;1B(t&&3S!=t){J r=[];3S=t;t=D.3k(t);J l=Q,3j=6L,m=3j.2D(t);G(m){Y=m[1].2r();R(J i=0;d[i];i++)R(J c=d[i].1x;c;c=c.2H)G(c.16==1&&(Y=="*"||c.Y.2r()==Y))r.1p(c);d=r;t=t.1o(3j,"");G(t.1h(" ")==0)6M;l=M}N{3j=/^([>+~])\\s*(\\w*)/i;G((m=3j.2D(t))!=U){r=[];J k={};Y=m[2].2r();m=m[1];R(J j=0,3i=d.K;j<3i;j++){J n=m=="~"||m=="+"?d[j].2H:d[j].1x;R(;n;n=n.2H)G(n.16==1){J g=D.L(n);G(m=="~"&&k[g])1X;G(!Y||n.Y.2r()==Y){G(m=="~")k[g]=M;r.1p(n)}G(m=="+")1X}}d=r;t=D.3k(t.1o(3j,""));l=M}}G(t&&!l){G(!t.1h(",")){G(o==d[0])d.4s();2o=D.2R(2o,d);r=d=[o];t=" "+t.6v(1,t.K)}N{J h=6J;J m=h.2D(t);G(m){m=[0,m[2],m[3],m[1]]}N{h=6I;m=h.2D(t)}m[2]=m[2].1o(/\\\\/g,"");J f=d[d.K-1];G(m[1]=="#"&&f&&f.61&&!D.4n(f)){J p=f.61(m[2]);G((D.14.1f||D.14.2G)&&p&&1j p.2v=="23"&&p.2v!=m[2])p=D(\'[@2v="\'+m[2]+\
 '"]\',f)[0];d=r=p&&(!m[3]||D.Y(p,m[3]))?[p]:[]}N{R(J i=0;d[i];i++){J a=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];G(a=="*"&&d[i].Y.3y()=="49")a="3n";r=D.2R(r,d[i].3H(a))}G(m[1]==".")r=D.5m(r,m[2]);G(m[1]=="#"){J e=[];R(J i=0;r[i];i++)G(r[i].4G("2v")==m[2]){e=[r[i]];1X}r=e}d=r}t=t.1o(h,"")}}G(t){J b=D.1E(t,r);d=r=b.r;t=D.3k(b.t)}}G(t)d=[];G(d&&o==d[0])d.4s();2o=D.2R(2o,d);I 2o},5m:H(r,m,a){m=" "+m+" ";J c=[];R(J i=0;r[i];i++){J b=(" "+r[i].1F+" ").1h(m)>=0;G(!a&&b||a&&!b)c.1p(r[i])}I c},1E:H(t,r,h){J d;1B(t&&t!=d){d=t;J p=D.6x,m;R(J i=0;p[i];i++){m=p[i].2D(t);G(m){t=t.8r(m[0].K);m[2]=m[2].1o(/\\\\/g,"");1X}}G(!m)1X;G(m[1]==":"&&m[2]=="4Y")r=62.11(m[3])?D.1E(m[3],r,M).r:D(r).4Y(m[3]);N G(m[1]==".")r=D.5m(r,m[2],h);N G(m[1]=="["){J g=[],O=m[3];R(J i=0,3i=r.K;i<3i;i++){J a=r[i],z=a[D.3X[m[2]]||m[2]];G(z==U||/5Q|4d|2W/.11(m[2]))z=D.1K(a,m[2])||\'\';G((O==""&&!!z||O=="="&&z==m[5]||O=="!="&&z!=m[5]||O=="^="&&z&&!z.1h(m[5])||O=="$="&&z.6v(z.K-m[5].K)==m[5]||(O=="*="||O=="~=")&
 &z.1h(m[5])>=0)^h)g.1p(a)}r=g}N G(m[1]==":"&&m[2]=="3a-4u"){J e={},g=[],11=/(-?)(\\d*)n((?:\\+|-)?\\d*)/.2D(m[3]=="6D"&&"2n"||m[3]=="6C"&&"2n+1"||!/\\D/.11(m[3])&&"8q+"+m[3]||m[3]),3o=(11[1]+(11[2]||1))-0,d=11[3]-0;R(J i=0,3i=r.K;i<3i;i++){J j=r[i],1d=j.1d,2v=D.L(1d);G(!e[2v]){J c=1;R(J n=1d.1x;n;n=n.2H)G(n.16==1)n.4q=c++;e[2v]=M}J b=Q;G(3o==0){G(j.4q==d)b=M}N G((j.4q-d)%3o==0&&(j.4q-d)/3o>=0)b=M;G(b^h)g.1p(j)}r=g}N{J f=D.6H[m[1]];G(1j f=="49")f=f[m[2]];G(1j f=="23")f=6u("Q||H(a,i){I "+f+";}");r=D.3C(r,H(a,i){I f(a,i,m,r)},h)}}I{r:r,t:t}},4S:H(b,c){J a=[],1t=b[c];1B(1t&&1t!=S){G(1t.16==1)a.1p(1t);1t=1t[c]}I a},3a:H(a,e,c,b){e=e||1;J d=0;R(;a;a=a[c])G(a.16==1&&++d==e)1X;I a},5v:H(n,a){J r=[];R(;n;n=n.2H){G(n.16==1&&n!=a)r.1p(n)}I r}});D.W={1e:H(f,i,g,e){G(f.16==3||f.16==8)I;G(D.14.1f&&f.4I)f=1b;G(!g.24)g.24=7.24++;G(e!=12){J h=g;g=7.3M(h,H(){I h.1w(7,19)});g.L=e}J j=D.L(f,"3w")||D.L(f,"3w",{}),1H=D.L(f,"1H")||D.L(f,"1H",H(){G(1j D!="12"&&!D.W.5k)I D.W.1H.1w(19.3L.T,19)});1H.T
 =f;D.P(i.1R(/\\s+/),H(c,b){J a=b.1R(".");b=a[0];g.O=a[1];J d=j[b];G(!d){d=j[b]={};G(!D.W.2t[b]||D.W.2t[b].4p.1k(f)===Q){G(f.3K)f.3K(b,1H,Q);N G(f.6t)f.6t("4o"+b,1H)}}d[g.24]=g;D.W.26[b]=M});f=U},24:1,26:{},21:H(e,h,f){G(e.16==3||e.16==8)I;J i=D.L(e,"3w"),1L,5i;G(i){G(h==12||(1j h=="23"&&h.8p(0)=="."))R(J g 1n i)7.21(e,g+(h||""));N{G(h.O){f=h.2y;h=h.O}D.P(h.1R(/\\s+/),H(b,a){J c=a.1R(".");a=c[0];G(i[a]){G(f)2U i[a][f.24];N R(f 1n i[a])G(!c[1]||i[a][f].O==c[1])2U i[a][f];R(1L 1n i[a])1X;G(!1L){G(!D.W.2t[a]||D.W.2t[a].4A.1k(e)===Q){G(e.6p)e.6p(a,D.L(e,"1H"),Q);N G(e.6n)e.6n("4o"+a,D.L(e,"1H"))}1L=U;2U i[a]}}})}R(1L 1n i)1X;G(!1L){J d=D.L(e,"1H");G(d)d.T=U;D.3b(e,"3w");D.3b(e,"1H")}}},1P:H(h,c,f,g,i){c=D.2d(c);G(h.1h("!")>=0){h=h.3s(0,-1);J a=M}G(!f){G(7.26[h])D("*").1e([1b,S]).1P(h,c)}N{G(f.16==3||f.16==8)I 12;J b,1L,17=D.1D(f[h]||U),W=!c[0]||!c[0].32;G(W){c.6h({O:h,2J:f,32:H(){},3J:H(){},4C:1z()});c[0][E]=M}c[0].O=h;G(a)c[0].6m=M;J d=D.L(f,"1H");G(d)b=d.1w(f,c);G((!17||(D.Y(f,
 \'a\')&&h=="4V"))&&f["4o"+h]&&f["4o"+h].1w(f,c)===Q)b=Q;G(W)c.4s();G(i&&D.1D(i)){1L=i.1w(f,b==U?c:c.7d(b));G(1L!==12)b=1L}G(17&&g!==Q&&b!==Q&&!(D.Y(f,\'a\')&&h=="4V")){7.5k=M;1U{f[h]()}1V(e){}}7.5k=Q}I b},1H:H(b){J a,1L,38,5f,4m;b=19[0]=D.W.6l(b||1b.W);38=b.O.1R(".");b.O=38[0];38=38[1];5f=!38&&!b.6m;4m=(D.L(7,"3w")||{})[b.O];R(J j 1n 4m){J c=4m[j];G(5f||c.O==38){b.2y=c;b.L=c.L;1L=c.1w(7,19);G(a!==Q)a=1L;G(1L===Q){b.32();b.3J()}}}I a},6l:H(b){G(b[E]==M)I b;J d=b;b={8o:d};J c="8n 8m 8l 8k 2s 8j 47 5d 6j 5E 8i L 8h 8g 4K 2y 5a 59 8e 8b 58 6f 8a 88 4k 87 86 84 6d 2J 4C 6c O 82 81 35".1R(" ");R(J i=c.K;i;i--)b[c[i]]=d[c[i]];b[E]=M;b.32=H(){G(d.32)d.32();d.80=Q};b.3J=H(){G(d.3J)d.3J();d.7Z=M};b.4C=b.4C||1z();G(!b.2J)b.2J=b.6d||S;G(b.2J.16==3)b.2J=b.2J.1d;G(!b.4k&&b.4K)b.4k=b.4K==b.2J?b.6c:b.4K;G(b.58==U&&b.5d!=U){J a=S.1C,1c=S.1c;b.58=b.5d+(a&&a.2e||1c&&1c.2e||0)-(a.6b||0);b.6f=b.6j+(a&&a.2c||1c&&1c.2c||0)-(a.6a||0)}G(!b.35&&((b.47||b.47===0)?b.47:b.5a))b.35=b.47||b.5a;G(!b.59&&b.
 5E)b.59=b.5E;G(!b.35&&b.2s)b.35=(b.2s&1?1:(b.2s&2?3:(b.2s&4?2:0)));I b},3M:H(a,b){b.24=a.24=a.24||b.24||7.24++;I b},2t:{27:{4p:H(){55();I},4A:H(){I}},3D:{4p:H(){G(D.14.1f)I Q;D(7).2O("53",D.W.2t.3D.2y);I M},4A:H(){G(D.14.1f)I Q;D(7).4e("53",D.W.2t.3D.2y);I M},2y:H(a){G(F(a,7))I M;a.O="3D";I D.W.1H.1w(7,19)}},3N:{4p:H(){G(D.14.1f)I Q;D(7).2O("51",D.W.2t.3N.2y);I M},4A:H(){G(D.14.1f)I Q;D(7).4e("51",D.W.2t.3N.2y);I M},2y:H(a){G(F(a,7))I M;a.O="3N";I D.W.1H.1w(7,19)}}}};D.17.1l({2O:H(c,a,b){I c=="4X"?7.2V(c,a,b):7.P(H(){D.W.1e(7,c,b||a,b&&a)})},2V:H(d,b,c){J e=D.W.3M(c||b,H(a){D(7).4e(a,e);I(c||b).1w(7,19)});I 7.P(H(){D.W.1e(7,d,e,c&&b)})},4e:H(a,b){I 7.P(H(){D.W.21(7,a,b)})},1P:H(c,a,b){I 7.P(H(){D.W.1P(c,a,7,M,b)})},5C:H(c,a,b){I 7[0]&&D.W.1P(c,a,7[0],Q,b)},2m:H(b){J c=19,i=1;1B(i<c.K)D.W.3M(b,c[i++]);I 7.4V(D.W.3M(b,H(a){7.4Z=(7.4Z||0)%i;a.32();I c[7.4Z++].1w(7,19)||Q}))},7X:H(a,b){I 7.2O(\'3D\',a).2O(\'3N\',b)},27:H(a){55();G(D.2Q)a.1k(S,D);N D.3A.1p(H(){I a.1k(7,D)});I 7}}
 );D.1l({2Q:Q,3A:[],27:H(){G(!D.2Q){D.2Q=M;G(D.3A){D.P(D.3A,H(){7.1k(S)});D.3A=U}D(S).5C("27")}}});J x=Q;H 55(){G(x)I;x=M;G(S.3K&&!D.14.2G)S.3K("69",D.27,Q);G(D.14.1f&&1b==1S)(H(){G(D.2Q)I;1U{S.1C.7V("1A")}1V(3e){3B(19.3L,0);I}D.27()})();G(D.14.2G)S.3K("69",H(){G(D.2Q)I;R(J i=0;i<S.4W.K;i++)G(S.4W[i].3R){3B(19.3L,0);I}D.27()},Q);G(D.14.2k){J a;(H(){G(D.2Q)I;G(S.3f!="68"&&S.3f!="1J"){3B(19.3L,0);I}G(a===12)a=D("V, 7A[7U=7S]").K;G(S.4W.K!=a){3B(19.3L,0);I}D.27()})()}D.W.1e(1b,"43",D.27)}D.P(("7R,7Q,43,85,4y,4X,4V,7P,"+"7O,7N,89,53,51,7M,2A,"+"5o,7L,7K,8d,3e").1R(","),H(i,b){D.17[b]=H(a){I a?7.2O(b,a):7.1P(b)}});J F=H(a,c){J b=a.4k;1B(b&&b!=c)1U{b=b.1d}1V(3e){b=c}I b==c};D(1b).2O("4X",H(){D("*").1e(S).4e()});D.17.1l({67:D.17.43,43:H(g,d,c){G(1j g!=\'23\')I 7.67(g);J e=g.1h(" ");G(e>=0){J i=g.3s(e,g.K);g=g.3s(0,e)}c=c||H(){};J f="2P";G(d)G(D.1D(d)){c=d;d=U}N{d=D.3n(d);f="6g"}J h=7;D.3Y({1a:g,O:f,1O:"2K",L:d,1J:H(a,b){G(b=="1W"||b=="7J")h.2K(i?D("<1v/>").3v(a.4U.1o(/<1m(.|\\s)*?\\
 /1m>/g,"")).2q(i):a.4U);h.P(c,[a.4U,b,a])}});I 7},aL:H(){I D.3n(7.7I())},7I:H(){I 7.2l(H(){I D.Y(7,"3V")?D.2d(7.aH):7}).1E(H(){I 7.34&&!7.3R&&(7.4J||/2A|6y/i.11(7.Y)||/1r|1G|3Q/i.11(7.O))}).2l(H(i,c){J b=D(7).6e();I b==U?U:b.1q==2p?D.2l(b,H(a,i){I{34:c.34,2x:a}}):{34:c.34,2x:b}}).3p()}});D.P("7H,7G,7F,7D,7C,7B".1R(","),H(i,o){D.17[o]=H(f){I 7.2O(o,f)}});J B=1z();D.1l({3p:H(d,b,a,c){G(D.1D(b)){a=b;b=U}I D.3Y({O:"2P",1a:d,L:b,1W:a,1O:c})},aE:H(b,a){I D.3p(b,U,a,"1m")},aD:H(c,b,a){I D.3p(c,b,a,"3z")},aC:H(d,b,a,c){G(D.1D(b)){a=b;b={}}I D.3Y({O:"6g",1a:d,L:b,1W:a,1O:c})},aA:H(a){D.1l(D.60,a)},60:{1a:5Z.5Q,26:M,O:"2P",2T:0,7z:"4R/x-ax-3V-aw",7x:M,31:M,L:U,5Y:U,3Q:U,4Q:{2N:"4R/2N, 1r/2N",2K:"1r/2K",1m:"1r/4t, 4R/4t",3z:"4R/3z, 1r/4t",1r:"1r/as",4w:"*/*"}},4z:{},3Y:H(s){s=D.1l(M,s,D.1l(M,{},D.60,s));J g,2Z=/=\\?(&|$)/g,1u,L,O=s.O.2r();G(s.L&&s.7x&&1j s.L!="23")s.L=D.3n(s.L);G(s.1O=="4P"){G(O=="2P"){G(!s.1a.1I(2Z))s.1a+=(s.1a.1I(/\\?/)?"&":"?")+(s.4P||"7u")+"=?"}N G(!s.L||!s.L.1I(2Z
 ))s.L=(s.L?s.L+"&":"")+(s.4P||"7u")+"=?";s.1O="3z"}G(s.1O=="3z"&&(s.L&&s.L.1I(2Z)||s.1a.1I(2Z))){g="4P"+B++;G(s.L)s.L=(s.L+"").1o(2Z,"="+g+"$1");s.1a=s.1a.1o(2Z,"="+g+"$1");s.1O="1m";1b[g]=H(a){L=a;1W();1J();1b[g]=12;1U{2U 1b[g]}1V(e){}G(i)i.37(h)}}G(s.1O=="1m"&&s.1Y==U)s.1Y=Q;G(s.1Y===Q&&O=="2P"){J j=1z();J k=s.1a.1o(/(\\?|&)3m=.*?(&|$)/,"$ap="+j+"$2");s.1a=k+((k==s.1a)?(s.1a.1I(/\\?/)?"&":"?")+"3m="+j:"")}G(s.L&&O=="2P"){s.1a+=(s.1a.1I(/\\?/)?"&":"?")+s.L;s.L=U}G(s.26&&!D.4O++)D.W.1P("7H");J n=/^(?:\\w+:)?\\/\\/([^\\/?#]+)/;G(s.1O=="1m"&&O=="2P"&&n.11(s.1a)&&n.2D(s.1a)[1]!=5Z.al){J i=S.3H("6w")[0];J h=S.3h("1m");h.4d=s.1a;G(s.7t)h.aj=s.7t;G(!g){J l=Q;h.ah=h.ag=H(){G(!l&&(!7.3f||7.3f=="68"||7.3f=="1J")){l=M;1W();1J();i.37(h)}}}i.3U(h);I 12}J m=Q;J c=1b.7s?2B 7s("ae.ac"):2B 7r();G(s.5Y)c.6R(O,s.1a,s.31,s.5Y,s.3Q);N c.6R(O,s.1a,s.31);1U{G(s.L)c.4B("ab-aa",s.7z);G(s.5S)c.4B("a9-5R-a8",D.4z[s.1a]||"a7, a6 a5 a4 5N:5N:5N a2");c.4B("X-9Z-9Y","7r");c.4B("9W",s.1O&&s.4Q[s.1O]?s.4Q[
 s.1O]+", */*":s.4Q.4w)}1V(e){}G(s.7m&&s.7m(c,s)===Q){s.26&&D.4O--;c.7l();I Q}G(s.26)D.W.1P("7B",[c,s]);J d=H(a){G(!m&&c&&(c.3f==4||a=="2T")){m=M;G(f){7k(f);f=U}1u=a=="2T"&&"2T"||!D.7j(c)&&"3e"||s.5S&&D.7h(c,s.1a)&&"7J"||"1W";G(1u=="1W"){1U{L=D.6X(c,s.1O,s.9S)}1V(e){1u="5J"}}G(1u=="1W"){J b;1U{b=c.5I("7g-5R")}1V(e){}G(s.5S&&b)D.4z[s.1a]=b;G(!g)1W()}N D.5H(s,c,1u);1J();G(s.31)c=U}};G(s.31){J f=4I(d,13);G(s.2T>0)3B(H(){G(c){c.7l();G(!m)d("2T")}},s.2T)}1U{c.9P(s.L)}1V(e){D.5H(s,c,U,e)}G(!s.31)d();H 1W(){G(s.1W)s.1W(L,1u);G(s.26)D.W.1P("7C",[c,s])}H 1J(){G(s.1J)s.1J(c,1u);G(s.26)D.W.1P("7F",[c,s]);G(s.26&&!--D.4O)D.W.1P("7G")}I c},5H:H(s,a,b,e){G(s.3e)s.3e(a,b,e);G(s.26)D.W.1P("7D",[a,s,e])},4O:0,7j:H(a){1U{I!a.1u&&5Z.9O=="5p:"||(a.1u>=7e&&a.1u<9N)||a.1u==7c||a.1u==9K||D.14.2k&&a.1u==12}1V(e){}I Q},7h:H(a,c){1U{J b=a.5I("7g-5R");I a.1u==7c||b==D.4z[c]||D.14.2k&&a.1u==12}1V(e){}I Q},6X:H(a,c,b){J d=a.5I("9J-O"),2N=c=="2N"||!c&&d&&d.1h("2N")>=0,L=2N?a.9I:a.4U;G(2N&&L.1C.2j=="5J")7p
 "5J";G(b)L=b(L,c);G(c=="1m")D.5u(L);G(c=="3z")L=6u("("+L+")");I L},3n:H(a){J s=[];G(a.1q==2p||a.5w)D.P(a,H(){s.1p(3u(7.34)+"="+3u(7.2x))});N R(J j 1n a)G(a[j]&&a[j].1q==2p)D.P(a[j],H(){s.1p(3u(j)+"="+3u(7))});N s.1p(3u(j)+"="+3u(D.1D(a[j])?a[j]():a[j]));I s.6s("&").1o(/%20/g,"+")}});D.17.1l({1N:H(c,b){I c?7.2g({1Z:"1N",2h:"1N",1y:"1N"},c,b):7.1E(":1G").P(H(){7.V.18=7.5D||"";G(D.1g(7,"18")=="2F"){J a=D("<"+7.2j+" />").6P("1c");7.V.18=a.1g("18");G(7.V.18=="2F")7.V.18="3I";a.21()}}).3l()},1M:H(b,a){I b?7.2g({1Z:"1M",2h:"1M",1y:"1M"},b,a):7.1E(":4j").P(H(){7.5D=7.5D||D.1g(7,"18");7.V.18="2F"}).3l()},78:D.17.2m,2m:H(a,b){I D.1D(a)&&D.1D(b)?7.78.1w(7,19):a?7.2g({1Z:"2m",2h:"2m",1y:"2m"},a,b):7.P(H(){D(7)[D(7).3F(":1G")?"1N":"1M"]()})},9G:H(b,a){I 7.2g({1Z:"1N"},b,a)},9F:H(b,a){I 7.2g({1Z:"1M"},b,a)},9E:H(b,a){I 7.2g({1Z:"2m"},b,a)},9D:H(b,a){I 7.2g({1y:"1N"},b,a)},9M:H(b,a){I 7.2g({1y:"1M"},b,a)},9C:H(c,a,b){I 7.2g({1y:a},c,b)},2g:H(k,j,i,g){J h=D.77(j,i,g);I 7[h.36===Q?"P":"36"](
 H(){G(7.16!=1)I Q;J f=D.1l({},h),p,1G=D(7).3F(":1G"),46=7;R(p 1n k){G(k[p]=="1M"&&1G||k[p]=="1N"&&!1G)I f.1J.1k(7);G(p=="1Z"||p=="2h"){f.18=D.1g(7,"18");f.33=7.V.33}}G(f.33!=U)7.V.33="1G";f.45=D.1l({},k);D.P(k,H(c,a){J e=2B D.28(46,f,c);G(/2m|1N|1M/.11(a))e[a=="2m"?1G?"1N":"1M":a](k);N{J b=a.6r().1I(/^([+-]=)?([\\d+-.]+)(.*)$/),2b=e.1t(M)||0;G(b){J d=3d(b[2]),2M=b[3]||"2X";G(2M!="2X"){46.V[c]=(d||1)+2M;2b=((d||1)/e.1t(M))*2b;46.V[c]=2b+2M}G(b[1])d=((b[1]=="-="?-1:1)*d)+2b;e.3G(2b,d,2M)}N e.3G(2b,a,"")}});I M})},36:H(a,b){G(D.1D(a)||(a&&a.1q==2p)){b=a;a="28"}G(!a||(1j a=="23"&&!b))I A(7[0],a);I 7.P(H(){G(b.1q==2p)A(7,a,b);N{A(7,a).1p(b);G(A(7,a).K==1)b.1k(7)}})},9X:H(b,c){J a=D.3O;G(b)7.36([]);7.P(H(){R(J i=a.K-1;i>=0;i--)G(a[i].T==7){G(c)a[i](M);a.7n(i,1)}});G(!c)7.5A();I 7}});J A=H(b,c,a){G(b){c=c||"28";J q=D.L(b,c+"36");G(!q||a)q=D.L(b,c+"36",D.2d(a))}I q};D.17.5A=H(a){a=a||"28";I 7.P(H(){J q=A(7,a);q.4s();G(q.K)q[0].1k(7)})};D.1l({77:H(b,a,c){J d=b&&b.1q==a0?b:{1J:c||!c&&
 a||D.1D(b)&&b,2u:b,41:c&&a||a&&a.1q!=9t&&a};d.2u=(d.2u&&d.2u.1q==4L?d.2u:D.28.5K[d.2u])||D.28.5K.74;d.5M=d.1J;d.1J=H(){G(d.36!==Q)D(7).5A();G(D.1D(d.5M))d.5M.1k(7)};I d},41:{73:H(p,n,b,a){I b+a*p},5P:H(p,n,b,a){I((-29.9r(p*29.9q)/2)+0.5)*a+b}},3O:[],48:U,28:H(b,c,a){7.15=c;7.T=b;7.1i=a;G(!c.3Z)c.3Z={}}});D.28.44={4D:H(){G(7.15.2Y)7.15.2Y.1k(7.T,7.1z,7);(D.28.2Y[7.1i]||D.28.2Y.4w)(7);G(7.1i=="1Z"||7.1i=="2h")7.T.V.18="3I"},1t:H(a){G(7.T[7.1i]!=U&&7.T.V[7.1i]==U)I 7.T[7.1i];J r=3d(D.1g(7.T,7.1i,a));I r&&r>-9p?r:3d(D.2a(7.T,7.1i))||0},3G:H(c,b,d){7.5V=1z();7.2b=c;7.3l=b;7.2M=d||7.2M||"2X";7.1z=7.2b;7.2S=7.4N=0;7.4D();J e=7;H t(a){I e.2Y(a)}t.T=7.T;D.3O.1p(t);G(D.48==U){D.48=4I(H(){J a=D.3O;R(J i=0;i<a.K;i++)G(!a[i]())a.7n(i--,1);G(!a.K){7k(D.48);D.48=U}},13)}},1N:H(){7.15.3Z[7.1i]=D.1K(7.T.V,7.1i);7.15.1N=M;7.3G(0,7.1t());G(7.1i=="2h"||7.1i=="1Z")7.T.V[7.1i]="9m";D(7.T).1N()},1M:H(){7.15.3Z[7.1i]=D.1K(7.T.V,7.1i);7.15.1M=M;7.3G(7.1t(),0)},2Y:H(a){J t=1z();G(a||t>7.15.2u+7.5V){7
 .1z=7.3l;7.2S=7.4N=1;7.4D();7.15.45[7.1i]=M;J b=M;R(J i 1n 7.15.45)G(7.15.45[i]!==M)b=Q;G(b){G(7.15.18!=U){7.T.V.33=7.15.33;7.T.V.18=7.15.18;G(D.1g(7.T,"18")=="2F")7.T.V.18="3I"}G(7.15.1M)7.T.V.18="2F";G(7.15.1M||7.15.1N)R(J p 1n 7.15.45)D.1K(7.T.V,p,7.15.3Z[p])}G(b)7.15.1J.1k(7.T);I Q}N{J n=t-7.5V;7.4N=n/7.15.2u;7.2S=D.41[7.15.41||(D.41.5P?"5P":"73")](7.4N,n,0,1,7.15.2u);7.1z=7.2b+((7.3l-7.2b)*7.2S);7.4D()}I M}};D.1l(D.28,{5K:{9l:9j,9i:7e,74:9g},2Y:{2e:H(a){a.T.2e=a.1z},2c:H(a){a.T.2c=a.1z},1y:H(a){D.1K(a.T.V,"1y",a.1z)},4w:H(a){a.T.V[a.1i]=a.1z+a.2M}}});D.17.2i=H(){J b=0,1S=0,T=7[0],3q;G(T)ao(D.14){J d=T.1d,4a=T,1s=T.1s,1Q=T.2z,5U=2k&&3r(5B)<9c&&!/9a/i.11(v),1g=D.2a,3c=1g(T,"30")=="3c";G(T.7y){J c=T.7y();1e(c.1A+29.2f(1Q.1C.2e,1Q.1c.2e),c.1S+29.2f(1Q.1C.2c,1Q.1c.2c));1e(-1Q.1C.6b,-1Q.1C.6a)}N{1e(T.5X,T.5W);1B(1s){1e(1s.5X,1s.5W);G(42&&!/^t(98|d|h)$/i.11(1s.2j)||2k&&!5U)2C(1s);G(!3c&&1g(1s,"30")=="3c")3c=M;4a=/^1c$/i.11(1s.2j)?4a:1s;1s=1s.1s}1B(d&&d.2j&&!/^1c|2K$/i.11(d.2j)
 ){G(!/^96|1T.*$/i.11(1g(d,"18")))1e(-d.2e,-d.2c);G(42&&1g(d,"33")!="4j")2C(d);d=d.1d}G((5U&&(3c||1g(4a,"30")=="5x"))||(42&&1g(4a,"30")!="5x"))1e(-1Q.1c.5X,-1Q.1c.5W);G(3c)1e(29.2f(1Q.1C.2e,1Q.1c.2e),29.2f(1Q.1C.2c,1Q.1c.2c))}3q={1S:1S,1A:b}}H 2C(a){1e(D.2a(a,"6V",M),D.2a(a,"6U",M))}H 1e(l,t){b+=3r(l,10)||0;1S+=3r(t,10)||0}I 3q};D.17.1l({30:H(){J a=0,1S=0,3q;G(7[0]){J b=7.1s(),2i=7.2i(),4c=/^1c|2K$/i.11(b[0].2j)?{1S:0,1A:0}:b.2i();2i.1S-=25(7,\'94\');2i.1A-=25(7,\'aF\');4c.1S+=25(b,\'6U\');4c.1A+=25(b,\'6V\');3q={1S:2i.1S-4c.1S,1A:2i.1A-4c.1A}}I 3q},1s:H(){J a=7[0].1s;1B(a&&(!/^1c|2K$/i.11(a.2j)&&D.1g(a,\'30\')==\'93\'))a=a.1s;I D(a)}});D.P([\'5e\',\'5G\'],H(i,b){J c=\'4y\'+b;D.17[c]=H(a){G(!7[0])I;I a!=12?7.P(H(){7==1b||7==S?1b.92(!i?a:D(1b).2e(),i?a:D(1b).2c()):7[c]=a}):7[0]==1b||7[0]==S?46[i?\'aI\':\'aJ\']||D.71&&S.1C[c]||S.1c[c]:7[0][c]}});D.P(["6N","4b"],H(i,b){J c=i?"5e":"5G",4f=i?"6k":"6i";D.17["5s"+b]=H(){I 7[b.3y()]()+25(7,"57"+c)+25(7,"57"+4f)};D.17["90"+b]=H(a){I 7
 ["5s"+b]()+25(7,"2C"+c+"4b")+25(7,"2C"+4f+"4b")+(a?25(7,"6S"+c)+25(7,"6S"+4f):0)}})})();',62,669,'|||||||this|||||||||||||||||||||||||||||||||||if|function|return|var|length|data|true|else|type|each|false|for|document|elem|null|style|event||nodeName|||test|undefined||browser|options|nodeType|fn|display|arguments|url|window|body|parentNode|add|msie|css|indexOf|prop|typeof|call|extend|script|in|replace|push|constructor|text|offsetParent|cur|status|div|apply|firstChild|opacity|now|left|while|documentElement|isFunction|filter|className|hidden|handle|match|complete|attr|ret|hide|show|dataType|trigger|doc|split|top|table|try|catch|success|break|cache|height||remove|tbody|string|guid|num|global|ready|fx|Math|curCSS|start|scrollTop|makeArray|scrollLeft|max|animate|width|offset|tagName|safari|map|toggle||done|Array|find|toUpperCase|button|special|duration|id|copy|value|handler|ownerDocument|select|new|border|exec|stack|none|opera|nextSibling|pushStack|target|html|inArray|unit|xml|bin
 d|GET|isReady|merge|pos|timeout|delete|one|selected|px|step|jsre|position|async|preventDefault|overflow|name|which|queue|removeChild|namespace|insertBefore|nth|removeData|fixed|parseFloat|error|readyState|multiFilter|createElement|rl|re|trim|end|_|param|first|get|results|parseInt|slice|childNodes|encodeURIComponent|append|events|elems|toLowerCase|json|readyList|setTimeout|grep|mouseenter|color|is|custom|getElementsByTagName|block|stopPropagation|addEventListener|callee|proxy|mouseleave|timers|defaultView|password|disabled|last|has|appendChild|form|domManip|props|ajax|orig|set|easing|mozilla|load|prototype|curAnim|self|charCode|timerId|object|offsetChild|Width|parentOffset|src|unbind|br|currentStyle|clean|float|visible|relatedTarget|previousSibling|handlers|isXMLDoc|on|setup|nodeIndex|unique|shift|javascript|child|RegExp|_default|deep|scroll|lastModified|teardown|setRequestHeader|timeStamp|update|empty|tr|getAttribute|innerHTML|setInterval|checked|fromElement|Number|jQuery|st
 ate|active|jsonp|accepts|application|dir|input|responseText|click|styleSheets|unload|not|lastToggle|outline|mouseout|getPropertyValue|mouseover|getComputedStyle|bindReady|String|padding|pageX|metaKey|keyCode|getWH|andSelf|clientX|Left|all|visibility|container|index|init|triggered|removeAttribute|classFilter|prevObject|submit|file|after|windowData|inner|client|globalEval|sibling|jquery|absolute|clone|wrapAll|dequeue|version|triggerHandler|oldblock|ctrlKey|createTextNode|Top|handleError|getResponseHeader|parsererror|speeds|checkbox|old|00|radio|swing|href|Modified|ifModified|lastChild|safari2|startTime|offsetTop|offsetLeft|username|location|ajaxSettings|getElementById|isSimple|values|selectedIndex|runtimeStyle|rsLeft|_load|loaded|DOMContentLoaded|clientTop|clientLeft|toElement|srcElement|val|pageY|POST|unshift|Bottom|clientY|Right|fix|exclusive|detachEvent|cloneNode|removeEventListener|swap|toString|join|attachEvent|eval|substr|head|parse|textarea|reset|image|zoom|odd|even|bef
 ore|prepend|exclude|expr|quickClass|quickID|uuid|quickChild|continue|Height|textContent|appendTo|contents|open|margin|evalScript|borderTopWidth|borderLeftWidth|parent|httpData|setArray|CSS1Compat|compatMode|boxModel|cssFloat|linear|def|webkit|nodeValue|speed|_toggle|eq|100|replaceWith|304|concat|200|alpha|Last|httpNotModified|getAttributeNode|httpSuccess|clearInterval|abort|beforeSend|splice|styleFloat|throw|colgroup|XMLHttpRequest|ActiveXObject|scriptCharset|callback|fieldset|multiple|processData|getBoundingClientRect|contentType|link|ajaxSend|ajaxSuccess|ajaxError|col|ajaxComplete|ajaxStop|ajaxStart|serializeArray|notmodified|keypress|keydown|change|mouseup|mousedown|dblclick|focus|blur|stylesheet|hasClass|rel|doScroll|black|hover|solid|cancelBubble|returnValue|wheelDelta|view|round|shiftKey|resize|screenY|screenX|relatedNode|mousemove|prevValue|originalTarget|offsetHeight|keyup|newValue|offsetWidth|eventPhase|detail|currentTarget|cancelable|bubbles|attrName|attrChange|alt
 Key|originalEvent|charAt|0n|substring|animated|header|noConflict|line|enabled|innerText|contains|only|weight|font|gt|lt|uFFFF|u0128|size|417|Boolean|Date|toggleClass|removeClass|addClass|removeAttr|replaceAll|insertAfter|prependTo|wrap|contentWindow|contentDocument|iframe|children|siblings|prevAll|wrapInner|nextAll|outer|prev|scrollTo|static|marginTop|next|inline|parents|able|cellSpacing|adobeair|cellspacing|522|maxLength|maxlength|readOnly|400|readonly|fast|600|class|slow|1px|htmlFor|reverse|10000|PI|cos|compatible|Function|setData|ie|ra|it|rv|getData|userAgent|navigator|fadeTo|fadeIn|slideToggle|slideUp|slideDown|ig|responseXML|content|1223|NaN|fadeOut|300|protocol|send|setAttribute|option|dataFilter|cssText|changed|be|Accept|stop|With|Requested|Object|can|GMT|property|1970|Jan|01|Thu|Since|If|Type|Content|XMLHTTP|th|Microsoft|td|onreadystatechange|onload|cap|charset|colg|host|tfoot|specified|with|1_|thead|leg|plain|attributes|opt|embed|urlencoded|www|area|hr|ajaxSetup|met
 a|post|getJSON|getScript|marginLeft|img|elements|pageYOffset|pageXOffset|abbr|serialize|pixelLeft'.split('|'),0,{}))
\ No newline at end of file



More information about the Checkins mailing list