🔀 Merge branch “release-80”
[Sone.git] / src / main / resources / static / javascript / jquery-1.4.2.js
1 /*!
2  * jQuery JavaScript Library v1.4.2
3  * http://jquery.com/
4  *
5  * Copyright 2010, John Resig
6  * Dual licensed under the MIT or GPL Version 2 licenses.
7  * http://jquery.org/license
8  *
9  * Includes Sizzle.js
10  * http://sizzlejs.com/
11  * Copyright 2010, The Dojo Foundation
12  * Released under the MIT, BSD, and GPL Licenses.
13  *
14  * Date: Sat Feb 13 22:33:48 2010 -0500
15  */
16 (function( window, undefined ) {
17
18 // Define a local copy of jQuery
19 var jQuery = function( selector, context ) {
20                 // The jQuery object is actually just the init constructor 'enhanced'
21                 return new jQuery.fn.init( selector, context );
22         },
23
24         // Map over jQuery in case of overwrite
25         _jQuery = window.jQuery,
26
27         // Map over the $ in case of overwrite
28         _$ = window.$,
29
30         // Use the correct document accordingly with window argument (sandbox)
31         document = window.document,
32
33         // A central reference to the root jQuery(document)
34         rootjQuery,
35
36         // A simple way to check for HTML strings or ID strings
37         // (both of which we optimize for)
38         quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,
39
40         // Is it a simple selector
41         isSimple = /^.[^:#\[\.,]*$/,
42
43         // Check if a string has a non-whitespace character in it
44         rnotwhite = /\S/,
45
46         // Used for trimming whitespace
47         rtrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g,
48
49         // Match a standalone tag
50         rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
51
52         // Keep a UserAgent string for use with jQuery.browser
53         userAgent = navigator.userAgent,
54
55         // For matching the engine and version of the browser
56         browserMatch,
57         
58         // Has the ready events already been bound?
59         readyBound = false,
60         
61         // The functions to execute on DOM ready
62         readyList = [],
63
64         // The ready event handler
65         DOMContentLoaded,
66
67         // Save a reference to some core methods
68         toString = Object.prototype.toString,
69         hasOwnProperty = Object.prototype.hasOwnProperty,
70         push = Array.prototype.push,
71         slice = Array.prototype.slice,
72         indexOf = Array.prototype.indexOf;
73
74 jQuery.fn = jQuery.prototype = {
75         init: function( selector, context ) {
76                 var match, elem, ret, doc;
77
78                 // Handle $(""), $(null), or $(undefined)
79                 if ( !selector ) {
80                         return this;
81                 }
82
83                 // Handle $(DOMElement)
84                 if ( selector.nodeType ) {
85                         this.context = this[0] = selector;
86                         this.length = 1;
87                         return this;
88                 }
89                 
90                 // The body element only exists once, optimize finding it
91                 if ( selector === "body" && !context ) {
92                         this.context = document;
93                         this[0] = document.body;
94                         this.selector = "body";
95                         this.length = 1;
96                         return this;
97                 }
98
99                 // Handle HTML strings
100                 if ( typeof selector === "string" ) {
101                         // Are we dealing with HTML string or an ID?
102                         match = quickExpr.exec( selector );
103
104                         // Verify a match, and that no context was specified for #id
105                         if ( match && (match[1] || !context) ) {
106
107                                 // HANDLE: $(html) -> $(array)
108                                 if ( match[1] ) {
109                                         doc = (context ? context.ownerDocument || context : document);
110
111                                         // If a single string is passed in and it's a single tag
112                                         // just do a createElement and skip the rest
113                                         ret = rsingleTag.exec( selector );
114
115                                         if ( ret ) {
116                                                 if ( jQuery.isPlainObject( context ) ) {
117                                                         selector = [ document.createElement( ret[1] ) ];
118                                                         jQuery.fn.attr.call( selector, context, true );
119
120                                                 } else {
121                                                         selector = [ doc.createElement( ret[1] ) ];
122                                                 }
123
124                                         } else {
125                                                 ret = buildFragment( [ match[1] ], [ doc ] );
126                                                 selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
127                                         }
128                                         
129                                         return jQuery.merge( this, selector );
130                                         
131                                 // HANDLE: $("#id")
132                                 } else {
133                                         elem = document.getElementById( match[2] );
134
135                                         if ( elem ) {
136                                                 // Handle the case where IE and Opera return items
137                                                 // by name instead of ID
138                                                 if ( elem.id !== match[2] ) {
139                                                         return rootjQuery.find( selector );
140                                                 }
141
142                                                 // Otherwise, we inject the element directly into the jQuery object
143                                                 this.length = 1;
144                                                 this[0] = elem;
145                                         }
146
147                                         this.context = document;
148                                         this.selector = selector;
149                                         return this;
150                                 }
151
152                         // HANDLE: $("TAG")
153                         } else if ( !context && /^\w+$/.test( selector ) ) {
154                                 this.selector = selector;
155                                 this.context = document;
156                                 selector = document.getElementsByTagName( selector );
157                                 return jQuery.merge( this, selector );
158
159                         // HANDLE: $(expr, $(...))
160                         } else if ( !context || context.jquery ) {
161                                 return (context || rootjQuery).find( selector );
162
163                         // HANDLE: $(expr, context)
164                         // (which is just equivalent to: $(context).find(expr)
165                         } else {
166                                 return jQuery( context ).find( selector );
167                         }
168
169                 // HANDLE: $(function)
170                 // Shortcut for document ready
171                 } else if ( jQuery.isFunction( selector ) ) {
172                         return rootjQuery.ready( selector );
173                 }
174
175                 if (selector.selector !== undefined) {
176                         this.selector = selector.selector;
177                         this.context = selector.context;
178                 }
179
180                 return jQuery.makeArray( selector, this );
181         },
182
183         // Start with an empty selector
184         selector: "",
185
186         // The current version of jQuery being used
187         jquery: "1.4.2",
188
189         // The default length of a jQuery object is 0
190         length: 0,
191
192         // The number of elements contained in the matched element set
193         size: function() {
194                 return this.length;
195         },
196
197         toArray: function() {
198                 return slice.call( this, 0 );
199         },
200
201         // Get the Nth element in the matched element set OR
202         // Get the whole matched element set as a clean array
203         get: function( num ) {
204                 return num == null ?
205
206                         // Return a 'clean' array
207                         this.toArray() :
208
209                         // Return just the object
210                         ( num < 0 ? this.slice(num)[ 0 ] : this[ num ] );
211         },
212
213         // Take an array of elements and push it onto the stack
214         // (returning the new matched element set)
215         pushStack: function( elems, name, selector ) {
216                 // Build a new jQuery matched element set
217                 var ret = jQuery();
218
219                 if ( jQuery.isArray( elems ) ) {
220                         push.apply( ret, elems );
221                 
222                 } else {
223                         jQuery.merge( ret, elems );
224                 }
225
226                 // Add the old object onto the stack (as a reference)
227                 ret.prevObject = this;
228
229                 ret.context = this.context;
230
231                 if ( name === "find" ) {
232                         ret.selector = this.selector + (this.selector ? " " : "") + selector;
233                 } else if ( name ) {
234                         ret.selector = this.selector + "." + name + "(" + selector + ")";
235                 }
236
237                 // Return the newly-formed element set
238                 return ret;
239         },
240
241         // Execute a callback for every element in the matched set.
242         // (You can seed the arguments with an array of args, but this is
243         // only used internally.)
244         each: function( callback, args ) {
245                 return jQuery.each( this, callback, args );
246         },
247         
248         ready: function( fn ) {
249                 // Attach the listeners
250                 jQuery.bindReady();
251
252                 // If the DOM is already ready
253                 if ( jQuery.isReady ) {
254                         // Execute the function immediately
255                         fn.call( document, jQuery );
256
257                 // Otherwise, remember the function for later
258                 } else if ( readyList ) {
259                         // Add the function to the wait list
260                         readyList.push( fn );
261                 }
262
263                 return this;
264         },
265         
266         eq: function( i ) {
267                 return i === -1 ?
268                         this.slice( i ) :
269                         this.slice( i, +i + 1 );
270         },
271
272         first: function() {
273                 return this.eq( 0 );
274         },
275
276         last: function() {
277                 return this.eq( -1 );
278         },
279
280         slice: function() {
281                 return this.pushStack( slice.apply( this, arguments ),
282                         "slice", slice.call(arguments).join(",") );
283         },
284
285         map: function( callback ) {
286                 return this.pushStack( jQuery.map(this, function( elem, i ) {
287                         return callback.call( elem, i, elem );
288                 }));
289         },
290         
291         end: function() {
292                 return this.prevObject || jQuery(null);
293         },
294
295         // For internal use only.
296         // Behaves like an Array's method, not like a jQuery method.
297         push: push,
298         sort: [].sort,
299         splice: [].splice
300 };
301
302 // Give the init function the jQuery prototype for later instantiation
303 jQuery.fn.init.prototype = jQuery.fn;
304
305 jQuery.extend = jQuery.fn.extend = function() {
306         // copy reference to target object
307         var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy;
308
309         // Handle a deep copy situation
310         if ( typeof target === "boolean" ) {
311                 deep = target;
312                 target = arguments[1] || {};
313                 // skip the boolean and the target
314                 i = 2;
315         }
316
317         // Handle case when target is a string or something (possible in deep copy)
318         if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
319                 target = {};
320         }
321
322         // extend jQuery itself if only one argument is passed
323         if ( length === i ) {
324                 target = this;
325                 --i;
326         }
327
328         for ( ; i < length; i++ ) {
329                 // Only deal with non-null/undefined values
330                 if ( (options = arguments[ i ]) != null ) {
331                         // Extend the base object
332                         for ( name in options ) {
333                                 src = target[ name ];
334                                 copy = options[ name ];
335
336                                 // Prevent never-ending loop
337                                 if ( target === copy ) {
338                                         continue;
339                                 }
340
341                                 // Recurse if we're merging object literal values or arrays
342                                 if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) {
343                                         var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src
344                                                 : jQuery.isArray(copy) ? [] : {};
345
346                                         // Never move original objects, clone them
347                                         target[ name ] = jQuery.extend( deep, clone, copy );
348
349                                 // Don't bring in undefined values
350                                 } else if ( copy !== undefined ) {
351                                         target[ name ] = copy;
352                                 }
353                         }
354                 }
355         }
356
357         // Return the modified object
358         return target;
359 };
360
361 jQuery.extend({
362         noConflict: function( deep ) {
363                 window.$ = _$;
364
365                 if ( deep ) {
366                         window.jQuery = _jQuery;
367                 }
368
369                 return jQuery;
370         },
371         
372         // Is the DOM ready to be used? Set to true once it occurs.
373         isReady: false,
374         
375         // Handle when the DOM is ready
376         ready: function() {
377                 // Make sure that the DOM is not already loaded
378                 if ( !jQuery.isReady ) {
379                         // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
380                         if ( !document.body ) {
381                                 return setTimeout( jQuery.ready, 13 );
382                         }
383
384                         // Remember that the DOM is ready
385                         jQuery.isReady = true;
386
387                         // If there are functions bound, to execute
388                         if ( readyList ) {
389                                 // Execute all of them
390                                 var fn, i = 0;
391                                 while ( (fn = readyList[ i++ ]) ) {
392                                         fn.call( document, jQuery );
393                                 }
394
395                                 // Reset the list of functions
396                                 readyList = null;
397                         }
398
399                         // Trigger any bound ready events
400                         if ( jQuery.fn.triggerHandler ) {
401                                 jQuery( document ).triggerHandler( "ready" );
402                         }
403                 }
404         },
405         
406         bindReady: function() {
407                 if ( readyBound ) {
408                         return;
409                 }
410
411                 readyBound = true;
412
413                 // Catch cases where $(document).ready() is called after the
414                 // browser event has already occurred.
415                 if ( document.readyState === "complete" ) {
416                         return jQuery.ready();
417                 }
418
419                 // Mozilla, Opera and webkit nightlies currently support this event
420                 if ( document.addEventListener ) {
421                         // Use the handy event callback
422                         document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
423                         
424                         // A fallback to window.onload, that will always work
425                         window.addEventListener( "load", jQuery.ready, false );
426
427                 // If IE event model is used
428                 } else if ( document.attachEvent ) {
429                         // ensure firing before onload,
430                         // maybe late but safe also for iframes
431                         document.attachEvent("onreadystatechange", DOMContentLoaded);
432                         
433                         // A fallback to window.onload, that will always work
434                         window.attachEvent( "onload", jQuery.ready );
435
436                         // If IE and not a frame
437                         // continually check to see if the document is ready
438                         var toplevel = false;
439
440                         try {
441                                 toplevel = window.frameElement == null;
442                         } catch(e) {}
443
444                         if ( document.documentElement.doScroll && toplevel ) {
445                                 doScrollCheck();
446                         }
447                 }
448         },
449
450         // See test/unit/core.js for details concerning isFunction.
451         // Since version 1.3, DOM methods and functions like alert
452         // aren't supported. They return false on IE (#2968).
453         isFunction: function( obj ) {
454                 return toString.call(obj) === "[object Function]";
455         },
456
457         isArray: function( obj ) {
458                 return toString.call(obj) === "[object Array]";
459         },
460
461         isPlainObject: function( obj ) {
462                 // Must be an Object.
463                 // Because of IE, we also have to check the presence of the constructor property.
464                 // Make sure that DOM nodes and window objects don't pass through, as well
465                 if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) {
466                         return false;
467                 }
468                 
469                 // Not own constructor property must be Object
470                 if ( obj.constructor
471                         && !hasOwnProperty.call(obj, "constructor")
472                         && !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) {
473                         return false;
474                 }
475                 
476                 // Own properties are enumerated firstly, so to speed up,
477                 // if last one is own, then all properties are own.
478         
479                 var key;
480                 for ( key in obj ) {}
481                 
482                 return key === undefined || hasOwnProperty.call( obj, key );
483         },
484
485         isEmptyObject: function( obj ) {
486                 for ( var name in obj ) {
487                         return false;
488                 }
489                 return true;
490         },
491         
492         error: function( msg ) {
493                 throw msg;
494         },
495         
496         parseJSON: function( data ) {
497                 if ( typeof data !== "string" || !data ) {
498                         return null;
499                 }
500
501                 // Make sure leading/trailing whitespace is removed (IE can't handle it)
502                 data = jQuery.trim( data );
503                 
504                 // Make sure the incoming data is actual JSON
505                 // Logic borrowed from http://json.org/json2.js
506                 if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
507                         .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
508                         .replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) {
509
510                         // Try to use the native JSON parser first
511                         return window.JSON && window.JSON.parse ?
512                                 window.JSON.parse( data ) :
513                                 (new Function("return " + data))();
514
515                 } else {
516                         jQuery.error( "Invalid JSON: " + data );
517                 }
518         },
519
520         noop: function() {},
521
522         // Evalulates a script in a global context
523         globalEval: function( data ) {
524                 if ( data && rnotwhite.test(data) ) {
525                         // Inspired by code by Andrea Giammarchi
526                         // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
527                         var head = document.getElementsByTagName("head")[0] || document.documentElement,
528                                 script = document.createElement("script");
529
530                         script.type = "text/javascript";
531
532                         if ( jQuery.support.scriptEval ) {
533                                 script.appendChild( document.createTextNode( data ) );
534                         } else {
535                                 script.text = data;
536                         }
537
538                         // Use insertBefore instead of appendChild to circumvent an IE6 bug.
539                         // This arises when a base node is used (#2709).
540                         head.insertBefore( script, head.firstChild );
541                         head.removeChild( script );
542                 }
543         },
544
545         nodeName: function( elem, name ) {
546                 return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
547         },
548
549         // args is for internal usage only
550         each: function( object, callback, args ) {
551                 var name, i = 0,
552                         length = object.length,
553                         isObj = length === undefined || jQuery.isFunction(object);
554
555                 if ( args ) {
556                         if ( isObj ) {
557                                 for ( name in object ) {
558                                         if ( callback.apply( object[ name ], args ) === false ) {
559                                                 break;
560                                         }
561                                 }
562                         } else {
563                                 for ( ; i < length; ) {
564                                         if ( callback.apply( object[ i++ ], args ) === false ) {
565                                                 break;
566                                         }
567                                 }
568                         }
569
570                 // A special, fast, case for the most common use of each
571                 } else {
572                         if ( isObj ) {
573                                 for ( name in object ) {
574                                         if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
575                                                 break;
576                                         }
577                                 }
578                         } else {
579                                 for ( var value = object[0];
580                                         i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
581                         }
582                 }
583
584                 return object;
585         },
586
587         trim: function( text ) {
588                 return (text || "").replace( rtrim, "" );
589         },
590
591         // results is for internal usage only
592         makeArray: function( array, results ) {
593                 var ret = results || [];
594
595                 if ( array != null ) {
596                         // The window, strings (and functions) also have 'length'
597                         // The extra typeof function check is to prevent crashes
598                         // in Safari 2 (See: #3039)
599                         if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) {
600                                 push.call( ret, array );
601                         } else {
602                                 jQuery.merge( ret, array );
603                         }
604                 }
605
606                 return ret;
607         },
608
609         inArray: function( elem, array ) {
610                 if ( array.indexOf ) {
611                         return array.indexOf( elem );
612                 }
613
614                 for ( var i = 0, length = array.length; i < length; i++ ) {
615                         if ( array[ i ] === elem ) {
616                                 return i;
617                         }
618                 }
619
620                 return -1;
621         },
622
623         merge: function( first, second ) {
624                 var i = first.length, j = 0;
625
626                 if ( typeof second.length === "number" ) {
627                         for ( var l = second.length; j < l; j++ ) {
628                                 first[ i++ ] = second[ j ];
629                         }
630                 
631                 } else {
632                         while ( second[j] !== undefined ) {
633                                 first[ i++ ] = second[ j++ ];
634                         }
635                 }
636
637                 first.length = i;
638
639                 return first;
640         },
641
642         grep: function( elems, callback, inv ) {
643                 var ret = [];
644
645                 // Go through the array, only saving the items
646                 // that pass the validator function
647                 for ( var i = 0, length = elems.length; i < length; i++ ) {
648                         if ( !inv !== !callback( elems[ i ], i ) ) {
649                                 ret.push( elems[ i ] );
650                         }
651                 }
652
653                 return ret;
654         },
655
656         // arg is for internal usage only
657         map: function( elems, callback, arg ) {
658                 var ret = [], value;
659
660                 // Go through the array, translating each of the items to their
661                 // new value (or values).
662                 for ( var i = 0, length = elems.length; i < length; i++ ) {
663                         value = callback( elems[ i ], i, arg );
664
665                         if ( value != null ) {
666                                 ret[ ret.length ] = value;
667                         }
668                 }
669
670                 return ret.concat.apply( [], ret );
671         },
672
673         // A global GUID counter for objects
674         guid: 1,
675
676         proxy: function( fn, proxy, thisObject ) {
677                 if ( arguments.length === 2 ) {
678                         if ( typeof proxy === "string" ) {
679                                 thisObject = fn;
680                                 fn = thisObject[ proxy ];
681                                 proxy = undefined;
682
683                         } else if ( proxy && !jQuery.isFunction( proxy ) ) {
684                                 thisObject = proxy;
685                                 proxy = undefined;
686                         }
687                 }
688
689                 if ( !proxy && fn ) {
690                         proxy = function() {
691                                 return fn.apply( thisObject || this, arguments );
692                         };
693                 }
694
695                 // Set the guid of unique handler to the same of original handler, so it can be removed
696                 if ( fn ) {
697                         proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
698                 }
699
700                 // So proxy can be declared as an argument
701                 return proxy;
702         },
703
704         // Use of jQuery.browser is frowned upon.
705         // More details: http://docs.jquery.com/Utilities/jQuery.browser
706         uaMatch: function( ua ) {
707                 ua = ua.toLowerCase();
708
709                 var match = /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
710                         /(opera)(?:.*version)?[ \/]([\w.]+)/.exec( ua ) ||
711                         /(msie) ([\w.]+)/.exec( ua ) ||
712                         !/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec( ua ) ||
713                         [];
714
715                 return { browser: match[1] || "", version: match[2] || "0" };
716         },
717
718         browser: {}
719 });
720
721 browserMatch = jQuery.uaMatch( userAgent );
722 if ( browserMatch.browser ) {
723         jQuery.browser[ browserMatch.browser ] = true;
724         jQuery.browser.version = browserMatch.version;
725 }
726
727 // Deprecated, use jQuery.browser.webkit instead
728 if ( jQuery.browser.webkit ) {
729         jQuery.browser.safari = true;
730 }
731
732 if ( indexOf ) {
733         jQuery.inArray = function( elem, array ) {
734                 return indexOf.call( array, elem );
735         };
736 }
737
738 // All jQuery objects should point back to these
739 rootjQuery = jQuery(document);
740
741 // Cleanup functions for the document ready method
742 if ( document.addEventListener ) {
743         DOMContentLoaded = function() {
744                 document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
745                 jQuery.ready();
746         };
747
748 } else if ( document.attachEvent ) {
749         DOMContentLoaded = function() {
750                 // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
751                 if ( document.readyState === "complete" ) {
752                         document.detachEvent( "onreadystatechange", DOMContentLoaded );
753                         jQuery.ready();
754                 }
755         };
756 }
757
758 // The DOM ready check for Internet Explorer
759 function doScrollCheck() {
760         if ( jQuery.isReady ) {
761                 return;
762         }
763
764         try {
765                 // If IE is used, use the trick by Diego Perini
766                 // http://javascript.nwbox.com/IEContentLoaded/
767                 document.documentElement.doScroll("left");
768         } catch( error ) {
769                 setTimeout( doScrollCheck, 1 );
770                 return;
771         }
772
773         // and execute any waiting functions
774         jQuery.ready();
775 }
776
777 function evalScript( i, elem ) {
778         if ( elem.src ) {
779                 jQuery.ajax({
780                         url: elem.src,
781                         async: false,
782                         dataType: "script"
783                 });
784         } else {
785                 jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
786         }
787
788         if ( elem.parentNode ) {
789                 elem.parentNode.removeChild( elem );
790         }
791 }
792
793 // Mutifunctional method to get and set values to a collection
794 // The value/s can be optionally by executed if its a function
795 function access( elems, key, value, exec, fn, pass ) {
796         var length = elems.length;
797         
798         // Setting many attributes
799         if ( typeof key === "object" ) {
800                 for ( var k in key ) {
801                         access( elems, k, key[k], exec, fn, value );
802                 }
803                 return elems;
804         }
805         
806         // Setting one attribute
807         if ( value !== undefined ) {
808                 // Optionally, function values get executed if exec is true
809                 exec = !pass && exec && jQuery.isFunction(value);
810                 
811                 for ( var i = 0; i < length; i++ ) {
812                         fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
813                 }
814                 
815                 return elems;
816         }
817         
818         // Getting an attribute
819         return length ? fn( elems[0], key ) : undefined;
820 }
821
822 function now() {
823         return (new Date).getTime();
824 }
825 (function() {
826
827         jQuery.support = {};
828
829         var root = document.documentElement,
830                 script = document.createElement("script"),
831                 div = document.createElement("div"),
832                 id = "script" + now();
833
834         div.style.display = "none";
835         div.innerHTML = "   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
836
837         var all = div.getElementsByTagName("*"),
838                 a = div.getElementsByTagName("a")[0];
839
840         // Can't get basic test support
841         if ( !all || !all.length || !a ) {
842                 return;
843         }
844
845         jQuery.support = {
846                 // IE strips leading whitespace when .innerHTML is used
847                 leadingWhitespace: div.firstChild.nodeType === 3,
848
849                 // Make sure that tbody elements aren't automatically inserted
850                 // IE will insert them into empty tables
851                 tbody: !div.getElementsByTagName("tbody").length,
852
853                 // Make sure that link elements get serialized correctly by innerHTML
854                 // This requires a wrapper element in IE
855                 htmlSerialize: !!div.getElementsByTagName("link").length,
856
857                 // Get the style information from getAttribute
858                 // (IE uses .cssText insted)
859                 style: /red/.test( a.getAttribute("style") ),
860
861                 // Make sure that URLs aren't manipulated
862                 // (IE normalizes it by default)
863                 hrefNormalized: a.getAttribute("href") === "/a",
864
865                 // Make sure that element opacity exists
866                 // (IE uses filter instead)
867                 // Use a regex to work around a WebKit issue. See #5145
868                 opacity: /^0.55$/.test( a.style.opacity ),
869
870                 // Verify style float existence
871                 // (IE uses styleFloat instead of cssFloat)
872                 cssFloat: !!a.style.cssFloat,
873
874                 // Make sure that if no value is specified for a checkbox
875                 // that it defaults to "on".
876                 // (WebKit defaults to "" instead)
877                 checkOn: div.getElementsByTagName("input")[0].value === "on",
878
879                 // Make sure that a selected-by-default option has a working selected property.
880                 // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
881                 optSelected: document.createElement("select").appendChild( document.createElement("option") ).selected,
882
883                 parentNode: div.removeChild( div.appendChild( document.createElement("div") ) ).parentNode === null,
884
885                 // Will be defined later
886                 deleteExpando: true,
887                 checkClone: false,
888                 scriptEval: false,
889                 noCloneEvent: true,
890                 boxModel: null
891         };
892
893         script.type = "text/javascript";
894         try {
895                 script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
896         } catch(e) {}
897
898         root.insertBefore( script, root.firstChild );
899
900         // Make sure that the execution of code works by injecting a script
901         // tag with appendChild/createTextNode
902         // (IE doesn't support this, fails, and uses .text instead)
903         if ( window[ id ] ) {
904                 jQuery.support.scriptEval = true;
905                 delete window[ id ];
906         }
907
908         // Test to see if it's possible to delete an expando from an element
909         // Fails in Internet Explorer
910         try {
911                 delete script.test;
912         
913         } catch(e) {
914                 jQuery.support.deleteExpando = false;
915         }
916
917         root.removeChild( script );
918
919         if ( div.attachEvent && div.fireEvent ) {
920                 div.attachEvent("onclick", function click() {
921                         // Cloning a node shouldn't copy over any
922                         // bound event handlers (IE does this)
923                         jQuery.support.noCloneEvent = false;
924                         div.detachEvent("onclick", click);
925                 });
926                 div.cloneNode(true).fireEvent("onclick");
927         }
928
929         div = document.createElement("div");
930         div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
931
932         var fragment = document.createDocumentFragment();
933         fragment.appendChild( div.firstChild );
934
935         // WebKit doesn't clone checked state correctly in fragments
936         jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
937
938         // Figure out if the W3C box model works as expected
939         // document.body must exist before we can do this
940         jQuery(function() {
941                 var div = document.createElement("div");
942                 div.style.width = div.style.paddingLeft = "1px";
943
944                 document.body.appendChild( div );
945                 jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
946                 document.body.removeChild( div ).style.display = 'none';
947
948                 div = null;
949         });
950
951         // Technique from Juriy Zaytsev
952         // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
953         var eventSupported = function( eventName ) { 
954                 var el = document.createElement("div"); 
955                 eventName = "on" + eventName; 
956
957                 var isSupported = (eventName in el); 
958                 if ( !isSupported ) { 
959                         el.setAttribute(eventName, "return;"); 
960                         isSupported = typeof el[eventName] === "function"; 
961                 } 
962                 el = null; 
963
964                 return isSupported; 
965         };
966         
967         jQuery.support.submitBubbles = eventSupported("submit");
968         jQuery.support.changeBubbles = eventSupported("change");
969
970         // release memory in IE
971         root = script = div = all = a = null;
972 })();
973
974 jQuery.props = {
975         "for": "htmlFor",
976         "class": "className",
977         readonly: "readOnly",
978         maxlength: "maxLength",
979         cellspacing: "cellSpacing",
980         rowspan: "rowSpan",
981         colspan: "colSpan",
982         tabindex: "tabIndex",
983         usemap: "useMap",
984         frameborder: "frameBorder"
985 };
986 var expando = "jQuery" + now(), uuid = 0, windowData = {};
987
988 jQuery.extend({
989         cache: {},
990         
991         expando:expando,
992
993         // The following elements throw uncatchable exceptions if you
994         // attempt to add expando properties to them.
995         noData: {
996                 "embed": true,
997                 "object": true,
998                 "applet": true
999         },
1000
1001         data: function( elem, name, data ) {
1002                 if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
1003                         return;
1004                 }
1005
1006                 elem = elem == window ?
1007                         windowData :
1008                         elem;
1009
1010                 var id = elem[ expando ], cache = jQuery.cache, thisCache;
1011
1012                 if ( !id && typeof name === "string" && data === undefined ) {
1013                         return null;
1014                 }
1015
1016                 // Compute a unique ID for the element
1017                 if ( !id ) { 
1018                         id = ++uuid;
1019                 }
1020
1021                 // Avoid generating a new cache unless none exists and we
1022                 // want to manipulate it.
1023                 if ( typeof name === "object" ) {
1024                         elem[ expando ] = id;
1025                         thisCache = cache[ id ] = jQuery.extend(true, {}, name);
1026
1027                 } else if ( !cache[ id ] ) {
1028                         elem[ expando ] = id;
1029                         cache[ id ] = {};
1030                 }
1031
1032                 thisCache = cache[ id ];
1033
1034                 // Prevent overriding the named cache with undefined values
1035                 if ( data !== undefined ) {
1036                         thisCache[ name ] = data;
1037                 }
1038
1039                 return typeof name === "string" ? thisCache[ name ] : thisCache;
1040         },
1041
1042         removeData: function( elem, name ) {
1043                 if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
1044                         return;
1045                 }
1046
1047                 elem = elem == window ?
1048                         windowData :
1049                         elem;
1050
1051                 var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ];
1052
1053                 // If we want to remove a specific section of the element's data
1054                 if ( name ) {
1055                         if ( thisCache ) {
1056                                 // Remove the section of cache data
1057                                 delete thisCache[ name ];
1058
1059                                 // If we've removed all the data, remove the element's cache
1060                                 if ( jQuery.isEmptyObject(thisCache) ) {
1061                                         jQuery.removeData( elem );
1062                                 }
1063                         }
1064
1065                 // Otherwise, we want to remove all of the element's data
1066                 } else {
1067                         if ( jQuery.support.deleteExpando ) {
1068                                 delete elem[ jQuery.expando ];
1069
1070                         } else if ( elem.removeAttribute ) {
1071                                 elem.removeAttribute( jQuery.expando );
1072                         }
1073
1074                         // Completely remove the data cache
1075                         delete cache[ id ];
1076                 }
1077         }
1078 });
1079
1080 jQuery.fn.extend({
1081         data: function( key, value ) {
1082                 if ( typeof key === "undefined" && this.length ) {
1083                         return jQuery.data( this[0] );
1084
1085                 } else if ( typeof key === "object" ) {
1086                         return this.each(function() {
1087                                 jQuery.data( this, key );
1088                         });
1089                 }
1090
1091                 var parts = key.split(".");
1092                 parts[1] = parts[1] ? "." + parts[1] : "";
1093
1094                 if ( value === undefined ) {
1095                         var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1096
1097                         if ( data === undefined && this.length ) {
1098                                 data = jQuery.data( this[0], key );
1099                         }
1100                         return data === undefined && parts[1] ?
1101                                 this.data( parts[0] ) :
1102                                 data;
1103                 } else {
1104                         return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function() {
1105                                 jQuery.data( this, key, value );
1106                         });
1107                 }
1108         },
1109
1110         removeData: function( key ) {
1111                 return this.each(function() {
1112                         jQuery.removeData( this, key );
1113                 });
1114         }
1115 });
1116 jQuery.extend({
1117         queue: function( elem, type, data ) {
1118                 if ( !elem ) {
1119                         return;
1120                 }
1121
1122                 type = (type || "fx") + "queue";
1123                 var q = jQuery.data( elem, type );
1124
1125                 // Speed up dequeue by getting out quickly if this is just a lookup
1126                 if ( !data ) {
1127                         return q || [];
1128                 }
1129
1130                 if ( !q || jQuery.isArray(data) ) {
1131                         q = jQuery.data( elem, type, jQuery.makeArray(data) );
1132
1133                 } else {
1134                         q.push( data );
1135                 }
1136
1137                 return q;
1138         },
1139
1140         dequeue: function( elem, type ) {
1141                 type = type || "fx";
1142
1143                 var queue = jQuery.queue( elem, type ), fn = queue.shift();
1144
1145                 // If the fx queue is dequeued, always remove the progress sentinel
1146                 if ( fn === "inprogress" ) {
1147                         fn = queue.shift();
1148                 }
1149
1150                 if ( fn ) {
1151                         // Add a progress sentinel to prevent the fx queue from being
1152                         // automatically dequeued
1153                         if ( type === "fx" ) {
1154                                 queue.unshift("inprogress");
1155                         }
1156
1157                         fn.call(elem, function() {
1158                                 jQuery.dequeue(elem, type);
1159                         });
1160                 }
1161         }
1162 });
1163
1164 jQuery.fn.extend({
1165         queue: function( type, data ) {
1166                 if ( typeof type !== "string" ) {
1167                         data = type;
1168                         type = "fx";
1169                 }
1170
1171                 if ( data === undefined ) {
1172                         return jQuery.queue( this[0], type );
1173                 }
1174                 return this.each(function( i, elem ) {
1175                         var queue = jQuery.queue( this, type, data );
1176
1177                         if ( type === "fx" && queue[0] !== "inprogress" ) {
1178                                 jQuery.dequeue( this, type );
1179                         }
1180                 });
1181         },
1182         dequeue: function( type ) {
1183                 return this.each(function() {
1184                         jQuery.dequeue( this, type );
1185                 });
1186         },
1187
1188         // Based off of the plugin by Clint Helfers, with permission.
1189         // http://blindsignals.com/index.php/2009/07/jquery-delay/
1190         delay: function( time, type ) {
1191                 time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
1192                 type = type || "fx";
1193
1194                 return this.queue( type, function() {
1195                         var elem = this;
1196                         setTimeout(function() {
1197                                 jQuery.dequeue( elem, type );
1198                         }, time );
1199                 });
1200         },
1201
1202         clearQueue: function( type ) {
1203                 return this.queue( type || "fx", [] );
1204         }
1205 });
1206 var rclass = /[\n\t]/g,
1207         rspace = /\s+/,
1208         rreturn = /\r/g,
1209         rspecialurl = /href|src|style/,
1210         rtype = /(button|input)/i,
1211         rfocusable = /(button|input|object|select|textarea)/i,
1212         rclickable = /^(a|area)$/i,
1213         rradiocheck = /radio|checkbox/;
1214
1215 jQuery.fn.extend({
1216         attr: function( name, value ) {
1217                 return access( this, name, value, true, jQuery.attr );
1218         },
1219
1220         removeAttr: function( name, fn ) {
1221                 return this.each(function(){
1222                         jQuery.attr( this, name, "" );
1223                         if ( this.nodeType === 1 ) {
1224                                 this.removeAttribute( name );
1225                         }
1226                 });
1227         },
1228
1229         addClass: function( value ) {
1230                 if ( jQuery.isFunction(value) ) {
1231                         return this.each(function(i) {
1232                                 var self = jQuery(this);
1233                                 self.addClass( value.call(this, i, self.attr("class")) );
1234                         });
1235                 }
1236
1237                 if ( value && typeof value === "string" ) {
1238                         var classNames = (value || "").split( rspace );
1239
1240                         for ( var i = 0, l = this.length; i < l; i++ ) {
1241                                 var elem = this[i];
1242
1243                                 if ( elem.nodeType === 1 ) {
1244                                         if ( !elem.className ) {
1245                                                 elem.className = value;
1246
1247                                         } else {
1248                                                 var className = " " + elem.className + " ", setClass = elem.className;
1249                                                 for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
1250                                                         if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
1251                                                                 setClass += " " + classNames[c];
1252                                                         }
1253                                                 }
1254                                                 elem.className = jQuery.trim( setClass );
1255                                         }
1256                                 }
1257                         }
1258                 }
1259
1260                 return this;
1261         },
1262
1263         removeClass: function( value ) {
1264                 if ( jQuery.isFunction(value) ) {
1265                         return this.each(function(i) {
1266                                 var self = jQuery(this);
1267                                 self.removeClass( value.call(this, i, self.attr("class")) );
1268                         });
1269                 }
1270
1271                 if ( (value && typeof value === "string") || value === undefined ) {
1272                         var classNames = (value || "").split(rspace);
1273
1274                         for ( var i = 0, l = this.length; i < l; i++ ) {
1275                                 var elem = this[i];
1276
1277                                 if ( elem.nodeType === 1 && elem.className ) {
1278                                         if ( value ) {
1279                                                 var className = (" " + elem.className + " ").replace(rclass, " ");
1280                                                 for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
1281                                                         className = className.replace(" " + classNames[c] + " ", " ");
1282                                                 }
1283                                                 elem.className = jQuery.trim( className );
1284
1285                                         } else {
1286                                                 elem.className = "";
1287                                         }
1288                                 }
1289                         }
1290                 }
1291
1292                 return this;
1293         },
1294
1295         toggleClass: function( value, stateVal ) {
1296                 var type = typeof value, isBool = typeof stateVal === "boolean";
1297
1298                 if ( jQuery.isFunction( value ) ) {
1299                         return this.each(function(i) {
1300                                 var self = jQuery(this);
1301                                 self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
1302                         });
1303                 }
1304
1305                 return this.each(function() {
1306                         if ( type === "string" ) {
1307                                 // toggle individual class names
1308                                 var className, i = 0, self = jQuery(this),
1309                                         state = stateVal,
1310                                         classNames = value.split( rspace );
1311
1312                                 while ( (className = classNames[ i++ ]) ) {
1313                                         // check each className given, space seperated list
1314                                         state = isBool ? state : !self.hasClass( className );
1315                                         self[ state ? "addClass" : "removeClass" ]( className );
1316                                 }
1317
1318                         } else if ( type === "undefined" || type === "boolean" ) {
1319                                 if ( this.className ) {
1320                                         // store className if set
1321                                         jQuery.data( this, "__className__", this.className );
1322                                 }
1323
1324                                 // toggle whole className
1325                                 this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || "";
1326                         }
1327                 });
1328         },
1329
1330         hasClass: function( selector ) {
1331                 var className = " " + selector + " ";
1332                 for ( var i = 0, l = this.length; i < l; i++ ) {
1333                         if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
1334                                 return true;
1335                         }
1336                 }
1337
1338                 return false;
1339         },
1340
1341         val: function( value ) {
1342                 if ( value === undefined ) {
1343                         var elem = this[0];
1344
1345                         if ( elem ) {
1346                                 if ( jQuery.nodeName( elem, "option" ) ) {
1347                                         return (elem.attributes.value || {}).specified ? elem.value : elem.text;
1348                                 }
1349
1350                                 // We need to handle select boxes special
1351                                 if ( jQuery.nodeName( elem, "select" ) ) {
1352                                         var index = elem.selectedIndex,
1353                                                 values = [],
1354                                                 options = elem.options,
1355                                                 one = elem.type === "select-one";
1356
1357                                         // Nothing was selected
1358                                         if ( index < 0 ) {
1359                                                 return null;
1360                                         }
1361
1362                                         // Loop through all the selected options
1363                                         for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
1364                                                 var option = options[ i ];
1365
1366                                                 if ( option.selected ) {
1367                                                         // Get the specifc value for the option
1368                                                         value = jQuery(option).val();
1369
1370                                                         // We don't need an array for one selects
1371                                                         if ( one ) {
1372                                                                 return value;
1373                                                         }
1374
1375                                                         // Multi-Selects return an array
1376                                                         values.push( value );
1377                                                 }
1378                                         }
1379
1380                                         return values;
1381                                 }
1382
1383                                 // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
1384                                 if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
1385                                         return elem.getAttribute("value") === null ? "on" : elem.value;
1386                                 }
1387                                 
1388
1389                                 // Everything else, we just grab the value
1390                                 return (elem.value || "").replace(rreturn, "");
1391
1392                         }
1393
1394                         return undefined;
1395                 }
1396
1397                 var isFunction = jQuery.isFunction(value);
1398
1399                 return this.each(function(i) {
1400                         var self = jQuery(this), val = value;
1401
1402                         if ( this.nodeType !== 1 ) {
1403                                 return;
1404                         }
1405
1406                         if ( isFunction ) {
1407                                 val = value.call(this, i, self.val());
1408                         }
1409
1410                         // Typecast each time if the value is a Function and the appended
1411                         // value is therefore different each time.
1412                         if ( typeof val === "number" ) {
1413                                 val += "";
1414                         }
1415
1416                         if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
1417                                 this.checked = jQuery.inArray( self.val(), val ) >= 0;
1418
1419                         } else if ( jQuery.nodeName( this, "select" ) ) {
1420                                 var values = jQuery.makeArray(val);
1421
1422                                 jQuery( "option", this ).each(function() {
1423                                         this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
1424                                 });
1425
1426                                 if ( !values.length ) {
1427                                         this.selectedIndex = -1;
1428                                 }
1429
1430                         } else {
1431                                 this.value = val;
1432                         }
1433                 });
1434         }
1435 });
1436
1437 jQuery.extend({
1438         attrFn: {
1439                 val: true,
1440                 css: true,
1441                 html: true,
1442                 text: true,
1443                 data: true,
1444                 width: true,
1445                 height: true,
1446                 offset: true
1447         },
1448                 
1449         attr: function( elem, name, value, pass ) {
1450                 // don't set attributes on text and comment nodes
1451                 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
1452                         return undefined;
1453                 }
1454
1455                 if ( pass && name in jQuery.attrFn ) {
1456                         return jQuery(elem)[name](value);
1457                 }
1458
1459                 var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
1460                         // Whether we are setting (or getting)
1461                         set = value !== undefined;
1462
1463                 // Try to normalize/fix the name
1464                 name = notxml && jQuery.props[ name ] || name;
1465
1466                 // Only do all the following if this is a node (faster for style)
1467                 if ( elem.nodeType === 1 ) {
1468                         // These attributes require special treatment
1469                         var special = rspecialurl.test( name );
1470
1471                         // Safari mis-reports the default selected property of an option
1472                         // Accessing the parent's selectedIndex property fixes it
1473                         if ( name === "selected" && !jQuery.support.optSelected ) {
1474                                 var parent = elem.parentNode;
1475                                 if ( parent ) {
1476                                         parent.selectedIndex;
1477         
1478                                         // Make sure that it also works with optgroups, see #5701
1479                                         if ( parent.parentNode ) {
1480                                                 parent.parentNode.selectedIndex;
1481                                         }
1482                                 }
1483                         }
1484
1485                         // If applicable, access the attribute via the DOM 0 way
1486                         if ( name in elem && notxml && !special ) {
1487                                 if ( set ) {
1488                                         // We can't allow the type property to be changed (since it causes problems in IE)
1489                                         if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
1490                                                 jQuery.error( "type property can't be changed" );
1491                                         }
1492
1493                                         elem[ name ] = value;
1494                                 }
1495
1496                                 // browsers index elements by id/name on forms, give priority to attributes.
1497                                 if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
1498                                         return elem.getAttributeNode( name ).nodeValue;
1499                                 }
1500
1501                                 // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
1502                                 // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
1503                                 if ( name === "tabIndex" ) {
1504                                         var attributeNode = elem.getAttributeNode( "tabIndex" );
1505
1506                                         return attributeNode && attributeNode.specified ?
1507                                                 attributeNode.value :
1508                                                 rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
1509                                                         0 :
1510                                                         undefined;
1511                                 }
1512
1513                                 return elem[ name ];
1514                         }
1515
1516                         if ( !jQuery.support.style && notxml && name === "style" ) {
1517                                 if ( set ) {
1518                                         elem.style.cssText = "" + value;
1519                                 }
1520
1521                                 return elem.style.cssText;
1522                         }
1523
1524                         if ( set ) {
1525                                 // convert the value to a string (all browsers do this but IE) see #1070
1526                                 elem.setAttribute( name, "" + value );
1527                         }
1528
1529                         var attr = !jQuery.support.hrefNormalized && notxml && special ?
1530                                         // Some attributes require a special call on IE
1531                                         elem.getAttribute( name, 2 ) :
1532                                         elem.getAttribute( name );
1533
1534                         // Non-existent attributes return null, we normalize to undefined
1535                         return attr === null ? undefined : attr;
1536                 }
1537
1538                 // elem is actually elem.style ... set the style
1539                 // Using attr for specific style information is now deprecated. Use style instead.
1540                 return jQuery.style( elem, name, value );
1541         }
1542 });
1543 var rnamespaces = /\.(.*)$/,
1544         fcleanup = function( nm ) {
1545                 return nm.replace(/[^\w\s\.\|`]/g, function( ch ) {
1546                         return "\\" + ch;
1547                 });
1548         };
1549
1550 /*
1551  * A number of helper functions used for managing events.
1552  * Many of the ideas behind this code originated from
1553  * Dean Edwards' addEvent library.
1554  */
1555 jQuery.event = {
1556
1557         // Bind an event to an element
1558         // Original by Dean Edwards
1559         add: function( elem, types, handler, data ) {
1560                 if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
1561                         return;
1562                 }
1563
1564                 // For whatever reason, IE has trouble passing the window object
1565                 // around, causing it to be cloned in the process
1566                 if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) {
1567                         elem = window;
1568                 }
1569
1570                 var handleObjIn, handleObj;
1571
1572                 if ( handler.handler ) {
1573                         handleObjIn = handler;
1574                         handler = handleObjIn.handler;
1575                 }
1576
1577                 // Make sure that the function being executed has a unique ID
1578                 if ( !handler.guid ) {
1579                         handler.guid = jQuery.guid++;
1580                 }
1581
1582                 // Init the element's event structure
1583                 var elemData = jQuery.data( elem );
1584
1585                 // If no elemData is found then we must be trying to bind to one of the
1586                 // banned noData elements
1587                 if ( !elemData ) {
1588                         return;
1589                 }
1590
1591                 var events = elemData.events = elemData.events || {},
1592                         eventHandle = elemData.handle, eventHandle;
1593
1594                 if ( !eventHandle ) {
1595                         elemData.handle = eventHandle = function() {
1596                                 // Handle the second event of a trigger and when
1597                                 // an event is called after a page has unloaded
1598                                 return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
1599                                         jQuery.event.handle.apply( eventHandle.elem, arguments ) :
1600                                         undefined;
1601                         };
1602                 }
1603
1604                 // Add elem as a property of the handle function
1605                 // This is to prevent a memory leak with non-native events in IE.
1606                 eventHandle.elem = elem;
1607
1608                 // Handle multiple events separated by a space
1609                 // jQuery(...).bind("mouseover mouseout", fn);
1610                 types = types.split(" ");
1611
1612                 var type, i = 0, namespaces;
1613
1614                 while ( (type = types[ i++ ]) ) {
1615                         handleObj = handleObjIn ?
1616                                 jQuery.extend({}, handleObjIn) :
1617                                 { handler: handler, data: data };
1618
1619                         // Namespaced event handlers
1620                         if ( type.indexOf(".") > -1 ) {
1621                                 namespaces = type.split(".");
1622                                 type = namespaces.shift();
1623                                 handleObj.namespace = namespaces.slice(0).sort().join(".");
1624
1625                         } else {
1626                                 namespaces = [];
1627                                 handleObj.namespace = "";
1628                         }
1629
1630                         handleObj.type = type;
1631                         handleObj.guid = handler.guid;
1632
1633                         // Get the current list of functions bound to this event
1634                         var handlers = events[ type ],
1635                                 special = jQuery.event.special[ type ] || {};
1636
1637                         // Init the event handler queue
1638                         if ( !handlers ) {
1639                                 handlers = events[ type ] = [];
1640
1641                                 // Check for a special event handler
1642                                 // Only use addEventListener/attachEvent if the special
1643                                 // events handler returns false
1644                                 if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
1645                                         // Bind the global event handler to the element
1646                                         if ( elem.addEventListener ) {
1647                                                 elem.addEventListener( type, eventHandle, false );
1648
1649                                         } else if ( elem.attachEvent ) {
1650                                                 elem.attachEvent( "on" + type, eventHandle );
1651                                         }
1652                                 }
1653                         }
1654                         
1655                         if ( special.add ) { 
1656                                 special.add.call( elem, handleObj ); 
1657
1658                                 if ( !handleObj.handler.guid ) {
1659                                         handleObj.handler.guid = handler.guid;
1660                                 }
1661                         }
1662
1663                         // Add the function to the element's handler list
1664                         handlers.push( handleObj );
1665
1666                         // Keep track of which events have been used, for global triggering
1667                         jQuery.event.global[ type ] = true;
1668                 }
1669
1670                 // Nullify elem to prevent memory leaks in IE
1671                 elem = null;
1672         },
1673
1674         global: {},
1675
1676         // Detach an event or set of events from an element
1677         remove: function( elem, types, handler, pos ) {
1678                 // don't do events on text and comment nodes
1679                 if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
1680                         return;
1681                 }
1682
1683                 var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
1684                         elemData = jQuery.data( elem ),
1685                         events = elemData && elemData.events;
1686
1687                 if ( !elemData || !events ) {
1688                         return;
1689                 }
1690
1691                 // types is actually an event object here
1692                 if ( types && types.type ) {
1693                         handler = types.handler;
1694                         types = types.type;
1695                 }
1696
1697                 // Unbind all events for the element
1698                 if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
1699                         types = types || "";
1700
1701                         for ( type in events ) {
1702                                 jQuery.event.remove( elem, type + types );
1703                         }
1704
1705                         return;
1706                 }
1707
1708                 // Handle multiple events separated by a space
1709                 // jQuery(...).unbind("mouseover mouseout", fn);
1710                 types = types.split(" ");
1711
1712                 while ( (type = types[ i++ ]) ) {
1713                         origType = type;
1714                         handleObj = null;
1715                         all = type.indexOf(".") < 0;
1716                         namespaces = [];
1717
1718                         if ( !all ) {
1719                                 // Namespaced event handlers
1720                                 namespaces = type.split(".");
1721                                 type = namespaces.shift();
1722
1723                                 namespace = new RegExp("(^|\\.)" + 
1724                                         jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)")
1725                         }
1726
1727                         eventType = events[ type ];
1728
1729                         if ( !eventType ) {
1730                                 continue;
1731                         }
1732
1733                         if ( !handler ) {
1734                                 for ( var j = 0; j < eventType.length; j++ ) {
1735                                         handleObj = eventType[ j ];
1736
1737                                         if ( all || namespace.test( handleObj.namespace ) ) {
1738                                                 jQuery.event.remove( elem, origType, handleObj.handler, j );
1739                                                 eventType.splice( j--, 1 );
1740                                         }
1741                                 }
1742
1743                                 continue;
1744                         }
1745
1746                         special = jQuery.event.special[ type ] || {};
1747
1748                         for ( var j = pos || 0; j < eventType.length; j++ ) {
1749                                 handleObj = eventType[ j ];
1750
1751                                 if ( handler.guid === handleObj.guid ) {
1752                                         // remove the given handler for the given type
1753                                         if ( all || namespace.test( handleObj.namespace ) ) {
1754                                                 if ( pos == null ) {
1755                                                         eventType.splice( j--, 1 );
1756                                                 }
1757
1758                                                 if ( special.remove ) {
1759                                                         special.remove.call( elem, handleObj );
1760                                                 }
1761                                         }
1762
1763                                         if ( pos != null ) {
1764                                                 break;
1765                                         }
1766                                 }
1767                         }
1768
1769                         // remove generic event handler if no more handlers exist
1770                         if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
1771                                 if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
1772                                         removeEvent( elem, type, elemData.handle );
1773                                 }
1774
1775                                 ret = null;
1776                                 delete events[ type ];
1777                         }
1778                 }
1779
1780                 // Remove the expando if it's no longer used
1781                 if ( jQuery.isEmptyObject( events ) ) {
1782                         var handle = elemData.handle;
1783                         if ( handle ) {
1784                                 handle.elem = null;
1785                         }
1786
1787                         delete elemData.events;
1788                         delete elemData.handle;
1789
1790                         if ( jQuery.isEmptyObject( elemData ) ) {
1791                                 jQuery.removeData( elem );
1792                         }
1793                 }
1794         },
1795
1796         // bubbling is internal
1797         trigger: function( event, data, elem /*, bubbling */ ) {
1798                 // Event object or event type
1799                 var type = event.type || event,
1800                         bubbling = arguments[3];
1801
1802                 if ( !bubbling ) {
1803                         event = typeof event === "object" ?
1804                                 // jQuery.Event object
1805                                 event[expando] ? event :
1806                                 // Object literal
1807                                 jQuery.extend( jQuery.Event(type), event ) :
1808                                 // Just the event type (string)
1809                                 jQuery.Event(type);
1810
1811                         if ( type.indexOf("!") >= 0 ) {
1812                                 event.type = type = type.slice(0, -1);
1813                                 event.exclusive = true;
1814                         }
1815
1816                         // Handle a global trigger
1817                         if ( !elem ) {
1818                                 // Don't bubble custom events when global (to avoid too much overhead)
1819                                 event.stopPropagation();
1820
1821                                 // Only trigger if we've ever bound an event for it
1822                                 if ( jQuery.event.global[ type ] ) {
1823                                         jQuery.each( jQuery.cache, function() {
1824                                                 if ( this.events && this.events[type] ) {
1825                                                         jQuery.event.trigger( event, data, this.handle.elem );
1826                                                 }
1827                                         });
1828                                 }
1829                         }
1830
1831                         // Handle triggering a single element
1832
1833                         // don't do events on text and comment nodes
1834                         if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
1835                                 return undefined;
1836                         }
1837
1838                         // Clean up in case it is reused
1839                         event.result = undefined;
1840                         event.target = elem;
1841
1842                         // Clone the incoming data, if any
1843                         data = jQuery.makeArray( data );
1844                         data.unshift( event );
1845                 }
1846
1847                 event.currentTarget = elem;
1848
1849                 // Trigger the event, it is assumed that "handle" is a function
1850                 var handle = jQuery.data( elem, "handle" );
1851                 if ( handle ) {
1852                         handle.apply( elem, data );
1853                 }
1854
1855                 var parent = elem.parentNode || elem.ownerDocument;
1856
1857                 // Trigger an inline bound script
1858                 try {
1859                         if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
1860                                 if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {
1861                                         event.result = false;
1862                                 }
1863                         }
1864
1865                 // prevent IE from throwing an error for some elements with some event types, see #3533
1866                 } catch (e) {}
1867
1868                 if ( !event.isPropagationStopped() && parent ) {
1869                         jQuery.event.trigger( event, data, parent, true );
1870
1871                 } else if ( !event.isDefaultPrevented() ) {
1872                         var target = event.target, old,
1873                                 isClick = jQuery.nodeName(target, "a") && type === "click",
1874                                 special = jQuery.event.special[ type ] || {};
1875
1876                         if ( (!special._default || special._default.call( elem, event ) === false) && 
1877                                 !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
1878
1879                                 try {
1880                                         if ( target[ type ] ) {
1881                                                 // Make sure that we don't accidentally re-trigger the onFOO events
1882                                                 old = target[ "on" + type ];
1883
1884                                                 if ( old ) {
1885                                                         target[ "on" + type ] = null;
1886                                                 }
1887
1888                                                 jQuery.event.triggered = true;
1889                                                 target[ type ]();
1890                                         }
1891
1892                                 // prevent IE from throwing an error for some elements with some event types, see #3533
1893                                 } catch (e) {}
1894
1895                                 if ( old ) {
1896                                         target[ "on" + type ] = old;
1897                                 }
1898
1899                                 jQuery.event.triggered = false;
1900                         }
1901                 }
1902         },
1903
1904         handle: function( event ) {
1905                 var all, handlers, namespaces, namespace, events;
1906
1907                 event = arguments[0] = jQuery.event.fix( event || window.event );
1908                 event.currentTarget = this;
1909
1910                 // Namespaced event handlers
1911                 all = event.type.indexOf(".") < 0 && !event.exclusive;
1912
1913                 if ( !all ) {
1914                         namespaces = event.type.split(".");
1915                         event.type = namespaces.shift();
1916                         namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)");
1917                 }
1918
1919                 var events = jQuery.data(this, "events"), handlers = events[ event.type ];
1920
1921                 if ( events && handlers ) {
1922                         // Clone the handlers to prevent manipulation
1923                         handlers = handlers.slice(0);
1924
1925                         for ( var j = 0, l = handlers.length; j < l; j++ ) {
1926                                 var handleObj = handlers[ j ];
1927
1928                                 // Filter the functions by class
1929                                 if ( all || namespace.test( handleObj.namespace ) ) {
1930                                         // Pass in a reference to the handler function itself
1931                                         // So that we can later remove it
1932                                         event.handler = handleObj.handler;
1933                                         event.data = handleObj.data;
1934                                         event.handleObj = handleObj;
1935         
1936                                         var ret = handleObj.handler.apply( this, arguments );
1937
1938                                         if ( ret !== undefined ) {
1939                                                 event.result = ret;
1940                                                 if ( ret === false ) {
1941                                                         event.preventDefault();
1942                                                         event.stopPropagation();
1943                                                 }
1944                                         }
1945
1946                                         if ( event.isImmediatePropagationStopped() ) {
1947                                                 break;
1948                                         }
1949                                 }
1950                         }
1951                 }
1952
1953                 return event.result;
1954         },
1955
1956         props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
1957
1958         fix: function( event ) {
1959                 if ( event[ expando ] ) {
1960                         return event;
1961                 }
1962
1963                 // store a copy of the original event object
1964                 // and "clone" to set read-only properties
1965                 var originalEvent = event;
1966                 event = jQuery.Event( originalEvent );
1967
1968                 for ( var i = this.props.length, prop; i; ) {
1969                         prop = this.props[ --i ];
1970                         event[ prop ] = originalEvent[ prop ];
1971                 }
1972
1973                 // Fix target property, if necessary
1974                 if ( !event.target ) {
1975                         event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
1976                 }
1977
1978                 // check if target is a textnode (safari)
1979                 if ( event.target.nodeType === 3 ) {
1980                         event.target = event.target.parentNode;
1981                 }
1982
1983                 // Add relatedTarget, if necessary
1984                 if ( !event.relatedTarget && event.fromElement ) {
1985                         event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
1986                 }
1987
1988                 // Calculate pageX/Y if missing and clientX/Y available
1989                 if ( event.pageX == null && event.clientX != null ) {
1990                         var doc = document.documentElement, body = document.body;
1991                         event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
1992                         event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
1993                 }
1994
1995                 // Add which for key events
1996                 if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) {
1997                         event.which = event.charCode || event.keyCode;
1998                 }
1999
2000                 // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
2001                 if ( !event.metaKey && event.ctrlKey ) {
2002                         event.metaKey = event.ctrlKey;
2003                 }
2004
2005                 // Add which for click: 1 === left; 2 === middle; 3 === right
2006                 // Note: button is not normalized, so don't use it
2007                 if ( !event.which && event.button !== undefined ) {
2008                         event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
2009                 }
2010
2011                 return event;
2012         },
2013
2014         // Deprecated, use jQuery.guid instead
2015         guid: 1E8,
2016
2017         // Deprecated, use jQuery.proxy instead
2018         proxy: jQuery.proxy,
2019
2020         special: {
2021                 ready: {
2022                         // Make sure the ready event is setup
2023                         setup: jQuery.bindReady,
2024                         teardown: jQuery.noop
2025                 },
2026
2027                 live: {
2028                         add: function( handleObj ) {
2029                                 jQuery.event.add( this, handleObj.origType, jQuery.extend({}, handleObj, {handler: liveHandler}) ); 
2030                         },
2031
2032                         remove: function( handleObj ) {
2033                                 var remove = true,
2034                                         type = handleObj.origType.replace(rnamespaces, "");
2035                                 
2036                                 jQuery.each( jQuery.data(this, "events").live || [], function() {
2037                                         if ( type === this.origType.replace(rnamespaces, "") ) {
2038                                                 remove = false;
2039                                                 return false;
2040                                         }
2041                                 });
2042
2043                                 if ( remove ) {
2044                                         jQuery.event.remove( this, handleObj.origType, liveHandler );
2045                                 }
2046                         }
2047
2048                 },
2049
2050                 beforeunload: {
2051                         setup: function( data, namespaces, eventHandle ) {
2052                                 // We only want to do this special case on windows
2053                                 if ( this.setInterval ) {
2054                                         this.onbeforeunload = eventHandle;
2055                                 }
2056
2057                                 return false;
2058                         },
2059                         teardown: function( namespaces, eventHandle ) {
2060                                 if ( this.onbeforeunload === eventHandle ) {
2061                                         this.onbeforeunload = null;
2062                                 }
2063                         }
2064                 }
2065         }
2066 };
2067
2068 var removeEvent = document.removeEventListener ?
2069         function( elem, type, handle ) {
2070                 elem.removeEventListener( type, handle, false );
2071         } : 
2072         function( elem, type, handle ) {
2073                 elem.detachEvent( "on" + type, handle );
2074         };
2075
2076 jQuery.Event = function( src ) {
2077         // Allow instantiation without the 'new' keyword
2078         if ( !this.preventDefault ) {
2079                 return new jQuery.Event( src );
2080         }
2081
2082         // Event object
2083         if ( src && src.type ) {
2084                 this.originalEvent = src;
2085                 this.type = src.type;
2086         // Event type
2087         } else {
2088                 this.type = src;
2089         }
2090
2091         // timeStamp is buggy for some events on Firefox(#3843)
2092         // So we won't rely on the native value
2093         this.timeStamp = now();
2094
2095         // Mark it as fixed
2096         this[ expando ] = true;
2097 };
2098
2099 function returnFalse() {
2100         return false;
2101 }
2102 function returnTrue() {
2103         return true;
2104 }
2105
2106 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
2107 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
2108 jQuery.Event.prototype = {
2109         preventDefault: function() {
2110                 this.isDefaultPrevented = returnTrue;
2111
2112                 var e = this.originalEvent;
2113                 if ( !e ) {
2114                         return;
2115                 }
2116                 
2117                 // if preventDefault exists run it on the original event
2118                 if ( e.preventDefault ) {
2119                         e.preventDefault();
2120                 }
2121                 // otherwise set the returnValue property of the original event to false (IE)
2122                 e.returnValue = false;
2123         },
2124         stopPropagation: function() {
2125                 this.isPropagationStopped = returnTrue;
2126
2127                 var e = this.originalEvent;
2128                 if ( !e ) {
2129                         return;
2130                 }
2131                 // if stopPropagation exists run it on the original event
2132                 if ( e.stopPropagation ) {
2133                         e.stopPropagation();
2134                 }
2135                 // otherwise set the cancelBubble property of the original event to true (IE)
2136                 e.cancelBubble = true;
2137         },
2138         stopImmediatePropagation: function() {
2139                 this.isImmediatePropagationStopped = returnTrue;
2140                 this.stopPropagation();
2141         },
2142         isDefaultPrevented: returnFalse,
2143         isPropagationStopped: returnFalse,
2144         isImmediatePropagationStopped: returnFalse
2145 };
2146
2147 // Checks if an event happened on an element within another element
2148 // Used in jQuery.event.special.mouseenter and mouseleave handlers
2149 var withinElement = function( event ) {
2150         // Check if mouse(over|out) are still within the same parent element
2151         var parent = event.relatedTarget;
2152
2153         // Firefox sometimes assigns relatedTarget a XUL element
2154         // which we cannot access the parentNode property of
2155         try {
2156                 // Traverse up the tree
2157                 while ( parent && parent !== this ) {
2158                         parent = parent.parentNode;
2159                 }
2160
2161                 if ( parent !== this ) {
2162                         // set the correct event type
2163                         event.type = event.data;
2164
2165                         // handle event if we actually just moused on to a non sub-element
2166                         jQuery.event.handle.apply( this, arguments );
2167                 }
2168
2169         // assuming we've left the element since we most likely mousedover a xul element
2170         } catch(e) { }
2171 },
2172
2173 // In case of event delegation, we only need to rename the event.type,
2174 // liveHandler will take care of the rest.
2175 delegate = function( event ) {
2176         event.type = event.data;
2177         jQuery.event.handle.apply( this, arguments );
2178 };
2179
2180 // Create mouseenter and mouseleave events
2181 jQuery.each({
2182         mouseenter: "mouseover",
2183         mouseleave: "mouseout"
2184 }, function( orig, fix ) {
2185         jQuery.event.special[ orig ] = {
2186                 setup: function( data ) {
2187                         jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
2188                 },
2189                 teardown: function( data ) {
2190                         jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
2191                 }
2192         };
2193 });
2194
2195 // submit delegation
2196 if ( !jQuery.support.submitBubbles ) {
2197
2198         jQuery.event.special.submit = {
2199                 setup: function( data, namespaces ) {
2200                         if ( this.nodeName.toLowerCase() !== "form" ) {
2201                                 jQuery.event.add(this, "click.specialSubmit", function( e ) {
2202                                         var elem = e.target, type = elem.type;
2203
2204                                         if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
2205                                                 return trigger( "submit", this, arguments );
2206                                         }
2207                                 });
2208          
2209                                 jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
2210                                         var elem = e.target, type = elem.type;
2211
2212                                         if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
2213                                                 return trigger( "submit", this, arguments );
2214                                         }
2215                                 });
2216
2217                         } else {
2218                                 return false;
2219                         }
2220                 },
2221
2222                 teardown: function( namespaces ) {
2223                         jQuery.event.remove( this, ".specialSubmit" );
2224                 }
2225         };
2226
2227 }
2228
2229 // change delegation, happens here so we have bind.
2230 if ( !jQuery.support.changeBubbles ) {
2231
2232         var formElems = /textarea|input|select/i,
2233
2234         changeFilters,
2235
2236         getVal = function( elem ) {
2237                 var type = elem.type, val = elem.value;
2238
2239                 if ( type === "radio" || type === "checkbox" ) {
2240                         val = elem.checked;
2241
2242                 } else if ( type === "select-multiple" ) {
2243                         val = elem.selectedIndex > -1 ?
2244                                 jQuery.map( elem.options, function( elem ) {
2245                                         return elem.selected;
2246                                 }).join("-") :
2247                                 "";
2248
2249                 } else if ( elem.nodeName.toLowerCase() === "select" ) {
2250                         val = elem.selectedIndex;
2251                 }
2252
2253                 return val;
2254         },
2255
2256         testChange = function testChange( e ) {
2257                 var elem = e.target, data, val;
2258
2259                 if ( !formElems.test( elem.nodeName ) || elem.readOnly ) {
2260                         return;
2261                 }
2262
2263                 data = jQuery.data( elem, "_change_data" );
2264                 val = getVal(elem);
2265
2266                 // the current data will be also retrieved by beforeactivate
2267                 if ( e.type !== "focusout" || elem.type !== "radio" ) {
2268                         jQuery.data( elem, "_change_data", val );
2269                 }
2270                 
2271                 if ( data === undefined || val === data ) {
2272                         return;
2273                 }
2274
2275                 if ( data != null || val ) {
2276                         e.type = "change";
2277                         return jQuery.event.trigger( e, arguments[1], elem );
2278                 }
2279         };
2280
2281         jQuery.event.special.change = {
2282                 filters: {
2283                         focusout: testChange, 
2284
2285                         click: function( e ) {
2286                                 var elem = e.target, type = elem.type;
2287
2288                                 if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
2289                                         return testChange.call( this, e );
2290                                 }
2291                         },
2292
2293                         // Change has to be called before submit
2294                         // Keydown will be called before keypress, which is used in submit-event delegation
2295                         keydown: function( e ) {
2296                                 var elem = e.target, type = elem.type;
2297
2298                                 if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
2299                                         (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
2300                                         type === "select-multiple" ) {
2301                                         return testChange.call( this, e );
2302                                 }
2303                         },
2304
2305                         // Beforeactivate happens also before the previous element is blurred
2306                         // with this event you can't trigger a change event, but you can store
2307                         // information/focus[in] is not needed anymore
2308                         beforeactivate: function( e ) {
2309                                 var elem = e.target;
2310                                 jQuery.data( elem, "_change_data", getVal(elem) );
2311                         }
2312                 },
2313
2314                 setup: function( data, namespaces ) {
2315                         if ( this.type === "file" ) {
2316                                 return false;
2317                         }
2318
2319                         for ( var type in changeFilters ) {
2320                                 jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
2321                         }
2322
2323                         return formElems.test( this.nodeName );
2324                 },
2325
2326                 teardown: function( namespaces ) {
2327                         jQuery.event.remove( this, ".specialChange" );
2328
2329                         return formElems.test( this.nodeName );
2330                 }
2331         };
2332
2333         changeFilters = jQuery.event.special.change.filters;
2334 }
2335
2336 function trigger( type, elem, args ) {
2337         args[0].type = type;
2338         return jQuery.event.handle.apply( elem, args );
2339 }
2340
2341 // Create "bubbling" focus and blur events
2342 if ( document.addEventListener ) {
2343         jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
2344                 jQuery.event.special[ fix ] = {
2345                         setup: function() {
2346                                 this.addEventListener( orig, handler, true );
2347                         }, 
2348                         teardown: function() { 
2349                                 this.removeEventListener( orig, handler, true );
2350                         }
2351                 };
2352
2353                 function handler( e ) { 
2354                         e = jQuery.event.fix( e );
2355                         e.type = fix;
2356                         return jQuery.event.handle.call( this, e );
2357                 }
2358         });
2359 }
2360
2361 jQuery.each(["bind", "one"], function( i, name ) {
2362         jQuery.fn[ name ] = function( type, data, fn ) {
2363                 // Handle object literals
2364                 if ( typeof type === "object" ) {
2365                         for ( var key in type ) {
2366                                 this[ name ](key, data, type[key], fn);
2367                         }
2368                         return this;
2369                 }
2370                 
2371                 if ( jQuery.isFunction( data ) ) {
2372                         fn = data;
2373                         data = undefined;
2374                 }
2375
2376                 var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
2377                         jQuery( this ).unbind( event, handler );
2378                         return fn.apply( this, arguments );
2379                 }) : fn;
2380
2381                 if ( type === "unload" && name !== "one" ) {
2382                         this.one( type, data, fn );
2383
2384                 } else {
2385                         for ( var i = 0, l = this.length; i < l; i++ ) {
2386                                 jQuery.event.add( this[i], type, handler, data );
2387                         }
2388                 }
2389
2390                 return this;
2391         };
2392 });
2393
2394 jQuery.fn.extend({
2395         unbind: function( type, fn ) {
2396                 // Handle object literals
2397                 if ( typeof type === "object" && !type.preventDefault ) {
2398                         for ( var key in type ) {
2399                                 this.unbind(key, type[key]);
2400                         }
2401
2402                 } else {
2403                         for ( var i = 0, l = this.length; i < l; i++ ) {
2404                                 jQuery.event.remove( this[i], type, fn );
2405                         }
2406                 }
2407
2408                 return this;
2409         },
2410         
2411         delegate: function( selector, types, data, fn ) {
2412                 return this.live( types, data, fn, selector );
2413         },
2414         
2415         undelegate: function( selector, types, fn ) {
2416                 if ( arguments.length === 0 ) {
2417                                 return this.unbind( "live" );
2418                 
2419                 } else {
2420                         return this.die( types, null, fn, selector );
2421                 }
2422         },
2423         
2424         trigger: function( type, data ) {
2425                 return this.each(function() {
2426                         jQuery.event.trigger( type, data, this );
2427                 });
2428         },
2429
2430         triggerHandler: function( type, data ) {
2431                 if ( this[0] ) {
2432                         var event = jQuery.Event( type );
2433                         event.preventDefault();
2434                         event.stopPropagation();
2435                         jQuery.event.trigger( event, data, this[0] );
2436                         return event.result;
2437                 }
2438         },
2439
2440         toggle: function( fn ) {
2441                 // Save reference to arguments for access in closure
2442                 var args = arguments, i = 1;
2443
2444                 // link all the functions, so any of them can unbind this click handler
2445                 while ( i < args.length ) {
2446                         jQuery.proxy( fn, args[ i++ ] );
2447                 }
2448
2449                 return this.click( jQuery.proxy( fn, function( event ) {
2450                         // Figure out which function to execute
2451                         var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
2452                         jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
2453
2454                         // Make sure that clicks stop
2455                         event.preventDefault();
2456
2457                         // and execute the function
2458                         return args[ lastToggle ].apply( this, arguments ) || false;
2459                 }));
2460         },
2461
2462         hover: function( fnOver, fnOut ) {
2463                 return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
2464         }
2465 });
2466
2467 var liveMap = {
2468         focus: "focusin",
2469         blur: "focusout",
2470         mouseenter: "mouseover",
2471         mouseleave: "mouseout"
2472 };
2473
2474 jQuery.each(["live", "die"], function( i, name ) {
2475         jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
2476                 var type, i = 0, match, namespaces, preType,
2477                         selector = origSelector || this.selector,
2478                         context = origSelector ? this : jQuery( this.context );
2479
2480                 if ( jQuery.isFunction( data ) ) {
2481                         fn = data;
2482                         data = undefined;
2483                 }
2484
2485                 types = (types || "").split(" ");
2486
2487                 while ( (type = types[ i++ ]) != null ) {
2488                         match = rnamespaces.exec( type );
2489                         namespaces = "";
2490
2491                         if ( match )  {
2492                                 namespaces = match[0];
2493                                 type = type.replace( rnamespaces, "" );
2494                         }
2495
2496                         if ( type === "hover" ) {
2497                                 types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
2498                                 continue;
2499                         }
2500
2501                         preType = type;
2502
2503                         if ( type === "focus" || type === "blur" ) {
2504                                 types.push( liveMap[ type ] + namespaces );
2505                                 type = type + namespaces;
2506
2507                         } else {
2508                                 type = (liveMap[ type ] || type) + namespaces;
2509                         }
2510
2511                         if ( name === "live" ) {
2512                                 // bind live handler
2513                                 context.each(function(){
2514                                         jQuery.event.add( this, liveConvert( type, selector ),
2515                                                 { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
2516                                 });
2517
2518                         } else {
2519                                 // unbind live handler
2520                                 context.unbind( liveConvert( type, selector ), fn );
2521                         }
2522                 }
2523                 
2524                 return this;
2525         }
2526 });
2527
2528 function liveHandler( event ) {
2529         var stop, elems = [], selectors = [], args = arguments,
2530                 related, match, handleObj, elem, j, i, l, data,
2531                 events = jQuery.data( this, "events" );
2532
2533         // Make sure we avoid non-left-click bubbling in Firefox (#3861)
2534         if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) {
2535                 return;
2536         }
2537
2538         event.liveFired = this;
2539
2540         var live = events.live.slice(0);
2541
2542         for ( j = 0; j < live.length; j++ ) {
2543                 handleObj = live[j];
2544
2545                 if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
2546                         selectors.push( handleObj.selector );
2547
2548                 } else {
2549                         live.splice( j--, 1 );
2550                 }
2551         }
2552
2553         match = jQuery( event.target ).closest( selectors, event.currentTarget );
2554
2555         for ( i = 0, l = match.length; i < l; i++ ) {
2556                 for ( j = 0; j < live.length; j++ ) {
2557                         handleObj = live[j];
2558
2559                         if ( match[i].selector === handleObj.selector ) {
2560                                 elem = match[i].elem;
2561                                 related = null;
2562
2563                                 // Those two events require additional checking
2564                                 if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
2565                                         related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
2566                                 }
2567
2568                                 if ( !related || related !== elem ) {
2569                                         elems.push({ elem: elem, handleObj: handleObj });
2570                                 }
2571                         }
2572                 }
2573         }
2574
2575         for ( i = 0, l = elems.length; i < l; i++ ) {
2576                 match = elems[i];
2577                 event.currentTarget = match.elem;
2578                 event.data = match.handleObj.data;
2579                 event.handleObj = match.handleObj;
2580
2581                 if ( match.handleObj.origHandler.apply( match.elem, args ) === false ) {
2582                         stop = false;
2583                         break;
2584                 }
2585         }
2586
2587         return stop;
2588 }
2589
2590 function liveConvert( type, selector ) {
2591         return "live." + (type && type !== "*" ? type + "." : "") + selector.replace(/\./g, "`").replace(/ /g, "&");
2592 }
2593
2594 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
2595         "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
2596         "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
2597
2598         // Handle event binding
2599         jQuery.fn[ name ] = function( fn ) {
2600                 return fn ? this.bind( name, fn ) : this.trigger( name );
2601         };
2602
2603         if ( jQuery.attrFn ) {
2604                 jQuery.attrFn[ name ] = true;
2605         }
2606 });
2607
2608 // Prevent memory leaks in IE
2609 // Window isn't included so as not to unbind existing unload events
2610 // More info:
2611 //  - http://isaacschlueter.com/2006/10/msie-memory-leaks/
2612 if ( window.attachEvent && !window.addEventListener ) {
2613         window.attachEvent("onunload", function() {
2614                 for ( var id in jQuery.cache ) {
2615                         if ( jQuery.cache[ id ].handle ) {
2616                                 // Try/Catch is to handle iframes being unloaded, see #4280
2617                                 try {
2618                                         jQuery.event.remove( jQuery.cache[ id ].handle.elem );
2619                                 } catch(e) {}
2620                         }
2621                 }
2622         });
2623 }
2624 /*!
2625  * Sizzle CSS Selector Engine - v1.0
2626  *  Copyright 2009, The Dojo Foundation
2627  *  Released under the MIT, BSD, and GPL Licenses.
2628  *  More information: http://sizzlejs.com/
2629  */
2630 (function(){
2631
2632 var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
2633         done = 0,
2634         toString = Object.prototype.toString,
2635         hasDuplicate = false,
2636         baseHasDuplicate = true;
2637
2638 // Here we check if the JavaScript engine is using some sort of
2639 // optimization where it does not always call our comparision
2640 // function. If that is the case, discard the hasDuplicate value.
2641 //   Thus far that includes Google Chrome.
2642 [0, 0].sort(function(){
2643         baseHasDuplicate = false;
2644         return 0;
2645 });
2646
2647 var Sizzle = function(selector, context, results, seed) {
2648         results = results || [];
2649         var origContext = context = context || document;
2650
2651         if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
2652                 return [];
2653         }
2654         
2655         if ( !selector || typeof selector !== "string" ) {
2656                 return results;
2657         }
2658
2659         var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context),
2660                 soFar = selector;
2661         
2662         // Reset the position of the chunker regexp (start from head)
2663         while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) {
2664                 soFar = m[3];
2665                 
2666                 parts.push( m[1] );
2667                 
2668                 if ( m[2] ) {
2669                         extra = m[3];
2670                         break;
2671                 }
2672         }
2673
2674         if ( parts.length > 1 && origPOS.exec( selector ) ) {
2675                 if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
2676                         set = posProcess( parts[0] + parts[1], context );
2677                 } else {
2678                         set = Expr.relative[ parts[0] ] ?
2679                                 [ context ] :
2680                                 Sizzle( parts.shift(), context );
2681
2682                         while ( parts.length ) {
2683                                 selector = parts.shift();
2684
2685                                 if ( Expr.relative[ selector ] ) {
2686                                         selector += parts.shift();
2687                                 }
2688                                 
2689                                 set = posProcess( selector, set );
2690                         }
2691                 }
2692         } else {
2693                 // Take a shortcut and set the context if the root selector is an ID
2694                 // (but not if it'll be faster if the inner selector is an ID)
2695                 if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
2696                                 Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
2697                         var ret = Sizzle.find( parts.shift(), context, contextXML );
2698                         context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
2699                 }
2700
2701                 if ( context ) {
2702                         var ret = seed ?
2703                                 { expr: parts.pop(), set: makeArray(seed) } :
2704                                 Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
2705                         set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
2706
2707                         if ( parts.length > 0 ) {
2708                                 checkSet = makeArray(set);
2709                         } else {
2710                                 prune = false;
2711                         }
2712
2713                         while ( parts.length ) {
2714                                 var cur = parts.pop(), pop = cur;
2715
2716                                 if ( !Expr.relative[ cur ] ) {
2717                                         cur = "";
2718                                 } else {
2719                                         pop = parts.pop();
2720                                 }
2721
2722                                 if ( pop == null ) {
2723                                         pop = context;
2724                                 }
2725
2726                                 Expr.relative[ cur ]( checkSet, pop, contextXML );
2727                         }
2728                 } else {
2729                         checkSet = parts = [];
2730                 }
2731         }
2732
2733         if ( !checkSet ) {
2734                 checkSet = set;
2735         }
2736
2737         if ( !checkSet ) {
2738                 Sizzle.error( cur || selector );
2739         }
2740
2741         if ( toString.call(checkSet) === "[object Array]" ) {
2742                 if ( !prune ) {
2743                         results.push.apply( results, checkSet );
2744                 } else if ( context && context.nodeType === 1 ) {
2745                         for ( var i = 0; checkSet[i] != null; i++ ) {
2746                                 if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
2747                                         results.push( set[i] );
2748                                 }
2749                         }
2750                 } else {
2751                         for ( var i = 0; checkSet[i] != null; i++ ) {
2752                                 if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
2753                                         results.push( set[i] );
2754                                 }
2755                         }
2756                 }
2757         } else {
2758                 makeArray( checkSet, results );
2759         }
2760
2761         if ( extra ) {
2762                 Sizzle( extra, origContext, results, seed );
2763                 Sizzle.uniqueSort( results );
2764         }
2765
2766         return results;
2767 };
2768
2769 Sizzle.uniqueSort = function(results){
2770         if ( sortOrder ) {
2771                 hasDuplicate = baseHasDuplicate;
2772                 results.sort(sortOrder);
2773
2774                 if ( hasDuplicate ) {
2775                         for ( var i = 1; i < results.length; i++ ) {
2776                                 if ( results[i] === results[i-1] ) {
2777                                         results.splice(i--, 1);
2778                                 }
2779                         }
2780                 }
2781         }
2782
2783         return results;
2784 };
2785
2786 Sizzle.matches = function(expr, set){
2787         return Sizzle(expr, null, null, set);
2788 };
2789
2790 Sizzle.find = function(expr, context, isXML){
2791         var set, match;
2792
2793         if ( !expr ) {
2794                 return [];
2795         }
2796
2797         for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
2798                 var type = Expr.order[i], match;
2799                 
2800                 if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
2801                         var left = match[1];
2802                         match.splice(1,1);
2803
2804                         if ( left.substr( left.length - 1 ) !== "\\" ) {
2805                                 match[1] = (match[1] || "").replace(/\\/g, "");
2806                                 set = Expr.find[ type ]( match, context, isXML );
2807                                 if ( set != null ) {
2808                                         expr = expr.replace( Expr.match[ type ], "" );
2809                                         break;
2810                                 }
2811                         }
2812                 }
2813         }
2814
2815         if ( !set ) {
2816                 set = context.getElementsByTagName("*");
2817         }
2818
2819         return {set: set, expr: expr};
2820 };
2821
2822 Sizzle.filter = function(expr, set, inplace, not){
2823         var old = expr, result = [], curLoop = set, match, anyFound,
2824                 isXMLFilter = set && set[0] && isXML(set[0]);
2825
2826         while ( expr && set.length ) {
2827                 for ( var type in Expr.filter ) {
2828                         if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
2829                                 var filter = Expr.filter[ type ], found, item, left = match[1];
2830                                 anyFound = false;
2831
2832                                 match.splice(1,1);
2833
2834                                 if ( left.substr( left.length - 1 ) === "\\" ) {
2835                                         continue;
2836                                 }
2837
2838                                 if ( curLoop === result ) {
2839                                         result = [];
2840                                 }
2841
2842                                 if ( Expr.preFilter[ type ] ) {
2843                                         match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
2844
2845                                         if ( !match ) {
2846                                                 anyFound = found = true;
2847                                         } else if ( match === true ) {
2848                                                 continue;
2849                                         }
2850                                 }
2851
2852                                 if ( match ) {
2853                                         for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
2854                                                 if ( item ) {
2855                                                         found = filter( item, match, i, curLoop );
2856                                                         var pass = not ^ !!found;
2857
2858                                                         if ( inplace && found != null ) {
2859                                                                 if ( pass ) {
2860                                                                         anyFound = true;
2861                                                                 } else {
2862                                                                         curLoop[i] = false;
2863                                                                 }
2864                                                         } else if ( pass ) {
2865                                                                 result.push( item );
2866                                                                 anyFound = true;
2867                                                         }
2868                                                 }
2869                                         }
2870                                 }
2871
2872                                 if ( found !== undefined ) {
2873                                         if ( !inplace ) {
2874                                                 curLoop = result;
2875                                         }
2876
2877                                         expr = expr.replace( Expr.match[ type ], "" );
2878
2879                                         if ( !anyFound ) {
2880                                                 return [];
2881                                         }
2882
2883                                         break;
2884                                 }
2885                         }
2886                 }
2887
2888                 // Improper expression
2889                 if ( expr === old ) {
2890                         if ( anyFound == null ) {
2891                                 Sizzle.error( expr );
2892                         } else {
2893                                 break;
2894                         }
2895                 }
2896
2897                 old = expr;
2898         }
2899
2900         return curLoop;
2901 };
2902
2903 Sizzle.error = function( msg ) {
2904         throw "Syntax error, unrecognized expression: " + msg;
2905 };
2906
2907 var Expr = Sizzle.selectors = {
2908         order: [ "ID", "NAME", "TAG" ],
2909         match: {
2910                 ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
2911                 CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
2912                 NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,
2913                 ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
2914                 TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,
2915                 CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
2916                 POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
2917                 PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
2918         },
2919         leftMatch: {},
2920         attrMap: {
2921                 "class": "className",
2922                 "for": "htmlFor"
2923         },
2924         attrHandle: {
2925                 href: function(elem){
2926                         return elem.getAttribute("href");
2927                 }
2928         },
2929         relative: {
2930                 "+": function(checkSet, part){
2931                         var isPartStr = typeof part === "string",
2932                                 isTag = isPartStr && !/\W/.test(part),
2933                                 isPartStrNotTag = isPartStr && !isTag;
2934
2935                         if ( isTag ) {
2936                                 part = part.toLowerCase();
2937                         }
2938
2939                         for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
2940                                 if ( (elem = checkSet[i]) ) {
2941                                         while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
2942
2943                                         checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
2944                                                 elem || false :
2945                                                 elem === part;
2946                                 }
2947                         }
2948
2949                         if ( isPartStrNotTag ) {
2950                                 Sizzle.filter( part, checkSet, true );
2951                         }
2952                 },
2953                 ">": function(checkSet, part){
2954                         var isPartStr = typeof part === "string";
2955
2956                         if ( isPartStr && !/\W/.test(part) ) {
2957                                 part = part.toLowerCase();
2958
2959                                 for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2960                                         var elem = checkSet[i];
2961                                         if ( elem ) {
2962                                                 var parent = elem.parentNode;
2963                                                 checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
2964                                         }
2965                                 }
2966                         } else {
2967                                 for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2968                                         var elem = checkSet[i];
2969                                         if ( elem ) {
2970                                                 checkSet[i] = isPartStr ?
2971                                                         elem.parentNode :
2972                                                         elem.parentNode === part;
2973                                         }
2974                                 }
2975
2976                                 if ( isPartStr ) {
2977                                         Sizzle.filter( part, checkSet, true );
2978                                 }
2979                         }
2980                 },
2981                 "": function(checkSet, part, isXML){
2982                         var doneName = done++, checkFn = dirCheck;
2983
2984                         if ( typeof part === "string" && !/\W/.test(part) ) {
2985                                 var nodeCheck = part = part.toLowerCase();
2986                                 checkFn = dirNodeCheck;
2987                         }
2988
2989                         checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
2990                 },
2991                 "~": function(checkSet, part, isXML){
2992                         var doneName = done++, checkFn = dirCheck;
2993
2994                         if ( typeof part === "string" && !/\W/.test(part) ) {
2995                                 var nodeCheck = part = part.toLowerCase();
2996                                 checkFn = dirNodeCheck;
2997                         }
2998
2999                         checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
3000                 }
3001         },
3002         find: {
3003                 ID: function(match, context, isXML){
3004                         if ( typeof context.getElementById !== "undefined" && !isXML ) {
3005                                 var m = context.getElementById(match[1]);
3006                                 return m ? [m] : [];
3007                         }
3008                 },
3009                 NAME: function(match, context){
3010                         if ( typeof context.getElementsByName !== "undefined" ) {
3011                                 var ret = [], results = context.getElementsByName(match[1]);
3012
3013                                 for ( var i = 0, l = results.length; i < l; i++ ) {
3014                                         if ( results[i].getAttribute("name") === match[1] ) {
3015                                                 ret.push( results[i] );
3016                                         }
3017                                 }
3018
3019                                 return ret.length === 0 ? null : ret;
3020                         }
3021                 },
3022                 TAG: function(match, context){
3023                         return context.getElementsByTagName(match[1]);
3024                 }
3025         },
3026         preFilter: {
3027                 CLASS: function(match, curLoop, inplace, result, not, isXML){
3028                         match = " " + match[1].replace(/\\/g, "") + " ";
3029
3030                         if ( isXML ) {
3031                                 return match;
3032                         }
3033
3034                         for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
3035                                 if ( elem ) {
3036                                         if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) {
3037                                                 if ( !inplace ) {
3038                                                         result.push( elem );
3039                                                 }
3040                                         } else if ( inplace ) {
3041                                                 curLoop[i] = false;
3042                                         }
3043                                 }
3044                         }
3045
3046                         return false;
3047                 },
3048                 ID: function(match){
3049                         return match[1].replace(/\\/g, "");
3050                 },
3051                 TAG: function(match, curLoop){
3052                         return match[1].toLowerCase();
3053                 },
3054                 CHILD: function(match){
3055                         if ( match[1] === "nth" ) {
3056                                 // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
3057                                 var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
3058                                         match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
3059                                         !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
3060
3061                                 // calculate the numbers (first)n+(last) including if they are negative
3062                                 match[2] = (test[1] + (test[2] || 1)) - 0;
3063                                 match[3] = test[3] - 0;
3064                         }
3065
3066                         // TODO: Move to normal caching system
3067                         match[0] = done++;
3068
3069                         return match;
3070                 },
3071                 ATTR: function(match, curLoop, inplace, result, not, isXML){
3072                         var name = match[1].replace(/\\/g, "");
3073                         
3074                         if ( !isXML && Expr.attrMap[name] ) {
3075                                 match[1] = Expr.attrMap[name];
3076                         }
3077
3078                         if ( match[2] === "~=" ) {
3079                                 match[4] = " " + match[4] + " ";
3080                         }
3081
3082                         return match;
3083                 },
3084                 PSEUDO: function(match, curLoop, inplace, result, not){
3085                         if ( match[1] === "not" ) {
3086                                 // If we're dealing with a complex expression, or a simple one
3087                                 if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
3088                                         match[3] = Sizzle(match[3], null, null, curLoop);
3089                                 } else {
3090                                         var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
3091                                         if ( !inplace ) {
3092                                                 result.push.apply( result, ret );
3093                                         }
3094                                         return false;
3095                                 }
3096                         } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
3097                                 return true;
3098                         }
3099                         
3100                         return match;
3101                 },
3102                 POS: function(match){
3103                         match.unshift( true );
3104                         return match;
3105                 }
3106         },
3107         filters: {
3108                 enabled: function(elem){
3109                         return elem.disabled === false && elem.type !== "hidden";
3110                 },
3111                 disabled: function(elem){
3112                         return elem.disabled === true;
3113                 },
3114                 checked: function(elem){
3115                         return elem.checked === true;
3116                 },
3117                 selected: function(elem){
3118                         // Accessing this property makes selected-by-default
3119                         // options in Safari work properly
3120                         elem.parentNode.selectedIndex;
3121                         return elem.selected === true;
3122                 },
3123                 parent: function(elem){
3124                         return !!elem.firstChild;
3125                 },
3126                 empty: function(elem){
3127                         return !elem.firstChild;
3128                 },
3129                 has: function(elem, i, match){
3130                         return !!Sizzle( match[3], elem ).length;
3131                 },
3132                 header: function(elem){
3133                         return /h\d/i.test( elem.nodeName );
3134                 },
3135                 text: function(elem){
3136                         return "text" === elem.type;
3137                 },
3138                 radio: function(elem){
3139                         return "radio" === elem.type;
3140                 },
3141                 checkbox: function(elem){
3142                         return "checkbox" === elem.type;
3143                 },
3144                 file: function(elem){
3145                         return "file" === elem.type;
3146                 },
3147                 password: function(elem){
3148                         return "password" === elem.type;
3149                 },
3150                 submit: function(elem){
3151                         return "submit" === elem.type;
3152                 },
3153                 image: function(elem){
3154                         return "image" === elem.type;
3155                 },
3156                 reset: function(elem){
3157                         return "reset" === elem.type;
3158                 },
3159                 button: function(elem){
3160                         return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
3161                 },
3162                 input: function(elem){
3163                         return /input|select|textarea|button/i.test(elem.nodeName);
3164                 }
3165         },
3166         setFilters: {
3167                 first: function(elem, i){
3168                         return i === 0;
3169                 },
3170                 last: function(elem, i, match, array){
3171                         return i === array.length - 1;
3172                 },
3173                 even: function(elem, i){
3174                         return i % 2 === 0;
3175                 },
3176                 odd: function(elem, i){
3177                         return i % 2 === 1;
3178                 },
3179                 lt: function(elem, i, match){
3180                         return i < match[3] - 0;
3181                 },
3182                 gt: function(elem, i, match){
3183                         return i > match[3] - 0;
3184                 },
3185                 nth: function(elem, i, match){
3186                         return match[3] - 0 === i;
3187                 },
3188                 eq: function(elem, i, match){
3189                         return match[3] - 0 === i;
3190                 }
3191         },
3192         filter: {
3193                 PSEUDO: function(elem, match, i, array){
3194                         var name = match[1], filter = Expr.filters[ name ];
3195
3196                         if ( filter ) {
3197                                 return filter( elem, i, match, array );
3198                         } else if ( name === "contains" ) {
3199                                 return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
3200                         } else if ( name === "not" ) {
3201                                 var not = match[3];
3202
3203                                 for ( var i = 0, l = not.length; i < l; i++ ) {
3204                                         if ( not[i] === elem ) {
3205                                                 return false;
3206                                         }
3207                                 }
3208
3209                                 return true;
3210                         } else {
3211                                 Sizzle.error( "Syntax error, unrecognized expression: " + name );
3212                         }
3213                 },
3214                 CHILD: function(elem, match){
3215                         var type = match[1], node = elem;
3216                         switch (type) {
3217                                 case 'only':
3218                                 case 'first':
3219                                         while ( (node = node.previousSibling) )  {
3220                                                 if ( node.nodeType === 1 ) { 
3221                                                         return false; 
3222                                                 }
3223                                         }
3224                                         if ( type === "first" ) { 
3225                                                 return true; 
3226                                         }
3227                                         node = elem;
3228                                 case 'last':
3229                                         while ( (node = node.nextSibling) )      {
3230                                                 if ( node.nodeType === 1 ) { 
3231                                                         return false; 
3232                                                 }
3233                                         }
3234                                         return true;
3235                                 case 'nth':
3236                                         var first = match[2], last = match[3];
3237
3238                                         if ( first === 1 && last === 0 ) {
3239                                                 return true;
3240                                         }
3241                                         
3242                                         var doneName = match[0],
3243                                                 parent = elem.parentNode;
3244         
3245                                         if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
3246                                                 var count = 0;
3247                                                 for ( node = parent.firstChild; node; node = node.nextSibling ) {
3248                                                         if ( node.nodeType === 1 ) {
3249                                                                 node.nodeIndex = ++count;
3250                                                         }
3251                                                 } 
3252                                                 parent.sizcache = doneName;
3253                                         }
3254                                         
3255                                         var diff = elem.nodeIndex - last;
3256                                         if ( first === 0 ) {
3257                                                 return diff === 0;
3258                                         } else {
3259                                                 return ( diff % first === 0 && diff / first >= 0 );
3260                                         }
3261                         }
3262                 },
3263                 ID: function(elem, match){
3264                         return elem.nodeType === 1 && elem.getAttribute("id") === match;
3265                 },
3266                 TAG: function(elem, match){
3267                         return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
3268                 },
3269                 CLASS: function(elem, match){
3270                         return (" " + (elem.className || elem.getAttribute("class")) + " ")
3271                                 .indexOf( match ) > -1;
3272                 },
3273                 ATTR: function(elem, match){
3274                         var name = match[1],
3275                                 result = Expr.attrHandle[ name ] ?
3276                                         Expr.attrHandle[ name ]( elem ) :
3277                                         elem[ name ] != null ?
3278                                                 elem[ name ] :
3279                                                 elem.getAttribute( name ),
3280                                 value = result + "",
3281                                 type = match[2],
3282                                 check = match[4];
3283
3284                         return result == null ?
3285                                 type === "!=" :
3286                                 type === "=" ?
3287                                 value === check :
3288                                 type === "*=" ?
3289                                 value.indexOf(check) >= 0 :
3290                                 type === "~=" ?
3291                                 (" " + value + " ").indexOf(check) >= 0 :
3292                                 !check ?
3293                                 value && result !== false :
3294                                 type === "!=" ?
3295                                 value !== check :
3296                                 type === "^=" ?
3297                                 value.indexOf(check) === 0 :
3298                                 type === "$=" ?
3299                                 value.substr(value.length - check.length) === check :
3300                                 type === "|=" ?
3301                                 value === check || value.substr(0, check.length + 1) === check + "-" :
3302                                 false;
3303                 },
3304                 POS: function(elem, match, i, array){
3305                         var name = match[2], filter = Expr.setFilters[ name ];
3306
3307                         if ( filter ) {
3308                                 return filter( elem, i, match, array );
3309                         }
3310                 }
3311         }
3312 };
3313
3314 var origPOS = Expr.match.POS;
3315
3316 for ( var type in Expr.match ) {
3317         Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
3318         Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, function(all, num){
3319                 return "\\" + (num - 0 + 1);
3320         }));
3321 }
3322
3323 var makeArray = function(array, results) {
3324         array = Array.prototype.slice.call( array, 0 );
3325
3326         if ( results ) {
3327                 results.push.apply( results, array );
3328                 return results;
3329         }
3330         
3331         return array;
3332 };
3333
3334 // Perform a simple check to determine if the browser is capable of
3335 // converting a NodeList to an array using builtin methods.
3336 // Also verifies that the returned array holds DOM nodes
3337 // (which is not the case in the Blackberry browser)
3338 try {
3339         Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
3340
3341 // Provide a fallback method if it does not work
3342 } catch(e){
3343         makeArray = function(array, results) {
3344                 var ret = results || [];
3345
3346                 if ( toString.call(array) === "[object Array]" ) {
3347                         Array.prototype.push.apply( ret, array );
3348                 } else {
3349                         if ( typeof array.length === "number" ) {
3350                                 for ( var i = 0, l = array.length; i < l; i++ ) {
3351                                         ret.push( array[i] );
3352                                 }
3353                         } else {
3354                                 for ( var i = 0; array[i]; i++ ) {
3355                                         ret.push( array[i] );
3356                                 }
3357                         }
3358                 }
3359
3360                 return ret;
3361         };
3362 }
3363
3364 var sortOrder;
3365
3366 if ( document.documentElement.compareDocumentPosition ) {
3367         sortOrder = function( a, b ) {
3368                 if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
3369                         if ( a == b ) {
3370                                 hasDuplicate = true;
3371                         }
3372                         return a.compareDocumentPosition ? -1 : 1;
3373                 }
3374
3375                 var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
3376                 if ( ret === 0 ) {
3377                         hasDuplicate = true;
3378                 }
3379                 return ret;
3380         };
3381 } else if ( "sourceIndex" in document.documentElement ) {
3382         sortOrder = function( a, b ) {
3383                 if ( !a.sourceIndex || !b.sourceIndex ) {
3384                         if ( a == b ) {
3385                                 hasDuplicate = true;
3386                         }
3387                         return a.sourceIndex ? -1 : 1;
3388                 }
3389
3390                 var ret = a.sourceIndex - b.sourceIndex;
3391                 if ( ret === 0 ) {
3392                         hasDuplicate = true;
3393                 }
3394                 return ret;
3395         };
3396 } else if ( document.createRange ) {
3397         sortOrder = function( a, b ) {
3398                 if ( !a.ownerDocument || !b.ownerDocument ) {
3399                         if ( a == b ) {
3400                                 hasDuplicate = true;
3401                         }
3402                         return a.ownerDocument ? -1 : 1;
3403                 }
3404
3405                 var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
3406                 aRange.setStart(a, 0);
3407                 aRange.setEnd(a, 0);
3408                 bRange.setStart(b, 0);
3409                 bRange.setEnd(b, 0);
3410                 var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
3411                 if ( ret === 0 ) {
3412                         hasDuplicate = true;
3413                 }
3414                 return ret;
3415         };
3416 }
3417
3418 // Utility function for retreiving the text value of an array of DOM nodes
3419 function getText( elems ) {
3420         var ret = "", elem;
3421
3422         for ( var i = 0; elems[i]; i++ ) {
3423                 elem = elems[i];
3424
3425                 // Get the text from text nodes and CDATA nodes
3426                 if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
3427                         ret += elem.nodeValue;
3428
3429                 // Traverse everything else, except comment nodes
3430                 } else if ( elem.nodeType !== 8 ) {
3431                         ret += getText( elem.childNodes );
3432                 }
3433         }
3434
3435         return ret;
3436 }
3437
3438 // Check to see if the browser returns elements by name when
3439 // querying by getElementById (and provide a workaround)
3440 (function(){
3441         // We're going to inject a fake input element with a specified name
3442         var form = document.createElement("div"),
3443                 id = "script" + (new Date).getTime();
3444         form.innerHTML = "<a name='" + id + "'/>";
3445
3446         // Inject it into the root element, check its status, and remove it quickly
3447         var root = document.documentElement;
3448         root.insertBefore( form, root.firstChild );
3449
3450         // The workaround has to do additional checks after a getElementById
3451         // Which slows things down for other browsers (hence the branching)
3452         if ( document.getElementById( id ) ) {
3453                 Expr.find.ID = function(match, context, isXML){
3454                         if ( typeof context.getElementById !== "undefined" && !isXML ) {
3455                                 var m = context.getElementById(match[1]);
3456                                 return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
3457                         }
3458                 };
3459
3460                 Expr.filter.ID = function(elem, match){
3461                         var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
3462                         return elem.nodeType === 1 && node && node.nodeValue === match;
3463                 };
3464         }
3465
3466         root.removeChild( form );
3467         root = form = null; // release memory in IE
3468 })();
3469
3470 (function(){
3471         // Check to see if the browser returns only elements
3472         // when doing getElementsByTagName("*")
3473
3474         // Create a fake element
3475         var div = document.createElement("div");
3476         div.appendChild( document.createComment("") );
3477
3478         // Make sure no comments are found
3479         if ( div.getElementsByTagName("*").length > 0 ) {
3480                 Expr.find.TAG = function(match, context){
3481                         var results = context.getElementsByTagName(match[1]);
3482
3483                         // Filter out possible comments
3484                         if ( match[1] === "*" ) {
3485                                 var tmp = [];
3486
3487                                 for ( var i = 0; results[i]; i++ ) {
3488                                         if ( results[i].nodeType === 1 ) {
3489                                                 tmp.push( results[i] );
3490                                         }
3491                                 }
3492
3493                                 results = tmp;
3494                         }
3495
3496                         return results;
3497                 };
3498         }
3499
3500         // Check to see if an attribute returns normalized href attributes
3501         div.innerHTML = "<a href='#'></a>";
3502         if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
3503                         div.firstChild.getAttribute("href") !== "#" ) {
3504                 Expr.attrHandle.href = function(elem){
3505                         return elem.getAttribute("href", 2);
3506                 };
3507         }
3508
3509         div = null; // release memory in IE
3510 })();
3511
3512 if ( document.querySelectorAll ) {
3513         (function(){
3514                 var oldSizzle = Sizzle, div = document.createElement("div");
3515                 div.innerHTML = "<p class='TEST'></p>";
3516
3517                 // Safari can't handle uppercase or unicode characters when
3518                 // in quirks mode.
3519                 if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
3520                         return;
3521                 }
3522         
3523                 Sizzle = function(query, context, extra, seed){
3524                         context = context || document;
3525
3526                         // Only use querySelectorAll on non-XML documents
3527                         // (ID selectors don't work in non-HTML documents)
3528                         if ( !seed && context.nodeType === 9 && !isXML(context) ) {
3529                                 try {
3530                                         return makeArray( context.querySelectorAll(query), extra );
3531                                 } catch(e){}
3532                         }
3533                 
3534                         return oldSizzle(query, context, extra, seed);
3535                 };
3536
3537                 for ( var prop in oldSizzle ) {
3538                         Sizzle[ prop ] = oldSizzle[ prop ];
3539                 }
3540
3541                 div = null; // release memory in IE
3542         })();
3543 }
3544
3545 (function(){
3546         var div = document.createElement("div");
3547
3548         div.innerHTML = "<div class='test e'></div><div class='test'></div>";
3549
3550         // Opera can't find a second classname (in 9.6)
3551         // Also, make sure that getElementsByClassName actually exists
3552         if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
3553                 return;
3554         }
3555
3556         // Safari caches class attributes, doesn't catch changes (in 3.2)
3557         div.lastChild.className = "e";
3558
3559         if ( div.getElementsByClassName("e").length === 1 ) {
3560                 return;
3561         }
3562         
3563         Expr.order.splice(1, 0, "CLASS");
3564         Expr.find.CLASS = function(match, context, isXML) {
3565                 if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
3566                         return context.getElementsByClassName(match[1]);
3567                 }
3568         };
3569
3570         div = null; // release memory in IE
3571 })();
3572
3573 function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
3574         for ( var i = 0, l = checkSet.length; i < l; i++ ) {
3575                 var elem = checkSet[i];
3576                 if ( elem ) {
3577                         elem = elem[dir];
3578                         var match = false;
3579
3580                         while ( elem ) {
3581                                 if ( elem.sizcache === doneName ) {
3582                                         match = checkSet[elem.sizset];
3583                                         break;
3584                                 }
3585
3586                                 if ( elem.nodeType === 1 && !isXML ){
3587                                         elem.sizcache = doneName;
3588                                         elem.sizset = i;
3589                                 }
3590
3591                                 if ( elem.nodeName.toLowerCase() === cur ) {
3592                                         match = elem;
3593                                         break;
3594                                 }
3595
3596                                 elem = elem[dir];
3597                         }
3598
3599                         checkSet[i] = match;
3600                 }
3601         }
3602 }
3603
3604 function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
3605         for ( var i = 0, l = checkSet.length; i < l; i++ ) {
3606                 var elem = checkSet[i];
3607                 if ( elem ) {
3608                         elem = elem[dir];
3609                         var match = false;
3610
3611                         while ( elem ) {
3612                                 if ( elem.sizcache === doneName ) {
3613                                         match = checkSet[elem.sizset];
3614                                         break;
3615                                 }
3616
3617                                 if ( elem.nodeType === 1 ) {
3618                                         if ( !isXML ) {
3619                                                 elem.sizcache = doneName;
3620                                                 elem.sizset = i;
3621                                         }
3622                                         if ( typeof cur !== "string" ) {
3623                                                 if ( elem === cur ) {
3624                                                         match = true;
3625                                                         break;
3626                                                 }
3627
3628                                         } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
3629                                                 match = elem;
3630                                                 break;
3631                                         }
3632                                 }
3633
3634                                 elem = elem[dir];
3635                         }
3636
3637                         checkSet[i] = match;
3638                 }
3639         }
3640 }
3641
3642 var contains = document.compareDocumentPosition ? function(a, b){
3643         return !!(a.compareDocumentPosition(b) & 16);
3644 } : function(a, b){
3645         return a !== b && (a.contains ? a.contains(b) : true);
3646 };
3647
3648 var isXML = function(elem){
3649         // documentElement is verified for cases where it doesn't yet exist
3650         // (such as loading iframes in IE - #4833) 
3651         var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
3652         return documentElement ? documentElement.nodeName !== "HTML" : false;
3653 };
3654
3655 var posProcess = function(selector, context){
3656         var tmpSet = [], later = "", match,
3657                 root = context.nodeType ? [context] : context;
3658
3659         // Position selectors must be done after the filter
3660         // And so must :not(positional) so we move all PSEUDOs to the end
3661         while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
3662                 later += match[0];
3663                 selector = selector.replace( Expr.match.PSEUDO, "" );
3664         }
3665
3666         selector = Expr.relative[selector] ? selector + "*" : selector;
3667
3668         for ( var i = 0, l = root.length; i < l; i++ ) {
3669                 Sizzle( selector, root[i], tmpSet );
3670         }
3671
3672         return Sizzle.filter( later, tmpSet );
3673 };
3674
3675 // EXPOSE
3676 jQuery.find = Sizzle;
3677 jQuery.expr = Sizzle.selectors;
3678 jQuery.expr[":"] = jQuery.expr.filters;
3679 jQuery.unique = Sizzle.uniqueSort;
3680 jQuery.text = getText;
3681 jQuery.isXMLDoc = isXML;
3682 jQuery.contains = contains;
3683
3684 return;
3685
3686 window.Sizzle = Sizzle;
3687
3688 })();
3689 var runtil = /Until$/,
3690         rparentsprev = /^(?:parents|prevUntil|prevAll)/,
3691         // Note: This RegExp should be improved, or likely pulled from Sizzle
3692         rmultiselector = /,/,
3693         slice = Array.prototype.slice;
3694
3695 // Implement the identical functionality for filter and not
3696 var winnow = function( elements, qualifier, keep ) {
3697         if ( jQuery.isFunction( qualifier ) ) {
3698                 return jQuery.grep(elements, function( elem, i ) {
3699                         return !!qualifier.call( elem, i, elem ) === keep;
3700                 });
3701
3702         } else if ( qualifier.nodeType ) {
3703                 return jQuery.grep(elements, function( elem, i ) {
3704                         return (elem === qualifier) === keep;
3705                 });
3706
3707         } else if ( typeof qualifier === "string" ) {
3708                 var filtered = jQuery.grep(elements, function( elem ) {
3709                         return elem.nodeType === 1;
3710                 });
3711
3712                 if ( isSimple.test( qualifier ) ) {
3713                         return jQuery.filter(qualifier, filtered, !keep);
3714                 } else {
3715                         qualifier = jQuery.filter( qualifier, filtered );
3716                 }
3717         }
3718
3719         return jQuery.grep(elements, function( elem, i ) {
3720                 return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
3721         });
3722 };
3723
3724 jQuery.fn.extend({
3725         find: function( selector ) {
3726                 var ret = this.pushStack( "", "find", selector ), length = 0;
3727
3728                 for ( var i = 0, l = this.length; i < l; i++ ) {
3729                         length = ret.length;
3730                         jQuery.find( selector, this[i], ret );
3731
3732                         if ( i > 0 ) {
3733                                 // Make sure that the results are unique
3734                                 for ( var n = length; n < ret.length; n++ ) {
3735                                         for ( var r = 0; r < length; r++ ) {
3736                                                 if ( ret[r] === ret[n] ) {
3737                                                         ret.splice(n--, 1);
3738                                                         break;
3739                                                 }
3740                                         }
3741                                 }
3742                         }
3743                 }
3744
3745                 return ret;
3746         },
3747
3748         has: function( target ) {
3749                 var targets = jQuery( target );
3750                 return this.filter(function() {
3751                         for ( var i = 0, l = targets.length; i < l; i++ ) {
3752                                 if ( jQuery.contains( this, targets[i] ) ) {
3753                                         return true;
3754                                 }
3755                         }
3756                 });
3757         },
3758
3759         not: function( selector ) {
3760                 return this.pushStack( winnow(this, selector, false), "not", selector);
3761         },
3762
3763         filter: function( selector ) {
3764                 return this.pushStack( winnow(this, selector, true), "filter", selector );
3765         },
3766         
3767         is: function( selector ) {
3768                 return !!selector && jQuery.filter( selector, this ).length > 0;
3769         },
3770
3771         closest: function( selectors, context ) {
3772                 if ( jQuery.isArray( selectors ) ) {
3773                         var ret = [], cur = this[0], match, matches = {}, selector;
3774
3775                         if ( cur && selectors.length ) {
3776                                 for ( var i = 0, l = selectors.length; i < l; i++ ) {
3777                                         selector = selectors[i];
3778
3779                                         if ( !matches[selector] ) {
3780                                                 matches[selector] = jQuery.expr.match.POS.test( selector ) ? 
3781                                                         jQuery( selector, context || this.context ) :
3782                                                         selector;
3783                                         }
3784                                 }
3785
3786                                 while ( cur && cur.ownerDocument && cur !== context ) {
3787                                         for ( selector in matches ) {
3788                                                 match = matches[selector];
3789
3790                                                 if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
3791                                                         ret.push({ selector: selector, elem: cur });
3792                                                         delete matches[selector];
3793                                                 }
3794                                         }
3795                                         cur = cur.parentNode;
3796                                 }
3797                         }
3798
3799                         return ret;
3800                 }
3801
3802                 var pos = jQuery.expr.match.POS.test( selectors ) ? 
3803                         jQuery( selectors, context || this.context ) : null;
3804
3805                 return this.map(function( i, cur ) {
3806                         while ( cur && cur.ownerDocument && cur !== context ) {
3807                                 if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) {
3808                                         return cur;
3809                                 }
3810                                 cur = cur.parentNode;
3811                         }
3812                         return null;
3813                 });
3814         },
3815         
3816         // Determine the position of an element within
3817         // the matched set of elements
3818         index: function( elem ) {
3819                 if ( !elem || typeof elem === "string" ) {
3820                         return jQuery.inArray( this[0],
3821                                 // If it receives a string, the selector is used
3822                                 // If it receives nothing, the siblings are used
3823                                 elem ? jQuery( elem ) : this.parent().children() );
3824                 }
3825                 // Locate the position of the desired element
3826                 return jQuery.inArray(
3827                         // If it receives a jQuery object, the first element is used
3828                         elem.jquery ? elem[0] : elem, this );
3829         },
3830
3831         add: function( selector, context ) {
3832                 var set = typeof selector === "string" ?
3833                                 jQuery( selector, context || this.context ) :
3834                                 jQuery.makeArray( selector ),
3835                         all = jQuery.merge( this.get(), set );
3836
3837                 return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
3838                         all :
3839                         jQuery.unique( all ) );
3840         },
3841
3842         andSelf: function() {
3843                 return this.add( this.prevObject );
3844         }
3845 });
3846
3847 // A painfully simple check to see if an element is disconnected
3848 // from a document (should be improved, where feasible).
3849 function isDisconnected( node ) {
3850         return !node || !node.parentNode || node.parentNode.nodeType === 11;
3851 }
3852
3853 jQuery.each({
3854         parent: function( elem ) {
3855                 var parent = elem.parentNode;
3856                 return parent && parent.nodeType !== 11 ? parent : null;
3857         },
3858         parents: function( elem ) {
3859                 return jQuery.dir( elem, "parentNode" );
3860         },
3861         parentsUntil: function( elem, i, until ) {
3862                 return jQuery.dir( elem, "parentNode", until );
3863         },
3864         next: function( elem ) {
3865                 return jQuery.nth( elem, 2, "nextSibling" );
3866         },
3867         prev: function( elem ) {
3868                 return jQuery.nth( elem, 2, "previousSibling" );
3869         },
3870         nextAll: function( elem ) {
3871                 return jQuery.dir( elem, "nextSibling" );
3872         },
3873         prevAll: function( elem ) {
3874                 return jQuery.dir( elem, "previousSibling" );
3875         },
3876         nextUntil: function( elem, i, until ) {
3877                 return jQuery.dir( elem, "nextSibling", until );
3878         },
3879         prevUntil: function( elem, i, until ) {
3880                 return jQuery.dir( elem, "previousSibling", until );
3881         },
3882         siblings: function( elem ) {
3883                 return jQuery.sibling( elem.parentNode.firstChild, elem );
3884         },
3885         children: function( elem ) {
3886                 return jQuery.sibling( elem.firstChild );
3887         },
3888         contents: function( elem ) {
3889                 return jQuery.nodeName( elem, "iframe" ) ?
3890                         elem.contentDocument || elem.contentWindow.document :
3891                         jQuery.makeArray( elem.childNodes );
3892         }
3893 }, function( name, fn ) {
3894         jQuery.fn[ name ] = function( until, selector ) {
3895                 var ret = jQuery.map( this, fn, until );
3896                 
3897                 if ( !runtil.test( name ) ) {
3898                         selector = until;
3899                 }
3900
3901                 if ( selector && typeof selector === "string" ) {
3902                         ret = jQuery.filter( selector, ret );
3903                 }
3904
3905                 ret = this.length > 1 ? jQuery.unique( ret ) : ret;
3906
3907                 if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
3908                         ret = ret.reverse();
3909                 }
3910
3911                 return this.pushStack( ret, name, slice.call(arguments).join(",") );
3912         };
3913 });
3914
3915 jQuery.extend({
3916         filter: function( expr, elems, not ) {
3917                 if ( not ) {
3918                         expr = ":not(" + expr + ")";
3919                 }
3920
3921                 return jQuery.find.matches(expr, elems);
3922         },
3923         
3924         dir: function( elem, dir, until ) {
3925                 var matched = [], cur = elem[dir];
3926                 while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
3927                         if ( cur.nodeType === 1 ) {
3928                                 matched.push( cur );
3929                         }
3930                         cur = cur[dir];
3931                 }
3932                 return matched;
3933         },
3934
3935         nth: function( cur, result, dir, elem ) {
3936                 result = result || 1;
3937                 var num = 0;
3938
3939                 for ( ; cur; cur = cur[dir] ) {
3940                         if ( cur.nodeType === 1 && ++num === result ) {
3941                                 break;
3942                         }
3943                 }
3944
3945                 return cur;
3946         },
3947
3948         sibling: function( n, elem ) {
3949                 var r = [];
3950
3951                 for ( ; n; n = n.nextSibling ) {
3952                         if ( n.nodeType === 1 && n !== elem ) {
3953                                 r.push( n );
3954                         }
3955                 }
3956
3957                 return r;
3958         }
3959 });
3960 var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
3961         rleadingWhitespace = /^\s+/,
3962         rxhtmlTag = /(<([\w:]+)[^>]*?)\/>/g,
3963         rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,
3964         rtagName = /<([\w:]+)/,
3965         rtbody = /<tbody/i,
3966         rhtml = /<|&#?\w+;/,
3967         rnocache = /<script|<object|<embed|<option|<style/i,
3968         rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,  // checked="checked" or checked (html5)
3969         fcloseTag = function( all, front, tag ) {
3970                 return rselfClosing.test( tag ) ?
3971                         all :
3972                         front + "></" + tag + ">";
3973         },
3974         wrapMap = {
3975                 option: [ 1, "<select multiple='multiple'>", "</select>" ],
3976                 legend: [ 1, "<fieldset>", "</fieldset>" ],
3977                 thead: [ 1, "<table>", "</table>" ],
3978                 tr: [ 2, "<table><tbody>", "</tbody></table>" ],
3979                 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
3980                 col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
3981                 area: [ 1, "<map>", "</map>" ],
3982                 _default: [ 0, "", "" ]
3983         };
3984
3985 wrapMap.optgroup = wrapMap.option;
3986 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
3987 wrapMap.th = wrapMap.td;
3988
3989 // IE can't serialize <link> and <script> tags normally
3990 if ( !jQuery.support.htmlSerialize ) {
3991         wrapMap._default = [ 1, "div<div>", "</div>" ];
3992 }
3993
3994 jQuery.fn.extend({
3995         text: function( text ) {
3996                 if ( jQuery.isFunction(text) ) {
3997                         return this.each(function(i) {
3998                                 var self = jQuery(this);
3999                                 self.text( text.call(this, i, self.text()) );
4000                         });
4001                 }
4002
4003                 if ( typeof text !== "object" && text !== undefined ) {
4004                         return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
4005                 }
4006
4007                 return jQuery.text( this );
4008         },
4009
4010         wrapAll: function( html ) {
4011                 if ( jQuery.isFunction( html ) ) {
4012                         return this.each(function(i) {
4013                                 jQuery(this).wrapAll( html.call(this, i) );
4014                         });
4015                 }
4016
4017                 if ( this[0] ) {
4018                         // The elements to wrap the target around
4019                         var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
4020
4021                         if ( this[0].parentNode ) {
4022                                 wrap.insertBefore( this[0] );
4023                         }
4024
4025                         wrap.map(function() {
4026                                 var elem = this;
4027
4028                                 while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
4029                                         elem = elem.firstChild;
4030                                 }
4031
4032                                 return elem;
4033                         }).append(this);
4034                 }
4035
4036                 return this;
4037         },
4038
4039         wrapInner: function( html ) {
4040                 if ( jQuery.isFunction( html ) ) {
4041                         return this.each(function(i) {
4042                                 jQuery(this).wrapInner( html.call(this, i) );
4043                         });
4044                 }
4045
4046                 return this.each(function() {
4047                         var self = jQuery( this ), contents = self.contents();
4048
4049                         if ( contents.length ) {
4050                                 contents.wrapAll( html );
4051
4052                         } else {
4053                                 self.append( html );
4054                         }
4055                 });
4056         },
4057
4058         wrap: function( html ) {
4059                 return this.each(function() {
4060                         jQuery( this ).wrapAll( html );
4061                 });
4062         },
4063
4064         unwrap: function() {
4065                 return this.parent().each(function() {
4066                         if ( !jQuery.nodeName( this, "body" ) ) {
4067                                 jQuery( this ).replaceWith( this.childNodes );
4068                         }
4069                 }).end();
4070         },
4071
4072         append: function() {
4073                 return this.domManip(arguments, true, function( elem ) {
4074                         if ( this.nodeType === 1 ) {
4075                                 this.appendChild( elem );
4076                         }
4077                 });
4078         },
4079
4080         prepend: function() {
4081                 return this.domManip(arguments, true, function( elem ) {
4082                         if ( this.nodeType === 1 ) {
4083                                 this.insertBefore( elem, this.firstChild );
4084                         }
4085                 });
4086         },
4087
4088         before: function() {
4089                 if ( this[0] && this[0].parentNode ) {
4090                         return this.domManip(arguments, false, function( elem ) {
4091                                 this.parentNode.insertBefore( elem, this );
4092                         });
4093                 } else if ( arguments.length ) {
4094                         var set = jQuery(arguments[0]);
4095                         set.push.apply( set, this.toArray() );
4096                         return this.pushStack( set, "before", arguments );
4097                 }
4098         },
4099
4100         after: function() {
4101                 if ( this[0] && this[0].parentNode ) {
4102                         return this.domManip(arguments, false, function( elem ) {
4103                                 this.parentNode.insertBefore( elem, this.nextSibling );
4104                         });
4105                 } else if ( arguments.length ) {
4106                         var set = this.pushStack( this, "after", arguments );
4107                         set.push.apply( set, jQuery(arguments[0]).toArray() );
4108                         return set;
4109                 }
4110         },
4111         
4112         // keepData is for internal use only--do not document
4113         remove: function( selector, keepData ) {
4114                 for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
4115                         if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
4116                                 if ( !keepData && elem.nodeType === 1 ) {
4117                                         jQuery.cleanData( elem.getElementsByTagName("*") );
4118                                         jQuery.cleanData( [ elem ] );
4119                                 }
4120
4121                                 if ( elem.parentNode ) {
4122                                          elem.parentNode.removeChild( elem );
4123                                 }
4124                         }
4125                 }
4126                 
4127                 return this;
4128         },
4129
4130         empty: function() {
4131                 for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
4132                         // Remove element nodes and prevent memory leaks
4133                         if ( elem.nodeType === 1 ) {
4134                                 jQuery.cleanData( elem.getElementsByTagName("*") );
4135                         }
4136
4137                         // Remove any remaining nodes
4138                         while ( elem.firstChild ) {
4139                                 elem.removeChild( elem.firstChild );
4140                         }
4141                 }
4142                 
4143                 return this;
4144         },
4145
4146         clone: function( events ) {
4147                 // Do the clone
4148                 var ret = this.map(function() {
4149                         if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
4150                                 // IE copies events bound via attachEvent when
4151                                 // using cloneNode. Calling detachEvent on the
4152                                 // clone will also remove the events from the orignal
4153                                 // In order to get around this, we use innerHTML.
4154                                 // Unfortunately, this means some modifications to
4155                                 // attributes in IE that are actually only stored
4156                                 // as properties will not be copied (such as the
4157                                 // the name attribute on an input).
4158                                 var html = this.outerHTML, ownerDocument = this.ownerDocument;
4159                                 if ( !html ) {
4160                                         var div = ownerDocument.createElement("div");
4161                                         div.appendChild( this.cloneNode(true) );
4162                                         html = div.innerHTML;
4163                                 }
4164
4165                                 return jQuery.clean([html.replace(rinlinejQuery, "")
4166                                         // Handle the case in IE 8 where action=/test/> self-closes a tag
4167                                         .replace(/=([^="'>\s]+\/)>/g, '="$1">')
4168                                         .replace(rleadingWhitespace, "")], ownerDocument)[0];
4169                         } else {
4170                                 return this.cloneNode(true);
4171                         }
4172                 });
4173
4174                 // Copy the events from the original to the clone
4175                 if ( events === true ) {
4176                         cloneCopyEvent( this, ret );
4177                         cloneCopyEvent( this.find("*"), ret.find("*") );
4178                 }
4179
4180                 // Return the cloned set
4181                 return ret;
4182         },
4183
4184         html: function( value ) {
4185                 if ( value === undefined ) {
4186                         return this[0] && this[0].nodeType === 1 ?
4187                                 this[0].innerHTML.replace(rinlinejQuery, "") :
4188                                 null;
4189
4190                 // See if we can take a shortcut and just use innerHTML
4191                 } else if ( typeof value === "string" && !rnocache.test( value ) &&
4192                         (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
4193                         !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
4194
4195                         value = value.replace(rxhtmlTag, fcloseTag);
4196
4197                         try {
4198                                 for ( var i = 0, l = this.length; i < l; i++ ) {
4199                                         // Remove element nodes and prevent memory leaks
4200                                         if ( this[i].nodeType === 1 ) {
4201                                                 jQuery.cleanData( this[i].getElementsByTagName("*") );
4202                                                 this[i].innerHTML = value;
4203                                         }
4204                                 }
4205
4206                         // If using innerHTML throws an exception, use the fallback method
4207                         } catch(e) {
4208                                 this.empty().append( value );
4209                         }
4210
4211                 } else if ( jQuery.isFunction( value ) ) {
4212                         this.each(function(i){
4213                                 var self = jQuery(this), old = self.html();
4214                                 self.empty().append(function(){
4215                                         return value.call( this, i, old );
4216                                 });
4217                         });
4218
4219                 } else {
4220                         this.empty().append( value );
4221                 }
4222
4223                 return this;
4224         },
4225
4226         replaceWith: function( value ) {
4227                 if ( this[0] && this[0].parentNode ) {
4228                         // Make sure that the elements are removed from the DOM before they are inserted
4229                         // this can help fix replacing a parent with child elements
4230                         if ( jQuery.isFunction( value ) ) {
4231                                 return this.each(function(i) {
4232                                         var self = jQuery(this), old = self.html();
4233                                         self.replaceWith( value.call( this, i, old ) );
4234                                 });
4235                         }
4236
4237                         if ( typeof value !== "string" ) {
4238                                 value = jQuery(value).detach();
4239                         }
4240
4241                         return this.each(function() {
4242                                 var next = this.nextSibling, parent = this.parentNode;
4243
4244                                 jQuery(this).remove();
4245
4246                                 if ( next ) {
4247                                         jQuery(next).before( value );
4248                                 } else {
4249                                         jQuery(parent).append( value );
4250                                 }
4251                         });
4252                 } else {
4253                         return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
4254                 }
4255         },
4256
4257         detach: function( selector ) {
4258                 return this.remove( selector, true );
4259         },
4260
4261         domManip: function( args, table, callback ) {
4262                 var results, first, value = args[0], scripts = [], fragment, parent;
4263
4264                 // We can't cloneNode fragments that contain checked, in WebKit
4265                 if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
4266                         return this.each(function() {
4267                                 jQuery(this).domManip( args, table, callback, true );
4268                         });
4269                 }
4270
4271                 if ( jQuery.isFunction(value) ) {
4272                         return this.each(function(i) {
4273                                 var self = jQuery(this);
4274                                 args[0] = value.call(this, i, table ? self.html() : undefined);
4275                                 self.domManip( args, table, callback );
4276                         });
4277                 }
4278
4279                 if ( this[0] ) {
4280                         parent = value && value.parentNode;
4281
4282                         // If we're in a fragment, just use that instead of building a new one
4283                         if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
4284                                 results = { fragment: parent };
4285
4286                         } else {
4287                                 results = buildFragment( args, this, scripts );
4288                         }
4289                         
4290                         fragment = results.fragment;
4291                         
4292                         if ( fragment.childNodes.length === 1 ) {
4293                                 first = fragment = fragment.firstChild;
4294                         } else {
4295                                 first = fragment.firstChild;
4296                         }
4297
4298                         if ( first ) {
4299                                 table = table && jQuery.nodeName( first, "tr" );
4300
4301                                 for ( var i = 0, l = this.length; i < l; i++ ) {
4302                                         callback.call(
4303                                                 table ?
4304                                                         root(this[i], first) :
4305                                                         this[i],
4306                                                 i > 0 || results.cacheable || this.length > 1  ?
4307                                                         fragment.cloneNode(true) :
4308                                                         fragment
4309                                         );
4310                                 }
4311                         }
4312
4313                         if ( scripts.length ) {
4314                                 jQuery.each( scripts, evalScript );
4315                         }
4316                 }
4317
4318                 return this;
4319
4320                 function root( elem, cur ) {
4321                         return jQuery.nodeName(elem, "table") ?
4322                                 (elem.getElementsByTagName("tbody")[0] ||
4323                                 elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
4324                                 elem;
4325                 }
4326         }
4327 });
4328
4329 function cloneCopyEvent(orig, ret) {
4330         var i = 0;
4331
4332         ret.each(function() {
4333                 if ( this.nodeName !== (orig[i] && orig[i].nodeName) ) {
4334                         return;
4335                 }
4336
4337                 var oldData = jQuery.data( orig[i++] ), curData = jQuery.data( this, oldData ), events = oldData && oldData.events;
4338
4339                 if ( events ) {
4340                         delete curData.handle;
4341                         curData.events = {};
4342
4343                         for ( var type in events ) {
4344                                 for ( var handler in events[ type ] ) {
4345                                         jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
4346                                 }
4347                         }
4348                 }
4349         });
4350 }
4351
4352 function buildFragment( args, nodes, scripts ) {
4353         var fragment, cacheable, cacheresults,
4354                 doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
4355
4356         // Only cache "small" (1/2 KB) strings that are associated with the main document
4357         // Cloning options loses the selected state, so don't cache them
4358         // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
4359         // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
4360         if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
4361                 !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
4362
4363                 cacheable = true;
4364                 cacheresults = jQuery.fragments[ args[0] ];
4365                 if ( cacheresults ) {
4366                         if ( cacheresults !== 1 ) {
4367                                 fragment = cacheresults;
4368                         }
4369                 }
4370         }
4371
4372         if ( !fragment ) {
4373                 fragment = doc.createDocumentFragment();
4374                 jQuery.clean( args, doc, fragment, scripts );
4375         }
4376
4377         if ( cacheable ) {
4378                 jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
4379         }
4380
4381         return { fragment: fragment, cacheable: cacheable };
4382 }
4383
4384 jQuery.fragments = {};
4385
4386 jQuery.each({
4387         appendTo: "append",
4388         prependTo: "prepend",
4389         insertBefore: "before",
4390         insertAfter: "after",
4391         replaceAll: "replaceWith"
4392 }, function( name, original ) {
4393         jQuery.fn[ name ] = function( selector ) {
4394                 var ret = [], insert = jQuery( selector ),
4395                         parent = this.length === 1 && this[0].parentNode;
4396                 
4397                 if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
4398                         insert[ original ]( this[0] );
4399                         return this;
4400                         
4401                 } else {
4402                         for ( var i = 0, l = insert.length; i < l; i++ ) {
4403                                 var elems = (i > 0 ? this.clone(true) : this).get();
4404                                 jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
4405                                 ret = ret.concat( elems );
4406                         }
4407                 
4408                         return this.pushStack( ret, name, insert.selector );
4409                 }
4410         };
4411 });
4412
4413 jQuery.extend({
4414         clean: function( elems, context, fragment, scripts ) {
4415                 context = context || document;
4416
4417                 // !context.createElement fails in IE with an error but returns typeof 'object'
4418                 if ( typeof context.createElement === "undefined" ) {
4419                         context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
4420                 }
4421
4422                 var ret = [];
4423
4424                 for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
4425                         if ( typeof elem === "number" ) {
4426                                 elem += "";
4427                         }
4428
4429                         if ( !elem ) {
4430                                 continue;
4431                         }
4432
4433                         // Convert html string into DOM nodes
4434                         if ( typeof elem === "string" && !rhtml.test( elem ) ) {
4435                                 elem = context.createTextNode( elem );
4436
4437                         } else if ( typeof elem === "string" ) {
4438                                 // Fix "XHTML"-style tags in all browsers
4439                                 elem = elem.replace(rxhtmlTag, fcloseTag);
4440
4441                                 // Trim whitespace, otherwise indexOf won't work as expected
4442                                 var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
4443                                         wrap = wrapMap[ tag ] || wrapMap._default,
4444                                         depth = wrap[0],
4445                                         div = context.createElement("div");
4446
4447                                 // Go to html and back, then peel off extra wrappers
4448                                 div.innerHTML = wrap[1] + elem + wrap[2];
4449
4450                                 // Move to the right depth
4451                                 while ( depth-- ) {
4452                                         div = div.lastChild;
4453                                 }
4454
4455                                 // Remove IE's autoinserted <tbody> from table fragments
4456                                 if ( !jQuery.support.tbody ) {
4457
4458                                         // String was a <table>, *may* have spurious <tbody>
4459                                         var hasBody = rtbody.test(elem),
4460                                                 tbody = tag === "table" && !hasBody ?
4461                                                         div.firstChild && div.firstChild.childNodes :
4462
4463                                                         // String was a bare <thead> or <tfoot>
4464                                                         wrap[1] === "<table>" && !hasBody ?
4465                                                                 div.childNodes :
4466                                                                 [];
4467
4468                                         for ( var j = tbody.length - 1; j >= 0 ; --j ) {
4469                                                 if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
4470                                                         tbody[ j ].parentNode.removeChild( tbody[ j ] );
4471                                                 }
4472                                         }
4473
4474                                 }
4475
4476                                 // IE completely kills leading whitespace when innerHTML is used
4477                                 if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
4478                                         div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
4479                                 }
4480
4481                                 elem = div.childNodes;
4482                         }
4483
4484                         if ( elem.nodeType ) {
4485                                 ret.push( elem );
4486                         } else {
4487                                 ret = jQuery.merge( ret, elem );
4488                         }
4489                 }
4490
4491                 if ( fragment ) {
4492                         for ( var i = 0; ret[i]; i++ ) {
4493                                 if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
4494                                         scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
4495                                 
4496                                 } else {
4497                                         if ( ret[i].nodeType === 1 ) {
4498                                                 ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
4499                                         }
4500                                         fragment.appendChild( ret[i] );
4501                                 }
4502                         }
4503                 }
4504
4505                 return ret;
4506         },
4507         
4508         cleanData: function( elems ) {
4509                 var data, id, cache = jQuery.cache,
4510                         special = jQuery.event.special,
4511                         deleteExpando = jQuery.support.deleteExpando;
4512                 
4513                 for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
4514                         id = elem[ jQuery.expando ];
4515                         
4516                         if ( id ) {
4517                                 data = cache[ id ];
4518                                 
4519                                 if ( data.events ) {
4520                                         for ( var type in data.events ) {
4521                                                 if ( special[ type ] ) {
4522                                                         jQuery.event.remove( elem, type );
4523
4524                                                 } else {
4525                                                         removeEvent( elem, type, data.handle );
4526                                                 }
4527                                         }
4528                                 }
4529                                 
4530                                 if ( deleteExpando ) {
4531                                         delete elem[ jQuery.expando ];
4532
4533                                 } else if ( elem.removeAttribute ) {
4534                                         elem.removeAttribute( jQuery.expando );
4535                                 }
4536                                 
4537                                 delete cache[ id ];
4538                         }
4539                 }
4540         }
4541 });
4542 // exclude the following css properties to add px
4543 var rexclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
4544         ralpha = /alpha\([^)]*\)/,
4545         ropacity = /opacity=([^)]*)/,
4546         rfloat = /float/i,
4547         rdashAlpha = /-([a-z])/ig,
4548         rupper = /([A-Z])/g,
4549         rnumpx = /^-?\d+(?:px)?$/i,
4550         rnum = /^-?\d/,
4551
4552         cssShow = { position: "absolute", visibility: "hidden", display:"block" },
4553         cssWidth = [ "Left", "Right" ],
4554         cssHeight = [ "Top", "Bottom" ],
4555
4556         // cache check for defaultView.getComputedStyle
4557         getComputedStyle = document.defaultView && document.defaultView.getComputedStyle,
4558         // normalize float css property
4559         styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat",
4560         fcamelCase = function( all, letter ) {
4561                 return letter.toUpperCase();
4562         };
4563
4564 jQuery.fn.css = function( name, value ) {
4565         return access( this, name, value, true, function( elem, name, value ) {
4566                 if ( value === undefined ) {
4567                         return jQuery.curCSS( elem, name );
4568                 }
4569                 
4570                 if ( typeof value === "number" && !rexclude.test(name) ) {
4571                         value += "px";
4572                 }
4573
4574                 jQuery.style( elem, name, value );
4575         });
4576 };
4577
4578 jQuery.extend({
4579         style: function( elem, name, value ) {
4580                 // don't set styles on text and comment nodes
4581                 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
4582                         return undefined;
4583                 }
4584
4585                 // ignore negative width and height values #1599
4586                 if ( (name === "width" || name === "height") && parseFloat(value) < 0 ) {
4587                         value = undefined;
4588                 }
4589
4590                 var style = elem.style || elem, set = value !== undefined;
4591
4592                 // IE uses filters for opacity
4593                 if ( !jQuery.support.opacity && name === "opacity" ) {
4594                         if ( set ) {
4595                                 // IE has trouble with opacity if it does not have layout
4596                                 // Force it by setting the zoom level
4597                                 style.zoom = 1;
4598
4599                                 // Set the alpha filter to set the opacity
4600                                 var opacity = parseInt( value, 10 ) + "" === "NaN" ? "" : "alpha(opacity=" + value * 100 + ")";
4601                                 var filter = style.filter || jQuery.curCSS( elem, "filter" ) || "";
4602                                 style.filter = ralpha.test(filter) ? filter.replace(ralpha, opacity) : opacity;
4603                         }
4604
4605                         return style.filter && style.filter.indexOf("opacity=") >= 0 ?
4606                                 (parseFloat( ropacity.exec(style.filter)[1] ) / 100) + "":
4607                                 "";
4608                 }
4609
4610                 // Make sure we're using the right name for getting the float value
4611                 if ( rfloat.test( name ) ) {
4612                         name = styleFloat;
4613                 }
4614
4615                 name = name.replace(rdashAlpha, fcamelCase);
4616
4617                 if ( set ) {
4618                         style[ name ] = value;
4619                 }
4620
4621                 return style[ name ];
4622         },
4623
4624         css: function( elem, name, force, extra ) {
4625                 if ( name === "width" || name === "height" ) {
4626                         var val, props = cssShow, which = name === "width" ? cssWidth : cssHeight;
4627
4628                         function getWH() {
4629                                 val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
4630
4631                                 if ( extra === "border" ) {
4632                                         return;
4633                                 }
4634
4635                                 jQuery.each( which, function() {
4636                                         if ( !extra ) {
4637                                                 val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
4638                                         }
4639
4640                                         if ( extra === "margin" ) {
4641                                                 val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
4642                                         } else {
4643                                                 val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
4644                                         }
4645                                 });
4646                         }
4647
4648                         if ( elem.offsetWidth !== 0 ) {
4649                                 getWH();
4650                         } else {
4651                                 jQuery.swap( elem, props, getWH );
4652                         }
4653
4654                         return Math.max(0, Math.round(val));
4655                 }
4656
4657                 return jQuery.curCSS( elem, name, force );
4658         },
4659
4660         curCSS: function( elem, name, force ) {
4661                 var ret, style = elem.style, filter;
4662
4663                 // IE uses filters for opacity
4664                 if ( !jQuery.support.opacity && name === "opacity" && elem.currentStyle ) {
4665                         ret = ropacity.test(elem.currentStyle.filter || "") ?
4666                                 (parseFloat(RegExp.$1) / 100) + "" :
4667                                 "";
4668
4669                         return ret === "" ?
4670                                 "1" :
4671                                 ret;
4672                 }
4673
4674                 // Make sure we're using the right name for getting the float value
4675                 if ( rfloat.test( name ) ) {
4676                         name = styleFloat;
4677                 }
4678
4679                 if ( !force && style && style[ name ] ) {
4680                         ret = style[ name ];
4681
4682                 } else if ( getComputedStyle ) {
4683
4684                         // Only "float" is needed here
4685                         if ( rfloat.test( name ) ) {
4686                                 name = "float";
4687                         }
4688
4689                         name = name.replace( rupper, "-$1" ).toLowerCase();
4690
4691                         var defaultView = elem.ownerDocument.defaultView;
4692
4693                         if ( !defaultView ) {
4694                                 return null;
4695                         }
4696
4697                         var computedStyle = defaultView.getComputedStyle( elem, null );
4698
4699                         if ( computedStyle ) {
4700                                 ret = computedStyle.getPropertyValue( name );
4701                         }
4702
4703                         // We should always get a number back from opacity
4704                         if ( name === "opacity" && ret === "" ) {
4705                                 ret = "1";
4706                         }
4707
4708                 } else if ( elem.currentStyle ) {
4709                         var camelCase = name.replace(rdashAlpha, fcamelCase);
4710
4711                         ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
4712
4713                         // From the awesome hack by Dean Edwards
4714                         // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
4715
4716                         // If we're not dealing with a regular pixel number
4717                         // but a number that has a weird ending, we need to convert it to pixels
4718                         if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
4719                                 // Remember the original values
4720                                 var left = style.left, rsLeft = elem.runtimeStyle.left;
4721
4722                                 // Put in the new values to get a computed value out
4723                                 elem.runtimeStyle.left = elem.currentStyle.left;
4724                                 style.left = camelCase === "fontSize" ? "1em" : (ret || 0);
4725                                 ret = style.pixelLeft + "px";
4726
4727                                 // Revert the changed values
4728                                 style.left = left;
4729                                 elem.runtimeStyle.left = rsLeft;
4730                         }
4731                 }
4732
4733                 return ret;
4734         },
4735
4736         // A method for quickly swapping in/out CSS properties to get correct calculations
4737         swap: function( elem, options, callback ) {
4738                 var old = {};
4739
4740                 // Remember the old values, and insert the new ones
4741                 for ( var name in options ) {
4742                         old[ name ] = elem.style[ name ];
4743                         elem.style[ name ] = options[ name ];
4744                 }
4745
4746                 callback.call( elem );
4747
4748                 // Revert the old values
4749                 for ( var name in options ) {
4750                         elem.style[ name ] = old[ name ];
4751                 }
4752         }
4753 });
4754
4755 if ( jQuery.expr && jQuery.expr.filters ) {
4756         jQuery.expr.filters.hidden = function( elem ) {
4757                 var width = elem.offsetWidth, height = elem.offsetHeight,
4758                         skip = elem.nodeName.toLowerCase() === "tr";
4759
4760                 return width === 0 && height === 0 && !skip ?
4761                         true :
4762                         width > 0 && height > 0 && !skip ?
4763                                 false :
4764                                 jQuery.curCSS(elem, "display") === "none";
4765         };
4766
4767         jQuery.expr.filters.visible = function( elem ) {
4768                 return !jQuery.expr.filters.hidden( elem );
4769         };
4770 }
4771 var jsc = now(),
4772         rscript = /<script(.|\s)*?\/script>/gi,
4773         rselectTextarea = /select|textarea/i,
4774         rinput = /color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,
4775         jsre = /=\?(&|$)/,
4776         rquery = /\?/,
4777         rts = /(\?|&)_=.*?(&|$)/,
4778         rurl = /^(\w+:)?\/\/([^\/?#]+)/,
4779         r20 = /%20/g,
4780
4781         // Keep a copy of the old load method
4782         _load = jQuery.fn.load;
4783
4784 jQuery.fn.extend({
4785         load: function( url, params, callback ) {
4786                 if ( typeof url !== "string" ) {
4787                         return _load.call( this, url );
4788
4789                 // Don't do a request if no elements are being requested
4790                 } else if ( !this.length ) {
4791                         return this;
4792                 }
4793
4794                 var off = url.indexOf(" ");
4795                 if ( off >= 0 ) {
4796                         var selector = url.slice(off, url.length);
4797                         url = url.slice(0, off);
4798                 }
4799
4800                 // Default to a GET request
4801                 var type = "GET";
4802
4803                 // If the second parameter was provided
4804                 if ( params ) {
4805                         // If it's a function
4806                         if ( jQuery.isFunction( params ) ) {
4807                                 // We assume that it's the callback
4808                                 callback = params;
4809                                 params = null;
4810
4811                         // Otherwise, build a param string
4812                         } else if ( typeof params === "object" ) {
4813                                 params = jQuery.param( params, jQuery.ajaxSettings.traditional );
4814                                 type = "POST";
4815                         }
4816                 }
4817
4818                 var self = this;
4819
4820                 // Request the remote document
4821                 jQuery.ajax({
4822                         url: url,
4823                         type: type,
4824                         dataType: "html",
4825                         data: params,
4826                         complete: function( res, status ) {
4827                                 // If successful, inject the HTML into all the matched elements
4828                                 if ( status === "success" || status === "notmodified" ) {
4829                                         // See if a selector was specified
4830                                         self.html( selector ?
4831                                                 // Create a dummy div to hold the results
4832                                                 jQuery("<div />")
4833                                                         // inject the contents of the document in, removing the scripts
4834                                                         // to avoid any 'Permission Denied' errors in IE
4835                                                         .append(res.responseText.replace(rscript, ""))
4836
4837                                                         // Locate the specified elements
4838                                                         .find(selector) :
4839
4840                                                 // If not, just inject the full result
4841                                                 res.responseText );
4842                                 }
4843
4844                                 if ( callback ) {
4845                                         self.each( callback, [res.responseText, status, res] );
4846                                 }
4847                         }
4848                 });
4849
4850                 return this;
4851         },
4852
4853         serialize: function() {
4854                 return jQuery.param(this.serializeArray());
4855         },
4856         serializeArray: function() {
4857                 return this.map(function() {
4858                         return this.elements ? jQuery.makeArray(this.elements) : this;
4859                 })
4860                 .filter(function() {
4861                         return this.name && !this.disabled &&
4862                                 (this.checked || rselectTextarea.test(this.nodeName) ||
4863                                         rinput.test(this.type));
4864                 })
4865                 .map(function( i, elem ) {
4866                         var val = jQuery(this).val();
4867
4868                         return val == null ?
4869                                 null :
4870                                 jQuery.isArray(val) ?
4871                                         jQuery.map( val, function( val, i ) {
4872                                                 return { name: elem.name, value: val };
4873                                         }) :
4874                                         { name: elem.name, value: val };
4875                 }).get();
4876         }
4877 });
4878
4879 // Attach a bunch of functions for handling common AJAX events
4880 jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function( i, o ) {
4881         jQuery.fn[o] = function( f ) {
4882                 return this.bind(o, f);
4883         };
4884 });
4885
4886 jQuery.extend({
4887
4888         get: function( url, data, callback, type ) {
4889                 // shift arguments if data argument was omited
4890                 if ( jQuery.isFunction( data ) ) {
4891                         type = type || callback;
4892                         callback = data;
4893                         data = null;
4894                 }
4895
4896                 return jQuery.ajax({
4897                         type: "GET",
4898                         url: url,
4899                         data: data,
4900                         success: callback,
4901                         dataType: type
4902                 });
4903         },
4904
4905         getScript: function( url, callback ) {
4906                 return jQuery.get(url, null, callback, "script");
4907         },
4908
4909         getJSON: function( url, data, callback ) {
4910                 return jQuery.get(url, data, callback, "json");
4911         },
4912
4913         post: function( url, data, callback, type ) {
4914                 // shift arguments if data argument was omited
4915                 if ( jQuery.isFunction( data ) ) {
4916                         type = type || callback;
4917                         callback = data;
4918                         data = {};
4919                 }
4920
4921                 return jQuery.ajax({
4922                         type: "POST",
4923                         url: url,
4924                         data: data,
4925                         success: callback,
4926                         dataType: type
4927                 });
4928         },
4929
4930         ajaxSetup: function( settings ) {
4931                 jQuery.extend( jQuery.ajaxSettings, settings );
4932         },
4933
4934         ajaxSettings: {
4935                 url: location.href,
4936                 global: true,
4937                 type: "GET",
4938                 contentType: "application/x-www-form-urlencoded",
4939                 processData: true,
4940                 async: true,
4941                 /*
4942                 timeout: 0,
4943                 data: null,
4944                 username: null,
4945                 password: null,
4946                 traditional: false,
4947                 */
4948                 // Create the request object; Microsoft failed to properly
4949                 // implement the XMLHttpRequest in IE7 (can't request local files),
4950                 // so we use the ActiveXObject when it is available
4951                 // This function can be overriden by calling jQuery.ajaxSetup
4952                 xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ?
4953                         function() {
4954                                 return new window.XMLHttpRequest();
4955                         } :
4956                         function() {
4957                                 try {
4958                                         return new window.ActiveXObject("Microsoft.XMLHTTP");
4959                                 } catch(e) {}
4960                         },
4961                 accepts: {
4962                         xml: "application/xml, text/xml",
4963                         html: "text/html",
4964                         script: "text/javascript, application/javascript",
4965                         json: "application/json, text/javascript",
4966                         text: "text/plain",
4967                         _default: "*/*"
4968                 }
4969         },
4970
4971         // Last-Modified header cache for next request
4972         lastModified: {},
4973         etag: {},
4974
4975         ajax: function( origSettings ) {
4976                 var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings);
4977                 
4978                 var jsonp, status, data,
4979                         callbackContext = origSettings && origSettings.context || s,
4980                         type = s.type.toUpperCase();
4981
4982                 // convert data if not already a string
4983                 if ( s.data && s.processData && typeof s.data !== "string" ) {
4984                         s.data = jQuery.param( s.data, s.traditional );
4985                 }
4986
4987                 // Handle JSONP Parameter Callbacks
4988                 if ( s.dataType === "jsonp" ) {
4989                         if ( type === "GET" ) {
4990                                 if ( !jsre.test( s.url ) ) {
4991                                         s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?";
4992                                 }
4993                         } else if ( !s.data || !jsre.test(s.data) ) {
4994                                 s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
4995                         }
4996                         s.dataType = "json";
4997                 }
4998
4999                 // Build temporary JSONP function
5000                 if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {
5001                         jsonp = s.jsonpCallback || ("jsonp" + jsc++);
5002
5003                         // Replace the =? sequence both in the query string and the data
5004                         if ( s.data ) {
5005                                 s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
5006                         }
5007
5008                         s.url = s.url.replace(jsre, "=" + jsonp + "$1");
5009
5010                         // We need to make sure
5011                         // that a JSONP style response is executed properly
5012                         s.dataType = "script";
5013
5014                         // Handle JSONP-style loading
5015                         window[ jsonp ] = window[ jsonp ] || function( tmp ) {
5016                                 data = tmp;
5017                                 success();
5018                                 complete();
5019                                 // Garbage collect
5020                                 window[ jsonp ] = undefined;
5021
5022                                 try {
5023                                         delete window[ jsonp ];
5024                                 } catch(e) {}
5025
5026                                 if ( head ) {
5027                                         head.removeChild( script );
5028                                 }
5029                         };
5030                 }
5031
5032                 if ( s.dataType === "script" && s.cache === null ) {
5033                         s.cache = false;
5034                 }
5035
5036                 if ( s.cache === false && type === "GET" ) {
5037                         var ts = now();
5038
5039                         // try replacing _= if it is there
5040                         var ret = s.url.replace(rts, "$1_=" + ts + "$2");
5041
5042                         // if nothing was replaced, add timestamp to the end
5043                         s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
5044                 }
5045
5046                 // If data is available, append data to url for get requests
5047                 if ( s.data && type === "GET" ) {
5048                         s.url += (rquery.test(s.url) ? "&" : "?") + s.data;
5049                 }
5050
5051                 // Watch for a new set of requests
5052                 if ( s.global && ! jQuery.active++ ) {
5053                         jQuery.event.trigger( "ajaxStart" );
5054                 }
5055
5056                 // Matches an absolute URL, and saves the domain
5057                 var parts = rurl.exec( s.url ),
5058                         remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
5059
5060                 // If we're requesting a remote document
5061                 // and trying to load JSON or Script with a GET
5062                 if ( s.dataType === "script" && type === "GET" && remote ) {
5063                         var head = document.getElementsByTagName("head")[0] || document.documentElement;
5064                         var script = document.createElement("script");
5065                         script.src = s.url;
5066                         if ( s.scriptCharset ) {
5067                                 script.charset = s.scriptCharset;
5068                         }
5069
5070                         // Handle Script loading
5071                         if ( !jsonp ) {
5072                                 var done = false;
5073
5074                                 // Attach handlers for all browsers
5075                                 script.onload = script.onreadystatechange = function() {
5076                                         if ( !done && (!this.readyState ||
5077                                                         this.readyState === "loaded" || this.readyState === "complete") ) {
5078                                                 done = true;
5079                                                 success();
5080                                                 complete();
5081
5082                                                 // Handle memory leak in IE
5083                                                 script.onload = script.onreadystatechange = null;
5084                                                 if ( head && script.parentNode ) {
5085                                                         head.removeChild( script );
5086                                                 }
5087                                         }
5088                                 };
5089                         }
5090
5091                         // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
5092                         // This arises when a base node is used (#2709 and #4378).
5093                         head.insertBefore( script, head.firstChild );
5094
5095                         // We handle everything using the script element injection
5096                         return undefined;
5097                 }
5098
5099                 var requestDone = false;
5100
5101                 // Create the request object
5102                 var xhr = s.xhr();
5103
5104                 if ( !xhr ) {
5105                         return;
5106                 }
5107
5108                 // Open the socket
5109                 // Passing null username, generates a login popup on Opera (#2865)
5110                 if ( s.username ) {
5111                         xhr.open(type, s.url, s.async, s.username, s.password);
5112                 } else {
5113                         xhr.open(type, s.url, s.async);
5114                 }
5115
5116                 // Need an extra try/catch for cross domain requests in Firefox 3
5117                 try {
5118                         // Set the correct header, if data is being sent
5119                         if ( s.data || origSettings && origSettings.contentType ) {
5120                                 xhr.setRequestHeader("Content-Type", s.contentType);
5121                         }
5122
5123                         // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
5124                         if ( s.ifModified ) {
5125                                 if ( jQuery.lastModified[s.url] ) {
5126                                         xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]);
5127                                 }
5128
5129                                 if ( jQuery.etag[s.url] ) {
5130                                         xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]);
5131                                 }
5132                         }
5133
5134                         // Set header so the called script knows that it's an XMLHttpRequest
5135                         // Only send the header if it's not a remote XHR
5136                         if ( !remote ) {
5137                                 xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
5138                         }
5139
5140                         // Set the Accepts header for the server, depending on the dataType
5141                         xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
5142                                 s.accepts[ s.dataType ] + ", */*" :
5143                                 s.accepts._default );
5144                 } catch(e) {}
5145
5146                 // Allow custom headers/mimetypes and early abort
5147                 if ( s.beforeSend && s.beforeSend.call(callbackContext, xhr, s) === false ) {
5148                         // Handle the global AJAX counter
5149                         if ( s.global && ! --jQuery.active ) {
5150                                 jQuery.event.trigger( "ajaxStop" );
5151                         }
5152
5153                         // close opended socket
5154                         xhr.abort();
5155                         return false;
5156                 }
5157
5158                 if ( s.global ) {
5159                         trigger("ajaxSend", [xhr, s]);
5160                 }
5161
5162                 // Wait for a response to come back
5163                 var onreadystatechange = xhr.onreadystatechange = function( isTimeout ) {
5164                         // The request was aborted
5165                         if ( !xhr || xhr.readyState === 0 || isTimeout === "abort" ) {
5166                                 // Opera doesn't call onreadystatechange before this point
5167                                 // so we simulate the call
5168                                 if ( !requestDone ) {
5169                                         complete();
5170                                 }
5171
5172                                 requestDone = true;
5173                                 if ( xhr ) {
5174                                         xhr.onreadystatechange = jQuery.noop;
5175                                 }
5176
5177                         // The transfer is complete and the data is available, or the request timed out
5178                         } else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) {
5179                                 requestDone = true;
5180                                 xhr.onreadystatechange = jQuery.noop;
5181
5182                                 status = isTimeout === "timeout" ?
5183                                         "timeout" :
5184                                         !jQuery.httpSuccess( xhr ) ?
5185                                                 "error" :
5186                                                 s.ifModified && jQuery.httpNotModified( xhr, s.url ) ?
5187                                                         "notmodified" :
5188                                                         "success";
5189
5190                                 var errMsg;
5191
5192                                 if ( status === "success" ) {
5193                                         // Watch for, and catch, XML document parse errors
5194                                         try {
5195                                                 // process the data (runs the xml through httpData regardless of callback)
5196                                                 data = jQuery.httpData( xhr, s.dataType, s );
5197                                         } catch(err) {
5198                                                 status = "parsererror";
5199                                                 errMsg = err;
5200                                         }
5201                                 }
5202
5203                                 // Make sure that the request was successful or notmodified
5204                                 if ( status === "success" || status === "notmodified" ) {
5205                                         // JSONP handles its own success callback
5206                                         if ( !jsonp ) {
5207                                                 success();
5208                                         }
5209                                 } else {
5210                                         jQuery.handleError(s, xhr, status, errMsg);
5211                                 }
5212
5213                                 // Fire the complete handlers
5214                                 complete();
5215
5216                                 if ( isTimeout === "timeout" ) {
5217                                         xhr.abort();
5218                                 }
5219
5220                                 // Stop memory leaks
5221                                 if ( s.async ) {
5222                                         xhr = null;
5223                                 }
5224                         }
5225                 };
5226
5227                 // Override the abort handler, if we can (IE doesn't allow it, but that's OK)
5228                 // Opera doesn't fire onreadystatechange at all on abort
5229                 try {
5230                         var oldAbort = xhr.abort;
5231                         xhr.abort = function() {
5232                                 if ( xhr ) {
5233                                         oldAbort.call( xhr );
5234                                 }
5235
5236                                 onreadystatechange( "abort" );
5237                         };
5238                 } catch(e) { }
5239
5240                 // Timeout checker
5241                 if ( s.async && s.timeout > 0 ) {
5242                         setTimeout(function() {
5243                                 // Check to see if the request is still happening
5244                                 if ( xhr && !requestDone ) {
5245                                         onreadystatechange( "timeout" );
5246                                 }
5247                         }, s.timeout);
5248                 }
5249
5250                 // Send the data
5251                 try {
5252                         xhr.send( type === "POST" || type === "PUT" || type === "DELETE" ? s.data : null );
5253                 } catch(e) {
5254                         jQuery.handleError(s, xhr, null, e);
5255                         // Fire the complete handlers
5256                         complete();
5257                 }
5258
5259                 // firefox 1.5 doesn't fire statechange for sync requests
5260                 if ( !s.async ) {
5261                         onreadystatechange();
5262                 }
5263
5264                 function success() {
5265                         // If a local callback was specified, fire it and pass it the data
5266                         if ( s.success ) {
5267                                 s.success.call( callbackContext, data, status, xhr );
5268                         }
5269
5270                         // Fire the global callback
5271                         if ( s.global ) {
5272                                 trigger( "ajaxSuccess", [xhr, s] );
5273                         }
5274                 }
5275
5276                 function complete() {
5277                         // Process result
5278                         if ( s.complete ) {
5279                                 s.complete.call( callbackContext, xhr, status);
5280                         }
5281
5282                         // The request was completed
5283                         if ( s.global ) {
5284                                 trigger( "ajaxComplete", [xhr, s] );
5285                         }
5286
5287                         // Handle the global AJAX counter
5288                         if ( s.global && ! --jQuery.active ) {
5289                                 jQuery.event.trigger( "ajaxStop" );
5290                         }
5291                 }
5292                 
5293                 function trigger(type, args) {
5294                         (s.context ? jQuery(s.context) : jQuery.event).trigger(type, args);
5295                 }
5296
5297                 // return XMLHttpRequest to allow aborting the request etc.
5298                 return xhr;
5299         },
5300
5301         handleError: function( s, xhr, status, e ) {
5302                 // If a local callback was specified, fire it
5303                 if ( s.error ) {
5304                         s.error.call( s.context || s, xhr, status, e );
5305                 }
5306
5307                 // Fire the global callback
5308                 if ( s.global ) {
5309                         (s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] );
5310                 }
5311         },
5312
5313         // Counter for holding the number of active queries
5314         active: 0,
5315
5316         // Determines if an XMLHttpRequest was successful or not
5317         httpSuccess: function( xhr ) {
5318                 try {
5319                         // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
5320                         return !xhr.status && location.protocol === "file:" ||
5321                                 // Opera returns 0 when status is 304
5322                                 ( xhr.status >= 200 && xhr.status < 300 ) ||
5323                                 xhr.status === 304 || xhr.status === 1223 || xhr.status === 0;
5324                 } catch(e) {}
5325
5326                 return false;
5327         },
5328
5329         // Determines if an XMLHttpRequest returns NotModified
5330         httpNotModified: function( xhr, url ) {
5331                 var lastModified = xhr.getResponseHeader("Last-Modified"),
5332                         etag = xhr.getResponseHeader("Etag");
5333
5334                 if ( lastModified ) {
5335                         jQuery.lastModified[url] = lastModified;
5336                 }
5337
5338                 if ( etag ) {
5339                         jQuery.etag[url] = etag;
5340                 }
5341
5342                 // Opera returns 0 when status is 304
5343                 return xhr.status === 304 || xhr.status === 0;
5344         },
5345
5346         httpData: function( xhr, type, s ) {
5347                 var ct = xhr.getResponseHeader("content-type") || "",
5348                         xml = type === "xml" || !type && ct.indexOf("xml") >= 0,
5349                         data = xml ? xhr.responseXML : xhr.responseText;
5350
5351                 if ( xml && data.documentElement.nodeName === "parsererror" ) {
5352                         jQuery.error( "parsererror" );
5353                 }
5354
5355                 // Allow a pre-filtering function to sanitize the response
5356                 // s is checked to keep backwards compatibility
5357                 if ( s && s.dataFilter ) {
5358                         data = s.dataFilter( data, type );
5359                 }
5360
5361                 // The filter can actually parse the response
5362                 if ( typeof data === "string" ) {
5363                         // Get the JavaScript object, if JSON is used.
5364                         if ( type === "json" || !type && ct.indexOf("json") >= 0 ) {
5365                                 data = jQuery.parseJSON( data );
5366
5367                         // If the type is "script", eval it in global context
5368                         } else if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) {
5369                                 jQuery.globalEval( data );
5370                         }
5371                 }
5372
5373                 return data;
5374         },
5375
5376         // Serialize an array of form elements or a set of
5377         // key/values into a query string
5378         param: function( a, traditional ) {
5379                 var s = [];
5380                 
5381                 // Set traditional to true for jQuery <= 1.3.2 behavior.
5382                 if ( traditional === undefined ) {
5383                         traditional = jQuery.ajaxSettings.traditional;
5384                 }
5385                 
5386                 // If an array was passed in, assume that it is an array of form elements.
5387                 if ( jQuery.isArray(a) || a.jquery ) {
5388                         // Serialize the form elements
5389                         jQuery.each( a, function() {
5390                                 add( this.name, this.value );
5391                         });
5392                         
5393                 } else {
5394                         // If traditional, encode the "old" way (the way 1.3.2 or older
5395                         // did it), otherwise encode params recursively.
5396                         for ( var prefix in a ) {
5397                                 buildParams( prefix, a[prefix] );
5398                         }
5399                 }
5400
5401                 // Return the resulting serialization
5402                 return s.join("&").replace(r20, "+");
5403
5404                 function buildParams( prefix, obj ) {
5405                         if ( jQuery.isArray(obj) ) {
5406                                 // Serialize array item.
5407                                 jQuery.each( obj, function( i, v ) {
5408                                         if ( traditional || /\[\]$/.test( prefix ) ) {
5409                                                 // Treat each array item as a scalar.
5410                                                 add( prefix, v );
5411                                         } else {
5412                                                 // If array item is non-scalar (array or object), encode its
5413                                                 // numeric index to resolve deserialization ambiguity issues.
5414                                                 // Note that rack (as of 1.0.0) can't currently deserialize
5415                                                 // nested arrays properly, and attempting to do so may cause
5416                                                 // a server error. Possible fixes are to modify rack's
5417                                                 // deserialization algorithm or to provide an option or flag
5418                                                 // to force array serialization to be shallow.
5419                                                 buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v );
5420                                         }
5421                                 });
5422                                         
5423                         } else if ( !traditional && obj != null && typeof obj === "object" ) {
5424                                 // Serialize object item.
5425                                 jQuery.each( obj, function( k, v ) {
5426                                         buildParams( prefix + "[" + k + "]", v );
5427                                 });
5428                                         
5429                         } else {
5430                                 // Serialize scalar item.
5431                                 add( prefix, obj );
5432                         }
5433                 }
5434
5435                 function add( key, value ) {
5436                         // If value is a function, invoke it and return its value
5437                         value = jQuery.isFunction(value) ? value() : value;
5438                         s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
5439                 }
5440         }
5441 });
5442 var elemdisplay = {},
5443         rfxtypes = /toggle|show|hide/,
5444         rfxnum = /^([+-]=)?([\d+-.]+)(.*)$/,
5445         timerId,
5446         fxAttrs = [
5447                 // height animations
5448                 [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
5449                 // width animations
5450                 [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
5451                 // opacity animations
5452                 [ "opacity" ]
5453         ];
5454
5455 jQuery.fn.extend({
5456         show: function( speed, callback ) {
5457                 if ( speed || speed === 0) {
5458                         return this.animate( genFx("show", 3), speed, callback);
5459
5460                 } else {
5461                         for ( var i = 0, l = this.length; i < l; i++ ) {
5462                                 var old = jQuery.data(this[i], "olddisplay");
5463
5464                                 this[i].style.display = old || "";
5465
5466                                 if ( jQuery.css(this[i], "display") === "none" ) {
5467                                         var nodeName = this[i].nodeName, display;
5468
5469                                         if ( elemdisplay[ nodeName ] ) {
5470                                                 display = elemdisplay[ nodeName ];
5471
5472                                         } else {
5473                                                 var elem = jQuery("<" + nodeName + " />").appendTo("body");
5474
5475                                                 display = elem.css("display");
5476
5477                                                 if ( display === "none" ) {
5478                                                         display = "block";
5479                                                 }
5480
5481                                                 elem.remove();
5482
5483                                                 elemdisplay[ nodeName ] = display;
5484                                         }
5485
5486                                         jQuery.data(this[i], "olddisplay", display);
5487                                 }
5488                         }
5489
5490                         // Set the display of the elements in a second loop
5491                         // to avoid the constant reflow
5492                         for ( var j = 0, k = this.length; j < k; j++ ) {
5493                                 this[j].style.display = jQuery.data(this[j], "olddisplay") || "";
5494                         }
5495
5496                         return this;
5497                 }
5498         },
5499
5500         hide: function( speed, callback ) {
5501                 if ( speed || speed === 0 ) {
5502                         return this.animate( genFx("hide", 3), speed, callback);
5503
5504                 } else {
5505                         for ( var i = 0, l = this.length; i < l; i++ ) {
5506                                 var old = jQuery.data(this[i], "olddisplay");
5507                                 if ( !old && old !== "none" ) {
5508                                         jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
5509                                 }
5510                         }
5511
5512                         // Set the display of the elements in a second loop
5513                         // to avoid the constant reflow
5514                         for ( var j = 0, k = this.length; j < k; j++ ) {
5515                                 this[j].style.display = "none";
5516                         }
5517
5518                         return this;
5519                 }
5520         },
5521
5522         // Save the old toggle function
5523         _toggle: jQuery.fn.toggle,
5524
5525         toggle: function( fn, fn2 ) {
5526                 var bool = typeof fn === "boolean";
5527
5528                 if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
5529                         this._toggle.apply( this, arguments );
5530
5531                 } else if ( fn == null || bool ) {
5532                         this.each(function() {
5533                                 var state = bool ? fn : jQuery(this).is(":hidden");
5534                                 jQuery(this)[ state ? "show" : "hide" ]();
5535                         });
5536
5537                 } else {
5538                         this.animate(genFx("toggle", 3), fn, fn2);
5539                 }
5540
5541                 return this;
5542         },
5543
5544         fadeTo: function( speed, to, callback ) {
5545                 return this.filter(":hidden").css("opacity", 0).show().end()
5546                                         .animate({opacity: to}, speed, callback);
5547         },
5548
5549         animate: function( prop, speed, easing, callback ) {
5550                 var optall = jQuery.speed(speed, easing, callback);
5551
5552                 if ( jQuery.isEmptyObject( prop ) ) {
5553                         return this.each( optall.complete );
5554                 }
5555
5556                 return this[ optall.queue === false ? "each" : "queue" ](function() {
5557                         var opt = jQuery.extend({}, optall), p,
5558                                 hidden = this.nodeType === 1 && jQuery(this).is(":hidden"),
5559                                 self = this;
5560
5561                         for ( p in prop ) {
5562                                 var name = p.replace(rdashAlpha, fcamelCase);
5563
5564                                 if ( p !== name ) {
5565                                         prop[ name ] = prop[ p ];
5566                                         delete prop[ p ];
5567                                         p = name;
5568                                 }
5569
5570                                 if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {
5571                                         return opt.complete.call(this);
5572                                 }
5573
5574                                 if ( ( p === "height" || p === "width" ) && this.style ) {
5575                                         // Store display property
5576                                         opt.display = jQuery.css(this, "display");
5577
5578                                         // Make sure that nothing sneaks out
5579                                         opt.overflow = this.style.overflow;
5580                                 }
5581
5582                                 if ( jQuery.isArray( prop[p] ) ) {
5583                                         // Create (if needed) and add to specialEasing
5584                                         (opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
5585                                         prop[p] = prop[p][0];
5586                                 }
5587                         }
5588
5589                         if ( opt.overflow != null ) {
5590                                 this.style.overflow = "hidden";
5591                         }
5592
5593                         opt.curAnim = jQuery.extend({}, prop);
5594
5595                         jQuery.each( prop, function( name, val ) {
5596                                 var e = new jQuery.fx( self, opt, name );
5597
5598                                 if ( rfxtypes.test(val) ) {
5599                                         e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );
5600
5601                                 } else {
5602                                         var parts = rfxnum.exec(val),
5603                                                 start = e.cur(true) || 0;
5604
5605                                         if ( parts ) {
5606                                                 var end = parseFloat( parts[2] ),
5607                                                         unit = parts[3] || "px";
5608
5609                                                 // We need to compute starting value
5610                                                 if ( unit !== "px" ) {
5611                                                         self.style[ name ] = (end || 1) + unit;
5612                                                         start = ((end || 1) / e.cur(true)) * start;
5613                                                         self.style[ name ] = start + unit;
5614                                                 }
5615
5616                                                 // If a +=/-= token was provided, we're doing a relative animation
5617                                                 if ( parts[1] ) {
5618                                                         end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
5619                                                 }
5620
5621                                                 e.custom( start, end, unit );
5622
5623                                         } else {
5624                                                 e.custom( start, val, "" );
5625                                         }
5626                                 }
5627                         });
5628
5629                         // For JS strict compliance
5630                         return true;
5631                 });
5632         },
5633
5634         stop: function( clearQueue, gotoEnd ) {
5635                 var timers = jQuery.timers;
5636
5637                 if ( clearQueue ) {
5638                         this.queue([]);
5639                 }
5640
5641                 this.each(function() {
5642                         // go in reverse order so anything added to the queue during the loop is ignored
5643                         for ( var i = timers.length - 1; i >= 0; i-- ) {
5644                                 if ( timers[i].elem === this ) {
5645                                         if (gotoEnd) {
5646                                                 // force the next step to be the last
5647                                                 timers[i](true);
5648                                         }
5649
5650                                         timers.splice(i, 1);
5651                                 }
5652                         }
5653                 });
5654
5655                 // start the next in the queue if the last step wasn't forced
5656                 if ( !gotoEnd ) {
5657                         this.dequeue();
5658                 }
5659
5660                 return this;
5661         }
5662
5663 });
5664
5665 // Generate shortcuts for custom animations
5666 jQuery.each({
5667         slideDown: genFx("show", 1),
5668         slideUp: genFx("hide", 1),
5669         slideToggle: genFx("toggle", 1),
5670         fadeIn: { opacity: "show" },
5671         fadeOut: { opacity: "hide" }
5672 }, function( name, props ) {
5673         jQuery.fn[ name ] = function( speed, callback ) {
5674                 return this.animate( props, speed, callback );
5675         };
5676 });
5677
5678 jQuery.extend({
5679         speed: function( speed, easing, fn ) {
5680                 var opt = speed && typeof speed === "object" ? speed : {
5681                         complete: fn || !fn && easing ||
5682                                 jQuery.isFunction( speed ) && speed,
5683                         duration: speed,
5684                         easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
5685                 };
5686
5687                 opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
5688                         jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
5689
5690                 // Queueing
5691                 opt.old = opt.complete;
5692                 opt.complete = function() {
5693                         if ( opt.queue !== false ) {
5694                                 jQuery(this).dequeue();
5695                         }
5696                         if ( jQuery.isFunction( opt.old ) ) {
5697                                 opt.old.call( this );
5698                         }
5699                 };
5700
5701                 return opt;
5702         },
5703
5704         easing: {
5705                 linear: function( p, n, firstNum, diff ) {
5706                         return firstNum + diff * p;
5707                 },
5708                 swing: function( p, n, firstNum, diff ) {
5709                         return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
5710                 }
5711         },
5712
5713         timers: [],
5714
5715         fx: function( elem, options, prop ) {
5716                 this.options = options;
5717                 this.elem = elem;
5718                 this.prop = prop;
5719
5720                 if ( !options.orig ) {
5721                         options.orig = {};
5722                 }
5723         }
5724
5725 });
5726
5727 jQuery.fx.prototype = {
5728         // Simple function for setting a style value
5729         update: function() {
5730                 if ( this.options.step ) {
5731                         this.options.step.call( this.elem, this.now, this );
5732                 }
5733
5734                 (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
5735
5736                 // Set display property to block for height/width animations
5737                 if ( ( this.prop === "height" || this.prop === "width" ) && this.elem.style ) {
5738                         this.elem.style.display = "block";
5739                 }
5740         },
5741
5742         // Get the current size
5743         cur: function( force ) {
5744                 if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
5745                         return this.elem[ this.prop ];
5746                 }
5747
5748                 var r = parseFloat(jQuery.css(this.elem, this.prop, force));
5749                 return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
5750         },
5751
5752         // Start an animation from one number to another
5753         custom: function( from, to, unit ) {
5754                 this.startTime = now();
5755                 this.start = from;
5756                 this.end = to;
5757                 this.unit = unit || this.unit || "px";
5758                 this.now = this.start;
5759                 this.pos = this.state = 0;
5760
5761                 var self = this;
5762                 function t( gotoEnd ) {
5763                         return self.step(gotoEnd);
5764                 }
5765
5766                 t.elem = this.elem;
5767
5768                 if ( t() && jQuery.timers.push(t) && !timerId ) {
5769                         timerId = setInterval(jQuery.fx.tick, 13);
5770                 }
5771         },
5772
5773         // Simple 'show' function
5774         show: function() {
5775                 // Remember where we started, so that we can go back to it later
5776                 this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
5777                 this.options.show = true;
5778
5779                 // Begin the animation
5780                 // Make sure that we start at a small width/height to avoid any
5781                 // flash of content
5782                 this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
5783
5784                 // Start by showing the element
5785                 jQuery( this.elem ).show();
5786         },
5787
5788         // Simple 'hide' function
5789         hide: function() {
5790                 // Remember where we started, so that we can go back to it later
5791                 this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
5792                 this.options.hide = true;
5793
5794                 // Begin the animation
5795                 this.custom(this.cur(), 0);
5796         },
5797
5798         // Each step of an animation
5799         step: function( gotoEnd ) {
5800                 var t = now(), done = true;
5801
5802                 if ( gotoEnd || t >= this.options.duration + this.startTime ) {
5803                         this.now = this.end;
5804                         this.pos = this.state = 1;
5805                         this.update();
5806
5807                         this.options.curAnim[ this.prop ] = true;
5808
5809                         for ( var i in this.options.curAnim ) {
5810                                 if ( this.options.curAnim[i] !== true ) {
5811                                         done = false;
5812                                 }
5813                         }
5814
5815                         if ( done ) {
5816                                 if ( this.options.display != null ) {
5817                                         // Reset the overflow
5818                                         this.elem.style.overflow = this.options.overflow;
5819
5820                                         // Reset the display
5821                                         var old = jQuery.data(this.elem, "olddisplay");
5822                                         this.elem.style.display = old ? old : this.options.display;
5823
5824                                         if ( jQuery.css(this.elem, "display") === "none" ) {
5825                                                 this.elem.style.display = "block";
5826                                         }
5827                                 }
5828
5829                                 // Hide the element if the "hide" operation was done
5830                                 if ( this.options.hide ) {
5831                                         jQuery(this.elem).hide();
5832                                 }
5833
5834                                 // Reset the properties, if the item has been hidden or shown
5835                                 if ( this.options.hide || this.options.show ) {
5836                                         for ( var p in this.options.curAnim ) {
5837                                                 jQuery.style(this.elem, p, this.options.orig[p]);
5838                                         }
5839                                 }
5840
5841                                 // Execute the complete function
5842                                 this.options.complete.call( this.elem );
5843                         }
5844
5845                         return false;
5846
5847                 } else {
5848                         var n = t - this.startTime;
5849                         this.state = n / this.options.duration;
5850
5851                         // Perform the easing function, defaults to swing
5852                         var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
5853                         var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
5854                         this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
5855                         this.now = this.start + ((this.end - this.start) * this.pos);
5856
5857                         // Perform the next step of the animation
5858                         this.update();
5859                 }
5860
5861                 return true;
5862         }
5863 };
5864
5865 jQuery.extend( jQuery.fx, {
5866         tick: function() {
5867                 var timers = jQuery.timers;
5868
5869                 for ( var i = 0; i < timers.length; i++ ) {
5870                         if ( !timers[i]() ) {
5871                                 timers.splice(i--, 1);
5872                         }
5873                 }
5874
5875                 if ( !timers.length ) {
5876                         jQuery.fx.stop();
5877                 }
5878         },
5879                 
5880         stop: function() {
5881                 clearInterval( timerId );
5882                 timerId = null;
5883         },
5884         
5885         speeds: {
5886                 slow: 600,
5887                 fast: 200,
5888                 // Default speed
5889                 _default: 400
5890         },
5891
5892         step: {
5893                 opacity: function( fx ) {
5894                         jQuery.style(fx.elem, "opacity", fx.now);
5895                 },
5896
5897                 _default: function( fx ) {
5898                         if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
5899                                 fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
5900                         } else {
5901                                 fx.elem[ fx.prop ] = fx.now;
5902                         }
5903                 }
5904         }
5905 });
5906
5907 if ( jQuery.expr && jQuery.expr.filters ) {
5908         jQuery.expr.filters.animated = function( elem ) {
5909                 return jQuery.grep(jQuery.timers, function( fn ) {
5910                         return elem === fn.elem;
5911                 }).length;
5912         };
5913 }
5914
5915 function genFx( type, num ) {
5916         var obj = {};
5917
5918         jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
5919                 obj[ this ] = type;
5920         });
5921
5922         return obj;
5923 }
5924 if ( "getBoundingClientRect" in document.documentElement ) {
5925         jQuery.fn.offset = function( options ) {
5926                 var elem = this[0];
5927
5928                 if ( options ) { 
5929                         return this.each(function( i ) {
5930                                 jQuery.offset.setOffset( this, options, i );
5931                         });
5932                 }
5933
5934                 if ( !elem || !elem.ownerDocument ) {
5935                         return null;
5936                 }
5937
5938                 if ( elem === elem.ownerDocument.body ) {
5939                         return jQuery.offset.bodyOffset( elem );
5940                 }
5941
5942                 var box = elem.getBoundingClientRect(), doc = elem.ownerDocument, body = doc.body, docElem = doc.documentElement,
5943                         clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
5944                         top  = box.top  + (self.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop ) - clientTop,
5945                         left = box.left + (self.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
5946
5947                 return { top: top, left: left };
5948         };
5949
5950 } else {
5951         jQuery.fn.offset = function( options ) {
5952                 var elem = this[0];
5953
5954                 if ( options ) { 
5955                         return this.each(function( i ) {
5956                                 jQuery.offset.setOffset( this, options, i );
5957                         });
5958                 }
5959
5960                 if ( !elem || !elem.ownerDocument ) {
5961                         return null;
5962                 }
5963
5964                 if ( elem === elem.ownerDocument.body ) {
5965                         return jQuery.offset.bodyOffset( elem );
5966                 }
5967
5968                 jQuery.offset.initialize();
5969
5970                 var offsetParent = elem.offsetParent, prevOffsetParent = elem,
5971                         doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
5972                         body = doc.body, defaultView = doc.defaultView,
5973                         prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
5974                         top = elem.offsetTop, left = elem.offsetLeft;
5975
5976                 while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
5977                         if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
5978                                 break;
5979                         }
5980
5981                         computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
5982                         top  -= elem.scrollTop;
5983                         left -= elem.scrollLeft;
5984
5985                         if ( elem === offsetParent ) {
5986                                 top  += elem.offsetTop;
5987                                 left += elem.offsetLeft;
5988
5989                                 if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.nodeName)) ) {
5990                                         top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
5991                                         left += parseFloat( computedStyle.borderLeftWidth ) || 0;
5992                                 }
5993
5994                                 prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
5995                         }
5996
5997                         if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
5998                                 top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
5999                                 left += parseFloat( computedStyle.borderLeftWidth ) || 0;
6000                         }
6001
6002                         prevComputedStyle = computedStyle;
6003                 }
6004
6005                 if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
6006                         top  += body.offsetTop;
6007                         left += body.offsetLeft;
6008                 }
6009
6010                 if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
6011                         top  += Math.max( docElem.scrollTop, body.scrollTop );
6012                         left += Math.max( docElem.scrollLeft, body.scrollLeft );
6013                 }
6014
6015                 return { top: top, left: left };
6016         };
6017 }
6018
6019 jQuery.offset = {
6020         initialize: function() {
6021                 var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.curCSS(body, "marginTop", true) ) || 0,
6022                         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>";
6023
6024                 jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
6025
6026                 container.innerHTML = html;
6027                 body.insertBefore( container, body.firstChild );
6028                 innerDiv = container.firstChild;
6029                 checkDiv = innerDiv.firstChild;
6030                 td = innerDiv.nextSibling.firstChild.firstChild;
6031
6032                 this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
6033                 this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
6034
6035                 checkDiv.style.position = "fixed", checkDiv.style.top = "20px";
6036                 // safari subtracts parent border width here which is 5px
6037                 this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
6038                 checkDiv.style.position = checkDiv.style.top = "";
6039
6040                 innerDiv.style.overflow = "hidden", innerDiv.style.position = "relative";
6041                 this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
6042
6043                 this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
6044
6045                 body.removeChild( container );
6046                 body = container = innerDiv = checkDiv = table = td = null;
6047                 jQuery.offset.initialize = jQuery.noop;
6048         },
6049
6050         bodyOffset: function( body ) {
6051                 var top = body.offsetTop, left = body.offsetLeft;
6052
6053                 jQuery.offset.initialize();
6054
6055                 if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
6056                         top  += parseFloat( jQuery.curCSS(body, "marginTop",  true) ) || 0;
6057                         left += parseFloat( jQuery.curCSS(body, "marginLeft", true) ) || 0;
6058                 }
6059
6060                 return { top: top, left: left };
6061         },
6062         
6063         setOffset: function( elem, options, i ) {
6064                 // set position first, in-case top/left are set even on static elem
6065                 if ( /static/.test( jQuery.curCSS( elem, "position" ) ) ) {
6066                         elem.style.position = "relative";
6067                 }
6068                 var curElem   = jQuery( elem ),
6069                         curOffset = curElem.offset(),
6070                         curTop    = parseInt( jQuery.curCSS( elem, "top",  true ), 10 ) || 0,
6071                         curLeft   = parseInt( jQuery.curCSS( elem, "left", true ), 10 ) || 0;
6072
6073                 if ( jQuery.isFunction( options ) ) {
6074                         options = options.call( elem, i, curOffset );
6075                 }
6076
6077                 var props = {
6078                         top:  (options.top  - curOffset.top)  + curTop,
6079                         left: (options.left - curOffset.left) + curLeft
6080                 };
6081                 
6082                 if ( "using" in options ) {
6083                         options.using.call( elem, props );
6084                 } else {
6085                         curElem.css( props );
6086                 }
6087         }
6088 };
6089
6090
6091 jQuery.fn.extend({
6092         position: function() {
6093                 if ( !this[0] ) {
6094                         return null;
6095                 }
6096
6097                 var elem = this[0],
6098
6099                 // Get *real* offsetParent
6100                 offsetParent = this.offsetParent(),
6101
6102                 // Get correct offsets
6103                 offset       = this.offset(),
6104                 parentOffset = /^body|html$/i.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
6105
6106                 // Subtract element margins
6107                 // note: when an element has margin: auto the offsetLeft and marginLeft
6108                 // are the same in Safari causing offset.left to incorrectly be 0
6109                 offset.top  -= parseFloat( jQuery.curCSS(elem, "marginTop",  true) ) || 0;
6110                 offset.left -= parseFloat( jQuery.curCSS(elem, "marginLeft", true) ) || 0;
6111
6112                 // Add offsetParent borders
6113                 parentOffset.top  += parseFloat( jQuery.curCSS(offsetParent[0], "borderTopWidth",  true) ) || 0;
6114                 parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], "borderLeftWidth", true) ) || 0;
6115
6116                 // Subtract the two offsets
6117                 return {
6118                         top:  offset.top  - parentOffset.top,
6119                         left: offset.left - parentOffset.left
6120                 };
6121         },
6122
6123         offsetParent: function() {
6124                 return this.map(function() {
6125                         var offsetParent = this.offsetParent || document.body;
6126                         while ( offsetParent && (!/^body|html$/i.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
6127                                 offsetParent = offsetParent.offsetParent;
6128                         }
6129                         return offsetParent;
6130                 });
6131         }
6132 });
6133
6134
6135 // Create scrollLeft and scrollTop methods
6136 jQuery.each( ["Left", "Top"], function( i, name ) {
6137         var method = "scroll" + name;
6138
6139         jQuery.fn[ method ] = function(val) {
6140                 var elem = this[0], win;
6141                 
6142                 if ( !elem ) {
6143                         return null;
6144                 }
6145
6146                 if ( val !== undefined ) {
6147                         // Set the scroll offset
6148                         return this.each(function() {
6149                                 win = getWindow( this );
6150
6151                                 if ( win ) {
6152                                         win.scrollTo(
6153                                                 !i ? val : jQuery(win).scrollLeft(),
6154                                                  i ? val : jQuery(win).scrollTop()
6155                                         );
6156
6157                                 } else {
6158                                         this[ method ] = val;
6159                                 }
6160                         });
6161                 } else {
6162                         win = getWindow( elem );
6163
6164                         // Return the scroll offset
6165                         return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
6166                                 jQuery.support.boxModel && win.document.documentElement[ method ] ||
6167                                         win.document.body[ method ] :
6168                                 elem[ method ];
6169                 }
6170         };
6171 });
6172
6173 function getWindow( elem ) {
6174         return ("scrollTo" in elem && elem.document) ?
6175                 elem :
6176                 elem.nodeType === 9 ?
6177                         elem.defaultView || elem.parentWindow :
6178                         false;
6179 }
6180 // Create innerHeight, innerWidth, outerHeight and outerWidth methods
6181 jQuery.each([ "Height", "Width" ], function( i, name ) {
6182
6183         var type = name.toLowerCase();
6184
6185         // innerHeight and innerWidth
6186         jQuery.fn["inner" + name] = function() {
6187                 return this[0] ?
6188                         jQuery.css( this[0], type, false, "padding" ) :
6189                         null;
6190         };
6191
6192         // outerHeight and outerWidth
6193         jQuery.fn["outer" + name] = function( margin ) {
6194                 return this[0] ?
6195                         jQuery.css( this[0], type, false, margin ? "margin" : "border" ) :
6196                         null;
6197         };
6198
6199         jQuery.fn[ type ] = function( size ) {
6200                 // Get window width or height
6201                 var elem = this[0];
6202                 if ( !elem ) {
6203                         return size == null ? null : this;
6204                 }
6205                 
6206                 if ( jQuery.isFunction( size ) ) {
6207                         return this.each(function( i ) {
6208                                 var self = jQuery( this );
6209                                 self[ type ]( size.call( this, i, self[ type ]() ) );
6210                         });
6211                 }
6212
6213                 return ("scrollTo" in elem && elem.document) ? // does it walk and quack like a window?
6214                         // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
6215                         elem.document.compatMode === "CSS1Compat" && elem.document.documentElement[ "client" + name ] ||
6216                         elem.document.body[ "client" + name ] :
6217
6218                         // Get document width or height
6219                         (elem.nodeType === 9) ? // is it a document
6220                                 // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
6221                                 Math.max(
6222                                         elem.documentElement["client" + name],
6223                                         elem.body["scroll" + name], elem.documentElement["scroll" + name],
6224                                         elem.body["offset" + name], elem.documentElement["offset" + name]
6225                                 ) :
6226
6227                                 // Get or set width or height on the element
6228                                 size === undefined ?
6229                                         // Get width or height on the element
6230                                         jQuery.css( elem, type ) :
6231
6232                                         // Set the width or height on the element (default to pixels if value is unitless)
6233                                         this.css( type, typeof size === "string" ? size : size + "px" );
6234         };
6235
6236 });
6237 // Expose jQuery to the global object
6238 window.jQuery = window.$ = jQuery;
6239
6240 })(window);