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

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

  ViewVC Help
Powered by ViewVC 1.1.20