/[projects]/misc/horsensspejder-web/jquery/DataTables-1.9.4/docs/media/js/jquery.js
ViewVC logotype

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

  ViewVC Help
Powered by ViewVC 1.1.20