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

Contents of /misc/horsensspejder-web/jquery/jquery-ui-1.10.3/tests/jquery-1.6.3.js

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.20