WordPress source code - jquery (jquery-1.4.2.js)

1 /*!
2 * jQuery JavaScript Library v1.4.2
3 * http://jquery.com/
4 *
5 * Copyright 2010, 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 2010, The Dojo Foundation
12 * Released under the MIT, BSD, and GPL Licenses.
13 *
14 * Date: Sat Feb 13 22:33:48 2010 -0500
15 */
16 (function( window, undefined ) {
17
18 // Define a local copy of jQuery
19 var jQuery = function( selector, context ) {
20 // The jQuery object is actually just the init constructor 'enhanced'
21 return new jQuery.fn.init( selector, context );
22 },
23
24 // Map over jQuery in case of overwrite
25 _jQuery = window.jQuery,
26
27 // Map over the $ in case of overwrite
28 _$ = window.$,
29
30 // Use the correct document accordingly with window argument (sandbox)
31 document = window.document,
32
33 // A central reference to the root jQuery(document)
34 rootjQuery,
35
36 // A simple way to check for HTML strings or ID strings
37 // (both of which we optimize for)
38 quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,
39
40 // Is it a simple selector
41 isSimple = /^.[^:#\[\.,]*$/,
42
43 // Check if a string has a non-whitespace character in it
44 rnotwhite = /\S/,
45
46 // Used for trimming whitespace
47 rtrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g,
48
49 // Match a standalone tag
50 rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
51
52 // Keep a UserAgent string for use with jQuery.browser
53 userAgent = navigator.userAgent,
54
55 // For matching the engine and version of the browser
56 browserMatch,
57
58 // Has the ready events already been bound?
59 readyBound = false,
60
61 // The functions to execute on DOM ready
62 readyList = [],
63
64 // The ready event handler
65 DOMContentLoaded,
66
67 // Save a reference to some core methods
68 toString = Object.prototype.toString,
69 hasOwnProperty = Object.prototype.hasOwnProperty,
70 push = Array.prototype.push,
71 slice = Array.prototype.slice,
72 indexOf = Array.prototype.indexOf;
73
74 jQuery.fn = jQuery.prototype = {
75 init: function( selector, context ) {
76 var match, elem, ret, doc;
77
78 // Handle $(""), $(null), or $(undefined)
79 if ( !selector ) {
80 return this;
81 }
82
83 // Handle $(DOMElement)
84 if ( selector.nodeType ) {
85 this.context = this[0] = selector;
86 this.length = 1;
87 return this;
88 }
89
90 // The body element only exists once, optimize finding it
91 if ( selector === "body" && !context ) {
92 this.context = document;
93 this[0] = document.body;
94 this.selector = "body";
95 this.length = 1;
96 return this;
97 }
98
99 // Handle HTML strings
100 if ( typeof selector === "string" ) {
101 // Are we dealing with HTML string or an ID?
102 match = quickExpr.exec( selector );
103
104 // Verify a match, and that no context was specified for #id
105 if ( match && (match[1] || !context) ) {
106
107 // HANDLE: $(html) -> $(array)
108 if ( match[1] ) {
109 doc = (context ? context.ownerDocument || context : document);
110
111 // If a single string is passed in and it's a single tag
112 // just do a createElement and skip the rest
113 ret = rsingleTag.exec( selector );
114
115 if ( ret ) {
116 if ( jQuery.isPlainObject( context ) ) {
117 selector = [ document.createElement( ret[1] ) ];
118 jQuery.fn.attr.call( selector, context, true );
119
120 } else {
121 selector = [ doc.createElement( ret[1] ) ];
122 }
123
124 } else {
125 ret = buildFragment( [ match[1] ], [ doc ] );
126 selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
127 }
128
129 return jQuery.merge( this, selector );
130
131 // HANDLE: $("#id")
132 } else {
133 elem = document.getElementById( match[2] );
134
135 if ( elem ) {
136 // Handle the case where IE and Opera return items
137 // by name instead of ID
138 if ( elem.id !== match[2] ) {
139 return rootjQuery.find( selector );
140 }
141
142 // Otherwise, we inject the element directly into the jQuery object
143 this.length = 1;
144 this[0] = elem;
145 }
146
147 this.context = document;
148 this.selector = selector;
149 return this;
150 }
151
152 // HANDLE: $("TAG")
153 } else if ( !context && /^\w+$/.test( selector ) ) {
154 this.selector = selector;
155 this.context = document;
156 selector = document.getElementsByTagName( selector );
157 return jQuery.merge( this, selector );
158
159 // HANDLE: $(expr, $(...))
160 } else if ( !context || context.jquery ) {
161 return (context || rootjQuery).find( selector );
162
163 // HANDLE: $(expr, context)
164 // (which is just equivalent to: $(context).find(expr)
165 } else {
166 return jQuery( context ).find( selector );
167 }
168
169 // HANDLE: $(function)
170 // Shortcut for document ready
171 } else if ( jQuery.isFunction( selector ) ) {
172 return rootjQuery.ready( selector );
173 }
174
175 if (selector.selector !== undefined) {
176 this.selector = selector.selector;
177 this.context = selector.context;
178 }
179
180 return jQuery.makeArray( selector, this );
181 },
182
183 // Start with an empty selector
184 selector: "",
185
186 // The current version of jQuery being used
187 jquery: "1.4.2",
188
189 // The default length of a jQuery object is 0
190 length: 0,
191
192 // The number of elements contained in the matched element set
193 size: function() {
194 return this.length;
195 },
196
197 toArray: function() {
198 return slice.call( this, 0 );
199 },
200
201 // Get the Nth element in the matched element set OR
202 // Get the whole matched element set as a clean array
203 get: function( num ) {
204 return num == null ?
205
206 // Return a 'clean' array
207 this.toArray() :
208
209 // Return just the object
210 ( num < 0 ? this.slice(num)[ 0 ] : this[ num ] );
211 },
212
213 // Take an array of elements and push it onto the stack
214 // (returning the new matched element set)
215 pushStack: function( elems, name, selector ) {
216 // Build a new jQuery matched element set
217 var ret = jQuery();
218
219 if ( jQuery.isArray( elems ) ) {
220 push.apply( ret, elems );
221
222 } else {
223 jQuery.merge( ret, elems );
224 }
225
226 // Add the old object onto the stack (as a reference)
227 ret.prevObject = this;
228
229 ret.context = this.context;
230
231 if ( name === "find" ) {
232 ret.selector = this.selector + (this.selector ? " " : "") + selector;
233 } else if ( name ) {
234 ret.selector = this.selector + "." + name + "(" + selector + ")";
235 }
236
237 // Return the newly-formed element set
238 return ret;
239 },
240
241 // Execute a callback for every element in the matched set.
242 // (You can seed the arguments with an array of args, but this is
243 // only used internally.)
244 each: function( callback, args ) {
245 return jQuery.each( this, callback, args );
246 },
247
248 ready: function( fn ) {
249 // Attach the listeners
250 jQuery.bindReady();
251
252 // If the DOM is already ready
253 if ( jQuery.isReady ) {
254 // Execute the function immediately
255 fn.call( document, jQuery );
256
257 // Otherwise, remember the function for later
258 } else if ( readyList ) {
259 // Add the function to the wait list
260 readyList.push( fn );
261 }
262
263 return this;
264 },
265
266 eq: function( i ) {
267 return i === -1 ?
268 this.slice( i ) :
269 this.slice( i, +i + 1 );
270 },
271
272 first: function() {
273 return this.eq( 0 );
274 },
275
276 last: function() {
277 return this.eq( -1 );
278 },
279
280 slice: function() {
281 return this.pushStack( slice.apply( this, arguments ),
282 "slice", slice.call(arguments).join(",") );
283 },
284
285 map: function( callback ) {
286 return this.pushStack( jQuery.map(this, function( elem, i ) {
287 return callback.call( elem, i, elem );
288 }));
289 },
290
291 end: function() {
292 return this.prevObject || jQuery(null);
293 },
294
295 // For internal use only.
296 // Behaves like an Array's method, not like a jQuery method.
297 push: push,
298 sort: [].sort,
299 splice: [].splice
300 };
301
302 // Give the init function the jQuery prototype for later instantiation
303 jQuery.fn.init.prototype = jQuery.fn;
304
305 jQuery.extend = jQuery.fn.extend = function() {
306 // copy reference to target object
307 var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy;
308
309 // Handle a deep copy situation
310 if ( typeof target === "boolean" ) {
311 deep = target;
312 target = arguments[1] || {};
313 // skip the boolean and the target
314 i = 2;
315 }
316
317 // Handle case when target is a string or something (possible in deep copy)
318 if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
319 target = {};
320 }
321
322 // extend jQuery itself if only one argument is passed
323 if ( length === i ) {
324 target = this;
325 --i;
326 }
327
328 for ( ; i < length; i++ ) {
329 // Only deal with non-null/undefined values
330 if ( (options = arguments[ i ]) != null ) {
331 // Extend the base object
332 for ( name in options ) {
333 src = target[ name ];
334 copy = options[ name ];
335
336 // Prevent never-ending loop
337 if ( target === copy ) {
338 continue;
339 }
340
341 // Recurse if we're merging object literal values or arrays
342 if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) {
343 var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src
344 : jQuery.isArray(copy) ? [] : {};
345
346 // Never move original objects, clone them
347 target[ name ] = jQuery.extend( deep, clone, copy );
348
349 // Don't bring in undefined values
350 } else if ( copy !== undefined ) {
351 target[ name ] = copy;
352 }
353 }
354 }
355 }
356
357 // Return the modified object
358 return target;
359 };
360
361 jQuery.extend({
362 noConflict: function( deep ) {
363 window.$ = _$;
364
365 if ( deep ) {
366 window.jQuery = _jQuery;
367 }
368
369 return jQuery;
370 },
371
372 // Is the DOM ready to be used? Set to true once it occurs.
373 isReady: false,
374
375 // Handle when the DOM is ready
376 ready: function() {
377 // Make sure that the DOM is not already loaded
378 if ( !jQuery.isReady ) {
379 // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
380 if ( !document.body ) {
381 return setTimeout( jQuery.ready, 13 );
382 }
383
384 // Remember that the DOM is ready
385 jQuery.isReady = true;
386
387 // If there are functions bound, to execute
388 if ( readyList ) {
389 // Execute all of them
390 var fn, i = 0;
391 while ( (fn = readyList[ i++ ]) ) {
392 fn.call( document, jQuery );
393 }
394
395 // Reset the list of functions
396 readyList = null;
397 }
398
399 // Trigger any bound ready events
400 if ( jQuery.fn.triggerHandler ) {
401 jQuery( document ).triggerHandler( "ready" );
402 }
403 }
404 },
405
406 bindReady: function() {
407 if ( readyBound ) {
408 return;
409 }
410
411 readyBound = true;
412
413 // Catch cases where $(document).ready() is called after the
414 // browser event has already occurred.
415 if ( document.readyState === "complete" ) {
416 return jQuery.ready();
417 }
418
419 // Mozilla, Opera and webkit nightlies currently support this event
420 if ( document.addEventListener ) {
421 // Use the handy event callback
422 document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
423
424 // A fallback to window.onload, that will always work
425 window.addEventListener( "load", jQuery.ready, false );
426
427 // If IE event model is used
428 } else if ( document.attachEvent ) {
429 // ensure firing before onload,
430 // maybe late but safe also for iframes
431 document.attachEvent("onreadystatechange", DOMContentLoaded);
432
433 // A fallback to window.onload, that will always work
434 window.attachEvent( "onload", jQuery.ready );
435
436 // If IE and not a frame
437 // continually check to see if the document is ready
438 var toplevel = false;
439
440 try {
441 toplevel = window.frameElement == null;
442 } catch(e) {}
443
444 if ( document.documentElement.doScroll && toplevel ) {
445 doScrollCheck();
446 }
447 }
448 },
449
450 // See test/unit/core.js for details concerning isFunction.
451 // Since version 1.3, DOM methods and functions like alert
452 // aren't supported. They return false on IE (#2968).
453 isFunction: function( obj ) {
454 return toString.call(obj) === "[object Function]";
455 },
456
457 isArray: function( obj ) {
458 return toString.call(obj) === "[object Array]";
459 },
460
461 isPlainObject: function( obj ) {
462 // Must be an Object.
463 // Because of IE, we also have to check the presence of the constructor property.
464 // Make sure that DOM nodes and window objects don't pass through, as well
465 if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) {
466 return false;
467 }
468
469 // Not own constructor property must be Object
470 if ( obj.constructor
471 && !hasOwnProperty.call(obj, "constructor")
472 && !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) {
473 return false;
474 }
475
476 // Own properties are enumerated firstly, so to speed up,
477 // if last one is own, then all properties are own.
478
479 var key;
480 for ( key in obj ) {}
481
482 return key === undefined || hasOwnProperty.call( obj, key );
483 },
484
485 isEmptyObject: function( obj ) {
486 for ( var name in obj ) {
487 return false;
488 }
489 return true;
490 },
491
492 error: function( msg ) {
493 throw msg;
494 },
495
496 parseJSON: function( data ) {
497 if ( typeof data !== "string" || !data ) {
498 return null;
499 }
500
501 // Make sure leading/trailing whitespace is removed (IE can't handle it)
502 data = jQuery.trim( data );
503
504 // Make sure the incoming data is actual JSON
505 // Logic borrowed from http://json.org/json2.js
506 if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
507 .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
508 .replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) {
509
510 // Try to use the native JSON parser first
511 return window.JSON && window.JSON.parse ?
512 window.JSON.parse( data ) :
513 (new Function("return " + data))();
514
515 } else {
516 jQuery.error( "Invalid JSON: " + data );
517 }
518 },
519
520 noop: function() {},
521
522 // Evalulates a script in a global context
523 globalEval: function( data ) {
524 if ( data && rnotwhite.test(data) ) {
525 // Inspired by code by Andrea Giammarchi
526 // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
527 var head = document.getElementsByTagName("head")[0] || document.documentElement,
528 script = document.createElement("script");
529
530 script.type = "text/javascript";
531
532 if ( jQuery.support.scriptEval ) {
533 script.appendChild( document.createTextNode( data ) );
534 } else {
535 script.text = data;
536 }
537
538 // Use insertBefore instead of appendChild to circumvent an IE6 bug.
539 // This arises when a base node is used (#2709).
540 head.insertBefore( script, head.firstChild );
541 head.removeChild( script );
542 }
543 },
544
545 nodeName: function( elem, name ) {
546 return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
547 },
548
549 // args is for internal usage only
550 each: function( object, callback, args ) {
551 var name, i = 0,
552 length = object.length,
553 isObj = length === undefined || jQuery.isFunction(object);
554
555 if ( args ) {
556 if ( isObj ) {
557 for ( name in object ) {
558 if ( callback.apply( object[ name ], args ) === false ) {
559 break;
560 }
561 }
562 } else {
563 for ( ; i < length; ) {
564 if ( callback.apply( object[ i++ ], args ) === false ) {
565 break;
566 }
567 }
568 }
569
570 // A special, fast, case for the most common use of each
571 } else {
572 if ( isObj ) {
573 for ( name in object ) {
574 if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
575 break;
576 }
577 }
578 } else {
579 for ( var value = object[0];
580 i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
581 }
582 }
583
584 return object;
585 },
586
587 trim: function( text ) {
588 return (text || "").replace( rtrim, "" );
589 },
590
591 // results is for internal usage only
592 makeArray: function( array, results ) {
593 var ret = results || [];
594
595 if ( array != null ) {
596 // The window, strings (and functions) also have 'length'
597 // The extra typeof function check is to prevent crashes
598 // in Safari 2 (See: #3039)
599 if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) {
600 push.call( ret, array );
601 } else {
602 jQuery.merge( ret, array );
603 }
604 }
605
606 return ret;
607 },
608
609 inArray: function( elem, array ) {
610 if ( array.indexOf ) {
611 return array.indexOf( elem );
612 }
613
614 for ( var i = 0, length = array.length; i < length; i++ ) {
615 if ( array[ i ] === elem ) {
616 return i;
617 }
618 }
619
620 return -1;
621 },
622
623 merge: function( first, second ) {
624 var i = first.length, j = 0;
625
626 if ( typeof second.length === "number" ) {
627 for ( var l = second.length; j < l; j++ ) {
628 first[ i++ ] = second[ j ];
629 }
630
631 } else {
632 while ( second[j] !== undefined ) {
633 first[ i++ ] = second[ j++ ];
634 }
635 }
636
637 first.length = i;
638
639 return first;
640 },
641
642 grep: function( elems, callback, inv ) {
643 var ret = [];
644
645 // Go through the array, only saving the items
646 // that pass the validator function
647 for ( var i = 0, length = elems.length; i < length; i++ ) {
648 if ( !inv !== !callback( elems[ i ], i ) ) {
649 ret.push( elems[ i ] );
650 }
651 }
652
653 return ret;
654 },
655
656 // arg is for internal usage only
657 map: function( elems, callback, arg ) {
658 var ret = [], value;
659
660 // Go through the array, translating each of the items to their
661 // new value (or values).
662 for ( var i = 0, length = elems.length; i < length; i++ ) {
663 value = callback( elems[ i ], i, arg );
664
665 if ( value != null ) {
666 ret[ ret.length ] = value;
667 }
668 }
669
670 return ret.concat.apply( [], ret );
671 },
672
673 // A global GUID counter for objects
674 guid: 1,
675
676 proxy: function( fn, proxy, thisObject ) {
677 if ( arguments.length === 2 ) {
678 if ( typeof proxy === "string" ) {
679 thisObject = fn;
680 fn = thisObject[ proxy ];
681 proxy = undefined;
682
683 } else if ( proxy && !jQuery.isFunction( proxy ) ) {
684 thisObject = proxy;
685 proxy = undefined;
686 }
687 }
688
689 if ( !proxy && fn ) {
690 proxy = function() {
691 return fn.apply( thisObject || this, arguments );
692 };
693 }
694
695 // Set the guid of unique handler to the same of original handler, so it can be removed
696 if ( fn ) {
697 proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
698 }
699
700 // So proxy can be declared as an argument
701 return proxy;
702 },
703
704 // Use of jQuery.browser is frowned upon.
705 // More details: http://docs.jquery.com/Utilities/jQuery.browser
706 uaMatch: function( ua ) {
707 ua = ua.toLowerCase();
708
709 var match = /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
710 /(opera)(?:.*version)?[ \/]([\w.]+)/.exec( ua ) ||
711 /(msie) ([\w.]+)/.exec( ua ) ||
712 !/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec( ua ) ||
713 [];
714
715 return { browser: match[1] || "", version: match[2] || "0" };
716 },
717
718 browser: {}
719 });
720
721 browserMatch = jQuery.uaMatch( userAgent );
722 if ( browserMatch.browser ) {
723 jQuery.browser[ browserMatch.browser ] = true;
724 jQuery.browser.version = browserMatch.version;
725 }
726
727 // Deprecated, use jQuery.browser.webkit instead
728 if ( jQuery.browser.webkit ) {
729 jQuery.browser.safari = true;
730 }
731
732 if ( indexOf ) {
733 jQuery.inArray = function( elem, array ) {
734 return indexOf.call( array, elem );
735 };
736 }
737
738 // All jQuery objects should point back to these
739 rootjQuery = jQuery(document);
740
741 // Cleanup functions for the document ready method
742 if ( document.addEventListener ) {
743 DOMContentLoaded = function() {
744 document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
745 jQuery.ready();
746 };
747
748 } else if ( document.attachEvent ) {
749 DOMContentLoaded = function() {
750 // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
751 if ( document.readyState === "complete" ) {
752 document.detachEvent( "onreadystatechange", DOMContentLoaded );
753 jQuery.ready();
754 }
755 };
756 }
757
758 // The DOM ready check for Internet Explorer
759 function doScrollCheck() {
760 if ( jQuery.isReady ) {
761 return;
762 }
763
764 try {
765 // If IE is used, use the trick by Diego Perini
766 // http://javascript.nwbox.com/IEContentLoaded/
767 document.documentElement.doScroll("left");
768 } catch( error ) {
769 setTimeout( doScrollCheck, 1 );
770 return;
771 }
772
773 // and execute any waiting functions
774 jQuery.ready();
775 }
776
777 function evalScript( i, elem ) {
778 if ( elem.src ) {
779 jQuery.ajax({
780 url: elem.src,
781 async: false,
782 dataType: "script"
783 });
784 } else {
785 jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
786 }
787
788 if ( elem.parentNode ) {
789 elem.parentNode.removeChild( elem );
790 }
791 }
792
793 // Mutifunctional method to get and set values to a collection
794 // The value/s can be optionally by executed if its a function
795 function access( elems, key, value, exec, fn, pass ) {
796 var length = elems.length;
797
798 // Setting many attributes
799 if ( typeof key === "object" ) {
800 for ( var k in key ) {
801 access( elems, k, key[k], exec, fn, value );
802 }
803 return elems;
804 }
805
806 // Setting one attribute
807 if ( value !== undefined ) {
808 // Optionally, function values get executed if exec is true
809 exec = !pass && exec && jQuery.isFunction(value);
810
811 for ( var i = 0; i < length; i++ ) {
812 fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
813 }
814
815 return elems;
816 }
817
818 // Getting an attribute
819 return length ? fn( elems[0], key ) : undefined;
820 }
821
822 function now() {
823 return (new Date).getTime();
824 }
825 (function() {
826
827 jQuery.support = {};
828
829 var root = document.documentElement,
830 script = document.createElement("script"),
831 div = document.createElement("div"),
832 id = "script" + now();
833
834 div.style.display = "none";
835 div.innerHTML = " <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
836
837 var all = div.getElementsByTagName("*"),
838 a = div.getElementsByTagName("a")[0];
839
840 // Can't get basic test support
841 if ( !all || !all.length || !a ) {
842 return;
843 }
844
845 jQuery.support = {
846 // IE strips leading whitespace when .innerHTML is used
847 leadingWhitespace: div.firstChild.nodeType === 3,
848
849 // Make sure that tbody elements aren't automatically inserted
850 // IE will insert them into empty tables
851 tbody: !div.getElementsByTagName("tbody").length,
852
853 // Make sure that link elements get serialized correctly by innerHTML
854 // This requires a wrapper element in IE
855 htmlSerialize: !!div.getElementsByTagName("link").length,
856
857 // Get the style information from getAttribute
858 // (IE uses .cssText insted)
859 style: /red/.test( a.getAttribute("style") ),
860
861 // Make sure that URLs aren't manipulated
862 // (IE normalizes it by default)
863 hrefNormalized: a.getAttribute("href") === "/a",
864
865 // Make sure that element opacity exists
866 // (IE uses filter instead)
867 // Use a regex to work around a WebKit issue. See #5145
868 opacity: /^0.55$/.test( a.style.opacity ),
869
870 // Verify style float existence
871 // (IE uses styleFloat instead of cssFloat)
872 cssFloat: !!a.style.cssFloat,
873
874 // Make sure that if no value is specified for a checkbox
875 // that it defaults to "on".
876 // (WebKit defaults to "" instead)
877 checkOn: div.getElementsByTagName("input")[0].value === "on",
878
879 // Make sure that a selected-by-default option has a working selected property.
880 // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
881 optSelected: document.createElement("select").appendChild( document.createElement("option") ).selected,
882
883 parentNode: div.removeChild( div.appendChild( document.createElement("div") ) ).parentNode === null,
884
885 // Will be defined later
886 deleteExpando: true,
887 checkClone: false,
888 scriptEval: false,
889 noCloneEvent: true,
890 boxModel: null
891 };
892
893 script.type = "text/javascript";
894 try {
895 script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
896 } catch(e) {}
897
898 root.insertBefore( script, root.firstChild );
899
900 // Make sure that the execution of code works by injecting a script
901 // tag with appendChild/createTextNode
902 // (IE doesn't support this, fails, and uses .text instead)
903 if ( window[ id ] ) {
904 jQuery.support.scriptEval = true;
905 delete window[ id ];
906 }
907
908 // Test to see if it's possible to delete an expando from an element
909 // Fails in Internet Explorer
910 try {
911 delete script.test;
912
913 } catch(e) {
914 jQuery.support.deleteExpando = false;
915 }
916
917 root.removeChild( script );
918
919 if ( div.attachEvent && div.fireEvent ) {
920 div.attachEvent("onclick", function click() {
921 // Cloning a node shouldn't copy over any
922 // bound event handlers (IE does this)
923 jQuery.support.noCloneEvent = false;
924 div.detachEvent("onclick", click);
925 });
926 div.cloneNode(true).fireEvent("onclick");
927 }
928
929 div = document.createElement("div");
930 div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
931
932 var fragment = document.createDocumentFragment();
933 fragment.appendChild( div.firstChild );
934
935 // WebKit doesn't clone checked state correctly in fragments
936 jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
937
938 // Figure out if the W3C box model works as expected
939 // document.body must exist before we can do this
940 jQuery(function() {
941 var div = document.createElement("div");
942 div.style.width = div.style.paddingLeft = "1px";
943
944 document.body.appendChild( div );
945 jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
946 document.body.removeChild( div ).style.display = 'none';
947
948 div = null;
949 });
950
951 // Technique from Juriy Zaytsev
952 // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
953 var eventSupported = function( eventName ) {
954 var el = document.createElement("div");
955 eventName = "on" + eventName;
956
957 var isSupported = (eventName in el);
958 if ( !isSupported ) {
959 el.setAttribute(eventName, "return;");
960 isSupported = typeof el[eventName] === "function";
961 }
962 el = null;
963
964 return isSupported;
965 };
966
967 jQuery.support.submitBubbles = eventSupported("submit");
968 jQuery.support.changeBubbles = eventSupported("change");
969
970 // release memory in IE
971 root = script = div = all = a = null;
972 })();
973
974 jQuery.props = {
975 "for": "htmlFor",
976 "class": "className",
977 readonly: "readOnly",
978 maxlength: "maxLength",
979 cellspacing: "cellSpacing",
980 rowspan: "rowSpan",
981 colspan: "colSpan",
982 tabindex: "tabIndex",
983 usemap: "useMap",
984 frameborder: "frameBorder"
985 };
986 var expando = "jQuery" + now(), uuid = 0, windowData = {};
987
988 jQuery.extend({
989 cache: {},
990
991 expando:expando,
992
993 // The following elements throw uncatchable exceptions if you
994 // attempt to add expando properties to them.
995 noData: {
996 "embed": true,
997 "object": true,
998 "applet": true
999 },
1000
1001 data: function( elem, name, data ) {
1002 if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
1003 return;
1004 }
1005
1006 elem = elem == window ?
1007 windowData :
1008 elem;
1009
1010 var id = elem[ expando ], cache = jQuery.cache, thisCache;
1011
1012 if ( !id && typeof name === "string" && data === undefined ) {
1013 return null;
1014 }
1015
1016 // Compute a unique ID for the element
1017 if ( !id ) {
1018 id = ++uuid;
1019 }
1020
1021 // Avoid generating a new cache unless none exists and we
1022 // want to manipulate it.
1023 if ( typeof name === "object" ) {
1024 elem[ expando ] = id;
1025 thisCache = cache[ id ] = jQuery.extend(true, {}, name);
1026
1027 } else if ( !cache[ id ] ) {
1028 elem[ expando ] = id;
1029 cache[ id ] = {};
1030 }
1031
1032 thisCache = cache[ id ];
1033
1034 // Prevent overriding the named cache with undefined values
1035 if ( data !== undefined ) {
1036 thisCache[ name ] = data;
1037 }
1038
1039 return typeof name === "string" ? thisCache[ name ] : thisCache;
1040 },
1041
1042 removeData: function( elem, name ) {
1043 if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
1044 return;
1045 }
1046
1047 elem = elem == window ?
1048 windowData :
1049 elem;
1050
1051 var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ];
1052
1053 // If we want to remove a specific section of the element's data
1054 if ( name ) {
1055 if ( thisCache ) {
1056 // Remove the section of cache data
1057 delete thisCache[ name ];
1058
1059 // If we've removed all the data, remove the element's cache
1060 if ( jQuery.isEmptyObject(thisCache) ) {
1061 jQuery.removeData( elem );
1062 }
1063 }
1064
1065 // Otherwise, we want to remove all of the element's data
1066 } else {
1067 if ( jQuery.support.deleteExpando ) {
1068 delete elem[ jQuery.expando ];
1069
1070 } else if ( elem.removeAttribute ) {
1071 elem.removeAttribute( jQuery.expando );
1072 }
1073
1074 // Completely remove the data cache
1075 delete cache[ id ];
1076 }
1077 }
1078 });
1079
1080 jQuery.fn.extend({
1081 data: function( key, value ) {
1082 if ( typeof key === "undefined" && this.length ) {
1083 return jQuery.data( this[0] );
1084
1085 } else if ( typeof key === "object" ) {
1086 return this.each(function() {
1087 jQuery.data( this, key );
1088 });
1089 }
1090
1091 var parts = key.split(".");
1092 parts[1] = parts[1] ? "." + parts[1] : "";
1093
1094 if ( value === undefined ) {
1095 var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1096
1097 if ( data === undefined && this.length ) {
1098 data = jQuery.data( this[0], key );
1099 }
1100 return data === undefined && parts[1] ?
1101 this.data( parts[0] ) :
1102 data;
1103 } else {
1104 return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function() {
1105 jQuery.data( this, key, value );
1106 });
1107 }
1108 },
1109
1110 removeData: function( key ) {
1111 return this.each(function() {
1112 jQuery.removeData( this, key );
1113 });
1114 }
1115 });
1116 jQuery.extend({
1117 queue: function( elem, type, data ) {
1118 if ( !elem ) {
1119 return;
1120 }
1121
1122 type = (type || "fx") + "queue";
1123 var q = jQuery.data( elem, type );
1124
1125 // Speed up dequeue by getting out quickly if this is just a lookup
1126 if ( !data ) {
1127 return q || [];
1128 }
1129
1130 if ( !q || jQuery.isArray(data) ) {
1131 q = jQuery.data( elem, type, jQuery.makeArray(data) );
1132
1133 } else {
1134 q.push( data );
1135 }
1136
1137 return q;
1138 },
1139
1140 dequeue: function( elem, type ) {
1141 type = type || "fx";
1142
1143 var queue = jQuery.queue( elem, type ), fn = queue.shift();
1144
1145 // If the fx queue is dequeued, always remove the progress sentinel
1146 if ( fn === "inprogress" ) {
1147 fn = queue.shift();
1148 }
1149
1150 if ( fn ) {
1151 // Add a progress sentinel to prevent the fx queue from being
1152 // automatically dequeued
1153 if ( type === "fx" ) {
1154 queue.unshift("inprogress");
1155 }
1156
1157 fn.call(elem, function() {
1158 jQuery.dequeue(elem, type);
1159 });
1160 }
1161 }
1162 });
1163
1164 jQuery.fn.extend({
1165 queue: function( type, data ) {
1166 if ( typeof type !== "string" ) {
1167 data = type;
1168 type = "fx";
1169 }
1170
1171 if ( data === undefined ) {
1172 return jQuery.queue( this[0], type );
1173 }
1174 return this.each(function( i, elem ) {
1175 var queue = jQuery.queue( this, type, data );
1176
1177 if ( type === "fx" && queue[0] !== "inprogress" ) {
1178 jQuery.dequeue( this, type );
1179 }
1180 });
1181 },
1182 dequeue: function( type ) {
1183 return this.each(function() {
1184 jQuery.dequeue( this, type );
1185 });
1186 },
1187
1188 // Based off of the plugin by Clint Helfers, with permission.
1189 // http://blindsignals.com/index.php/2009/07/jquery-delay/
1190 delay: function( time, type ) {
1191 time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
1192 type = type || "fx";
1193
1194 return this.queue( type, function() {
1195 var elem = this;
1196 setTimeout(function() {
1197 jQuery.dequeue( elem, type );
1198 }, time );
1199 });
1200 },
1201
1202 clearQueue: function( type ) {
1203 return this.queue( type || "fx", [] );
1204 }
1205 });
1206 var rclass = /[\n\t]/g,
1207 rspace = /\s+/,
1208 rreturn = /\r/g,
1209 rspecialurl = /href|src|style/,
1210 rtype = /(button|input)/i,
1211 rfocusable = /(button|input|object|select|textarea)/i,
1212 rclickable = /^(a|area)$/i,
1213 rradiocheck = /radio|checkbox/;
1214
1215 jQuery.fn.extend({
1216 attr: function( name, value ) {
1217 return access( this, name, value, true, jQuery.attr );
1218 },
1219
1220 removeAttr: function( name, fn ) {
1221 return this.each(function(){
1222 jQuery.attr( this, name, "" );
1223 if ( this.nodeType === 1 ) {
1224 this.removeAttribute( name );
1225 }
1226 });
1227 },
1228
1229 addClass: function( value ) {
1230 if ( jQuery.isFunction(value) ) {
1231 return this.each(function(i) {
1232 var self = jQuery(this);
1233 self.addClass( value.call(this, i, self.attr("class")) );
1234 });
1235 }
1236
1237 if ( value && typeof value === "string" ) {
1238 var classNames = (value || "").split( rspace );
1239
1240 for ( var i = 0, l = this.length; i < l; i++ ) {
1241 var elem = this[i];
1242
1243 if ( elem.nodeType === 1 ) {
1244 if ( !elem.className ) {
1245 elem.className = value;
1246
1247 } else {
1248 var className = " " + elem.className + " ", setClass = elem.className;
1249 for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
1250 if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
1251 setClass += " " + classNames[c];
1252 }
1253 }
1254 elem.className = jQuery.trim( setClass );
1255 }
1256 }
1257 }
1258 }
1259
1260 return this;
1261 },
1262
1263 removeClass: function( value ) {
1264 if ( jQuery.isFunction(value) ) {
1265 return this.each(function(i) {
1266 var self = jQuery(this);
1267 self.removeClass( value.call(this, i, self.attr("class")) );
1268 });
1269 }
1270
1271 if ( (value && typeof value === "string") || value === undefined ) {
1272 var classNames = (value || "").split(rspace);
1273
1274 for ( var i = 0, l = this.length; i < l; i++ ) {
1275 var elem = this[i];
1276
1277 if ( elem.nodeType === 1 && elem.className ) {
1278 if ( value ) {
1279 var className = (" " + elem.className + " ").replace(rclass, " ");
1280 for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
1281 className = className.replace(" " + classNames[c] + " ", " ");
1282 }
1283 elem.className = jQuery.trim( className );
1284
1285 } else {
1286 elem.className = "";
1287 }
1288 }
1289 }
1290 }
1291
1292 return this;
1293 },
1294
1295 toggleClass: function( value, stateVal ) {
1296 var type = typeof value, isBool = typeof stateVal === "boolean";
1297
1298 if ( jQuery.isFunction( value ) ) {
1299 return this.each(function(i) {
1300 var self = jQuery(this);
1301 self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
1302 });
1303 }
1304
1305 return this.each(function() {
1306 if ( type === "string" ) {
1307 // toggle individual class names
1308 var className, i = 0, self = jQuery(this),
1309 state = stateVal,
1310 classNames = value.split( rspace );
1311
1312 while ( (className = classNames[ i++ ]) ) {
1313 // check each className given, space seperated list
1314 state = isBool ? state : !self.hasClass( className );
1315 self[ state ? "addClass" : "removeClass" ]( className );
1316 }
1317
1318 } else if ( type === "undefined" || type === "boolean" ) {
1319 if ( this.className ) {
1320 // store className if set
1321 jQuery.data( this, "__className__", this.className );
1322 }
1323
1324 // toggle whole className
1325 this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || "";
1326 }
1327 });
1328 },
1329
1330 hasClass: function( selector ) {
1331 var className = " " + selector + " ";
1332 for ( var i = 0, l = this.length; i < l; i++ ) {
1333 if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
1334 return true;
1335 }
1336 }
1337
1338 return false;
1339 },
1340
1341 val: function( value ) {
1342 if ( value === undefined ) {
1343 var elem = this[0];
1344
1345 if ( elem ) {
1346 if ( jQuery.nodeName( elem, "option" ) ) {
1347 return (elem.attributes.value || {}).specified ? elem.value : elem.text;
1348 }
1349
1350 // We need to handle select boxes special
1351 if ( jQuery.nodeName( elem, "select" ) ) {
1352 var index = elem.selectedIndex,
1353 values = [],
1354 options = elem.options,
1355 one = elem.type === "select-one";
1356
1357 // Nothing was selected
1358 if ( index < 0 ) {
1359 return null;
1360 }
1361
1362 // Loop through all the selected options
1363 for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
1364 var option = options[ i ];
1365
1366 if ( option.selected ) {
1367 // Get the specifc value for the option
1368 value = jQuery(option).val();
1369
1370 // We don't need an array for one selects
1371 if ( one ) {
1372 return value;
1373 }
1374
1375 // Multi-Selects return an array
1376 values.push( value );
1377 }
1378 }
1379
1380 return values;
1381 }
1382
1383 // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
1384 if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
1385 return elem.getAttribute("value") === null ? "on" : elem.value;
1386 }
1387
1388
1389 // Everything else, we just grab the value
1390 return (elem.value || "").replace(rreturn, "");
1391
1392 }
1393
1394 return undefined;
1395 }
1396
1397 var isFunction = jQuery.isFunction(value);
1398
1399 return this.each(function(i) {
1400 var self = jQuery(this), val = value;
1401
1402 if ( this.nodeType !== 1 ) {
1403 return;
1404 }
1405
1406 if ( isFunction ) {
1407 val = value.call(this, i, self.val());
1408 }
1409
1410 // Typecast each time if the value is a Function and the appended
1411 // value is therefore different each time.
1412 if ( typeof val === "number" ) {
1413 val += "";
1414 }
1415
1416 if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
1417 this.checked = jQuery.inArray( self.val(), val ) >= 0;
1418
1419 } else if ( jQuery.nodeName( this, "select" ) ) {
1420 var values = jQuery.makeArray(val);
1421
1422 jQuery( "option", this ).each(function() {
1423 this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
1424 });
1425
1426 if ( !values.length ) {
1427 this.selectedIndex = -1;
1428 }
1429
1430 } else {
1431 this.value = val;
1432 }
1433 });
1434 }
1435 });
1436
1437 jQuery.extend({
1438 attrFn: {
1439 val: true,
1440 css: true,
1441 html: true,
1442 text: true,
1443 data: true,
1444 width: true,
1445 height: true,
1446 offset: true
1447 },
1448
1449 attr: function( elem, name, value, pass ) {
1450 // don't set attributes on text and comment nodes
1451 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
1452 return undefined;
1453 }
1454
1455 if ( pass && name in jQuery.attrFn ) {
1456 return jQuery(elem)[name](value);
1457 }
1458
1459 var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
1460 // Whether we are setting (or getting)
1461 set = value !== undefined;
1462
1463 // Try to normalize/fix the name
1464 name = notxml && jQuery.props[ name ] || name;
1465
1466 // Only do all the following if this is a node (faster for style)
1467 if ( elem.nodeType === 1 ) {
1468 // These attributes require special treatment
1469 var special = rspecialurl.test( name );
1470
1471 // Safari mis-reports the default selected property of an option
1472 // Accessing the parent's selectedIndex property fixes it
1473 if ( name === "selected" && !jQuery.support.optSelected ) {
1474 var parent = elem.parentNode;
1475 if ( parent ) {
1476 parent.selectedIndex;
1477
1478 // Make sure that it also works with optgroups, see #5701
1479 if ( parent.parentNode ) {
1480 parent.parentNode.selectedIndex;
1481 }
1482 }
1483 }
1484
1485 // If applicable, access the attribute via the DOM 0 way
1486 if ( name in elem && notxml && !special ) {
1487 if ( set ) {
1488 // We can't allow the type property to be changed (since it causes problems in IE)
1489 if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
1490 jQuery.error( "type property can't be changed" );
1491 }
1492
1493 elem[ name ] = value;
1494 }
1495
1496 // browsers index elements by id/name on forms, give priority to attributes.
1497 if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
1498 return elem.getAttributeNode( name ).nodeValue;
1499 }
1500
1501 // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
1502 // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
1503 if ( name === "tabIndex" ) {
1504 var attributeNode = elem.getAttributeNode( "tabIndex" );
1505
1506 return attributeNode && attributeNode.specified ?
1507 attributeNode.value :
1508 rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
1509 0 :
1510 undefined;
1511 }
1512
1513 return elem[ name ];
1514 }
1515
1516 if ( !jQuery.support.style && notxml && name === "style" ) {
1517 if ( set ) {
1518 elem.style.cssText = "" + value;
1519 }
1520
1521 return elem.style.cssText;
1522 }
1523
1524 if ( set ) {
1525 // convert the value to a string (all browsers do this but IE) see #1070
1526 elem.setAttribute( name, "" + value );
1527 }
1528
1529 var attr = !jQuery.support.hrefNormalized && notxml && special ?
1530 // Some attributes require a special call on IE
1531 elem.getAttribute( name, 2 ) :
1532 elem.getAttribute( name );
1533
1534 // Non-existent attributes return null, we normalize to undefined
1535 return attr === null ? undefined : attr;
1536 }
1537
1538 // elem is actually elem.style ... set the style
1539 // Using attr for specific style information is now deprecated. Use style instead.
1540 return jQuery.style( elem, name, value );
1541 }
1542 });
1543 var rnamespaces = /\.(.*)$/,
1544 fcleanup = function( nm ) {
1545 return nm.replace(/[^\w\s\.\|`]/g, function( ch ) {
1546 return "\\" + ch;
1547 });
1548 };
1549
1550 /*
1551 * A number of helper functions used for managing events.
1552 * Many of the ideas behind this code originated from
1553 * Dean Edwards' addEvent library.
1554 */
1555 jQuery.event = {
1556
1557 // Bind an event to an element
1558 // Original by Dean Edwards
1559 add: function( elem, types, handler, data ) {
1560 if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
1561 return;
1562 }
1563
1564 // For whatever reason, IE has trouble passing the window object
1565 // around, causing it to be cloned in the process
1566 if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) {
1567 elem = window;
1568 }
1569
1570 var handleObjIn, handleObj;
1571
1572 if ( handler.handler ) {
1573 handleObjIn = handler;
1574 handler = handleObjIn.handler;
1575 }
1576
1577 // Make sure that the function being executed has a unique ID
1578 if ( !handler.guid ) {
1579 handler.guid = jQuery.guid++;
1580 }
1581
1582 // Init the element's event structure
1583 var elemData = jQuery.data( elem );
1584
1585 // If no elemData is found then we must be trying to bind to one of the
1586 // banned noData elements
1587 if ( !elemData ) {
1588 return;
1589 }
1590
1591 var events = elemData.events = elemData.events || {},
1592 eventHandle = elemData.handle, eventHandle;
1593
1594 if ( !eventHandle ) {
1595 elemData.handle = eventHandle = function() {
1596 // Handle the second event of a trigger and when
1597 // an event is called after a page has unloaded
1598 return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
1599 jQuery.event.handle.apply( eventHandle.elem, arguments ) :
1600 undefined;
1601 };
1602 }
1603
1604 // Add elem as a property of the handle function
1605 // This is to prevent a memory leak with non-native events in IE.
1606 eventHandle.elem = elem;
1607
1608 // Handle multiple events separated by a space
1609 // jQuery(...).bind("mouseover mouseout", fn);
1610 types = types.split(" ");
1611
1612 var type, i = 0, namespaces;
1613
1614 while ( (type = types[ i++ ]) ) {
1615 handleObj = handleObjIn ?
1616 jQuery.extend({}, handleObjIn) :
1617 { handler: handler, data: data };
1618
1619 // Namespaced event handlers
1620 if ( type.indexOf(".") > -1 ) {
1621 namespaces = type.split(".");
1622 type = namespaces.shift();
1623 handleObj.namespace = namespaces.slice(0).sort().join(".");
1624
1625 } else {
1626 namespaces = [];
1627 handleObj.namespace = "";
1628 }
1629
1630 handleObj.type = type;
1631 handleObj.guid = handler.guid;
1632
1633 // Get the current list of functions bound to this event
1634 var handlers = events[ type ],
1635 special = jQuery.event.special[ type ] || {};
1636
1637 // Init the event handler queue
1638 if ( !handlers ) {
1639 handlers = events[ type ] = [];
1640
1641 // Check for a special event handler
1642 // Only use addEventListener/attachEvent if the special
1643 // events handler returns false
1644 if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
1645 // Bind the global event handler to the element
1646 if ( elem.addEventListener ) {
1647 elem.addEventListener( type, eventHandle, false );
1648
1649 } else if ( elem.attachEvent ) {
1650 elem.attachEvent( "on" + type, eventHandle );
1651 }
1652 }
1653 }
1654
1655 if ( special.add ) {
1656 special.add.call( elem, handleObj );
1657
1658 if ( !handleObj.handler.guid ) {
1659 handleObj.handler.guid = handler.guid;
1660 }
1661 }
1662
1663 // Add the function to the element's handler list
1664 handlers.push( handleObj );
1665
1666 // Keep track of which events have been used, for global triggering
1667 jQuery.event.global[ type ] = true;
1668 }
1669
1670 // Nullify elem to prevent memory leaks in IE
1671 elem = null;
1672 },
1673
1674 global: {},
1675
1676 // Detach an event or set of events from an element
1677 remove: function( elem, types, handler, pos ) {
1678 // don't do events on text and comment nodes
1679 if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
1680 return;
1681 }
1682
1683 var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
1684 elemData = jQuery.data( elem ),
1685 events = elemData && elemData.events;
1686
1687 if ( !elemData || !events ) {
1688 return;
1689 }
1690
1691 // types is actually an event object here
1692 if ( types && types.type ) {
1693 handler = types.handler;
1694 types = types.type;
1695 }
1696
1697 // Unbind all events for the element
1698 if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
1699 types = types || "";
1700
1701 for ( type in events ) {
1702 jQuery.event.remove( elem, type + types );
1703 }
1704
1705 return;
1706 }
1707
1708 // Handle multiple events separated by a space
1709 // jQuery(...).unbind("mouseover mouseout", fn);
1710 types = types.split(" ");
1711
1712 while ( (type = types[ i++ ]) ) {
1713 origType = type;
1714 handleObj = null;
1715 all = type.indexOf(".") < 0;
1716 namespaces = [];
1717
1718 if ( !all ) {
1719 // Namespaced event handlers
1720 namespaces = type.split(".");
1721 type = namespaces.shift();
1722
1723 namespace = new RegExp("(^|\\.)" +
1724 jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)")
1725 }
1726
1727 eventType = events[ type ];
1728
1729 if ( !eventType ) {
1730 continue;
1731 }
1732
1733 if ( !handler ) {
1734 for ( var j = 0; j < eventType.length; j++ ) {
1735 handleObj = eventType[ j ];
1736
1737 if ( all || namespace.test( handleObj.namespace ) ) {
1738 jQuery.event.remove( elem, origType, handleObj.handler, j );
1739 eventType.splice( j--, 1 );
1740 }
1741 }
1742
1743 continue;
1744 }
1745
1746 special = jQuery.event.special[ type ] || {};
1747
1748 for ( var j = pos || 0; j < eventType.length; j++ ) {
1749 handleObj = eventType[ j ];
1750
1751 if ( handler.guid === handleObj.guid ) {
1752 // remove the given handler for the given type
1753 if ( all || namespace.test( handleObj.namespace ) ) {
1754 if ( pos == null ) {
1755 eventType.splice( j--, 1 );
1756 }
1757
1758 if ( special.remove ) {
1759 special.remove.call( elem, handleObj );
1760 }
1761 }
1762
1763 if ( pos != null ) {
1764 break;
1765 }
1766 }
1767 }
1768
1769 // remove generic event handler if no more handlers exist
1770 if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
1771 if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
1772 removeEvent( elem, type, elemData.handle );
1773 }
1774
1775 ret = null;
1776 delete events[ type ];
1777 }
1778 }
1779
1780 // Remove the expando if it's no longer used
1781 if ( jQuery.isEmptyObject( events ) ) {
1782 var handle = elemData.handle;
1783 if ( handle ) {
1784 handle.elem = null;
1785 }
1786
1787 delete elemData.events;
1788 delete elemData.handle;
1789
1790 if ( jQuery.isEmptyObject( elemData ) ) {
1791 jQuery.removeData( elem );
1792 }
1793 }
1794 },
1795
1796 // bubbling is internal
1797 trigger: function( event, data, elem /*, bubbling */ ) {
1798 // Event object or event type
1799 var type = event.type || event,
1800 bubbling = arguments[3];
1801
1802 if ( !bubbling ) {
1803 event = typeof event === "object" ?
1804 // jQuery.Event object
1805 event[expando] ? event :
1806 // Object literal
1807 jQuery.extend( jQuery.Event(type), event ) :
1808 // Just the event type (string)
1809 jQuery.Event(type);
1810
1811 if ( type.indexOf("!") >= 0 ) {
1812 event.type = type = type.slice(0, -1);
1813 event.exclusive = true;
1814 }
1815
1816 // Handle a global trigger
1817 if ( !elem ) {
1818 // Don't bubble custom events when global (to avoid too much overhead)
1819 event.stopPropagation();
1820
1821 // Only trigger if we've ever bound an event for it
1822 if ( jQuery.event.global[ type ] ) {
1823 jQuery.each( jQuery.cache, function() {
1824 if ( this.events && this.events[type] ) {
1825 jQuery.event.trigger( event, data, this.handle.elem );
1826 }
1827 });
1828 }
1829 }
1830
1831 // Handle triggering a single element
1832
1833 // don't do events on text and comment nodes
1834 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
1835 return undefined;
1836 }
1837
1838 // Clean up in case it is reused
1839 event.result = undefined;
1840 event.target = elem;
1841
1842 // Clone the incoming data, if any
1843 data = jQuery.makeArray( data );
1844 data.unshift( event );
1845 }
1846
1847 event.currentTarget = elem;
1848
1849 // Trigger the event, it is assumed that "handle" is a function
1850 var handle = jQuery.data( elem, "handle" );
1851 if ( handle ) {
1852 handle.apply( elem, data );
1853 }
1854
1855 var parent = elem.parentNode || elem.ownerDocument;
1856
1857 // Trigger an inline bound script
1858 try {
1859 if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
1860 if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {
1861 event.result = false;
1862 }
1863 }
1864
1865 // prevent IE from throwing an error for some elements with some event types, see #3533
1866 } catch (e) {}
1867
1868 if ( !event.isPropagationStopped() && parent ) {
1869 jQuery.event.trigger( event, data, parent, true );
1870
1871 } else if ( !event.isDefaultPrevented() ) {
1872 var target = event.target, old,
1873 isClick = jQuery.nodeName(target, "a") && type === "click",
1874 special = jQuery.event.special[ type ] || {};
1875
1876 if ( (!special._default || special._default.call( elem, event ) === false) &&
1877 !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
1878
1879 try {
1880 if ( target[ type ] ) {
1881 // Make sure that we don't accidentally re-trigger the onFOO events
1882 old = target[ "on" + type ];
1883
1884 if ( old ) {
1885 target[ "on" + type ] = null;
1886 }
1887
1888 jQuery.event.triggered = true;
1889 target[ type ]();
1890 }
1891
1892 // prevent IE from throwing an error for some elements with some event types, see #3533
1893 } catch (e) {}
1894
1895 if ( old ) {
1896 target[ "on" + type ] = old;
1897 }
1898
1899 jQuery.event.triggered = false;
1900 }
1901 }
1902 },
1903
1904 handle: function( event ) {
1905 var all, handlers, namespaces, namespace, events;
1906
1907 event = arguments[0] = jQuery.event.fix( event || window.event );
1908 event.currentTarget = this;
1909
1910 // Namespaced event handlers
1911 all = event.type.indexOf(".") < 0 && !event.exclusive;
1912
1913 if ( !all ) {
1914 namespaces = event.type.split(".");
1915 event.type = namespaces.shift();
1916 namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)");
1917 }
1918
1919 var events = jQuery.data(this, "events"), handlers = events[ event.type ];
1920
1921 if ( events && handlers ) {
1922 // Clone the handlers to prevent manipulation
1923 handlers = handlers.slice(0);
1924
1925 for ( var j = 0, l = handlers.length; j < l; j++ ) {
1926 var handleObj = handlers[ j ];
1927
1928 // Filter the functions by class
1929 if ( all || namespace.test( handleObj.namespace ) ) {
1930 // Pass in a reference to the handler function itself
1931 // So that we can later remove it
1932 event.handler = handleObj.handler;
1933 event.data = handleObj.data;
1934 event.handleObj = handleObj;
1935
1936 var ret = handleObj.handler.apply( this, arguments );
1937
1938 if ( ret !== undefined ) {
1939 event.result = ret;
1940 if ( ret === false ) {
1941 event.preventDefault();
1942 event.stopPropagation();
1943 }
1944 }
1945
1946 if ( event.isImmediatePropagationStopped() ) {
1947 break;
1948 }
1949 }
1950 }
1951 }
1952
1953 return event.result;
1954 },
1955
1956 props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
1957
1958 fix: function( event ) {
1959 if ( event[ expando ] ) {
1960 return event;
1961 }
1962
1963 // store a copy of the original event object
1964 // and "clone" to set read-only properties
1965 var originalEvent = event;
1966 event = jQuery.Event( originalEvent );
1967
1968 for ( var i = this.props.length, prop; i; ) {
1969 prop = this.props[ --i ];
1970 event[ prop ] = originalEvent[ prop ];
1971 }
1972
1973 // Fix target property, if necessary
1974 if ( !event.target ) {
1975 event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
1976 }
1977
1978 // check if target is a textnode (safari)
1979 if ( event.target.nodeType === 3 ) {
1980 event.target = event.target.parentNode;
1981 }
1982
1983 // Add relatedTarget, if necessary
1984 if ( !event.relatedTarget && event.fromElement ) {
1985 event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
1986 }
1987
1988 // Calculate pageX/Y if missing and clientX/Y available
1989 if ( event.pageX == null && event.clientX != null ) {
1990 var doc = document.documentElement, body = document.body;
1991 event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
1992 event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
1993 }
1994
1995 // Add which for key events
1996 if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) {
1997 event.which = event.charCode || event.keyCode;
1998 }
1999
2000 // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
2001 if ( !event.metaKey && event.ctrlKey ) {
2002 event.metaKey = event.ctrlKey;
2003 }
2004
2005 // Add which for click: 1 === left; 2 === middle; 3 === right
2006 // Note: button is not normalized, so don't use it
2007 if ( !event.which && event.button !== undefined ) {
2008 event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
2009 }
2010
2011 return event;
2012 },
2013
2014 // Deprecated, use jQuery.guid instead
2015 guid: 1E8,
2016
2017 // Deprecated, use jQuery.proxy instead
2018 proxy: jQuery.proxy,
2019
2020 special: {
2021 ready: {
2022 // Make sure the ready event is setup
2023 setup: jQuery.bindReady,
2024 teardown: jQuery.noop
2025 },
2026
2027 live: {
2028 add: function( handleObj ) {
2029 jQuery.event.add( this, handleObj.origType, jQuery.extend({}, handleObj, {handler: liveHandler}) );
2030 },
2031
2032 remove: function( handleObj ) {
2033 var remove = true,
2034 type = handleObj.origType.replace(rnamespaces, "");
2035
2036 jQuery.each( jQuery.data(this, "events").live || [], function() {
2037 if ( type === this.origType.replace(rnamespaces, "") ) {
2038 remove = false;
2039 return false;
2040 }
2041 });
2042
2043 if ( remove ) {
2044 jQuery.event.remove( this, handleObj.origType, liveHandler );
2045 }
2046 }
2047
2048 },
2049
2050 beforeunload: {
2051 setup: function( data, namespaces, eventHandle ) {
2052 // We only want to do this special case on windows
2053 if ( this.setInterval ) {
2054 this.onbeforeunload = eventHandle;
2055 }
2056
2057 return false;
2058 },
2059 teardown: function( namespaces, eventHandle ) {
2060 if ( this.onbeforeunload === eventHandle ) {
2061 this.onbeforeunload = null;
2062 }
2063 }
2064 }
2065 }
2066 };
2067
2068 var removeEvent = document.removeEventListener ?
2069 function( elem, type, handle ) {
2070 elem.removeEventListener( type, handle, false );
2071 } :
2072 function( elem, type, handle ) {
2073 elem.detachEvent( "on" + type, handle );
2074 };
2075
2076 jQuery.Event = function( src ) {
2077 // Allow instantiation without the 'new' keyword
2078 if ( !this.preventDefault ) {
2079 return new jQuery.Event( src );
2080 }
2081
2082 // Event object
2083 if ( src && src.type ) {
2084 this.originalEvent = src;
2085 this.type = src.type;
2086 // Event type
2087 } else {
2088 this.type = src;
2089 }
2090
2091 // timeStamp is buggy for some events on Firefox(#3843)
2092 // So we won't rely on the native value
2093 this.timeStamp = now();
2094
2095 // Mark it as fixed
2096 this[ expando ] = true;
2097 };
2098
2099 function returnFalse() {
2100 return false;
2101 }
2102 function returnTrue() {
2103 return true;
2104 }
2105
2106 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
2107 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
2108 jQuery.Event.prototype = {
2109 preventDefault: function() {
2110 this.isDefaultPrevented = returnTrue;
2111
2112 var e = this.originalEvent;
2113 if ( !e ) {
2114 return;
2115 }
2116
2117 // if preventDefault exists run it on the original event
2118 if ( e.preventDefault ) {
2119 e.preventDefault();
2120 }
2121 // otherwise set the returnValue property of the original event to false (IE)
2122 e.returnValue = false;
2123 },
2124 stopPropagation: function() {
2125 this.isPropagationStopped = returnTrue;
2126
2127 var e = this.originalEvent;
2128 if ( !e ) {
2129 return;
2130 }
2131 // if stopPropagation exists run it on the original event
2132 if ( e.stopPropagation ) {
2133 e.stopPropagation();
2134 }
2135 // otherwise set the cancelBubble property of the original event to true (IE)
2136 e.cancelBubble = true;
2137 },
2138 stopImmediatePropagation: function() {
2139 this.isImmediatePropagationStopped = returnTrue;
2140 this.stopPropagation();
2141 },
2142 isDefaultPrevented: returnFalse,
2143 isPropagationStopped: returnFalse,
2144 isImmediatePropagationStopped: returnFalse
2145 };
2146
2147 // Checks if an event happened on an element within another element
2148 // Used in jQuery.event.special.mouseenter and mouseleave handlers
2149 var withinElement = function( event ) {
2150 // Check if mouse(over|out) are still within the same parent element
2151 var parent = event.relatedTarget;
2152
2153 // Firefox sometimes assigns relatedTarget a XUL element
2154 // which we cannot access the parentNode property of
2155 try {
2156 // Traverse up the tree
2157 while ( parent && parent !== this ) {
2158 parent = parent.parentNode;
2159 }
2160
2161 if ( parent !== this ) {
2162 // set the correct event type
2163 event.type = event.data;
2164
2165 // handle event if we actually just moused on to a non sub-element
2166 jQuery.event.handle.apply( this, arguments );
2167 }
2168
2169 // assuming we've left the element since we most likely mousedover a xul element
2170 } catch(e) { }
2171 },
2172
2173 // In case of event delegation, we only need to rename the event.type,
2174 // liveHandler will take care of the rest.
2175 delegate = function( event ) {
2176 event.type = event.data;
2177 jQuery.event.handle.apply( this, arguments );
2178 };
2179
2180 // Create mouseenter and mouseleave events
2181 jQuery.each({
2182 mouseenter: "mouseover",
2183 mouseleave: "mouseout"
2184 }, function( orig, fix ) {
2185 jQuery.event.special[ orig ] = {
2186 setup: function( data ) {
2187 jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
2188 },
2189 teardown: function( data ) {
2190 jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
2191 }
2192 };
2193 });
2194
2195 // submit delegation
2196 if ( !jQuery.support.submitBubbles ) {
2197
2198 jQuery.event.special.submit = {
2199 setup: function( data, namespaces ) {
2200 if ( this.nodeName.toLowerCase() !== "form" ) {
2201 jQuery.event.add(this, "click.specialSubmit", function( e ) {
2202 var elem = e.target, type = elem.type;
2203
2204 if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
2205 return trigger( "submit", this, arguments );
2206 }
2207 });
2208
2209 jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
2210 var elem = e.target, type = elem.type;
2211
2212 if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
2213 return trigger( "submit", this, arguments );
2214 }
2215 });
2216
2217 } else {
2218 return false;
2219 }
2220 },
2221
2222 teardown: function( namespaces ) {
2223 jQuery.event.remove( this, ".specialSubmit" );
2224 }
2225 };
2226
2227 }
2228
2229 // change delegation, happens here so we have bind.
2230 if ( !jQuery.support.changeBubbles ) {
2231
2232 var formElems = /textarea|input|select/i,
2233
2234 changeFilters,
2235
2236 getVal = function( elem ) {
2237 var type = elem.type, val = elem.value;
2238
2239 if ( type === "radio" || type === "checkbox" ) {
2240 val = elem.checked;
2241
2242 } else if ( type === "select-multiple" ) {
2243 val = elem.selectedIndex > -1 ?
2244 jQuery.map( elem.options, function( elem ) {
2245 return elem.selected;
2246 }).join("-") :
2247 "";
2248
2249 } else if ( elem.nodeName.toLowerCase() === "select" ) {
2250 val = elem.selectedIndex;
2251 }
2252
2253 return val;
2254 },
2255
2256 testChange = function testChange( e ) {
2257 var elem = e.target, data, val;
2258
2259 if ( !formElems.test( elem.nodeName ) || elem.readOnly ) {
2260 return;
2261 }
2262
2263 data = jQuery.data( elem, "_change_data" );
2264 val = getVal(elem);
2265
2266 // the current data will be also retrieved by beforeactivate
2267 if ( e.type !== "focusout" || elem.type !== "radio" ) {
2268 jQuery.data( elem, "_change_data", val );
2269 }
2270
2271 if ( data === undefined || val === data ) {
2272 return;
2273 }
2274
2275 if ( data != null || val ) {
2276 e.type = "change";
2277 return jQuery.event.trigger( e, arguments[1], elem );
2278 }
2279 };
2280
2281 jQuery.event.special.change = {
2282 filters: {
2283 focusout: testChange,
2284
2285 click: function( e ) {
2286 var elem = e.target, type = elem.type;
2287
2288 if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
2289 return testChange.call( this, e );
2290 }
2291 },
2292
2293 // Change has to be called before submit
2294 // Keydown will be called before keypress, which is used in submit-event delegation
2295 keydown: function( e ) {
2296 var elem = e.target, type = elem.type;
2297
2298 if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
2299 (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
2300 type === "select-multiple" ) {
2301 return testChange.call( this, e );
2302 }
2303 },
2304
2305 // Beforeactivate happens also before the previous element is blurred
2306 // with this event you can't trigger a change event, but you can store
2307 // information/focus[in] is not needed anymore
2308 beforeactivate: function( e ) {
2309 var elem = e.target;
2310 jQuery.data( elem, "_change_data", getVal(elem) );
2311 }
2312 },
2313
2314 setup: function( data, namespaces ) {
2315 if ( this.type === "file" ) {
2316 return false;
2317 }
2318
2319 for ( var type in changeFilters ) {
2320 jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
2321 }
2322
2323 return formElems.test( this.nodeName );
2324 },
2325
2326 teardown: function( namespaces ) {
2327 jQuery.event.remove( this, ".specialChange" );
2328
2329 return formElems.test( this.nodeName );
2330 }
2331 };
2332
2333 changeFilters = jQuery.event.special.change.filters;
2334 }
2335
2336 function trigger( type, elem, args ) {
2337 args[0].type = type;
2338 return jQuery.event.handle.apply( elem, args );
2339 }
2340
2341 // Create "bubbling" focus and blur events
2342 if ( document.addEventListener ) {
2343 jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
2344 jQuery.event.special[ fix ] = {
2345 setup: function() {
2346 this.addEventListener( orig, handler, true );
2347 },
2348 teardown: function() {
2349 this.removeEventListener( orig, handler, true );
2350 }
2351 };
2352
2353 function handler( e ) {
2354 e = jQuery.event.fix( e );
2355 e.type = fix;
2356 return jQuery.event.handle.call( this, e );
2357 }
2358 });
2359 }
2360
2361 jQuery.each(["bind", "one"], function( i, name ) {
2362 jQuery.fn[ name ] = function( type, data, fn ) {
2363 // Handle object literals
2364 if ( typeof type === "object" ) {
2365 for ( var key in type ) {
2366 this[ name ](key, data, type[key], fn);
2367 }
2368 return this;
2369 }
2370
2371 if ( jQuery.isFunction( data ) ) {
2372 fn = data;
2373 data = undefined;
2374 }
2375
2376 var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
2377 jQuery( this ).unbind( event, handler );
2378 return fn.apply( this, arguments );
2379 }) : fn;
2380
2381 if ( type === "unload" && name !== "one" ) {
2382 this.one( type, data, fn );
2383
2384 } else {
2385 for ( var i = 0, l = this.length; i < l; i++ ) {
2386 jQuery.event.add( this[i], type, handler, data );
2387 }
2388 }
2389
2390 return this;
2391 };
2392 });
2393
2394 jQuery.fn.extend({
2395 unbind: function( type, fn ) {
2396 // Handle object literals
2397 if ( typeof type === "object" && !type.preventDefault ) {
2398 for ( var key in type ) {
2399 this.unbind(key, type[key]);
2400 }
2401
2402 } else {
2403 for ( var i = 0, l = this.length; i < l; i++ ) {
2404 jQuery.event.remove( this[i], type, fn );
2405 }
2406 }
2407
2408 return this;
2409 },
2410
2411 delegate: function( selector, types, data, fn ) {
2412 return this.live( types, data, fn, selector );
2413 },
2414
2415 undelegate: function( selector, types, fn ) {
2416 if ( arguments.length === 0 ) {
2417 return this.unbind( "live" );
2418
2419 } else {
2420 return this.die( types, null, fn, selector );
2421 }
2422 },
2423
2424 trigger: function( type, data ) {
2425 return this.each(function() {
2426 jQuery.event.trigger( type, data, this );
2427 });
2428 },
2429
2430 triggerHandler: function( type, data ) {
2431 if ( this[0] ) {
2432 var event = jQuery.Event( type );
2433 event.preventDefault();
2434 event.stopPropagation();
2435 jQuery.event.trigger( event, data, this[0] );
2436 return event.result;
2437 }
2438 },
2439
2440 toggle: function( fn ) {
2441 // Save reference to arguments for access in closure
2442 var args = arguments, i = 1;
2443
2444 // link all the functions, so any of them can unbind this click handler
2445 while ( i < args.length ) {
2446 jQuery.proxy( fn, args[ i++ ] );
2447 }
2448
2449 return this.click( jQuery.proxy( fn, function( event ) {
2450 // Figure out which function to execute
2451 var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
2452 jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
2453
2454 // Make sure that clicks stop
2455 event.preventDefault();
2456
2457 // and execute the function
2458 return args[ lastToggle ].apply( this, arguments ) || false;
2459 }));
2460 },
2461
2462 hover: function( fnOver, fnOut ) {
2463 return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
2464 }
2465 });
2466
2467 var liveMap = {
2468 focus: "focusin",
2469 blur: "focusout",
2470 mouseenter: "mouseover",
2471 mouseleave: "mouseout"
2472 };
2473
2474 jQuery.each(["live", "die"], function( i, name ) {
2475 jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
2476 var type, i = 0, match, namespaces, preType,
2477 selector = origSelector || this.selector,
2478 context = origSelector ? this : jQuery( this.context );
2479
2480 if ( jQuery.isFunction( data ) ) {
2481 fn = data;
2482 data = undefined;
2483 }
2484
2485 types = (types || "").split(" ");
2486
2487 while ( (type = types[ i++ ]) != null ) {
2488 match = rnamespaces.exec( type );
2489 namespaces = "";
2490
2491 if ( match ) {
2492 namespaces = match[0];
2493 type = type.replace( rnamespaces, "" );
2494 }
2495
2496 if ( type === "hover" ) {
2497 types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
2498 continue;
2499 }
2500
2501 preType = type;
2502
2503 if ( type === "focus" || type === "blur" ) {
2504 types.push( liveMap[ type ] + namespaces );
2505 type = type + namespaces;
2506
2507 } else {
2508 type = (liveMap[ type ] || type) + namespaces;
2509 }
2510
2511 if ( name === "live" ) {
2512 // bind live handler
2513 context.each(function(){
2514 jQuery.event.add( this, liveConvert( type, selector ),
2515 { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
2516 });
2517
2518 } else {
2519 // unbind live handler
2520 context.unbind( liveConvert( type, selector ), fn );
2521 }
2522 }
2523
2524 return this;
2525 }
2526 });
2527
2528 function liveHandler( event ) {
2529 var stop, elems = [], selectors = [], args = arguments,
2530 related, match, handleObj, elem, j, i, l, data,
2531 events = jQuery.data( this, "events" );
2532
2533 // Make sure we avoid non-left-click bubbling in Firefox (#3861)
2534 if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) {
2535 return;
2536 }
2537
2538 event.liveFired = this;
2539
2540 var live = events.live.slice(0);
2541
2542 for ( j = 0; j < live.length; j++ ) {
2543 handleObj = live[j];
2544
2545 if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
2546 selectors.push( handleObj.selector );
2547
2548 } else {
2549 live.splice( j--, 1 );
2550 }
2551 }
2552
2553 match = jQuery( event.target ).closest( selectors, event.currentTarget );
2554
2555 for ( i = 0, l = match.length; i < l; i++ ) {
2556 for ( j = 0; j < live.length; j++ ) {
2557 handleObj = live[j];
2558
2559 if ( match[i].selector === handleObj.selector ) {
2560 elem = match[i].elem;
2561 related = null;
2562
2563 // Those two events require additional checking
2564 if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
2565 related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
2566 }
2567
2568 if ( !related || related !== elem ) {
2569 elems.push({ elem: elem, handleObj: handleObj });
2570 }
2571 }
2572 }
2573 }
2574
2575 for ( i = 0, l = elems.length; i < l; i++ ) {
2576 match = elems[i];
2577 event.currentTarget = match.elem;
2578 event.data = match.handleObj.data;
2579 event.handleObj = match.handleObj;
2580
2581 if ( match.handleObj.origHandler.apply( match.elem, args ) === false ) {
2582 stop = false;
2583 break;
2584 }
2585 }
2586
2587 return stop;
2588 }
2589
2590 function liveConvert( type, selector ) {
2591 return "live." + (type && type !== "*" ? type + "." : "") + selector.replace(/\./g, "`").replace(/ /g, "&");
2592 }
2593
2594 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
2595 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
2596 "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
2597
2598 // Handle event binding
2599 jQuery.fn[ name ] = function( fn ) {
2600 return fn ? this.bind( name, fn ) : this.trigger( name );
2601 };
2602
2603 if ( jQuery.attrFn ) {
2604 jQuery.attrFn[ name ] = true;
2605 }
2606 });
2607
2608 // Prevent memory leaks in IE
2609 // Window isn't included so as not to unbind existing unload events
2610 // More info:
2611 // - http://isaacschlueter.com/2006/10/msie-memory-leaks/
2612 if ( window.attachEvent && !window.addEventListener ) {
2613 window.attachEvent("onunload", function() {
2614 for ( var id in jQuery.cache ) {
2615 if ( jQuery.cache[ id ].handle ) {
2616 // Try/Catch is to handle iframes being unloaded, see #4280
2617 try {
2618 jQuery.event.remove( jQuery.cache[ id ].handle.elem );
2619 } catch(e) {}
2620 }
2621 }
2622 });
2623 }
2624 /*!
2625 * Sizzle CSS Selector Engine - v1.0
2626 * Copyright 2009, The Dojo Foundation
2627 * Released under the MIT, BSD, and GPL Licenses.
2628 * More information: http://sizzlejs.com/
2629 */
2630 (function(){
2631
2632 var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
2633 done = 0,
2634 toString = Object.prototype.toString,
2635 hasDuplicate = false,
2636 baseHasDuplicate = true;
2637
2638 // Here we check if the JavaScript engine is using some sort of
2639 // optimization where it does not always call our comparision
2640 // function. If that is the case, discard the hasDuplicate value.
2641 // Thus far that includes Google Chrome.
2642 [0, 0].sort(function(){
2643 baseHasDuplicate = false;
2644 return 0;
2645 });
2646
2647 var Sizzle = function(selector, context, results, seed) {
2648 results = results || [];
2649 var origContext = context = context || document;
2650
2651 if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
2652 return [];
2653 }
2654
2655 if ( !selector || typeof selector !== "string" ) {
2656 return results;
2657 }
2658
2659 var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context),
2660 soFar = selector;
2661
2662 // Reset the position of the chunker regexp (start from head)
2663 while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) {
2664 soFar = m[3];
2665
2666 parts.push( m[1] );
2667
2668 if ( m[2] ) {
2669 extra = m[3];
2670 break;
2671 }
2672 }
2673
2674 if ( parts.length > 1 && origPOS.exec( selector ) ) {
2675 if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
2676 set = posProcess( parts[0] + parts[1], context );
2677 } else {
2678 set = Expr.relative[ parts[0] ] ?
2679 [ context ] :
2680 Sizzle( parts.shift(), context );
2681
2682 while ( parts.length ) {
2683 selector = parts.shift();
2684
2685 if ( Expr.relative[ selector ] ) {
2686 selector += parts.shift();
2687 }
2688
2689 set = posProcess( selector, set );
2690 }
2691 }
2692 } else {
2693 // Take a shortcut and set the context if the root selector is an ID
2694 // (but not if it'll be faster if the inner selector is an ID)
2695 if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
2696 Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
2697 var ret = Sizzle.find( parts.shift(), context, contextXML );
2698 context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
2699 }
2700
2701 if ( context ) {
2702 var ret = seed ?
2703 { expr: parts.pop(), set: makeArray(seed) } :
2704 Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
2705 set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
2706
2707 if ( parts.length > 0 ) {
2708 checkSet = makeArray(set);
2709 } else {
2710 prune = false;
2711 }
2712
2713 while ( parts.length ) {
2714 var cur = parts.pop(), pop = cur;
2715
2716 if ( !Expr.relative[ cur ] ) {
2717 cur = "";
2718 } else {
2719 pop = parts.pop();
2720 }
2721
2722 if ( pop == null ) {
2723 pop = context;
2724 }
2725
2726 Expr.relative[ cur ]( checkSet, pop, contextXML );
2727 }
2728 } else {
2729 checkSet = parts = [];
2730 }
2731 }
2732
2733 if ( !checkSet ) {
2734 checkSet = set;
2735 }
2736
2737 if ( !checkSet ) {
2738 Sizzle.error( cur || selector );
2739 }
2740
2741 if ( toString.call(checkSet) === "[object Array]" ) {
2742 if ( !prune ) {
2743 results.push.apply( results, checkSet );
2744 } else if ( context && context.nodeType === 1 ) {
2745 for ( var i = 0; checkSet[i] != null; i++ ) {
2746 if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
2747 results.push( set[i] );
2748 }
2749 }
2750 } else {
2751 for ( var i = 0; checkSet[i] != null; i++ ) {
2752 if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
2753 results.push( set[i] );
2754 }
2755 }
2756 }
2757 } else {
2758 makeArray( checkSet, results );
2759 }
2760
2761 if ( extra ) {
2762 Sizzle( extra, origContext, results, seed );
2763 Sizzle.uniqueSort( results );
2764 }
2765
2766 return results;
2767 };
2768
2769 Sizzle.uniqueSort = function(results){
2770 if ( sortOrder ) {
2771 hasDuplicate = baseHasDuplicate;
2772 results.sort(sortOrder);
2773
2774 if ( hasDuplicate ) {
2775 for ( var i = 1; i < results.length; i++ ) {
2776 if ( results[i] === results[i-1] ) {
2777 results.splice(i--, 1);
2778 }
2779 }
2780 }
2781 }
2782
2783 return results;
2784 };
2785
2786 Sizzle.matches = function(expr, set){
2787 return Sizzle(expr, null, null, set);
2788 };
2789
2790 Sizzle.find = function(expr, context, isXML){
2791 var set, match;
2792
2793 if ( !expr ) {
2794 return [];
2795 }
2796
2797 for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
2798 var type = Expr.order[i], match;
2799
2800 if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
2801 var left = match[1];
2802 match.splice(1,1);
2803
2804 if ( left.substr( left.length - 1 ) !== "\\" ) {
2805 match[1] = (match[1] || "").replace(/\\/g, "");
2806 set = Expr.find[ type ]( match, context, isXML );
2807 if ( set != null ) {
2808 expr = expr.replace( Expr.match[ type ], "" );
2809 break;
2810 }
2811 }
2812 }
2813 }
2814
2815 if ( !set ) {
2816 set = context.getElementsByTagName("*");
2817 }
2818
2819 return {set: set, expr: expr};
2820 };
2821
2822 Sizzle.filter = function(expr, set, inplace, not){
2823 var old = expr, result = [], curLoop = set, match, anyFound,
2824 isXMLFilter = set && set[0] && isXML(set[0]);
2825
2826 while ( expr && set.length ) {
2827 for ( var type in Expr.filter ) {
2828 if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
2829 var filter = Expr.filter[ type ], found, item, left = match[1];
2830 anyFound = false;
2831
2832 match.splice(1,1);
2833
2834 if ( left.substr( left.length - 1 ) === "\\" ) {
2835 continue;
2836 }
2837
2838 if ( curLoop === result ) {
2839 result = [];
2840 }
2841
2842 if ( Expr.preFilter[ type ] ) {
2843 match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
2844
2845 if ( !match ) {
2846 anyFound = found = true;
2847 } else if ( match === true ) {
2848 continue;
2849 }
2850 }
2851
2852 if ( match ) {
2853 for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
2854 if ( item ) {
2855 found = filter( item, match, i, curLoop );
2856 var pass = not ^ !!found;
2857
2858 if ( inplace && found != null ) {
2859 if ( pass ) {
2860 anyFound = true;
2861 } else {
2862 curLoop[i] = false;
2863 }
2864 } else if ( pass ) {
2865 result.push( item );
2866 anyFound = true;
2867 }
2868 }
2869 }
2870 }
2871
2872 if ( found !== undefined ) {
2873 if ( !inplace ) {
2874 curLoop = result;
2875 }
2876
2877 expr = expr.replace( Expr.match[ type ], "" );
2878
2879 if ( !anyFound ) {
2880 return [];
2881 }
2882
2883 break;
2884 }
2885 }
2886 }
2887
2888 // Improper expression
2889 if ( expr === old ) {
2890 if ( anyFound == null ) {
2891 Sizzle.error( expr );
2892 } else {
2893 break;
2894 }
2895 }
2896
2897 old = expr;
2898 }
2899
2900 return curLoop;
2901 };
2902
2903 Sizzle.error = function( msg ) {
2904 throw "Syntax error, unrecognized expression: " + msg;
2905 };
2906
2907 var Expr = Sizzle.selectors = {
2908 order: [ "ID", "NAME", "TAG" ],
2909 match: {
2910 ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
2911 CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
2912 NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,
2913 ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
2914 TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,
2915 CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
2916 POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
2917 PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
2918 },
2919 leftMatch: {},
2920 attrMap: {
2921 "class": "className",
2922 "for": "htmlFor"
2923 },
2924 attrHandle: {
2925 href: function(elem){
2926 return elem.getAttribute("href");
2927 }
2928 },
2929 relative: {
2930 "+": function(checkSet, part){
2931 var isPartStr = typeof part === "string",
2932 isTag = isPartStr && !/\W/.test(part),
2933 isPartStrNotTag = isPartStr && !isTag;
2934
2935 if ( isTag ) {
2936 part = part.toLowerCase();
2937 }
2938
2939 for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
2940 if ( (elem = checkSet[i]) ) {
2941 while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
2942
2943 checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
2944 elem || false :
2945 elem === part;
2946 }
2947 }
2948
2949 if ( isPartStrNotTag ) {
2950 Sizzle.filter( part, checkSet, true );
2951 }
2952 },
2953 ">": function(checkSet, part){
2954 var isPartStr = typeof part === "string";
2955
2956 if ( isPartStr && !/\W/.test(part) ) {
2957 part = part.toLowerCase();
2958
2959 for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2960 var elem = checkSet[i];
2961 if ( elem ) {
2962 var parent = elem.parentNode;
2963 checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
2964 }
2965 }
2966 } else {
2967 for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2968 var elem = checkSet[i];
2969 if ( elem ) {
2970 checkSet[i] = isPartStr ?
2971 elem.parentNode :
2972 elem.parentNode === part;
2973 }
2974 }
2975
2976 if ( isPartStr ) {
2977 Sizzle.filter( part, checkSet, true );
2978 }
2979 }
2980 },
2981 "": function(checkSet, part, isXML){
2982 var doneName = done++, checkFn = dirCheck;
2983
2984 if ( typeof part === "string" && !/\W/.test(part) ) {
2985 var nodeCheck = part = part.toLowerCase();
2986 checkFn = dirNodeCheck;
2987 }
2988
2989 checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
2990 },
2991 "~": function(checkSet, part, isXML){
2992 var doneName = done++, checkFn = dirCheck;
2993
2994 if ( typeof part === "string" && !/\W/.test(part) ) {
2995 var nodeCheck = part = part.toLowerCase();
2996 checkFn = dirNodeCheck;
2997 }
2998
2999 checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
3000 }
3001 },
3002 find: {
3003 ID: function(match, context, isXML){
3004 if ( typeof context.getElementById !== "undefined" && !isXML ) {
3005 var m = context.getElementById(match[1]);
3006 return m ? [m] : [];
3007 }
3008 },
3009 NAME: function(match, context){
3010 if ( typeof context.getElementsByName !== "undefined" ) {
3011 var ret = [], results = context.getElementsByName(match[1]);
3012
3013 for ( var i = 0, l = results.length; i < l; i++ ) {
3014 if ( results[i].getAttribute("name") === match[1] ) {
3015 ret.push( results[i] );
3016 }
3017 }
3018
3019 return ret.length === 0 ? null : ret;
3020 }
3021 },
3022 TAG: function(match, context){
3023 return context.getElementsByTagName(match[1]);
3024 }
3025 },
3026 preFilter: {
3027 CLASS: function(match, curLoop, inplace, result, not, isXML){
3028 match = " " + match[1].replace(/\\/g, "") + " ";
3029
3030 if ( isXML ) {
3031 return match;
3032 }
3033
3034 for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
3035 if ( elem ) {
3036 if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) {
3037 if ( !inplace ) {
3038 result.push( elem );
3039 }
3040 } else if ( inplace ) {
3041 curLoop[i] = false;
3042 }
3043 }
3044 }
3045
3046 return false;
3047 },
3048 ID: function(match){
3049 return match[1].replace(/\\/g, "");
3050 },
3051 TAG: function(match, curLoop){
3052 return match[1].toLowerCase();
3053 },
3054 CHILD: function(match){
3055 if ( match[1] === "nth" ) {
3056 // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
3057 var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
3058 match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
3059 !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
3060
3061 // calculate the numbers (first)n+(last) including if they are negative
3062 match[2] = (test[1] + (test[2] || 1)) - 0;
3063 match[3] = test[3] - 0;
3064 }
3065
3066 // TODO: Move to normal caching system
3067 match[0] = done++;
3068
3069 return match;
3070 },
3071 ATTR: function(match, curLoop, inplace, result, not, isXML){
3072 var name = match[1].replace(/\\/g, "");
3073
3074 if ( !isXML && Expr.attrMap[name] ) {
3075 match[1] = Expr.attrMap[name];
3076 }
3077
3078 if ( match[2] === "~=" ) {
3079 match[4] = " " + match[4] + " ";
3080 }
3081
3082 return match;
3083 },
3084 PSEUDO: function(match, curLoop, inplace, result, not){
3085 if ( match[1] === "not" ) {
3086 // If we're dealing with a complex expression, or a simple one
3087 if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
3088 match[3] = Sizzle(match[3], null, null, curLoop);
3089 } else {
3090 var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
3091 if ( !inplace ) {
3092 result.push.apply( result, ret );
3093 }
3094 return false;
3095 }
3096 } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
3097 return true;
3098 }
3099
3100 return match;
3101 },
3102 POS: function(match){
3103 match.unshift( true );
3104 return match;
3105 }
3106 },
3107 filters: {
3108 enabled: function(elem){
3109 return elem.disabled === false && elem.type !== "hidden";
3110 },
3111 disabled: function(elem){
3112 return elem.disabled === true;
3113 },
3114 checked: function(elem){
3115 return elem.checked === true;
3116 },
3117 selected: function(elem){
3118 // Accessing this property makes selected-by-default
3119 // options in Safari work properly
3120 elem.parentNode.selectedIndex;
3121 return elem.selected === true;
3122 },
3123 parent: function(elem){
3124 return !!elem.firstChild;
3125 },
3126 empty: function(elem){
3127 return !elem.firstChild;
3128 },
3129 has: function(elem, i, match){
3130 return !!Sizzle( match[3], elem ).length;
3131 },
3132 header: function(elem){
3133 return /h\d/i.test( elem.nodeName );
3134 },
3135 text: function(elem){
3136 return "text" === elem.type;
3137 },
3138 radio: function(elem){
3139 return "radio" === elem.type;
3140 },
3141 checkbox: function(elem){
3142 return "checkbox" === elem.type;
3143 },
3144 file: function(elem){
3145 return "file" === elem.type;
3146 },
3147 password: function(elem){
3148 return "password" === elem.type;
3149 },
3150 submit: function(elem){
3151 return "submit" === elem.type;
3152 },
3153 image: function(elem){
3154 return "image" === elem.type;
3155 },
3156 reset: function(elem){
3157 return "reset" === elem.type;
3158 },
3159 button: function(elem){
3160 return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
3161 },
3162 input: function(elem){
3163 return /input|select|textarea|button/i.test(elem.nodeName);
3164 }
3165 },
3166 setFilters: {
3167 first: function(elem, i){
3168 return i === 0;
3169 },
3170 last: function(elem, i, match, array){
3171 return i === array.length - 1;
3172 },
3173 even: function(elem, i){
3174 return i % 2 === 0;
3175 },
3176 odd: function(elem, i){
3177 return i % 2 === 1;
3178 },
3179 lt: function(elem, i, match){
3180 return i < match[3] - 0;
3181 },
3182 gt: function(elem, i, match){
3183 return i > match[3] - 0;
3184 },
3185 nth: function(elem, i, match){
3186 return match[3] - 0 === i;
3187 },
3188 eq: function(elem, i, match){
3189 return match[3] - 0 === i;
3190 }
3191 },
3192 filter: {
3193 PSEUDO: function(elem, match, i, array){
3194 var name = match[1], filter = Expr.filters[ name ];
3195
3196 if ( filter ) {
3197 return filter( elem, i, match, array );
3198 } else if ( name === "contains" ) {
3199 return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
3200 } else if ( name === "not" ) {
3201 var not = match[3];
3202
3203 for ( var i = 0, l = not.length; i < l; i++ ) {
3204 if ( not[i] === elem ) {
3205 return false;
3206 }
3207 }
3208
3209 return true;
3210 } else {
3211 Sizzle.error( "Syntax error, unrecognized expression: " + name );
3212 }
3213 },
3214 CHILD: function(elem, match){
3215 var type = match[1], node = elem;
3216 switch (type) {
3217 case 'only':
3218 case 'first':
3219 while ( (node = node.previousSibling) ) {
3220 if ( node.nodeType === 1 ) {
3221 return false;
3222 }
3223 }
3224 if ( type === "first" ) {
3225 return true;
3226 }
3227 node = elem;
3228 case 'last':
3229 while ( (node = node.nextSibling) ) {
3230 if ( node.nodeType === 1 ) {
3231 return false;
3232 }
3233 }
3234 return true;
3235 case 'nth':
3236 var first = match[2], last = match[3];
3237
3238 if ( first === 1 && last === 0 ) {
3239 return true;
3240 }
3241
3242 var doneName = match[0],
3243 parent = elem.parentNode;
3244
3245 if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
3246 var count = 0;
3247 for ( node = parent.firstChild; node; node = node.nextSibling ) {
3248 if ( node.nodeType === 1 ) {
3249 node.nodeIndex = ++count;
3250 }
3251 }
3252 parent.sizcache = doneName;
3253 }
3254
3255 var diff = elem.nodeIndex - last;
3256 if ( first === 0 ) {
3257 return diff === 0;
3258 } else {
3259 return ( diff % first === 0 && diff / first >= 0 );
3260 }
3261 }
3262 },
3263 ID: function(elem, match){
3264 return elem.nodeType === 1 && elem.getAttribute("id") === match;
3265 },
3266 TAG: function(elem, match){
3267 return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
3268 },
3269 CLASS: function(elem, match){
3270 return (" " + (elem.className || elem.getAttribute("class")) + " ")
3271 .indexOf( match ) > -1;
3272 },
3273 ATTR: function(elem, match){
3274 var name = match[1],
3275 result = Expr.attrHandle[ name ] ?
3276 Expr.attrHandle[ name ]( elem ) :
3277 elem[ name ] != null ?
3278 elem[ name ] :
3279 elem.getAttribute( name ),
3280 value = result + "",
3281 type = match[2],
3282 check = match[4];
3283
3284 return result == null ?
3285 type === "!=" :
3286 type === "=" ?
3287 value === check :
3288 type === "*=" ?
3289 value.indexOf(check) >= 0 :
3290 type === "~=" ?
3291 (" " + value + " ").indexOf(check) >= 0 :
3292 !check ?
3293 value && result !== false :
3294 type === "!=" ?
3295 value !== check :
3296 type === "^=" ?
3297 value.indexOf(check) === 0 :
3298 type === "$=" ?
3299 value.substr(value.length - check.length) === check :
3300 type === "|=" ?
3301 value === check || value.substr(0, check.length + 1) === check + "-" :
3302 false;
3303 },
3304 POS: function(elem, match, i, array){
3305 var name = match[2], filter = Expr.setFilters[ name ];
3306
3307 if ( filter ) {
3308 return filter( elem, i, match, array );
3309 }
3310 }
3311 }
3312 };
3313
3314 var origPOS = Expr.match.POS;
3315
3316 for ( var type in Expr.match ) {
3317 Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
3318 Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, function(all, num){
3319 return "\\" + (num - 0 + 1);
3320 }));
3321 }
3322
3323 var makeArray = function(array, results) {
3324 array = Array.prototype.slice.call( array, 0 );
3325
3326 if ( results ) {
3327 results.push.apply( results, array );
3328 return results;
3329 }
3330
3331 return array;
3332 };
3333
3334 // Perform a simple check to determine if the browser is capable of
3335 // converting a NodeList to an array using builtin methods.
3336 // Also verifies that the returned array holds DOM nodes
3337 // (which is not the case in the Blackberry browser)
3338 try {
3339 Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
3340
3341 // Provide a fallback method if it does not work
3342 } catch(e){
3343 makeArray = function(array, results) {
3344 var ret = results || [];
3345
3346 if ( toString.call(array) === "[object Array]" ) {
3347 Array.prototype.push.apply( ret, array );
3348 } else {
3349 if ( typeof array.length === "number" ) {
3350 for ( var i = 0, l = array.length; i < l; i++ ) {
3351 ret.push( array[i] );
3352 }
3353 } else {
3354 for ( var i = 0; array[i]; i++ ) {
3355 ret.push( array[i] );
3356 }
3357 }
3358 }
3359
3360 return ret;
3361 };
3362 }
3363
3364 var sortOrder;
3365
3366 if ( document.documentElement.compareDocumentPosition ) {
3367 sortOrder = function( a, b ) {
3368 if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
3369 if ( a == b ) {
3370 hasDuplicate = true;
3371 }
3372 return a.compareDocumentPosition ? -1 : 1;
3373 }
3374
3375 var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
3376 if ( ret === 0 ) {
3377 hasDuplicate = true;
3378 }
3379 return ret;
3380 };
3381 } else if ( "sourceIndex" in document.documentElement ) {
3382 sortOrder = function( a, b ) {
3383 if ( !a.sourceIndex || !b.sourceIndex ) {
3384 if ( a == b ) {
3385 hasDuplicate = true;
3386 }
3387 return a.sourceIndex ? -1 : 1;
3388 }
3389
3390 var ret = a.sourceIndex - b.sourceIndex;
3391 if ( ret === 0 ) {
3392 hasDuplicate = true;
3393 }
3394 return ret;
3395 };
3396 } else if ( document.createRange ) {
3397 sortOrder = function( a, b ) {
3398 if ( !a.ownerDocument || !b.ownerDocument ) {
3399 if ( a == b ) {
3400 hasDuplicate = true;
3401 }
3402 return a.ownerDocument ? -1 : 1;
3403 }
3404
3405 var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
3406 aRange.setStart(a, 0);
3407 aRange.setEnd(a, 0);
3408 bRange.setStart(b, 0);
3409 bRange.setEnd(b, 0);
3410 var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
3411 if ( ret === 0 ) {
3412 hasDuplicate = true;
3413 }
3414 return ret;
3415 };
3416 }
3417
3418 // Utility function for retreiving the text value of an array of DOM nodes
3419 function getText( elems ) {
3420 var ret = "", elem;
3421
3422 for ( var i = 0; elems[i]; i++ ) {
3423 elem = elems[i];
3424
3425 // Get the text from text nodes and CDATA nodes
3426 if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
3427 ret += elem.nodeValue;
3428
3429 // Traverse everything else, except comment nodes
3430 } else if ( elem.nodeType !== 8 ) {
3431 ret += getText( elem.childNodes );
3432 }
3433 }
3434
3435 return ret;
3436 }
3437
3438 // Check to see if the browser returns elements by name when
3439 // querying by getElementById (and provide a workaround)
3440 (function(){
3441 // We're going to inject a fake input element with a specified name
3442 var form = document.createElement("div"),
3443 id = "script" + (new Date).getTime();
3444 form.innerHTML = "<a name='" + id + "'/>";
3445
3446 // Inject it into the root element, check its status, and remove it quickly
3447 var root = document.documentElement;
3448 root.insertBefore( form, root.firstChild );
3449
3450 // The workaround has to do additional checks after a getElementById
3451 // Which slows things down for other browsers (hence the branching)
3452 if ( document.getElementById( id ) ) {
3453 Expr.find.ID = function(match, context, isXML){
3454 if ( typeof context.getElementById !== "undefined" && !isXML ) {
3455 var m = context.getElementById(match[1]);
3456 return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
3457 }
3458 };
3459
3460 Expr.filter.ID = function(elem, match){
3461 var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
3462 return elem.nodeType === 1 && node && node.nodeValue === match;
3463 };
3464 }
3465
3466 root.removeChild( form );
3467 root = form = null; // release memory in IE
3468 })();
3469
3470 (function(){
3471 // Check to see if the browser returns only elements
3472 // when doing getElementsByTagName("*")
3473
3474 // Create a fake element
3475 var div = document.createElement("div");
3476 div.appendChild( document.createComment("") );
3477
3478 // Make sure no comments are found
3479 if ( div.getElementsByTagName("*").length > 0 ) {
3480 Expr.find.TAG = function(match, context){
3481 var results = context.getElementsByTagName(match[1]);
3482
3483 // Filter out possible comments
3484 if ( match[1] === "*" ) {
3485 var tmp = [];
3486
3487 for ( var i = 0; results[i]; i++ ) {
3488 if ( results[i].nodeType === 1 ) {
3489 tmp.push( results[i] );
3490 }
3491 }
3492
3493 results = tmp;
3494 }
3495
3496 return results;
3497 };
3498 }
3499
3500 // Check to see if an attribute returns normalized href attributes
3501 div.innerHTML = "<a href='#'></a>";
3502 if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
3503 div.firstChild.getAttribute("href") !== "#" ) {
3504 Expr.attrHandle.href = function(elem){
3505 return elem.getAttribute("href", 2);
3506 };
3507 }
3508
3509 div = null; // release memory in IE
3510 })();
3511
3512 if ( document.querySelectorAll ) {
3513 (function(){
3514 var oldSizzle = Sizzle, div = document.createElement("div");
3515 div.innerHTML = "<p class='TEST'></p>";
3516
3517 // Safari can't handle uppercase or unicode characters when
3518 // in quirks mode.
3519 if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
3520 return;
3521 }
3522
3523 Sizzle = function(query, context, extra, seed){
3524 context = context || document;
3525
3526 // Only use querySelectorAll on non-XML documents
3527 // (ID selectors don't work in non-HTML documents)
3528 if ( !seed && context.nodeType === 9 && !isXML(context) ) {
3529 try {
3530 return makeArray( context.querySelectorAll(query), extra );
3531 } catch(e){}
3532 }
3533
3534 return oldSizzle(query, context, extra, seed);
3535 };
3536
3537 for ( var prop in oldSizzle ) {
3538 Sizzle[ prop ] = oldSizzle[ prop ];
3539 }
3540
3541 div = null; // release memory in IE
3542 })();
3543 }
3544
3545 (function(){
3546 var div = document.createElement("div");
3547
3548 div.innerHTML = "<div class='test e'></div><div class='test'></div>";
3549
3550 // Opera can't find a second classname (in 9.6)
3551 // Also, make sure that getElementsByClassName actually exists
3552 if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
3553 return;
3554 }
3555
3556 // Safari caches class attributes, doesn't catch changes (in 3.2)
3557 div.lastChild.className = "e";
3558
3559 if ( div.getElementsByClassName("e").length === 1 ) {
3560 return;
3561 }
3562
3563 Expr.order.splice(1, 0, "CLASS");
3564 Expr.find.CLASS = function(match, context, isXML) {
3565 if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
3566 return context.getElementsByClassName(match[1]);
3567 }
3568 };
3569
3570 div = null; // release memory in IE
3571 })();
3572
3573 function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
3574 for ( var i = 0, l = checkSet.length; i < l; i++ ) {
3575 var elem = checkSet[i];
3576 if ( elem ) {
3577 elem = elem[dir];
3578 var match = false;
3579
3580 while ( elem ) {
3581 if ( elem.sizcache === doneName ) {
3582 match = checkSet[elem.sizset];
3583 break;
3584 }
3585
3586 if ( elem.nodeType === 1 && !isXML ){
3587 elem.sizcache = doneName;
3588 elem.sizset = i;
3589 }
3590
3591 if ( elem.nodeName.toLowerCase() === cur ) {
3592 match = elem;
3593 break;
3594 }
3595
3596 elem = elem[dir];
3597 }
3598
3599 checkSet[i] = match;
3600 }
3601 }
3602 }
3603
3604 function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
3605 for ( var i = 0, l = checkSet.length; i < l; i++ ) {
3606 var elem = checkSet[i];
3607 if ( elem ) {
3608 elem = elem[dir];
3609 var match = false;
3610
3611 while ( elem ) {
3612 if ( elem.sizcache === doneName ) {
3613 match = checkSet[elem.sizset];
3614 break;
3615 }
3616
3617 if ( elem.nodeType === 1 ) {
3618 if ( !isXML ) {
3619 elem.sizcache = doneName;
3620 elem.sizset = i;
3621 }
3622 if ( typeof cur !== "string" ) {
3623 if ( elem === cur ) {
3624 match = true;
3625 break;
3626 }
3627
3628 } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
3629 match = elem;
3630 break;
3631 }
3632 }
3633
3634 elem = elem[dir];
3635 }
3636
3637 checkSet[i] = match;
3638 }
3639 }
3640 }
3641
3642 var contains = document.compareDocumentPosition ? function(a, b){
3643 return !!(a.compareDocumentPosition(b) & 16);
3644 } : function(a, b){
3645 return a !== b && (a.contains ? a.contains(b) : true);
3646 };
3647
3648 var isXML = function(elem){
3649 // documentElement is verified for cases where it doesn't yet exist
3650 // (such as loading iframes in IE - #4833)
3651 var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
3652 return documentElement ? documentElement.nodeName !== "HTML" : false;
3653 };
3654
3655 var posProcess = function(selector, context){
3656 var tmpSet = [], later = "", match,
3657 root = context.nodeType ? [context] : context;
3658
3659 // Position selectors must be done after the filter
3660 // And so must :not(positional) so we move all PSEUDOs to the end
3661 while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
3662 later += match[0];
3663 selector = selector.replace( Expr.match.PSEUDO, "" );
3664 }
3665
3666 selector = Expr.relative[selector] ? selector + "*" : selector;
3667
3668 for ( var i = 0, l = root.length; i < l; i++ ) {
3669 Sizzle( selector, root[i], tmpSet );
3670 }
3671
3672 return Sizzle.filter( later, tmpSet );
3673 };
3674
3675 // EXPOSE
3676 jQuery.find = Sizzle;
3677 jQuery.expr = Sizzle.selectors;
3678 jQuery.expr[":"] = jQuery.expr.filters;
3679 jQuery.unique = Sizzle.uniqueSort;
3680 jQuery.text = getText;
3681 jQuery.isXMLDoc = isXML;
3682 jQuery.contains = contains;
3683
3684 return;
3685
3686 window.Sizzle = Sizzle;
3687
3688 })();
3689 var runtil = /Until$/,
3690 rparentsprev = /^(?:parents|prevUntil|prevAll)/,
3691 // Note: This RegExp should be improved, or likely pulled from Sizzle
3692 rmultiselector = /,/,
3693 slice = Array.prototype.slice;
3694
3695 // Implement the identical functionality for filter and not
3696 var winnow = function( elements, qualifier, keep ) {
3697 if ( jQuery.isFunction( qualifier ) ) {
3698 return jQuery.grep(elements, function( elem, i ) {
3699 return !!qualifier.call( elem, i, elem ) === keep;
3700 });
3701
3702 } else if ( qualifier.nodeType ) {
3703 return jQuery.grep(elements, function( elem, i ) {
3704 return (elem === qualifier) === keep;
3705 });
3706
3707 } else if ( typeof qualifier === "string" ) {
3708 var filtered = jQuery.grep(elements, function( elem ) {
3709 return elem.nodeType === 1;
3710 });
3711
3712 if ( isSimple.test( qualifier ) ) {
3713 return jQuery.filter(qualifier, filtered, !keep);
3714 } else {
3715 qualifier = jQuery.filter( qualifier, filtered );
3716 }
3717 }
3718
3719 return jQuery.grep(elements, function( elem, i ) {
3720 return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
3721 });
3722 };
3723
3724 jQuery.fn.extend({
3725 find: function( selector ) {
3726 var ret = this.pushStack( "", "find", selector ), length = 0;
3727
3728 for ( var i = 0, l = this.length; i < l; i++ ) {
3729 length = ret.length;
3730 jQuery.find( selector, this[i], ret );
3731
3732 if ( i > 0 ) {
3733 // Make sure that the results are unique
3734 for ( var n = length; n < ret.length; n++ ) {
3735 for ( var r = 0; r < length; r++ ) {
3736 if ( ret[r] === ret[n] ) {
3737 ret.splice(n--, 1);
3738 break;
3739 }
3740 }
3741 }
3742 }
3743 }
3744
3745 return ret;
3746 },
3747
3748 has: function( target ) {
3749 var targets = jQuery( target );
3750 return this.filter(function() {
3751 for ( var i = 0, l = targets.length; i < l; i++ ) {
3752 if ( jQuery.contains( this, targets[i] ) ) {
3753 return true;
3754 }
3755 }
3756 });
3757 },
3758
3759 not: function( selector ) {
3760 return this.pushStack( winnow(this, selector, false), "not", selector);
3761 },
3762
3763 filter: function( selector ) {
3764 return this.pushStack( winnow(this, selector, true), "filter", selector );
3765 },
3766
3767 is: function( selector ) {
3768 return !!selector && jQuery.filter( selector, this ).length > 0;
3769 },
3770
3771 closest: function( selectors, context ) {
3772 if ( jQuery.isArray( selectors ) ) {
3773 var ret = [], cur = this[0], match, matches = {}, selector;
3774
3775 if ( cur && selectors.length ) {
3776 for ( var i = 0, l = selectors.length; i < l; i++ ) {
3777 selector = selectors[i];
3778
3779 if ( !matches[selector] ) {
3780 matches[selector] = jQuery.expr.match.POS.test( selector ) ?
3781 jQuery( selector, context || this.context ) :
3782 selector;
3783 }
3784 }
3785
3786 while ( cur && cur.ownerDocument && cur !== context ) {
3787 for ( selector in matches ) {
3788 match = matches[selector];
3789
3790 if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
3791 ret.push({ selector: selector, elem: cur });
3792 delete matches[selector];
3793 }
3794 }
3795 cur = cur.parentNode;
3796 }
3797 }
3798
3799 return ret;
3800 }
3801
3802 var pos = jQuery.expr.match.POS.test( selectors ) ?
3803 jQuery( selectors, context || this.context ) : null;
3804
3805 return this.map(function( i, cur ) {
3806 while ( cur && cur.ownerDocument && cur !== context ) {
3807 if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) {
3808 return cur;
3809 }
3810 cur = cur.parentNode;
3811 }
3812 return null;
3813 });
3814 },
3815
3816 // Determine the position of an element within
3817 // the matched set of elements
3818 index: function( elem ) {
3819 if ( !elem || typeof elem === "string" ) {
3820 return jQuery.inArray( this[0],
3821 // If it receives a string, the selector is used
3822 // If it receives nothing, the siblings are used
3823 elem ? jQuery( elem ) : this.parent().children() );
3824 }
3825 // Locate the position of the desired element
3826 return jQuery.inArray(
3827 // If it receives a jQuery object, the first element is used
3828 elem.jquery ? elem[0] : elem, this );
3829 },
3830
3831 add: function( selector, context ) {
3832 var set = typeof selector === "string" ?
3833 jQuery( selector, context || this.context ) :
3834 jQuery.makeArray( selector ),
3835 all = jQuery.merge( this.get(), set );
3836
3837 return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
3838 all :
3839 jQuery.unique( all ) );
3840 },
3841
3842 andSelf: function() {
3843 return this.add( this.prevObject );
3844 }
3845 });
3846
3847 // A painfully simple check to see if an element is disconnected
3848 // from a document (should be improved, where feasible).
3849 function isDisconnected( node ) {
3850 return !node || !node.parentNode || node.parentNode.nodeType === 11;
3851 }
3852
3853 jQuery.each({
3854 parent: function( elem ) {
3855 var parent = elem.parentNode;
3856 return parent && parent.nodeType !== 11 ? parent : null;
3857 },
3858 parents: function( elem ) {
3859 return jQuery.dir( elem, "parentNode" );
3860 },
3861 parentsUntil: function( elem, i, until ) {
3862 return jQuery.dir( elem, "parentNode", until );
3863 },
3864 next: function( elem ) {
3865 return jQuery.nth( elem, 2, "nextSibling" );
3866 },
3867 prev: function( elem ) {
3868 return jQuery.nth( elem, 2, "previousSibling" );
3869 },
3870 nextAll: function( elem ) {
3871 return jQuery.dir( elem, "nextSibling" );
3872 },
3873 prevAll: function( elem ) {
3874 return jQuery.dir( elem, "previousSibling" );
3875 },
3876 nextUntil: function( elem, i, until ) {
3877 return jQuery.dir( elem, "nextSibling", until );
3878 },
3879 prevUntil: function( elem, i, until ) {
3880 return jQuery.dir( elem, "previousSibling", until );
3881 },
3882 siblings: function( elem ) {
3883 return jQuery.sibling( elem.parentNode.firstChild, elem );
3884 },
3885 children: function( elem ) {
3886 return jQuery.sibling( elem.firstChild );
3887 },
3888 contents: function( elem ) {
3889 return jQuery.nodeName( elem, "iframe" ) ?
3890 elem.contentDocument || elem.contentWindow.document :
3891 jQuery.makeArray( elem.childNodes );
3892 }
3893 }, function( name, fn ) {
3894 jQuery.fn[ name ] = function( until, selector ) {
3895 var ret = jQuery.map( this, fn, until );
3896
3897 if ( !runtil.test( name ) ) {
3898 selector = until;
3899 }
3900
3901 if ( selector && typeof selector === "string" ) {
3902 ret = jQuery.filter( selector, ret );
3903 }
3904
3905 ret = this.length > 1 ? jQuery.unique( ret ) : ret;
3906
3907 if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
3908 ret = ret.reverse();
3909 }
3910
3911 return this.pushStack( ret, name, slice.call(arguments).join(",") );
3912 };
3913 });
3914
3915 jQuery.extend({
3916 filter: function( expr, elems, not ) {
3917 if ( not ) {
3918 expr = ":not(" + expr + ")";
3919 }
3920
3921 return jQuery.find.matches(expr, elems);
3922 },
3923
3924 dir: function( elem, dir, until ) {
3925 var matched = [], cur = elem[dir];
3926 while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
3927 if ( cur.nodeType === 1 ) {
3928 matched.push( cur );
3929 }
3930 cur = cur[dir];
3931 }
3932 return matched;
3933 },
3934
3935 nth: function( cur, result, dir, elem ) {
3936 result = result || 1;
3937 var num = 0;
3938
3939 for ( ; cur; cur = cur[dir] ) {
3940 if ( cur.nodeType === 1 && ++num === result ) {
3941 break;
3942 }
3943 }
3944
3945 return cur;
3946 },
3947
3948 sibling: function( n, elem ) {
3949 var r = [];
3950
3951 for ( ; n; n = n.nextSibling ) {
3952 if ( n.nodeType === 1 && n !== elem ) {
3953 r.push( n );
3954 }
3955 }
3956
3957 return r;
3958 }
3959 });
3960 var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
3961 rleadingWhitespace = /^\s+/,
3962 rxhtmlTag = /(<([\w:]+)[^>]*?)\/>/g,
3963 rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,
3964 rtagName = /<([\w:]+)/,
3965 rtbody = /<tbody/i,
3966 rhtml = /<|&#?\w+;/,
3967 rnocache = /<script|<object|<embed|<option|<style/i,
3968 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, // checked="checked" or checked (html5)
3969 fcloseTag = function( all, front, tag ) {
3970 return rselfClosing.test( tag ) ?
3971 all :
3972 front + "></" + tag + ">";
3973 },
3974 wrapMap = {
3975 option: [ 1, "<select multiple='multiple'>", "</select>" ],
3976 legend: [ 1, "<fieldset>", "</fieldset>" ],
3977 thead: [ 1, "<table>", "</table>" ],
3978 tr: [ 2, "<table><tbody>", "</tbody></table>" ],
3979 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
3980 col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
3981 area: [ 1, "<map>", "</map>" ],
3982 _default: [ 0, "", "" ]
3983 };
3984
3985 wrapMap.optgroup = wrapMap.option;
3986 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
3987 wrapMap.th = wrapMap.td;
3988
3989 // IE can't serialize <link> and <script> tags normally
3990 if ( !jQuery.support.htmlSerialize ) {
3991 wrapMap._default = [ 1, "div<div>", "</div>" ];
3992 }
3993
3994 jQuery.fn.extend({
3995 text: function( text ) {
3996 if ( jQuery.isFunction(text) ) {
3997 return this.each(function(i) {
3998 var self = jQuery(this);
3999 self.text( text.call(this, i, self.text()) );
4000 });
4001 }
4002
4003 if ( typeof text !== "object" && text !== undefined ) {
4004 return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
4005 }
4006
4007 return jQuery.text( this );
4008 },
4009
4010 wrapAll: function( html ) {
4011 if ( jQuery.isFunction( html ) ) {
4012 return this.each(function(i) {
4013 jQuery(this).wrapAll( html.call(this, i) );
4014 });
4015 }
4016
4017 if ( this[0] ) {
4018 // The elements to wrap the target around
4019 var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
4020
4021 if ( this[0].parentNode ) {
4022 wrap.insertBefore( this[0] );
4023 }
4024
4025 wrap.map(function() {
4026 var elem = this;
4027
4028 while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
4029 elem = elem.firstChild;
4030 }
4031
4032 return elem;
4033 }).append(this);
4034 }
4035
4036 return this;
4037 },
4038
4039 wrapInner: function( html ) {
4040 if ( jQuery.isFunction( html ) ) {
4041 return this.each(function(i) {
4042 jQuery(this).wrapInner( html.call(this, i) );
4043 });
4044 }
4045
4046 return this.each(function() {
4047 var self = jQuery( this ), contents = self.contents();
4048
4049 if ( contents.length ) {
4050 contents.wrapAll( html );
4051
4052 } else {
4053 self.append( html );
4054 }
4055 });
4056 },
4057
4058 wrap: function( html ) {
4059 return this.each(function() {
4060 jQuery( this ).wrapAll( html );
4061 });
4062 },
4063
4064 unwrap: function() {
4065 return this.parent().each(function() {
4066 if ( !jQuery.nodeName( this, "body" ) ) {
4067 jQuery( this ).replaceWith( this.childNodes );
4068 }
4069 }).end();
4070 },
4071
4072 append: function() {
4073 return this.domManip(arguments, true, function( elem ) {
4074 if ( this.nodeType === 1 ) {
4075 this.appendChild( elem );
4076 }
4077 });
4078 },
4079
4080 prepend: function() {
4081 return this.domManip(arguments, true, function( elem ) {
4082 if ( this.nodeType === 1 ) {
4083 this.insertBefore( elem, this.firstChild );
4084 }
4085 });
4086 },
4087
4088 before: function() {
4089 if ( this[0] && this[0].parentNode ) {
4090 return this.domManip(arguments, false, function( elem ) {
4091 this.parentNode.insertBefore( elem, this );
4092 });
4093 } else if ( arguments.length ) {
4094 var set = jQuery(arguments[0]);
4095 set.push.apply( set, this.toArray() );
4096 return this.pushStack( set, "before", arguments );
4097 }
4098 },
4099
4100 after: function() {
4101 if ( this[0] && this[0].parentNode ) {
4102 return this.domManip(arguments, false, function( elem ) {
4103 this.parentNode.insertBefore( elem, this.nextSibling );
4104 });
4105 } else if ( arguments.length ) {
4106 var set = this.pushStack( this, "after", arguments );
4107 set.push.apply( set, jQuery(arguments[0]).toArray() );
4108 return set;
4109 }
4110 },
4111
4112 // keepData is for internal use only--do not document
4113 remove: function( selector, keepData ) {
4114 for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
4115 if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
4116 if ( !keepData && elem.nodeType === 1 ) {
4117 jQuery.cleanData( elem.getElementsByTagName("*") );
4118 jQuery.cleanData( [ elem ] );
4119 }
4120
4121 if ( elem.parentNode ) {
4122 elem.parentNode.removeChild( elem );
4123 }
4124 }
4125 }
4126
4127 return this;
4128 },
4129
4130 empty: function() {
4131 for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
4132 // Remove element nodes and prevent memory leaks
4133 if ( elem.nodeType === 1 ) {
4134 jQuery.cleanData( elem.getElementsByTagName("*") );
4135 }
4136
4137 // Remove any remaining nodes
4138 while ( elem.firstChild ) {
4139 elem.removeChild( elem.firstChild );
4140 }
4141 }
4142
4143 return this;
4144 },
4145
4146 clone: function( events ) {
4147 // Do the clone
4148 var ret = this.map(function() {
4149 if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
4150 // IE copies events bound via attachEvent when
4151 // using cloneNode. Calling detachEvent on the
4152 // clone will also remove the events from the orignal
4153 // In order to get around this, we use innerHTML.
4154 // Unfortunately, this means some modifications to
4155 // attributes in IE that are actually only stored
4156 // as properties will not be copied (such as the
4157 // the name attribute on an input).
4158 var html = this.outerHTML, ownerDocument = this.ownerDocument;
4159 if ( !html ) {
4160 var div = ownerDocument.createElement("div");
4161 div.appendChild( this.cloneNode(true) );
4162 html = div.innerHTML;
4163 }
4164
4165 return jQuery.clean([html.replace(rinlinejQuery, "")
4166 // Handle the case in IE 8 where action=/test/> self-closes a tag
4167 .replace(/=([^="'>\s]+\/)>/g, '="$1">')
4168 .replace(rleadingWhitespace, "")], ownerDocument)[0];
4169 } else {
4170 return this.cloneNode(true);
4171 }
4172 });
4173
4174 // Copy the events from the original to the clone
4175 if ( events === true ) {
4176 cloneCopyEvent( this, ret );
4177 cloneCopyEvent( this.find("*"), ret.find("*") );
4178 }
4179
4180 // Return the cloned set
4181 return ret;
4182 },
4183
4184 html: function( value ) {
4185 if ( value === undefined ) {
4186 return this[0] && this[0].nodeType === 1 ?
4187 this[0].innerHTML.replace(rinlinejQuery, "") :
4188 null;
4189
4190 // See if we can take a shortcut and just use innerHTML
4191 } else if ( typeof value === "string" && !rnocache.test( value ) &&
4192 (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
4193 !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
4194
4195 value = value.replace(rxhtmlTag, fcloseTag);
4196
4197 try {
4198 for ( var i = 0, l = this.length; i < l; i++ ) {
4199 // Remove element nodes and prevent memory leaks
4200 if ( this[i].nodeType === 1 ) {
4201 jQuery.cleanData( this[i].getElementsByTagName("*") );
4202 this[i].innerHTML = value;
4203 }
4204 }
4205
4206 // If using innerHTML throws an exception, use the fallback method
4207 } catch(e) {
4208 this.empty().append( value );
4209 }
4210
4211 } else if ( jQuery.isFunction( value ) ) {
4212 this.each(function(i){
4213 var self = jQuery(this), old = self.html();
4214 self.empty().append(function(){
4215 return value.call( this, i, old );
4216 });
4217 });
4218
4219 } else {
4220 this.empty().append( value );
4221 }
4222
4223 return this;
4224 },
4225
4226 replaceWith: function( value ) {
4227 if ( this[0] && this[0].parentNode ) {
4228 // Make sure that the elements are removed from the DOM before they are inserted
4229 // this can help fix replacing a parent with child elements
4230 if ( jQuery.isFunction( value ) ) {
4231 return this.each(function(i) {
4232 var self = jQuery(this), old = self.html();
4233 self.replaceWith( value.call( this, i, old ) );
4234 });
4235 }
4236
4237 if ( typeof value !== "string" ) {
4238 value = jQuery(value).detach();
4239 }
4240
4241 return this.each(function() {
4242 var next = this.nextSibling, parent = this.parentNode;
4243
4244 jQuery(this).remove();
4245
4246 if ( next ) {
4247 jQuery(next).before( value );
4248 } else {
4249 jQuery(parent).append( value );
4250 }
4251 });
4252 } else {
4253 return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
4254 }
4255 },
4256
4257 detach: function( selector ) {
4258 return this.remove( selector, true );
4259 },
4260
4261 domManip: function( args, table, callback ) {
4262 var results, first, value = args[0], scripts = [], fragment, parent;
4263
4264 // We can't cloneNode fragments that contain checked, in WebKit
4265 if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
4266 return this.each(function() {
4267 jQuery(this).domManip( args, table, callback, true );
4268 });
4269 }
4270
4271 if ( jQuery.isFunction(value) ) {
4272 return this.each(function(i) {
4273 var self = jQuery(this);
4274 args[0] = value.call(this, i, table ? self.html() : undefined);
4275 self.domManip( args, table, callback );
4276 });
4277 }
4278
4279 if ( this[0] ) {
4280 parent = value && value.parentNode;
4281
4282 // If we're in a fragment, just use that instead of building a new one
4283 if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
4284 results = { fragment: parent };
4285
4286 } else {
4287 results = buildFragment( args, this, scripts );
4288 }
4289
4290 fragment = results.fragment;
4291
4292 if ( fragment.childNodes.length === 1 ) {
4293 first = fragment = fragment.firstChild;
4294 } else {
4295 first = fragment.firstChild;
4296 }
4297
4298 if ( first ) {
4299 table = table && jQuery.nodeName( first, "tr" );
4300
4301 for ( var i = 0, l = this.length; i < l; i++ ) {
4302 callback.call(
4303 table ?
4304 root(this[i], first) :
4305 this[i],
4306 i > 0 || results.cacheable || this.length > 1 ?
4307 fragment.cloneNode(true) :
4308 fragment
4309 );
4310 }
4311 }
4312
4313 if ( scripts.length ) {
4314 jQuery.each( scripts, evalScript );
4315 }
4316 }
4317
4318 return this;
4319
4320 function root( elem, cur ) {
4321 return jQuery.nodeName(elem, "table") ?
4322 (elem.getElementsByTagName("tbody")[0] ||
4323 elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
4324 elem;
4325 }
4326 }
4327 });
4328
4329 function cloneCopyEvent(orig, ret) {
4330 var i = 0;
4331
4332 ret.each(function() {
4333 if ( this.nodeName !== (orig[i] && orig[i].nodeName) ) {
4334 return;
4335 }
4336
4337 var oldData = jQuery.data( orig[i++] ), curData = jQuery.data( this, oldData ), events = oldData && oldData.events;
4338
4339 if ( events ) {
4340 delete curData.handle;
4341 curData.events = {};
4342
4343 for ( var type in events ) {
4344 for ( var handler in events[ type ] ) {
4345 jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
4346 }
4347 }
4348 }
4349 });
4350 }
4351
4352 function buildFragment( args, nodes, scripts ) {
4353 var fragment, cacheable, cacheresults,
4354 doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
4355
4356 // Only cache "small" (1/2 KB) strings that are associated with the main document
4357 // Cloning options loses the selected state, so don't cache them
4358 // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
4359 // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
4360 if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
4361 !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
4362
4363 cacheable = true;
4364 cacheresults = jQuery.fragments[ args[0] ];
4365 if ( cacheresults ) {
4366 if ( cacheresults !== 1 ) {
4367 fragment = cacheresults;
4368 }
4369 }
4370 }
4371
4372 if ( !fragment ) {
4373 fragment = doc.createDocumentFragment();
4374 jQuery.clean( args, doc, fragment, scripts );
4375 }
4376
4377 if ( cacheable ) {
4378 jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
4379 }
4380
4381 return { fragment: fragment, cacheable: cacheable };
4382 }
4383
4384 jQuery.fragments = {};
4385
4386 jQuery.each({
4387 appendTo: "append",
4388 prependTo: "prepend",
4389 insertBefore: "before",
4390 insertAfter: "after",
4391 replaceAll: "replaceWith"
4392 }, function( name, original ) {
4393 jQuery.fn[ name ] = function( selector ) {
4394 var ret = [], insert = jQuery( selector ),
4395 parent = this.length === 1 && this[0].parentNode;
4396
4397 if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
4398 insert[ original ]( this[0] );
4399 return this;
4400
4401 } else {
4402 for ( var i = 0, l = insert.length; i < l; i++ ) {
4403 var elems = (i > 0 ? this.clone(true) : this).get();
4404 jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
4405 ret = ret.concat( elems );
4406 }
4407
4408 return this.pushStack( ret, name, insert.selector );
4409 }
4410 };
4411 });
4412
4413 jQuery.extend({
4414 clean: function( elems, context, fragment, scripts ) {
4415 context = context || document;
4416
4417 // !context.createElement fails in IE with an error but returns typeof 'object'
4418 if ( typeof context.createElement === "undefined" ) {
4419 context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
4420 }
4421
4422 var ret = [];
4423
4424 for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
4425 if ( typeof elem === "number" ) {
4426 elem += "";
4427 }
4428
4429 if ( !elem ) {
4430 continue;
4431 }
4432
4433 // Convert html string into DOM nodes
4434 if ( typeof elem === "string" && !rhtml.test( elem ) ) {
4435 elem = context.createTextNode( elem );
4436
4437 } else if ( typeof elem === "string" ) {
4438 // Fix "XHTML"-style tags in all browsers
4439 elem = elem.replace(rxhtmlTag, fcloseTag);
4440
4441 // Trim whitespace, otherwise indexOf won't work as expected
4442 var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
4443 wrap = wrapMap[ tag ] || wrapMap._default,
4444 depth = wrap[0],
4445 div = context.createElement("div");
4446
4447 // Go to html and back, then peel off extra wrappers
4448 div.innerHTML = wrap[1] + elem + wrap[2];
4449
4450 // Move to the right depth
4451 while ( depth-- ) {
4452 div = div.lastChild;
4453 }
4454
4455 // Remove IE's autoinserted <tbody> from table fragments
4456 if ( !jQuery.support.tbody ) {
4457
4458 // String was a <table>, *may* have spurious <tbody>
4459 var hasBody = rtbody.test(elem),
4460 tbody = tag === "table" && !hasBody ?
4461 div.firstChild && div.firstChild.childNodes :
4462
4463 // String was a bare <thead> or <tfoot>
4464 wrap[1] === "<table>" && !hasBody ?
4465 div.childNodes :
4466 [];
4467
4468 for ( var j = tbody.length - 1; j >= 0 ; --j ) {
4469 if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
4470 tbody[ j ].parentNode.removeChild( tbody[ j ] );
4471 }
4472 }
4473
4474 }
4475
4476 // IE completely kills leading whitespace when innerHTML is used
4477 if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
4478 div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
4479 }
4480
4481 elem = div.childNodes;
4482 }
4483
4484 if ( elem.nodeType ) {
4485 ret.push( elem );
4486 } else {
4487 ret = jQuery.merge( ret, elem );
4488 }
4489 }
4490
4491 if ( fragment ) {
4492 for ( var i = 0; ret[i]; i++ ) {
4493 if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
4494 scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
4495
4496 } else {
4497 if ( ret[i].nodeType === 1 ) {
4498 ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
4499 }
4500 fragment.appendChild( ret[i] );
4501 }
4502 }
4503 }
4504
4505 return ret;
4506 },
4507
4508 cleanData: function( elems ) {
4509 var data, id, cache = jQuery.cache,
4510 special = jQuery.event.special,
4511 deleteExpando = jQuery.support.deleteExpando;
4512
4513 for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
4514 id = elem[ jQuery.expando ];
4515
4516 if ( id ) {
4517 data = cache[ id ];
4518
4519 if ( data.events ) {
4520 for ( var type in data.events ) {
4521 if ( special[ type ] ) {
4522 jQuery.event.remove( elem, type );
4523
4524 } else {
4525 removeEvent( elem, type, data.handle );
4526 }
4527 }
4528 }
4529
4530 if ( deleteExpando ) {
4531 delete elem[ jQuery.expando ];
4532
4533 } else if ( elem.removeAttribute ) {
4534 elem.removeAttribute( jQuery.expando );
4535 }
4536
4537 delete cache[ id ];
4538 }
4539 }
4540 }
4541 });
4542 // exclude the following css properties to add px
4543 var rexclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
4544 ralpha = /alpha\([^)]*\)/,
4545 ropacity = /opacity=([^)]*)/,
4546 rfloat = /float/i,
4547 rdashAlpha = /-([a-z])/ig,
4548 rupper = /([A-Z])/g,
4549 rnumpx = /^-?\d+(?:px)?$/i,
4550 rnum = /^-?\d/,
4551
4552 cssShow = { position: "absolute", visibility: "hidden", display:"block" },
4553 cssWidth = [ "Left", "Right" ],
4554 cssHeight = [ "Top", "Bottom" ],
4555
4556 // cache check for defaultView.getComputedStyle
4557 getComputedStyle = document.defaultView && document.defaultView.getComputedStyle,
4558 // normalize float css property
4559 styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat",
4560 fcamelCase = function( all, letter ) {
4561 return letter.toUpperCase();
4562 };
4563
4564 jQuery.fn.css = function( name, value ) {
4565 return access( this, name, value, true, function( elem, name, value ) {
4566 if ( value === undefined ) {
4567 return jQuery.curCSS( elem, name );
4568 }
4569
4570 if ( typeof value === "number" && !rexclude.test(name) ) {
4571 value += "px";
4572 }
4573
4574 jQuery.style( elem, name, value );
4575 });
4576 };
4577
4578 jQuery.extend({
4579 style: function( elem, name, value ) {
4580 // don't set styles on text and comment nodes
4581 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
4582 return undefined;
4583 }
4584
4585 // ignore negative width and height values #1599
4586 if ( (name === "width" || name === "height") && parseFloat(value) < 0 ) {
4587 value = undefined;
4588 }
4589
4590 var style = elem.style || elem, set = value !== undefined;
4591
4592 // IE uses filters for opacity
4593 if ( !jQuery.support.opacity && name === "opacity" ) {
4594 if ( set ) {
4595 // IE has trouble with opacity if it does not have layout
4596 // Force it by setting the zoom level
4597 style.zoom = 1;
4598
4599 // Set the alpha filter to set the opacity
4600 var opacity = parseInt( value, 10 ) + "" === "NaN" ? "" : "alpha(opacity=" + value * 100 + ")";
4601 var filter = style.filter || jQuery.curCSS( elem, "filter" ) || "";
4602 style.filter = ralpha.test(filter) ? filter.replace(ralpha, opacity) : opacity;
4603 }
4604
4605 return style.filter && style.filter.indexOf("opacity=") >= 0 ?
4606 (parseFloat( ropacity.exec(style.filter)[1] ) / 100) + "":
4607 "";
4608 }
4609
4610 // Make sure we're using the right name for getting the float value
4611 if ( rfloat.test( name ) ) {
4612 name = styleFloat;
4613 }
4614
4615 name = name.replace(rdashAlpha, fcamelCase);
4616
4617 if ( set ) {
4618 style[ name ] = value;
4619 }
4620
4621 return style[ name ];
4622 },
4623
4624 css: function( elem, name, force, extra ) {
4625 if ( name === "width" || name === "height" ) {
4626 var val, props = cssShow, which = name === "width" ? cssWidth : cssHeight;
4627
4628 function getWH() {
4629 val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
4630
4631 if ( extra === "border" ) {
4632 return;
4633 }
4634
4635 jQuery.each( which, function() {
4636 if ( !extra ) {
4637 val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
4638 }
4639
4640 if ( extra === "margin" ) {
4641 val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
4642 } else {
4643 val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
4644 }
4645 });
4646 }
4647
4648 if ( elem.offsetWidth !== 0 ) {
4649 getWH();
4650 } else {
4651 jQuery.swap( elem, props, getWH );
4652 }
4653
4654 return Math.max(0, Math.round(val));
4655 }
4656
4657 return jQuery.curCSS( elem, name, force );
4658 },
4659
4660 curCSS: function( elem, name, force ) {
4661 var ret, style = elem.style, filter;
4662
4663 // IE uses filters for opacity
4664 if ( !jQuery.support.opacity && name === "opacity" && elem.currentStyle ) {
4665 ret = ropacity.test(elem.currentStyle.filter || "") ?
4666 (parseFloat(RegExp.$1) / 100) + "" :
4667 "";
4668
4669 return ret === "" ?
4670 "1" :
4671 ret;
4672 }
4673
4674 // Make sure we're using the right name for getting the float value
4675 if ( rfloat.test( name ) ) {
4676 name = styleFloat;
4677 }
4678
4679 if ( !force && style && style[ name ] ) {
4680 ret = style[ name ];
4681
4682 } else if ( getComputedStyle ) {
4683
4684 // Only "float" is needed here
4685 if ( rfloat.test( name ) ) {
4686 name = "float";
4687 }
4688
4689 name = name.replace( rupper, "-$1" ).toLowerCase();
4690
4691 var defaultView = elem.ownerDocument.defaultView;
4692
4693 if ( !defaultView ) {
4694 return null;
4695 }
4696
4697 var computedStyle = defaultView.getComputedStyle( elem, null );
4698
4699 if ( computedStyle ) {
4700 ret = computedStyle.getPropertyValue( name );
4701 }
4702
4703 // We should always get a number back from opacity
4704 if ( name === "opacity" && ret === "" ) {
4705 ret = "1";
4706 }
4707
4708 } else if ( elem.currentStyle ) {
4709 var camelCase = name.replace(rdashAlpha, fcamelCase);
4710
4711 ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
4712
4713 // From the awesome hack by Dean Edwards
4714 // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
4715
4716 // If we're not dealing with a regular pixel number
4717 // but a number that has a weird ending, we need to convert it to pixels
4718 if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
4719 // Remember the original values
4720 var left = style.left, rsLeft = elem.runtimeStyle.left;
4721
4722 // Put in the new values to get a computed value out
4723 elem.runtimeStyle.left = elem.currentStyle.left;
4724 style.left = camelCase === "fontSize" ? "1em" : (ret || 0);
4725 ret = style.pixelLeft + "px";
4726
4727 // Revert the changed values
4728 style.left = left;
4729 elem.runtimeStyle.left = rsLeft;
4730 }
4731 }
4732
4733 return ret;
4734 },
4735
4736 // A method for quickly swapping in/out CSS properties to get correct calculations
4737 swap: function( elem, options, callback ) {
4738 var old = {};
4739
4740 // Remember the old values, and insert the new ones
4741 for ( var name in options ) {
4742 old[ name ] = elem.style[ name ];
4743 elem.style[ name ] = options[ name ];
4744 }
4745
4746 callback.call( elem );
4747
4748 // Revert the old values
4749 for ( var name in options ) {
4750 elem.style[ name ] = old[ name ];
4751 }
4752 }
4753 });
4754
4755 if ( jQuery.expr && jQuery.expr.filters ) {
4756 jQuery.expr.filters.hidden = function( elem ) {
4757 var width = elem.offsetWidth, height = elem.offsetHeight,
4758 skip = elem.nodeName.toLowerCase() === "tr";
4759
4760 return width === 0 && height === 0 && !skip ?
4761 true :
4762 width > 0 && height > 0 && !skip ?
4763 false :
4764 jQuery.curCSS(elem, "display") === "none";
4765 };
4766
4767 jQuery.expr.filters.visible = function( elem ) {
4768 return !jQuery.expr.filters.hidden( elem );
4769 };
4770 }
4771 var jsc = now(),
4772 rscript = /<script(.|\s)*?\/script>/gi,
4773 rselectTextarea = /select|textarea/i,
4774 rinput = /color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,
4775 jsre = /=\?(&|$)/,
4776 rquery = /\?/,
4777 rts = /(\?|&)_=.*?(&|$)/,
4778 rurl = /^(\w+:)?\/\/([^\/?#]+)/,
4779 r20 = /%20/g,
4780
4781 // Keep a copy of the old load method
4782 _load = jQuery.fn.load;
4783
4784 jQuery.fn.extend({
4785 load: function( url, params, callback ) {
4786 if ( typeof url !== "string" ) {
4787 return _load.call( this, url );
4788
4789 // Don't do a request if no elements are being requested
4790 } else if ( !this.length ) {
4791 return this;
4792 }
4793
4794 var off = url.indexOf(" ");
4795 if ( off >= 0 ) {
4796 var selector = url.slice(off, url.length);
4797 url = url.slice(0, off);
4798 }
4799
4800 // Default to a GET request
4801 var type = "GET";
4802
4803 // If the second parameter was provided
4804 if ( params ) {
4805 // If it's a function
4806 if ( jQuery.isFunction( params ) ) {
4807 // We assume that it's the callback
4808 callback = params;
4809 params = null;
4810
4811 // Otherwise, build a param string
4812 } else if ( typeof params === "object" ) {
4813 params = jQuery.param( params, jQuery.ajaxSettings.traditional );
4814 type = "POST";
4815 }
4816 }
4817
4818 var self = this;
4819
4820 // Request the remote document
4821 jQuery.ajax({
4822 url: url,
4823 type: type,
4824 dataType: "html",
4825 data: params,
4826 complete: function( res, status ) {
4827 // If successful, inject the HTML into all the matched elements
4828 if ( status === "success" || status === "notmodified" ) {
4829 // See if a selector was specified
4830 self.html( selector ?
4831 // Create a dummy div to hold the results
4832 jQuery("<div />")
4833 // inject the contents of the document in, removing the scripts
4834 // to avoid any 'Permission Denied' errors in IE
4835 .append(res.responseText.replace(rscript, ""))
4836
4837 // Locate the specified elements
4838 .find(selector) :
4839
4840 // If not, just inject the full result
4841 res.responseText );
4842 }
4843
4844 if ( callback ) {
4845 self.each( callback, [res.responseText, status, res] );
4846 }
4847 }
4848 });
4849
4850 return this;
4851 },
4852
4853 serialize: function() {
4854 return jQuery.param(this.serializeArray());
4855 },
4856 serializeArray: function() {
4857 return this.map(function() {
4858 return this.elements ? jQuery.makeArray(this.elements) : this;
4859 })
4860 .filter(function() {
4861 return this.name && !this.disabled &&
4862 (this.checked || rselectTextarea.test(this.nodeName) ||
4863 rinput.test(this.type));
4864 })
4865 .map(function( i, elem ) {
4866 var val = jQuery(this).val();
4867
4868 return val == null ?
4869 null :
4870 jQuery.isArray(val) ?
4871 jQuery.map( val, function( val, i ) {
4872 return { name: elem.name, value: val };
4873 }) :
4874 { name: elem.name, value: val };
4875 }).get();
4876 }
4877 });
4878
4879 // Attach a bunch of functions for handling common AJAX events
4880 jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function( i, o ) {
4881 jQuery.fn[o] = function( f ) {
4882 return this.bind(o, f);
4883 };
4884 });
4885
4886 jQuery.extend({
4887
4888 get: function( url, data, callback, type ) {
4889 // shift arguments if data argument was omited
4890 if ( jQuery.isFunction( data ) ) {
4891 type = type || callback;
4892 callback = data;
4893 data = null;
4894 }
4895
4896 return jQuery.ajax({
4897 type: "GET",
4898 url: url,
4899 data: data,
4900 success: callback,
4901 dataType: type
4902 });
4903 },
4904
4905 getScript: function( url, callback ) {
4906 return jQuery.get(url, null, callback, "script");
4907 },
4908
4909 getJSON: function( url, data, callback ) {
4910 return jQuery.get(url, data, callback, "json");
4911 },
4912
4913 post: function( url, data, callback, type ) {
4914 // shift arguments if data argument was omited
4915 if ( jQuery.isFunction( data ) ) {
4916 type = type || callback;
4917 callback = data;
4918 data = {};
4919 }
4920
4921 return jQuery.ajax({
4922 type: "POST",
4923 url: url,
4924 data: data,
4925 success: callback,
4926 dataType: type
4927 });
4928 },
4929
4930 ajaxSetup: function( settings ) {
4931 jQuery.extend( jQuery.ajaxSettings, settings );
4932 },
4933
4934 ajaxSettings: {
4935 url: location.href,
4936 global: true,
4937 type: "GET",
4938 contentType: "application/x-www-form-urlencoded",
4939 processData: true,
4940 async: true,
4941 /*
4942 timeout: 0,
4943 data: null,
4944 username: null,
4945 password: null,
4946 traditional: false,
4947 */
4948 // Create the request object; Microsoft failed to properly
4949 // implement the XMLHttpRequest in IE7 (can't request local files),
4950 // so we use the ActiveXObject when it is available
4951 // This function can be overriden by calling jQuery.ajaxSetup
4952 xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ?
4953 function() {
4954 return new window.XMLHttpRequest();
4955 } :
4956 function() {
4957 try {
4958 return new window.ActiveXObject("Microsoft.XMLHTTP");
4959 } catch(e) {}
4960 },
4961 accepts: {
4962 xml: "application/xml, text/xml",
4963 html: "text/html",
4964 script: "text/javascript, application/javascript",
4965 json: "application/json, text/javascript",
4966 text: "text/plain",
4967 _default: "*/*"
4968 }
4969 },
4970
4971 // Last-Modified header cache for next request
4972 lastModified: {},
4973 etag: {},
4974
4975 ajax: function( origSettings ) {
4976 var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings);
4977
4978 var jsonp, status, data,
4979 callbackContext = origSettings && origSettings.context || s,
4980 type = s.type.toUpperCase();
4981
4982 // convert data if not already a string
4983 if ( s.data && s.processData && typeof s.data !== "string" ) {
4984 s.data = jQuery.param( s.data, s.traditional );
4985 }
4986
4987 // Handle JSONP Parameter Callbacks
4988 if ( s.dataType === "jsonp" ) {
4989 if ( type === "GET" ) {
4990 if ( !jsre.test( s.url ) ) {
4991 s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?";
4992 }
4993 } else if ( !s.data || !jsre.test(s.data) ) {
4994 s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
4995 }
4996 s.dataType = "json";
4997 }
4998
4999 // Build temporary JSONP function
5000 if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {
5001 jsonp = s.jsonpCallback || ("jsonp" + jsc++);
5002
5003 // Replace the =? sequence both in the query string and the data
5004 if ( s.data ) {
5005 s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
5006 }
5007
5008 s.url = s.url.replace(jsre, "=" + jsonp + "$1");
5009
5010 // We need to make sure
5011 // that a JSONP style response is executed properly
5012 s.dataType = "script";
5013
5014 // Handle JSONP-style loading
5015 window[ jsonp ] = window[ jsonp ] || function( tmp ) {
5016 data = tmp;
5017 success();
5018 complete();
5019 // Garbage collect
5020 window[ jsonp ] = undefined;
5021
5022 try {
5023 delete window[ jsonp ];
5024 } catch(e) {}
5025
5026 if ( head ) {
5027 head.removeChild( script );
5028 }
5029 };
5030 }
5031
5032 if ( s.dataType === "script" && s.cache === null ) {
5033 s.cache = false;
5034 }
5035
5036 if ( s.cache === false && type === "GET" ) {
5037 var ts = now();
5038
5039 // try replacing _= if it is there
5040 var ret = s.url.replace(rts, "$1_=" + ts + "$2");
5041
5042 // if nothing was replaced, add timestamp to the end
5043 s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
5044 }
5045
5046 // If data is available, append data to url for get requests
5047 if ( s.data && type === "GET" ) {
5048 s.url += (rquery.test(s.url) ? "&" : "?") + s.data;
5049 }
5050
5051 // Watch for a new set of requests
5052 if ( s.global && ! jQuery.active++ ) {
5053 jQuery.event.trigger( "ajaxStart" );
5054 }
5055
5056 // Matches an absolute URL, and saves the domain
5057 var parts = rurl.exec( s.url ),
5058 remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
5059
5060 // If we're requesting a remote document
5061 // and trying to load JSON or Script with a GET
5062 if ( s.dataType === "script" && type === "GET" && remote ) {
5063 var head = document.getElementsByTagName("head")[0] || document.documentElement;
5064 var script = document.createElement("script");
5065 script.src = s.url;
5066 if ( s.scriptCharset ) {
5067 script.charset = s.scriptCharset;
5068 }
5069
5070 // Handle Script loading
5071 if ( !jsonp ) {
5072 var done = false;
5073
5074 // Attach handlers for all browsers
5075 script.onload = script.onreadystatechange = function() {
5076 if ( !done && (!this.readyState ||
5077 this.readyState === "loaded" || this.readyState === "complete") ) {
5078 done = true;
5079 success();
5080 complete();
5081
5082 // Handle memory leak in IE
5083 script.onload = script.onreadystatechange = null;
5084 if ( head && script.parentNode ) {
5085 head.removeChild( script );
5086 }
5087 }
5088 };
5089 }
5090
5091 // Use insertBefore instead of appendChild to circumvent an IE6 bug.
5092 // This arises when a base node is used (#2709 and #4378).
5093 head.insertBefore( script, head.firstChild );
5094
5095 // We handle everything using the script element injection
5096 return undefined;
5097 }
5098
5099 var requestDone = false;
5100
5101 // Create the request object
5102 var xhr = s.xhr();
5103
5104 if ( !xhr ) {
5105 return;
5106 }
5107
5108 // Open the socket
5109 // Passing null username, generates a login popup on Opera (#2865)
5110 if ( s.username ) {
5111 xhr.open(type, s.url, s.async, s.username, s.password);
5112 } else {
5113 xhr.open(type, s.url, s.async);
5114 }
5115
5116 // Need an extra try/catch for cross domain requests in Firefox 3
5117 try {
5118 // Set the correct header, if data is being sent
5119 if ( s.data || origSettings && origSettings.contentType ) {
5120 xhr.setRequestHeader("Content-Type", s.contentType);
5121 }
5122
5123 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
5124 if ( s.ifModified ) {
5125 if ( jQuery.lastModified[s.url] ) {
5126 xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]);
5127 }
5128
5129 if ( jQuery.etag[s.url] ) {
5130 xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]);
5131 }
5132 }
5133
5134 // Set header so the called script knows that it's an XMLHttpRequest
5135 // Only send the header if it's not a remote XHR
5136 if ( !remote ) {
5137 xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
5138 }
5139
5140 // Set the Accepts header for the server, depending on the dataType
5141 xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
5142 s.accepts[ s.dataType ] + ", */*" :
5143 s.accepts._default );
5144 } catch(e) {}
5145
5146 // Allow custom headers/mimetypes and early abort
5147 if ( s.beforeSend && s.beforeSend.call(callbackContext, xhr, s) === false ) {
5148 // Handle the global AJAX counter
5149 if ( s.global && ! --jQuery.active ) {
5150 jQuery.event.trigger( "ajaxStop" );
5151 }
5152
5153 // close opended socket
5154 xhr.abort();
5155 return false;
5156 }
5157
5158 if ( s.global ) {
5159 trigger("ajaxSend", [xhr, s]);
5160 }
5161
5162 // Wait for a response to come back
5163 var onreadystatechange = xhr.onreadystatechange = function( isTimeout ) {
5164 // The request was aborted
5165 if ( !xhr || xhr.readyState === 0 || isTimeout === "abort" ) {
5166 // Opera doesn't call onreadystatechange before this point
5167 // so we simulate the call
5168 if ( !requestDone ) {
5169 complete();
5170 }
5171
5172 requestDone = true;
5173 if ( xhr ) {
5174 xhr.onreadystatechange = jQuery.noop;
5175 }
5176
5177 // The transfer is complete and the data is available, or the request timed out
5178 } else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) {
5179 requestDone = true;
5180 xhr.onreadystatechange = jQuery.noop;
5181
5182 status = isTimeout === "timeout" ?
5183 "timeout" :
5184 !jQuery.httpSuccess( xhr ) ?
5185 "error" :
5186 s.ifModified && jQuery.httpNotModified( xhr, s.url ) ?
5187 "notmodified" :
5188 "success";
5189
5190 var errMsg;
5191
5192 if ( status === "success" ) {
5193 // Watch for, and catch, XML document parse errors
5194 try {
5195 // process the data (runs the xml through httpData regardless of callback)
5196 data = jQuery.httpData( xhr, s.dataType, s );
5197 } catch(err) {
5198 status = "parsererror";
5199 errMsg = err;
5200 }
5201 }
5202
5203 // Make sure that the request was successful or notmodified
5204 if ( status === "success" || status === "notmodified" ) {
5205 // JSONP handles its own success callback
5206 if ( !jsonp ) {
5207 success();
5208 }
5209 } else {
5210 jQuery.handleError(s, xhr, status, errMsg);
5211 }
5212
5213 // Fire the complete handlers
5214 complete();
5215
5216 if ( isTimeout === "timeout" ) {
5217 xhr.abort();
5218 }
5219
5220 // Stop memory leaks
5221 if ( s.async ) {
5222 xhr = null;
5223 }
5224 }
5225 };
5226
5227 // Override the abort handler, if we can (IE doesn't allow it, but that's OK)
5228 // Opera doesn't fire onreadystatechange at all on abort
5229 try {
5230 var oldAbort = xhr.abort;
5231 xhr.abort = function() {
5232 if ( xhr ) {
5233 oldAbort.call( xhr );
5234 }
5235
5236 onreadystatechange( "abort" );
5237 };
5238 } catch(e) { }
5239
5240 // Timeout checker
5241 if ( s.async && s.timeout > 0 ) {
5242 setTimeout(function() {
5243 // Check to see if the request is still happening
5244 if ( xhr && !requestDone ) {
5245 onreadystatechange( "timeout" );
5246 }
5247 }, s.timeout);
5248 }
5249
5250 // Send the data
5251 try {
5252 xhr.send( type === "POST" || type === "PUT" || type === "DELETE" ? s.data : null );
5253 } catch(e) {
5254 jQuery.handleError(s, xhr, null, e);
5255 // Fire the complete handlers
5256 complete();
5257 }
5258
5259 // firefox 1.5 doesn't fire statechange for sync requests
5260 if ( !s.async ) {
5261 onreadystatechange();
5262 }
5263
5264 function success() {
5265 // If a local callback was specified, fire it and pass it the data
5266 if ( s.success ) {
5267 s.success.call( callbackContext, data, status, xhr );
5268 }
5269
5270 // Fire the global callback
5271 if ( s.global ) {
5272 trigger( "ajaxSuccess", [xhr, s] );
5273 }
5274 }
5275
5276 function complete() {
5277 // Process result
5278 if ( s.complete ) {
5279 s.complete.call( callbackContext, xhr, status);
5280 }
5281
5282 // The request was completed
5283 if ( s.global ) {
5284 trigger( "ajaxComplete", [xhr, s] );
5285 }
5286
5287 // Handle the global AJAX counter
5288 if ( s.global && ! --jQuery.active ) {
5289 jQuery.event.trigger( "ajaxStop" );
5290 }
5291 }
5292
5293 function trigger(type, args) {
5294 (s.context ? jQuery(s.context) : jQuery.event).trigger(type, args);
5295 }
5296
5297 // return XMLHttpRequest to allow aborting the request etc.
5298 return xhr;
5299 },
5300
5301 handleError: function( s, xhr, status, e ) {
5302 // If a local callback was specified, fire it
5303 if ( s.error ) {
5304 s.error.call( s.context || s, xhr, status, e );
5305 }
5306
5307 // Fire the global callback
5308 if ( s.global ) {
5309 (s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] );
5310 }
5311 },
5312
5313 // Counter for holding the number of active queries
5314 active: 0,
5315
5316 // Determines if an XMLHttpRequest was successful or not
5317 httpSuccess: function( xhr ) {
5318 try {
5319 // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
5320 return !xhr.status && location.protocol === "file:" ||
5321 // Opera returns 0 when status is 304
5322 ( xhr.status >= 200 && xhr.status < 300 ) ||
5323 xhr.status === 304 || xhr.status === 1223 || xhr.status === 0;
5324 } catch(e) {}
5325
5326 return false;
5327 },
5328
5329 // Determines if an XMLHttpRequest returns NotModified
5330 httpNotModified: function( xhr, url ) {
5331 var lastModified = xhr.getResponseHeader("Last-Modified"),
5332 etag = xhr.getResponseHeader("Etag");
5333
5334 if ( lastModified ) {
5335 jQuery.lastModified[url] = lastModified;
5336 }
5337
5338 if ( etag ) {
5339 jQuery.etag[url] = etag;
5340 }
5341
5342 // Opera returns 0 when status is 304
5343 return xhr.status === 304 || xhr.status === 0;
5344 },
5345
5346 httpData: function( xhr, type, s ) {
5347 var ct = xhr.getResponseHeader("content-type") || "",
5348 xml = type === "xml" || !type && ct.indexOf("xml") >= 0,
5349 data = xml ? xhr.responseXML : xhr.responseText;
5350
5351 if ( xml && data.documentElement.nodeName === "parsererror" ) {
5352 jQuery.error( "parsererror" );
5353 }
5354
5355 // Allow a pre-filtering function to sanitize the response
5356 // s is checked to keep backwards compatibility
5357 if ( s && s.dataFilter ) {
5358 data = s.dataFilter( data, type );
5359 }
5360
5361 // The filter can actually parse the response
5362 if ( typeof data === "string" ) {
5363 // Get the JavaScript object, if JSON is used.
5364 if ( type === "json" || !type && ct.indexOf("json") >= 0 ) {
5365 data = jQuery.parseJSON( data );
5366
5367 // If the type is "script", eval it in global context
5368 } else if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) {
5369 jQuery.globalEval( data );
5370 }
5371 }
5372
5373 return data;
5374 },
5375
5376 // Serialize an array of form elements or a set of
5377 // key/values into a query string
5378 param: function( a, traditional ) {
5379 var s = [];
5380
5381 // Set traditional to true for jQuery <= 1.3.2 behavior.
5382 if ( traditional === undefined ) {
5383 traditional = jQuery.ajaxSettings.traditional;
5384 }
5385
5386 // If an array was passed in, assume that it is an array of form elements.
5387 if ( jQuery.isArray(a) || a.jquery ) {
5388 // Serialize the form elements
5389 jQuery.each( a, function() {
5390 add( this.name, this.value );
5391 });
5392
5393 } else {
5394 // If traditional, encode the "old" way (the way 1.3.2 or older
5395 // did it), otherwise encode params recursively.
5396 for ( var prefix in a ) {
5397 buildParams( prefix, a[prefix] );
5398 }
5399 }
5400
5401 // Return the resulting serialization
5402 return s.join("&").replace(r20, "+");
5403
5404 function buildParams( prefix, obj ) {
5405 if ( jQuery.isArray(obj) ) {
5406 // Serialize array item.
5407 jQuery.each( obj, function( i, v ) {
5408 if ( traditional || /\[\]$/.test( prefix ) ) {
5409 // Treat each array item as a scalar.
5410 add( prefix, v );
5411 } else {
5412 // If array item is non-scalar (array or object), encode its
5413 // numeric index to resolve deserialization ambiguity issues.
5414 // Note that rack (as of 1.0.0) can't currently deserialize
5415 // nested arrays properly, and attempting to do so may cause
5416 // a server error. Possible fixes are to modify rack's
5417 // deserialization algorithm or to provide an option or flag
5418 // to force array serialization to be shallow.
5419 buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v );
5420 }
5421 });
5422
5423 } else if ( !traditional && obj != null && typeof obj === "object" ) {
5424 // Serialize object item.
5425 jQuery.each( obj, function( k, v ) {
5426 buildParams( prefix + "[" + k + "]", v );
5427 });
5428
5429 } else {
5430 // Serialize scalar item.
5431 add( prefix, obj );
5432 }
5433 }
5434
5435 function add( key, value ) {
5436 // If value is a function, invoke it and return its value
5437 value = jQuery.isFunction(value) ? value() : value;
5438 s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
5439 }
5440 }
5441 });
5442 var elemdisplay = {},
5443 rfxtypes = /toggle|show|hide/,
5444 rfxnum = /^([+-]=)?([\d+-.]+)(.*)$/,
5445 timerId,
5446 fxAttrs = [
5447 // height animations
5448 [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
5449 // width animations
5450 [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
5451 // opacity animations
5452 [ "opacity" ]
5453 ];
5454
5455 jQuery.fn.extend({
5456 show: function( speed, callback ) {
5457 if ( speed || speed === 0) {
5458 return this.animate( genFx("show", 3), speed, callback);
5459
5460 } else {
5461 for ( var i = 0, l = this.length; i < l; i++ ) {
5462 var old = jQuery.data(this[i], "olddisplay");
5463
5464 this[i].style.display = old || "";
5465
5466 if ( jQuery.css(this[i], "display") === "none" ) {
5467 var nodeName = this[i].nodeName, display;
5468
5469 if ( elemdisplay[ nodeName ] ) {
5470 display = elemdisplay[ nodeName ];
5471
5472 } else {
5473 var elem = jQuery("<" + nodeName + " />").appendTo("body");
5474
5475 display = elem.css("display");
5476
5477 if ( display === "none" ) {
5478 display = "block";
5479 }
5480
5481 elem.remove();
5482
5483 elemdisplay[ nodeName ] = display;
5484 }
5485
5486 jQuery.data(this[i], "olddisplay", display);
5487 }
5488 }
5489
5490 // Set the display of the elements in a second loop
5491 // to avoid the constant reflow
5492 for ( var j = 0, k = this.length; j < k; j++ ) {
5493 this[j].style.display = jQuery.data(this[j], "olddisplay") || "";
5494 }
5495
5496 return this;
5497 }
5498 },
5499
5500 hide: function( speed, callback ) {
5501 if ( speed || speed === 0 ) {
5502 return this.animate( genFx("hide", 3), speed, callback);
5503
5504 } else {
5505 for ( var i = 0, l = this.length; i < l; i++ ) {
5506 var old = jQuery.data(this[i], "olddisplay");
5507 if ( !old && old !== "none" ) {
5508 jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
5509 }
5510 }
5511
5512 // Set the display of the elements in a second loop
5513 // to avoid the constant reflow
5514 for ( var j = 0, k = this.length; j < k; j++ ) {
5515 this[j].style.display = "none";
5516 }
5517
5518 return this;
5519 }
5520 },
5521
5522 // Save the old toggle function
5523 _toggle: jQuery.fn.toggle,
5524
5525 toggle: function( fn, fn2 ) {
5526 var bool = typeof fn === "boolean";
5527
5528 if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
5529 this._toggle.apply( this, arguments );
5530
5531 } else if ( fn == null || bool ) {
5532 this.each(function() {
5533 var state = bool ? fn : jQuery(this).is(":hidden");
5534 jQuery(this)[ state ? "show" : "hide" ]();
5535 });
5536
5537 } else {
5538 this.animate(genFx("toggle", 3), fn, fn2);
5539 }
5540
5541 return this;
5542 },
5543
5544 fadeTo: function( speed, to, callback ) {
5545 return this.filter(":hidden").css("opacity", 0).show().end()
5546 .animate({opacity: to}, speed, callback);
5547 },
5548
5549 animate: function( prop, speed, easing, callback ) {
5550 var optall = jQuery.speed(speed, easing, callback);
5551
5552 if ( jQuery.isEmptyObject( prop ) ) {
5553 return this.each( optall.complete );
5554 }
5555
5556 return this[ optall.queue === false ? "each" : "queue" ](function() {
5557 var opt = jQuery.extend({}, optall), p,
5558 hidden = this.nodeType === 1 && jQuery(this).is(":hidden"),
5559 self = this;
5560
5561 for ( p in prop ) {
5562 var name = p.replace(rdashAlpha, fcamelCase);
5563
5564 if ( p !== name ) {
5565 prop[ name ] = prop[ p ];
5566 delete prop[ p ];
5567 p = name;
5568 }
5569
5570 if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {
5571 return opt.complete.call(this);
5572 }
5573
5574 if ( ( p === "height" || p === "width" ) && this.style ) {
5575 // Store display property
5576 opt.display = jQuery.css(this, "display");
5577
5578 // Make sure that nothing sneaks out
5579 opt.overflow = this.style.overflow;
5580 }
5581
5582 if ( jQuery.isArray( prop[p] ) ) {
5583 // Create (if needed) and add to specialEasing
5584 (opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
5585 prop[p] = prop[p][0];
5586 }
5587 }
5588
5589 if ( opt.overflow != null ) {
5590 this.style.overflow = "hidden";
5591 }
5592
5593 opt.curAnim = jQuery.extend({}, prop);
5594
5595 jQuery.each( prop, function( name, val ) {
5596 var e = new jQuery.fx( self, opt, name );
5597
5598 if ( rfxtypes.test(val) ) {
5599 e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );
5600
5601 } else {
5602 var parts = rfxnum.exec(val),
5603 start = e.cur(true) || 0;
5604
5605 if ( parts ) {
5606 var end = parseFloat( parts[2] ),
5607 unit = parts[3] || "px";
5608
5609 // We need to compute starting value
5610 if ( unit !== "px" ) {
5611 self.style[ name ] = (end || 1) + unit;
5612 start = ((end || 1) / e.cur(true)) * start;
5613 self.style[ name ] = start + unit;
5614 }
5615
5616 // If a +=/-= token was provided, we're doing a relative animation
5617 if ( parts[1] ) {
5618 end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
5619 }
5620
5621 e.custom( start, end, unit );
5622
5623 } else {
5624 e.custom( start, val, "" );
5625 }
5626 }
5627 });
5628
5629 // For JS strict compliance
5630 return true;
5631 });
5632 },
5633
5634 stop: function( clearQueue, gotoEnd ) {
5635 var timers = jQuery.timers;
5636
5637 if ( clearQueue ) {
5638 this.queue([]);
5639 }
5640
5641 this.each(function() {
5642 // go in reverse order so anything added to the queue during the loop is ignored
5643 for ( var i = timers.length - 1; i >= 0; i-- ) {
5644 if ( timers[i].elem === this ) {
5645 if (gotoEnd) {
5646 // force the next step to be the last
5647 timers[i](true);
5648 }
5649
5650 timers.splice(i, 1);
5651 }
5652 }
5653 });
5654
5655 // start the next in the queue if the last step wasn't forced
5656 if ( !gotoEnd ) {
5657 this.dequeue();
5658 }
5659
5660 return this;
5661 }
5662
5663 });
5664
5665 // Generate shortcuts for custom animations
5666 jQuery.each({
5667 slideDown: genFx("show", 1),
5668 slideUp: genFx("hide", 1),
5669 slideToggle: genFx("toggle", 1),
5670 fadeIn: { opacity: "show" },
5671 fadeOut: { opacity: "hide" }
5672 }, function( name, props ) {
5673 jQuery.fn[ name ] = function( speed, callback ) {
5674 return this.animate( props, speed, callback );
5675 };
5676 });
5677
5678 jQuery.extend({
5679 speed: function( speed, easing, fn ) {
5680 var opt = speed && typeof speed === "object" ? speed : {
5681 complete: fn || !fn && easing ||
5682 jQuery.isFunction( speed ) && speed,
5683 duration: speed,
5684 easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
5685 };
5686
5687 opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
5688 jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
5689
5690 // Queueing
5691 opt.old = opt.complete;
5692 opt.complete = function() {
5693 if ( opt.queue !== false ) {
5694 jQuery(this).dequeue();
5695 }
5696 if ( jQuery.isFunction( opt.old ) ) {
5697 opt.old.call( this );
5698 }
5699 };
5700
5701 return opt;
5702 },
5703
5704 easing: {
5705 linear: function( p, n, firstNum, diff ) {
5706 return firstNum + diff * p;
5707 },
5708 swing: function( p, n, firstNum, diff ) {
5709 return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
5710 }
5711 },
5712
5713 timers: [],
5714
5715 fx: function( elem, options, prop ) {
5716 this.options = options;
5717 this.elem = elem;
5718 this.prop = prop;
5719
5720 if ( !options.orig ) {
5721 options.orig = {};
5722 }
5723 }
5724
5725 });
5726
5727 jQuery.fx.prototype = {
5728 // Simple function for setting a style value
5729 update: function() {
5730 if ( this.options.step ) {
5731 this.options.step.call( this.elem, this.now, this );
5732 }
5733
5734 (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
5735
5736 // Set display property to block for height/width animations
5737 if ( ( this.prop === "height" || this.prop === "width" ) && this.elem.style ) {
5738 this.elem.style.display = "block";
5739 }
5740 },
5741
5742 // Get the current size
5743 cur: function( force ) {
5744 if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
5745 return this.elem[ this.prop ];
5746 }
5747
5748 var r = parseFloat(jQuery.css(this.elem, this.prop, force));
5749 return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
5750 },
5751
5752 // Start an animation from one number to another
5753 custom: function( from, to, unit ) {
5754 this.startTime = now();
5755 this.start = from;
5756 this.end = to;
5757 this.unit = unit || this.unit || "px";
5758 this.now = this.start;
5759 this.pos = this.state = 0;
5760
5761 var self = this;
5762 function t( gotoEnd ) {
5763 return self.step(gotoEnd);
5764 }
5765
5766 t.elem = this.elem;
5767
5768 if ( t() && jQuery.timers.push(t) && !timerId ) {
5769 timerId = setInterval(jQuery.fx.tick, 13);
5770 }
5771 },
5772
5773 // Simple 'show' function
5774 show: function() {
5775 // Remember where we started, so that we can go back to it later
5776 this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
5777 this.options.show = true;
5778
5779 // Begin the animation
5780 // Make sure that we start at a small width/height to avoid any
5781 // flash of content
5782 this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
5783
5784 // Start by showing the element
5785 jQuery( this.elem ).show();
5786 },
5787
5788 // Simple 'hide' function
5789 hide: function() {
5790 // Remember where we started, so that we can go back to it later
5791 this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
5792 this.options.hide = true;
5793
5794 // Begin the animation
5795 this.custom(this.cur(), 0);
5796 },
5797
5798 // Each step of an animation
5799 step: function( gotoEnd ) {
5800 var t = now(), done = true;
5801
5802 if ( gotoEnd || t >= this.options.duration + this.startTime ) {
5803 this.now = this.end;
5804 this.pos = this.state = 1;
5805 this.update();
5806
5807 this.options.curAnim[ this.prop ] = true;
5808
5809 for ( var i in this.options.curAnim ) {
5810 if ( this.options.curAnim[i] !== true ) {
5811 done = false;
5812 }
5813 }
5814
5815 if ( done ) {
5816 if ( this.options.display != null ) {
5817 // Reset the overflow
5818 this.elem.style.overflow = this.options.overflow;
5819
5820 // Reset the display
5821 var old = jQuery.data(this.elem, "olddisplay");
5822 this.elem.style.display = old ? old : this.options.display;
5823
5824 if ( jQuery.css(this.elem, "display") === "none" ) {
5825 this.elem.style.display = "block";
5826 }
5827 }
5828
5829 // Hide the element if the "hide" operation was done
5830 if ( this.options.hide ) {
5831 jQuery(this.elem).hide();
5832 }
5833
5834 // Reset the properties, if the item has been hidden or shown
5835 if ( this.options.hide || this.options.show ) {
5836 for ( var p in this.options.curAnim ) {
5837 jQuery.style(this.elem, p, this.options.orig[p]);
5838 }
5839 }
5840
5841 // Execute the complete function
5842 this.options.complete.call( this.elem );
5843 }
5844
5845 return false;
5846
5847 } else {
5848 var n = t - this.startTime;
5849 this.state = n / this.options.duration;
5850
5851 // Perform the easing function, defaults to swing
5852 var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
5853 var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
5854 this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
5855 this.now = this.start + ((this.end - this.start) * this.pos);
5856
5857 // Perform the next step of the animation
5858 this.update();
5859 }
5860
5861 return true;
5862 }
5863 };
5864
5865 jQuery.extend( jQuery.fx, {
5866 tick: function() {
5867 var timers = jQuery.timers;
5868
5869 for ( var i = 0; i < timers.length; i++ ) {
5870 if ( !timers[i]() ) {
5871 timers.splice(i--, 1);
5872 }
5873 }
5874
5875 if ( !timers.length ) {
5876 jQuery.fx.stop();
5877 }
5878 },
5879
5880 stop: function() {
5881 clearInterval( timerId );
5882 timerId = null;
5883 },
5884
5885 speeds: {
5886 slow: 600,
5887 fast: 200,
5888 // Default speed
5889 _default: 400
5890 },
5891
5892 step: {
5893 opacity: function( fx ) {
5894 jQuery.style(fx.elem, "opacity", fx.now);
5895 },
5896
5897 _default: function( fx ) {
5898 if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
5899 fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
5900 } else {
5901 fx.elem[ fx.prop ] = fx.now;
5902 }
5903 }
5904 }
5905 });
5906
5907 if ( jQuery.expr && jQuery.expr.filters ) {
5908 jQuery.expr.filters.animated = function( elem ) {
5909 return jQuery.grep(jQuery.timers, function( fn ) {
5910 return elem === fn.elem;
5911 }).length;
5912 };
5913 }
5914
5915 function genFx( type, num ) {
5916 var obj = {};
5917
5918 jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
5919 obj[ this ] = type;
5920 });
5921
5922 return obj;
5923 }
5924 if ( "getBoundingClientRect" in document.documentElement ) {
5925 jQuery.fn.offset = function( options ) {
5926 var elem = this[0];
5927
5928 if ( options ) {
5929 return this.each(function( i ) {
5930 jQuery.offset.setOffset( this, options, i );
5931 });
5932 }
5933
5934 if ( !elem || !elem.ownerDocument ) {
5935 return null;
5936 }
5937
5938 if ( elem === elem.ownerDocument.body ) {
5939 return jQuery.offset.bodyOffset( elem );
5940 }
5941
5942 var box = elem.getBoundingClientRect(), doc = elem.ownerDocument, body = doc.body, docElem = doc.documentElement,
5943 clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
5944 top = box.top + (self.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop ) - clientTop,
5945 left = box.left + (self.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
5946
5947 return { top: top, left: left };
5948 };
5949
5950 } else {
5951 jQuery.fn.offset = function( options ) {
5952 var elem = this[0];
5953
5954 if ( options ) {
5955 return this.each(function( i ) {
5956 jQuery.offset.setOffset( this, options, i );
5957 });
5958 }
5959
5960 if ( !elem || !elem.ownerDocument ) {
5961 return null;
5962 }
5963
5964 if ( elem === elem.ownerDocument.body ) {
5965 return jQuery.offset.bodyOffset( elem );
5966 }
5967
5968 jQuery.offset.initialize();
5969
5970 var offsetParent = elem.offsetParent, prevOffsetParent = elem,
5971 doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
5972 body = doc.body, defaultView = doc.defaultView,
5973 prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
5974 top = elem.offsetTop, left = elem.offsetLeft;
5975
5976 while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
5977 if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
5978 break;
5979 }
5980
5981 computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
5982 top -= elem.scrollTop;
5983 left -= elem.scrollLeft;
5984
5985 if ( elem === offsetParent ) {
5986 top += elem.offsetTop;
5987 left += elem.offsetLeft;
5988
5989 if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.nodeName)) ) {
5990 top += parseFloat( computedStyle.borderTopWidth ) || 0;
5991 left += parseFloat( computedStyle.borderLeftWidth ) || 0;
5992 }
5993
5994 prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
5995 }
5996
5997 if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
5998 top += parseFloat( computedStyle.borderTopWidth ) || 0;
5999 left += parseFloat( computedStyle.borderLeftWidth ) || 0;
6000 }
6001
6002 prevComputedStyle = computedStyle;
6003 }
6004
6005 if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
6006 top += body.offsetTop;
6007 left += body.offsetLeft;
6008 }
6009
6010 if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
6011 top += Math.max( docElem.scrollTop, body.scrollTop );
6012 left += Math.max( docElem.scrollLeft, body.scrollLeft );
6013 }
6014
6015 return { top: top, left: left };
6016 };
6017 }
6018
6019 jQuery.offset = {
6020 initialize: function() {
6021 var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.curCSS(body, "marginTop", true) ) || 0,
6022 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>";
6023
6024 jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
6025
6026 container.innerHTML = html;
6027 body.insertBefore( container, body.firstChild );
6028 innerDiv = container.firstChild;
6029 checkDiv = innerDiv.firstChild;
6030 td = innerDiv.nextSibling.firstChild.firstChild;
6031
6032 this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
6033 this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
6034
6035 checkDiv.style.position = "fixed", checkDiv.style.top = "20px";
6036 // safari subtracts parent border width here which is 5px
6037 this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
6038 checkDiv.style.position = checkDiv.style.top = "";
6039
6040 innerDiv.style.overflow = "hidden", innerDiv.style.position = "relative";
6041 this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
6042
6043 this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
6044
6045 body.removeChild( container );
6046 body = container = innerDiv = checkDiv = table = td = null;
6047 jQuery.offset.initialize = jQuery.noop;
6048 },
6049
6050 bodyOffset: function( body ) {
6051 var top = body.offsetTop, left = body.offsetLeft;
6052
6053 jQuery.offset.initialize();
6054
6055 if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
6056 top += parseFloat( jQuery.curCSS(body, "marginTop", true) ) || 0;
6057 left += parseFloat( jQuery.curCSS(body, "marginLeft", true) ) || 0;
6058 }
6059
6060 return { top: top, left: left };
6061 },
6062
6063 setOffset: function( elem, options, i ) {
6064 // set position first, in-case top/left are set even on static elem
6065 if ( /static/.test( jQuery.curCSS( elem, "position" ) ) ) {
6066 elem.style.position = "relative";
6067 }
6068 var curElem = jQuery( elem ),
6069 curOffset = curElem.offset(),
6070 curTop = parseInt( jQuery.curCSS( elem, "top", true ), 10 ) || 0,
6071 curLeft = parseInt( jQuery.curCSS( elem, "left", true ), 10 ) || 0;
6072
6073 if ( jQuery.isFunction( options ) ) {
6074 options = options.call( elem, i, curOffset );
6075 }
6076
6077 var props = {
6078 top: (options.top - curOffset.top) + curTop,
6079 left: (options.left - curOffset.left) + curLeft
6080 };
6081
6082 if ( "using" in options ) {
6083 options.using.call( elem, props );
6084 } else {
6085 curElem.css( props );
6086 }
6087 }
6088 };
6089
6090
6091 jQuery.fn.extend({
6092 position: function() {
6093 if ( !this[0] ) {
6094 return null;
6095 }
6096
6097 var elem = this[0],
6098
6099 // Get *real* offsetParent
6100 offsetParent = this.offsetParent(),
6101
6102 // Get correct offsets
6103 offset = this.offset(),
6104 parentOffset = /^body|html$/i.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
6105
6106 // Subtract element margins
6107 // note: when an element has margin: auto the offsetLeft and marginLeft
6108 // are the same in Safari causing offset.left to incorrectly be 0
6109 offset.top -= parseFloat( jQuery.curCSS(elem, "marginTop", true) ) || 0;
6110 offset.left -= parseFloat( jQuery.curCSS(elem, "marginLeft", true) ) || 0;
6111
6112 // Add offsetParent borders
6113 parentOffset.top += parseFloat( jQuery.curCSS(offsetParent[0], "borderTopWidth", true) ) || 0;
6114 parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], "borderLeftWidth", true) ) || 0;
6115
6116 // Subtract the two offsets
6117 return {
6118 top: offset.top - parentOffset.top,
6119 left: offset.left - parentOffset.left
6120 };
6121 },
6122
6123 offsetParent: function() {
6124 return this.map(function() {
6125 var offsetParent = this.offsetParent || document.body;
6126 while ( offsetParent && (!/^body|html$/i.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
6127 offsetParent = offsetParent.offsetParent;
6128 }
6129 return offsetParent;
6130 });
6131 }
6132 });
6133
6134
6135 // Create scrollLeft and scrollTop methods
6136 jQuery.each( ["Left", "Top"], function( i, name ) {
6137 var method = "scroll" + name;
6138
6139 jQuery.fn[ method ] = function(val) {
6140 var elem = this[0], win;
6141
6142 if ( !elem ) {
6143 return null;
6144 }
6145
6146 if ( val !== undefined ) {
6147 // Set the scroll offset
6148 return this.each(function() {
6149 win = getWindow( this );
6150
6151 if ( win ) {
6152 win.scrollTo(
6153 !i ? val : jQuery(win).scrollLeft(),
6154 i ? val : jQuery(win).scrollTop()
6155 );
6156
6157 } else {
6158 this[ method ] = val;
6159 }
6160 });
6161 } else {
6162 win = getWindow( elem );
6163
6164 // Return the scroll offset
6165 return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
6166 jQuery.support.boxModel && win.document.documentElement[ method ] ||
6167 win.document.body[ method ] :
6168 elem[ method ];
6169 }
6170 };
6171 });
6172
6173 function getWindow( elem ) {
6174 return ("scrollTo" in elem && elem.document) ?
6175 elem :
6176 elem.nodeType === 9 ?
6177 elem.defaultView || elem.parentWindow :
6178 false;
6179 }
6180 // Create innerHeight, innerWidth, outerHeight and outerWidth methods
6181 jQuery.each([ "Height", "Width" ], function( i, name ) {
6182
6183 var type = name.toLowerCase();
6184
6185 // innerHeight and innerWidth
6186 jQuery.fn["inner" + name] = function() {
6187 return this[0] ?
6188 jQuery.css( this[0], type, false, "padding" ) :
6189 null;
6190 };
6191
6192 // outerHeight and outerWidth
6193 jQuery.fn["outer" + name] = function( margin ) {
6194 return this[0] ?
6195 jQuery.css( this[0], type, false, margin ? "margin" : "border" ) :
6196 null;
6197 };
6198
6199 jQuery.fn[ type ] = function( size ) {
6200 // Get window width or height
6201 var elem = this[0];
6202 if ( !elem ) {
6203 return size == null ? null : this;
6204 }
6205
6206 if ( jQuery.isFunction( size ) ) {
6207 return this.each(function( i ) {
6208 var self = jQuery( this );
6209 self[ type ]( size.call( this, i, self[ type ]() ) );
6210 });
6211 }
6212
6213 return ("scrollTo" in elem && elem.document) ? // does it walk and quack like a window?
6214 // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
6215 elem.document.compatMode === "CSS1Compat" && elem.document.documentElement[ "client" + name ] ||
6216 elem.document.body[ "client" + name ] :
6217
6218 // Get document width or height
6219 (elem.nodeType === 9) ? // is it a document
6220 // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
6221 Math.max(
6222 elem.documentElement["client" + name],
6223 elem.body["scroll" + name], elem.documentElement["scroll" + name],
6224 elem.body["offset" + name], elem.documentElement["offset" + name]
6225 ) :
6226
6227 // Get or set width or height on the element
6228 size === undefined ?
6229 // Get width or height on the element
6230 jQuery.css( elem, type ) :
6231
6232 // Set the width or height on the element (default to pixels if value is unitless)
6233 this.css( type, typeof size === "string" ? size : size + "px" );
6234 };
6235
6236 });
6237 // Expose jQuery to the global object
6238 window.jQuery = window.$ = jQuery;
6239
6240 })(window);
1  /*!
2   * jQuery JavaScript Library v1.4.2
3   * http://jquery.com/
4   *
5   * Copyright 2010, 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 2010, The Dojo Foundation
12   * Released under the MIT, BSD, and GPL Licenses.
13   *
14   * Date: Sat Feb 13 22:33:48 2010 -0500
15   */
16  (function( window, undefined ) {
17  
18  // Define a local copy of jQuery
19  var jQuery = function( selector, context ) {
20                  // The jQuery object is actually just the init constructor 'enhanced'
21                  return new jQuery.fn.init( selector, context );
22          },
23  
24          // Map over jQuery in case of overwrite
25          _jQuery = window.jQuery,
26  
27          // Map over the $ in case of overwrite
28          _$ = window.$,
29  
30          // Use the correct document accordingly with window argument (sandbox)
31          document = window.document,
32  
33          // A central reference to the root jQuery(document)
34          rootjQuery,
35  
36          // A simple way to check for HTML strings or ID strings
37          // (both of which we optimize for)
38          quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,
39  
40          // Is it a simple selector
41          isSimple = /^.[^:#\[\.,]*$/,
42  
43          // Check if a string has a non-whitespace character in it
44          rnotwhite = /\S/,
45  
46          // Used for trimming whitespace
47          rtrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g,
48  
49          // Match a standalone tag
50          rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
51  
52          // Keep a UserAgent string for use with jQuery.browser
53          userAgent = navigator.userAgent,
54  
55          // For matching the engine and version of the browser
56          browserMatch,
57         
58          // Has the ready events already been bound?
59          readyBound = false,
60         
61          // The functions to execute on DOM ready
62          readyList = [],
63  
64          // The ready event handler
65          DOMContentLoaded,
66  
67          // Save a reference to some core methods
68          toString = Object.prototype.toString,
69          hasOwnProperty = Object.prototype.hasOwnProperty,
70          push = Array.prototype.push,
71          slice = Array.prototype.slice,
72          indexOf = Array.prototype.indexOf;
73  
74  jQuery.fn = jQuery.prototype = {
75          init: function( selector, context ) {
76                  var match, elem, ret, doc;
77  
78                  // Handle $(""), $(null), or $(undefined)
79                  if ( !selector ) {
80                          return this;
81                  }
82  
83                  // Handle $(DOMElement)
84                  if ( selector.nodeType ) {
85                          this.context = this[0] = selector;
86                          this.length = 1;
87                          return this;
88                  }
89                 
90                  // The body element only exists once, optimize finding it
91                  if ( selector === "body" && !context ) {
92                          this.context = document;
93                          this[0] = document.body;
94                          this.selector = "body";
95                          this.length = 1;
96                          return this;
97                  }
98  
99                  // Handle HTML strings
100                  if ( typeof selector === "string" ) {
101                          // Are we dealing with HTML string or an ID?
102                          match = quickExpr.exec( selector );
103  
104                          // Verify a match, and that no context was specified for #id
105                          if ( match && (match[1] || !context) ) {
106  
107                                  // HANDLE: $(html) -> $(array)
108                                  if ( match[1] ) {
109                                          doc = (context ? context.ownerDocument || context : document);
110  
111                                          // If a single string is passed in and it's a single tag
112                                          // just do a createElement and skip the rest
113                                          ret = rsingleTag.exec( selector );
114  
115                                          if ( ret ) {
116                                                  if ( jQuery.isPlainObject( context ) ) {
117                                                          selector = [ document.createElement( ret[1] ) ];
118                                                          jQuery.fn.attr.call( selector, context, true );
119  
120                                                  } else {
121                                                          selector = [ doc.createElement( ret[1] ) ];
122                                                  }
123  
124                                          } else {
125                                                  ret = buildFragment( [ match[1] ], [ doc ] );
126                                                  selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
127                                          }
128                                         
129                                          return jQuery.merge( this, selector );
130                                         
131                                  // HANDLE: $("#id")
132                                  } else {
133                                          elem = document.getElementById( match[2] );
134  
135                                          if ( elem ) {
136                                                  // Handle the case where IE and Opera return items
137                                                  // by name instead of ID
138                                                  if ( elem.id !== match[2] ) {
139                                                          return rootjQuery.find( selector );
140                                                  }
141  
142                                                  // Otherwise, we inject the element directly into the jQuery object
143                                                  this.length = 1;
144                                                  this[0] = elem;
145                                          }
146  
147                                          this.context = document;
148                                          this.selector = selector;
149                                          return this;
150                                  }
151  
152                          // HANDLE: $("TAG")
153                          } else if ( !context && /^\w+$/.test( selector ) ) {
154                                  this.selector = selector;
155                                  this.context = document;
156                                  selector = document.getElementsByTagName( selector );
157                                  return jQuery.merge( this, selector );
158  
159                          // HANDLE: $(expr, $(...))
160                          } else if ( !context || context.jquery ) {
161                                  return (context || rootjQuery).find( selector );
162  
163                          // HANDLE: $(expr, context)
164                          // (which is just equivalent to: $(context).find(expr)
165                          } else {
166                                  return jQuery( context ).find( selector );
167                          }
168  
169                  // HANDLE: $(function)
170                  // Shortcut for document ready
171                  } else if ( jQuery.isFunction( selector ) ) {
172                          return rootjQuery.ready( selector );
173                  }
174  
175                  if (selector.selector !== undefined) {
176                          this.selector = selector.selector;
177                          this.context = selector.context;
178                  }
179  
180                  return jQuery.makeArray( selector, this );
181          },
182  
183          // Start with an empty selector
184          selector: "",
185  
186          // The current version of jQuery being used
187          jquery: "1.4.2",
188  
189          // The default length of a jQuery object is 0
190          length: 0,
191  
192          // The number of elements contained in the matched element set
193          size: function() {
194                  return this.length;
195          },
196  
197          toArray: function() {
198                  return slice.call( this, 0 );
199          },
200  
201          // Get the Nth element in the matched element set OR
202          // Get the whole matched element set as a clean array
203          get: function( num ) {
204                  return num == null ?
205  
206                          // Return a 'clean' array
207                          this.toArray() :
208  
209                          // Return just the object
210                          ( num < 0 ? this.slice(num)[ 0 ] : this[ num ] );
211          },
212  
213          // Take an array of elements and push it onto the stack
214          // (returning the new matched element set)
215          pushStack: function( elems, name, selector ) {
216                  // Build a new jQuery matched element set
217                  var ret = jQuery();
218  
219                  if ( jQuery.isArray( elems ) ) {
220                          push.apply( ret, elems );
221                 
222                  } else {
223                          jQuery.merge( ret, elems );
224                  }
225  
226                  // Add the old object onto the stack (as a reference)
227                  ret.prevObject = this;
228  
229                  ret.context = this.context;
230  
231                  if ( name === "find" ) {
232                          ret.selector = this.selector + (this.selector ? " " : "") + selector;
233                  } else if ( name ) {
234                          ret.selector = this.selector + "." + name + "(" + selector + ")";
235                  }
236  
237                  // Return the newly-formed element set
238                  return ret;
239          },
240  
241          // Execute a callback for every element in the matched set.
242          // (You can seed the arguments with an array of args, but this is
243          // only used internally.)
244          each: function( callback, args ) {
245                  return jQuery.each( this, callback, args );
246          },
247         
248          ready: function( fn ) {
249                  // Attach the listeners
250                  jQuery.bindReady();
251  
252                  // If the DOM is already ready
253                  if ( jQuery.isReady ) {
254                          // Execute the function immediately
255                          fn.call( document, jQuery );
256  
257                  // Otherwise, remember the function for later
258                  } else if ( readyList ) {
259                          // Add the function to the wait list
260                          readyList.push( fn );
261                  }
262  
263                  return this;
264          },
265         
266          eq: function( i ) {
267                  return i === -1 ?
268                          this.slice( i ) :
269                          this.slice( i, +i + 1 );
270          },
271  
272          first: function() {
273                  return this.eq( 0 );
274          },
275  
276          last: function() {
277                  return this.eq( -1 );
278          },
279  
280          slice: function() {
281                  return this.pushStack( slice.apply( this, arguments ),
282                          "slice", slice.call(arguments).join(",") );
283          },
284  
285          map: function( callback ) {
286                  return this.pushStack( jQuery.map(this, function( elem, i ) {
287                          return callback.call( elem, i, elem );
288                  }));
289          },
290         
291          end: function() {
292                  return this.prevObject || jQuery(null);
293          },
294  
295          // For internal use only.
296          // Behaves like an Array's method, not like a jQuery method.
297          push: push,
298          sort: [].sort,
299          splice: [].splice
300  };
301  
302  // Give the init function the jQuery prototype for later instantiation
303  jQuery.fn.init.prototype = jQuery.fn;
304  
305  jQuery.extend = jQuery.fn.extend = function() {
306          // copy reference to target object
307          var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy;
308  
309          // Handle a deep copy situation
310          if ( typeof target === "boolean" ) {
311                  deep = target;
312                  target = arguments[1] || {};
313                  // skip the boolean and the target
314                  i = 2;
315          }
316  
317          // Handle case when target is a string or something (possible in deep copy)
318          if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
319                  target = {};
320          }
321  
322          // extend jQuery itself if only one argument is passed
323          if ( length === i ) {
324                  target = this;
325                  --i;
326          }
327  
328          for ( ; i < length; i++ ) {
329                  // Only deal with non-null/undefined values
330                  if ( (options = arguments[ i ]) != null ) {
331                          // Extend the base object
332                          for ( name in options ) {
333                                  src = target[ name ];
334                                  copy = options[ name ];
335  
336                                  // Prevent never-ending loop
337                                  if ( target === copy ) {
338                                          continue;
339                                  }
340  
341                                  // Recurse if we're merging object literal values or arrays
342                                  if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) {
343                                          var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src
344                                                  : jQuery.isArray(copy) ? [] : {};
345  
346                                          // Never move original objects, clone them
347                                          target[ name ] = jQuery.extend( deep, clone, copy );
348  
349                                  // Don't bring in undefined values
350                                  } else if ( copy !== undefined ) {
351                                          target[ name ] = copy;
352                                  }
353                          }
354                  }
355          }
356  
357          // Return the modified object
358          return target;
359  };
360  
361  jQuery.extend({
362          noConflict: function( deep ) {
363                  window.$ = _$;
364  
365                  if ( deep ) {
366                          window.jQuery = _jQuery;
367                  }
368  
369                  return jQuery;
370          },
371         
372          // Is the DOM ready to be used? Set to true once it occurs.
373          isReady: false,
374         
375          // Handle when the DOM is ready
376          ready: function() {
377                  // Make sure that the DOM is not already loaded
378                  if ( !jQuery.isReady ) {
379                          // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
380                          if ( !document.body ) {
381                                  return setTimeout( jQuery.ready, 13 );
382                          }
383  
384                          // Remember that the DOM is ready
385                          jQuery.isReady = true;
386  
387                          // If there are functions bound, to execute
388                          if ( readyList ) {
389                                  // Execute all of them
390                                  var fn, i = 0;
391                                  while ( (fn = readyList[ i++ ]) ) {
392                                          fn.call( document, jQuery );
393                                  }
394  
395                                  // Reset the list of functions
396                                  readyList = null;
397                          }
398  
399                          // Trigger any bound ready events
400                          if ( jQuery.fn.triggerHandler ) {
401                                  jQuery( document ).triggerHandler( "ready" );
402                          }
403                  }
404          },
405         
406          bindReady: function() {
407                  if ( readyBound ) {
408                          return;
409                  }
410  
411                  readyBound = true;
412  
413                  // Catch cases where $(document).ready() is called after the
414                  // browser event has already occurred.
415                  if ( document.readyState === "complete" ) {
416                          return jQuery.ready();
417                  }
418  
419                  // Mozilla, Opera and webkit nightlies currently support this event
420                  if ( document.addEventListener ) {
421                          // Use the handy event callback
422                          document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
423                         
424                          // A fallback to window.onload, that will always work
425                          window.addEventListener( "load", jQuery.ready, false );
426  
427                  // If IE event model is used
428                  } else if ( document.attachEvent ) {
429                          // ensure firing before onload,
430                          // maybe late but safe also for iframes
431                          document.attachEvent("onreadystatechange", DOMContentLoaded);
432                         
433                          // A fallback to window.onload, that will always work
434                          window.attachEvent( "onload", jQuery.ready );
435  
436                          // If IE and not a frame
437                          // continually check to see if the document is ready
438                          var toplevel = false;
439  
440                          try {
441                                  toplevel = window.frameElement == null;
442                          } catch(e) {}
443  
444                          if ( document.documentElement.doScroll && toplevel ) {
445                                  doScrollCheck();
446                          }
447                  }
448          },
449  
450          // See test/unit/core.js for details concerning isFunction.
451          // Since version 1.3, DOM methods and functions like alert
452          // aren't supported. They return false on IE (#2968).
453          isFunction: function( obj ) {
454                  return toString.call(obj) === "[object Function]";
455          },
456  
457          isArray: function( obj ) {
458                  return toString.call(obj) === "[object Array]";
459          },
460  
461          isPlainObject: function( obj ) {
462                  // Must be an Object.
463                  // Because of IE, we also have to check the presence of the constructor property.
464                  // Make sure that DOM nodes and window objects don't pass through, as well
465                  if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) {
466                          return false;
467                  }
468                 
469                  // Not own constructor property must be Object
470                  if ( obj.constructor
471                          && !hasOwnProperty.call(obj, "constructor")
472                          && !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) {
473                          return false;
474                  }
475                 
476                  // Own properties are enumerated firstly, so to speed up,
477                  // if last one is own, then all properties are own.
478         
479                  var key;
480                  for ( key in obj ) {}
481                 
482                  return key === undefined || hasOwnProperty.call( obj, key );
483          },
484  
485          isEmptyObject: function( obj ) {
486                  for ( var name in obj ) {
487                          return false;
488                  }
489                  return true;
490          },
491         
492          error: function( msg ) {
493                  throw msg;
494          },
495         
496          parseJSON: function( data ) {
497                  if ( typeof data !== "string" || !data ) {
498                          return null;
499                  }
500  
501                  // Make sure leading/trailing whitespace is removed (IE can't handle it)
502                  data = jQuery.trim( data );
503                 
504                  // Make sure the incoming data is actual JSON
505                  // Logic borrowed from http://json.org/json2.js
506                  if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
507                          .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
508                          .replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) {
509  
510                          // Try to use the native JSON parser first
511                          return window.JSON && window.JSON.parse ?
512                                  window.JSON.parse( data ) :
513                                  (new Function("return " + data))();
514  
515                  } else {
516                          jQuery.error( "Invalid JSON: " + data );
517                  }
518          },
519  
520          noop: function() {},
521  
522          // Evalulates a script in a global context
523          globalEval: function( data ) {
524                  if ( data && rnotwhite.test(data) ) {
525                          // Inspired by code by Andrea Giammarchi
526                          // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
527                          var head = document.getElementsByTagName("head")[0] || document.documentElement,
528                                  script = document.createElement("script");
529  
530                          script.type = "text/javascript";
531  
532                          if ( jQuery.support.scriptEval ) {
533                                  script.appendChild( document.createTextNode( data ) );
534                          } else {
535                                  script.text = data;
536                          }
537  
538                          // Use insertBefore instead of appendChild to circumvent an IE6 bug.
539                          // This arises when a base node is used (#2709).
540                          head.insertBefore( script, head.firstChild );
541                          head.removeChild( script );
542                  }
543          },
544  
545          nodeName: function( elem, name ) {
546                  return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
547          },
548  
549          // args is for internal usage only
550          each: function( object, callback, args ) {
551                  var name, i = 0,
552                          length = object.length,
553                          isObj = length === undefined || jQuery.isFunction(object);
554  
555                  if ( args ) {
556                          if ( isObj ) {
557                                  for ( name in object ) {
558                                          if ( callback.apply( object[ name ], args ) === false ) {
559                                                  break;
560                                          }
561                                  }
562                          } else {
563                                  for ( ; i < length; ) {
564                                          if ( callback.apply( object[ i++ ], args ) === false ) {
565                                                  break;
566                                          }
567                                  }
568                          }
569  
570                  // A special, fast, case for the most common use of each
571                  } else {
572                          if ( isObj ) {
573                                  for ( name in object ) {
574                                          if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
575                                                  break;
576                                          }
577                                  }
578                          } else {
579                                  for ( var value = object[0];
580                                          i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
581                          }
582                  }
583  
584                  return object;
585          },
586  
587          trim: function( text ) {
588                  return (text || "").replace( rtrim, "" );
589          },
590  
591          // results is for internal usage only
592          makeArray: function( array, results ) {
593                  var ret = results || [];
594  
595                  if ( array != null ) {
596                          // The window, strings (and functions) also have 'length'
597                          // The extra typeof function check is to prevent crashes
598                          // in Safari 2 (See: #3039)
599                          if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) {
600                                  push.call( ret, array );
601                          } else {
602                                  jQuery.merge( ret, array );
603                          }
604                  }
605  
606                  return ret;
607          },
608  
609          inArray: function( elem, array ) {
610                  if ( array.indexOf ) {
611                          return array.indexOf( elem );
612                  }
613  
614                  for ( var i = 0, length = array.length; i < length; i++ ) {
615                          if ( array[ i ] === elem ) {
616                                  return i;
617                          }
618                  }
619  
620                  return -1;
621          },
622  
623          merge: function( first, second ) {
624                  var i = first.length, j = 0;
625  
626                  if ( typeof second.length === "number" ) {
627                          for ( var l = second.length; j < l; j++ ) {
628                                  first[ i++ ] = second[ j ];
629                          }
630                 
631                  } else {
632                          while ( second[j] !== undefined ) {
633                                  first[ i++ ] = second[ j++ ];
634                          }
635                  }
636  
637                  first.length = i;
638  
639                  return first;
640          },
641  
642          grep: function( elems, callback, inv ) {
643                  var ret = [];
644  
645                  // Go through the array, only saving the items
646                  // that pass the validator function
647                  for ( var i = 0, length = elems.length; i < length; i++ ) {
648                          if ( !inv !== !callback( elems[ i ], i ) ) {
649                                  ret.push( elems[ i ] );
650                          }
651                  }
652  
653                  return ret;
654          },
655  
656          // arg is for internal usage only
657          map: function( elems, callback, arg ) {
658                  var ret = [], value;
659  
660                  // Go through the array, translating each of the items to their
661                  // new value (or values).
662                  for ( var i = 0, length = elems.length; i < length; i++ ) {
663                          value = callback( elems[ i ], i, arg );
664  
665                          if ( value != null ) {
666                                  ret[ ret.length ] = value;
667                          }
668                  }
669  
670                  return ret.concat.apply( [], ret );
671          },
672  
673          // A global GUID counter for objects
674          guid: 1,
675  
676          proxy: function( fn, proxy, thisObject ) {
677                  if ( arguments.length === 2 ) {
678                          if ( typeof proxy === "string" ) {
679                                  thisObject = fn;
680                                  fn = thisObject[ proxy ];
681                                  proxy = undefined;
682  
683                          } else if ( proxy && !jQuery.isFunction( proxy ) ) {
684                                  thisObject = proxy;
685                                  proxy = undefined;
686                          }
687                  }
688  
689                  if ( !proxy && fn ) {
690                          proxy = function() {
691                                  return fn.apply( thisObject || this, arguments );
692                          };
693                  }
694  
695                  // Set the guid of unique handler to the same of original handler, so it can be removed
696                  if ( fn ) {
697                          proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
698                  }
699  
700                  // So proxy can be declared as an argument
701                  return proxy;
702          },
703  
704          // Use of jQuery.browser is frowned upon.
705          // More details: http://docs.jquery.com/Utilities/jQuery.browser
706          uaMatch: function( ua ) {
707                  ua = ua.toLowerCase();
708  
709                  var match = /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
710                          /(opera)(?:.*version)?[ \/]([\w.]+)/.exec( ua ) ||
711                          /(msie) ([\w.]+)/.exec( ua ) ||
712                          !/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec( ua ) ||
713                          [];
714  
715                  return { browser: match[1] || "", version: match[2] || "0" };
716          },
717  
718          browser: {}
719  });
720  
721  browserMatch = jQuery.uaMatch( userAgent );
722  if ( browserMatch.browser ) {
723          jQuery.browser[ browserMatch.browser ] = true;
724          jQuery.browser.version = browserMatch.version;
725  }
726  
727  // Deprecated, use jQuery.browser.webkit instead
728  if ( jQuery.browser.webkit ) {
729          jQuery.browser.safari = true;
730  }
731  
732  if ( indexOf ) {
733          jQuery.inArray = function( elem, array ) {
734                  return indexOf.call( array, elem );
735          };
736  }
737  
738  // All jQuery objects should point back to these
739  rootjQuery = jQuery(document);
740  
741  // Cleanup functions for the document ready method
742  if ( document.addEventListener ) {
743          DOMContentLoaded = function() {
744                  document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
745                  jQuery.ready();
746          };
747  
748  } else if ( document.attachEvent ) {
749          DOMContentLoaded = function() {
750                  // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
751                  if ( document.readyState === "complete" ) {
752                          document.detachEvent( "onreadystatechange", DOMContentLoaded );
753                          jQuery.ready();
754                  }
755          };
756  }
757  
758  // The DOM ready check for Internet Explorer
759  function doScrollCheck() {
760          if ( jQuery.isReady ) {
761                  return;
762          }
763  
764          try {
765                  // If IE is used, use the trick by Diego Perini
766                  // http://javascript.nwbox.com/IEContentLoaded/
767                  document.documentElement.doScroll("left");
768          } catch( error ) {
769                  setTimeout( doScrollCheck, 1 );
770                  return;
771          }
772  
773          // and execute any waiting functions
774          jQuery.ready();
775  }
776  
777  function evalScript( i, elem ) {
778          if ( elem.src ) {
779                  jQuery.ajax({
780                          url: elem.src,
781                          async: false,
782                          dataType: "script"
783                  });
784          } else {
785                  jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
786          }
787  
788          if ( elem.parentNode ) {
789                  elem.parentNode.removeChild( elem );
790          }
791  }
792  
793  // Mutifunctional method to get and set values to a collection
794  // The value/s can be optionally by executed if its a function
795  function access( elems, key, value, exec, fn, pass ) {
796          var length = elems.length;
797         
798          // Setting many attributes
799          if ( typeof key === "object" ) {
800                  for ( var k in key ) {
801                          access( elems, k, key[k], exec, fn, value );
802                  }
803                  return elems;
804          }
805         
806          // Setting one attribute
807          if ( value !== undefined ) {
808                  // Optionally, function values get executed if exec is true
809                  exec = !pass && exec && jQuery.isFunction(value);
810                 
811                  for ( var i = 0; i < length; i++ ) {
812                          fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
813                  }
814                 
815                  return elems;
816          }
817         
818          // Getting an attribute
819          return length ? fn( elems[0], key ) : undefined;
820  }
821  
822  function now() {
823          return (new Date).getTime();
824  }
825  (function() {
826  
827          jQuery.support = {};
828  
829          var root = document.documentElement,
830                  script = document.createElement("script"),
831                  div = document.createElement("div"),
832                  id = "script" + now();
833  
834          div.style.display = "none";
835          div.innerHTML = "   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
836  
837          var all = div.getElementsByTagName("*"),
838                  a = div.getElementsByTagName("a")[0];
839  
840          // Can't get basic test support
841          if ( !all || !all.length || !a ) {
842                  return;
843          }
844  
845          jQuery.support = {
846                  // IE strips leading whitespace when .innerHTML is used
847                  leadingWhitespace: div.firstChild.nodeType === 3,
848  
849                  // Make sure that tbody elements aren't automatically inserted
850                  // IE will insert them into empty tables
851                  tbody: !div.getElementsByTagName("tbody").length,
852  
853                  // Make sure that link elements get serialized correctly by innerHTML
854                  // This requires a wrapper element in IE
855                  htmlSerialize: !!div.getElementsByTagName("link").length,
856  
857                  // Get the style information from getAttribute
858                  // (IE uses .cssText insted)
859                  style: /red/.test( a.getAttribute("style") ),
860  
861                  // Make sure that URLs aren't manipulated
862                  // (IE normalizes it by default)
863                  hrefNormalized: a.getAttribute("href") === "/a",
864  
865                  // Make sure that element opacity exists
866                  // (IE uses filter instead)
867                  // Use a regex to work around a WebKit issue. See #5145
868                  opacity: /^0.55$/.test( a.style.opacity ),
869  
870                  // Verify style float existence
871                  // (IE uses styleFloat instead of cssFloat)
872                  cssFloat: !!a.style.cssFloat,
873  
874                  // Make sure that if no value is specified for a checkbox
875                  // that it defaults to "on".
876                  // (WebKit defaults to "" instead)
877                  checkOn: div.getElementsByTagName("input")[0].value === "on",
878  
879                  // Make sure that a selected-by-default option has a working selected property.
880                  // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
881                  optSelected: document.createElement("select").appendChild( document.createElement("option") ).selected,
882  
883                  parentNode: div.removeChild( div.appendChild( document.createElement("div") ) ).parentNode === null,
884  
885                  // Will be defined later
886                  deleteExpando: true,
887                  checkClone: false,
888                  scriptEval: false,
889                  noCloneEvent: true,
890                  boxModel: null
891          };
892  
893          script.type = "text/javascript";
894          try {
895                  script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
896          } catch(e) {}
897  
898          root.insertBefore( script, root.firstChild );
899  
900          // Make sure that the execution of code works by injecting a script
901          // tag with appendChild/createTextNode
902          // (IE doesn't support this, fails, and uses .text instead)
903          if ( window[ id ] ) {
904                  jQuery.support.scriptEval = true;
905                  delete window[ id ];
906          }
907  
908          // Test to see if it's possible to delete an expando from an element
909          // Fails in Internet Explorer
910          try {
911                  delete script.test;
912         
913          } catch(e) {
914                  jQuery.support.deleteExpando = false;
915          }
916  
917          root.removeChild( script );
918  
919          if ( div.attachEvent && div.fireEvent ) {
920                  div.attachEvent("onclick", function click() {
921                          // Cloning a node shouldn't copy over any
922                          // bound event handlers (IE does this)
923                          jQuery.support.noCloneEvent = false;
924                          div.detachEvent("onclick", click);
925                  });
926                  div.cloneNode(true).fireEvent("onclick");
927          }
928  
929          div = document.createElement("div");
930          div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
931  
932          var fragment = document.createDocumentFragment();
933          fragment.appendChild( div.firstChild );
934  
935          // WebKit doesn't clone checked state correctly in fragments
936          jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
937  
938          // Figure out if the W3C box model works as expected
939          // document.body must exist before we can do this
940          jQuery(function() {
941                  var div = document.createElement("div");
942                  div.style.width = div.style.paddingLeft = "1px";
943  
944                  document.body.appendChild( div );
945                  jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
946                  document.body.removeChild( div ).style.display = 'none';
947  
948                  div = null;
949          });
950  
951          // Technique from Juriy Zaytsev
952          // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
953          var eventSupported = function( eventName ) { 
954                  var el = document.createElement("div"); 
955                  eventName = "on" + eventName; 
956  
957                  var isSupported = (eventName in el); 
958                  if ( !isSupported ) { 
959                          el.setAttribute(eventName, "return;"); 
960                          isSupported = typeof el[eventName] === "function"; 
961                  } 
962                  el = null; 
963  
964                  return isSupported; 
965          };
966         
967          jQuery.support.submitBubbles = eventSupported("submit");
968          jQuery.support.changeBubbles = eventSupported("change");
969  
970          // release memory in IE
971          root = script = div = all = a = null;
972  })();
973  
974  jQuery.props = {
975          "for": "htmlFor",
976          "class": "className",
977          readonly: "readOnly",
978          maxlength: "maxLength",
979          cellspacing: "cellSpacing",
980          rowspan: "rowSpan",
981          colspan: "colSpan",
982          tabindex: "tabIndex",
983          usemap: "useMap",
984          frameborder: "frameBorder"
985  };
986  var expando = "jQuery" + now(), uuid = 0, windowData = {};
987  
988  jQuery.extend({
989          cache: {},
990         
991          expando:expando,
992  
993          // The following elements throw uncatchable exceptions if you
994          // attempt to add expando properties to them.
995          noData: {
996                  "embed": true,
997                  "object": true,
998                  "applet": true
999          },
1000  
1001          data: function( elem, name, data ) {
1002                  if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
1003                          return;
1004                  }
1005  
1006                  elem = elem == window ?
1007                          windowData :
1008                          elem;
1009  
1010                  var id = elem[ expando ], cache = jQuery.cache, thisCache;
1011  
1012                  if ( !id && typeof name === "string" && data === undefined ) {
1013                          return null;
1014                  }
1015  
1016                  // Compute a unique ID for the element
1017                  if ( !id ) { 
1018                          id = ++uuid;
1019                  }
1020  
1021                  // Avoid generating a new cache unless none exists and we
1022                  // want to manipulate it.
1023                  if ( typeof name === "object" ) {
1024                          elem[ expando ] = id;
1025                          thisCache = cache[ id ] = jQuery.extend(true, {}, name);
1026  
1027                  } else if ( !cache[ id ] ) {
1028                          elem[ expando ] = id;
1029                          cache[ id ] = {};
1030                  }
1031  
1032                  thisCache = cache[ id ];
1033  
1034                  // Prevent overriding the named cache with undefined values
1035                  if ( data !== undefined ) {
1036                          thisCache[ name ] = data;
1037                  }
1038  
1039                  return typeof name === "string" ? thisCache[ name ] : thisCache;
1040          },
1041  
1042          removeData: function( elem, name ) {
1043                  if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
1044                          return;
1045                  }
1046  
1047                  elem = elem == window ?
1048                          windowData :
1049                          elem;
1050  
1051                  var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ];
1052  
1053                  // If we want to remove a specific section of the element's data
1054                  if ( name ) {
1055                          if ( thisCache ) {
1056                                  // Remove the section of cache data
1057                                  delete thisCache[ name ];
1058  
1059                                  // If we've removed all the data, remove the element's cache
1060                                  if ( jQuery.isEmptyObject(thisCache) ) {
1061                                          jQuery.removeData( elem );
1062                                  }
1063                          }
1064  
1065                  // Otherwise, we want to remove all of the element's data
1066                  } else {
1067                          if ( jQuery.support.deleteExpando ) {
1068                                  delete elem[ jQuery.expando ];
1069  
1070                          } else if ( elem.removeAttribute ) {
1071                                  elem.removeAttribute( jQuery.expando );
1072                          }
1073  
1074                          // Completely remove the data cache
1075                          delete cache[ id ];
1076                  }
1077          }
1078  });
1079  
1080  jQuery.fn.extend({
1081          data: function( key, value ) {
1082                  if ( typeof key === "undefined" && this.length ) {
1083                          return jQuery.data( this[0] );
1084  
1085                  } else if ( typeof key === "object" ) {
1086                          return this.each(function() {
1087                                  jQuery.data( this, key );
1088                          });
1089                  }
1090  
1091                  var parts = key.split(".");
1092                  parts[1] = parts[1] ? "." + parts[1] : "";
1093  
1094                  if ( value === undefined ) {
1095                          var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1096  
1097                          if ( data === undefined && this.length ) {
1098                                  data = jQuery.data( this[0], key );
1099                          }
1100                          return data === undefined && parts[1] ?
1101                                  this.data( parts[0] ) :
1102                                  data;
1103                  } else {
1104                          return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function() {
1105                                  jQuery.data( this, key, value );
1106                          });
1107                  }
1108          },
1109  
1110          removeData: function( key ) {
1111                  return this.each(function() {
1112                          jQuery.removeData( this, key );
1113                  });
1114          }
1115  });
1116  jQuery.extend({
1117          queue: function( elem, type, data ) {
1118                  if ( !elem ) {
1119                          return;
1120                  }
1121  
1122                  type = (type || "fx") + "queue";
1123                  var q = jQuery.data( elem, type );
1124  
1125                  // Speed up dequeue by getting out quickly if this is just a lookup
1126                  if ( !data ) {
1127                          return q || [];
1128                  }
1129  
1130                  if ( !q || jQuery.isArray(data) ) {
1131                          q = jQuery.data( elem, type, jQuery.makeArray(data) );
1132  
1133                  } else {
1134                          q.push( data );
1135                  }
1136  
1137                  return q;
1138          },
1139  
1140          dequeue: function( elem, type ) {
1141                  type = type || "fx";
1142  
1143                  var queue = jQuery.queue( elem, type ), fn = queue.shift();
1144  
1145                  // If the fx queue is dequeued, always remove the progress sentinel
1146                  if ( fn === "inprogress" ) {
1147                          fn = queue.shift();
1148                  }
1149  
1150                  if ( fn ) {
1151                          // Add a progress sentinel to prevent the fx queue from being
1152                          // automatically dequeued
1153                          if ( type === "fx" ) {
1154                                  queue.unshift("inprogress");
1155                          }
1156  
1157                          fn.call(elem, function() {
1158                                  jQuery.dequeue(elem, type);
1159                          });
1160                  }
1161          }
1162  });
1163  
1164  jQuery.fn.extend({
1165          queue: function( type, data ) {
1166                  if ( typeof type !== "string" ) {
1167                          data = type;
1168                          type = "fx";
1169                  }
1170  
1171                  if ( data === undefined ) {
1172                          return jQuery.queue( this[0], type );
1173                  }
1174                  return this.each(function( i, elem ) {
1175                          var queue = jQuery.queue( this, type, data );
1176  
1177                          if ( type === "fx" && queue[0] !== "inprogress" ) {
1178                                  jQuery.dequeue( this, type );
1179                          }
1180                  });
1181          },
1182          dequeue: function( type ) {
1183                  return this.each(function() {
1184                          jQuery.dequeue( this, type );
1185                  });
1186          },
1187  
1188          // Based off of the plugin by Clint Helfers, with permission.
1189          // http://blindsignals.com/index.php/2009/07/jquery-delay/
1190          delay: function( time, type ) {
1191                  time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
1192                  type = type || "fx";
1193  
1194                  return this.queue( type, function() {
1195                          var elem = this;
1196                          setTimeout(function() {
1197                                  jQuery.dequeue( elem, type );
1198                          }, time );
1199                  });
1200          },
1201  
1202          clearQueue: function( type ) {
1203                  return this.queue( type || "fx", [] );
1204          }
1205  });
1206  var rclass = /[\n\t]/g,
1207          rspace = /\s+/,
1208          rreturn = /\r/g,
1209          rspecialurl = /href|src|style/,
1210          rtype = /(button|input)/i,
1211          rfocusable = /(button|input|object|select|textarea)/i,
1212          rclickable = /^(a|area)$/i,
1213          rradiocheck = /radio|checkbox/;
1214  
1215  jQuery.fn.extend({
1216          attr: function( name, value ) {
1217                  return access( this, name, value, true, jQuery.attr );
1218          },
1219  
1220          removeAttr: function( name, fn ) {
1221                  return this.each(function(){
1222                          jQuery.attr( this, name, "" );
1223                          if ( this.nodeType === 1 ) {
1224                                  this.removeAttribute( name );
1225                          }
1226                  });
1227          },
1228  
1229          addClass: function( value ) {
1230                  if ( jQuery.isFunction(value) ) {
1231                          return this.each(function(i) {
1232                                  var self = jQuery(this);
1233                                  self.addClass( value.call(this, i, self.attr("class")) );
1234                          });
1235                  }
1236  
1237                  if ( value && typeof value === "string" ) {
1238                          var classNames = (value || "").split( rspace );
1239  
1240                          for ( var i = 0, l = this.length; i < l; i++ ) {
1241                                  var elem = this[i];
1242  
1243                                  if ( elem.nodeType === 1 ) {
1244                                          if ( !elem.className ) {
1245                                                  elem.className = value;
1246  
1247                                          } else {
1248                                                  var className = " " + elem.className + " ", setClass = elem.className;
1249                                                  for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
1250                                                          if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
1251                                                                  setClass += " " + classNames[c];
1252                                                          }
1253                                                  }
1254                                                  elem.className = jQuery.trim( setClass );
1255                                          }
1256                                  }
1257                          }
1258                  }
1259  
1260                  return this;
1261          },
1262  
1263          removeClass: function( value ) {
1264                  if ( jQuery.isFunction(value) ) {
1265                          return this.each(function(i) {
1266                                  var self = jQuery(this);
1267                                  self.removeClass( value.call(this, i, self.attr("class")) );
1268                          });
1269                  }
1270  
1271                  if ( (value && typeof value === "string") || value === undefined ) {
1272                          var classNames = (value || "").split(rspace);
1273  
1274                          for ( var i = 0, l = this.length; i < l; i++ ) {
1275                                  var elem = this[i];
1276  
1277                                  if ( elem.nodeType === 1 && elem.className ) {
1278                                          if ( value ) {
1279                                                  var className = (" " + elem.className + " ").replace(rclass, " ");
1280                                                  for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
1281                                                          className = className.replace(" " + classNames[c] + " ", " ");
1282                                                  }
1283                                                  elem.className = jQuery.trim( className );
1284  
1285                                          } else {
1286                                                  elem.className = "";
1287                                          }
1288                                  }
1289                          }
1290                  }
1291  
1292                  return this;
1293          },
1294  
1295          toggleClass: function( value, stateVal ) {
1296                  var type = typeof value, isBool = typeof stateVal === "boolean";
1297  
1298                  if ( jQuery.isFunction( value ) ) {
1299                          return this.each(function(i) {
1300                                  var self = jQuery(this);
1301                                  self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
1302                          });
1303                  }
1304  
1305                  return this.each(function() {
1306                          if ( type === "string" ) {
1307                                  // toggle individual class names
1308                                  var className, i = 0, self = jQuery(this),
1309                                          state = stateVal,
1310                                          classNames = value.split( rspace );
1311  
1312                                  while ( (className = classNames[ i++ ]) ) {
1313                                          // check each className given, space seperated list
1314                                          state = isBool ? state : !self.hasClass( className );
1315                                          self[ state ? "addClass" : "removeClass" ]( className );
1316                                  }
1317  
1318                          } else if ( type === "undefined" || type === "boolean" ) {
1319                                  if ( this.className ) {
1320                                          // store className if set
1321                                          jQuery.data( this, "__className__", this.className );
1322                                  }
1323  
1324                                  // toggle whole className
1325                                  this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || "";
1326                          }
1327                  });
1328          },
1329  
1330          hasClass: function( selector ) {
1331                  var className = " " + selector + " ";
1332                  for ( var i = 0, l = this.length; i < l; i++ ) {
1333                          if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
1334                                  return true;
1335                          }
1336                  }
1337  
1338                  return false;
1339          },
1340  
1341          val: function( value ) {
1342                  if ( value === undefined ) {
1343                          var elem = this[0];
1344  
1345                          if ( elem ) {
1346                                  if ( jQuery.nodeName( elem, "option" ) ) {
1347                                          return (elem.attributes.value || {}).specified ? elem.value : elem.text;
1348                                  }
1349  
1350                                  // We need to handle select boxes special
1351                                  if ( jQuery.nodeName( elem, "select" ) ) {
1352                                          var index = elem.selectedIndex,
1353                                                  values = [],
1354                                                  options = elem.options,
1355                                                  one = elem.type === "select-one";
1356  
1357                                          // Nothing was selected
1358                                          if ( index < 0 ) {
1359                                                  return null;
1360                                          }
1361  
1362                                          // Loop through all the selected options
1363                                          for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
1364                                                  var option = options[ i ];
1365  
1366                                                  if ( option.selected ) {
1367                                                          // Get the specifc value for the option
1368                                                          value = jQuery(option).val();
1369  
1370                                                          // We don't need an array for one selects
1371                                                          if ( one ) {
1372                                                                  return value;
1373                                                          }
1374  
1375                                                          // Multi-Selects return an array
1376                                                          values.push( value );
1377                                                  }
1378                                          }
1379  
1380                                          return values;
1381                                  }
1382  
1383                                  // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
1384                                  if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
1385                                          return elem.getAttribute("value") === null ? "on" : elem.value;
1386                                  }
1387                                 
1388  
1389                                  // Everything else, we just grab the value
1390                                  return (elem.value || "").replace(rreturn, "");
1391  
1392                          }
1393  
1394                          return undefined;
1395                  }
1396  
1397                  var isFunction = jQuery.isFunction(value);
1398  
1399                  return this.each(function(i) {
1400                          var self = jQuery(this), val = value;
1401  
1402                          if ( this.nodeType !== 1 ) {
1403                                  return;
1404                          }
1405  
1406                          if ( isFunction ) {
1407                                  val = value.call(this, i, self.val());
1408                          }
1409  
1410                          // Typecast each time if the value is a Function and the appended
1411                          // value is therefore different each time.
1412                          if ( typeof val === "number" ) {
1413                                  val += "";
1414                          }
1415  
1416                          if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
1417                                  this.checked = jQuery.inArray( self.val(), val ) >= 0;
1418  
1419                          } else if ( jQuery.nodeName( this, "select" ) ) {
1420                                  var values = jQuery.makeArray(val);
1421  
1422                                  jQuery( "option", this ).each(function() {
1423                                          this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
1424                                  });
1425  
1426                                  if ( !values.length ) {
1427                                          this.selectedIndex = -1;
1428                                  }
1429  
1430                          } else {
1431                                  this.value = val;
1432                          }
1433                  });
1434          }
1435  });
1436  
1437  jQuery.extend({
1438          attrFn: {
1439                  val: true,
1440                  css: true,
1441                  html: true,
1442                  text: true,
1443                  data: true,
1444                  width: true,
1445                  height: true,
1446                  offset: true
1447          },
1448                 
1449          attr: function( elem, name, value, pass ) {
1450                  // don't set attributes on text and comment nodes
1451                  if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
1452                          return undefined;
1453                  }
1454  
1455                  if ( pass && name in jQuery.attrFn ) {
1456                          return jQuery(elem)[name](value);
1457                  }
1458  
1459                  var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
1460                          // Whether we are setting (or getting)
1461                          set = value !== undefined;
1462  
1463                  // Try to normalize/fix the name
1464                  name = notxml && jQuery.props[ name ] || name;
1465  
1466                  // Only do all the following if this is a node (faster for style)
1467                  if ( elem.nodeType === 1 ) {
1468                          // These attributes require special treatment
1469                          var special = rspecialurl.test( name );
1470  
1471                          // Safari mis-reports the default selected property of an option
1472                          // Accessing the parent's selectedIndex property fixes it
1473                          if ( name === "selected" && !jQuery.support.optSelected ) {
1474                                  var parent = elem.parentNode;
1475                                  if ( parent ) {
1476                                          parent.selectedIndex;
1477         
1478                                          // Make sure that it also works with optgroups, see #5701
1479                                          if ( parent.parentNode ) {
1480                                                  parent.parentNode.selectedIndex;
1481                                          }
1482                                  }
1483                          }
1484  
1485                          // If applicable, access the attribute via the DOM 0 way
1486                          if ( name in elem && notxml && !special ) {
1487                                  if ( set ) {
1488                                          // We can't allow the type property to be changed (since it causes problems in IE)
1489                                          if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
1490                                                  jQuery.error( "type property can't be changed" );
1491                                          }
1492  
1493                                          elem[ name ] = value;
1494                                  }
1495  
1496                                  // browsers index elements by id/name on forms, give priority to attributes.
1497                                  if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
1498                                          return elem.getAttributeNode( name ).nodeValue;
1499                                  }
1500  
1501                                  // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
1502                                  // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
1503                                  if ( name === "tabIndex" ) {
1504                                          var attributeNode = elem.getAttributeNode( "tabIndex" );
1505  
1506                                          return attributeNode && attributeNode.specified ?
1507                                                  attributeNode.value :
1508                                                  rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
1509                                                          0 :
1510                                                          undefined;
1511                                  }
1512  
1513                                  return elem[ name ];
1514                          }
1515  
1516                          if ( !jQuery.support.style && notxml && name === "style" ) {
1517                                  if ( set ) {
1518                                          elem.style.cssText = "" + value;
1519                                  }
1520  
1521                                  return elem.style.cssText;
1522                          }
1523  
1524                          if ( set ) {
1525                                  // convert the value to a string (all browsers do this but IE) see #1070
1526                                  elem.setAttribute( name, "" + value );
1527                          }
1528  
1529                          var attr = !jQuery.support.hrefNormalized && notxml && special ?
1530                                          // Some attributes require a special call on IE
1531                                          elem.getAttribute( name, 2 ) :
1532                                          elem.getAttribute( name );
1533  
1534                          // Non-existent attributes return null, we normalize to undefined
1535                          return attr === null ? undefined : attr;
1536                  }
1537  
1538                  // elem is actually elem.style ... set the style
1539                  // Using attr for specific style information is now deprecated. Use style instead.
1540                  return jQuery.style( elem, name, value );
1541          }
1542  });
1543  var rnamespaces = /\.(.*)$/,
1544          fcleanup = function( nm ) {
1545                  return nm.replace(/[^\w\s\.\|`]/g, function( ch ) {
1546                          return "\\" + ch;
1547                  });
1548          };
1549  
1550  /*
1551   * A number of helper functions used for managing events.
1552   * Many of the ideas behind this code originated from
1553   * Dean Edwards' addEvent library.
1554   */
1555  jQuery.event = {
1556  
1557          // Bind an event to an element
1558          // Original by Dean Edwards
1559          add: function( elem, types, handler, data ) {
1560                  if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
1561                          return;
1562                  }
1563  
1564                  // For whatever reason, IE has trouble passing the window object
1565                  // around, causing it to be cloned in the process
1566                  if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) {
1567                          elem = window;
1568                  }
1569  
1570                  var handleObjIn, handleObj;
1571  
1572                  if ( handler.handler ) {
1573                          handleObjIn = handler;
1574                          handler = handleObjIn.handler;
1575                  }
1576  
1577                  // Make sure that the function being executed has a unique ID
1578                  if ( !handler.guid ) {
1579                          handler.guid = jQuery.guid++;
1580                  }
1581  
1582                  // Init the element's event structure
1583                  var elemData = jQuery.data( elem );
1584  
1585                  // If no elemData is found then we must be trying to bind to one of the
1586                  // banned noData elements
1587                  if ( !elemData ) {
1588                          return;
1589                  }
1590  
1591                  var events = elemData.events = elemData.events || {},
1592                          eventHandle = elemData.handle, eventHandle;
1593  
1594                  if ( !eventHandle ) {
1595                          elemData.handle = eventHandle = function() {
1596                                  // Handle the second event of a trigger and when
1597                                  // an event is called after a page has unloaded
1598                                  return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
1599                                          jQuery.event.handle.apply( eventHandle.elem, arguments ) :
1600                                          undefined;
1601                          };
1602                  }
1603  
1604                  // Add elem as a property of the handle function
1605                  // This is to prevent a memory leak with non-native events in IE.
1606                  eventHandle.elem = elem;
1607  
1608                  // Handle multiple events separated by a space
1609                  // jQuery(...).bind("mouseover mouseout", fn);
1610                  types = types.split(" ");
1611  
1612                  var type, i = 0, namespaces;
1613  
1614                  while ( (type = types[ i++ ]) ) {
1615                          handleObj = handleObjIn ?
1616                                  jQuery.extend({}, handleObjIn) :
1617                                  { handler: handler, data: data };
1618  
1619                          // Namespaced event handlers
1620                          if ( type.indexOf(".") > -1 ) {
1621                                  namespaces = type.split(".");
1622                                  type = namespaces.shift();
1623                                  handleObj.namespace = namespaces.slice(0).sort().join(".");
1624  
1625                          } else {
1626                                  namespaces = [];
1627                                  handleObj.namespace = "";
1628                          }
1629  
1630                          handleObj.type = type;
1631                          handleObj.guid = handler.guid;
1632  
1633                          // Get the current list of functions bound to this event
1634                          var handlers = events[ type ],
1635                                  special = jQuery.event.special[ type ] || {};
1636  
1637                          // Init the event handler queue
1638                          if ( !handlers ) {
1639                                  handlers = events[ type ] = [];
1640  
1641                                  // Check for a special event handler
1642                                  // Only use addEventListener/attachEvent if the special
1643                                  // events handler returns false
1644                                  if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
1645                                          // Bind the global event handler to the element
1646                                          if ( elem.addEventListener ) {
1647                                                  elem.addEventListener( type, eventHandle, false );
1648  
1649                                          } else if ( elem.attachEvent ) {
1650                                                  elem.attachEvent( "on" + type, eventHandle );
1651                                          }
1652                                  }
1653                          }
1654                         
1655                          if ( special.add ) { 
1656                                  special.add.call( elem, handleObj ); 
1657  
1658                                  if ( !handleObj.handler.guid ) {
1659                                          handleObj.handler.guid = handler.guid;
1660                                  }
1661                          }
1662  
1663                          // Add the function to the element's handler list
1664                          handlers.push( handleObj );
1665  
1666                          // Keep track of which events have been used, for global triggering
1667                          jQuery.event.global[ type ] = true;
1668                  }
1669  
1670                  // Nullify elem to prevent memory leaks in IE
1671                  elem = null;
1672          },
1673  
1674          global: {},
1675  
1676          // Detach an event or set of events from an element
1677          remove: function( elem, types, handler, pos ) {
1678                  // don't do events on text and comment nodes
1679                  if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
1680                          return;
1681                  }
1682  
1683                  var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
1684                          elemData = jQuery.data( elem ),
1685                          events = elemData && elemData.events;
1686  
1687                  if ( !elemData || !events ) {
1688                          return;
1689                  }
1690  
1691                  // types is actually an event object here
1692                  if ( types && types.type ) {
1693                          handler = types.handler;
1694                          types = types.type;
1695                  }
1696  
1697                  // Unbind all events for the element
1698                  if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
1699                          types = types || "";
1700  
1701                          for ( type in events ) {
1702                                  jQuery.event.remove( elem, type + types );
1703                          }
1704  
1705                          return;
1706                  }
1707  
1708                  // Handle multiple events separated by a space
1709                  // jQuery(...).unbind("mouseover mouseout", fn);
1710                  types = types.split(" ");
1711  
1712                  while ( (type = types[ i++ ]) ) {
1713                          origType = type;
1714                          handleObj = null;
1715                          all = type.indexOf(".") < 0;
1716                          namespaces = [];
1717  
1718                          if ( !all ) {
1719                                  // Namespaced event handlers
1720                                  namespaces = type.split(".");
1721                                  type = namespaces.shift();
1722  
1723                                  namespace = new RegExp("(^|\\.)" + 
1724                                          jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)")
1725                          }
1726  
1727                          eventType = events[ type ];
1728  
1729                          if ( !eventType ) {
1730                                  continue;
1731                          }
1732  
1733                          if ( !handler ) {
1734                                  for ( var j = 0; j < eventType.length; j++ ) {
1735                                          handleObj = eventType[ j ];
1736  
1737                                          if ( all || namespace.test( handleObj.namespace ) ) {
1738                                                  jQuery.event.remove( elem, origType, handleObj.handler, j );
1739                                                  eventType.splice( j--, 1 );
1740                                          }
1741                                  }
1742  
1743                                  continue;
1744                          }
1745  
1746                          special = jQuery.event.special[ type ] || {};
1747  
1748                          for ( var j = pos || 0; j < eventType.length; j++ ) {
1749                                  handleObj = eventType[ j ];
1750  
1751                                  if ( handler.guid === handleObj.guid ) {
1752                                          // remove the given handler for the given type
1753                                          if ( all || namespace.test( handleObj.namespace ) ) {
1754                                                  if ( pos == null ) {
1755                                                          eventType.splice( j--, 1 );
1756                                                  }
1757  
1758                                                  if ( special.remove ) {
1759                                                          special.remove.call( elem, handleObj );
1760                                                  }
1761                                          }
1762  
1763                                          if ( pos != null ) {
1764                                                  break;
1765                                          }
1766                                  }
1767                          }
1768  
1769                          // remove generic event handler if no more handlers exist
1770                          if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
1771                                  if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
1772                                          removeEvent( elem, type, elemData.handle );
1773                                  }
1774  
1775                                  ret = null;
1776                                  delete events[ type ];
1777                          }
1778                  }
1779  
1780                  // Remove the expando if it's no longer used
1781                  if ( jQuery.isEmptyObject( events ) ) {
1782                          var handle = elemData.handle;
1783                          if ( handle ) {
1784                                  handle.elem = null;
1785                          }
1786  
1787                          delete elemData.events;
1788                          delete elemData.handle;
1789  
1790                          if ( jQuery.isEmptyObject( elemData ) ) {
1791                                  jQuery.removeData( elem );
1792                          }
1793                  }
1794          },
1795  
1796          // bubbling is internal
1797          trigger: function( event, data, elem /*, bubbling */ ) {
1798                  // Event object or event type
1799                  var type = event.type || event,
1800                          bubbling = arguments[3];
1801  
1802                  if ( !bubbling ) {
1803                          event = typeof event === "object" ?
1804                                  // jQuery.Event object
1805                                  event[expando] ? event :
1806                                  // Object literal
1807                                  jQuery.extend( jQuery.Event(type), event ) :
1808                                  // Just the event type (string)
1809                                  jQuery.Event(type);
1810  
1811                          if ( type.indexOf("!") >= 0 ) {
1812                                  event.type = type = type.slice(0, -1);
1813                                  event.exclusive = true;
1814                          }
1815  
1816                          // Handle a global trigger
1817                          if ( !elem ) {
1818                                  // Don't bubble custom events when global (to avoid too much overhead)
1819                                  event.stopPropagation();
1820  
1821                                  // Only trigger if we've ever bound an event for it
1822                                  if ( jQuery.event.global[ type ] ) {
1823                                          jQuery.each( jQuery.cache, function() {
1824                                                  if ( this.events && this.events[type] ) {
1825                                                          jQuery.event.trigger( event, data, this.handle.elem );
1826                                                  }
1827                                          });
1828                                  }
1829                          }
1830  
1831                          // Handle triggering a single element
1832  
1833                          // don't do events on text and comment nodes
1834                          if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
1835                                  return undefined;
1836                          }
1837  
1838                          // Clean up in case it is reused
1839                          event.result = undefined;
1840                          event.target = elem;
1841  
1842                          // Clone the incoming data, if any
1843                          data = jQuery.makeArray( data );
1844                          data.unshift( event );
1845                  }
1846  
1847                  event.currentTarget = elem;
1848  
1849                  // Trigger the event, it is assumed that "handle" is a function
1850                  var handle = jQuery.data( elem, "handle" );
1851                  if ( handle ) {
1852                          handle.apply( elem, data );
1853                  }
1854  
1855                  var parent = elem.parentNode || elem.ownerDocument;
1856  
1857                  // Trigger an inline bound script
1858                  try {
1859                          if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
1860                                  if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {
1861                                          event.result = false;
1862                                  }
1863                          }
1864  
1865                  // prevent IE from throwing an error for some elements with some event types, see #3533
1866                  } catch (e) {}
1867  
1868                  if ( !event.isPropagationStopped() && parent ) {
1869                          jQuery.event.trigger( event, data, parent, true );
1870  
1871                  } else if ( !event.isDefaultPrevented() ) {
1872                          var target = event.target, old,
1873                                  isClick = jQuery.nodeName(target, "a") && type === "click",
1874                                  special = jQuery.event.special[ type ] || {};
1875  
1876                          if ( (!special._default || special._default.call( elem, event ) === false) && 
1877                                  !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
1878  
1879                                  try {
1880                                          if ( target[ type ] ) {
1881                                                  // Make sure that we don't accidentally re-trigger the onFOO events
1882                                                  old = target[ "on" + type ];
1883  
1884                                                  if ( old ) {
1885                                                          target[ "on" + type ] = null;
1886                                                  }
1887  
1888                                                  jQuery.event.triggered = true;
1889                                                  target[ type ]();
1890                                          }
1891  
1892                                  // prevent IE from throwing an error for some elements with some event types, see #3533
1893                                  } catch (e) {}
1894  
1895                                  if ( old ) {
1896                                          target[ "on" + type ] = old;
1897                                  }
1898  
1899                                  jQuery.event.triggered = false;
1900                          }
1901                  }
1902          },
1903  
1904          handle: function( event ) {
1905                  var all, handlers, namespaces, namespace, events;
1906  
1907                  event = arguments[0] = jQuery.event.fix( event || window.event );
1908                  event.currentTarget = this;
1909  
1910                  // Namespaced event handlers
1911                  all = event.type.indexOf(".") < 0 && !event.exclusive;
1912  
1913                  if ( !all ) {
1914                          namespaces = event.type.split(".");
1915                          event.type = namespaces.shift();
1916                          namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)");
1917                  }
1918  
1919                  var events = jQuery.data(this, "events"), handlers = events[ event.type ];
1920  
1921                  if ( events && handlers ) {
1922                          // Clone the handlers to prevent manipulation
1923                          handlers = handlers.slice(0);
1924  
1925                          for ( var j = 0, l = handlers.length; j < l; j++ ) {
1926                                  var handleObj = handlers[ j ];
1927  
1928                                  // Filter the functions by class
1929                                  if ( all || namespace.test( handleObj.namespace ) ) {
1930                                          // Pass in a reference to the handler function itself
1931                                          // So that we can later remove it
1932                                          event.handler = handleObj.handler;
1933                                          event.data = handleObj.data;
1934                                          event.handleObj = handleObj;
1935         
1936                                          var ret = handleObj.handler.apply( this, arguments );
1937  
1938                                          if ( ret !== undefined ) {
1939                                                  event.result = ret;
1940                                                  if ( ret === false ) {
1941                                                          event.preventDefault();
1942                                                          event.stopPropagation();
1943                                                  }
1944                                          }
1945  
1946                                          if ( event.isImmediatePropagationStopped() ) {
1947                                                  break;
1948                                          }
1949                                  }
1950                          }
1951                  }
1952  
1953                  return event.result;
1954          },
1955  
1956          props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
1957  
1958          fix: function( event ) {
1959                  if ( event[ expando ] ) {
1960                          return event;
1961                  }
1962  
1963                  // store a copy of the original event object
1964                  // and "clone" to set read-only properties
1965                  var originalEvent = event;
1966                  event = jQuery.Event( originalEvent );
1967  
1968                  for ( var i = this.props.length, prop; i; ) {
1969                          prop = this.props[ --i ];
1970                          event[ prop ] = originalEvent[ prop ];
1971                  }
1972  
1973                  // Fix target property, if necessary
1974                  if ( !event.target ) {
1975                          event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
1976                  }
1977  
1978                  // check if target is a textnode (safari)
1979                  if ( event.target.nodeType === 3 ) {
1980                          event.target = event.target.parentNode;
1981                  }
1982  
1983                  // Add relatedTarget, if necessary
1984                  if ( !event.relatedTarget && event.fromElement ) {
1985                          event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
1986                  }
1987  
1988                  // Calculate pageX/Y if missing and clientX/Y available
1989                  if ( event.pageX == null && event.clientX != null ) {
1990                          var doc = document.documentElement, body = document.body;
1991                          event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
1992                          event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
1993                  }
1994  
1995                  // Add which for key events
1996                  if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) {
1997                          event.which = event.charCode || event.keyCode;
1998                  }
1999  
2000                  // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
2001                  if ( !event.metaKey && event.ctrlKey ) {
2002                          event.metaKey = event.ctrlKey;
2003                  }
2004  
2005                  // Add which for click: 1 === left; 2 === middle; 3 === right
2006                  // Note: button is not normalized, so don't use it
2007                  if ( !event.which && event.button !== undefined ) {
2008                          event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
2009                  }
2010  
2011                  return event;
2012          },
2013  
2014          // Deprecated, use jQuery.guid instead
2015          guid: 1E8,
2016  
2017          // Deprecated, use jQuery.proxy instead
2018          proxy: jQuery.proxy,
2019  
2020          special: {
2021                  ready: {
2022                          // Make sure the ready event is setup
2023                          setup: jQuery.bindReady,
2024                          teardown: jQuery.noop
2025                  },
2026  
2027                  live: {
2028                          add: function( handleObj ) {
2029                                  jQuery.event.add( this, handleObj.origType, jQuery.extend({}, handleObj, {handler: liveHandler}) ); 
2030                          },
2031  
2032                          remove: function( handleObj ) {
2033                                  var remove = true,
2034                                          type = handleObj.origType.replace(rnamespaces, "");
2035                                 
2036                                  jQuery.each( jQuery.data(this, "events").live || [], function() {
2037                                          if ( type === this.origType.replace(rnamespaces, "") ) {
2038                                                  remove = false;
2039                                                  return false;
2040                                          }
2041                                  });
2042  
2043                                  if ( remove ) {
2044                                          jQuery.event.remove( this, handleObj.origType, liveHandler );
2045                                  }
2046                          }
2047  
2048                  },
2049  
2050                  beforeunload: {
2051                          setup: function( data, namespaces, eventHandle ) {
2052                                  // We only want to do this special case on windows
2053                                  if ( this.setInterval ) {
2054                                          this.onbeforeunload = eventHandle;
2055                                  }
2056  
2057                                  return false;
2058                          },
2059                          teardown: function( namespaces, eventHandle ) {
2060                                  if ( this.onbeforeunload === eventHandle ) {
2061                                          this.onbeforeunload = null;
2062                                  }
2063                          }
2064                  }
2065          }
2066  };
2067  
2068  var removeEvent = document.removeEventListener ?
2069          function( elem, type, handle ) {
2070                  elem.removeEventListener( type, handle, false );
2071          } : 
2072          function( elem, type, handle ) {
2073                  elem.detachEvent( "on" + type, handle );
2074          };
2075  
2076  jQuery.Event = function( src ) {
2077          // Allow instantiation without the 'new' keyword
2078          if ( !this.preventDefault ) {
2079                  return new jQuery.Event( src );
2080          }
2081  
2082          // Event object
2083          if ( src && src.type ) {
2084                  this.originalEvent = src;
2085                  this.type = src.type;
2086          // Event type
2087          } else {
2088                  this.type = src;
2089          }
2090  
2091          // timeStamp is buggy for some events on Firefox(#3843)
2092          // So we won't rely on the native value
2093          this.timeStamp = now();
2094  
2095          // Mark it as fixed
2096          this[ expando ] = true;
2097  };
2098  
2099  function returnFalse() {
2100          return false;
2101  }
2102  function returnTrue() {
2103          return true;
2104  }
2105  
2106  // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
2107  // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
2108  jQuery.Event.prototype = {
2109          preventDefault: function() {
2110                  this.isDefaultPrevented = returnTrue;
2111  
2112                  var e = this.originalEvent;
2113                  if ( !e ) {
2114                          return;
2115                  }
2116                 
2117                  // if preventDefault exists run it on the original event
2118                  if ( e.preventDefault ) {
2119                          e.preventDefault();
2120                  }
2121                  // otherwise set the returnValue property of the original event to false (IE)
2122                  e.returnValue = false;
2123          },
2124          stopPropagation: function() {
2125                  this.isPropagationStopped = returnTrue;
2126  
2127                  var e = this.originalEvent;
2128                  if ( !e ) {
2129                          return;
2130                  }
2131                  // if stopPropagation exists run it on the original event
2132                  if ( e.stopPropagation ) {
2133                          e.stopPropagation();
2134                  }
2135                  // otherwise set the cancelBubble property of the original event to true (IE)
2136                  e.cancelBubble = true;
2137          },
2138          stopImmediatePropagation: function() {
2139                  this.isImmediatePropagationStopped = returnTrue;
2140                  this.stopPropagation();
2141          },
2142          isDefaultPrevented: returnFalse,
2143          isPropagationStopped: returnFalse,
2144          isImmediatePropagationStopped: returnFalse
2145  };
2146  
2147  // Checks if an event happened on an element within another element
2148  // Used in jQuery.event.special.mouseenter and mouseleave handlers
2149  var withinElement = function( event ) {
2150          // Check if mouse(over|out) are still within the same parent element
2151          var parent = event.relatedTarget;
2152  
2153          // Firefox sometimes assigns relatedTarget a XUL element
2154          // which we cannot access the parentNode property of
2155          try {
2156                  // Traverse up the tree
2157                  while ( parent && parent !== this ) {
2158                          parent = parent.parentNode;
2159                  }
2160  
2161                  if ( parent !== this ) {
2162                          // set the correct event type
2163                          event.type = event.data;
2164  
2165                          // handle event if we actually just moused on to a non sub-element
2166                          jQuery.event.handle.apply( this, arguments );
2167                  }
2168  
2169          // assuming we've left the element since we most likely mousedover a xul element
2170          } catch(e) { }
2171  },
2172  
2173  // In case of event delegation, we only need to rename the event.type,
2174  // liveHandler will take care of the rest.
2175  delegate = function( event ) {
2176          event.type = event.data;
2177          jQuery.event.handle.apply( this, arguments );
2178  };
2179  
2180  // Create mouseenter and mouseleave events
2181  jQuery.each({
2182          mouseenter: "mouseover",
2183          mouseleave: "mouseout"
2184  }, function( orig, fix ) {
2185          jQuery.event.special[ orig ] = {
2186                  setup: function( data ) {
2187                          jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
2188                  },
2189                  teardown: function( data ) {
2190                          jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
2191                  }
2192          };
2193  });
2194  
2195  // submit delegation
2196  if ( !jQuery.support.submitBubbles ) {
2197  
2198          jQuery.event.special.submit = {
2199                  setup: function( data, namespaces ) {
2200                          if ( this.nodeName.toLowerCase() !== "form" ) {
2201                                  jQuery.event.add(this, "click.specialSubmit", function( e ) {
2202                                          var elem = e.target, type = elem.type;
2203  
2204                                          if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
2205                                                  return trigger( "submit", this, arguments );
2206                                          }
2207                                  });
2208           
2209                                  jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
2210                                          var elem = e.target, type = elem.type;
2211  
2212                                          if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
2213                                                  return trigger( "submit", this, arguments );
2214                                          }
2215                                  });
2216  
2217                          } else {
2218                                  return false;
2219                          }
2220                  },
2221  
2222                  teardown: function( namespaces ) {
2223                          jQuery.event.remove( this, ".specialSubmit" );
2224                  }
2225          };
2226  
2227  }
2228  
2229  // change delegation, happens here so we have bind.
2230  if ( !jQuery.support.changeBubbles ) {
2231  
2232          var formElems = /textarea|input|select/i,
2233  
2234          changeFilters,
2235  
2236          getVal = function( elem ) {
2237                  var type = elem.type, val = elem.value;
2238  
2239                  if ( type === "radio" || type === "checkbox" ) {
2240                          val = elem.checked;
2241  
2242                  } else if ( type === "select-multiple" ) {
2243                          val = elem.selectedIndex > -1 ?
2244                                  jQuery.map( elem.options, function( elem ) {
2245                                          return elem.selected;
2246                                  }).join("-") :
2247                                  "";
2248  
2249                  } else if ( elem.nodeName.toLowerCase() === "select" ) {
2250                          val = elem.selectedIndex;
2251                  }
2252  
2253                  return val;
2254          },
2255  
2256          testChange = function testChange( e ) {
2257                  var elem = e.target, data, val;
2258  
2259                  if ( !formElems.test( elem.nodeName ) || elem.readOnly ) {
2260                          return;
2261                  }
2262  
2263                  data = jQuery.data( elem, "_change_data" );
2264                  val = getVal(elem);
2265  
2266                  // the current data will be also retrieved by beforeactivate
2267                  if ( e.type !== "focusout" || elem.type !== "radio" ) {
2268                          jQuery.data( elem, "_change_data", val );
2269                  }
2270                 
2271                  if ( data === undefined || val === data ) {
2272                          return;
2273                  }
2274  
2275                  if ( data != null || val ) {
2276                          e.type = "change";
2277                          return jQuery.event.trigger( e, arguments[1], elem );
2278                  }
2279          };
2280  
2281          jQuery.event.special.change = {
2282                  filters: {
2283                          focusout: testChange, 
2284  
2285                          click: function( e ) {
2286                                  var elem = e.target, type = elem.type;
2287  
2288                                  if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
2289                                          return testChange.call( this, e );
2290                                  }
2291                          },
2292  
2293                          // Change has to be called before submit
2294                          // Keydown will be called before keypress, which is used in submit-event delegation
2295                          keydown: function( e ) {
2296                                  var elem = e.target, type = elem.type;
2297  
2298                                  if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
2299                                          (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
2300                                          type === "select-multiple" ) {
2301                                          return testChange.call( this, e );
2302                                  }
2303                          },
2304  
2305                          // Beforeactivate happens also before the previous element is blurred
2306                          // with this event you can't trigger a change event, but you can store
2307                          // information/focus[in] is not needed anymore
2308                          beforeactivate: function( e ) {
2309                                  var elem = e.target;
2310                                  jQuery.data( elem, "_change_data", getVal(elem) );
2311                          }
2312                  },
2313  
2314                  setup: function( data, namespaces ) {
2315                          if ( this.type === "file" ) {
2316                                  return false;
2317                          }
2318  
2319                          for ( var type in changeFilters ) {
2320                                  jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
2321                          }
2322  
2323                          return formElems.test( this.nodeName );
2324                  },
2325  
2326                  teardown: function( namespaces ) {
2327                          jQuery.event.remove( this, ".specialChange" );
2328  
2329                          return formElems.test( this.nodeName );
2330                  }
2331          };
2332  
2333          changeFilters = jQuery.event.special.change.filters;
2334  }
2335  
2336  function trigger( type, elem, args ) {
2337          args[0].type = type;
2338          return jQuery.event.handle.apply( elem, args );
2339  }
2340  
2341  // Create "bubbling" focus and blur events
2342  if ( document.addEventListener ) {
2343          jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
2344                  jQuery.event.special[ fix ] = {
2345                          setup: function() {
2346                                  this.addEventListener( orig, handler, true );
2347                          }, 
2348                          teardown: function() { 
2349                                  this.removeEventListener( orig, handler, true );
2350                          }
2351                  };
2352  
2353                  function handler( e ) { 
2354                          e = jQuery.event.fix( e );
2355                          e.type = fix;
2356                          return jQuery.event.handle.call( this, e );
2357                  }
2358          });
2359  }
2360  
2361  jQuery.each(["bind", "one"], function( i, name ) {
2362          jQuery.fn[ name ] = function( type, data, fn ) {
2363                  // Handle object literals
2364                  if ( typeof type === "object" ) {
2365                          for ( var key in type ) {
2366                                  this[ name ](key, data, type[key], fn);
2367                          }
2368                          return this;
2369                  }
2370                 
2371                  if ( jQuery.isFunction( data ) ) {
2372                          fn = data;
2373                          data = undefined;
2374                  }
2375  
2376                  var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
2377                          jQuery( this ).unbind( event, handler );
2378                          return fn.apply( this, arguments );
2379                  }) : fn;
2380  
2381                  if ( type === "unload" && name !== "one" ) {
2382                          this.one( type, data, fn );
2383  
2384                  } else {
2385                          for ( var i = 0, l = this.length; i < l; i++ ) {
2386                                  jQuery.event.add( this[i], type, handler, data );
2387                          }
2388                  }
2389  
2390                  return this;
2391          };
2392  });
2393  
2394  jQuery.fn.extend({
2395          unbind: function( type, fn ) {
2396                  // Handle object literals
2397                  if ( typeof type === "object" && !type.preventDefault ) {
2398                          for ( var key in type ) {
2399                                  this.unbind(key, type[key]);
2400                          }
2401  
2402                  } else {
2403                          for ( var i = 0, l = this.length; i < l; i++ ) {
2404                                  jQuery.event.remove( this[i], type, fn );
2405                          }
2406                  }
2407  
2408                  return this;
2409          },
2410         
2411          delegate: function( selector, types, data, fn ) {
2412                  return this.live( types, data, fn, selector );
2413          },
2414         
2415          undelegate: function( selector, types, fn ) {
2416                  if ( arguments.length === 0 ) {
2417                                  return this.unbind( "live" );
2418                 
2419                  } else {
2420                          return this.die( types, null, fn, selector );
2421                  }
2422          },
2423         
2424          trigger: function( type, data ) {
2425                  return this.each(function() {
2426                          jQuery.event.trigger( type, data, this );
2427                  });
2428          },
2429  
2430          triggerHandler: function( type, data ) {
2431                  if ( this[0] ) {
2432                          var event = jQuery.Event( type );
2433                          event.preventDefault();
2434                          event.stopPropagation();
2435                          jQuery.event.trigger( event, data, this[0] );
2436                          return event.result;
2437                  }
2438          },
2439  
2440          toggle: function( fn ) {
2441                  // Save reference to arguments for access in closure
2442                  var args = arguments, i = 1;
2443  
2444                  // link all the functions, so any of them can unbind this click handler
2445                  while ( i < args.length ) {
2446                          jQuery.proxy( fn, args[ i++ ] );
2447                  }
2448  
2449                  return this.click( jQuery.proxy( fn, function( event ) {
2450                          // Figure out which function to execute
2451                          var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
2452                          jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
2453  
2454                          // Make sure that clicks stop
2455                          event.preventDefault();
2456  
2457                          // and execute the function
2458                          return args[ lastToggle ].apply( this, arguments ) || false;
2459                  }));
2460          },
2461  
2462          hover: function( fnOver, fnOut ) {
2463                  return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
2464          }
2465  });
2466  
2467  var liveMap = {
2468          focus: "focusin",
2469          blur: "focusout",
2470          mouseenter: "mouseover",
2471          mouseleave: "mouseout"
2472  };
2473  
2474  jQuery.each(["live", "die"], function( i, name ) {
2475          jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
2476                  var type, i = 0, match, namespaces, preType,
2477                          selector = origSelector || this.selector,
2478                          context = origSelector ? this : jQuery( this.context );
2479  
2480                  if ( jQuery.isFunction( data ) ) {
2481                          fn = data;
2482                          data = undefined;
2483                  }
2484  
2485                  types = (types || "").split(" ");
2486  
2487                  while ( (type = types[ i++ ]) != null ) {
2488                          match = rnamespaces.exec( type );
2489                          namespaces = "";
2490  
2491                          if ( match )  {
2492                                  namespaces = match[0];
2493                                  type = type.replace( rnamespaces, "" );
2494                          }
2495  
2496                          if ( type === "hover" ) {
2497                                  types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
2498                                  continue;
2499                          }
2500  
2501                          preType = type;
2502  
2503                          if ( type === "focus" || type === "blur" ) {
2504                                  types.push( liveMap[ type ] + namespaces );
2505                                  type = type + namespaces;
2506  
2507                          } else {
2508                                  type = (liveMap[ type ] || type) + namespaces;
2509                          }
2510  
2511                          if ( name === "live" ) {
2512                                  // bind live handler
2513                                  context.each(function(){
2514                                          jQuery.event.add( this, liveConvert( type, selector ),
2515                                                  { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
2516                                  });
2517  
2518                          } else {
2519                                  // unbind live handler
2520                                  context.unbind( liveConvert( type, selector ), fn );
2521                          }
2522                  }
2523                 
2524                  return this;
2525          }
2526  });
2527  
2528  function liveHandler( event ) {
2529          var stop, elems = [], selectors = [], args = arguments,
2530                  related, match, handleObj, elem, j, i, l, data,
2531                  events = jQuery.data( this, "events" );
2532  
2533          // Make sure we avoid non-left-click bubbling in Firefox (#3861)
2534          if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) {
2535                  return;
2536          }
2537  
2538          event.liveFired = this;
2539  
2540          var live = events.live.slice(0);
2541  
2542          for ( j = 0; j < live.length; j++ ) {
2543                  handleObj = live[j];
2544  
2545                  if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
2546                          selectors.push( handleObj.selector );
2547  
2548                  } else {
2549                          live.splice( j--, 1 );
2550                  }
2551          }
2552  
2553          match = jQuery( event.target ).closest( selectors, event.currentTarget );
2554  
2555          for ( i = 0, l = match.length; i < l; i++ ) {
2556                  for ( j = 0; j < live.length; j++ ) {
2557                          handleObj = live[j];
2558  
2559                          if ( match[i].selector === handleObj.selector ) {
2560                                  elem = match[i].elem;
2561                                  related = null;
2562  
2563                                  // Those two events require additional checking
2564                                  if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
2565                                          related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
2566                                  }
2567  
2568                                  if ( !related || related !== elem ) {
2569                                          elems.push({ elem: elem, handleObj: handleObj });
2570                                  }
2571                          }
2572                  }
2573          }
2574  
2575          for ( i = 0, l = elems.length; i < l; i++ ) {
2576                  match = elems[i];
2577                  event.currentTarget = match.elem;
2578                  event.data = match.handleObj.data;
2579                  event.handleObj = match.handleObj;
2580  
2581                  if ( match.handleObj.origHandler.apply( match.elem, args ) === false ) {
2582                          stop = false;
2583                          break;
2584                  }
2585          }
2586  
2587          return stop;
2588  }
2589  
2590  function liveConvert( type, selector ) {
2591          return "live." + (type && type !== "*" ? type + "." : "") + selector.replace(/\./g, "`").replace(/ /g, "&");
2592  }
2593  
2594  jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
2595          "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
2596          "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
2597  
2598          // Handle event binding
2599          jQuery.fn[ name ] = function( fn ) {
2600                  return fn ? this.bind( name, fn ) : this.trigger( name );
2601          };
2602  
2603          if ( jQuery.attrFn ) {
2604                  jQuery.attrFn[ name ] = true;
2605          }
2606  });
2607  
2608  // Prevent memory leaks in IE
2609  // Window isn't included so as not to unbind existing unload events
2610  // More info:
2611  //  - http://isaacschlueter.com/2006/10/msie-memory-leaks/
2612  if ( window.attachEvent && !window.addEventListener ) {
2613          window.attachEvent("onunload", function() {
2614                  for ( var id in jQuery.cache ) {
2615                          if ( jQuery.cache[ id ].handle ) {
2616                                  // Try/Catch is to handle iframes being unloaded, see #4280
2617                                  try {
2618                                          jQuery.event.remove( jQuery.cache[ id ].handle.elem );
2619                                  } catch(e) {}
2620                          }
2621                  }
2622          });
2623  }
2624  /*!
2625   * Sizzle CSS Selector Engine - v1.0
2626   *  Copyright 2009, The Dojo Foundation
2627   *  Released under the MIT, BSD, and GPL Licenses.
2628   *  More information: http://sizzlejs.com/
2629   */
2630  (function(){
2631  
2632  var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
2633          done = 0,
2634          toString = Object.prototype.toString,
2635          hasDuplicate = false,
2636          baseHasDuplicate = true;
2637  
2638  // Here we check if the JavaScript engine is using some sort of
2639  // optimization where it does not always call our comparision
2640  // function. If that is the case, discard the hasDuplicate value.
2641  //   Thus far that includes Google Chrome.
2642  [0, 0].sort(function(){
2643          baseHasDuplicate = false;
2644          return 0;
2645  });
2646  
2647  var Sizzle = function(selector, context, results, seed) {
2648          results = results || [];
2649          var origContext = context = context || document;
2650  
2651          if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
2652                  return [];
2653          }
2654         
2655          if ( !selector || typeof selector !== "string" ) {
2656                  return results;
2657          }
2658  
2659          var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context),
2660                  soFar = selector;
2661         
2662          // Reset the position of the chunker regexp (start from head)
2663          while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) {
2664                  soFar = m[3];
2665                 
2666                  parts.push( m[1] );
2667                 
2668                  if ( m[2] ) {
2669                          extra = m[3];
2670                          break;
2671                  }
2672          }
2673  
2674          if ( parts.length > 1 && origPOS.exec( selector ) ) {
2675                  if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
2676                          set = posProcess( parts[0] + parts[1], context );
2677                  } else {
2678                          set = Expr.relative[ parts[0] ] ?
2679                                  [ context ] :
2680                                  Sizzle( parts.shift(), context );
2681  
2682                          while ( parts.length ) {
2683                                  selector = parts.shift();
2684  
2685                                  if ( Expr.relative[ selector ] ) {
2686                                          selector += parts.shift();
2687                                  }
2688                                 
2689                                  set = posProcess( selector, set );
2690                          }
2691                  }
2692          } else {
2693                  // Take a shortcut and set the context if the root selector is an ID
2694                  // (but not if it'll be faster if the inner selector is an ID)
2695                  if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
2696                                  Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
2697                          var ret = Sizzle.find( parts.shift(), context, contextXML );
2698                          context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
2699                  }
2700  
2701                  if ( context ) {
2702                          var ret = seed ?
2703                                  { expr: parts.pop(), set: makeArray(seed) } :
2704                                  Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
2705                          set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
2706  
2707                          if ( parts.length > 0 ) {
2708                                  checkSet = makeArray(set);
2709                          } else {
2710                                  prune = false;
2711                          }
2712  
2713                          while ( parts.length ) {
2714                                  var cur = parts.pop(), pop = cur;
2715  
2716                                  if ( !Expr.relative[ cur ] ) {
2717                                          cur = "";
2718                                  } else {
2719                                          pop = parts.pop();
2720                                  }
2721  
2722                                  if ( pop == null ) {
2723                                          pop = context;
2724                                  }
2725  
2726                                  Expr.relative[ cur ]( checkSet, pop, contextXML );
2727                          }
2728                  } else {
2729                          checkSet = parts = [];
2730                  }
2731          }
2732  
2733          if ( !checkSet ) {
2734                  checkSet = set;
2735          }
2736  
2737          if ( !checkSet ) {
2738                  Sizzle.error( cur || selector );
2739          }
2740  
2741          if ( toString.call(checkSet) === "[object Array]" ) {
2742                  if ( !prune ) {
2743                          results.push.apply( results, checkSet );
2744                  } else if ( context && context.nodeType === 1 ) {
2745                          for ( var i = 0; checkSet[i] != null; i++ ) {
2746                                  if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
2747                                          results.push( set[i] );
2748                                  }
2749                          }
2750                  } else {
2751                          for ( var i = 0; checkSet[i] != null; i++ ) {
2752                                  if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
2753                                          results.push( set[i] );
2754                                  }
2755                          }
2756                  }
2757          } else {
2758                  makeArray( checkSet, results );
2759          }
2760  
2761          if ( extra ) {
2762                  Sizzle( extra, origContext, results, seed );
2763                  Sizzle.uniqueSort( results );
2764          }
2765  
2766          return results;
2767  };
2768  
2769  Sizzle.uniqueSort = function(results){
2770          if ( sortOrder ) {
2771                  hasDuplicate = baseHasDuplicate;
2772                  results.sort(sortOrder);
2773  
2774                  if ( hasDuplicate ) {
2775                          for ( var i = 1; i < results.length; i++ ) {
2776                                  if ( results[i] === results[i-1] ) {
2777                                          results.splice(i--, 1);
2778                                  }
2779                          }
2780                  }
2781          }
2782  
2783          return results;
2784  };
2785  
2786  Sizzle.matches = function(expr, set){
2787          return Sizzle(expr, null, null, set);
2788  };
2789  
2790  Sizzle.find = function(expr, context, isXML){
2791          var set, match;
2792  
2793          if ( !expr ) {
2794                  return [];
2795          }
2796  
2797          for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
2798                  var type = Expr.order[i], match;
2799                 
2800                  if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
2801                          var left = match[1];
2802                          match.splice(1,1);
2803  
2804                          if ( left.substr( left.length - 1 ) !== "\\" ) {
2805                                  match[1] = (match[1] || "").replace(/\\/g, "");
2806                                  set = Expr.find[ type ]( match, context, isXML );
2807                                  if ( set != null ) {
2808                                          expr = expr.replace( Expr.match[ type ], "" );
2809                                          break;
2810                                  }
2811                          }
2812                  }
2813          }
2814  
2815          if ( !set ) {
2816                  set = context.getElementsByTagName("*");
2817          }
2818  
2819          return {set: set, expr: expr};
2820  };
2821  
2822  Sizzle.filter = function(expr, set, inplace, not){
2823          var old = expr, result = [], curLoop = set, match, anyFound,
2824                  isXMLFilter = set && set[0] && isXML(set[0]);
2825  
2826          while ( expr && set.length ) {
2827                  for ( var type in Expr.filter ) {
2828                          if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
2829                                  var filter = Expr.filter[ type ], found, item, left = match[1];
2830                                  anyFound = false;
2831  
2832                                  match.splice(1,1);
2833  
2834                                  if ( left.substr( left.length - 1 ) === "\\" ) {
2835                                          continue;
2836                                  }
2837  
2838                                  if ( curLoop === result ) {
2839                                          result = [];
2840                                  }
2841  
2842                                  if ( Expr.preFilter[ type ] ) {
2843                                          match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
2844  
2845                                          if ( !match ) {
2846                                                  anyFound = found = true;
2847                                          } else if ( match === true ) {
2848                                                  continue;
2849                                          }
2850                                  }
2851  
2852                                  if ( match ) {
2853                                          for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
2854                                                  if ( item ) {
2855                                                          found = filter( item, match, i, curLoop );
2856                                                          var pass = not ^ !!found;
2857  
2858                                                          if ( inplace && found != null ) {
2859                                                                  if ( pass ) {
2860                                                                          anyFound = true;
2861                                                                  } else {
2862                                                                          curLoop[i] = false;
2863                                                                  }
2864                                                          } else if ( pass ) {
2865                                                                  result.push( item );
2866                                                                  anyFound = true;
2867                                                          }
2868                                                  }
2869                                          }
2870                                  }
2871  
2872                                  if ( found !== undefined ) {
2873                                          if ( !inplace ) {
2874                                                  curLoop = result;
2875                                          }
2876  
2877                                          expr = expr.replace( Expr.match[ type ], "" );
2878  
2879                                          if ( !anyFound ) {
2880                                                  return [];
2881                                          }
2882  
2883                                          break;
2884                                  }
2885                          }
2886                  }
2887  
2888                  // Improper expression
2889                  if ( expr === old ) {
2890                          if ( anyFound == null ) {
2891                                  Sizzle.error( expr );
2892                          } else {
2893                                  break;
2894                          }
2895                  }
2896  
2897                  old = expr;
2898          }
2899  
2900          return curLoop;
2901  };
2902  
2903  Sizzle.error = function( msg ) {
2904          throw "Syntax error, unrecognized expression: " + msg;
2905  };
2906  
2907  var Expr = Sizzle.selectors = {
2908          order: [ "ID", "NAME", "TAG" ],
2909          match: {
2910                  ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
2911                  CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
2912                  NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,
2913                  ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
2914                  TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,
2915                  CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
2916                  POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
2917                  PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
2918          },
2919          leftMatch: {},
2920          attrMap: {
2921                  "class": "className",
2922                  "for": "htmlFor"
2923          },
2924          attrHandle: {
2925                  href: function(elem){
2926                          return elem.getAttribute("href");
2927                  }
2928          },
2929          relative: {
2930                  "+": function(checkSet, part){
2931                          var isPartStr = typeof part === "string",
2932                                  isTag = isPartStr && !/\W/.test(part),
2933                                  isPartStrNotTag = isPartStr && !isTag;
2934  
2935                          if ( isTag ) {
2936                                  part = part.toLowerCase();
2937                          }
2938  
2939                          for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
2940                                  if ( (elem = checkSet[i]) ) {
2941                                          while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
2942  
2943                                          checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
2944                                                  elem || false :
2945                                                  elem === part;
2946                                  }
2947                          }
2948  
2949                          if ( isPartStrNotTag ) {
2950                                  Sizzle.filter( part, checkSet, true );
2951                          }
2952                  },
2953                  ">": function(checkSet, part){
2954                          var isPartStr = typeof part === "string";
2955  
2956                          if ( isPartStr && !/\W/.test(part) ) {
2957                                  part = part.toLowerCase();
2958  
2959                                  for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2960                                          var elem = checkSet[i];
2961                                          if ( elem ) {
2962                                                  var parent = elem.parentNode;
2963                                                  checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
2964                                          }
2965                                  }
2966                          } else {
2967                                  for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2968                                          var elem = checkSet[i];
2969                                          if ( elem ) {
2970                                                  checkSet[i] = isPartStr ?
2971                                                          elem.parentNode :
2972                                                          elem.parentNode === part;
2973                                          }
2974                                  }
2975  
2976                                  if ( isPartStr ) {
2977                                          Sizzle.filter( part, checkSet, true );
2978                                  }
2979                          }
2980                  },
2981                  "": function(checkSet, part, isXML){
2982                          var doneName = done++, checkFn = dirCheck;
2983  
2984                          if ( typeof part === "string" && !/\W/.test(part) ) {
2985                                  var nodeCheck = part = part.toLowerCase();
2986                                  checkFn = dirNodeCheck;
2987                          }
2988  
2989                          checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
2990                  },
2991                  "~": function(checkSet, part, isXML){
2992                          var doneName = done++, checkFn = dirCheck;
2993  
2994                          if ( typeof part === "string" && !/\W/.test(part) ) {
2995                                  var nodeCheck = part = part.toLowerCase();
2996                                  checkFn = dirNodeCheck;
2997                          }
2998  
2999                          checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
3000                  }
3001          },
3002          find: {
3003                  ID: function(match, context, isXML){
3004                          if ( typeof context.getElementById !== "undefined" && !isXML ) {
3005                                  var m = context.getElementById(match[1]);
3006                                  return m ? [m] : [];
3007                          }
3008                  },
3009                  NAME: function(match, context){
3010                          if ( typeof context.getElementsByName !== "undefined" ) {
3011                                  var ret = [], results = context.getElementsByName(match[1]);
3012  
3013                                  for ( var i = 0, l = results.length; i < l; i++ ) {
3014                                          if ( results[i].getAttribute("name") === match[1] ) {
3015                                                  ret.push( results[i] );
3016                                          }
3017                                  }
3018  
3019                                  return ret.length === 0 ? null : ret;
3020                          }
3021                  },
3022                  TAG: function(match, context){
3023                          return context.getElementsByTagName(match[1]);
3024                  }
3025          },
3026          preFilter: {
3027                  CLASS: function(match, curLoop, inplace, result, not, isXML){
3028                          match = " " + match[1].replace(/\\/g, "") + " ";
3029  
3030                          if ( isXML ) {
3031                                  return match;
3032                          }
3033  
3034                          for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
3035                                  if ( elem ) {
3036                                          if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) {
3037                                                  if ( !inplace ) {
3038                                                          result.push( elem );
3039                                                  }
3040                                          } else if ( inplace ) {
3041                                                  curLoop[i] = false;
3042                                          }
3043                                  }
3044                          }
3045  
3046                          return false;
3047                  },
3048                  ID: function(match){
3049                          return match[1].replace(/\\/g, "");
3050                  },
3051                  TAG: function(match, curLoop){
3052                          return match[1].toLowerCase();
3053                  },
3054                  CHILD: function(match){
3055                          if ( match[1] === "nth" ) {
3056                                  // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
3057                                  var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
3058                                          match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
3059                                          !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
3060  
3061                                  // calculate the numbers (first)n+(last) including if they are negative
3062                                  match[2] = (test[1] + (test[2] || 1)) - 0;
3063                                  match[3] = test[3] - 0;
3064                          }
3065  
3066                          // TODO: Move to normal caching system
3067                          match[0] = done++;
3068  
3069                          return match;
3070                  },
3071                  ATTR: function(match, curLoop, inplace, result, not, isXML){
3072                          var name = match[1].replace(/\\/g, "");
3073                         
3074                          if ( !isXML && Expr.attrMap[name] ) {
3075                                  match[1] = Expr.attrMap[name];
3076                          }
3077  
3078                          if ( match[2] === "~=" ) {
3079                                  match[4] = " " + match[4] + " ";
3080                          }
3081  
3082                          return match;
3083                  },
3084                  PSEUDO: function(match, curLoop, inplace, result, not){
3085                          if ( match[1] === "not" ) {
3086                                  // If we're dealing with a complex expression, or a simple one
3087                                  if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
3088                                          match[3] = Sizzle(match[3], null, null, curLoop);
3089                                  } else {
3090                                          var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
3091                                          if ( !inplace ) {
3092                                                  result.push.apply( result, ret );
3093                                          }
3094                                          return false;
3095                                  }
3096                          } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
3097                                  return true;
3098                          }
3099                         
3100                          return match;
3101                  },
3102                  POS: function(match){
3103                          match.unshift( true );
3104                          return match;
3105                  }
3106          },
3107          filters: {
3108                  enabled: function(elem){
3109                          return elem.disabled === false && elem.type !== "hidden";
3110                  },
3111                  disabled: function(elem){
3112                          return elem.disabled === true;
3113                  },
3114                  checked: function(elem){
3115                          return elem.checked === true;
3116                  },
3117                  selected: function(elem){
3118                          // Accessing this property makes selected-by-default
3119                          // options in Safari work properly
3120                          elem.parentNode.selectedIndex;
3121                          return elem.selected === true;
3122                  },
3123                  parent: function(elem){
3124                          return !!elem.firstChild;
3125                  },
3126                  empty: function(elem){
3127                          return !elem.firstChild;
3128                  },
3129                  has: function(elem, i, match){
3130                          return !!Sizzle( match[3], elem ).length;
3131                  },
3132                  header: function(elem){
3133                          return /h\d/i.test( elem.nodeName );
3134                  },
3135                  text: function(elem){
3136                          return "text" === elem.type;
3137                  },
3138                  radio: function(elem){
3139                          return "radio" === elem.type;
3140                  },
3141                  checkbox: function(elem){
3142                          return "checkbox" === elem.type;
3143                  },
3144                  file: function(elem){
3145                          return "file" === elem.type;
3146                  },
3147                  password: function(elem){
3148                          return "password" === elem.type;
3149                  },
3150                  submit: function(elem){
3151                          return "submit" === elem.type;
3152                  },
3153                  image: function(elem){
3154                          return "image" === elem.type;
3155                  },
3156                  reset: function(elem){
3157                          return "reset" === elem.type;
3158                  },
3159                  button: function(elem){
3160                          return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
3161                  },
3162                  input: function(elem){
3163                          return /input|select|textarea|button/i.test(elem.nodeName);
3164                  }
3165          },
3166          setFilters: {
3167                  first: function(elem, i){
3168                          return i === 0;
3169                  },
3170                  last: function(elem, i, match, array){
3171                          return i === array.length - 1;
3172                  },
3173                  even: function(elem, i){
3174                          return i % 2 === 0;
3175                  },
3176                  odd: function(elem, i){
3177                          return i % 2 === 1;
3178                  },
3179                  lt: function(elem, i, match){
3180                          return i < match[3] - 0;
3181                  },
3182                  gt: function(elem, i, match){
3183                          return i > match[3] - 0;
3184                  },
3185                  nth: function(elem, i, match){
3186                          return match[3] - 0 === i;
3187                  },
3188                  eq: function(elem, i, match){
3189                          return match[3] - 0 === i;
3190                  }
3191          },
3192          filter: {
3193                  PSEUDO: function(elem, match, i, array){
3194                          var name = match[1], filter = Expr.filters[ name ];
3195  
3196                          if ( filter ) {
3197                                  return filter( elem, i, match, array );
3198                          } else if ( name === "contains" ) {
3199                                  return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
3200                          } else if ( name === "not" ) {
3201                                  var not = match[3];
3202  
3203                                  for ( var i = 0, l = not.length; i < l; i++ ) {
3204                                          if ( not[i] === elem ) {
3205                                                  return false;
3206                                          }
3207                                  }
3208  
3209                                  return true;
3210                          } else {
3211                                  Sizzle.error( "Syntax error, unrecognized expression: " + name );
3212                          }
3213                  },
3214                  CHILD: function(elem, match){
3215                          var type = match[1], node = elem;
3216                          switch (type) {
3217                                  case 'only':
3218                                  case 'first':
3219                                          while ( (node = node.previousSibling) )  {
3220                                                  if ( node.nodeType === 1 ) { 
3221                                                          return false; 
3222                                                  }
3223                                          }
3224                                          if ( type === "first" ) { 
3225                                                  return true; 
3226                                          }
3227                                          node = elem;
3228                                  case 'last':
3229                                          while ( (node = node.nextSibling) )      {
3230                                                  if ( node.nodeType === 1 ) { 
3231                                                          return false; 
3232                                                  }
3233                                          }
3234                                          return true;
3235                                  case 'nth':
3236                                          var first = match[2], last = match[3];
3237  
3238                                          if ( first === 1 && last === 0 ) {
3239                                                  return true;
3240                                          }
3241                                         
3242                                          var doneName = match[0],
3243                                                  parent = elem.parentNode;
3244         
3245                                          if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
3246                                                  var count = 0;
3247                                                  for ( node = parent.firstChild; node; node = node.nextSibling ) {
3248                                                          if ( node.nodeType === 1 ) {
3249                                                                  node.nodeIndex = ++count;
3250                                                          }
3251                                                  } 
3252                                                  parent.sizcache = doneName;
3253                                          }
3254                                         
3255                                          var diff = elem.nodeIndex - last;
3256                                          if ( first === 0 ) {
3257                                                  return diff === 0;
3258                                          } else {
3259                                                  return ( diff % first === 0 && diff / first >= 0 );
3260                                          }
3261                          }
3262                  },
3263                  ID: function(elem, match){
3264                          return elem.nodeType === 1 && elem.getAttribute("id") === match;
3265                  },
3266                  TAG: function(elem, match){
3267                          return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
3268                  },
3269                  CLASS: function(elem, match){
3270                          return (" " + (elem.className || elem.getAttribute("class")) + " ")
3271                                  .indexOf( match ) > -1;
3272                  },
3273                  ATTR: function(elem, match){
3274                          var name = match[1],
3275                                  result = Expr.attrHandle[ name ] ?
3276                                          Expr.attrHandle[ name ]( elem ) :
3277                                          elem[ name ] != null ?
3278                                                  elem[ name ] :
3279                                                  elem.getAttribute( name ),
3280                                  value = result + "",
3281                                  type = match[2],
3282                                  check = match[4];
3283  
3284                          return result == null ?
3285                                  type === "!=" :
3286                                  type === "=" ?
3287                                  value === check :
3288                                  type === "*=" ?
3289                                  value.indexOf(check) >= 0 :
3290                                  type === "~=" ?
3291                                  (" " + value + " ").indexOf(check) >= 0 :
3292                                  !check ?
3293                                  value && result !== false :
3294                                  type === "!=" ?
3295                                  value !== check :
3296                                  type === "^=" ?
3297                                  value.indexOf(check) === 0 :
3298                                  type === "$=" ?
3299                                  value.substr(value.length - check.length) === check :
3300                                  type === "|=" ?
3301                                  value === check || value.substr(0, check.length + 1) === check + "-" :
3302                                  false;
3303                  },
3304                  POS: function(elem, match, i, array){
3305                          var name = match[2], filter = Expr.setFilters[ name ];
3306  
3307                          if ( filter ) {
3308                                  return filter( elem, i, match, array );
3309                          }
3310                  }
3311          }
3312  };
3313  
3314  var origPOS = Expr.match.POS;
3315  
3316  for ( var type in Expr.match ) {
3317          Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
3318          Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, function(all, num){
3319                  return "\\" + (num - 0 + 1);
3320          }));
3321  }
3322  
3323  var makeArray = function(array, results) {
3324          array = Array.prototype.slice.call( array, 0 );
3325  
3326          if ( results ) {
3327                  results.push.apply( results, array );
3328                  return results;
3329          }
3330         
3331          return array;
3332  };
3333  
3334  // Perform a simple check to determine if the browser is capable of
3335  // converting a NodeList to an array using builtin methods.
3336  // Also verifies that the returned array holds DOM nodes
3337  // (which is not the case in the Blackberry browser)
3338  try {
3339          Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
3340  
3341  // Provide a fallback method if it does not work
3342  } catch(e){
3343          makeArray = function(array, results) {
3344                  var ret = results || [];
3345  
3346                  if ( toString.call(array) === "[object Array]" ) {
3347                          Array.prototype.push.apply( ret, array );
3348                  } else {
3349                          if ( typeof array.length === "number" ) {
3350                                  for ( var i = 0, l = array.length; i < l; i++ ) {
3351                                          ret.push( array[i] );
3352                                  }
3353                          } else {
3354                                  for ( var i = 0; array[i]; i++ ) {
3355                                          ret.push( array[i] );
3356                                  }
3357                          }
3358                  }
3359  
3360                  return ret;
3361          };
3362  }
3363  
3364  var sortOrder;
3365  
3366  if ( document.documentElement.compareDocumentPosition ) {
3367          sortOrder = function( a, b ) {
3368                  if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
3369                          if ( a == b ) {
3370                                  hasDuplicate = true;
3371                          }
3372                          return a.compareDocumentPosition ? -1 : 1;
3373                  }
3374  
3375                  var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
3376                  if ( ret === 0 ) {
3377                          hasDuplicate = true;
3378                  }
3379                  return ret;
3380          };
3381  } else if ( "sourceIndex" in document.documentElement ) {
3382          sortOrder = function( a, b ) {
3383                  if ( !a.sourceIndex || !b.sourceIndex ) {
3384                          if ( a == b ) {
3385                                  hasDuplicate = true;
3386                          }
3387                          return a.sourceIndex ? -1 : 1;
3388                  }
3389  
3390                  var ret = a.sourceIndex - b.sourceIndex;
3391                  if ( ret === 0 ) {
3392                          hasDuplicate = true;
3393                  }
3394                  return ret;
3395          };
3396  } else if ( document.createRange ) {
3397          sortOrder = function( a, b ) {
3398                  if ( !a.ownerDocument || !b.ownerDocument ) {
3399                          if ( a == b ) {
3400                                  hasDuplicate = true;
3401                          }
3402                          return a.ownerDocument ? -1 : 1;
3403                  }
3404  
3405                  var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
3406                  aRange.setStart(a, 0);
3407                  aRange.setEnd(a, 0);
3408                  bRange.setStart(b, 0);
3409                  bRange.setEnd(b, 0);
3410                  var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
3411                  if ( ret === 0 ) {
3412                          hasDuplicate = true;
3413                  }
3414                  return ret;
3415          };
3416  }
3417  
3418  // Utility function for retreiving the text value of an array of DOM nodes
3419  function getText( elems ) {
3420          var ret = "", elem;
3421  
3422          for ( var i = 0; elems[i]; i++ ) {
3423                  elem = elems[i];
3424  
3425                  // Get the text from text nodes and CDATA nodes
3426                  if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
3427                          ret += elem.nodeValue;
3428  
3429                  // Traverse everything else, except comment nodes
3430                  } else if ( elem.nodeType !== 8 ) {
3431                          ret += getText( elem.childNodes );
3432                  }
3433          }
3434  
3435          return ret;
3436  }
3437  
3438  // Check to see if the browser returns elements by name when
3439  // querying by getElementById (and provide a workaround)
3440  (function(){
3441          // We're going to inject a fake input element with a specified name
3442          var form = document.createElement("div"),
3443                  id = "script" + (new Date).getTime();
3444          form.innerHTML = "<a name='" + id + "'/>";
3445  
3446          // Inject it into the root element, check its status, and remove it quickly
3447          var root = document.documentElement;
3448          root.insertBefore( form, root.firstChild );
3449  
3450          // The workaround has to do additional checks after a getElementById
3451          // Which slows things down for other browsers (hence the branching)
3452          if ( document.getElementById( id ) ) {
3453                  Expr.find.ID = function(match, context, isXML){
3454                          if ( typeof context.getElementById !== "undefined" && !isXML ) {
3455                                  var m = context.getElementById(match[1]);
3456                                  return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
3457                          }
3458                  };
3459  
3460                  Expr.filter.ID = function(elem, match){
3461                          var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
3462                          return elem.nodeType === 1 && node && node.nodeValue === match;
3463                  };
3464          }
3465  
3466          root.removeChild( form );
3467          root = form = null; // release memory in IE
3468  })();
3469  
3470  (function(){
3471          // Check to see if the browser returns only elements
3472          // when doing getElementsByTagName("*")
3473  
3474          // Create a fake element
3475          var div = document.createElement("div");
3476          div.appendChild( document.createComment("") );
3477  
3478          // Make sure no comments are found
3479          if ( div.getElementsByTagName("*").length > 0 ) {
3480                  Expr.find.TAG = function(match, context){
3481                          var results = context.getElementsByTagName(match[1]);
3482  
3483                          // Filter out possible comments
3484                          if ( match[1] === "*" ) {
3485                                  var tmp = [];
3486  
3487                                  for ( var i = 0; results[i]; i++ ) {
3488                                          if ( results[i].nodeType === 1 ) {
3489                                                  tmp.push( results[i] );
3490                                          }
3491                                  }
3492  
3493                                  results = tmp;
3494                          }
3495  
3496                          return results;
3497                  };
3498          }
3499  
3500          // Check to see if an attribute returns normalized href attributes
3501          div.innerHTML = "<a href='#'></a>";
3502          if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
3503                          div.firstChild.getAttribute("href") !== "#" ) {
3504                  Expr.attrHandle.href = function(elem){
3505                          return elem.getAttribute("href", 2);
3506                  };
3507          }
3508  
3509          div = null; // release memory in IE
3510  })();
3511  
3512  if ( document.querySelectorAll ) {
3513          (function(){
3514                  var oldSizzle = Sizzle, div = document.createElement("div");
3515                  div.innerHTML = "<p class='TEST'></p>";
3516  
3517                  // Safari can't handle uppercase or unicode characters when
3518                  // in quirks mode.
3519                  if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
3520                          return;
3521                  }
3522         
3523                  Sizzle = function(query, context, extra, seed){
3524                          context = context || document;
3525  
3526                          // Only use querySelectorAll on non-XML documents
3527                          // (ID selectors don't work in non-HTML documents)
3528                          if ( !seed && context.nodeType === 9 && !isXML(context) ) {
3529                                  try {
3530                                          return makeArray( context.querySelectorAll(query), extra );
3531                                  } catch(e){}
3532                          }
3533                 
3534                          return oldSizzle(query, context, extra, seed);
3535                  };
3536  
3537                  for ( var prop in oldSizzle ) {
3538                          Sizzle[ prop ] = oldSizzle[ prop ];
3539                  }
3540  
3541                  div = null; // release memory in IE
3542          })();
3543  }
3544  
3545  (function(){
3546          var div = document.createElement("div");
3547  
3548          div.innerHTML = "<div class='test e'></div><div class='test'></div>";
3549  
3550          // Opera can't find a second classname (in 9.6)
3551          // Also, make sure that getElementsByClassName actually exists
3552          if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
3553                  return;
3554          }
3555  
3556          // Safari caches class attributes, doesn't catch changes (in 3.2)
3557          div.lastChild.className = "e";
3558  
3559          if ( div.getElementsByClassName("e").length === 1 ) {
3560                  return;
3561          }
3562         
3563          Expr.order.splice(1, 0, "CLASS");
3564          Expr.find.CLASS = function(match, context, isXML) {
3565                  if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
3566                          return context.getElementsByClassName(match[1]);
3567                  }
3568          };
3569  
3570          div = null; // release memory in IE
3571  })();
3572  
3573  function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
3574          for ( var i = 0, l = checkSet.length; i < l; i++ ) {
3575                  var elem = checkSet[i];
3576                  if ( elem ) {
3577                          elem = elem[dir];
3578                          var match = false;
3579  
3580                          while ( elem ) {
3581                                  if ( elem.sizcache === doneName ) {
3582                                          match = checkSet[elem.sizset];
3583                                          break;
3584                                  }
3585  
3586                                  if ( elem.nodeType === 1 && !isXML ){
3587                                          elem.sizcache = doneName;
3588                                          elem.sizset = i;
3589                                  }
3590  
3591                                  if ( elem.nodeName.toLowerCase() === cur ) {
3592                                          match = elem;
3593                                          break;
3594                                  }
3595  
3596                                  elem = elem[dir];
3597                          }
3598  
3599                          checkSet[i] = match;
3600                  }
3601          }
3602  }
3603  
3604  function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
3605          for ( var i = 0, l = checkSet.length; i < l; i++ ) {
3606                  var elem = checkSet[i];
3607                  if ( elem ) {
3608                          elem = elem[dir];
3609                          var match = false;
3610  
3611                          while ( elem ) {
3612                                  if ( elem.sizcache === doneName ) {
3613                                          match = checkSet[elem.sizset];
3614                                          break;
3615                                  }
3616  
3617                                  if ( elem.nodeType === 1 ) {
3618                                          if ( !isXML ) {
3619                                                  elem.sizcache = doneName;
3620                                                  elem.sizset = i;
3621                                          }
3622                                          if ( typeof cur !== "string" ) {
3623                                                  if ( elem === cur ) {
3624                                                          match = true;
3625                                                          break;
3626                                                  }
3627  
3628                                          } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
3629                                                  match = elem;
3630                                                  break;
3631                                          }
3632                                  }
3633  
3634                                  elem = elem[dir];
3635                          }
3636  
3637                          checkSet[i] = match;
3638                  }
3639          }
3640  }
3641  
3642  var contains = document.compareDocumentPosition ? function(a, b){
3643          return !!(a.compareDocumentPosition(b) & 16);
3644  } : function(a, b){
3645          return a !== b && (a.contains ? a.contains(b) : true);
3646  };
3647  
3648  var isXML = function(elem){
3649          // documentElement is verified for cases where it doesn't yet exist
3650          // (such as loading iframes in IE - #4833)
3651          var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
3652          return documentElement ? documentElement.nodeName !== "HTML" : false;
3653  };
3654  
3655  var posProcess = function(selector, context){
3656          var tmpSet = [], later = "", match,
3657                  root = context.nodeType ? [context] : context;
3658  
3659          // Position selectors must be done after the filter
3660          // And so must :not(positional) so we move all PSEUDOs to the end
3661          while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
3662                  later += match[0];
3663                  selector = selector.replace( Expr.match.PSEUDO, "" );
3664          }
3665  
3666          selector = Expr.relative[selector] ? selector + "*" : selector;
3667  
3668          for ( var i = 0, l = root.length; i < l; i++ ) {
3669                  Sizzle( selector, root[i], tmpSet );
3670          }
3671  
3672          return Sizzle.filter( later, tmpSet );
3673  };
3674  
3675  // EXPOSE
3676  jQuery.find = Sizzle;
3677  jQuery.expr = Sizzle.selectors;
3678  jQuery.expr[":"] = jQuery.expr.filters;
3679  jQuery.unique = Sizzle.uniqueSort;
3680  jQuery.text = getText;
3681  jQuery.isXMLDoc = isXML;
3682  jQuery.contains = contains;
3683  
3684  return;
3685  
3686  window.Sizzle = Sizzle;
3687  
3688  })();
3689  var runtil = /Until$/,
3690          rparentsprev = /^(?:parents|prevUntil|prevAll)/,
3691          // Note: This RegExp should be improved, or likely pulled from Sizzle
3692          rmultiselector = /,/,
3693          slice = Array.prototype.slice;
3694  
3695  // Implement the identical functionality for filter and not
3696  var winnow = function( elements, qualifier, keep ) {
3697          if ( jQuery.isFunction( qualifier ) ) {
3698                  return jQuery.grep(elements, function( elem, i ) {
3699                          return !!qualifier.call( elem, i, elem ) === keep;
3700                  });
3701  
3702          } else if ( qualifier.nodeType ) {
3703                  return jQuery.grep(elements, function( elem, i ) {
3704                          return (elem === qualifier) === keep;
3705                  });
3706  
3707          } else if ( typeof qualifier === "string" ) {
3708                  var filtered = jQuery.grep(elements, function( elem ) {
3709                          return elem.nodeType === 1;
3710                  });
3711  
3712                  if ( isSimple.test( qualifier ) ) {
3713                          return jQuery.filter(qualifier, filtered, !keep);
3714                  } else {
3715                          qualifier = jQuery.filter( qualifier, filtered );
3716                  }
3717          }
3718  
3719          return jQuery.grep(elements, function( elem, i ) {
3720                  return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
3721          });
3722  };
3723  
3724  jQuery.fn.extend({
3725          find: function( selector ) {
3726                  var ret = this.pushStack( "", "find", selector ), length = 0;
3727  
3728                  for ( var i = 0, l = this.length; i < l; i++ ) {
3729                          length = ret.length;
3730                          jQuery.find( selector, this[i], ret );
3731  
3732                          if ( i > 0 ) {
3733                                  // Make sure that the results are unique
3734                                  for ( var n = length; n < ret.length; n++ ) {
3735                                          for ( var r = 0; r < length; r++ ) {
3736                                                  if ( ret[r] === ret[n] ) {
3737                                                          ret.splice(n--, 1);
3738                                                          break;
3739                                                  }
3740                                          }
3741                                  }
3742                          }
3743                  }
3744  
3745                  return ret;
3746          },
3747  
3748          has: function( target ) {
3749                  var targets = jQuery( target );
3750                  return this.filter(function() {
3751                          for ( var i = 0, l = targets.length; i < l; i++ ) {
3752                                  if ( jQuery.contains( this, targets[i] ) ) {
3753                                          return true;
3754                                  }
3755                          }
3756                  });
3757          },
3758  
3759          not: function( selector ) {
3760                  return this.pushStack( winnow(this, selector, false), "not", selector);
3761          },
3762  
3763          filter: function( selector ) {
3764                  return this.pushStack( winnow(this, selector, true), "filter", selector );
3765          },
3766         
3767          is: function( selector ) {
3768                  return !!selector && jQuery.filter( selector, this ).length > 0;
3769          },
3770  
3771          closest: function( selectors, context ) {
3772                  if ( jQuery.isArray( selectors ) ) {
3773                          var ret = [], cur = this[0], match, matches = {}, selector;
3774  
3775                          if ( cur && selectors.length ) {
3776                                  for ( var i = 0, l = selectors.length; i < l; i++ ) {
3777                                          selector = selectors[i];
3778  
3779                                          if ( !matches[selector] ) {
3780                                                  matches[selector] = jQuery.expr.match.POS.test( selector ) ? 
3781                                                          jQuery( selector, context || this.context ) :
3782                                                          selector;
3783                                          }
3784                                  }
3785  
3786                                  while ( cur && cur.ownerDocument && cur !== context ) {
3787                                          for ( selector in matches ) {
3788                                                  match = matches[selector];
3789  
3790                                                  if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
3791                                                          ret.push({ selector: selector, elem: cur });
3792                                                          delete matches[selector];
3793                                                  }
3794                                          }
3795                                          cur = cur.parentNode;
3796                                  }
3797                          }
3798  
3799                          return ret;
3800                  }
3801  
3802                  var pos = jQuery.expr.match.POS.test( selectors ) ? 
3803                          jQuery( selectors, context || this.context ) : null;
3804  
3805                  return this.map(function( i, cur ) {
3806                          while ( cur && cur.ownerDocument && cur !== context ) {
3807                                  if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) {
3808                                          return cur;
3809                                  }
3810                                  cur = cur.parentNode;
3811                          }
3812                          return null;
3813                  });
3814          },
3815         
3816          // Determine the position of an element within
3817          // the matched set of elements
3818          index: function( elem ) {
3819                  if ( !elem || typeof elem === "string" ) {
3820                          return jQuery.inArray( this[0],
3821                                  // If it receives a string, the selector is used
3822                                  // If it receives nothing, the siblings are used
3823                                  elem ? jQuery( elem ) : this.parent().children() );
3824                  }
3825                  // Locate the position of the desired element
3826                  return jQuery.inArray(
3827                          // If it receives a jQuery object, the first element is used
3828                          elem.jquery ? elem[0] : elem, this );
3829          },
3830  
3831          add: function( selector, context ) {
3832                  var set = typeof selector === "string" ?
3833                                  jQuery( selector, context || this.context ) :
3834                                  jQuery.makeArray( selector ),
3835                          all = jQuery.merge( this.get(), set );
3836  
3837                  return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
3838                          all :
3839                          jQuery.unique( all ) );
3840          },
3841  
3842          andSelf: function() {
3843                  return this.add( this.prevObject );
3844          }
3845  });
3846  
3847  // A painfully simple check to see if an element is disconnected
3848  // from a document (should be improved, where feasible).
3849  function isDisconnected( node ) {
3850          return !node || !node.parentNode || node.parentNode.nodeType === 11;
3851  }
3852  
3853  jQuery.each({
3854          parent: function( elem ) {
3855                  var parent = elem.parentNode;
3856                  return parent && parent.nodeType !== 11 ? parent : null;
3857          },
3858          parents: function( elem ) {
3859                  return jQuery.dir( elem, "parentNode" );
3860          },
3861          parentsUntil: function( elem, i, until ) {
3862                  return jQuery.dir( elem, "parentNode", until );
3863          },
3864          next: function( elem ) {
3865                  return jQuery.nth( elem, 2, "nextSibling" );
3866          },
3867          prev: function( elem ) {
3868                  return jQuery.nth( elem, 2, "previousSibling" );
3869          },
3870          nextAll: function( elem ) {
3871                  return jQuery.dir( elem, "nextSibling" );
3872          },
3873          prevAll: function( elem ) {
3874                  return jQuery.dir( elem, "previousSibling" );
3875          },
3876          nextUntil: function( elem, i, until ) {
3877                  return jQuery.dir( elem, "nextSibling", until );
3878          },
3879          prevUntil: function( elem, i, until ) {
3880                  return jQuery.dir( elem, "previousSibling", until );
3881          },
3882          siblings: function( elem ) {
3883                  return jQuery.sibling( elem.parentNode.firstChild, elem );
3884          },
3885          children: function( elem ) {
3886                  return jQuery.sibling( elem.firstChild );
3887          },
3888          contents: function( elem ) {
3889                  return jQuery.nodeName( elem, "iframe" ) ?
3890                          elem.contentDocument || elem.contentWindow.document :
3891                          jQuery.makeArray( elem.childNodes );
3892          }
3893  }, function( name, fn ) {
3894          jQuery.fn[ name ] = function( until, selector ) {
3895                  var ret = jQuery.map( this, fn, until );
3896                 
3897                  if ( !runtil.test( name ) ) {
3898                          selector = until;
3899                  }
3900  
3901                  if ( selector && typeof selector === "string" ) {
3902                          ret = jQuery.filter( selector, ret );
3903                  }
3904  
3905                  ret = this.length > 1 ? jQuery.unique( ret ) : ret;
3906  
3907                  if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
3908                          ret = ret.reverse();
3909                  }
3910  
3911                  return this.pushStack( ret, name, slice.call(arguments).join(",") );
3912          };
3913  });
3914  
3915  jQuery.extend({
3916          filter: function( expr, elems, not ) {
3917                  if ( not ) {
3918                          expr = ":not(" + expr + ")";
3919                  }
3920  
3921                  return jQuery.find.matches(expr, elems);
3922          },
3923         
3924          dir: function( elem, dir, until ) {
3925                  var matched = [], cur = elem[dir];
3926                  while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
3927                          if ( cur.nodeType === 1 ) {
3928                                  matched.push( cur );
3929                          }
3930                          cur = cur[dir];
3931                  }
3932                  return matched;
3933          },
3934  
3935          nth: function( cur, result, dir, elem ) {
3936                  result = result || 1;
3937                  var num = 0;
3938  
3939                  for ( ; cur; cur = cur[dir] ) {
3940                          if ( cur.nodeType === 1 && ++num === result ) {
3941                                  break;
3942                          }
3943                  }
3944  
3945                  return cur;
3946          },
3947  
3948          sibling: function( n, elem ) {
3949                  var r = [];
3950  
3951                  for ( ; n; n = n.nextSibling ) {
3952                          if ( n.nodeType === 1 && n !== elem ) {
3953                                  r.push( n );
3954                          }
3955                  }
3956  
3957                  return r;
3958          }
3959  });
3960  var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
3961          rleadingWhitespace = /^\s+/,
3962          rxhtmlTag = /(<([\w:]+)[^>]*?)\/>/g,
3963          rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,
3964          rtagName = /<([\w:]+)/,
3965          rtbody = /<tbody/i,
3966          rhtml = /<|&#?\w+;/,
3967          rnocache = /<script|<object|<embed|<option|<style/i,
3968          rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,  // checked="checked" or checked (html5)
3969          fcloseTag = function( all, front, tag ) {
3970                  return rselfClosing.test( tag ) ?
3971                          all :
3972                          front + "></" + tag + ">";
3973          },
3974          wrapMap = {
3975                  option: [ 1, "<select multiple='multiple'>", "</select>" ],
3976                  legend: [ 1, "<fieldset>", "</fieldset>" ],
3977                  thead: [ 1, "<table>", "</table>" ],
3978                  tr: [ 2, "<table><tbody>", "</tbody></table>" ],
3979                  td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
3980                  col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
3981                  area: [ 1, "<map>", "</map>" ],
3982                  _default: [ 0, "", "" ]
3983          };
3984  
3985  wrapMap.optgroup = wrapMap.option;
3986  wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
3987  wrapMap.th = wrapMap.td;
3988  
3989  // IE can't serialize <link> and <script> tags normally
3990  if ( !jQuery.support.htmlSerialize ) {
3991          wrapMap._default = [ 1, "div<div>", "</div>" ];
3992  }
3993  
3994  jQuery.fn.extend({
3995          text: function( text ) {
3996                  if ( jQuery.isFunction(text) ) {
3997                          return this.each(function(i) {
3998                                  var self = jQuery(this);
3999                                  self.text( text.call(this, i, self.text()) );
4000                          });
4001                  }
4002  
4003                  if ( typeof text !== "object" && text !== undefined ) {
4004                          return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
4005                  }
4006  
4007                  return jQuery.text( this );
4008          },
4009  
4010          wrapAll: function( html ) {
4011                  if ( jQuery.isFunction( html ) ) {
4012                          return this.each(function(i) {
4013                                  jQuery(this).wrapAll( html.call(this, i) );
4014                          });
4015                  }
4016  
4017                  if ( this[0] ) {
4018                          // The elements to wrap the target around
4019                          var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
4020  
4021                          if ( this[0].parentNode ) {
4022                                  wrap.insertBefore( this[0] );
4023                          }
4024  
4025                          wrap.map(function() {
4026                                  var elem = this;
4027  
4028                                  while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
4029                                          elem = elem.firstChild;
4030                                  }
4031  
4032                                  return elem;
4033                          }).append(this);
4034                  }
4035  
4036                  return this;
4037          },
4038  
4039          wrapInner: function( html ) {
4040                  if ( jQuery.isFunction( html ) ) {
4041                          return this.each(function(i) {
4042                                  jQuery(this).wrapInner( html.call(this, i) );
4043                          });
4044                  }
4045  
4046                  return this.each(function() {
4047                          var self = jQuery( this ), contents = self.contents();
4048  
4049                          if ( contents.length ) {
4050                                  contents.wrapAll( html );
4051  
4052                          } else {
4053                                  self.append( html );
4054                          }
4055                  });
4056          },
4057  
4058          wrap: function( html ) {
4059                  return this.each(function() {
4060                          jQuery( this ).wrapAll( html );
4061                  });
4062          },
4063  
4064          unwrap: function() {
4065                  return this.parent().each(function() {
4066                          if ( !jQuery.nodeName( this, "body" ) ) {
4067                                  jQuery( this ).replaceWith( this.childNodes );
4068                          }
4069                  }).end();
4070          },
4071  
4072          append: function() {
4073                  return this.domManip(arguments, true, function( elem ) {
4074                          if ( this.nodeType === 1 ) {
4075                                  this.appendChild( elem );
4076                          }
4077                  });
4078          },
4079  
4080          prepend: function() {
4081                  return this.domManip(arguments, true, function( elem ) {
4082                          if ( this.nodeType === 1 ) {
4083                                  this.insertBefore( elem, this.firstChild );
4084                          }
4085                  });
4086          },
4087  
4088          before: function() {
4089                  if ( this[0] && this[0].parentNode ) {
4090                          return this.domManip(arguments, false, function( elem ) {
4091                                  this.parentNode.insertBefore( elem, this );
4092                          });
4093                  } else if ( arguments.length ) {
4094                          var set = jQuery(arguments[0]);
4095                          set.push.apply( set, this.toArray() );
4096                          return this.pushStack( set, "before", arguments );
4097                  }
4098          },
4099  
4100          after: function() {
4101                  if ( this[0] && this[0].parentNode ) {
4102                          return this.domManip(arguments, false, function( elem ) {
4103                                  this.parentNode.insertBefore( elem, this.nextSibling );
4104                          });
4105                  } else if ( arguments.length ) {
4106                          var set = this.pushStack( this, "after", arguments );
4107                          set.push.apply( set, jQuery(arguments[0]).toArray() );
4108                          return set;
4109                  }
4110          },
4111         
4112          // keepData is for internal use only--do not document
4113          remove: function( selector, keepData ) {
4114                  for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
4115                          if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
4116                                  if ( !keepData && elem.nodeType === 1 ) {
4117                                          jQuery.cleanData( elem.getElementsByTagName("*") );
4118                                          jQuery.cleanData( [ elem ] );
4119                                  }
4120  
4121                                  if ( elem.parentNode ) {
4122                                           elem.parentNode.removeChild( elem );
4123                                  }
4124                          }
4125                  }
4126                 
4127                  return this;
4128          },
4129  
4130          empty: function() {
4131                  for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
4132                          // Remove element nodes and prevent memory leaks
4133                          if ( elem.nodeType === 1 ) {
4134                                  jQuery.cleanData( elem.getElementsByTagName("*") );
4135                          }
4136  
4137                          // Remove any remaining nodes
4138                          while ( elem.firstChild ) {
4139                                  elem.removeChild( elem.firstChild );
4140                          }
4141                  }
4142                 
4143                  return this;
4144          },
4145  
4146          clone: function( events ) {
4147                  // Do the clone
4148                  var ret = this.map(function() {
4149                          if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
4150                                  // IE copies events bound via attachEvent when
4151                                  // using cloneNode. Calling detachEvent on the
4152                                  // clone will also remove the events from the orignal
4153                                  // In order to get around this, we use innerHTML.
4154                                  // Unfortunately, this means some modifications to
4155                                  // attributes in IE that are actually only stored
4156                                  // as properties will not be copied (such as the
4157                                  // the name attribute on an input).
4158                                  var html = this.outerHTML, ownerDocument = this.ownerDocument;
4159                                  if ( !html ) {
4160                                          var div = ownerDocument.createElement("div");
4161                                          div.appendChild( this.cloneNode(true) );
4162                                          html = div.innerHTML;
4163                                  }
4164  
4165                                  return jQuery.clean([html.replace(rinlinejQuery, "")
4166                                          // Handle the case in IE 8 where action=/test/> self-closes a tag
4167                                          .replace(/=([^="'>\s]+\/)>/g, '="$1">')
4168                                          .replace(rleadingWhitespace, "")], ownerDocument)[0];
4169                          } else {
4170                                  return this.cloneNode(true);
4171                          }
4172                  });
4173  
4174                  // Copy the events from the original to the clone
4175                  if ( events === true ) {
4176                          cloneCopyEvent( this, ret );
4177                          cloneCopyEvent( this.find("*"), ret.find("*") );
4178                  }
4179  
4180                  // Return the cloned set
4181                  return ret;
4182          },
4183  
4184          html: function( value ) {
4185                  if ( value === undefined ) {
4186                          return this[0] && this[0].nodeType === 1 ?
4187                                  this[0].innerHTML.replace(rinlinejQuery, "") :
4188                                  null;
4189  
4190                  // See if we can take a shortcut and just use innerHTML
4191                  } else if ( typeof value === "string" && !rnocache.test( value ) &&
4192                          (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
4193                          !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
4194  
4195                          value = value.replace(rxhtmlTag, fcloseTag);
4196  
4197                          try {
4198                                  for ( var i = 0, l = this.length; i < l; i++ ) {
4199                                          // Remove element nodes and prevent memory leaks
4200                                          if ( this[i].nodeType === 1 ) {
4201                                                  jQuery.cleanData( this[i].getElementsByTagName("*") );
4202                                                  this[i].innerHTML = value;
4203                                          }
4204                                  }
4205  
4206                          // If using innerHTML throws an exception, use the fallback method
4207                          } catch(e) {
4208                                  this.empty().append( value );
4209                          }
4210  
4211                  } else if ( jQuery.isFunction( value ) ) {
4212                          this.each(function(i){
4213                                  var self = jQuery(this), old = self.html();
4214                                  self.empty().append(function(){
4215                                          return value.call( this, i, old );
4216                                  });
4217                          });
4218  
4219                  } else {
4220                          this.empty().append( value );
4221                  }
4222  
4223                  return this;
4224          },
4225  
4226          replaceWith: function( value ) {
4227                  if ( this[0] && this[0].parentNode ) {
4228                          // Make sure that the elements are removed from the DOM before they are inserted
4229                          // this can help fix replacing a parent with child elements
4230                          if ( jQuery.isFunction( value ) ) {
4231                                  return this.each(function(i) {
4232                                          var self = jQuery(this), old = self.html();
4233                                          self.replaceWith( value.call( this, i, old ) );
4234                                  });
4235                          }
4236  
4237                          if ( typeof value !== "string" ) {
4238                                  value = jQuery(value).detach();
4239                          }
4240  
4241                          return this.each(function() {
4242                                  var next = this.nextSibling, parent = this.parentNode;
4243  
4244                                  jQuery(this).remove();
4245  
4246                                  if ( next ) {
4247                                          jQuery(next).before( value );
4248                                  } else {
4249                                          jQuery(parent).append( value );
4250                                  }
4251                          });
4252                  } else {
4253                          return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
4254                  }
4255          },
4256  
4257          detach: function( selector ) {
4258                  return this.remove( selector, true );
4259          },
4260  
4261          domManip: function( args, table, callback ) {
4262                  var results, first, value = args[0], scripts = [], fragment, parent;
4263  
4264                  // We can't cloneNode fragments that contain checked, in WebKit
4265                  if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
4266                          return this.each(function() {
4267                                  jQuery(this).domManip( args, table, callback, true );
4268                          });
4269                  }
4270  
4271                  if ( jQuery.isFunction(value) ) {
4272                          return this.each(function(i) {
4273                                  var self = jQuery(this);
4274                                  args[0] = value.call(this, i, table ? self.html() : undefined);
4275                                  self.domManip( args, table, callback );
4276                          });
4277                  }
4278  
4279                  if ( this[0] ) {
4280                          parent = value && value.parentNode;
4281  
4282                          // If we're in a fragment, just use that instead of building a new one
4283                          if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
4284                                  results = { fragment: parent };
4285  
4286                          } else {
4287                                  results = buildFragment( args, this, scripts );
4288                          }
4289                         
4290                          fragment = results.fragment;
4291                         
4292                          if ( fragment.childNodes.length === 1 ) {
4293                                  first = fragment = fragment.firstChild;
4294                          } else {
4295                                  first = fragment.firstChild;
4296                          }
4297  
4298                          if ( first ) {
4299                                  table = table && jQuery.nodeName( first, "tr" );
4300  
4301                                  for ( var i = 0, l = this.length; i < l; i++ ) {
4302                                          callback.call(
4303                                                  table ?
4304                                                          root(this[i], first) :
4305                                                          this[i],
4306                                                  i > 0 || results.cacheable || this.length > 1  ?
4307                                                          fragment.cloneNode(true) :
4308                                                          fragment
4309                                          );
4310                                  }
4311                          }
4312  
4313                          if ( scripts.length ) {
4314                                  jQuery.each( scripts, evalScript );
4315                          }
4316                  }
4317  
4318                  return this;
4319  
4320                  function root( elem, cur ) {
4321                          return jQuery.nodeName(elem, "table") ?
4322                                  (elem.getElementsByTagName("tbody")[0] ||
4323                                  elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
4324                                  elem;
4325                  }
4326          }
4327  });
4328  
4329  function cloneCopyEvent(orig, ret) {
4330          var i = 0;
4331  
4332          ret.each(function() {
4333                  if ( this.nodeName !== (orig[i] && orig[i].nodeName) ) {
4334                          return;
4335                  }
4336  
4337                  var oldData = jQuery.data( orig[i++] ), curData = jQuery.data( this, oldData ), events = oldData && oldData.events;
4338  
4339                  if ( events ) {
4340                          delete curData.handle;
4341                          curData.events = {};
4342  
4343                          for ( var type in events ) {
4344                                  for ( var handler in events[ type ] ) {
4345                                          jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
4346                                  }
4347                          }
4348                  }
4349          });
4350  }
4351  
4352  function buildFragment( args, nodes, scripts ) {
4353          var fragment, cacheable, cacheresults,
4354                  doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
4355  
4356          // Only cache "small" (1/2 KB) strings that are associated with the main document
4357          // Cloning options loses the selected state, so don't cache them
4358          // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
4359          // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
4360          if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
4361                  !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
4362  
4363                  cacheable = true;
4364                  cacheresults = jQuery.fragments[ args[0] ];
4365                  if ( cacheresults ) {
4366                          if ( cacheresults !== 1 ) {
4367                                  fragment = cacheresults;
4368                          }
4369                  }
4370          }
4371  
4372          if ( !fragment ) {
4373                  fragment = doc.createDocumentFragment();
4374                  jQuery.clean( args, doc, fragment, scripts );
4375          }
4376  
4377          if ( cacheable ) {
4378                  jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
4379          }
4380  
4381          return { fragment: fragment, cacheable: cacheable };
4382  }
4383  
4384  jQuery.fragments = {};
4385  
4386  jQuery.each({
4387          appendTo: "append",
4388          prependTo: "prepend",
4389          insertBefore: "before",
4390          insertAfter: "after",
4391          replaceAll: "replaceWith"
4392  }, function( name, original ) {
4393          jQuery.fn[ name ] = function( selector ) {
4394                  var ret = [], insert = jQuery( selector ),
4395                          parent = this.length === 1 && this[0].parentNode;
4396                 
4397                  if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
4398                          insert[ original ]( this[0] );
4399                          return this;
4400                         
4401                  } else {
4402                          for ( var i = 0, l = insert.length; i < l; i++ ) {
4403                                  var elems = (i > 0 ? this.clone(true) : this).get();
4404                                  jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
4405                                  ret = ret.concat( elems );
4406                          }
4407                 
4408                          return this.pushStack( ret, name, insert.selector );
4409                  }
4410          };
4411  });
4412  
4413  jQuery.extend({
4414          clean: function( elems, context, fragment, scripts ) {
4415                  context = context || document;
4416  
4417                  // !context.createElement fails in IE with an error but returns typeof 'object'
4418                  if ( typeof context.createElement === "undefined" ) {
4419                          context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
4420                  }
4421  
4422                  var ret = [];
4423  
4424                  for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
4425                          if ( typeof elem === "number" ) {
4426                                  elem += "";
4427                          }
4428  
4429                          if ( !elem ) {
4430                                  continue;
4431                          }
4432  
4433                          // Convert html string into DOM nodes
4434                          if ( typeof elem === "string" && !rhtml.test( elem ) ) {
4435                                  elem = context.createTextNode( elem );
4436  
4437                          } else if ( typeof elem === "string" ) {
4438                                  // Fix "XHTML"-style tags in all browsers
4439                                  elem = elem.replace(rxhtmlTag, fcloseTag);
4440  
4441                                  // Trim whitespace, otherwise indexOf won't work as expected
4442                                  var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
4443                                          wrap = wrapMap[ tag ] || wrapMap._default,
4444                                          depth = wrap[0],
4445                                          div = context.createElement("div");
4446  
4447                                  // Go to html and back, then peel off extra wrappers
4448                                  div.innerHTML = wrap[1] + elem + wrap[2];
4449  
4450                                  // Move to the right depth
4451                                  while ( depth-- ) {
4452                                          div = div.lastChild;
4453                                  }
4454  
4455                                  // Remove IE's autoinserted <tbody> from table fragments
4456                                  if ( !jQuery.support.tbody ) {
4457  
4458                                          // String was a <table>, *may* have spurious <tbody>
4459                                          var hasBody = rtbody.test(elem),
4460                                                  tbody = tag === "table" && !hasBody ?
4461                                                          div.firstChild && div.firstChild.childNodes :
4462  
4463                                                          // String was a bare <thead> or <tfoot>
4464                                                          wrap[1] === "<table>" && !hasBody ?
4465                                                                  div.childNodes :
4466                                                                  [];
4467  
4468                                          for ( var j = tbody.length - 1; j >= 0 ; --j ) {
4469                                                  if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
4470                                                          tbody[ j ].parentNode.removeChild( tbody[ j ] );
4471                                                  }
4472                                          }
4473  
4474                                  }
4475  
4476                                  // IE completely kills leading whitespace when innerHTML is used
4477                                  if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
4478                                          div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
4479                                  }
4480  
4481                                  elem = div.childNodes;
4482                          }
4483  
4484                          if ( elem.nodeType ) {
4485                                  ret.push( elem );
4486                          } else {
4487                                  ret = jQuery.merge( ret, elem );
4488                          }
4489                  }
4490  
4491                  if ( fragment ) {
4492                          for ( var i = 0; ret[i]; i++ ) {
4493                                  if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
4494                                          scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
4495                                 
4496                                  } else {
4497                                          if ( ret[i].nodeType === 1 ) {
4498                                                  ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
4499                                          }
4500                                          fragment.appendChild( ret[i] );
4501                                  }
4502                          }
4503                  }
4504  
4505                  return ret;
4506          },
4507         
4508          cleanData: function( elems ) {
4509                  var data, id, cache = jQuery.cache,
4510                          special = jQuery.event.special,
4511                          deleteExpando = jQuery.support.deleteExpando;
4512                 
4513                  for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
4514                          id = elem[ jQuery.expando ];
4515                         
4516                          if ( id ) {
4517                                  data = cache[ id ];
4518                                 
4519                                  if ( data.events ) {
4520                                          for ( var type in data.events ) {
4521                                                  if ( special[ type ] ) {
4522                                                          jQuery.event.remove( elem, type );
4523  
4524                                                  } else {
4525                                                          removeEvent( elem, type, data.handle );
4526                                                  }
4527                                          }
4528                                  }
4529                                 
4530                                  if ( deleteExpando ) {
4531                                          delete elem[ jQuery.expando ];
4532  
4533                                  } else if ( elem.removeAttribute ) {
4534                                          elem.removeAttribute( jQuery.expando );
4535                                  }
4536                                 
4537                                  delete cache[ id ];
4538                          }
4539                  }
4540          }
4541  });
4542  // exclude the following css properties to add px
4543  var rexclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
4544          ralpha = /alpha\([^)]*\)/,
4545          ropacity = /opacity=([^)]*)/,
4546          rfloat = /float/i,
4547          rdashAlpha = /-([a-z])/ig,
4548          rupper = /([A-Z])/g,
4549          rnumpx = /^-?\d+(?:px)?$/i,
4550          rnum = /^-?\d/,
4551  
4552          cssShow = { position: "absolute", visibility: "hidden", display:"block" },
4553          cssWidth = [ "Left", "Right" ],
4554          cssHeight = [ "Top", "Bottom" ],
4555  
4556          // cache check for defaultView.getComputedStyle
4557          getComputedStyle = document.defaultView && document.defaultView.getComputedStyle,
4558          // normalize float css property
4559          styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat",
4560          fcamelCase = function( all, letter ) {
4561                  return letter.toUpperCase();
4562          };
4563  
4564  jQuery.fn.css = function( name, value ) {
4565          return access( this, name, value, true, function( elem, name, value ) {
4566                  if ( value === undefined ) {
4567                          return jQuery.curCSS( elem, name );
4568                  }
4569                 
4570                  if ( typeof value === "number" && !rexclude.test(name) ) {
4571                          value += "px";
4572                  }
4573  
4574                  jQuery.style( elem, name, value );
4575          });
4576  };
4577  
4578  jQuery.extend({
4579          style: function( elem, name, value ) {
4580                  // don't set styles on text and comment nodes
4581                  if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
4582                          return undefined;
4583                  }
4584  
4585                  // ignore negative width and height values #1599
4586                  if ( (name === "width" || name === "height") && parseFloat(value) < 0 ) {
4587                          value = undefined;
4588                  }
4589  
4590                  var style = elem.style || elem, set = value !== undefined;
4591  
4592                  // IE uses filters for opacity
4593                  if ( !jQuery.support.opacity && name === "opacity" ) {
4594                          if ( set ) {
4595                                  // IE has trouble with opacity if it does not have layout
4596                                  // Force it by setting the zoom level
4597                                  style.zoom = 1;
4598  
4599                                  // Set the alpha filter to set the opacity
4600                                  var opacity = parseInt( value, 10 ) + "" === "NaN" ? "" : "alpha(opacity=" + value * 100 + ")";
4601                                  var filter = style.filter || jQuery.curCSS( elem, "filter" ) || "";
4602                                  style.filter = ralpha.test(filter) ? filter.replace(ralpha, opacity) : opacity;
4603                          }
4604  
4605                          return style.filter && style.filter.indexOf("opacity=") >= 0 ?
4606                                  (parseFloat( ropacity.exec(style.filter)[1] ) / 100) + "":
4607                                  "";
4608                  }
4609  
4610                  // Make sure we're using the right name for getting the float value
4611                  if ( rfloat.test( name ) ) {
4612                          name = styleFloat;
4613                  }
4614  
4615                  name = name.replace(rdashAlpha, fcamelCase);
4616  
4617                  if ( set ) {
4618                          style[ name ] = value;
4619                  }
4620  
4621                  return style[ name ];
4622          },
4623  
4624          css: function( elem, name, force, extra ) {
4625                  if ( name === "width" || name === "height" ) {
4626                          var val, props = cssShow, which = name === "width" ? cssWidth : cssHeight;
4627  
4628                          function getWH() {
4629                                  val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
4630  
4631                                  if ( extra === "border" ) {
4632                                          return;
4633                                  }
4634  
4635                                  jQuery.each( which, function() {
4636                                          if ( !extra ) {
4637                                                  val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
4638                                          }
4639  
4640                                          if ( extra === "margin" ) {
4641                                                  val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
4642                                          } else {
4643                                                  val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
4644                                          }
4645                                  });
4646                          }
4647  
4648                          if ( elem.offsetWidth !== 0 ) {
4649                                  getWH();
4650                          } else {
4651                                  jQuery.swap( elem, props, getWH );
4652                          }
4653  
4654                          return Math.max(0, Math.round(val));
4655                  }
4656  
4657                  return jQuery.curCSS( elem, name, force );
4658          },
4659  
4660          curCSS: function( elem, name, force ) {
4661                  var ret, style = elem.style, filter;
4662  
4663                  // IE uses filters for opacity
4664                  if ( !jQuery.support.opacity && name === "opacity" && elem.currentStyle ) {
4665                          ret = ropacity.test(elem.currentStyle.filter || "") ?
4666                                  (parseFloat(RegExp.$1) / 100) + "" :
4667                                  "";
4668  
4669                          return ret === "" ?
4670                                  "1" :
4671                                  ret;
4672                  }
4673  
4674                  // Make sure we're using the right name for getting the float value
4675                  if ( rfloat.test( name ) ) {
4676                          name = styleFloat;
4677                  }
4678  
4679                  if ( !force && style && style[ name ] ) {
4680                          ret = style[ name ];
4681  
4682                  } else if ( getComputedStyle ) {
4683  
4684                          // Only "float" is needed here
4685                          if ( rfloat.test( name ) ) {
4686                                  name = "float";
4687                          }
4688  
4689                          name = name.replace( rupper, "-$1" ).toLowerCase();
4690  
4691                          var defaultView = elem.ownerDocument.defaultView;
4692  
4693                          if ( !defaultView ) {
4694                                  return null;
4695                          }
4696  
4697                          var computedStyle = defaultView.getComputedStyle( elem, null );
4698  
4699                          if ( computedStyle ) {
4700                                  ret = computedStyle.getPropertyValue( name );
4701                          }
4702  
4703                          // We should always get a number back from opacity
4704                          if ( name === "opacity" && ret === "" ) {
4705                                  ret = "1";
4706                          }
4707  
4708                  } else if ( elem.currentStyle ) {
4709                          var camelCase = name.replace(rdashAlpha, fcamelCase);
4710  
4711                          ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
4712  
4713                          // From the awesome hack by Dean Edwards
4714                          // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
4715  
4716                          // If we're not dealing with a regular pixel number
4717                          // but a number that has a weird ending, we need to convert it to pixels
4718                          if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
4719                                  // Remember the original values
4720                                  var left = style.left, rsLeft = elem.runtimeStyle.left;
4721  
4722                                  // Put in the new values to get a computed value out
4723                                  elem.runtimeStyle.left = elem.currentStyle.left;
4724                                  style.left = camelCase === "fontSize" ? "1em" : (ret || 0);
4725                                  ret = style.pixelLeft + "px";
4726  
4727                                  // Revert the changed values
4728                                  style.left = left;
4729                                  elem.runtimeStyle.left = rsLeft;
4730                          }
4731                  }
4732  
4733                  return ret;
4734          },
4735  
4736          // A method for quickly swapping in/out CSS properties to get correct calculations
4737          swap: function( elem, options, callback ) {
4738                  var old = {};
4739  
4740                  // Remember the old values, and insert the new ones
4741                  for ( var name in options ) {
4742                          old[ name ] = elem.style[ name ];
4743                          elem.style[ name ] = options[ name ];
4744                  }
4745  
4746                  callback.call( elem );
4747  
4748                  // Revert the old values
4749                  for ( var name in options ) {
4750                          elem.style[ name ] = old[ name ];
4751                  }
4752          }
4753  });
4754  
4755  if ( jQuery.expr && jQuery.expr.filters ) {
4756          jQuery.expr.filters.hidden = function( elem ) {
4757                  var width = elem.offsetWidth, height = elem.offsetHeight,
4758                          skip = elem.nodeName.toLowerCase() === "tr";
4759  
4760                  return width === 0 && height === 0 && !skip ?
4761                          true :
4762                          width > 0 && height > 0 && !skip ?
4763                                  false :
4764                                  jQuery.curCSS(elem, "display") === "none";
4765          };
4766  
4767          jQuery.expr.filters.visible = function( elem ) {
4768                  return !jQuery.expr.filters.hidden( elem );
4769          };
4770  }
4771  var jsc = now(),
4772          rscript = /<script(.|\s)*?\/script>/gi,
4773          rselectTextarea = /select|textarea/i,
4774          rinput = /color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,
4775          jsre = /=\?(&|$)/,
4776          rquery = /\?/,
4777          rts = /(\?|&)_=.*?(&|$)/,
4778          rurl = /^(\w+:)?\/\/([^\/?#]+)/,
4779          r20 = /%20/g,
4780  
4781          // Keep a copy of the old load method
4782          _load = jQuery.fn.load;
4783  
4784  jQuery.fn.extend({
4785          load: function( url, params, callback ) {
4786                  if ( typeof url !== "string" ) {
4787                          return _load.call( this, url );
4788  
4789                  // Don't do a request if no elements are being requested
4790                  } else if ( !this.length ) {
4791                          return this;
4792                  }
4793  
4794                  var off = url.indexOf(" ");
4795                  if ( off >= 0 ) {
4796                          var selector = url.slice(off, url.length);
4797                          url = url.slice(0, off);
4798                  }
4799  
4800                  // Default to a GET request
4801                  var type = "GET";
4802  
4803                  // If the second parameter was provided
4804                  if ( params ) {
4805                          // If it's a function
4806                          if ( jQuery.isFunction( params ) ) {
4807                                  // We assume that it's the callback
4808                                  callback = params;
4809                                  params = null;
4810  
4811                          // Otherwise, build a param string
4812                          } else if ( typeof params === "object" ) {
4813                                  params = jQuery.param( params, jQuery.ajaxSettings.traditional );
4814                                  type = "POST";
4815                          }
4816                  }
4817  
4818                  var self = this;
4819  
4820                  // Request the remote document
4821                  jQuery.ajax({
4822                          url: url,
4823                          type: type,
4824                          dataType: "html",
4825                          data: params,
4826                          complete: function( res, status ) {
4827                                  // If successful, inject the HTML into all the matched elements
4828                                  if ( status === "success" || status === "notmodified" ) {
4829                                          // See if a selector was specified
4830                                          self.html( selector ?
4831                                                  // Create a dummy div to hold the results
4832                                                  jQuery("<div />")
4833                                                          // inject the contents of the document in, removing the scripts
4834                                                          // to avoid any 'Permission Denied' errors in IE
4835                                                          .append(res.responseText.replace(rscript, ""))
4836  
4837                                                          // Locate the specified elements
4838                                                          .find(selector) :
4839  
4840                                                  // If not, just inject the full result
4841                                                  res.responseText );
4842                                  }
4843  
4844                                  if ( callback ) {
4845                                          self.each( callback, [res.responseText, status, res] );
4846                                  }
4847                          }
4848                  });
4849  
4850                  return this;
4851          },
4852  
4853          serialize: function() {
4854                  return jQuery.param(this.serializeArray());
4855          },
4856          serializeArray: function() {
4857                  return this.map(function() {
4858                          return this.elements ? jQuery.makeArray(this.elements) : this;
4859                  })
4860                  .filter(function() {
4861                          return this.name && !this.disabled &&
4862                                  (this.checked || rselectTextarea.test(this.nodeName) ||
4863                                          rinput.test(this.type));
4864                  })
4865                  .map(function( i, elem ) {
4866                          var val = jQuery(this).val();
4867  
4868                          return val == null ?
4869                                  null :
4870                                  jQuery.isArray(val) ?
4871                                          jQuery.map( val, function( val, i ) {
4872                                                  return { name: elem.name, value: val };
4873                                          }) :
4874                                          { name: elem.name, value: val };
4875                  }).get();
4876          }
4877  });
4878  
4879  // Attach a bunch of functions for handling common AJAX events
4880  jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function( i, o ) {
4881          jQuery.fn[o] = function( f ) {
4882                  return this.bind(o, f);
4883          };
4884  });
4885  
4886  jQuery.extend({
4887  
4888          get: function( url, data, callback, type ) {
4889                  // shift arguments if data argument was omited
4890                  if ( jQuery.isFunction( data ) ) {
4891                          type = type || callback;
4892                          callback = data;
4893                          data = null;
4894                  }
4895  
4896                  return jQuery.ajax({
4897                          type: "GET",
4898                          url: url,
4899                          data: data,
4900                          success: callback,
4901                          dataType: type
4902                  });
4903          },
4904  
4905          getScript: function( url, callback ) {
4906                  return jQuery.get(url, null, callback, "script");
4907          },
4908  
4909          getJSON: function( url, data, callback ) {
4910                  return jQuery.get(url, data, callback, "json");
4911          },
4912  
4913          post: function( url, data, callback, type ) {
4914                  // shift arguments if data argument was omited
4915                  if ( jQuery.isFunction( data ) ) {
4916                          type = type || callback;
4917                          callback = data;
4918                          data = {};
4919                  }
4920  
4921                  return jQuery.ajax({
4922                          type: "POST",
4923                          url: url,
4924                          data: data,
4925                          success: callback,
4926                          dataType: type
4927                  });
4928          },
4929  
4930          ajaxSetup: function( settings ) {
4931                  jQuery.extend( jQuery.ajaxSettings, settings );
4932          },
4933  
4934          ajaxSettings: {
4935                  url: location.href,
4936                  global: true,
4937                  type: "GET",
4938                  contentType: "application/x-www-form-urlencoded",
4939                  processData: true,
4940                  async: true,
4941                  /*
4942                  timeout: 0,
4943                  data: null,
4944                  username: null,
4945                  password: null,
4946                  traditional: false,
4947                  */
4948                  // Create the request object; Microsoft failed to properly
4949                  // implement the XMLHttpRequest in IE7 (can't request local files),
4950                  // so we use the ActiveXObject when it is available
4951                  // This function can be overriden by calling jQuery.ajaxSetup
4952                  xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ?
4953                          function() {
4954                                  return new window.XMLHttpRequest();
4955                          } :
4956                          function() {
4957                                  try {
4958                                          return new window.ActiveXObject("Microsoft.XMLHTTP");
4959                                  } catch(e) {}
4960                          },
4961                  accepts: {
4962                          xml: "application/xml, text/xml",
4963                          html: "text/html",
4964                          script: "text/javascript, application/javascript",
4965                          json: "application/json, text/javascript",
4966                          text: "text/plain",
4967                          _default: "*/*"
4968                  }
4969          },
4970  
4971          // Last-Modified header cache for next request
4972          lastModified: {},
4973          etag: {},
4974  
4975          ajax: function( origSettings ) {
4976                  var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings);
4977                 
4978                  var jsonp, status, data,
4979                          callbackContext = origSettings && origSettings.context || s,
4980                          type = s.type.toUpperCase();
4981  
4982                  // convert data if not already a string
4983                  if ( s.data && s.processData && typeof s.data !== "string" ) {
4984                          s.data = jQuery.param( s.data, s.traditional );
4985                  }
4986  
4987                  // Handle JSONP Parameter Callbacks
4988                  if ( s.dataType === "jsonp" ) {
4989                          if ( type === "GET" ) {
4990                                  if ( !jsre.test( s.url ) ) {
4991                                          s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?";
4992                                  }
4993                          } else if ( !s.data || !jsre.test(s.data) ) {
4994                                  s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
4995                          }
4996                          s.dataType = "json";
4997                  }
4998  
4999                  // Build temporary JSONP function
5000                  if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {
5001                          jsonp = s.jsonpCallback || ("jsonp" + jsc++);
5002  
5003                          // Replace the =? sequence both in the query string and the data
5004                          if ( s.data ) {
5005                                  s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
5006                          }
5007  
5008                          s.url = s.url.replace(jsre, "=" + jsonp + "$1");
5009  
5010                          // We need to make sure
5011                          // that a JSONP style response is executed properly
5012                          s.dataType = "script";
5013  
5014                          // Handle JSONP-style loading
5015                          window[ jsonp ] = window[ jsonp ] || function( tmp ) {
5016                                  data = tmp;
5017                                  success();
5018                                  complete();
5019                                  // Garbage collect
5020                                  window[ jsonp ] = undefined;
5021  
5022                                  try {
5023                                          delete window[ jsonp ];
5024                                  } catch(e) {}
5025  
5026                                  if ( head ) {
5027                                          head.removeChild( script );
5028                                  }
5029                          };
5030                  }
5031  
5032                  if ( s.dataType === "script" && s.cache === null ) {
5033                          s.cache = false;
5034                  }
5035  
5036                  if ( s.cache === false && type === "GET" ) {
5037                          var ts = now();
5038  
5039                          // try replacing _= if it is there
5040                          var ret = s.url.replace(rts, "$1_=" + ts + "$2");
5041  
5042                          // if nothing was replaced, add timestamp to the end
5043                          s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
5044                  }
5045  
5046                  // If data is available, append data to url for get requests
5047                  if ( s.data && type === "GET" ) {
5048                          s.url += (rquery.test(s.url) ? "&" : "?") + s.data;
5049                  }
5050  
5051                  // Watch for a new set of requests
5052                  if ( s.global && ! jQuery.active++ ) {
5053                          jQuery.event.trigger( "ajaxStart" );
5054                  }
5055  
5056                  // Matches an absolute URL, and saves the domain
5057                  var parts = rurl.exec( s.url ),
5058                          remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
5059  
5060                  // If we're requesting a remote document
5061                  // and trying to load JSON or Script with a GET
5062                  if ( s.dataType === "script" && type === "GET" && remote ) {
5063                          var head = document.getElementsByTagName("head")[0] || document.documentElement;
5064                          var script = document.createElement("script");
5065                          script.src = s.url;
5066                          if ( s.scriptCharset ) {
5067                                  script.charset = s.scriptCharset;
5068                          }
5069  
5070                          // Handle Script loading
5071                          if ( !jsonp ) {
5072                                  var done = false;
5073  
5074                                  // Attach handlers for all browsers
5075                                  script.onload = script.onreadystatechange = function() {
5076                                          if ( !done && (!this.readyState ||
5077                                                          this.readyState === "loaded" || this.readyState === "complete") ) {
5078                                                  done = true;
5079                                                  success();
5080                                                  complete();
5081  
5082                                                  // Handle memory leak in IE
5083                                                  script.onload = script.onreadystatechange = null;
5084                                                  if ( head && script.parentNode ) {
5085                                                          head.removeChild( script );
5086                                                  }
5087                                          }
5088                                  };
5089                          }
5090  
5091                          // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
5092                          // This arises when a base node is used (#2709 and #4378).
5093                          head.insertBefore( script, head.firstChild );
5094  
5095                          // We handle everything using the script element injection
5096                          return undefined;
5097                  }
5098  
5099                  var requestDone = false;
5100  
5101                  // Create the request object
5102                  var xhr = s.xhr();
5103  
5104                  if ( !xhr ) {
5105                          return;
5106                  }
5107  
5108                  // Open the socket
5109                  // Passing null username, generates a login popup on Opera (#2865)
5110                  if ( s.username ) {
5111                          xhr.open(type, s.url, s.async, s.username, s.password);
5112                  } else {
5113                          xhr.open(type, s.url, s.async);
5114                  }
5115  
5116                  // Need an extra try/catch for cross domain requests in Firefox 3
5117                  try {
5118                          // Set the correct header, if data is being sent
5119                          if ( s.data || origSettings && origSettings.contentType ) {
5120                                  xhr.setRequestHeader("Content-Type", s.contentType);
5121                          }
5122  
5123                          // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
5124                          if ( s.ifModified ) {
5125                                  if ( jQuery.lastModified[s.url] ) {
5126                                          xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]);
5127                                  }
5128  
5129                                  if ( jQuery.etag[s.url] ) {
5130                                          xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]);
5131                                  }
5132                          }
5133  
5134                          // Set header so the called script knows that it's an XMLHttpRequest
5135                          // Only send the header if it's not a remote XHR
5136                          if ( !remote ) {
5137                                  xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
5138                          }
5139  
5140                          // Set the Accepts header for the server, depending on the dataType
5141                          xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
5142                                  s.accepts[ s.dataType ] + ", */*" :
5143                                  s.accepts._default );
5144                  } catch(e) {}
5145  
5146                  // Allow custom headers/mimetypes and early abort
5147                  if ( s.beforeSend && s.beforeSend.call(callbackContext, xhr, s) === false ) {
5148                          // Handle the global AJAX counter
5149                          if ( s.global && ! --jQuery.active ) {
5150                                  jQuery.event.trigger( "ajaxStop" );
5151                          }
5152  
5153                          // close opended socket
5154                          xhr.abort();
5155                          return false;
5156                  }
5157  
5158                  if ( s.global ) {
5159                          trigger("ajaxSend", [xhr, s]);
5160                  }
5161  
5162                  // Wait for a response to come back
5163                  var onreadystatechange = xhr.onreadystatechange = function( isTimeout ) {
5164                          // The request was aborted
5165                          if ( !xhr || xhr.readyState === 0 || isTimeout === "abort" ) {
5166                                  // Opera doesn't call onreadystatechange before this point
5167                                  // so we simulate the call
5168                                  if ( !requestDone ) {
5169                                          complete();
5170                                  }
5171  
5172                                  requestDone = true;
5173                                  if ( xhr ) {
5174                                          xhr.onreadystatechange = jQuery.noop;
5175                                  }
5176  
5177                          // The transfer is complete and the data is available, or the request timed out
5178                          } else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) {
5179                                  requestDone = true;
5180                                  xhr.onreadystatechange = jQuery.noop;
5181  
5182                                  status = isTimeout === "timeout" ?
5183                                          "timeout" :
5184                                          !jQuery.httpSuccess( xhr ) ?
5185                                                  "error" :
5186                                                  s.ifModified && jQuery.httpNotModified( xhr, s.url ) ?
5187                                                          "notmodified" :
5188                                                          "success";
5189  
5190                                  var errMsg;
5191  
5192                                  if ( status === "success" ) {
5193                                          // Watch for, and catch, XML document parse errors
5194                                          try {
5195                                                  // process the data (runs the xml through httpData regardless of callback)
5196                                                  data = jQuery.httpData( xhr, s.dataType, s );
5197                                          } catch(err) {
5198                                                  status = "parsererror";
5199                                                  errMsg = err;
5200                                          }
5201                                  }
5202  
5203                                  // Make sure that the request was successful or notmodified
5204                                  if ( status === "success" || status === "notmodified" ) {
5205                                          // JSONP handles its own success callback
5206                                          if ( !jsonp ) {
5207                                                  success();
5208                                          }
5209                                  } else {
5210                                          jQuery.handleError(s, xhr, status, errMsg);
5211                                  }
5212  
5213                                  // Fire the complete handlers
5214                                  complete();
5215  
5216                                  if ( isTimeout === "timeout" ) {
5217                                          xhr.abort();
5218                                  }
5219  
5220                                  // Stop memory leaks
5221                                  if ( s.async ) {
5222                                          xhr = null;
5223                                  }
5224                          }
5225                  };
5226  
5227                  // Override the abort handler, if we can (IE doesn't allow it, but that's OK)
5228                  // Opera doesn't fire onreadystatechange at all on abort
5229                  try {
5230                          var oldAbort = xhr.abort;
5231                          xhr.abort = function() {
5232                                  if ( xhr ) {
5233                                          oldAbort.call( xhr );
5234                                  }
5235  
5236                                  onreadystatechange( "abort" );
5237                          };
5238                  } catch(e) { }
5239  
5240                  // Timeout checker
5241                  if ( s.async && s.timeout > 0 ) {
5242                          setTimeout(function() {
5243                                  // Check to see if the request is still happening
5244                                  if ( xhr && !requestDone ) {
5245                                          onreadystatechange( "timeout" );
5246                                  }
5247                          }, s.timeout);
5248                  }
5249  
5250                  // Send the data
5251                  try {
5252                          xhr.send( type === "POST" || type === "PUT" || type === "DELETE" ? s.data : null );
5253                  } catch(e) {
5254                          jQuery.handleError(s, xhr, null, e);
5255                          // Fire the complete handlers
5256                          complete();
5257                  }
5258  
5259                  // firefox 1.5 doesn't fire statechange for sync requests
5260                  if ( !s.async ) {
5261                          onreadystatechange();
5262                  }
5263  
5264                  function success() {
5265                          // If a local callback was specified, fire it and pass it the data
5266                          if ( s.success ) {
5267                                  s.success.call( callbackContext, data, status, xhr );
5268                          }
5269  
5270                          // Fire the global callback
5271                          if ( s.global ) {
5272                                  trigger( "ajaxSuccess", [xhr, s] );
5273                          }
5274                  }
5275  
5276                  function complete() {
5277                          // Process result
5278                          if ( s.complete ) {
5279                                  s.complete.call( callbackContext, xhr, status);
5280                          }
5281  
5282                          // The request was completed
5283                          if ( s.global ) {
5284                                  trigger( "ajaxComplete", [xhr, s] );
5285                          }
5286  
5287                          // Handle the global AJAX counter
5288                          if ( s.global && ! --jQuery.active ) {
5289                                  jQuery.event.trigger( "ajaxStop" );
5290                          }
5291                  }
5292                 
5293                  function trigger(type, args) {
5294                          (s.context ? jQuery(s.context) : jQuery.event).trigger(type, args);
5295                  }
5296  
5297                  // return XMLHttpRequest to allow aborting the request etc.
5298                  return xhr;
5299          },
5300  
5301          handleError: function( s, xhr, status, e ) {
5302                  // If a local callback was specified, fire it
5303                  if ( s.error ) {
5304                          s.error.call( s.context || s, xhr, status, e );
5305                  }
5306  
5307                  // Fire the global callback
5308                  if ( s.global ) {
5309                          (s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] );
5310                  }
5311          },
5312  
5313          // Counter for holding the number of active queries
5314          active: 0,
5315  
5316          // Determines if an XMLHttpRequest was successful or not
5317          httpSuccess: function( xhr ) {
5318                  try {
5319                          // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
5320                          return !xhr.status && location.protocol === "file:" ||
5321                                  // Opera returns 0 when status is 304
5322                                  ( xhr.status >= 200 && xhr.status < 300 ) ||
5323                                  xhr.status === 304 || xhr.status === 1223 || xhr.status === 0;
5324                  } catch(e) {}
5325  
5326                  return false;
5327          },
5328  
5329          // Determines if an XMLHttpRequest returns NotModified
5330          httpNotModified: function( xhr, url ) {
5331                  var lastModified = xhr.getResponseHeader("Last-Modified"),
5332                          etag = xhr.getResponseHeader("Etag");
5333  
5334                  if ( lastModified ) {
5335                          jQuery.lastModified[url] = lastModified;
5336                  }
5337  
5338                  if ( etag ) {
5339                          jQuery.etag[url] = etag;
5340                  }
5341  
5342                  // Opera returns 0 when status is 304
5343                  return xhr.status === 304 || xhr.status === 0;
5344          },
5345  
5346          httpData: function( xhr, type, s ) {
5347                  var ct = xhr.getResponseHeader("content-type") || "",
5348                          xml = type === "xml" || !type && ct.indexOf("xml") >= 0,
5349                          data = xml ? xhr.responseXML : xhr.responseText;
5350  
5351                  if ( xml && data.documentElement.nodeName === "parsererror" ) {
5352                          jQuery.error( "parsererror" );
5353                  }
5354  
5355                  // Allow a pre-filtering function to sanitize the response
5356                  // s is checked to keep backwards compatibility
5357                  if ( s && s.dataFilter ) {
5358                          data = s.dataFilter( data, type );
5359                  }
5360  
5361                  // The filter can actually parse the response
5362                  if ( typeof data === "string" ) {
5363                          // Get the JavaScript object, if JSON is used.
5364                          if ( type === "json" || !type && ct.indexOf("json") >= 0 ) {
5365                                  data = jQuery.parseJSON( data );
5366  
5367                          // If the type is "script", eval it in global context
5368                          } else if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) {
5369                                  jQuery.globalEval( data );
5370                          }
5371                  }
5372  
5373                  return data;
5374          },
5375  
5376          // Serialize an array of form elements or a set of
5377          // key/values into a query string
5378          param: function( a, traditional ) {
5379                  var s = [];
5380                 
5381                  // Set traditional to true for jQuery <= 1.3.2 behavior.
5382                  if ( traditional === undefined ) {
5383                          traditional = jQuery.ajaxSettings.traditional;
5384                  }
5385                 
5386                  // If an array was passed in, assume that it is an array of form elements.
5387                  if ( jQuery.isArray(a) || a.jquery ) {
5388                          // Serialize the form elements
5389                          jQuery.each( a, function() {
5390                                  add( this.name, this.value );
5391                          });
5392                         
5393                  } else {
5394                          // If traditional, encode the "old" way (the way 1.3.2 or older
5395                          // did it), otherwise encode params recursively.
5396                          for ( var prefix in a ) {
5397                                  buildParams( prefix, a[prefix] );
5398                          }
5399                  }
5400  
5401                  // Return the resulting serialization
5402                  return s.join("&").replace(r20, "+");
5403  
5404                  function buildParams( prefix, obj ) {
5405                          if ( jQuery.isArray(obj) ) {
5406                                  // Serialize array item.
5407                                  jQuery.each( obj, function( i, v ) {
5408                                          if ( traditional || /\[\]$/.test( prefix ) ) {
5409                                                  // Treat each array item as a scalar.
5410                                                  add( prefix, v );
5411                                          } else {
5412                                                  // If array item is non-scalar (array or object), encode its
5413                                                  // numeric index to resolve deserialization ambiguity issues.
5414                                                  // Note that rack (as of 1.0.0) can't currently deserialize
5415                                                  // nested arrays properly, and attempting to do so may cause
5416                                                  // a server error. Possible fixes are to modify rack's
5417                                                  // deserialization algorithm or to provide an option or flag
5418                                                  // to force array serialization to be shallow.
5419                                                  buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v );
5420                                          }
5421                                  });
5422                                         
5423                          } else if ( !traditional && obj != null && typeof obj === "object" ) {
5424                                  // Serialize object item.
5425                                  jQuery.each( obj, function( k, v ) {
5426                                          buildParams( prefix + "[" + k + "]", v );
5427                                  });
5428                                         
5429                          } else {
5430                                  // Serialize scalar item.
5431                                  add( prefix, obj );
5432                          }
5433                  }
5434  
5435                  function add( key, value ) {
5436                          // If value is a function, invoke it and return its value
5437                          value = jQuery.isFunction(value) ? value() : value;
5438                          s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
5439                  }
5440          }
5441  });
5442  var elemdisplay = {},
5443          rfxtypes = /toggle|show|hide/,
5444          rfxnum = /^([+-]=)?([\d+-.]+)(.*)$/,
5445          timerId,
5446          fxAttrs = [
5447                  // height animations
5448                  [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
5449                  // width animations
5450                  [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
5451                  // opacity animations
5452                  [ "opacity" ]
5453          ];
5454  
5455  jQuery.fn.extend({
5456          show: function( speed, callback ) {
5457                  if ( speed || speed === 0) {
5458                          return this.animate( genFx("show", 3), speed, callback);
5459  
5460                  } else {
5461                          for ( var i = 0, l = this.length; i < l; i++ ) {
5462                                  var old = jQuery.data(this[i], "olddisplay");
5463  
5464                                  this[i].style.display = old || "";
5465  
5466                                  if ( jQuery.css(this[i], "display") === "none" ) {
5467                                          var nodeName = this[i].nodeName, display;
5468  
5469                                          if ( elemdisplay[ nodeName ] ) {
5470                                                  display = elemdisplay[ nodeName ];
5471  
5472                                          } else {
5473                                                  var elem = jQuery("<" + nodeName + " />").appendTo("body");
5474  
5475                                                  display = elem.css("display");
5476  
5477                                                  if ( display === "none" ) {
5478                                                          display = "block";
5479                                                  }
5480  
5481                                                  elem.remove();
5482  
5483                                                  elemdisplay[ nodeName ] = display;
5484                                          }
5485  
5486                                          jQuery.data(this[i], "olddisplay", display);
5487                                  }
5488                          }
5489  
5490                          // Set the display of the elements in a second loop
5491                          // to avoid the constant reflow
5492                          for ( var j = 0, k = this.length; j < k; j++ ) {
5493                                  this[j].style.display = jQuery.data(this[j], "olddisplay") || "";
5494                          }
5495  
5496                          return this;
5497                  }
5498          },
5499  
5500          hide: function( speed, callback ) {
5501                  if ( speed || speed === 0 ) {
5502                          return this.animate( genFx("hide", 3), speed, callback);
5503  
5504                  } else {
5505                          for ( var i = 0, l = this.length; i < l; i++ ) {
5506                                  var old = jQuery.data(this[i], "olddisplay");
5507                                  if ( !old && old !== "none" ) {
5508                                          jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
5509                                  }
5510                          }
5511  
5512                          // Set the display of the elements in a second loop
5513                          // to avoid the constant reflow
5514                          for ( var j = 0, k = this.length; j < k; j++ ) {
5515                                  this[j].style.display = "none";
5516                          }
5517  
5518                          return this;
5519                  }
5520          },
5521  
5522          // Save the old toggle function
5523          _toggle: jQuery.fn.toggle,
5524  
5525          toggle: function( fn, fn2 ) {
5526                  var bool = typeof fn === "boolean";
5527  
5528                  if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
5529                          this._toggle.apply( this, arguments );
5530  
5531                  } else if ( fn == null || bool ) {
5532                          this.each(function() {
5533                                  var state = bool ? fn : jQuery(this).is(":hidden");
5534                                  jQuery(this)[ state ? "show" : "hide" ]();
5535                          });
5536  
5537                  } else {
5538                          this.animate(genFx("toggle", 3), fn, fn2);
5539                  }
5540  
5541                  return this;
5542          },
5543  
5544          fadeTo: function( speed, to, callback ) {
5545                  return this.filter(":hidden").css("opacity", 0).show().end()
5546                                          .animate({opacity: to}, speed, callback);
5547          },
5548  
5549          animate: function( prop, speed, easing, callback ) {
5550                  var optall = jQuery.speed(speed, easing, callback);
5551  
5552                  if ( jQuery.isEmptyObject( prop ) ) {
5553                          return this.each( optall.complete );
5554                  }
5555  
5556                  return this[ optall.queue === false ? "each" : "queue" ](function() {
5557                          var opt = jQuery.extend({}, optall), p,
5558                                  hidden = this.nodeType === 1 && jQuery(this).is(":hidden"),
5559                                  self = this;
5560  
5561                          for ( p in prop ) {
5562                                  var name = p.replace(rdashAlpha, fcamelCase);
5563  
5564                                  if ( p !== name ) {
5565                                          prop[ name ] = prop[ p ];
5566                                          delete prop[ p ];
5567                                          p = name;
5568                                  }
5569  
5570                                  if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {
5571                                          return opt.complete.call(this);
5572                                  }
5573  
5574                                  if ( ( p === "height" || p === "width" ) && this.style ) {
5575                                          // Store display property
5576                                          opt.display = jQuery.css(this, "display");
5577  
5578                                          // Make sure that nothing sneaks out
5579                                          opt.overflow = this.style.overflow;
5580                                  }
5581  
5582                                  if ( jQuery.isArray( prop[p] ) ) {
5583                                          // Create (if needed) and add to specialEasing
5584                                          (opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
5585                                          prop[p] = prop[p][0];
5586                                  }
5587                          }
5588  
5589                          if ( opt.overflow != null ) {
5590                                  this.style.overflow = "hidden";
5591                          }
5592  
5593                          opt.curAnim = jQuery.extend({}, prop);
5594  
5595                          jQuery.each( prop, function( name, val ) {
5596                                  var e = new jQuery.fx( self, opt, name );
5597  
5598                                  if ( rfxtypes.test(val) ) {
5599                                          e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );
5600  
5601                                  } else {
5602                                          var parts = rfxnum.exec(val),
5603                                                  start = e.cur(true) || 0;
5604  
5605                                          if ( parts ) {
5606                                                  var end = parseFloat( parts[2] ),
5607                                                          unit = parts[3] || "px";
5608  
5609                                                  // We need to compute starting value
5610                                                  if ( unit !== "px" ) {
5611                                                          self.style[ name ] = (end || 1) + unit;
5612                                                          start = ((end || 1) / e.cur(true)) * start;
5613                                                          self.style[ name ] = start + unit;
5614                                                  }
5615  
5616                                                  // If a +=/-= token was provided, we're doing a relative animation
5617                                                  if ( parts[1] ) {
5618                                                          end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
5619                                                  }
5620  
5621                                                  e.custom( start, end, unit );
5622  
5623                                          } else {
5624                                                  e.custom( start, val, "" );
5625                                          }
5626                                  }
5627                          });
5628  
5629                          // For JS strict compliance
5630                          return true;
5631                  });
5632          },
5633  
5634          stop: function( clearQueue, gotoEnd ) {
5635                  var timers = jQuery.timers;
5636  
5637                  if ( clearQueue ) {
5638                          this.queue([]);
5639                  }
5640  
5641                  this.each(function() {
5642                          // go in reverse order so anything added to the queue during the loop is ignored
5643                          for ( var i = timers.length - 1; i >= 0; i-- ) {
5644                                  if ( timers[i].elem === this ) {
5645                                          if (gotoEnd) {
5646                                                  // force the next step to be the last
5647                                                  timers[i](true);
5648                                          }
5649  
5650                                          timers.splice(i, 1);
5651                                  }
5652                          }
5653                  });
5654  
5655                  // start the next in the queue if the last step wasn't forced
5656                  if ( !gotoEnd ) {
5657                          this.dequeue();
5658                  }
5659  
5660                  return this;
5661          }
5662  
5663  });
5664  
5665  // Generate shortcuts for custom animations
5666  jQuery.each({
5667          slideDown: genFx("show", 1),
5668          slideUp: genFx("hide", 1),
5669          slideToggle: genFx("toggle", 1),
5670          fadeIn: { opacity: "show" },
5671          fadeOut: { opacity: "hide" }
5672  }, function( name, props ) {
5673          jQuery.fn[ name ] = function( speed, callback ) {
5674                  return this.animate( props, speed, callback );
5675          };
5676  });
5677  
5678  jQuery.extend({
5679          speed: function( speed, easing, fn ) {
5680                  var opt = speed && typeof speed === "object" ? speed : {
5681                          complete: fn || !fn && easing ||
5682                                  jQuery.isFunction( speed ) && speed,
5683                          duration: speed,
5684                          easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
5685                  };
5686  
5687                  opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
5688                          jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
5689  
5690                  // Queueing
5691                  opt.old = opt.complete;
5692                  opt.complete = function() {
5693                          if ( opt.queue !== false ) {
5694                                  jQuery(this).dequeue();
5695                          }
5696                          if ( jQuery.isFunction( opt.old ) ) {
5697                                  opt.old.call( this );
5698                          }
5699                  };
5700  
5701                  return opt;
5702          },
5703  
5704          easing: {
5705                  linear: function( p, n, firstNum, diff ) {
5706                          return firstNum + diff * p;
5707                  },
5708                  swing: function( p, n, firstNum, diff ) {
5709                          return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
5710                  }
5711          },
5712  
5713          timers: [],
5714  
5715          fx: function( elem, options, prop ) {
5716                  this.options = options;
5717                  this.elem = elem;
5718                  this.prop = prop;
5719  
5720                  if ( !options.orig ) {
5721                          options.orig = {};
5722                  }
5723          }
5724  
5725  });
5726  
5727  jQuery.fx.prototype = {
5728          // Simple function for setting a style value
5729          update: function() {
5730                  if ( this.options.step ) {
5731                          this.options.step.call( this.elem, this.now, this );
5732                  }
5733  
5734                  (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
5735  
5736                  // Set display property to block for height/width animations
5737                  if ( ( this.prop === "height" || this.prop === "width" ) && this.elem.style ) {
5738                          this.elem.style.display = "block";
5739                  }
5740          },
5741  
5742          // Get the current size
5743          cur: function( force ) {
5744                  if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
5745                          return this.elem[ this.prop ];
5746                  }
5747  
5748                  var r = parseFloat(jQuery.css(this.elem, this.prop, force));
5749                  return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
5750          },
5751  
5752          // Start an animation from one number to another
5753          custom: function( from, to, unit ) {
5754                  this.startTime = now();
5755                  this.start = from;
5756                  this.end = to;
5757                  this.unit = unit || this.unit || "px";
5758                  this.now = this.start;
5759                  this.pos = this.state = 0;
5760  
5761                  var self = this;
5762                  function t( gotoEnd ) {
5763                          return self.step(gotoEnd);
5764                  }
5765  
5766                  t.elem = this.elem;
5767  
5768                  if ( t() && jQuery.timers.push(t) && !timerId ) {
5769                          timerId = setInterval(jQuery.fx.tick, 13);
5770                  }
5771          },
5772  
5773          // Simple 'show' function
5774          show: function() {
5775                  // Remember where we started, so that we can go back to it later
5776                  this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
5777                  this.options.show = true;
5778  
5779                  // Begin the animation
5780                  // Make sure that we start at a small width/height to avoid any
5781                  // flash of content
5782                  this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
5783  
5784                  // Start by showing the element
5785                  jQuery( this.elem ).show();
5786          },
5787  
5788          // Simple 'hide' function
5789          hide: function() {
5790                  // Remember where we started, so that we can go back to it later
5791                  this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
5792                  this.options.hide = true;
5793  
5794                  // Begin the animation
5795                  this.custom(this.cur(), 0);
5796          },
5797  
5798          // Each step of an animation
5799          step: function( gotoEnd ) {
5800                  var t = now(), done = true;
5801  
5802                  if ( gotoEnd || t >= this.options.duration + this.startTime ) {
5803                          this.now = this.end;
5804                          this.pos = this.state = 1;
5805                          this.update();
5806  
5807                          this.options.curAnim[ this.prop ] = true;
5808  
5809                          for ( var i in this.options.curAnim ) {
5810                                  if ( this.options.curAnim[i] !== true ) {
5811                                          done = false;
5812                                  }
5813                          }
5814  
5815                          if ( done ) {
5816                                  if ( this.options.display != null ) {
5817                                          // Reset the overflow
5818                                          this.elem.style.overflow = this.options.overflow;
5819  
5820                                          // Reset the display
5821                                          var old = jQuery.data(this.elem, "olddisplay");
5822                                          this.elem.style.display = old ? old : this.options.display;
5823  
5824                                          if ( jQuery.css(this.elem, "display") === "none" ) {
5825                                                  this.elem.style.display = "block";
5826                                          }
5827                                  }
5828  
5829                                  // Hide the element if the "hide" operation was done
5830                                  if ( this.options.hide ) {
5831                                          jQuery(this.elem).hide();
5832                                  }
5833  
5834                                  // Reset the properties, if the item has been hidden or shown
5835                                  if ( this.options.hide || this.options.show ) {
5836                                          for ( var p in this.options.curAnim ) {
5837                                                  jQuery.style(this.elem, p, this.options.orig[p]);
5838                                          }
5839                                  }
5840  
5841                                  // Execute the complete function
5842                                  this.options.complete.call( this.elem );
5843                          }
5844  
5845                          return false;
5846  
5847                  } else {
5848                          var n = t - this.startTime;
5849                          this.state = n / this.options.duration;
5850  
5851                          // Perform the easing function, defaults to swing
5852                          var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
5853                          var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
5854                          this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
5855                          this.now = this.start + ((this.end - this.start) * this.pos);
5856  
5857                          // Perform the next step of the animation
5858                          this.update();
5859                  }
5860  
5861                  return true;
5862          }
5863  };
5864  
5865  jQuery.extend( jQuery.fx, {
5866          tick: function() {
5867                  var timers = jQuery.timers;
5868  
5869                  for ( var i = 0; i < timers.length; i++ ) {
5870                          if ( !timers[i]() ) {
5871                                  timers.splice(i--, 1);
5872                          }
5873                  }
5874  
5875                  if ( !timers.length ) {
5876                          jQuery.fx.stop();
5877                  }
5878          },
5879                 
5880          stop: function() {
5881                  clearInterval( timerId );
5882                  timerId = null;
5883          },
5884         
5885          speeds: {
5886                  slow: 600,
5887                  fast: 200,
5888                  // Default speed
5889                  _default: 400
5890          },
5891  
5892          step: {
5893                  opacity: function( fx ) {
5894                          jQuery.style(fx.elem, "opacity", fx.now);
5895                  },
5896  
5897                  _default: function( fx ) {
5898                          if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
5899                                  fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
5900                          } else {
5901                                  fx.elem[ fx.prop ] = fx.now;
5902                          }
5903                  }
5904          }
5905  });
5906  
5907  if ( jQuery.expr && jQuery.expr.filters ) {
5908          jQuery.expr.filters.animated = function( elem ) {
5909                  return jQuery.grep(jQuery.timers, function( fn ) {
5910                          return elem === fn.elem;
5911                  }).length;
5912          };
5913  }
5914  
5915  function genFx( type, num ) {
5916          var obj = {};
5917  
5918          jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
5919                  obj[ this ] = type;
5920          });
5921  
5922          return obj;
5923  }
5924  if ( "getBoundingClientRect" in document.documentElement ) {
5925          jQuery.fn.offset = function( options ) {
5926                  var elem = this[0];
5927  
5928                  if ( options ) { 
5929                          return this.each(function( i ) {
5930                                  jQuery.offset.setOffset( this, options, i );
5931                          });
5932                  }
5933  
5934                  if ( !elem || !elem.ownerDocument ) {
5935                          return null;
5936                  }
5937  
5938                  if ( elem === elem.ownerDocument.body ) {
5939                          return jQuery.offset.bodyOffset( elem );
5940                  }
5941  
5942                  var box = elem.getBoundingClientRect(), doc = elem.ownerDocument, body = doc.body, docElem = doc.documentElement,
5943                          clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
5944                          top  = box.top  + (self.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop ) - clientTop,
5945                          left = box.left + (self.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
5946  
5947                  return { top: top, left: left };
5948          };
5949  
5950  } else {
5951          jQuery.fn.offset = function( options ) {
5952                  var elem = this[0];
5953  
5954                  if ( options ) { 
5955                          return this.each(function( i ) {
5956                                  jQuery.offset.setOffset( this, options, i );
5957                          });
5958                  }
5959  
5960                  if ( !elem || !elem.ownerDocument ) {
5961                          return null;
5962                  }
5963  
5964                  if ( elem === elem.ownerDocument.body ) {
5965                          return jQuery.offset.bodyOffset( elem );
5966                  }
5967  
5968                  jQuery.offset.initialize();
5969  
5970                  var offsetParent = elem.offsetParent, prevOffsetParent = elem,
5971                          doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
5972                          body = doc.body, defaultView = doc.defaultView,
5973                          prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
5974                          top = elem.offsetTop, left = elem.offsetLeft;
5975  
5976                  while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
5977                          if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
5978                                  break;
5979                          }
5980  
5981                          computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
5982                          top  -= elem.scrollTop;
5983                          left -= elem.scrollLeft;
5984  
5985                          if ( elem === offsetParent ) {
5986                                  top  += elem.offsetTop;
5987                                  left += elem.offsetLeft;
5988  
5989                                  if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.nodeName)) ) {
5990                                          top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
5991                                          left += parseFloat( computedStyle.borderLeftWidth ) || 0;
5992                                  }
5993  
5994                                  prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
5995                          }
5996  
5997                          if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
5998                                  top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
5999                                  left += parseFloat( computedStyle.borderLeftWidth ) || 0;
6000                          }
6001  
6002                          prevComputedStyle = computedStyle;
6003                  }
6004  
6005                  if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
6006                          top  += body.offsetTop;
6007                          left += body.offsetLeft;
6008                  }
6009  
6010                  if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
6011                          top  += Math.max( docElem.scrollTop, body.scrollTop );
6012                          left += Math.max( docElem.scrollLeft, body.scrollLeft );
6013                  }
6014  
6015                  return { top: top, left: left };
6016          };
6017  }
6018  
6019  jQuery.offset = {
6020          initialize: function() {
6021                  var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.curCSS(body, "marginTop", true) ) || 0,
6022                          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>";
6023  
6024                  jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
6025  
6026                  container.innerHTML = html;
6027                  body.insertBefore( container, body.firstChild );
6028                  innerDiv = container.firstChild;
6029                  checkDiv = innerDiv.firstChild;
6030                  td = innerDiv.nextSibling.firstChild.firstChild;
6031  
6032                  this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
6033                  this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
6034  
6035                  checkDiv.style.position = "fixed", checkDiv.style.top = "20px";
6036                  // safari subtracts parent border width here which is 5px
6037                  this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
6038                  checkDiv.style.position = checkDiv.style.top = "";
6039  
6040                  innerDiv.style.overflow = "hidden", innerDiv.style.position = "relative";
6041                  this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
6042  
6043                  this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
6044  
6045                  body.removeChild( container );
6046                  body = container = innerDiv = checkDiv = table = td = null;
6047                  jQuery.offset.initialize = jQuery.noop;
6048          },
6049  
6050          bodyOffset: function( body ) {
6051                  var top = body.offsetTop, left = body.offsetLeft;
6052  
6053                  jQuery.offset.initialize();
6054  
6055                  if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
6056                          top  += parseFloat( jQuery.curCSS(body, "marginTop",  true) ) || 0;
6057                          left += parseFloat( jQuery.curCSS(body, "marginLeft", true) ) || 0;
6058                  }
6059  
6060                  return { top: top, left: left };
6061          },
6062         
6063          setOffset: function( elem, options, i ) {
6064                  // set position first, in-case top/left are set even on static elem
6065                  if ( /static/.test( jQuery.curCSS( elem, "position" ) ) ) {
6066                          elem.style.position = "relative";
6067                  }
6068                  var curElem   = jQuery( elem ),
6069                          curOffset = curElem.offset(),
6070                          curTop    = parseInt( jQuery.curCSS( elem, "top",  true ), 10 ) || 0,
6071                          curLeft   = parseInt( jQuery.curCSS( elem, "left", true ), 10 ) || 0;
6072  
6073                  if ( jQuery.isFunction( options ) ) {
6074                          options = options.call( elem, i, curOffset );
6075                  }
6076  
6077                  var props = {
6078                          top:  (options.top  - curOffset.top)  + curTop,
6079                          left: (options.left - curOffset.left) + curLeft
6080                  };
6081                 
6082                  if ( "using" in options ) {
6083                          options.using.call( elem, props );
6084                  } else {
6085                          curElem.css( props );
6086                  }
6087          }
6088  };
6089  
6090  
6091  jQuery.fn.extend({
6092          position: function() {
6093                  if ( !this[0] ) {
6094                          return null;
6095                  }
6096  
6097                  var elem = this[0],
6098  
6099                  // Get *real* offsetParent
6100                  offsetParent = this.offsetParent(),
6101  
6102                  // Get correct offsets
6103                  offset       = this.offset(),
6104                  parentOffset = /^body|html$/i.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
6105  
6106                  // Subtract element margins
6107                  // note: when an element has margin: auto the offsetLeft and marginLeft
6108                  // are the same in Safari causing offset.left to incorrectly be 0
6109                  offset.top  -= parseFloat( jQuery.curCSS(elem, "marginTop",  true) ) || 0;
6110                  offset.left -= parseFloat( jQuery.curCSS(elem, "marginLeft", true) ) || 0;
6111  
6112                  // Add offsetParent borders
6113                  parentOffset.top  += parseFloat( jQuery.curCSS(offsetParent[0], "borderTopWidth",  true) ) || 0;
6114                  parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], "borderLeftWidth", true) ) || 0;
6115  
6116                  // Subtract the two offsets
6117                  return {
6118                          top:  offset.top  - parentOffset.top,
6119                          left: offset.left - parentOffset.left
6120                  };
6121          },
6122  
6123          offsetParent: function() {
6124                  return this.map(function() {
6125                          var offsetParent = this.offsetParent || document.body;
6126                          while ( offsetParent && (!/^body|html$/i.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
6127                                  offsetParent = offsetParent.offsetParent;
6128                          }
6129                          return offsetParent;
6130                  });
6131          }
6132  });
6133  
6134  
6135  // Create scrollLeft and scrollTop methods
6136  jQuery.each( ["Left", "Top"], function( i, name ) {
6137          var method = "scroll" + name;
6138  
6139          jQuery.fn[ method ] = function(val) {
6140                  var elem = this[0], win;
6141                 
6142                  if ( !elem ) {
6143                          return null;
6144                  }
6145  
6146                  if ( val !== undefined ) {
6147                          // Set the scroll offset
6148                          return this.each(function() {
6149                                  win = getWindow( this );
6150  
6151                                  if ( win ) {
6152                                          win.scrollTo(
6153                                                  !i ? val : jQuery(win).scrollLeft(),
6154                                                   i ? val : jQuery(win).scrollTop()
6155                                          );
6156  
6157                                  } else {
6158                                          this[ method ] = val;
6159                                  }
6160                          });
6161                  } else {
6162                          win = getWindow( elem );
6163  
6164                          // Return the scroll offset
6165                          return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
6166                                  jQuery.support.boxModel && win.document.documentElement[ method ] ||
6167                                          win.document.body[ method ] :
6168                                  elem[ method ];
6169                  }
6170          };
6171  });
6172  
6173  function getWindow( elem ) {
6174          return ("scrollTo" in elem && elem.document) ?
6175                  elem :
6176                  elem.nodeType === 9 ?
6177                          elem.defaultView || elem.parentWindow :
6178                          false;
6179  }
6180  // Create innerHeight, innerWidth, outerHeight and outerWidth methods
6181  jQuery.each([ "Height", "Width" ], function( i, name ) {
6182  
6183          var type = name.toLowerCase();
6184  
6185          // innerHeight and innerWidth
6186          jQuery.fn["inner" + name] = function() {
6187                  return this[0] ?
6188                          jQuery.css( this[0], type, false, "padding" ) :
6189                          null;
6190          };
6191  
6192          // outerHeight and outerWidth
6193          jQuery.fn["outer" + name] = function( margin ) {
6194                  return this[0] ?
6195                          jQuery.css( this[0], type, false, margin ? "margin" : "border" ) :
6196                          null;
6197          };
6198  
6199          jQuery.fn[ type ] = function( size ) {
6200                  // Get window width or height
6201                  var elem = this[0];
6202                  if ( !elem ) {
6203                          return size == null ? null : this;
6204                  }
6205                 
6206                  if ( jQuery.isFunction( size ) ) {
6207                          return this.each(function( i ) {
6208                                  var self = jQuery( this );
6209                                  self[ type ]( size.call( this, i, self[ type ]() ) );
6210                          });
6211                  }
6212  
6213                  return ("scrollTo" in elem && elem.document) ? // does it walk and quack like a window?
6214                          // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
6215                          elem.document.compatMode === "CSS1Compat" && elem.document.documentElement[ "client" + name ] ||
6216                          elem.document.body[ "client" + name ] :
6217  
6218                          // Get document width or height
6219                          (elem.nodeType === 9) ? // is it a document
6220                                  // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
6221                                  Math.max(
6222                                          elem.documentElement["client" + name],
6223                                          elem.body["scroll" + name], elem.documentElement["scroll" + name],
6224                                          elem.body["offset" + name], elem.documentElement["offset" + name]
6225                                  ) :
6226  
6227                                  // Get or set width or height on the element
6228                                  size === undefined ?
6229                                          // Get width or height on the element
6230                                          jQuery.css( elem, type ) :
6231  
6232                                          // Set the width or height on the element (default to pixels if value is unitless)
6233                                          this.css( type, typeof size === "string" ? size : size + "px" );
6234          };
6235  
6236  });
6237  // Expose jQuery to the global object
6238  window.jQuery = window.$ = jQuery;
6239  
6240  })(window);
1 /*! 2 * jQuery JavaScript Library v1.4.2 3 * http://jquery.com/ 4 * 5 * Copyright 2010, 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 2010, The Dojo Foundation 12 * Released under the MIT, BSD, and GPL Licenses. 13 * 14 * Date: Sat Feb 13 22:33:48 2010 -0500 15 */ 16 (function( window, undefined ) { 17 18 // Define a local copy of jQuery 19 var jQuery = function( selector, context ) { 20 // The jQuery object is actually just the init constructor 'enhanced' 21 return new jQuery.fn.init( selector, context ); 22 }, 23 24 // Map over jQuery in case of overwrite 25 _jQuery = window.jQuery, 26 27 // Map over the $ in case of overwrite 28 _$ = window.$, 29 30 // Use the correct document accordingly with window argument (sandbox) 31 document = window.document, 32 33 // A central reference to the root jQuery(document) 34 rootjQuery, 35 36 // A simple way to check for HTML strings or ID strings 37 // (both of which we optimize for) 38 quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/, 39 40 // Is it a simple selector 41 isSimple = /^.[^:#\[\.,]*$/, 42 43 // Check if a string has a non-whitespace character in it 44 rnotwhite = /\S/, 45 46 // Used for trimming whitespace 47 rtrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g, 48 49 // Match a standalone tag 50 rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, 51 52 // Keep a UserAgent string for use with jQuery.browser 53 userAgent = navigator.userAgent, 54 55 // For matching the engine and version of the browser 56 browserMatch, 57 58 // Has the ready events already been bound? 59 readyBound = false, 60 61 // The functions to execute on DOM ready 62 readyList = [], 63 64 // The ready event handler 65 DOMContentLoaded, 66 67 // Save a reference to some core methods 68 toString = Object.prototype.toString, 69 hasOwnProperty = Object.prototype.hasOwnProperty, 70 push = Array.prototype.push, 71 slice = Array.prototype.slice, 72 indexOf = Array.prototype.indexOf; 73 74 jQuery.fn = jQuery.prototype = { 75 init: function( selector, context ) { 76 var match, elem, ret, doc; 77 78 // Handle $(""), $(null), or $(undefined) 79 if ( !selector ) { 80 return this; 81 } 82 83 // Handle $(DOMElement) 84 if ( selector.nodeType ) { 85 this.context = this[0] = selector; 86 this.length = 1; 87 return this; 88 } 89 90 // The body element only exists once, optimize finding it 91 if ( selector === "body" && !context ) { 92 this.context = document; 93 this[0] = document.body; 94 this.selector = "body"; 95 this.length = 1; 96 return this; 97 } 98 99 // Handle HTML strings 100 if ( typeof selector === "string" ) { 101 // Are we dealing with HTML string or an ID? 102 match = quickExpr.exec( selector ); 103 104 // Verify a match, and that no context was specified for #id 105 if ( match && (match[1] || !context) ) { 106 107 // HANDLE: $(html) -> $(array) 108 if ( match[1] ) { 109 doc = (context ? context.ownerDocument || context : document); 110 111 // If a single string is passed in and it's a single tag 112 // just do a createElement and skip the rest 113 ret = rsingleTag.exec( selector ); 114 115 if ( ret ) { 116 if ( jQuery.isPlainObject( context ) ) { 117 selector = [ document.createElement( ret[1] ) ]; 118 jQuery.fn.attr.call( selector, context, true ); 119 120 } else { 121 selector = [ doc.createElement( ret[1] ) ]; 122 } 123 124 } else { 125 ret = buildFragment( [ match[1] ], [ doc ] ); 126 selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes; 127 } 128 129 return jQuery.merge( this, selector ); 130 131 // HANDLE: $("#id") 132 } else { 133 elem = document.getElementById( match[2] ); 134 135 if ( elem ) { 136 // Handle the case where IE and Opera return items 137 // by name instead of ID 138 if ( elem.id !== match[2] ) { 139 return rootjQuery.find( selector ); 140 } 141 142 // Otherwise, we inject the element directly into the jQuery object 143 this.length = 1; 144 this[0] = elem; 145 } 146 147 this.context = document; 148 this.selector = selector; 149 return this; 150 } 151 152 // HANDLE: $("TAG") 153 } else if ( !context && /^\w+$/.test( selector ) ) { 154 this.selector = selector; 155 this.context = document; 156 selector = document.getElementsByTagName( selector ); 157 return jQuery.merge( this, selector ); 158 159 // HANDLE: $(expr, $(...)) 160 } else if ( !context || context.jquery ) { 161 return (context || rootjQuery).find( selector ); 162 163 // HANDLE: $(expr, context) 164 // (which is just equivalent to: $(context).find(expr) 165 } else { 166 return jQuery( context ).find( selector ); 167 } 168 169 // HANDLE: $(function) 170 // Shortcut for document ready 171 } else if ( jQuery.isFunction( selector ) ) { 172 return rootjQuery.ready( selector ); 173 } 174 175 if (selector.selector !== undefined) { 176 this.selector = selector.selector; 177 this.context = selector.context; 178 } 179 180 return jQuery.makeArray( selector, this ); 181 }, 182 183 // Start with an empty selector 184 selector: "", 185 186 // The current version of jQuery being used 187 jquery: "1.4.2", 188 189 // The default length of a jQuery object is 0 190 length: 0, 191 192 // The number of elements contained in the matched element set 193 size: function() { 194 return this.length; 195 }, 196 197 toArray: function() { 198 return slice.call( this, 0 ); 199 }, 200 201 // Get the Nth element in the matched element set OR 202 // Get the whole matched element set as a clean array 203 get: function( num ) { 204 return num == null ? 205 206 // Return a 'clean' array 207 this.toArray() : 208 209 // Return just the object 210 ( num < 0 ? this.slice(num)[ 0 ] : this[ num ] ); 211 }, 212 213 // Take an array of elements and push it onto the stack 214 // (returning the new matched element set) 215 pushStack: function( elems, name, selector ) { 216 // Build a new jQuery matched element set 217 var ret = jQuery(); 218 219 if ( jQuery.isArray( elems ) ) { 220 push.apply( ret, elems ); 221 222 } else { 223 jQuery.merge( ret, elems ); 224 } 225 226 // Add the old object onto the stack (as a reference) 227 ret.prevObject = this; 228 229 ret.context = this.context; 230 231 if ( name === "find" ) { 232 ret.selector = this.selector + (this.selector ? " " : "") + selector; 233 } else if ( name ) { 234 ret.selector = this.selector + "." + name + "(" + selector + ")"; 235 } 236 237 // Return the newly-formed element set 238 return ret; 239 }, 240 241 // Execute a callback for every element in the matched set. 242 // (You can seed the arguments with an array of args, but this is 243 // only used internally.) 244 each: function( callback, args ) { 245 return jQuery.each( this, callback, args ); 246 }, 247 248 ready: function( fn ) { 249 // Attach the listeners 250 jQuery.bindReady(); 251 252 // If the DOM is already ready 253 if ( jQuery.isReady ) { 254 // Execute the function immediately 255 fn.call( document, jQuery ); 256 257 // Otherwise, remember the function for later 258 } else if ( readyList ) { 259 // Add the function to the wait list 260 readyList.push( fn ); 261 } 262 263 return this; 264 }, 265 266 eq: function( i ) { 267 return i === -1 ? 268 this.slice( i ) : 269 this.slice( i, +i + 1 ); 270 }, 271 272 first: function() { 273 return this.eq( 0 ); 274 }, 275 276 last: function() { 277 return this.eq( -1 ); 278 }, 279 280 slice: function() { 281 return this.pushStack( slice.apply( this, arguments ), 282 "slice", slice.call(arguments).join(",") ); 283 }, 284 285 map: function( callback ) { 286 return this.pushStack( jQuery.map(this, function( elem, i ) { 287 return callback.call( elem, i, elem ); 288 })); 289 }, 290 291 end: function() { 292 return this.prevObject || jQuery(null); 293 }, 294 295 // For internal use only. 296 // Behaves like an Array's method, not like a jQuery method. 297 push: push, 298 sort: [].sort, 299 splice: [].splice 300 }; 301 302 // Give the init function the jQuery prototype for later instantiation 303 jQuery.fn.init.prototype = jQuery.fn; 304 305 jQuery.extend = jQuery.fn.extend = function() { 306 // copy reference to target object 307 var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy; 308 309 // Handle a deep copy situation 310 if ( typeof target === "boolean" ) { 311 deep = target; 312 target = arguments[1] || {}; 313 // skip the boolean and the target 314 i = 2; 315 } 316 317 // Handle case when target is a string or something (possible in deep copy) 318 if ( typeof target !== "object" && !jQuery.isFunction(target) ) { 319 target = {}; 320 } 321 322 // extend jQuery itself if only one argument is passed 323 if ( length === i ) { 324 target = this; 325 --i; 326 } 327 328 for ( ; i < length; i++ ) { 329 // Only deal with non-null/undefined values 330 if ( (options = arguments[ i ]) != null ) { 331 // Extend the base object 332 for ( name in options ) { 333 src = target[ name ]; 334 copy = options[ name ]; 335 336 // Prevent never-ending loop 337 if ( target === copy ) { 338 continue; 339 } 340 341 // Recurse if we're merging object literal values or arrays 342 if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) { 343 var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src 344 : jQuery.isArray(copy) ? [] : {}; 345 346 // Never move original objects, clone them 347 target[ name ] = jQuery.extend( deep, clone, copy ); 348 349 // Don't bring in undefined values 350 } else if ( copy !== undefined ) { 351 target[ name ] = copy; 352 } 353 } 354 } 355 } 356 357 // Return the modified object 358 return target; 359 }; 360 361 jQuery.extend({ 362 noConflict: function( deep ) { 363 window.$ = _$; 364 365 if ( deep ) { 366 window.jQuery = _jQuery; 367 } 368 369 return jQuery; 370 }, 371 372 // Is the DOM ready to be used? Set to true once it occurs. 373 isReady: false, 374 375 // Handle when the DOM is ready 376 ready: function() { 377 // Make sure that the DOM is not already loaded 378 if ( !jQuery.isReady ) { 379 // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). 380 if ( !document.body ) { 381 return setTimeout( jQuery.ready, 13 ); 382 } 383 384 // Remember that the DOM is ready 385 jQuery.isReady = true; 386 387 // If there are functions bound, to execute 388 if ( readyList ) { 389 // Execute all of them 390 var fn, i = 0; 391 while ( (fn = readyList[ i++ ]) ) { 392 fn.call( document, jQuery ); 393 } 394 395 // Reset the list of functions 396 readyList = null; 397 } 398 399 // Trigger any bound ready events 400 if ( jQuery.fn.triggerHandler ) { 401 jQuery( document ).triggerHandler( "ready" ); 402 } 403 } 404 }, 405 406 bindReady: function() { 407 if ( readyBound ) { 408 return; 409 } 410 411 readyBound = true; 412 413 // Catch cases where $(document).ready() is called after the 414 // browser event has already occurred. 415 if ( document.readyState === "complete" ) { 416 return jQuery.ready(); 417 } 418 419 // Mozilla, Opera and webkit nightlies currently support this event 420 if ( document.addEventListener ) { 421 // Use the handy event callback 422 document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); 423 424 // A fallback to window.onload, that will always work 425 window.addEventListener( "load", jQuery.ready, false ); 426 427 // If IE event model is used 428 } else if ( document.attachEvent ) { 429 // ensure firing before onload, 430 // maybe late but safe also for iframes 431 document.attachEvent("onreadystatechange", DOMContentLoaded); 432 433 // A fallback to window.onload, that will always work 434 window.attachEvent( "onload", jQuery.ready ); 435 436 // If IE and not a frame 437 // continually check to see if the document is ready 438 var toplevel = false; 439 440 try { 441 toplevel = window.frameElement == null; 442 } catch(e) {} 443 444 if ( document.documentElement.doScroll && toplevel ) { 445 doScrollCheck(); 446 } 447 } 448 }, 449 450 // See test/unit/core.js for details concerning isFunction. 451 // Since version 1.3, DOM methods and functions like alert 452 // aren't supported. They return false on IE (#2968). 453 isFunction: function( obj ) { 454 return toString.call(obj) === "[object Function]"; 455 }, 456 457 isArray: function( obj ) { 458 return toString.call(obj) === "[object Array]"; 459 }, 460 461 isPlainObject: function( obj ) { 462 // Must be an Object. 463 // Because of IE, we also have to check the presence of the constructor property. 464 // Make sure that DOM nodes and window objects don't pass through, as well 465 if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) { 466 return false; 467 } 468 469 // Not own constructor property must be Object 470 if ( obj.constructor 471 && !hasOwnProperty.call(obj, "constructor") 472 && !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) { 473 return false; 474 } 475 476 // Own properties are enumerated firstly, so to speed up, 477 // if last one is own, then all properties are own. 478 479 var key; 480 for ( key in obj ) {} 481 482 return key === undefined || hasOwnProperty.call( obj, key ); 483 }, 484 485 isEmptyObject: function( obj ) { 486 for ( var name in obj ) { 487 return false; 488 } 489 return true; 490 }, 491 492 error: function( msg ) { 493 throw msg; 494 }, 495 496 parseJSON: function( data ) { 497 if ( typeof data !== "string" || !data ) { 498 return null; 499 } 500 501 // Make sure leading/trailing whitespace is removed (IE can't handle it) 502 data = jQuery.trim( data ); 503 504 // Make sure the incoming data is actual JSON 505 // Logic borrowed from http://json.org/json2.js 506 if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@") 507 .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]") 508 .replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) { 509 510 // Try to use the native JSON parser first 511 return window.JSON && window.JSON.parse ? 512 window.JSON.parse( data ) : 513 (new Function("return " + data))(); 514 515 } else { 516 jQuery.error( "Invalid JSON: " + data ); 517 } 518 }, 519 520 noop: function() {}, 521 522 // Evalulates a script in a global context 523 globalEval: function( data ) { 524 if ( data && rnotwhite.test(data) ) { 525 // Inspired by code by Andrea Giammarchi 526 // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html 527 var head = document.getElementsByTagName("head")[0] || document.documentElement, 528 script = document.createElement("script"); 529 530 script.type = "text/javascript"; 531 532 if ( jQuery.support.scriptEval ) { 533 script.appendChild( document.createTextNode( data ) ); 534 } else { 535 script.text = data; 536 } 537 538 // Use insertBefore instead of appendChild to circumvent an IE6 bug. 539 // This arises when a base node is used (#2709). 540 head.insertBefore( script, head.firstChild ); 541 head.removeChild( script ); 542 } 543 }, 544 545 nodeName: function( elem, name ) { 546 return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); 547 }, 548 549 // args is for internal usage only 550 each: function( object, callback, args ) { 551 var name, i = 0, 552 length = object.length, 553 isObj = length === undefined || jQuery.isFunction(object); 554 555 if ( args ) { 556 if ( isObj ) { 557 for ( name in object ) { 558 if ( callback.apply( object[ name ], args ) === false ) { 559 break; 560 } 561 } 562 } else { 563 for ( ; i < length; ) { 564 if ( callback.apply( object[ i++ ], args ) === false ) { 565 break; 566 } 567 } 568 } 569 570 // A special, fast, case for the most common use of each 571 } else { 572 if ( isObj ) { 573 for ( name in object ) { 574 if ( callback.call( object[ name ], name, object[ name ] ) === false ) { 575 break; 576 } 577 } 578 } else { 579 for ( var value = object[0]; 580 i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {} 581 } 582 } 583 584 return object; 585 }, 586 587 trim: function( text ) { 588 return (text || "").replace( rtrim, "" ); 589 }, 590 591 // results is for internal usage only 592 makeArray: function( array, results ) { 593 var ret = results || []; 594 595 if ( array != null ) { 596 // The window, strings (and functions) also have 'length' 597 // The extra typeof function check is to prevent crashes 598 // in Safari 2 (See: #3039) 599 if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) { 600 push.call( ret, array ); 601 } else { 602 jQuery.merge( ret, array ); 603 } 604 } 605 606 return ret; 607 }, 608 609 inArray: function( elem, array ) { 610 if ( array.indexOf ) { 611 return array.indexOf( elem ); 612 } 613 614 for ( var i = 0, length = array.length; i < length; i++ ) { 615 if ( array[ i ] === elem ) { 616 return i; 617 } 618 } 619 620 return -1; 621 }, 622 623 merge: function( first, second ) { 624 var i = first.length, j = 0; 625 626 if ( typeof second.length === "number" ) { 627 for ( var l = second.length; j < l; j++ ) { 628 first[ i++ ] = second[ j ]; 629 } 630 631 } else { 632 while ( second[j] !== undefined ) { 633 first[ i++ ] = second[ j++ ]; 634 } 635 } 636 637 first.length = i; 638 639 return first; 640 }, 641 642 grep: function( elems, callback, inv ) { 643 var ret = []; 644 645 // Go through the array, only saving the items 646 // that pass the validator function 647 for ( var i = 0, length = elems.length; i < length; i++ ) { 648 if ( !inv !== !callback( elems[ i ], i ) ) { 649 ret.push( elems[ i ] ); 650 } 651 } 652 653 return ret; 654 }, 655 656 // arg is for internal usage only 657 map: function( elems, callback, arg ) { 658 var ret = [], value; 659 660 // Go through the array, translating each of the items to their 661 // new value (or values). 662 for ( var i = 0, length = elems.length; i < length; i++ ) { 663 value = callback( elems[ i ], i, arg ); 664 665 if ( value != null ) { 666 ret[ ret.length ] = value; 667 } 668 } 669 670 return ret.concat.apply( [], ret ); 671 }, 672 673 // A global GUID counter for objects 674 guid: 1, 675 676 proxy: function( fn, proxy, thisObject ) { 677 if ( arguments.length === 2 ) { 678 if ( typeof proxy === "string" ) { 679 thisObject = fn; 680 fn = thisObject[ proxy ]; 681 proxy = undefined; 682 683 } else if ( proxy && !jQuery.isFunction( proxy ) ) { 684 thisObject = proxy; 685 proxy = undefined; 686 } 687 } 688 689 if ( !proxy && fn ) { 690 proxy = function() { 691 return fn.apply( thisObject || this, arguments ); 692 }; 693 } 694 695 // Set the guid of unique handler to the same of original handler, so it can be removed 696 if ( fn ) { 697 proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; 698 } 699 700 // So proxy can be declared as an argument 701 return proxy; 702 }, 703 704 // Use of jQuery.browser is frowned upon. 705 // More details: http://docs.jquery.com/Utilities/jQuery.browser 706 uaMatch: function( ua ) { 707 ua = ua.toLowerCase(); 708 709 var match = /(webkit)[ \/]([\w.]+)/.exec( ua ) || 710 /(opera)(?:.*version)?[ \/]([\w.]+)/.exec( ua ) || 711 /(msie) ([\w.]+)/.exec( ua ) || 712 !/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec( ua ) || 713 []; 714 715 return { browser: match[1] || "", version: match[2] || "0" }; 716 }, 717 718 browser: {} 719 }); 720 721 browserMatch = jQuery.uaMatch( userAgent ); 722 if ( browserMatch.browser ) { 723 jQuery.browser[ browserMatch.browser ] = true; 724 jQuery.browser.version = browserMatch.version; 725 } 726 727 // Deprecated, use jQuery.browser.webkit instead 728 if ( jQuery.browser.webkit ) { 729 jQuery.browser.safari = true; 730 } 731 732 if ( indexOf ) { 733 jQuery.inArray = function( elem, array ) { 734 return indexOf.call( array, elem ); 735 }; 736 } 737 738 // All jQuery objects should point back to these 739 rootjQuery = jQuery(document); 740 741 // Cleanup functions for the document ready method 742 if ( document.addEventListener ) { 743 DOMContentLoaded = function() { 744 document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); 745 jQuery.ready(); 746 }; 747 748 } else if ( document.attachEvent ) { 749 DOMContentLoaded = function() { 750 // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). 751 if ( document.readyState === "complete" ) { 752 document.detachEvent( "onreadystatechange", DOMContentLoaded ); 753 jQuery.ready(); 754 } 755 }; 756 } 757 758 // The DOM ready check for Internet Explorer 759 function doScrollCheck() { 760 if ( jQuery.isReady ) { 761 return; 762 } 763 764 try { 765 // If IE is used, use the trick by Diego Perini 766 // http://javascript.nwbox.com/IEContentLoaded/ 767 document.documentElement.doScroll("left"); 768 } catch( error ) { 769 setTimeout( doScrollCheck, 1 ); 770 return; 771 } 772 773 // and execute any waiting functions 774 jQuery.ready(); 775 } 776 777 function evalScript( i, elem ) { 778 if ( elem.src ) { 779 jQuery.ajax({ 780 url: elem.src, 781 async: false, 782 dataType: "script" 783 }); 784 } else { 785 jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); 786 } 787 788 if ( elem.parentNode ) { 789 elem.parentNode.removeChild( elem ); 790 } 791 } 792 793 // Mutifunctional method to get and set values to a collection 794 // The value/s can be optionally by executed if its a function 795 function access( elems, key, value, exec, fn, pass ) { 796 var length = elems.length; 797 798 // Setting many attributes 799 if ( typeof key === "object" ) { 800 for ( var k in key ) { 801 access( elems, k, key[k], exec, fn, value ); 802 } 803 return elems; 804 } 805 806 // Setting one attribute 807 if ( value !== undefined ) { 808 // Optionally, function values get executed if exec is true 809 exec = !pass && exec && jQuery.isFunction(value); 810 811 for ( var i = 0; i < length; i++ ) { 812 fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); 813 } 814 815 return elems; 816 } 817 818 // Getting an attribute 819 return length ? fn( elems[0], key ) : undefined; 820 } 821 822 function now() { 823 return (new Date).getTime(); 824 } 825 (function() { 826 827 jQuery.support = {}; 828 829 var root = document.documentElement, 830 script = document.createElement("script"), 831 div = document.createElement("div"), 832 id = "script" + now(); 833 834 div.style.display = "none"; 835 div.innerHTML = " <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>"; 836 837 var all = div.getElementsByTagName("*"), 838 a = div.getElementsByTagName("a")[0]; 839 840 // Can't get basic test support 841 if ( !all || !all.length || !a ) { 842 return; 843 } 844 845 jQuery.support = { 846 // IE strips leading whitespace when .innerHTML is used 847 leadingWhitespace: div.firstChild.nodeType === 3, 848 849 // Make sure that tbody elements aren't automatically inserted 850 // IE will insert them into empty tables 851 tbody: !div.getElementsByTagName("tbody").length, 852 853 // Make sure that link elements get serialized correctly by innerHTML 854 // This requires a wrapper element in IE 855 htmlSerialize: !!div.getElementsByTagName("link").length, 856 857 // Get the style information from getAttribute 858 // (IE uses .cssText insted) 859 style: /red/.test( a.getAttribute("style") ), 860 861 // Make sure that URLs aren't manipulated 862 // (IE normalizes it by default) 863 hrefNormalized: a.getAttribute("href") === "/a", 864 865 // Make sure that element opacity exists 866 // (IE uses filter instead) 867 // Use a regex to work around a WebKit issue. See #5145 868 opacity: /^0.55$/.test( a.style.opacity ), 869 870 // Verify style float existence 871 // (IE uses styleFloat instead of cssFloat) 872 cssFloat: !!a.style.cssFloat, 873 874 // Make sure that if no value is specified for a checkbox 875 // that it defaults to "on". 876 // (WebKit defaults to "" instead) 877 checkOn: div.getElementsByTagName("input")[0].value === "on", 878 879 // Make sure that a selected-by-default option has a working selected property. 880 // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) 881 optSelected: document.createElement("select").appendChild( document.createElement("option") ).selected, 882 883 parentNode: div.removeChild( div.appendChild( document.createElement("div") ) ).parentNode === null, 884 885 // Will be defined later 886 deleteExpando: true, 887 checkClone: false, 888 scriptEval: false, 889 noCloneEvent: true, 890 boxModel: null 891 }; 892 893 script.type = "text/javascript"; 894 try { 895 script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); 896 } catch(e) {} 897 898 root.insertBefore( script, root.firstChild ); 899 900 // Make sure that the execution of code works by injecting a script 901 // tag with appendChild/createTextNode 902 // (IE doesn't support this, fails, and uses .text instead) 903 if ( window[ id ] ) { 904 jQuery.support.scriptEval = true; 905 delete window[ id ]; 906 } 907 908 // Test to see if it's possible to delete an expando from an element 909 // Fails in Internet Explorer 910 try { 911 delete script.test; 912 913 } catch(e) { 914 jQuery.support.deleteExpando = false; 915 } 916 917 root.removeChild( script ); 918 919 if ( div.attachEvent && div.fireEvent ) { 920 div.attachEvent("onclick", function click() { 921 // Cloning a node shouldn't copy over any 922 // bound event handlers (IE does this) 923 jQuery.support.noCloneEvent = false; 924 div.detachEvent("onclick", click); 925 }); 926 div.cloneNode(true).fireEvent("onclick"); 927 } 928 929 div = document.createElement("div"); 930 div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>"; 931 932 var fragment = document.createDocumentFragment(); 933 fragment.appendChild( div.firstChild ); 934 935 // WebKit doesn't clone checked state correctly in fragments 936 jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; 937 938 // Figure out if the W3C box model works as expected 939 // document.body must exist before we can do this 940 jQuery(function() { 941 var div = document.createElement("div"); 942 div.style.width = div.style.paddingLeft = "1px"; 943 944 document.body.appendChild( div ); 945 jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; 946 document.body.removeChild( div ).style.display = 'none'; 947 948 div = null; 949 }); 950 951 // Technique from Juriy Zaytsev 952 // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ 953 var eventSupported = function( eventName ) { 954 var el = document.createElement("div"); 955 eventName = "on" + eventName; 956 957 var isSupported = (eventName in el); 958 if ( !isSupported ) { 959 el.setAttribute(eventName, "return;"); 960 isSupported = typeof el[eventName] === "function"; 961 } 962 el = null; 963 964 return isSupported; 965 }; 966 967 jQuery.support.submitBubbles = eventSupported("submit"); 968 jQuery.support.changeBubbles = eventSupported("change"); 969 970 // release memory in IE 971 root = script = div = all = a = null; 972 })(); 973 974 jQuery.props = { 975 "for": "htmlFor", 976 "class": "className", 977 readonly: "readOnly", 978 maxlength: "maxLength", 979 cellspacing: "cellSpacing", 980 rowspan: "rowSpan", 981 colspan: "colSpan", 982 tabindex: "tabIndex", 983 usemap: "useMap", 984 frameborder: "frameBorder" 985 }; 986 var expando = "jQuery" + now(), uuid = 0, windowData = {}; 987 988 jQuery.extend({ 989 cache: {}, 990 991 expando:expando, 992 993 // The following elements throw uncatchable exceptions if you 994 // attempt to add expando properties to them. 995 noData: { 996 "embed": true, 997 "object": true, 998 "applet": true 999 }, 1000 1001 data: function( elem, name, data ) { 1002 if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { 1003 return; 1004 } 1005 1006 elem = elem == window ? 1007 windowData : 1008 elem; 1009 1010 var id = elem[ expando ], cache = jQuery.cache, thisCache; 1011 1012 if ( !id && typeof name === "string" && data === undefined ) { 1013 return null; 1014 } 1015 1016 // Compute a unique ID for the element 1017 if ( !id ) { 1018 id = ++uuid; 1019 } 1020 1021 // Avoid generating a new cache unless none exists and we 1022 // want to manipulate it. 1023 if ( typeof name === "object" ) { 1024 elem[ expando ] = id; 1025 thisCache = cache[ id ] = jQuery.extend(true, {}, name); 1026 1027 } else if ( !cache[ id ] ) { 1028 elem[ expando ] = id; 1029 cache[ id ] = {}; 1030 } 1031 1032 thisCache = cache[ id ]; 1033 1034 // Prevent overriding the named cache with undefined values 1035 if ( data !== undefined ) { 1036 thisCache[ name ] = data; 1037 } 1038 1039 return typeof name === "string" ? thisCache[ name ] : thisCache; 1040 }, 1041 1042 removeData: function( elem, name ) { 1043 if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { 1044 return; 1045 } 1046 1047 elem = elem == window ? 1048 windowData : 1049 elem; 1050 1051 var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ]; 1052 1053 // If we want to remove a specific section of the element's data 1054 if ( name ) { 1055 if ( thisCache ) { 1056 // Remove the section of cache data 1057 delete thisCache[ name ]; 1058 1059 // If we've removed all the data, remove the element's cache 1060 if ( jQuery.isEmptyObject(thisCache) ) { 1061 jQuery.removeData( elem ); 1062 } 1063 } 1064 1065 // Otherwise, we want to remove all of the element's data 1066 } else { 1067 if ( jQuery.support.deleteExpando ) { 1068 delete elem[ jQuery.expando ]; 1069 1070 } else if ( elem.removeAttribute ) { 1071 elem.removeAttribute( jQuery.expando ); 1072 } 1073 1074 // Completely remove the data cache 1075 delete cache[ id ]; 1076 } 1077 } 1078 }); 1079 1080 jQuery.fn.extend({ 1081 data: function( key, value ) { 1082 if ( typeof key === "undefined" && this.length ) { 1083 return jQuery.data( this[0] ); 1084 1085 } else if ( typeof key === "object" ) { 1086 return this.each(function() { 1087 jQuery.data( this, key ); 1088 }); 1089 } 1090 1091 var parts = key.split("."); 1092 parts[1] = parts[1] ? "." + parts[1] : ""; 1093 1094 if ( value === undefined ) { 1095 var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); 1096 1097 if ( data === undefined && this.length ) { 1098 data = jQuery.data( this[0], key ); 1099 } 1100 return data === undefined && parts[1] ? 1101 this.data( parts[0] ) : 1102 data; 1103 } else { 1104 return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function() { 1105 jQuery.data( this, key, value ); 1106 }); 1107 } 1108 }, 1109 1110 removeData: function( key ) { 1111 return this.each(function() { 1112 jQuery.removeData( this, key ); 1113 }); 1114 } 1115 }); 1116 jQuery.extend({ 1117 queue: function( elem, type, data ) { 1118 if ( !elem ) { 1119 return; 1120 } 1121 1122 type = (type || "fx") + "queue"; 1123 var q = jQuery.data( elem, type ); 1124 1125 // Speed up dequeue by getting out quickly if this is just a lookup 1126 if ( !data ) { 1127 return q || []; 1128 } 1129 1130 if ( !q || jQuery.isArray(data) ) { 1131 q = jQuery.data( elem, type, jQuery.makeArray(data) ); 1132 1133 } else { 1134 q.push( data ); 1135 } 1136 1137 return q; 1138 }, 1139 1140 dequeue: function( elem, type ) { 1141 type = type || "fx"; 1142 1143 var queue = jQuery.queue( elem, type ), fn = queue.shift(); 1144 1145 // If the fx queue is dequeued, always remove the progress sentinel 1146 if ( fn === "inprogress" ) { 1147 fn = queue.shift(); 1148 } 1149 1150 if ( fn ) { 1151 // Add a progress sentinel to prevent the fx queue from being 1152 // automatically dequeued 1153 if ( type === "fx" ) { 1154 queue.unshift("inprogress"); 1155 } 1156 1157 fn.call(elem, function() { 1158 jQuery.dequeue(elem, type); 1159 }); 1160 } 1161 } 1162 }); 1163 1164 jQuery.fn.extend({ 1165 queue: function( type, data ) { 1166 if ( typeof type !== "string" ) { 1167 data = type; 1168 type = "fx"; 1169 } 1170 1171 if ( data === undefined ) { 1172 return jQuery.queue( this[0], type ); 1173 } 1174 return this.each(function( i, elem ) { 1175 var queue = jQuery.queue( this, type, data ); 1176 1177 if ( type === "fx" && queue[0] !== "inprogress" ) { 1178 jQuery.dequeue( this, type ); 1179 } 1180 }); 1181 }, 1182 dequeue: function( type ) { 1183 return this.each(function() { 1184 jQuery.dequeue( this, type ); 1185 }); 1186 }, 1187 1188 // Based off of the plugin by Clint Helfers, with permission. 1189 // http://blindsignals.com/index.php/2009/07/jquery-delay/ 1190 delay: function( time, type ) { 1191 time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; 1192 type = type || "fx"; 1193 1194 return this.queue( type, function() { 1195 var elem = this; 1196 setTimeout(function() { 1197 jQuery.dequeue( elem, type ); 1198 }, time ); 1199 }); 1200 }, 1201 1202 clearQueue: function( type ) { 1203 return this.queue( type || "fx", [] ); 1204 } 1205 }); 1206 var rclass = /[\n\t]/g, 1207 rspace = /\s+/, 1208 rreturn = /\r/g, 1209 rspecialurl = /href|src|style/, 1210 rtype = /(button|input)/i, 1211 rfocusable = /(button|input|object|select|textarea)/i, 1212 rclickable = /^(a|area)$/i, 1213 rradiocheck = /radio|checkbox/; 1214 1215 jQuery.fn.extend({ 1216 attr: function( name, value ) { 1217 return access( this, name, value, true, jQuery.attr ); 1218 }, 1219 1220 removeAttr: function( name, fn ) { 1221 return this.each(function(){ 1222 jQuery.attr( this, name, "" ); 1223 if ( this.nodeType === 1 ) { 1224 this.removeAttribute( name ); 1225 } 1226 }); 1227 }, 1228 1229 addClass: function( value ) { 1230 if ( jQuery.isFunction(value) ) { 1231 return this.each(function(i) { 1232 var self = jQuery(this); 1233 self.addClass( value.call(this, i, self.attr("class")) ); 1234 }); 1235 } 1236 1237 if ( value && typeof value === "string" ) { 1238 var classNames = (value || "").split( rspace ); 1239 1240 for ( var i = 0, l = this.length; i < l; i++ ) { 1241 var elem = this[i]; 1242 1243 if ( elem.nodeType === 1 ) { 1244 if ( !elem.className ) { 1245 elem.className = value; 1246 1247 } else { 1248 var className = " " + elem.className + " ", setClass = elem.className; 1249 for ( var c = 0, cl = classNames.length; c < cl; c++ ) { 1250 if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) { 1251 setClass += " " + classNames[c]; 1252 } 1253 } 1254 elem.className = jQuery.trim( setClass ); 1255 } 1256 } 1257 } 1258 } 1259 1260 return this; 1261 }, 1262 1263 removeClass: function( value ) { 1264 if ( jQuery.isFunction(value) ) { 1265 return this.each(function(i) { 1266 var self = jQuery(this); 1267 self.removeClass( value.call(this, i, self.attr("class")) ); 1268 }); 1269 } 1270 1271 if ( (value && typeof value === "string") || value === undefined ) { 1272 var classNames = (value || "").split(rspace); 1273 1274 for ( var i = 0, l = this.length; i < l; i++ ) { 1275 var elem = this[i]; 1276 1277 if ( elem.nodeType === 1 && elem.className ) { 1278 if ( value ) { 1279 var className = (" " + elem.className + " ").replace(rclass, " "); 1280 for ( var c = 0, cl = classNames.length; c < cl; c++ ) { 1281 className = className.replace(" " + classNames[c] + " ", " "); 1282 } 1283 elem.className = jQuery.trim( className ); 1284 1285 } else { 1286 elem.className = ""; 1287 } 1288 } 1289 } 1290 } 1291 1292 return this; 1293 }, 1294 1295 toggleClass: function( value, stateVal ) { 1296 var type = typeof value, isBool = typeof stateVal === "boolean"; 1297 1298 if ( jQuery.isFunction( value ) ) { 1299 return this.each(function(i) { 1300 var self = jQuery(this); 1301 self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal ); 1302 }); 1303 } 1304 1305 return this.each(function() { 1306 if ( type === "string" ) { 1307 // toggle individual class names 1308 var className, i = 0, self = jQuery(this), 1309 state = stateVal, 1310 classNames = value.split( rspace ); 1311 1312 while ( (className = classNames[ i++ ]) ) { 1313 // check each className given, space seperated list 1314 state = isBool ? state : !self.hasClass( className ); 1315 self[ state ? "addClass" : "removeClass" ]( className ); 1316 } 1317 1318 } else if ( type === "undefined" || type === "boolean" ) { 1319 if ( this.className ) { 1320 // store className if set 1321 jQuery.data( this, "__className__", this.className ); 1322 } 1323 1324 // toggle whole className 1325 this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || ""; 1326 } 1327 }); 1328 }, 1329 1330 hasClass: function( selector ) { 1331 var className = " " + selector + " "; 1332 for ( var i = 0, l = this.length; i < l; i++ ) { 1333 if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { 1334 return true; 1335 } 1336 } 1337 1338 return false; 1339 }, 1340 1341 val: function( value ) { 1342 if ( value === undefined ) { 1343 var elem = this[0]; 1344 1345 if ( elem ) { 1346 if ( jQuery.nodeName( elem, "option" ) ) { 1347 return (elem.attributes.value || {}).specified ? elem.value : elem.text; 1348 } 1349 1350 // We need to handle select boxes special 1351 if ( jQuery.nodeName( elem, "select" ) ) { 1352 var index = elem.selectedIndex, 1353 values = [], 1354 options = elem.options, 1355 one = elem.type === "select-one"; 1356 1357 // Nothing was selected 1358 if ( index < 0 ) { 1359 return null; 1360 } 1361 1362 // Loop through all the selected options 1363 for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { 1364 var option = options[ i ]; 1365 1366 if ( option.selected ) { 1367 // Get the specifc value for the option 1368 value = jQuery(option).val(); 1369 1370 // We don't need an array for one selects 1371 if ( one ) { 1372 return value; 1373 } 1374 1375 // Multi-Selects return an array 1376 values.push( value ); 1377 } 1378 } 1379 1380 return values; 1381 } 1382 1383 // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified 1384 if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) { 1385 return elem.getAttribute("value") === null ? "on" : elem.value; 1386 } 1387 1388 1389 // Everything else, we just grab the value 1390 return (elem.value || "").replace(rreturn, ""); 1391 1392 } 1393 1394 return undefined; 1395 } 1396 1397 var isFunction = jQuery.isFunction(value); 1398 1399 return this.each(function(i) { 1400 var self = jQuery(this), val = value; 1401 1402 if ( this.nodeType !== 1 ) { 1403 return; 1404 } 1405 1406 if ( isFunction ) { 1407 val = value.call(this, i, self.val()); 1408 } 1409 1410 // Typecast each time if the value is a Function and the appended 1411 // value is therefore different each time. 1412 if ( typeof val === "number" ) { 1413 val += ""; 1414 } 1415 1416 if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) { 1417 this.checked = jQuery.inArray( self.val(), val ) >= 0; 1418 1419 } else if ( jQuery.nodeName( this, "select" ) ) { 1420 var values = jQuery.makeArray(val); 1421 1422 jQuery( "option", this ).each(function() { 1423 this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; 1424 }); 1425 1426 if ( !values.length ) { 1427 this.selectedIndex = -1; 1428 } 1429 1430 } else { 1431 this.value = val; 1432 } 1433 }); 1434 } 1435 }); 1436 1437 jQuery.extend({ 1438 attrFn: { 1439 val: true, 1440 css: true, 1441 html: true, 1442 text: true, 1443 data: true, 1444 width: true, 1445 height: true, 1446 offset: true 1447 }, 1448 1449 attr: function( elem, name, value, pass ) { 1450 // don't set attributes on text and comment nodes 1451 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { 1452 return undefined; 1453 } 1454 1455 if ( pass && name in jQuery.attrFn ) { 1456 return jQuery(elem)[name](value); 1457 } 1458 1459 var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ), 1460 // Whether we are setting (or getting) 1461 set = value !== undefined; 1462 1463 // Try to normalize/fix the name 1464 name = notxml && jQuery.props[ name ] || name; 1465 1466 // Only do all the following if this is a node (faster for style) 1467 if ( elem.nodeType === 1 ) { 1468 // These attributes require special treatment 1469 var special = rspecialurl.test( name ); 1470 1471 // Safari mis-reports the default selected property of an option 1472 // Accessing the parent's selectedIndex property fixes it 1473 if ( name === "selected" && !jQuery.support.optSelected ) { 1474 var parent = elem.parentNode; 1475 if ( parent ) { 1476 parent.selectedIndex; 1477 1478 // Make sure that it also works with optgroups, see #5701 1479 if ( parent.parentNode ) { 1480 parent.parentNode.selectedIndex; 1481 } 1482 } 1483 } 1484 1485 // If applicable, access the attribute via the DOM 0 way 1486 if ( name in elem && notxml && !special ) { 1487 if ( set ) { 1488 // We can't allow the type property to be changed (since it causes problems in IE) 1489 if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) { 1490 jQuery.error( "type property can't be changed" ); 1491 } 1492 1493 elem[ name ] = value; 1494 } 1495 1496 // browsers index elements by id/name on forms, give priority to attributes. 1497 if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) { 1498 return elem.getAttributeNode( name ).nodeValue; 1499 } 1500 1501 // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set 1502 // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ 1503 if ( name === "tabIndex" ) { 1504 var attributeNode = elem.getAttributeNode( "tabIndex" ); 1505 1506 return attributeNode && attributeNode.specified ? 1507 attributeNode.value : 1508 rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? 1509 0 : 1510 undefined; 1511 } 1512 1513 return elem[ name ]; 1514 } 1515 1516 if ( !jQuery.support.style && notxml && name === "style" ) { 1517 if ( set ) { 1518 elem.style.cssText = "" + value; 1519 } 1520 1521 return elem.style.cssText; 1522 } 1523 1524 if ( set ) { 1525 // convert the value to a string (all browsers do this but IE) see #1070 1526 elem.setAttribute( name, "" + value ); 1527 } 1528 1529 var attr = !jQuery.support.hrefNormalized && notxml && special ? 1530 // Some attributes require a special call on IE 1531 elem.getAttribute( name, 2 ) : 1532 elem.getAttribute( name ); 1533 1534 // Non-existent attributes return null, we normalize to undefined 1535 return attr === null ? undefined : attr; 1536 } 1537 1538 // elem is actually elem.style ... set the style 1539 // Using attr for specific style information is now deprecated. Use style instead. 1540 return jQuery.style( elem, name, value ); 1541 } 1542 }); 1543 var rnamespaces = /\.(.*)$/, 1544 fcleanup = function( nm ) { 1545 return nm.replace(/[^\w\s\.\|`]/g, function( ch ) { 1546 return "\\" + ch; 1547 }); 1548 }; 1549 1550 /* 1551 * A number of helper functions used for managing events. 1552 * Many of the ideas behind this code originated from 1553 * Dean Edwards' addEvent library. 1554 */ 1555 jQuery.event = { 1556 1557 // Bind an event to an element 1558 // Original by Dean Edwards 1559 add: function( elem, types, handler, data ) { 1560 if ( elem.nodeType === 3 || elem.nodeType === 8 ) { 1561 return; 1562 } 1563 1564 // For whatever reason, IE has trouble passing the window object 1565 // around, causing it to be cloned in the process 1566 if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) { 1567 elem = window; 1568 } 1569 1570 var handleObjIn, handleObj; 1571 1572 if ( handler.handler ) { 1573 handleObjIn = handler; 1574 handler = handleObjIn.handler; 1575 } 1576 1577 // Make sure that the function being executed has a unique ID 1578 if ( !handler.guid ) { 1579 handler.guid = jQuery.guid++; 1580 } 1581 1582 // Init the element's event structure 1583 var elemData = jQuery.data( elem ); 1584 1585 // If no elemData is found then we must be trying to bind to one of the 1586 // banned noData elements 1587 if ( !elemData ) { 1588 return; 1589 } 1590 1591 var events = elemData.events = elemData.events || {}, 1592 eventHandle = elemData.handle, eventHandle; 1593 1594 if ( !eventHandle ) { 1595 elemData.handle = eventHandle = function() { 1596 // Handle the second event of a trigger and when 1597 // an event is called after a page has unloaded 1598 return typeof jQuery !== "undefined" && !jQuery.event.triggered ? 1599 jQuery.event.handle.apply( eventHandle.elem, arguments ) : 1600 undefined; 1601 }; 1602 } 1603 1604 // Add elem as a property of the handle function 1605 // This is to prevent a memory leak with non-native events in IE. 1606 eventHandle.elem = elem; 1607 1608 // Handle multiple events separated by a space 1609 // jQuery(...).bind("mouseover mouseout", fn); 1610 types = types.split(" "); 1611 1612 var type, i = 0, namespaces; 1613 1614 while ( (type = types[ i++ ]) ) { 1615 handleObj = handleObjIn ? 1616 jQuery.extend({}, handleObjIn) : 1617 { handler: handler, data: data }; 1618 1619 // Namespaced event handlers 1620 if ( type.indexOf(".") > -1 ) { 1621 namespaces = type.split("."); 1622 type = namespaces.shift(); 1623 handleObj.namespace = namespaces.slice(0).sort().join("."); 1624 1625 } else { 1626 namespaces = []; 1627 handleObj.namespace = ""; 1628 } 1629 1630 handleObj.type = type; 1631 handleObj.guid = handler.guid; 1632 1633 // Get the current list of functions bound to this event 1634 var handlers = events[ type ], 1635 special = jQuery.event.special[ type ] || {}; 1636 1637 // Init the event handler queue 1638 if ( !handlers ) { 1639 handlers = events[ type ] = []; 1640 1641 // Check for a special event handler 1642 // Only use addEventListener/attachEvent if the special 1643 // events handler returns false 1644 if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { 1645 // Bind the global event handler to the element 1646 if ( elem.addEventListener ) { 1647 elem.addEventListener( type, eventHandle, false ); 1648 1649 } else if ( elem.attachEvent ) { 1650 elem.attachEvent( "on" + type, eventHandle ); 1651 } 1652 } 1653 } 1654 1655 if ( special.add ) { 1656 special.add.call( elem, handleObj ); 1657 1658 if ( !handleObj.handler.guid ) { 1659 handleObj.handler.guid = handler.guid; 1660 } 1661 } 1662 1663 // Add the function to the element's handler list 1664 handlers.push( handleObj ); 1665 1666 // Keep track of which events have been used, for global triggering 1667 jQuery.event.global[ type ] = true; 1668 } 1669 1670 // Nullify elem to prevent memory leaks in IE 1671 elem = null; 1672 }, 1673 1674 global: {}, 1675 1676 // Detach an event or set of events from an element 1677 remove: function( elem, types, handler, pos ) { 1678 // don't do events on text and comment nodes 1679 if ( elem.nodeType === 3 || elem.nodeType === 8 ) { 1680 return; 1681 } 1682 1683 var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, 1684 elemData = jQuery.data( elem ), 1685 events = elemData && elemData.events; 1686 1687 if ( !elemData || !events ) { 1688 return; 1689 } 1690 1691 // types is actually an event object here 1692 if ( types && types.type ) { 1693 handler = types.handler; 1694 types = types.type; 1695 } 1696 1697 // Unbind all events for the element 1698 if ( !types || typeof types === "string" && types.charAt(0) === "." ) { 1699 types = types || ""; 1700 1701 for ( type in events ) { 1702 jQuery.event.remove( elem, type + types ); 1703 } 1704 1705 return; 1706 } 1707 1708 // Handle multiple events separated by a space 1709 // jQuery(...).unbind("mouseover mouseout", fn); 1710 types = types.split(" "); 1711 1712 while ( (type = types[ i++ ]) ) { 1713 origType = type; 1714 handleObj = null; 1715 all = type.indexOf(".") < 0; 1716 namespaces = []; 1717 1718 if ( !all ) { 1719 // Namespaced event handlers 1720 namespaces = type.split("."); 1721 type = namespaces.shift(); 1722 1723 namespace = new RegExp("(^|\\.)" + 1724 jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)") 1725 } 1726 1727 eventType = events[ type ]; 1728 1729 if ( !eventType ) { 1730 continue; 1731 } 1732 1733 if ( !handler ) { 1734 for ( var j = 0; j < eventType.length; j++ ) { 1735 handleObj = eventType[ j ]; 1736 1737 if ( all || namespace.test( handleObj.namespace ) ) { 1738 jQuery.event.remove( elem, origType, handleObj.handler, j ); 1739 eventType.splice( j--, 1 ); 1740 } 1741 } 1742 1743 continue; 1744 } 1745 1746 special = jQuery.event.special[ type ] || {}; 1747 1748 for ( var j = pos || 0; j < eventType.length; j++ ) { 1749 handleObj = eventType[ j ]; 1750 1751 if ( handler.guid === handleObj.guid ) { 1752 // remove the given handler for the given type 1753 if ( all || namespace.test( handleObj.namespace ) ) { 1754 if ( pos == null ) { 1755 eventType.splice( j--, 1 ); 1756 } 1757 1758 if ( special.remove ) { 1759 special.remove.call( elem, handleObj ); 1760 } 1761 } 1762 1763 if ( pos != null ) { 1764 break; 1765 } 1766 } 1767 } 1768 1769 // remove generic event handler if no more handlers exist 1770 if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { 1771 if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { 1772 removeEvent( elem, type, elemData.handle ); 1773 } 1774 1775 ret = null; 1776 delete events[ type ]; 1777 } 1778 } 1779 1780 // Remove the expando if it's no longer used 1781 if ( jQuery.isEmptyObject( events ) ) { 1782 var handle = elemData.handle; 1783 if ( handle ) { 1784 handle.elem = null; 1785 } 1786 1787 delete elemData.events; 1788 delete elemData.handle; 1789 1790 if ( jQuery.isEmptyObject( elemData ) ) { 1791 jQuery.removeData( elem ); 1792 } 1793 } 1794 }, 1795 1796 // bubbling is internal 1797 trigger: function( event, data, elem /*, bubbling */ ) { 1798 // Event object or event type 1799 var type = event.type || event, 1800 bubbling = arguments[3]; 1801 1802 if ( !bubbling ) { 1803 event = typeof event === "object" ? 1804 // jQuery.Event object 1805 event[expando] ? event : 1806 // Object literal 1807 jQuery.extend( jQuery.Event(type), event ) : 1808 // Just the event type (string) 1809 jQuery.Event(type); 1810 1811 if ( type.indexOf("!") >= 0 ) { 1812 event.type = type = type.slice(0, -1); 1813 event.exclusive = true; 1814 } 1815 1816 // Handle a global trigger 1817 if ( !elem ) { 1818 // Don't bubble custom events when global (to avoid too much overhead) 1819 event.stopPropagation(); 1820 1821 // Only trigger if we've ever bound an event for it 1822 if ( jQuery.event.global[ type ] ) { 1823 jQuery.each( jQuery.cache, function() { 1824 if ( this.events && this.events[type] ) { 1825 jQuery.event.trigger( event, data, this.handle.elem ); 1826 } 1827 }); 1828 } 1829 } 1830 1831 // Handle triggering a single element 1832 1833 // don't do events on text and comment nodes 1834 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { 1835 return undefined; 1836 } 1837 1838 // Clean up in case it is reused 1839 event.result = undefined; 1840 event.target = elem; 1841 1842 // Clone the incoming data, if any 1843 data = jQuery.makeArray( data ); 1844 data.unshift( event ); 1845 } 1846 1847 event.currentTarget = elem; 1848 1849 // Trigger the event, it is assumed that "handle" is a function 1850 var handle = jQuery.data( elem, "handle" ); 1851 if ( handle ) { 1852 handle.apply( elem, data ); 1853 } 1854 1855 var parent = elem.parentNode || elem.ownerDocument; 1856 1857 // Trigger an inline bound script 1858 try { 1859 if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) { 1860 if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) { 1861 event.result = false; 1862 } 1863 } 1864 1865 // prevent IE from throwing an error for some elements with some event types, see #3533 1866 } catch (e) {} 1867 1868 if ( !event.isPropagationStopped() && parent ) { 1869 jQuery.event.trigger( event, data, parent, true ); 1870 1871 } else if ( !event.isDefaultPrevented() ) { 1872 var target = event.target, old, 1873 isClick = jQuery.nodeName(target, "a") && type === "click", 1874 special = jQuery.event.special[ type ] || {}; 1875 1876 if ( (!special._default || special._default.call( elem, event ) === false) && 1877 !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) { 1878 1879 try { 1880 if ( target[ type ] ) { 1881 // Make sure that we don't accidentally re-trigger the onFOO events 1882 old = target[ "on" + type ]; 1883 1884 if ( old ) { 1885 target[ "on" + type ] = null; 1886 } 1887 1888 jQuery.event.triggered = true; 1889 target[ type ](); 1890 } 1891 1892 // prevent IE from throwing an error for some elements with some event types, see #3533 1893 } catch (e) {} 1894 1895 if ( old ) { 1896 target[ "on" + type ] = old; 1897 } 1898 1899 jQuery.event.triggered = false; 1900 } 1901 } 1902 }, 1903 1904 handle: function( event ) { 1905 var all, handlers, namespaces, namespace, events; 1906 1907 event = arguments[0] = jQuery.event.fix( event || window.event ); 1908 event.currentTarget = this; 1909 1910 // Namespaced event handlers 1911 all = event.type.indexOf(".") < 0 && !event.exclusive; 1912 1913 if ( !all ) { 1914 namespaces = event.type.split("."); 1915 event.type = namespaces.shift(); 1916 namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)"); 1917 } 1918 1919 var events = jQuery.data(this, "events"), handlers = events[ event.type ]; 1920 1921 if ( events && handlers ) { 1922 // Clone the handlers to prevent manipulation 1923 handlers = handlers.slice(0); 1924 1925 for ( var j = 0, l = handlers.length; j < l; j++ ) { 1926 var handleObj = handlers[ j ]; 1927 1928 // Filter the functions by class 1929 if ( all || namespace.test( handleObj.namespace ) ) { 1930 // Pass in a reference to the handler function itself 1931 // So that we can later remove it 1932 event.handler = handleObj.handler; 1933 event.data = handleObj.data; 1934 event.handleObj = handleObj; 1935 1936 var ret = handleObj.handler.apply( this, arguments ); 1937 1938 if ( ret !== undefined ) { 1939 event.result = ret; 1940 if ( ret === false ) { 1941 event.preventDefault(); 1942 event.stopPropagation(); 1943 } 1944 } 1945 1946 if ( event.isImmediatePropagationStopped() ) { 1947 break; 1948 } 1949 } 1950 } 1951 } 1952 1953 return event.result; 1954 }, 1955 1956 props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), 1957 1958 fix: function( event ) { 1959 if ( event[ expando ] ) { 1960 return event; 1961 } 1962 1963 // store a copy of the original event object 1964 // and "clone" to set read-only properties 1965 var originalEvent = event; 1966 event = jQuery.Event( originalEvent ); 1967 1968 for ( var i = this.props.length, prop; i; ) { 1969 prop = this.props[ --i ]; 1970 event[ prop ] = originalEvent[ prop ]; 1971 } 1972 1973 // Fix target property, if necessary 1974 if ( !event.target ) { 1975 event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either 1976 } 1977 1978 // check if target is a textnode (safari) 1979 if ( event.target.nodeType === 3 ) { 1980 event.target = event.target.parentNode; 1981 } 1982 1983 // Add relatedTarget, if necessary 1984 if ( !event.relatedTarget && event.fromElement ) { 1985 event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; 1986 } 1987 1988 // Calculate pageX/Y if missing and clientX/Y available 1989 if ( event.pageX == null && event.clientX != null ) { 1990 var doc = document.documentElement, body = document.body; 1991 event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); 1992 event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); 1993 } 1994 1995 // Add which for key events 1996 if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) { 1997 event.which = event.charCode || event.keyCode; 1998 } 1999 2000 // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) 2001 if ( !event.metaKey && event.ctrlKey ) { 2002 event.metaKey = event.ctrlKey; 2003 } 2004 2005 // Add which for click: 1 === left; 2 === middle; 3 === right 2006 // Note: button is not normalized, so don't use it 2007 if ( !event.which && event.button !== undefined ) { 2008 event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); 2009 } 2010 2011 return event; 2012 }, 2013 2014 // Deprecated, use jQuery.guid instead 2015 guid: 1E8, 2016 2017 // Deprecated, use jQuery.proxy instead 2018 proxy: jQuery.proxy, 2019 2020 special: { 2021 ready: { 2022 // Make sure the ready event is setup 2023 setup: jQuery.bindReady, 2024 teardown: jQuery.noop 2025 }, 2026 2027 live: { 2028 add: function( handleObj ) { 2029 jQuery.event.add( this, handleObj.origType, jQuery.extend({}, handleObj, {handler: liveHandler}) ); 2030 }, 2031 2032 remove: function( handleObj ) { 2033 var remove = true, 2034 type = handleObj.origType.replace(rnamespaces, ""); 2035 2036 jQuery.each( jQuery.data(this, "events").live || [], function() { 2037 if ( type === this.origType.replace(rnamespaces, "") ) { 2038 remove = false; 2039 return false; 2040 } 2041 }); 2042 2043 if ( remove ) { 2044 jQuery.event.remove( this, handleObj.origType, liveHandler ); 2045 } 2046 } 2047 2048 }, 2049 2050 beforeunload: { 2051 setup: function( data, namespaces, eventHandle ) { 2052 // We only want to do this special case on windows 2053 if ( this.setInterval ) { 2054 this.onbeforeunload = eventHandle; 2055 } 2056 2057 return false; 2058 }, 2059 teardown: function( namespaces, eventHandle ) { 2060 if ( this.onbeforeunload === eventHandle ) { 2061 this.onbeforeunload = null; 2062 } 2063 } 2064 } 2065 } 2066 }; 2067 2068 var removeEvent = document.removeEventListener ? 2069 function( elem, type, handle ) { 2070 elem.removeEventListener( type, handle, false ); 2071 } : 2072 function( elem, type, handle ) { 2073 elem.detachEvent( "on" + type, handle ); 2074 }; 2075 2076 jQuery.Event = function( src ) { 2077 // Allow instantiation without the 'new' keyword 2078 if ( !this.preventDefault ) { 2079 return new jQuery.Event( src ); 2080 } 2081 2082 // Event object 2083 if ( src && src.type ) { 2084 this.originalEvent = src; 2085 this.type = src.type; 2086 // Event type 2087 } else { 2088 this.type = src; 2089 } 2090 2091 // timeStamp is buggy for some events on Firefox(#3843) 2092 // So we won't rely on the native value 2093 this.timeStamp = now(); 2094 2095 // Mark it as fixed 2096 this[ expando ] = true; 2097 }; 2098 2099 function returnFalse() { 2100 return false; 2101 } 2102 function returnTrue() { 2103 return true; 2104 } 2105 2106 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding 2107 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html 2108 jQuery.Event.prototype = { 2109 preventDefault: function() { 2110 this.isDefaultPrevented = returnTrue; 2111 2112 var e = this.originalEvent; 2113 if ( !e ) { 2114 return; 2115 } 2116 2117 // if preventDefault exists run it on the original event 2118 if ( e.preventDefault ) { 2119 e.preventDefault(); 2120 } 2121 // otherwise set the returnValue property of the original event to false (IE) 2122 e.returnValue = false; 2123 }, 2124 stopPropagation: function() { 2125 this.isPropagationStopped = returnTrue; 2126 2127 var e = this.originalEvent; 2128 if ( !e ) { 2129 return; 2130 } 2131 // if stopPropagation exists run it on the original event 2132 if ( e.stopPropagation ) { 2133 e.stopPropagation(); 2134 } 2135 // otherwise set the cancelBubble property of the original event to true (IE) 2136 e.cancelBubble = true; 2137 }, 2138 stopImmediatePropagation: function() { 2139 this.isImmediatePropagationStopped = returnTrue; 2140 this.stopPropagation(); 2141 }, 2142 isDefaultPrevented: returnFalse, 2143 isPropagationStopped: returnFalse, 2144 isImmediatePropagationStopped: returnFalse 2145 }; 2146 2147 // Checks if an event happened on an element within another element 2148 // Used in jQuery.event.special.mouseenter and mouseleave handlers 2149 var withinElement = function( event ) { 2150 // Check if mouse(over|out) are still within the same parent element 2151 var parent = event.relatedTarget; 2152 2153 // Firefox sometimes assigns relatedTarget a XUL element 2154 // which we cannot access the parentNode property of 2155 try { 2156 // Traverse up the tree 2157 while ( parent && parent !== this ) { 2158 parent = parent.parentNode; 2159 } 2160 2161 if ( parent !== this ) { 2162 // set the correct event type 2163 event.type = event.data; 2164 2165 // handle event if we actually just moused on to a non sub-element 2166 jQuery.event.handle.apply( this, arguments ); 2167 } 2168 2169 // assuming we've left the element since we most likely mousedover a xul element 2170 } catch(e) { } 2171 }, 2172 2173 // In case of event delegation, we only need to rename the event.type, 2174 // liveHandler will take care of the rest. 2175 delegate = function( event ) { 2176 event.type = event.data; 2177 jQuery.event.handle.apply( this, arguments ); 2178 }; 2179 2180 // Create mouseenter and mouseleave events 2181 jQuery.each({ 2182 mouseenter: "mouseover", 2183 mouseleave: "mouseout" 2184 }, function( orig, fix ) { 2185 jQuery.event.special[ orig ] = { 2186 setup: function( data ) { 2187 jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); 2188 }, 2189 teardown: function( data ) { 2190 jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); 2191 } 2192 }; 2193 }); 2194 2195 // submit delegation 2196 if ( !jQuery.support.submitBubbles ) { 2197 2198 jQuery.event.special.submit = { 2199 setup: function( data, namespaces ) { 2200 if ( this.nodeName.toLowerCase() !== "form" ) { 2201 jQuery.event.add(this, "click.specialSubmit", function( e ) { 2202 var elem = e.target, type = elem.type; 2203 2204 if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { 2205 return trigger( "submit", this, arguments ); 2206 } 2207 }); 2208 2209 jQuery.event.add(this, "keypress.specialSubmit", function( e ) { 2210 var elem = e.target, type = elem.type; 2211 2212 if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { 2213 return trigger( "submit", this, arguments ); 2214 } 2215 }); 2216 2217 } else { 2218 return false; 2219 } 2220 }, 2221 2222 teardown: function( namespaces ) { 2223 jQuery.event.remove( this, ".specialSubmit" ); 2224 } 2225 }; 2226 2227 } 2228 2229 // change delegation, happens here so we have bind. 2230 if ( !jQuery.support.changeBubbles ) { 2231 2232 var formElems = /textarea|input|select/i, 2233 2234 changeFilters, 2235 2236 getVal = function( elem ) { 2237 var type = elem.type, val = elem.value; 2238 2239 if ( type === "radio" || type === "checkbox" ) { 2240 val = elem.checked; 2241 2242 } else if ( type === "select-multiple" ) { 2243 val = elem.selectedIndex > -1 ? 2244 jQuery.map( elem.options, function( elem ) { 2245 return elem.selected; 2246 }).join("-") : 2247 ""; 2248 2249 } else if ( elem.nodeName.toLowerCase() === "select" ) { 2250 val = elem.selectedIndex; 2251 } 2252 2253 return val; 2254 }, 2255 2256 testChange = function testChange( e ) { 2257 var elem = e.target, data, val; 2258 2259 if ( !formElems.test( elem.nodeName ) || elem.readOnly ) { 2260 return; 2261 } 2262 2263 data = jQuery.data( elem, "_change_data" ); 2264 val = getVal(elem); 2265 2266 // the current data will be also retrieved by beforeactivate 2267 if ( e.type !== "focusout" || elem.type !== "radio" ) { 2268 jQuery.data( elem, "_change_data", val ); 2269 } 2270 2271 if ( data === undefined || val === data ) { 2272 return; 2273 } 2274 2275 if ( data != null || val ) { 2276 e.type = "change"; 2277 return jQuery.event.trigger( e, arguments[1], elem ); 2278 } 2279 }; 2280 2281 jQuery.event.special.change = { 2282 filters: { 2283 focusout: testChange, 2284 2285 click: function( e ) { 2286 var elem = e.target, type = elem.type; 2287 2288 if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) { 2289 return testChange.call( this, e ); 2290 } 2291 }, 2292 2293 // Change has to be called before submit 2294 // Keydown will be called before keypress, which is used in submit-event delegation 2295 keydown: function( e ) { 2296 var elem = e.target, type = elem.type; 2297 2298 if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") || 2299 (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || 2300 type === "select-multiple" ) { 2301 return testChange.call( this, e ); 2302 } 2303 }, 2304 2305 // Beforeactivate happens also before the previous element is blurred 2306 // with this event you can't trigger a change event, but you can store 2307 // information/focus[in] is not needed anymore 2308 beforeactivate: function( e ) { 2309 var elem = e.target; 2310 jQuery.data( elem, "_change_data", getVal(elem) ); 2311 } 2312 }, 2313 2314 setup: function( data, namespaces ) { 2315 if ( this.type === "file" ) { 2316 return false; 2317 } 2318 2319 for ( var type in changeFilters ) { 2320 jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); 2321 } 2322 2323 return formElems.test( this.nodeName ); 2324 }, 2325 2326 teardown: function( namespaces ) { 2327 jQuery.event.remove( this, ".specialChange" ); 2328 2329 return formElems.test( this.nodeName ); 2330 } 2331 }; 2332 2333 changeFilters = jQuery.event.special.change.filters; 2334 } 2335 2336 function trigger( type, elem, args ) { 2337 args[0].type = type; 2338 return jQuery.event.handle.apply( elem, args ); 2339 } 2340 2341 // Create "bubbling" focus and blur events 2342 if ( document.addEventListener ) { 2343 jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { 2344 jQuery.event.special[ fix ] = { 2345 setup: function() { 2346 this.addEventListener( orig, handler, true ); 2347 }, 2348 teardown: function() { 2349 this.removeEventListener( orig, handler, true ); 2350 } 2351 }; 2352 2353 function handler( e ) { 2354 e = jQuery.event.fix( e ); 2355 e.type = fix; 2356 return jQuery.event.handle.call( this, e ); 2357 } 2358 }); 2359 } 2360 2361 jQuery.each(["bind", "one"], function( i, name ) { 2362 jQuery.fn[ name ] = function( type, data, fn ) { 2363 // Handle object literals 2364 if ( typeof type === "object" ) { 2365 for ( var key in type ) { 2366 this[ name ](key, data, type[key], fn); 2367 } 2368 return this; 2369 } 2370 2371 if ( jQuery.isFunction( data ) ) { 2372 fn = data; 2373 data = undefined; 2374 } 2375 2376 var handler = name === "one" ? jQuery.proxy( fn, function( event ) { 2377 jQuery( this ).unbind( event, handler ); 2378 return fn.apply( this, arguments ); 2379 }) : fn; 2380 2381 if ( type === "unload" && name !== "one" ) { 2382 this.one( type, data, fn ); 2383 2384 } else { 2385 for ( var i = 0, l = this.length; i < l; i++ ) { 2386 jQuery.event.add( this[i], type, handler, data ); 2387 } 2388 } 2389 2390 return this; 2391 }; 2392 }); 2393 2394 jQuery.fn.extend({ 2395 unbind: function( type, fn ) { 2396 // Handle object literals 2397 if ( typeof type === "object" && !type.preventDefault ) { 2398 for ( var key in type ) { 2399 this.unbind(key, type[key]); 2400 } 2401 2402 } else { 2403 for ( var i = 0, l = this.length; i < l; i++ ) { 2404 jQuery.event.remove( this[i], type, fn ); 2405 } 2406 } 2407 2408 return this; 2409 }, 2410 2411 delegate: function( selector, types, data, fn ) { 2412 return this.live( types, data, fn, selector ); 2413 }, 2414 2415 undelegate: function( selector, types, fn ) { 2416 if ( arguments.length === 0 ) { 2417 return this.unbind( "live" ); 2418 2419 } else { 2420 return this.die( types, null, fn, selector ); 2421 } 2422 }, 2423 2424 trigger: function( type, data ) { 2425 return this.each(function() { 2426 jQuery.event.trigger( type, data, this ); 2427 }); 2428 }, 2429 2430 triggerHandler: function( type, data ) { 2431 if ( this[0] ) { 2432 var event = jQuery.Event( type ); 2433 event.preventDefault(); 2434 event.stopPropagation(); 2435 jQuery.event.trigger( event, data, this[0] ); 2436 return event.result; 2437 } 2438 }, 2439 2440 toggle: function( fn ) { 2441 // Save reference to arguments for access in closure 2442 var args = arguments, i = 1; 2443 2444 // link all the functions, so any of them can unbind this click handler 2445 while ( i < args.length ) { 2446 jQuery.proxy( fn, args[ i++ ] ); 2447 } 2448 2449 return this.click( jQuery.proxy( fn, function( event ) { 2450 // Figure out which function to execute 2451 var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i; 2452 jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 ); 2453 2454 // Make sure that clicks stop 2455 event.preventDefault(); 2456 2457 // and execute the function 2458 return args[ lastToggle ].apply( this, arguments ) || false; 2459 })); 2460 }, 2461 2462 hover: function( fnOver, fnOut ) { 2463 return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); 2464 } 2465 }); 2466 2467 var liveMap = { 2468 focus: "focusin", 2469 blur: "focusout", 2470 mouseenter: "mouseover", 2471 mouseleave: "mouseout" 2472 }; 2473 2474 jQuery.each(["live", "die"], function( i, name ) { 2475 jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { 2476 var type, i = 0, match, namespaces, preType, 2477 selector = origSelector || this.selector, 2478 context = origSelector ? this : jQuery( this.context ); 2479 2480 if ( jQuery.isFunction( data ) ) { 2481 fn = data; 2482 data = undefined; 2483 } 2484 2485 types = (types || "").split(" "); 2486 2487 while ( (type = types[ i++ ]) != null ) { 2488 match = rnamespaces.exec( type ); 2489 namespaces = ""; 2490 2491 if ( match ) { 2492 namespaces = match[0]; 2493 type = type.replace( rnamespaces, "" ); 2494 } 2495 2496 if ( type === "hover" ) { 2497 types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); 2498 continue; 2499 } 2500 2501 preType = type; 2502 2503 if ( type === "focus" || type === "blur" ) { 2504 types.push( liveMap[ type ] + namespaces ); 2505 type = type + namespaces; 2506 2507 } else { 2508 type = (liveMap[ type ] || type) + namespaces; 2509 } 2510 2511 if ( name === "live" ) { 2512 // bind live handler 2513 context.each(function(){ 2514 jQuery.event.add( this, liveConvert( type, selector ), 2515 { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); 2516 }); 2517 2518 } else { 2519 // unbind live handler 2520 context.unbind( liveConvert( type, selector ), fn ); 2521 } 2522 } 2523 2524 return this; 2525 } 2526 }); 2527 2528 function liveHandler( event ) { 2529 var stop, elems = [], selectors = [], args = arguments, 2530 related, match, handleObj, elem, j, i, l, data, 2531 events = jQuery.data( this, "events" ); 2532 2533 // Make sure we avoid non-left-click bubbling in Firefox (#3861) 2534 if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) { 2535 return; 2536 } 2537 2538 event.liveFired = this; 2539 2540 var live = events.live.slice(0); 2541 2542 for ( j = 0; j < live.length; j++ ) { 2543 handleObj = live[j]; 2544 2545 if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { 2546 selectors.push( handleObj.selector ); 2547 2548 } else { 2549 live.splice( j--, 1 ); 2550 } 2551 } 2552 2553 match = jQuery( event.target ).closest( selectors, event.currentTarget ); 2554 2555 for ( i = 0, l = match.length; i < l; i++ ) { 2556 for ( j = 0; j < live.length; j++ ) { 2557 handleObj = live[j]; 2558 2559 if ( match[i].selector === handleObj.selector ) { 2560 elem = match[i].elem; 2561 related = null; 2562 2563 // Those two events require additional checking 2564 if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { 2565 related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; 2566 } 2567 2568 if ( !related || related !== elem ) { 2569 elems.push({ elem: elem, handleObj: handleObj }); 2570 } 2571 } 2572 } 2573 } 2574 2575 for ( i = 0, l = elems.length; i < l; i++ ) { 2576 match = elems[i]; 2577 event.currentTarget = match.elem; 2578 event.data = match.handleObj.data; 2579 event.handleObj = match.handleObj; 2580 2581 if ( match.handleObj.origHandler.apply( match.elem, args ) === false ) { 2582 stop = false; 2583 break; 2584 } 2585 } 2586 2587 return stop; 2588 } 2589 2590 function liveConvert( type, selector ) { 2591 return "live." + (type && type !== "*" ? type + "." : "") + selector.replace(/\./g, "`").replace(/ /g, "&"); 2592 } 2593 2594 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + 2595 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + 2596 "change select submit keydown keypress keyup error").split(" "), function( i, name ) { 2597 2598 // Handle event binding 2599 jQuery.fn[ name ] = function( fn ) { 2600 return fn ? this.bind( name, fn ) : this.trigger( name ); 2601 }; 2602 2603 if ( jQuery.attrFn ) { 2604 jQuery.attrFn[ name ] = true; 2605 } 2606 }); 2607 2608 // Prevent memory leaks in IE 2609 // Window isn't included so as not to unbind existing unload events 2610 // More info: 2611 // - http://isaacschlueter.com/2006/10/msie-memory-leaks/ 2612 if ( window.attachEvent && !window.addEventListener ) { 2613 window.attachEvent("onunload", function() { 2614 for ( var id in jQuery.cache ) { 2615 if ( jQuery.cache[ id ].handle ) { 2616 // Try/Catch is to handle iframes being unloaded, see #4280 2617 try { 2618 jQuery.event.remove( jQuery.cache[ id ].handle.elem ); 2619 } catch(e) {} 2620 } 2621 } 2622 }); 2623 } 2624 /*! 2625 * Sizzle CSS Selector Engine - v1.0 2626 * Copyright 2009, The Dojo Foundation 2627 * Released under the MIT, BSD, and GPL Licenses. 2628 * More information: http://sizzlejs.com/ 2629 */ 2630 (function(){ 2631 2632 var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, 2633 done = 0, 2634 toString = Object.prototype.toString, 2635 hasDuplicate = false, 2636 baseHasDuplicate = true; 2637 2638 // Here we check if the JavaScript engine is using some sort of 2639 // optimization where it does not always call our comparision 2640 // function. If that is the case, discard the hasDuplicate value. 2641 // Thus far that includes Google Chrome. 2642 [0, 0].sort(function(){ 2643 baseHasDuplicate = false; 2644 return 0; 2645 }); 2646 2647 var Sizzle = function(selector, context, results, seed) { 2648 results = results || []; 2649 var origContext = context = context || document; 2650 2651 if ( context.nodeType !== 1 && context.nodeType !== 9 ) { 2652 return []; 2653 } 2654 2655 if ( !selector || typeof selector !== "string" ) { 2656 return results; 2657 } 2658 2659 var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context), 2660 soFar = selector; 2661 2662 // Reset the position of the chunker regexp (start from head) 2663 while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) { 2664 soFar = m[3]; 2665 2666 parts.push( m[1] ); 2667 2668 if ( m[2] ) { 2669 extra = m[3]; 2670 break; 2671 } 2672 } 2673 2674 if ( parts.length > 1 && origPOS.exec( selector ) ) { 2675 if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { 2676 set = posProcess( parts[0] + parts[1], context ); 2677 } else { 2678 set = Expr.relative[ parts[0] ] ? 2679 [ context ] : 2680 Sizzle( parts.shift(), context ); 2681 2682 while ( parts.length ) { 2683 selector = parts.shift(); 2684 2685 if ( Expr.relative[ selector ] ) { 2686 selector += parts.shift(); 2687 } 2688 2689 set = posProcess( selector, set ); 2690 } 2691 } 2692 } else { 2693 // Take a shortcut and set the context if the root selector is an ID 2694 // (but not if it'll be faster if the inner selector is an ID) 2695 if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && 2696 Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { 2697 var ret = Sizzle.find( parts.shift(), context, contextXML ); 2698 context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; 2699 } 2700 2701 if ( context ) { 2702 var ret = seed ? 2703 { expr: parts.pop(), set: makeArray(seed) } : 2704 Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); 2705 set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; 2706 2707 if ( parts.length > 0 ) { 2708 checkSet = makeArray(set); 2709 } else { 2710 prune = false; 2711 } 2712 2713 while ( parts.length ) { 2714 var cur = parts.pop(), pop = cur; 2715 2716 if ( !Expr.relative[ cur ] ) { 2717 cur = ""; 2718 } else { 2719 pop = parts.pop(); 2720 } 2721 2722 if ( pop == null ) { 2723 pop = context; 2724 } 2725 2726 Expr.relative[ cur ]( checkSet, pop, contextXML ); 2727 } 2728 } else { 2729 checkSet = parts = []; 2730 } 2731 } 2732 2733 if ( !checkSet ) { 2734 checkSet = set; 2735 } 2736 2737 if ( !checkSet ) { 2738 Sizzle.error( cur || selector ); 2739 } 2740 2741 if ( toString.call(checkSet) === "[object Array]" ) { 2742 if ( !prune ) { 2743 results.push.apply( results, checkSet ); 2744 } else if ( context && context.nodeType === 1 ) { 2745 for ( var i = 0; checkSet[i] != null; i++ ) { 2746 if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) { 2747 results.push( set[i] ); 2748 } 2749 } 2750 } else { 2751 for ( var i = 0; checkSet[i] != null; i++ ) { 2752 if ( checkSet[i] && checkSet[i].nodeType === 1 ) { 2753 results.push( set[i] ); 2754 } 2755 } 2756 } 2757 } else { 2758 makeArray( checkSet, results ); 2759 } 2760 2761 if ( extra ) { 2762 Sizzle( extra, origContext, results, seed ); 2763 Sizzle.uniqueSort( results ); 2764 } 2765 2766 return results; 2767 }; 2768 2769 Sizzle.uniqueSort = function(results){ 2770 if ( sortOrder ) { 2771 hasDuplicate = baseHasDuplicate; 2772 results.sort(sortOrder); 2773 2774 if ( hasDuplicate ) { 2775 for ( var i = 1; i < results.length; i++ ) { 2776 if ( results[i] === results[i-1] ) { 2777 results.splice(i--, 1); 2778 } 2779 } 2780 } 2781 } 2782 2783 return results; 2784 }; 2785 2786 Sizzle.matches = function(expr, set){ 2787 return Sizzle(expr, null, null, set); 2788 }; 2789 2790 Sizzle.find = function(expr, context, isXML){ 2791 var set, match; 2792 2793 if ( !expr ) { 2794 return []; 2795 } 2796 2797 for ( var i = 0, l = Expr.order.length; i < l; i++ ) { 2798 var type = Expr.order[i], match; 2799 2800 if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { 2801 var left = match[1]; 2802 match.splice(1,1); 2803 2804 if ( left.substr( left.length - 1 ) !== "\\" ) { 2805 match[1] = (match[1] || "").replace(/\\/g, ""); 2806 set = Expr.find[ type ]( match, context, isXML ); 2807 if ( set != null ) { 2808 expr = expr.replace( Expr.match[ type ], "" ); 2809 break; 2810 } 2811 } 2812 } 2813 } 2814 2815 if ( !set ) { 2816 set = context.getElementsByTagName("*"); 2817 } 2818 2819 return {set: set, expr: expr}; 2820 }; 2821 2822 Sizzle.filter = function(expr, set, inplace, not){ 2823 var old = expr, result = [], curLoop = set, match, anyFound, 2824 isXMLFilter = set && set[0] && isXML(set[0]); 2825 2826 while ( expr && set.length ) { 2827 for ( var type in Expr.filter ) { 2828 if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { 2829 var filter = Expr.filter[ type ], found, item, left = match[1]; 2830 anyFound = false; 2831 2832 match.splice(1,1); 2833 2834 if ( left.substr( left.length - 1 ) === "\\" ) { 2835 continue; 2836 } 2837 2838 if ( curLoop === result ) { 2839 result = []; 2840 } 2841 2842 if ( Expr.preFilter[ type ] ) { 2843 match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); 2844 2845 if ( !match ) { 2846 anyFound = found = true; 2847 } else if ( match === true ) { 2848 continue; 2849 } 2850 } 2851 2852 if ( match ) { 2853 for ( var i = 0; (item = curLoop[i]) != null; i++ ) { 2854 if ( item ) { 2855 found = filter( item, match, i, curLoop ); 2856 var pass = not ^ !!found; 2857 2858 if ( inplace && found != null ) { 2859 if ( pass ) { 2860 anyFound = true; 2861 } else { 2862 curLoop[i] = false; 2863 } 2864 } else if ( pass ) { 2865 result.push( item ); 2866 anyFound = true; 2867 } 2868 } 2869 } 2870 } 2871 2872 if ( found !== undefined ) { 2873 if ( !inplace ) { 2874 curLoop = result; 2875 } 2876 2877 expr = expr.replace( Expr.match[ type ], "" ); 2878 2879 if ( !anyFound ) { 2880 return []; 2881 } 2882 2883 break; 2884 } 2885 } 2886 } 2887 2888 // Improper expression 2889 if ( expr === old ) { 2890 if ( anyFound == null ) { 2891 Sizzle.error( expr ); 2892 } else { 2893 break; 2894 } 2895 } 2896 2897 old = expr; 2898 } 2899 2900 return curLoop; 2901 }; 2902 2903 Sizzle.error = function( msg ) { 2904 throw "Syntax error, unrecognized expression: " + msg; 2905 }; 2906 2907 var Expr = Sizzle.selectors = { 2908 order: [ "ID", "NAME", "TAG" ], 2909 match: { 2910 ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, 2911 CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/, 2912 NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/, 2913 ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, 2914 TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/, 2915 CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, 2916 POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, 2917 PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ 2918 }, 2919 leftMatch: {}, 2920 attrMap: { 2921 "class": "className", 2922 "for": "htmlFor" 2923 }, 2924 attrHandle: { 2925 href: function(elem){ 2926 return elem.getAttribute("href"); 2927 } 2928 }, 2929 relative: { 2930 "+": function(checkSet, part){ 2931 var isPartStr = typeof part === "string", 2932 isTag = isPartStr && !/\W/.test(part), 2933 isPartStrNotTag = isPartStr && !isTag; 2934 2935 if ( isTag ) { 2936 part = part.toLowerCase(); 2937 } 2938 2939 for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { 2940 if ( (elem = checkSet[i]) ) { 2941 while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} 2942 2943 checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? 2944 elem || false : 2945 elem === part; 2946 } 2947 } 2948 2949 if ( isPartStrNotTag ) { 2950 Sizzle.filter( part, checkSet, true ); 2951 } 2952 }, 2953 ">": function(checkSet, part){ 2954 var isPartStr = typeof part === "string"; 2955 2956 if ( isPartStr && !/\W/.test(part) ) { 2957 part = part.toLowerCase(); 2958 2959 for ( var i = 0, l = checkSet.length; i < l; i++ ) { 2960 var elem = checkSet[i]; 2961 if ( elem ) { 2962 var parent = elem.parentNode; 2963 checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; 2964 } 2965 } 2966 } else { 2967 for ( var i = 0, l = checkSet.length; i < l; i++ ) { 2968 var elem = checkSet[i]; 2969 if ( elem ) { 2970 checkSet[i] = isPartStr ? 2971 elem.parentNode : 2972 elem.parentNode === part; 2973 } 2974 } 2975 2976 if ( isPartStr ) { 2977 Sizzle.filter( part, checkSet, true ); 2978 } 2979 } 2980 }, 2981 "": function(checkSet, part, isXML){ 2982 var doneName = done++, checkFn = dirCheck; 2983 2984 if ( typeof part === "string" && !/\W/.test(part) ) { 2985 var nodeCheck = part = part.toLowerCase(); 2986 checkFn = dirNodeCheck; 2987 } 2988 2989 checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); 2990 }, 2991 "~": function(checkSet, part, isXML){ 2992 var doneName = done++, checkFn = dirCheck; 2993 2994 if ( typeof part === "string" && !/\W/.test(part) ) { 2995 var nodeCheck = part = part.toLowerCase(); 2996 checkFn = dirNodeCheck; 2997 } 2998 2999 checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); 3000 } 3001 }, 3002 find: { 3003 ID: function(match, context, isXML){ 3004 if ( typeof context.getElementById !== "undefined" && !isXML ) { 3005 var m = context.getElementById(match[1]); 3006 return m ? [m] : []; 3007 } 3008 }, 3009 NAME: function(match, context){ 3010 if ( typeof context.getElementsByName !== "undefined" ) { 3011 var ret = [], results = context.getElementsByName(match[1]); 3012 3013 for ( var i = 0, l = results.length; i < l; i++ ) { 3014 if ( results[i].getAttribute("name") === match[1] ) { 3015 ret.push( results[i] ); 3016 } 3017 } 3018 3019 return ret.length === 0 ? null : ret; 3020 } 3021 }, 3022 TAG: function(match, context){ 3023 return context.getElementsByTagName(match[1]); 3024 } 3025 }, 3026 preFilter: { 3027 CLASS: function(match, curLoop, inplace, result, not, isXML){ 3028 match = " " + match[1].replace(/\\/g, "") + " "; 3029 3030 if ( isXML ) { 3031 return match; 3032 } 3033 3034 for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { 3035 if ( elem ) { 3036 if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) { 3037 if ( !inplace ) { 3038 result.push( elem ); 3039 } 3040 } else if ( inplace ) { 3041 curLoop[i] = false; 3042 } 3043 } 3044 } 3045 3046 return false; 3047 }, 3048 ID: function(match){ 3049 return match[1].replace(/\\/g, ""); 3050 }, 3051 TAG: function(match, curLoop){ 3052 return match[1].toLowerCase(); 3053 }, 3054 CHILD: function(match){ 3055 if ( match[1] === "nth" ) { 3056 // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' 3057 var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( 3058 match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || 3059 !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); 3060 3061 // calculate the numbers (first)n+(last) including if they are negative 3062 match[2] = (test[1] + (test[2] || 1)) - 0; 3063 match[3] = test[3] - 0; 3064 } 3065 3066 // TODO: Move to normal caching system 3067 match[0] = done++; 3068 3069 return match; 3070 }, 3071 ATTR: function(match, curLoop, inplace, result, not, isXML){ 3072 var name = match[1].replace(/\\/g, ""); 3073 3074 if ( !isXML && Expr.attrMap[name] ) { 3075 match[1] = Expr.attrMap[name]; 3076 } 3077 3078 if ( match[2] === "~=" ) { 3079 match[4] = " " + match[4] + " "; 3080 } 3081 3082 return match; 3083 }, 3084 PSEUDO: function(match, curLoop, inplace, result, not){ 3085 if ( match[1] === "not" ) { 3086 // If we're dealing with a complex expression, or a simple one 3087 if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { 3088 match[3] = Sizzle(match[3], null, null, curLoop); 3089 } else { 3090 var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); 3091 if ( !inplace ) { 3092 result.push.apply( result, ret ); 3093 } 3094 return false; 3095 } 3096 } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { 3097 return true; 3098 } 3099 3100 return match; 3101 }, 3102 POS: function(match){ 3103 match.unshift( true ); 3104 return match; 3105 } 3106 }, 3107 filters: { 3108 enabled: function(elem){ 3109 return elem.disabled === false && elem.type !== "hidden"; 3110 }, 3111 disabled: function(elem){ 3112 return elem.disabled === true; 3113 }, 3114 checked: function(elem){ 3115 return elem.checked === true; 3116 }, 3117 selected: function(elem){ 3118 // Accessing this property makes selected-by-default 3119 // options in Safari work properly 3120 elem.parentNode.selectedIndex; 3121 return elem.selected === true; 3122 }, 3123 parent: function(elem){ 3124 return !!elem.firstChild; 3125 }, 3126 empty: function(elem){ 3127 return !elem.firstChild; 3128 }, 3129 has: function(elem, i, match){ 3130 return !!Sizzle( match[3], elem ).length; 3131 }, 3132 header: function(elem){ 3133 return /h\d/i.test( elem.nodeName ); 3134 }, 3135 text: function(elem){ 3136 return "text" === elem.type; 3137 }, 3138 radio: function(elem){ 3139 return "radio" === elem.type; 3140 }, 3141 checkbox: function(elem){ 3142 return "checkbox" === elem.type; 3143 }, 3144 file: function(elem){ 3145 return "file" === elem.type; 3146 }, 3147 password: function(elem){ 3148 return "password" === elem.type; 3149 }, 3150 submit: function(elem){ 3151 return "submit" === elem.type; 3152 }, 3153 image: function(elem){ 3154 return "image" === elem.type; 3155 }, 3156 reset: function(elem){ 3157 return "reset" === elem.type; 3158 }, 3159 button: function(elem){ 3160 return "button" === elem.type || elem.nodeName.toLowerCase() === "button"; 3161 }, 3162 input: function(elem){ 3163 return /input|select|textarea|button/i.test(elem.nodeName); 3164 } 3165 }, 3166 setFilters: { 3167 first: function(elem, i){ 3168 return i === 0; 3169 }, 3170 last: function(elem, i, match, array){ 3171 return i === array.length - 1; 3172 }, 3173 even: function(elem, i){ 3174 return i % 2 === 0; 3175 }, 3176 odd: function(elem, i){ 3177 return i % 2 === 1; 3178 }, 3179 lt: function(elem, i, match){ 3180 return i < match[3] - 0; 3181 }, 3182 gt: function(elem, i, match){ 3183 return i > match[3] - 0; 3184 }, 3185 nth: function(elem, i, match){ 3186 return match[3] - 0 === i; 3187 }, 3188 eq: function(elem, i, match){ 3189 return match[3] - 0 === i; 3190 } 3191 }, 3192 filter: { 3193 PSEUDO: function(elem, match, i, array){ 3194 var name = match[1], filter = Expr.filters[ name ]; 3195 3196 if ( filter ) { 3197 return filter( elem, i, match, array ); 3198 } else if ( name === "contains" ) { 3199 return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; 3200 } else if ( name === "not" ) { 3201 var not = match[3]; 3202 3203 for ( var i = 0, l = not.length; i < l; i++ ) { 3204 if ( not[i] === elem ) { 3205 return false; 3206 } 3207 } 3208 3209 return true; 3210 } else { 3211 Sizzle.error( "Syntax error, unrecognized expression: " + name ); 3212 } 3213 }, 3214 CHILD: function(elem, match){ 3215 var type = match[1], node = elem; 3216 switch (type) { 3217 case 'only': 3218 case 'first': 3219 while ( (node = node.previousSibling) ) { 3220 if ( node.nodeType === 1 ) { 3221 return false; 3222 } 3223 } 3224 if ( type === "first" ) { 3225 return true; 3226 } 3227 node = elem; 3228 case 'last': 3229 while ( (node = node.nextSibling) ) { 3230 if ( node.nodeType === 1 ) { 3231 return false; 3232 } 3233 } 3234 return true; 3235 case 'nth': 3236 var first = match[2], last = match[3]; 3237 3238 if ( first === 1 && last === 0 ) { 3239 return true; 3240 } 3241 3242 var doneName = match[0], 3243 parent = elem.parentNode; 3244 3245 if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { 3246 var count = 0; 3247 for ( node = parent.firstChild; node; node = node.nextSibling ) { 3248 if ( node.nodeType === 1 ) { 3249 node.nodeIndex = ++count; 3250 } 3251 } 3252 parent.sizcache = doneName; 3253 } 3254 3255 var diff = elem.nodeIndex - last; 3256 if ( first === 0 ) { 3257 return diff === 0; 3258 } else { 3259 return ( diff % first === 0 && diff / first >= 0 ); 3260 } 3261 } 3262 }, 3263 ID: function(elem, match){ 3264 return elem.nodeType === 1 && elem.getAttribute("id") === match; 3265 }, 3266 TAG: function(elem, match){ 3267 return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; 3268 }, 3269 CLASS: function(elem, match){ 3270 return (" " + (elem.className || elem.getAttribute("class")) + " ") 3271 .indexOf( match ) > -1; 3272 }, 3273 ATTR: function(elem, match){ 3274 var name = match[1], 3275 result = Expr.attrHandle[ name ] ? 3276 Expr.attrHandle[ name ]( elem ) : 3277 elem[ name ] != null ? 3278 elem[ name ] : 3279 elem.getAttribute( name ), 3280 value = result + "", 3281 type = match[2], 3282 check = match[4]; 3283 3284 return result == null ? 3285 type === "!=" : 3286 type === "=" ? 3287 value === check : 3288 type === "*=" ? 3289 value.indexOf(check) >= 0 : 3290 type === "~=" ? 3291 (" " + value + " ").indexOf(check) >= 0 : 3292 !check ? 3293 value && result !== false : 3294 type === "!=" ? 3295 value !== check : 3296 type === "^=" ? 3297 value.indexOf(check) === 0 : 3298 type === "$=" ? 3299 value.substr(value.length - check.length) === check : 3300 type === "|=" ? 3301 value === check || value.substr(0, check.length + 1) === check + "-" : 3302 false; 3303 }, 3304 POS: function(elem, match, i, array){ 3305 var name = match[2], filter = Expr.setFilters[ name ]; 3306 3307 if ( filter ) { 3308 return filter( elem, i, match, array ); 3309 } 3310 } 3311 } 3312 }; 3313 3314 var origPOS = Expr.match.POS; 3315 3316 for ( var type in Expr.match ) { 3317 Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source ); 3318 Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, function(all, num){ 3319 return "\\" + (num - 0 + 1); 3320 })); 3321 } 3322 3323 var makeArray = function(array, results) { 3324 array = Array.prototype.slice.call( array, 0 ); 3325 3326 if ( results ) { 3327 results.push.apply( results, array ); 3328 return results; 3329 } 3330 3331 return array; 3332 }; 3333 3334 // Perform a simple check to determine if the browser is capable of 3335 // converting a NodeList to an array using builtin methods. 3336 // Also verifies that the returned array holds DOM nodes 3337 // (which is not the case in the Blackberry browser) 3338 try { 3339 Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; 3340 3341 // Provide a fallback method if it does not work 3342 } catch(e){ 3343 makeArray = function(array, results) { 3344 var ret = results || []; 3345 3346 if ( toString.call(array) === "[object Array]" ) { 3347 Array.prototype.push.apply( ret, array ); 3348 } else { 3349 if ( typeof array.length === "number" ) { 3350 for ( var i = 0, l = array.length; i < l; i++ ) { 3351 ret.push( array[i] ); 3352 } 3353 } else { 3354 for ( var i = 0; array[i]; i++ ) { 3355 ret.push( array[i] ); 3356 } 3357 } 3358 } 3359 3360 return ret; 3361 }; 3362 } 3363 3364 var sortOrder; 3365 3366 if ( document.documentElement.compareDocumentPosition ) { 3367 sortOrder = function( a, b ) { 3368 if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { 3369 if ( a == b ) { 3370 hasDuplicate = true; 3371 } 3372 return a.compareDocumentPosition ? -1 : 1; 3373 } 3374 3375 var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; 3376 if ( ret === 0 ) { 3377 hasDuplicate = true; 3378 } 3379 return ret; 3380 }; 3381 } else if ( "sourceIndex" in document.documentElement ) { 3382 sortOrder = function( a, b ) { 3383 if ( !a.sourceIndex || !b.sourceIndex ) { 3384 if ( a == b ) { 3385 hasDuplicate = true; 3386 } 3387 return a.sourceIndex ? -1 : 1; 3388 } 3389 3390 var ret = a.sourceIndex - b.sourceIndex; 3391 if ( ret === 0 ) { 3392 hasDuplicate = true; 3393 } 3394 return ret; 3395 }; 3396 } else if ( document.createRange ) { 3397 sortOrder = function( a, b ) { 3398 if ( !a.ownerDocument || !b.ownerDocument ) { 3399 if ( a == b ) { 3400 hasDuplicate = true; 3401 } 3402 return a.ownerDocument ? -1 : 1; 3403 } 3404 3405 var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); 3406 aRange.setStart(a, 0); 3407 aRange.setEnd(a, 0); 3408 bRange.setStart(b, 0); 3409 bRange.setEnd(b, 0); 3410 var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); 3411 if ( ret === 0 ) { 3412 hasDuplicate = true; 3413 } 3414 return ret; 3415 }; 3416 } 3417 3418 // Utility function for retreiving the text value of an array of DOM nodes 3419 function getText( elems ) { 3420 var ret = "", elem; 3421 3422 for ( var i = 0; elems[i]; i++ ) { 3423 elem = elems[i]; 3424 3425 // Get the text from text nodes and CDATA nodes 3426 if ( elem.nodeType === 3 || elem.nodeType === 4 ) { 3427 ret += elem.nodeValue; 3428 3429 // Traverse everything else, except comment nodes 3430 } else if ( elem.nodeType !== 8 ) { 3431 ret += getText( elem.childNodes ); 3432 } 3433 } 3434 3435 return ret; 3436 } 3437 3438 // Check to see if the browser returns elements by name when 3439 // querying by getElementById (and provide a workaround) 3440 (function(){ 3441 // We're going to inject a fake input element with a specified name 3442 var form = document.createElement("div"), 3443 id = "script" + (new Date).getTime(); 3444 form.innerHTML = "<a name='" + id + "'/>"; 3445 3446 // Inject it into the root element, check its status, and remove it quickly 3447 var root = document.documentElement; 3448 root.insertBefore( form, root.firstChild ); 3449 3450 // The workaround has to do additional checks after a getElementById 3451 // Which slows things down for other browsers (hence the branching) 3452 if ( document.getElementById( id ) ) { 3453 Expr.find.ID = function(match, context, isXML){ 3454 if ( typeof context.getElementById !== "undefined" && !isXML ) { 3455 var m = context.getElementById(match[1]); 3456 return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; 3457 } 3458 }; 3459 3460 Expr.filter.ID = function(elem, match){ 3461 var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); 3462 return elem.nodeType === 1 && node && node.nodeValue === match; 3463 }; 3464 } 3465 3466 root.removeChild( form ); 3467 root = form = null; // release memory in IE 3468 })(); 3469 3470 (function(){ 3471 // Check to see if the browser returns only elements 3472 // when doing getElementsByTagName("*") 3473 3474 // Create a fake element 3475 var div = document.createElement("div"); 3476 div.appendChild( document.createComment("") ); 3477 3478 // Make sure no comments are found 3479 if ( div.getElementsByTagName("*").length > 0 ) { 3480 Expr.find.TAG = function(match, context){ 3481 var results = context.getElementsByTagName(match[1]); 3482 3483 // Filter out possible comments 3484 if ( match[1] === "*" ) { 3485 var tmp = []; 3486 3487 for ( var i = 0; results[i]; i++ ) { 3488 if ( results[i].nodeType === 1 ) { 3489 tmp.push( results[i] ); 3490 } 3491 } 3492 3493 results = tmp; 3494 } 3495 3496 return results; 3497 }; 3498 } 3499 3500 // Check to see if an attribute returns normalized href attributes 3501 div.innerHTML = "<a href='#'></a>"; 3502 if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && 3503 div.firstChild.getAttribute("href") !== "#" ) { 3504 Expr.attrHandle.href = function(elem){ 3505 return elem.getAttribute("href", 2); 3506 }; 3507 } 3508 3509 div = null; // release memory in IE 3510 })(); 3511 3512 if ( document.querySelectorAll ) { 3513 (function(){ 3514 var oldSizzle = Sizzle, div = document.createElement("div"); 3515 div.innerHTML = "<p class='TEST'></p>"; 3516 3517 // Safari can't handle uppercase or unicode characters when 3518 // in quirks mode. 3519 if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { 3520 return; 3521 } 3522 3523 Sizzle = function(query, context, extra, seed){ 3524 context = context || document; 3525 3526 // Only use querySelectorAll on non-XML documents 3527 // (ID selectors don't work in non-HTML documents) 3528 if ( !seed && context.nodeType === 9 && !isXML(context) ) { 3529 try { 3530 return makeArray( context.querySelectorAll(query), extra ); 3531 } catch(e){} 3532 } 3533 3534 return oldSizzle(query, context, extra, seed); 3535 }; 3536 3537 for ( var prop in oldSizzle ) { 3538 Sizzle[ prop ] = oldSizzle[ prop ]; 3539 } 3540 3541 div = null; // release memory in IE 3542 })(); 3543 } 3544 3545 (function(){ 3546 var div = document.createElement("div"); 3547 3548 div.innerHTML = "<div class='test e'></div><div class='test'></div>"; 3549 3550 // Opera can't find a second classname (in 9.6) 3551 // Also, make sure that getElementsByClassName actually exists 3552 if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { 3553 return; 3554 } 3555 3556 // Safari caches class attributes, doesn't catch changes (in 3.2) 3557 div.lastChild.className = "e"; 3558 3559 if ( div.getElementsByClassName("e").length === 1 ) { 3560 return; 3561 } 3562 3563 Expr.order.splice(1, 0, "CLASS"); 3564 Expr.find.CLASS = function(match, context, isXML) { 3565 if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { 3566 return context.getElementsByClassName(match[1]); 3567 } 3568 }; 3569 3570 div = null; // release memory in IE 3571 })(); 3572 3573 function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { 3574 for ( var i = 0, l = checkSet.length; i < l; i++ ) { 3575 var elem = checkSet[i]; 3576 if ( elem ) { 3577 elem = elem[dir]; 3578 var match = false; 3579 3580 while ( elem ) { 3581 if ( elem.sizcache === doneName ) { 3582 match = checkSet[elem.sizset]; 3583 break; 3584 } 3585 3586 if ( elem.nodeType === 1 && !isXML ){ 3587 elem.sizcache = doneName; 3588 elem.sizset = i; 3589 } 3590 3591 if ( elem.nodeName.toLowerCase() === cur ) { 3592 match = elem; 3593 break; 3594 } 3595 3596 elem = elem[dir]; 3597 } 3598 3599 checkSet[i] = match; 3600 } 3601 } 3602 } 3603 3604 function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { 3605 for ( var i = 0, l = checkSet.length; i < l; i++ ) { 3606 var elem = checkSet[i]; 3607 if ( elem ) { 3608 elem = elem[dir]; 3609 var match = false; 3610 3611 while ( elem ) { 3612 if ( elem.sizcache === doneName ) { 3613 match = checkSet[elem.sizset]; 3614 break; 3615 } 3616 3617 if ( elem.nodeType === 1 ) { 3618 if ( !isXML ) { 3619 elem.sizcache = doneName; 3620 elem.sizset = i; 3621 } 3622 if ( typeof cur !== "string" ) { 3623 if ( elem === cur ) { 3624 match = true; 3625 break; 3626 } 3627 3628 } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { 3629 match = elem; 3630 break; 3631 } 3632 } 3633 3634 elem = elem[dir]; 3635 } 3636 3637 checkSet[i] = match; 3638 } 3639 } 3640 } 3641 3642 var contains = document.compareDocumentPosition ? function(a, b){ 3643 return !!(a.compareDocumentPosition(b) & 16); 3644 } : function(a, b){ 3645 return a !== b && (a.contains ? a.contains(b) : true); 3646 }; 3647 3648 var isXML = function(elem){ 3649 // documentElement is verified for cases where it doesn't yet exist 3650 // (such as loading iframes in IE - #4833) 3651 var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; 3652 return documentElement ? documentElement.nodeName !== "HTML" : false; 3653 }; 3654 3655 var posProcess = function(selector, context){ 3656 var tmpSet = [], later = "", match, 3657 root = context.nodeType ? [context] : context; 3658 3659 // Position selectors must be done after the filter 3660 // And so must :not(positional) so we move all PSEUDOs to the end 3661 while ( (match = Expr.match.PSEUDO.exec( selector )) ) { 3662 later += match[0]; 3663 selector = selector.replace( Expr.match.PSEUDO, "" ); 3664 } 3665 3666 selector = Expr.relative[selector] ? selector + "*" : selector; 3667 3668 for ( var i = 0, l = root.length; i < l; i++ ) { 3669 Sizzle( selector, root[i], tmpSet ); 3670 } 3671 3672 return Sizzle.filter( later, tmpSet ); 3673 }; 3674 3675 // EXPOSE 3676 jQuery.find = Sizzle; 3677 jQuery.expr = Sizzle.selectors; 3678 jQuery.expr[":"] = jQuery.expr.filters; 3679 jQuery.unique = Sizzle.uniqueSort; 3680 jQuery.text = getText; 3681 jQuery.isXMLDoc = isXML; 3682 jQuery.contains = contains; 3683 3684 return; 3685 3686 window.Sizzle = Sizzle; 3687 3688 })(); 3689 var runtil = /Until$/, 3690 rparentsprev = /^(?:parents|prevUntil|prevAll)/, 3691 // Note: This RegExp should be improved, or likely pulled from Sizzle 3692 rmultiselector = /,/, 3693 slice = Array.prototype.slice; 3694 3695 // Implement the identical functionality for filter and not 3696 var winnow = function( elements, qualifier, keep ) { 3697 if ( jQuery.isFunction( qualifier ) ) { 3698 return jQuery.grep(elements, function( elem, i ) { 3699 return !!qualifier.call( elem, i, elem ) === keep; 3700 }); 3701 3702 } else if ( qualifier.nodeType ) { 3703 return jQuery.grep(elements, function( elem, i ) { 3704 return (elem === qualifier) === keep; 3705 }); 3706 3707 } else if ( typeof qualifier === "string" ) { 3708 var filtered = jQuery.grep(elements, function( elem ) { 3709 return elem.nodeType === 1; 3710 }); 3711 3712 if ( isSimple.test( qualifier ) ) { 3713 return jQuery.filter(qualifier, filtered, !keep); 3714 } else { 3715 qualifier = jQuery.filter( qualifier, filtered ); 3716 } 3717 } 3718 3719 return jQuery.grep(elements, function( elem, i ) { 3720 return (jQuery.inArray( elem, qualifier ) >= 0) === keep; 3721 }); 3722 }; 3723 3724 jQuery.fn.extend({ 3725 find: function( selector ) { 3726 var ret = this.pushStack( "", "find", selector ), length = 0; 3727 3728 for ( var i = 0, l = this.length; i < l; i++ ) { 3729 length = ret.length; 3730 jQuery.find( selector, this[i], ret ); 3731 3732 if ( i > 0 ) { 3733 // Make sure that the results are unique 3734 for ( var n = length; n < ret.length; n++ ) { 3735 for ( var r = 0; r < length; r++ ) { 3736 if ( ret[r] === ret[n] ) { 3737 ret.splice(n--, 1); 3738 break; 3739 } 3740 } 3741 } 3742 } 3743 } 3744 3745 return ret; 3746 }, 3747 3748 has: function( target ) { 3749 var targets = jQuery( target ); 3750 return this.filter(function() { 3751 for ( var i = 0, l = targets.length; i < l; i++ ) { 3752 if ( jQuery.contains( this, targets[i] ) ) { 3753 return true; 3754 } 3755 } 3756 }); 3757 }, 3758 3759 not: function( selector ) { 3760 return this.pushStack( winnow(this, selector, false), "not", selector); 3761 }, 3762 3763 filter: function( selector ) { 3764 return this.pushStack( winnow(this, selector, true), "filter", selector ); 3765 }, 3766 3767 is: function( selector ) { 3768 return !!selector && jQuery.filter( selector, this ).length > 0; 3769 }, 3770 3771 closest: function( selectors, context ) { 3772 if ( jQuery.isArray( selectors ) ) { 3773 var ret = [], cur = this[0], match, matches = {}, selector; 3774 3775 if ( cur && selectors.length ) { 3776 for ( var i = 0, l = selectors.length; i < l; i++ ) { 3777 selector = selectors[i]; 3778 3779 if ( !matches[selector] ) { 3780 matches[selector] = jQuery.expr.match.POS.test( selector ) ? 3781 jQuery( selector, context || this.context ) : 3782 selector; 3783 } 3784 } 3785 3786 while ( cur && cur.ownerDocument && cur !== context ) { 3787 for ( selector in matches ) { 3788 match = matches[selector]; 3789 3790 if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) { 3791 ret.push({ selector: selector, elem: cur }); 3792 delete matches[selector]; 3793 } 3794 } 3795 cur = cur.parentNode; 3796 } 3797 } 3798 3799 return ret; 3800 } 3801 3802 var pos = jQuery.expr.match.POS.test( selectors ) ? 3803 jQuery( selectors, context || this.context ) : null; 3804 3805 return this.map(function( i, cur ) { 3806 while ( cur && cur.ownerDocument && cur !== context ) { 3807 if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) { 3808 return cur; 3809 } 3810 cur = cur.parentNode; 3811 } 3812 return null; 3813 }); 3814 }, 3815 3816 // Determine the position of an element within 3817 // the matched set of elements 3818 index: function( elem ) { 3819 if ( !elem || typeof elem === "string" ) { 3820 return jQuery.inArray( this[0], 3821 // If it receives a string, the selector is used 3822 // If it receives nothing, the siblings are used 3823 elem ? jQuery( elem ) : this.parent().children() ); 3824 } 3825 // Locate the position of the desired element 3826 return jQuery.inArray( 3827 // If it receives a jQuery object, the first element is used 3828 elem.jquery ? elem[0] : elem, this ); 3829 }, 3830 3831 add: function( selector, context ) { 3832 var set = typeof selector === "string" ? 3833 jQuery( selector, context || this.context ) : 3834 jQuery.makeArray( selector ), 3835 all = jQuery.merge( this.get(), set ); 3836 3837 return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? 3838 all : 3839 jQuery.unique( all ) ); 3840 }, 3841 3842 andSelf: function() { 3843 return this.add( this.prevObject ); 3844 } 3845 }); 3846 3847 // A painfully simple check to see if an element is disconnected 3848 // from a document (should be improved, where feasible). 3849 function isDisconnected( node ) { 3850 return !node || !node.parentNode || node.parentNode.nodeType === 11; 3851 } 3852 3853 jQuery.each({ 3854 parent: function( elem ) { 3855 var parent = elem.parentNode; 3856 return parent && parent.nodeType !== 11 ? parent : null; 3857 }, 3858 parents: function( elem ) { 3859 return jQuery.dir( elem, "parentNode" ); 3860 }, 3861 parentsUntil: function( elem, i, until ) { 3862 return jQuery.dir( elem, "parentNode", until ); 3863 }, 3864 next: function( elem ) { 3865 return jQuery.nth( elem, 2, "nextSibling" ); 3866 }, 3867 prev: function( elem ) { 3868 return jQuery.nth( elem, 2, "previousSibling" ); 3869 }, 3870 nextAll: function( elem ) { 3871 return jQuery.dir( elem, "nextSibling" ); 3872 }, 3873 prevAll: function( elem ) { 3874 return jQuery.dir( elem, "previousSibling" ); 3875 }, 3876 nextUntil: function( elem, i, until ) { 3877 return jQuery.dir( elem, "nextSibling", until ); 3878 }, 3879 prevUntil: function( elem, i, until ) { 3880 return jQuery.dir( elem, "previousSibling", until ); 3881 }, 3882 siblings: function( elem ) { 3883 return jQuery.sibling( elem.parentNode.firstChild, elem ); 3884 }, 3885 children: function( elem ) { 3886 return jQuery.sibling( elem.firstChild ); 3887 }, 3888 contents: function( elem ) { 3889 return jQuery.nodeName( elem, "iframe" ) ? 3890 elem.contentDocument || elem.contentWindow.document : 3891 jQuery.makeArray( elem.childNodes ); 3892 } 3893 }, function( name, fn ) { 3894 jQuery.fn[ name ] = function( until, selector ) { 3895 var ret = jQuery.map( this, fn, until ); 3896 3897 if ( !runtil.test( name ) ) { 3898 selector = until; 3899 } 3900 3901 if ( selector && typeof selector === "string" ) { 3902 ret = jQuery.filter( selector, ret ); 3903 } 3904 3905 ret = this.length > 1 ? jQuery.unique( ret ) : ret; 3906 3907 if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { 3908 ret = ret.reverse(); 3909 } 3910 3911 return this.pushStack( ret, name, slice.call(arguments).join(",") ); 3912 }; 3913 }); 3914 3915 jQuery.extend({ 3916 filter: function( expr, elems, not ) { 3917 if ( not ) { 3918 expr = ":not(" + expr + ")"; 3919 } 3920 3921 return jQuery.find.matches(expr, elems); 3922 }, 3923 3924 dir: function( elem, dir, until ) { 3925 var matched = [], cur = elem[dir]; 3926 while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { 3927 if ( cur.nodeType === 1 ) { 3928 matched.push( cur ); 3929 } 3930 cur = cur[dir]; 3931 } 3932 return matched; 3933 }, 3934 3935 nth: function( cur, result, dir, elem ) { 3936 result = result || 1; 3937 var num = 0; 3938 3939 for ( ; cur; cur = cur[dir] ) { 3940 if ( cur.nodeType === 1 && ++num === result ) { 3941 break; 3942 } 3943 } 3944 3945 return cur; 3946 }, 3947 3948 sibling: function( n, elem ) { 3949 var r = []; 3950 3951 for ( ; n; n = n.nextSibling ) { 3952 if ( n.nodeType === 1 && n !== elem ) { 3953 r.push( n ); 3954 } 3955 } 3956 3957 return r; 3958 } 3959 }); 3960 var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, 3961 rleadingWhitespace = /^\s+/, 3962 rxhtmlTag = /(<([\w:]+)[^>]*?)\/>/g, 3963 rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i, 3964 rtagName = /<([\w:]+)/, 3965 rtbody = /<tbody/i, 3966 rhtml = /<|&#?\w+;/, 3967 rnocache = /<script|<object|<embed|<option|<style/i, 3968 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, // checked="checked" or checked (html5) 3969 fcloseTag = function( all, front, tag ) { 3970 return rselfClosing.test( tag ) ? 3971 all : 3972 front + "></" + tag + ">"; 3973 }, 3974 wrapMap = { 3975 option: [ 1, "<select multiple='multiple'>", "</select>" ], 3976 legend: [ 1, "<fieldset>", "</fieldset>" ], 3977 thead: [ 1, "<table>", "</table>" ], 3978 tr: [ 2, "<table><tbody>", "</tbody></table>" ], 3979 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], 3980 col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ], 3981 area: [ 1, "<map>", "</map>" ], 3982 _default: [ 0, "", "" ] 3983 }; 3984 3985 wrapMap.optgroup = wrapMap.option; 3986 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; 3987 wrapMap.th = wrapMap.td; 3988 3989 // IE can't serialize <link> and <script> tags normally 3990 if ( !jQuery.support.htmlSerialize ) { 3991 wrapMap._default = [ 1, "div<div>", "</div>" ]; 3992 } 3993 3994 jQuery.fn.extend({ 3995 text: function( text ) { 3996 if ( jQuery.isFunction(text) ) { 3997 return this.each(function(i) { 3998 var self = jQuery(this); 3999 self.text( text.call(this, i, self.text()) ); 4000 }); 4001 } 4002 4003 if ( typeof text !== "object" && text !== undefined ) { 4004 return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); 4005 } 4006 4007 return jQuery.text( this ); 4008 }, 4009 4010 wrapAll: function( html ) { 4011 if ( jQuery.isFunction( html ) ) { 4012 return this.each(function(i) { 4013 jQuery(this).wrapAll( html.call(this, i) ); 4014 }); 4015 } 4016 4017 if ( this[0] ) { 4018 // The elements to wrap the target around 4019 var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); 4020 4021 if ( this[0].parentNode ) { 4022 wrap.insertBefore( this[0] ); 4023 } 4024 4025 wrap.map(function() { 4026 var elem = this; 4027 4028 while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { 4029 elem = elem.firstChild; 4030 } 4031 4032 return elem; 4033 }).append(this); 4034 } 4035 4036 return this; 4037 }, 4038 4039 wrapInner: function( html ) { 4040 if ( jQuery.isFunction( html ) ) { 4041 return this.each(function(i) { 4042 jQuery(this).wrapInner( html.call(this, i) ); 4043 }); 4044 } 4045 4046 return this.each(function() { 4047 var self = jQuery( this ), contents = self.contents(); 4048 4049 if ( contents.length ) { 4050 contents.wrapAll( html ); 4051 4052 } else { 4053 self.append( html ); 4054 } 4055 }); 4056 }, 4057 4058 wrap: function( html ) { 4059 return this.each(function() { 4060 jQuery( this ).wrapAll( html ); 4061 }); 4062 }, 4063 4064 unwrap: function() { 4065 return this.parent().each(function() { 4066 if ( !jQuery.nodeName( this, "body" ) ) { 4067 jQuery( this ).replaceWith( this.childNodes ); 4068 } 4069 }).end(); 4070 }, 4071 4072 append: function() { 4073 return this.domManip(arguments, true, function( elem ) { 4074 if ( this.nodeType === 1 ) { 4075 this.appendChild( elem ); 4076 } 4077 }); 4078 }, 4079 4080 prepend: function() { 4081 return this.domManip(arguments, true, function( elem ) { 4082 if ( this.nodeType === 1 ) { 4083 this.insertBefore( elem, this.firstChild ); 4084 } 4085 }); 4086 }, 4087 4088 before: function() { 4089 if ( this[0] && this[0].parentNode ) { 4090 return this.domManip(arguments, false, function( elem ) { 4091 this.parentNode.insertBefore( elem, this ); 4092 }); 4093 } else if ( arguments.length ) { 4094 var set = jQuery(arguments[0]); 4095 set.push.apply( set, this.toArray() ); 4096 return this.pushStack( set, "before", arguments ); 4097 } 4098 }, 4099 4100 after: function() { 4101 if ( this[0] && this[0].parentNode ) { 4102 return this.domManip(arguments, false, function( elem ) { 4103 this.parentNode.insertBefore( elem, this.nextSibling ); 4104 }); 4105 } else if ( arguments.length ) { 4106 var set = this.pushStack( this, "after", arguments ); 4107 set.push.apply( set, jQuery(arguments[0]).toArray() ); 4108 return set; 4109 } 4110 }, 4111 4112 // keepData is for internal use only--do not document 4113 remove: function( selector, keepData ) { 4114 for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { 4115 if ( !selector || jQuery.filter( selector, [ elem ] ).length ) { 4116 if ( !keepData && elem.nodeType === 1 ) { 4117 jQuery.cleanData( elem.getElementsByTagName("*") ); 4118 jQuery.cleanData( [ elem ] ); 4119 } 4120 4121 if ( elem.parentNode ) { 4122 elem.parentNode.removeChild( elem ); 4123 } 4124 } 4125 } 4126 4127 return this; 4128 }, 4129 4130 empty: function() { 4131 for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { 4132 // Remove element nodes and prevent memory leaks 4133 if ( elem.nodeType === 1 ) { 4134 jQuery.cleanData( elem.getElementsByTagName("*") ); 4135 } 4136 4137 // Remove any remaining nodes 4138 while ( elem.firstChild ) { 4139 elem.removeChild( elem.firstChild ); 4140 } 4141 } 4142 4143 return this; 4144 }, 4145 4146 clone: function( events ) { 4147 // Do the clone 4148 var ret = this.map(function() { 4149 if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) { 4150 // IE copies events bound via attachEvent when 4151 // using cloneNode. Calling detachEvent on the 4152 // clone will also remove the events from the orignal 4153 // In order to get around this, we use innerHTML. 4154 // Unfortunately, this means some modifications to 4155 // attributes in IE that are actually only stored 4156 // as properties will not be copied (such as the 4157 // the name attribute on an input). 4158 var html = this.outerHTML, ownerDocument = this.ownerDocument; 4159 if ( !html ) { 4160 var div = ownerDocument.createElement("div"); 4161 div.appendChild( this.cloneNode(true) ); 4162 html = div.innerHTML; 4163 } 4164 4165 return jQuery.clean([html.replace(rinlinejQuery, "") 4166 // Handle the case in IE 8 where action=/test/> self-closes a tag 4167 .replace(/=([^="'>\s]+\/)>/g, '="$1">') 4168 .replace(rleadingWhitespace, "")], ownerDocument)[0]; 4169 } else { 4170 return this.cloneNode(true); 4171 } 4172 }); 4173 4174 // Copy the events from the original to the clone 4175 if ( events === true ) { 4176 cloneCopyEvent( this, ret ); 4177 cloneCopyEvent( this.find("*"), ret.find("*") ); 4178 } 4179 4180 // Return the cloned set 4181 return ret; 4182 }, 4183 4184 html: function( value ) { 4185 if ( value === undefined ) { 4186 return this[0] && this[0].nodeType === 1 ? 4187 this[0].innerHTML.replace(rinlinejQuery, "") : 4188 null; 4189 4190 // See if we can take a shortcut and just use innerHTML 4191 } else if ( typeof value === "string" && !rnocache.test( value ) && 4192 (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) && 4193 !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) { 4194 4195 value = value.replace(rxhtmlTag, fcloseTag); 4196 4197 try { 4198 for ( var i = 0, l = this.length; i < l; i++ ) { 4199 // Remove element nodes and prevent memory leaks 4200 if ( this[i].nodeType === 1 ) { 4201 jQuery.cleanData( this[i].getElementsByTagName("*") ); 4202 this[i].innerHTML = value; 4203 } 4204 } 4205 4206 // If using innerHTML throws an exception, use the fallback method 4207 } catch(e) { 4208 this.empty().append( value ); 4209 } 4210 4211 } else if ( jQuery.isFunction( value ) ) { 4212 this.each(function(i){ 4213 var self = jQuery(this), old = self.html(); 4214 self.empty().append(function(){ 4215 return value.call( this, i, old ); 4216 }); 4217 }); 4218 4219 } else { 4220 this.empty().append( value ); 4221 } 4222 4223 return this; 4224 }, 4225 4226 replaceWith: function( value ) { 4227 if ( this[0] && this[0].parentNode ) { 4228 // Make sure that the elements are removed from the DOM before they are inserted 4229 // this can help fix replacing a parent with child elements 4230 if ( jQuery.isFunction( value ) ) { 4231 return this.each(function(i) { 4232 var self = jQuery(this), old = self.html(); 4233 self.replaceWith( value.call( this, i, old ) ); 4234 }); 4235 } 4236 4237 if ( typeof value !== "string" ) { 4238 value = jQuery(value).detach(); 4239 } 4240 4241 return this.each(function() { 4242 var next = this.nextSibling, parent = this.parentNode; 4243 4244 jQuery(this).remove(); 4245 4246 if ( next ) { 4247 jQuery(next).before( value ); 4248 } else { 4249 jQuery(parent).append( value ); 4250 } 4251 }); 4252 } else { 4253 return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ); 4254 } 4255 }, 4256 4257 detach: function( selector ) { 4258 return this.remove( selector, true ); 4259 }, 4260 4261 domManip: function( args, table, callback ) { 4262 var results, first, value = args[0], scripts = [], fragment, parent; 4263 4264 // We can't cloneNode fragments that contain checked, in WebKit 4265 if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) { 4266 return this.each(function() { 4267 jQuery(this).domManip( args, table, callback, true ); 4268 }); 4269 } 4270 4271 if ( jQuery.isFunction(value) ) { 4272 return this.each(function(i) { 4273 var self = jQuery(this); 4274 args[0] = value.call(this, i, table ? self.html() : undefined); 4275 self.domManip( args, table, callback ); 4276 }); 4277 } 4278 4279 if ( this[0] ) { 4280 parent = value && value.parentNode; 4281 4282 // If we're in a fragment, just use that instead of building a new one 4283 if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) { 4284 results = { fragment: parent }; 4285 4286 } else { 4287 results = buildFragment( args, this, scripts ); 4288 } 4289 4290 fragment = results.fragment; 4291 4292 if ( fragment.childNodes.length === 1 ) { 4293 first = fragment = fragment.firstChild; 4294 } else { 4295 first = fragment.firstChild; 4296 } 4297 4298 if ( first ) { 4299 table = table && jQuery.nodeName( first, "tr" ); 4300 4301 for ( var i = 0, l = this.length; i < l; i++ ) { 4302 callback.call( 4303 table ? 4304 root(this[i], first) : 4305 this[i], 4306 i > 0 || results.cacheable || this.length > 1 ? 4307 fragment.cloneNode(true) : 4308 fragment 4309 ); 4310 } 4311 } 4312 4313 if ( scripts.length ) { 4314 jQuery.each( scripts, evalScript ); 4315 } 4316 } 4317 4318 return this; 4319 4320 function root( elem, cur ) { 4321 return jQuery.nodeName(elem, "table") ? 4322 (elem.getElementsByTagName("tbody")[0] || 4323 elem.appendChild(elem.ownerDocument.createElement("tbody"))) : 4324 elem; 4325 } 4326 } 4327 }); 4328 4329 function cloneCopyEvent(orig, ret) { 4330 var i = 0; 4331 4332 ret.each(function() { 4333 if ( this.nodeName !== (orig[i] && orig[i].nodeName) ) { 4334 return; 4335 } 4336 4337 var oldData = jQuery.data( orig[i++] ), curData = jQuery.data( this, oldData ), events = oldData && oldData.events; 4338 4339 if ( events ) { 4340 delete curData.handle; 4341 curData.events = {}; 4342 4343 for ( var type in events ) { 4344 for ( var handler in events[ type ] ) { 4345 jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data ); 4346 } 4347 } 4348 } 4349 }); 4350 } 4351 4352 function buildFragment( args, nodes, scripts ) { 4353 var fragment, cacheable, cacheresults, 4354 doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document); 4355 4356 // Only cache "small" (1/2 KB) strings that are associated with the main document 4357 // Cloning options loses the selected state, so don't cache them 4358 // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment 4359 // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache 4360 if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document && 4361 !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) { 4362 4363 cacheable = true; 4364 cacheresults = jQuery.fragments[ args[0] ]; 4365 if ( cacheresults ) { 4366 if ( cacheresults !== 1 ) { 4367 fragment = cacheresults; 4368 } 4369 } 4370 } 4371 4372 if ( !fragment ) { 4373 fragment = doc.createDocumentFragment(); 4374 jQuery.clean( args, doc, fragment, scripts ); 4375 } 4376 4377 if ( cacheable ) { 4378 jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1; 4379 } 4380 4381 return { fragment: fragment, cacheable: cacheable }; 4382 } 4383 4384 jQuery.fragments = {}; 4385 4386 jQuery.each({ 4387 appendTo: "append", 4388 prependTo: "prepend", 4389 insertBefore: "before", 4390 insertAfter: "after", 4391 replaceAll: "replaceWith" 4392 }, function( name, original ) { 4393 jQuery.fn[ name ] = function( selector ) { 4394 var ret = [], insert = jQuery( selector ), 4395 parent = this.length === 1 && this[0].parentNode; 4396 4397 if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) { 4398 insert[ original ]( this[0] ); 4399 return this; 4400 4401 } else { 4402 for ( var i = 0, l = insert.length; i < l; i++ ) { 4403 var elems = (i > 0 ? this.clone(true) : this).get(); 4404 jQuery.fn[ original ].apply( jQuery(insert[i]), elems ); 4405 ret = ret.concat( elems ); 4406 } 4407 4408 return this.pushStack( ret, name, insert.selector ); 4409 } 4410 }; 4411 }); 4412 4413 jQuery.extend({ 4414 clean: function( elems, context, fragment, scripts ) { 4415 context = context || document; 4416 4417 // !context.createElement fails in IE with an error but returns typeof 'object' 4418 if ( typeof context.createElement === "undefined" ) { 4419 context = context.ownerDocument || context[0] && context[0].ownerDocument || document; 4420 } 4421 4422 var ret = []; 4423 4424 for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { 4425 if ( typeof elem === "number" ) { 4426 elem += ""; 4427 } 4428 4429 if ( !elem ) { 4430 continue; 4431 } 4432 4433 // Convert html string into DOM nodes 4434 if ( typeof elem === "string" && !rhtml.test( elem ) ) { 4435 elem = context.createTextNode( elem ); 4436 4437 } else if ( typeof elem === "string" ) { 4438 // Fix "XHTML"-style tags in all browsers 4439 elem = elem.replace(rxhtmlTag, fcloseTag); 4440 4441 // Trim whitespace, otherwise indexOf won't work as expected 4442 var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(), 4443 wrap = wrapMap[ tag ] || wrapMap._default, 4444 depth = wrap[0], 4445 div = context.createElement("div"); 4446 4447 // Go to html and back, then peel off extra wrappers 4448 div.innerHTML = wrap[1] + elem + wrap[2]; 4449 4450 // Move to the right depth 4451 while ( depth-- ) { 4452 div = div.lastChild; 4453 } 4454 4455 // Remove IE's autoinserted <tbody> from table fragments 4456 if ( !jQuery.support.tbody ) { 4457 4458 // String was a <table>, *may* have spurious <tbody> 4459 var hasBody = rtbody.test(elem), 4460 tbody = tag === "table" && !hasBody ? 4461 div.firstChild && div.firstChild.childNodes : 4462 4463 // String was a bare <thead> or <tfoot> 4464 wrap[1] === "<table>" && !hasBody ? 4465 div.childNodes : 4466 []; 4467 4468 for ( var j = tbody.length - 1; j >= 0 ; --j ) { 4469 if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) { 4470 tbody[ j ].parentNode.removeChild( tbody[ j ] ); 4471 } 4472 } 4473 4474 } 4475 4476 // IE completely kills leading whitespace when innerHTML is used 4477 if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { 4478 div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild ); 4479 } 4480 4481 elem = div.childNodes; 4482 } 4483 4484 if ( elem.nodeType ) { 4485 ret.push( elem ); 4486 } else { 4487 ret = jQuery.merge( ret, elem ); 4488 } 4489 } 4490 4491 if ( fragment ) { 4492 for ( var i = 0; ret[i]; i++ ) { 4493 if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) { 4494 scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] ); 4495 4496 } else { 4497 if ( ret[i].nodeType === 1 ) { 4498 ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) ); 4499 } 4500 fragment.appendChild( ret[i] ); 4501 } 4502 } 4503 } 4504 4505 return ret; 4506 }, 4507 4508 cleanData: function( elems ) { 4509 var data, id, cache = jQuery.cache, 4510 special = jQuery.event.special, 4511 deleteExpando = jQuery.support.deleteExpando; 4512 4513 for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { 4514 id = elem[ jQuery.expando ]; 4515 4516 if ( id ) { 4517 data = cache[ id ]; 4518 4519 if ( data.events ) { 4520 for ( var type in data.events ) { 4521 if ( special[ type ] ) { 4522 jQuery.event.remove( elem, type ); 4523 4524 } else { 4525 removeEvent( elem, type, data.handle ); 4526 } 4527 } 4528 } 4529 4530 if ( deleteExpando ) { 4531 delete elem[ jQuery.expando ]; 4532 4533 } else if ( elem.removeAttribute ) { 4534 elem.removeAttribute( jQuery.expando ); 4535 } 4536 4537 delete cache[ id ]; 4538 } 4539 } 4540 } 4541 }); 4542 // exclude the following css properties to add px 4543 var rexclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, 4544 ralpha = /alpha\([^)]*\)/, 4545 ropacity = /opacity=([^)]*)/, 4546 rfloat = /float/i, 4547 rdashAlpha = /-([a-z])/ig, 4548 rupper = /([A-Z])/g, 4549 rnumpx = /^-?\d+(?:px)?$/i, 4550 rnum = /^-?\d/, 4551 4552 cssShow = { position: "absolute", visibility: "hidden", display:"block" }, 4553 cssWidth = [ "Left", "Right" ], 4554 cssHeight = [ "Top", "Bottom" ], 4555 4556 // cache check for defaultView.getComputedStyle 4557 getComputedStyle = document.defaultView && document.defaultView.getComputedStyle, 4558 // normalize float css property 4559 styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat", 4560 fcamelCase = function( all, letter ) { 4561 return letter.toUpperCase(); 4562 }; 4563 4564 jQuery.fn.css = function( name, value ) { 4565 return access( this, name, value, true, function( elem, name, value ) { 4566 if ( value === undefined ) { 4567 return jQuery.curCSS( elem, name ); 4568 } 4569 4570 if ( typeof value === "number" && !rexclude.test(name) ) { 4571 value += "px"; 4572 } 4573 4574 jQuery.style( elem, name, value ); 4575 }); 4576 }; 4577 4578 jQuery.extend({ 4579 style: function( elem, name, value ) { 4580 // don't set styles on text and comment nodes 4581 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { 4582 return undefined; 4583 } 4584 4585 // ignore negative width and height values #1599 4586 if ( (name === "width" || name === "height") && parseFloat(value) < 0 ) { 4587 value = undefined; 4588 } 4589 4590 var style = elem.style || elem, set = value !== undefined; 4591 4592 // IE uses filters for opacity 4593 if ( !jQuery.support.opacity && name === "opacity" ) { 4594 if ( set ) { 4595 // IE has trouble with opacity if it does not have layout 4596 // Force it by setting the zoom level 4597 style.zoom = 1; 4598 4599 // Set the alpha filter to set the opacity 4600 var opacity = parseInt( value, 10 ) + "" === "NaN" ? "" : "alpha(opacity=" + value * 100 + ")"; 4601 var filter = style.filter || jQuery.curCSS( elem, "filter" ) || ""; 4602 style.filter = ralpha.test(filter) ? filter.replace(ralpha, opacity) : opacity; 4603 } 4604 4605 return style.filter && style.filter.indexOf("opacity=") >= 0 ? 4606 (parseFloat( ropacity.exec(style.filter)[1] ) / 100) + "": 4607 ""; 4608 } 4609 4610 // Make sure we're using the right name for getting the float value 4611 if ( rfloat.test( name ) ) { 4612 name = styleFloat; 4613 } 4614 4615 name = name.replace(rdashAlpha, fcamelCase); 4616 4617 if ( set ) { 4618 style[ name ] = value; 4619 } 4620 4621 return style[ name ]; 4622 }, 4623 4624 css: function( elem, name, force, extra ) { 4625 if ( name === "width" || name === "height" ) { 4626 var val, props = cssShow, which = name === "width" ? cssWidth : cssHeight; 4627 4628 function getWH() { 4629 val = name === "width" ? elem.offsetWidth : elem.offsetHeight; 4630 4631 if ( extra === "border" ) { 4632 return; 4633 } 4634 4635 jQuery.each( which, function() { 4636 if ( !extra ) { 4637 val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; 4638 } 4639 4640 if ( extra === "margin" ) { 4641 val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0; 4642 } else { 4643 val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; 4644 } 4645 }); 4646 } 4647 4648 if ( elem.offsetWidth !== 0 ) { 4649 getWH(); 4650 } else { 4651 jQuery.swap( elem, props, getWH ); 4652 } 4653 4654 return Math.max(0, Math.round(val)); 4655 } 4656 4657 return jQuery.curCSS( elem, name, force ); 4658 }, 4659 4660 curCSS: function( elem, name, force ) { 4661 var ret, style = elem.style, filter; 4662 4663 // IE uses filters for opacity 4664 if ( !jQuery.support.opacity && name === "opacity" && elem.currentStyle ) { 4665 ret = ropacity.test(elem.currentStyle.filter || "") ? 4666 (parseFloat(RegExp.$1) / 100) + "" : 4667 ""; 4668 4669 return ret === "" ? 4670 "1" : 4671 ret; 4672 } 4673 4674 // Make sure we're using the right name for getting the float value 4675 if ( rfloat.test( name ) ) { 4676 name = styleFloat; 4677 } 4678 4679 if ( !force && style && style[ name ] ) { 4680 ret = style[ name ]; 4681 4682 } else if ( getComputedStyle ) { 4683 4684 // Only "float" is needed here 4685 if ( rfloat.test( name ) ) { 4686 name = "float"; 4687 } 4688 4689 name = name.replace( rupper, "-$1" ).toLowerCase(); 4690 4691 var defaultView = elem.ownerDocument.defaultView; 4692 4693 if ( !defaultView ) { 4694 return null; 4695 } 4696 4697 var computedStyle = defaultView.getComputedStyle( elem, null ); 4698 4699 if ( computedStyle ) { 4700 ret = computedStyle.getPropertyValue( name ); 4701 } 4702 4703 // We should always get a number back from opacity 4704 if ( name === "opacity" && ret === "" ) { 4705 ret = "1"; 4706 } 4707 4708 } else if ( elem.currentStyle ) { 4709 var camelCase = name.replace(rdashAlpha, fcamelCase); 4710 4711 ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; 4712 4713 // From the awesome hack by Dean Edwards 4714 // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 4715 4716 // If we're not dealing with a regular pixel number 4717 // but a number that has a weird ending, we need to convert it to pixels 4718 if ( !rnumpx.test( ret ) && rnum.test( ret ) ) { 4719 // Remember the original values 4720 var left = style.left, rsLeft = elem.runtimeStyle.left; 4721 4722 // Put in the new values to get a computed value out 4723 elem.runtimeStyle.left = elem.currentStyle.left; 4724 style.left = camelCase === "fontSize" ? "1em" : (ret || 0); 4725 ret = style.pixelLeft + "px"; 4726 4727 // Revert the changed values 4728 style.left = left; 4729 elem.runtimeStyle.left = rsLeft; 4730 } 4731 } 4732 4733 return ret; 4734 }, 4735 4736 // A method for quickly swapping in/out CSS properties to get correct calculations 4737 swap: function( elem, options, callback ) { 4738 var old = {}; 4739 4740 // Remember the old values, and insert the new ones 4741 for ( var name in options ) { 4742 old[ name ] = elem.style[ name ]; 4743 elem.style[ name ] = options[ name ]; 4744 } 4745 4746 callback.call( elem ); 4747 4748 // Revert the old values 4749 for ( var name in options ) { 4750 elem.style[ name ] = old[ name ]; 4751 } 4752 } 4753 }); 4754 4755 if ( jQuery.expr && jQuery.expr.filters ) { 4756 jQuery.expr.filters.hidden = function( elem ) { 4757 var width = elem.offsetWidth, height = elem.offsetHeight, 4758 skip = elem.nodeName.toLowerCase() === "tr"; 4759 4760 return width === 0 && height === 0 && !skip ? 4761 true : 4762 width > 0 && height > 0 && !skip ? 4763 false : 4764 jQuery.curCSS(elem, "display") === "none"; 4765 }; 4766 4767 jQuery.expr.filters.visible = function( elem ) { 4768 return !jQuery.expr.filters.hidden( elem ); 4769 }; 4770 } 4771 var jsc = now(), 4772 rscript = /<script(.|\s)*?\/script>/gi, 4773 rselectTextarea = /select|textarea/i, 4774 rinput = /color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i, 4775 jsre = /=\?(&|$)/, 4776 rquery = /\?/, 4777 rts = /(\?|&)_=.*?(&|$)/, 4778 rurl = /^(\w+:)?\/\/([^\/?#]+)/, 4779 r20 = /%20/g, 4780 4781 // Keep a copy of the old load method 4782 _load = jQuery.fn.load; 4783 4784 jQuery.fn.extend({ 4785 load: function( url, params, callback ) { 4786 if ( typeof url !== "string" ) { 4787 return _load.call( this, url ); 4788 4789 // Don't do a request if no elements are being requested 4790 } else if ( !this.length ) { 4791 return this; 4792 } 4793 4794 var off = url.indexOf(" "); 4795 if ( off >= 0 ) { 4796 var selector = url.slice(off, url.length); 4797 url = url.slice(0, off); 4798 } 4799 4800 // Default to a GET request 4801 var type = "GET"; 4802 4803 // If the second parameter was provided 4804 if ( params ) { 4805 // If it's a function 4806 if ( jQuery.isFunction( params ) ) { 4807 // We assume that it's the callback 4808 callback = params; 4809 params = null; 4810 4811 // Otherwise, build a param string 4812 } else if ( typeof params === "object" ) { 4813 params = jQuery.param( params, jQuery.ajaxSettings.traditional ); 4814 type = "POST"; 4815 } 4816 } 4817 4818 var self = this; 4819 4820 // Request the remote document 4821 jQuery.ajax({ 4822 url: url, 4823 type: type, 4824 dataType: "html", 4825 data: params, 4826 complete: function( res, status ) { 4827 // If successful, inject the HTML into all the matched elements 4828 if ( status === "success" || status === "notmodified" ) { 4829 // See if a selector was specified 4830 self.html( selector ? 4831 // Create a dummy div to hold the results 4832 jQuery("<div />") 4833 // inject the contents of the document in, removing the scripts 4834 // to avoid any 'Permission Denied' errors in IE 4835 .append(res.responseText.replace(rscript, "")) 4836 4837 // Locate the specified elements 4838 .find(selector) : 4839 4840 // If not, just inject the full result 4841 res.responseText ); 4842 } 4843 4844 if ( callback ) { 4845 self.each( callback, [res.responseText, status, res] ); 4846 } 4847 } 4848 }); 4849 4850 return this; 4851 }, 4852 4853 serialize: function() { 4854 return jQuery.param(this.serializeArray()); 4855 }, 4856 serializeArray: function() { 4857 return this.map(function() { 4858 return this.elements ? jQuery.makeArray(this.elements) : this; 4859 }) 4860 .filter(function() { 4861 return this.name && !this.disabled && 4862 (this.checked || rselectTextarea.test(this.nodeName) || 4863 rinput.test(this.type)); 4864 }) 4865 .map(function( i, elem ) { 4866 var val = jQuery(this).val(); 4867 4868 return val == null ? 4869 null : 4870 jQuery.isArray(val) ? 4871 jQuery.map( val, function( val, i ) { 4872 return { name: elem.name, value: val }; 4873 }) : 4874 { name: elem.name, value: val }; 4875 }).get(); 4876 } 4877 }); 4878 4879 // Attach a bunch of functions for handling common AJAX events 4880 jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function( i, o ) { 4881 jQuery.fn[o] = function( f ) { 4882 return this.bind(o, f); 4883 }; 4884 }); 4885 4886 jQuery.extend({ 4887 4888 get: function( url, data, callback, type ) { 4889 // shift arguments if data argument was omited 4890 if ( jQuery.isFunction( data ) ) { 4891 type = type || callback; 4892 callback = data; 4893 data = null; 4894 } 4895 4896 return jQuery.ajax({ 4897 type: "GET", 4898 url: url, 4899 data: data, 4900 success: callback, 4901 dataType: type 4902 }); 4903 }, 4904 4905 getScript: function( url, callback ) { 4906 return jQuery.get(url, null, callback, "script"); 4907 }, 4908 4909 getJSON: function( url, data, callback ) { 4910 return jQuery.get(url, data, callback, "json"); 4911 }, 4912 4913 post: function( url, data, callback, type ) { 4914 // shift arguments if data argument was omited 4915 if ( jQuery.isFunction( data ) ) { 4916 type = type || callback; 4917 callback = data; 4918 data = {}; 4919 } 4920 4921 return jQuery.ajax({ 4922 type: "POST", 4923 url: url, 4924 data: data, 4925 success: callback, 4926 dataType: type 4927 }); 4928 }, 4929 4930 ajaxSetup: function( settings ) { 4931 jQuery.extend( jQuery.ajaxSettings, settings ); 4932 }, 4933 4934 ajaxSettings: { 4935 url: location.href, 4936 global: true, 4937 type: "GET", 4938 contentType: "application/x-www-form-urlencoded", 4939 processData: true, 4940 async: true, 4941 /* 4942 timeout: 0, 4943 data: null, 4944 username: null, 4945 password: null, 4946 traditional: false, 4947 */ 4948 // Create the request object; Microsoft failed to properly 4949 // implement the XMLHttpRequest in IE7 (can't request local files), 4950 // so we use the ActiveXObject when it is available 4951 // This function can be overriden by calling jQuery.ajaxSetup 4952 xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ? 4953 function() { 4954 return new window.XMLHttpRequest(); 4955 } : 4956 function() { 4957 try { 4958 return new window.ActiveXObject("Microsoft.XMLHTTP"); 4959 } catch(e) {} 4960 }, 4961 accepts: { 4962 xml: "application/xml, text/xml", 4963 html: "text/html", 4964 script: "text/javascript, application/javascript", 4965 json: "application/json, text/javascript", 4966 text: "text/plain", 4967 _default: "*/*" 4968 } 4969 }, 4970 4971 // Last-Modified header cache for next request 4972 lastModified: {}, 4973 etag: {}, 4974 4975 ajax: function( origSettings ) { 4976 var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings); 4977 4978 var jsonp, status, data, 4979 callbackContext = origSettings && origSettings.context || s, 4980 type = s.type.toUpperCase(); 4981 4982 // convert data if not already a string 4983 if ( s.data && s.processData && typeof s.data !== "string" ) { 4984 s.data = jQuery.param( s.data, s.traditional ); 4985 } 4986 4987 // Handle JSONP Parameter Callbacks 4988 if ( s.dataType === "jsonp" ) { 4989 if ( type === "GET" ) { 4990 if ( !jsre.test( s.url ) ) { 4991 s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?"; 4992 } 4993 } else if ( !s.data || !jsre.test(s.data) ) { 4994 s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?"; 4995 } 4996 s.dataType = "json"; 4997 } 4998 4999 // Build temporary JSONP function 5000 if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) { 5001 jsonp = s.jsonpCallback || ("jsonp" + jsc++); 5002 5003 // Replace the =? sequence both in the query string and the data 5004 if ( s.data ) { 5005 s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1"); 5006 } 5007 5008 s.url = s.url.replace(jsre, "=" + jsonp + "$1"); 5009 5010 // We need to make sure 5011 // that a JSONP style response is executed properly 5012 s.dataType = "script"; 5013 5014 // Handle JSONP-style loading 5015 window[ jsonp ] = window[ jsonp ] || function( tmp ) { 5016 data = tmp; 5017 success(); 5018 complete(); 5019 // Garbage collect 5020 window[ jsonp ] = undefined; 5021 5022 try { 5023 delete window[ jsonp ]; 5024 } catch(e) {} 5025 5026 if ( head ) { 5027 head.removeChild( script ); 5028 } 5029 }; 5030 } 5031 5032 if ( s.dataType === "script" && s.cache === null ) { 5033 s.cache = false; 5034 } 5035 5036 if ( s.cache === false && type === "GET" ) { 5037 var ts = now(); 5038 5039 // try replacing _= if it is there 5040 var ret = s.url.replace(rts, "$1_=" + ts + "$2"); 5041 5042 // if nothing was replaced, add timestamp to the end 5043 s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : ""); 5044 } 5045 5046 // If data is available, append data to url for get requests 5047 if ( s.data && type === "GET" ) { 5048 s.url += (rquery.test(s.url) ? "&" : "?") + s.data; 5049 } 5050 5051 // Watch for a new set of requests 5052 if ( s.global && ! jQuery.active++ ) { 5053 jQuery.event.trigger( "ajaxStart" ); 5054 } 5055 5056 // Matches an absolute URL, and saves the domain 5057 var parts = rurl.exec( s.url ), 5058 remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host); 5059 5060 // If we're requesting a remote document 5061 // and trying to load JSON or Script with a GET 5062 if ( s.dataType === "script" && type === "GET" && remote ) { 5063 var head = document.getElementsByTagName("head")[0] || document.documentElement; 5064 var script = document.createElement("script"); 5065 script.src = s.url; 5066 if ( s.scriptCharset ) { 5067 script.charset = s.scriptCharset; 5068 } 5069 5070 // Handle Script loading 5071 if ( !jsonp ) { 5072 var done = false; 5073 5074 // Attach handlers for all browsers 5075 script.onload = script.onreadystatechange = function() { 5076 if ( !done && (!this.readyState || 5077 this.readyState === "loaded" || this.readyState === "complete") ) { 5078 done = true; 5079 success(); 5080 complete(); 5081 5082 // Handle memory leak in IE 5083 script.onload = script.onreadystatechange = null; 5084 if ( head && script.parentNode ) { 5085 head.removeChild( script ); 5086 } 5087 } 5088 }; 5089 } 5090 5091 // Use insertBefore instead of appendChild to circumvent an IE6 bug. 5092 // This arises when a base node is used (#2709 and #4378). 5093 head.insertBefore( script, head.firstChild ); 5094 5095 // We handle everything using the script element injection 5096 return undefined; 5097 } 5098 5099 var requestDone = false; 5100 5101 // Create the request object 5102 var xhr = s.xhr(); 5103 5104 if ( !xhr ) { 5105 return; 5106 } 5107 5108 // Open the socket 5109 // Passing null username, generates a login popup on Opera (#2865) 5110 if ( s.username ) { 5111 xhr.open(type, s.url, s.async, s.username, s.password); 5112 } else { 5113 xhr.open(type, s.url, s.async); 5114 } 5115 5116 // Need an extra try/catch for cross domain requests in Firefox 3 5117 try { 5118 // Set the correct header, if data is being sent 5119 if ( s.data || origSettings && origSettings.contentType ) { 5120 xhr.setRequestHeader("Content-Type", s.contentType); 5121 } 5122 5123 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 5124 if ( s.ifModified ) { 5125 if ( jQuery.lastModified[s.url] ) { 5126 xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]); 5127 } 5128 5129 if ( jQuery.etag[s.url] ) { 5130 xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]); 5131 } 5132 } 5133 5134 // Set header so the called script knows that it's an XMLHttpRequest 5135 // Only send the header if it's not a remote XHR 5136 if ( !remote ) { 5137 xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 5138 } 5139 5140 // Set the Accepts header for the server, depending on the dataType 5141 xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ? 5142 s.accepts[ s.dataType ] + ", */*" : 5143 s.accepts._default ); 5144 } catch(e) {} 5145 5146 // Allow custom headers/mimetypes and early abort 5147 if ( s.beforeSend && s.beforeSend.call(callbackContext, xhr, s) === false ) { 5148 // Handle the global AJAX counter 5149 if ( s.global && ! --jQuery.active ) { 5150 jQuery.event.trigger( "ajaxStop" ); 5151 } 5152 5153 // close opended socket 5154 xhr.abort(); 5155 return false; 5156 } 5157 5158 if ( s.global ) { 5159 trigger("ajaxSend", [xhr, s]); 5160 } 5161 5162 // Wait for a response to come back 5163 var onreadystatechange = xhr.onreadystatechange = function( isTimeout ) { 5164 // The request was aborted 5165 if ( !xhr || xhr.readyState === 0 || isTimeout === "abort" ) { 5166 // Opera doesn't call onreadystatechange before this point 5167 // so we simulate the call 5168 if ( !requestDone ) { 5169 complete(); 5170 } 5171 5172 requestDone = true; 5173 if ( xhr ) { 5174 xhr.onreadystatechange = jQuery.noop; 5175 } 5176 5177 // The transfer is complete and the data is available, or the request timed out 5178 } else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) { 5179 requestDone = true; 5180 xhr.onreadystatechange = jQuery.noop; 5181 5182 status = isTimeout === "timeout" ? 5183 "timeout" : 5184 !jQuery.httpSuccess( xhr ) ? 5185 "error" : 5186 s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? 5187 "notmodified" : 5188 "success"; 5189 5190 var errMsg; 5191 5192 if ( status === "success" ) { 5193 // Watch for, and catch, XML document parse errors 5194 try { 5195 // process the data (runs the xml through httpData regardless of callback) 5196 data = jQuery.httpData( xhr, s.dataType, s ); 5197 } catch(err) { 5198 status = "parsererror"; 5199 errMsg = err; 5200 } 5201 } 5202 5203 // Make sure that the request was successful or notmodified 5204 if ( status === "success" || status === "notmodified" ) { 5205 // JSONP handles its own success callback 5206 if ( !jsonp ) { 5207 success(); 5208 } 5209 } else { 5210 jQuery.handleError(s, xhr, status, errMsg); 5211 } 5212 5213 // Fire the complete handlers 5214 complete(); 5215 5216 if ( isTimeout === "timeout" ) { 5217 xhr.abort(); 5218 } 5219 5220 // Stop memory leaks 5221 if ( s.async ) { 5222 xhr = null; 5223 } 5224 } 5225 }; 5226 5227 // Override the abort handler, if we can (IE doesn't allow it, but that's OK) 5228 // Opera doesn't fire onreadystatechange at all on abort 5229 try { 5230 var oldAbort = xhr.abort; 5231 xhr.abort = function() { 5232 if ( xhr ) { 5233 oldAbort.call( xhr ); 5234 } 5235 5236 onreadystatechange( "abort" ); 5237 }; 5238 } catch(e) { } 5239 5240 // Timeout checker 5241 if ( s.async && s.timeout > 0 ) { 5242 setTimeout(function() { 5243 // Check to see if the request is still happening 5244 if ( xhr && !requestDone ) { 5245 onreadystatechange( "timeout" ); 5246 } 5247 }, s.timeout); 5248 } 5249 5250 // Send the data 5251 try { 5252 xhr.send( type === "POST" || type === "PUT" || type === "DELETE" ? s.data : null ); 5253 } catch(e) { 5254 jQuery.handleError(s, xhr, null, e); 5255 // Fire the complete handlers 5256 complete(); 5257 } 5258 5259 // firefox 1.5 doesn't fire statechange for sync requests 5260 if ( !s.async ) { 5261 onreadystatechange(); 5262 } 5263 5264 function success() { 5265 // If a local callback was specified, fire it and pass it the data 5266 if ( s.success ) { 5267 s.success.call( callbackContext, data, status, xhr ); 5268 } 5269 5270 // Fire the global callback 5271 if ( s.global ) { 5272 trigger( "ajaxSuccess", [xhr, s] ); 5273 } 5274 } 5275 5276 function complete() { 5277 // Process result 5278 if ( s.complete ) { 5279 s.complete.call( callbackContext, xhr, status); 5280 } 5281 5282 // The request was completed 5283 if ( s.global ) { 5284 trigger( "ajaxComplete", [xhr, s] ); 5285 } 5286 5287 // Handle the global AJAX counter 5288 if ( s.global && ! --jQuery.active ) { 5289 jQuery.event.trigger( "ajaxStop" ); 5290 } 5291 } 5292 5293 function trigger(type, args) { 5294 (s.context ? jQuery(s.context) : jQuery.event).trigger(type, args); 5295 } 5296 5297 // return XMLHttpRequest to allow aborting the request etc. 5298 return xhr; 5299 }, 5300 5301 handleError: function( s, xhr, status, e ) { 5302 // If a local callback was specified, fire it 5303 if ( s.error ) { 5304 s.error.call( s.context || s, xhr, status, e ); 5305 } 5306 5307 // Fire the global callback 5308 if ( s.global ) { 5309 (s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] ); 5310 } 5311 }, 5312 5313 // Counter for holding the number of active queries 5314 active: 0, 5315 5316 // Determines if an XMLHttpRequest was successful or not 5317 httpSuccess: function( xhr ) { 5318 try { 5319 // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450 5320 return !xhr.status && location.protocol === "file:" || 5321 // Opera returns 0 when status is 304 5322 ( xhr.status >= 200 && xhr.status < 300 ) || 5323 xhr.status === 304 || xhr.status === 1223 || xhr.status === 0; 5324 } catch(e) {} 5325 5326 return false; 5327 }, 5328 5329 // Determines if an XMLHttpRequest returns NotModified 5330 httpNotModified: function( xhr, url ) { 5331 var lastModified = xhr.getResponseHeader("Last-Modified"), 5332 etag = xhr.getResponseHeader("Etag"); 5333 5334 if ( lastModified ) { 5335 jQuery.lastModified[url] = lastModified; 5336 } 5337 5338 if ( etag ) { 5339 jQuery.etag[url] = etag; 5340 } 5341 5342 // Opera returns 0 when status is 304 5343 return xhr.status === 304 || xhr.status === 0; 5344 }, 5345 5346 httpData: function( xhr, type, s ) { 5347 var ct = xhr.getResponseHeader("content-type") || "", 5348 xml = type === "xml" || !type && ct.indexOf("xml") >= 0, 5349 data = xml ? xhr.responseXML : xhr.responseText; 5350 5351 if ( xml && data.documentElement.nodeName === "parsererror" ) { 5352 jQuery.error( "parsererror" ); 5353 } 5354 5355 // Allow a pre-filtering function to sanitize the response 5356 // s is checked to keep backwards compatibility 5357 if ( s && s.dataFilter ) { 5358 data = s.dataFilter( data, type ); 5359 } 5360 5361 // The filter can actually parse the response 5362 if ( typeof data === "string" ) { 5363 // Get the JavaScript object, if JSON is used. 5364 if ( type === "json" || !type && ct.indexOf("json") >= 0 ) { 5365 data = jQuery.parseJSON( data ); 5366 5367 // If the type is "script", eval it in global context 5368 } else if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) { 5369 jQuery.globalEval( data ); 5370 } 5371 } 5372 5373 return data; 5374 }, 5375 5376 // Serialize an array of form elements or a set of 5377 // key/values into a query string 5378 param: function( a, traditional ) { 5379 var s = []; 5380 5381 // Set traditional to true for jQuery <= 1.3.2 behavior. 5382 if ( traditional === undefined ) { 5383 traditional = jQuery.ajaxSettings.traditional; 5384 } 5385 5386 // If an array was passed in, assume that it is an array of form elements. 5387 if ( jQuery.isArray(a) || a.jquery ) { 5388 // Serialize the form elements 5389 jQuery.each( a, function() { 5390 add( this.name, this.value ); 5391 }); 5392 5393 } else { 5394 // If traditional, encode the "old" way (the way 1.3.2 or older 5395 // did it), otherwise encode params recursively. 5396 for ( var prefix in a ) { 5397 buildParams( prefix, a[prefix] ); 5398 } 5399 } 5400 5401 // Return the resulting serialization 5402 return s.join("&").replace(r20, "+"); 5403 5404 function buildParams( prefix, obj ) { 5405 if ( jQuery.isArray(obj) ) { 5406 // Serialize array item. 5407 jQuery.each( obj, function( i, v ) { 5408 if ( traditional || /\[\]$/.test( prefix ) ) { 5409 // Treat each array item as a scalar. 5410 add( prefix, v ); 5411 } else { 5412 // If array item is non-scalar (array or object), encode its 5413 // numeric index to resolve deserialization ambiguity issues. 5414 // Note that rack (as of 1.0.0) can't currently deserialize 5415 // nested arrays properly, and attempting to do so may cause 5416 // a server error. Possible fixes are to modify rack's 5417 // deserialization algorithm or to provide an option or flag 5418 // to force array serialization to be shallow. 5419 buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v ); 5420 } 5421 }); 5422 5423 } else if ( !traditional && obj != null && typeof obj === "object" ) { 5424 // Serialize object item. 5425 jQuery.each( obj, function( k, v ) { 5426 buildParams( prefix + "[" + k + "]", v ); 5427 }); 5428 5429 } else { 5430 // Serialize scalar item. 5431 add( prefix, obj ); 5432 } 5433 } 5434 5435 function add( key, value ) { 5436 // If value is a function, invoke it and return its value 5437 value = jQuery.isFunction(value) ? value() : value; 5438 s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value); 5439 } 5440 } 5441 }); 5442 var elemdisplay = {}, 5443 rfxtypes = /toggle|show|hide/, 5444 rfxnum = /^([+-]=)?([\d+-.]+)(.*)$/, 5445 timerId, 5446 fxAttrs = [ 5447 // height animations 5448 [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ], 5449 // width animations 5450 [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ], 5451 // opacity animations 5452 [ "opacity" ] 5453 ]; 5454 5455 jQuery.fn.extend({ 5456 show: function( speed, callback ) { 5457 if ( speed || speed === 0) { 5458 return this.animate( genFx("show", 3), speed, callback); 5459 5460 } else { 5461 for ( var i = 0, l = this.length; i < l; i++ ) { 5462 var old = jQuery.data(this[i], "olddisplay"); 5463 5464 this[i].style.display = old || ""; 5465 5466 if ( jQuery.css(this[i], "display") === "none" ) { 5467 var nodeName = this[i].nodeName, display; 5468 5469 if ( elemdisplay[ nodeName ] ) { 5470 display = elemdisplay[ nodeName ]; 5471 5472 } else { 5473 var elem = jQuery("<" + nodeName + " />").appendTo("body"); 5474 5475 display = elem.css("display"); 5476 5477 if ( display === "none" ) { 5478 display = "block"; 5479 } 5480 5481 elem.remove(); 5482 5483 elemdisplay[ nodeName ] = display; 5484 } 5485 5486 jQuery.data(this[i], "olddisplay", display); 5487 } 5488 } 5489 5490 // Set the display of the elements in a second loop 5491 // to avoid the constant reflow 5492 for ( var j = 0, k = this.length; j < k; j++ ) { 5493 this[j].style.display = jQuery.data(this[j], "olddisplay") || ""; 5494 } 5495 5496 return this; 5497 } 5498 }, 5499 5500 hide: function( speed, callback ) { 5501 if ( speed || speed === 0 ) { 5502 return this.animate( genFx("hide", 3), speed, callback); 5503 5504 } else { 5505 for ( var i = 0, l = this.length; i < l; i++ ) { 5506 var old = jQuery.data(this[i], "olddisplay"); 5507 if ( !old && old !== "none" ) { 5508 jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display")); 5509 } 5510 } 5511 5512 // Set the display of the elements in a second loop 5513 // to avoid the constant reflow 5514 for ( var j = 0, k = this.length; j < k; j++ ) { 5515 this[j].style.display = "none"; 5516 } 5517 5518 return this; 5519 } 5520 }, 5521 5522 // Save the old toggle function 5523 _toggle: jQuery.fn.toggle, 5524 5525 toggle: function( fn, fn2 ) { 5526 var bool = typeof fn === "boolean"; 5527 5528 if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) { 5529 this._toggle.apply( this, arguments ); 5530 5531 } else if ( fn == null || bool ) { 5532 this.each(function() { 5533 var state = bool ? fn : jQuery(this).is(":hidden"); 5534 jQuery(this)[ state ? "show" : "hide" ](); 5535 }); 5536 5537 } else { 5538 this.animate(genFx("toggle", 3), fn, fn2); 5539 } 5540 5541 return this; 5542 }, 5543 5544 fadeTo: function( speed, to, callback ) { 5545 return this.filter(":hidden").css("opacity", 0).show().end() 5546 .animate({opacity: to}, speed, callback); 5547 }, 5548 5549 animate: function( prop, speed, easing, callback ) { 5550 var optall = jQuery.speed(speed, easing, callback); 5551 5552 if ( jQuery.isEmptyObject( prop ) ) { 5553 return this.each( optall.complete ); 5554 } 5555 5556 return this[ optall.queue === false ? "each" : "queue" ](function() { 5557 var opt = jQuery.extend({}, optall), p, 5558 hidden = this.nodeType === 1 && jQuery(this).is(":hidden"), 5559 self = this; 5560 5561 for ( p in prop ) { 5562 var name = p.replace(rdashAlpha, fcamelCase); 5563 5564 if ( p !== name ) { 5565 prop[ name ] = prop[ p ]; 5566 delete prop[ p ]; 5567 p = name; 5568 } 5569 5570 if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) { 5571 return opt.complete.call(this); 5572 } 5573 5574 if ( ( p === "height" || p === "width" ) && this.style ) { 5575 // Store display property 5576 opt.display = jQuery.css(this, "display"); 5577 5578 // Make sure that nothing sneaks out 5579 opt.overflow = this.style.overflow; 5580 } 5581 5582 if ( jQuery.isArray( prop[p] ) ) { 5583 // Create (if needed) and add to specialEasing 5584 (opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1]; 5585 prop[p] = prop[p][0]; 5586 } 5587 } 5588 5589 if ( opt.overflow != null ) { 5590 this.style.overflow = "hidden"; 5591 } 5592 5593 opt.curAnim = jQuery.extend({}, prop); 5594 5595 jQuery.each( prop, function( name, val ) { 5596 var e = new jQuery.fx( self, opt, name ); 5597 5598 if ( rfxtypes.test(val) ) { 5599 e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop ); 5600 5601 } else { 5602 var parts = rfxnum.exec(val), 5603 start = e.cur(true) || 0; 5604 5605 if ( parts ) { 5606 var end = parseFloat( parts[2] ), 5607 unit = parts[3] || "px"; 5608 5609 // We need to compute starting value 5610 if ( unit !== "px" ) { 5611 self.style[ name ] = (end || 1) + unit; 5612 start = ((end || 1) / e.cur(true)) * start; 5613 self.style[ name ] = start + unit; 5614 } 5615 5616 // If a +=/-= token was provided, we're doing a relative animation 5617 if ( parts[1] ) { 5618 end = ((parts[1] === "-=" ? -1 : 1) * end) + start; 5619 } 5620 5621 e.custom( start, end, unit ); 5622 5623 } else { 5624 e.custom( start, val, "" ); 5625 } 5626 } 5627 }); 5628 5629 // For JS strict compliance 5630 return true; 5631 }); 5632 }, 5633 5634 stop: function( clearQueue, gotoEnd ) { 5635 var timers = jQuery.timers; 5636 5637 if ( clearQueue ) { 5638 this.queue([]); 5639 } 5640 5641 this.each(function() { 5642 // go in reverse order so anything added to the queue during the loop is ignored 5643 for ( var i = timers.length - 1; i >= 0; i-- ) { 5644 if ( timers[i].elem === this ) { 5645 if (gotoEnd) { 5646 // force the next step to be the last 5647 timers[i](true); 5648 } 5649 5650 timers.splice(i, 1); 5651 } 5652 } 5653 }); 5654 5655 // start the next in the queue if the last step wasn't forced 5656 if ( !gotoEnd ) { 5657 this.dequeue(); 5658 } 5659 5660 return this; 5661 } 5662 5663 }); 5664 5665 // Generate shortcuts for custom animations 5666 jQuery.each({ 5667 slideDown: genFx("show", 1), 5668 slideUp: genFx("hide", 1), 5669 slideToggle: genFx("toggle", 1), 5670 fadeIn: { opacity: "show" }, 5671 fadeOut: { opacity: "hide" } 5672 }, function( name, props ) { 5673 jQuery.fn[ name ] = function( speed, callback ) { 5674 return this.animate( props, speed, callback ); 5675 }; 5676 }); 5677 5678 jQuery.extend({ 5679 speed: function( speed, easing, fn ) { 5680 var opt = speed && typeof speed === "object" ? speed : { 5681 complete: fn || !fn && easing || 5682 jQuery.isFunction( speed ) && speed, 5683 duration: speed, 5684 easing: fn && easing || easing && !jQuery.isFunction(easing) && easing 5685 }; 5686 5687 opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : 5688 jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default; 5689 5690 // Queueing 5691 opt.old = opt.complete; 5692 opt.complete = function() { 5693 if ( opt.queue !== false ) { 5694 jQuery(this).dequeue(); 5695 } 5696 if ( jQuery.isFunction( opt.old ) ) { 5697 opt.old.call( this ); 5698 } 5699 }; 5700 5701 return opt; 5702 }, 5703 5704 easing: { 5705 linear: function( p, n, firstNum, diff ) { 5706 return firstNum + diff * p; 5707 }, 5708 swing: function( p, n, firstNum, diff ) { 5709 return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum; 5710 } 5711 }, 5712 5713 timers: [], 5714 5715 fx: function( elem, options, prop ) { 5716 this.options = options; 5717 this.elem = elem; 5718 this.prop = prop; 5719 5720 if ( !options.orig ) { 5721 options.orig = {}; 5722 } 5723 } 5724 5725 }); 5726 5727 jQuery.fx.prototype = { 5728 // Simple function for setting a style value 5729 update: function() { 5730 if ( this.options.step ) { 5731 this.options.step.call( this.elem, this.now, this ); 5732 } 5733 5734 (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this ); 5735 5736 // Set display property to block for height/width animations 5737 if ( ( this.prop === "height" || this.prop === "width" ) && this.elem.style ) { 5738 this.elem.style.display = "block"; 5739 } 5740 }, 5741 5742 // Get the current size 5743 cur: function( force ) { 5744 if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) { 5745 return this.elem[ this.prop ]; 5746 } 5747 5748 var r = parseFloat(jQuery.css(this.elem, this.prop, force)); 5749 return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0; 5750 }, 5751 5752 // Start an animation from one number to another 5753 custom: function( from, to, unit ) { 5754 this.startTime = now(); 5755 this.start = from; 5756 this.end = to; 5757 this.unit = unit || this.unit || "px"; 5758 this.now = this.start; 5759 this.pos = this.state = 0; 5760 5761 var self = this; 5762 function t( gotoEnd ) { 5763 return self.step(gotoEnd); 5764 } 5765 5766 t.elem = this.elem; 5767 5768 if ( t() && jQuery.timers.push(t) && !timerId ) { 5769 timerId = setInterval(jQuery.fx.tick, 13); 5770 } 5771 }, 5772 5773 // Simple 'show' function 5774 show: function() { 5775 // Remember where we started, so that we can go back to it later 5776 this.options.orig[this.prop] = jQuery.style( this.elem, this.prop ); 5777 this.options.show = true; 5778 5779 // Begin the animation 5780 // Make sure that we start at a small width/height to avoid any 5781 // flash of content 5782 this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur()); 5783 5784 // Start by showing the element 5785 jQuery( this.elem ).show(); 5786 }, 5787 5788 // Simple 'hide' function 5789 hide: function() { 5790 // Remember where we started, so that we can go back to it later 5791 this.options.orig[this.prop] = jQuery.style( this.elem, this.prop ); 5792 this.options.hide = true; 5793 5794 // Begin the animation 5795 this.custom(this.cur(), 0); 5796 }, 5797 5798 // Each step of an animation 5799 step: function( gotoEnd ) { 5800 var t = now(), done = true; 5801 5802 if ( gotoEnd || t >= this.options.duration + this.startTime ) { 5803 this.now = this.end; 5804 this.pos = this.state = 1; 5805 this.update(); 5806 5807 this.options.curAnim[ this.prop ] = true; 5808 5809 for ( var i in this.options.curAnim ) { 5810 if ( this.options.curAnim[i] !== true ) { 5811 done = false; 5812 } 5813 } 5814 5815 if ( done ) { 5816 if ( this.options.display != null ) { 5817 // Reset the overflow 5818 this.elem.style.overflow = this.options.overflow; 5819 5820 // Reset the display 5821 var old = jQuery.data(this.elem, "olddisplay"); 5822 this.elem.style.display = old ? old : this.options.display; 5823 5824 if ( jQuery.css(this.elem, "display") === "none" ) { 5825 this.elem.style.display = "block"; 5826 } 5827 } 5828 5829 // Hide the element if the "hide" operation was done 5830 if ( this.options.hide ) { 5831 jQuery(this.elem).hide(); 5832 } 5833 5834 // Reset the properties, if the item has been hidden or shown 5835 if ( this.options.hide || this.options.show ) { 5836 for ( var p in this.options.curAnim ) { 5837 jQuery.style(this.elem, p, this.options.orig[p]); 5838 } 5839 } 5840 5841 // Execute the complete function 5842 this.options.complete.call( this.elem ); 5843 } 5844 5845 return false; 5846 5847 } else { 5848 var n = t - this.startTime; 5849 this.state = n / this.options.duration; 5850 5851 // Perform the easing function, defaults to swing 5852 var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop]; 5853 var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear"); 5854 this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration); 5855 this.now = this.start + ((this.end - this.start) * this.pos); 5856 5857 // Perform the next step of the animation 5858 this.update(); 5859 } 5860 5861 return true; 5862 } 5863 }; 5864 5865 jQuery.extend( jQuery.fx, { 5866 tick: function() { 5867 var timers = jQuery.timers; 5868 5869 for ( var i = 0; i < timers.length; i++ ) { 5870 if ( !timers[i]() ) { 5871 timers.splice(i--, 1); 5872 } 5873 } 5874 5875 if ( !timers.length ) { 5876 jQuery.fx.stop(); 5877 } 5878 }, 5879 5880 stop: function() { 5881 clearInterval( timerId ); 5882 timerId = null; 5883 }, 5884 5885 speeds: { 5886 slow: 600, 5887 fast: 200, 5888 // Default speed 5889 _default: 400 5890 }, 5891 5892 step: { 5893 opacity: function( fx ) { 5894 jQuery.style(fx.elem, "opacity", fx.now); 5895 }, 5896 5897 _default: function( fx ) { 5898 if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) { 5899 fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit; 5900 } else { 5901 fx.elem[ fx.prop ] = fx.now; 5902 } 5903 } 5904 } 5905 }); 5906 5907 if ( jQuery.expr && jQuery.expr.filters ) { 5908 jQuery.expr.filters.animated = function( elem ) { 5909 return jQuery.grep(jQuery.timers, function( fn ) { 5910 return elem === fn.elem; 5911 }).length; 5912 }; 5913 } 5914 5915 function genFx( type, num ) { 5916 var obj = {}; 5917 5918 jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() { 5919 obj[ this ] = type; 5920 }); 5921 5922 return obj; 5923 } 5924 if ( "getBoundingClientRect" in document.documentElement ) { 5925 jQuery.fn.offset = function( options ) { 5926 var elem = this[0]; 5927 5928 if ( options ) { 5929 return this.each(function( i ) { 5930 jQuery.offset.setOffset( this, options, i ); 5931 }); 5932 } 5933 5934 if ( !elem || !elem.ownerDocument ) { 5935 return null; 5936 } 5937 5938 if ( elem === elem.ownerDocument.body ) { 5939 return jQuery.offset.bodyOffset( elem ); 5940 } 5941 5942 var box = elem.getBoundingClientRect(), doc = elem.ownerDocument, body = doc.body, docElem = doc.documentElement, 5943 clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, 5944 top = box.top + (self.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop ) - clientTop, 5945 left = box.left + (self.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft; 5946 5947 return { top: top, left: left }; 5948 }; 5949 5950 } else { 5951 jQuery.fn.offset = function( options ) { 5952 var elem = this[0]; 5953 5954 if ( options ) { 5955 return this.each(function( i ) { 5956 jQuery.offset.setOffset( this, options, i ); 5957 }); 5958 } 5959 5960 if ( !elem || !elem.ownerDocument ) { 5961 return null; 5962 } 5963 5964 if ( elem === elem.ownerDocument.body ) { 5965 return jQuery.offset.bodyOffset( elem ); 5966 } 5967 5968 jQuery.offset.initialize(); 5969 5970 var offsetParent = elem.offsetParent, prevOffsetParent = elem, 5971 doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement, 5972 body = doc.body, defaultView = doc.defaultView, 5973 prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle, 5974 top = elem.offsetTop, left = elem.offsetLeft; 5975 5976 while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) { 5977 if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) { 5978 break; 5979 } 5980 5981 computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle; 5982 top -= elem.scrollTop; 5983 left -= elem.scrollLeft; 5984 5985 if ( elem === offsetParent ) { 5986 top += elem.offsetTop; 5987 left += elem.offsetLeft; 5988 5989 if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.nodeName)) ) { 5990 top += parseFloat( computedStyle.borderTopWidth ) || 0; 5991 left += parseFloat( computedStyle.borderLeftWidth ) || 0; 5992 } 5993 5994 prevOffsetParent = offsetParent, offsetParent = elem.offsetParent; 5995 } 5996 5997 if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) { 5998 top += parseFloat( computedStyle.borderTopWidth ) || 0; 5999 left += parseFloat( computedStyle.borderLeftWidth ) || 0; 6000 } 6001 6002 prevComputedStyle = computedStyle; 6003 } 6004 6005 if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) { 6006 top += body.offsetTop; 6007 left += body.offsetLeft; 6008 } 6009 6010 if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) { 6011 top += Math.max( docElem.scrollTop, body.scrollTop ); 6012 left += Math.max( docElem.scrollLeft, body.scrollLeft ); 6013 } 6014 6015 return { top: top, left: left }; 6016 }; 6017 } 6018 6019 jQuery.offset = { 6020 initialize: function() { 6021 var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.curCSS(body, "marginTop", true) ) || 0, 6022 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>"; 6023 6024 jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } ); 6025 6026 container.innerHTML = html; 6027 body.insertBefore( container, body.firstChild ); 6028 innerDiv = container.firstChild; 6029 checkDiv = innerDiv.firstChild; 6030 td = innerDiv.nextSibling.firstChild.firstChild; 6031 6032 this.doesNotAddBorder = (checkDiv.offsetTop !== 5); 6033 this.doesAddBorderForTableAndCells = (td.offsetTop === 5); 6034 6035 checkDiv.style.position = "fixed", checkDiv.style.top = "20px"; 6036 // safari subtracts parent border width here which is 5px 6037 this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15); 6038 checkDiv.style.position = checkDiv.style.top = ""; 6039 6040 innerDiv.style.overflow = "hidden", innerDiv.style.position = "relative"; 6041 this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5); 6042 6043 this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop); 6044 6045 body.removeChild( container ); 6046 body = container = innerDiv = checkDiv = table = td = null; 6047 jQuery.offset.initialize = jQuery.noop; 6048 }, 6049 6050 bodyOffset: function( body ) { 6051 var top = body.offsetTop, left = body.offsetLeft; 6052 6053 jQuery.offset.initialize(); 6054 6055 if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) { 6056 top += parseFloat( jQuery.curCSS(body, "marginTop", true) ) || 0; 6057 left += parseFloat( jQuery.curCSS(body, "marginLeft", true) ) || 0; 6058 } 6059 6060 return { top: top, left: left }; 6061 }, 6062 6063 setOffset: function( elem, options, i ) { 6064 // set position first, in-case top/left are set even on static elem 6065 if ( /static/.test( jQuery.curCSS( elem, "position" ) ) ) { 6066 elem.style.position = "relative"; 6067 } 6068 var curElem = jQuery( elem ), 6069 curOffset = curElem.offset(), 6070 curTop = parseInt( jQuery.curCSS( elem, "top", true ), 10 ) || 0, 6071 curLeft = parseInt( jQuery.curCSS( elem, "left", true ), 10 ) || 0; 6072 6073 if ( jQuery.isFunction( options ) ) { 6074 options = options.call( elem, i, curOffset ); 6075 } 6076 6077 var props = { 6078 top: (options.top - curOffset.top) + curTop, 6079 left: (options.left - curOffset.left) + curLeft 6080 }; 6081 6082 if ( "using" in options ) { 6083 options.using.call( elem, props ); 6084 } else { 6085 curElem.css( props ); 6086 } 6087 } 6088 }; 6089 6090 6091 jQuery.fn.extend({ 6092 position: function() { 6093 if ( !this[0] ) { 6094 return null; 6095 } 6096 6097 var elem = this[0], 6098 6099 // Get *real* offsetParent 6100 offsetParent = this.offsetParent(), 6101 6102 // Get correct offsets 6103 offset = this.offset(), 6104 parentOffset = /^body|html$/i.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset(); 6105 6106 // Subtract element margins 6107 // note: when an element has margin: auto the offsetLeft and marginLeft 6108 // are the same in Safari causing offset.left to incorrectly be 0 6109 offset.top -= parseFloat( jQuery.curCSS(elem, "marginTop", true) ) || 0; 6110 offset.left -= parseFloat( jQuery.curCSS(elem, "marginLeft", true) ) || 0; 6111 6112 // Add offsetParent borders 6113 parentOffset.top += parseFloat( jQuery.curCSS(offsetParent[0], "borderTopWidth", true) ) || 0; 6114 parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], "borderLeftWidth", true) ) || 0; 6115 6116 // Subtract the two offsets 6117 return { 6118 top: offset.top - parentOffset.top, 6119 left: offset.left - parentOffset.left 6120 }; 6121 }, 6122 6123 offsetParent: function() { 6124 return this.map(function() { 6125 var offsetParent = this.offsetParent || document.body; 6126 while ( offsetParent && (!/^body|html$/i.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) { 6127 offsetParent = offsetParent.offsetParent; 6128 } 6129 return offsetParent; 6130 }); 6131 } 6132 }); 6133 6134 6135 // Create scrollLeft and scrollTop methods 6136 jQuery.each( ["Left", "Top"], function( i, name ) { 6137 var method = "scroll" + name; 6138 6139 jQuery.fn[ method ] = function(val) { 6140 var elem = this[0], win; 6141 6142 if ( !elem ) { 6143 return null; 6144 } 6145 6146 if ( val !== undefined ) { 6147 // Set the scroll offset 6148 return this.each(function() { 6149 win = getWindow( this ); 6150 6151 if ( win ) { 6152 win.scrollTo( 6153 !i ? val : jQuery(win).scrollLeft(), 6154 i ? val : jQuery(win).scrollTop() 6155 ); 6156 6157 } else { 6158 this[ method ] = val; 6159 } 6160 }); 6161 } else { 6162 win = getWindow( elem ); 6163 6164 // Return the scroll offset 6165 return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] : 6166 jQuery.support.boxModel && win.document.documentElement[ method ] || 6167 win.document.body[ method ] : 6168 elem[ method ]; 6169 } 6170 }; 6171 }); 6172 6173 function getWindow( elem ) { 6174 return ("scrollTo" in elem && elem.document) ? 6175 elem : 6176 elem.nodeType === 9 ? 6177 elem.defaultView || elem.parentWindow : 6178 false; 6179 } 6180 // Create innerHeight, innerWidth, outerHeight and outerWidth methods 6181 jQuery.each([ "Height", "Width" ], function( i, name ) { 6182 6183 var type = name.toLowerCase(); 6184 6185 // innerHeight and innerWidth 6186 jQuery.fn["inner" + name] = function() { 6187 return this[0] ? 6188 jQuery.css( this[0], type, false, "padding" ) : 6189 null; 6190 }; 6191 6192 // outerHeight and outerWidth 6193 jQuery.fn["outer" + name] = function( margin ) { 6194 return this[0] ? 6195 jQuery.css( this[0], type, false, margin ? "margin" : "border" ) : 6196 null; 6197 }; 6198 6199 jQuery.fn[ type ] = function( size ) { 6200 // Get window width or height 6201 var elem = this[0]; 6202 if ( !elem ) { 6203 return size == null ? null : this; 6204 } 6205 6206 if ( jQuery.isFunction( size ) ) { 6207 return this.each(function( i ) { 6208 var self = jQuery( this ); 6209 self[ type ]( size.call( this, i, self[ type ]() ) ); 6210 }); 6211 } 6212 6213 return ("scrollTo" in elem && elem.document) ? // does it walk and quack like a window? 6214 // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode 6215 elem.document.compatMode === "CSS1Compat" && elem.document.documentElement[ "client" + name ] || 6216 elem.document.body[ "client" + name ] : 6217 6218 // Get document width or height 6219 (elem.nodeType === 9) ? // is it a document 6220 // Either scroll[Width/Height] or offset[Width/Height], whichever is greater 6221 Math.max( 6222 elem.documentElement["client" + name], 6223 elem.body["scroll" + name], elem.documentElement["scroll" + name], 6224 elem.body["offset" + name], elem.documentElement["offset" + name] 6225 ) : 6226 6227 // Get or set width or height on the element 6228 size === undefined ? 6229 // Get width or height on the element 6230 jQuery.css( elem, type ) : 6231 6232 // Set the width or height on the element (default to pixels if value is unitless) 6233 this.css( type, typeof size === "string" ? size : size + "px" ); 6234 }; 6235 6236 }); 6237 // Expose jQuery to the global object 6238 window.jQuery = window.$ = jQuery; 6239 6240 })(window);

Contact Us
Can't read the article? Contact us for free answers! Free help for personal, small business sites!
Tel: 020-2206-9892
QQ咨询:1025174874
(iii) E-mail: info@361sale.com
Working hours: Monday to Friday, 9:30-18:30, holidays off
© Reprint statement
This article was written by Harry
THE END
If you like it, support it.
kudos0 share (joys, benefits, privileges etc) with others
commentaries sofa-buying

Please log in to post a comment

    No comments