/[projects]/misc/horsensspejder-web/jquery/jquery-ui-1.10.3/tests/jquery-1.7.js
ViewVC logotype

Annotation of /misc/horsensspejder-web/jquery/jquery-ui-1.10.3/tests/jquery-1.7.js

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.20