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