web/wp-content/themes/selecta/ocmx/scripts/jquery.js
changeset 1 0d28b7c10758
equal deleted inserted replaced
0:0d9a58d2c515 1:0d28b7c10758
       
     1 /*!
       
     2  * jQuery JavaScript Library v1.3.1
       
     3  * http://jquery.com/
       
     4  *
       
     5  * Copyright (c) 2009 John Resig
       
     6  * Dual licensed under the MIT and GPL licenses.
       
     7  * http://docs.jquery.com/License
       
     8  *
       
     9  * Date: 2009-01-21 20:42:16 -0500 (Wed, 21 Jan 2009)
       
    10  * Revision: 6158
       
    11  */
       
    12 (function(){
       
    13 
       
    14 var 
       
    15 	// Will speed up references to window, and allows munging its name.
       
    16 	window = this,
       
    17 	// Will speed up references to undefined, and allows munging its name.
       
    18 	undefined,
       
    19 	// Map over jQuery in case of overwrite
       
    20 	_jQuery = window.jQuery,
       
    21 	// Map over the $ in case of overwrite
       
    22 	_$ = window.$,
       
    23 
       
    24 	jQuery = window.jQuery = window.$ = function( selector, context ) {
       
    25 		// The jQuery object is actually just the init constructor 'enhanced'
       
    26 		return new jQuery.fn.init( selector, context );
       
    27 	},
       
    28 
       
    29 	// A simple way to check for HTML strings or ID strings
       
    30 	// (both of which we optimize for)
       
    31 	quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,
       
    32 	// Is it a simple selector
       
    33 	isSimple = /^.[^:#\[\.,]*$/;
       
    34 
       
    35 jQuery.fn = jQuery.prototype = {
       
    36 	init: function( selector, context ) {
       
    37 		// Make sure that a selection was provided
       
    38 		selector = selector || document;
       
    39 
       
    40 		// Handle $(DOMElement)
       
    41 		if ( selector.nodeType ) {
       
    42 			this[0] = selector;
       
    43 			this.length = 1;
       
    44 			this.context = selector;
       
    45 			return this;
       
    46 		}
       
    47 		// Handle HTML strings
       
    48 		if ( typeof selector === "string" ) {
       
    49 			// Are we dealing with HTML string or an ID?
       
    50 			var match = quickExpr.exec( selector );
       
    51 
       
    52 			// Verify a match, and that no context was specified for #id
       
    53 			if ( match && (match[1] || !context) ) {
       
    54 
       
    55 				// HANDLE: $(html) -> $(array)
       
    56 				if ( match[1] )
       
    57 					selector = jQuery.clean( [ match[1] ], context );
       
    58 
       
    59 				// HANDLE: $("#id")
       
    60 				else {
       
    61 					var elem = document.getElementById( match[3] );
       
    62 
       
    63 					// Handle the case where IE and Opera return items
       
    64 					// by name instead of ID
       
    65 					if ( elem && elem.id != match[3] )
       
    66 						return jQuery().find( selector );
       
    67 
       
    68 					// Otherwise, we inject the element directly into the jQuery object
       
    69 					var ret = jQuery( elem || [] );
       
    70 					ret.context = document;
       
    71 					ret.selector = selector;
       
    72 					return ret;
       
    73 				}
       
    74 
       
    75 			// HANDLE: $(expr, [context])
       
    76 			// (which is just equivalent to: $(content).find(expr)
       
    77 			} else
       
    78 				return jQuery( context ).find( selector );
       
    79 
       
    80 		// HANDLE: $(function)
       
    81 		// Shortcut for document ready
       
    82 		} else if ( jQuery.isFunction( selector ) )
       
    83 			return jQuery( document ).ready( selector );
       
    84 
       
    85 		// Make sure that old selector state is passed along
       
    86 		if ( selector.selector && selector.context ) {
       
    87 			this.selector = selector.selector;
       
    88 			this.context = selector.context;
       
    89 		}
       
    90 
       
    91 		return this.setArray(jQuery.makeArray(selector));
       
    92 	},
       
    93 
       
    94 	// Start with an empty selector
       
    95 	selector: "",
       
    96 
       
    97 	// The current version of jQuery being used
       
    98 	jquery: "1.3.1",
       
    99 
       
   100 	// The number of elements contained in the matched element set
       
   101 	size: function() {
       
   102 		return this.length;
       
   103 	},
       
   104 
       
   105 	// Get the Nth element in the matched element set OR
       
   106 	// Get the whole matched element set as a clean array
       
   107 	get: function( num ) {
       
   108 		return num === undefined ?
       
   109 
       
   110 			// Return a 'clean' array
       
   111 			jQuery.makeArray( this ) :
       
   112 
       
   113 			// Return just the object
       
   114 			this[ num ];
       
   115 	},
       
   116 
       
   117 	// Take an array of elements and push it onto the stack
       
   118 	// (returning the new matched element set)
       
   119 	pushStack: function( elems, name, selector ) {
       
   120 		// Build a new jQuery matched element set
       
   121 		var ret = jQuery( elems );
       
   122 
       
   123 		// Add the old object onto the stack (as a reference)
       
   124 		ret.prevObject = this;
       
   125 
       
   126 		ret.context = this.context;
       
   127 
       
   128 		if ( name === "find" )
       
   129 			ret.selector = this.selector + (this.selector ? " " : "") + selector;
       
   130 		else if ( name )
       
   131 			ret.selector = this.selector + "." + name + "(" + selector + ")";
       
   132 
       
   133 		// Return the newly-formed element set
       
   134 		return ret;
       
   135 	},
       
   136 
       
   137 	// Force the current matched set of elements to become
       
   138 	// the specified array of elements (destroying the stack in the process)
       
   139 	// You should use pushStack() in order to do this, but maintain the stack
       
   140 	setArray: function( elems ) {
       
   141 		// Resetting the length to 0, then using the native Array push
       
   142 		// is a super-fast way to populate an object with array-like properties
       
   143 		this.length = 0;
       
   144 		Array.prototype.push.apply( this, elems );
       
   145 
       
   146 		return this;
       
   147 	},
       
   148 
       
   149 	// Execute a callback for every element in the matched set.
       
   150 	// (You can seed the arguments with an array of args, but this is
       
   151 	// only used internally.)
       
   152 	each: function( callback, args ) {
       
   153 		return jQuery.each( this, callback, args );
       
   154 	},
       
   155 
       
   156 	// Determine the position of an element within
       
   157 	// the matched set of elements
       
   158 	index: function( elem ) {
       
   159 		// Locate the position of the desired element
       
   160 		return jQuery.inArray(
       
   161 			// If it receives a jQuery object, the first element is used
       
   162 			elem && elem.jquery ? elem[0] : elem
       
   163 		, this );
       
   164 	},
       
   165 
       
   166 	attr: function( name, value, type ) {
       
   167 		var options = name;
       
   168 
       
   169 		// Look for the case where we're accessing a style value
       
   170 		if ( typeof name === "string" )
       
   171 			if ( value === undefined )
       
   172 				return this[0] && jQuery[ type || "attr" ]( this[0], name );
       
   173 
       
   174 			else {
       
   175 				options = {};
       
   176 				options[ name ] = value;
       
   177 			}
       
   178 
       
   179 		// Check to see if we're setting style values
       
   180 		return this.each(function(i){
       
   181 			// Set all the styles
       
   182 			for ( name in options )
       
   183 				jQuery.attr(
       
   184 					type ?
       
   185 						this.style :
       
   186 						this,
       
   187 					name, jQuery.prop( this, options[ name ], type, i, name )
       
   188 				);
       
   189 		});
       
   190 	},
       
   191 
       
   192 	css: function( key, value ) {
       
   193 		// ignore negative width and height values
       
   194 		if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
       
   195 			value = undefined;
       
   196 		return this.attr( key, value, "curCSS" );
       
   197 	},
       
   198 
       
   199 	text: function( text ) {
       
   200 		if ( typeof text !== "object" && text != null )
       
   201 			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
       
   202 
       
   203 		var ret = "";
       
   204 
       
   205 		jQuery.each( text || this, function(){
       
   206 			jQuery.each( this.childNodes, function(){
       
   207 				if ( this.nodeType != 8 )
       
   208 					ret += this.nodeType != 1 ?
       
   209 						this.nodeValue :
       
   210 						jQuery.fn.text( [ this ] );
       
   211 			});
       
   212 		});
       
   213 
       
   214 		return ret;
       
   215 	},
       
   216 
       
   217 	wrapAll: function( html ) {
       
   218 		if ( this[0] ) {
       
   219 			// The elements to wrap the target around
       
   220 			var wrap = jQuery( html, this[0].ownerDocument ).clone();
       
   221 
       
   222 			if ( this[0].parentNode )
       
   223 				wrap.insertBefore( this[0] );
       
   224 
       
   225 			wrap.map(function(){
       
   226 				var elem = this;
       
   227 
       
   228 				while ( elem.firstChild )
       
   229 					elem = elem.firstChild;
       
   230 
       
   231 				return elem;
       
   232 			}).append(this);
       
   233 		}
       
   234 
       
   235 		return this;
       
   236 	},
       
   237 
       
   238 	wrapInner: function( html ) {
       
   239 		return this.each(function(){
       
   240 			jQuery( this ).contents().wrapAll( html );
       
   241 		});
       
   242 	},
       
   243 
       
   244 	wrap: function( html ) {
       
   245 		return this.each(function(){
       
   246 			jQuery( this ).wrapAll( html );
       
   247 		});
       
   248 	},
       
   249 
       
   250 	append: function() {
       
   251 		return this.domManip(arguments, true, function(elem){
       
   252 			if (this.nodeType == 1)
       
   253 				this.appendChild( elem );
       
   254 		});
       
   255 	},
       
   256 
       
   257 	prepend: function() {
       
   258 		return this.domManip(arguments, true, function(elem){
       
   259 			if (this.nodeType == 1)
       
   260 				this.insertBefore( elem, this.firstChild );
       
   261 		});
       
   262 	},
       
   263 
       
   264 	before: function() {
       
   265 		return this.domManip(arguments, false, function(elem){
       
   266 			this.parentNode.insertBefore( elem, this );
       
   267 		});
       
   268 	},
       
   269 
       
   270 	after: function() {
       
   271 		return this.domManip(arguments, false, function(elem){
       
   272 			this.parentNode.insertBefore( elem, this.nextSibling );
       
   273 		});
       
   274 	},
       
   275 
       
   276 	end: function() {
       
   277 		return this.prevObject || jQuery( [] );
       
   278 	},
       
   279 
       
   280 	// For internal use only.
       
   281 	// Behaves like an Array's .push method, not like a jQuery method.
       
   282 	push: [].push,
       
   283 
       
   284 	find: function( selector ) {
       
   285 		if ( this.length === 1 && !/,/.test(selector) ) {
       
   286 			var ret = this.pushStack( [], "find", selector );
       
   287 			ret.length = 0;
       
   288 			jQuery.find( selector, this[0], ret );
       
   289 			return ret;
       
   290 		} else {
       
   291 			var elems = jQuery.map(this, function(elem){
       
   292 				return jQuery.find( selector, elem );
       
   293 			});
       
   294 
       
   295 			return this.pushStack( /[^+>] [^+>]/.test( selector ) ?
       
   296 				jQuery.unique( elems ) :
       
   297 				elems, "find", selector );
       
   298 		}
       
   299 	},
       
   300 
       
   301 	clone: function( events ) {
       
   302 		// Do the clone
       
   303 		var ret = this.map(function(){
       
   304 			if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
       
   305 				// IE copies events bound via attachEvent when
       
   306 				// using cloneNode. Calling detachEvent on the
       
   307 				// clone will also remove the events from the orignal
       
   308 				// In order to get around this, we use innerHTML.
       
   309 				// Unfortunately, this means some modifications to
       
   310 				// attributes in IE that are actually only stored
       
   311 				// as properties will not be copied (such as the
       
   312 				// the name attribute on an input).
       
   313 				var clone = this.cloneNode(true),
       
   314 					container = document.createElement("div");
       
   315 				container.appendChild(clone);
       
   316 				return jQuery.clean([container.innerHTML])[0];
       
   317 			} else
       
   318 				return this.cloneNode(true);
       
   319 		});
       
   320 
       
   321 		// Need to set the expando to null on the cloned set if it exists
       
   322 		// removeData doesn't work here, IE removes it from the original as well
       
   323 		// this is primarily for IE but the data expando shouldn't be copied over in any browser
       
   324 		var clone = ret.find("*").andSelf().each(function(){
       
   325 			if ( this[ expando ] !== undefined )
       
   326 				this[ expando ] = null;
       
   327 		});
       
   328 
       
   329 		// Copy the events from the original to the clone
       
   330 		if ( events === true )
       
   331 			this.find("*").andSelf().each(function(i){
       
   332 				if (this.nodeType == 3)
       
   333 					return;
       
   334 				var events = jQuery.data( this, "events" );
       
   335 
       
   336 				for ( var type in events )
       
   337 					for ( var handler in events[ type ] )
       
   338 						jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data );
       
   339 			});
       
   340 
       
   341 		// Return the cloned set
       
   342 		return ret;
       
   343 	},
       
   344 
       
   345 	filter: function( selector ) {
       
   346 		return this.pushStack(
       
   347 			jQuery.isFunction( selector ) &&
       
   348 			jQuery.grep(this, function(elem, i){
       
   349 				return selector.call( elem, i );
       
   350 			}) ||
       
   351 
       
   352 			jQuery.multiFilter( selector, jQuery.grep(this, function(elem){
       
   353 				return elem.nodeType === 1;
       
   354 			}) ), "filter", selector );
       
   355 	},
       
   356 
       
   357 	closest: function( selector ) {
       
   358 		var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null;
       
   359 
       
   360 		return this.map(function(){
       
   361 			var cur = this;
       
   362 			while ( cur && cur.ownerDocument ) {
       
   363 				if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) )
       
   364 					return cur;
       
   365 				cur = cur.parentNode;
       
   366 			}
       
   367 		});
       
   368 	},
       
   369 
       
   370 	not: function( selector ) {
       
   371 		if ( typeof selector === "string" )
       
   372 			// test special case where just one selector is passed in
       
   373 			if ( isSimple.test( selector ) )
       
   374 				return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector );
       
   375 			else
       
   376 				selector = jQuery.multiFilter( selector, this );
       
   377 
       
   378 		var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
       
   379 		return this.filter(function() {
       
   380 			return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
       
   381 		});
       
   382 	},
       
   383 
       
   384 	add: function( selector ) {
       
   385 		return this.pushStack( jQuery.unique( jQuery.merge(
       
   386 			this.get(),
       
   387 			typeof selector === "string" ?
       
   388 				jQuery( selector ) :
       
   389 				jQuery.makeArray( selector )
       
   390 		)));
       
   391 	},
       
   392 
       
   393 	is: function( selector ) {
       
   394 		return !!selector && jQuery.multiFilter( selector, this ).length > 0;
       
   395 	},
       
   396 
       
   397 	hasClass: function( selector ) {
       
   398 		return !!selector && this.is( "." + selector );
       
   399 	},
       
   400 
       
   401 	val: function( value ) {
       
   402 		if ( value === undefined ) {			
       
   403 			var elem = this[0];
       
   404 
       
   405 			if ( elem ) {
       
   406 				if( jQuery.nodeName( elem, 'option' ) )
       
   407 					return (elem.attributes.value || {}).specified ? elem.value : elem.text;
       
   408 				
       
   409 				// We need to handle select boxes special
       
   410 				if ( jQuery.nodeName( elem, "select" ) ) {
       
   411 					var index = elem.selectedIndex,
       
   412 						values = [],
       
   413 						options = elem.options,
       
   414 						one = elem.type == "select-one";
       
   415 
       
   416 					// Nothing was selected
       
   417 					if ( index < 0 )
       
   418 						return null;
       
   419 
       
   420 					// Loop through all the selected options
       
   421 					for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
       
   422 						var option = options[ i ];
       
   423 
       
   424 						if ( option.selected ) {
       
   425 							// Get the specifc value for the option
       
   426 							value = jQuery(option).val();
       
   427 
       
   428 							// We don't need an array for one selects
       
   429 							if ( one )
       
   430 								return value;
       
   431 
       
   432 							// Multi-Selects return an array
       
   433 							values.push( value );
       
   434 						}
       
   435 					}
       
   436 
       
   437 					return values;				
       
   438 				}
       
   439 
       
   440 				// Everything else, we just grab the value
       
   441 				return (elem.value || "").replace(/\r/g, "");
       
   442 
       
   443 			}
       
   444 
       
   445 			return undefined;
       
   446 		}
       
   447 
       
   448 		if ( typeof value === "number" )
       
   449 			value += '';
       
   450 
       
   451 		return this.each(function(){
       
   452 			if ( this.nodeType != 1 )
       
   453 				return;
       
   454 
       
   455 			if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) )
       
   456 				this.checked = (jQuery.inArray(this.value, value) >= 0 ||
       
   457 					jQuery.inArray(this.name, value) >= 0);
       
   458 
       
   459 			else if ( jQuery.nodeName( this, "select" ) ) {
       
   460 				var values = jQuery.makeArray(value);
       
   461 
       
   462 				jQuery( "option", this ).each(function(){
       
   463 					this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
       
   464 						jQuery.inArray( this.text, values ) >= 0);
       
   465 				});
       
   466 
       
   467 				if ( !values.length )
       
   468 					this.selectedIndex = -1;
       
   469 
       
   470 			} else
       
   471 				this.value = value;
       
   472 		});
       
   473 	},
       
   474 
       
   475 	html: function( value ) {
       
   476 		return value === undefined ?
       
   477 			(this[0] ?
       
   478 				this[0].innerHTML :
       
   479 				null) :
       
   480 			this.empty().append( value );
       
   481 	},
       
   482 
       
   483 	replaceWith: function( value ) {
       
   484 		return this.after( value ).remove();
       
   485 	},
       
   486 
       
   487 	eq: function( i ) {
       
   488 		return this.slice( i, +i + 1 );
       
   489 	},
       
   490 
       
   491 	slice: function() {
       
   492 		return this.pushStack( Array.prototype.slice.apply( this, arguments ),
       
   493 			"slice", Array.prototype.slice.call(arguments).join(",") );
       
   494 	},
       
   495 
       
   496 	map: function( callback ) {
       
   497 		return this.pushStack( jQuery.map(this, function(elem, i){
       
   498 			return callback.call( elem, i, elem );
       
   499 		}));
       
   500 	},
       
   501 
       
   502 	andSelf: function() {
       
   503 		return this.add( this.prevObject );
       
   504 	},
       
   505 
       
   506 	domManip: function( args, table, callback ) {
       
   507 		if ( this[0] ) {
       
   508 			var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(),
       
   509 				scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ),
       
   510 				first = fragment.firstChild,
       
   511 				extra = this.length > 1 ? fragment.cloneNode(true) : fragment;
       
   512 
       
   513 			if ( first )
       
   514 				for ( var i = 0, l = this.length; i < l; i++ )
       
   515 					callback.call( root(this[i], first), i > 0 ? extra.cloneNode(true) : fragment );
       
   516 			
       
   517 			if ( scripts )
       
   518 				jQuery.each( scripts, evalScript );
       
   519 		}
       
   520 
       
   521 		return this;
       
   522 		
       
   523 		function root( elem, cur ) {
       
   524 			return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ?
       
   525 				(elem.getElementsByTagName("tbody")[0] ||
       
   526 				elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
       
   527 				elem;
       
   528 		}
       
   529 	}
       
   530 };
       
   531 
       
   532 // Give the init function the jQuery prototype for later instantiation
       
   533 jQuery.fn.init.prototype = jQuery.fn;
       
   534 
       
   535 function evalScript( i, elem ) {
       
   536 	if ( elem.src )
       
   537 		jQuery.ajax({
       
   538 			url: elem.src,
       
   539 			async: false,
       
   540 			dataType: "script"
       
   541 		});
       
   542 
       
   543 	else
       
   544 		jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
       
   545 
       
   546 	if ( elem.parentNode )
       
   547 		elem.parentNode.removeChild( elem );
       
   548 }
       
   549 
       
   550 function now(){
       
   551 	return +new Date;
       
   552 }
       
   553 
       
   554 jQuery.extend = jQuery.fn.extend = function() {
       
   555 	// copy reference to target object
       
   556 	var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
       
   557 
       
   558 	// Handle a deep copy situation
       
   559 	if ( typeof target === "boolean" ) {
       
   560 		deep = target;
       
   561 		target = arguments[1] || {};
       
   562 		// skip the boolean and the target
       
   563 		i = 2;
       
   564 	}
       
   565 
       
   566 	// Handle case when target is a string or something (possible in deep copy)
       
   567 	if ( typeof target !== "object" && !jQuery.isFunction(target) )
       
   568 		target = {};
       
   569 
       
   570 	// extend jQuery itself if only one argument is passed
       
   571 	if ( length == i ) {
       
   572 		target = this;
       
   573 		--i;
       
   574 	}
       
   575 
       
   576 	for ( ; i < length; i++ )
       
   577 		// Only deal with non-null/undefined values
       
   578 		if ( (options = arguments[ i ]) != null )
       
   579 			// Extend the base object
       
   580 			for ( var name in options ) {
       
   581 				var src = target[ name ], copy = options[ name ];
       
   582 
       
   583 				// Prevent never-ending loop
       
   584 				if ( target === copy )
       
   585 					continue;
       
   586 
       
   587 				// Recurse if we're merging object values
       
   588 				if ( deep && copy && typeof copy === "object" && !copy.nodeType )
       
   589 					target[ name ] = jQuery.extend( deep, 
       
   590 						// Never move original objects, clone them
       
   591 						src || ( copy.length != null ? [ ] : { } )
       
   592 					, copy );
       
   593 
       
   594 				// Don't bring in undefined values
       
   595 				else if ( copy !== undefined )
       
   596 					target[ name ] = copy;
       
   597 
       
   598 			}
       
   599 
       
   600 	// Return the modified object
       
   601 	return target;
       
   602 };
       
   603 
       
   604 // exclude the following css properties to add px
       
   605 var	exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
       
   606 	// cache defaultView
       
   607 	defaultView = document.defaultView || {},
       
   608 	toString = Object.prototype.toString;
       
   609 
       
   610 jQuery.extend({
       
   611 	noConflict: function( deep ) {
       
   612 		window.$ = _$;
       
   613 
       
   614 		if ( deep )
       
   615 			window.jQuery = _jQuery;
       
   616 
       
   617 		return jQuery;
       
   618 	},
       
   619 
       
   620 	// See test/unit/core.js for details concerning isFunction.
       
   621 	// Since version 1.3, DOM methods and functions like alert
       
   622 	// aren't supported. They return false on IE (#2968).
       
   623 	isFunction: function( obj ) {
       
   624 		return toString.call(obj) === "[object Function]";
       
   625 	},
       
   626 
       
   627 	isArray: function( obj ) {
       
   628 		return toString.call(obj) === "[object Array]";
       
   629 	},
       
   630 
       
   631 	// check if an element is in a (or is an) XML document
       
   632 	isXMLDoc: function( elem ) {
       
   633 		return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
       
   634 			!!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument );
       
   635 	},
       
   636 
       
   637 	// Evalulates a script in a global context
       
   638 	globalEval: function( data ) {
       
   639 		data = jQuery.trim( data );
       
   640 
       
   641 		if ( data ) {
       
   642 			// Inspired by code by Andrea Giammarchi
       
   643 			// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
       
   644 			var head = document.getElementsByTagName("head")[0] || document.documentElement,
       
   645 				script = document.createElement("script");
       
   646 
       
   647 			script.type = "text/javascript";
       
   648 			if ( jQuery.support.scriptEval )
       
   649 				script.appendChild( document.createTextNode( data ) );
       
   650 			else
       
   651 				script.text = data;
       
   652 
       
   653 			// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
       
   654 			// This arises when a base node is used (#2709).
       
   655 			head.insertBefore( script, head.firstChild );
       
   656 			head.removeChild( script );
       
   657 		}
       
   658 	},
       
   659 
       
   660 	nodeName: function( elem, name ) {
       
   661 		return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
       
   662 	},
       
   663 
       
   664 	// args is for internal usage only
       
   665 	each: function( object, callback, args ) {
       
   666 		var name, i = 0, length = object.length;
       
   667 
       
   668 		if ( args ) {
       
   669 			if ( length === undefined ) {
       
   670 				for ( name in object )
       
   671 					if ( callback.apply( object[ name ], args ) === false )
       
   672 						break;
       
   673 			} else
       
   674 				for ( ; i < length; )
       
   675 					if ( callback.apply( object[ i++ ], args ) === false )
       
   676 						break;
       
   677 
       
   678 		// A special, fast, case for the most common use of each
       
   679 		} else {
       
   680 			if ( length === undefined ) {
       
   681 				for ( name in object )
       
   682 					if ( callback.call( object[ name ], name, object[ name ] ) === false )
       
   683 						break;
       
   684 			} else
       
   685 				for ( var value = object[0];
       
   686 					i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
       
   687 		}
       
   688 
       
   689 		return object;
       
   690 	},
       
   691 
       
   692 	prop: function( elem, value, type, i, name ) {
       
   693 		// Handle executable functions
       
   694 		if ( jQuery.isFunction( value ) )
       
   695 			value = value.call( elem, i );
       
   696 
       
   697 		// Handle passing in a number to a CSS property
       
   698 		return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ?
       
   699 			value + "px" :
       
   700 			value;
       
   701 	},
       
   702 
       
   703 	className: {
       
   704 		// internal only, use addClass("class")
       
   705 		add: function( elem, classNames ) {
       
   706 			jQuery.each((classNames || "").split(/\s+/), function(i, className){
       
   707 				if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
       
   708 					elem.className += (elem.className ? " " : "") + className;
       
   709 			});
       
   710 		},
       
   711 
       
   712 		// internal only, use removeClass("class")
       
   713 		remove: function( elem, classNames ) {
       
   714 			if (elem.nodeType == 1)
       
   715 				elem.className = classNames !== undefined ?
       
   716 					jQuery.grep(elem.className.split(/\s+/), function(className){
       
   717 						return !jQuery.className.has( classNames, className );
       
   718 					}).join(" ") :
       
   719 					"";
       
   720 		},
       
   721 
       
   722 		// internal only, use hasClass("class")
       
   723 		has: function( elem, className ) {
       
   724 			return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
       
   725 		}
       
   726 	},
       
   727 
       
   728 	// A method for quickly swapping in/out CSS properties to get correct calculations
       
   729 	swap: function( elem, options, callback ) {
       
   730 		var old = {};
       
   731 		// Remember the old values, and insert the new ones
       
   732 		for ( var name in options ) {
       
   733 			old[ name ] = elem.style[ name ];
       
   734 			elem.style[ name ] = options[ name ];
       
   735 		}
       
   736 
       
   737 		callback.call( elem );
       
   738 
       
   739 		// Revert the old values
       
   740 		for ( var name in options )
       
   741 			elem.style[ name ] = old[ name ];
       
   742 	},
       
   743 
       
   744 	css: function( elem, name, force ) {
       
   745 		if ( name == "width" || name == "height" ) {
       
   746 			var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
       
   747 
       
   748 			function getWH() {
       
   749 				val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
       
   750 				var padding = 0, border = 0;
       
   751 				jQuery.each( which, function() {
       
   752 					padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
       
   753 					border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
       
   754 				});
       
   755 				val -= Math.round(padding + border);
       
   756 			}
       
   757 
       
   758 			if ( jQuery(elem).is(":visible") )
       
   759 				getWH();
       
   760 			else
       
   761 				jQuery.swap( elem, props, getWH );
       
   762 
       
   763 			return Math.max(0, val);
       
   764 		}
       
   765 
       
   766 		return jQuery.curCSS( elem, name, force );
       
   767 	},
       
   768 
       
   769 	curCSS: function( elem, name, force ) {
       
   770 		var ret, style = elem.style;
       
   771 
       
   772 		// We need to handle opacity special in IE
       
   773 		if ( name == "opacity" && !jQuery.support.opacity ) {
       
   774 			ret = jQuery.attr( style, "opacity" );
       
   775 
       
   776 			return ret == "" ?
       
   777 				"1" :
       
   778 				ret;
       
   779 		}
       
   780 
       
   781 		// Make sure we're using the right name for getting the float value
       
   782 		if ( name.match( /float/i ) )
       
   783 			name = styleFloat;
       
   784 
       
   785 		if ( !force && style && style[ name ] )
       
   786 			ret = style[ name ];
       
   787 
       
   788 		else if ( defaultView.getComputedStyle ) {
       
   789 
       
   790 			// Only "float" is needed here
       
   791 			if ( name.match( /float/i ) )
       
   792 				name = "float";
       
   793 
       
   794 			name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
       
   795 
       
   796 			var computedStyle = defaultView.getComputedStyle( elem, null );
       
   797 
       
   798 			if ( computedStyle )
       
   799 				ret = computedStyle.getPropertyValue( name );
       
   800 
       
   801 			// We should always get a number back from opacity
       
   802 			if ( name == "opacity" && ret == "" )
       
   803 				ret = "1";
       
   804 
       
   805 		} else if ( elem.currentStyle ) {
       
   806 			var camelCase = name.replace(/\-(\w)/g, function(all, letter){
       
   807 				return letter.toUpperCase();
       
   808 			});
       
   809 
       
   810 			ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
       
   811 
       
   812 			// From the awesome hack by Dean Edwards
       
   813 			// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
       
   814 
       
   815 			// If we're not dealing with a regular pixel number
       
   816 			// but a number that has a weird ending, we need to convert it to pixels
       
   817 			if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
       
   818 				// Remember the original values
       
   819 				var left = style.left, rsLeft = elem.runtimeStyle.left;
       
   820 
       
   821 				// Put in the new values to get a computed value out
       
   822 				elem.runtimeStyle.left = elem.currentStyle.left;
       
   823 				style.left = ret || 0;
       
   824 				ret = style.pixelLeft + "px";
       
   825 
       
   826 				// Revert the changed values
       
   827 				style.left = left;
       
   828 				elem.runtimeStyle.left = rsLeft;
       
   829 			}
       
   830 		}
       
   831 
       
   832 		return ret;
       
   833 	},
       
   834 
       
   835 	clean: function( elems, context, fragment ) {
       
   836 		context = context || document;
       
   837 
       
   838 		// !context.createElement fails in IE with an error but returns typeof 'object'
       
   839 		if ( typeof context.createElement === "undefined" )
       
   840 			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
       
   841 
       
   842 		// If a single string is passed in and it's a single tag
       
   843 		// just do a createElement and skip the rest
       
   844 		if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) {
       
   845 			var match = /^<(\w+)\s*\/?>$/.exec(elems[0]);
       
   846 			if ( match )
       
   847 				return [ context.createElement( match[1] ) ];
       
   848 		}
       
   849 
       
   850 		var ret = [], scripts = [], div = context.createElement("div");
       
   851 
       
   852 		jQuery.each(elems, function(i, elem){
       
   853 			if ( typeof elem === "number" )
       
   854 				elem += '';
       
   855 
       
   856 			if ( !elem )
       
   857 				return;
       
   858 
       
   859 			// Convert html string into DOM nodes
       
   860 			if ( typeof elem === "string" ) {
       
   861 				// Fix "XHTML"-style tags in all browsers
       
   862 				elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
       
   863 					return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
       
   864 						all :
       
   865 						front + "></" + tag + ">";
       
   866 				});
       
   867 
       
   868 				// Trim whitespace, otherwise indexOf won't work as expected
       
   869 				var tags = jQuery.trim( elem ).toLowerCase();
       
   870 
       
   871 				var wrap =
       
   872 					// option or optgroup
       
   873 					!tags.indexOf("<opt") &&
       
   874 					[ 1, "<select multiple='multiple'>", "</select>" ] ||
       
   875 
       
   876 					!tags.indexOf("<leg") &&
       
   877 					[ 1, "<fieldset>", "</fieldset>" ] ||
       
   878 
       
   879 					tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
       
   880 					[ 1, "<table>", "</table>" ] ||
       
   881 
       
   882 					!tags.indexOf("<tr") &&
       
   883 					[ 2, "<table><tbody>", "</tbody></table>" ] ||
       
   884 
       
   885 				 	// <thead> matched above
       
   886 					(!tags.indexOf("<td") || !tags.indexOf("<th")) &&
       
   887 					[ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
       
   888 
       
   889 					!tags.indexOf("<col") &&
       
   890 					[ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
       
   891 
       
   892 					// IE can't serialize <link> and <script> tags normally
       
   893 					!jQuery.support.htmlSerialize &&
       
   894 					[ 1, "div<div>", "</div>" ] ||
       
   895 
       
   896 					[ 0, "", "" ];
       
   897 
       
   898 				// Go to html and back, then peel off extra wrappers
       
   899 				div.innerHTML = wrap[1] + elem + wrap[2];
       
   900 
       
   901 				// Move to the right depth
       
   902 				while ( wrap[0]-- )
       
   903 					div = div.lastChild;
       
   904 
       
   905 				// Remove IE's autoinserted <tbody> from table fragments
       
   906 				if ( !jQuery.support.tbody ) {
       
   907 
       
   908 					// String was a <table>, *may* have spurious <tbody>
       
   909 					var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ?
       
   910 						div.firstChild && div.firstChild.childNodes :
       
   911 
       
   912 						// String was a bare <thead> or <tfoot>
       
   913 						wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ?
       
   914 							div.childNodes :
       
   915 							[];
       
   916 
       
   917 					for ( var j = tbody.length - 1; j >= 0 ; --j )
       
   918 						if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
       
   919 							tbody[ j ].parentNode.removeChild( tbody[ j ] );
       
   920 
       
   921 					}
       
   922 
       
   923 				// IE completely kills leading whitespace when innerHTML is used
       
   924 				if ( !jQuery.support.leadingWhitespace && /^\s/.test( elem ) )
       
   925 					div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
       
   926 				
       
   927 				elem = jQuery.makeArray( div.childNodes );
       
   928 			}
       
   929 
       
   930 			if ( elem.nodeType )
       
   931 				ret.push( elem );
       
   932 			else
       
   933 				ret = jQuery.merge( ret, elem );
       
   934 
       
   935 		});
       
   936 
       
   937 		if ( fragment ) {
       
   938 			for ( var i = 0; ret[i]; i++ ) {
       
   939 				if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
       
   940 					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
       
   941 				} else {
       
   942 					if ( ret[i].nodeType === 1 )
       
   943 						ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
       
   944 					fragment.appendChild( ret[i] );
       
   945 				}
       
   946 			}
       
   947 			
       
   948 			return scripts;
       
   949 		}
       
   950 
       
   951 		return ret;
       
   952 	},
       
   953 
       
   954 	attr: function( elem, name, value ) {
       
   955 		// don't set attributes on text and comment nodes
       
   956 		if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
       
   957 			return undefined;
       
   958 
       
   959 		var notxml = !jQuery.isXMLDoc( elem ),
       
   960 			// Whether we are setting (or getting)
       
   961 			set = value !== undefined;
       
   962 
       
   963 		// Try to normalize/fix the name
       
   964 		name = notxml && jQuery.props[ name ] || name;
       
   965 
       
   966 		// Only do all the following if this is a node (faster for style)
       
   967 		// IE elem.getAttribute passes even for style
       
   968 		if ( elem.tagName ) {
       
   969 
       
   970 			// These attributes require special treatment
       
   971 			var special = /href|src|style/.test( name );
       
   972 
       
   973 			// Safari mis-reports the default selected property of a hidden option
       
   974 			// Accessing the parent's selectedIndex property fixes it
       
   975 			if ( name == "selected" && elem.parentNode )
       
   976 				elem.parentNode.selectedIndex;
       
   977 
       
   978 			// If applicable, access the attribute via the DOM 0 way
       
   979 			if ( name in elem && notxml && !special ) {
       
   980 				if ( set ){
       
   981 					// We can't allow the type property to be changed (since it causes problems in IE)
       
   982 					if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
       
   983 						throw "type property can't be changed";
       
   984 
       
   985 					elem[ name ] = value;
       
   986 				}
       
   987 
       
   988 				// browsers index elements by id/name on forms, give priority to attributes.
       
   989 				if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
       
   990 					return elem.getAttributeNode( name ).nodeValue;
       
   991 
       
   992 				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
       
   993 				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
       
   994 				if ( name == "tabIndex" ) {
       
   995 					var attributeNode = elem.getAttributeNode( "tabIndex" );
       
   996 					return attributeNode && attributeNode.specified
       
   997 						? attributeNode.value
       
   998 						: elem.nodeName.match(/(button|input|object|select|textarea)/i)
       
   999 							? 0
       
  1000 							: elem.nodeName.match(/^(a|area)$/i) && elem.href
       
  1001 								? 0
       
  1002 								: undefined;
       
  1003 				}
       
  1004 
       
  1005 				return elem[ name ];
       
  1006 			}
       
  1007 
       
  1008 			if ( !jQuery.support.style && notxml &&  name == "style" )
       
  1009 				return jQuery.attr( elem.style, "cssText", value );
       
  1010 
       
  1011 			if ( set )
       
  1012 				// convert the value to a string (all browsers do this but IE) see #1070
       
  1013 				elem.setAttribute( name, "" + value );
       
  1014 
       
  1015 			var attr = !jQuery.support.hrefNormalized && notxml && special
       
  1016 					// Some attributes require a special call on IE
       
  1017 					? elem.getAttribute( name, 2 )
       
  1018 					: elem.getAttribute( name );
       
  1019 
       
  1020 			// Non-existent attributes return null, we normalize to undefined
       
  1021 			return attr === null ? undefined : attr;
       
  1022 		}
       
  1023 
       
  1024 		// elem is actually elem.style ... set the style
       
  1025 
       
  1026 		// IE uses filters for opacity
       
  1027 		if ( !jQuery.support.opacity && name == "opacity" ) {
       
  1028 			if ( set ) {
       
  1029 				// IE has trouble with opacity if it does not have layout
       
  1030 				// Force it by setting the zoom level
       
  1031 				elem.zoom = 1;
       
  1032 
       
  1033 				// Set the alpha filter to set the opacity
       
  1034 				elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +
       
  1035 					(parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
       
  1036 			}
       
  1037 
       
  1038 			return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
       
  1039 				(parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
       
  1040 				"";
       
  1041 		}
       
  1042 
       
  1043 		name = name.replace(/-([a-z])/ig, function(all, letter){
       
  1044 			return letter.toUpperCase();
       
  1045 		});
       
  1046 
       
  1047 		if ( set )
       
  1048 			elem[ name ] = value;
       
  1049 
       
  1050 		return elem[ name ];
       
  1051 	},
       
  1052 
       
  1053 	trim: function( text ) {
       
  1054 		return (text || "").replace( /^\s+|\s+$/g, "" );
       
  1055 	},
       
  1056 
       
  1057 	makeArray: function( array ) {
       
  1058 		var ret = [];
       
  1059 
       
  1060 		if( array != null ){
       
  1061 			var i = array.length;
       
  1062 			// The window, strings (and functions) also have 'length'
       
  1063 			if( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval )
       
  1064 				ret[0] = array;
       
  1065 			else
       
  1066 				while( i )
       
  1067 					ret[--i] = array[i];
       
  1068 		}
       
  1069 
       
  1070 		return ret;
       
  1071 	},
       
  1072 
       
  1073 	inArray: function( elem, array ) {
       
  1074 		for ( var i = 0, length = array.length; i < length; i++ )
       
  1075 		// Use === because on IE, window == document
       
  1076 			if ( array[ i ] === elem )
       
  1077 				return i;
       
  1078 
       
  1079 		return -1;
       
  1080 	},
       
  1081 
       
  1082 	merge: function( first, second ) {
       
  1083 		// We have to loop this way because IE & Opera overwrite the length
       
  1084 		// expando of getElementsByTagName
       
  1085 		var i = 0, elem, pos = first.length;
       
  1086 		// Also, we need to make sure that the correct elements are being returned
       
  1087 		// (IE returns comment nodes in a '*' query)
       
  1088 		if ( !jQuery.support.getAll ) {
       
  1089 			while ( (elem = second[ i++ ]) != null )
       
  1090 				if ( elem.nodeType != 8 )
       
  1091 					first[ pos++ ] = elem;
       
  1092 
       
  1093 		} else
       
  1094 			while ( (elem = second[ i++ ]) != null )
       
  1095 				first[ pos++ ] = elem;
       
  1096 
       
  1097 		return first;
       
  1098 	},
       
  1099 
       
  1100 	unique: function( array ) {
       
  1101 		var ret = [], done = {};
       
  1102 
       
  1103 		try {
       
  1104 
       
  1105 			for ( var i = 0, length = array.length; i < length; i++ ) {
       
  1106 				var id = jQuery.data( array[ i ] );
       
  1107 
       
  1108 				if ( !done[ id ] ) {
       
  1109 					done[ id ] = true;
       
  1110 					ret.push( array[ i ] );
       
  1111 				}
       
  1112 			}
       
  1113 
       
  1114 		} catch( e ) {
       
  1115 			ret = array;
       
  1116 		}
       
  1117 
       
  1118 		return ret;
       
  1119 	},
       
  1120 
       
  1121 	grep: function( elems, callback, inv ) {
       
  1122 		var ret = [];
       
  1123 
       
  1124 		// Go through the array, only saving the items
       
  1125 		// that pass the validator function
       
  1126 		for ( var i = 0, length = elems.length; i < length; i++ )
       
  1127 			if ( !inv != !callback( elems[ i ], i ) )
       
  1128 				ret.push( elems[ i ] );
       
  1129 
       
  1130 		return ret;
       
  1131 	},
       
  1132 
       
  1133 	map: function( elems, callback ) {
       
  1134 		var ret = [];
       
  1135 
       
  1136 		// Go through the array, translating each of the items to their
       
  1137 		// new value (or values).
       
  1138 		for ( var i = 0, length = elems.length; i < length; i++ ) {
       
  1139 			var value = callback( elems[ i ], i );
       
  1140 
       
  1141 			if ( value != null )
       
  1142 				ret[ ret.length ] = value;
       
  1143 		}
       
  1144 
       
  1145 		return ret.concat.apply( [], ret );
       
  1146 	}
       
  1147 });
       
  1148 
       
  1149 // Use of jQuery.browser is deprecated.
       
  1150 // It's included for backwards compatibility and plugins,
       
  1151 // although they should work to migrate away.
       
  1152 
       
  1153 var userAgent = navigator.userAgent.toLowerCase();
       
  1154 
       
  1155 // Figure out what browser is being used
       
  1156 jQuery.browser = {
       
  1157 	version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
       
  1158 	safari: /webkit/.test( userAgent ),
       
  1159 	opera: /opera/.test( userAgent ),
       
  1160 	msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
       
  1161 	mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
       
  1162 };
       
  1163 
       
  1164 jQuery.each({
       
  1165 	parent: function(elem){return elem.parentNode;},
       
  1166 	parents: function(elem){return jQuery.dir(elem,"parentNode");},
       
  1167 	next: function(elem){return jQuery.nth(elem,2,"nextSibling");},
       
  1168 	prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},
       
  1169 	nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},
       
  1170 	prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},
       
  1171 	siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
       
  1172 	children: function(elem){return jQuery.sibling(elem.firstChild);},
       
  1173 	contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
       
  1174 }, function(name, fn){
       
  1175 	jQuery.fn[ name ] = function( selector ) {
       
  1176 		var ret = jQuery.map( this, fn );
       
  1177 
       
  1178 		if ( selector && typeof selector == "string" )
       
  1179 			ret = jQuery.multiFilter( selector, ret );
       
  1180 
       
  1181 		return this.pushStack( jQuery.unique( ret ), name, selector );
       
  1182 	};
       
  1183 });
       
  1184 
       
  1185 jQuery.each({
       
  1186 	appendTo: "append",
       
  1187 	prependTo: "prepend",
       
  1188 	insertBefore: "before",
       
  1189 	insertAfter: "after",
       
  1190 	replaceAll: "replaceWith"
       
  1191 }, function(name, original){
       
  1192 	jQuery.fn[ name ] = function() {
       
  1193 		var args = arguments;
       
  1194 
       
  1195 		return this.each(function(){
       
  1196 			for ( var i = 0, length = args.length; i < length; i++ )
       
  1197 				jQuery( args[ i ] )[ original ]( this );
       
  1198 		});
       
  1199 	};
       
  1200 });
       
  1201 
       
  1202 jQuery.each({
       
  1203 	removeAttr: function( name ) {
       
  1204 		jQuery.attr( this, name, "" );
       
  1205 		if (this.nodeType == 1)
       
  1206 			this.removeAttribute( name );
       
  1207 	},
       
  1208 
       
  1209 	addClass: function( classNames ) {
       
  1210 		jQuery.className.add( this, classNames );
       
  1211 	},
       
  1212 
       
  1213 	removeClass: function( classNames ) {
       
  1214 		jQuery.className.remove( this, classNames );
       
  1215 	},
       
  1216 
       
  1217 	toggleClass: function( classNames, state ) {
       
  1218 		if( typeof state !== "boolean" )
       
  1219 			state = !jQuery.className.has( this, classNames );
       
  1220 		jQuery.className[ state ? "add" : "remove" ]( this, classNames );
       
  1221 	},
       
  1222 
       
  1223 	remove: function( selector ) {
       
  1224 		if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
       
  1225 			// Prevent memory leaks
       
  1226 			jQuery( "*", this ).add([this]).each(function(){
       
  1227 				jQuery.event.remove(this);
       
  1228 				jQuery.removeData(this);
       
  1229 			});
       
  1230 			if (this.parentNode)
       
  1231 				this.parentNode.removeChild( this );
       
  1232 		}
       
  1233 	},
       
  1234 
       
  1235 	empty: function() {
       
  1236 		// Remove element nodes and prevent memory leaks
       
  1237 		jQuery( ">*", this ).remove();
       
  1238 
       
  1239 		// Remove any remaining nodes
       
  1240 		while ( this.firstChild )
       
  1241 			this.removeChild( this.firstChild );
       
  1242 	}
       
  1243 }, function(name, fn){
       
  1244 	jQuery.fn[ name ] = function(){
       
  1245 		return this.each( fn, arguments );
       
  1246 	};
       
  1247 });
       
  1248 
       
  1249 // Helper function used by the dimensions and offset modules
       
  1250 function num(elem, prop) {
       
  1251 	return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
       
  1252 }
       
  1253 var expando = "jQuery" + now(), uuid = 0, windowData = {};
       
  1254 
       
  1255 jQuery.extend({
       
  1256 	cache: {},
       
  1257 
       
  1258 	data: function( elem, name, data ) {
       
  1259 		elem = elem == window ?
       
  1260 			windowData :
       
  1261 			elem;
       
  1262 
       
  1263 		var id = elem[ expando ];
       
  1264 
       
  1265 		// Compute a unique ID for the element
       
  1266 		if ( !id )
       
  1267 			id = elem[ expando ] = ++uuid;
       
  1268 
       
  1269 		// Only generate the data cache if we're
       
  1270 		// trying to access or manipulate it
       
  1271 		if ( name && !jQuery.cache[ id ] )
       
  1272 			jQuery.cache[ id ] = {};
       
  1273 
       
  1274 		// Prevent overriding the named cache with undefined values
       
  1275 		if ( data !== undefined )
       
  1276 			jQuery.cache[ id ][ name ] = data;
       
  1277 
       
  1278 		// Return the named cache data, or the ID for the element
       
  1279 		return name ?
       
  1280 			jQuery.cache[ id ][ name ] :
       
  1281 			id;
       
  1282 	},
       
  1283 
       
  1284 	removeData: function( elem, name ) {
       
  1285 		elem = elem == window ?
       
  1286 			windowData :
       
  1287 			elem;
       
  1288 
       
  1289 		var id = elem[ expando ];
       
  1290 
       
  1291 		// If we want to remove a specific section of the element's data
       
  1292 		if ( name ) {
       
  1293 			if ( jQuery.cache[ id ] ) {
       
  1294 				// Remove the section of cache data
       
  1295 				delete jQuery.cache[ id ][ name ];
       
  1296 
       
  1297 				// If we've removed all the data, remove the element's cache
       
  1298 				name = "";
       
  1299 
       
  1300 				for ( name in jQuery.cache[ id ] )
       
  1301 					break;
       
  1302 
       
  1303 				if ( !name )
       
  1304 					jQuery.removeData( elem );
       
  1305 			}
       
  1306 
       
  1307 		// Otherwise, we want to remove all of the element's data
       
  1308 		} else {
       
  1309 			// Clean up the element expando
       
  1310 			try {
       
  1311 				delete elem[ expando ];
       
  1312 			} catch(e){
       
  1313 				// IE has trouble directly removing the expando
       
  1314 				// but it's ok with using removeAttribute
       
  1315 				if ( elem.removeAttribute )
       
  1316 					elem.removeAttribute( expando );
       
  1317 			}
       
  1318 
       
  1319 			// Completely remove the data cache
       
  1320 			delete jQuery.cache[ id ];
       
  1321 		}
       
  1322 	},
       
  1323 	queue: function( elem, type, data ) {
       
  1324 		if ( elem ){
       
  1325 	
       
  1326 			type = (type || "fx") + "queue";
       
  1327 	
       
  1328 			var q = jQuery.data( elem, type );
       
  1329 	
       
  1330 			if ( !q || jQuery.isArray(data) )
       
  1331 				q = jQuery.data( elem, type, jQuery.makeArray(data) );
       
  1332 			else if( data )
       
  1333 				q.push( data );
       
  1334 	
       
  1335 		}
       
  1336 		return q;
       
  1337 	},
       
  1338 
       
  1339 	dequeue: function( elem, type ){
       
  1340 		var queue = jQuery.queue( elem, type ),
       
  1341 			fn = queue.shift();
       
  1342 		
       
  1343 		if( !type || type === "fx" )
       
  1344 			fn = queue[0];
       
  1345 			
       
  1346 		if( fn !== undefined )
       
  1347 			fn.call(elem);
       
  1348 	}
       
  1349 });
       
  1350 
       
  1351 jQuery.fn.extend({
       
  1352 	data: function( key, value ){
       
  1353 		var parts = key.split(".");
       
  1354 		parts[1] = parts[1] ? "." + parts[1] : "";
       
  1355 
       
  1356 		if ( value === undefined ) {
       
  1357 			var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
       
  1358 
       
  1359 			if ( data === undefined && this.length )
       
  1360 				data = jQuery.data( this[0], key );
       
  1361 
       
  1362 			return data === undefined && parts[1] ?
       
  1363 				this.data( parts[0] ) :
       
  1364 				data;
       
  1365 		} else
       
  1366 			return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
       
  1367 				jQuery.data( this, key, value );
       
  1368 			});
       
  1369 	},
       
  1370 
       
  1371 	removeData: function( key ){
       
  1372 		return this.each(function(){
       
  1373 			jQuery.removeData( this, key );
       
  1374 		});
       
  1375 	},
       
  1376 	queue: function(type, data){
       
  1377 		if ( typeof type !== "string" ) {
       
  1378 			data = type;
       
  1379 			type = "fx";
       
  1380 		}
       
  1381 
       
  1382 		if ( data === undefined )
       
  1383 			return jQuery.queue( this[0], type );
       
  1384 
       
  1385 		return this.each(function(){
       
  1386 			var queue = jQuery.queue( this, type, data );
       
  1387 			
       
  1388 			 if( type == "fx" && queue.length == 1 )
       
  1389 				queue[0].call(this);
       
  1390 		});
       
  1391 	},
       
  1392 	dequeue: function(type){
       
  1393 		return this.each(function(){
       
  1394 			jQuery.dequeue( this, type );
       
  1395 		});
       
  1396 	}
       
  1397 });/*!
       
  1398  * Sizzle CSS Selector Engine - v0.9.3
       
  1399  *  Copyright 2009, The Dojo Foundation
       
  1400  *  Released under the MIT, BSD, and GPL Licenses.
       
  1401  *  More information: http://sizzlejs.com/
       
  1402  */
       
  1403 (function(){
       
  1404 
       
  1405 var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]+['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g,
       
  1406 	done = 0,
       
  1407 	toString = Object.prototype.toString;
       
  1408 
       
  1409 var Sizzle = function(selector, context, results, seed) {
       
  1410 	results = results || [];
       
  1411 	context = context || document;
       
  1412 
       
  1413 	if ( context.nodeType !== 1 && context.nodeType !== 9 )
       
  1414 		return [];
       
  1415 	
       
  1416 	if ( !selector || typeof selector !== "string" ) {
       
  1417 		return results;
       
  1418 	}
       
  1419 
       
  1420 	var parts = [], m, set, checkSet, check, mode, extra, prune = true;
       
  1421 	
       
  1422 	// Reset the position of the chunker regexp (start from head)
       
  1423 	chunker.lastIndex = 0;
       
  1424 	
       
  1425 	while ( (m = chunker.exec(selector)) !== null ) {
       
  1426 		parts.push( m[1] );
       
  1427 		
       
  1428 		if ( m[2] ) {
       
  1429 			extra = RegExp.rightContext;
       
  1430 			break;
       
  1431 		}
       
  1432 	}
       
  1433 
       
  1434 	if ( parts.length > 1 && origPOS.exec( selector ) ) {
       
  1435 		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
       
  1436 			set = posProcess( parts[0] + parts[1], context );
       
  1437 		} else {
       
  1438 			set = Expr.relative[ parts[0] ] ?
       
  1439 				[ context ] :
       
  1440 				Sizzle( parts.shift(), context );
       
  1441 
       
  1442 			while ( parts.length ) {
       
  1443 				selector = parts.shift();
       
  1444 
       
  1445 				if ( Expr.relative[ selector ] )
       
  1446 					selector += parts.shift();
       
  1447 
       
  1448 				set = posProcess( selector, set );
       
  1449 			}
       
  1450 		}
       
  1451 	} else {
       
  1452 		var ret = seed ?
       
  1453 			{ expr: parts.pop(), set: makeArray(seed) } :
       
  1454 			Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context, isXML(context) );
       
  1455 		set = Sizzle.filter( ret.expr, ret.set );
       
  1456 
       
  1457 		if ( parts.length > 0 ) {
       
  1458 			checkSet = makeArray(set);
       
  1459 		} else {
       
  1460 			prune = false;
       
  1461 		}
       
  1462 
       
  1463 		while ( parts.length ) {
       
  1464 			var cur = parts.pop(), pop = cur;
       
  1465 
       
  1466 			if ( !Expr.relative[ cur ] ) {
       
  1467 				cur = "";
       
  1468 			} else {
       
  1469 				pop = parts.pop();
       
  1470 			}
       
  1471 
       
  1472 			if ( pop == null ) {
       
  1473 				pop = context;
       
  1474 			}
       
  1475 
       
  1476 			Expr.relative[ cur ]( checkSet, pop, isXML(context) );
       
  1477 		}
       
  1478 	}
       
  1479 
       
  1480 	if ( !checkSet ) {
       
  1481 		checkSet = set;
       
  1482 	}
       
  1483 
       
  1484 	if ( !checkSet ) {
       
  1485 		throw "Syntax error, unrecognized expression: " + (cur || selector);
       
  1486 	}
       
  1487 
       
  1488 	if ( toString.call(checkSet) === "[object Array]" ) {
       
  1489 		if ( !prune ) {
       
  1490 			results.push.apply( results, checkSet );
       
  1491 		} else if ( context.nodeType === 1 ) {
       
  1492 			for ( var i = 0; checkSet[i] != null; i++ ) {
       
  1493 				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
       
  1494 					results.push( set[i] );
       
  1495 				}
       
  1496 			}
       
  1497 		} else {
       
  1498 			for ( var i = 0; checkSet[i] != null; i++ ) {
       
  1499 				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
       
  1500 					results.push( set[i] );
       
  1501 				}
       
  1502 			}
       
  1503 		}
       
  1504 	} else {
       
  1505 		makeArray( checkSet, results );
       
  1506 	}
       
  1507 
       
  1508 	if ( extra ) {
       
  1509 		Sizzle( extra, context, results, seed );
       
  1510 	}
       
  1511 
       
  1512 	return results;
       
  1513 };
       
  1514 
       
  1515 Sizzle.matches = function(expr, set){
       
  1516 	return Sizzle(expr, null, null, set);
       
  1517 };
       
  1518 
       
  1519 Sizzle.find = function(expr, context, isXML){
       
  1520 	var set, match;
       
  1521 
       
  1522 	if ( !expr ) {
       
  1523 		return [];
       
  1524 	}
       
  1525 
       
  1526 	for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
       
  1527 		var type = Expr.order[i], match;
       
  1528 		
       
  1529 		if ( (match = Expr.match[ type ].exec( expr )) ) {
       
  1530 			var left = RegExp.leftContext;
       
  1531 
       
  1532 			if ( left.substr( left.length - 1 ) !== "\\" ) {
       
  1533 				match[1] = (match[1] || "").replace(/\\/g, "");
       
  1534 				set = Expr.find[ type ]( match, context, isXML );
       
  1535 				if ( set != null ) {
       
  1536 					expr = expr.replace( Expr.match[ type ], "" );
       
  1537 					break;
       
  1538 				}
       
  1539 			}
       
  1540 		}
       
  1541 	}
       
  1542 
       
  1543 	if ( !set ) {
       
  1544 		set = context.getElementsByTagName("*");
       
  1545 	}
       
  1546 
       
  1547 	return {set: set, expr: expr};
       
  1548 };
       
  1549 
       
  1550 Sizzle.filter = function(expr, set, inplace, not){
       
  1551 	var old = expr, result = [], curLoop = set, match, anyFound;
       
  1552 
       
  1553 	while ( expr && set.length ) {
       
  1554 		for ( var type in Expr.filter ) {
       
  1555 			if ( (match = Expr.match[ type ].exec( expr )) != null ) {
       
  1556 				var filter = Expr.filter[ type ], found, item;
       
  1557 				anyFound = false;
       
  1558 
       
  1559 				if ( curLoop == result ) {
       
  1560 					result = [];
       
  1561 				}
       
  1562 
       
  1563 				if ( Expr.preFilter[ type ] ) {
       
  1564 					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not );
       
  1565 
       
  1566 					if ( !match ) {
       
  1567 						anyFound = found = true;
       
  1568 					} else if ( match === true ) {
       
  1569 						continue;
       
  1570 					}
       
  1571 				}
       
  1572 
       
  1573 				if ( match ) {
       
  1574 					for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
       
  1575 						if ( item ) {
       
  1576 							found = filter( item, match, i, curLoop );
       
  1577 							var pass = not ^ !!found;
       
  1578 
       
  1579 							if ( inplace && found != null ) {
       
  1580 								if ( pass ) {
       
  1581 									anyFound = true;
       
  1582 								} else {
       
  1583 									curLoop[i] = false;
       
  1584 								}
       
  1585 							} else if ( pass ) {
       
  1586 								result.push( item );
       
  1587 								anyFound = true;
       
  1588 							}
       
  1589 						}
       
  1590 					}
       
  1591 				}
       
  1592 
       
  1593 				if ( found !== undefined ) {
       
  1594 					if ( !inplace ) {
       
  1595 						curLoop = result;
       
  1596 					}
       
  1597 
       
  1598 					expr = expr.replace( Expr.match[ type ], "" );
       
  1599 
       
  1600 					if ( !anyFound ) {
       
  1601 						return [];
       
  1602 					}
       
  1603 
       
  1604 					break;
       
  1605 				}
       
  1606 			}
       
  1607 		}
       
  1608 
       
  1609 		expr = expr.replace(/\s*,\s*/, "");
       
  1610 
       
  1611 		// Improper expression
       
  1612 		if ( expr == old ) {
       
  1613 			if ( anyFound == null ) {
       
  1614 				throw "Syntax error, unrecognized expression: " + expr;
       
  1615 			} else {
       
  1616 				break;
       
  1617 			}
       
  1618 		}
       
  1619 
       
  1620 		old = expr;
       
  1621 	}
       
  1622 
       
  1623 	return curLoop;
       
  1624 };
       
  1625 
       
  1626 var Expr = Sizzle.selectors = {
       
  1627 	order: [ "ID", "NAME", "TAG" ],
       
  1628 	match: {
       
  1629 		ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
       
  1630 		CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
       
  1631 		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,
       
  1632 		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
       
  1633 		TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,
       
  1634 		CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
       
  1635 		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
       
  1636 		PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
       
  1637 	},
       
  1638 	attrMap: {
       
  1639 		"class": "className",
       
  1640 		"for": "htmlFor"
       
  1641 	},
       
  1642 	attrHandle: {
       
  1643 		href: function(elem){
       
  1644 			return elem.getAttribute("href");
       
  1645 		}
       
  1646 	},
       
  1647 	relative: {
       
  1648 		"+": function(checkSet, part){
       
  1649 			for ( var i = 0, l = checkSet.length; i < l; i++ ) {
       
  1650 				var elem = checkSet[i];
       
  1651 				if ( elem ) {
       
  1652 					var cur = elem.previousSibling;
       
  1653 					while ( cur && cur.nodeType !== 1 ) {
       
  1654 						cur = cur.previousSibling;
       
  1655 					}
       
  1656 					checkSet[i] = typeof part === "string" ?
       
  1657 						cur || false :
       
  1658 						cur === part;
       
  1659 				}
       
  1660 			}
       
  1661 
       
  1662 			if ( typeof part === "string" ) {
       
  1663 				Sizzle.filter( part, checkSet, true );
       
  1664 			}
       
  1665 		},
       
  1666 		">": function(checkSet, part, isXML){
       
  1667 			if ( typeof part === "string" && !/\W/.test(part) ) {
       
  1668 				part = isXML ? part : part.toUpperCase();
       
  1669 
       
  1670 				for ( var i = 0, l = checkSet.length; i < l; i++ ) {
       
  1671 					var elem = checkSet[i];
       
  1672 					if ( elem ) {
       
  1673 						var parent = elem.parentNode;
       
  1674 						checkSet[i] = parent.nodeName === part ? parent : false;
       
  1675 					}
       
  1676 				}
       
  1677 			} else {
       
  1678 				for ( var i = 0, l = checkSet.length; i < l; i++ ) {
       
  1679 					var elem = checkSet[i];
       
  1680 					if ( elem ) {
       
  1681 						checkSet[i] = typeof part === "string" ?
       
  1682 							elem.parentNode :
       
  1683 							elem.parentNode === part;
       
  1684 					}
       
  1685 				}
       
  1686 
       
  1687 				if ( typeof part === "string" ) {
       
  1688 					Sizzle.filter( part, checkSet, true );
       
  1689 				}
       
  1690 			}
       
  1691 		},
       
  1692 		"": function(checkSet, part, isXML){
       
  1693 			var doneName = "done" + (done++), checkFn = dirCheck;
       
  1694 
       
  1695 			if ( !part.match(/\W/) ) {
       
  1696 				var nodeCheck = part = isXML ? part : part.toUpperCase();
       
  1697 				checkFn = dirNodeCheck;
       
  1698 			}
       
  1699 
       
  1700 			checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
       
  1701 		},
       
  1702 		"~": function(checkSet, part, isXML){
       
  1703 			var doneName = "done" + (done++), checkFn = dirCheck;
       
  1704 
       
  1705 			if ( typeof part === "string" && !part.match(/\W/) ) {
       
  1706 				var nodeCheck = part = isXML ? part : part.toUpperCase();
       
  1707 				checkFn = dirNodeCheck;
       
  1708 			}
       
  1709 
       
  1710 			checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
       
  1711 		}
       
  1712 	},
       
  1713 	find: {
       
  1714 		ID: function(match, context, isXML){
       
  1715 			if ( typeof context.getElementById !== "undefined" && !isXML ) {
       
  1716 				var m = context.getElementById(match[1]);
       
  1717 				return m ? [m] : [];
       
  1718 			}
       
  1719 		},
       
  1720 		NAME: function(match, context, isXML){
       
  1721 			if ( typeof context.getElementsByName !== "undefined" && !isXML ) {
       
  1722 				return context.getElementsByName(match[1]);
       
  1723 			}
       
  1724 		},
       
  1725 		TAG: function(match, context){
       
  1726 			return context.getElementsByTagName(match[1]);
       
  1727 		}
       
  1728 	},
       
  1729 	preFilter: {
       
  1730 		CLASS: function(match, curLoop, inplace, result, not){
       
  1731 			match = " " + match[1].replace(/\\/g, "") + " ";
       
  1732 
       
  1733 			var elem;
       
  1734 			for ( var i = 0; (elem = curLoop[i]) != null; i++ ) {
       
  1735 				if ( elem ) {
       
  1736 					if ( not ^ (" " + elem.className + " ").indexOf(match) >= 0 ) {
       
  1737 						if ( !inplace )
       
  1738 							result.push( elem );
       
  1739 					} else if ( inplace ) {
       
  1740 						curLoop[i] = false;
       
  1741 					}
       
  1742 				}
       
  1743 			}
       
  1744 
       
  1745 			return false;
       
  1746 		},
       
  1747 		ID: function(match){
       
  1748 			return match[1].replace(/\\/g, "");
       
  1749 		},
       
  1750 		TAG: function(match, curLoop){
       
  1751 			for ( var i = 0; curLoop[i] === false; i++ ){}
       
  1752 			return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
       
  1753 		},
       
  1754 		CHILD: function(match){
       
  1755 			if ( match[1] == "nth" ) {
       
  1756 				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
       
  1757 				var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
       
  1758 					match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
       
  1759 					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
       
  1760 
       
  1761 				// calculate the numbers (first)n+(last) including if they are negative
       
  1762 				match[2] = (test[1] + (test[2] || 1)) - 0;
       
  1763 				match[3] = test[3] - 0;
       
  1764 			}
       
  1765 
       
  1766 			// TODO: Move to normal caching system
       
  1767 			match[0] = "done" + (done++);
       
  1768 
       
  1769 			return match;
       
  1770 		},
       
  1771 		ATTR: function(match){
       
  1772 			var name = match[1].replace(/\\/g, "");
       
  1773 			
       
  1774 			if ( Expr.attrMap[name] ) {
       
  1775 				match[1] = Expr.attrMap[name];
       
  1776 			}
       
  1777 
       
  1778 			if ( match[2] === "~=" ) {
       
  1779 				match[4] = " " + match[4] + " ";
       
  1780 			}
       
  1781 
       
  1782 			return match;
       
  1783 		},
       
  1784 		PSEUDO: function(match, curLoop, inplace, result, not){
       
  1785 			if ( match[1] === "not" ) {
       
  1786 				// If we're dealing with a complex expression, or a simple one
       
  1787 				if ( match[3].match(chunker).length > 1 ) {
       
  1788 					match[3] = Sizzle(match[3], null, null, curLoop);
       
  1789 				} else {
       
  1790 					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
       
  1791 					if ( !inplace ) {
       
  1792 						result.push.apply( result, ret );
       
  1793 					}
       
  1794 					return false;
       
  1795 				}
       
  1796 			} else if ( Expr.match.POS.test( match[0] ) ) {
       
  1797 				return true;
       
  1798 			}
       
  1799 			
       
  1800 			return match;
       
  1801 		},
       
  1802 		POS: function(match){
       
  1803 			match.unshift( true );
       
  1804 			return match;
       
  1805 		}
       
  1806 	},
       
  1807 	filters: {
       
  1808 		enabled: function(elem){
       
  1809 			return elem.disabled === false && elem.type !== "hidden";
       
  1810 		},
       
  1811 		disabled: function(elem){
       
  1812 			return elem.disabled === true;
       
  1813 		},
       
  1814 		checked: function(elem){
       
  1815 			return elem.checked === true;
       
  1816 		},
       
  1817 		selected: function(elem){
       
  1818 			// Accessing this property makes selected-by-default
       
  1819 			// options in Safari work properly
       
  1820 			elem.parentNode.selectedIndex;
       
  1821 			return elem.selected === true;
       
  1822 		},
       
  1823 		parent: function(elem){
       
  1824 			return !!elem.firstChild;
       
  1825 		},
       
  1826 		empty: function(elem){
       
  1827 			return !elem.firstChild;
       
  1828 		},
       
  1829 		has: function(elem, i, match){
       
  1830 			return !!Sizzle( match[3], elem ).length;
       
  1831 		},
       
  1832 		header: function(elem){
       
  1833 			return /h\d/i.test( elem.nodeName );
       
  1834 		},
       
  1835 		text: function(elem){
       
  1836 			return "text" === elem.type;
       
  1837 		},
       
  1838 		radio: function(elem){
       
  1839 			return "radio" === elem.type;
       
  1840 		},
       
  1841 		checkbox: function(elem){
       
  1842 			return "checkbox" === elem.type;
       
  1843 		},
       
  1844 		file: function(elem){
       
  1845 			return "file" === elem.type;
       
  1846 		},
       
  1847 		password: function(elem){
       
  1848 			return "password" === elem.type;
       
  1849 		},
       
  1850 		submit: function(elem){
       
  1851 			return "submit" === elem.type;
       
  1852 		},
       
  1853 		image: function(elem){
       
  1854 			return "image" === elem.type;
       
  1855 		},
       
  1856 		reset: function(elem){
       
  1857 			return "reset" === elem.type;
       
  1858 		},
       
  1859 		button: function(elem){
       
  1860 			return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
       
  1861 		},
       
  1862 		input: function(elem){
       
  1863 			return /input|select|textarea|button/i.test(elem.nodeName);
       
  1864 		}
       
  1865 	},
       
  1866 	setFilters: {
       
  1867 		first: function(elem, i){
       
  1868 			return i === 0;
       
  1869 		},
       
  1870 		last: function(elem, i, match, array){
       
  1871 			return i === array.length - 1;
       
  1872 		},
       
  1873 		even: function(elem, i){
       
  1874 			return i % 2 === 0;
       
  1875 		},
       
  1876 		odd: function(elem, i){
       
  1877 			return i % 2 === 1;
       
  1878 		},
       
  1879 		lt: function(elem, i, match){
       
  1880 			return i < match[3] - 0;
       
  1881 		},
       
  1882 		gt: function(elem, i, match){
       
  1883 			return i > match[3] - 0;
       
  1884 		},
       
  1885 		nth: function(elem, i, match){
       
  1886 			return match[3] - 0 == i;
       
  1887 		},
       
  1888 		eq: function(elem, i, match){
       
  1889 			return match[3] - 0 == i;
       
  1890 		}
       
  1891 	},
       
  1892 	filter: {
       
  1893 		CHILD: function(elem, match){
       
  1894 			var type = match[1], parent = elem.parentNode;
       
  1895 
       
  1896 			var doneName = match[0];
       
  1897 			
       
  1898 			if ( parent && (!parent[ doneName ] || !elem.nodeIndex) ) {
       
  1899 				var count = 1;
       
  1900 
       
  1901 				for ( var node = parent.firstChild; node; node = node.nextSibling ) {
       
  1902 					if ( node.nodeType == 1 ) {
       
  1903 						node.nodeIndex = count++;
       
  1904 					}
       
  1905 				}
       
  1906 
       
  1907 				parent[ doneName ] = count - 1;
       
  1908 			}
       
  1909 
       
  1910 			if ( type == "first" ) {
       
  1911 				return elem.nodeIndex == 1;
       
  1912 			} else if ( type == "last" ) {
       
  1913 				return elem.nodeIndex == parent[ doneName ];
       
  1914 			} else if ( type == "only" ) {
       
  1915 				return parent[ doneName ] == 1;
       
  1916 			} else if ( type == "nth" ) {
       
  1917 				var add = false, first = match[2], last = match[3];
       
  1918 
       
  1919 				if ( first == 1 && last == 0 ) {
       
  1920 					return true;
       
  1921 				}
       
  1922 
       
  1923 				if ( first == 0 ) {
       
  1924 					if ( elem.nodeIndex == last ) {
       
  1925 						add = true;
       
  1926 					}
       
  1927 				} else if ( (elem.nodeIndex - last) % first == 0 && (elem.nodeIndex - last) / first >= 0 ) {
       
  1928 					add = true;
       
  1929 				}
       
  1930 
       
  1931 				return add;
       
  1932 			}
       
  1933 		},
       
  1934 		PSEUDO: function(elem, match, i, array){
       
  1935 			var name = match[1], filter = Expr.filters[ name ];
       
  1936 
       
  1937 			if ( filter ) {
       
  1938 				return filter( elem, i, match, array );
       
  1939 			} else if ( name === "contains" ) {
       
  1940 				return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
       
  1941 			} else if ( name === "not" ) {
       
  1942 				var not = match[3];
       
  1943 
       
  1944 				for ( var i = 0, l = not.length; i < l; i++ ) {
       
  1945 					if ( not[i] === elem ) {
       
  1946 						return false;
       
  1947 					}
       
  1948 				}
       
  1949 
       
  1950 				return true;
       
  1951 			}
       
  1952 		},
       
  1953 		ID: function(elem, match){
       
  1954 			return elem.nodeType === 1 && elem.getAttribute("id") === match;
       
  1955 		},
       
  1956 		TAG: function(elem, match){
       
  1957 			return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
       
  1958 		},
       
  1959 		CLASS: function(elem, match){
       
  1960 			return match.test( elem.className );
       
  1961 		},
       
  1962 		ATTR: function(elem, match){
       
  1963 			var result = Expr.attrHandle[ match[1] ] ? Expr.attrHandle[ match[1] ]( elem ) : elem[ match[1] ] || elem.getAttribute( match[1] ), value = result + "", type = match[2], check = match[4];
       
  1964 			return result == null ?
       
  1965 				type === "!=" :
       
  1966 				type === "=" ?
       
  1967 				value === check :
       
  1968 				type === "*=" ?
       
  1969 				value.indexOf(check) >= 0 :
       
  1970 				type === "~=" ?
       
  1971 				(" " + value + " ").indexOf(check) >= 0 :
       
  1972 				!match[4] ?
       
  1973 				result :
       
  1974 				type === "!=" ?
       
  1975 				value != check :
       
  1976 				type === "^=" ?
       
  1977 				value.indexOf(check) === 0 :
       
  1978 				type === "$=" ?
       
  1979 				value.substr(value.length - check.length) === check :
       
  1980 				type === "|=" ?
       
  1981 				value === check || value.substr(0, check.length + 1) === check + "-" :
       
  1982 				false;
       
  1983 		},
       
  1984 		POS: function(elem, match, i, array){
       
  1985 			var name = match[2], filter = Expr.setFilters[ name ];
       
  1986 
       
  1987 			if ( filter ) {
       
  1988 				return filter( elem, i, match, array );
       
  1989 			}
       
  1990 		}
       
  1991 	}
       
  1992 };
       
  1993 
       
  1994 var origPOS = Expr.match.POS;
       
  1995 
       
  1996 for ( var type in Expr.match ) {
       
  1997 	Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
       
  1998 }
       
  1999 
       
  2000 var makeArray = function(array, results) {
       
  2001 	array = Array.prototype.slice.call( array );
       
  2002 
       
  2003 	if ( results ) {
       
  2004 		results.push.apply( results, array );
       
  2005 		return results;
       
  2006 	}
       
  2007 	
       
  2008 	return array;
       
  2009 };
       
  2010 
       
  2011 // Perform a simple check to determine if the browser is capable of
       
  2012 // converting a NodeList to an array using builtin methods.
       
  2013 try {
       
  2014 	Array.prototype.slice.call( document.documentElement.childNodes );
       
  2015 
       
  2016 // Provide a fallback method if it does not work
       
  2017 } catch(e){
       
  2018 	makeArray = function(array, results) {
       
  2019 		var ret = results || [];
       
  2020 
       
  2021 		if ( toString.call(array) === "[object Array]" ) {
       
  2022 			Array.prototype.push.apply( ret, array );
       
  2023 		} else {
       
  2024 			if ( typeof array.length === "number" ) {
       
  2025 				for ( var i = 0, l = array.length; i < l; i++ ) {
       
  2026 					ret.push( array[i] );
       
  2027 				}
       
  2028 			} else {
       
  2029 				for ( var i = 0; array[i]; i++ ) {
       
  2030 					ret.push( array[i] );
       
  2031 				}
       
  2032 			}
       
  2033 		}
       
  2034 
       
  2035 		return ret;
       
  2036 	};
       
  2037 }
       
  2038 
       
  2039 // Check to see if the browser returns elements by name when
       
  2040 // querying by getElementById (and provide a workaround)
       
  2041 (function(){
       
  2042 	// We're going to inject a fake input element with a specified name
       
  2043 	var form = document.createElement("form"),
       
  2044 		id = "script" + (new Date).getTime();
       
  2045 	form.innerHTML = "<input name='" + id + "'/>";
       
  2046 
       
  2047 	// Inject it into the root element, check its status, and remove it quickly
       
  2048 	var root = document.documentElement;
       
  2049 	root.insertBefore( form, root.firstChild );
       
  2050 
       
  2051 	// The workaround has to do additional checks after a getElementById
       
  2052 	// Which slows things down for other browsers (hence the branching)
       
  2053 	if ( !!document.getElementById( id ) ) {
       
  2054 		Expr.find.ID = function(match, context, isXML){
       
  2055 			if ( typeof context.getElementById !== "undefined" && !isXML ) {
       
  2056 				var m = context.getElementById(match[1]);
       
  2057 				return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
       
  2058 			}
       
  2059 		};
       
  2060 
       
  2061 		Expr.filter.ID = function(elem, match){
       
  2062 			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
       
  2063 			return elem.nodeType === 1 && node && node.nodeValue === match;
       
  2064 		};
       
  2065 	}
       
  2066 
       
  2067 	root.removeChild( form );
       
  2068 })();
       
  2069 
       
  2070 (function(){
       
  2071 	// Check to see if the browser returns only elements
       
  2072 	// when doing getElementsByTagName("*")
       
  2073 
       
  2074 	// Create a fake element
       
  2075 	var div = document.createElement("div");
       
  2076 	div.appendChild( document.createComment("") );
       
  2077 
       
  2078 	// Make sure no comments are found
       
  2079 	if ( div.getElementsByTagName("*").length > 0 ) {
       
  2080 		Expr.find.TAG = function(match, context){
       
  2081 			var results = context.getElementsByTagName(match[1]);
       
  2082 
       
  2083 			// Filter out possible comments
       
  2084 			if ( match[1] === "*" ) {
       
  2085 				var tmp = [];
       
  2086 
       
  2087 				for ( var i = 0; results[i]; i++ ) {
       
  2088 					if ( results[i].nodeType === 1 ) {
       
  2089 						tmp.push( results[i] );
       
  2090 					}
       
  2091 				}
       
  2092 
       
  2093 				results = tmp;
       
  2094 			}
       
  2095 
       
  2096 			return results;
       
  2097 		};
       
  2098 	}
       
  2099 
       
  2100 	// Check to see if an attribute returns normalized href attributes
       
  2101 	div.innerHTML = "<a href='#'></a>";
       
  2102 	if ( div.firstChild && div.firstChild.getAttribute("href") !== "#" ) {
       
  2103 		Expr.attrHandle.href = function(elem){
       
  2104 			return elem.getAttribute("href", 2);
       
  2105 		};
       
  2106 	}
       
  2107 })();
       
  2108 
       
  2109 if ( document.querySelectorAll ) (function(){
       
  2110 	var oldSizzle = Sizzle, div = document.createElement("div");
       
  2111 	div.innerHTML = "<p class='TEST'></p>";
       
  2112 
       
  2113 	// Safari can't handle uppercase or unicode characters when
       
  2114 	// in quirks mode.
       
  2115 	if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
       
  2116 		return;
       
  2117 	}
       
  2118 	
       
  2119 	Sizzle = function(query, context, extra, seed){
       
  2120 		context = context || document;
       
  2121 
       
  2122 		// Only use querySelectorAll on non-XML documents
       
  2123 		// (ID selectors don't work in non-HTML documents)
       
  2124 		if ( !seed && context.nodeType === 9 && !isXML(context) ) {
       
  2125 			try {
       
  2126 				return makeArray( context.querySelectorAll(query), extra );
       
  2127 			} catch(e){}
       
  2128 		}
       
  2129 		
       
  2130 		return oldSizzle(query, context, extra, seed);
       
  2131 	};
       
  2132 
       
  2133 	Sizzle.find = oldSizzle.find;
       
  2134 	Sizzle.filter = oldSizzle.filter;
       
  2135 	Sizzle.selectors = oldSizzle.selectors;
       
  2136 	Sizzle.matches = oldSizzle.matches;
       
  2137 })();
       
  2138 
       
  2139 if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) {
       
  2140 	Expr.order.splice(1, 0, "CLASS");
       
  2141 	Expr.find.CLASS = function(match, context) {
       
  2142 		return context.getElementsByClassName(match[1]);
       
  2143 	};
       
  2144 }
       
  2145 
       
  2146 function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
       
  2147 	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
       
  2148 		var elem = checkSet[i];
       
  2149 		if ( elem ) {
       
  2150 			elem = elem[dir];
       
  2151 			var match = false;
       
  2152 
       
  2153 			while ( elem && elem.nodeType ) {
       
  2154 				var done = elem[doneName];
       
  2155 				if ( done ) {
       
  2156 					match = checkSet[ done ];
       
  2157 					break;
       
  2158 				}
       
  2159 
       
  2160 				if ( elem.nodeType === 1 && !isXML )
       
  2161 					elem[doneName] = i;
       
  2162 
       
  2163 				if ( elem.nodeName === cur ) {
       
  2164 					match = elem;
       
  2165 					break;
       
  2166 				}
       
  2167 
       
  2168 				elem = elem[dir];
       
  2169 			}
       
  2170 
       
  2171 			checkSet[i] = match;
       
  2172 		}
       
  2173 	}
       
  2174 }
       
  2175 
       
  2176 function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
       
  2177 	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
       
  2178 		var elem = checkSet[i];
       
  2179 		if ( elem ) {
       
  2180 			elem = elem[dir];
       
  2181 			var match = false;
       
  2182 
       
  2183 			while ( elem && elem.nodeType ) {
       
  2184 				if ( elem[doneName] ) {
       
  2185 					match = checkSet[ elem[doneName] ];
       
  2186 					break;
       
  2187 				}
       
  2188 
       
  2189 				if ( elem.nodeType === 1 ) {
       
  2190 					if ( !isXML )
       
  2191 						elem[doneName] = i;
       
  2192 
       
  2193 					if ( typeof cur !== "string" ) {
       
  2194 						if ( elem === cur ) {
       
  2195 							match = true;
       
  2196 							break;
       
  2197 						}
       
  2198 
       
  2199 					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
       
  2200 						match = elem;
       
  2201 						break;
       
  2202 					}
       
  2203 				}
       
  2204 
       
  2205 				elem = elem[dir];
       
  2206 			}
       
  2207 
       
  2208 			checkSet[i] = match;
       
  2209 		}
       
  2210 	}
       
  2211 }
       
  2212 
       
  2213 var contains = document.compareDocumentPosition ?  function(a, b){
       
  2214 	return a.compareDocumentPosition(b) & 16;
       
  2215 } : function(a, b){
       
  2216 	return a !== b && (a.contains ? a.contains(b) : true);
       
  2217 };
       
  2218 
       
  2219 var isXML = function(elem){
       
  2220 	return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
       
  2221 		!!elem.ownerDocument && isXML( elem.ownerDocument );
       
  2222 };
       
  2223 
       
  2224 var posProcess = function(selector, context){
       
  2225 	var tmpSet = [], later = "", match,
       
  2226 		root = context.nodeType ? [context] : context;
       
  2227 
       
  2228 	// Position selectors must be done after the filter
       
  2229 	// And so must :not(positional) so we move all PSEUDOs to the end
       
  2230 	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
       
  2231 		later += match[0];
       
  2232 		selector = selector.replace( Expr.match.PSEUDO, "" );
       
  2233 	}
       
  2234 
       
  2235 	selector = Expr.relative[selector] ? selector + "*" : selector;
       
  2236 
       
  2237 	for ( var i = 0, l = root.length; i < l; i++ ) {
       
  2238 		Sizzle( selector, root[i], tmpSet );
       
  2239 	}
       
  2240 
       
  2241 	return Sizzle.filter( later, tmpSet );
       
  2242 };
       
  2243 
       
  2244 // EXPOSE
       
  2245 jQuery.find = Sizzle;
       
  2246 jQuery.filter = Sizzle.filter;
       
  2247 jQuery.expr = Sizzle.selectors;
       
  2248 jQuery.expr[":"] = jQuery.expr.filters;
       
  2249 
       
  2250 Sizzle.selectors.filters.hidden = function(elem){
       
  2251 	return "hidden" === elem.type ||
       
  2252 		jQuery.css(elem, "display") === "none" ||
       
  2253 		jQuery.css(elem, "visibility") === "hidden";
       
  2254 };
       
  2255 
       
  2256 Sizzle.selectors.filters.visible = function(elem){
       
  2257 	return "hidden" !== elem.type &&
       
  2258 		jQuery.css(elem, "display") !== "none" &&
       
  2259 		jQuery.css(elem, "visibility") !== "hidden";
       
  2260 };
       
  2261 
       
  2262 Sizzle.selectors.filters.animated = function(elem){
       
  2263 	return jQuery.grep(jQuery.timers, function(fn){
       
  2264 		return elem === fn.elem;
       
  2265 	}).length;
       
  2266 };
       
  2267 
       
  2268 jQuery.multiFilter = function( expr, elems, not ) {
       
  2269 	if ( not ) {
       
  2270 		expr = ":not(" + expr + ")";
       
  2271 	}
       
  2272 
       
  2273 	return Sizzle.matches(expr, elems);
       
  2274 };
       
  2275 
       
  2276 jQuery.dir = function( elem, dir ){
       
  2277 	var matched = [], cur = elem[dir];
       
  2278 	while ( cur && cur != document ) {
       
  2279 		if ( cur.nodeType == 1 )
       
  2280 			matched.push( cur );
       
  2281 		cur = cur[dir];
       
  2282 	}
       
  2283 	return matched;
       
  2284 };
       
  2285 
       
  2286 jQuery.nth = function(cur, result, dir, elem){
       
  2287 	result = result || 1;
       
  2288 	var num = 0;
       
  2289 
       
  2290 	for ( ; cur; cur = cur[dir] )
       
  2291 		if ( cur.nodeType == 1 && ++num == result )
       
  2292 			break;
       
  2293 
       
  2294 	return cur;
       
  2295 };
       
  2296 
       
  2297 jQuery.sibling = function(n, elem){
       
  2298 	var r = [];
       
  2299 
       
  2300 	for ( ; n; n = n.nextSibling ) {
       
  2301 		if ( n.nodeType == 1 && n != elem )
       
  2302 			r.push( n );
       
  2303 	}
       
  2304 
       
  2305 	return r;
       
  2306 };
       
  2307 
       
  2308 return;
       
  2309 
       
  2310 window.Sizzle = Sizzle;
       
  2311 
       
  2312 })();
       
  2313 /*
       
  2314  * A number of helper functions used for managing events.
       
  2315  * Many of the ideas behind this code originated from
       
  2316  * Dean Edwards' addEvent library.
       
  2317  */
       
  2318 jQuery.event = {
       
  2319 
       
  2320 	// Bind an event to an element
       
  2321 	// Original by Dean Edwards
       
  2322 	add: function(elem, types, handler, data) {
       
  2323 		if ( elem.nodeType == 3 || elem.nodeType == 8 )
       
  2324 			return;
       
  2325 
       
  2326 		// For whatever reason, IE has trouble passing the window object
       
  2327 		// around, causing it to be cloned in the process
       
  2328 		if ( elem.setInterval && elem != window )
       
  2329 			elem = window;
       
  2330 
       
  2331 		// Make sure that the function being executed has a unique ID
       
  2332 		if ( !handler.guid )
       
  2333 			handler.guid = this.guid++;
       
  2334 
       
  2335 		// if data is passed, bind to handler
       
  2336 		if ( data !== undefined ) {
       
  2337 			// Create temporary function pointer to original handler
       
  2338 			var fn = handler;
       
  2339 
       
  2340 			// Create unique handler function, wrapped around original handler
       
  2341 			handler = this.proxy( fn );
       
  2342 
       
  2343 			// Store data in unique handler
       
  2344 			handler.data = data;
       
  2345 		}
       
  2346 
       
  2347 		// Init the element's event structure
       
  2348 		var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
       
  2349 			handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
       
  2350 				// Handle the second event of a trigger and when
       
  2351 				// an event is called after a page has unloaded
       
  2352 				return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
       
  2353 					jQuery.event.handle.apply(arguments.callee.elem, arguments) :
       
  2354 					undefined;
       
  2355 			});
       
  2356 		// Add elem as a property of the handle function
       
  2357 		// This is to prevent a memory leak with non-native
       
  2358 		// event in IE.
       
  2359 		handle.elem = elem;
       
  2360 
       
  2361 		// Handle multiple events separated by a space
       
  2362 		// jQuery(...).bind("mouseover mouseout", fn);
       
  2363 		jQuery.each(types.split(/\s+/), function(index, type) {
       
  2364 			// Namespaced event handlers
       
  2365 			var namespaces = type.split(".");
       
  2366 			type = namespaces.shift();
       
  2367 			handler.type = namespaces.slice().sort().join(".");
       
  2368 
       
  2369 			// Get the current list of functions bound to this event
       
  2370 			var handlers = events[type];
       
  2371 			
       
  2372 			if ( jQuery.event.specialAll[type] )
       
  2373 				jQuery.event.specialAll[type].setup.call(elem, data, namespaces);
       
  2374 
       
  2375 			// Init the event handler queue
       
  2376 			if (!handlers) {
       
  2377 				handlers = events[type] = {};
       
  2378 
       
  2379 				// Check for a special event handler
       
  2380 				// Only use addEventListener/attachEvent if the special
       
  2381 				// events handler returns false
       
  2382 				if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) {
       
  2383 					// Bind the global event handler to the element
       
  2384 					if (elem.addEventListener)
       
  2385 						elem.addEventListener(type, handle, false);
       
  2386 					else if (elem.attachEvent)
       
  2387 						elem.attachEvent("on" + type, handle);
       
  2388 				}
       
  2389 			}
       
  2390 
       
  2391 			// Add the function to the element's handler list
       
  2392 			handlers[handler.guid] = handler;
       
  2393 
       
  2394 			// Keep track of which events have been used, for global triggering
       
  2395 			jQuery.event.global[type] = true;
       
  2396 		});
       
  2397 
       
  2398 		// Nullify elem to prevent memory leaks in IE
       
  2399 		elem = null;
       
  2400 	},
       
  2401 
       
  2402 	guid: 1,
       
  2403 	global: {},
       
  2404 
       
  2405 	// Detach an event or set of events from an element
       
  2406 	remove: function(elem, types, handler) {
       
  2407 		// don't do events on text and comment nodes
       
  2408 		if ( elem.nodeType == 3 || elem.nodeType == 8 )
       
  2409 			return;
       
  2410 
       
  2411 		var events = jQuery.data(elem, "events"), ret, index;
       
  2412 
       
  2413 		if ( events ) {
       
  2414 			// Unbind all events for the element
       
  2415 			if ( types === undefined || (typeof types === "string" && types.charAt(0) == ".") )
       
  2416 				for ( var type in events )
       
  2417 					this.remove( elem, type + (types || "") );
       
  2418 			else {
       
  2419 				// types is actually an event object here
       
  2420 				if ( types.type ) {
       
  2421 					handler = types.handler;
       
  2422 					types = types.type;
       
  2423 				}
       
  2424 
       
  2425 				// Handle multiple events seperated by a space
       
  2426 				// jQuery(...).unbind("mouseover mouseout", fn);
       
  2427 				jQuery.each(types.split(/\s+/), function(index, type){
       
  2428 					// Namespaced event handlers
       
  2429 					var namespaces = type.split(".");
       
  2430 					type = namespaces.shift();
       
  2431 					var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
       
  2432 
       
  2433 					if ( events[type] ) {
       
  2434 						// remove the given handler for the given type
       
  2435 						if ( handler )
       
  2436 							delete events[type][handler.guid];
       
  2437 
       
  2438 						// remove all handlers for the given type
       
  2439 						else
       
  2440 							for ( var handle in events[type] )
       
  2441 								// Handle the removal of namespaced events
       
  2442 								if ( namespace.test(events[type][handle].type) )
       
  2443 									delete events[type][handle];
       
  2444 									
       
  2445 						if ( jQuery.event.specialAll[type] )
       
  2446 							jQuery.event.specialAll[type].teardown.call(elem, namespaces);
       
  2447 
       
  2448 						// remove generic event handler if no more handlers exist
       
  2449 						for ( ret in events[type] ) break;
       
  2450 						if ( !ret ) {
       
  2451 							if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem, namespaces) === false ) {
       
  2452 								if (elem.removeEventListener)
       
  2453 									elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
       
  2454 								else if (elem.detachEvent)
       
  2455 									elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
       
  2456 							}
       
  2457 							ret = null;
       
  2458 							delete events[type];
       
  2459 						}
       
  2460 					}
       
  2461 				});
       
  2462 			}
       
  2463 
       
  2464 			// Remove the expando if it's no longer used
       
  2465 			for ( ret in events ) break;
       
  2466 			if ( !ret ) {
       
  2467 				var handle = jQuery.data( elem, "handle" );
       
  2468 				if ( handle ) handle.elem = null;
       
  2469 				jQuery.removeData( elem, "events" );
       
  2470 				jQuery.removeData( elem, "handle" );
       
  2471 			}
       
  2472 		}
       
  2473 	},
       
  2474 
       
  2475 	// bubbling is internal
       
  2476 	trigger: function( event, data, elem, bubbling ) {
       
  2477 		// Event object or event type
       
  2478 		var type = event.type || event;
       
  2479 
       
  2480 		if( !bubbling ){
       
  2481 			event = typeof event === "object" ?
       
  2482 				// jQuery.Event object
       
  2483 				event[expando] ? event :
       
  2484 				// Object literal
       
  2485 				jQuery.extend( jQuery.Event(type), event ) :
       
  2486 				// Just the event type (string)
       
  2487 				jQuery.Event(type);
       
  2488 
       
  2489 			if ( type.indexOf("!") >= 0 ) {
       
  2490 				event.type = type = type.slice(0, -1);
       
  2491 				event.exclusive = true;
       
  2492 			}
       
  2493 
       
  2494 			// Handle a global trigger
       
  2495 			if ( !elem ) {
       
  2496 				// Don't bubble custom events when global (to avoid too much overhead)
       
  2497 				event.stopPropagation();
       
  2498 				// Only trigger if we've ever bound an event for it
       
  2499 				if ( this.global[type] )
       
  2500 					jQuery.each( jQuery.cache, function(){
       
  2501 						if ( this.events && this.events[type] )
       
  2502 							jQuery.event.trigger( event, data, this.handle.elem );
       
  2503 					});
       
  2504 			}
       
  2505 
       
  2506 			// Handle triggering a single element
       
  2507 
       
  2508 			// don't do events on text and comment nodes
       
  2509 			if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 )
       
  2510 				return undefined;
       
  2511 			
       
  2512 			// Clean up in case it is reused
       
  2513 			event.result = undefined;
       
  2514 			event.target = elem;
       
  2515 			
       
  2516 			// Clone the incoming data, if any
       
  2517 			data = jQuery.makeArray(data);
       
  2518 			data.unshift( event );
       
  2519 		}
       
  2520 
       
  2521 		event.currentTarget = elem;
       
  2522 
       
  2523 		// Trigger the event, it is assumed that "handle" is a function
       
  2524 		var handle = jQuery.data(elem, "handle");
       
  2525 		if ( handle )
       
  2526 			handle.apply( elem, data );
       
  2527 
       
  2528 		// Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
       
  2529 		if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
       
  2530 			event.result = false;
       
  2531 
       
  2532 		// Trigger the native events (except for clicks on links)
       
  2533 		if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
       
  2534 			this.triggered = true;
       
  2535 			try {
       
  2536 				elem[ type ]();
       
  2537 			// prevent IE from throwing an error for some hidden elements
       
  2538 			} catch (e) {}
       
  2539 		}
       
  2540 
       
  2541 		this.triggered = false;
       
  2542 
       
  2543 		if ( !event.isPropagationStopped() ) {
       
  2544 			var parent = elem.parentNode || elem.ownerDocument;
       
  2545 			if ( parent )
       
  2546 				jQuery.event.trigger(event, data, parent, true);
       
  2547 		}
       
  2548 	},
       
  2549 
       
  2550 	handle: function(event) {
       
  2551 		// returned undefined or false
       
  2552 		var all, handlers;
       
  2553 
       
  2554 		event = arguments[0] = jQuery.event.fix( event || window.event );
       
  2555 
       
  2556 		// Namespaced event handlers
       
  2557 		var namespaces = event.type.split(".");
       
  2558 		event.type = namespaces.shift();
       
  2559 
       
  2560 		// Cache this now, all = true means, any handler
       
  2561 		all = !namespaces.length && !event.exclusive;
       
  2562 		
       
  2563 		var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
       
  2564 
       
  2565 		handlers = ( jQuery.data(this, "events") || {} )[event.type];
       
  2566 
       
  2567 		for ( var j in handlers ) {
       
  2568 			var handler = handlers[j];
       
  2569 
       
  2570 			// Filter the functions by class
       
  2571 			if ( all || namespace.test(handler.type) ) {
       
  2572 				// Pass in a reference to the handler function itself
       
  2573 				// So that we can later remove it
       
  2574 				event.handler = handler;
       
  2575 				event.data = handler.data;
       
  2576 
       
  2577 				var ret = handler.apply(this, arguments);
       
  2578 
       
  2579 				if( ret !== undefined ){
       
  2580 					event.result = ret;
       
  2581 					if ( ret === false ) {
       
  2582 						event.preventDefault();
       
  2583 						event.stopPropagation();
       
  2584 					}
       
  2585 				}
       
  2586 
       
  2587 				if( event.isImmediatePropagationStopped() )
       
  2588 					break;
       
  2589 
       
  2590 			}
       
  2591 		}
       
  2592 	},
       
  2593 
       
  2594 	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 toElement view wheelDelta which".split(" "),
       
  2595 
       
  2596 	fix: function(event) {
       
  2597 		if ( event[expando] )
       
  2598 			return event;
       
  2599 
       
  2600 		// store a copy of the original event object
       
  2601 		// and "clone" to set read-only properties
       
  2602 		var originalEvent = event;
       
  2603 		event = jQuery.Event( originalEvent );
       
  2604 
       
  2605 		for ( var i = this.props.length, prop; i; ){
       
  2606 			prop = this.props[ --i ];
       
  2607 			event[ prop ] = originalEvent[ prop ];
       
  2608 		}
       
  2609 
       
  2610 		// Fix target property, if necessary
       
  2611 		if ( !event.target )
       
  2612 			event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
       
  2613 
       
  2614 		// check if target is a textnode (safari)
       
  2615 		if ( event.target.nodeType == 3 )
       
  2616 			event.target = event.target.parentNode;
       
  2617 
       
  2618 		// Add relatedTarget, if necessary
       
  2619 		if ( !event.relatedTarget && event.fromElement )
       
  2620 			event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
       
  2621 
       
  2622 		// Calculate pageX/Y if missing and clientX/Y available
       
  2623 		if ( event.pageX == null && event.clientX != null ) {
       
  2624 			var doc = document.documentElement, body = document.body;
       
  2625 			event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
       
  2626 			event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
       
  2627 		}
       
  2628 
       
  2629 		// Add which for key events
       
  2630 		if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
       
  2631 			event.which = event.charCode || event.keyCode;
       
  2632 
       
  2633 		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
       
  2634 		if ( !event.metaKey && event.ctrlKey )
       
  2635 			event.metaKey = event.ctrlKey;
       
  2636 
       
  2637 		// Add which for click: 1 == left; 2 == middle; 3 == right
       
  2638 		// Note: button is not normalized, so don't use it
       
  2639 		if ( !event.which && event.button )
       
  2640 			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
       
  2641 
       
  2642 		return event;
       
  2643 	},
       
  2644 
       
  2645 	proxy: function( fn, proxy ){
       
  2646 		proxy = proxy || function(){ return fn.apply(this, arguments); };
       
  2647 		// Set the guid of unique handler to the same of original handler, so it can be removed
       
  2648 		proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
       
  2649 		// So proxy can be declared as an argument
       
  2650 		return proxy;
       
  2651 	},
       
  2652 
       
  2653 	special: {
       
  2654 		ready: {
       
  2655 			// Make sure the ready event is setup
       
  2656 			setup: bindReady,
       
  2657 			teardown: function() {}
       
  2658 		}
       
  2659 	},
       
  2660 	
       
  2661 	specialAll: {
       
  2662 		live: {
       
  2663 			setup: function( selector, namespaces ){
       
  2664 				jQuery.event.add( this, namespaces[0], liveHandler );
       
  2665 			},
       
  2666 			teardown:  function( namespaces ){
       
  2667 				if ( namespaces.length ) {
       
  2668 					var remove = 0, name = RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)");
       
  2669 					
       
  2670 					jQuery.each( (jQuery.data(this, "events").live || {}), function(){
       
  2671 						if ( name.test(this.type) )
       
  2672 							remove++;
       
  2673 					});
       
  2674 					
       
  2675 					if ( remove < 1 )
       
  2676 						jQuery.event.remove( this, namespaces[0], liveHandler );
       
  2677 				}
       
  2678 			}
       
  2679 		}
       
  2680 	}
       
  2681 };
       
  2682 
       
  2683 jQuery.Event = function( src ){
       
  2684 	// Allow instantiation without the 'new' keyword
       
  2685 	if( !this.preventDefault )
       
  2686 		return new jQuery.Event(src);
       
  2687 	
       
  2688 	// Event object
       
  2689 	if( src && src.type ){
       
  2690 		this.originalEvent = src;
       
  2691 		this.type = src.type;
       
  2692 	// Event type
       
  2693 	}else
       
  2694 		this.type = src;
       
  2695 
       
  2696 	// timeStamp is buggy for some events on Firefox(#3843)
       
  2697 	// So we won't rely on the native value
       
  2698 	this.timeStamp = now();
       
  2699 	
       
  2700 	// Mark it as fixed
       
  2701 	this[expando] = true;
       
  2702 };
       
  2703 
       
  2704 function returnFalse(){
       
  2705 	return false;
       
  2706 }
       
  2707 function returnTrue(){
       
  2708 	return true;
       
  2709 }
       
  2710 
       
  2711 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
       
  2712 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
       
  2713 jQuery.Event.prototype = {
       
  2714 	preventDefault: function() {
       
  2715 		this.isDefaultPrevented = returnTrue;
       
  2716 
       
  2717 		var e = this.originalEvent;
       
  2718 		if( !e )
       
  2719 			return;
       
  2720 		// if preventDefault exists run it on the original event
       
  2721 		if (e.preventDefault)
       
  2722 			e.preventDefault();
       
  2723 		// otherwise set the returnValue property of the original event to false (IE)
       
  2724 		e.returnValue = false;
       
  2725 	},
       
  2726 	stopPropagation: function() {
       
  2727 		this.isPropagationStopped = returnTrue;
       
  2728 
       
  2729 		var e = this.originalEvent;
       
  2730 		if( !e )
       
  2731 			return;
       
  2732 		// if stopPropagation exists run it on the original event
       
  2733 		if (e.stopPropagation)
       
  2734 			e.stopPropagation();
       
  2735 		// otherwise set the cancelBubble property of the original event to true (IE)
       
  2736 		e.cancelBubble = true;
       
  2737 	},
       
  2738 	stopImmediatePropagation:function(){
       
  2739 		this.isImmediatePropagationStopped = returnTrue;
       
  2740 		this.stopPropagation();
       
  2741 	},
       
  2742 	isDefaultPrevented: returnFalse,
       
  2743 	isPropagationStopped: returnFalse,
       
  2744 	isImmediatePropagationStopped: returnFalse
       
  2745 };
       
  2746 // Checks if an event happened on an element within another element
       
  2747 // Used in jQuery.event.special.mouseenter and mouseleave handlers
       
  2748 var withinElement = function(event) {
       
  2749 	// Check if mouse(over|out) are still within the same parent element
       
  2750 	var parent = event.relatedTarget;
       
  2751 	// Traverse up the tree
       
  2752 	while ( parent && parent != this )
       
  2753 		try { parent = parent.parentNode; }
       
  2754 		catch(e) { parent = this; }
       
  2755 	
       
  2756 	if( parent != this ){
       
  2757 		// set the correct event type
       
  2758 		event.type = event.data;
       
  2759 		// handle event if we actually just moused on to a non sub-element
       
  2760 		jQuery.event.handle.apply( this, arguments );
       
  2761 	}
       
  2762 };
       
  2763 	
       
  2764 jQuery.each({ 
       
  2765 	mouseover: 'mouseenter', 
       
  2766 	mouseout: 'mouseleave'
       
  2767 }, function( orig, fix ){
       
  2768 	jQuery.event.special[ fix ] = {
       
  2769 		setup: function(){
       
  2770 			jQuery.event.add( this, orig, withinElement, fix );
       
  2771 		},
       
  2772 		teardown: function(){
       
  2773 			jQuery.event.remove( this, orig, withinElement );
       
  2774 		}
       
  2775 	};			   
       
  2776 });
       
  2777 
       
  2778 jQuery.fn.extend({
       
  2779 	bind: function( type, data, fn ) {
       
  2780 		return type == "unload" ? this.one(type, data, fn) : this.each(function(){
       
  2781 			jQuery.event.add( this, type, fn || data, fn && data );
       
  2782 		});
       
  2783 	},
       
  2784 
       
  2785 	one: function( type, data, fn ) {
       
  2786 		var one = jQuery.event.proxy( fn || data, function(event) {
       
  2787 			jQuery(this).unbind(event, one);
       
  2788 			return (fn || data).apply( this, arguments );
       
  2789 		});
       
  2790 		return this.each(function(){
       
  2791 			jQuery.event.add( this, type, one, fn && data);
       
  2792 		});
       
  2793 	},
       
  2794 
       
  2795 	unbind: function( type, fn ) {
       
  2796 		return this.each(function(){
       
  2797 			jQuery.event.remove( this, type, fn );
       
  2798 		});
       
  2799 	},
       
  2800 
       
  2801 	trigger: function( type, data ) {
       
  2802 		return this.each(function(){
       
  2803 			jQuery.event.trigger( type, data, this );
       
  2804 		});
       
  2805 	},
       
  2806 
       
  2807 	triggerHandler: function( type, data ) {
       
  2808 		if( this[0] ){
       
  2809 			var event = jQuery.Event(type);
       
  2810 			event.preventDefault();
       
  2811 			event.stopPropagation();
       
  2812 			jQuery.event.trigger( event, data, this[0] );
       
  2813 			return event.result;
       
  2814 		}		
       
  2815 	},
       
  2816 
       
  2817 	toggle: function( fn ) {
       
  2818 		// Save reference to arguments for access in closure
       
  2819 		var args = arguments, i = 1;
       
  2820 
       
  2821 		// link all the functions, so any of them can unbind this click handler
       
  2822 		while( i < args.length )
       
  2823 			jQuery.event.proxy( fn, args[i++] );
       
  2824 
       
  2825 		return this.click( jQuery.event.proxy( fn, function(event) {
       
  2826 			// Figure out which function to execute
       
  2827 			this.lastToggle = ( this.lastToggle || 0 ) % i;
       
  2828 
       
  2829 			// Make sure that clicks stop
       
  2830 			event.preventDefault();
       
  2831 
       
  2832 			// and execute the function
       
  2833 			return args[ this.lastToggle++ ].apply( this, arguments ) || false;
       
  2834 		}));
       
  2835 	},
       
  2836 
       
  2837 	hover: function(fnOver, fnOut) {
       
  2838 		return this.mouseenter(fnOver).mouseleave(fnOut);
       
  2839 	},
       
  2840 
       
  2841 	ready: function(fn) {
       
  2842 		// Attach the listeners
       
  2843 		bindReady();
       
  2844 
       
  2845 		// If the DOM is already ready
       
  2846 		if ( jQuery.isReady )
       
  2847 			// Execute the function immediately
       
  2848 			fn.call( document, jQuery );
       
  2849 
       
  2850 		// Otherwise, remember the function for later
       
  2851 		else
       
  2852 			// Add the function to the wait list
       
  2853 			jQuery.readyList.push( fn );
       
  2854 
       
  2855 		return this;
       
  2856 	},
       
  2857 	
       
  2858 	live: function( type, fn ){
       
  2859 		var proxy = jQuery.event.proxy( fn );
       
  2860 		proxy.guid += this.selector + type;
       
  2861 
       
  2862 		jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy );
       
  2863 
       
  2864 		return this;
       
  2865 	},
       
  2866 	
       
  2867 	die: function( type, fn ){
       
  2868 		jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null );
       
  2869 		return this;
       
  2870 	}
       
  2871 });
       
  2872 
       
  2873 function liveHandler( event ){
       
  2874 	var check = RegExp("(^|\\.)" + event.type + "(\\.|$)"),
       
  2875 		stop = true,
       
  2876 		elems = [];
       
  2877 
       
  2878 	jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){
       
  2879 		if ( check.test(fn.type) ) {
       
  2880 			var elem = jQuery(event.target).closest(fn.data)[0];
       
  2881 			if ( elem )
       
  2882 				elems.push({ elem: elem, fn: fn });
       
  2883 		}
       
  2884 	});
       
  2885 
       
  2886 	jQuery.each(elems, function(){
       
  2887 		if ( this.fn.call(this.elem, event, this.fn.data) === false )
       
  2888 			stop = false;
       
  2889 	});
       
  2890 
       
  2891 	return stop;
       
  2892 }
       
  2893 
       
  2894 function liveConvert(type, selector){
       
  2895 	return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "|")].join(".");
       
  2896 }
       
  2897 
       
  2898 jQuery.extend({
       
  2899 	isReady: false,
       
  2900 	readyList: [],
       
  2901 	// Handle when the DOM is ready
       
  2902 	ready: function() {
       
  2903 		// Make sure that the DOM is not already loaded
       
  2904 		if ( !jQuery.isReady ) {
       
  2905 			// Remember that the DOM is ready
       
  2906 			jQuery.isReady = true;
       
  2907 
       
  2908 			// If there are functions bound, to execute
       
  2909 			if ( jQuery.readyList ) {
       
  2910 				// Execute all of them
       
  2911 				jQuery.each( jQuery.readyList, function(){
       
  2912 					this.call( document, jQuery );
       
  2913 				});
       
  2914 
       
  2915 				// Reset the list of functions
       
  2916 				jQuery.readyList = null;
       
  2917 			}
       
  2918 
       
  2919 			// Trigger any bound ready events
       
  2920 			jQuery(document).triggerHandler("ready");
       
  2921 		}
       
  2922 	}
       
  2923 });
       
  2924 
       
  2925 var readyBound = false;
       
  2926 
       
  2927 function bindReady(){
       
  2928 	if ( readyBound ) return;
       
  2929 	readyBound = true;
       
  2930 
       
  2931 	// Mozilla, Opera and webkit nightlies currently support this event
       
  2932 	if ( document.addEventListener ) {
       
  2933 		// Use the handy event callback
       
  2934 		document.addEventListener( "DOMContentLoaded", function(){
       
  2935 			document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
       
  2936 			jQuery.ready();
       
  2937 		}, false );
       
  2938 
       
  2939 	// If IE event model is used
       
  2940 	} else if ( document.attachEvent ) {
       
  2941 		// ensure firing before onload,
       
  2942 		// maybe late but safe also for iframes
       
  2943 		document.attachEvent("onreadystatechange", function(){
       
  2944 			if ( document.readyState === "complete" ) {
       
  2945 				document.detachEvent( "onreadystatechange", arguments.callee );
       
  2946 				jQuery.ready();
       
  2947 			}
       
  2948 		});
       
  2949 
       
  2950 		// If IE and not an iframe
       
  2951 		// continually check to see if the document is ready
       
  2952 		if ( document.documentElement.doScroll && typeof window.frameElement === "undefined" ) (function(){
       
  2953 			if ( jQuery.isReady ) return;
       
  2954 
       
  2955 			try {
       
  2956 				// If IE is used, use the trick by Diego Perini
       
  2957 				// http://javascript.nwbox.com/IEContentLoaded/
       
  2958 				document.documentElement.doScroll("left");
       
  2959 			} catch( error ) {
       
  2960 				setTimeout( arguments.callee, 0 );
       
  2961 				return;
       
  2962 			}
       
  2963 
       
  2964 			// and execute any waiting functions
       
  2965 			jQuery.ready();
       
  2966 		})();
       
  2967 	}
       
  2968 
       
  2969 	// A fallback to window.onload, that will always work
       
  2970 	jQuery.event.add( window, "load", jQuery.ready );
       
  2971 }
       
  2972 
       
  2973 jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
       
  2974 	"mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," +
       
  2975 	"change,select,submit,keydown,keypress,keyup,error").split(","), function(i, name){
       
  2976 
       
  2977 	// Handle event binding
       
  2978 	jQuery.fn[name] = function(fn){
       
  2979 		return fn ? this.bind(name, fn) : this.trigger(name);
       
  2980 	};
       
  2981 });
       
  2982 
       
  2983 // Prevent memory leaks in IE
       
  2984 // And prevent errors on refresh with events like mouseover in other browsers
       
  2985 // Window isn't included so as not to unbind existing unload events
       
  2986 jQuery( window ).bind( 'unload', function(){ 
       
  2987 	for ( var id in jQuery.cache )
       
  2988 		// Skip the window
       
  2989 		if ( id != 1 && jQuery.cache[ id ].handle )
       
  2990 			jQuery.event.remove( jQuery.cache[ id ].handle.elem );
       
  2991 }); 
       
  2992 (function(){
       
  2993 
       
  2994 	jQuery.support = {};
       
  2995 
       
  2996 	var root = document.documentElement,
       
  2997 		script = document.createElement("script"),
       
  2998 		div = document.createElement("div"),
       
  2999 		id = "script" + (new Date).getTime();
       
  3000 
       
  3001 	div.style.display = "none";
       
  3002 	div.innerHTML = '   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';
       
  3003 
       
  3004 	var all = div.getElementsByTagName("*"),
       
  3005 		a = div.getElementsByTagName("a")[0];
       
  3006 
       
  3007 	// Can't get basic test support
       
  3008 	if ( !all || !all.length || !a ) {
       
  3009 		return;
       
  3010 	}
       
  3011 
       
  3012 	jQuery.support = {
       
  3013 		// IE strips leading whitespace when .innerHTML is used
       
  3014 		leadingWhitespace: div.firstChild.nodeType == 3,
       
  3015 		
       
  3016 		// Make sure that tbody elements aren't automatically inserted
       
  3017 		// IE will insert them into empty tables
       
  3018 		tbody: !div.getElementsByTagName("tbody").length,
       
  3019 		
       
  3020 		// Make sure that you can get all elements in an <object> element
       
  3021 		// IE 7 always returns no results
       
  3022 		objectAll: !!div.getElementsByTagName("object")[0]
       
  3023 			.getElementsByTagName("*").length,
       
  3024 		
       
  3025 		// Make sure that link elements get serialized correctly by innerHTML
       
  3026 		// This requires a wrapper element in IE
       
  3027 		htmlSerialize: !!div.getElementsByTagName("link").length,
       
  3028 		
       
  3029 		// Get the style information from getAttribute
       
  3030 		// (IE uses .cssText insted)
       
  3031 		style: /red/.test( a.getAttribute("style") ),
       
  3032 		
       
  3033 		// Make sure that URLs aren't manipulated
       
  3034 		// (IE normalizes it by default)
       
  3035 		hrefNormalized: a.getAttribute("href") === "/a",
       
  3036 		
       
  3037 		// Make sure that element opacity exists
       
  3038 		// (IE uses filter instead)
       
  3039 		opacity: a.style.opacity === "0.5",
       
  3040 		
       
  3041 		// Verify style float existence
       
  3042 		// (IE uses styleFloat instead of cssFloat)
       
  3043 		cssFloat: !!a.style.cssFloat,
       
  3044 
       
  3045 		// Will be defined later
       
  3046 		scriptEval: false,
       
  3047 		noCloneEvent: true,
       
  3048 		boxModel: null
       
  3049 	};
       
  3050 	
       
  3051 	script.type = "text/javascript";
       
  3052 	try {
       
  3053 		script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
       
  3054 	} catch(e){}
       
  3055 
       
  3056 	root.insertBefore( script, root.firstChild );
       
  3057 	
       
  3058 	// Make sure that the execution of code works by injecting a script
       
  3059 	// tag with appendChild/createTextNode
       
  3060 	// (IE doesn't support this, fails, and uses .text instead)
       
  3061 	if ( window[ id ] ) {
       
  3062 		jQuery.support.scriptEval = true;
       
  3063 		delete window[ id ];
       
  3064 	}
       
  3065 
       
  3066 	root.removeChild( script );
       
  3067 
       
  3068 	if ( div.attachEvent && div.fireEvent ) {
       
  3069 		div.attachEvent("onclick", function(){
       
  3070 			// Cloning a node shouldn't copy over any
       
  3071 			// bound event handlers (IE does this)
       
  3072 			jQuery.support.noCloneEvent = false;
       
  3073 			div.detachEvent("onclick", arguments.callee);
       
  3074 		});
       
  3075 		div.cloneNode(true).fireEvent("onclick");
       
  3076 	}
       
  3077 
       
  3078 	// Figure out if the W3C box model works as expected
       
  3079 	// document.body must exist before we can do this
       
  3080 	jQuery(function(){
       
  3081 		var div = document.createElement("div");
       
  3082 		div.style.width = "1px";
       
  3083 		div.style.paddingLeft = "1px";
       
  3084 
       
  3085 		document.body.appendChild( div );
       
  3086 		jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
       
  3087 		document.body.removeChild( div );
       
  3088 	});
       
  3089 })();
       
  3090 
       
  3091 var styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat";
       
  3092 
       
  3093 jQuery.props = {
       
  3094 	"for": "htmlFor",
       
  3095 	"class": "className",
       
  3096 	"float": styleFloat,
       
  3097 	cssFloat: styleFloat,
       
  3098 	styleFloat: styleFloat,
       
  3099 	readonly: "readOnly",
       
  3100 	maxlength: "maxLength",
       
  3101 	cellspacing: "cellSpacing",
       
  3102 	rowspan: "rowSpan",
       
  3103 	tabindex: "tabIndex"
       
  3104 };
       
  3105 jQuery.fn.extend({
       
  3106 	// Keep a copy of the old load
       
  3107 	_load: jQuery.fn.load,
       
  3108 
       
  3109 	load: function( url, params, callback ) {
       
  3110 		if ( typeof url !== "string" )
       
  3111 			return this._load( url );
       
  3112 
       
  3113 		var off = url.indexOf(" ");
       
  3114 		if ( off >= 0 ) {
       
  3115 			var selector = url.slice(off, url.length);
       
  3116 			url = url.slice(0, off);
       
  3117 		}
       
  3118 
       
  3119 		// Default to a GET request
       
  3120 		var type = "GET";
       
  3121 
       
  3122 		// If the second parameter was provided
       
  3123 		if ( params )
       
  3124 			// If it's a function
       
  3125 			if ( jQuery.isFunction( params ) ) {
       
  3126 				// We assume that it's the callback
       
  3127 				callback = params;
       
  3128 				params = null;
       
  3129 
       
  3130 			// Otherwise, build a param string
       
  3131 			} else if( typeof params === "object" ) {
       
  3132 				params = jQuery.param( params );
       
  3133 				type = "POST";
       
  3134 			}
       
  3135 
       
  3136 		var self = this;
       
  3137 
       
  3138 		// Request the remote document
       
  3139 		jQuery.ajax({
       
  3140 			url: url,
       
  3141 			type: type,
       
  3142 			dataType: "html",
       
  3143 			data: params,
       
  3144 			complete: function(res, status){
       
  3145 				// If successful, inject the HTML into all the matched elements
       
  3146 				if ( status == "success" || status == "notmodified" )
       
  3147 					// See if a selector was specified
       
  3148 					self.html( selector ?
       
  3149 						// Create a dummy div to hold the results
       
  3150 						jQuery("<div/>")
       
  3151 							// inject the contents of the document in, removing the scripts
       
  3152 							// to avoid any 'Permission Denied' errors in IE
       
  3153 							.append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
       
  3154 
       
  3155 							// Locate the specified elements
       
  3156 							.find(selector) :
       
  3157 
       
  3158 						// If not, just inject the full result
       
  3159 						res.responseText );
       
  3160 
       
  3161 				if( callback )
       
  3162 					self.each( callback, [res.responseText, status, res] );
       
  3163 			}
       
  3164 		});
       
  3165 		return this;
       
  3166 	},
       
  3167 
       
  3168 	serialize: function() {
       
  3169 		return jQuery.param(this.serializeArray());
       
  3170 	},
       
  3171 	serializeArray: function() {
       
  3172 		return this.map(function(){
       
  3173 			return this.elements ? jQuery.makeArray(this.elements) : this;
       
  3174 		})
       
  3175 		.filter(function(){
       
  3176 			return this.name && !this.disabled &&
       
  3177 				(this.checked || /select|textarea/i.test(this.nodeName) ||
       
  3178 					/text|hidden|password/i.test(this.type));
       
  3179 		})
       
  3180 		.map(function(i, elem){
       
  3181 			var val = jQuery(this).val();
       
  3182 			return val == null ? null :
       
  3183 				jQuery.isArray(val) ?
       
  3184 					jQuery.map( val, function(val, i){
       
  3185 						return {name: elem.name, value: val};
       
  3186 					}) :
       
  3187 					{name: elem.name, value: val};
       
  3188 		}).get();
       
  3189 	}
       
  3190 });
       
  3191 
       
  3192 // Attach a bunch of functions for handling common AJAX events
       
  3193 jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
       
  3194 	jQuery.fn[o] = function(f){
       
  3195 		return this.bind(o, f);
       
  3196 	};
       
  3197 });
       
  3198 
       
  3199 var jsc = now();
       
  3200 
       
  3201 jQuery.extend({
       
  3202   
       
  3203 	get: function( url, data, callback, type ) {
       
  3204 		// shift arguments if data argument was ommited
       
  3205 		if ( jQuery.isFunction( data ) ) {
       
  3206 			callback = data;
       
  3207 			data = null;
       
  3208 		}
       
  3209 
       
  3210 		return jQuery.ajax({
       
  3211 			type: "GET",
       
  3212 			url: url,
       
  3213 			data: data,
       
  3214 			success: callback,
       
  3215 			dataType: type
       
  3216 		});
       
  3217 	},
       
  3218 
       
  3219 	getScript: function( url, callback ) {
       
  3220 		return jQuery.get(url, null, callback, "script");
       
  3221 	},
       
  3222 
       
  3223 	getJSON: function( url, data, callback ) {
       
  3224 		return jQuery.get(url, data, callback, "json");
       
  3225 	},
       
  3226 
       
  3227 	post: function( url, data, callback, type ) {
       
  3228 		if ( jQuery.isFunction( data ) ) {
       
  3229 			callback = data;
       
  3230 			data = {};
       
  3231 		}
       
  3232 
       
  3233 		return jQuery.ajax({
       
  3234 			type: "POST",
       
  3235 			url: url,
       
  3236 			data: data,
       
  3237 			success: callback,
       
  3238 			dataType: type
       
  3239 		});
       
  3240 	},
       
  3241 
       
  3242 	ajaxSetup: function( settings ) {
       
  3243 		jQuery.extend( jQuery.ajaxSettings, settings );
       
  3244 	},
       
  3245 
       
  3246 	ajaxSettings: {
       
  3247 		url: location.href,
       
  3248 		global: true,
       
  3249 		type: "GET",
       
  3250 		contentType: "application/x-www-form-urlencoded",
       
  3251 		processData: true,
       
  3252 		async: true,
       
  3253 		/*
       
  3254 		timeout: 0,
       
  3255 		data: null,
       
  3256 		username: null,
       
  3257 		password: null,
       
  3258 		*/
       
  3259 		// Create the request object; Microsoft failed to properly
       
  3260 		// implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
       
  3261 		// This function can be overriden by calling jQuery.ajaxSetup
       
  3262 		xhr:function(){
       
  3263 			return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
       
  3264 		},
       
  3265 		accepts: {
       
  3266 			xml: "application/xml, text/xml",
       
  3267 			html: "text/html",
       
  3268 			script: "text/javascript, application/javascript",
       
  3269 			json: "application/json, text/javascript",
       
  3270 			text: "text/plain",
       
  3271 			_default: "*/*"
       
  3272 		}
       
  3273 	},
       
  3274 
       
  3275 	// Last-Modified header cache for next request
       
  3276 	lastModified: {},
       
  3277 
       
  3278 	ajax: function( s ) {
       
  3279 		// Extend the settings, but re-extend 's' so that it can be
       
  3280 		// checked again later (in the test suite, specifically)
       
  3281 		s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
       
  3282 
       
  3283 		var jsonp, jsre = /=\?(&|$)/g, status, data,
       
  3284 			type = s.type.toUpperCase();
       
  3285 
       
  3286 		// convert data if not already a string
       
  3287 		if ( s.data && s.processData && typeof s.data !== "string" )
       
  3288 			s.data = jQuery.param(s.data);
       
  3289 
       
  3290 		// Handle JSONP Parameter Callbacks
       
  3291 		if ( s.dataType == "jsonp" ) {
       
  3292 			if ( type == "GET" ) {
       
  3293 				if ( !s.url.match(jsre) )
       
  3294 					s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
       
  3295 			} else if ( !s.data || !s.data.match(jsre) )
       
  3296 				s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
       
  3297 			s.dataType = "json";
       
  3298 		}
       
  3299 
       
  3300 		// Build temporary JSONP function
       
  3301 		if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
       
  3302 			jsonp = "jsonp" + jsc++;
       
  3303 
       
  3304 			// Replace the =? sequence both in the query string and the data
       
  3305 			if ( s.data )
       
  3306 				s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
       
  3307 			s.url = s.url.replace(jsre, "=" + jsonp + "$1");
       
  3308 
       
  3309 			// We need to make sure
       
  3310 			// that a JSONP style response is executed properly
       
  3311 			s.dataType = "script";
       
  3312 
       
  3313 			// Handle JSONP-style loading
       
  3314 			window[ jsonp ] = function(tmp){
       
  3315 				data = tmp;
       
  3316 				success();
       
  3317 				complete();
       
  3318 				// Garbage collect
       
  3319 				window[ jsonp ] = undefined;
       
  3320 				try{ delete window[ jsonp ]; } catch(e){}
       
  3321 				if ( head )
       
  3322 					head.removeChild( script );
       
  3323 			};
       
  3324 		}
       
  3325 
       
  3326 		if ( s.dataType == "script" && s.cache == null )
       
  3327 			s.cache = false;
       
  3328 
       
  3329 		if ( s.cache === false && type == "GET" ) {
       
  3330 			var ts = now();
       
  3331 			// try replacing _= if it is there
       
  3332 			var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
       
  3333 			// if nothing was replaced, add timestamp to the end
       
  3334 			s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
       
  3335 		}
       
  3336 
       
  3337 		// If data is available, append data to url for get requests
       
  3338 		if ( s.data && type == "GET" ) {
       
  3339 			s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
       
  3340 
       
  3341 			// IE likes to send both get and post data, prevent this
       
  3342 			s.data = null;
       
  3343 		}
       
  3344 
       
  3345 		// Watch for a new set of requests
       
  3346 		if ( s.global && ! jQuery.active++ )
       
  3347 			jQuery.event.trigger( "ajaxStart" );
       
  3348 
       
  3349 		// Matches an absolute URL, and saves the domain
       
  3350 		var parts = /^(\w+:)?\/\/([^\/?#]+)/.exec( s.url );
       
  3351 
       
  3352 		// If we're requesting a remote document
       
  3353 		// and trying to load JSON or Script with a GET
       
  3354 		if ( s.dataType == "script" && type == "GET" && parts
       
  3355 			&& ( parts[1] && parts[1] != location.protocol || parts[2] != location.host )){
       
  3356 
       
  3357 			var head = document.getElementsByTagName("head")[0];
       
  3358 			var script = document.createElement("script");
       
  3359 			script.src = s.url;
       
  3360 			if (s.scriptCharset)
       
  3361 				script.charset = s.scriptCharset;
       
  3362 
       
  3363 			// Handle Script loading
       
  3364 			if ( !jsonp ) {
       
  3365 				var done = false;
       
  3366 
       
  3367 				// Attach handlers for all browsers
       
  3368 				script.onload = script.onreadystatechange = function(){
       
  3369 					if ( !done && (!this.readyState ||
       
  3370 							this.readyState == "loaded" || this.readyState == "complete") ) {
       
  3371 						done = true;
       
  3372 						success();
       
  3373 						complete();
       
  3374 						head.removeChild( script );
       
  3375 					}
       
  3376 				};
       
  3377 			}
       
  3378 
       
  3379 			head.appendChild(script);
       
  3380 
       
  3381 			// We handle everything using the script element injection
       
  3382 			return undefined;
       
  3383 		}
       
  3384 
       
  3385 		var requestDone = false;
       
  3386 
       
  3387 		// Create the request object
       
  3388 		var xhr = s.xhr();
       
  3389 
       
  3390 		// Open the socket
       
  3391 		// Passing null username, generates a login popup on Opera (#2865)
       
  3392 		if( s.username )
       
  3393 			xhr.open(type, s.url, s.async, s.username, s.password);
       
  3394 		else
       
  3395 			xhr.open(type, s.url, s.async);
       
  3396 
       
  3397 		// Need an extra try/catch for cross domain requests in Firefox 3
       
  3398 		try {
       
  3399 			// Set the correct header, if data is being sent
       
  3400 			if ( s.data )
       
  3401 				xhr.setRequestHeader("Content-Type", s.contentType);
       
  3402 
       
  3403 			// Set the If-Modified-Since header, if ifModified mode.
       
  3404 			if ( s.ifModified )
       
  3405 				xhr.setRequestHeader("If-Modified-Since",
       
  3406 					jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
       
  3407 
       
  3408 			// Set header so the called script knows that it's an XMLHttpRequest
       
  3409 			xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
       
  3410 
       
  3411 			// Set the Accepts header for the server, depending on the dataType
       
  3412 			xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
       
  3413 				s.accepts[ s.dataType ] + ", */*" :
       
  3414 				s.accepts._default );
       
  3415 		} catch(e){}
       
  3416 
       
  3417 		// Allow custom headers/mimetypes and early abort
       
  3418 		if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
       
  3419 			// Handle the global AJAX counter
       
  3420 			if ( s.global && ! --jQuery.active )
       
  3421 				jQuery.event.trigger( "ajaxStop" );
       
  3422 			// close opended socket
       
  3423 			xhr.abort();
       
  3424 			return false;
       
  3425 		}
       
  3426 
       
  3427 		if ( s.global )
       
  3428 			jQuery.event.trigger("ajaxSend", [xhr, s]);
       
  3429 
       
  3430 		// Wait for a response to come back
       
  3431 		var onreadystatechange = function(isTimeout){
       
  3432 			// The request was aborted, clear the interval and decrement jQuery.active
       
  3433 			if (xhr.readyState == 0) {
       
  3434 				if (ival) {
       
  3435 					// clear poll interval
       
  3436 					clearInterval(ival);
       
  3437 					ival = null;
       
  3438 					// Handle the global AJAX counter
       
  3439 					if ( s.global && ! --jQuery.active )
       
  3440 						jQuery.event.trigger( "ajaxStop" );
       
  3441 				}
       
  3442 			// The transfer is complete and the data is available, or the request timed out
       
  3443 			} else if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
       
  3444 				requestDone = true;
       
  3445 
       
  3446 				// clear poll interval
       
  3447 				if (ival) {
       
  3448 					clearInterval(ival);
       
  3449 					ival = null;
       
  3450 				}
       
  3451 
       
  3452 				status = isTimeout == "timeout" ? "timeout" :
       
  3453 					!jQuery.httpSuccess( xhr ) ? "error" :
       
  3454 					s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? "notmodified" :
       
  3455 					"success";
       
  3456 
       
  3457 				if ( status == "success" ) {
       
  3458 					// Watch for, and catch, XML document parse errors
       
  3459 					try {
       
  3460 						// process the data (runs the xml through httpData regardless of callback)
       
  3461 						data = jQuery.httpData( xhr, s.dataType, s );
       
  3462 					} catch(e) {
       
  3463 						status = "parsererror";
       
  3464 					}
       
  3465 				}
       
  3466 
       
  3467 				// Make sure that the request was successful or notmodified
       
  3468 				if ( status == "success" ) {
       
  3469 					// Cache Last-Modified header, if ifModified mode.
       
  3470 					var modRes;
       
  3471 					try {
       
  3472 						modRes = xhr.getResponseHeader("Last-Modified");
       
  3473 					} catch(e) {} // swallow exception thrown by FF if header is not available
       
  3474 
       
  3475 					if ( s.ifModified && modRes )
       
  3476 						jQuery.lastModified[s.url] = modRes;
       
  3477 
       
  3478 					// JSONP handles its own success callback
       
  3479 					if ( !jsonp )
       
  3480 						success();
       
  3481 				} else
       
  3482 					jQuery.handleError(s, xhr, status);
       
  3483 
       
  3484 				// Fire the complete handlers
       
  3485 				complete();
       
  3486 
       
  3487 				if ( isTimeout )
       
  3488 					xhr.abort();
       
  3489 
       
  3490 				// Stop memory leaks
       
  3491 				if ( s.async )
       
  3492 					xhr = null;
       
  3493 			}
       
  3494 		};
       
  3495 
       
  3496 		if ( s.async ) {
       
  3497 			// don't attach the handler to the request, just poll it instead
       
  3498 			var ival = setInterval(onreadystatechange, 13);
       
  3499 
       
  3500 			// Timeout checker
       
  3501 			if ( s.timeout > 0 )
       
  3502 				setTimeout(function(){
       
  3503 					// Check to see if the request is still happening
       
  3504 					if ( xhr && !requestDone )
       
  3505 						onreadystatechange( "timeout" );
       
  3506 				}, s.timeout);
       
  3507 		}
       
  3508 
       
  3509 		// Send the data
       
  3510 		try {
       
  3511 			xhr.send(s.data);
       
  3512 		} catch(e) {
       
  3513 			jQuery.handleError(s, xhr, null, e);
       
  3514 		}
       
  3515 
       
  3516 		// firefox 1.5 doesn't fire statechange for sync requests
       
  3517 		if ( !s.async )
       
  3518 			onreadystatechange();
       
  3519 
       
  3520 		function success(){
       
  3521 			// If a local callback was specified, fire it and pass it the data
       
  3522 			if ( s.success )
       
  3523 				s.success( data, status );
       
  3524 
       
  3525 			// Fire the global callback
       
  3526 			if ( s.global )
       
  3527 				jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
       
  3528 		}
       
  3529 
       
  3530 		function complete(){
       
  3531 			// Process result
       
  3532 			if ( s.complete )
       
  3533 				s.complete(xhr, status);
       
  3534 
       
  3535 			// The request was completed
       
  3536 			if ( s.global )
       
  3537 				jQuery.event.trigger( "ajaxComplete", [xhr, s] );
       
  3538 
       
  3539 			// Handle the global AJAX counter
       
  3540 			if ( s.global && ! --jQuery.active )
       
  3541 				jQuery.event.trigger( "ajaxStop" );
       
  3542 		}
       
  3543 
       
  3544 		// return XMLHttpRequest to allow aborting the request etc.
       
  3545 		return xhr;
       
  3546 	},
       
  3547 
       
  3548 	handleError: function( s, xhr, status, e ) {
       
  3549 		// If a local callback was specified, fire it
       
  3550 		if ( s.error ) s.error( xhr, status, e );
       
  3551 
       
  3552 		// Fire the global callback
       
  3553 		if ( s.global )
       
  3554 			jQuery.event.trigger( "ajaxError", [xhr, s, e] );
       
  3555 	},
       
  3556 
       
  3557 	// Counter for holding the number of active queries
       
  3558 	active: 0,
       
  3559 
       
  3560 	// Determines if an XMLHttpRequest was successful or not
       
  3561 	httpSuccess: function( xhr ) {
       
  3562 		try {
       
  3563 			// IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
       
  3564 			return !xhr.status && location.protocol == "file:" ||
       
  3565 				( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223;
       
  3566 		} catch(e){}
       
  3567 		return false;
       
  3568 	},
       
  3569 
       
  3570 	// Determines if an XMLHttpRequest returns NotModified
       
  3571 	httpNotModified: function( xhr, url ) {
       
  3572 		try {
       
  3573 			var xhrRes = xhr.getResponseHeader("Last-Modified");
       
  3574 
       
  3575 			// Firefox always returns 200. check Last-Modified date
       
  3576 			return xhr.status == 304 || xhrRes == jQuery.lastModified[url];
       
  3577 		} catch(e){}
       
  3578 		return false;
       
  3579 	},
       
  3580 
       
  3581 	httpData: function( xhr, type, s ) {
       
  3582 		var ct = xhr.getResponseHeader("content-type"),
       
  3583 			xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
       
  3584 			data = xml ? xhr.responseXML : xhr.responseText;
       
  3585 
       
  3586 		if ( xml && data.documentElement.tagName == "parsererror" )
       
  3587 			throw "parsererror";
       
  3588 			
       
  3589 		// Allow a pre-filtering function to sanitize the response
       
  3590 		// s != null is checked to keep backwards compatibility
       
  3591 		if( s && s.dataFilter )
       
  3592 			data = s.dataFilter( data, type );
       
  3593 
       
  3594 		// The filter can actually parse the response
       
  3595 		if( typeof data === "string" ){
       
  3596 
       
  3597 			// If the type is "script", eval it in global context
       
  3598 			if ( type == "script" )
       
  3599 				jQuery.globalEval( data );
       
  3600 
       
  3601 			// Get the JavaScript object, if JSON is used.
       
  3602 			if ( type == "json" )
       
  3603 				data = window["eval"]("(" + data + ")");
       
  3604 		}
       
  3605 		
       
  3606 		return data;
       
  3607 	},
       
  3608 
       
  3609 	// Serialize an array of form elements or a set of
       
  3610 	// key/values into a query string
       
  3611 	param: function( a ) {
       
  3612 		var s = [ ];
       
  3613 
       
  3614 		function add( key, value ){
       
  3615 			s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
       
  3616 		};
       
  3617 
       
  3618 		// If an array was passed in, assume that it is an array
       
  3619 		// of form elements
       
  3620 		if ( jQuery.isArray(a) || a.jquery )
       
  3621 			// Serialize the form elements
       
  3622 			jQuery.each( a, function(){
       
  3623 				add( this.name, this.value );
       
  3624 			});
       
  3625 
       
  3626 		// Otherwise, assume that it's an object of key/value pairs
       
  3627 		else
       
  3628 			// Serialize the key/values
       
  3629 			for ( var j in a )
       
  3630 				// If the value is an array then the key names need to be repeated
       
  3631 				if ( jQuery.isArray(a[j]) )
       
  3632 					jQuery.each( a[j], function(){
       
  3633 						add( j, this );
       
  3634 					});
       
  3635 				else
       
  3636 					add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] );
       
  3637 
       
  3638 		// Return the resulting serialization
       
  3639 		return s.join("&").replace(/%20/g, "+");
       
  3640 	}
       
  3641 
       
  3642 });
       
  3643 var elemdisplay = {},
       
  3644 	timerId,
       
  3645 	fxAttrs = [
       
  3646 		// height animations
       
  3647 		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
       
  3648 		// width animations
       
  3649 		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
       
  3650 		// opacity animations
       
  3651 		[ "opacity" ]
       
  3652 	];
       
  3653 
       
  3654 function genFx( type, num ){
       
  3655 	var obj = {};
       
  3656 	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function(){
       
  3657 		obj[ this ] = type;
       
  3658 	});
       
  3659 	return obj;
       
  3660 }
       
  3661 
       
  3662 jQuery.fn.extend({
       
  3663 	show: function(speed,callback){
       
  3664 		if ( speed ) {
       
  3665 			return this.animate( genFx("show", 3), speed, callback);
       
  3666 		} else {
       
  3667 			for ( var i = 0, l = this.length; i < l; i++ ){
       
  3668 				var old = jQuery.data(this[i], "olddisplay");
       
  3669 				
       
  3670 				this[i].style.display = old || "";
       
  3671 				
       
  3672 				if ( jQuery.css(this[i], "display") === "none" ) {
       
  3673 					var tagName = this[i].tagName, display;
       
  3674 					
       
  3675 					if ( elemdisplay[ tagName ] ) {
       
  3676 						display = elemdisplay[ tagName ];
       
  3677 					} else {
       
  3678 						var elem = jQuery("<" + tagName + " />").appendTo("body");
       
  3679 						
       
  3680 						display = elem.css("display");
       
  3681 						if ( display === "none" )
       
  3682 							display = "block";
       
  3683 						
       
  3684 						elem.remove();
       
  3685 						
       
  3686 						elemdisplay[ tagName ] = display;
       
  3687 					}
       
  3688 					
       
  3689 					this[i].style.display = jQuery.data(this[i], "olddisplay", display);
       
  3690 				}
       
  3691 			}
       
  3692 			
       
  3693 			return this;
       
  3694 		}
       
  3695 	},
       
  3696 
       
  3697 	hide: function(speed,callback){
       
  3698 		if ( speed ) {
       
  3699 			return this.animate( genFx("hide", 3), speed, callback);
       
  3700 		} else {
       
  3701 			for ( var i = 0, l = this.length; i < l; i++ ){
       
  3702 				var old = jQuery.data(this[i], "olddisplay");
       
  3703 				if ( !old && old !== "none" )
       
  3704 					jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
       
  3705 				this[i].style.display = "none";
       
  3706 			}
       
  3707 			return this;
       
  3708 		}
       
  3709 	},
       
  3710 
       
  3711 	// Save the old toggle function
       
  3712 	_toggle: jQuery.fn.toggle,
       
  3713 
       
  3714 	toggle: function( fn, fn2 ){
       
  3715 		var bool = typeof fn === "boolean";
       
  3716 
       
  3717 		return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
       
  3718 			this._toggle.apply( this, arguments ) :
       
  3719 			fn == null || bool ?
       
  3720 				this.each(function(){
       
  3721 					var state = bool ? fn : jQuery(this).is(":hidden");
       
  3722 					jQuery(this)[ state ? "show" : "hide" ]();
       
  3723 				}) :
       
  3724 				this.animate(genFx("toggle", 3), fn, fn2);
       
  3725 	},
       
  3726 
       
  3727 	fadeTo: function(speed,to,callback){
       
  3728 		return this.animate({opacity: to}, speed, callback);
       
  3729 	},
       
  3730 
       
  3731 	animate: function( prop, speed, easing, callback ) {
       
  3732 		var optall = jQuery.speed(speed, easing, callback);
       
  3733 
       
  3734 		return this[ optall.queue === false ? "each" : "queue" ](function(){
       
  3735 		
       
  3736 			var opt = jQuery.extend({}, optall), p,
       
  3737 				hidden = this.nodeType == 1 && jQuery(this).is(":hidden"),
       
  3738 				self = this;
       
  3739 	
       
  3740 			for ( p in prop ) {
       
  3741 				if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
       
  3742 					return opt.complete.call(this);
       
  3743 
       
  3744 				if ( ( p == "height" || p == "width" ) && this.style ) {
       
  3745 					// Store display property
       
  3746 					opt.display = jQuery.css(this, "display");
       
  3747 
       
  3748 					// Make sure that nothing sneaks out
       
  3749 					opt.overflow = this.style.overflow;
       
  3750 				}
       
  3751 			}
       
  3752 
       
  3753 			if ( opt.overflow != null )
       
  3754 				this.style.overflow = "hidden";
       
  3755 
       
  3756 			opt.curAnim = jQuery.extend({}, prop);
       
  3757 
       
  3758 			jQuery.each( prop, function(name, val){
       
  3759 				var e = new jQuery.fx( self, opt, name );
       
  3760 
       
  3761 				if ( /toggle|show|hide/.test(val) )
       
  3762 					e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
       
  3763 				else {
       
  3764 					var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
       
  3765 						start = e.cur(true) || 0;
       
  3766 
       
  3767 					if ( parts ) {
       
  3768 						var end = parseFloat(parts[2]),
       
  3769 							unit = parts[3] || "px";
       
  3770 
       
  3771 						// We need to compute starting value
       
  3772 						if ( unit != "px" ) {
       
  3773 							self.style[ name ] = (end || 1) + unit;
       
  3774 							start = ((end || 1) / e.cur(true)) * start;
       
  3775 							self.style[ name ] = start + unit;
       
  3776 						}
       
  3777 
       
  3778 						// If a +=/-= token was provided, we're doing a relative animation
       
  3779 						if ( parts[1] )
       
  3780 							end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
       
  3781 
       
  3782 						e.custom( start, end, unit );
       
  3783 					} else
       
  3784 						e.custom( start, val, "" );
       
  3785 				}
       
  3786 			});
       
  3787 
       
  3788 			// For JS strict compliance
       
  3789 			return true;
       
  3790 		});
       
  3791 	},
       
  3792 
       
  3793 	stop: function(clearQueue, gotoEnd){
       
  3794 		var timers = jQuery.timers;
       
  3795 
       
  3796 		if (clearQueue)
       
  3797 			this.queue([]);
       
  3798 
       
  3799 		this.each(function(){
       
  3800 			// go in reverse order so anything added to the queue during the loop is ignored
       
  3801 			for ( var i = timers.length - 1; i >= 0; i-- )
       
  3802 				if ( timers[i].elem == this ) {
       
  3803 					if (gotoEnd)
       
  3804 						// force the next step to be the last
       
  3805 						timers[i](true);
       
  3806 					timers.splice(i, 1);
       
  3807 				}
       
  3808 		});
       
  3809 
       
  3810 		// start the next in the queue if the last step wasn't forced
       
  3811 		if (!gotoEnd)
       
  3812 			this.dequeue();
       
  3813 
       
  3814 		return this;
       
  3815 	}
       
  3816 
       
  3817 });
       
  3818 
       
  3819 // Generate shortcuts for custom animations
       
  3820 jQuery.each({
       
  3821 	slideDown: genFx("show", 1),
       
  3822 	slideUp: genFx("hide", 1),
       
  3823 	slideToggle: genFx("toggle", 1),
       
  3824 	fadeIn: { opacity: "show" },
       
  3825 	fadeOut: { opacity: "hide" }
       
  3826 }, function( name, props ){
       
  3827 	jQuery.fn[ name ] = function( speed, callback ){
       
  3828 		return this.animate( props, speed, callback );
       
  3829 	};
       
  3830 });
       
  3831 
       
  3832 jQuery.extend({
       
  3833 
       
  3834 	speed: function(speed, easing, fn) {
       
  3835 		var opt = typeof speed === "object" ? speed : {
       
  3836 			complete: fn || !fn && easing ||
       
  3837 				jQuery.isFunction( speed ) && speed,
       
  3838 			duration: speed,
       
  3839 			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
       
  3840 		};
       
  3841 
       
  3842 		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
       
  3843 			jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
       
  3844 
       
  3845 		// Queueing
       
  3846 		opt.old = opt.complete;
       
  3847 		opt.complete = function(){
       
  3848 			if ( opt.queue !== false )
       
  3849 				jQuery(this).dequeue();
       
  3850 			if ( jQuery.isFunction( opt.old ) )
       
  3851 				opt.old.call( this );
       
  3852 		};
       
  3853 
       
  3854 		return opt;
       
  3855 	},
       
  3856 
       
  3857 	easing: {
       
  3858 		linear: function( p, n, firstNum, diff ) {
       
  3859 			return firstNum + diff * p;
       
  3860 		},
       
  3861 		swing: function( p, n, firstNum, diff ) {
       
  3862 			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
       
  3863 		}
       
  3864 	},
       
  3865 
       
  3866 	timers: [],
       
  3867 
       
  3868 	fx: function( elem, options, prop ){
       
  3869 		this.options = options;
       
  3870 		this.elem = elem;
       
  3871 		this.prop = prop;
       
  3872 
       
  3873 		if ( !options.orig )
       
  3874 			options.orig = {};
       
  3875 	}
       
  3876 
       
  3877 });
       
  3878 
       
  3879 jQuery.fx.prototype = {
       
  3880 
       
  3881 	// Simple function for setting a style value
       
  3882 	update: function(){
       
  3883 		if ( this.options.step )
       
  3884 			this.options.step.call( this.elem, this.now, this );
       
  3885 
       
  3886 		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
       
  3887 
       
  3888 		// Set display property to block for height/width animations
       
  3889 		if ( ( this.prop == "height" || this.prop == "width" ) && this.elem.style )
       
  3890 			this.elem.style.display = "block";
       
  3891 	},
       
  3892 
       
  3893 	// Get the current size
       
  3894 	cur: function(force){
       
  3895 		if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) )
       
  3896 			return this.elem[ this.prop ];
       
  3897 
       
  3898 		var r = parseFloat(jQuery.css(this.elem, this.prop, force));
       
  3899 		return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
       
  3900 	},
       
  3901 
       
  3902 	// Start an animation from one number to another
       
  3903 	custom: function(from, to, unit){
       
  3904 		this.startTime = now();
       
  3905 		this.start = from;
       
  3906 		this.end = to;
       
  3907 		this.unit = unit || this.unit || "px";
       
  3908 		this.now = this.start;
       
  3909 		this.pos = this.state = 0;
       
  3910 
       
  3911 		var self = this;
       
  3912 		function t(gotoEnd){
       
  3913 			return self.step(gotoEnd);
       
  3914 		}
       
  3915 
       
  3916 		t.elem = this.elem;
       
  3917 
       
  3918 		if ( t() && jQuery.timers.push(t) == 1 ) {
       
  3919 			timerId = setInterval(function(){
       
  3920 				var timers = jQuery.timers;
       
  3921 
       
  3922 				for ( var i = 0; i < timers.length; i++ )
       
  3923 					if ( !timers[i]() )
       
  3924 						timers.splice(i--, 1);
       
  3925 
       
  3926 				if ( !timers.length ) {
       
  3927 					clearInterval( timerId );
       
  3928 				}
       
  3929 			}, 13);
       
  3930 		}
       
  3931 	},
       
  3932 
       
  3933 	// Simple 'show' function
       
  3934 	show: function(){
       
  3935 		// Remember where we started, so that we can go back to it later
       
  3936 		this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
       
  3937 		this.options.show = true;
       
  3938 
       
  3939 		// Begin the animation
       
  3940 		// Make sure that we start at a small width/height to avoid any
       
  3941 		// flash of content
       
  3942 		this.custom(this.prop == "width" || this.prop == "height" ? 1 : 0, this.cur());
       
  3943 
       
  3944 		// Start by showing the element
       
  3945 		jQuery(this.elem).show();
       
  3946 	},
       
  3947 
       
  3948 	// Simple 'hide' function
       
  3949 	hide: function(){
       
  3950 		// Remember where we started, so that we can go back to it later
       
  3951 		this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
       
  3952 		this.options.hide = true;
       
  3953 
       
  3954 		// Begin the animation
       
  3955 		this.custom(this.cur(), 0);
       
  3956 	},
       
  3957 
       
  3958 	// Each step of an animation
       
  3959 	step: function(gotoEnd){
       
  3960 		var t = now();
       
  3961 
       
  3962 		if ( gotoEnd || t >= this.options.duration + this.startTime ) {
       
  3963 			this.now = this.end;
       
  3964 			this.pos = this.state = 1;
       
  3965 			this.update();
       
  3966 
       
  3967 			this.options.curAnim[ this.prop ] = true;
       
  3968 
       
  3969 			var done = true;
       
  3970 			for ( var i in this.options.curAnim )
       
  3971 				if ( this.options.curAnim[i] !== true )
       
  3972 					done = false;
       
  3973 
       
  3974 			if ( done ) {
       
  3975 				if ( this.options.display != null ) {
       
  3976 					// Reset the overflow
       
  3977 					this.elem.style.overflow = this.options.overflow;
       
  3978 
       
  3979 					// Reset the display
       
  3980 					this.elem.style.display = this.options.display;
       
  3981 					if ( jQuery.css(this.elem, "display") == "none" )
       
  3982 						this.elem.style.display = "block";
       
  3983 				}
       
  3984 
       
  3985 				// Hide the element if the "hide" operation was done
       
  3986 				if ( this.options.hide )
       
  3987 					jQuery(this.elem).hide();
       
  3988 
       
  3989 				// Reset the properties, if the item has been hidden or shown
       
  3990 				if ( this.options.hide || this.options.show )
       
  3991 					for ( var p in this.options.curAnim )
       
  3992 						jQuery.attr(this.elem.style, p, this.options.orig[p]);
       
  3993 					
       
  3994 				// Execute the complete function
       
  3995 				this.options.complete.call( this.elem );
       
  3996 			}
       
  3997 
       
  3998 			return false;
       
  3999 		} else {
       
  4000 			var n = t - this.startTime;
       
  4001 			this.state = n / this.options.duration;
       
  4002 
       
  4003 			// Perform the easing function, defaults to swing
       
  4004 			this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
       
  4005 			this.now = this.start + ((this.end - this.start) * this.pos);
       
  4006 
       
  4007 			// Perform the next step of the animation
       
  4008 			this.update();
       
  4009 		}
       
  4010 
       
  4011 		return true;
       
  4012 	}
       
  4013 
       
  4014 };
       
  4015 
       
  4016 jQuery.extend( jQuery.fx, {
       
  4017 	speeds:{
       
  4018 		slow: 600,
       
  4019  		fast: 200,
       
  4020  		// Default speed
       
  4021  		_default: 400
       
  4022 	},
       
  4023 	step: {
       
  4024 
       
  4025 		opacity: function(fx){
       
  4026 			jQuery.attr(fx.elem.style, "opacity", fx.now);
       
  4027 		},
       
  4028 
       
  4029 		_default: function(fx){
       
  4030 			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null )
       
  4031 				fx.elem.style[ fx.prop ] = fx.now + fx.unit;
       
  4032 			else
       
  4033 				fx.elem[ fx.prop ] = fx.now;
       
  4034 		}
       
  4035 	}
       
  4036 });
       
  4037 if ( document.documentElement["getBoundingClientRect"] )
       
  4038 	jQuery.fn.offset = function() {
       
  4039 		if ( !this[0] ) return { top: 0, left: 0 };
       
  4040 		if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
       
  4041 		var box  = this[0].getBoundingClientRect(), doc = this[0].ownerDocument, body = doc.body, docElem = doc.documentElement,
       
  4042 			clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
       
  4043 			top  = box.top  + (self.pageYOffset || jQuery.boxModel && docElem.scrollTop  || body.scrollTop ) - clientTop,
       
  4044 			left = box.left + (self.pageXOffset || jQuery.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
       
  4045 		return { top: top, left: left };
       
  4046 	};
       
  4047 else 
       
  4048 	jQuery.fn.offset = function() {
       
  4049 		if ( !this[0] ) return { top: 0, left: 0 };
       
  4050 		if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
       
  4051 		jQuery.offset.initialized || jQuery.offset.initialize();
       
  4052 
       
  4053 		var elem = this[0], offsetParent = elem.offsetParent, prevOffsetParent = elem,
       
  4054 			doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
       
  4055 			body = doc.body, defaultView = doc.defaultView,
       
  4056 			prevComputedStyle = defaultView.getComputedStyle(elem, null),
       
  4057 			top = elem.offsetTop, left = elem.offsetLeft;
       
  4058 
       
  4059 		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
       
  4060 			computedStyle = defaultView.getComputedStyle(elem, null);
       
  4061 			top -= elem.scrollTop, left -= elem.scrollLeft;
       
  4062 			if ( elem === offsetParent ) {
       
  4063 				top += elem.offsetTop, left += elem.offsetLeft;
       
  4064 				if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.tagName)) )
       
  4065 					top  += parseInt( computedStyle.borderTopWidth,  10) || 0,
       
  4066 					left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
       
  4067 				prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
       
  4068 			}
       
  4069 			if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" )
       
  4070 				top  += parseInt( computedStyle.borderTopWidth,  10) || 0,
       
  4071 				left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
       
  4072 			prevComputedStyle = computedStyle;
       
  4073 		}
       
  4074 
       
  4075 		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" )
       
  4076 			top  += body.offsetTop,
       
  4077 			left += body.offsetLeft;
       
  4078 
       
  4079 		if ( prevComputedStyle.position === "fixed" )
       
  4080 			top  += Math.max(docElem.scrollTop, body.scrollTop),
       
  4081 			left += Math.max(docElem.scrollLeft, body.scrollLeft);
       
  4082 
       
  4083 		return { top: top, left: left };
       
  4084 	};
       
  4085 
       
  4086 jQuery.offset = {
       
  4087 	initialize: function() {
       
  4088 		if ( this.initialized ) return;
       
  4089 		var body = document.body, container = document.createElement('div'), innerDiv, checkDiv, table, td, rules, prop, bodyMarginTop = body.style.marginTop,
       
  4090 			html = '<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';
       
  4091 
       
  4092 		rules = { position: 'absolute', top: 0, left: 0, margin: 0, border: 0, width: '1px', height: '1px', visibility: 'hidden' };
       
  4093 		for ( prop in rules ) container.style[prop] = rules[prop];
       
  4094 
       
  4095 		container.innerHTML = html;
       
  4096 		body.insertBefore(container, body.firstChild);
       
  4097 		innerDiv = container.firstChild, checkDiv = innerDiv.firstChild, td = innerDiv.nextSibling.firstChild.firstChild;
       
  4098 
       
  4099 		this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
       
  4100 		this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
       
  4101 
       
  4102 		innerDiv.style.overflow = 'hidden', innerDiv.style.position = 'relative';
       
  4103 		this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
       
  4104 
       
  4105 		body.style.marginTop = '1px';
       
  4106 		this.doesNotIncludeMarginInBodyOffset = (body.offsetTop === 0);
       
  4107 		body.style.marginTop = bodyMarginTop;
       
  4108 
       
  4109 		body.removeChild(container);
       
  4110 		this.initialized = true;
       
  4111 	},
       
  4112 
       
  4113 	bodyOffset: function(body) {
       
  4114 		jQuery.offset.initialized || jQuery.offset.initialize();
       
  4115 		var top = body.offsetTop, left = body.offsetLeft;
       
  4116 		if ( jQuery.offset.doesNotIncludeMarginInBodyOffset )
       
  4117 			top  += parseInt( jQuery.curCSS(body, 'marginTop',  true), 10 ) || 0,
       
  4118 			left += parseInt( jQuery.curCSS(body, 'marginLeft', true), 10 ) || 0;
       
  4119 		return { top: top, left: left };
       
  4120 	}
       
  4121 };
       
  4122 
       
  4123 
       
  4124 jQuery.fn.extend({
       
  4125 	position: function() {
       
  4126 		var left = 0, top = 0, results;
       
  4127 
       
  4128 		if ( this[0] ) {
       
  4129 			// Get *real* offsetParent
       
  4130 			var offsetParent = this.offsetParent(),
       
  4131 
       
  4132 			// Get correct offsets
       
  4133 			offset       = this.offset(),
       
  4134 			parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
       
  4135 
       
  4136 			// Subtract element margins
       
  4137 			// note: when an element has margin: auto the offsetLeft and marginLeft 
       
  4138 			// are the same in Safari causing offset.left to incorrectly be 0
       
  4139 			offset.top  -= num( this, 'marginTop'  );
       
  4140 			offset.left -= num( this, 'marginLeft' );
       
  4141 
       
  4142 			// Add offsetParent borders
       
  4143 			parentOffset.top  += num( offsetParent, 'borderTopWidth'  );
       
  4144 			parentOffset.left += num( offsetParent, 'borderLeftWidth' );
       
  4145 
       
  4146 			// Subtract the two offsets
       
  4147 			results = {
       
  4148 				top:  offset.top  - parentOffset.top,
       
  4149 				left: offset.left - parentOffset.left
       
  4150 			};
       
  4151 		}
       
  4152 
       
  4153 		return results;
       
  4154 	},
       
  4155 
       
  4156 	offsetParent: function() {
       
  4157 		var offsetParent = this[0].offsetParent || document.body;
       
  4158 		while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
       
  4159 			offsetParent = offsetParent.offsetParent;
       
  4160 		return jQuery(offsetParent);
       
  4161 	}
       
  4162 });
       
  4163 
       
  4164 
       
  4165 // Create scrollLeft and scrollTop methods
       
  4166 jQuery.each( ['Left', 'Top'], function(i, name) {
       
  4167 	var method = 'scroll' + name;
       
  4168 	
       
  4169 	jQuery.fn[ method ] = function(val) {
       
  4170 		if (!this[0]) return null;
       
  4171 
       
  4172 		return val !== undefined ?
       
  4173 
       
  4174 			// Set the scroll offset
       
  4175 			this.each(function() {
       
  4176 				this == window || this == document ?
       
  4177 					window.scrollTo(
       
  4178 						!i ? val : jQuery(window).scrollLeft(),
       
  4179 						 i ? val : jQuery(window).scrollTop()
       
  4180 					) :
       
  4181 					this[ method ] = val;
       
  4182 			}) :
       
  4183 
       
  4184 			// Return the scroll offset
       
  4185 			this[0] == window || this[0] == document ?
       
  4186 				self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
       
  4187 					jQuery.boxModel && document.documentElement[ method ] ||
       
  4188 					document.body[ method ] :
       
  4189 				this[0][ method ];
       
  4190 	};
       
  4191 });
       
  4192 // Create innerHeight, innerWidth, outerHeight and outerWidth methods
       
  4193 jQuery.each([ "Height", "Width" ], function(i, name){
       
  4194 
       
  4195 	var tl = i ? "Left"  : "Top",  // top or left
       
  4196 		br = i ? "Right" : "Bottom"; // bottom or right
       
  4197 
       
  4198 	// innerHeight and innerWidth
       
  4199 	jQuery.fn["inner" + name] = function(){
       
  4200 		return this[ name.toLowerCase() ]() +
       
  4201 			num(this, "padding" + tl) +
       
  4202 			num(this, "padding" + br);
       
  4203 	};
       
  4204 
       
  4205 	// outerHeight and outerWidth
       
  4206 	jQuery.fn["outer" + name] = function(margin) {
       
  4207 		return this["inner" + name]() +
       
  4208 			num(this, "border" + tl + "Width") +
       
  4209 			num(this, "border" + br + "Width") +
       
  4210 			(margin ?
       
  4211 				num(this, "margin" + tl) + num(this, "margin" + br) : 0);
       
  4212 	};
       
  4213 	
       
  4214 	var type = name.toLowerCase();
       
  4215 
       
  4216 	jQuery.fn[ type ] = function( size ) {
       
  4217 		// Get window width or height
       
  4218 		return this[0] == window ?
       
  4219 			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
       
  4220 			document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] ||
       
  4221 			document.body[ "client" + name ] :
       
  4222 
       
  4223 			// Get document width or height
       
  4224 			this[0] == document ?
       
  4225 				// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
       
  4226 				Math.max(
       
  4227 					document.documentElement["client" + name],
       
  4228 					document.body["scroll" + name], document.documentElement["scroll" + name],
       
  4229 					document.body["offset" + name], document.documentElement["offset" + name]
       
  4230 				) :
       
  4231 
       
  4232 				// Get or set width or height on the element
       
  4233 				size === undefined ?
       
  4234 					// Get width or height on the element
       
  4235 					(this.length ? jQuery.css( this[0], type ) : null) :
       
  4236 
       
  4237 					// Set the width or height on the element (default to pixels if value is unitless)
       
  4238 					this.css( type, typeof size === "string" ? size : size + "px" );
       
  4239 	};
       
  4240 
       
  4241 });})();