Addition of tooltip behavior.
[utils] / wicket / components / src / main / resources / org / wamblee / wicket / jquery / jquery-1.5.js
1 /*!
2  * jQuery JavaScript Library v1.5
3  * http://jquery.com/
4  *
5  * Copyright 2011, 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 2011, The Dojo Foundation
12  * Released under the MIT, BSD, and GPL Licenses.
13  *
14  * Date: Mon Jan 31 08:31:29 2011 -0500
15  */
16 (function( window, undefined ) {
17
18 // Use the correct document accordingly with window argument (sandbox)
19 var document = window.document;
20 var jQuery = (function() {
21
22 // Define a local copy of jQuery
23 var jQuery = function( selector, context ) {
24                 // The jQuery object is actually just the init constructor 'enhanced'
25                 return new jQuery.fn.init( selector, context, rootjQuery );
26         },
27
28         // Map over jQuery in case of overwrite
29         _jQuery = window.jQuery,
30
31         // Map over the $ in case of overwrite
32         _$ = window.$,
33
34         // A central reference to the root jQuery(document)
35         rootjQuery,
36
37         // A simple way to check for HTML strings or ID strings
38         // (both of which we optimize for)
39         quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,
40
41         // Check if a string has a non-whitespace character in it
42         rnotwhite = /\S/,
43
44         // Used for trimming whitespace
45         trimLeft = /^\s+/,
46         trimRight = /\s+$/,
47
48         // Check for digits
49         rdigit = /\d/,
50
51         // Match a standalone tag
52         rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
53
54         // JSON RegExp
55         rvalidchars = /^[\],:{}\s]*$/,
56         rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
57         rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
58         rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
59
60         // Useragent RegExp
61         rwebkit = /(webkit)[ \/]([\w.]+)/,
62         ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
63         rmsie = /(msie) ([\w.]+)/,
64         rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
65
66         // Keep a UserAgent string for use with jQuery.browser
67         userAgent = navigator.userAgent,
68
69         // For matching the engine and version of the browser
70         browserMatch,
71
72         // Has the ready events already been bound?
73         readyBound = false,
74
75         // The deferred used on DOM ready
76         readyList,
77
78         // Promise methods
79         promiseMethods = "then done fail isResolved isRejected promise".split( " " ),
80
81         // The ready event handler
82         DOMContentLoaded,
83
84         // Save a reference to some core methods
85         toString = Object.prototype.toString,
86         hasOwn = Object.prototype.hasOwnProperty,
87         push = Array.prototype.push,
88         slice = Array.prototype.slice,
89         trim = String.prototype.trim,
90         indexOf = Array.prototype.indexOf,
91
92         // [[Class]] -> type pairs
93         class2type = {};
94
95 jQuery.fn = jQuery.prototype = {
96         constructor: jQuery,
97         init: function( selector, context, rootjQuery ) {
98                 var match, elem, ret, doc;
99
100                 // Handle $(""), $(null), or $(undefined)
101                 if ( !selector ) {
102                         return this;
103                 }
104
105                 // Handle $(DOMElement)
106                 if ( selector.nodeType ) {
107                         this.context = this[0] = selector;
108                         this.length = 1;
109                         return this;
110                 }
111
112                 // The body element only exists once, optimize finding it
113                 if ( selector === "body" && !context && document.body ) {
114                         this.context = document;
115                         this[0] = document.body;
116                         this.selector = "body";
117                         this.length = 1;
118                         return this;
119                 }
120
121                 // Handle HTML strings
122                 if ( typeof selector === "string" ) {
123                         // Are we dealing with HTML string or an ID?
124                         match = quickExpr.exec( selector );
125
126                         // Verify a match, and that no context was specified for #id
127                         if ( match && (match[1] || !context) ) {
128
129                                 // HANDLE: $(html) -> $(array)
130                                 if ( match[1] ) {
131                                         context = context instanceof jQuery ? context[0] : context;
132                                         doc = (context ? context.ownerDocument || context : document);
133
134                                         // If a single string is passed in and it's a single tag
135                                         // just do a createElement and skip the rest
136                                         ret = rsingleTag.exec( selector );
137
138                                         if ( ret ) {
139                                                 if ( jQuery.isPlainObject( context ) ) {
140                                                         selector = [ document.createElement( ret[1] ) ];
141                                                         jQuery.fn.attr.call( selector, context, true );
142
143                                                 } else {
144                                                         selector = [ doc.createElement( ret[1] ) ];
145                                                 }
146
147                                         } else {
148                                                 ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
149                                                 selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
150                                         }
151
152                                         return jQuery.merge( this, selector );
153
154                                 // HANDLE: $("#id")
155                                 } else {
156                                         elem = document.getElementById( match[2] );
157
158                                         // Check parentNode to catch when Blackberry 4.6 returns
159                                         // nodes that are no longer in the document #6963
160                                         if ( elem && elem.parentNode ) {
161                                                 // Handle the case where IE and Opera return items
162                                                 // by name instead of ID
163                                                 if ( elem.id !== match[2] ) {
164                                                         return rootjQuery.find( selector );
165                                                 }
166
167                                                 // Otherwise, we inject the element directly into the jQuery object
168                                                 this.length = 1;
169                                                 this[0] = elem;
170                                         }
171
172                                         this.context = document;
173                                         this.selector = selector;
174                                         return this;
175                                 }
176
177                         // HANDLE: $(expr, $(...))
178                         } else if ( !context || context.jquery ) {
179                                 return (context || rootjQuery).find( selector );
180
181                         // HANDLE: $(expr, context)
182                         // (which is just equivalent to: $(context).find(expr)
183                         } else {
184                                 return this.constructor( context ).find( selector );
185                         }
186
187                 // HANDLE: $(function)
188                 // Shortcut for document ready
189                 } else if ( jQuery.isFunction( selector ) ) {
190                         return rootjQuery.ready( selector );
191                 }
192
193                 if (selector.selector !== undefined) {
194                         this.selector = selector.selector;
195                         this.context = selector.context;
196                 }
197
198                 return jQuery.makeArray( selector, this );
199         },
200
201         // Start with an empty selector
202         selector: "",
203
204         // The current version of jQuery being used
205         jquery: "1.5",
206
207         // The default length of a jQuery object is 0
208         length: 0,
209
210         // The number of elements contained in the matched element set
211         size: function() {
212                 return this.length;
213         },
214
215         toArray: function() {
216                 return slice.call( this, 0 );
217         },
218
219         // Get the Nth element in the matched element set OR
220         // Get the whole matched element set as a clean array
221         get: function( num ) {
222                 return num == null ?
223
224                         // Return a 'clean' array
225                         this.toArray() :
226
227                         // Return just the object
228                         ( num < 0 ? this[ this.length + num ] : this[ num ] );
229         },
230
231         // Take an array of elements and push it onto the stack
232         // (returning the new matched element set)
233         pushStack: function( elems, name, selector ) {
234                 // Build a new jQuery matched element set
235                 var ret = this.constructor();
236
237                 if ( jQuery.isArray( elems ) ) {
238                         push.apply( ret, elems );
239
240                 } else {
241                         jQuery.merge( ret, elems );
242                 }
243
244                 // Add the old object onto the stack (as a reference)
245                 ret.prevObject = this;
246
247                 ret.context = this.context;
248
249                 if ( name === "find" ) {
250                         ret.selector = this.selector + (this.selector ? " " : "") + selector;
251                 } else if ( name ) {
252                         ret.selector = this.selector + "." + name + "(" + selector + ")";
253                 }
254
255                 // Return the newly-formed element set
256                 return ret;
257         },
258
259         // Execute a callback for every element in the matched set.
260         // (You can seed the arguments with an array of args, but this is
261         // only used internally.)
262         each: function( callback, args ) {
263                 return jQuery.each( this, callback, args );
264         },
265
266         ready: function( fn ) {
267                 // Attach the listeners
268                 jQuery.bindReady();
269
270                 // Add the callback
271                 readyList.done( fn );
272
273                 return this;
274         },
275
276         eq: function( i ) {
277                 return i === -1 ?
278                         this.slice( i ) :
279                         this.slice( i, +i + 1 );
280         },
281
282         first: function() {
283                 return this.eq( 0 );
284         },
285
286         last: function() {
287                 return this.eq( -1 );
288         },
289
290         slice: function() {
291                 return this.pushStack( slice.apply( this, arguments ),
292                         "slice", slice.call(arguments).join(",") );
293         },
294
295         map: function( callback ) {
296                 return this.pushStack( jQuery.map(this, function( elem, i ) {
297                         return callback.call( elem, i, elem );
298                 }));
299         },
300
301         end: function() {
302                 return this.prevObject || this.constructor(null);
303         },
304
305         // For internal use only.
306         // Behaves like an Array's method, not like a jQuery method.
307         push: push,
308         sort: [].sort,
309         splice: [].splice
310 };
311
312 // Give the init function the jQuery prototype for later instantiation
313 jQuery.fn.init.prototype = jQuery.fn;
314
315 jQuery.extend = jQuery.fn.extend = function() {
316          var options, name, src, copy, copyIsArray, clone,
317                 target = arguments[0] || {},
318                 i = 1,
319                 length = arguments.length,
320                 deep = false;
321
322         // Handle a deep copy situation
323         if ( typeof target === "boolean" ) {
324                 deep = target;
325                 target = arguments[1] || {};
326                 // skip the boolean and the target
327                 i = 2;
328         }
329
330         // Handle case when target is a string or something (possible in deep copy)
331         if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
332                 target = {};
333         }
334
335         // extend jQuery itself if only one argument is passed
336         if ( length === i ) {
337                 target = this;
338                 --i;
339         }
340
341         for ( ; i < length; i++ ) {
342                 // Only deal with non-null/undefined values
343                 if ( (options = arguments[ i ]) != null ) {
344                         // Extend the base object
345                         for ( name in options ) {
346                                 src = target[ name ];
347                                 copy = options[ name ];
348
349                                 // Prevent never-ending loop
350                                 if ( target === copy ) {
351                                         continue;
352                                 }
353
354                                 // Recurse if we're merging plain objects or arrays
355                                 if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
356                                         if ( copyIsArray ) {
357                                                 copyIsArray = false;
358                                                 clone = src && jQuery.isArray(src) ? src : [];
359
360                                         } else {
361                                                 clone = src && jQuery.isPlainObject(src) ? src : {};
362                                         }
363
364                                         // Never move original objects, clone them
365                                         target[ name ] = jQuery.extend( deep, clone, copy );
366
367                                 // Don't bring in undefined values
368                                 } else if ( copy !== undefined ) {
369                                         target[ name ] = copy;
370                                 }
371                         }
372                 }
373         }
374
375         // Return the modified object
376         return target;
377 };
378
379 jQuery.extend({
380         noConflict: function( deep ) {
381                 window.$ = _$;
382
383                 if ( deep ) {
384                         window.jQuery = _jQuery;
385                 }
386
387                 return jQuery;
388         },
389
390         // Is the DOM ready to be used? Set to true once it occurs.
391         isReady: false,
392
393         // A counter to track how many items to wait for before
394         // the ready event fires. See #6781
395         readyWait: 1,
396
397         // Handle when the DOM is ready
398         ready: function( wait ) {
399                 // A third-party is pushing the ready event forwards
400                 if ( wait === true ) {
401                         jQuery.readyWait--;
402                 }
403
404                 // Make sure that the DOM is not already loaded
405                 if ( !jQuery.readyWait || (wait !== true && !jQuery.isReady) ) {
406                         // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
407                         if ( !document.body ) {
408                                 return setTimeout( jQuery.ready, 1 );
409                         }
410
411                         // Remember that the DOM is ready
412                         jQuery.isReady = true;
413
414                         // If a normal DOM Ready event fired, decrement, and wait if need be
415                         if ( wait !== true && --jQuery.readyWait > 0 ) {
416                                 return;
417                         }
418
419                         // If there are functions bound, to execute
420                         readyList.resolveWith( document, [ jQuery ] );
421
422                         // Trigger any bound ready events
423                         if ( jQuery.fn.trigger ) {
424                                 jQuery( document ).trigger( "ready" ).unbind( "ready" );
425                         }
426                 }
427         },
428
429         bindReady: function() {
430                 if ( readyBound ) {
431                         return;
432                 }
433
434                 readyBound = true;
435
436                 // Catch cases where $(document).ready() is called after the
437                 // browser event has already occurred.
438                 if ( document.readyState === "complete" ) {
439                         // Handle it asynchronously to allow scripts the opportunity to delay ready
440                         return setTimeout( jQuery.ready, 1 );
441                 }
442
443                 // Mozilla, Opera and webkit nightlies currently support this event
444                 if ( document.addEventListener ) {
445                         // Use the handy event callback
446                         document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
447
448                         // A fallback to window.onload, that will always work
449                         window.addEventListener( "load", jQuery.ready, false );
450
451                 // If IE event model is used
452                 } else if ( document.attachEvent ) {
453                         // ensure firing before onload,
454                         // maybe late but safe also for iframes
455                         document.attachEvent("onreadystatechange", DOMContentLoaded);
456
457                         // A fallback to window.onload, that will always work
458                         window.attachEvent( "onload", jQuery.ready );
459
460                         // If IE and not a frame
461                         // continually check to see if the document is ready
462                         var toplevel = false;
463
464                         try {
465                                 toplevel = window.frameElement == null;
466                         } catch(e) {}
467
468                         if ( document.documentElement.doScroll && toplevel ) {
469                                 doScrollCheck();
470                         }
471                 }
472         },
473
474         // See test/unit/core.js for details concerning isFunction.
475         // Since version 1.3, DOM methods and functions like alert
476         // aren't supported. They return false on IE (#2968).
477         isFunction: function( obj ) {
478                 return jQuery.type(obj) === "function";
479         },
480
481         isArray: Array.isArray || function( obj ) {
482                 return jQuery.type(obj) === "array";
483         },
484
485         // A crude way of determining if an object is a window
486         isWindow: function( obj ) {
487                 return obj && typeof obj === "object" && "setInterval" in obj;
488         },
489
490         isNaN: function( obj ) {
491                 return obj == null || !rdigit.test( obj ) || isNaN( obj );
492         },
493
494         type: function( obj ) {
495                 return obj == null ?
496                         String( obj ) :
497                         class2type[ toString.call(obj) ] || "object";
498         },
499
500         isPlainObject: function( obj ) {
501                 // Must be an Object.
502                 // Because of IE, we also have to check the presence of the constructor property.
503                 // Make sure that DOM nodes and window objects don't pass through, as well
504                 if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
505                         return false;
506                 }
507
508                 // Not own constructor property must be Object
509                 if ( obj.constructor &&
510                         !hasOwn.call(obj, "constructor") &&
511                         !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
512                         return false;
513                 }
514
515                 // Own properties are enumerated firstly, so to speed up,
516                 // if last one is own, then all properties are own.
517
518                 var key;
519                 for ( key in obj ) {}
520
521                 return key === undefined || hasOwn.call( obj, key );
522         },
523
524         isEmptyObject: function( obj ) {
525                 for ( var name in obj ) {
526                         return false;
527                 }
528                 return true;
529         },
530
531         error: function( msg ) {
532                 throw msg;
533         },
534
535         parseJSON: function( data ) {
536                 if ( typeof data !== "string" || !data ) {
537                         return null;
538                 }
539
540                 // Make sure leading/trailing whitespace is removed (IE can't handle it)
541                 data = jQuery.trim( data );
542
543                 // Make sure the incoming data is actual JSON
544                 // Logic borrowed from http://json.org/json2.js
545                 if ( rvalidchars.test(data.replace(rvalidescape, "@")
546                         .replace(rvalidtokens, "]")
547                         .replace(rvalidbraces, "")) ) {
548
549                         // Try to use the native JSON parser first
550                         return window.JSON && window.JSON.parse ?
551                                 window.JSON.parse( data ) :
552                                 (new Function("return " + data))();
553
554                 } else {
555                         jQuery.error( "Invalid JSON: " + data );
556                 }
557         },
558
559         // Cross-browser xml parsing
560         // (xml & tmp used internally)
561         parseXML: function( data , xml , tmp ) {
562
563                 if ( window.DOMParser ) { // Standard
564                         tmp = new DOMParser();
565                         xml = tmp.parseFromString( data , "text/xml" );
566                 } else { // IE
567                         xml = new ActiveXObject( "Microsoft.XMLDOM" );
568                         xml.async = "false";
569                         xml.loadXML( data );
570                 }
571
572                 tmp = xml.documentElement;
573
574                 if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) {
575                         jQuery.error( "Invalid XML: " + data );
576                 }
577
578                 return xml;
579         },
580
581         noop: function() {},
582
583         // Evalulates a script in a global context
584         globalEval: function( data ) {
585                 if ( data && rnotwhite.test(data) ) {
586                         // Inspired by code by Andrea Giammarchi
587                         // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
588                         var head = document.getElementsByTagName("head")[0] || document.documentElement,
589                                 script = document.createElement("script");
590
591                         script.type = "text/javascript";
592
593                         if ( jQuery.support.scriptEval() ) {
594                                 script.appendChild( document.createTextNode( data ) );
595                         } else {
596                                 script.text = data;
597                         }
598
599                         // Use insertBefore instead of appendChild to circumvent an IE6 bug.
600                         // This arises when a base node is used (#2709).
601                         head.insertBefore( script, head.firstChild );
602                         head.removeChild( script );
603                 }
604         },
605
606         nodeName: function( elem, name ) {
607                 return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
608         },
609
610         // args is for internal usage only
611         each: function( object, callback, args ) {
612                 var name, i = 0,
613                         length = object.length,
614                         isObj = length === undefined || jQuery.isFunction(object);
615
616                 if ( args ) {
617                         if ( isObj ) {
618                                 for ( name in object ) {
619                                         if ( callback.apply( object[ name ], args ) === false ) {
620                                                 break;
621                                         }
622                                 }
623                         } else {
624                                 for ( ; i < length; ) {
625                                         if ( callback.apply( object[ i++ ], args ) === false ) {
626                                                 break;
627                                         }
628                                 }
629                         }
630
631                 // A special, fast, case for the most common use of each
632                 } else {
633                         if ( isObj ) {
634                                 for ( name in object ) {
635                                         if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
636                                                 break;
637                                         }
638                                 }
639                         } else {
640                                 for ( var value = object[0];
641                                         i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
642                         }
643                 }
644
645                 return object;
646         },
647
648         // Use native String.trim function wherever possible
649         trim: trim ?
650                 function( text ) {
651                         return text == null ?
652                                 "" :
653                                 trim.call( text );
654                 } :
655
656                 // Otherwise use our own trimming functionality
657                 function( text ) {
658                         return text == null ?
659                                 "" :
660                                 text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
661                 },
662
663         // results is for internal usage only
664         makeArray: function( array, results ) {
665                 var ret = results || [];
666
667                 if ( array != null ) {
668                         // The window, strings (and functions) also have 'length'
669                         // The extra typeof function check is to prevent crashes
670                         // in Safari 2 (See: #3039)
671                         // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
672                         var type = jQuery.type(array);
673
674                         if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
675                                 push.call( ret, array );
676                         } else {
677                                 jQuery.merge( ret, array );
678                         }
679                 }
680
681                 return ret;
682         },
683
684         inArray: function( elem, array ) {
685                 if ( array.indexOf ) {
686                         return array.indexOf( elem );
687                 }
688
689                 for ( var i = 0, length = array.length; i < length; i++ ) {
690                         if ( array[ i ] === elem ) {
691                                 return i;
692                         }
693                 }
694
695                 return -1;
696         },
697
698         merge: function( first, second ) {
699                 var i = first.length,
700                         j = 0;
701
702                 if ( typeof second.length === "number" ) {
703                         for ( var l = second.length; j < l; j++ ) {
704                                 first[ i++ ] = second[ j ];
705                         }
706
707                 } else {
708                         while ( second[j] !== undefined ) {
709                                 first[ i++ ] = second[ j++ ];
710                         }
711                 }
712
713                 first.length = i;
714
715                 return first;
716         },
717
718         grep: function( elems, callback, inv ) {
719                 var ret = [], retVal;
720                 inv = !!inv;
721
722                 // Go through the array, only saving the items
723                 // that pass the validator function
724                 for ( var i = 0, length = elems.length; i < length; i++ ) {
725                         retVal = !!callback( elems[ i ], i );
726                         if ( inv !== retVal ) {
727                                 ret.push( elems[ i ] );
728                         }
729                 }
730
731                 return ret;
732         },
733
734         // arg is for internal usage only
735         map: function( elems, callback, arg ) {
736                 var ret = [], value;
737
738                 // Go through the array, translating each of the items to their
739                 // new value (or values).
740                 for ( var i = 0, length = elems.length; i < length; i++ ) {
741                         value = callback( elems[ i ], i, arg );
742
743                         if ( value != null ) {
744                                 ret[ ret.length ] = value;
745                         }
746                 }
747
748                 // Flatten any nested arrays
749                 return ret.concat.apply( [], ret );
750         },
751
752         // A global GUID counter for objects
753         guid: 1,
754
755         proxy: function( fn, proxy, thisObject ) {
756                 if ( arguments.length === 2 ) {
757                         if ( typeof proxy === "string" ) {
758                                 thisObject = fn;
759                                 fn = thisObject[ proxy ];
760                                 proxy = undefined;
761
762                         } else if ( proxy && !jQuery.isFunction( proxy ) ) {
763                                 thisObject = proxy;
764                                 proxy = undefined;
765                         }
766                 }
767
768                 if ( !proxy && fn ) {
769                         proxy = function() {
770                                 return fn.apply( thisObject || this, arguments );
771                         };
772                 }
773
774                 // Set the guid of unique handler to the same of original handler, so it can be removed
775                 if ( fn ) {
776                         proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
777                 }
778
779                 // So proxy can be declared as an argument
780                 return proxy;
781         },
782
783         // Mutifunctional method to get and set values to a collection
784         // The value/s can be optionally by executed if its a function
785         access: function( elems, key, value, exec, fn, pass ) {
786                 var length = elems.length;
787
788                 // Setting many attributes
789                 if ( typeof key === "object" ) {
790                         for ( var k in key ) {
791                                 jQuery.access( elems, k, key[k], exec, fn, value );
792                         }
793                         return elems;
794                 }
795
796                 // Setting one attribute
797                 if ( value !== undefined ) {
798                         // Optionally, function values get executed if exec is true
799                         exec = !pass && exec && jQuery.isFunction(value);
800
801                         for ( var i = 0; i < length; i++ ) {
802                                 fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
803                         }
804
805                         return elems;
806                 }
807
808                 // Getting an attribute
809                 return length ? fn( elems[0], key ) : undefined;
810         },
811
812         now: function() {
813                 return (new Date()).getTime();
814         },
815
816         // Create a simple deferred (one callbacks list)
817         _Deferred: function() {
818                 var // callbacks list
819                         callbacks = [],
820                         // stored [ context , args ]
821                         fired,
822                         // to avoid firing when already doing so
823                         firing,
824                         // flag to know if the deferred has been cancelled
825                         cancelled,
826                         // the deferred itself
827                         deferred  = {
828
829                                 // done( f1, f2, ...)
830                                 done: function() {
831                                         if ( !cancelled ) {
832                                                 var args = arguments,
833                                                         i,
834                                                         length,
835                                                         elem,
836                                                         type,
837                                                         _fired;
838                                                 if ( fired ) {
839                                                         _fired = fired;
840                                                         fired = 0;
841                                                 }
842                                                 for ( i = 0, length = args.length; i < length; i++ ) {
843                                                         elem = args[ i ];
844                                                         type = jQuery.type( elem );
845                                                         if ( type === "array" ) {
846                                                                 deferred.done.apply( deferred, elem );
847                                                         } else if ( type === "function" ) {
848                                                                 callbacks.push( elem );
849                                                         }
850                                                 }
851                                                 if ( _fired ) {
852                                                         deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
853                                                 }
854                                         }
855                                         return this;
856                                 },
857
858                                 // resolve with given context and args
859                                 resolveWith: function( context, args ) {
860                                         if ( !cancelled && !fired && !firing ) {
861                                                 firing = 1;
862                                                 try {
863                                                         while( callbacks[ 0 ] ) {
864                                                                 callbacks.shift().apply( context, args );
865                                                         }
866                                                 }
867                                                 finally {
868                                                         fired = [ context, args ];
869                                                         firing = 0;
870                                                 }
871                                         }
872                                         return this;
873                                 },
874
875                                 // resolve with this as context and given arguments
876                                 resolve: function() {
877                                         deferred.resolveWith( jQuery.isFunction( this.promise ) ? this.promise() : this, arguments );
878                                         return this;
879                                 },
880
881                                 // Has this deferred been resolved?
882                                 isResolved: function() {
883                                         return !!( firing || fired );
884                                 },
885
886                                 // Cancel
887                                 cancel: function() {
888                                         cancelled = 1;
889                                         callbacks = [];
890                                         return this;
891                                 }
892                         };
893
894                 return deferred;
895         },
896
897         // Full fledged deferred (two callbacks list)
898         Deferred: function( func ) {
899                 var deferred = jQuery._Deferred(),
900                         failDeferred = jQuery._Deferred(),
901                         promise;
902                 // Add errorDeferred methods, then and promise
903                 jQuery.extend( deferred, {
904                         then: function( doneCallbacks, failCallbacks ) {
905                                 deferred.done( doneCallbacks ).fail( failCallbacks );
906                                 return this;
907                         },
908                         fail: failDeferred.done,
909                         rejectWith: failDeferred.resolveWith,
910                         reject: failDeferred.resolve,
911                         isRejected: failDeferred.isResolved,
912                         // Get a promise for this deferred
913                         // If obj is provided, the promise aspect is added to the object
914                         promise: function( obj , i /* internal */ ) {
915                                 if ( obj == null ) {
916                                         if ( promise ) {
917                                                 return promise;
918                                         }
919                                         promise = obj = {};
920                                 }
921                                 i = promiseMethods.length;
922                                 while( i-- ) {
923                                         obj[ promiseMethods[ i ] ] = deferred[ promiseMethods[ i ] ];
924                                 }
925                                 return obj;
926                         }
927                 } );
928                 // Make sure only one callback list will be used
929                 deferred.then( failDeferred.cancel, deferred.cancel );
930                 // Unexpose cancel
931                 delete deferred.cancel;
932                 // Call given func if any
933                 if ( func ) {
934                         func.call( deferred, deferred );
935                 }
936                 return deferred;
937         },
938
939         // Deferred helper
940         when: function( object ) {
941                 var args = arguments,
942                         length = args.length,
943                         deferred = length <= 1 && object && jQuery.isFunction( object.promise ) ?
944                                 object :
945                                 jQuery.Deferred(),
946                         promise = deferred.promise(),
947                         resolveArray;
948
949                 if ( length > 1 ) {
950                         resolveArray = new Array( length );
951                         jQuery.each( args, function( index, element ) {
952                                 jQuery.when( element ).then( function( value ) {
953                                         resolveArray[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value;
954                                         if( ! --length ) {
955                                                 deferred.resolveWith( promise, resolveArray );
956                                         }
957                                 }, deferred.reject );
958                         } );
959                 } else if ( deferred !== object ) {
960                         deferred.resolve( object );
961                 }
962                 return promise;
963         },
964
965         // Use of jQuery.browser is frowned upon.
966         // More details: http://docs.jquery.com/Utilities/jQuery.browser
967         uaMatch: function( ua ) {
968                 ua = ua.toLowerCase();
969
970                 var match = rwebkit.exec( ua ) ||
971                         ropera.exec( ua ) ||
972                         rmsie.exec( ua ) ||
973                         ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
974                         [];
975
976                 return { browser: match[1] || "", version: match[2] || "0" };
977         },
978
979         sub: function() {
980                 function jQuerySubclass( selector, context ) {
981                         return new jQuerySubclass.fn.init( selector, context );
982                 }
983                 jQuery.extend( true, jQuerySubclass, this );
984                 jQuerySubclass.superclass = this;
985                 jQuerySubclass.fn = jQuerySubclass.prototype = this();
986                 jQuerySubclass.fn.constructor = jQuerySubclass;
987                 jQuerySubclass.subclass = this.subclass;
988                 jQuerySubclass.fn.init = function init( selector, context ) {
989                         if ( context && context instanceof jQuery && !(context instanceof jQuerySubclass) ) {
990                                 context = jQuerySubclass(context);
991                         }
992
993                         return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass );
994                 };
995                 jQuerySubclass.fn.init.prototype = jQuerySubclass.fn;
996                 var rootjQuerySubclass = jQuerySubclass(document);
997                 return jQuerySubclass;
998         },
999
1000         browser: {}
1001 });
1002
1003 // Create readyList deferred
1004 readyList = jQuery._Deferred();
1005
1006 // Populate the class2type map
1007 jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
1008         class2type[ "[object " + name + "]" ] = name.toLowerCase();
1009 });
1010
1011 browserMatch = jQuery.uaMatch( userAgent );
1012 if ( browserMatch.browser ) {
1013         jQuery.browser[ browserMatch.browser ] = true;
1014         jQuery.browser.version = browserMatch.version;
1015 }
1016
1017 // Deprecated, use jQuery.browser.webkit instead
1018 if ( jQuery.browser.webkit ) {
1019         jQuery.browser.safari = true;
1020 }
1021
1022 if ( indexOf ) {
1023         jQuery.inArray = function( elem, array ) {
1024                 return indexOf.call( array, elem );
1025         };
1026 }
1027
1028 // IE doesn't match non-breaking spaces with \s
1029 if ( rnotwhite.test( "\xA0" ) ) {
1030         trimLeft = /^[\s\xA0]+/;
1031         trimRight = /[\s\xA0]+$/;
1032 }
1033
1034 // All jQuery objects should point back to these
1035 rootjQuery = jQuery(document);
1036
1037 // Cleanup functions for the document ready method
1038 if ( document.addEventListener ) {
1039         DOMContentLoaded = function() {
1040                 document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
1041                 jQuery.ready();
1042         };
1043
1044 } else if ( document.attachEvent ) {
1045         DOMContentLoaded = function() {
1046                 // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
1047                 if ( document.readyState === "complete" ) {
1048                         document.detachEvent( "onreadystatechange", DOMContentLoaded );
1049                         jQuery.ready();
1050                 }
1051         };
1052 }
1053
1054 // The DOM ready check for Internet Explorer
1055 function doScrollCheck() {
1056         if ( jQuery.isReady ) {
1057                 return;
1058         }
1059
1060         try {
1061                 // If IE is used, use the trick by Diego Perini
1062                 // http://javascript.nwbox.com/IEContentLoaded/
1063                 document.documentElement.doScroll("left");
1064         } catch(e) {
1065                 setTimeout( doScrollCheck, 1 );
1066                 return;
1067         }
1068
1069         // and execute any waiting functions
1070         jQuery.ready();
1071 }
1072
1073 // Expose jQuery to the global object
1074 return (window.jQuery = window.$ = jQuery);
1075
1076 })();
1077
1078
1079 (function() {
1080
1081         jQuery.support = {};
1082
1083         var div = document.createElement("div");
1084
1085         div.style.display = "none";
1086         div.innerHTML = "   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
1087
1088         var all = div.getElementsByTagName("*"),
1089                 a = div.getElementsByTagName("a")[0],
1090                 select = document.createElement("select"),
1091                 opt = select.appendChild( document.createElement("option") );
1092
1093         // Can't get basic test support
1094         if ( !all || !all.length || !a ) {
1095                 return;
1096         }
1097
1098         jQuery.support = {
1099                 // IE strips leading whitespace when .innerHTML is used
1100                 leadingWhitespace: div.firstChild.nodeType === 3,
1101
1102                 // Make sure that tbody elements aren't automatically inserted
1103                 // IE will insert them into empty tables
1104                 tbody: !div.getElementsByTagName("tbody").length,
1105
1106                 // Make sure that link elements get serialized correctly by innerHTML
1107                 // This requires a wrapper element in IE
1108                 htmlSerialize: !!div.getElementsByTagName("link").length,
1109
1110                 // Get the style information from getAttribute
1111                 // (IE uses .cssText insted)
1112                 style: /red/.test( a.getAttribute("style") ),
1113
1114                 // Make sure that URLs aren't manipulated
1115                 // (IE normalizes it by default)
1116                 hrefNormalized: a.getAttribute("href") === "/a",
1117
1118                 // Make sure that element opacity exists
1119                 // (IE uses filter instead)
1120                 // Use a regex to work around a WebKit issue. See #5145
1121                 opacity: /^0.55$/.test( a.style.opacity ),
1122
1123                 // Verify style float existence
1124                 // (IE uses styleFloat instead of cssFloat)
1125                 cssFloat: !!a.style.cssFloat,
1126
1127                 // Make sure that if no value is specified for a checkbox
1128                 // that it defaults to "on".
1129                 // (WebKit defaults to "" instead)
1130                 checkOn: div.getElementsByTagName("input")[0].value === "on",
1131
1132                 // Make sure that a selected-by-default option has a working selected property.
1133                 // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
1134                 optSelected: opt.selected,
1135
1136                 // Will be defined later
1137                 deleteExpando: true,
1138                 optDisabled: false,
1139                 checkClone: false,
1140                 _scriptEval: null,
1141                 noCloneEvent: true,
1142                 boxModel: null,
1143                 inlineBlockNeedsLayout: false,
1144                 shrinkWrapBlocks: false,
1145                 reliableHiddenOffsets: true
1146         };
1147
1148         // Make sure that the options inside disabled selects aren't marked as disabled
1149         // (WebKit marks them as diabled)
1150         select.disabled = true;
1151         jQuery.support.optDisabled = !opt.disabled;
1152
1153         jQuery.support.scriptEval = function() {
1154                 if ( jQuery.support._scriptEval === null ) {
1155                         var root = document.documentElement,
1156                                 script = document.createElement("script"),
1157                                 id = "script" + jQuery.now();
1158
1159                         script.type = "text/javascript";
1160                         try {
1161                                 script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
1162                         } catch(e) {}
1163
1164                         root.insertBefore( script, root.firstChild );
1165
1166                         // Make sure that the execution of code works by injecting a script
1167                         // tag with appendChild/createTextNode
1168                         // (IE doesn't support this, fails, and uses .text instead)
1169                         if ( window[ id ] ) {
1170                                 jQuery.support._scriptEval = true;
1171                                 delete window[ id ];
1172                         } else {
1173                                 jQuery.support._scriptEval = false;
1174                         }
1175
1176                         root.removeChild( script );
1177                         // release memory in IE
1178                         root = script = id  = null;
1179                 }
1180
1181                 return jQuery.support._scriptEval;
1182         };
1183
1184         // Test to see if it's possible to delete an expando from an element
1185         // Fails in Internet Explorer
1186         try {
1187                 delete div.test;
1188
1189         } catch(e) {
1190                 jQuery.support.deleteExpando = false;
1191         }
1192
1193         if ( div.attachEvent && div.fireEvent ) {
1194                 div.attachEvent("onclick", function click() {
1195                         // Cloning a node shouldn't copy over any
1196                         // bound event handlers (IE does this)
1197                         jQuery.support.noCloneEvent = false;
1198                         div.detachEvent("onclick", click);
1199                 });
1200                 div.cloneNode(true).fireEvent("onclick");
1201         }
1202
1203         div = document.createElement("div");
1204         div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
1205
1206         var fragment = document.createDocumentFragment();
1207         fragment.appendChild( div.firstChild );
1208
1209         // WebKit doesn't clone checked state correctly in fragments
1210         jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
1211
1212         // Figure out if the W3C box model works as expected
1213         // document.body must exist before we can do this
1214         jQuery(function() {
1215                 var div = document.createElement("div"),
1216                         body = document.getElementsByTagName("body")[0];
1217
1218                 // Frameset documents with no body should not run this code
1219                 if ( !body ) {
1220                         return;
1221                 }
1222
1223                 div.style.width = div.style.paddingLeft = "1px";
1224                 body.appendChild( div );
1225                 jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
1226
1227                 if ( "zoom" in div.style ) {
1228                         // Check if natively block-level elements act like inline-block
1229                         // elements when setting their display to 'inline' and giving
1230                         // them layout
1231                         // (IE < 8 does this)
1232                         div.style.display = "inline";
1233                         div.style.zoom = 1;
1234                         jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2;
1235
1236                         // Check if elements with layout shrink-wrap their children
1237                         // (IE 6 does this)
1238                         div.style.display = "";
1239                         div.innerHTML = "<div style='width:4px;'></div>";
1240                         jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2;
1241                 }
1242
1243                 div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
1244                 var tds = div.getElementsByTagName("td");
1245
1246                 // Check if table cells still have offsetWidth/Height when they are set
1247                 // to display:none and there are still other visible table cells in a
1248                 // table row; if so, offsetWidth/Height are not reliable for use when
1249                 // determining if an element has been hidden directly using
1250                 // display:none (it is still safe to use offsets if a parent element is
1251                 // hidden; don safety goggles and see bug #4512 for more information).
1252                 // (only IE 8 fails this test)
1253                 jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0;
1254
1255                 tds[0].style.display = "";
1256                 tds[1].style.display = "none";
1257
1258                 // Check if empty table cells still have offsetWidth/Height
1259                 // (IE < 8 fail this test)
1260                 jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0;
1261                 div.innerHTML = "";
1262
1263                 body.removeChild( div ).style.display = "none";
1264                 div = tds = null;
1265         });
1266
1267         // Technique from Juriy Zaytsev
1268         // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
1269         var eventSupported = function( eventName ) {
1270                 var el = document.createElement("div");
1271                 eventName = "on" + eventName;
1272
1273                 // We only care about the case where non-standard event systems
1274                 // are used, namely in IE. Short-circuiting here helps us to
1275                 // avoid an eval call (in setAttribute) which can cause CSP
1276                 // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
1277                 if ( !el.attachEvent ) {
1278                         return true;
1279                 }
1280
1281                 var isSupported = (eventName in el);
1282                 if ( !isSupported ) {
1283                         el.setAttribute(eventName, "return;");
1284                         isSupported = typeof el[eventName] === "function";
1285                 }
1286                 el = null;
1287
1288                 return isSupported;
1289         };
1290
1291         jQuery.support.submitBubbles = eventSupported("submit");
1292         jQuery.support.changeBubbles = eventSupported("change");
1293
1294         // release memory in IE
1295         div = all = a = null;
1296 })();
1297
1298
1299
1300 var rbrace = /^(?:\{.*\}|\[.*\])$/;
1301
1302 jQuery.extend({
1303         cache: {},
1304
1305         // Please use with caution
1306         uuid: 0,
1307
1308         // Unique for each copy of jQuery on the page
1309         // Non-digits removed to match rinlinejQuery
1310         expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
1311
1312         // The following elements throw uncatchable exceptions if you
1313         // attempt to add expando properties to them.
1314         noData: {
1315                 "embed": true,
1316                 // Ban all objects except for Flash (which handle expandos)
1317                 "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
1318                 "applet": true
1319         },
1320
1321         hasData: function( elem ) {
1322                 elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
1323
1324                 return !!elem && !jQuery.isEmptyObject(elem);
1325         },
1326
1327         data: function( elem, name, data, pvt /* Internal Use Only */ ) {
1328                 if ( !jQuery.acceptData( elem ) ) {
1329                         return;
1330                 }
1331
1332                 var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache,
1333
1334                         // We have to handle DOM nodes and JS objects differently because IE6-7
1335                         // can't GC object references properly across the DOM-JS boundary
1336                         isNode = elem.nodeType,
1337
1338                         // Only DOM nodes need the global jQuery cache; JS object data is
1339                         // attached directly to the object so GC can occur automatically
1340                         cache = isNode ? jQuery.cache : elem,
1341
1342                         // Only defining an ID for JS objects if its cache already exists allows
1343                         // the code to shortcut on the same path as a DOM node with no cache
1344                         id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
1345
1346                 // Avoid doing any more work than we need to when trying to get data on an
1347                 // object that has no data at all
1348                 if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) {
1349                         return;
1350                 }
1351
1352                 if ( !id ) {
1353                         // Only DOM nodes need a new unique ID for each element since their data
1354                         // ends up in the global cache
1355                         if ( isNode ) {
1356                                 elem[ jQuery.expando ] = id = ++jQuery.uuid;
1357                         } else {
1358                                 id = jQuery.expando;
1359                         }
1360                 }
1361
1362                 if ( !cache[ id ] ) {
1363                         cache[ id ] = {};
1364                 }
1365
1366                 // An object can be passed to jQuery.data instead of a key/value pair; this gets
1367                 // shallow copied over onto the existing cache
1368                 if ( typeof name === "object" ) {
1369                         if ( pvt ) {
1370                                 cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
1371                         } else {
1372                                 cache[ id ] = jQuery.extend(cache[ id ], name);
1373                         }
1374                 }
1375
1376                 thisCache = cache[ id ];
1377
1378                 // Internal jQuery data is stored in a separate object inside the object's data
1379                 // cache in order to avoid key collisions between internal data and user-defined
1380                 // data
1381                 if ( pvt ) {
1382                         if ( !thisCache[ internalKey ] ) {
1383                                 thisCache[ internalKey ] = {};
1384                         }
1385
1386                         thisCache = thisCache[ internalKey ];
1387                 }
1388
1389                 if ( data !== undefined ) {
1390                         thisCache[ name ] = data;
1391                 }
1392
1393                 // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
1394                 // not attempt to inspect the internal events object using jQuery.data, as this
1395                 // internal data object is undocumented and subject to change.
1396                 if ( name === "events" && !thisCache[name] ) {
1397                         return thisCache[ internalKey ] && thisCache[ internalKey ].events;
1398                 }
1399
1400                 return getByName ? thisCache[ name ] : thisCache;
1401         },
1402
1403         removeData: function( elem, name, pvt /* Internal Use Only */ ) {
1404                 if ( !jQuery.acceptData( elem ) ) {
1405                         return;
1406                 }
1407
1408                 var internalKey = jQuery.expando, isNode = elem.nodeType,
1409
1410                         // See jQuery.data for more information
1411                         cache = isNode ? jQuery.cache : elem,
1412
1413                         // See jQuery.data for more information
1414                         id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
1415
1416                 // If there is already no cache entry for this object, there is no
1417                 // purpose in continuing
1418                 if ( !cache[ id ] ) {
1419                         return;
1420                 }
1421
1422                 if ( name ) {
1423                         var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
1424
1425                         if ( thisCache ) {
1426                                 delete thisCache[ name ];
1427
1428                                 // If there is no data left in the cache, we want to continue
1429                                 // and let the cache object itself get destroyed
1430                                 if ( !jQuery.isEmptyObject(thisCache) ) {
1431                                         return;
1432                                 }
1433                         }
1434                 }
1435
1436                 // See jQuery.data for more information
1437                 if ( pvt ) {
1438                         delete cache[ id ][ internalKey ];
1439
1440                         // Don't destroy the parent cache unless the internal data object
1441                         // had been the only thing left in it
1442                         if ( !jQuery.isEmptyObject(cache[ id ]) ) {
1443                                 return;
1444                         }
1445                 }
1446
1447                 var internalCache = cache[ id ][ internalKey ];
1448
1449                 // Browsers that fail expando deletion also refuse to delete expandos on
1450                 // the window, but it will allow it on all other JS objects; other browsers
1451                 // don't care
1452                 if ( jQuery.support.deleteExpando || cache != window ) {
1453                         delete cache[ id ];
1454                 } else {
1455                         cache[ id ] = null;
1456                 }
1457
1458                 // We destroyed the entire user cache at once because it's faster than
1459                 // iterating through each key, but we need to continue to persist internal
1460                 // data if it existed
1461                 if ( internalCache ) {
1462                         cache[ id ] = {};
1463                         cache[ id ][ internalKey ] = internalCache;
1464
1465                 // Otherwise, we need to eliminate the expando on the node to avoid
1466                 // false lookups in the cache for entries that no longer exist
1467                 } else if ( isNode ) {
1468                         // IE does not allow us to delete expando properties from nodes,
1469                         // nor does it have a removeAttribute function on Document nodes;
1470                         // we must handle all of these cases
1471                         if ( jQuery.support.deleteExpando ) {
1472                                 delete elem[ jQuery.expando ];
1473                         } else if ( elem.removeAttribute ) {
1474                                 elem.removeAttribute( jQuery.expando );
1475                         } else {
1476                                 elem[ jQuery.expando ] = null;
1477                         }
1478                 }
1479         },
1480
1481         // For internal use only.
1482         _data: function( elem, name, data ) {
1483                 return jQuery.data( elem, name, data, true );
1484         },
1485
1486         // A method for determining if a DOM node can handle the data expando
1487         acceptData: function( elem ) {
1488                 if ( elem.nodeName ) {
1489                         var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
1490
1491                         if ( match ) {
1492                                 return !(match === true || elem.getAttribute("classid") !== match);
1493                         }
1494                 }
1495
1496                 return true;
1497         }
1498 });
1499
1500 jQuery.fn.extend({
1501         data: function( key, value ) {
1502                 var data = null;
1503
1504                 if ( typeof key === "undefined" ) {
1505                         if ( this.length ) {
1506                                 data = jQuery.data( this[0] );
1507
1508                                 if ( this[0].nodeType === 1 ) {
1509                                         var attr = this[0].attributes, name;
1510                                         for ( var i = 0, l = attr.length; i < l; i++ ) {
1511                                                 name = attr[i].name;
1512
1513                                                 if ( name.indexOf( "data-" ) === 0 ) {
1514                                                         name = name.substr( 5 );
1515                                                         dataAttr( this[0], name, data[ name ] );
1516                                                 }
1517                                         }
1518                                 }
1519                         }
1520
1521                         return data;
1522
1523                 } else if ( typeof key === "object" ) {
1524                         return this.each(function() {
1525                                 jQuery.data( this, key );
1526                         });
1527                 }
1528
1529                 var parts = key.split(".");
1530                 parts[1] = parts[1] ? "." + parts[1] : "";
1531
1532                 if ( value === undefined ) {
1533                         data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1534
1535                         // Try to fetch any internally stored data first
1536                         if ( data === undefined && this.length ) {
1537                                 data = jQuery.data( this[0], key );
1538                                 data = dataAttr( this[0], key, data );
1539                         }
1540
1541                         return data === undefined && parts[1] ?
1542                                 this.data( parts[0] ) :
1543                                 data;
1544
1545                 } else {
1546                         return this.each(function() {
1547                                 var $this = jQuery( this ),
1548                                         args = [ parts[0], value ];
1549
1550                                 $this.triggerHandler( "setData" + parts[1] + "!", args );
1551                                 jQuery.data( this, key, value );
1552                                 $this.triggerHandler( "changeData" + parts[1] + "!", args );
1553                         });
1554                 }
1555         },
1556
1557         removeData: function( key ) {
1558                 return this.each(function() {
1559                         jQuery.removeData( this, key );
1560                 });
1561         }
1562 });
1563
1564 function dataAttr( elem, key, data ) {
1565         // If nothing was found internally, try to fetch any
1566         // data from the HTML5 data-* attribute
1567         if ( data === undefined && elem.nodeType === 1 ) {
1568                 data = elem.getAttribute( "data-" + key );
1569
1570                 if ( typeof data === "string" ) {
1571                         try {
1572                                 data = data === "true" ? true :
1573                                 data === "false" ? false :
1574                                 data === "null" ? null :
1575                                 !jQuery.isNaN( data ) ? parseFloat( data ) :
1576                                         rbrace.test( data ) ? jQuery.parseJSON( data ) :
1577                                         data;
1578                         } catch( e ) {}
1579
1580                         // Make sure we set the data so it isn't changed later
1581                         jQuery.data( elem, key, data );
1582
1583                 } else {
1584                         data = undefined;
1585                 }
1586         }
1587
1588         return data;
1589 }
1590
1591
1592
1593
1594 jQuery.extend({
1595         queue: function( elem, type, data ) {
1596                 if ( !elem ) {
1597                         return;
1598                 }
1599
1600                 type = (type || "fx") + "queue";
1601                 var q = jQuery._data( elem, type );
1602
1603                 // Speed up dequeue by getting out quickly if this is just a lookup
1604                 if ( !data ) {
1605                         return q || [];
1606                 }
1607
1608                 if ( !q || jQuery.isArray(data) ) {
1609                         q = jQuery._data( elem, type, jQuery.makeArray(data) );
1610
1611                 } else {
1612                         q.push( data );
1613                 }
1614
1615                 return q;
1616         },
1617
1618         dequeue: function( elem, type ) {
1619                 type = type || "fx";
1620
1621                 var queue = jQuery.queue( elem, type ),
1622                         fn = queue.shift();
1623
1624                 // If the fx queue is dequeued, always remove the progress sentinel
1625                 if ( fn === "inprogress" ) {
1626                         fn = queue.shift();
1627                 }
1628
1629                 if ( fn ) {
1630                         // Add a progress sentinel to prevent the fx queue from being
1631                         // automatically dequeued
1632                         if ( type === "fx" ) {
1633                                 queue.unshift("inprogress");
1634                         }
1635
1636                         fn.call(elem, function() {
1637                                 jQuery.dequeue(elem, type);
1638                         });
1639                 }
1640
1641                 if ( !queue.length ) {
1642                         jQuery.removeData( elem, type + "queue", true );
1643                 }
1644         }
1645 });
1646
1647 jQuery.fn.extend({
1648         queue: function( type, data ) {
1649                 if ( typeof type !== "string" ) {
1650                         data = type;
1651                         type = "fx";
1652                 }
1653
1654                 if ( data === undefined ) {
1655                         return jQuery.queue( this[0], type );
1656                 }
1657                 return this.each(function( i ) {
1658                         var queue = jQuery.queue( this, type, data );
1659
1660                         if ( type === "fx" && queue[0] !== "inprogress" ) {
1661                                 jQuery.dequeue( this, type );
1662                         }
1663                 });
1664         },
1665         dequeue: function( type ) {
1666                 return this.each(function() {
1667                         jQuery.dequeue( this, type );
1668                 });
1669         },
1670
1671         // Based off of the plugin by Clint Helfers, with permission.
1672         // http://blindsignals.com/index.php/2009/07/jquery-delay/
1673         delay: function( time, type ) {
1674                 time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
1675                 type = type || "fx";
1676
1677                 return this.queue( type, function() {
1678                         var elem = this;
1679                         setTimeout(function() {
1680                                 jQuery.dequeue( elem, type );
1681                         }, time );
1682                 });
1683         },
1684
1685         clearQueue: function( type ) {
1686                 return this.queue( type || "fx", [] );
1687         }
1688 });
1689
1690
1691
1692
1693 var rclass = /[\n\t\r]/g,
1694         rspaces = /\s+/,
1695         rreturn = /\r/g,
1696         rspecialurl = /^(?:href|src|style)$/,
1697         rtype = /^(?:button|input)$/i,
1698         rfocusable = /^(?:button|input|object|select|textarea)$/i,
1699         rclickable = /^a(?:rea)?$/i,
1700         rradiocheck = /^(?:radio|checkbox)$/i;
1701
1702 jQuery.props = {
1703         "for": "htmlFor",
1704         "class": "className",
1705         readonly: "readOnly",
1706         maxlength: "maxLength",
1707         cellspacing: "cellSpacing",
1708         rowspan: "rowSpan",
1709         colspan: "colSpan",
1710         tabindex: "tabIndex",
1711         usemap: "useMap",
1712         frameborder: "frameBorder"
1713 };
1714
1715 jQuery.fn.extend({
1716         attr: function( name, value ) {
1717                 return jQuery.access( this, name, value, true, jQuery.attr );
1718         },
1719
1720         removeAttr: function( name, fn ) {
1721                 return this.each(function(){
1722                         jQuery.attr( this, name, "" );
1723                         if ( this.nodeType === 1 ) {
1724                                 this.removeAttribute( name );
1725                         }
1726                 });
1727         },
1728
1729         addClass: function( value ) {
1730                 if ( jQuery.isFunction(value) ) {
1731                         return this.each(function(i) {
1732                                 var self = jQuery(this);
1733                                 self.addClass( value.call(this, i, self.attr("class")) );
1734                         });
1735                 }
1736
1737                 if ( value && typeof value === "string" ) {
1738                         var classNames = (value || "").split( rspaces );
1739
1740                         for ( var i = 0, l = this.length; i < l; i++ ) {
1741                                 var elem = this[i];
1742
1743                                 if ( elem.nodeType === 1 ) {
1744                                         if ( !elem.className ) {
1745                                                 elem.className = value;
1746
1747                                         } else {
1748                                                 var className = " " + elem.className + " ",
1749                                                         setClass = elem.className;
1750
1751                                                 for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
1752                                                         if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
1753                                                                 setClass += " " + classNames[c];
1754                                                         }
1755                                                 }
1756                                                 elem.className = jQuery.trim( setClass );
1757                                         }
1758                                 }
1759                         }
1760                 }
1761
1762                 return this;
1763         },
1764
1765         removeClass: function( value ) {
1766                 if ( jQuery.isFunction(value) ) {
1767                         return this.each(function(i) {
1768                                 var self = jQuery(this);
1769                                 self.removeClass( value.call(this, i, self.attr("class")) );
1770                         });
1771                 }
1772
1773                 if ( (value && typeof value === "string") || value === undefined ) {
1774                         var classNames = (value || "").split( rspaces );
1775
1776                         for ( var i = 0, l = this.length; i < l; i++ ) {
1777                                 var elem = this[i];
1778
1779                                 if ( elem.nodeType === 1 && elem.className ) {
1780                                         if ( value ) {
1781                                                 var className = (" " + elem.className + " ").replace(rclass, " ");
1782                                                 for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
1783                                                         className = className.replace(" " + classNames[c] + " ", " ");
1784                                                 }
1785                                                 elem.className = jQuery.trim( className );
1786
1787                                         } else {
1788                                                 elem.className = "";
1789                                         }
1790                                 }
1791                         }
1792                 }
1793
1794                 return this;
1795         },
1796
1797         toggleClass: function( value, stateVal ) {
1798                 var type = typeof value,
1799                         isBool = typeof stateVal === "boolean";
1800
1801                 if ( jQuery.isFunction( value ) ) {
1802                         return this.each(function(i) {
1803                                 var self = jQuery(this);
1804                                 self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
1805                         });
1806                 }
1807
1808                 return this.each(function() {
1809                         if ( type === "string" ) {
1810                                 // toggle individual class names
1811                                 var className,
1812                                         i = 0,
1813                                         self = jQuery( this ),
1814                                         state = stateVal,
1815                                         classNames = value.split( rspaces );
1816
1817                                 while ( (className = classNames[ i++ ]) ) {
1818                                         // check each className given, space seperated list
1819                                         state = isBool ? state : !self.hasClass( className );
1820                                         self[ state ? "addClass" : "removeClass" ]( className );
1821                                 }
1822
1823                         } else if ( type === "undefined" || type === "boolean" ) {
1824                                 if ( this.className ) {
1825                                         // store className if set
1826                                         jQuery._data( this, "__className__", this.className );
1827                                 }
1828
1829                                 // toggle whole className
1830                                 this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
1831                         }
1832                 });
1833         },
1834
1835         hasClass: function( selector ) {
1836                 var className = " " + selector + " ";
1837                 for ( var i = 0, l = this.length; i < l; i++ ) {
1838                         if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
1839                                 return true;
1840                         }
1841                 }
1842
1843                 return false;
1844         },
1845
1846         val: function( value ) {
1847                 if ( !arguments.length ) {
1848                         var elem = this[0];
1849
1850                         if ( elem ) {
1851                                 if ( jQuery.nodeName( elem, "option" ) ) {
1852                                         // attributes.value is undefined in Blackberry 4.7 but
1853                                         // uses .value. See #6932
1854                                         var val = elem.attributes.value;
1855                                         return !val || val.specified ? elem.value : elem.text;
1856                                 }
1857
1858                                 // We need to handle select boxes special
1859                                 if ( jQuery.nodeName( elem, "select" ) ) {
1860                                         var index = elem.selectedIndex,
1861                                                 values = [],
1862                                                 options = elem.options,
1863                                                 one = elem.type === "select-one";
1864
1865                                         // Nothing was selected
1866                                         if ( index < 0 ) {
1867                                                 return null;
1868                                         }
1869
1870                                         // Loop through all the selected options
1871                                         for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
1872                                                 var option = options[ i ];
1873
1874                                                 // Don't return options that are disabled or in a disabled optgroup
1875                                                 if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
1876                                                                 (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
1877
1878                                                         // Get the specific value for the option
1879                                                         value = jQuery(option).val();
1880
1881                                                         // We don't need an array for one selects
1882                                                         if ( one ) {
1883                                                                 return value;
1884                                                         }
1885
1886                                                         // Multi-Selects return an array
1887                                                         values.push( value );
1888                                                 }
1889                                         }
1890
1891                                         return values;
1892                                 }
1893
1894                                 // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
1895                                 if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
1896                                         return elem.getAttribute("value") === null ? "on" : elem.value;
1897                                 }
1898
1899                                 // Everything else, we just grab the value
1900                                 return (elem.value || "").replace(rreturn, "");
1901
1902                         }
1903
1904                         return undefined;
1905                 }
1906
1907                 var isFunction = jQuery.isFunction(value);
1908
1909                 return this.each(function(i) {
1910                         var self = jQuery(this), val = value;
1911
1912                         if ( this.nodeType !== 1 ) {
1913                                 return;
1914                         }
1915
1916                         if ( isFunction ) {
1917                                 val = value.call(this, i, self.val());
1918                         }
1919
1920                         // Treat null/undefined as ""; convert numbers to string
1921                         if ( val == null ) {
1922                                 val = "";
1923                         } else if ( typeof val === "number" ) {
1924                                 val += "";
1925                         } else if ( jQuery.isArray(val) ) {
1926                                 val = jQuery.map(val, function (value) {
1927                                         return value == null ? "" : value + "";
1928                                 });
1929                         }
1930
1931                         if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
1932                                 this.checked = jQuery.inArray( self.val(), val ) >= 0;
1933
1934                         } else if ( jQuery.nodeName( this, "select" ) ) {
1935                                 var values = jQuery.makeArray(val);
1936
1937                                 jQuery( "option", this ).each(function() {
1938                                         this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
1939                                 });
1940
1941                                 if ( !values.length ) {
1942                                         this.selectedIndex = -1;
1943                                 }
1944
1945                         } else {
1946                                 this.value = val;
1947                         }
1948                 });
1949         }
1950 });
1951
1952 jQuery.extend({
1953         attrFn: {
1954                 val: true,
1955                 css: true,
1956                 html: true,
1957                 text: true,
1958                 data: true,
1959                 width: true,
1960                 height: true,
1961                 offset: true
1962         },
1963
1964         attr: function( elem, name, value, pass ) {
1965                 // don't get/set attributes on text, comment and attribute nodes
1966                 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || elem.nodeType === 2 ) {
1967                         return undefined;
1968                 }
1969
1970                 if ( pass && name in jQuery.attrFn ) {
1971                         return jQuery(elem)[name](value);
1972                 }
1973
1974                 var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
1975                         // Whether we are setting (or getting)
1976                         set = value !== undefined;
1977
1978                 // Try to normalize/fix the name
1979                 name = notxml && jQuery.props[ name ] || name;
1980
1981                 // Only do all the following if this is a node (faster for style)
1982                 if ( elem.nodeType === 1 ) {
1983                         // These attributes require special treatment
1984                         var special = rspecialurl.test( name );
1985
1986                         // Safari mis-reports the default selected property of an option
1987                         // Accessing the parent's selectedIndex property fixes it
1988                         if ( name === "selected" && !jQuery.support.optSelected ) {
1989                                 var parent = elem.parentNode;
1990                                 if ( parent ) {
1991                                         parent.selectedIndex;
1992
1993                                         // Make sure that it also works with optgroups, see #5701
1994                                         if ( parent.parentNode ) {
1995                                                 parent.parentNode.selectedIndex;
1996                                         }
1997                                 }
1998                         }
1999
2000                         // If applicable, access the attribute via the DOM 0 way
2001                         // 'in' checks fail in Blackberry 4.7 #6931
2002                         if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) {
2003                                 if ( set ) {
2004                                         // We can't allow the type property to be changed (since it causes problems in IE)
2005                                         if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
2006                                                 jQuery.error( "type property can't be changed" );
2007                                         }
2008
2009                                         if ( value === null ) {
2010                                                 if ( elem.nodeType === 1 ) {
2011                                                         elem.removeAttribute( name );
2012                                                 }
2013
2014                                         } else {
2015                                                 elem[ name ] = value;
2016                                         }
2017                                 }
2018
2019                                 // browsers index elements by id/name on forms, give priority to attributes.
2020                                 if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
2021                                         return elem.getAttributeNode( name ).nodeValue;
2022                                 }
2023
2024                                 // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
2025                                 // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
2026                                 if ( name === "tabIndex" ) {
2027                                         var attributeNode = elem.getAttributeNode( "tabIndex" );
2028
2029                                         return attributeNode && attributeNode.specified ?
2030                                                 attributeNode.value :
2031                                                 rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
2032                                                         0 :
2033                                                         undefined;
2034                                 }
2035
2036                                 return elem[ name ];
2037                         }
2038
2039                         if ( !jQuery.support.style && notxml && name === "style" ) {
2040                                 if ( set ) {
2041                                         elem.style.cssText = "" + value;
2042                                 }
2043
2044                                 return elem.style.cssText;
2045                         }
2046
2047                         if ( set ) {
2048                                 // convert the value to a string (all browsers do this but IE) see #1070
2049                                 elem.setAttribute( name, "" + value );
2050                         }
2051
2052                         // Ensure that missing attributes return undefined
2053                         // Blackberry 4.7 returns "" from getAttribute #6938
2054                         if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) {
2055                                 return undefined;
2056                         }
2057
2058                         var attr = !jQuery.support.hrefNormalized && notxml && special ?
2059                                         // Some attributes require a special call on IE
2060                                         elem.getAttribute( name, 2 ) :
2061                                         elem.getAttribute( name );
2062
2063                         // Non-existent attributes return null, we normalize to undefined
2064                         return attr === null ? undefined : attr;
2065                 }
2066                 // Handle everything which isn't a DOM element node
2067                 if ( set ) {
2068                         elem[ name ] = value;
2069                 }
2070                 return elem[ name ];
2071         }
2072 });
2073
2074
2075
2076
2077 var rnamespaces = /\.(.*)$/,
2078         rformElems = /^(?:textarea|input|select)$/i,
2079         rperiod = /\./g,
2080         rspace = / /g,
2081         rescape = /[^\w\s.|`]/g,
2082         fcleanup = function( nm ) {
2083                 return nm.replace(rescape, "\\$&");
2084         },
2085         eventKey = "events";
2086
2087 /*
2088  * A number of helper functions used for managing events.
2089  * Many of the ideas behind this code originated from
2090  * Dean Edwards' addEvent library.
2091  */
2092 jQuery.event = {
2093
2094         // Bind an event to an element
2095         // Original by Dean Edwards
2096         add: function( elem, types, handler, data ) {
2097                 if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
2098                         return;
2099                 }
2100
2101                 // For whatever reason, IE has trouble passing the window object
2102                 // around, causing it to be cloned in the process
2103                 if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) {
2104                         elem = window;
2105                 }
2106
2107                 if ( handler === false ) {
2108                         handler = returnFalse;
2109                 } else if ( !handler ) {
2110                         // Fixes bug #7229. Fix recommended by jdalton
2111                   return;
2112                 }
2113
2114                 var handleObjIn, handleObj;
2115
2116                 if ( handler.handler ) {
2117                         handleObjIn = handler;
2118                         handler = handleObjIn.handler;
2119                 }
2120
2121                 // Make sure that the function being executed has a unique ID
2122                 if ( !handler.guid ) {
2123                         handler.guid = jQuery.guid++;
2124                 }
2125
2126                 // Init the element's event structure
2127                 var elemData = jQuery._data( elem );
2128
2129                 // If no elemData is found then we must be trying to bind to one of the
2130                 // banned noData elements
2131                 if ( !elemData ) {
2132                         return;
2133                 }
2134
2135                 var events = elemData[ eventKey ],
2136                         eventHandle = elemData.handle;
2137
2138                 if ( typeof events === "function" ) {
2139                         // On plain objects events is a fn that holds the the data
2140                         // which prevents this data from being JSON serialized
2141                         // the function does not need to be called, it just contains the data
2142                         eventHandle = events.handle;
2143                         events = events.events;
2144
2145                 } else if ( !events ) {
2146                         if ( !elem.nodeType ) {
2147                                 // On plain objects, create a fn that acts as the holder
2148                                 // of the values to avoid JSON serialization of event data
2149                                 elemData[ eventKey ] = elemData = function(){};
2150                         }
2151
2152                         elemData.events = events = {};
2153                 }
2154
2155                 if ( !eventHandle ) {
2156                         elemData.handle = eventHandle = function() {
2157                                 // Handle the second event of a trigger and when
2158                                 // an event is called after a page has unloaded
2159                                 return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
2160                                         jQuery.event.handle.apply( eventHandle.elem, arguments ) :
2161                                         undefined;
2162                         };
2163                 }
2164
2165                 // Add elem as a property of the handle function
2166                 // This is to prevent a memory leak with non-native events in IE.
2167                 eventHandle.elem = elem;
2168
2169                 // Handle multiple events separated by a space
2170                 // jQuery(...).bind("mouseover mouseout", fn);
2171                 types = types.split(" ");
2172
2173                 var type, i = 0, namespaces;
2174
2175                 while ( (type = types[ i++ ]) ) {
2176                         handleObj = handleObjIn ?
2177                                 jQuery.extend({}, handleObjIn) :
2178                                 { handler: handler, data: data };
2179
2180                         // Namespaced event handlers
2181                         if ( type.indexOf(".") > -1 ) {
2182                                 namespaces = type.split(".");
2183                                 type = namespaces.shift();
2184                                 handleObj.namespace = namespaces.slice(0).sort().join(".");
2185
2186                         } else {
2187                                 namespaces = [];
2188                                 handleObj.namespace = "";
2189                         }
2190
2191                         handleObj.type = type;
2192                         if ( !handleObj.guid ) {
2193                                 handleObj.guid = handler.guid;
2194                         }
2195
2196                         // Get the current list of functions bound to this event
2197                         var handlers = events[ type ],
2198                                 special = jQuery.event.special[ type ] || {};
2199
2200                         // Init the event handler queue
2201                         if ( !handlers ) {
2202                                 handlers = events[ type ] = [];
2203
2204                                 // Check for a special event handler
2205                                 // Only use addEventListener/attachEvent if the special
2206                                 // events handler returns false
2207                                 if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
2208                                         // Bind the global event handler to the element
2209                                         if ( elem.addEventListener ) {
2210                                                 elem.addEventListener( type, eventHandle, false );
2211
2212                                         } else if ( elem.attachEvent ) {
2213                                                 elem.attachEvent( "on" + type, eventHandle );
2214                                         }
2215                                 }
2216                         }
2217
2218                         if ( special.add ) {
2219                                 special.add.call( elem, handleObj );
2220
2221                                 if ( !handleObj.handler.guid ) {
2222                                         handleObj.handler.guid = handler.guid;
2223                                 }
2224                         }
2225
2226                         // Add the function to the element's handler list
2227                         handlers.push( handleObj );
2228
2229                         // Keep track of which events have been used, for global triggering
2230                         jQuery.event.global[ type ] = true;
2231                 }
2232
2233                 // Nullify elem to prevent memory leaks in IE
2234                 elem = null;
2235         },
2236
2237         global: {},
2238
2239         // Detach an event or set of events from an element
2240         remove: function( elem, types, handler, pos ) {
2241                 // don't do events on text and comment nodes
2242                 if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
2243                         return;
2244                 }
2245
2246                 if ( handler === false ) {
2247                         handler = returnFalse;
2248                 }
2249
2250                 var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
2251                         elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
2252                         events = elemData && elemData[ eventKey ];
2253
2254                 if ( !elemData || !events ) {
2255                         return;
2256                 }
2257
2258                 if ( typeof events === "function" ) {
2259                         elemData = events;
2260                         events = events.events;
2261                 }
2262
2263                 // types is actually an event object here
2264                 if ( types && types.type ) {
2265                         handler = types.handler;
2266                         types = types.type;
2267                 }
2268
2269                 // Unbind all events for the element
2270                 if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
2271                         types = types || "";
2272
2273                         for ( type in events ) {
2274                                 jQuery.event.remove( elem, type + types );
2275                         }
2276
2277                         return;
2278                 }
2279
2280                 // Handle multiple events separated by a space
2281                 // jQuery(...).unbind("mouseover mouseout", fn);
2282                 types = types.split(" ");
2283
2284                 while ( (type = types[ i++ ]) ) {
2285                         origType = type;
2286                         handleObj = null;
2287                         all = type.indexOf(".") < 0;
2288                         namespaces = [];
2289
2290                         if ( !all ) {
2291                                 // Namespaced event handlers
2292                                 namespaces = type.split(".");
2293                                 type = namespaces.shift();
2294
2295                                 namespace = new RegExp("(^|\\.)" +
2296                                         jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
2297                         }
2298
2299                         eventType = events[ type ];
2300
2301                         if ( !eventType ) {
2302                                 continue;
2303                         }
2304
2305                         if ( !handler ) {
2306                                 for ( j = 0; j < eventType.length; j++ ) {
2307                                         handleObj = eventType[ j ];
2308
2309                                         if ( all || namespace.test( handleObj.namespace ) ) {
2310                                                 jQuery.event.remove( elem, origType, handleObj.handler, j );
2311                                                 eventType.splice( j--, 1 );
2312                                         }
2313                                 }
2314
2315                                 continue;
2316                         }
2317
2318                         special = jQuery.event.special[ type ] || {};
2319
2320                         for ( j = pos || 0; j < eventType.length; j++ ) {
2321                                 handleObj = eventType[ j ];
2322
2323                                 if ( handler.guid === handleObj.guid ) {
2324                                         // remove the given handler for the given type
2325                                         if ( all || namespace.test( handleObj.namespace ) ) {
2326                                                 if ( pos == null ) {
2327                                                         eventType.splice( j--, 1 );
2328                                                 }
2329
2330                                                 if ( special.remove ) {
2331                                                         special.remove.call( elem, handleObj );
2332                                                 }
2333                                         }
2334
2335                                         if ( pos != null ) {
2336                                                 break;
2337                                         }
2338                                 }
2339                         }
2340
2341                         // remove generic event handler if no more handlers exist
2342                         if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
2343                                 if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
2344                                         jQuery.removeEvent( elem, type, elemData.handle );
2345                                 }
2346
2347                                 ret = null;
2348                                 delete events[ type ];
2349                         }
2350                 }
2351
2352                 // Remove the expando if it's no longer used
2353                 if ( jQuery.isEmptyObject( events ) ) {
2354                         var handle = elemData.handle;
2355                         if ( handle ) {
2356                                 handle.elem = null;
2357                         }
2358
2359                         delete elemData.events;
2360                         delete elemData.handle;
2361
2362                         if ( typeof elemData === "function" ) {
2363                                 jQuery.removeData( elem, eventKey, true );
2364
2365                         } else if ( jQuery.isEmptyObject( elemData ) ) {
2366                                 jQuery.removeData( elem, undefined, true );
2367                         }
2368                 }
2369         },
2370
2371         // bubbling is internal
2372         trigger: function( event, data, elem /*, bubbling */ ) {
2373                 // Event object or event type
2374                 var type = event.type || event,
2375                         bubbling = arguments[3];
2376
2377                 if ( !bubbling ) {
2378                         event = typeof event === "object" ?
2379                                 // jQuery.Event object
2380                                 event[ jQuery.expando ] ? event :
2381                                 // Object literal
2382                                 jQuery.extend( jQuery.Event(type), event ) :
2383                                 // Just the event type (string)
2384                                 jQuery.Event(type);
2385
2386                         if ( type.indexOf("!") >= 0 ) {
2387                                 event.type = type = type.slice(0, -1);
2388                                 event.exclusive = true;
2389                         }
2390
2391                         // Handle a global trigger
2392                         if ( !elem ) {
2393                                 // Don't bubble custom events when global (to avoid too much overhead)
2394                                 event.stopPropagation();
2395
2396                                 // Only trigger if we've ever bound an event for it
2397                                 if ( jQuery.event.global[ type ] ) {
2398                                         // XXX This code smells terrible. event.js should not be directly
2399                                         // inspecting the data cache
2400                                         jQuery.each( jQuery.cache, function() {
2401                                                 // internalKey variable is just used to make it easier to find
2402                                                 // and potentially change this stuff later; currently it just
2403                                                 // points to jQuery.expando
2404                                                 var internalKey = jQuery.expando,
2405                                                         internalCache = this[ internalKey ];
2406                                                 if ( internalCache && internalCache.events && internalCache.events[type] ) {
2407                                                         jQuery.event.trigger( event, data, internalCache.handle.elem );
2408                                                 }
2409                                         });
2410                                 }
2411                         }
2412
2413                         // Handle triggering a single element
2414
2415                         // don't do events on text and comment nodes
2416                         if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
2417                                 return undefined;
2418                         }
2419
2420                         // Clean up in case it is reused
2421                         event.result = undefined;
2422                         event.target = elem;
2423
2424                         // Clone the incoming data, if any
2425                         data = jQuery.makeArray( data );
2426                         data.unshift( event );
2427                 }
2428
2429                 event.currentTarget = elem;
2430
2431                 // Trigger the event, it is assumed that "handle" is a function
2432                 var handle = elem.nodeType ?
2433                         jQuery._data( elem, "handle" ) :
2434                         (jQuery._data( elem, eventKey ) || {}).handle;
2435
2436                 if ( handle ) {
2437                         handle.apply( elem, data );
2438                 }
2439
2440                 var parent = elem.parentNode || elem.ownerDocument;
2441
2442                 // Trigger an inline bound script
2443                 try {
2444                         if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
2445                                 if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {
2446                                         event.result = false;
2447                                         event.preventDefault();
2448                                 }
2449                         }
2450
2451                 // prevent IE from throwing an error for some elements with some event types, see #3533
2452                 } catch (inlineError) {}
2453
2454                 if ( !event.isPropagationStopped() && parent ) {
2455                         jQuery.event.trigger( event, data, parent, true );
2456
2457                 } else if ( !event.isDefaultPrevented() ) {
2458                         var old,
2459                                 target = event.target,
2460                                 targetType = type.replace( rnamespaces, "" ),
2461                                 isClick = jQuery.nodeName( target, "a" ) && targetType === "click",
2462                                 special = jQuery.event.special[ targetType ] || {};
2463
2464                         if ( (!special._default || special._default.call( elem, event ) === false) &&
2465                                 !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
2466
2467                                 try {
2468                                         if ( target[ targetType ] ) {
2469                                                 // Make sure that we don't accidentally re-trigger the onFOO events
2470                                                 old = target[ "on" + targetType ];
2471
2472                                                 if ( old ) {
2473                                                         target[ "on" + targetType ] = null;
2474                                                 }
2475
2476                                                 jQuery.event.triggered = true;
2477                                                 target[ targetType ]();
2478                                         }
2479
2480                                 // prevent IE from throwing an error for some elements with some event types, see #3533
2481                                 } catch (triggerError) {}
2482
2483                                 if ( old ) {
2484                                         target[ "on" + targetType ] = old;
2485                                 }
2486
2487                                 jQuery.event.triggered = false;
2488                         }
2489                 }
2490         },
2491
2492         handle: function( event ) {
2493                 var all, handlers, namespaces, namespace_re, events,
2494                         namespace_sort = [],
2495                         args = jQuery.makeArray( arguments );
2496
2497                 event = args[0] = jQuery.event.fix( event || window.event );
2498                 event.currentTarget = this;
2499
2500                 // Namespaced event handlers
2501                 all = event.type.indexOf(".") < 0 && !event.exclusive;
2502
2503                 if ( !all ) {
2504                         namespaces = event.type.split(".");
2505                         event.type = namespaces.shift();
2506                         namespace_sort = namespaces.slice(0).sort();
2507                         namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)");
2508                 }
2509
2510                 event.namespace = event.namespace || namespace_sort.join(".");
2511
2512                 events = jQuery._data(this, eventKey);
2513
2514                 if ( typeof events === "function" ) {
2515                         events = events.events;
2516                 }
2517
2518                 handlers = (events || {})[ event.type ];
2519
2520                 if ( events && handlers ) {
2521                         // Clone the handlers to prevent manipulation
2522                         handlers = handlers.slice(0);
2523
2524                         for ( var j = 0, l = handlers.length; j < l; j++ ) {
2525                                 var handleObj = handlers[ j ];
2526
2527                                 // Filter the functions by class
2528                                 if ( all || namespace_re.test( handleObj.namespace ) ) {
2529                                         // Pass in a reference to the handler function itself
2530                                         // So that we can later remove it
2531                                         event.handler = handleObj.handler;
2532                                         event.data = handleObj.data;
2533                                         event.handleObj = handleObj;
2534
2535                                         var ret = handleObj.handler.apply( this, args );
2536
2537                                         if ( ret !== undefined ) {
2538                                                 event.result = ret;
2539                                                 if ( ret === false ) {
2540                                                         event.preventDefault();
2541                                                         event.stopPropagation();
2542                                                 }
2543                                         }
2544
2545                                         if ( event.isImmediatePropagationStopped() ) {
2546                                                 break;
2547                                         }
2548                                 }
2549                         }
2550                 }
2551
2552                 return event.result;
2553         },
2554
2555         props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
2556
2557         fix: function( event ) {
2558                 if ( event[ jQuery.expando ] ) {
2559                         return event;
2560                 }
2561
2562                 // store a copy of the original event object
2563                 // and "clone" to set read-only properties
2564                 var originalEvent = event;
2565                 event = jQuery.Event( originalEvent );
2566
2567                 for ( var i = this.props.length, prop; i; ) {
2568                         prop = this.props[ --i ];
2569                         event[ prop ] = originalEvent[ prop ];
2570                 }
2571
2572                 // Fix target property, if necessary
2573                 if ( !event.target ) {
2574                         // Fixes #1925 where srcElement might not be defined either
2575                         event.target = event.srcElement || document;
2576                 }
2577
2578                 // check if target is a textnode (safari)
2579                 if ( event.target.nodeType === 3 ) {
2580                         event.target = event.target.parentNode;
2581                 }
2582
2583                 // Add relatedTarget, if necessary
2584                 if ( !event.relatedTarget && event.fromElement ) {
2585                         event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
2586                 }
2587
2588                 // Calculate pageX/Y if missing and clientX/Y available
2589                 if ( event.pageX == null && event.clientX != null ) {
2590                         var doc = document.documentElement,
2591                                 body = document.body;
2592
2593                         event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
2594                         event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
2595                 }
2596
2597                 // Add which for key events
2598                 if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
2599                         event.which = event.charCode != null ? event.charCode : event.keyCode;
2600                 }
2601
2602                 // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
2603                 if ( !event.metaKey && event.ctrlKey ) {
2604                         event.metaKey = event.ctrlKey;
2605                 }
2606
2607                 // Add which for click: 1 === left; 2 === middle; 3 === right
2608                 // Note: button is not normalized, so don't use it
2609                 if ( !event.which && event.button !== undefined ) {
2610                         event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
2611                 }
2612
2613                 return event;
2614         },
2615
2616         // Deprecated, use jQuery.guid instead
2617         guid: 1E8,
2618
2619         // Deprecated, use jQuery.proxy instead
2620         proxy: jQuery.proxy,
2621
2622         special: {
2623                 ready: {
2624                         // Make sure the ready event is setup
2625                         setup: jQuery.bindReady,
2626                         teardown: jQuery.noop
2627                 },
2628
2629                 live: {
2630                         add: function( handleObj ) {
2631                                 jQuery.event.add( this,
2632                                         liveConvert( handleObj.origType, handleObj.selector ),
2633                                         jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
2634                         },
2635
2636                         remove: function( handleObj ) {
2637                                 jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
2638                         }
2639                 },
2640
2641                 beforeunload: {
2642                         setup: function( data, namespaces, eventHandle ) {
2643                                 // We only want to do this special case on windows
2644                                 if ( jQuery.isWindow( this ) ) {
2645                                         this.onbeforeunload = eventHandle;
2646                                 }
2647                         },
2648
2649                         teardown: function( namespaces, eventHandle ) {
2650                                 if ( this.onbeforeunload === eventHandle ) {
2651                                         this.onbeforeunload = null;
2652                                 }
2653                         }
2654                 }
2655         }
2656 };
2657
2658 jQuery.removeEvent = document.removeEventListener ?
2659         function( elem, type, handle ) {
2660                 if ( elem.removeEventListener ) {
2661                         elem.removeEventListener( type, handle, false );
2662                 }
2663         } :
2664         function( elem, type, handle ) {
2665                 if ( elem.detachEvent ) {
2666                         elem.detachEvent( "on" + type, handle );
2667                 }
2668         };
2669
2670 jQuery.Event = function( src ) {
2671         // Allow instantiation without the 'new' keyword
2672         if ( !this.preventDefault ) {
2673                 return new jQuery.Event( src );
2674         }
2675
2676         // Event object
2677         if ( src && src.type ) {
2678                 this.originalEvent = src;
2679                 this.type = src.type;
2680
2681                 // Events bubbling up the document may have been marked as prevented
2682                 // by a handler lower down the tree; reflect the correct value.
2683                 this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || 
2684                         src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
2685
2686         // Event type
2687         } else {
2688                 this.type = src;
2689         }
2690
2691         // timeStamp is buggy for some events on Firefox(#3843)
2692         // So we won't rely on the native value
2693         this.timeStamp = jQuery.now();
2694
2695         // Mark it as fixed
2696         this[ jQuery.expando ] = true;
2697 };
2698
2699 function returnFalse() {
2700         return false;
2701 }
2702 function returnTrue() {
2703         return true;
2704 }
2705
2706 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
2707 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
2708 jQuery.Event.prototype = {
2709         preventDefault: function() {
2710                 this.isDefaultPrevented = returnTrue;
2711
2712                 var e = this.originalEvent;
2713                 if ( !e ) {
2714                         return;
2715                 }
2716
2717                 // if preventDefault exists run it on the original event
2718                 if ( e.preventDefault ) {
2719                         e.preventDefault();
2720
2721                 // otherwise set the returnValue property of the original event to false (IE)
2722                 } else {
2723                         e.returnValue = false;
2724                 }
2725         },
2726         stopPropagation: function() {
2727                 this.isPropagationStopped = returnTrue;
2728
2729                 var e = this.originalEvent;
2730                 if ( !e ) {
2731                         return;
2732                 }
2733                 // if stopPropagation exists run it on the original event
2734                 if ( e.stopPropagation ) {
2735                         e.stopPropagation();
2736                 }
2737                 // otherwise set the cancelBubble property of the original event to true (IE)
2738                 e.cancelBubble = true;
2739         },
2740         stopImmediatePropagation: function() {
2741                 this.isImmediatePropagationStopped = returnTrue;
2742                 this.stopPropagation();
2743         },
2744         isDefaultPrevented: returnFalse,
2745         isPropagationStopped: returnFalse,
2746         isImmediatePropagationStopped: returnFalse
2747 };
2748
2749 // Checks if an event happened on an element within another element
2750 // Used in jQuery.event.special.mouseenter and mouseleave handlers
2751 var withinElement = function( event ) {
2752         // Check if mouse(over|out) are still within the same parent element
2753         var parent = event.relatedTarget;
2754
2755         // Firefox sometimes assigns relatedTarget a XUL element
2756         // which we cannot access the parentNode property of
2757         try {
2758                 // Traverse up the tree
2759                 while ( parent && parent !== this ) {
2760                         parent = parent.parentNode;
2761                 }
2762
2763                 if ( parent !== this ) {
2764                         // set the correct event type
2765                         event.type = event.data;
2766
2767                         // handle event if we actually just moused on to a non sub-element
2768                         jQuery.event.handle.apply( this, arguments );
2769                 }
2770
2771         // assuming we've left the element since we most likely mousedover a xul element
2772         } catch(e) { }
2773 },
2774
2775 // In case of event delegation, we only need to rename the event.type,
2776 // liveHandler will take care of the rest.
2777 delegate = function( event ) {
2778         event.type = event.data;
2779         jQuery.event.handle.apply( this, arguments );
2780 };
2781
2782 // Create mouseenter and mouseleave events
2783 jQuery.each({
2784         mouseenter: "mouseover",
2785         mouseleave: "mouseout"
2786 }, function( orig, fix ) {
2787         jQuery.event.special[ orig ] = {
2788                 setup: function( data ) {
2789                         jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
2790                 },
2791                 teardown: function( data ) {
2792                         jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
2793                 }
2794         };
2795 });
2796
2797 // submit delegation
2798 if ( !jQuery.support.submitBubbles ) {
2799
2800         jQuery.event.special.submit = {
2801                 setup: function( data, namespaces ) {
2802                         if ( this.nodeName && this.nodeName.toLowerCase() !== "form" ) {
2803                                 jQuery.event.add(this, "click.specialSubmit", function( e ) {
2804                                         var elem = e.target,
2805                                                 type = elem.type;
2806
2807                                         if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
2808                                                 e.liveFired = undefined;
2809                                                 return trigger( "submit", this, arguments );
2810                                         }
2811                                 });
2812
2813                                 jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
2814                                         var elem = e.target,
2815                                                 type = elem.type;
2816
2817                                         if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
2818                                                 e.liveFired = undefined;
2819                                                 return trigger( "submit", this, arguments );
2820                                         }
2821                                 });
2822
2823                         } else {
2824                                 return false;
2825                         }
2826                 },
2827
2828                 teardown: function( namespaces ) {
2829                         jQuery.event.remove( this, ".specialSubmit" );
2830                 }
2831         };
2832
2833 }
2834
2835 // change delegation, happens here so we have bind.
2836 if ( !jQuery.support.changeBubbles ) {
2837
2838         var changeFilters,
2839
2840         getVal = function( elem ) {
2841                 var type = elem.type, val = elem.value;
2842
2843                 if ( type === "radio" || type === "checkbox" ) {
2844                         val = elem.checked;
2845
2846                 } else if ( type === "select-multiple" ) {
2847                         val = elem.selectedIndex > -1 ?
2848                                 jQuery.map( elem.options, function( elem ) {
2849                                         return elem.selected;
2850                                 }).join("-") :
2851                                 "";
2852
2853                 } else if ( elem.nodeName.toLowerCase() === "select" ) {
2854                         val = elem.selectedIndex;
2855                 }
2856
2857                 return val;
2858         },
2859
2860         testChange = function testChange( e ) {
2861                 var elem = e.target, data, val;
2862
2863                 if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
2864                         return;
2865                 }
2866
2867                 data = jQuery._data( elem, "_change_data" );
2868                 val = getVal(elem);
2869
2870                 // the current data will be also retrieved by beforeactivate
2871                 if ( e.type !== "focusout" || elem.type !== "radio" ) {
2872                         jQuery._data( elem, "_change_data", val );
2873                 }
2874
2875                 if ( data === undefined || val === data ) {
2876                         return;
2877                 }
2878
2879                 if ( data != null || val ) {
2880                         e.type = "change";
2881                         e.liveFired = undefined;
2882                         return jQuery.event.trigger( e, arguments[1], elem );
2883                 }
2884         };
2885
2886         jQuery.event.special.change = {
2887                 filters: {
2888                         focusout: testChange,
2889
2890                         beforedeactivate: testChange,
2891
2892                         click: function( e ) {
2893                                 var elem = e.target, type = elem.type;
2894
2895                                 if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
2896                                         return testChange.call( this, e );
2897                                 }
2898                         },
2899
2900                         // Change has to be called before submit
2901                         // Keydown will be called before keypress, which is used in submit-event delegation
2902                         keydown: function( e ) {
2903                                 var elem = e.target, type = elem.type;
2904
2905                                 if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
2906                                         (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
2907                                         type === "select-multiple" ) {
2908                                         return testChange.call( this, e );
2909                                 }
2910                         },
2911
2912                         // Beforeactivate happens also before the previous element is blurred
2913                         // with this event you can't trigger a change event, but you can store
2914                         // information
2915                         beforeactivate: function( e ) {
2916                                 var elem = e.target;
2917                                 jQuery._data( elem, "_change_data", getVal(elem) );
2918                         }
2919                 },
2920
2921                 setup: function( data, namespaces ) {
2922                         if ( this.type === "file" ) {
2923                                 return false;
2924                         }
2925
2926                         for ( var type in changeFilters ) {
2927                                 jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
2928                         }
2929
2930                         return rformElems.test( this.nodeName );
2931                 },
2932
2933                 teardown: function( namespaces ) {
2934                         jQuery.event.remove( this, ".specialChange" );
2935
2936                         return rformElems.test( this.nodeName );
2937                 }
2938         };
2939
2940         changeFilters = jQuery.event.special.change.filters;
2941
2942         // Handle when the input is .focus()'d
2943         changeFilters.focus = changeFilters.beforeactivate;
2944 }
2945
2946 function trigger( type, elem, args ) {
2947         args[0].type = type;
2948         return jQuery.event.handle.apply( elem, args );
2949 }
2950
2951 // Create "bubbling" focus and blur events
2952 if ( document.addEventListener ) {
2953         jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
2954                 jQuery.event.special[ fix ] = {
2955                         setup: function() {
2956                                 this.addEventListener( orig, handler, true );
2957                         }, 
2958                         teardown: function() { 
2959                                 this.removeEventListener( orig, handler, true );
2960                         }
2961                 };
2962
2963                 function handler( e ) {
2964                         e = jQuery.event.fix( e );
2965                         e.type = fix;
2966                         return jQuery.event.handle.call( this, e );
2967                 }
2968         });
2969 }
2970
2971 jQuery.each(["bind", "one"], function( i, name ) {
2972         jQuery.fn[ name ] = function( type, data, fn ) {
2973                 // Handle object literals
2974                 if ( typeof type === "object" ) {
2975                         for ( var key in type ) {
2976                                 this[ name ](key, data, type[key], fn);
2977                         }
2978                         return this;
2979                 }
2980
2981                 if ( jQuery.isFunction( data ) || data === false ) {
2982                         fn = data;
2983                         data = undefined;
2984                 }
2985
2986                 var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
2987                         jQuery( this ).unbind( event, handler );
2988                         return fn.apply( this, arguments );
2989                 }) : fn;
2990
2991                 if ( type === "unload" && name !== "one" ) {
2992                         this.one( type, data, fn );
2993
2994                 } else {
2995                         for ( var i = 0, l = this.length; i < l; i++ ) {
2996                                 jQuery.event.add( this[i], type, handler, data );
2997                         }
2998                 }
2999
3000                 return this;
3001         };
3002 });
3003
3004 jQuery.fn.extend({
3005         unbind: function( type, fn ) {
3006                 // Handle object literals
3007                 if ( typeof type === "object" && !type.preventDefault ) {
3008                         for ( var key in type ) {
3009                                 this.unbind(key, type[key]);
3010                         }
3011
3012                 } else {
3013                         for ( var i = 0, l = this.length; i < l; i++ ) {
3014                                 jQuery.event.remove( this[i], type, fn );
3015                         }
3016                 }
3017
3018                 return this;
3019         },
3020
3021         delegate: function( selector, types, data, fn ) {
3022                 return this.live( types, data, fn, selector );
3023         },
3024
3025         undelegate: function( selector, types, fn ) {
3026                 if ( arguments.length === 0 ) {
3027                                 return this.unbind( "live" );
3028
3029                 } else {
3030                         return this.die( types, null, fn, selector );
3031                 }
3032         },
3033
3034         trigger: function( type, data ) {
3035                 return this.each(function() {
3036                         jQuery.event.trigger( type, data, this );
3037                 });
3038         },
3039
3040         triggerHandler: function( type, data ) {
3041                 if ( this[0] ) {
3042                         var event = jQuery.Event( type );
3043                         event.preventDefault();
3044                         event.stopPropagation();
3045                         jQuery.event.trigger( event, data, this[0] );
3046                         return event.result;
3047                 }
3048         },
3049
3050         toggle: function( fn ) {
3051                 // Save reference to arguments for access in closure
3052                 var args = arguments,
3053                         i = 1;
3054
3055                 // link all the functions, so any of them can unbind this click handler
3056                 while ( i < args.length ) {
3057                         jQuery.proxy( fn, args[ i++ ] );
3058                 }
3059
3060                 return this.click( jQuery.proxy( fn, function( event ) {
3061                         // Figure out which function to execute
3062                         var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
3063                         jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
3064
3065                         // Make sure that clicks stop
3066                         event.preventDefault();
3067
3068                         // and execute the function
3069                         return args[ lastToggle ].apply( this, arguments ) || false;
3070                 }));
3071         },
3072
3073         hover: function( fnOver, fnOut ) {
3074                 return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
3075         }
3076 });
3077
3078 var liveMap = {
3079         focus: "focusin",
3080         blur: "focusout",
3081         mouseenter: "mouseover",
3082         mouseleave: "mouseout"
3083 };
3084
3085 jQuery.each(["live", "die"], function( i, name ) {
3086         jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
3087                 var type, i = 0, match, namespaces, preType,
3088                         selector = origSelector || this.selector,
3089                         context = origSelector ? this : jQuery( this.context );
3090
3091                 if ( typeof types === "object" && !types.preventDefault ) {
3092                         for ( var key in types ) {
3093                                 context[ name ]( key, data, types[key], selector );
3094                         }
3095
3096                         return this;
3097                 }
3098
3099                 if ( jQuery.isFunction( data ) ) {
3100                         fn = data;
3101                         data = undefined;
3102                 }
3103
3104                 types = (types || "").split(" ");
3105
3106                 while ( (type = types[ i++ ]) != null ) {
3107                         match = rnamespaces.exec( type );
3108                         namespaces = "";
3109
3110                         if ( match )  {
3111                                 namespaces = match[0];
3112                                 type = type.replace( rnamespaces, "" );
3113                         }
3114
3115                         if ( type === "hover" ) {
3116                                 types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
3117                                 continue;
3118                         }
3119
3120                         preType = type;
3121
3122                         if ( type === "focus" || type === "blur" ) {
3123                                 types.push( liveMap[ type ] + namespaces );
3124                                 type = type + namespaces;
3125
3126                         } else {
3127                                 type = (liveMap[ type ] || type) + namespaces;
3128                         }
3129
3130                         if ( name === "live" ) {
3131                                 // bind live handler
3132                                 for ( var j = 0, l = context.length; j < l; j++ ) {
3133                                         jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
3134                                                 { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
3135                                 }
3136
3137                         } else {
3138                                 // unbind live handler
3139                                 context.unbind( "live." + liveConvert( type, selector ), fn );
3140                         }
3141                 }
3142
3143                 return this;
3144         };
3145 });
3146
3147 function liveHandler( event ) {
3148         var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
3149                 elems = [],
3150                 selectors = [],
3151                 events = jQuery._data( this, eventKey );
3152
3153         if ( typeof events === "function" ) {
3154                 events = events.events;
3155         }
3156
3157         // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
3158         if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
3159                 return;
3160         }
3161
3162         if ( event.namespace ) {
3163                 namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
3164         }
3165
3166         event.liveFired = this;
3167
3168         var live = events.live.slice(0);
3169
3170         for ( j = 0; j < live.length; j++ ) {
3171                 handleObj = live[j];
3172
3173                 if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
3174                         selectors.push( handleObj.selector );
3175
3176                 } else {
3177                         live.splice( j--, 1 );
3178                 }
3179         }
3180
3181         match = jQuery( event.target ).closest( selectors, event.currentTarget );
3182
3183         for ( i = 0, l = match.length; i < l; i++ ) {
3184                 close = match[i];
3185
3186                 for ( j = 0; j < live.length; j++ ) {
3187                         handleObj = live[j];
3188
3189                         if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) ) {
3190                                 elem = close.elem;
3191                                 related = null;
3192
3193                                 // Those two events require additional checking
3194                                 if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
3195                                         event.type = handleObj.preType;
3196                                         related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
3197                                 }
3198
3199                                 if ( !related || related !== elem ) {
3200                                         elems.push({ elem: elem, handleObj: handleObj, level: close.level });
3201                                 }
3202                         }
3203                 }
3204         }
3205
3206         for ( i = 0, l = elems.length; i < l; i++ ) {
3207                 match = elems[i];
3208
3209                 if ( maxLevel && match.level > maxLevel ) {
3210                         break;
3211                 }
3212
3213                 event.currentTarget = match.elem;
3214                 event.data = match.handleObj.data;
3215                 event.handleObj = match.handleObj;
3216
3217                 ret = match.handleObj.origHandler.apply( match.elem, arguments );
3218
3219                 if ( ret === false || event.isPropagationStopped() ) {
3220                         maxLevel = match.level;
3221
3222                         if ( ret === false ) {
3223                                 stop = false;
3224                         }
3225                         if ( event.isImmediatePropagationStopped() ) {
3226                                 break;
3227                         }
3228                 }
3229         }
3230
3231         return stop;
3232 }
3233
3234 function liveConvert( type, selector ) {
3235         return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspace, "&");
3236 }
3237
3238 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
3239         "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
3240         "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
3241
3242         // Handle event binding
3243         jQuery.fn[ name ] = function( data, fn ) {
3244                 if ( fn == null ) {
3245                         fn = data;
3246                         data = null;
3247                 }
3248
3249                 return arguments.length > 0 ?
3250                         this.bind( name, data, fn ) :
3251                         this.trigger( name );
3252         };
3253
3254         if ( jQuery.attrFn ) {
3255                 jQuery.attrFn[ name ] = true;
3256         }
3257 });
3258
3259
3260 /*!
3261  * Sizzle CSS Selector Engine
3262  *  Copyright 2011, The Dojo Foundation
3263  *  Released under the MIT, BSD, and GPL Licenses.
3264  *  More information: http://sizzlejs.com/
3265  */
3266 (function(){
3267
3268 var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
3269         done = 0,
3270         toString = Object.prototype.toString,
3271         hasDuplicate = false,
3272         baseHasDuplicate = true;
3273
3274 // Here we check if the JavaScript engine is using some sort of
3275 // optimization where it does not always call our comparision
3276 // function. If that is the case, discard the hasDuplicate value.
3277 //   Thus far that includes Google Chrome.
3278 [0, 0].sort(function() {
3279         baseHasDuplicate = false;
3280         return 0;
3281 });
3282
3283 var Sizzle = function( selector, context, results, seed ) {
3284         results = results || [];
3285         context = context || document;
3286
3287         var origContext = context;
3288
3289         if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
3290                 return [];
3291         }
3292         
3293         if ( !selector || typeof selector !== "string" ) {
3294                 return results;
3295         }
3296
3297         var m, set, checkSet, extra, ret, cur, pop, i,
3298                 prune = true,
3299                 contextXML = Sizzle.isXML( context ),
3300                 parts = [],
3301                 soFar = selector;
3302         
3303         // Reset the position of the chunker regexp (start from head)
3304         do {
3305                 chunker.exec( "" );
3306                 m = chunker.exec( soFar );
3307
3308                 if ( m ) {
3309                         soFar = m[3];
3310                 
3311                         parts.push( m[1] );
3312                 
3313                         if ( m[2] ) {
3314                                 extra = m[3];
3315                                 break;
3316                         }
3317                 }
3318         } while ( m );
3319
3320         if ( parts.length > 1 && origPOS.exec( selector ) ) {
3321
3322                 if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
3323                         set = posProcess( parts[0] + parts[1], context );
3324
3325                 } else {
3326                         set = Expr.relative[ parts[0] ] ?
3327                                 [ context ] :
3328                                 Sizzle( parts.shift(), context );
3329
3330                         while ( parts.length ) {
3331                                 selector = parts.shift();
3332
3333                                 if ( Expr.relative[ selector ] ) {
3334                                         selector += parts.shift();
3335                                 }
3336                                 
3337                                 set = posProcess( selector, set );
3338                         }
3339                 }
3340
3341         } else {
3342                 // Take a shortcut and set the context if the root selector is an ID
3343                 // (but not if it'll be faster if the inner selector is an ID)
3344                 if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
3345                                 Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
3346
3347                         ret = Sizzle.find( parts.shift(), context, contextXML );
3348                         context = ret.expr ?
3349                                 Sizzle.filter( ret.expr, ret.set )[0] :
3350                                 ret.set[0];
3351                 }
3352
3353                 if ( context ) {
3354                         ret = seed ?
3355                                 { expr: parts.pop(), set: makeArray(seed) } :
3356                                 Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
3357
3358                         set = ret.expr ?
3359                                 Sizzle.filter( ret.expr, ret.set ) :
3360                                 ret.set;
3361
3362                         if ( parts.length > 0 ) {
3363                                 checkSet = makeArray( set );
3364
3365                         } else {
3366                                 prune = false;
3367                         }
3368
3369                         while ( parts.length ) {
3370                                 cur = parts.pop();
3371                                 pop = cur;
3372
3373                                 if ( !Expr.relative[ cur ] ) {
3374                                         cur = "";
3375                                 } else {
3376                                         pop = parts.pop();
3377                                 }
3378
3379                                 if ( pop == null ) {
3380                                         pop = context;
3381                                 }
3382
3383                                 Expr.relative[ cur ]( checkSet, pop, contextXML );
3384                         }
3385
3386                 } else {
3387                         checkSet = parts = [];
3388                 }
3389         }
3390
3391         if ( !checkSet ) {
3392                 checkSet = set;
3393         }
3394
3395         if ( !checkSet ) {
3396                 Sizzle.error( cur || selector );
3397         }
3398
3399         if ( toString.call(checkSet) === "[object Array]" ) {
3400                 if ( !prune ) {
3401                         results.push.apply( results, checkSet );
3402
3403                 } else if ( context && context.nodeType === 1 ) {
3404                         for ( i = 0; checkSet[i] != null; i++ ) {
3405                                 if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
3406                                         results.push( set[i] );
3407                                 }
3408                         }
3409
3410                 } else {
3411                         for ( i = 0; checkSet[i] != null; i++ ) {
3412                                 if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
3413                                         results.push( set[i] );
3414                                 }
3415                         }
3416                 }
3417
3418         } else {
3419                 makeArray( checkSet, results );
3420         }
3421
3422         if ( extra ) {
3423                 Sizzle( extra, origContext, results, seed );
3424                 Sizzle.uniqueSort( results );
3425         }
3426
3427         return results;
3428 };
3429
3430 Sizzle.uniqueSort = function( results ) {
3431         if ( sortOrder ) {
3432                 hasDuplicate = baseHasDuplicate;
3433                 results.sort( sortOrder );
3434
3435                 if ( hasDuplicate ) {
3436                         for ( var i = 1; i < results.length; i++ ) {
3437                                 if ( results[i] === results[ i - 1 ] ) {
3438                                         results.splice( i--, 1 );
3439                                 }
3440                         }
3441                 }
3442         }
3443
3444         return results;
3445 };
3446
3447 Sizzle.matches = function( expr, set ) {
3448         return Sizzle( expr, null, null, set );
3449 };
3450
3451 Sizzle.matchesSelector = function( node, expr ) {
3452         return Sizzle( expr, null, null, [node] ).length > 0;
3453 };
3454
3455 Sizzle.find = function( expr, context, isXML ) {
3456         var set;
3457
3458         if ( !expr ) {
3459                 return [];
3460         }
3461
3462         for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
3463                 var match,
3464                         type = Expr.order[i];
3465                 
3466                 if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
3467                         var left = match[1];
3468                         match.splice( 1, 1 );
3469
3470                         if ( left.substr( left.length - 1 ) !== "\\" ) {
3471                                 match[1] = (match[1] || "").replace(/\\/g, "");
3472                                 set = Expr.find[ type ]( match, context, isXML );
3473
3474                                 if ( set != null ) {
3475                                         expr = expr.replace( Expr.match[ type ], "" );
3476                                         break;
3477                                 }
3478                         }
3479                 }
3480         }
3481
3482         if ( !set ) {
3483                 set = typeof context.getElementsByTagName !== "undefined" ?
3484                         context.getElementsByTagName( "*" ) :
3485                         [];
3486         }
3487
3488         return { set: set, expr: expr };
3489 };
3490
3491 Sizzle.filter = function( expr, set, inplace, not ) {
3492         var match, anyFound,
3493                 old = expr,
3494                 result = [],
3495                 curLoop = set,
3496                 isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
3497
3498         while ( expr && set.length ) {
3499                 for ( var type in Expr.filter ) {
3500                         if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
3501                                 var found, item,
3502                                         filter = Expr.filter[ type ],
3503                                         left = match[1];
3504
3505                                 anyFound = false;
3506
3507                                 match.splice(1,1);
3508
3509                                 if ( left.substr( left.length - 1 ) === "\\" ) {
3510                                         continue;
3511                                 }
3512
3513                                 if ( curLoop === result ) {
3514                                         result = [];
3515                                 }
3516
3517                                 if ( Expr.preFilter[ type ] ) {
3518                                         match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
3519
3520                                         if ( !match ) {
3521                                                 anyFound = found = true;
3522
3523                                         } else if ( match === true ) {
3524                                                 continue;
3525                                         }
3526                                 }
3527
3528                                 if ( match ) {
3529                                         for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
3530                                                 if ( item ) {
3531                                                         found = filter( item, match, i, curLoop );
3532                                                         var pass = not ^ !!found;
3533
3534                                                         if ( inplace && found != null ) {
3535                                                                 if ( pass ) {
3536                                                                         anyFound = true;
3537
3538                                                                 } else {
3539                                                                         curLoop[i] = false;
3540                                                                 }
3541
3542                                                         } else if ( pass ) {
3543                                                                 result.push( item );
3544                                                                 anyFound = true;
3545                                                         }
3546                                                 }
3547                                         }
3548                                 }
3549
3550                                 if ( found !== undefined ) {
3551                                         if ( !inplace ) {
3552                                                 curLoop = result;
3553                                         }
3554
3555                                         expr = expr.replace( Expr.match[ type ], "" );
3556
3557                                         if ( !anyFound ) {
3558                                                 return [];
3559                                         }
3560
3561                                         break;
3562                                 }
3563                         }
3564                 }
3565
3566                 // Improper expression
3567                 if ( expr === old ) {
3568                         if ( anyFound == null ) {
3569                                 Sizzle.error( expr );
3570
3571                         } else {
3572                                 break;
3573                         }
3574                 }
3575
3576                 old = expr;
3577         }
3578
3579         return curLoop;
3580 };
3581
3582 Sizzle.error = function( msg ) {
3583         throw "Syntax error, unrecognized expression: " + msg;
3584 };
3585
3586 var Expr = Sizzle.selectors = {
3587         order: [ "ID", "NAME", "TAG" ],
3588
3589         match: {
3590                 ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
3591                 CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
3592                 NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
3593                 ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
3594                 TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
3595                 CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
3596                 POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
3597                 PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
3598         },
3599
3600         leftMatch: {},
3601
3602         attrMap: {
3603                 "class": "className",
3604                 "for": "htmlFor"
3605         },
3606
3607         attrHandle: {
3608                 href: function( elem ) {
3609                         return elem.getAttribute( "href" );
3610                 }
3611         },
3612
3613         relative: {
3614                 "+": function(checkSet, part){
3615                         var isPartStr = typeof part === "string",
3616                                 isTag = isPartStr && !/\W/.test( part ),
3617                                 isPartStrNotTag = isPartStr && !isTag;
3618
3619                         if ( isTag ) {
3620                                 part = part.toLowerCase();
3621                         }
3622
3623                         for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
3624                                 if ( (elem = checkSet[i]) ) {
3625                                         while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
3626
3627                                         checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
3628                                                 elem || false :
3629                                                 elem === part;
3630                                 }
3631                         }
3632
3633                         if ( isPartStrNotTag ) {
3634                                 Sizzle.filter( part, checkSet, true );
3635                         }
3636                 },
3637
3638                 ">": function( checkSet, part ) {
3639                         var elem,
3640                                 isPartStr = typeof part === "string",
3641                                 i = 0,
3642                                 l = checkSet.length;
3643
3644                         if ( isPartStr && !/\W/.test( part ) ) {
3645                                 part = part.toLowerCase();
3646
3647                                 for ( ; i < l; i++ ) {
3648                                         elem = checkSet[i];
3649
3650                                         if ( elem ) {
3651                                                 var parent = elem.parentNode;
3652                                                 checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
3653                                         }
3654                                 }
3655
3656                         } else {
3657                                 for ( ; i < l; i++ ) {
3658                                         elem = checkSet[i];
3659
3660                                         if ( elem ) {
3661                                                 checkSet[i] = isPartStr ?
3662                                                         elem.parentNode :
3663                                                         elem.parentNode === part;
3664                                         }
3665                                 }
3666
3667                                 if ( isPartStr ) {
3668                                         Sizzle.filter( part, checkSet, true );
3669                                 }
3670                         }
3671                 },
3672
3673                 "": function(checkSet, part, isXML){
3674                         var nodeCheck,
3675                                 doneName = done++,
3676                                 checkFn = dirCheck;
3677
3678                         if ( typeof part === "string" && !/\W/.test(part) ) {
3679                                 part = part.toLowerCase();
3680                                 nodeCheck = part;
3681                                 checkFn = dirNodeCheck;
3682                         }
3683
3684                         checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
3685                 },
3686
3687                 "~": function( checkSet, part, isXML ) {
3688                         var nodeCheck,
3689                                 doneName = done++,
3690                                 checkFn = dirCheck;
3691
3692                         if ( typeof part === "string" && !/\W/.test( part ) ) {
3693                                 part = part.toLowerCase();
3694                                 nodeCheck = part;
3695                                 checkFn = dirNodeCheck;
3696                         }
3697
3698                         checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
3699                 }
3700         },
3701
3702         find: {
3703                 ID: function( match, context, isXML ) {
3704                         if ( typeof context.getElementById !== "undefined" && !isXML ) {
3705                                 var m = context.getElementById(match[1]);
3706                                 // Check parentNode to catch when Blackberry 4.6 returns
3707                                 // nodes that are no longer in the document #6963
3708                                 return m && m.parentNode ? [m] : [];
3709                         }
3710                 },
3711
3712                 NAME: function( match, context ) {
3713                         if ( typeof context.getElementsByName !== "undefined" ) {
3714                                 var ret = [],
3715                                         results = context.getElementsByName( match[1] );
3716
3717                                 for ( var i = 0, l = results.length; i < l; i++ ) {
3718                                         if ( results[i].getAttribute("name") === match[1] ) {
3719                                                 ret.push( results[i] );
3720                                         }
3721                                 }
3722
3723                                 return ret.length === 0 ? null : ret;
3724                         }
3725                 },
3726
3727                 TAG: function( match, context ) {
3728                         if ( typeof context.getElementsByTagName !== "undefined" ) {
3729                                 return context.getElementsByTagName( match[1] );
3730                         }
3731                 }
3732         },
3733         preFilter: {
3734                 CLASS: function( match, curLoop, inplace, result, not, isXML ) {
3735                         match = " " + match[1].replace(/\\/g, "") + " ";
3736
3737                         if ( isXML ) {
3738                                 return match;
3739                         }
3740
3741                         for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
3742                                 if ( elem ) {
3743                                         if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
3744                                                 if ( !inplace ) {
3745                                                         result.push( elem );
3746                                                 }
3747
3748                                         } else if ( inplace ) {
3749                                                 curLoop[i] = false;
3750                                         }
3751                                 }
3752                         }
3753
3754                         return false;
3755                 },
3756
3757                 ID: function( match ) {
3758                         return match[1].replace(/\\/g, "");
3759                 },
3760
3761                 TAG: function( match, curLoop ) {
3762                         return match[1].toLowerCase();
3763                 },
3764
3765                 CHILD: function( match ) {
3766                         if ( match[1] === "nth" ) {
3767                                 if ( !match[2] ) {
3768                                         Sizzle.error( match[0] );
3769                                 }
3770
3771                                 match[2] = match[2].replace(/^\+|\s*/g, '');
3772
3773                                 // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
3774                                 var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
3775                                         match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
3776                                         !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
3777
3778                                 // calculate the numbers (first)n+(last) including if they are negative
3779                                 match[2] = (test[1] + (test[2] || 1)) - 0;
3780                                 match[3] = test[3] - 0;
3781                         }
3782                         else if ( match[2] ) {
3783                                 Sizzle.error( match[0] );
3784                         }
3785
3786                         // TODO: Move to normal caching system
3787                         match[0] = done++;
3788
3789                         return match;
3790                 },
3791
3792                 ATTR: function( match, curLoop, inplace, result, not, isXML ) {
3793                         var name = match[1] = match[1].replace(/\\/g, "");
3794                         
3795                         if ( !isXML && Expr.attrMap[name] ) {
3796                                 match[1] = Expr.attrMap[name];
3797                         }
3798
3799                         // Handle if an un-quoted value was used
3800                         match[4] = ( match[4] || match[5] || "" ).replace(/\\/g, "");
3801
3802                         if ( match[2] === "~=" ) {
3803                                 match[4] = " " + match[4] + " ";
3804                         }
3805
3806                         return match;
3807                 },
3808
3809                 PSEUDO: function( match, curLoop, inplace, result, not ) {
3810                         if ( match[1] === "not" ) {
3811                                 // If we're dealing with a complex expression, or a simple one
3812                                 if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
3813                                         match[3] = Sizzle(match[3], null, null, curLoop);
3814
3815                                 } else {
3816                                         var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
3817
3818                                         if ( !inplace ) {
3819                                                 result.push.apply( result, ret );
3820                                         }
3821
3822                                         return false;
3823                                 }
3824
3825                         } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
3826                                 return true;
3827                         }
3828                         
3829                         return match;
3830                 },
3831
3832                 POS: function( match ) {
3833                         match.unshift( true );
3834
3835                         return match;
3836                 }
3837         },
3838         
3839         filters: {
3840                 enabled: function( elem ) {
3841                         return elem.disabled === false && elem.type !== "hidden";
3842                 },
3843
3844                 disabled: function( elem ) {
3845                         return elem.disabled === true;
3846                 },
3847
3848                 checked: function( elem ) {
3849                         return elem.checked === true;
3850                 },
3851                 
3852                 selected: function( elem ) {
3853                         // Accessing this property makes selected-by-default
3854                         // options in Safari work properly
3855                         elem.parentNode.selectedIndex;
3856                         
3857                         return elem.selected === true;
3858                 },
3859
3860                 parent: function( elem ) {
3861                         return !!elem.firstChild;
3862                 },
3863
3864                 empty: function( elem ) {
3865                         return !elem.firstChild;
3866                 },
3867
3868                 has: function( elem, i, match ) {
3869                         return !!Sizzle( match[3], elem ).length;
3870                 },
3871
3872                 header: function( elem ) {
3873                         return (/h\d/i).test( elem.nodeName );
3874                 },
3875
3876                 text: function( elem ) {
3877                         return "text" === elem.type;
3878                 },
3879                 radio: function( elem ) {
3880                         return "radio" === elem.type;
3881                 },
3882
3883                 checkbox: function( elem ) {
3884                         return "checkbox" === elem.type;
3885                 },
3886
3887                 file: function( elem ) {
3888                         return "file" === elem.type;
3889                 },
3890                 password: function( elem ) {
3891                         return "password" === elem.type;
3892                 },
3893
3894                 submit: function( elem ) {
3895                         return "submit" === elem.type;
3896                 },
3897
3898                 image: function( elem ) {
3899                         return "image" === elem.type;
3900                 },
3901
3902                 reset: function( elem ) {
3903                         return "reset" === elem.type;
3904                 },
3905
3906                 button: function( elem ) {
3907                         return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
3908                 },
3909
3910                 input: function( elem ) {
3911                         return (/input|select|textarea|button/i).test( elem.nodeName );
3912                 }
3913         },
3914         setFilters: {
3915                 first: function( elem, i ) {
3916                         return i === 0;
3917                 },
3918
3919                 last: function( elem, i, match, array ) {
3920                         return i === array.length - 1;
3921                 },
3922
3923                 even: function( elem, i ) {
3924                         return i % 2 === 0;
3925                 },
3926
3927                 odd: function( elem, i ) {
3928                         return i % 2 === 1;
3929                 },
3930
3931                 lt: function( elem, i, match ) {
3932                         return i < match[3] - 0;
3933                 },
3934
3935                 gt: function( elem, i, match ) {
3936                         return i > match[3] - 0;
3937                 },
3938
3939                 nth: function( elem, i, match ) {
3940                         return match[3] - 0 === i;
3941                 },
3942
3943                 eq: function( elem, i, match ) {
3944                         return match[3] - 0 === i;
3945                 }
3946         },
3947         filter: {
3948                 PSEUDO: function( elem, match, i, array ) {
3949                         var name = match[1],
3950                                 filter = Expr.filters[ name ];
3951
3952                         if ( filter ) {
3953                                 return filter( elem, i, match, array );
3954
3955                         } else if ( name === "contains" ) {
3956                                 return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
3957
3958                         } else if ( name === "not" ) {
3959                                 var not = match[3];
3960
3961                                 for ( var j = 0, l = not.length; j < l; j++ ) {
3962                                         if ( not[j] === elem ) {
3963                                                 return false;
3964                                         }
3965                                 }
3966
3967                                 return true;
3968
3969                         } else {
3970                                 Sizzle.error( name );
3971                         }
3972                 },
3973
3974                 CHILD: function( elem, match ) {
3975                         var type = match[1],
3976                                 node = elem;
3977
3978                         switch ( type ) {
3979                                 case "only":
3980                                 case "first":
3981                                         while ( (node = node.previousSibling) )  {
3982                                                 if ( node.nodeType === 1 ) { 
3983                                                         return false; 
3984                                                 }
3985                                         }
3986
3987                                         if ( type === "first" ) { 
3988                                                 return true; 
3989                                         }
3990
3991                                         node = elem;
3992
3993                                 case "last":
3994                                         while ( (node = node.nextSibling) )      {
3995                                                 if ( node.nodeType === 1 ) { 
3996                                                         return false; 
3997                                                 }
3998                                         }
3999
4000                                         return true;
4001
4002                                 case "nth":
4003                                         var first = match[2],
4004                                                 last = match[3];
4005
4006                                         if ( first === 1 && last === 0 ) {
4007                                                 return true;
4008                                         }
4009                                         
4010                                         var doneName = match[0],
4011                                                 parent = elem.parentNode;
4012         
4013                                         if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
4014                                                 var count = 0;
4015                                                 
4016                                                 for ( node = parent.firstChild; node; node = node.nextSibling ) {
4017                                                         if ( node.nodeType === 1 ) {
4018                                                                 node.nodeIndex = ++count;
4019                                                         }
4020                                                 } 
4021
4022                                                 parent.sizcache = doneName;
4023                                         }
4024                                         
4025                                         var diff = elem.nodeIndex - last;
4026
4027                                         if ( first === 0 ) {
4028                                                 return diff === 0;
4029
4030                                         } else {
4031                                                 return ( diff % first === 0 && diff / first >= 0 );
4032                                         }
4033                         }
4034                 },
4035
4036                 ID: function( elem, match ) {
4037                         return elem.nodeType === 1 && elem.getAttribute("id") === match;
4038                 },
4039
4040                 TAG: function( elem, match ) {
4041                         return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
4042                 },
4043                 
4044                 CLASS: function( elem, match ) {
4045                         return (" " + (elem.className || elem.getAttribute("class")) + " ")
4046                                 .indexOf( match ) > -1;
4047                 },
4048
4049                 ATTR: function( elem, match ) {
4050                         var name = match[1],
4051                                 result = Expr.attrHandle[ name ] ?
4052                                         Expr.attrHandle[ name ]( elem ) :
4053                                         elem[ name ] != null ?
4054                                                 elem[ name ] :
4055                                                 elem.getAttribute( name ),
4056                                 value = result + "",
4057                                 type = match[2],
4058                                 check = match[4];
4059
4060                         return result == null ?
4061                                 type === "!=" :
4062                                 type === "=" ?
4063                                 value === check :
4064                                 type === "*=" ?
4065                                 value.indexOf(check) >= 0 :
4066                                 type === "~=" ?
4067                                 (" " + value + " ").indexOf(check) >= 0 :
4068                                 !check ?
4069                                 value && result !== false :
4070                                 type === "!=" ?
4071                                 value !== check :
4072                                 type === "^=" ?
4073                                 value.indexOf(check) === 0 :
4074                                 type === "$=" ?
4075                                 value.substr(value.length - check.length) === check :
4076                                 type === "|=" ?
4077                                 value === check || value.substr(0, check.length + 1) === check + "-" :
4078                                 false;
4079                 },
4080
4081                 POS: function( elem, match, i, array ) {
4082                         var name = match[2],
4083                                 filter = Expr.setFilters[ name ];
4084
4085                         if ( filter ) {
4086                                 return filter( elem, i, match, array );
4087                         }
4088                 }
4089         }
4090 };
4091
4092 var origPOS = Expr.match.POS,
4093         fescape = function(all, num){
4094                 return "\\" + (num - 0 + 1);
4095         };
4096
4097 for ( var type in Expr.match ) {
4098         Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
4099         Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
4100 }
4101
4102 var makeArray = function( array, results ) {
4103         array = Array.prototype.slice.call( array, 0 );
4104
4105         if ( results ) {
4106                 results.push.apply( results, array );
4107                 return results;
4108         }
4109         
4110         return array;
4111 };
4112
4113 // Perform a simple check to determine if the browser is capable of
4114 // converting a NodeList to an array using builtin methods.
4115 // Also verifies that the returned array holds DOM nodes
4116 // (which is not the case in the Blackberry browser)
4117 try {
4118         Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
4119
4120 // Provide a fallback method if it does not work
4121 } catch( e ) {
4122         makeArray = function( array, results ) {
4123                 var i = 0,
4124                         ret = results || [];
4125
4126                 if ( toString.call(array) === "[object Array]" ) {
4127                         Array.prototype.push.apply( ret, array );
4128
4129                 } else {
4130                         if ( typeof array.length === "number" ) {
4131                                 for ( var l = array.length; i < l; i++ ) {
4132                                         ret.push( array[i] );
4133                                 }
4134
4135                         } else {
4136                                 for ( ; array[i]; i++ ) {
4137                                         ret.push( array[i] );
4138                                 }
4139                         }
4140                 }
4141
4142                 return ret;
4143         };
4144 }
4145
4146 var sortOrder, siblingCheck;
4147
4148 if ( document.documentElement.compareDocumentPosition ) {
4149         sortOrder = function( a, b ) {
4150                 if ( a === b ) {
4151                         hasDuplicate = true;
4152                         return 0;
4153                 }
4154
4155                 if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
4156                         return a.compareDocumentPosition ? -1 : 1;
4157                 }
4158
4159                 return a.compareDocumentPosition(b) & 4 ? -1 : 1;
4160         };
4161
4162 } else {
4163         sortOrder = function( a, b ) {
4164                 var al, bl,
4165                         ap = [],
4166                         bp = [],
4167                         aup = a.parentNode,
4168                         bup = b.parentNode,
4169                         cur = aup;
4170
4171                 // The nodes are identical, we can exit early
4172                 if ( a === b ) {
4173                         hasDuplicate = true;
4174                         return 0;
4175
4176                 // If the nodes are siblings (or identical) we can do a quick check
4177                 } else if ( aup === bup ) {
4178                         return siblingCheck( a, b );
4179
4180                 // If no parents were found then the nodes are disconnected
4181                 } else if ( !aup ) {
4182                         return -1;
4183
4184                 } else if ( !bup ) {
4185                         return 1;
4186                 }
4187
4188                 // Otherwise they're somewhere else in the tree so we need
4189                 // to build up a full list of the parentNodes for comparison
4190                 while ( cur ) {
4191                         ap.unshift( cur );
4192                         cur = cur.parentNode;
4193                 }
4194
4195                 cur = bup;
4196
4197                 while ( cur ) {
4198                         bp.unshift( cur );
4199                         cur = cur.parentNode;
4200                 }
4201
4202                 al = ap.length;
4203                 bl = bp.length;
4204
4205                 // Start walking down the tree looking for a discrepancy
4206                 for ( var i = 0; i < al && i < bl; i++ ) {
4207                         if ( ap[i] !== bp[i] ) {
4208                                 return siblingCheck( ap[i], bp[i] );
4209                         }
4210                 }
4211
4212                 // We ended someplace up the tree so do a sibling check
4213                 return i === al ?
4214                         siblingCheck( a, bp[i], -1 ) :
4215                         siblingCheck( ap[i], b, 1 );
4216         };
4217
4218         siblingCheck = function( a, b, ret ) {
4219                 if ( a === b ) {
4220                         return ret;
4221                 }
4222
4223                 var cur = a.nextSibling;
4224
4225                 while ( cur ) {
4226                         if ( cur === b ) {
4227                                 return -1;
4228                         }
4229
4230                         cur = cur.nextSibling;
4231                 }
4232
4233                 return 1;
4234         };
4235 }
4236
4237 // Utility function for retreiving the text value of an array of DOM nodes
4238 Sizzle.getText = function( elems ) {
4239         var ret = "", elem;
4240
4241         for ( var i = 0; elems[i]; i++ ) {
4242                 elem = elems[i];
4243
4244                 // Get the text from text nodes and CDATA nodes
4245                 if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
4246                         ret += elem.nodeValue;
4247
4248                 // Traverse everything else, except comment nodes
4249                 } else if ( elem.nodeType !== 8 ) {
4250                         ret += Sizzle.getText( elem.childNodes );
4251                 }
4252         }
4253
4254         return ret;
4255 };
4256
4257 // Check to see if the browser returns elements by name when
4258 // querying by getElementById (and provide a workaround)
4259 (function(){
4260         // We're going to inject a fake input element with a specified name
4261         var form = document.createElement("div"),
4262                 id = "script" + (new Date()).getTime(),
4263                 root = document.documentElement;
4264
4265         form.innerHTML = "<a name='" + id + "'/>";
4266
4267         // Inject it into the root element, check its status, and remove it quickly
4268         root.insertBefore( form, root.firstChild );
4269
4270         // The workaround has to do additional checks after a getElementById
4271         // Which slows things down for other browsers (hence the branching)
4272         if ( document.getElementById( id ) ) {
4273                 Expr.find.ID = function( match, context, isXML ) {
4274                         if ( typeof context.getElementById !== "undefined" && !isXML ) {
4275                                 var m = context.getElementById(match[1]);
4276
4277                                 return m ?
4278                                         m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
4279                                                 [m] :
4280                                                 undefined :
4281                                         [];
4282                         }
4283                 };
4284
4285                 Expr.filter.ID = function( elem, match ) {
4286                         var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
4287
4288                         return elem.nodeType === 1 && node && node.nodeValue === match;
4289                 };
4290         }
4291
4292         root.removeChild( form );
4293
4294         // release memory in IE
4295         root = form = null;
4296 })();
4297
4298 (function(){
4299         // Check to see if the browser returns only elements
4300         // when doing getElementsByTagName("*")
4301
4302         // Create a fake element
4303         var div = document.createElement("div");
4304         div.appendChild( document.createComment("") );
4305
4306         // Make sure no comments are found
4307         if ( div.getElementsByTagName("*").length > 0 ) {
4308                 Expr.find.TAG = function( match, context ) {
4309                         var results = context.getElementsByTagName( match[1] );
4310
4311                         // Filter out possible comments
4312                         if ( match[1] === "*" ) {
4313                                 var tmp = [];
4314
4315                                 for ( var i = 0; results[i]; i++ ) {
4316                                         if ( results[i].nodeType === 1 ) {
4317                                                 tmp.push( results[i] );
4318                                         }
4319                                 }
4320
4321                                 results = tmp;
4322                         }
4323
4324                         return results;
4325                 };
4326         }
4327
4328         // Check to see if an attribute returns normalized href attributes
4329         div.innerHTML = "<a href='#'></a>";
4330
4331         if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
4332                         div.firstChild.getAttribute("href") !== "#" ) {
4333
4334                 Expr.attrHandle.href = function( elem ) {
4335                         return elem.getAttribute( "href", 2 );
4336                 };
4337         }
4338
4339         // release memory in IE
4340         div = null;
4341 })();
4342
4343 if ( document.querySelectorAll ) {
4344         (function(){
4345                 var oldSizzle = Sizzle,
4346                         div = document.createElement("div"),
4347                         id = "__sizzle__";
4348
4349                 div.innerHTML = "<p class='TEST'></p>";
4350
4351                 // Safari can't handle uppercase or unicode characters when
4352                 // in quirks mode.
4353                 if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
4354                         return;
4355                 }
4356         
4357                 Sizzle = function( query, context, extra, seed ) {
4358                         context = context || document;
4359
4360                         // Only use querySelectorAll on non-XML documents
4361                         // (ID selectors don't work in non-HTML documents)
4362                         if ( !seed && !Sizzle.isXML(context) ) {
4363                                 // See if we find a selector to speed up
4364                                 var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
4365                                 
4366                                 if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
4367                                         // Speed-up: Sizzle("TAG")
4368                                         if ( match[1] ) {
4369                                                 return makeArray( context.getElementsByTagName( query ), extra );
4370                                         
4371                                         // Speed-up: Sizzle(".CLASS")
4372                                         } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
4373                                                 return makeArray( context.getElementsByClassName( match[2] ), extra );
4374                                         }
4375                                 }
4376                                 
4377                                 if ( context.nodeType === 9 ) {
4378                                         // Speed-up: Sizzle("body")
4379                                         // The body element only exists once, optimize finding it
4380                                         if ( query === "body" && context.body ) {
4381                                                 return makeArray( [ context.body ], extra );
4382                                                 
4383                                         // Speed-up: Sizzle("#ID")
4384                                         } else if ( match && match[3] ) {
4385                                                 var elem = context.getElementById( match[3] );
4386
4387                                                 // Check parentNode to catch when Blackberry 4.6 returns
4388                                                 // nodes that are no longer in the document #6963
4389                                                 if ( elem && elem.parentNode ) {
4390                                                         // Handle the case where IE and Opera return items
4391                                                         // by name instead of ID
4392                                                         if ( elem.id === match[3] ) {
4393                                                                 return makeArray( [ elem ], extra );
4394                                                         }
4395                                                         
4396                                                 } else {
4397                                                         return makeArray( [], extra );
4398                                                 }
4399                                         }
4400                                         
4401                                         try {
4402                                                 return makeArray( context.querySelectorAll(query), extra );
4403                                         } catch(qsaError) {}
4404
4405                                 // qSA works strangely on Element-rooted queries
4406                                 // We can work around this by specifying an extra ID on the root
4407                                 // and working up from there (Thanks to Andrew Dupont for the technique)
4408                                 // IE 8 doesn't work on object elements
4409                                 } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
4410                                         var old = context.getAttribute( "id" ),
4411                                                 nid = old || id,
4412                                                 hasParent = context.parentNode,
4413                                                 relativeHierarchySelector = /^\s*[+~]/.test( query );
4414
4415                                         if ( !old ) {
4416                                                 context.setAttribute( "id", nid );
4417                                         } else {
4418                                                 nid = nid.replace( /'/g, "\\$&" );
4419                                         }
4420                                         if ( relativeHierarchySelector && hasParent ) {
4421                                                 context = context.parentNode;
4422                                         }
4423
4424                                         try {
4425                                                 if ( !relativeHierarchySelector || hasParent ) {
4426                                                         return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
4427                                                 }
4428
4429                                         } catch(pseudoError) {
4430                                         } finally {
4431                                                 if ( !old ) {
4432                                                         context.removeAttribute( "id" );
4433                                                 }
4434                                         }
4435                                 }
4436                         }
4437                 
4438                         return oldSizzle(query, context, extra, seed);
4439                 };
4440
4441                 for ( var prop in oldSizzle ) {
4442                         Sizzle[ prop ] = oldSizzle[ prop ];
4443                 }
4444
4445                 // release memory in IE
4446                 div = null;
4447         })();
4448 }
4449
4450 (function(){
4451         var html = document.documentElement,
4452                 matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector,
4453                 pseudoWorks = false;
4454
4455         try {
4456                 // This should fail with an exception
4457                 // Gecko does not error, returns false instead
4458                 matches.call( document.documentElement, "[test!='']:sizzle" );
4459         
4460         } catch( pseudoError ) {
4461                 pseudoWorks = true;
4462         }
4463
4464         if ( matches ) {
4465                 Sizzle.matchesSelector = function( node, expr ) {
4466                         // Make sure that attribute selectors are quoted
4467                         expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
4468
4469                         if ( !Sizzle.isXML( node ) ) {
4470                                 try { 
4471                                         if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
4472                                                 return matches.call( node, expr );
4473                                         }
4474                                 } catch(e) {}
4475                         }
4476
4477                         return Sizzle(expr, null, null, [node]).length > 0;
4478                 };
4479         }
4480 })();
4481
4482 (function(){
4483         var div = document.createElement("div");
4484
4485         div.innerHTML = "<div class='test e'></div><div class='test'></div>";
4486
4487         // Opera can't find a second classname (in 9.6)
4488         // Also, make sure that getElementsByClassName actually exists
4489         if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
4490                 return;
4491         }
4492
4493         // Safari caches class attributes, doesn't catch changes (in 3.2)
4494         div.lastChild.className = "e";
4495
4496         if ( div.getElementsByClassName("e").length === 1 ) {
4497                 return;
4498         }
4499         
4500         Expr.order.splice(1, 0, "CLASS");
4501         Expr.find.CLASS = function( match, context, isXML ) {
4502                 if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
4503                         return context.getElementsByClassName(match[1]);
4504                 }
4505         };
4506
4507         // release memory in IE
4508         div = null;
4509 })();
4510
4511 function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
4512         for ( var i = 0, l = checkSet.length; i < l; i++ ) {
4513                 var elem = checkSet[i];
4514
4515                 if ( elem ) {
4516                         var match = false;
4517
4518                         elem = elem[dir];
4519
4520                         while ( elem ) {
4521                                 if ( elem.sizcache === doneName ) {
4522                                         match = checkSet[elem.sizset];
4523                                         break;
4524                                 }
4525
4526                                 if ( elem.nodeType === 1 && !isXML ){
4527                                         elem.sizcache = doneName;
4528                                         elem.sizset = i;
4529                                 }
4530
4531                                 if ( elem.nodeName.toLowerCase() === cur ) {
4532                                         match = elem;
4533                                         break;
4534                                 }
4535
4536                                 elem = elem[dir];
4537                         }
4538
4539                         checkSet[i] = match;
4540                 }
4541         }
4542 }
4543
4544 function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
4545         for ( var i = 0, l = checkSet.length; i < l; i++ ) {
4546                 var elem = checkSet[i];
4547
4548                 if ( elem ) {
4549                         var match = false;
4550                         
4551                         elem = elem[dir];
4552
4553                         while ( elem ) {
4554                                 if ( elem.sizcache === doneName ) {
4555                                         match = checkSet[elem.sizset];
4556                                         break;
4557                                 }
4558
4559                                 if ( elem.nodeType === 1 ) {
4560                                         if ( !isXML ) {
4561                                                 elem.sizcache = doneName;
4562                                                 elem.sizset = i;
4563                                         }
4564
4565                                         if ( typeof cur !== "string" ) {
4566                                                 if ( elem === cur ) {
4567                                                         match = true;
4568                                                         break;
4569                                                 }
4570
4571                                         } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
4572                                                 match = elem;
4573                                                 break;
4574                                         }
4575                                 }
4576
4577                                 elem = elem[dir];
4578                         }
4579
4580                         checkSet[i] = match;
4581                 }
4582         }
4583 }
4584
4585 if ( document.documentElement.contains ) {
4586         Sizzle.contains = function( a, b ) {
4587                 return a !== b && (a.contains ? a.contains(b) : true);
4588         };
4589
4590 } else if ( document.documentElement.compareDocumentPosition ) {
4591         Sizzle.contains = function( a, b ) {
4592                 return !!(a.compareDocumentPosition(b) & 16);
4593         };
4594
4595 } else {
4596         Sizzle.contains = function() {
4597                 return false;
4598         };
4599 }
4600
4601 Sizzle.isXML = function( elem ) {
4602         // documentElement is verified for cases where it doesn't yet exist
4603         // (such as loading iframes in IE - #4833) 
4604         var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
4605
4606         return documentElement ? documentElement.nodeName !== "HTML" : false;
4607 };
4608
4609 var posProcess = function( selector, context ) {
4610         var match,
4611                 tmpSet = [],
4612                 later = "",
4613                 root = context.nodeType ? [context] : context;
4614
4615         // Position selectors must be done after the filter
4616         // And so must :not(positional) so we move all PSEUDOs to the end
4617         while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
4618                 later += match[0];
4619                 selector = selector.replace( Expr.match.PSEUDO, "" );
4620         }
4621
4622         selector = Expr.relative[selector] ? selector + "*" : selector;
4623
4624         for ( var i = 0, l = root.length; i < l; i++ ) {
4625                 Sizzle( selector, root[i], tmpSet );
4626         }
4627
4628         return Sizzle.filter( later, tmpSet );
4629 };
4630
4631 // EXPOSE
4632 jQuery.find = Sizzle;
4633 jQuery.expr = Sizzle.selectors;
4634 jQuery.expr[":"] = jQuery.expr.filters;
4635 jQuery.unique = Sizzle.uniqueSort;
4636 jQuery.text = Sizzle.getText;
4637 jQuery.isXMLDoc = Sizzle.isXML;
4638 jQuery.contains = Sizzle.contains;
4639
4640
4641 })();
4642
4643
4644 var runtil = /Until$/,
4645         rparentsprev = /^(?:parents|prevUntil|prevAll)/,
4646         // Note: This RegExp should be improved, or likely pulled from Sizzle
4647         rmultiselector = /,/,
4648         isSimple = /^.[^:#\[\.,]*$/,
4649         slice = Array.prototype.slice,
4650         POS = jQuery.expr.match.POS,
4651         // methods guaranteed to produce a unique set when starting from a unique set
4652         guaranteedUnique = {
4653                 children: true,
4654                 contents: true,
4655                 next: true,
4656                 prev: true
4657         };
4658
4659 jQuery.fn.extend({
4660         find: function( selector ) {
4661                 var ret = this.pushStack( "", "find", selector ),
4662                         length = 0;
4663
4664                 for ( var i = 0, l = this.length; i < l; i++ ) {
4665                         length = ret.length;
4666                         jQuery.find( selector, this[i], ret );
4667
4668                         if ( i > 0 ) {
4669                                 // Make sure that the results are unique
4670                                 for ( var n = length; n < ret.length; n++ ) {
4671                                         for ( var r = 0; r < length; r++ ) {
4672                                                 if ( ret[r] === ret[n] ) {
4673                                                         ret.splice(n--, 1);
4674                                                         break;
4675                                                 }
4676                                         }
4677                                 }
4678                         }
4679                 }
4680
4681                 return ret;
4682         },
4683
4684         has: function( target ) {
4685                 var targets = jQuery( target );
4686                 return this.filter(function() {
4687                         for ( var i = 0, l = targets.length; i < l; i++ ) {
4688                                 if ( jQuery.contains( this, targets[i] ) ) {
4689                                         return true;
4690                                 }
4691                         }
4692                 });
4693         },
4694
4695         not: function( selector ) {
4696                 return this.pushStack( winnow(this, selector, false), "not", selector);
4697         },
4698
4699         filter: function( selector ) {
4700                 return this.pushStack( winnow(this, selector, true), "filter", selector );
4701         },
4702
4703         is: function( selector ) {
4704                 return !!selector && jQuery.filter( selector, this ).length > 0;
4705         },
4706
4707         closest: function( selectors, context ) {
4708                 var ret = [], i, l, cur = this[0];
4709
4710                 if ( jQuery.isArray( selectors ) ) {
4711                         var match, selector,
4712                                 matches = {},
4713                                 level = 1;
4714
4715                         if ( cur && selectors.length ) {
4716                                 for ( i = 0, l = selectors.length; i < l; i++ ) {
4717                                         selector = selectors[i];
4718
4719                                         if ( !matches[selector] ) {
4720                                                 matches[selector] = jQuery.expr.match.POS.test( selector ) ?
4721                                                         jQuery( selector, context || this.context ) :
4722                                                         selector;
4723                                         }
4724                                 }
4725
4726                                 while ( cur && cur.ownerDocument && cur !== context ) {
4727                                         for ( selector in matches ) {
4728                                                 match = matches[selector];
4729
4730                                                 if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
4731                                                         ret.push({ selector: selector, elem: cur, level: level });
4732                                                 }
4733                                         }
4734
4735                                         cur = cur.parentNode;
4736                                         level++;
4737                                 }
4738                         }
4739
4740                         return ret;
4741                 }
4742
4743                 var pos = POS.test( selectors ) ?
4744                         jQuery( selectors, context || this.context ) : null;
4745
4746                 for ( i = 0, l = this.length; i < l; i++ ) {
4747                         cur = this[i];
4748
4749                         while ( cur ) {
4750                                 if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
4751                                         ret.push( cur );
4752                                         break;
4753
4754                                 } else {
4755                                         cur = cur.parentNode;
4756                                         if ( !cur || !cur.ownerDocument || cur === context ) {
4757                                                 break;
4758                                         }
4759                                 }
4760                         }
4761                 }
4762
4763                 ret = ret.length > 1 ? jQuery.unique(ret) : ret;
4764
4765                 return this.pushStack( ret, "closest", selectors );
4766         },
4767
4768         // Determine the position of an element within
4769         // the matched set of elements
4770         index: function( elem ) {
4771                 if ( !elem || typeof elem === "string" ) {
4772                         return jQuery.inArray( this[0],
4773                                 // If it receives a string, the selector is used
4774                                 // If it receives nothing, the siblings are used
4775                                 elem ? jQuery( elem ) : this.parent().children() );
4776                 }
4777                 // Locate the position of the desired element
4778                 return jQuery.inArray(
4779                         // If it receives a jQuery object, the first element is used
4780                         elem.jquery ? elem[0] : elem, this );
4781         },
4782
4783         add: function( selector, context ) {
4784                 var set = typeof selector === "string" ?
4785                                 jQuery( selector, context ) :
4786                                 jQuery.makeArray( selector ),
4787                         all = jQuery.merge( this.get(), set );
4788
4789                 return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
4790                         all :
4791                         jQuery.unique( all ) );
4792         },
4793
4794         andSelf: function() {
4795                 return this.add( this.prevObject );
4796         }
4797 });
4798
4799 // A painfully simple check to see if an element is disconnected
4800 // from a document (should be improved, where feasible).
4801 function isDisconnected( node ) {
4802         return !node || !node.parentNode || node.parentNode.nodeType === 11;
4803 }
4804
4805 jQuery.each({
4806         parent: function( elem ) {
4807                 var parent = elem.parentNode;
4808                 return parent && parent.nodeType !== 11 ? parent : null;
4809         },
4810         parents: function( elem ) {
4811                 return jQuery.dir( elem, "parentNode" );
4812         },
4813         parentsUntil: function( elem, i, until ) {
4814                 return jQuery.dir( elem, "parentNode", until );
4815         },
4816         next: function( elem ) {
4817                 return jQuery.nth( elem, 2, "nextSibling" );
4818         },
4819         prev: function( elem ) {
4820                 return jQuery.nth( elem, 2, "previousSibling" );
4821         },
4822         nextAll: function( elem ) {
4823                 return jQuery.dir( elem, "nextSibling" );
4824         },
4825         prevAll: function( elem ) {
4826                 return jQuery.dir( elem, "previousSibling" );
4827         },
4828         nextUntil: function( elem, i, until ) {
4829                 return jQuery.dir( elem, "nextSibling", until );
4830         },
4831         prevUntil: function( elem, i, until ) {
4832                 return jQuery.dir( elem, "previousSibling", until );
4833         },
4834         siblings: function( elem ) {
4835                 return jQuery.sibling( elem.parentNode.firstChild, elem );
4836         },
4837         children: function( elem ) {
4838                 return jQuery.sibling( elem.firstChild );
4839         },
4840         contents: function( elem ) {
4841                 return jQuery.nodeName( elem, "iframe" ) ?
4842                         elem.contentDocument || elem.contentWindow.document :
4843                         jQuery.makeArray( elem.childNodes );
4844         }
4845 }, function( name, fn ) {
4846         jQuery.fn[ name ] = function( until, selector ) {
4847                 var ret = jQuery.map( this, fn, until ),
4848                 // The variable 'args' was introduced in
4849                 // https://github.com/jquery/jquery/commit/52a0238
4850                 // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
4851                 // http://code.google.com/p/v8/issues/detail?id=1050
4852                     args = slice.call(arguments);
4853
4854                 if ( !runtil.test( name ) ) {
4855                         selector = until;
4856                 }
4857
4858                 if ( selector && typeof selector === "string" ) {
4859                         ret = jQuery.filter( selector, ret );
4860                 }
4861
4862                 ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
4863
4864                 if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
4865                         ret = ret.reverse();
4866                 }
4867
4868                 return this.pushStack( ret, name, args.join(",") );
4869         };
4870 });
4871
4872 jQuery.extend({
4873         filter: function( expr, elems, not ) {
4874                 if ( not ) {
4875                         expr = ":not(" + expr + ")";
4876                 }
4877
4878                 return elems.length === 1 ?
4879                         jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
4880                         jQuery.find.matches(expr, elems);
4881         },
4882
4883         dir: function( elem, dir, until ) {
4884                 var matched = [],
4885                         cur = elem[ dir ];
4886
4887                 while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
4888                         if ( cur.nodeType === 1 ) {
4889                                 matched.push( cur );
4890                         }
4891                         cur = cur[dir];
4892                 }
4893                 return matched;
4894         },
4895
4896         nth: function( cur, result, dir, elem ) {
4897                 result = result || 1;
4898                 var num = 0;
4899
4900                 for ( ; cur; cur = cur[dir] ) {
4901                         if ( cur.nodeType === 1 && ++num === result ) {
4902                                 break;
4903                         }
4904                 }
4905
4906                 return cur;
4907         },
4908
4909         sibling: function( n, elem ) {
4910                 var r = [];
4911
4912                 for ( ; n; n = n.nextSibling ) {
4913                         if ( n.nodeType === 1 && n !== elem ) {
4914                                 r.push( n );
4915                         }
4916                 }
4917
4918                 return r;
4919         }
4920 });
4921
4922 // Implement the identical functionality for filter and not
4923 function winnow( elements, qualifier, keep ) {
4924         if ( jQuery.isFunction( qualifier ) ) {
4925                 return jQuery.grep(elements, function( elem, i ) {
4926                         var retVal = !!qualifier.call( elem, i, elem );
4927                         return retVal === keep;
4928                 });
4929
4930         } else if ( qualifier.nodeType ) {
4931                 return jQuery.grep(elements, function( elem, i ) {
4932                         return (elem === qualifier) === keep;
4933                 });
4934
4935         } else if ( typeof qualifier === "string" ) {
4936                 var filtered = jQuery.grep(elements, function( elem ) {
4937                         return elem.nodeType === 1;
4938                 });
4939
4940                 if ( isSimple.test( qualifier ) ) {
4941                         return jQuery.filter(qualifier, filtered, !keep);
4942                 } else {
4943                         qualifier = jQuery.filter( qualifier, filtered );
4944                 }
4945         }
4946
4947         return jQuery.grep(elements, function( elem, i ) {
4948                 return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
4949         });
4950 }
4951
4952
4953
4954
4955 var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
4956         rleadingWhitespace = /^\s+/,
4957         rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
4958         rtagName = /<([\w:]+)/,
4959         rtbody = /<tbody/i,
4960         rhtml = /<|&#?\w+;/,
4961         rnocache = /<(?:script|object|embed|option|style)/i,
4962         // checked="checked" or checked (html5)
4963         rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
4964         wrapMap = {
4965                 option: [ 1, "<select multiple='multiple'>", "</select>" ],
4966                 legend: [ 1, "<fieldset>", "</fieldset>" ],
4967                 thead: [ 1, "<table>", "</table>" ],
4968                 tr: [ 2, "<table><tbody>", "</tbody></table>" ],
4969                 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
4970                 col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
4971                 area: [ 1, "<map>", "</map>" ],
4972                 _default: [ 0, "", "" ]
4973         };
4974
4975 wrapMap.optgroup = wrapMap.option;
4976 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4977 wrapMap.th = wrapMap.td;
4978
4979 // IE can't serialize <link> and <script> tags normally
4980 if ( !jQuery.support.htmlSerialize ) {
4981         wrapMap._default = [ 1, "div<div>", "</div>" ];
4982 }
4983
4984 jQuery.fn.extend({
4985         text: function( text ) {
4986                 if ( jQuery.isFunction(text) ) {
4987                         return this.each(function(i) {
4988                                 var self = jQuery( this );
4989
4990                                 self.text( text.call(this, i, self.text()) );
4991                         });
4992                 }
4993
4994                 if ( typeof text !== "object" && text !== undefined ) {
4995                         return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
4996                 }
4997
4998                 return jQuery.text( this );
4999         },
5000
5001         wrapAll: function( html ) {
5002                 if ( jQuery.isFunction( html ) ) {
5003                         return this.each(function(i) {
5004                                 jQuery(this).wrapAll( html.call(this, i) );
5005                         });
5006                 }
5007
5008                 if ( this[0] ) {
5009                         // The elements to wrap the target around
5010                         var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
5011
5012                         if ( this[0].parentNode ) {
5013                                 wrap.insertBefore( this[0] );
5014                         }
5015
5016                         wrap.map(function() {
5017                                 var elem = this;
5018
5019                                 while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
5020                                         elem = elem.firstChild;
5021                                 }
5022
5023                                 return elem;
5024                         }).append(this);
5025                 }
5026
5027                 return this;
5028         },
5029
5030         wrapInner: function( html ) {
5031                 if ( jQuery.isFunction( html ) ) {
5032                         return this.each(function(i) {
5033                                 jQuery(this).wrapInner( html.call(this, i) );
5034                         });
5035                 }
5036
5037                 return this.each(function() {
5038                         var self = jQuery( this ),
5039                                 contents = self.contents();
5040
5041                         if ( contents.length ) {
5042                                 contents.wrapAll( html );
5043
5044                         } else {
5045                                 self.append( html );
5046                         }
5047                 });
5048         },
5049
5050         wrap: function( html ) {
5051                 return this.each(function() {
5052                         jQuery( this ).wrapAll( html );
5053                 });
5054         },
5055
5056         unwrap: function() {
5057                 return this.parent().each(function() {
5058                         if ( !jQuery.nodeName( this, "body" ) ) {
5059                                 jQuery( this ).replaceWith( this.childNodes );
5060                         }
5061                 }).end();
5062         },
5063
5064         append: function() {
5065                 return this.domManip(arguments, true, function( elem ) {
5066                         if ( this.nodeType === 1 ) {
5067                                 this.appendChild( elem );
5068                         }
5069                 });
5070         },
5071
5072         prepend: function() {
5073                 return this.domManip(arguments, true, function( elem ) {
5074                         if ( this.nodeType === 1 ) {
5075                                 this.insertBefore( elem, this.firstChild );
5076                         }
5077                 });
5078         },
5079
5080         before: function() {
5081                 if ( this[0] && this[0].parentNode ) {
5082                         return this.domManip(arguments, false, function( elem ) {
5083                                 this.parentNode.insertBefore( elem, this );
5084                         });
5085                 } else if ( arguments.length ) {
5086                         var set = jQuery(arguments[0]);
5087                         set.push.apply( set, this.toArray() );
5088                         return this.pushStack( set, "before", arguments );
5089                 }
5090         },
5091
5092         after: function() {
5093                 if ( this[0] && this[0].parentNode ) {
5094                         return this.domManip(arguments, false, function( elem ) {
5095                                 this.parentNode.insertBefore( elem, this.nextSibling );
5096                         });
5097                 } else if ( arguments.length ) {
5098                         var set = this.pushStack( this, "after", arguments );
5099                         set.push.apply( set, jQuery(arguments[0]).toArray() );
5100                         return set;
5101                 }
5102         },
5103
5104         // keepData is for internal use only--do not document
5105         remove: function( selector, keepData ) {
5106                 for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
5107                         if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
5108                                 if ( !keepData && elem.nodeType === 1 ) {
5109                                         jQuery.cleanData( elem.getElementsByTagName("*") );
5110                                         jQuery.cleanData( [ elem ] );
5111                                 }
5112
5113                                 if ( elem.parentNode ) {
5114                                          elem.parentNode.removeChild( elem );
5115                                 }
5116                         }
5117                 }
5118
5119                 return this;
5120         },
5121
5122         empty: function() {
5123                 for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
5124                         // Remove element nodes and prevent memory leaks
5125                         if ( elem.nodeType === 1 ) {
5126                                 jQuery.cleanData( elem.getElementsByTagName("*") );
5127                         }
5128
5129                         // Remove any remaining nodes
5130                         while ( elem.firstChild ) {
5131                                 elem.removeChild( elem.firstChild );
5132                         }
5133                 }
5134
5135                 return this;
5136         },
5137
5138         clone: function( dataAndEvents, deepDataAndEvents ) {
5139                 dataAndEvents = dataAndEvents == null ? true : dataAndEvents;
5140                 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
5141
5142                 return this.map( function () {
5143                         return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
5144                 });
5145         },
5146
5147         html: function( value ) {
5148                 if ( value === undefined ) {
5149                         return this[0] && this[0].nodeType === 1 ?
5150                                 this[0].innerHTML.replace(rinlinejQuery, "") :
5151                                 null;
5152
5153                 // See if we can take a shortcut and just use innerHTML
5154                 } else if ( typeof value === "string" && !rnocache.test( value ) &&
5155                         (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
5156                         !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
5157
5158                         value = value.replace(rxhtmlTag, "<$1></$2>");
5159
5160                         try {
5161                                 for ( var i = 0, l = this.length; i < l; i++ ) {
5162                                         // Remove element nodes and prevent memory leaks
5163                                         if ( this[i].nodeType === 1 ) {
5164                                                 jQuery.cleanData( this[i].getElementsByTagName("*") );
5165                                                 this[i].innerHTML = value;
5166                                         }
5167                                 }
5168
5169                         // If using innerHTML throws an exception, use the fallback method
5170                         } catch(e) {
5171                                 this.empty().append( value );
5172                         }
5173
5174                 } else if ( jQuery.isFunction( value ) ) {
5175                         this.each(function(i){
5176                                 var self = jQuery( this );
5177
5178                                 self.html( value.call(this, i, self.html()) );
5179                         });
5180
5181                 } else {
5182                         this.empty().append( value );
5183                 }
5184
5185                 return this;
5186         },
5187
5188         replaceWith: function( value ) {
5189                 if ( this[0] && this[0].parentNode ) {
5190                         // Make sure that the elements are removed from the DOM before they are inserted
5191                         // this can help fix replacing a parent with child elements
5192                         if ( jQuery.isFunction( value ) ) {
5193                                 return this.each(function(i) {
5194                                         var self = jQuery(this), old = self.html();
5195                                         self.replaceWith( value.call( this, i, old ) );
5196                                 });
5197                         }
5198
5199                         if ( typeof value !== "string" ) {
5200                                 value = jQuery( value ).detach();
5201                         }
5202
5203                         return this.each(function() {
5204                                 var next = this.nextSibling,
5205                                         parent = this.parentNode;
5206
5207                                 jQuery( this ).remove();
5208
5209                                 if ( next ) {
5210                                         jQuery(next).before( value );
5211                                 } else {
5212                                         jQuery(parent).append( value );
5213                                 }
5214                         });
5215                 } else {
5216                         return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
5217                 }
5218         },
5219
5220         detach: function( selector ) {
5221                 return this.remove( selector, true );
5222         },
5223
5224         domManip: function( args, table, callback ) {
5225                 var results, first, fragment, parent,
5226                         value = args[0],
5227                         scripts = [];
5228
5229                 // We can't cloneNode fragments that contain checked, in WebKit
5230                 if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
5231                         return this.each(function() {
5232                                 jQuery(this).domManip( args, table, callback, true );
5233                         });
5234                 }
5235
5236                 if ( jQuery.isFunction(value) ) {
5237                         return this.each(function(i) {
5238                                 var self = jQuery(this);
5239                                 args[0] = value.call(this, i, table ? self.html() : undefined);
5240                                 self.domManip( args, table, callback );
5241                         });
5242                 }
5243
5244                 if ( this[0] ) {
5245                         parent = value && value.parentNode;
5246
5247                         // If we're in a fragment, just use that instead of building a new one
5248                         if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
5249                                 results = { fragment: parent };
5250
5251                         } else {
5252                                 results = jQuery.buildFragment( args, this, scripts );
5253                         }
5254
5255                         fragment = results.fragment;
5256
5257                         if ( fragment.childNodes.length === 1 ) {
5258                                 first = fragment = fragment.firstChild;
5259                         } else {
5260                                 first = fragment.firstChild;
5261                         }
5262
5263                         if ( first ) {
5264                                 table = table && jQuery.nodeName( first, "tr" );
5265
5266                                 for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
5267                                         callback.call(
5268                                                 table ?
5269                                                         root(this[i], first) :
5270                                                         this[i],
5271                                                 // Make sure that we do not leak memory by inadvertently discarding
5272                                                 // the original fragment (which might have attached data) instead of
5273                                                 // using it; in addition, use the original fragment object for the last
5274                                                 // item instead of first because it can end up being emptied incorrectly
5275                                                 // in certain situations (Bug #8070).
5276                                                 // Fragments from the fragment cache must always be cloned and never used
5277                                                 // in place.
5278                                                 results.cacheable || (l > 1 && i < lastIndex) ?
5279                                                         jQuery.clone( fragment, true, true ) :
5280                                                         fragment
5281                                         );
5282                                 }
5283                         }
5284
5285                         if ( scripts.length ) {
5286                                 jQuery.each( scripts, evalScript );
5287                         }
5288                 }
5289
5290                 return this;
5291         }
5292 });
5293
5294 function root( elem, cur ) {
5295         return jQuery.nodeName(elem, "table") ?
5296                 (elem.getElementsByTagName("tbody")[0] ||
5297                 elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
5298                 elem;
5299 }
5300
5301 function cloneCopyEvent( src, dest ) {
5302
5303         if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
5304                 return;
5305         }
5306
5307         var internalKey = jQuery.expando,
5308                         oldData = jQuery.data( src ),
5309                         curData = jQuery.data( dest, oldData );
5310
5311         // Switch to use the internal data object, if it exists, for the next
5312         // stage of data copying
5313         if ( (oldData = oldData[ internalKey ]) ) {
5314                 var events = oldData.events;
5315                                 curData = curData[ internalKey ] = jQuery.extend({}, oldData);
5316
5317                 if ( events ) {
5318                         delete curData.handle;
5319                         curData.events = {};
5320
5321                         for ( var type in events ) {
5322                                 for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
5323                                         jQuery.event.add( dest, type, events[ type ][ i ], events[ type ][ i ].data );
5324                                 }
5325                         }
5326                 }
5327         }
5328 }
5329
5330 function cloneFixAttributes(src, dest) {
5331         // We do not need to do anything for non-Elements
5332         if ( dest.nodeType !== 1 ) {
5333                 return;
5334         }
5335
5336         var nodeName = dest.nodeName.toLowerCase();
5337
5338         // clearAttributes removes the attributes, which we don't want,
5339         // but also removes the attachEvent events, which we *do* want
5340         dest.clearAttributes();
5341
5342         // mergeAttributes, in contrast, only merges back on the
5343         // original attributes, not the events
5344         dest.mergeAttributes(src);
5345
5346         // IE6-8 fail to clone children inside object elements that use
5347         // the proprietary classid attribute value (rather than the type
5348         // attribute) to identify the type of content to display
5349         if ( nodeName === "object" ) {
5350                 dest.outerHTML = src.outerHTML;
5351
5352         } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
5353                 // IE6-8 fails to persist the checked state of a cloned checkbox
5354                 // or radio button. Worse, IE6-7 fail to give the cloned element
5355                 // a checked appearance if the defaultChecked value isn't also set
5356                 if ( src.checked ) {
5357                         dest.defaultChecked = dest.checked = src.checked;
5358                 }
5359
5360                 // IE6-7 get confused and end up setting the value of a cloned
5361                 // checkbox/radio button to an empty string instead of "on"
5362                 if ( dest.value !== src.value ) {
5363                         dest.value = src.value;
5364                 }
5365
5366         // IE6-8 fails to return the selected option to the default selected
5367         // state when cloning options
5368         } else if ( nodeName === "option" ) {
5369                 dest.selected = src.defaultSelected;
5370
5371         // IE6-8 fails to set the defaultValue to the correct value when
5372         // cloning other types of input fields
5373         } else if ( nodeName === "input" || nodeName === "textarea" ) {
5374                 dest.defaultValue = src.defaultValue;
5375         }
5376
5377         // Event data gets referenced instead of copied if the expando
5378         // gets copied too
5379         dest.removeAttribute( jQuery.expando );
5380 }
5381
5382 jQuery.buildFragment = function( args, nodes, scripts ) {
5383         var fragment, cacheable, cacheresults,
5384                 doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
5385
5386         // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
5387         // Cloning options loses the selected state, so don't cache them
5388         // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
5389         // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
5390         if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
5391                 args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
5392
5393                 cacheable = true;
5394                 cacheresults = jQuery.fragments[ args[0] ];
5395                 if ( cacheresults ) {
5396                         if ( cacheresults !== 1 ) {
5397                                 fragment = cacheresults;
5398                         }
5399                 }
5400         }
5401
5402         if ( !fragment ) {
5403                 fragment = doc.createDocumentFragment();
5404                 jQuery.clean( args, doc, fragment, scripts );
5405         }
5406
5407         if ( cacheable ) {
5408                 jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
5409         }
5410
5411         return { fragment: fragment, cacheable: cacheable };
5412 };
5413
5414 jQuery.fragments = {};
5415
5416 jQuery.each({
5417         appendTo: "append",
5418         prependTo: "prepend",
5419         insertBefore: "before",
5420         insertAfter: "after",
5421         replaceAll: "replaceWith"
5422 }, function( name, original ) {
5423         jQuery.fn[ name ] = function( selector ) {
5424                 var ret = [],
5425                         insert = jQuery( selector ),
5426                         parent = this.length === 1 && this[0].parentNode;
5427
5428                 if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
5429                         insert[ original ]( this[0] );
5430                         return this;
5431
5432                 } else {
5433                         for ( var i = 0, l = insert.length; i < l; i++ ) {
5434                                 var elems = (i > 0 ? this.clone(true) : this).get();
5435                                 jQuery( insert[i] )[ original ]( elems );
5436                                 ret = ret.concat( elems );
5437                         }
5438
5439                         return this.pushStack( ret, name, insert.selector );
5440                 }
5441         };
5442 });
5443
5444 jQuery.extend({
5445         clone: function( elem, dataAndEvents, deepDataAndEvents ) {
5446                 var clone = elem.cloneNode(true),
5447                                 srcElements,
5448                                 destElements,
5449                                 i;
5450
5451                 if ( !jQuery.support.noCloneEvent && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
5452                         // IE copies events bound via attachEvent when using cloneNode.
5453                         // Calling detachEvent on the clone will also remove the events
5454                         // from the original. In order to get around this, we use some
5455                         // proprietary methods to clear the events. Thanks to MooTools
5456                         // guys for this hotness.
5457
5458                         // Using Sizzle here is crazy slow, so we use getElementsByTagName
5459                         // instead
5460                         srcElements = elem.getElementsByTagName("*");
5461                         destElements = clone.getElementsByTagName("*");
5462
5463                         // Weird iteration because IE will replace the length property
5464                         // with an element if you are cloning the body and one of the
5465                         // elements on the page has a name or id of "length"
5466                         for ( i = 0; srcElements[i]; ++i ) {
5467                                 cloneFixAttributes( srcElements[i], destElements[i] );
5468                         }
5469
5470                         cloneFixAttributes( elem, clone );
5471                 }
5472
5473                 // Copy the events from the original to the clone
5474                 if ( dataAndEvents ) {
5475
5476                         cloneCopyEvent( elem, clone );
5477
5478                         if ( deepDataAndEvents && "getElementsByTagName" in elem ) {
5479
5480                                 srcElements = elem.getElementsByTagName("*");
5481                                 destElements = clone.getElementsByTagName("*");
5482
5483                                 if ( srcElements.length ) {
5484                                         for ( i = 0; srcElements[i]; ++i ) {
5485                                                 cloneCopyEvent( srcElements[i], destElements[i] );
5486                                         }
5487                                 }
5488                         }
5489                 }
5490                 // Return the cloned set
5491                 return clone;
5492   },
5493         clean: function( elems, context, fragment, scripts ) {
5494                 context = context || document;
5495
5496                 // !context.createElement fails in IE with an error but returns typeof 'object'
5497                 if ( typeof context.createElement === "undefined" ) {
5498                         context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
5499                 }
5500
5501                 var ret = [];
5502
5503                 for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
5504                         if ( typeof elem === "number" ) {
5505                                 elem += "";
5506                         }
5507
5508                         if ( !elem ) {
5509                                 continue;
5510                         }
5511
5512                         // Convert html string into DOM nodes
5513                         if ( typeof elem === "string" && !rhtml.test( elem ) ) {
5514                                 elem = context.createTextNode( elem );
5515
5516                         } else if ( typeof elem === "string" ) {
5517                                 // Fix "XHTML"-style tags in all browsers
5518                                 elem = elem.replace(rxhtmlTag, "<$1></$2>");
5519
5520                                 // Trim whitespace, otherwise indexOf won't work as expected
5521                                 var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
5522                                         wrap = wrapMap[ tag ] || wrapMap._default,
5523                                         depth = wrap[0],
5524                                         div = context.createElement("div");
5525
5526                                 // Go to html and back, then peel off extra wrappers
5527                                 div.innerHTML = wrap[1] + elem + wrap[2];
5528
5529                                 // Move to the right depth
5530                                 while ( depth-- ) {
5531                                         div = div.lastChild;
5532                                 }
5533
5534                                 // Remove IE's autoinserted <tbody> from table fragments
5535                                 if ( !jQuery.support.tbody ) {
5536
5537                                         // String was a <table>, *may* have spurious <tbody>
5538                                         var hasBody = rtbody.test(elem),
5539                                                 tbody = tag === "table" && !hasBody ?
5540                                                         div.firstChild && div.firstChild.childNodes :
5541
5542                                                         // String was a bare <thead> or <tfoot>
5543                                                         wrap[1] === "<table>" && !hasBody ?
5544                                                                 div.childNodes :
5545                                                                 [];
5546
5547                                         for ( var j = tbody.length - 1; j >= 0 ; --j ) {
5548                                                 if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
5549                                                         tbody[ j ].parentNode.removeChild( tbody[ j ] );
5550                                                 }
5551                                         }
5552
5553                                 }
5554
5555                                 // IE completely kills leading whitespace when innerHTML is used
5556                                 if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
5557                                         div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
5558                                 }
5559
5560                                 elem = div.childNodes;
5561                         }
5562
5563                         if ( elem.nodeType ) {
5564                                 ret.push( elem );
5565                         } else {
5566                                 ret = jQuery.merge( ret, elem );
5567                         }
5568                 }
5569
5570                 if ( fragment ) {
5571                         for ( i = 0; ret[i]; i++ ) {
5572                                 if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
5573                                         scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
5574
5575                                 } else {
5576                                         if ( ret[i].nodeType === 1 ) {
5577                                                 ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
5578                                         }
5579                                         fragment.appendChild( ret[i] );
5580                                 }
5581                         }
5582                 }
5583
5584                 return ret;
5585         },
5586
5587         cleanData: function( elems ) {
5588                 var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
5589                         deleteExpando = jQuery.support.deleteExpando;
5590
5591                 for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
5592                         if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
5593                                 continue;
5594                         }
5595
5596                         id = elem[ jQuery.expando ];
5597
5598                         if ( id ) {
5599                                 data = cache[ id ] && cache[ id ][ internalKey ];
5600
5601                                 if ( data && data.events ) {
5602                                         for ( var type in data.events ) {
5603                                                 if ( special[ type ] ) {
5604                                                         jQuery.event.remove( elem, type );
5605
5606                                                 // This is a shortcut to avoid jQuery.event.remove's overhead
5607                                                 } else {
5608                                                         jQuery.removeEvent( elem, type, data.handle );
5609                                                 }
5610                                         }
5611
5612                                         // Null the DOM reference to avoid IE6/7/8 leak (#7054)
5613                                         if ( data.handle ) {
5614                                                 data.handle.elem = null;
5615                                         }
5616                                 }
5617
5618                                 if ( deleteExpando ) {
5619                                         delete elem[ jQuery.expando ];
5620
5621                                 } else if ( elem.removeAttribute ) {
5622                                         elem.removeAttribute( jQuery.expando );
5623                                 }
5624
5625                                 delete cache[ id ];
5626                         }
5627                 }
5628         }
5629 });
5630
5631 function evalScript( i, elem ) {
5632         if ( elem.src ) {
5633                 jQuery.ajax({
5634                         url: elem.src,
5635                         async: false,
5636                         dataType: "script"
5637                 });
5638         } else {
5639                 jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
5640         }
5641
5642         if ( elem.parentNode ) {
5643                 elem.parentNode.removeChild( elem );
5644         }
5645 }
5646
5647
5648
5649
5650 var ralpha = /alpha\([^)]*\)/i,
5651         ropacity = /opacity=([^)]*)/,
5652         rdashAlpha = /-([a-z])/ig,
5653         rupper = /([A-Z])/g,
5654         rnumpx = /^-?\d+(?:px)?$/i,
5655         rnum = /^-?\d/,
5656
5657         cssShow = { position: "absolute", visibility: "hidden", display: "block" },
5658         cssWidth = [ "Left", "Right" ],
5659         cssHeight = [ "Top", "Bottom" ],
5660         curCSS,
5661
5662         getComputedStyle,
5663         currentStyle,
5664
5665         fcamelCase = function( all, letter ) {
5666                 return letter.toUpperCase();
5667         };
5668
5669 jQuery.fn.css = function( name, value ) {
5670         // Setting 'undefined' is a no-op
5671         if ( arguments.length === 2 && value === undefined ) {
5672                 return this;
5673         }
5674
5675         return jQuery.access( this, name, value, true, function( elem, name, value ) {
5676                 return value !== undefined ?
5677                         jQuery.style( elem, name, value ) :
5678                         jQuery.css( elem, name );
5679         });
5680 };
5681
5682 jQuery.extend({
5683         // Add in style property hooks for overriding the default
5684         // behavior of getting and setting a style property
5685         cssHooks: {
5686                 opacity: {
5687                         get: function( elem, computed ) {
5688                                 if ( computed ) {
5689                                         // We should always get a number back from opacity
5690                                         var ret = curCSS( elem, "opacity", "opacity" );
5691                                         return ret === "" ? "1" : ret;
5692
5693                                 } else {
5694                                         return elem.style.opacity;
5695                                 }
5696                         }
5697                 }
5698         },
5699
5700         // Exclude the following css properties to add px
5701         cssNumber: {
5702                 "zIndex": true,
5703                 "fontWeight": true,
5704                 "opacity": true,
5705                 "zoom": true,
5706                 "lineHeight": true
5707         },
5708
5709         // Add in properties whose names you wish to fix before
5710         // setting or getting the value
5711         cssProps: {
5712                 // normalize float css property
5713                 "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
5714         },
5715
5716         // Get and set the style property on a DOM Node
5717         style: function( elem, name, value, extra ) {
5718                 // Don't set styles on text and comment nodes
5719                 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
5720                         return;
5721                 }
5722
5723                 // Make sure that we're working with the right name
5724                 var ret, origName = jQuery.camelCase( name ),
5725                         style = elem.style, hooks = jQuery.cssHooks[ origName ];
5726
5727                 name = jQuery.cssProps[ origName ] || origName;
5728
5729                 // Check if we're setting a value
5730                 if ( value !== undefined ) {
5731                         // Make sure that NaN and null values aren't set. See: #7116
5732                         if ( typeof value === "number" && isNaN( value ) || value == null ) {
5733                                 return;
5734                         }
5735
5736                         // If a number was passed in, add 'px' to the (except for certain CSS properties)
5737                         if ( typeof value === "number" && !jQuery.cssNumber[ origName ] ) {
5738                                 value += "px";
5739                         }
5740
5741                         // If a hook was provided, use that value, otherwise just set the specified value
5742                         if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
5743                                 // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
5744                                 // Fixes bug #5509
5745                                 try {
5746                                         style[ name ] = value;
5747                                 } catch(e) {}
5748                         }
5749
5750                 } else {
5751                         // If a hook was provided get the non-computed value from there
5752                         if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
5753                                 return ret;
5754                         }
5755
5756                         // Otherwise just get the value from the style object
5757                         return style[ name ];
5758                 }
5759         },
5760
5761         css: function( elem, name, extra ) {
5762                 // Make sure that we're working with the right name
5763                 var ret, origName = jQuery.camelCase( name ),
5764                         hooks = jQuery.cssHooks[ origName ];
5765
5766                 name = jQuery.cssProps[ origName ] || origName;
5767
5768                 // If a hook was provided get the computed value from there
5769                 if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
5770                         return ret;
5771
5772                 // Otherwise, if a way to get the computed value exists, use that
5773                 } else if ( curCSS ) {
5774                         return curCSS( elem, name, origName );
5775                 }
5776         },
5777
5778         // A method for quickly swapping in/out CSS properties to get correct calculations
5779         swap: function( elem, options, callback ) {
5780                 var old = {};
5781
5782                 // Remember the old values, and insert the new ones
5783                 for ( var name in options ) {
5784                         old[ name ] = elem.style[ name ];
5785                         elem.style[ name ] = options[ name ];
5786                 }
5787
5788                 callback.call( elem );
5789
5790                 // Revert the old values
5791                 for ( name in options ) {
5792                         elem.style[ name ] = old[ name ];
5793                 }
5794         },
5795
5796         camelCase: function( string ) {
5797                 return string.replace( rdashAlpha, fcamelCase );
5798         }
5799 });
5800
5801 // DEPRECATED, Use jQuery.css() instead
5802 jQuery.curCSS = jQuery.css;
5803
5804 jQuery.each(["height", "width"], function( i, name ) {
5805         jQuery.cssHooks[ name ] = {
5806                 get: function( elem, computed, extra ) {
5807                         var val;
5808
5809                         if ( computed ) {
5810                                 if ( elem.offsetWidth !== 0 ) {
5811                                         val = getWH( elem, name, extra );
5812
5813                                 } else {
5814                                         jQuery.swap( elem, cssShow, function() {
5815                                                 val = getWH( elem, name, extra );
5816                                         });
5817                                 }
5818
5819                                 if ( val <= 0 ) {
5820                                         val = curCSS( elem, name, name );
5821
5822                                         if ( val === "0px" && currentStyle ) {
5823                                                 val = currentStyle( elem, name, name );
5824                                         }
5825
5826                                         if ( val != null ) {
5827                                                 // Should return "auto" instead of 0, use 0 for
5828                                                 // temporary backwards-compat
5829                                                 return val === "" || val === "auto" ? "0px" : val;
5830                                         }
5831                                 }
5832
5833                                 if ( val < 0 || val == null ) {
5834                                         val = elem.style[ name ];
5835
5836                                         // Should return "auto" instead of 0, use 0 for
5837                                         // temporary backwards-compat
5838                                         return val === "" || val === "auto" ? "0px" : val;
5839                                 }
5840
5841                                 return typeof val === "string" ? val : val + "px";
5842                         }
5843                 },
5844
5845                 set: function( elem, value ) {
5846                         if ( rnumpx.test( value ) ) {
5847                                 // ignore negative width and height values #1599
5848                                 value = parseFloat(value);
5849
5850                                 if ( value >= 0 ) {
5851                                         return value + "px";
5852                                 }
5853
5854                         } else {
5855                                 return value;
5856                         }
5857                 }
5858         };
5859 });
5860
5861 if ( !jQuery.support.opacity ) {
5862         jQuery.cssHooks.opacity = {
5863                 get: function( elem, computed ) {
5864                         // IE uses filters for opacity
5865                         return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ?
5866                                 (parseFloat(RegExp.$1) / 100) + "" :
5867                                 computed ? "1" : "";
5868                 },
5869
5870                 set: function( elem, value ) {
5871                         var style = elem.style;
5872
5873                         // IE has trouble with opacity if it does not have layout
5874                         // Force it by setting the zoom level
5875                         style.zoom = 1;
5876
5877                         // Set the alpha filter to set the opacity
5878                         var opacity = jQuery.isNaN(value) ?
5879                                 "" :
5880                                 "alpha(opacity=" + value * 100 + ")",
5881                                 filter = style.filter || "";
5882
5883                         style.filter = ralpha.test(filter) ?
5884                                 filter.replace(ralpha, opacity) :
5885                                 style.filter + ' ' + opacity;
5886                 }
5887         };
5888 }
5889
5890 if ( document.defaultView && document.defaultView.getComputedStyle ) {
5891         getComputedStyle = function( elem, newName, name ) {
5892                 var ret, defaultView, computedStyle;
5893
5894                 name = name.replace( rupper, "-$1" ).toLowerCase();
5895
5896                 if ( !(defaultView = elem.ownerDocument.defaultView) ) {
5897                         return undefined;
5898                 }
5899
5900                 if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
5901                         ret = computedStyle.getPropertyValue( name );
5902                         if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
5903                                 ret = jQuery.style( elem, name );
5904                         }
5905                 }
5906
5907                 return ret;
5908         };
5909 }
5910
5911 if ( document.documentElement.currentStyle ) {
5912         currentStyle = function( elem, name ) {
5913                 var left, 
5914                         ret = elem.currentStyle && elem.currentStyle[ name ],
5915                         rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
5916                         style = elem.style;
5917
5918                 // From the awesome hack by Dean Edwards
5919                 // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
5920
5921                 // If we're not dealing with a regular pixel number
5922                 // but a number that has a weird ending, we need to convert it to pixels
5923                 if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
5924                         // Remember the original values
5925                         left = style.left;
5926
5927                         // Put in the new values to get a computed value out
5928                         if ( rsLeft ) {
5929                                 elem.runtimeStyle.left = elem.currentStyle.left;
5930                         }
5931                         style.left = name === "fontSize" ? "1em" : (ret || 0);
5932                         ret = style.pixelLeft + "px";
5933
5934                         // Revert the changed values
5935                         style.left = left;
5936                         if ( rsLeft ) {
5937                                 elem.runtimeStyle.left = rsLeft;
5938                         }
5939                 }
5940
5941                 return ret === "" ? "auto" : ret;
5942         };
5943 }
5944
5945 curCSS = getComputedStyle || currentStyle;
5946
5947 function getWH( elem, name, extra ) {
5948         var which = name === "width" ? cssWidth : cssHeight,
5949                 val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
5950
5951         if ( extra === "border" ) {
5952                 return val;
5953         }
5954
5955         jQuery.each( which, function() {
5956                 if ( !extra ) {
5957                         val -= parseFloat(jQuery.css( elem, "padding" + this )) || 0;
5958                 }
5959
5960                 if ( extra === "margin" ) {
5961                         val += parseFloat(jQuery.css( elem, "margin" + this )) || 0;
5962
5963                 } else {
5964                         val -= parseFloat(jQuery.css( elem, "border" + this + "Width" )) || 0;
5965                 }
5966         });
5967
5968         return val;
5969 }
5970
5971 if ( jQuery.expr && jQuery.expr.filters ) {
5972         jQuery.expr.filters.hidden = function( elem ) {
5973                 var width = elem.offsetWidth,
5974                         height = elem.offsetHeight;
5975
5976                 return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
5977         };
5978
5979         jQuery.expr.filters.visible = function( elem ) {
5980                 return !jQuery.expr.filters.hidden( elem );
5981         };
5982 }
5983
5984
5985
5986
5987 var r20 = /%20/g,
5988         rbracket = /\[\]$/,
5989         rCRLF = /\r?\n/g,
5990         rhash = /#.*$/,
5991         rheaders = /^(.*?):\s*(.*?)\r?$/mg, // IE leaves an \r character at EOL
5992         rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
5993         rnoContent = /^(?:GET|HEAD)$/,
5994         rprotocol = /^\/\//,
5995         rquery = /\?/,
5996         rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
5997         rselectTextarea = /^(?:select|textarea)/i,
5998         rspacesAjax = /\s+/,
5999         rts = /([?&])_=[^&]*/,
6000         rurl = /^(\w+:)\/\/([^\/?#:]+)(?::(\d+))?/,
6001
6002         // Keep a copy of the old load method
6003         _load = jQuery.fn.load,
6004
6005         /* Prefilters
6006          * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
6007          * 2) These are called:
6008          *    - BEFORE asking for a transport
6009          *    - AFTER param serialization (s.data is a string if s.processData is true)
6010          * 3) key is the dataType
6011          * 4) the catchall symbol "*" can be used
6012          * 5) execution will start with transport dataType and THEN continue down to "*" if needed
6013          */
6014         prefilters = {},
6015
6016         /* Transports bindings
6017          * 1) key is the dataType
6018          * 2) the catchall symbol "*" can be used
6019          * 3) selection will start with transport dataType and THEN go to "*" if needed
6020          */
6021         transports = {};
6022
6023 // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
6024 function addToPrefiltersOrTransports( structure ) {
6025
6026         // dataTypeExpression is optional and defaults to "*"
6027         return function( dataTypeExpression, func ) {
6028
6029                 if ( typeof dataTypeExpression !== "string" ) {
6030                         func = dataTypeExpression;
6031                         dataTypeExpression = "*";
6032                 }
6033
6034                 if ( jQuery.isFunction( func ) ) {
6035                         var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
6036                                 i = 0,
6037                                 length = dataTypes.length,
6038                                 dataType,
6039                                 list,
6040                                 placeBefore;
6041
6042                         // For each dataType in the dataTypeExpression
6043                         for(; i < length; i++ ) {
6044                                 dataType = dataTypes[ i ];
6045                                 // We control if we're asked to add before
6046                                 // any existing element
6047                                 placeBefore = /^\+/.test( dataType );
6048                                 if ( placeBefore ) {
6049                                         dataType = dataType.substr( 1 ) || "*";
6050                                 }
6051                                 list = structure[ dataType ] = structure[ dataType ] || [];
6052                                 // then we add to the structure accordingly
6053                                 list[ placeBefore ? "unshift" : "push" ]( func );
6054                         }
6055                 }
6056         };
6057 }
6058
6059 //Base inspection function for prefilters and transports
6060 function inspectPrefiltersOrTransports( structure, options, originalOptions, jXHR,
6061                 dataType /* internal */, inspected /* internal */ ) {
6062
6063         dataType = dataType || options.dataTypes[ 0 ];
6064         inspected = inspected || {};
6065
6066         inspected[ dataType ] = true;
6067
6068         var list = structure[ dataType ],
6069                 i = 0,
6070                 length = list ? list.length : 0,
6071                 executeOnly = ( structure === prefilters ),
6072                 selection;
6073
6074         for(; i < length && ( executeOnly || !selection ); i++ ) {
6075                 selection = list[ i ]( options, originalOptions, jXHR );
6076                 // If we got redirected to another dataType
6077                 // we try there if not done already
6078                 if ( typeof selection === "string" ) {
6079                         if ( inspected[ selection ] ) {
6080                                 selection = undefined;
6081                         } else {
6082                                 options.dataTypes.unshift( selection );
6083                                 selection = inspectPrefiltersOrTransports(
6084                                                 structure, options, originalOptions, jXHR, selection, inspected );
6085                         }
6086                 }
6087         }
6088         // If we're only executing or nothing was selected
6089         // we try the catchall dataType if not done already
6090         if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
6091                 selection = inspectPrefiltersOrTransports(
6092                                 structure, options, originalOptions, jXHR, "*", inspected );
6093         }
6094         // unnecessary when only executing (prefilters)
6095         // but it'll be ignored by the caller in that case
6096         return selection;
6097 }
6098
6099 jQuery.fn.extend({
6100         load: function( url, params, callback ) {
6101                 if ( typeof url !== "string" && _load ) {
6102                         return _load.apply( this, arguments );
6103
6104                 // Don't do a request if no elements are being requested
6105                 } else if ( !this.length ) {
6106                         return this;
6107                 }
6108
6109                 var off = url.indexOf( " " );
6110                 if ( off >= 0 ) {
6111                         var selector = url.slice( off, url.length );
6112                         url = url.slice( 0, off );
6113                 }
6114
6115                 // Default to a GET request
6116                 var type = "GET";
6117
6118                 // If the second parameter was provided
6119                 if ( params ) {
6120                         // If it's a function
6121                         if ( jQuery.isFunction( params ) ) {
6122                                 // We assume that it's the callback
6123                                 callback = params;
6124                                 params = null;
6125
6126                         // Otherwise, build a param string
6127                         } else if ( typeof params === "object" ) {
6128                                 params = jQuery.param( params, jQuery.ajaxSettings.traditional );
6129                                 type = "POST";
6130                         }
6131                 }
6132
6133                 var self = this;
6134
6135                 // Request the remote document
6136                 jQuery.ajax({
6137                         url: url,
6138                         type: type,
6139                         dataType: "html",
6140                         data: params,
6141                         // Complete callback (responseText is used internally)
6142                         complete: function( jXHR, status, responseText ) {
6143                                 // Store the response as specified by the jXHR object
6144                                 responseText = jXHR.responseText;
6145                                 // If successful, inject the HTML into all the matched elements
6146                                 if ( jXHR.isResolved() ) {
6147                                         // #4825: Get the actual response in case
6148                                         // a dataFilter is present in ajaxSettings
6149                                         jXHR.done(function( r ) {
6150                                                 responseText = r;
6151                                         });
6152                                         // See if a selector was specified
6153                                         self.html( selector ?
6154                                                 // Create a dummy div to hold the results
6155                                                 jQuery("<div>")
6156                                                         // inject the contents of the document in, removing the scripts
6157                                                         // to avoid any 'Permission Denied' errors in IE
6158                                                         .append(responseText.replace(rscript, ""))
6159
6160                                                         // Locate the specified elements
6161                                                         .find(selector) :
6162
6163                                                 // If not, just inject the full result
6164                                                 responseText );
6165                                 }
6166
6167                                 if ( callback ) {
6168                                         self.each( callback, [ responseText, status, jXHR ] );
6169                                 }
6170                         }
6171                 });
6172
6173                 return this;
6174         },
6175
6176         serialize: function() {
6177                 return jQuery.param( this.serializeArray() );
6178         },
6179
6180         serializeArray: function() {
6181                 return this.map(function(){
6182                         return this.elements ? jQuery.makeArray( this.elements ) : this;
6183                 })
6184                 .filter(function(){
6185                         return this.name && !this.disabled &&
6186                                 ( this.checked || rselectTextarea.test( this.nodeName ) ||
6187                                         rinput.test( this.type ) );
6188                 })
6189                 .map(function( i, elem ){
6190                         var val = jQuery( this ).val();
6191
6192                         return val == null ?
6193                                 null :
6194                                 jQuery.isArray( val ) ?
6195                                         jQuery.map( val, function( val, i ){
6196                                                 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
6197                                         }) :
6198                                         { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
6199                 }).get();
6200         }
6201 });
6202
6203 // Attach a bunch of functions for handling common AJAX events
6204 jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
6205         jQuery.fn[ o ] = function( f ){
6206                 return this.bind( o, f );
6207         };
6208 } );
6209
6210 jQuery.each( [ "get", "post" ], function( i, method ) {
6211         jQuery[ method ] = function( url, data, callback, type ) {
6212                 // shift arguments if data argument was omitted
6213                 if ( jQuery.isFunction( data ) ) {
6214                         type = type || callback;
6215                         callback = data;
6216                         data = null;
6217                 }
6218
6219                 return jQuery.ajax({
6220                         type: method,
6221                         url: url,
6222                         data: data,
6223                         success: callback,
6224                         dataType: type
6225                 });
6226         };
6227 } );
6228
6229 jQuery.extend({
6230
6231         getScript: function( url, callback ) {
6232                 return jQuery.get( url, null, callback, "script" );
6233         },
6234
6235         getJSON: function( url, data, callback ) {
6236                 return jQuery.get( url, data, callback, "json" );
6237         },
6238
6239         ajaxSetup: function( settings ) {
6240                 jQuery.extend( true, jQuery.ajaxSettings, settings );
6241                 if ( settings.context ) {
6242                         jQuery.ajaxSettings.context = settings.context;
6243                 }
6244         },
6245
6246         ajaxSettings: {
6247                 url: location.href,
6248                 global: true,
6249                 type: "GET",
6250                 contentType: "application/x-www-form-urlencoded",
6251                 processData: true,
6252                 async: true,
6253                 /*
6254                 timeout: 0,
6255                 data: null,
6256                 dataType: null,
6257                 username: null,
6258                 password: null,
6259                 cache: null,
6260                 traditional: false,
6261                 headers: {},
6262                 crossDomain: null,
6263                 */
6264
6265                 accepts: {
6266                         xml: "application/xml, text/xml",
6267                         html: "text/html",
6268                         text: "text/plain",
6269                         json: "application/json, text/javascript",
6270                         "*": "*/*"
6271                 },
6272
6273                 contents: {
6274                         xml: /xml/,
6275                         html: /html/,
6276                         json: /json/
6277                 },
6278
6279                 responseFields: {
6280                         xml: "responseXML",
6281                         text: "responseText"
6282                 },
6283
6284                 // List of data converters
6285                 // 1) key format is "source_type destination_type" (a single space in-between)
6286                 // 2) the catchall symbol "*" can be used for source_type
6287                 converters: {
6288
6289                         // Convert anything to text
6290                         "* text": window.String,
6291
6292                         // Text to html (true = no transformation)
6293                         "text html": true,
6294
6295                         // Evaluate text as a json expression
6296                         "text json": jQuery.parseJSON,
6297
6298                         // Parse text as xml
6299                         "text xml": jQuery.parseXML
6300                 }
6301         },
6302
6303         ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
6304         ajaxTransport: addToPrefiltersOrTransports( transports ),
6305
6306         // Main method
6307         ajax: function( url, options ) {
6308
6309                 // If options is not an object,
6310                 // we simulate pre-1.5 signature
6311                 if ( typeof options !== "object" ) {
6312                         options = url;
6313                         url = undefined;
6314                 }
6315
6316                 // Force options to be an object
6317                 options = options || {};
6318
6319                 var // Create the final options object
6320                         s = jQuery.extend( true, {}, jQuery.ajaxSettings, options ),
6321                         // Callbacks contexts
6322                         // We force the original context if it exists
6323                         // or take it from jQuery.ajaxSettings otherwise
6324                         // (plain objects used as context get extended)
6325                         callbackContext =
6326                                 ( s.context = ( "context" in options ? options : jQuery.ajaxSettings ).context ) || s,
6327                         globalEventContext = callbackContext === s ? jQuery.event : jQuery( callbackContext ),
6328                         // Deferreds
6329                         deferred = jQuery.Deferred(),
6330                         completeDeferred = jQuery._Deferred(),
6331                         // Status-dependent callbacks
6332                         statusCode = s.statusCode || {},
6333                         // Headers (they are sent all at once)
6334                         requestHeaders = {},
6335                         // Response headers
6336                         responseHeadersString,
6337                         responseHeaders,
6338                         // transport
6339                         transport,
6340                         // timeout handle
6341                         timeoutTimer,
6342                         // Cross-domain detection vars
6343                         loc = document.location,
6344                         protocol = loc.protocol || "http:",
6345                         parts,
6346                         // The jXHR state
6347                         state = 0,
6348                         // Loop variable
6349                         i,
6350                         // Fake xhr
6351                         jXHR = {
6352
6353                                 readyState: 0,
6354
6355                                 // Caches the header
6356                                 setRequestHeader: function( name, value ) {
6357                                         if ( state === 0 ) {
6358                                                 requestHeaders[ name.toLowerCase() ] = value;
6359                                         }
6360                                         return this;
6361                                 },
6362
6363                                 // Raw string
6364                                 getAllResponseHeaders: function() {
6365                                         return state === 2 ? responseHeadersString : null;
6366                                 },
6367
6368                                 // Builds headers hashtable if needed
6369                                 getResponseHeader: function( key ) {
6370                                         var match;
6371                                         if ( state === 2 ) {
6372                                                 if ( !responseHeaders ) {
6373                                                         responseHeaders = {};
6374                                                         while( ( match = rheaders.exec( responseHeadersString ) ) ) {
6375                                                                 responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
6376                                                         }
6377                                                 }
6378                                                 match = responseHeaders[ key.toLowerCase() ];
6379                                         }
6380                                         return match || null;
6381                                 },
6382
6383                                 // Cancel the request
6384                                 abort: function( statusText ) {
6385                                         statusText = statusText || "abort";
6386                                         if ( transport ) {
6387                                                 transport.abort( statusText );
6388                                         }
6389                                         done( 0, statusText );
6390                                         return this;
6391                                 }
6392                         };
6393
6394                 // Callback for when everything is done
6395                 // It is defined here because jslint complains if it is declared
6396                 // at the end of the function (which would be more logical and readable)
6397                 function done( status, statusText, responses, headers) {
6398
6399                         // Called once
6400                         if ( state === 2 ) {
6401                                 return;
6402                         }
6403
6404                         // State is "done" now
6405                         state = 2;
6406
6407                         // Clear timeout if it exists
6408                         if ( timeoutTimer ) {
6409                                 clearTimeout( timeoutTimer );
6410                         }
6411
6412                         // Dereference transport for early garbage collection
6413                         // (no matter how long the jXHR object will be used)
6414                         transport = undefined;
6415
6416                         // Cache response headers
6417                         responseHeadersString = headers || "";
6418
6419                         // Set readyState
6420                         jXHR.readyState = status ? 4 : 0;
6421
6422                         var isSuccess,
6423                                 success,
6424                                 error,
6425                                 response = responses ? ajaxHandleResponses( s, jXHR, responses ) : undefined,
6426                                 lastModified,
6427                                 etag;
6428
6429                         // If successful, handle type chaining
6430                         if ( status >= 200 && status < 300 || status === 304 ) {
6431
6432                                 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
6433                                 if ( s.ifModified ) {
6434
6435                                         if ( ( lastModified = jXHR.getResponseHeader( "Last-Modified" ) ) ) {
6436                                                 jQuery.lastModified[ s.url ] = lastModified;
6437                                         }
6438                                         if ( ( etag = jXHR.getResponseHeader( "Etag" ) ) ) {
6439                                                 jQuery.etag[ s.url ] = etag;
6440                                         }
6441                                 }
6442
6443                                 // If not modified
6444                                 if ( status === 304 ) {
6445
6446                                         statusText = "notmodified";
6447                                         isSuccess = true;
6448
6449                                 // If we have data
6450                                 } else {
6451
6452                                         try {
6453                                                 success = ajaxConvert( s, response );
6454                                                 statusText = "success";
6455                                                 isSuccess = true;
6456                                         } catch(e) {
6457                                                 // We have a parsererror
6458                                                 statusText = "parsererror";
6459                                                 error = e;
6460                                         }
6461                                 }
6462                         } else {
6463                                 // We extract error from statusText
6464                                 // then normalize statusText and status for non-aborts
6465                                 error = statusText;
6466                                 if( status ) {
6467                                         statusText = "error";
6468                                         if ( status < 0 ) {
6469                                                 status = 0;
6470                                         }
6471                                 }
6472                         }
6473
6474                         // Set data for the fake xhr object
6475                         jXHR.status = status;
6476                         jXHR.statusText = statusText;
6477
6478                         // Success/Error
6479                         if ( isSuccess ) {
6480                                 deferred.resolveWith( callbackContext, [ success, statusText, jXHR ] );
6481                         } else {
6482                                 deferred.rejectWith( callbackContext, [ jXHR, statusText, error ] );
6483                         }
6484
6485                         // Status-dependent callbacks
6486                         jXHR.statusCode( statusCode );
6487                         statusCode = undefined;
6488
6489                         if ( s.global ) {
6490                                 globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
6491                                                 [ jXHR, s, isSuccess ? success : error ] );
6492                         }
6493
6494                         // Complete
6495                         completeDeferred.resolveWith( callbackContext, [ jXHR, statusText ] );
6496
6497                         if ( s.global ) {
6498                                 globalEventContext.trigger( "ajaxComplete", [ jXHR, s] );
6499                                 // Handle the global AJAX counter
6500                                 if ( !( --jQuery.active ) ) {
6501                                         jQuery.event.trigger( "ajaxStop" );
6502                                 }
6503                         }
6504                 }
6505
6506                 // Attach deferreds
6507                 deferred.promise( jXHR );
6508                 jXHR.success = jXHR.done;
6509                 jXHR.error = jXHR.fail;
6510                 jXHR.complete = completeDeferred.done;
6511
6512                 // Status-dependent callbacks
6513                 jXHR.statusCode = function( map ) {
6514                         if ( map ) {
6515                                 var tmp;
6516                                 if ( state < 2 ) {
6517                                         for( tmp in map ) {
6518                                                 statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
6519                                         }
6520                                 } else {
6521                                         tmp = map[ jXHR.status ];
6522                                         jXHR.then( tmp, tmp );
6523                                 }
6524                         }
6525                         return this;
6526                 };
6527
6528                 // Remove hash character (#7531: and string promotion)
6529                 // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
6530                 // We also use the url parameter if available
6531                 s.url = ( "" + ( url || s.url ) ).replace( rhash, "" ).replace( rprotocol, protocol + "//" );
6532
6533                 // Extract dataTypes list
6534                 s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
6535
6536                 // Determine if a cross-domain request is in order
6537                 if ( !s.crossDomain ) {
6538                         parts = rurl.exec( s.url.toLowerCase() );
6539                         s.crossDomain = !!( parts &&
6540                                 ( parts[ 1 ] != protocol || parts[ 2 ] != loc.hostname ||
6541                                         ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
6542                                                 ( loc.port || ( protocol === "http:" ? 80 : 443 ) ) )
6543                         );
6544                 }
6545
6546                 // Convert data if not already a string
6547                 if ( s.data && s.processData && typeof s.data !== "string" ) {
6548                         s.data = jQuery.param( s.data, s.traditional );
6549                 }
6550
6551                 // Apply prefilters
6552                 inspectPrefiltersOrTransports( prefilters, s, options, jXHR );
6553
6554                 // Uppercase the type
6555                 s.type = s.type.toUpperCase();
6556
6557                 // Determine if request has content
6558                 s.hasContent = !rnoContent.test( s.type );
6559
6560                 // Watch for a new set of requests
6561                 if ( s.global && jQuery.active++ === 0 ) {
6562                         jQuery.event.trigger( "ajaxStart" );
6563                 }
6564
6565                 // More options handling for requests with no content
6566                 if ( !s.hasContent ) {
6567
6568                         // If data is available, append data to url
6569                         if ( s.data ) {
6570                                 s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
6571                         }
6572
6573                         // Add anti-cache in url if needed
6574                         if ( s.cache === false ) {
6575
6576                                 var ts = jQuery.now(),
6577                                         // try replacing _= if it is there
6578                                         ret = s.url.replace( rts, "$1_=" + ts );
6579
6580                                 // if nothing was replaced, add timestamp to the end
6581                                 s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
6582                         }
6583                 }
6584
6585                 // Set the correct header, if data is being sent
6586                 if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
6587                         requestHeaders[ "content-type" ] = s.contentType;
6588                 }
6589
6590                 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
6591                 if ( s.ifModified ) {
6592                         if ( jQuery.lastModified[ s.url ] ) {
6593                                 requestHeaders[ "if-modified-since" ] = jQuery.lastModified[ s.url ];
6594                         }
6595                         if ( jQuery.etag[ s.url ] ) {
6596                                 requestHeaders[ "if-none-match" ] = jQuery.etag[ s.url ];
6597                         }
6598                 }
6599
6600                 // Set the Accepts header for the server, depending on the dataType
6601                 requestHeaders.accept = s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
6602                         s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", */*; q=0.01" : "" ) :
6603                         s.accepts[ "*" ];
6604
6605                 // Check for headers option
6606                 for ( i in s.headers ) {
6607                         requestHeaders[ i.toLowerCase() ] = s.headers[ i ];
6608                 }
6609
6610                 // Allow custom headers/mimetypes and early abort
6611                 if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jXHR, s ) === false || state === 2 ) ) {
6612                                 // Abort if not done already
6613                                 done( 0, "abort" );
6614                                 // Return false
6615                                 jXHR = false;
6616
6617                 } else {
6618
6619                         // Install callbacks on deferreds
6620                         for ( i in { success: 1, error: 1, complete: 1 } ) {
6621                                 jXHR[ i ]( s[ i ] );
6622                         }
6623
6624                         // Get transport
6625                         transport = inspectPrefiltersOrTransports( transports, s, options, jXHR );
6626
6627                         // If no transport, we auto-abort
6628                         if ( !transport ) {
6629                                 done( -1, "No Transport" );
6630                         } else {
6631                                 // Set state as sending
6632                                 state = jXHR.readyState = 1;
6633                                 // Send global event
6634                                 if ( s.global ) {
6635                                         globalEventContext.trigger( "ajaxSend", [ jXHR, s ] );
6636                                 }
6637                                 // Timeout
6638                                 if ( s.async && s.timeout > 0 ) {
6639                                         timeoutTimer = setTimeout( function(){
6640                                                 jXHR.abort( "timeout" );
6641                                         }, s.timeout );
6642                                 }
6643
6644                                 try {
6645                                         transport.send( requestHeaders, done );
6646                                 } catch (e) {
6647                                         // Propagate exception as error if not done
6648                                         if ( status < 2 ) {
6649                                                 done( -1, e );
6650                                         // Simply rethrow otherwise
6651                                         } else {
6652                                                 jQuery.error( e );
6653                                         }
6654                                 }
6655                         }
6656                 }
6657                 return jXHR;
6658         },
6659
6660         // Serialize an array of form elements or a set of
6661         // key/values into a query string
6662         param: function( a, traditional ) {
6663                 var s = [],
6664                         add = function( key, value ) {
6665                                 // If value is a function, invoke it and return its value
6666                                 value = jQuery.isFunction( value ) ? value() : value;
6667                                 s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
6668                         };
6669
6670                 // Set traditional to true for jQuery <= 1.3.2 behavior.
6671                 if ( traditional === undefined ) {
6672                         traditional = jQuery.ajaxSettings.traditional;
6673                 }
6674
6675                 // If an array was passed in, assume that it is an array of form elements.
6676                 if ( jQuery.isArray( a ) || a.jquery ) {
6677                         // Serialize the form elements
6678                         jQuery.each( a, function() {
6679                                 add( this.name, this.value );
6680                         } );
6681
6682                 } else {
6683                         // If traditional, encode the "old" way (the way 1.3.2 or older
6684                         // did it), otherwise encode params recursively.
6685                         for ( var prefix in a ) {
6686                                 buildParams( prefix, a[ prefix ], traditional, add );
6687                         }
6688                 }
6689
6690                 // Return the resulting serialization
6691                 return s.join( "&" ).replace( r20, "+" );
6692         }
6693 });
6694
6695 function buildParams( prefix, obj, traditional, add ) {
6696         if ( jQuery.isArray( obj ) && obj.length ) {
6697                 // Serialize array item.
6698                 jQuery.each( obj, function( i, v ) {
6699                         if ( traditional || rbracket.test( prefix ) ) {
6700                                 // Treat each array item as a scalar.
6701                                 add( prefix, v );
6702
6703                         } else {
6704                                 // If array item is non-scalar (array or object), encode its
6705                                 // numeric index to resolve deserialization ambiguity issues.
6706                                 // Note that rack (as of 1.0.0) can't currently deserialize
6707                                 // nested arrays properly, and attempting to do so may cause
6708                                 // a server error. Possible fixes are to modify rack's
6709                                 // deserialization algorithm or to provide an option or flag
6710                                 // to force array serialization to be shallow.
6711                                 buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
6712                         }
6713                 });
6714
6715         } else if ( !traditional && obj != null && typeof obj === "object" ) {
6716                 // If we see an array here, it is empty and should be treated as an empty
6717                 // object
6718                 if ( jQuery.isArray( obj ) || jQuery.isEmptyObject( obj ) ) {
6719                         add( prefix, "" );
6720
6721                 // Serialize object item.
6722                 } else {
6723                         jQuery.each( obj, function( k, v ) {
6724                                 buildParams( prefix + "[" + k + "]", v, traditional, add );
6725                         });
6726                 }
6727
6728         } else {
6729                 // Serialize scalar item.
6730                 add( prefix, obj );
6731         }
6732 }
6733
6734 // This is still on the jQuery object... for now
6735 // Want to move this to jQuery.ajax some day
6736 jQuery.extend({
6737
6738         // Counter for holding the number of active queries
6739         active: 0,
6740
6741         // Last-Modified header cache for next request
6742         lastModified: {},
6743         etag: {}
6744
6745 });
6746
6747 /* Handles responses to an ajax request:
6748  * - sets all responseXXX fields accordingly
6749  * - finds the right dataType (mediates between content-type and expected dataType)
6750  * - returns the corresponding response
6751  */
6752 function ajaxHandleResponses( s, jXHR, responses ) {
6753
6754         var contents = s.contents,
6755                 dataTypes = s.dataTypes,
6756                 responseFields = s.responseFields,
6757                 ct,
6758                 type,
6759                 finalDataType,
6760                 firstDataType;
6761
6762         // Fill responseXXX fields
6763         for( type in responseFields ) {
6764                 if ( type in responses ) {
6765                         jXHR[ responseFields[type] ] = responses[ type ];
6766                 }
6767         }
6768
6769         // Remove auto dataType and get content-type in the process
6770         while( dataTypes[ 0 ] === "*" ) {
6771                 dataTypes.shift();
6772                 if ( ct === undefined ) {
6773                         ct = jXHR.getResponseHeader( "content-type" );
6774                 }
6775         }
6776
6777         // Check if we're dealing with a known content-type
6778         if ( ct ) {
6779                 for ( type in contents ) {
6780                         if ( contents[ type ] && contents[ type ].test( ct ) ) {
6781                                 dataTypes.unshift( type );
6782                                 break;
6783                         }
6784                 }
6785         }
6786
6787         // Check to see if we have a response for the expected dataType
6788         if ( dataTypes[ 0 ] in responses ) {
6789                 finalDataType = dataTypes[ 0 ];
6790         } else {
6791                 // Try convertible dataTypes
6792                 for ( type in responses ) {
6793                         if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
6794                                 finalDataType = type;
6795                                 break;
6796                         }
6797                         if ( !firstDataType ) {
6798                                 firstDataType = type;
6799                         }
6800                 }
6801                 // Or just use first one
6802                 finalDataType = finalDataType || firstDataType;
6803         }
6804
6805         // If we found a dataType
6806         // We add the dataType to the list if needed
6807         // and return the corresponding response
6808         if ( finalDataType ) {
6809                 if ( finalDataType !== dataTypes[ 0 ] ) {
6810                         dataTypes.unshift( finalDataType );
6811                 }
6812                 return responses[ finalDataType ];
6813         }
6814 }
6815
6816 // Chain conversions given the request and the original response
6817 function ajaxConvert( s, response ) {
6818
6819         // Apply the dataFilter if provided
6820         if ( s.dataFilter ) {
6821                 response = s.dataFilter( response, s.dataType );
6822         }
6823
6824         var dataTypes = s.dataTypes,
6825                 converters = s.converters,
6826                 i,
6827                 length = dataTypes.length,
6828                 tmp,
6829                 // Current and previous dataTypes
6830                 current = dataTypes[ 0 ],
6831                 prev,
6832                 // Conversion expression
6833                 conversion,
6834                 // Conversion function
6835                 conv,
6836                 // Conversion functions (transitive conversion)
6837                 conv1,
6838                 conv2;
6839
6840         // For each dataType in the chain
6841         for( i = 1; i < length; i++ ) {
6842
6843                 // Get the dataTypes
6844                 prev = current;
6845                 current = dataTypes[ i ];
6846
6847                 // If current is auto dataType, update it to prev
6848                 if( current === "*" ) {
6849                         current = prev;
6850                 // If no auto and dataTypes are actually different
6851                 } else if ( prev !== "*" && prev !== current ) {
6852
6853                         // Get the converter
6854                         conversion = prev + " " + current;
6855                         conv = converters[ conversion ] || converters[ "* " + current ];
6856
6857                         // If there is no direct converter, search transitively
6858                         if ( !conv ) {
6859                                 conv2 = undefined;
6860                                 for( conv1 in converters ) {
6861                                         tmp = conv1.split( " " );
6862                                         if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
6863                                                 conv2 = converters[ tmp[1] + " " + current ];
6864                                                 if ( conv2 ) {
6865                                                         conv1 = converters[ conv1 ];
6866                                                         if ( conv1 === true ) {
6867                                                                 conv = conv2;
6868                                                         } else if ( conv2 === true ) {
6869                                                                 conv = conv1;
6870                                                         }
6871                                                         break;
6872                                                 }
6873                                         }
6874                                 }
6875                         }
6876                         // If we found no converter, dispatch an error
6877                         if ( !( conv || conv2 ) ) {
6878                                 jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
6879                         }
6880                         // If found converter is not an equivalence
6881                         if ( conv !== true ) {
6882                                 // Convert with 1 or 2 converters accordingly
6883                                 response = conv ? conv( response ) : conv2( conv1(response) );
6884                         }
6885                 }
6886         }
6887         return response;
6888 }
6889
6890
6891
6892
6893 var jsc = jQuery.now(),
6894         jsre = /(\=)\?(&|$)|()\?\?()/i;
6895
6896 // Default jsonp settings
6897 jQuery.ajaxSetup({
6898         jsonp: "callback",
6899         jsonpCallback: function() {
6900                 return jQuery.expando + "_" + ( jsc++ );
6901         }
6902 });
6903
6904 // Detect, normalize options and install callbacks for jsonp requests
6905 jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, dataIsString /* internal */ ) {
6906
6907         dataIsString = ( typeof s.data === "string" );
6908
6909         if ( s.dataTypes[ 0 ] === "jsonp" ||
6910                 originalSettings.jsonpCallback ||
6911                 originalSettings.jsonp != null ||
6912                 s.jsonp !== false && ( jsre.test( s.url ) ||
6913                                 dataIsString && jsre.test( s.data ) ) ) {
6914
6915                 var responseContainer,
6916                         jsonpCallback = s.jsonpCallback =
6917                                 jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
6918                         previous = window[ jsonpCallback ],
6919                         url = s.url,
6920                         data = s.data,
6921                         replace = "$1" + jsonpCallback + "$2";
6922
6923                 if ( s.jsonp !== false ) {
6924                         url = url.replace( jsre, replace );
6925                         if ( s.url === url ) {
6926                                 if ( dataIsString ) {
6927                                         data = data.replace( jsre, replace );
6928                                 }
6929                                 if ( s.data === data ) {
6930                                         // Add callback manually
6931                                         url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
6932                                 }
6933                         }
6934                 }
6935
6936                 s.url = url;
6937                 s.data = data;
6938
6939                 window[ jsonpCallback ] = function( response ) {
6940                         responseContainer = [ response ];
6941                 };
6942
6943                 s.complete = [ function() {
6944
6945                         // Set callback back to previous value
6946                         window[ jsonpCallback ] = previous;
6947
6948                         // Call if it was a function and we have a response
6949                         if ( previous) {
6950                                 if ( responseContainer && jQuery.isFunction( previous ) ) {
6951                                         window[ jsonpCallback ] ( responseContainer[ 0 ] );
6952                                 }
6953                         } else {
6954                                 // else, more memory leak avoidance
6955                                 try{
6956                                         delete window[ jsonpCallback ];
6957                                 } catch( e ) {}
6958                         }
6959
6960                 }, s.complete ];
6961
6962                 // Use data converter to retrieve json after script execution
6963                 s.converters["script json"] = function() {
6964                         if ( ! responseContainer ) {
6965                                 jQuery.error( jsonpCallback + " was not called" );
6966                         }
6967                         return responseContainer[ 0 ];
6968                 };
6969
6970                 // force json dataType
6971                 s.dataTypes[ 0 ] = "json";
6972
6973                 // Delegate to script
6974                 return "script";
6975         }
6976 } );
6977
6978
6979
6980
6981 // Install script dataType
6982 jQuery.ajaxSetup({
6983         accepts: {
6984                 script: "text/javascript, application/javascript"
6985         },
6986         contents: {
6987                 script: /javascript/
6988         },
6989         converters: {
6990                 "text script": function( text ) {
6991                         jQuery.globalEval( text );
6992                         return text;
6993                 }
6994         }
6995 });
6996
6997 // Handle cache's special case and global
6998 jQuery.ajaxPrefilter( "script", function( s ) {
6999         if ( s.cache === undefined ) {
7000                 s.cache = false;
7001         }
7002         if ( s.crossDomain ) {
7003                 s.type = "GET";
7004                 s.global = false;
7005         }
7006 } );
7007
7008 // Bind script tag hack transport
7009 jQuery.ajaxTransport( "script", function(s) {
7010
7011         // This transport only deals with cross domain requests
7012         if ( s.crossDomain ) {
7013
7014                 var script,
7015                         head = document.getElementsByTagName( "head" )[ 0 ] || document.documentElement;
7016
7017                 return {
7018
7019                         send: function( _, callback ) {
7020
7021                                 script = document.createElement( "script" );
7022
7023                                 script.async = "async";
7024
7025                                 if ( s.scriptCharset ) {
7026                                         script.charset = s.scriptCharset;
7027                                 }
7028
7029                                 script.src = s.url;
7030
7031                                 // Attach handlers for all browsers
7032                                 script.onload = script.onreadystatechange = function( _, isAbort ) {
7033
7034                                         if ( !script.readyState || /loaded|complete/.test( script.readyState ) ) {
7035
7036                                                 // Handle memory leak in IE
7037                                                 script.onload = script.onreadystatechange = null;
7038
7039                                                 // Remove the script
7040                                                 if ( head && script.parentNode ) {
7041                                                         head.removeChild( script );
7042                                                 }
7043
7044                                                 // Dereference the script
7045                                                 script = undefined;
7046
7047                                                 // Callback if not abort
7048                                                 if ( !isAbort ) {
7049                                                         callback( 200, "success" );
7050                                                 }
7051                                         }
7052                                 };
7053                                 // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
7054                                 // This arises when a base node is used (#2709 and #4378).
7055                                 head.insertBefore( script, head.firstChild );
7056                         },
7057
7058                         abort: function() {
7059                                 if ( script ) {
7060                                         script.onload( 0, 1 );
7061                                 }
7062                         }
7063                 };
7064         }
7065 } );
7066
7067
7068
7069
7070 var // Next active xhr id
7071         xhrId = jQuery.now(),
7072
7073         // active xhrs
7074         xhrs = {},
7075
7076         // #5280: see below
7077         xhrUnloadAbortInstalled,
7078
7079         // XHR used to determine supports properties
7080         testXHR;
7081
7082 // Create the request object
7083 // (This is still attached to ajaxSettings for backward compatibility)
7084 jQuery.ajaxSettings.xhr = window.ActiveXObject ?
7085         /* Microsoft failed to properly
7086          * implement the XMLHttpRequest in IE7 (can't request local files),
7087          * so we use the ActiveXObject when it is available
7088          * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
7089          * we need a fallback.
7090          */
7091         function() {
7092                 if ( window.location.protocol !== "file:" ) {
7093                         try {
7094                                 return new window.XMLHttpRequest();
7095                         } catch( xhrError ) {}
7096                 }
7097
7098                 try {
7099                         return new window.ActiveXObject("Microsoft.XMLHTTP");
7100                 } catch( activeError ) {}
7101         } :
7102         // For all other browsers, use the standard XMLHttpRequest object
7103         function() {
7104                 return new window.XMLHttpRequest();
7105         };
7106
7107 // Test if we can create an xhr object
7108 try {
7109         testXHR = jQuery.ajaxSettings.xhr();
7110 } catch( xhrCreationException ) {}
7111
7112 //Does this browser support XHR requests?
7113 jQuery.support.ajax = !!testXHR;
7114
7115 // Does this browser support crossDomain XHR requests
7116 jQuery.support.cors = testXHR && ( "withCredentials" in testXHR );
7117
7118 // No need for the temporary xhr anymore
7119 testXHR = undefined;
7120
7121 // Create transport if the browser can provide an xhr
7122 if ( jQuery.support.ajax ) {
7123
7124         jQuery.ajaxTransport(function( s ) {
7125                 // Cross domain only allowed if supported through XMLHttpRequest
7126                 if ( !s.crossDomain || jQuery.support.cors ) {
7127
7128                         var callback;
7129
7130                         return {
7131                                 send: function( headers, complete ) {
7132
7133                                         // #5280: we need to abort on unload or IE will keep connections alive
7134                                         if ( !xhrUnloadAbortInstalled ) {
7135
7136                                                 xhrUnloadAbortInstalled = 1;
7137
7138                                                 jQuery(window).bind( "unload", function() {
7139
7140                                                         // Abort all pending requests
7141                                                         jQuery.each( xhrs, function( _, xhr ) {
7142                                                                 if ( xhr.onreadystatechange ) {
7143                                                                         xhr.onreadystatechange( 1 );
7144                                                                 }
7145                                                         } );
7146
7147                                                 } );
7148                                         }
7149
7150                                         // Get a new xhr
7151                                         var xhr = s.xhr(),
7152                                                 handle;
7153
7154                                         // Open the socket
7155                                         // Passing null username, generates a login popup on Opera (#2865)
7156                                         if ( s.username ) {
7157                                                 xhr.open( s.type, s.url, s.async, s.username, s.password );
7158                                         } else {
7159                                                 xhr.open( s.type, s.url, s.async );
7160                                         }
7161
7162                                         // Requested-With header
7163                                         // Not set for crossDomain requests with no content
7164                                         // (see why at http://trac.dojotoolkit.org/ticket/9486)
7165                                         // Won't change header if already provided
7166                                         if ( !( s.crossDomain && !s.hasContent ) && !headers["x-requested-with"] ) {
7167                                                 headers[ "x-requested-with" ] = "XMLHttpRequest";
7168                                         }
7169
7170                                         // Need an extra try/catch for cross domain requests in Firefox 3
7171                                         try {
7172                                                 jQuery.each( headers, function( key, value ) {
7173                                                         xhr.setRequestHeader( key, value );
7174                                                 } );
7175                                         } catch( _ ) {}
7176
7177                                         // Do send the request
7178                                         // This may raise an exception which is actually
7179                                         // handled in jQuery.ajax (so no try/catch here)
7180                                         xhr.send( ( s.hasContent && s.data ) || null );
7181
7182                                         // Listener
7183                                         callback = function( _, isAbort ) {
7184
7185                                                 // Was never called and is aborted or complete
7186                                                 if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
7187
7188                                                         // Only called once
7189                                                         callback = 0;
7190
7191                                                         // Do not keep as active anymore
7192                                                         if ( handle ) {
7193                                                                 xhr.onreadystatechange = jQuery.noop;
7194                                                                 delete xhrs[ handle ];
7195                                                         }
7196
7197                                                         // If it's an abort
7198                                                         if ( isAbort ) {
7199                                                                 // Abort it manually if needed
7200                                                                 if ( xhr.readyState !== 4 ) {
7201                                                                         xhr.abort();
7202                                                                 }
7203                                                         } else {
7204                                                                 // Get info
7205                                                                 var status = xhr.status,
7206                                                                         statusText,
7207                                                                         responseHeaders = xhr.getAllResponseHeaders(),
7208                                                                         responses = {},
7209                                                                         xml = xhr.responseXML;
7210
7211                                                                 // Construct response list
7212                                                                 if ( xml && xml.documentElement /* #4958 */ ) {
7213                                                                         responses.xml = xml;
7214                                                                 }
7215                                                                 responses.text = xhr.responseText;
7216
7217                                                                 // Firefox throws an exception when accessing
7218                                                                 // statusText for faulty cross-domain requests
7219                                                                 try {
7220                                                                         statusText = xhr.statusText;
7221                                                                 } catch( e ) {
7222                                                                         // We normalize with Webkit giving an empty statusText
7223                                                                         statusText = "";
7224                                                                 }
7225
7226                                                                 // Filter status for non standard behaviours
7227                                                                 status =
7228                                                                         // Opera returns 0 when it should be 304
7229                                                                         // Webkit returns 0 for failing cross-domain no matter the real status
7230                                                                         status === 0 ?
7231                                                                                 (
7232                                                                                         // Webkit, Firefox: filter out faulty cross-domain requests
7233                                                                                         !s.crossDomain || statusText ?
7234                                                                                         (
7235                                                                                                 // Opera: filter out real aborts #6060
7236                                                                                                 responseHeaders ?
7237                                                                                                 304 :
7238                                                                                                 0
7239                                                                                         ) :
7240                                                                                         // We assume 302 but could be anything cross-domain related
7241                                                                                         302
7242                                                                                 ) :
7243                                                                                 (
7244                                                                                         // IE sometimes returns 1223 when it should be 204 (see #1450)
7245                                                                                         status == 1223 ?
7246                                                                                                 204 :
7247                                                                                                 status
7248                                                                                 );
7249
7250                                                                 // Call complete
7251                                                                 complete( status, statusText, responses, responseHeaders );
7252                                                         }
7253                                                 }
7254                                         };
7255
7256                                         // if we're in sync mode or it's in cache
7257                                         // and has been retrieved directly (IE6 & IE7)
7258                                         // we need to manually fire the callback
7259                                         if ( !s.async || xhr.readyState === 4 ) {
7260                                                 callback();
7261                                         } else {
7262                                                 // Add to list of active xhrs
7263                                                 handle = xhrId++;
7264                                                 xhrs[ handle ] = xhr;
7265                                                 xhr.onreadystatechange = callback;
7266                                         }
7267                                 },
7268
7269                                 abort: function() {
7270                                         if ( callback ) {
7271                                                 callback(0,1);
7272                                         }
7273                                 }
7274                         };
7275                 }
7276         });
7277 }
7278
7279
7280
7281
7282 var elemdisplay = {},
7283         rfxtypes = /^(?:toggle|show|hide)$/,
7284         rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
7285         timerId,
7286         fxAttrs = [
7287                 // height animations
7288                 [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
7289                 // width animations
7290                 [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
7291                 // opacity animations
7292                 [ "opacity" ]
7293         ];
7294
7295 jQuery.fn.extend({
7296         show: function( speed, easing, callback ) {
7297                 var elem, display;
7298
7299                 if ( speed || speed === 0 ) {
7300                         return this.animate( genFx("show", 3), speed, easing, callback);
7301
7302                 } else {
7303                         for ( var i = 0, j = this.length; i < j; i++ ) {
7304                                 elem = this[i];
7305                                 display = elem.style.display;
7306
7307                                 // Reset the inline display of this element to learn if it is
7308                                 // being hidden by cascaded rules or not
7309                                 if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
7310                                         display = elem.style.display = "";
7311                                 }
7312
7313                                 // Set elements which have been overridden with display: none
7314                                 // in a stylesheet to whatever the default browser style is
7315                                 // for such an element
7316                                 if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
7317                                         jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
7318                                 }
7319                         }
7320
7321                         // Set the display of most of the elements in a second loop
7322                         // to avoid the constant reflow
7323                         for ( i = 0; i < j; i++ ) {
7324                                 elem = this[i];
7325                                 display = elem.style.display;
7326
7327                                 if ( display === "" || display === "none" ) {
7328                                         elem.style.display = jQuery._data(elem, "olddisplay") || "";
7329                                 }
7330                         }
7331
7332                         return this;
7333                 }
7334         },
7335
7336         hide: function( speed, easing, callback ) {
7337                 if ( speed || speed === 0 ) {
7338                         return this.animate( genFx("hide", 3), speed, easing, callback);
7339
7340                 } else {
7341                         for ( var i = 0, j = this.length; i < j; i++ ) {
7342                                 var display = jQuery.css( this[i], "display" );
7343
7344                                 if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
7345                                         jQuery._data( this[i], "olddisplay", display );
7346                                 }
7347                         }
7348
7349                         // Set the display of the elements in a second loop
7350                         // to avoid the constant reflow
7351                         for ( i = 0; i < j; i++ ) {
7352                                 this[i].style.display = "none";
7353                         }
7354
7355                         return this;
7356                 }
7357         },
7358
7359         // Save the old toggle function
7360         _toggle: jQuery.fn.toggle,
7361
7362         toggle: function( fn, fn2, callback ) {
7363                 var bool = typeof fn === "boolean";
7364
7365                 if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
7366                         this._toggle.apply( this, arguments );
7367
7368                 } else if ( fn == null || bool ) {
7369                         this.each(function() {
7370                                 var state = bool ? fn : jQuery(this).is(":hidden");
7371                                 jQuery(this)[ state ? "show" : "hide" ]();
7372                         });
7373
7374                 } else {
7375                         this.animate(genFx("toggle", 3), fn, fn2, callback);
7376                 }
7377
7378                 return this;
7379         },
7380
7381         fadeTo: function( speed, to, easing, callback ) {
7382                 return this.filter(":hidden").css("opacity", 0).show().end()
7383                                         .animate({opacity: to}, speed, easing, callback);
7384         },
7385
7386         animate: function( prop, speed, easing, callback ) {
7387                 var optall = jQuery.speed(speed, easing, callback);
7388
7389                 if ( jQuery.isEmptyObject( prop ) ) {
7390                         return this.each( optall.complete );
7391                 }
7392
7393                 return this[ optall.queue === false ? "each" : "queue" ](function() {
7394                         // XXX 'this' does not always have a nodeName when running the
7395                         // test suite
7396
7397                         var opt = jQuery.extend({}, optall), p,
7398                                 isElement = this.nodeType === 1,
7399                                 hidden = isElement && jQuery(this).is(":hidden"),
7400                                 self = this;
7401
7402                         for ( p in prop ) {
7403                                 var name = jQuery.camelCase( p );
7404
7405                                 if ( p !== name ) {
7406                                         prop[ name ] = prop[ p ];
7407                                         delete prop[ p ];
7408                                         p = name;
7409                                 }
7410
7411                                 if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {
7412                                         return opt.complete.call(this);
7413                                 }
7414
7415                                 if ( isElement && ( p === "height" || p === "width" ) ) {
7416                                         // Make sure that nothing sneaks out
7417                                         // Record all 3 overflow attributes because IE does not
7418                                         // change the overflow attribute when overflowX and
7419                                         // overflowY are set to the same value
7420                                         opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
7421
7422                                         // Set display property to inline-block for height/width
7423                                         // animations on inline elements that are having width/height
7424                                         // animated
7425                                         if ( jQuery.css( this, "display" ) === "inline" &&
7426                                                         jQuery.css( this, "float" ) === "none" ) {
7427                                                 if ( !jQuery.support.inlineBlockNeedsLayout ) {
7428                                                         this.style.display = "inline-block";
7429
7430                                                 } else {
7431                                                         var display = defaultDisplay(this.nodeName);
7432
7433                                                         // inline-level elements accept inline-block;
7434                                                         // block-level elements need to be inline with layout
7435                                                         if ( display === "inline" ) {
7436                                                                 this.style.display = "inline-block";
7437
7438                                                         } else {
7439                                                                 this.style.display = "inline";
7440                                                                 this.style.zoom = 1;
7441                                                         }
7442                                                 }
7443                                         }
7444                                 }
7445
7446                                 if ( jQuery.isArray( prop[p] ) ) {
7447                                         // Create (if needed) and add to specialEasing
7448                                         (opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
7449                                         prop[p] = prop[p][0];
7450                                 }
7451                         }
7452
7453                         if ( opt.overflow != null ) {
7454                                 this.style.overflow = "hidden";
7455                         }
7456
7457                         opt.curAnim = jQuery.extend({}, prop);
7458
7459                         jQuery.each( prop, function( name, val ) {
7460                                 var e = new jQuery.fx( self, opt, name );
7461
7462                                 if ( rfxtypes.test(val) ) {
7463                                         e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );
7464
7465                                 } else {
7466                                         var parts = rfxnum.exec(val),
7467                                                 start = e.cur() || 0;
7468
7469                                         if ( parts ) {
7470                                                 var end = parseFloat( parts[2] ),
7471                                                         unit = parts[3] || "px";
7472
7473                                                 // We need to compute starting value
7474                                                 if ( unit !== "px" ) {
7475                                                         jQuery.style( self, name, (end || 1) + unit);
7476                                                         start = ((end || 1) / e.cur()) * start;
7477                                                         jQuery.style( self, name, start + unit);
7478                                                 }
7479
7480                                                 // If a +=/-= token was provided, we're doing a relative animation
7481                                                 if ( parts[1] ) {
7482                                                         end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
7483                                                 }
7484
7485                                                 e.custom( start, end, unit );
7486
7487                                         } else {
7488                                                 e.custom( start, val, "" );
7489                                         }
7490                                 }
7491                         });
7492
7493                         // For JS strict compliance
7494                         return true;
7495                 });
7496         },
7497
7498         stop: function( clearQueue, gotoEnd ) {
7499                 var timers = jQuery.timers;
7500
7501                 if ( clearQueue ) {
7502                         this.queue([]);
7503                 }
7504
7505                 this.each(function() {
7506                         // go in reverse order so anything added to the queue during the loop is ignored
7507                         for ( var i = timers.length - 1; i >= 0; i-- ) {
7508                                 if ( timers[i].elem === this ) {
7509                                         if (gotoEnd) {
7510                                                 // force the next step to be the last
7511                                                 timers[i](true);
7512                                         }
7513
7514                                         timers.splice(i, 1);
7515                                 }
7516                         }
7517                 });
7518
7519                 // start the next in the queue if the last step wasn't forced
7520                 if ( !gotoEnd ) {
7521                         this.dequeue();
7522                 }
7523
7524                 return this;
7525         }
7526
7527 });
7528
7529 function genFx( type, num ) {
7530         var obj = {};
7531
7532         jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
7533                 obj[ this ] = type;
7534         });
7535
7536         return obj;
7537 }
7538
7539 // Generate shortcuts for custom animations
7540 jQuery.each({
7541         slideDown: genFx("show", 1),
7542         slideUp: genFx("hide", 1),
7543         slideToggle: genFx("toggle", 1),
7544         fadeIn: { opacity: "show" },
7545         fadeOut: { opacity: "hide" },
7546         fadeToggle: { opacity: "toggle" }
7547 }, function( name, props ) {
7548         jQuery.fn[ name ] = function( speed, easing, callback ) {
7549                 return this.animate( props, speed, easing, callback );
7550         };
7551 });
7552
7553 jQuery.extend({
7554         speed: function( speed, easing, fn ) {
7555                 var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
7556                         complete: fn || !fn && easing ||
7557                                 jQuery.isFunction( speed ) && speed,
7558                         duration: speed,
7559                         easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
7560                 };
7561
7562                 opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
7563                         opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
7564
7565                 // Queueing
7566                 opt.old = opt.complete;
7567                 opt.complete = function() {
7568                         if ( opt.queue !== false ) {
7569                                 jQuery(this).dequeue();
7570                         }
7571                         if ( jQuery.isFunction( opt.old ) ) {
7572                                 opt.old.call( this );
7573                         }
7574                 };
7575
7576                 return opt;
7577         },
7578
7579         easing: {
7580                 linear: function( p, n, firstNum, diff ) {
7581                         return firstNum + diff * p;
7582                 },
7583                 swing: function( p, n, firstNum, diff ) {
7584                         return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
7585                 }
7586         },
7587
7588         timers: [],
7589
7590         fx: function( elem, options, prop ) {
7591                 this.options = options;
7592                 this.elem = elem;
7593                 this.prop = prop;
7594
7595                 if ( !options.orig ) {
7596                         options.orig = {};
7597                 }
7598         }
7599
7600 });
7601
7602 jQuery.fx.prototype = {
7603         // Simple function for setting a style value
7604         update: function() {
7605                 if ( this.options.step ) {
7606                         this.options.step.call( this.elem, this.now, this );
7607                 }
7608
7609                 (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
7610         },
7611
7612         // Get the current size
7613         cur: function() {
7614                 if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
7615                         return this.elem[ this.prop ];
7616                 }
7617
7618                 var r = parseFloat( jQuery.css( this.elem, this.prop ) );
7619                 return r || 0;
7620         },
7621
7622         // Start an animation from one number to another
7623         custom: function( from, to, unit ) {
7624                 var self = this,
7625                         fx = jQuery.fx;
7626
7627                 this.startTime = jQuery.now();
7628                 this.start = from;
7629                 this.end = to;
7630                 this.unit = unit || this.unit || "px";
7631                 this.now = this.start;
7632                 this.pos = this.state = 0;
7633
7634                 function t( gotoEnd ) {
7635                         return self.step(gotoEnd);
7636                 }
7637
7638                 t.elem = this.elem;
7639
7640                 if ( t() && jQuery.timers.push(t) && !timerId ) {
7641                         timerId = setInterval(fx.tick, fx.interval);
7642                 }
7643         },
7644
7645         // Simple 'show' function
7646         show: function() {
7647                 // Remember where we started, so that we can go back to it later
7648                 this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
7649                 this.options.show = true;
7650
7651                 // Begin the animation
7652                 // Make sure that we start at a small width/height to avoid any
7653                 // flash of content
7654                 this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
7655
7656                 // Start by showing the element
7657                 jQuery( this.elem ).show();
7658         },
7659
7660         // Simple 'hide' function
7661         hide: function() {
7662                 // Remember where we started, so that we can go back to it later
7663                 this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
7664                 this.options.hide = true;
7665
7666                 // Begin the animation
7667                 this.custom(this.cur(), 0);
7668         },
7669
7670         // Each step of an animation
7671         step: function( gotoEnd ) {
7672                 var t = jQuery.now(), done = true;
7673
7674                 if ( gotoEnd || t >= this.options.duration + this.startTime ) {
7675                         this.now = this.end;
7676                         this.pos = this.state = 1;
7677                         this.update();
7678
7679                         this.options.curAnim[ this.prop ] = true;
7680
7681                         for ( var i in this.options.curAnim ) {
7682                                 if ( this.options.curAnim[i] !== true ) {
7683                                         done = false;
7684                                 }
7685                         }
7686
7687                         if ( done ) {
7688                                 // Reset the overflow
7689                                 if ( this.options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
7690                                         var elem = this.elem,
7691                                                 options = this.options;
7692
7693                                         jQuery.each( [ "", "X", "Y" ], function (index, value) {
7694                                                 elem.style[ "overflow" + value ] = options.overflow[index];
7695                                         } );
7696                                 }
7697
7698                                 // Hide the element if the "hide" operation was done
7699                                 if ( this.options.hide ) {
7700                                         jQuery(this.elem).hide();
7701                                 }
7702
7703                                 // Reset the properties, if the item has been hidden or shown
7704                                 if ( this.options.hide || this.options.show ) {
7705                                         for ( var p in this.options.curAnim ) {
7706                                                 jQuery.style( this.elem, p, this.options.orig[p] );
7707                                         }
7708                                 }
7709
7710                                 // Execute the complete function
7711                                 this.options.complete.call( this.elem );
7712                         }
7713
7714                         return false;
7715
7716                 } else {
7717                         var n = t - this.startTime;
7718                         this.state = n / this.options.duration;
7719
7720                         // Perform the easing function, defaults to swing
7721                         var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
7722                         var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
7723                         this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
7724                         this.now = this.start + ((this.end - this.start) * this.pos);
7725
7726                         // Perform the next step of the animation
7727                         this.update();
7728                 }
7729
7730                 return true;
7731         }
7732 };
7733
7734 jQuery.extend( jQuery.fx, {
7735         tick: function() {
7736                 var timers = jQuery.timers;
7737
7738                 for ( var i = 0; i < timers.length; i++ ) {
7739                         if ( !timers[i]() ) {
7740                                 timers.splice(i--, 1);
7741                         }
7742                 }
7743
7744                 if ( !timers.length ) {
7745                         jQuery.fx.stop();
7746                 }
7747         },
7748
7749         interval: 13,
7750
7751         stop: function() {
7752                 clearInterval( timerId );
7753                 timerId = null;
7754         },
7755
7756         speeds: {
7757                 slow: 600,
7758                 fast: 200,
7759                 // Default speed
7760                 _default: 400
7761         },
7762
7763         step: {
7764                 opacity: function( fx ) {
7765                         jQuery.style( fx.elem, "opacity", fx.now );
7766                 },
7767
7768                 _default: function( fx ) {
7769                         if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
7770                                 fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
7771                         } else {
7772                                 fx.elem[ fx.prop ] = fx.now;
7773                         }
7774                 }
7775         }
7776 });
7777
7778 if ( jQuery.expr && jQuery.expr.filters ) {
7779         jQuery.expr.filters.animated = function( elem ) {
7780                 return jQuery.grep(jQuery.timers, function( fn ) {
7781                         return elem === fn.elem;
7782                 }).length;
7783         };
7784 }
7785
7786 function defaultDisplay( nodeName ) {
7787         if ( !elemdisplay[ nodeName ] ) {
7788                 var elem = jQuery("<" + nodeName + ">").appendTo("body"),
7789                         display = elem.css("display");
7790
7791                 elem.remove();
7792
7793                 if ( display === "none" || display === "" ) {
7794                         display = "block";
7795                 }
7796
7797                 elemdisplay[ nodeName ] = display;
7798         }
7799
7800         return elemdisplay[ nodeName ];
7801 }
7802
7803
7804
7805
7806 var rtable = /^t(?:able|d|h)$/i,
7807         rroot = /^(?:body|html)$/i;
7808
7809 if ( "getBoundingClientRect" in document.documentElement ) {
7810         jQuery.fn.offset = function( options ) {
7811                 var elem = this[0], box;
7812
7813                 if ( options ) {
7814                         return this.each(function( i ) {
7815                                 jQuery.offset.setOffset( this, options, i );
7816                         });
7817                 }
7818
7819                 if ( !elem || !elem.ownerDocument ) {
7820                         return null;
7821                 }
7822
7823                 if ( elem === elem.ownerDocument.body ) {
7824                         return jQuery.offset.bodyOffset( elem );
7825                 }
7826
7827                 try {
7828                         box = elem.getBoundingClientRect();
7829                 } catch(e) {}
7830
7831                 var doc = elem.ownerDocument,
7832                         docElem = doc.documentElement;
7833
7834                 // Make sure we're not dealing with a disconnected DOM node
7835                 if ( !box || !jQuery.contains( docElem, elem ) ) {
7836                         return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
7837                 }
7838
7839                 var body = doc.body,
7840                         win = getWindow(doc),
7841                         clientTop  = docElem.clientTop  || body.clientTop  || 0,
7842                         clientLeft = docElem.clientLeft || body.clientLeft || 0,
7843                         scrollTop  = (win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop ),
7844                         scrollLeft = (win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft),
7845                         top  = box.top  + scrollTop  - clientTop,
7846                         left = box.left + scrollLeft - clientLeft;
7847
7848                 return { top: top, left: left };
7849         };
7850
7851 } else {
7852         jQuery.fn.offset = function( options ) {
7853                 var elem = this[0];
7854
7855                 if ( options ) {
7856                         return this.each(function( i ) {
7857                                 jQuery.offset.setOffset( this, options, i );
7858                         });
7859                 }
7860
7861                 if ( !elem || !elem.ownerDocument ) {
7862                         return null;
7863                 }
7864
7865                 if ( elem === elem.ownerDocument.body ) {
7866                         return jQuery.offset.bodyOffset( elem );
7867                 }
7868
7869                 jQuery.offset.initialize();
7870
7871                 var computedStyle,
7872                         offsetParent = elem.offsetParent,
7873                         prevOffsetParent = elem,
7874                         doc = elem.ownerDocument,
7875                         docElem = doc.documentElement,
7876                         body = doc.body,
7877                         defaultView = doc.defaultView,
7878                         prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
7879                         top = elem.offsetTop,
7880                         left = elem.offsetLeft;
7881
7882                 while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
7883                         if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
7884                                 break;
7885                         }
7886
7887                         computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
7888                         top  -= elem.scrollTop;
7889                         left -= elem.scrollLeft;
7890
7891                         if ( elem === offsetParent ) {
7892                                 top  += elem.offsetTop;
7893                                 left += elem.offsetLeft;
7894
7895                                 if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
7896                                         top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
7897                                         left += parseFloat( computedStyle.borderLeftWidth ) || 0;
7898                                 }
7899
7900                                 prevOffsetParent = offsetParent;
7901                                 offsetParent = elem.offsetParent;
7902                         }
7903
7904                         if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
7905                                 top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
7906                                 left += parseFloat( computedStyle.borderLeftWidth ) || 0;
7907                         }
7908
7909                         prevComputedStyle = computedStyle;
7910                 }
7911
7912                 if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
7913                         top  += body.offsetTop;
7914                         left += body.offsetLeft;
7915                 }
7916
7917                 if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
7918                         top  += Math.max( docElem.scrollTop, body.scrollTop );
7919                         left += Math.max( docElem.scrollLeft, body.scrollLeft );
7920                 }
7921
7922                 return { top: top, left: left };
7923         };
7924 }
7925
7926 jQuery.offset = {
7927         initialize: function() {
7928                 var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
7929                         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>";
7930
7931                 jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
7932
7933                 container.innerHTML = html;
7934                 body.insertBefore( container, body.firstChild );
7935                 innerDiv = container.firstChild;
7936                 checkDiv = innerDiv.firstChild;
7937                 td = innerDiv.nextSibling.firstChild.firstChild;
7938
7939                 this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
7940                 this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
7941
7942                 checkDiv.style.position = "fixed";
7943                 checkDiv.style.top = "20px";
7944
7945                 // safari subtracts parent border width here which is 5px
7946                 this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
7947                 checkDiv.style.position = checkDiv.style.top = "";
7948
7949                 innerDiv.style.overflow = "hidden";
7950                 innerDiv.style.position = "relative";
7951
7952                 this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
7953
7954                 this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
7955
7956                 body.removeChild( container );
7957                 body = container = innerDiv = checkDiv = table = td = null;
7958                 jQuery.offset.initialize = jQuery.noop;
7959         },
7960
7961         bodyOffset: function( body ) {
7962                 var top = body.offsetTop,
7963                         left = body.offsetLeft;
7964
7965                 jQuery.offset.initialize();
7966
7967                 if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
7968                         top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
7969                         left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
7970                 }
7971
7972                 return { top: top, left: left };
7973         },
7974
7975         setOffset: function( elem, options, i ) {
7976                 var position = jQuery.css( elem, "position" );
7977
7978                 // set position first, in-case top/left are set even on static elem
7979                 if ( position === "static" ) {
7980                         elem.style.position = "relative";
7981                 }
7982
7983                 var curElem = jQuery( elem ),
7984                         curOffset = curElem.offset(),
7985                         curCSSTop = jQuery.css( elem, "top" ),
7986                         curCSSLeft = jQuery.css( elem, "left" ),
7987                         calculatePosition = (position === "absolute" && jQuery.inArray('auto', [curCSSTop, curCSSLeft]) > -1),
7988                         props = {}, curPosition = {}, curTop, curLeft;
7989
7990                 // need to be able to calculate position if either top or left is auto and position is absolute
7991                 if ( calculatePosition ) {
7992                         curPosition = curElem.position();
7993                 }
7994
7995                 curTop  = calculatePosition ? curPosition.top  : parseInt( curCSSTop,  10 ) || 0;
7996                 curLeft = calculatePosition ? curPosition.left : parseInt( curCSSLeft, 10 ) || 0;
7997
7998                 if ( jQuery.isFunction( options ) ) {
7999                         options = options.call( elem, i, curOffset );
8000                 }
8001
8002                 if (options.top != null) {
8003                         props.top = (options.top - curOffset.top) + curTop;
8004                 }
8005                 if (options.left != null) {
8006                         props.left = (options.left - curOffset.left) + curLeft;
8007                 }
8008
8009                 if ( "using" in options ) {
8010                         options.using.call( elem, props );
8011                 } else {
8012                         curElem.css( props );
8013                 }
8014         }
8015 };
8016
8017
8018 jQuery.fn.extend({
8019         position: function() {
8020                 if ( !this[0] ) {
8021                         return null;
8022                 }
8023
8024                 var elem = this[0],
8025
8026                 // Get *real* offsetParent
8027                 offsetParent = this.offsetParent(),
8028
8029                 // Get correct offsets
8030                 offset       = this.offset(),
8031                 parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
8032
8033                 // Subtract element margins
8034                 // note: when an element has margin: auto the offsetLeft and marginLeft
8035                 // are the same in Safari causing offset.left to incorrectly be 0
8036                 offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
8037                 offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
8038
8039                 // Add offsetParent borders
8040                 parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
8041                 parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
8042
8043                 // Subtract the two offsets
8044                 return {
8045                         top:  offset.top  - parentOffset.top,
8046                         left: offset.left - parentOffset.left
8047                 };
8048         },
8049
8050         offsetParent: function() {
8051                 return this.map(function() {
8052                         var offsetParent = this.offsetParent || document.body;
8053                         while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
8054                                 offsetParent = offsetParent.offsetParent;
8055                         }
8056                         return offsetParent;
8057                 });
8058         }
8059 });
8060
8061
8062 // Create scrollLeft and scrollTop methods
8063 jQuery.each( ["Left", "Top"], function( i, name ) {
8064         var method = "scroll" + name;
8065
8066         jQuery.fn[ method ] = function(val) {
8067                 var elem = this[0], win;
8068
8069                 if ( !elem ) {
8070                         return null;
8071                 }
8072
8073                 if ( val !== undefined ) {
8074                         // Set the scroll offset
8075                         return this.each(function() {
8076                                 win = getWindow( this );
8077
8078                                 if ( win ) {
8079                                         win.scrollTo(
8080                                                 !i ? val : jQuery(win).scrollLeft(),
8081                                                  i ? val : jQuery(win).scrollTop()
8082                                         );
8083
8084                                 } else {
8085                                         this[ method ] = val;
8086                                 }
8087                         });
8088                 } else {
8089                         win = getWindow( elem );
8090
8091                         // Return the scroll offset
8092                         return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
8093                                 jQuery.support.boxModel && win.document.documentElement[ method ] ||
8094                                         win.document.body[ method ] :
8095                                 elem[ method ];
8096                 }
8097         };
8098 });
8099
8100 function getWindow( elem ) {
8101         return jQuery.isWindow( elem ) ?
8102                 elem :
8103                 elem.nodeType === 9 ?
8104                         elem.defaultView || elem.parentWindow :
8105                         false;
8106 }
8107
8108
8109
8110
8111 // Create innerHeight, innerWidth, outerHeight and outerWidth methods
8112 jQuery.each([ "Height", "Width" ], function( i, name ) {
8113
8114         var type = name.toLowerCase();
8115
8116         // innerHeight and innerWidth
8117         jQuery.fn["inner" + name] = function() {
8118                 return this[0] ?
8119                         parseFloat( jQuery.css( this[0], type, "padding" ) ) :
8120                         null;
8121         };
8122
8123         // outerHeight and outerWidth
8124         jQuery.fn["outer" + name] = function( margin ) {
8125                 return this[0] ?
8126                         parseFloat( jQuery.css( this[0], type, margin ? "margin" : "border" ) ) :
8127                         null;
8128         };
8129
8130         jQuery.fn[ type ] = function( size ) {
8131                 // Get window width or height
8132                 var elem = this[0];
8133                 if ( !elem ) {
8134                         return size == null ? null : this;
8135                 }
8136
8137                 if ( jQuery.isFunction( size ) ) {
8138                         return this.each(function( i ) {
8139                                 var self = jQuery( this );
8140                                 self[ type ]( size.call( this, i, self[ type ]() ) );
8141                         });
8142                 }
8143
8144                 if ( jQuery.isWindow( elem ) ) {
8145                         // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
8146                         // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
8147                         var docElemProp = elem.document.documentElement[ "client" + name ];
8148                         return elem.document.compatMode === "CSS1Compat" && docElemProp ||
8149                                 elem.document.body[ "client" + name ] || docElemProp;
8150
8151                 // Get document width or height
8152                 } else if ( elem.nodeType === 9 ) {
8153                         // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
8154                         return Math.max(
8155                                 elem.documentElement["client" + name],
8156                                 elem.body["scroll" + name], elem.documentElement["scroll" + name],
8157                                 elem.body["offset" + name], elem.documentElement["offset" + name]
8158                         );
8159
8160                 // Get or set width or height on the element
8161                 } else if ( size === undefined ) {
8162                         var orig = jQuery.css( elem, type ),
8163                                 ret = parseFloat( orig );
8164
8165                         return jQuery.isNaN( ret ) ? orig : ret;
8166
8167                 // Set the width or height on the element (default to pixels if value is unitless)
8168                 } else {
8169                         return this.css( type, typeof size === "string" ? size : size + "px" );
8170                 }
8171         };
8172
8173 });
8174
8175
8176 })(window);