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

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

  ViewVC Help
Powered by ViewVC 1.1.20