Código fuente de WordPress - jquery (jquery-1.3.2.js)

1 /*!
2 * jQuery JavaScript Library v1.3.2
3 * http://jquery.com/
4 *
5 * Copyright (c) 2009 John Resig
6 * Dual licensed under the MIT and GPL licenses.
7 * http://docs.jquery.com/License
8 *
9 * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
10 * Revision: 6246
11 */
12 (function(){
13
14 var
15 // Will speed up references to window, and allows munging its name.
16 window = this,
17 // Will speed up references to undefined, and allows munging its name.
18 undefined,
19 // Map over jQuery in case of overwrite
20 _jQuery = window.jQuery,
21 // Map over the $ in case of overwrite
22 _$ = window.$,
23
24 jQuery = window.jQuery = window.$ = function( selector, context ) {
25 // The jQuery object is actually just the init constructor 'enhanced'
26 return new jQuery.fn.init( selector, context );
27 },
28
29 // A simple way to check for HTML strings or ID strings
30 // (both of which we optimize for)
31 quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,
32 // Is it a simple selector
33 isSimple = /^.[^:#\[\.,]*$/;
34
35 jQuery.fn = jQuery.prototype = {
36 init: function( selector, context ) {
37 // Make sure that a selection was provided
38 selector = selector || document;
39
40 // Handle $(DOMElement)
41 if ( selector.nodeType ) {
42 this[0] = selector;
43 this.length = 1;
44 this.context = selector;
45 return this;
46 }
47 // Handle HTML strings
48 if ( typeof selector === "string" ) {
49 // Are we dealing with HTML string or an ID?
50 var match = quickExpr.exec( selector );
51
52 // Verify a match, and that no context was specified for #id
53 if ( match && (match[1] || !context) ) {
54
55 // HANDLE: $(html) -> $(array)
56 if ( match[1] )
57 selector = jQuery.clean( [ match[1] ], context );
58
59 // HANDLE: $("#id")
60 else {
61 var elem = document.getElementById( match[3] );
62
63 // Handle the case where IE and Opera return items
64 // by name instead of ID
65 if ( elem && elem.id != match[3] )
66 return jQuery().find( selector );
67
68 // Otherwise, we inject the element directly into the jQuery object
69 var ret = jQuery( elem || [] );
70 ret.context = document;
71 ret.selector = selector;
72 return ret;
73 }
74
75 // HANDLE: $(expr, [context])
76 // (which is just equivalent to: $(content).find(expr)
77 } else
78 return jQuery( context ).find( selector );
79
80 // HANDLE: $(function)
81 // Shortcut for document ready
82 } else if ( jQuery.isFunction( selector ) )
83 return jQuery( document ).ready( selector );
84
85 // Make sure that old selector state is passed along
86 if ( selector.selector && selector.context ) {
87 this.selector = selector.selector;
88 this.context = selector.context;
89 }
90
91 return this.setArray(jQuery.isArray( selector ) ?
92 selector :
93 jQuery.makeArray(selector));
94 },
95
96 // Start with an empty selector
97 selector: "",
98
99 // The current version of jQuery being used
100 jquery: "1.3.2",
101
102 // The number of elements contained in the matched element set
103 size: function() {
104 return this.length;
105 },
106
107 // Get the Nth element in the matched element set OR
108 // Get the whole matched element set as a clean array
109 get: function( num ) {
110 return num === undefined ?
111
112 // Return a 'clean' array
113 Array.prototype.slice.call( this ) :
114
115 // Return just the object
116 this[ num ];
117 },
118
119 // Take an array of elements and push it onto the stack
120 // (returning the new matched element set)
121 pushStack: function( elems, name, selector ) {
122 // Build a new jQuery matched element set
123 var ret = jQuery( elems );
124
125 // Add the old object onto the stack (as a reference)
126 ret.prevObject = this;
127
128 ret.context = this.context;
129
130 if ( name === "find" )
131 ret.selector = this.selector + (this.selector ? " " : "") + selector;
132 else if ( name )
133 ret.selector = this.selector + "." + name + "(" + selector + ")";
134
135 // Return the newly-formed element set
136 return ret;
137 },
138
139 // Force the current matched set of elements to become
140 // the specified array of elements (destroying the stack in the process)
141 // You should use pushStack() in order to do this, but maintain the stack
142 setArray: function( elems ) {
143 // Resetting the length to 0, then using the native Array push
144 // is a super-fast way to populate an object with array-like properties
145 this.length = 0;
146 Array.prototype.push.apply( this, elems );
147
148 return this;
149 },
150
151 // Execute a callback for every element in the matched set.
152 // (You can seed the arguments with an array of args, but this is
153 // only used internally.)
154 each: function( callback, args ) {
155 return jQuery.each( this, callback, args );
156 },
157
158 // Determine the position of an element within
159 // the matched set of elements
160 index: function( elem ) {
161 // Locate the position of the desired element
162 return jQuery.inArray(
163 // If it receives a jQuery object, the first element is used
164 elem && elem.jquery ? elem[0] : elem
165 , this );
166 },
167
168 attr: function( name, value, type ) {
169 var options = name;
170
171 // Look for the case where we're accessing a style value
172 if ( typeof name === "string" )
173 if ( value === undefined )
174 return this[0] && jQuery[ type || "attr" ]( this[0], name );
175
176 else {
177 options = {};
178 options[ name ] = value;
179 }
180
181 // Check to see if we're setting style values
182 return this.each(function(i){
183 // Set all the styles
184 for ( name in options )
185 jQuery.attr(
186 type ?
187 this.style :
188 this,
189 name, jQuery.prop( this, options[ name ], type, i, name )
190 );
191 });
192 },
193
194 css: function( key, value ) {
195 // ignore negative width and height values
196 if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
197 value = undefined;
198 return this.attr( key, value, "curCSS" );
199 },
200
201 text: function( text ) {
202 if ( typeof text !== "object" && text != null )
203 return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
204
205 var ret = "";
206
207 jQuery.each( text || this, function(){
208 jQuery.each( this.childNodes, function(){
209 if ( this.nodeType != 8 )
210 ret += this.nodeType != 1 ?
211 this.nodeValue :
212 jQuery.fn.text( [ this ] );
213 });
214 });
215
216 return ret;
217 },
218
219 wrapAll: function( html ) {
220 if ( this[0] ) {
221 // The elements to wrap the target around
222 var wrap = jQuery( html, this[0].ownerDocument ).clone();
223
224 if ( this[0].parentNode )
225 wrap.insertBefore( this[0] );
226
227 wrap.map(function(){
228 var elem = this;
229
230 while ( elem.firstChild )
231 elem = elem.firstChild;
232
233 return elem;
234 }).append(this);
235 }
236
237 return this;
238 },
239
240 wrapInner: function( html ) {
241 return this.each(function(){
242 jQuery( this ).contents().wrapAll( html );
243 });
244 },
245
246 wrap: function( html ) {
247 return this.each(function(){
248 jQuery( this ).wrapAll( html );
249 });
250 },
251
252 append: function() {
253 return this.domManip(arguments, true, function(elem){
254 if (this.nodeType == 1)
255 this.appendChild( elem );
256 });
257 },
258
259 prepend: function() {
260 return this.domManip(arguments, true, function(elem){
261 if (this.nodeType == 1)
262 this.insertBefore( elem, this.firstChild );
263 });
264 },
265
266 before: function() {
267 return this.domManip(arguments, false, function(elem){
268 this.parentNode.insertBefore( elem, this );
269 });
270 },
271
272 after: function() {
273 return this.domManip(arguments, false, function(elem){
274 this.parentNode.insertBefore( elem, this.nextSibling );
275 });
276 },
277
278 end: function() {
279 return this.prevObject || jQuery( [] );
280 },
281
282 // For internal use only.
283 // Behaves like an Array's method, not like a jQuery method.
284 push: [].push,
285 sort: [].sort,
286 splice: [].splice,
287
288 find: function( selector ) {
289 if ( this.length === 1 ) {
290 var ret = this.pushStack( [], "find", selector );
291 ret.length = 0;
292 jQuery.find( selector, this[0], ret );
293 return ret;
294 } else {
295 return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){
296 return jQuery.find( selector, elem );
297 })), "find", selector );
298 }
299 },
300
301 clone: function( events ) {
302 // Do the clone
303 var ret = this.map(function(){
304 if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
305 // IE copies events bound via attachEvent when
306 // using cloneNode. Calling detachEvent on the
307 // clone will also remove the events from the orignal
308 // In order to get around this, we use innerHTML.
309 // Unfortunately, this means some modifications to
310 // attributes in IE that are actually only stored
311 // as properties will not be copied (such as the
312 // the name attribute on an input).
313 var html = this.outerHTML;
314 if ( !html ) {
315 var div = this.ownerDocument.createElement("div");
316 div.appendChild( this.cloneNode(true) );
317 html = div.innerHTML;
318 }
319
320 return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0];
321 } else
322 return this.cloneNode(true);
323 });
324
325 // Copy the events from the original to the clone
326 if ( events === true ) {
327 var orig = this.find("*").andSelf(), i = 0;
328
329 ret.find("*").andSelf().each(function(){
330 if ( this.nodeName !== orig[i].nodeName )
331 return;
332
333 var events = jQuery.data( orig[i], "events" );
334
335 for ( var type in events ) {
336 for ( var handler in events[ type ] ) {
337 jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
338 }
339 }
340
341 i++;
342 });
343 }
344
345 // Return the cloned set
346 return ret;
347 },
348
349 filter: function( selector ) {
350 return this.pushStack(
351 jQuery.isFunction( selector ) &&
352 jQuery.grep(this, function(elem, i){
353 return selector.call( elem, i );
354 }) ||
355
356 jQuery.multiFilter( selector, jQuery.grep(this, function(elem){
357 return elem.nodeType === 1;
358 }) ), "filter", selector );
359 },
360
361 closest: function( selector ) {
362 var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null,
363 closer = 0;
364
365 return this.map(function(){
366 var cur = this;
367 while ( cur && cur.ownerDocument ) {
368 if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) {
369 jQuery.data(cur, "closest", closer);
370 return cur;
371 }
372 cur = cur.parentNode;
373 closer++;
374 }
375 });
376 },
377
378 not: function( selector ) {
379 if ( typeof selector === "string" )
380 // test special case where just one selector is passed in
381 if ( isSimple.test( selector ) )
382 return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector );
383 else
384 selector = jQuery.multiFilter( selector, this );
385
386 var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
387 return this.filter(function() {
388 return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
389 });
390 },
391
392 add: function( selector ) {
393 return this.pushStack( jQuery.unique( jQuery.merge(
394 this.get(),
395 typeof selector === "string" ?
396 jQuery( selector ) :
397 jQuery.makeArray( selector )
398 )));
399 },
400
401 is: function( selector ) {
402 return !!selector && jQuery.multiFilter( selector, this ).length > 0;
403 },
404
405 hasClass: function( selector ) {
406 return !!selector && this.is( "." + selector );
407 },
408
409 val: function( value ) {
410 if ( value === undefined ) {
411 var elem = this[0];
412
413 if ( elem ) {
414 if( jQuery.nodeName( elem, 'option' ) )
415 return (elem.attributes.value || {}).specified ? elem.value : elem.text;
416
417 // We need to handle select boxes special
418 if ( jQuery.nodeName( elem, "select" ) ) {
419 var index = elem.selectedIndex,
420 values = [],
421 options = elem.options,
422 one = elem.type == "select-one";
423
424 // Nothing was selected
425 if ( index < 0 )
426 return null;
427
428 // Loop through all the selected options
429 for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
430 var option = options[ i ];
431
432 if ( option.selected ) {
433 // Get the specifc value for the option
434 value = jQuery(option).val();
435
436 // We don't need an array for one selects
437 if ( one )
438 return value;
439
440 // Multi-Selects return an array
441 values.push( value );
442 }
443 }
444
445 return values;
446 }
447
448 // Everything else, we just grab the value
449 return (elem.value || "").replace(/\r/g, "");
450
451 }
452
453 return undefined;
454 }
455
456 if ( typeof value === "number" )
457 value += '';
458
459 return this.each(function(){
460 if ( this.nodeType != 1 )
461 return;
462
463 if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) )
464 this.checked = (jQuery.inArray(this.value, value) >= 0 ||
465 jQuery.inArray(this.name, value) >= 0);
466
467 else if ( jQuery.nodeName( this, "select" ) ) {
468 var values = jQuery.makeArray(value);
469
470 jQuery( "option", this ).each(function(){
471 this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
472 jQuery.inArray( this.text, values ) >= 0);
473 });
474
475 if ( !values.length )
476 this.selectedIndex = -1;
477
478 } else
479 this.value = value;
480 });
481 },
482
483 html: function( value ) {
484 return value === undefined ?
485 (this[0] ?
486 this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") :
487 null) :
488 this.empty().append( value );
489 },
490
491 replaceWith: function( value ) {
492 return this.after( value ).remove();
493 },
494
495 eq: function( i ) {
496 return this.slice( i, +i + 1 );
497 },
498
499 slice: function() {
500 return this.pushStack( Array.prototype.slice.apply( this, arguments ),
501 "slice", Array.prototype.slice.call(arguments).join(",") );
502 },
503
504 map: function( callback ) {
505 return this.pushStack( jQuery.map(this, function(elem, i){
506 return callback.call( elem, i, elem );
507 }));
508 },
509
510 andSelf: function() {
511 return this.add( this.prevObject );
512 },
513
514 domManip: function( args, table, callback ) {
515 if ( this[0] ) {
516 var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(),
517 scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ),
518 first = fragment.firstChild;
519
520 if ( first )
521 for ( var i = 0, l = this.length; i < l; i++ )
522 callback.call( root(this[i], first), this.length > 1 || i > 0 ?
523 fragment.cloneNode(true) : fragment );
524
525 if ( scripts )
526 jQuery.each( scripts, evalScript );
527 }
528
529 return this;
530
531 function root( elem, cur ) {
532 return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ?
533 (elem.getElementsByTagName("tbody")[0] ||
534 elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
535 elem;
536 }
537 }
538 };
539
540 // Give the init function the jQuery prototype for later instantiation
541 jQuery.fn.init.prototype = jQuery.fn;
542
543 function evalScript( i, elem ) {
544 if ( elem.src )
545 jQuery.ajax({
546 url: elem.src,
547 async: false,
548 dataType: "script"
549 });
550
551 else
552 jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
553
554 if ( elem.parentNode )
555 elem.parentNode.removeChild( elem );
556 }
557
558 function now(){
559 return +new Date;
560 }
561
562 jQuery.extend = jQuery.fn.extend = function() {
563 // copy reference to target object
564 var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
565
566 // Handle a deep copy situation
567 if ( typeof target === "boolean" ) {
568 deep = target;
569 target = arguments[1] || {};
570 // skip the boolean and the target
571 i = 2;
572 }
573
574 // Handle case when target is a string or something (possible in deep copy)
575 if ( typeof target !== "object" && !jQuery.isFunction(target) )
576 target = {};
577
578 // extend jQuery itself if only one argument is passed
579 if ( length == i ) {
580 target = this;
581 --i;
582 }
583
584 for ( ; i < length; i++ )
585 // Only deal with non-null/undefined values
586 if ( (options = arguments[ i ]) != null )
587 // Extend the base object
588 for ( var name in options ) {
589 var src = target[ name ], copy = options[ name ];
590
591 // Prevent never-ending loop
592 if ( target === copy )
593 continue;
594
595 // Recurse if we're merging object values
596 if ( deep && copy && typeof copy === "object" && !copy.nodeType )
597 target[ name ] = jQuery.extend( deep,
598 // Never move original objects, clone them
599 src || ( copy.length != null ? [ ] : { } )
600 , copy );
601
602 // Don't bring in undefined values
603 else if ( copy !== undefined )
604 target[ name ] = copy;
605
606 }
607
608 // Return the modified object
609 return target;
610 };
611
612 // exclude the following css properties to add px
613 var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
614 // cache defaultView
615 defaultView = document.defaultView || {},
616 toString = Object.prototype.toString;
617
618 jQuery.extend({
619 noConflict: function( deep ) {
620 window.$ = _$;
621
622 if ( deep )
623 window.jQuery = _jQuery;
624
625 return jQuery;
626 },
627
628 // See test/unit/core.js for details concerning isFunction.
629 // Since version 1.3, DOM methods and functions like alert
630 // aren't supported. They return false on IE (#2968).
631 isFunction: function( obj ) {
632 return toString.call(obj) === "[object Function]";
633 },
634
635 isArray: function( obj ) {
636 return toString.call(obj) === "[object Array]";
637 },
638
639 // check if an element is in a (or is an) XML document
640 isXMLDoc: function( elem ) {
641 return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
642 !!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument );
643 },
644
645 // Evalulates a script in a global context
646 globalEval: function( data ) {
647 if ( data && /\S/.test(data) ) {
648 // Inspired by code by Andrea Giammarchi
649 // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
650 var head = document.getElementsByTagName("head")[0] || document.documentElement,
651 script = document.createElement("script");
652
653 script.type = "text/javascript";
654 if ( jQuery.support.scriptEval )
655 script.appendChild( document.createTextNode( data ) );
656 else
657 script.text = data;
658
659 // Use insertBefore instead of appendChild to circumvent an IE6 bug.
660 // This arises when a base node is used (#2709).
661 head.insertBefore( script, head.firstChild );
662 head.removeChild( script );
663 }
664 },
665
666 nodeName: function( elem, name ) {
667 return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
668 },
669
670 // args is for internal usage only
671 each: function( object, callback, args ) {
672 var name, i = 0, length = object.length;
673
674 if ( args ) {
675 if ( length === undefined ) {
676 for ( name in object )
677 if ( callback.apply( object[ name ], args ) === false )
678 break;
679 } else
680 for ( ; i < length; )
681 if ( callback.apply( object[ i++ ], args ) === false )
682 break;
683
684 // A special, fast, case for the most common use of each
685 } else {
686 if ( length === undefined ) {
687 for ( name in object )
688 if ( callback.call( object[ name ], name, object[ name ] ) === false )
689 break;
690 } else
691 for ( var value = object[0];
692 i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
693 }
694
695 return object;
696 },
697
698 prop: function( elem, value, type, i, name ) {
699 // Handle executable functions
700 if ( jQuery.isFunction( value ) )
701 value = value.call( elem, i );
702
703 // Handle passing in a number to a CSS property
704 return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ?
705 value + "px" :
706 value;
707 },
708
709 className: {
710 // internal only, use addClass("class")
711 add: function( elem, classNames ) {
712 jQuery.each((classNames || "").split(/\s+/), function(i, className){
713 if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
714 elem.className += (elem.className ? " " : "") + className;
715 });
716 },
717
718 // internal only, use removeClass("class")
719 remove: function( elem, classNames ) {
720 if (elem.nodeType == 1)
721 elem.className = classNames !== undefined ?
722 jQuery.grep(elem.className.split(/\s+/), function(className){
723 return !jQuery.className.has( classNames, className );
724 }).join(" ") :
725 "";
726 },
727
728 // internal only, use hasClass("class")
729 has: function( elem, className ) {
730 return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
731 }
732 },
733
734 // A method for quickly swapping in/out CSS properties to get correct calculations
735 swap: function( elem, options, callback ) {
736 var old = {};
737 // Remember the old values, and insert the new ones
738 for ( var name in options ) {
739 old[ name ] = elem.style[ name ];
740 elem.style[ name ] = options[ name ];
741 }
742
743 callback.call( elem );
744
745 // Revert the old values
746 for ( var name in options )
747 elem.style[ name ] = old[ name ];
748 },
749
750 css: function( elem, name, force, extra ) {
751 if ( name == "width" || name == "height" ) {
752 var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
753
754 function getWH() {
755 val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
756
757 if ( extra === "border" )
758 return;
759
760 jQuery.each( which, function() {
761 if ( !extra )
762 val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
763 if ( extra === "margin" )
764 val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
765 else
766 val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
767 });
768 }
769
770 if ( elem.offsetWidth !== 0 )
771 getWH();
772 else
773 jQuery.swap( elem, props, getWH );
774
775 return Math.max(0, Math.round(val));
776 }
777
778 return jQuery.curCSS( elem, name, force );
779 },
780
781 curCSS: function( elem, name, force ) {
782 var ret, style = elem.style;
783
784 // We need to handle opacity special in IE
785 if ( name == "opacity" && !jQuery.support.opacity ) {
786 ret = jQuery.attr( style, "opacity" );
787
788 return ret == "" ?
789 "1" :
790 ret;
791 }
792
793 // Make sure we're using the right name for getting the float value
794 if ( name.match( /float/i ) )
795 name = styleFloat;
796
797 if ( !force && style && style[ name ] )
798 ret = style[ name ];
799
800 else if ( defaultView.getComputedStyle ) {
801
802 // Only "float" is needed here
803 if ( name.match( /float/i ) )
804 name = "float";
805
806 name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
807
808 var computedStyle = defaultView.getComputedStyle( elem, null );
809
810 if ( computedStyle )
811 ret = computedStyle.getPropertyValue( name );
812
813 // We should always get a number back from opacity
814 if ( name == "opacity" && ret == "" )
815 ret = "1";
816
817 } else if ( elem.currentStyle ) {
818 var camelCase = name.replace(/\-(\w)/g, function(all, letter){
819 return letter.toUpperCase();
820 });
821
822 ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
823
824 // From the awesome hack by Dean Edwards
825 // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
826
827 // If we're not dealing with a regular pixel number
828 // but a number that has a weird ending, we need to convert it to pixels
829 if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
830 // Remember the original values
831 var left = style.left, rsLeft = elem.runtimeStyle.left;
832
833 // Put in the new values to get a computed value out
834 elem.runtimeStyle.left = elem.currentStyle.left;
835 style.left = ret || 0;
836 ret = style.pixelLeft + "px";
837
838 // Revert the changed values
839 style.left = left;
840 elem.runtimeStyle.left = rsLeft;
841 }
842 }
843
844 return ret;
845 },
846
847 clean: function( elems, context, fragment ) {
848 context = context || document;
849
850 // !context.createElement fails in IE with an error but returns typeof 'object'
851 if ( typeof context.createElement === "undefined" )
852 context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
853
854 // If a single string is passed in and it's a single tag
855 // just do a createElement and skip the rest
856 if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) {
857 var match = /^<(\w+)\s*\/?>$/.exec(elems[0]);
858 if ( match )
859 return [ context.createElement( match[1] ) ];
860 }
861
862 var ret = [], scripts = [], div = context.createElement("div");
863
864 jQuery.each(elems, function(i, elem){
865 if ( typeof elem === "number" )
866 elem += '';
867
868 if ( !elem )
869 return;
870
871 // Convert html string into DOM nodes
872 if ( typeof elem === "string" ) {
873 // Fix "XHTML"-style tags in all browsers
874 elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
875 return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
876 all :
877 front + "></" + tag + ">";
878 });
879
880 // Trim whitespace, otherwise indexOf won't work as expected
881 var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase();
882
883 var wrap =
884 // option or optgroup
885 !tags.indexOf("<opt") &&
886 [ 1, "<select multiple='multiple'>", "</select>" ] ||
887
888 !tags.indexOf("<leg") &&
889 [ 1, "<fieldset>", "</fieldset>" ] ||
890
891 tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
892 [ 1, "<table>", "</table>" ] ||
893
894 !tags.indexOf("<tr") &&
895 [ 2, "<table><tbody>", "</tbody></table>" ] ||
896
897 // <thead> matched above
898 (!tags.indexOf("<td") || !tags.indexOf("<th")) &&
899 [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
900
901 !tags.indexOf("<col") &&
902 [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
903
904 // IE can't serialize <link> and <script> tags normally
905 !jQuery.support.htmlSerialize &&
906 [ 1, "div<div>", "</div>" ] ||
907
908 [ 0, "", "" ];
909
910 // Go to html and back, then peel off extra wrappers
911 div.innerHTML = wrap[1] + elem + wrap[2];
912
913 // Move to the right depth
914 while ( wrap[0]-- )
915 div = div.lastChild;
916
917 // Remove IE's autoinserted <tbody> from table fragments
918 if ( !jQuery.support.tbody ) {
919
920 // String was a <table>, *may* have spurious <tbody>
921 var hasBody = /<tbody/i.test(elem),
922 tbody = !tags.indexOf("<table") && !hasBody ?
923 div.firstChild && div.firstChild.childNodes :
924
925 // String was a bare <thead> or <tfoot>
926 wrap[1] == "<table>" && !hasBody ?
927 div.childNodes :
928 [];
929
930 for ( var j = tbody.length - 1; j >= 0 ; --j )
931 if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
932 tbody[ j ].parentNode.removeChild( tbody[ j ] );
933
934 }
935
936 // IE completely kills leading whitespace when innerHTML is used
937 if ( !jQuery.support.leadingWhitespace && /^\s/.test( elem ) )
938 div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
939
940 elem = jQuery.makeArray( div.childNodes );
941 }
942
943 if ( elem.nodeType )
944 ret.push( elem );
945 else
946 ret = jQuery.merge( ret, elem );
947
948 });
949
950 if ( fragment ) {
951 for ( var i = 0; ret[i]; i++ ) {
952 if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
953 scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
954 } else {
955 if ( ret[i].nodeType === 1 )
956 ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
957 fragment.appendChild( ret[i] );
958 }
959 }
960
961 return scripts;
962 }
963
964 return ret;
965 },
966
967 attr: function( elem, name, value ) {
968 // don't set attributes on text and comment nodes
969 if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
970 return undefined;
971
972 var notxml = !jQuery.isXMLDoc( elem ),
973 // Whether we are setting (or getting)
974 set = value !== undefined;
975
976 // Try to normalize/fix the name
977 name = notxml && jQuery.props[ name ] || name;
978
979 // Only do all the following if this is a node (faster for style)
980 // IE elem.getAttribute passes even for style
981 if ( elem.tagName ) {
982
983 // These attributes require special treatment
984 var special = /href|src|style/.test( name );
985
986 // Safari mis-reports the default selected property of a hidden option
987 // Accessing the parent's selectedIndex property fixes it
988 if ( name == "selected" && elem.parentNode )
989 elem.parentNode.selectedIndex;
990
991 // If applicable, access the attribute via the DOM 0 way
992 if ( name in elem && notxml && !special ) {
993 if ( set ){
994 // We can't allow the type property to be changed (since it causes problems in IE)
995 if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
996 throw "type property can't be changed";
997
998 elem[ name ] = value;
999 }
1000
1001 // browsers index elements by id/name on forms, give priority to attributes.
1002 if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
1003 return elem.getAttributeNode( name ).nodeValue;
1004
1005 // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
1006 // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
1007 if ( name == "tabIndex" ) {
1008 var attributeNode = elem.getAttributeNode( "tabIndex" );
1009 return attributeNode && attributeNode.specified
1010 ? attributeNode.value
1011 : elem.nodeName.match(/(button|input|object|select|textarea)/i)
1012 ? 0
1013 : elem.nodeName.match(/^(a|area)$/i) && elem.href
1014 ? 0
1015 : undefined;
1016 }
1017
1018 return elem[ name ];
1019 }
1020
1021 if ( !jQuery.support.style && notxml && name == "style" )
1022 return jQuery.attr( elem.style, "cssText", value );
1023
1024 if ( set )
1025 // convert the value to a string (all browsers do this but IE) see #1070
1026 elem.setAttribute( name, "" + value );
1027
1028 var attr = !jQuery.support.hrefNormalized && notxml && special
1029 // Some attributes require a special call on IE
1030 ? elem.getAttribute( name, 2 )
1031 : elem.getAttribute( name );
1032
1033 // Non-existent attributes return null, we normalize to undefined
1034 return attr === null ? undefined : attr;
1035 }
1036
1037 // elem is actually elem.style ... set the style
1038
1039 // IE uses filters for opacity
1040 if ( !jQuery.support.opacity && name == "opacity" ) {
1041 if ( set ) {
1042 // IE has trouble with opacity if it does not have layout
1043 // Force it by setting the zoom level
1044 elem.zoom = 1;
1045
1046 // Set the alpha filter to set the opacity
1047 elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +
1048 (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
1049 }
1050
1051 return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
1052 (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
1053 "";
1054 }
1055
1056 name = name.replace(/-([a-z])/ig, function(all, letter){
1057 return letter.toUpperCase();
1058 });
1059
1060 if ( set )
1061 elem[ name ] = value;
1062
1063 return elem[ name ];
1064 },
1065
1066 trim: function( text ) {
1067 return (text || "").replace( /^\s+|\s+$/g, "" );
1068 },
1069
1070 makeArray: function( array ) {
1071 var ret = [];
1072
1073 if( array != null ){
1074 var i = array.length;
1075 // The window, strings (and functions) also have 'length'
1076 if( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval )
1077 ret[0] = array;
1078 else
1079 while( i )
1080 ret[--i] = array[i];
1081 }
1082
1083 return ret;
1084 },
1085
1086 inArray: function( elem, array ) {
1087 for ( var i = 0, length = array.length; i < length; i++ )
1088 // Use === because on IE, window == document
1089 if ( array[ i ] === elem )
1090 return i;
1091
1092 return -1;
1093 },
1094
1095 merge: function( first, second ) {
1096 // We have to loop this way because IE & Opera overwrite the length
1097 // expando of getElementsByTagName
1098 var i = 0, elem, pos = first.length;
1099 // Also, we need to make sure that the correct elements are being returned
1100 // (IE returns comment nodes in a '*' query)
1101 if ( !jQuery.support.getAll ) {
1102 while ( (elem = second[ i++ ]) != null )
1103 if ( elem.nodeType != 8 )
1104 first[ pos++ ] = elem;
1105
1106 } else
1107 while ( (elem = second[ i++ ]) != null )
1108 first[ pos++ ] = elem;
1109
1110 return first;
1111 },
1112
1113 unique: function( array ) {
1114 var ret = [], done = {};
1115
1116 try {
1117
1118 for ( var i = 0, length = array.length; i < length; i++ ) {
1119 var id = jQuery.data( array[ i ] );
1120
1121 if ( !done[ id ] ) {
1122 done[ id ] = true;
1123 ret.push( array[ i ] );
1124 }
1125 }
1126
1127 } catch( e ) {
1128 ret = array;
1129 }
1130
1131 return ret;
1132 },
1133
1134 grep: function( elems, callback, inv ) {
1135 var ret = [];
1136
1137 // Go through the array, only saving the items
1138 // that pass the validator function
1139 for ( var i = 0, length = elems.length; i < length; i++ )
1140 if ( !inv != !callback( elems[ i ], i ) )
1141 ret.push( elems[ i ] );
1142
1143 return ret;
1144 },
1145
1146 map: function( elems, callback ) {
1147 var ret = [];
1148
1149 // Go through the array, translating each of the items to their
1150 // new value (or values).
1151 for ( var i = 0, length = elems.length; i < length; i++ ) {
1152 var value = callback( elems[ i ], i );
1153
1154 if ( value != null )
1155 ret[ ret.length ] = value;
1156 }
1157
1158 return ret.concat.apply( [], ret );
1159 }
1160 });
1161
1162 // Use of jQuery.browser is deprecated.
1163 // It's included for backwards compatibility and plugins,
1164 // although they should work to migrate away.
1165
1166 var userAgent = navigator.userAgent.toLowerCase();
1167
1168 // Figure out what browser is being used
1169 jQuery.browser = {
1170 version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
1171 safari: /webkit/.test( userAgent ),
1172 opera: /opera/.test( userAgent ),
1173 msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
1174 mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
1175 };
1176
1177 jQuery.each({
1178 parent: function(elem){return elem.parentNode;},
1179 parents: function(elem){return jQuery.dir(elem,"parentNode");},
1180 next: function(elem){return jQuery.nth(elem,2,"nextSibling");},
1181 prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},
1182 nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},
1183 prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},
1184 siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
1185 children: function(elem){return jQuery.sibling(elem.firstChild);},
1186 contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
1187 }, function(name, fn){
1188 jQuery.fn[ name ] = function( selector ) {
1189 var ret = jQuery.map( this, fn );
1190
1191 if ( selector && typeof selector == "string" )
1192 ret = jQuery.multiFilter( selector, ret );
1193
1194 return this.pushStack( jQuery.unique( ret ), name, selector );
1195 };
1196 });
1197
1198 jQuery.each({
1199 appendTo: "append",
1200 prependTo: "prepend",
1201 insertBefore: "before",
1202 insertAfter: "after",
1203 replaceAll: "replaceWith"
1204 }, function(name, original){
1205 jQuery.fn[ name ] = function( selector ) {
1206 var ret = [], insert = jQuery( selector );
1207
1208 for ( var i = 0, l = insert.length; i < l; i++ ) {
1209 var elems = (i > 0 ? this.clone(true) : this).get();
1210 jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
1211 ret = ret.concat( elems );
1212 }
1213
1214 return this.pushStack( ret, name, selector );
1215 };
1216 });
1217
1218 jQuery.each({
1219 removeAttr: function( name ) {
1220 jQuery.attr( this, name, "" );
1221 if (this.nodeType == 1)
1222 this.removeAttribute( name );
1223 },
1224
1225 addClass: function( classNames ) {
1226 jQuery.className.add( this, classNames );
1227 },
1228
1229 removeClass: function( classNames ) {
1230 jQuery.className.remove( this, classNames );
1231 },
1232
1233 toggleClass: function( classNames, state ) {
1234 if( typeof state !== "boolean" )
1235 state = !jQuery.className.has( this, classNames );
1236 jQuery.className[ state ? "add" : "remove" ]( this, classNames );
1237 },
1238
1239 remove: function( selector ) {
1240 if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
1241 // Prevent memory leaks
1242 jQuery( "*", this ).add([this]).each(function(){
1243 jQuery.event.remove(this);
1244 jQuery.removeData(this);
1245 });
1246 if (this.parentNode)
1247 this.parentNode.removeChild( this );
1248 }
1249 },
1250
1251 empty: function() {
1252 // Remove element nodes and prevent memory leaks
1253 jQuery(this).children().remove();
1254
1255 // Remove any remaining nodes
1256 while ( this.firstChild )
1257 this.removeChild( this.firstChild );
1258 }
1259 }, function(name, fn){
1260 jQuery.fn[ name ] = function(){
1261 return this.each( fn, arguments );
1262 };
1263 });
1264
1265 // Helper function used by the dimensions and offset modules
1266 function num(elem, prop) {
1267 return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
1268 }
1269 var expando = "jQuery" + now(), uuid = 0, windowData = {};
1270
1271 jQuery.extend({
1272 cache: {},
1273
1274 data: function( elem, name, data ) {
1275 elem = elem == window ?
1276 windowData :
1277 elem;
1278
1279 var id = elem[ expando ];
1280
1281 // Compute a unique ID for the element
1282 if ( !id )
1283 id = elem[ expando ] = ++uuid;
1284
1285 // Only generate the data cache if we're
1286 // trying to access or manipulate it
1287 if ( name && !jQuery.cache[ id ] )
1288 jQuery.cache[ id ] = {};
1289
1290 // Prevent overriding the named cache with undefined values
1291 if ( data !== undefined )
1292 jQuery.cache[ id ][ name ] = data;
1293
1294 // Return the named cache data, or the ID for the element
1295 return name ?
1296 jQuery.cache[ id ][ name ] :
1297 id;
1298 },
1299
1300 removeData: function( elem, name ) {
1301 elem = elem == window ?
1302 windowData :
1303 elem;
1304
1305 var id = elem[ expando ];
1306
1307 // If we want to remove a specific section of the element's data
1308 if ( name ) {
1309 if ( jQuery.cache[ id ] ) {
1310 // Remove the section of cache data
1311 delete jQuery.cache[ id ][ name ];
1312
1313 // If we've removed all the data, remove the element's cache
1314 name = "";
1315
1316 for ( name in jQuery.cache[ id ] )
1317 break;
1318
1319 if ( !name )
1320 jQuery.removeData( elem );
1321 }
1322
1323 // Otherwise, we want to remove all of the element's data
1324 } else {
1325 // Clean up the element expando
1326 try {
1327 delete elem[ expando ];
1328 } catch(e){
1329 // IE has trouble directly removing the expando
1330 // but it's ok with using removeAttribute
1331 if ( elem.removeAttribute )
1332 elem.removeAttribute( expando );
1333 }
1334
1335 // Completely remove the data cache
1336 delete jQuery.cache[ id ];
1337 }
1338 },
1339 queue: function( elem, type, data ) {
1340 if ( elem ){
1341
1342 type = (type || "fx") + "queue";
1343
1344 var q = jQuery.data( elem, type );
1345
1346 if ( !q || jQuery.isArray(data) )
1347 q = jQuery.data( elem, type, jQuery.makeArray(data) );
1348 else if( data )
1349 q.push( data );
1350
1351 }
1352 return q;
1353 },
1354
1355 dequeue: function( elem, type ){
1356 var queue = jQuery.queue( elem, type ),
1357 fn = queue.shift();
1358
1359 if( !type || type === "fx" )
1360 fn = queue[0];
1361
1362 if( fn !== undefined )
1363 fn.call(elem);
1364 }
1365 });
1366
1367 jQuery.fn.extend({
1368 data: function( key, value ){
1369 var parts = key.split(".");
1370 parts[1] = parts[1] ? "." + parts[1] : "";
1371
1372 if ( value === undefined ) {
1373 var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1374
1375 if ( data === undefined && this.length )
1376 data = jQuery.data( this[0], key );
1377
1378 return data === undefined && parts[1] ?
1379 this.data( parts[0] ) :
1380 data;
1381 } else
1382 return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
1383 jQuery.data( this, key, value );
1384 });
1385 },
1386
1387 removeData: function( key ){
1388 return this.each(function(){
1389 jQuery.removeData( this, key );
1390 });
1391 },
1392 queue: function(type, data){
1393 if ( typeof type !== "string" ) {
1394 data = type;
1395 type = "fx";
1396 }
1397
1398 if ( data === undefined )
1399 return jQuery.queue( this[0], type );
1400
1401 return this.each(function(){
1402 var queue = jQuery.queue( this, type, data );
1403
1404 if( type == "fx" && queue.length == 1 )
1405 queue[0].call(this);
1406 });
1407 },
1408 dequeue: function(type){
1409 return this.each(function(){
1410 jQuery.dequeue( this, type );
1411 });
1412 }
1413 });/*!
1414 * Sizzle CSS Selector Engine - v0.9.3
1415 * Copyright 2009, The Dojo Foundation
1416 * Released under the MIT, BSD, and GPL Licenses.
1417 * More information: http://sizzlejs.com/
1418 */
1419 (function(){
1420
1421 var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,
1422 done = 0,
1423 toString = Object.prototype.toString;
1424
1425 var Sizzle = function(selector, context, results, seed) {
1426 results = results || [];
1427 context = context || document;
1428
1429 if ( context.nodeType !== 1 && context.nodeType !== 9 )
1430 return [];
1431
1432 if ( !selector || typeof selector !== "string" ) {
1433 return results;
1434 }
1435
1436 var parts = [], m, set, checkSet, check, mode, extra, prune = true;
1437
1438 // Reset the position of the chunker regexp (start from head)
1439 chunker.lastIndex = 0;
1440
1441 while ( (m = chunker.exec(selector)) !== null ) {
1442 parts.push( m[1] );
1443
1444 if ( m[2] ) {
1445 extra = RegExp.rightContext;
1446 break;
1447 }
1448 }
1449
1450 if ( parts.length > 1 && origPOS.exec( selector ) ) {
1451 if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
1452 set = posProcess( parts[0] + parts[1], context );
1453 } else {
1454 set = Expr.relative[ parts[0] ] ?
1455 [ context ] :
1456 Sizzle( parts.shift(), context );
1457
1458 while ( parts.length ) {
1459 selector = parts.shift();
1460
1461 if ( Expr.relative[ selector ] )
1462 selector += parts.shift();
1463
1464 set = posProcess( selector, set );
1465 }
1466 }
1467 } else {
1468 var ret = seed ?
1469 { expr: parts.pop(), set: makeArray(seed) } :
1470 Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context, isXML(context) );
1471 set = Sizzle.filter( ret.expr, ret.set );
1472
1473 if ( parts.length > 0 ) {
1474 checkSet = makeArray(set);
1475 } else {
1476 prune = false;
1477 }
1478
1479 while ( parts.length ) {
1480 var cur = parts.pop(), pop = cur;
1481
1482 if ( !Expr.relative[ cur ] ) {
1483 cur = "";
1484 } else {
1485 pop = parts.pop();
1486 }
1487
1488 if ( pop == null ) {
1489 pop = context;
1490 }
1491
1492 Expr.relative[ cur ]( checkSet, pop, isXML(context) );
1493 }
1494 }
1495
1496 if ( !checkSet ) {
1497 checkSet = set;
1498 }
1499
1500 if ( !checkSet ) {
1501 throw "Syntax error, unrecognized expression: " + (cur || selector);
1502 }
1503
1504 if ( toString.call(checkSet) === "[object Array]" ) {
1505 if ( !prune ) {
1506 results.push.apply( results, checkSet );
1507 } else if ( context.nodeType === 1 ) {
1508 for ( var i = 0; checkSet[i] != null; i++ ) {
1509 if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
1510 results.push( set[i] );
1511 }
1512 }
1513 } else {
1514 for ( var i = 0; checkSet[i] != null; i++ ) {
1515 if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
1516 results.push( set[i] );
1517 }
1518 }
1519 }
1520 } else {
1521 makeArray( checkSet, results );
1522 }
1523
1524 if ( extra ) {
1525 Sizzle( extra, context, results, seed );
1526
1527 if ( sortOrder ) {
1528 hasDuplicate = false;
1529 results.sort(sortOrder);
1530
1531 if ( hasDuplicate ) {
1532 for ( var i = 1; i < results.length; i++ ) {
1533 if ( results[i] === results[i-1] ) {
1534 results.splice(i--, 1);
1535 }
1536 }
1537 }
1538 }
1539 }
1540
1541 return results;
1542 };
1543
1544 Sizzle.matches = function(expr, set){
1545 return Sizzle(expr, null, null, set);
1546 };
1547
1548 Sizzle.find = function(expr, context, isXML){
1549 var set, match;
1550
1551 if ( !expr ) {
1552 return [];
1553 }
1554
1555 for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
1556 var type = Expr.order[i], match;
1557
1558 if ( (match = Expr.match[ type ].exec( expr )) ) {
1559 var left = RegExp.leftContext;
1560
1561 if ( left.substr( left.length - 1 ) !== "\\" ) {
1562 match[1] = (match[1] || "").replace(/\\/g, "");
1563 set = Expr.find[ type ]( match, context, isXML );
1564 if ( set != null ) {
1565 expr = expr.replace( Expr.match[ type ], "" );
1566 break;
1567 }
1568 }
1569 }
1570 }
1571
1572 if ( !set ) {
1573 set = context.getElementsByTagName("*");
1574 }
1575
1576 return {set: set, expr: expr};
1577 };
1578
1579 Sizzle.filter = function(expr, set, inplace, not){
1580 var old = expr, result = [], curLoop = set, match, anyFound,
1581 isXMLFilter = set && set[0] && isXML(set[0]);
1582
1583 while ( expr && set.length ) {
1584 for ( var type in Expr.filter ) {
1585 if ( (match = Expr.match[ type ].exec( expr )) != null ) {
1586 var filter = Expr.filter[ type ], found, item;
1587 anyFound = false;
1588
1589 if ( curLoop == result ) {
1590 result = [];
1591 }
1592
1593 if ( Expr.preFilter[ type ] ) {
1594 match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
1595
1596 if ( !match ) {
1597 anyFound = found = true;
1598 } else if ( match === true ) {
1599 continue;
1600 }
1601 }
1602
1603 if ( match ) {
1604 for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
1605 if ( item ) {
1606 found = filter( item, match, i, curLoop );
1607 var pass = not ^ !!found;
1608
1609 if ( inplace && found != null ) {
1610 if ( pass ) {
1611 anyFound = true;
1612 } else {
1613 curLoop[i] = false;
1614 }
1615 } else if ( pass ) {
1616 result.push( item );
1617 anyFound = true;
1618 }
1619 }
1620 }
1621 }
1622
1623 if ( found !== undefined ) {
1624 if ( !inplace ) {
1625 curLoop = result;
1626 }
1627
1628 expr = expr.replace( Expr.match[ type ], "" );
1629
1630 if ( !anyFound ) {
1631 return [];
1632 }
1633
1634 break;
1635 }
1636 }
1637 }
1638
1639 // Improper expression
1640 if ( expr == old ) {
1641 if ( anyFound == null ) {
1642 throw "Syntax error, unrecognized expression: " + expr;
1643 } else {
1644 break;
1645 }
1646 }
1647
1648 old = expr;
1649 }
1650
1651 return curLoop;
1652 };
1653
1654 var Expr = Sizzle.selectors = {
1655 order: [ "ID", "NAME", "TAG" ],
1656 match: {
1657 ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
1658 CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
1659 NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,
1660 ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
1661 TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,
1662 CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
1663 POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
1664 PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
1665 },
1666 attrMap: {
1667 "class": "className",
1668 "for": "htmlFor"
1669 },
1670 attrHandle: {
1671 href: function(elem){
1672 return elem.getAttribute("href");
1673 }
1674 },
1675 relative: {
1676 "+": function(checkSet, part, isXML){
1677 var isPartStr = typeof part === "string",
1678 isTag = isPartStr && !/\W/.test(part),
1679 isPartStrNotTag = isPartStr && !isTag;
1680
1681 if ( isTag && !isXML ) {
1682 part = part.toUpperCase();
1683 }
1684
1685 for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
1686 if ( (elem = checkSet[i]) ) {
1687 while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
1688
1689 checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ?
1690 elem || false :
1691 elem === part;
1692 }
1693 }
1694
1695 if ( isPartStrNotTag ) {
1696 Sizzle.filter( part, checkSet, true );
1697 }
1698 },
1699 ">": function(checkSet, part, isXML){
1700 var isPartStr = typeof part === "string";
1701
1702 if ( isPartStr && !/\W/.test(part) ) {
1703 part = isXML ? part : part.toUpperCase();
1704
1705 for ( var i = 0, l = checkSet.length; i < l; i++ ) {
1706 var elem = checkSet[i];
1707 if ( elem ) {
1708 var parent = elem.parentNode;
1709 checkSet[i] = parent.nodeName === part ? parent : false;
1710 }
1711 }
1712 } else {
1713 for ( var i = 0, l = checkSet.length; i < l; i++ ) {
1714 var elem = checkSet[i];
1715 if ( elem ) {
1716 checkSet[i] = isPartStr ?
1717 elem.parentNode :
1718 elem.parentNode === part;
1719 }
1720 }
1721
1722 if ( isPartStr ) {
1723 Sizzle.filter( part, checkSet, true );
1724 }
1725 }
1726 },
1727 "": function(checkSet, part, isXML){
1728 var doneName = done++, checkFn = dirCheck;
1729
1730 if ( !part.match(/\W/) ) {
1731 var nodeCheck = part = isXML ? part : part.toUpperCase();
1732 checkFn = dirNodeCheck;
1733 }
1734
1735 checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
1736 },
1737 "~": function(checkSet, part, isXML){
1738 var doneName = done++, checkFn = dirCheck;
1739
1740 if ( typeof part === "string" && !part.match(/\W/) ) {
1741 var nodeCheck = part = isXML ? part : part.toUpperCase();
1742 checkFn = dirNodeCheck;
1743 }
1744
1745 checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
1746 }
1747 },
1748 find: {
1749 ID: function(match, context, isXML){
1750 if ( typeof context.getElementById !== "undefined" && !isXML ) {
1751 var m = context.getElementById(match[1]);
1752 return m ? [m] : [];
1753 }
1754 },
1755 NAME: function(match, context, isXML){
1756 if ( typeof context.getElementsByName !== "undefined" ) {
1757 var ret = [], results = context.getElementsByName(match[1]);
1758
1759 for ( var i = 0, l = results.length; i < l; i++ ) {
1760 if ( results[i].getAttribute("name") === match[1] ) {
1761 ret.push( results[i] );
1762 }
1763 }
1764
1765 return ret.length === 0 ? null : ret;
1766 }
1767 },
1768 TAG: function(match, context){
1769 return context.getElementsByTagName(match[1]);
1770 }
1771 },
1772 preFilter: {
1773 CLASS: function(match, curLoop, inplace, result, not, isXML){
1774 match = " " + match[1].replace(/\\/g, "") + " ";
1775
1776 if ( isXML ) {
1777 return match;
1778 }
1779
1780 for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
1781 if ( elem ) {
1782 if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) {
1783 if ( !inplace )
1784 result.push( elem );
1785 } else if ( inplace ) {
1786 curLoop[i] = false;
1787 }
1788 }
1789 }
1790
1791 return false;
1792 },
1793 ID: function(match){
1794 return match[1].replace(/\\/g, "");
1795 },
1796 TAG: function(match, curLoop){
1797 for ( var i = 0; curLoop[i] === false; i++ ){}
1798 return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
1799 },
1800 CHILD: function(match){
1801 if ( match[1] == "nth" ) {
1802 // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
1803 var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
1804 match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
1805 !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
1806
1807 // calculate the numbers (first)n+(last) including if they are negative
1808 match[2] = (test[1] + (test[2] || 1)) - 0;
1809 match[3] = test[3] - 0;
1810 }
1811
1812 // TODO: Move to normal caching system
1813 match[0] = done++;
1814
1815 return match;
1816 },
1817 ATTR: function(match, curLoop, inplace, result, not, isXML){
1818 var name = match[1].replace(/\\/g, "");
1819
1820 if ( !isXML && Expr.attrMap[name] ) {
1821 match[1] = Expr.attrMap[name];
1822 }
1823
1824 if ( match[2] === "~=" ) {
1825 match[4] = " " + match[4] + " ";
1826 }
1827
1828 return match;
1829 },
1830 PSEUDO: function(match, curLoop, inplace, result, not){
1831 if ( match[1] === "not" ) {
1832 // If we're dealing with a complex expression, or a simple one
1833 if ( match[3].match(chunker).length > 1 || /^\w/.test(match[3]) ) {
1834 match[3] = Sizzle(match[3], null, null, curLoop);
1835 } else {
1836 var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
1837 if ( !inplace ) {
1838 result.push.apply( result, ret );
1839 }
1840 return false;
1841 }
1842 } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
1843 return true;
1844 }
1845
1846 return match;
1847 },
1848 POS: function(match){
1849 match.unshift( true );
1850 return match;
1851 }
1852 },
1853 filters: {
1854 enabled: function(elem){
1855 return elem.disabled === false && elem.type !== "hidden";
1856 },
1857 disabled: function(elem){
1858 return elem.disabled === true;
1859 },
1860 checked: function(elem){
1861 return elem.checked === true;
1862 },
1863 selected: function(elem){
1864 // Accessing this property makes selected-by-default
1865 // options in Safari work properly
1866 elem.parentNode.selectedIndex;
1867 return elem.selected === true;
1868 },
1869 parent: function(elem){
1870 return !!elem.firstChild;
1871 },
1872 empty: function(elem){
1873 return !elem.firstChild;
1874 },
1875 has: function(elem, i, match){
1876 return !!Sizzle( match[3], elem ).length;
1877 },
1878 header: function(elem){
1879 return /h\d/i.test( elem.nodeName );
1880 },
1881 text: function(elem){
1882 return "text" === elem.type;
1883 },
1884 radio: function(elem){
1885 return "radio" === elem.type;
1886 },
1887 checkbox: function(elem){
1888 return "checkbox" === elem.type;
1889 },
1890 file: function(elem){
1891 return "file" === elem.type;
1892 },
1893 password: function(elem){
1894 return "password" === elem.type;
1895 },
1896 submit: function(elem){
1897 return "submit" === elem.type;
1898 },
1899 image: function(elem){
1900 return "image" === elem.type;
1901 },
1902 reset: function(elem){
1903 return "reset" === elem.type;
1904 },
1905 button: function(elem){
1906 return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
1907 },
1908 input: function(elem){
1909 return /input|select|textarea|button/i.test(elem.nodeName);
1910 }
1911 },
1912 setFilters: {
1913 first: function(elem, i){
1914 return i === 0;
1915 },
1916 last: function(elem, i, match, array){
1917 return i === array.length - 1;
1918 },
1919 even: function(elem, i){
1920 return i % 2 === 0;
1921 },
1922 odd: function(elem, i){
1923 return i % 2 === 1;
1924 },
1925 lt: function(elem, i, match){
1926 return i < match[3] - 0;
1927 },
1928 gt: function(elem, i, match){
1929 return i > match[3] - 0;
1930 },
1931 nth: function(elem, i, match){
1932 return match[3] - 0 == i;
1933 },
1934 eq: function(elem, i, match){
1935 return match[3] - 0 == i;
1936 }
1937 },
1938 filter: {
1939 PSEUDO: function(elem, match, i, array){
1940 var name = match[1], filter = Expr.filters[ name ];
1941
1942 if ( filter ) {
1943 return filter( elem, i, match, array );
1944 } else if ( name === "contains" ) {
1945 return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
1946 } else if ( name === "not" ) {
1947 var not = match[3];
1948
1949 for ( var i = 0, l = not.length; i < l; i++ ) {
1950 if ( not[i] === elem ) {
1951 return false;
1952 }
1953 }
1954
1955 return true;
1956 }
1957 },
1958 CHILD: function(elem, match){
1959 var type = match[1], node = elem;
1960 switch (type) {
1961 case 'only':
1962 case 'first':
1963 while (node = node.previousSibling) {
1964 if ( node.nodeType === 1 ) return false;
1965 }
1966 if ( type == 'first') return true;
1967 node = elem;
1968 case 'last':
1969 while (node = node.nextSibling) {
1970 if ( node.nodeType === 1 ) return false;
1971 }
1972 return true;
1973 case 'nth':
1974 var first = match[2], last = match[3];
1975
1976 if ( first == 1 && last == 0 ) {
1977 return true;
1978 }
1979
1980 var doneName = match[0],
1981 parent = elem.parentNode;
1982
1983 if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
1984 var count = 0;
1985 for ( node = parent.firstChild; node; node = node.nextSibling ) {
1986 if ( node.nodeType === 1 ) {
1987 node.nodeIndex = ++count;
1988 }
1989 }
1990 parent.sizcache = doneName;
1991 }
1992
1993 var diff = elem.nodeIndex - last;
1994 if ( first == 0 ) {
1995 return diff == 0;
1996 } else {
1997 return ( diff % first == 0 && diff / first >= 0 );
1998 }
1999 }
2000 },
2001 ID: function(elem, match){
2002 return elem.nodeType === 1 && elem.getAttribute("id") === match;
2003 },
2004 TAG: function(elem, match){
2005 return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
2006 },
2007 CLASS: function(elem, match){
2008 return (" " + (elem.className || elem.getAttribute("class")) + " ")
2009 .indexOf( match ) > -1;
2010 },
2011 ATTR: function(elem, match){
2012 var name = match[1],
2013 result = Expr.attrHandle[ name ] ?
2014 Expr.attrHandle[ name ]( elem ) :
2015 elem[ name ] != null ?
2016 elem[ name ] :
2017 elem.getAttribute( name ),
2018 value = result + "",
2019 type = match[2],
2020 check = match[4];
2021
2022 return result == null ?
2023 type === "!=" :
2024 type === "=" ?
2025 value === check :
2026 type === "*=" ?
2027 value.indexOf(check) >= 0 :
2028 type === "~=" ?
2029 (" " + value + " ").indexOf(check) >= 0 :
2030 !check ?
2031 value && result !== false :
2032 type === "!=" ?
2033 value != check :
2034 type === "^=" ?
2035 value.indexOf(check) === 0 :
2036 type === "$=" ?
2037 value.substr(value.length - check.length) === check :
2038 type === "|=" ?
2039 value === check || value.substr(0, check.length + 1) === check + "-" :
2040 false;
2041 },
2042 POS: function(elem, match, i, array){
2043 var name = match[2], filter = Expr.setFilters[ name ];
2044
2045 if ( filter ) {
2046 return filter( elem, i, match, array );
2047 }
2048 }
2049 }
2050 };
2051
2052 var origPOS = Expr.match.POS;
2053
2054 for ( var type in Expr.match ) {
2055 Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
2056 }
2057
2058 var makeArray = function(array, results) {
2059 array = Array.prototype.slice.call( array );
2060
2061 if ( results ) {
2062 results.push.apply( results, array );
2063 return results;
2064 }
2065
2066 return array;
2067 };
2068
2069 // Perform a simple check to determine if the browser is capable of
2070 // converting a NodeList to an array using builtin methods.
2071 try {
2072 Array.prototype.slice.call( document.documentElement.childNodes );
2073
2074 // Provide a fallback method if it does not work
2075 } catch(e){
2076 makeArray = function(array, results) {
2077 var ret = results || [];
2078
2079 if ( toString.call(array) === "[object Array]" ) {
2080 Array.prototype.push.apply( ret, array );
2081 } else {
2082 if ( typeof array.length === "number" ) {
2083 for ( var i = 0, l = array.length; i < l; i++ ) {
2084 ret.push( array[i] );
2085 }
2086 } else {
2087 for ( var i = 0; array[i]; i++ ) {
2088 ret.push( array[i] );
2089 }
2090 }
2091 }
2092
2093 return ret;
2094 };
2095 }
2096
2097 var sortOrder;
2098
2099 if ( document.documentElement.compareDocumentPosition ) {
2100 sortOrder = function( a, b ) {
2101 var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
2102 if ( ret === 0 ) {
2103 hasDuplicate = true;
2104 }
2105 return ret;
2106 };
2107 } else if ( "sourceIndex" in document.documentElement ) {
2108 sortOrder = function( a, b ) {
2109 var ret = a.sourceIndex - b.sourceIndex;
2110 if ( ret === 0 ) {
2111 hasDuplicate = true;
2112 }
2113 return ret;
2114 };
2115 } else if ( document.createRange ) {
2116 sortOrder = function( a, b ) {
2117 var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
2118 aRange.selectNode(a);
2119 aRange.collapse(true);
2120 bRange.selectNode(b);
2121 bRange.collapse(true);
2122 var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
2123 if ( ret === 0 ) {
2124 hasDuplicate = true;
2125 }
2126 return ret;
2127 };
2128 }
2129
2130 // Check to see if the browser returns elements by name when
2131 // querying by getElementById (and provide a workaround)
2132 (function(){
2133 // We're going to inject a fake input element with a specified name
2134 var form = document.createElement("form"),
2135 id = "script" + (new Date).getTime();
2136 form.innerHTML = "<input name='" + id + "'/>";
2137
2138 // Inject it into the root element, check its status, and remove it quickly
2139 var root = document.documentElement;
2140 root.insertBefore( form, root.firstChild );
2141
2142 // The workaround has to do additional checks after a getElementById
2143 // Which slows things down for other browsers (hence the branching)
2144 if ( !!document.getElementById( id ) ) {
2145 Expr.find.ID = function(match, context, isXML){
2146 if ( typeof context.getElementById !== "undefined" && !isXML ) {
2147 var m = context.getElementById(match[1]);
2148 return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
2149 }
2150 };
2151
2152 Expr.filter.ID = function(elem, match){
2153 var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
2154 return elem.nodeType === 1 && node && node.nodeValue === match;
2155 };
2156 }
2157
2158 root.removeChild( form );
2159 })();
2160
2161 (function(){
2162 // Check to see if the browser returns only elements
2163 // when doing getElementsByTagName("*")
2164
2165 // Create a fake element
2166 var div = document.createElement("div");
2167 div.appendChild( document.createComment("") );
2168
2169 // Make sure no comments are found
2170 if ( div.getElementsByTagName("*").length > 0 ) {
2171 Expr.find.TAG = function(match, context){
2172 var results = context.getElementsByTagName(match[1]);
2173
2174 // Filter out possible comments
2175 if ( match[1] === "*" ) {
2176 var tmp = [];
2177
2178 for ( var i = 0; results[i]; i++ ) {
2179 if ( results[i].nodeType === 1 ) {
2180 tmp.push( results[i] );
2181 }
2182 }
2183
2184 results = tmp;
2185 }
2186
2187 return results;
2188 };
2189 }
2190
2191 // Check to see if an attribute returns normalized href attributes
2192 div.innerHTML = "<a href='#'></a>";
2193 if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
2194 div.firstChild.getAttribute("href") !== "#" ) {
2195 Expr.attrHandle.href = function(elem){
2196 return elem.getAttribute("href", 2);
2197 };
2198 }
2199 })();
2200
2201 if ( document.querySelectorAll ) (function(){
2202 var oldSizzle = Sizzle, div = document.createElement("div");
2203 div.innerHTML = "<p class='TEST'></p>";
2204
2205 // Safari can't handle uppercase or unicode characters when
2206 // in quirks mode.
2207 if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
2208 return;
2209 }
2210
2211 Sizzle = function(query, context, extra, seed){
2212 context = context || document;
2213
2214 // Only use querySelectorAll on non-XML documents
2215 // (ID selectors don't work in non-HTML documents)
2216 if ( !seed && context.nodeType === 9 && !isXML(context) ) {
2217 try {
2218 return makeArray( context.querySelectorAll(query), extra );
2219 } catch(e){}
2220 }
2221
2222 return oldSizzle(query, context, extra, seed);
2223 };
2224
2225 Sizzle.find = oldSizzle.find;
2226 Sizzle.filter = oldSizzle.filter;
2227 Sizzle.selectors = oldSizzle.selectors;
2228 Sizzle.matches = oldSizzle.matches;
2229 })();
2230
2231 if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){
2232 var div = document.createElement("div");
2233 div.innerHTML = "<div class='test e'></div><div class='test'></div>";
2234
2235 // Opera can't find a second classname (in 9.6)
2236 if ( div.getElementsByClassName("e").length === 0 )
2237 return;
2238
2239 // Safari caches class attributes, doesn't catch changes (in 3.2)
2240 div.lastChild.className = "e";
2241
2242 if ( div.getElementsByClassName("e").length === 1 )
2243 return;
2244
2245 Expr.order.splice(1, 0, "CLASS");
2246 Expr.find.CLASS = function(match, context, isXML) {
2247 if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
2248 return context.getElementsByClassName(match[1]);
2249 }
2250 };
2251 })();
2252
2253 function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
2254 var sibDir = dir == "previousSibling" && !isXML;
2255 for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2256 var elem = checkSet[i];
2257 if ( elem ) {
2258 if ( sibDir && elem.nodeType === 1 ){
2259 elem.sizcache = doneName;
2260 elem.sizset = i;
2261 }
2262 elem = elem[dir];
2263 var match = false;
2264
2265 while ( elem ) {
2266 if ( elem.sizcache === doneName ) {
2267 match = checkSet[elem.sizset];
2268 break;
2269 }
2270
2271 if ( elem.nodeType === 1 && !isXML ){
2272 elem.sizcache = doneName;
2273 elem.sizset = i;
2274 }
2275
2276 if ( elem.nodeName === cur ) {
2277 match = elem;
2278 break;
2279 }
2280
2281 elem = elem[dir];
2282 }
2283
2284 checkSet[i] = match;
2285 }
2286 }
2287 }
2288
2289 function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
2290 var sibDir = dir == "previousSibling" && !isXML;
2291 for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2292 var elem = checkSet[i];
2293 if ( elem ) {
2294 if ( sibDir && elem.nodeType === 1 ) {
2295 elem.sizcache = doneName;
2296 elem.sizset = i;
2297 }
2298 elem = elem[dir];
2299 var match = false;
2300
2301 while ( elem ) {
2302 if ( elem.sizcache === doneName ) {
2303 match = checkSet[elem.sizset];
2304 break;
2305 }
2306
2307 if ( elem.nodeType === 1 ) {
2308 if ( !isXML ) {
2309 elem.sizcache = doneName;
2310 elem.sizset = i;
2311 }
2312 if ( typeof cur !== "string" ) {
2313 if ( elem === cur ) {
2314 match = true;
2315 break;
2316 }
2317
2318 } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
2319 match = elem;
2320 break;
2321 }
2322 }
2323
2324 elem = elem[dir];
2325 }
2326
2327 checkSet[i] = match;
2328 }
2329 }
2330 }
2331
2332 var contains = document.compareDocumentPosition ? function(a, b){
2333 return a.compareDocumentPosition(b) & 16;
2334 } : function(a, b){
2335 return a !== b && (a.contains ? a.contains(b) : true);
2336 };
2337
2338 var isXML = function(elem){
2339 return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
2340 !!elem.ownerDocument && isXML( elem.ownerDocument );
2341 };
2342
2343 var posProcess = function(selector, context){
2344 var tmpSet = [], later = "", match,
2345 root = context.nodeType ? [context] : context;
2346
2347 // Position selectors must be done after the filter
2348 // And so must :not(positional) so we move all PSEUDOs to the end
2349 while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
2350 later += match[0];
2351 selector = selector.replace( Expr.match.PSEUDO, "" );
2352 }
2353
2354 selector = Expr.relative[selector] ? selector + "*" : selector;
2355
2356 for ( var i = 0, l = root.length; i < l; i++ ) {
2357 Sizzle( selector, root[i], tmpSet );
2358 }
2359
2360 return Sizzle.filter( later, tmpSet );
2361 };
2362
2363 // EXPOSE
2364 jQuery.find = Sizzle;
2365 jQuery.filter = Sizzle.filter;
2366 jQuery.expr = Sizzle.selectors;
2367 jQuery.expr[":"] = jQuery.expr.filters;
2368
2369 Sizzle.selectors.filters.hidden = function(elem){
2370 return elem.offsetWidth === 0 || elem.offsetHeight === 0;
2371 };
2372
2373 Sizzle.selectors.filters.visible = function(elem){
2374 return elem.offsetWidth > 0 || elem.offsetHeight > 0;
2375 };
2376
2377 Sizzle.selectors.filters.animated = function(elem){
2378 return jQuery.grep(jQuery.timers, function(fn){
2379 return elem === fn.elem;
2380 }).length;
2381 };
2382
2383 jQuery.multiFilter = function( expr, elems, not ) {
2384 if ( not ) {
2385 expr = ":not(" + expr + ")";
2386 }
2387
2388 return Sizzle.matches(expr, elems);
2389 };
2390
2391 jQuery.dir = function( elem, dir ){
2392 var matched = [], cur = elem[dir];
2393 while ( cur && cur != document ) {
2394 if ( cur.nodeType == 1 )
2395 matched.push( cur );
2396 cur = cur[dir];
2397 }
2398 return matched;
2399 };
2400
2401 jQuery.nth = function(cur, result, dir, elem){
2402 result = result || 1;
2403 var num = 0;
2404
2405 for ( ; cur; cur = cur[dir] )
2406 if ( cur.nodeType == 1 && ++num == result )
2407 break;
2408
2409 return cur;
2410 };
2411
2412 jQuery.sibling = function(n, elem){
2413 var r = [];
2414
2415 for ( ; n; n = n.nextSibling ) {
2416 if ( n.nodeType == 1 && n != elem )
2417 r.push( n );
2418 }
2419
2420 return r;
2421 };
2422
2423 return;
2424
2425 window.Sizzle = Sizzle;
2426
2427 })();
2428 /*
2429 * A number of helper functions used for managing events.
2430 * Many of the ideas behind this code originated from
2431 * Dean Edwards' addEvent library.
2432 */
2433 jQuery.event = {
2434
2435 // Bind an event to an element
2436 // Original by Dean Edwards
2437 add: function(elem, types, handler, data) {
2438 if ( elem.nodeType == 3 || elem.nodeType == 8 )
2439 return;
2440
2441 // For whatever reason, IE has trouble passing the window object
2442 // around, causing it to be cloned in the process
2443 if ( elem.setInterval && elem != window )
2444 elem = window;
2445
2446 // Make sure that the function being executed has a unique ID
2447 if ( !handler.guid )
2448 handler.guid = this.guid++;
2449
2450 // if data is passed, bind to handler
2451 if ( data !== undefined ) {
2452 // Create temporary function pointer to original handler
2453 var fn = handler;
2454
2455 // Create unique handler function, wrapped around original handler
2456 handler = this.proxy( fn );
2457
2458 // Store data in unique handler
2459 handler.data = data;
2460 }
2461
2462 // Init the element's event structure
2463 var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
2464 handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
2465 // Handle the second event of a trigger and when
2466 // an event is called after a page has unloaded
2467 return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
2468 jQuery.event.handle.apply(arguments.callee.elem, arguments) :
2469 undefined;
2470 });
2471 // Add elem as a property of the handle function
2472 // This is to prevent a memory leak with non-native
2473 // event in IE.
2474 handle.elem = elem;
2475
2476 // Handle multiple events separated by a space
2477 // jQuery(...).bind("mouseover mouseout", fn);
2478 jQuery.each(types.split(/\s+/), function(index, type) {
2479 // Namespaced event handlers
2480 var namespaces = type.split(".");
2481 type = namespaces.shift();
2482 handler.type = namespaces.slice().sort().join(".");
2483
2484 // Get the current list of functions bound to this event
2485 var handlers = events[type];
2486
2487 if ( jQuery.event.specialAll[type] )
2488 jQuery.event.specialAll[type].setup.call(elem, data, namespaces);
2489
2490 // Init the event handler queue
2491 if (!handlers) {
2492 handlers = events[type] = {};
2493
2494 // Check for a special event handler
2495 // Only use addEventListener/attachEvent if the special
2496 // events handler returns false
2497 if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) {
2498 // Bind the global event handler to the element
2499 if (elem.addEventListener)
2500 elem.addEventListener(type, handle, false);
2501 else if (elem.attachEvent)
2502 elem.attachEvent("on" + type, handle);
2503 }
2504 }
2505
2506 // Add the function to the element's handler list
2507 handlers[handler.guid] = handler;
2508
2509 // Keep track of which events have been used, for global triggering
2510 jQuery.event.global[type] = true;
2511 });
2512
2513 // Nullify elem to prevent memory leaks in IE
2514 elem = null;
2515 },
2516
2517 guid: 1,
2518 global: {},
2519
2520 // Detach an event or set of events from an element
2521 remove: function(elem, types, handler) {
2522 // don't do events on text and comment nodes
2523 if ( elem.nodeType == 3 || elem.nodeType == 8 )
2524 return;
2525
2526 var events = jQuery.data(elem, "events"), ret, index;
2527
2528 if ( events ) {
2529 // Unbind all events for the element
2530 if ( types === undefined || (typeof types === "string" && types.charAt(0) == ".") )
2531 for ( var type in events )
2532 this.remove( elem, type + (types || "") );
2533 else {
2534 // types is actually an event object here
2535 if ( types.type ) {
2536 handler = types.handler;
2537 types = types.type;
2538 }
2539
2540 // Handle multiple events seperated by a space
2541 // jQuery(...).unbind("mouseover mouseout", fn);
2542 jQuery.each(types.split(/\s+/), function(index, type){
2543 // Namespaced event handlers
2544 var namespaces = type.split(".");
2545 type = namespaces.shift();
2546 var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
2547
2548 if ( events[type] ) {
2549 // remove the given handler for the given type
2550 if ( handler )
2551 delete events[type][handler.guid];
2552
2553 // remove all handlers for the given type
2554 else
2555 for ( var handle in events[type] )
2556 // Handle the removal of namespaced events
2557 if ( namespace.test(events[type][handle].type) )
2558 delete events[type][handle];
2559
2560 if ( jQuery.event.specialAll[type] )
2561 jQuery.event.specialAll[type].teardown.call(elem, namespaces);
2562
2563 // remove generic event handler if no more handlers exist
2564 for ( ret in events[type] ) break;
2565 if ( !ret ) {
2566 if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem, namespaces) === false ) {
2567 if (elem.removeEventListener)
2568 elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
2569 else if (elem.detachEvent)
2570 elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
2571 }
2572 ret = null;
2573 delete events[type];
2574 }
2575 }
2576 });
2577 }
2578
2579 // Remove the expando if it's no longer used
2580 for ( ret in events ) break;
2581 if ( !ret ) {
2582 var handle = jQuery.data( elem, "handle" );
2583 if ( handle ) handle.elem = null;
2584 jQuery.removeData( elem, "events" );
2585 jQuery.removeData( elem, "handle" );
2586 }
2587 }
2588 },
2589
2590 // bubbling is internal
2591 trigger: function( event, data, elem, bubbling ) {
2592 // Event object or event type
2593 var type = event.type || event;
2594
2595 if( !bubbling ){
2596 event = typeof event === "object" ?
2597 // jQuery.Event object
2598 event[expando] ? event :
2599 // Object literal
2600 jQuery.extend( jQuery.Event(type), event ) :
2601 // Just the event type (string)
2602 jQuery.Event(type);
2603
2604 if ( type.indexOf("!") >= 0 ) {
2605 event.type = type = type.slice(0, -1);
2606 event.exclusive = true;
2607 }
2608
2609 // Handle a global trigger
2610 if ( !elem ) {
2611 // Don't bubble custom events when global (to avoid too much overhead)
2612 event.stopPropagation();
2613 // Only trigger if we've ever bound an event for it
2614 if ( this.global[type] )
2615 jQuery.each( jQuery.cache, function(){
2616 if ( this.events && this.events[type] )
2617 jQuery.event.trigger( event, data, this.handle.elem );
2618 });
2619 }
2620
2621 // Handle triggering a single element
2622
2623 // don't do events on text and comment nodes
2624 if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 )
2625 return undefined;
2626
2627 // Clean up in case it is reused
2628 event.result = undefined;
2629 event.target = elem;
2630
2631 // Clone the incoming data, if any
2632 data = jQuery.makeArray(data);
2633 data.unshift( event );
2634 }
2635
2636 event.currentTarget = elem;
2637
2638 // Trigger the event, it is assumed that "handle" is a function
2639 var handle = jQuery.data(elem, "handle");
2640 if ( handle )
2641 handle.apply( elem, data );
2642
2643 // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
2644 if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
2645 event.result = false;
2646
2647 // Trigger the native events (except for clicks on links)
2648 if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
2649 this.triggered = true;
2650 try {
2651 elem[ type ]();
2652 // prevent IE from throwing an error for some hidden elements
2653 } catch (e) {}
2654 }
2655
2656 this.triggered = false;
2657
2658 if ( !event.isPropagationStopped() ) {
2659 var parent = elem.parentNode || elem.ownerDocument;
2660 if ( parent )
2661 jQuery.event.trigger(event, data, parent, true);
2662 }
2663 },
2664
2665 handle: function(event) {
2666 // returned undefined or false
2667 var all, handlers;
2668
2669 event = arguments[0] = jQuery.event.fix( event || window.event );
2670 event.currentTarget = this;
2671
2672 // Namespaced event handlers
2673 var namespaces = event.type.split(".");
2674 event.type = namespaces.shift();
2675
2676 // Cache this now, all = true means, any handler
2677 all = !namespaces.length && !event.exclusive;
2678
2679 var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
2680
2681 handlers = ( jQuery.data(this, "events") || {} )[event.type];
2682
2683 for ( var j in handlers ) {
2684 var handler = handlers[j];
2685
2686 // Filter the functions by class
2687 if ( all || namespace.test(handler.type) ) {
2688 // Pass in a reference to the handler function itself
2689 // So that we can later remove it
2690 event.handler = handler;
2691 event.data = handler.data;
2692
2693 var ret = handler.apply(this, arguments);
2694
2695 if( ret !== undefined ){
2696 event.result = ret;
2697 if ( ret === false ) {
2698 event.preventDefault();
2699 event.stopPropagation();
2700 }
2701 }
2702
2703 if( event.isImmediatePropagationStopped() )
2704 break;
2705
2706 }
2707 }
2708 },
2709
2710 props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
2711
2712 fix: function(event) {
2713 if ( event[expando] )
2714 return event;
2715
2716 // store a copy of the original event object
2717 // and "clone" to set read-only properties
2718 var originalEvent = event;
2719 event = jQuery.Event( originalEvent );
2720
2721 for ( var i = this.props.length, prop; i; ){
2722 prop = this.props[ --i ];
2723 event[ prop ] = originalEvent[ prop ];
2724 }
2725
2726 // Fix target property, if necessary
2727 if ( !event.target )
2728 event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
2729
2730 // check if target is a textnode (safari)
2731 if ( event.target.nodeType == 3 )
2732 event.target = event.target.parentNode;
2733
2734 // Add relatedTarget, if necessary
2735 if ( !event.relatedTarget && event.fromElement )
2736 event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
2737
2738 // Calculate pageX/Y if missing and clientX/Y available
2739 if ( event.pageX == null && event.clientX != null ) {
2740 var doc = document.documentElement, body = document.body;
2741 event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
2742 event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
2743 }
2744
2745 // Add which for key events
2746 if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
2747 event.which = event.charCode || event.keyCode;
2748
2749 // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
2750 if ( !event.metaKey && event.ctrlKey )
2751 event.metaKey = event.ctrlKey;
2752
2753 // Add which for click: 1 == left; 2 == middle; 3 == right
2754 // Note: button is not normalized, so don't use it
2755 if ( !event.which && event.button )
2756 event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
2757
2758 return event;
2759 },
2760
2761 proxy: function( fn, proxy ){
2762 proxy = proxy || function(){ return fn.apply(this, arguments); };
2763 // Set the guid of unique handler to the same of original handler, so it can be removed
2764 proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
2765 // So proxy can be declared as an argument
2766 return proxy;
2767 },
2768
2769 special: {
2770 ready: {
2771 // Make sure the ready event is setup
2772 setup: bindReady,
2773 teardown: function() {}
2774 }
2775 },
2776
2777 specialAll: {
2778 live: {
2779 setup: function( selector, namespaces ){
2780 jQuery.event.add( this, namespaces[0], liveHandler );
2781 },
2782 teardown: function( namespaces ){
2783 if ( namespaces.length ) {
2784 var remove = 0, name = RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)");
2785
2786 jQuery.each( (jQuery.data(this, "events").live || {}), function(){
2787 if ( name.test(this.type) )
2788 remove++;
2789 });
2790
2791 if ( remove < 1 )
2792 jQuery.event.remove( this, namespaces[0], liveHandler );
2793 }
2794 }
2795 }
2796 }
2797 };
2798
2799 jQuery.Event = function( src ){
2800 // Allow instantiation without the 'new' keyword
2801 if( !this.preventDefault )
2802 return new jQuery.Event(src);
2803
2804 // Event object
2805 if( src && src.type ){
2806 this.originalEvent = src;
2807 this.type = src.type;
2808 // Event type
2809 }else
2810 this.type = src;
2811
2812 // timeStamp is buggy for some events on Firefox(#3843)
2813 // So we won't rely on the native value
2814 this.timeStamp = now();
2815
2816 // Mark it as fixed
2817 this[expando] = true;
2818 };
2819
2820 function returnFalse(){
2821 return false;
2822 }
2823 function returnTrue(){
2824 return true;
2825 }
2826
2827 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
2828 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
2829 jQuery.Event.prototype = {
2830 preventDefault: function() {
2831 this.isDefaultPrevented = returnTrue;
2832
2833 var e = this.originalEvent;
2834 if( !e )
2835 return;
2836 // if preventDefault exists run it on the original event
2837 if (e.preventDefault)
2838 e.preventDefault();
2839 // otherwise set the returnValue property of the original event to false (IE)
2840 e.returnValue = false;
2841 },
2842 stopPropagation: function() {
2843 this.isPropagationStopped = returnTrue;
2844
2845 var e = this.originalEvent;
2846 if( !e )
2847 return;
2848 // if stopPropagation exists run it on the original event
2849 if (e.stopPropagation)
2850 e.stopPropagation();
2851 // otherwise set the cancelBubble property of the original event to true (IE)
2852 e.cancelBubble = true;
2853 },
2854 stopImmediatePropagation:function(){
2855 this.isImmediatePropagationStopped = returnTrue;
2856 this.stopPropagation();
2857 },
2858 isDefaultPrevented: returnFalse,
2859 isPropagationStopped: returnFalse,
2860 isImmediatePropagationStopped: returnFalse
2861 };
2862 // Checks if an event happened on an element within another element
2863 // Used in jQuery.event.special.mouseenter and mouseleave handlers
2864 var withinElement = function(event) {
2865 // Check if mouse(over|out) are still within the same parent element
2866 var parent = event.relatedTarget;
2867 // Traverse up the tree
2868 while ( parent && parent != this )
2869 try { parent = parent.parentNode; }
2870 catch(e) { parent = this; }
2871
2872 if( parent != this ){
2873 // set the correct event type
2874 event.type = event.data;
2875 // handle event if we actually just moused on to a non sub-element
2876 jQuery.event.handle.apply( this, arguments );
2877 }
2878 };
2879
2880 jQuery.each({
2881 mouseover: 'mouseenter',
2882 mouseout: 'mouseleave'
2883 }, function( orig, fix ){
2884 jQuery.event.special[ fix ] = {
2885 setup: function(){
2886 jQuery.event.add( this, orig, withinElement, fix );
2887 },
2888 teardown: function(){
2889 jQuery.event.remove( this, orig, withinElement );
2890 }
2891 };
2892 });
2893
2894 jQuery.fn.extend({
2895 bind: function( type, data, fn ) {
2896 return type == "unload" ? this.one(type, data, fn) : this.each(function(){
2897 jQuery.event.add( this, type, fn || data, fn && data );
2898 });
2899 },
2900
2901 one: function( type, data, fn ) {
2902 var one = jQuery.event.proxy( fn || data, function(event) {
2903 jQuery(this).unbind(event, one);
2904 return (fn || data).apply( this, arguments );
2905 });
2906 return this.each(function(){
2907 jQuery.event.add( this, type, one, fn && data);
2908 });
2909 },
2910
2911 unbind: function( type, fn ) {
2912 return this.each(function(){
2913 jQuery.event.remove( this, type, fn );
2914 });
2915 },
2916
2917 trigger: function( type, data ) {
2918 return this.each(function(){
2919 jQuery.event.trigger( type, data, this );
2920 });
2921 },
2922
2923 triggerHandler: function( type, data ) {
2924 if( this[0] ){
2925 var event = jQuery.Event(type);
2926 event.preventDefault();
2927 event.stopPropagation();
2928 jQuery.event.trigger( event, data, this[0] );
2929 return event.result;
2930 }
2931 },
2932
2933 toggle: function( fn ) {
2934 // Save reference to arguments for access in closure
2935 var args = arguments, i = 1;
2936
2937 // link all the functions, so any of them can unbind this click handler
2938 while( i < args.length )
2939 jQuery.event.proxy( fn, args[i++] );
2940
2941 return this.click( jQuery.event.proxy( fn, function(event) {
2942 // Figure out which function to execute
2943 this.lastToggle = ( this.lastToggle || 0 ) % i;
2944
2945 // Make sure that clicks stop
2946 event.preventDefault();
2947
2948 // and execute the function
2949 return args[ this.lastToggle++ ].apply( this, arguments ) || false;
2950 }));
2951 },
2952
2953 hover: function(fnOver, fnOut) {
2954 return this.mouseenter(fnOver).mouseleave(fnOut);
2955 },
2956
2957 ready: function(fn) {
2958 // Attach the listeners
2959 bindReady();
2960
2961 // If the DOM is already ready
2962 if ( jQuery.isReady )
2963 // Execute the function immediately
2964 fn.call( document, jQuery );
2965
2966 // Otherwise, remember the function for later
2967 else
2968 // Add the function to the wait list
2969 jQuery.readyList.push( fn );
2970
2971 return this;
2972 },
2973
2974 live: function( type, fn ){
2975 var proxy = jQuery.event.proxy( fn );
2976 proxy.guid += this.selector + type;
2977
2978 jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy );
2979
2980 return this;
2981 },
2982
2983 die: function( type, fn ){
2984 jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null );
2985 return this;
2986 }
2987 });
2988
2989 function liveHandler( event ){
2990 var check = RegExp("(^|\\.)" + event.type + "(\\.|$)"),
2991 stop = true,
2992 elems = [];
2993
2994 jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){
2995 if ( check.test(fn.type) ) {
2996 var elem = jQuery(event.target).closest(fn.data)[0];
2997 if ( elem )
2998 elems.push({ elem: elem, fn: fn });
2999 }
3000 });
3001
3002 elems.sort(function(a,b) {
3003 return jQuery.data(a.elem, "closest") - jQuery.data(b.elem, "closest");
3004 });
3005
3006 jQuery.each(elems, function(){
3007 if ( this.fn.call(this.elem, event, this.fn.data) === false )
3008 return (stop = false);
3009 });
3010
3011 return stop;
3012 }
3013
3014 function liveConvert(type, selector){
3015 return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "|")].join(".");
3016 }
3017
3018 jQuery.extend({
3019 isReady: false,
3020 readyList: [],
3021 // Handle when the DOM is ready
3022 ready: function() {
3023 // Make sure that the DOM is not already loaded
3024 if ( !jQuery.isReady ) {
3025 // Remember that the DOM is ready
3026 jQuery.isReady = true;
3027
3028 // If there are functions bound, to execute
3029 if ( jQuery.readyList ) {
3030 // Execute all of them
3031 jQuery.each( jQuery.readyList, function(){
3032 this.call( document, jQuery );
3033 });
3034
3035 // Reset the list of functions
3036 jQuery.readyList = null;
3037 }
3038
3039 // Trigger any bound ready events
3040 jQuery(document).triggerHandler("ready");
3041 }
3042 }
3043 });
3044
3045 var readyBound = false;
3046
3047 function bindReady(){
3048 if ( readyBound ) return;
3049 readyBound = true;
3050
3051 // Mozilla, Opera and webkit nightlies currently support this event
3052 if ( document.addEventListener ) {
3053 // Use the handy event callback
3054 document.addEventListener( "DOMContentLoaded", function(){
3055 document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
3056 jQuery.ready();
3057 }, false );
3058
3059 // If IE event model is used
3060 } else if ( document.attachEvent ) {
3061 // ensure firing before onload,
3062 // maybe late but safe also for iframes
3063 document.attachEvent("onreadystatechange", function(){
3064 if ( document.readyState === "complete" ) {
3065 document.detachEvent( "onreadystatechange", arguments.callee );
3066 jQuery.ready();
3067 }
3068 });
3069
3070 // If IE and not an iframe
3071 // continually check to see if the document is ready
3072 if ( document.documentElement.doScroll && window == window.top ) (function(){
3073 if ( jQuery.isReady ) return;
3074
3075 try {
3076 // If IE is used, use the trick by Diego Perini
3077 // http://javascript.nwbox.com/IEContentLoaded/
3078 document.documentElement.doScroll("left");
3079 } catch( error ) {
3080 setTimeout( arguments.callee, 0 );
3081 return;
3082 }
3083
3084 // and execute any waiting functions
3085 jQuery.ready();
3086 })();
3087 }
3088
3089 // A fallback to window.onload, that will always work
3090 jQuery.event.add( window, "load", jQuery.ready );
3091 }
3092
3093 jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
3094 "mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," +
3095 "change,select,submit,keydown,keypress,keyup,error").split(","), function(i, name){
3096
3097 // Handle event binding
3098 jQuery.fn[name] = function(fn){
3099 return fn ? this.bind(name, fn) : this.trigger(name);
3100 };
3101 });
3102
3103 // Prevent memory leaks in IE
3104 // And prevent errors on refresh with events like mouseover in other browsers
3105 // Window isn't included so as not to unbind existing unload events
3106 jQuery( window ).bind( 'unload', function(){
3107 for ( var id in jQuery.cache )
3108 // Skip the window
3109 if ( id != 1 && jQuery.cache[ id ].handle )
3110 jQuery.event.remove( jQuery.cache[ id ].handle.elem );
3111 });
3112 (function(){
3113
3114 jQuery.support = {};
3115
3116 var root = document.documentElement,
3117 script = document.createElement("script"),
3118 div = document.createElement("div"),
3119 id = "script" + (new Date).getTime();
3120
3121 div.style.display = "none";
3122 div.innerHTML = ' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';
3123
3124 var all = div.getElementsByTagName("*"),
3125 a = div.getElementsByTagName("a")[0];
3126
3127 // Can't get basic test support
3128 if ( !all || !all.length || !a ) {
3129 return;
3130 }
3131
3132 jQuery.support = {
3133 // IE strips leading whitespace when .innerHTML is used
3134 leadingWhitespace: div.firstChild.nodeType == 3,
3135
3136 // Make sure that tbody elements aren't automatically inserted
3137 // IE will insert them into empty tables
3138 tbody: !div.getElementsByTagName("tbody").length,
3139
3140 // Make sure that you can get all elements in an <object> element
3141 // IE 7 always returns no results
3142 objectAll: !!div.getElementsByTagName("object")[0]
3143 .getElementsByTagName("*").length,
3144
3145 // Make sure that link elements get serialized correctly by innerHTML
3146 // This requires a wrapper element in IE
3147 htmlSerialize: !!div.getElementsByTagName("link").length,
3148
3149 // Get the style information from getAttribute
3150 // (IE uses .cssText insted)
3151 style: /red/.test( a.getAttribute("style") ),
3152
3153 // Make sure that URLs aren't manipulated
3154 // (IE normalizes it by default)
3155 hrefNormalized: a.getAttribute("href") === "/a",
3156
3157 // Make sure that element opacity exists
3158 // (IE uses filter instead)
3159 opacity: a.style.opacity === "0.5",
3160
3161 // Verify style float existence
3162 // (IE uses styleFloat instead of cssFloat)
3163 cssFloat: !!a.style.cssFloat,
3164
3165 // Will be defined later
3166 scriptEval: false,
3167 noCloneEvent: true,
3168 boxModel: null
3169 };
3170
3171 script.type = "text/javascript";
3172 try {
3173 script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
3174 } catch(e){}
3175
3176 root.insertBefore( script, root.firstChild );
3177
3178 // Make sure that the execution of code works by injecting a script
3179 // tag with appendChild/createTextNode
3180 // (IE doesn't support this, fails, and uses .text instead)
3181 if ( window[ id ] ) {
3182 jQuery.support.scriptEval = true;
3183 delete window[ id ];
3184 }
3185
3186 root.removeChild( script );
3187
3188 if ( div.attachEvent && div.fireEvent ) {
3189 div.attachEvent("onclick", function(){
3190 // Cloning a node shouldn't copy over any
3191 // bound event handlers (IE does this)
3192 jQuery.support.noCloneEvent = false;
3193 div.detachEvent("onclick", arguments.callee);
3194 });
3195 div.cloneNode(true).fireEvent("onclick");
3196 }
3197
3198 // Figure out if the W3C box model works as expected
3199 // document.body must exist before we can do this
3200 jQuery(function(){
3201 var div = document.createElement("div");
3202 div.style.width = div.style.paddingLeft = "1px";
3203
3204 document.body.appendChild( div );
3205 jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
3206 document.body.removeChild( div ).style.display = 'none';
3207 });
3208 })();
3209
3210 var styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat";
3211
3212 jQuery.props = {
3213 "for": "htmlFor",
3214 "class": "className",
3215 "float": styleFloat,
3216 cssFloat: styleFloat,
3217 styleFloat: styleFloat,
3218 readonly: "readOnly",
3219 maxlength: "maxLength",
3220 cellspacing: "cellSpacing",
3221 rowspan: "rowSpan",
3222 tabindex: "tabIndex"
3223 };
3224 jQuery.fn.extend({
3225 // Keep a copy of the old load
3226 _load: jQuery.fn.load,
3227
3228 load: function( url, params, callback ) {
3229 if ( typeof url !== "string" )
3230 return this._load( url );
3231
3232 var off = url.indexOf(" ");
3233 if ( off >= 0 ) {
3234 var selector = url.slice(off, url.length);
3235 url = url.slice(0, off);
3236 }
3237
3238 // Default to a GET request
3239 var type = "GET";
3240
3241 // If the second parameter was provided
3242 if ( params )
3243 // If it's a function
3244 if ( jQuery.isFunction( params ) ) {
3245 // We assume that it's the callback
3246 callback = params;
3247 params = null;
3248
3249 // Otherwise, build a param string
3250 } else if( typeof params === "object" ) {
3251 params = jQuery.param( params );
3252 type = "POST";
3253 }
3254
3255 var self = this;
3256
3257 // Request the remote document
3258 jQuery.ajax({
3259 url: url,
3260 type: type,
3261 dataType: "html",
3262 data: params,
3263 complete: function(res, status){
3264 // If successful, inject the HTML into all the matched elements
3265 if ( status == "success" || status == "notmodified" )
3266 // See if a selector was specified
3267 self.html( selector ?
3268 // Create a dummy div to hold the results
3269 jQuery("<div/>")
3270 // inject the contents of the document in, removing the scripts
3271 // to avoid any 'Permission Denied' errors in IE
3272 .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
3273
3274 // Locate the specified elements
3275 .find(selector) :
3276
3277 // If not, just inject the full result
3278 res.responseText );
3279
3280 if( callback )
3281 self.each( callback, [res.responseText, status, res] );
3282 }
3283 });
3284 return this;
3285 },
3286
3287 serialize: function() {
3288 return jQuery.param(this.serializeArray());
3289 },
3290 serializeArray: function() {
3291 return this.map(function(){
3292 return this.elements ? jQuery.makeArray(this.elements) : this;
3293 })
3294 .filter(function(){
3295 return this.name && !this.disabled &&
3296 (this.checked || /select|textarea/i.test(this.nodeName) ||
3297 /text|hidden|password|search/i.test(this.type));
3298 })
3299 .map(function(i, elem){
3300 var val = jQuery(this).val();
3301 return val == null ? null :
3302 jQuery.isArray(val) ?
3303 jQuery.map( val, function(val, i){
3304 return {name: elem.name, value: val};
3305 }) :
3306 {name: elem.name, value: val};
3307 }).get();
3308 }
3309 });
3310
3311 // Attach a bunch of functions for handling common AJAX events
3312 jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
3313 jQuery.fn[o] = function(f){
3314 return this.bind(o, f);
3315 };
3316 });
3317
3318 var jsc = now();
3319
3320 jQuery.extend({
3321
3322 get: function( url, data, callback, type ) {
3323 // shift arguments if data argument was ommited
3324 if ( jQuery.isFunction( data ) ) {
3325 callback = data;
3326 data = null;
3327 }
3328
3329 return jQuery.ajax({
3330 type: "GET",
3331 url: url,
3332 data: data,
3333 success: callback,
3334 dataType: type
3335 });
3336 },
3337
3338 getScript: function( url, callback ) {
3339 return jQuery.get(url, null, callback, "script");
3340 },
3341
3342 getJSON: function( url, data, callback ) {
3343 return jQuery.get(url, data, callback, "json");
3344 },
3345
3346 post: function( url, data, callback, type ) {
3347 if ( jQuery.isFunction( data ) ) {
3348 callback = data;
3349 data = {};
3350 }
3351
3352 return jQuery.ajax({
3353 type: "POST",
3354 url: url,
3355 data: data,
3356 success: callback,
3357 dataType: type
3358 });
3359 },
3360
3361 ajaxSetup: function( settings ) {
3362 jQuery.extend( jQuery.ajaxSettings, settings );
3363 },
3364
3365 ajaxSettings: {
3366 url: location.href,
3367 global: true,
3368 type: "GET",
3369 contentType: "application/x-www-form-urlencoded",
3370 processData: true,
3371 async: true,
3372 /*
3373 timeout: 0,
3374 data: null,
3375 username: null,
3376 password: null,
3377 */
3378 // Create the request object; Microsoft failed to properly
3379 // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
3380 // This function can be overriden by calling jQuery.ajaxSetup
3381 xhr:function(){
3382 return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
3383 },
3384 accepts: {
3385 xml: "application/xml, text/xml",
3386 html: "text/html",
3387 script: "text/javascript, application/javascript",
3388 json: "application/json, text/javascript",
3389 text: "text/plain",
3390 _default: "*/*"
3391 }
3392 },
3393
3394 // Last-Modified header cache for next request
3395 lastModified: {},
3396
3397 ajax: function( s ) {
3398 // Extend the settings, but re-extend 's' so that it can be
3399 // checked again later (in the test suite, specifically)
3400 s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
3401
3402 var jsonp, jsre = /=\?(&|$)/g, status, data,
3403 type = s.type.toUpperCase();
3404
3405 // convert data if not already a string
3406 if ( s.data && s.processData && typeof s.data !== "string" )
3407 s.data = jQuery.param(s.data);
3408
3409 // Handle JSONP Parameter Callbacks
3410 if ( s.dataType == "jsonp" ) {
3411 if ( type == "GET" ) {
3412 if ( !s.url.match(jsre) )
3413 s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
3414 } else if ( !s.data || !s.data.match(jsre) )
3415 s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
3416 s.dataType = "json";
3417 }
3418
3419 // Build temporary JSONP function
3420 if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
3421 jsonp = "jsonp" + jsc++;
3422
3423 // Replace the =? sequence both in the query string and the data
3424 if ( s.data )
3425 s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
3426 s.url = s.url.replace(jsre, "=" + jsonp + "$1");
3427
3428 // We need to make sure
3429 // that a JSONP style response is executed properly
3430 s.dataType = "script";
3431
3432 // Handle JSONP-style loading
3433 window[ jsonp ] = function(tmp){
3434 data = tmp;
3435 success();
3436 complete();
3437 // Garbage collect
3438 window[ jsonp ] = undefined;
3439 try{ delete window[ jsonp ]; } catch(e){}
3440 if ( head )
3441 head.removeChild( script );
3442 };
3443 }
3444
3445 if ( s.dataType == "script" && s.cache == null )
3446 s.cache = false;
3447
3448 if ( s.cache === false && type == "GET" ) {
3449 var ts = now();
3450 // try replacing _= if it is there
3451 var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
3452 // if nothing was replaced, add timestamp to the end
3453 s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
3454 }
3455
3456 // If data is available, append data to url for get requests
3457 if ( s.data && type == "GET" ) {
3458 s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
3459
3460 // IE likes to send both get and post data, prevent this
3461 s.data = null;
3462 }
3463
3464 // Watch for a new set of requests
3465 if ( s.global && ! jQuery.active++ )
3466 jQuery.event.trigger( "ajaxStart" );
3467
3468 // Matches an absolute URL, and saves the domain
3469 var parts = /^(\w+:)?\/\/([^\/?#]+)/.exec( s.url );
3470
3471 // If we're requesting a remote document
3472 // and trying to load JSON or Script with a GET
3473 if ( s.dataType == "script" && type == "GET" && parts
3474 && ( parts[1] && parts[1] != location.protocol || parts[2] != location.host )){
3475
3476 var head = document.getElementsByTagName("head")[0];
3477 var script = document.createElement("script");
3478 script.src = s.url;
3479 if (s.scriptCharset)
3480 script.charset = s.scriptCharset;
3481
3482 // Handle Script loading
3483 if ( !jsonp ) {
3484 var done = false;
3485
3486 // Attach handlers for all browsers
3487 script.onload = script.onreadystatechange = function(){
3488 if ( !done && (!this.readyState ||
3489 this.readyState == "loaded" || this.readyState == "complete") ) {
3490 done = true;
3491 success();
3492 complete();
3493
3494 // Handle memory leak in IE
3495 script.onload = script.onreadystatechange = null;
3496 head.removeChild( script );
3497 }
3498 };
3499 }
3500
3501 head.appendChild(script);
3502
3503 // We handle everything using the script element injection
3504 return undefined;
3505 }
3506
3507 var requestDone = false;
3508
3509 // Create the request object
3510 var xhr = s.xhr();
3511
3512 // Open the socket
3513 // Passing null username, generates a login popup on Opera (#2865)
3514 if( s.username )
3515 xhr.open(type, s.url, s.async, s.username, s.password);
3516 else
3517 xhr.open(type, s.url, s.async);
3518
3519 // Need an extra try/catch for cross domain requests in Firefox 3
3520 try {
3521 // Set the correct header, if data is being sent
3522 if ( s.data )
3523 xhr.setRequestHeader("Content-Type", s.contentType);
3524
3525 // Set the If-Modified-Since header, if ifModified mode.
3526 if ( s.ifModified )
3527 xhr.setRequestHeader("If-Modified-Since",
3528 jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
3529
3530 // Set header so the called script knows that it's an XMLHttpRequest
3531 xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
3532
3533 // Set the Accepts header for the server, depending on the dataType
3534 xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
3535 s.accepts[ s.dataType ] + ", */*" :
3536 s.accepts._default );
3537 } catch(e){}
3538
3539 // Allow custom headers/mimetypes and early abort
3540 if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
3541 // Handle the global AJAX counter
3542 if ( s.global && ! --jQuery.active )
3543 jQuery.event.trigger( "ajaxStop" );
3544 // close opended socket
3545 xhr.abort();
3546 return false;
3547 }
3548
3549 if ( s.global )
3550 jQuery.event.trigger("ajaxSend", [xhr, s]);
3551
3552 // Wait for a response to come back
3553 var onreadystatechange = function(isTimeout){
3554 // The request was aborted, clear the interval and decrement jQuery.active
3555 if (xhr.readyState == 0) {
3556 if (ival) {
3557 // clear poll interval
3558 clearInterval(ival);
3559 ival = null;
3560 // Handle the global AJAX counter
3561 if ( s.global && ! --jQuery.active )
3562 jQuery.event.trigger( "ajaxStop" );
3563 }
3564 // The transfer is complete and the data is available, or the request timed out
3565 } else if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
3566 requestDone = true;
3567
3568 // clear poll interval
3569 if (ival) {
3570 clearInterval(ival);
3571 ival = null;
3572 }
3573
3574 status = isTimeout == "timeout" ? "timeout" :
3575 !jQuery.httpSuccess( xhr ) ? "error" :
3576 s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? "notmodified" :
3577 "success";
3578
3579 if ( status == "success" ) {
3580 // Watch for, and catch, XML document parse errors
3581 try {
3582 // process the data (runs the xml through httpData regardless of callback)
3583 data = jQuery.httpData( xhr, s.dataType, s );
3584 } catch(e) {
3585 status = "parsererror";
3586 }
3587 }
3588
3589 // Make sure that the request was successful or notmodified
3590 if ( status == "success" ) {
3591 // Cache Last-Modified header, if ifModified mode.
3592 var modRes;
3593 try {
3594 modRes = xhr.getResponseHeader("Last-Modified");
3595 } catch(e) {} // swallow exception thrown by FF if header is not available
3596
3597 if ( s.ifModified && modRes )
3598 jQuery.lastModified[s.url] = modRes;
3599
3600 // JSONP handles its own success callback
3601 if ( !jsonp )
3602 success();
3603 } else
3604 jQuery.handleError(s, xhr, status);
3605
3606 // Fire the complete handlers
3607 complete();
3608
3609 if ( isTimeout )
3610 xhr.abort();
3611
3612 // Stop memory leaks
3613 if ( s.async )
3614 xhr = null;
3615 }
3616 };
3617
3618 if ( s.async ) {
3619 // don't attach the handler to the request, just poll it instead
3620 var ival = setInterval(onreadystatechange, 13);
3621
3622 // Timeout checker
3623 if ( s.timeout > 0 )
3624 setTimeout(function(){
3625 // Check to see if the request is still happening
3626 if ( xhr && !requestDone )
3627 onreadystatechange( "timeout" );
3628 }, s.timeout);
3629 }
3630
3631 // Send the data
3632 try {
3633 xhr.send(s.data);
3634 } catch(e) {
3635 jQuery.handleError(s, xhr, null, e);
3636 }
3637
3638 // firefox 1.5 doesn't fire statechange for sync requests
3639 if ( !s.async )
3640 onreadystatechange();
3641
3642 function success(){
3643 // If a local callback was specified, fire it and pass it the data
3644 if ( s.success )
3645 s.success( data, status );
3646
3647 // Fire the global callback
3648 if ( s.global )
3649 jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
3650 }
3651
3652 function complete(){
3653 // Process result
3654 if ( s.complete )
3655 s.complete(xhr, status);
3656
3657 // The request was completed
3658 if ( s.global )
3659 jQuery.event.trigger( "ajaxComplete", [xhr, s] );
3660
3661 // Handle the global AJAX counter
3662 if ( s.global && ! --jQuery.active )
3663 jQuery.event.trigger( "ajaxStop" );
3664 }
3665
3666 // return XMLHttpRequest to allow aborting the request etc.
3667 return xhr;
3668 },
3669
3670 handleError: function( s, xhr, status, e ) {
3671 // If a local callback was specified, fire it
3672 if ( s.error ) s.error( xhr, status, e );
3673
3674 // Fire the global callback
3675 if ( s.global )
3676 jQuery.event.trigger( "ajaxError", [xhr, s, e] );
3677 },
3678
3679 // Counter for holding the number of active queries
3680 active: 0,
3681
3682 // Determines if an XMLHttpRequest was successful or not
3683 httpSuccess: function( xhr ) {
3684 try {
3685 // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
3686 return !xhr.status && location.protocol == "file:" ||
3687 ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223;
3688 } catch(e){}
3689 return false;
3690 },
3691
3692 // Determines if an XMLHttpRequest returns NotModified
3693 httpNotModified: function( xhr, url ) {
3694 try {
3695 var xhrRes = xhr.getResponseHeader("Last-Modified");
3696
3697 // Firefox always returns 200. check Last-Modified date
3698 return xhr.status == 304 || xhrRes == jQuery.lastModified[url];
3699 } catch(e){}
3700 return false;
3701 },
3702
3703 httpData: function( xhr, type, s ) {
3704 var ct = xhr.getResponseHeader("content-type"),
3705 xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
3706 data = xml ? xhr.responseXML : xhr.responseText;
3707
3708 if ( xml && data.documentElement.tagName == "parsererror" )
3709 throw "parsererror";
3710
3711 // Allow a pre-filtering function to sanitize the response
3712 // s != null is checked to keep backwards compatibility
3713 if( s && s.dataFilter )
3714 data = s.dataFilter( data, type );
3715
3716 // The filter can actually parse the response
3717 if( typeof data === "string" ){
3718
3719 // If the type is "script", eval it in global context
3720 if ( type == "script" )
3721 jQuery.globalEval( data );
3722
3723 // Get the JavaScript object, if JSON is used.
3724 if ( type == "json" )
3725 data = window["eval"]("(" + data + ")");
3726 }
3727
3728 return data;
3729 },
3730
3731 // Serialize an array of form elements or a set of
3732 // key/values into a query string
3733 param: function( a ) {
3734 var s = [ ];
3735
3736 function add( key, value ){
3737 s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
3738 };
3739
3740 // If an array was passed in, assume that it is an array
3741 // of form elements
3742 if ( jQuery.isArray(a) || a.jquery )
3743 // Serialize the form elements
3744 jQuery.each( a, function(){
3745 add( this.name, this.value );
3746 });
3747
3748 // Otherwise, assume that it's an object of key/value pairs
3749 else
3750 // Serialize the key/values
3751 for ( var j in a )
3752 // If the value is an array then the key names need to be repeated
3753 if ( jQuery.isArray(a[j]) )
3754 jQuery.each( a[j], function(){
3755 add( j, this );
3756 });
3757 else
3758 add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] );
3759
3760 // Return the resulting serialization
3761 return s.join("&").replace(/%20/g, "+");
3762 }
3763
3764 });
3765 var elemdisplay = {},
3766 timerId,
3767 fxAttrs = [
3768 // height animations
3769 [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
3770 // width animations
3771 [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
3772 // opacity animations
3773 [ "opacity" ]
3774 ];
3775
3776 function genFx( type, num ){
3777 var obj = {};
3778 jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function(){
3779 obj[ this ] = type;
3780 });
3781 return obj;
3782 }
3783
3784 jQuery.fn.extend({
3785 show: function(speed,callback){
3786 if ( speed ) {
3787 return this.animate( genFx("show", 3), speed, callback);
3788 } else {
3789 for ( var i = 0, l = this.length; i < l; i++ ){
3790 var old = jQuery.data(this[i], "olddisplay");
3791
3792 this[i].style.display = old || "";
3793
3794 if ( jQuery.css(this[i], "display") === "none" ) {
3795 var tagName = this[i].tagName, display;
3796
3797 if ( elemdisplay[ tagName ] ) {
3798 display = elemdisplay[ tagName ];
3799 } else {
3800 var elem = jQuery("<" + tagName + " />").appendTo("body");
3801
3802 display = elem.css("display");
3803 if ( display === "none" )
3804 display = "block";
3805
3806 elem.remove();
3807
3808 elemdisplay[ tagName ] = display;
3809 }
3810
3811 jQuery.data(this[i], "olddisplay", display);
3812 }
3813 }
3814
3815 // Set the display of the elements in a second loop
3816 // to avoid the constant reflow
3817 for ( var i = 0, l = this.length; i < l; i++ ){
3818 this[i].style.display = jQuery.data(this[i], "olddisplay") || "";
3819 }
3820
3821 return this;
3822 }
3823 },
3824
3825 hide: function(speed,callback){
3826 if ( speed ) {
3827 return this.animate( genFx("hide", 3), speed, callback);
3828 } else {
3829 for ( var i = 0, l = this.length; i < l; i++ ){
3830 var old = jQuery.data(this[i], "olddisplay");
3831 if ( !old && old !== "none" )
3832 jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
3833 }
3834
3835 // Set the display of the elements in a second loop
3836 // to avoid the constant reflow
3837 for ( var i = 0, l = this.length; i < l; i++ ){
3838 this[i].style.display = "none";
3839 }
3840
3841 return this;
3842 }
3843 },
3844
3845 // Save the old toggle function
3846 _toggle: jQuery.fn.toggle,
3847
3848 toggle: function( fn, fn2 ){
3849 var bool = typeof fn === "boolean";
3850
3851 return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
3852 this._toggle.apply( this, arguments ) :
3853 fn == null || bool ?
3854 this.each(function(){
3855 var state = bool ? fn : jQuery(this).is(":hidden");
3856 jQuery(this)[ state ? "show" : "hide" ]();
3857 }) :
3858 this.animate(genFx("toggle", 3), fn, fn2);
3859 },
3860
3861 fadeTo: function(speed,to,callback){
3862 return this.animate({opacity: to}, speed, callback);
3863 },
3864
3865 animate: function( prop, speed, easing, callback ) {
3866 var optall = jQuery.speed(speed, easing, callback);
3867
3868 return this[ optall.queue === false ? "each" : "queue" ](function(){
3869
3870 var opt = jQuery.extend({}, optall), p,
3871 hidden = this.nodeType == 1 && jQuery(this).is(":hidden"),
3872 self = this;
3873
3874 for ( p in prop ) {
3875 if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
3876 return opt.complete.call(this);
3877
3878 if ( ( p == "height" || p == "width" ) && this.style ) {
3879 // Store display property
3880 opt.display = jQuery.css(this, "display");
3881
3882 // Make sure that nothing sneaks out
3883 opt.overflow = this.style.overflow;
3884 }
3885 }
3886
3887 if ( opt.overflow != null )
3888 this.style.overflow = "hidden";
3889
3890 opt.curAnim = jQuery.extend({}, prop);
3891
3892 jQuery.each( prop, function(name, val){
3893 var e = new jQuery.fx( self, opt, name );
3894
3895 if ( /toggle|show|hide/.test(val) )
3896 e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
3897 else {
3898 var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
3899 start = e.cur(true) || 0;
3900
3901 if ( parts ) {
3902 var end = parseFloat(parts[2]),
3903 unit = parts[3] || "px";
3904
3905 // We need to compute starting value
3906 if ( unit != "px" ) {
3907 self.style[ name ] = (end || 1) + unit;
3908 start = ((end || 1) / e.cur(true)) * start;
3909 self.style[ name ] = start + unit;
3910 }
3911
3912 // If a +=/-= token was provided, we're doing a relative animation
3913 if ( parts[1] )
3914 end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
3915
3916 e.custom( start, end, unit );
3917 } else
3918 e.custom( start, val, "" );
3919 }
3920 });
3921
3922 // For JS strict compliance
3923 return true;
3924 });
3925 },
3926
3927 stop: function(clearQueue, gotoEnd){
3928 var timers = jQuery.timers;
3929
3930 if (clearQueue)
3931 this.queue([]);
3932
3933 this.each(function(){
3934 // go in reverse order so anything added to the queue during the loop is ignored
3935 for ( var i = timers.length - 1; i >= 0; i-- )
3936 if ( timers[i].elem == this ) {
3937 if (gotoEnd)
3938 // force the next step to be the last
3939 timers[i](true);
3940 timers.splice(i, 1);
3941 }
3942 });
3943
3944 // start the next in the queue if the last step wasn't forced
3945 if (!gotoEnd)
3946 this.dequeue();
3947
3948 return this;
3949 }
3950
3951 });
3952
3953 // Generate shortcuts for custom animations
3954 jQuery.each({
3955 slideDown: genFx("show", 1),
3956 slideUp: genFx("hide", 1),
3957 slideToggle: genFx("toggle", 1),
3958 fadeIn: { opacity: "show" },
3959 fadeOut: { opacity: "hide" }
3960 }, function( name, props ){
3961 jQuery.fn[ name ] = function( speed, callback ){
3962 return this.animate( props, speed, callback );
3963 };
3964 });
3965
3966 jQuery.extend({
3967
3968 speed: function(speed, easing, fn) {
3969 var opt = typeof speed === "object" ? speed : {
3970 complete: fn || !fn && easing ||
3971 jQuery.isFunction( speed ) && speed,
3972 duration: speed,
3973 easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
3974 };
3975
3976 opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
3977 jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
3978
3979 // Queueing
3980 opt.old = opt.complete;
3981 opt.complete = function(){
3982 if ( opt.queue !== false )
3983 jQuery(this).dequeue();
3984 if ( jQuery.isFunction( opt.old ) )
3985 opt.old.call( this );
3986 };
3987
3988 return opt;
3989 },
3990
3991 easing: {
3992 linear: function( p, n, firstNum, diff ) {
3993 return firstNum + diff * p;
3994 },
3995 swing: function( p, n, firstNum, diff ) {
3996 return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
3997 }
3998 },
3999
4000 timers: [],
4001
4002 fx: function( elem, options, prop ){
4003 this.options = options;
4004 this.elem = elem;
4005 this.prop = prop;
4006
4007 if ( !options.orig )
4008 options.orig = {};
4009 }
4010
4011 });
4012
4013 jQuery.fx.prototype = {
4014
4015 // Simple function for setting a style value
4016 update: function(){
4017 if ( this.options.step )
4018 this.options.step.call( this.elem, this.now, this );
4019
4020 (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
4021
4022 // Set display property to block for height/width animations
4023 if ( ( this.prop == "height" || this.prop == "width" ) && this.elem.style )
4024 this.elem.style.display = "block";
4025 },
4026
4027 // Get the current size
4028 cur: function(force){
4029 if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) )
4030 return this.elem[ this.prop ];
4031
4032 var r = parseFloat(jQuery.css(this.elem, this.prop, force));
4033 return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
4034 },
4035
4036 // Start an animation from one number to another
4037 custom: function(from, to, unit){
4038 this.startTime = now();
4039 this.start = from;
4040 this.end = to;
4041 this.unit = unit || this.unit || "px";
4042 this.now = this.start;
4043 this.pos = this.state = 0;
4044
4045 var self = this;
4046 function t(gotoEnd){
4047 return self.step(gotoEnd);
4048 }
4049
4050 t.elem = this.elem;
4051
4052 if ( t() && jQuery.timers.push(t) && !timerId ) {
4053 timerId = setInterval(function(){
4054 var timers = jQuery.timers;
4055
4056 for ( var i = 0; i < timers.length; i++ )
4057 if ( !timers[i]() )
4058 timers.splice(i--, 1);
4059
4060 if ( !timers.length ) {
4061 clearInterval( timerId );
4062 timerId = undefined;
4063 }
4064 }, 13);
4065 }
4066 },
4067
4068 // Simple 'show' function
4069 show: function(){
4070 // Remember where we started, so that we can go back to it later
4071 this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
4072 this.options.show = true;
4073
4074 // Begin the animation
4075 // Make sure that we start at a small width/height to avoid any
4076 // flash of content
4077 this.custom(this.prop == "width" || this.prop == "height" ? 1 : 0, this.cur());
4078
4079 // Start by showing the element
4080 jQuery(this.elem).show();
4081 },
4082
4083 // Simple 'hide' function
4084 hide: function(){
4085 // Remember where we started, so that we can go back to it later
4086 this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
4087 this.options.hide = true;
4088
4089 // Begin the animation
4090 this.custom(this.cur(), 0);
4091 },
4092
4093 // Each step of an animation
4094 step: function(gotoEnd){
4095 var t = now();
4096
4097 if ( gotoEnd || t >= this.options.duration + this.startTime ) {
4098 this.now = this.end;
4099 this.pos = this.state = 1;
4100 this.update();
4101
4102 this.options.curAnim[ this.prop ] = true;
4103
4104 var done = true;
4105 for ( var i in this.options.curAnim )
4106 if ( this.options.curAnim[i] !== true )
4107 done = false;
4108
4109 if ( done ) {
4110 if ( this.options.display != null ) {
4111 // Reset the overflow
4112 this.elem.style.overflow = this.options.overflow;
4113
4114 // Reset the display
4115 this.elem.style.display = this.options.display;
4116 if ( jQuery.css(this.elem, "display") == "none" )
4117 this.elem.style.display = "block";
4118 }
4119
4120 // Hide the element if the "hide" operation was done
4121 if ( this.options.hide )
4122 jQuery(this.elem).hide();
4123
4124 // Reset the properties, if the item has been hidden or shown
4125 if ( this.options.hide || this.options.show )
4126 for ( var p in this.options.curAnim )
4127 jQuery.attr(this.elem.style, p, this.options.orig[p]);
4128
4129 // Execute the complete function
4130 this.options.complete.call( this.elem );
4131 }
4132
4133 return false;
4134 } else {
4135 var n = t - this.startTime;
4136 this.state = n / this.options.duration;
4137
4138 // Perform the easing function, defaults to swing
4139 this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
4140 this.now = this.start + ((this.end - this.start) * this.pos);
4141
4142 // Perform the next step of the animation
4143 this.update();
4144 }
4145
4146 return true;
4147 }
4148
4149 };
4150
4151 jQuery.extend( jQuery.fx, {
4152 speeds:{
4153 slow: 600,
4154 fast: 200,
4155 // Default speed
4156 _default: 400
4157 },
4158 step: {
4159
4160 opacity: function(fx){
4161 jQuery.attr(fx.elem.style, "opacity", fx.now);
4162 },
4163
4164 _default: function(fx){
4165 if ( fx.elem.style && fx.elem.style[ fx.prop ] != null )
4166 fx.elem.style[ fx.prop ] = fx.now + fx.unit;
4167 else
4168 fx.elem[ fx.prop ] = fx.now;
4169 }
4170 }
4171 });
4172 if ( document.documentElement["getBoundingClientRect"] )
4173 jQuery.fn.offset = function() {
4174 if ( !this[0] ) return { top: 0, left: 0 };
4175 if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
4176 var box = this[0].getBoundingClientRect(), doc = this[0].ownerDocument, body = doc.body, docElem = doc.documentElement,
4177 clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
4178 top = box.top + (self.pageYOffset || jQuery.boxModel && docElem.scrollTop || body.scrollTop ) - clientTop,
4179 left = box.left + (self.pageXOffset || jQuery.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
4180 return { top: top, left: left };
4181 };
4182 else
4183 jQuery.fn.offset = function() {
4184 if ( !this[0] ) return { top: 0, left: 0 };
4185 if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
4186 jQuery.offset.initialized || jQuery.offset.initialize();
4187
4188 var elem = this[0], offsetParent = elem.offsetParent, prevOffsetParent = elem,
4189 doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
4190 body = doc.body, defaultView = doc.defaultView,
4191 prevComputedStyle = defaultView.getComputedStyle(elem, null),
4192 top = elem.offsetTop, left = elem.offsetLeft;
4193
4194 while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
4195 computedStyle = defaultView.getComputedStyle(elem, null);
4196 top -= elem.scrollTop, left -= elem.scrollLeft;
4197 if ( elem === offsetParent ) {
4198 top += elem.offsetTop, left += elem.offsetLeft;
4199 if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.tagName)) )
4200 top += parseInt( computedStyle.borderTopWidth, 10) || 0,
4201 left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
4202 prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
4203 }
4204 if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" )
4205 top += parseInt( computedStyle.borderTopWidth, 10) || 0,
4206 left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
4207 prevComputedStyle = computedStyle;
4208 }
4209
4210 if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" )
4211 top += body.offsetTop,
4212 left += body.offsetLeft;
4213
4214 if ( prevComputedStyle.position === "fixed" )
4215 top += Math.max(docElem.scrollTop, body.scrollTop),
4216 left += Math.max(docElem.scrollLeft, body.scrollLeft);
4217
4218 return { top: top, left: left };
4219 };
4220
4221 jQuery.offset = {
4222 initialize: function() {
4223 if ( this.initialized ) return;
4224 var body = document.body, container = document.createElement('div'), innerDiv, checkDiv, table, td, rules, prop, bodyMarginTop = body.style.marginTop,
4225 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>';
4226
4227 rules = { position: 'absolute', top: 0, left: 0, margin: 0, border: 0, width: '1px', height: '1px', visibility: 'hidden' };
4228 for ( prop in rules ) container.style[prop] = rules[prop];
4229
4230 container.innerHTML = html;
4231 body.insertBefore(container, body.firstChild);
4232 innerDiv = container.firstChild, checkDiv = innerDiv.firstChild, td = innerDiv.nextSibling.firstChild.firstChild;
4233
4234 this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
4235 this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
4236
4237 innerDiv.style.overflow = 'hidden', innerDiv.style.position = 'relative';
4238 this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
4239
4240 body.style.marginTop = '1px';
4241 this.doesNotIncludeMarginInBodyOffset = (body.offsetTop === 0);
4242 body.style.marginTop = bodyMarginTop;
4243
4244 body.removeChild(container);
4245 this.initialized = true;
4246 },
4247
4248 bodyOffset: function(body) {
4249 jQuery.offset.initialized || jQuery.offset.initialize();
4250 var top = body.offsetTop, left = body.offsetLeft;
4251 if ( jQuery.offset.doesNotIncludeMarginInBodyOffset )
4252 top += parseInt( jQuery.curCSS(body, 'marginTop', true), 10 ) || 0,
4253 left += parseInt( jQuery.curCSS(body, 'marginLeft', true), 10 ) || 0;
4254 return { top: top, left: left };
4255 }
4256 };
4257
4258
4259 jQuery.fn.extend({
4260 position: function() {
4261 var left = 0, top = 0, results;
4262
4263 if ( this[0] ) {
4264 // Get *real* offsetParent
4265 var offsetParent = this.offsetParent(),
4266
4267 // Get correct offsets
4268 offset = this.offset(),
4269 parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
4270
4271 // Subtract element margins
4272 // note: when an element has margin: auto the offsetLeft and marginLeft
4273 // are the same in Safari causing offset.left to incorrectly be 0
4274 offset.top -= num( this, 'marginTop' );
4275 offset.left -= num( this, 'marginLeft' );
4276
4277 // Add offsetParent borders
4278 parentOffset.top += num( offsetParent, 'borderTopWidth' );
4279 parentOffset.left += num( offsetParent, 'borderLeftWidth' );
4280
4281 // Subtract the two offsets
4282 results = {
4283 top: offset.top - parentOffset.top,
4284 left: offset.left - parentOffset.left
4285 };
4286 }
4287
4288 return results;
4289 },
4290
4291 offsetParent: function() {
4292 var offsetParent = this[0].offsetParent || document.body;
4293 while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
4294 offsetParent = offsetParent.offsetParent;
4295 return jQuery(offsetParent);
4296 }
4297 });
4298
4299
4300 // Create scrollLeft and scrollTop methods
4301 jQuery.each( ['Left', 'Top'], function(i, name) {
4302 var method = 'scroll' + name;
4303
4304 jQuery.fn[ method ] = function(val) {
4305 if (!this[0]) return null;
4306
4307 return val !== undefined ?
4308
4309 // Set the scroll offset
4310 this.each(function() {
4311 this == window || this == document ?
4312 window.scrollTo(
4313 !i ? val : jQuery(window).scrollLeft(),
4314 i ? val : jQuery(window).scrollTop()
4315 ) :
4316 this[ method ] = val;
4317 }) :
4318
4319 // Return the scroll offset
4320 this[0] == window || this[0] == document ?
4321 self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
4322 jQuery.boxModel && document.documentElement[ method ] ||
4323 document.body[ method ] :
4324 this[0][ method ];
4325 };
4326 });
4327 // Create innerHeight, innerWidth, outerHeight and outerWidth methods
4328 jQuery.each([ "Height", "Width" ], function(i, name){
4329
4330 var tl = i ? "Left" : "Top", // top or left
4331 br = i ? "Right" : "Bottom", // bottom or right
4332 lower = name.toLowerCase();
4333
4334 // innerHeight and innerWidth
4335 jQuery.fn["inner" + name] = function(){
4336 return this[0] ?
4337 jQuery.css( this[0], lower, false, "padding" ) :
4338 null;
4339 };
4340
4341 // outerHeight and outerWidth
4342 jQuery.fn["outer" + name] = function(margin) {
4343 return this[0] ?
4344 jQuery.css( this[0], lower, false, margin ? "margin" : "border" ) :
4345 null;
4346 };
4347
4348 var type = name.toLowerCase();
4349
4350 jQuery.fn[ type ] = function( size ) {
4351 // Get window width or height
4352 return this[0] == window ?
4353 // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
4354 document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] ||
4355 document.body[ "client" + name ] :
4356
4357 // Get document width or height
4358 this[0] == document ?
4359 // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
4360 Math.max(
4361 document.documentElement["client" + name],
4362 document.body["scroll" + name], document.documentElement["scroll" + name],
4363 document.body["offset" + name], document.documentElement["offset" + name]
4364 ) :
4365
4366 // Get or set width or height on the element
4367 size === undefined ?
4368 // Get width or height on the element
4369 (this.length ? jQuery.css( this[0], type ) : null) :
4370
4371 // Set the width or height on the element (default to pixels if value is unitless)
4372 this.css( type, typeof size === "string" ? size : size + "px" );
4373 };
4374
4375 });
4376 })();
1  /*!
2   * jQuery JavaScript Library v1.3.2
3   * http://jquery.com/
4   *
5   * Copyright (c) 2009 John Resig
6   * Dual licensed under the MIT and GPL licenses.
7   * http://docs.jquery.com/License
8   *
9   * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
10   * Revision: 6246
11   */
12  (function(){
13  
14  var 
15          // Will speed up references to window, and allows munging its name.
16          window = this,
17          // Will speed up references to undefined, and allows munging its name.
18          undefined,
19          // Map over jQuery in case of overwrite
20          _jQuery = window.jQuery,
21          // Map over the $ in case of overwrite
22          _$ = window.$,
23  
24          jQuery = window.jQuery = window.$ = function( selector, context ) {
25                  // The jQuery object is actually just the init constructor 'enhanced'
26                  return new jQuery.fn.init( selector, context );
27          },
28  
29          // A simple way to check for HTML strings or ID strings
30          // (both of which we optimize for)
31          quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,
32          // Is it a simple selector
33          isSimple = /^.[^:#\[\.,]*$/;
34  
35  jQuery.fn = jQuery.prototype = {
36          init: function( selector, context ) {
37                  // Make sure that a selection was provided
38                  selector = selector || document;
39  
40                  // Handle $(DOMElement)
41                  if ( selector.nodeType ) {
42                          this[0] = selector;
43                          this.length = 1;
44                          this.context = selector;
45                          return this;
46                  }
47                  // Handle HTML strings
48                  if ( typeof selector === "string" ) {
49                          // Are we dealing with HTML string or an ID?
50                          var match = quickExpr.exec( selector );
51  
52                          // Verify a match, and that no context was specified for #id
53                          if ( match && (match[1] || !context) ) {
54  
55                                  // HANDLE: $(html) -> $(array)
56                                  if ( match[1] )
57                                          selector = jQuery.clean( [ match[1] ], context );
58  
59                                  // HANDLE: $("#id")
60                                  else {
61                                          var elem = document.getElementById( match[3] );
62  
63                                          // Handle the case where IE and Opera return items
64                                          // by name instead of ID
65                                          if ( elem && elem.id != match[3] )
66                                                  return jQuery().find( selector );
67  
68                                          // Otherwise, we inject the element directly into the jQuery object
69                                          var ret = jQuery( elem || [] );
70                                          ret.context = document;
71                                          ret.selector = selector;
72                                          return ret;
73                                  }
74  
75                          // HANDLE: $(expr, [context])
76                          // (which is just equivalent to: $(content).find(expr)
77                          } else
78                                  return jQuery( context ).find( selector );
79  
80                  // HANDLE: $(function)
81                  // Shortcut for document ready
82                  } else if ( jQuery.isFunction( selector ) )
83                          return jQuery( document ).ready( selector );
84  
85                  // Make sure that old selector state is passed along
86                  if ( selector.selector && selector.context ) {
87                          this.selector = selector.selector;
88                          this.context = selector.context;
89                  }
90  
91                  return this.setArray(jQuery.isArray( selector ) ?
92                          selector :
93                          jQuery.makeArray(selector));
94          },
95  
96          // Start with an empty selector
97          selector: "",
98  
99          // The current version of jQuery being used
100          jquery: "1.3.2",
101  
102          // The number of elements contained in the matched element set
103          size: function() {
104                  return this.length;
105          },
106  
107          // Get the Nth element in the matched element set OR
108          // Get the whole matched element set as a clean array
109          get: function( num ) {
110                  return num === undefined ?
111  
112                          // Return a 'clean' array
113                          Array.prototype.slice.call( this ) :
114  
115                          // Return just the object
116                          this[ num ];
117          },
118  
119          // Take an array of elements and push it onto the stack
120          // (returning the new matched element set)
121          pushStack: function( elems, name, selector ) {
122                  // Build a new jQuery matched element set
123                  var ret = jQuery( elems );
124  
125                  // Add the old object onto the stack (as a reference)
126                  ret.prevObject = this;
127  
128                  ret.context = this.context;
129  
130                  if ( name === "find" )
131                          ret.selector = this.selector + (this.selector ? " " : "") + selector;
132                  else if ( name )
133                          ret.selector = this.selector + "." + name + "(" + selector + ")";
134  
135                  // Return the newly-formed element set
136                  return ret;
137          },
138  
139          // Force the current matched set of elements to become
140          // the specified array of elements (destroying the stack in the process)
141          // You should use pushStack() in order to do this, but maintain the stack
142          setArray: function( elems ) {
143                  // Resetting the length to 0, then using the native Array push
144                  // is a super-fast way to populate an object with array-like properties
145                  this.length = 0;
146                  Array.prototype.push.apply( this, elems );
147  
148                  return this;
149          },
150  
151          // Execute a callback for every element in the matched set.
152          // (You can seed the arguments with an array of args, but this is
153          // only used internally.)
154          each: function( callback, args ) {
155                  return jQuery.each( this, callback, args );
156          },
157  
158          // Determine the position of an element within
159          // the matched set of elements
160          index: function( elem ) {
161                  // Locate the position of the desired element
162                  return jQuery.inArray(
163                          // If it receives a jQuery object, the first element is used
164                          elem && elem.jquery ? elem[0] : elem
165                  , this );
166          },
167  
168          attr: function( name, value, type ) {
169                  var options = name;
170  
171                  // Look for the case where we're accessing a style value
172                  if ( typeof name === "string" )
173                          if ( value === undefined )
174                                  return this[0] && jQuery[ type || "attr" ]( this[0], name );
175  
176                          else {
177                                  options = {};
178                                  options[ name ] = value;
179                          }
180  
181                  // Check to see if we're setting style values
182                  return this.each(function(i){
183                          // Set all the styles
184                          for ( name in options )
185                                  jQuery.attr(
186                                          type ?
187                                                  this.style :
188                                                  this,
189                                          name, jQuery.prop( this, options[ name ], type, i, name )
190                                  );
191                  });
192          },
193  
194          css: function( key, value ) {
195                  // ignore negative width and height values
196                  if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
197                          value = undefined;
198                  return this.attr( key, value, "curCSS" );
199          },
200  
201          text: function( text ) {
202                  if ( typeof text !== "object" && text != null )
203                          return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
204  
205                  var ret = "";
206  
207                  jQuery.each( text || this, function(){
208                          jQuery.each( this.childNodes, function(){
209                                  if ( this.nodeType != 8 )
210                                          ret += this.nodeType != 1 ?
211                                                  this.nodeValue :
212                                                  jQuery.fn.text( [ this ] );
213                          });
214                  });
215  
216                  return ret;
217          },
218  
219          wrapAll: function( html ) {
220                  if ( this[0] ) {
221                          // The elements to wrap the target around
222                          var wrap = jQuery( html, this[0].ownerDocument ).clone();
223  
224                          if ( this[0].parentNode )
225                                  wrap.insertBefore( this[0] );
226  
227                          wrap.map(function(){
228                                  var elem = this;
229  
230                                  while ( elem.firstChild )
231                                          elem = elem.firstChild;
232  
233                                  return elem;
234                          }).append(this);
235                  }
236  
237                  return this;
238          },
239  
240          wrapInner: function( html ) {
241                  return this.each(function(){
242                          jQuery( this ).contents().wrapAll( html );
243                  });
244          },
245  
246          wrap: function( html ) {
247                  return this.each(function(){
248                          jQuery( this ).wrapAll( html );
249                  });
250          },
251  
252          append: function() {
253                  return this.domManip(arguments, true, function(elem){
254                          if (this.nodeType == 1)
255                                  this.appendChild( elem );
256                  });
257          },
258  
259          prepend: function() {
260                  return this.domManip(arguments, true, function(elem){
261                          if (this.nodeType == 1)
262                                  this.insertBefore( elem, this.firstChild );
263                  });
264          },
265  
266          before: function() {
267                  return this.domManip(arguments, false, function(elem){
268                          this.parentNode.insertBefore( elem, this );
269                  });
270          },
271  
272          after: function() {
273                  return this.domManip(arguments, false, function(elem){
274                          this.parentNode.insertBefore( elem, this.nextSibling );
275                  });
276          },
277  
278          end: function() {
279                  return this.prevObject || jQuery( [] );
280          },
281  
282          // For internal use only.
283          // Behaves like an Array's method, not like a jQuery method.
284          push: [].push,
285          sort: [].sort,
286          splice: [].splice,
287  
288          find: function( selector ) {
289                  if ( this.length === 1 ) {
290                          var ret = this.pushStack( [], "find", selector );
291                          ret.length = 0;
292                          jQuery.find( selector, this[0], ret );
293                          return ret;
294                  } else {
295                          return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){
296                                  return jQuery.find( selector, elem );
297                          })), "find", selector );
298                  }
299          },
300  
301          clone: function( events ) {
302                  // Do the clone
303                  var ret = this.map(function(){
304                          if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
305                                  // IE copies events bound via attachEvent when
306                                  // using cloneNode. Calling detachEvent on the
307                                  // clone will also remove the events from the orignal
308                                  // In order to get around this, we use innerHTML.
309                                  // Unfortunately, this means some modifications to
310                                  // attributes in IE that are actually only stored
311                                  // as properties will not be copied (such as the
312                                  // the name attribute on an input).
313                                  var html = this.outerHTML;
314                                  if ( !html ) {
315                                          var div = this.ownerDocument.createElement("div");
316                                          div.appendChild( this.cloneNode(true) );
317                                          html = div.innerHTML;
318                                  }
319  
320                                  return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0];
321                          } else
322                                  return this.cloneNode(true);
323                  });
324  
325                  // Copy the events from the original to the clone
326                  if ( events === true ) {
327                          var orig = this.find("*").andSelf(), i = 0;
328  
329                          ret.find("*").andSelf().each(function(){
330                                  if ( this.nodeName !== orig[i].nodeName )
331                                          return;
332  
333                                  var events = jQuery.data( orig[i], "events" );
334  
335                                  for ( var type in events ) {
336                                          for ( var handler in events[ type ] ) {
337                                                  jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
338                                          }
339                                  }
340  
341                                  i++;
342                          });
343                  }
344  
345                  // Return the cloned set
346                  return ret;
347          },
348  
349          filter: function( selector ) {
350                  return this.pushStack(
351                          jQuery.isFunction( selector ) &&
352                          jQuery.grep(this, function(elem, i){
353                                  return selector.call( elem, i );
354                          }) ||
355  
356                          jQuery.multiFilter( selector, jQuery.grep(this, function(elem){
357                                  return elem.nodeType === 1;
358                          }) ), "filter", selector );
359          },
360  
361          closest: function( selector ) {
362                  var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null,
363                          closer = 0;
364  
365                  return this.map(function(){
366                          var cur = this;
367                          while ( cur && cur.ownerDocument ) {
368                                  if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) {
369                                          jQuery.data(cur, "closest", closer);
370                                          return cur;
371                                  }
372                                  cur = cur.parentNode;
373                                  closer++;
374                          }
375                  });
376          },
377  
378          not: function( selector ) {
379                  if ( typeof selector === "string" )
380                          // test special case where just one selector is passed in
381                          if ( isSimple.test( selector ) )
382                                  return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector );
383                          else
384                                  selector = jQuery.multiFilter( selector, this );
385  
386                  var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
387                  return this.filter(function() {
388                          return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
389                  });
390          },
391  
392          add: function( selector ) {
393                  return this.pushStack( jQuery.unique( jQuery.merge(
394                          this.get(),
395                          typeof selector === "string" ?
396                                  jQuery( selector ) :
397                                  jQuery.makeArray( selector )
398                  )));
399          },
400  
401          is: function( selector ) {
402                  return !!selector && jQuery.multiFilter( selector, this ).length > 0;
403          },
404  
405          hasClass: function( selector ) {
406                  return !!selector && this.is( "." + selector );
407          },
408  
409          val: function( value ) {
410                  if ( value === undefined ) {                   
411                          var elem = this[0];
412  
413                          if ( elem ) {
414                                  if( jQuery.nodeName( elem, 'option' ) )
415                                          return (elem.attributes.value || {}).specified ? elem.value : elem.text;
416                                 
417                                  // We need to handle select boxes special
418                                  if ( jQuery.nodeName( elem, "select" ) ) {
419                                          var index = elem.selectedIndex,
420                                                  values = [],
421                                                  options = elem.options,
422                                                  one = elem.type == "select-one";
423  
424                                          // Nothing was selected
425                                          if ( index < 0 )
426                                                  return null;
427  
428                                          // Loop through all the selected options
429                                          for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
430                                                  var option = options[ i ];
431  
432                                                  if ( option.selected ) {
433                                                          // Get the specifc value for the option
434                                                          value = jQuery(option).val();
435  
436                                                          // We don't need an array for one selects
437                                                          if ( one )
438                                                                  return value;
439  
440                                                          // Multi-Selects return an array
441                                                          values.push( value );
442                                                  }
443                                          }
444  
445                                          return values;                         
446                                  }
447  
448                                  // Everything else, we just grab the value
449                                  return (elem.value || "").replace(/\r/g, "");
450  
451                          }
452  
453                          return undefined;
454                  }
455  
456                  if ( typeof value === "number" )
457                          value += '';
458  
459                  return this.each(function(){
460                          if ( this.nodeType != 1 )
461                                  return;
462  
463                          if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) )
464                                  this.checked = (jQuery.inArray(this.value, value) >= 0 ||
465                                          jQuery.inArray(this.name, value) >= 0);
466  
467                          else if ( jQuery.nodeName( this, "select" ) ) {
468                                  var values = jQuery.makeArray(value);
469  
470                                  jQuery( "option", this ).each(function(){
471                                          this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
472                                                  jQuery.inArray( this.text, values ) >= 0);
473                                  });
474  
475                                  if ( !values.length )
476                                          this.selectedIndex = -1;
477  
478                          } else
479                                  this.value = value;
480                  });
481          },
482  
483          html: function( value ) {
484                  return value === undefined ?
485                          (this[0] ?
486                                  this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") :
487                                  null) :
488                          this.empty().append( value );
489          },
490  
491          replaceWith: function( value ) {
492                  return this.after( value ).remove();
493          },
494  
495          eq: function( i ) {
496                  return this.slice( i, +i + 1 );
497          },
498  
499          slice: function() {
500                  return this.pushStack( Array.prototype.slice.apply( this, arguments ),
501                          "slice", Array.prototype.slice.call(arguments).join(",") );
502          },
503  
504          map: function( callback ) {
505                  return this.pushStack( jQuery.map(this, function(elem, i){
506                          return callback.call( elem, i, elem );
507                  }));
508          },
509  
510          andSelf: function() {
511                  return this.add( this.prevObject );
512          },
513  
514          domManip: function( args, table, callback ) {
515                  if ( this[0] ) {
516                          var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(),
517                                  scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ),
518                                  first = fragment.firstChild;
519  
520                          if ( first )
521                                  for ( var i = 0, l = this.length; i < l; i++ )
522                                          callback.call( root(this[i], first), this.length > 1 || i > 0 ?
523                                                          fragment.cloneNode(true) : fragment );
524                 
525                          if ( scripts )
526                                  jQuery.each( scripts, evalScript );
527                  }
528  
529                  return this;
530                 
531                  function root( elem, cur ) {
532                          return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ?
533                                  (elem.getElementsByTagName("tbody")[0] ||
534                                  elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
535                                  elem;
536                  }
537          }
538  };
539  
540  // Give the init function the jQuery prototype for later instantiation
541  jQuery.fn.init.prototype = jQuery.fn;
542  
543  function evalScript( i, elem ) {
544          if ( elem.src )
545                  jQuery.ajax({
546                          url: elem.src,
547                          async: false,
548                          dataType: "script"
549                  });
550  
551          else
552                  jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
553  
554          if ( elem.parentNode )
555                  elem.parentNode.removeChild( elem );
556  }
557  
558  function now(){
559          return +new Date;
560  }
561  
562  jQuery.extend = jQuery.fn.extend = function() {
563          // copy reference to target object
564          var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
565  
566          // Handle a deep copy situation
567          if ( typeof target === "boolean" ) {
568                  deep = target;
569                  target = arguments[1] || {};
570                  // skip the boolean and the target
571                  i = 2;
572          }
573  
574          // Handle case when target is a string or something (possible in deep copy)
575          if ( typeof target !== "object" && !jQuery.isFunction(target) )
576                  target = {};
577  
578          // extend jQuery itself if only one argument is passed
579          if ( length == i ) {
580                  target = this;
581                  --i;
582          }
583  
584          for ( ; i < length; i++ )
585                  // Only deal with non-null/undefined values
586                  if ( (options = arguments[ i ]) != null )
587                          // Extend the base object
588                          for ( var name in options ) {
589                                  var src = target[ name ], copy = options[ name ];
590  
591                                  // Prevent never-ending loop
592                                  if ( target === copy )
593                                          continue;
594  
595                                  // Recurse if we're merging object values
596                                  if ( deep && copy && typeof copy === "object" && !copy.nodeType )
597                                          target[ name ] = jQuery.extend( deep, 
598                                                  // Never move original objects, clone them
599                                                  src || ( copy.length != null ? [ ] : { } )
600                                          , copy );
601  
602                                  // Don't bring in undefined values
603                                  else if ( copy !== undefined )
604                                          target[ name ] = copy;
605  
606                          }
607  
608          // Return the modified object
609          return target;
610  };
611  
612  // exclude the following css properties to add px
613  var     exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
614          // cache defaultView
615          defaultView = document.defaultView || {},
616          toString = Object.prototype.toString;
617  
618  jQuery.extend({
619          noConflict: function( deep ) {
620                  window.$ = _$;
621  
622                  if ( deep )
623                          window.jQuery = _jQuery;
624  
625                  return jQuery;
626          },
627  
628          // See test/unit/core.js for details concerning isFunction.
629          // Since version 1.3, DOM methods and functions like alert
630          // aren't supported. They return false on IE (#2968).
631          isFunction: function( obj ) {
632                  return toString.call(obj) === "[object Function]";
633          },
634  
635          isArray: function( obj ) {
636                  return toString.call(obj) === "[object Array]";
637          },
638  
639          // check if an element is in a (or is an) XML document
640          isXMLDoc: function( elem ) {
641                  return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
642                          !!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument );
643          },
644  
645          // Evalulates a script in a global context
646          globalEval: function( data ) {
647                  if ( data && /\S/.test(data) ) {
648                          // Inspired by code by Andrea Giammarchi
649                          // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
650                          var head = document.getElementsByTagName("head")[0] || document.documentElement,
651                                  script = document.createElement("script");
652  
653                          script.type = "text/javascript";
654                          if ( jQuery.support.scriptEval )
655                                  script.appendChild( document.createTextNode( data ) );
656                          else
657                                  script.text = data;
658  
659                          // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
660                          // This arises when a base node is used (#2709).
661                          head.insertBefore( script, head.firstChild );
662                          head.removeChild( script );
663                  }
664          },
665  
666          nodeName: function( elem, name ) {
667                  return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
668          },
669  
670          // args is for internal usage only
671          each: function( object, callback, args ) {
672                  var name, i = 0, length = object.length;
673  
674                  if ( args ) {
675                          if ( length === undefined ) {
676                                  for ( name in object )
677                                          if ( callback.apply( object[ name ], args ) === false )
678                                                  break;
679                          } else
680                                  for ( ; i < length; )
681                                          if ( callback.apply( object[ i++ ], args ) === false )
682                                                  break;
683  
684                  // A special, fast, case for the most common use of each
685                  } else {
686                          if ( length === undefined ) {
687                                  for ( name in object )
688                                          if ( callback.call( object[ name ], name, object[ name ] ) === false )
689                                                  break;
690                          } else
691                                  for ( var value = object[0];
692                                          i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
693                  }
694  
695                  return object;
696          },
697  
698          prop: function( elem, value, type, i, name ) {
699                  // Handle executable functions
700                  if ( jQuery.isFunction( value ) )
701                          value = value.call( elem, i );
702  
703                  // Handle passing in a number to a CSS property
704                  return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ?
705                          value + "px" :
706                          value;
707          },
708  
709          className: {
710                  // internal only, use addClass("class")
711                  add: function( elem, classNames ) {
712                          jQuery.each((classNames || "").split(/\s+/), function(i, className){
713                                  if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
714                                          elem.className += (elem.className ? " " : "") + className;
715                          });
716                  },
717  
718                  // internal only, use removeClass("class")
719                  remove: function( elem, classNames ) {
720                          if (elem.nodeType == 1)
721                                  elem.className = classNames !== undefined ?
722                                          jQuery.grep(elem.className.split(/\s+/), function(className){
723                                                  return !jQuery.className.has( classNames, className );
724                                          }).join(" ") :
725                                          "";
726                  },
727  
728                  // internal only, use hasClass("class")
729                  has: function( elem, className ) {
730                          return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
731                  }
732          },
733  
734          // A method for quickly swapping in/out CSS properties to get correct calculations
735          swap: function( elem, options, callback ) {
736                  var old = {};
737                  // Remember the old values, and insert the new ones
738                  for ( var name in options ) {
739                          old[ name ] = elem.style[ name ];
740                          elem.style[ name ] = options[ name ];
741                  }
742  
743                  callback.call( elem );
744  
745                  // Revert the old values
746                  for ( var name in options )
747                          elem.style[ name ] = old[ name ];
748          },
749  
750          css: function( elem, name, force, extra ) {
751                  if ( name == "width" || name == "height" ) {
752                          var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
753  
754                          function getWH() {
755                                  val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
756  
757                                  if ( extra === "border" )
758                                          return;
759  
760                                  jQuery.each( which, function() {
761                                          if ( !extra )
762                                                  val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
763                                          if ( extra === "margin" )
764                                                  val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
765                                          else
766                                                  val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
767                                  });
768                          }
769  
770                          if ( elem.offsetWidth !== 0 )
771                                  getWH();
772                          else
773                                  jQuery.swap( elem, props, getWH );
774  
775                          return Math.max(0, Math.round(val));
776                  }
777  
778                  return jQuery.curCSS( elem, name, force );
779          },
780  
781          curCSS: function( elem, name, force ) {
782                  var ret, style = elem.style;
783  
784                  // We need to handle opacity special in IE
785                  if ( name == "opacity" && !jQuery.support.opacity ) {
786                          ret = jQuery.attr( style, "opacity" );
787  
788                          return ret == "" ?
789                                  "1" :
790                                  ret;
791                  }
792  
793                  // Make sure we're using the right name for getting the float value
794                  if ( name.match( /float/i ) )
795                          name = styleFloat;
796  
797                  if ( !force && style && style[ name ] )
798                          ret = style[ name ];
799  
800                  else if ( defaultView.getComputedStyle ) {
801  
802                          // Only "float" is needed here
803                          if ( name.match( /float/i ) )
804                                  name = "float";
805  
806                          name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
807  
808                          var computedStyle = defaultView.getComputedStyle( elem, null );
809  
810                          if ( computedStyle )
811                                  ret = computedStyle.getPropertyValue( name );
812  
813                          // We should always get a number back from opacity
814                          if ( name == "opacity" && ret == "" )
815                                  ret = "1";
816  
817                  } else if ( elem.currentStyle ) {
818                          var camelCase = name.replace(/\-(\w)/g, function(all, letter){
819                                  return letter.toUpperCase();
820                          });
821  
822                          ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
823  
824                          // From the awesome hack by Dean Edwards
825                          // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
826  
827                          // If we're not dealing with a regular pixel number
828                          // but a number that has a weird ending, we need to convert it to pixels
829                          if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
830                                  // Remember the original values
831                                  var left = style.left, rsLeft = elem.runtimeStyle.left;
832  
833                                  // Put in the new values to get a computed value out
834                                  elem.runtimeStyle.left = elem.currentStyle.left;
835                                  style.left = ret || 0;
836                                  ret = style.pixelLeft + "px";
837  
838                                  // Revert the changed values
839                                  style.left = left;
840                                  elem.runtimeStyle.left = rsLeft;
841                          }
842                  }
843  
844                  return ret;
845          },
846  
847          clean: function( elems, context, fragment ) {
848                  context = context || document;
849  
850                  // !context.createElement fails in IE with an error but returns typeof 'object'
851                  if ( typeof context.createElement === "undefined" )
852                          context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
853  
854                  // If a single string is passed in and it's a single tag
855                  // just do a createElement and skip the rest
856                  if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) {
857                          var match = /^<(\w+)\s*\/?>$/.exec(elems[0]);
858                          if ( match )
859                                  return [ context.createElement( match[1] ) ];
860                  }
861  
862                  var ret = [], scripts = [], div = context.createElement("div");
863  
864                  jQuery.each(elems, function(i, elem){
865                          if ( typeof elem === "number" )
866                                  elem += '';
867  
868                          if ( !elem )
869                                  return;
870  
871                          // Convert html string into DOM nodes
872                          if ( typeof elem === "string" ) {
873                                  // Fix "XHTML"-style tags in all browsers
874                                  elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
875                                          return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
876                                                  all :
877                                                  front + "></" + tag + ">";
878                                  });
879  
880                                  // Trim whitespace, otherwise indexOf won't work as expected
881                                  var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase();
882  
883                                  var wrap =
884                                          // option or optgroup
885                                          !tags.indexOf("<opt") &&
886                                          [ 1, "<select multiple='multiple'>", "</select>" ] ||
887  
888                                          !tags.indexOf("<leg") &&
889                                          [ 1, "<fieldset>", "</fieldset>" ] ||
890  
891                                          tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
892                                          [ 1, "<table>", "</table>" ] ||
893  
894                                          !tags.indexOf("<tr") &&
895                                          [ 2, "<table><tbody>", "</tbody></table>" ] ||
896  
897                                          // <thead> matched above
898                                          (!tags.indexOf("<td") || !tags.indexOf("<th")) &&
899                                          [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
900  
901                                          !tags.indexOf("<col") &&
902                                          [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
903  
904                                          // IE can't serialize <link> and <script> tags normally
905                                          !jQuery.support.htmlSerialize &&
906                                          [ 1, "div<div>", "</div>" ] ||
907  
908                                          [ 0, "", "" ];
909  
910                                  // Go to html and back, then peel off extra wrappers
911                                  div.innerHTML = wrap[1] + elem + wrap[2];
912  
913                                  // Move to the right depth
914                                  while ( wrap[0]-- )
915                                          div = div.lastChild;
916  
917                                  // Remove IE's autoinserted <tbody> from table fragments
918                                  if ( !jQuery.support.tbody ) {
919  
920                                          // String was a <table>, *may* have spurious <tbody>
921                                          var hasBody = /<tbody/i.test(elem),
922                                                  tbody = !tags.indexOf("<table") && !hasBody ?
923                                                          div.firstChild && div.firstChild.childNodes :
924  
925                                                  // String was a bare <thead> or <tfoot>
926                                                  wrap[1] == "<table>" && !hasBody ?
927                                                          div.childNodes :
928                                                          [];
929  
930                                          for ( var j = tbody.length - 1; j >= 0 ; --j )
931                                                  if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
932                                                          tbody[ j ].parentNode.removeChild( tbody[ j ] );
933  
934                                          }
935  
936                                  // IE completely kills leading whitespace when innerHTML is used
937                                  if ( !jQuery.support.leadingWhitespace && /^\s/.test( elem ) )
938                                          div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
939                                 
940                                  elem = jQuery.makeArray( div.childNodes );
941                          }
942  
943                          if ( elem.nodeType )
944                                  ret.push( elem );
945                          else
946                                  ret = jQuery.merge( ret, elem );
947  
948                  });
949  
950                  if ( fragment ) {
951                          for ( var i = 0; ret[i]; i++ ) {
952                                  if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
953                                          scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
954                                  } else {
955                                          if ( ret[i].nodeType === 1 )
956                                                  ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
957                                          fragment.appendChild( ret[i] );
958                                  }
959                          }
960                         
961                          return scripts;
962                  }
963  
964                  return ret;
965          },
966  
967          attr: function( elem, name, value ) {
968                  // don't set attributes on text and comment nodes
969                  if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
970                          return undefined;
971  
972                  var notxml = !jQuery.isXMLDoc( elem ),
973                          // Whether we are setting (or getting)
974                          set = value !== undefined;
975  
976                  // Try to normalize/fix the name
977                  name = notxml && jQuery.props[ name ] || name;
978  
979                  // Only do all the following if this is a node (faster for style)
980                  // IE elem.getAttribute passes even for style
981                  if ( elem.tagName ) {
982  
983                          // These attributes require special treatment
984                          var special = /href|src|style/.test( name );
985  
986                          // Safari mis-reports the default selected property of a hidden option
987                          // Accessing the parent's selectedIndex property fixes it
988                          if ( name == "selected" && elem.parentNode )
989                                  elem.parentNode.selectedIndex;
990  
991                          // If applicable, access the attribute via the DOM 0 way
992                          if ( name in elem && notxml && !special ) {
993                                  if ( set ){
994                                          // We can't allow the type property to be changed (since it causes problems in IE)
995                                          if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
996                                                  throw "type property can't be changed";
997  
998                                          elem[ name ] = value;
999                                  }
1000  
1001                                  // browsers index elements by id/name on forms, give priority to attributes.
1002                                  if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
1003                                          return elem.getAttributeNode( name ).nodeValue;
1004  
1005                                  // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
1006                                  // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
1007                                  if ( name == "tabIndex" ) {
1008                                          var attributeNode = elem.getAttributeNode( "tabIndex" );
1009                                          return attributeNode && attributeNode.specified
1010                                                  ? attributeNode.value
1011                                                  : elem.nodeName.match(/(button|input|object|select|textarea)/i)
1012                                                          ? 0
1013                                                          : elem.nodeName.match(/^(a|area)$/i) && elem.href
1014                                                                  ? 0
1015                                                                  : undefined;
1016                                  }
1017  
1018                                  return elem[ name ];
1019                          }
1020  
1021                          if ( !jQuery.support.style && notxml &&  name == "style" )
1022                                  return jQuery.attr( elem.style, "cssText", value );
1023  
1024                          if ( set )
1025                                  // convert the value to a string (all browsers do this but IE) see #1070
1026                                  elem.setAttribute( name, "" + value );
1027  
1028                          var attr = !jQuery.support.hrefNormalized && notxml && special
1029                                          // Some attributes require a special call on IE
1030                                          ? elem.getAttribute( name, 2 )
1031                                          : elem.getAttribute( name );
1032  
1033                          // Non-existent attributes return null, we normalize to undefined
1034                          return attr === null ? undefined : attr;
1035                  }
1036  
1037                  // elem is actually elem.style ... set the style
1038  
1039                  // IE uses filters for opacity
1040                  if ( !jQuery.support.opacity && name == "opacity" ) {
1041                          if ( set ) {
1042                                  // IE has trouble with opacity if it does not have layout
1043                                  // Force it by setting the zoom level
1044                                  elem.zoom = 1;
1045  
1046                                  // Set the alpha filter to set the opacity
1047                                  elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +
1048                                          (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
1049                          }
1050  
1051                          return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
1052                                  (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
1053                                  "";
1054                  }
1055  
1056                  name = name.replace(/-([a-z])/ig, function(all, letter){
1057                          return letter.toUpperCase();
1058                  });
1059  
1060                  if ( set )
1061                          elem[ name ] = value;
1062  
1063                  return elem[ name ];
1064          },
1065  
1066          trim: function( text ) {
1067                  return (text || "").replace( /^\s+|\s+$/g, "" );
1068          },
1069  
1070          makeArray: function( array ) {
1071                  var ret = [];
1072  
1073                  if( array != null ){
1074                          var i = array.length;
1075                          // The window, strings (and functions) also have 'length'
1076                          if( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval )
1077                                  ret[0] = array;
1078                          else
1079                                  while( i )
1080                                          ret[--i] = array[i];
1081                  }
1082  
1083                  return ret;
1084          },
1085  
1086          inArray: function( elem, array ) {
1087                  for ( var i = 0, length = array.length; i < length; i++ )
1088                  // Use === because on IE, window == document
1089                          if ( array[ i ] === elem )
1090                                  return i;
1091  
1092                  return -1;
1093          },
1094  
1095          merge: function( first, second ) {
1096                  // We have to loop this way because IE & Opera overwrite the length
1097                  // expando of getElementsByTagName
1098                  var i = 0, elem, pos = first.length;
1099                  // Also, we need to make sure that the correct elements are being returned
1100                  // (IE returns comment nodes in a '*' query)
1101                  if ( !jQuery.support.getAll ) {
1102                          while ( (elem = second[ i++ ]) != null )
1103                                  if ( elem.nodeType != 8 )
1104                                          first[ pos++ ] = elem;
1105  
1106                  } else
1107                          while ( (elem = second[ i++ ]) != null )
1108                                  first[ pos++ ] = elem;
1109  
1110                  return first;
1111          },
1112  
1113          unique: function( array ) {
1114                  var ret = [], done = {};
1115  
1116                  try {
1117  
1118                          for ( var i = 0, length = array.length; i < length; i++ ) {
1119                                  var id = jQuery.data( array[ i ] );
1120  
1121                                  if ( !done[ id ] ) {
1122                                          done[ id ] = true;
1123                                          ret.push( array[ i ] );
1124                                  }
1125                          }
1126  
1127                  } catch( e ) {
1128                          ret = array;
1129                  }
1130  
1131                  return ret;
1132          },
1133  
1134          grep: function( elems, callback, inv ) {
1135                  var ret = [];
1136  
1137                  // Go through the array, only saving the items
1138                  // that pass the validator function
1139                  for ( var i = 0, length = elems.length; i < length; i++ )
1140                          if ( !inv != !callback( elems[ i ], i ) )
1141                                  ret.push( elems[ i ] );
1142  
1143                  return ret;
1144          },
1145  
1146          map: function( elems, callback ) {
1147                  var ret = [];
1148  
1149                  // Go through the array, translating each of the items to their
1150                  // new value (or values).
1151                  for ( var i = 0, length = elems.length; i < length; i++ ) {
1152                          var value = callback( elems[ i ], i );
1153  
1154                          if ( value != null )
1155                                  ret[ ret.length ] = value;
1156                  }
1157  
1158                  return ret.concat.apply( [], ret );
1159          }
1160  });
1161  
1162  // Use of jQuery.browser is deprecated.
1163  // It's included for backwards compatibility and plugins,
1164  // although they should work to migrate away.
1165  
1166  var userAgent = navigator.userAgent.toLowerCase();
1167  
1168  // Figure out what browser is being used
1169  jQuery.browser = {
1170          version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
1171          safari: /webkit/.test( userAgent ),
1172          opera: /opera/.test( userAgent ),
1173          msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
1174          mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
1175  };
1176  
1177  jQuery.each({
1178          parent: function(elem){return elem.parentNode;},
1179          parents: function(elem){return jQuery.dir(elem,"parentNode");},
1180          next: function(elem){return jQuery.nth(elem,2,"nextSibling");},
1181          prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},
1182          nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},
1183          prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},
1184          siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
1185          children: function(elem){return jQuery.sibling(elem.firstChild);},
1186          contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
1187  }, function(name, fn){
1188          jQuery.fn[ name ] = function( selector ) {
1189                  var ret = jQuery.map( this, fn );
1190  
1191                  if ( selector && typeof selector == "string" )
1192                          ret = jQuery.multiFilter( selector, ret );
1193  
1194                  return this.pushStack( jQuery.unique( ret ), name, selector );
1195          };
1196  });
1197  
1198  jQuery.each({
1199          appendTo: "append",
1200          prependTo: "prepend",
1201          insertBefore: "before",
1202          insertAfter: "after",
1203          replaceAll: "replaceWith"
1204  }, function(name, original){
1205          jQuery.fn[ name ] = function( selector ) {
1206                  var ret = [], insert = jQuery( selector );
1207  
1208                  for ( var i = 0, l = insert.length; i < l; i++ ) {
1209                          var elems = (i > 0 ? this.clone(true) : this).get();
1210                          jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
1211                          ret = ret.concat( elems );
1212                  }
1213  
1214                  return this.pushStack( ret, name, selector );
1215          };
1216  });
1217  
1218  jQuery.each({
1219          removeAttr: function( name ) {
1220                  jQuery.attr( this, name, "" );
1221                  if (this.nodeType == 1)
1222                          this.removeAttribute( name );
1223          },
1224  
1225          addClass: function( classNames ) {
1226                  jQuery.className.add( this, classNames );
1227          },
1228  
1229          removeClass: function( classNames ) {
1230                  jQuery.className.remove( this, classNames );
1231          },
1232  
1233          toggleClass: function( classNames, state ) {
1234                  if( typeof state !== "boolean" )
1235                          state = !jQuery.className.has( this, classNames );
1236                  jQuery.className[ state ? "add" : "remove" ]( this, classNames );
1237          },
1238  
1239          remove: function( selector ) {
1240                  if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
1241                          // Prevent memory leaks
1242                          jQuery( "*", this ).add([this]).each(function(){
1243                                  jQuery.event.remove(this);
1244                                  jQuery.removeData(this);
1245                          });
1246                          if (this.parentNode)
1247                                  this.parentNode.removeChild( this );
1248                  }
1249          },
1250  
1251          empty: function() {
1252                  // Remove element nodes and prevent memory leaks
1253                  jQuery(this).children().remove();
1254  
1255                  // Remove any remaining nodes
1256                  while ( this.firstChild )
1257                          this.removeChild( this.firstChild );
1258          }
1259  }, function(name, fn){
1260          jQuery.fn[ name ] = function(){
1261                  return this.each( fn, arguments );
1262          };
1263  });
1264  
1265  // Helper function used by the dimensions and offset modules
1266  function num(elem, prop) {
1267          return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
1268  }
1269  var expando = "jQuery" + now(), uuid = 0, windowData = {};
1270  
1271  jQuery.extend({
1272          cache: {},
1273  
1274          data: function( elem, name, data ) {
1275                  elem = elem == window ?
1276                          windowData :
1277                          elem;
1278  
1279                  var id = elem[ expando ];
1280  
1281                  // Compute a unique ID for the element
1282                  if ( !id )
1283                          id = elem[ expando ] = ++uuid;
1284  
1285                  // Only generate the data cache if we're
1286                  // trying to access or manipulate it
1287                  if ( name && !jQuery.cache[ id ] )
1288                          jQuery.cache[ id ] = {};
1289  
1290                  // Prevent overriding the named cache with undefined values
1291                  if ( data !== undefined )
1292                          jQuery.cache[ id ][ name ] = data;
1293  
1294                  // Return the named cache data, or the ID for the element
1295                  return name ?
1296                          jQuery.cache[ id ][ name ] :
1297                          id;
1298          },
1299  
1300          removeData: function( elem, name ) {
1301                  elem = elem == window ?
1302                          windowData :
1303                          elem;
1304  
1305                  var id = elem[ expando ];
1306  
1307                  // If we want to remove a specific section of the element's data
1308                  if ( name ) {
1309                          if ( jQuery.cache[ id ] ) {
1310                                  // Remove the section of cache data
1311                                  delete jQuery.cache[ id ][ name ];
1312  
1313                                  // If we've removed all the data, remove the element's cache
1314                                  name = "";
1315  
1316                                  for ( name in jQuery.cache[ id ] )
1317                                          break;
1318  
1319                                  if ( !name )
1320                                          jQuery.removeData( elem );
1321                          }
1322  
1323                  // Otherwise, we want to remove all of the element's data
1324                  } else {
1325                          // Clean up the element expando
1326                          try {
1327                                  delete elem[ expando ];
1328                          } catch(e){
1329                                  // IE has trouble directly removing the expando
1330                                  // but it's ok with using removeAttribute
1331                                  if ( elem.removeAttribute )
1332                                          elem.removeAttribute( expando );
1333                          }
1334  
1335                          // Completely remove the data cache
1336                          delete jQuery.cache[ id ];
1337                  }
1338          },
1339          queue: function( elem, type, data ) {
1340                  if ( elem ){
1341         
1342                          type = (type || "fx") + "queue";
1343         
1344                          var q = jQuery.data( elem, type );
1345         
1346                          if ( !q || jQuery.isArray(data) )
1347                                  q = jQuery.data( elem, type, jQuery.makeArray(data) );
1348                          else if( data )
1349                                  q.push( data );
1350         
1351                  }
1352                  return q;
1353          },
1354  
1355          dequeue: function( elem, type ){
1356                  var queue = jQuery.queue( elem, type ),
1357                          fn = queue.shift();
1358                 
1359                  if( !type || type === "fx" )
1360                          fn = queue[0];
1361                         
1362                  if( fn !== undefined )
1363                          fn.call(elem);
1364          }
1365  });
1366  
1367  jQuery.fn.extend({
1368          data: function( key, value ){
1369                  var parts = key.split(".");
1370                  parts[1] = parts[1] ? "." + parts[1] : "";
1371  
1372                  if ( value === undefined ) {
1373                          var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1374  
1375                          if ( data === undefined && this.length )
1376                                  data = jQuery.data( this[0], key );
1377  
1378                          return data === undefined && parts[1] ?
1379                                  this.data( parts[0] ) :
1380                                  data;
1381                  } else
1382                          return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
1383                                  jQuery.data( this, key, value );
1384                          });
1385          },
1386  
1387          removeData: function( key ){
1388                  return this.each(function(){
1389                          jQuery.removeData( this, key );
1390                  });
1391          },
1392          queue: function(type, data){
1393                  if ( typeof type !== "string" ) {
1394                          data = type;
1395                          type = "fx";
1396                  }
1397  
1398                  if ( data === undefined )
1399                          return jQuery.queue( this[0], type );
1400  
1401                  return this.each(function(){
1402                          var queue = jQuery.queue( this, type, data );
1403                         
1404                           if( type == "fx" && queue.length == 1 )
1405                                  queue[0].call(this);
1406                  });
1407          },
1408          dequeue: function(type){
1409                  return this.each(function(){
1410                          jQuery.dequeue( this, type );
1411                  });
1412          }
1413  });/*!
1414   * Sizzle CSS Selector Engine - v0.9.3
1415   *  Copyright 2009, The Dojo Foundation
1416   *  Released under the MIT, BSD, and GPL Licenses.
1417   *  More information: http://sizzlejs.com/
1418   */
1419  (function(){
1420  
1421  var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,
1422          done = 0,
1423          toString = Object.prototype.toString;
1424  
1425  var Sizzle = function(selector, context, results, seed) {
1426          results = results || [];
1427          context = context || document;
1428  
1429          if ( context.nodeType !== 1 && context.nodeType !== 9 )
1430                  return [];
1431         
1432          if ( !selector || typeof selector !== "string" ) {
1433                  return results;
1434          }
1435  
1436          var parts = [], m, set, checkSet, check, mode, extra, prune = true;
1437         
1438          // Reset the position of the chunker regexp (start from head)
1439          chunker.lastIndex = 0;
1440         
1441          while ( (m = chunker.exec(selector)) !== null ) {
1442                  parts.push( m[1] );
1443                 
1444                  if ( m[2] ) {
1445                          extra = RegExp.rightContext;
1446                          break;
1447                  }
1448          }
1449  
1450          if ( parts.length > 1 && origPOS.exec( selector ) ) {
1451                  if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
1452                          set = posProcess( parts[0] + parts[1], context );
1453                  } else {
1454                          set = Expr.relative[ parts[0] ] ?
1455                                  [ context ] :
1456                                  Sizzle( parts.shift(), context );
1457  
1458                          while ( parts.length ) {
1459                                  selector = parts.shift();
1460  
1461                                  if ( Expr.relative[ selector ] )
1462                                          selector += parts.shift();
1463  
1464                                  set = posProcess( selector, set );
1465                          }
1466                  }
1467          } else {
1468                  var ret = seed ?
1469                          { expr: parts.pop(), set: makeArray(seed) } :
1470                          Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context, isXML(context) );
1471                  set = Sizzle.filter( ret.expr, ret.set );
1472  
1473                  if ( parts.length > 0 ) {
1474                          checkSet = makeArray(set);
1475                  } else {
1476                          prune = false;
1477                  }
1478  
1479                  while ( parts.length ) {
1480                          var cur = parts.pop(), pop = cur;
1481  
1482                          if ( !Expr.relative[ cur ] ) {
1483                                  cur = "";
1484                          } else {
1485                                  pop = parts.pop();
1486                          }
1487  
1488                          if ( pop == null ) {
1489                                  pop = context;
1490                          }
1491  
1492                          Expr.relative[ cur ]( checkSet, pop, isXML(context) );
1493                  }
1494          }
1495  
1496          if ( !checkSet ) {
1497                  checkSet = set;
1498          }
1499  
1500          if ( !checkSet ) {
1501                  throw "Syntax error, unrecognized expression: " + (cur || selector);
1502          }
1503  
1504          if ( toString.call(checkSet) === "[object Array]" ) {
1505                  if ( !prune ) {
1506                          results.push.apply( results, checkSet );
1507                  } else if ( context.nodeType === 1 ) {
1508                          for ( var i = 0; checkSet[i] != null; i++ ) {
1509                                  if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
1510                                          results.push( set[i] );
1511                                  }
1512                          }
1513                  } else {
1514                          for ( var i = 0; checkSet[i] != null; i++ ) {
1515                                  if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
1516                                          results.push( set[i] );
1517                                  }
1518                          }
1519                  }
1520          } else {
1521                  makeArray( checkSet, results );
1522          }
1523  
1524          if ( extra ) {
1525                  Sizzle( extra, context, results, seed );
1526  
1527                  if ( sortOrder ) {
1528                          hasDuplicate = false;
1529                          results.sort(sortOrder);
1530  
1531                          if ( hasDuplicate ) {
1532                                  for ( var i = 1; i < results.length; i++ ) {
1533                                          if ( results[i] === results[i-1] ) {
1534                                                  results.splice(i--, 1);
1535                                          }
1536                                  }
1537                          }
1538                  }
1539          }
1540  
1541          return results;
1542  };
1543  
1544  Sizzle.matches = function(expr, set){
1545          return Sizzle(expr, null, null, set);
1546  };
1547  
1548  Sizzle.find = function(expr, context, isXML){
1549          var set, match;
1550  
1551          if ( !expr ) {
1552                  return [];
1553          }
1554  
1555          for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
1556                  var type = Expr.order[i], match;
1557                 
1558                  if ( (match = Expr.match[ type ].exec( expr )) ) {
1559                          var left = RegExp.leftContext;
1560  
1561                          if ( left.substr( left.length - 1 ) !== "\\" ) {
1562                                  match[1] = (match[1] || "").replace(/\\/g, "");
1563                                  set = Expr.find[ type ]( match, context, isXML );
1564                                  if ( set != null ) {
1565                                          expr = expr.replace( Expr.match[ type ], "" );
1566                                          break;
1567                                  }
1568                          }
1569                  }
1570          }
1571  
1572          if ( !set ) {
1573                  set = context.getElementsByTagName("*");
1574          }
1575  
1576          return {set: set, expr: expr};
1577  };
1578  
1579  Sizzle.filter = function(expr, set, inplace, not){
1580          var old = expr, result = [], curLoop = set, match, anyFound,
1581                  isXMLFilter = set && set[0] && isXML(set[0]);
1582  
1583          while ( expr && set.length ) {
1584                  for ( var type in Expr.filter ) {
1585                          if ( (match = Expr.match[ type ].exec( expr )) != null ) {
1586                                  var filter = Expr.filter[ type ], found, item;
1587                                  anyFound = false;
1588  
1589                                  if ( curLoop == result ) {
1590                                          result = [];
1591                                  }
1592  
1593                                  if ( Expr.preFilter[ type ] ) {
1594                                          match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
1595  
1596                                          if ( !match ) {
1597                                                  anyFound = found = true;
1598                                          } else if ( match === true ) {
1599                                                  continue;
1600                                          }
1601                                  }
1602  
1603                                  if ( match ) {
1604                                          for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
1605                                                  if ( item ) {
1606                                                          found = filter( item, match, i, curLoop );
1607                                                          var pass = not ^ !!found;
1608  
1609                                                          if ( inplace && found != null ) {
1610                                                                  if ( pass ) {
1611                                                                          anyFound = true;
1612                                                                  } else {
1613                                                                          curLoop[i] = false;
1614                                                                  }
1615                                                          } else if ( pass ) {
1616                                                                  result.push( item );
1617                                                                  anyFound = true;
1618                                                          }
1619                                                  }
1620                                          }
1621                                  }
1622  
1623                                  if ( found !== undefined ) {
1624                                          if ( !inplace ) {
1625                                                  curLoop = result;
1626                                          }
1627  
1628                                          expr = expr.replace( Expr.match[ type ], "" );
1629  
1630                                          if ( !anyFound ) {
1631                                                  return [];
1632                                          }
1633  
1634                                          break;
1635                                  }
1636                          }
1637                  }
1638  
1639                  // Improper expression
1640                  if ( expr == old ) {
1641                          if ( anyFound == null ) {
1642                                  throw "Syntax error, unrecognized expression: " + expr;
1643                          } else {
1644                                  break;
1645                          }
1646                  }
1647  
1648                  old = expr;
1649          }
1650  
1651          return curLoop;
1652  };
1653  
1654  var Expr = Sizzle.selectors = {
1655          order: [ "ID", "NAME", "TAG" ],
1656          match: {
1657                  ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
1658                  CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
1659                  NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,
1660                  ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
1661                  TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,
1662                  CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
1663                  POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
1664                  PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
1665          },
1666          attrMap: {
1667                  "class": "className",
1668                  "for": "htmlFor"
1669          },
1670          attrHandle: {
1671                  href: function(elem){
1672                          return elem.getAttribute("href");
1673                  }
1674          },
1675          relative: {
1676                  "+": function(checkSet, part, isXML){
1677                          var isPartStr = typeof part === "string",
1678                                  isTag = isPartStr && !/\W/.test(part),
1679                                  isPartStrNotTag = isPartStr && !isTag;
1680  
1681                          if ( isTag && !isXML ) {
1682                                  part = part.toUpperCase();
1683                          }
1684  
1685                          for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
1686                                  if ( (elem = checkSet[i]) ) {
1687                                          while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
1688  
1689                                          checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ?
1690                                                  elem || false :
1691                                                  elem === part;
1692                                  }
1693                          }
1694  
1695                          if ( isPartStrNotTag ) {
1696                                  Sizzle.filter( part, checkSet, true );
1697                          }
1698                  },
1699                  ">": function(checkSet, part, isXML){
1700                          var isPartStr = typeof part === "string";
1701  
1702                          if ( isPartStr && !/\W/.test(part) ) {
1703                                  part = isXML ? part : part.toUpperCase();
1704  
1705                                  for ( var i = 0, l = checkSet.length; i < l; i++ ) {
1706                                          var elem = checkSet[i];
1707                                          if ( elem ) {
1708                                                  var parent = elem.parentNode;
1709                                                  checkSet[i] = parent.nodeName === part ? parent : false;
1710                                          }
1711                                  }
1712                          } else {
1713                                  for ( var i = 0, l = checkSet.length; i < l; i++ ) {
1714                                          var elem = checkSet[i];
1715                                          if ( elem ) {
1716                                                  checkSet[i] = isPartStr ?
1717                                                          elem.parentNode :
1718                                                          elem.parentNode === part;
1719                                          }
1720                                  }
1721  
1722                                  if ( isPartStr ) {
1723                                          Sizzle.filter( part, checkSet, true );
1724                                  }
1725                          }
1726                  },
1727                  "": function(checkSet, part, isXML){
1728                          var doneName = done++, checkFn = dirCheck;
1729  
1730                          if ( !part.match(/\W/) ) {
1731                                  var nodeCheck = part = isXML ? part : part.toUpperCase();
1732                                  checkFn = dirNodeCheck;
1733                          }
1734  
1735                          checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
1736                  },
1737                  "~": function(checkSet, part, isXML){
1738                          var doneName = done++, checkFn = dirCheck;
1739  
1740                          if ( typeof part === "string" && !part.match(/\W/) ) {
1741                                  var nodeCheck = part = isXML ? part : part.toUpperCase();
1742                                  checkFn = dirNodeCheck;
1743                          }
1744  
1745                          checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
1746                  }
1747          },
1748          find: {
1749                  ID: function(match, context, isXML){
1750                          if ( typeof context.getElementById !== "undefined" && !isXML ) {
1751                                  var m = context.getElementById(match[1]);
1752                                  return m ? [m] : [];
1753                          }
1754                  },
1755                  NAME: function(match, context, isXML){
1756                          if ( typeof context.getElementsByName !== "undefined" ) {
1757                                  var ret = [], results = context.getElementsByName(match[1]);
1758  
1759                                  for ( var i = 0, l = results.length; i < l; i++ ) {
1760                                          if ( results[i].getAttribute("name") === match[1] ) {
1761                                                  ret.push( results[i] );
1762                                          }
1763                                  }
1764  
1765                                  return ret.length === 0 ? null : ret;
1766                          }
1767                  },
1768                  TAG: function(match, context){
1769                          return context.getElementsByTagName(match[1]);
1770                  }
1771          },
1772          preFilter: {
1773                  CLASS: function(match, curLoop, inplace, result, not, isXML){
1774                          match = " " + match[1].replace(/\\/g, "") + " ";
1775  
1776                          if ( isXML ) {
1777                                  return match;
1778                          }
1779  
1780                          for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
1781                                  if ( elem ) {
1782                                          if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) {
1783                                                  if ( !inplace )
1784                                                          result.push( elem );
1785                                          } else if ( inplace ) {
1786                                                  curLoop[i] = false;
1787                                          }
1788                                  }
1789                          }
1790  
1791                          return false;
1792                  },
1793                  ID: function(match){
1794                          return match[1].replace(/\\/g, "");
1795                  },
1796                  TAG: function(match, curLoop){
1797                          for ( var i = 0; curLoop[i] === false; i++ ){}
1798                          return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
1799                  },
1800                  CHILD: function(match){
1801                          if ( match[1] == "nth" ) {
1802                                  // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
1803                                  var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
1804                                          match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
1805                                          !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
1806  
1807                                  // calculate the numbers (first)n+(last) including if they are negative
1808                                  match[2] = (test[1] + (test[2] || 1)) - 0;
1809                                  match[3] = test[3] - 0;
1810                          }
1811  
1812                          // TODO: Move to normal caching system
1813                          match[0] = done++;
1814  
1815                          return match;
1816                  },
1817                  ATTR: function(match, curLoop, inplace, result, not, isXML){
1818                          var name = match[1].replace(/\\/g, "");
1819                         
1820                          if ( !isXML && Expr.attrMap[name] ) {
1821                                  match[1] = Expr.attrMap[name];
1822                          }
1823  
1824                          if ( match[2] === "~=" ) {
1825                                  match[4] = " " + match[4] + " ";
1826                          }
1827  
1828                          return match;
1829                  },
1830                  PSEUDO: function(match, curLoop, inplace, result, not){
1831                          if ( match[1] === "not" ) {
1832                                  // If we're dealing with a complex expression, or a simple one
1833                                  if ( match[3].match(chunker).length > 1 || /^\w/.test(match[3]) ) {
1834                                          match[3] = Sizzle(match[3], null, null, curLoop);
1835                                  } else {
1836                                          var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
1837                                          if ( !inplace ) {
1838                                                  result.push.apply( result, ret );
1839                                          }
1840                                          return false;
1841                                  }
1842                          } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
1843                                  return true;
1844                          }
1845                         
1846                          return match;
1847                  },
1848                  POS: function(match){
1849                          match.unshift( true );
1850                          return match;
1851                  }
1852          },
1853          filters: {
1854                  enabled: function(elem){
1855                          return elem.disabled === false && elem.type !== "hidden";
1856                  },
1857                  disabled: function(elem){
1858                          return elem.disabled === true;
1859                  },
1860                  checked: function(elem){
1861                          return elem.checked === true;
1862                  },
1863                  selected: function(elem){
1864                          // Accessing this property makes selected-by-default
1865                          // options in Safari work properly
1866                          elem.parentNode.selectedIndex;
1867                          return elem.selected === true;
1868                  },
1869                  parent: function(elem){
1870                          return !!elem.firstChild;
1871                  },
1872                  empty: function(elem){
1873                          return !elem.firstChild;
1874                  },
1875                  has: function(elem, i, match){
1876                          return !!Sizzle( match[3], elem ).length;
1877                  },
1878                  header: function(elem){
1879                          return /h\d/i.test( elem.nodeName );
1880                  },
1881                  text: function(elem){
1882                          return "text" === elem.type;
1883                  },
1884                  radio: function(elem){
1885                          return "radio" === elem.type;
1886                  },
1887                  checkbox: function(elem){
1888                          return "checkbox" === elem.type;
1889                  },
1890                  file: function(elem){
1891                          return "file" === elem.type;
1892                  },
1893                  password: function(elem){
1894                          return "password" === elem.type;
1895                  },
1896                  submit: function(elem){
1897                          return "submit" === elem.type;
1898                  },
1899                  image: function(elem){
1900                          return "image" === elem.type;
1901                  },
1902                  reset: function(elem){
1903                          return "reset" === elem.type;
1904                  },
1905                  button: function(elem){
1906                          return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
1907                  },
1908                  input: function(elem){
1909                          return /input|select|textarea|button/i.test(elem.nodeName);
1910                  }
1911          },
1912          setFilters: {
1913                  first: function(elem, i){
1914                          return i === 0;
1915                  },
1916                  last: function(elem, i, match, array){
1917                          return i === array.length - 1;
1918                  },
1919                  even: function(elem, i){
1920                          return i % 2 === 0;
1921                  },
1922                  odd: function(elem, i){
1923                          return i % 2 === 1;
1924                  },
1925                  lt: function(elem, i, match){
1926                          return i < match[3] - 0;
1927                  },
1928                  gt: function(elem, i, match){
1929                          return i > match[3] - 0;
1930                  },
1931                  nth: function(elem, i, match){
1932                          return match[3] - 0 == i;
1933                  },
1934                  eq: function(elem, i, match){
1935                          return match[3] - 0 == i;
1936                  }
1937          },
1938          filter: {
1939                  PSEUDO: function(elem, match, i, array){
1940                          var name = match[1], filter = Expr.filters[ name ];
1941  
1942                          if ( filter ) {
1943                                  return filter( elem, i, match, array );
1944                          } else if ( name === "contains" ) {
1945                                  return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
1946                          } else if ( name === "not" ) {
1947                                  var not = match[3];
1948  
1949                                  for ( var i = 0, l = not.length; i < l; i++ ) {
1950                                          if ( not[i] === elem ) {
1951                                                  return false;
1952                                          }
1953                                  }
1954  
1955                                  return true;
1956                          }
1957                  },
1958                  CHILD: function(elem, match){
1959                          var type = match[1], node = elem;
1960                          switch (type) {
1961                                  case 'only':
1962                                  case 'first':
1963                                          while (node = node.previousSibling)  {
1964                                                  if ( node.nodeType === 1 ) return false;
1965                                          }
1966                                          if ( type == 'first') return true;
1967                                          node = elem;
1968                                  case 'last':
1969                                          while (node = node.nextSibling)  {
1970                                                  if ( node.nodeType === 1 ) return false;
1971                                          }
1972                                          return true;
1973                                  case 'nth':
1974                                          var first = match[2], last = match[3];
1975  
1976                                          if ( first == 1 && last == 0 ) {
1977                                                  return true;
1978                                          }
1979                                         
1980                                          var doneName = match[0],
1981                                                  parent = elem.parentNode;
1982         
1983                                          if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
1984                                                  var count = 0;
1985                                                  for ( node = parent.firstChild; node; node = node.nextSibling ) {
1986                                                          if ( node.nodeType === 1 ) {
1987                                                                  node.nodeIndex = ++count;
1988                                                          }
1989                                                  } 
1990                                                  parent.sizcache = doneName;
1991                                          }
1992                                         
1993                                          var diff = elem.nodeIndex - last;
1994                                          if ( first == 0 ) {
1995                                                  return diff == 0;
1996                                          } else {
1997                                                  return ( diff % first == 0 && diff / first >= 0 );
1998                                          }
1999                          }
2000                  },
2001                  ID: function(elem, match){
2002                          return elem.nodeType === 1 && elem.getAttribute("id") === match;
2003                  },
2004                  TAG: function(elem, match){
2005                          return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
2006                  },
2007                  CLASS: function(elem, match){
2008                          return (" " + (elem.className || elem.getAttribute("class")) + " ")
2009                                  .indexOf( match ) > -1;
2010                  },
2011                  ATTR: function(elem, match){
2012                          var name = match[1],
2013                                  result = Expr.attrHandle[ name ] ?
2014                                          Expr.attrHandle[ name ]( elem ) :
2015                                          elem[ name ] != null ?
2016                                                  elem[ name ] :
2017                                                  elem.getAttribute( name ),
2018                                  value = result + "",
2019                                  type = match[2],
2020                                  check = match[4];
2021  
2022                          return result == null ?
2023                                  type === "!=" :
2024                                  type === "=" ?
2025                                  value === check :
2026                                  type === "*=" ?
2027                                  value.indexOf(check) >= 0 :
2028                                  type === "~=" ?
2029                                  (" " + value + " ").indexOf(check) >= 0 :
2030                                  !check ?
2031                                  value && result !== false :
2032                                  type === "!=" ?
2033                                  value != check :
2034                                  type === "^=" ?
2035                                  value.indexOf(check) === 0 :
2036                                  type === "$=" ?
2037                                  value.substr(value.length - check.length) === check :
2038                                  type === "|=" ?
2039                                  value === check || value.substr(0, check.length + 1) === check + "-" :
2040                                  false;
2041                  },
2042                  POS: function(elem, match, i, array){
2043                          var name = match[2], filter = Expr.setFilters[ name ];
2044  
2045                          if ( filter ) {
2046                                  return filter( elem, i, match, array );
2047                          }
2048                  }
2049          }
2050  };
2051  
2052  var origPOS = Expr.match.POS;
2053  
2054  for ( var type in Expr.match ) {
2055          Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
2056  }
2057  
2058  var makeArray = function(array, results) {
2059          array = Array.prototype.slice.call( array );
2060  
2061          if ( results ) {
2062                  results.push.apply( results, array );
2063                  return results;
2064          }
2065         
2066          return array;
2067  };
2068  
2069  // Perform a simple check to determine if the browser is capable of
2070  // converting a NodeList to an array using builtin methods.
2071  try {
2072          Array.prototype.slice.call( document.documentElement.childNodes );
2073  
2074  // Provide a fallback method if it does not work
2075  } catch(e){
2076          makeArray = function(array, results) {
2077                  var ret = results || [];
2078  
2079                  if ( toString.call(array) === "[object Array]" ) {
2080                          Array.prototype.push.apply( ret, array );
2081                  } else {
2082                          if ( typeof array.length === "number" ) {
2083                                  for ( var i = 0, l = array.length; i < l; i++ ) {
2084                                          ret.push( array[i] );
2085                                  }
2086                          } else {
2087                                  for ( var i = 0; array[i]; i++ ) {
2088                                          ret.push( array[i] );
2089                                  }
2090                          }
2091                  }
2092  
2093                  return ret;
2094          };
2095  }
2096  
2097  var sortOrder;
2098  
2099  if ( document.documentElement.compareDocumentPosition ) {
2100          sortOrder = function( a, b ) {
2101                  var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
2102                  if ( ret === 0 ) {
2103                          hasDuplicate = true;
2104                  }
2105                  return ret;
2106          };
2107  } else if ( "sourceIndex" in document.documentElement ) {
2108          sortOrder = function( a, b ) {
2109                  var ret = a.sourceIndex - b.sourceIndex;
2110                  if ( ret === 0 ) {
2111                          hasDuplicate = true;
2112                  }
2113                  return ret;
2114          };
2115  } else if ( document.createRange ) {
2116          sortOrder = function( a, b ) {
2117                  var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
2118                  aRange.selectNode(a);
2119                  aRange.collapse(true);
2120                  bRange.selectNode(b);
2121                  bRange.collapse(true);
2122                  var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
2123                  if ( ret === 0 ) {
2124                          hasDuplicate = true;
2125                  }
2126                  return ret;
2127          };
2128  }
2129  
2130  // Check to see if the browser returns elements by name when
2131  // querying by getElementById (and provide a workaround)
2132  (function(){
2133          // We're going to inject a fake input element with a specified name
2134          var form = document.createElement("form"),
2135                  id = "script" + (new Date).getTime();
2136          form.innerHTML = "<input name='" + id + "'/>";
2137  
2138          // Inject it into the root element, check its status, and remove it quickly
2139          var root = document.documentElement;
2140          root.insertBefore( form, root.firstChild );
2141  
2142          // The workaround has to do additional checks after a getElementById
2143          // Which slows things down for other browsers (hence the branching)
2144          if ( !!document.getElementById( id ) ) {
2145                  Expr.find.ID = function(match, context, isXML){
2146                          if ( typeof context.getElementById !== "undefined" && !isXML ) {
2147                                  var m = context.getElementById(match[1]);
2148                                  return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
2149                          }
2150                  };
2151  
2152                  Expr.filter.ID = function(elem, match){
2153                          var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
2154                          return elem.nodeType === 1 && node && node.nodeValue === match;
2155                  };
2156          }
2157  
2158          root.removeChild( form );
2159  })();
2160  
2161  (function(){
2162          // Check to see if the browser returns only elements
2163          // when doing getElementsByTagName("*")
2164  
2165          // Create a fake element
2166          var div = document.createElement("div");
2167          div.appendChild( document.createComment("") );
2168  
2169          // Make sure no comments are found
2170          if ( div.getElementsByTagName("*").length > 0 ) {
2171                  Expr.find.TAG = function(match, context){
2172                          var results = context.getElementsByTagName(match[1]);
2173  
2174                          // Filter out possible comments
2175                          if ( match[1] === "*" ) {
2176                                  var tmp = [];
2177  
2178                                  for ( var i = 0; results[i]; i++ ) {
2179                                          if ( results[i].nodeType === 1 ) {
2180                                                  tmp.push( results[i] );
2181                                          }
2182                                  }
2183  
2184                                  results = tmp;
2185                          }
2186  
2187                          return results;
2188                  };
2189          }
2190  
2191          // Check to see if an attribute returns normalized href attributes
2192          div.innerHTML = "<a href='#'></a>";
2193          if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
2194                          div.firstChild.getAttribute("href") !== "#" ) {
2195                  Expr.attrHandle.href = function(elem){
2196                          return elem.getAttribute("href", 2);
2197                  };
2198          }
2199  })();
2200  
2201  if ( document.querySelectorAll ) (function(){
2202          var oldSizzle = Sizzle, div = document.createElement("div");
2203          div.innerHTML = "<p class='TEST'></p>";
2204  
2205          // Safari can't handle uppercase or unicode characters when
2206          // in quirks mode.
2207          if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
2208                  return;
2209          }
2210         
2211          Sizzle = function(query, context, extra, seed){
2212                  context = context || document;
2213  
2214                  // Only use querySelectorAll on non-XML documents
2215                  // (ID selectors don't work in non-HTML documents)
2216                  if ( !seed && context.nodeType === 9 && !isXML(context) ) {
2217                          try {
2218                                  return makeArray( context.querySelectorAll(query), extra );
2219                          } catch(e){}
2220                  }
2221                 
2222                  return oldSizzle(query, context, extra, seed);
2223          };
2224  
2225          Sizzle.find = oldSizzle.find;
2226          Sizzle.filter = oldSizzle.filter;
2227          Sizzle.selectors = oldSizzle.selectors;
2228          Sizzle.matches = oldSizzle.matches;
2229  })();
2230  
2231  if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){
2232          var div = document.createElement("div");
2233          div.innerHTML = "<div class='test e'></div><div class='test'></div>";
2234  
2235          // Opera can't find a second classname (in 9.6)
2236          if ( div.getElementsByClassName("e").length === 0 )
2237                  return;
2238  
2239          // Safari caches class attributes, doesn't catch changes (in 3.2)
2240          div.lastChild.className = "e";
2241  
2242          if ( div.getElementsByClassName("e").length === 1 )
2243                  return;
2244  
2245          Expr.order.splice(1, 0, "CLASS");
2246          Expr.find.CLASS = function(match, context, isXML) {
2247                  if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
2248                          return context.getElementsByClassName(match[1]);
2249                  }
2250          };
2251  })();
2252  
2253  function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
2254          var sibDir = dir == "previousSibling" && !isXML;
2255          for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2256                  var elem = checkSet[i];
2257                  if ( elem ) {
2258                          if ( sibDir && elem.nodeType === 1 ){
2259                                  elem.sizcache = doneName;
2260                                  elem.sizset = i;
2261                          }
2262                          elem = elem[dir];
2263                          var match = false;
2264  
2265                          while ( elem ) {
2266                                  if ( elem.sizcache === doneName ) {
2267                                          match = checkSet[elem.sizset];
2268                                          break;
2269                                  }
2270  
2271                                  if ( elem.nodeType === 1 && !isXML ){
2272                                          elem.sizcache = doneName;
2273                                          elem.sizset = i;
2274                                  }
2275  
2276                                  if ( elem.nodeName === cur ) {
2277                                          match = elem;
2278                                          break;
2279                                  }
2280  
2281                                  elem = elem[dir];
2282                          }
2283  
2284                          checkSet[i] = match;
2285                  }
2286          }
2287  }
2288  
2289  function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
2290          var sibDir = dir == "previousSibling" && !isXML;
2291          for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2292                  var elem = checkSet[i];
2293                  if ( elem ) {
2294                          if ( sibDir && elem.nodeType === 1 ) {
2295                                  elem.sizcache = doneName;
2296                                  elem.sizset = i;
2297                          }
2298                          elem = elem[dir];
2299                          var match = false;
2300  
2301                          while ( elem ) {
2302                                  if ( elem.sizcache === doneName ) {
2303                                          match = checkSet[elem.sizset];
2304                                          break;
2305                                  }
2306  
2307                                  if ( elem.nodeType === 1 ) {
2308                                          if ( !isXML ) {
2309                                                  elem.sizcache = doneName;
2310                                                  elem.sizset = i;
2311                                          }
2312                                          if ( typeof cur !== "string" ) {
2313                                                  if ( elem === cur ) {
2314                                                          match = true;
2315                                                          break;
2316                                                  }
2317  
2318                                          } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
2319                                                  match = elem;
2320                                                  break;
2321                                          }
2322                                  }
2323  
2324                                  elem = elem[dir];
2325                          }
2326  
2327                          checkSet[i] = match;
2328                  }
2329          }
2330  }
2331  
2332  var contains = document.compareDocumentPosition ?  function(a, b){
2333          return a.compareDocumentPosition(b) & 16;
2334  } : function(a, b){
2335          return a !== b && (a.contains ? a.contains(b) : true);
2336  };
2337  
2338  var isXML = function(elem){
2339          return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
2340                  !!elem.ownerDocument && isXML( elem.ownerDocument );
2341  };
2342  
2343  var posProcess = function(selector, context){
2344          var tmpSet = [], later = "", match,
2345                  root = context.nodeType ? [context] : context;
2346  
2347          // Position selectors must be done after the filter
2348          // And so must :not(positional) so we move all PSEUDOs to the end
2349          while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
2350                  later += match[0];
2351                  selector = selector.replace( Expr.match.PSEUDO, "" );
2352          }
2353  
2354          selector = Expr.relative[selector] ? selector + "*" : selector;
2355  
2356          for ( var i = 0, l = root.length; i < l; i++ ) {
2357                  Sizzle( selector, root[i], tmpSet );
2358          }
2359  
2360          return Sizzle.filter( later, tmpSet );
2361  };
2362  
2363  // EXPOSE
2364  jQuery.find = Sizzle;
2365  jQuery.filter = Sizzle.filter;
2366  jQuery.expr = Sizzle.selectors;
2367  jQuery.expr[":"] = jQuery.expr.filters;
2368  
2369  Sizzle.selectors.filters.hidden = function(elem){
2370          return elem.offsetWidth === 0 || elem.offsetHeight === 0;
2371  };
2372  
2373  Sizzle.selectors.filters.visible = function(elem){
2374          return elem.offsetWidth > 0 || elem.offsetHeight > 0;
2375  };
2376  
2377  Sizzle.selectors.filters.animated = function(elem){
2378          return jQuery.grep(jQuery.timers, function(fn){
2379                  return elem === fn.elem;
2380          }).length;
2381  };
2382  
2383  jQuery.multiFilter = function( expr, elems, not ) {
2384          if ( not ) {
2385                  expr = ":not(" + expr + ")";
2386          }
2387  
2388          return Sizzle.matches(expr, elems);
2389  };
2390  
2391  jQuery.dir = function( elem, dir ){
2392          var matched = [], cur = elem[dir];
2393          while ( cur && cur != document ) {
2394                  if ( cur.nodeType == 1 )
2395                          matched.push( cur );
2396                  cur = cur[dir];
2397          }
2398          return matched;
2399  };
2400  
2401  jQuery.nth = function(cur, result, dir, elem){
2402          result = result || 1;
2403          var num = 0;
2404  
2405          for ( ; cur; cur = cur[dir] )
2406                  if ( cur.nodeType == 1 && ++num == result )
2407                          break;
2408  
2409          return cur;
2410  };
2411  
2412  jQuery.sibling = function(n, elem){
2413          var r = [];
2414  
2415          for ( ; n; n = n.nextSibling ) {
2416                  if ( n.nodeType == 1 && n != elem )
2417                          r.push( n );
2418          }
2419  
2420          return r;
2421  };
2422  
2423  return;
2424  
2425  window.Sizzle = Sizzle;
2426  
2427  })();
2428  /*
2429   * A number of helper functions used for managing events.
2430   * Many of the ideas behind this code originated from
2431   * Dean Edwards' addEvent library.
2432   */
2433  jQuery.event = {
2434  
2435          // Bind an event to an element
2436          // Original by Dean Edwards
2437          add: function(elem, types, handler, data) {
2438                  if ( elem.nodeType == 3 || elem.nodeType == 8 )
2439                          return;
2440  
2441                  // For whatever reason, IE has trouble passing the window object
2442                  // around, causing it to be cloned in the process
2443                  if ( elem.setInterval && elem != window )
2444                          elem = window;
2445  
2446                  // Make sure that the function being executed has a unique ID
2447                  if ( !handler.guid )
2448                          handler.guid = this.guid++;
2449  
2450                  // if data is passed, bind to handler
2451                  if ( data !== undefined ) {
2452                          // Create temporary function pointer to original handler
2453                          var fn = handler;
2454  
2455                          // Create unique handler function, wrapped around original handler
2456                          handler = this.proxy( fn );
2457  
2458                          // Store data in unique handler
2459                          handler.data = data;
2460                  }
2461  
2462                  // Init the element's event structure
2463                  var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
2464                          handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
2465                                  // Handle the second event of a trigger and when
2466                                  // an event is called after a page has unloaded
2467                                  return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
2468                                          jQuery.event.handle.apply(arguments.callee.elem, arguments) :
2469                                          undefined;
2470                          });
2471                  // Add elem as a property of the handle function
2472                  // This is to prevent a memory leak with non-native
2473                  // event in IE.
2474                  handle.elem = elem;
2475  
2476                  // Handle multiple events separated by a space
2477                  // jQuery(...).bind("mouseover mouseout", fn);
2478                  jQuery.each(types.split(/\s+/), function(index, type) {
2479                          // Namespaced event handlers
2480                          var namespaces = type.split(".");
2481                          type = namespaces.shift();
2482                          handler.type = namespaces.slice().sort().join(".");
2483  
2484                          // Get the current list of functions bound to this event
2485                          var handlers = events[type];
2486                         
2487                          if ( jQuery.event.specialAll[type] )
2488                                  jQuery.event.specialAll[type].setup.call(elem, data, namespaces);
2489  
2490                          // Init the event handler queue
2491                          if (!handlers) {
2492                                  handlers = events[type] = {};
2493  
2494                                  // Check for a special event handler
2495                                  // Only use addEventListener/attachEvent if the special
2496                                  // events handler returns false
2497                                  if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) {
2498                                          // Bind the global event handler to the element
2499                                          if (elem.addEventListener)
2500                                                  elem.addEventListener(type, handle, false);
2501                                          else if (elem.attachEvent)
2502                                                  elem.attachEvent("on" + type, handle);
2503                                  }
2504                          }
2505  
2506                          // Add the function to the element's handler list
2507                          handlers[handler.guid] = handler;
2508  
2509                          // Keep track of which events have been used, for global triggering
2510                          jQuery.event.global[type] = true;
2511                  });
2512  
2513                  // Nullify elem to prevent memory leaks in IE
2514                  elem = null;
2515          },
2516  
2517          guid: 1,
2518          global: {},
2519  
2520          // Detach an event or set of events from an element
2521          remove: function(elem, types, handler) {
2522                  // don't do events on text and comment nodes
2523                  if ( elem.nodeType == 3 || elem.nodeType == 8 )
2524                          return;
2525  
2526                  var events = jQuery.data(elem, "events"), ret, index;
2527  
2528                  if ( events ) {
2529                          // Unbind all events for the element
2530                          if ( types === undefined || (typeof types === "string" && types.charAt(0) == ".") )
2531                                  for ( var type in events )
2532                                          this.remove( elem, type + (types || "") );
2533                          else {
2534                                  // types is actually an event object here
2535                                  if ( types.type ) {
2536                                          handler = types.handler;
2537                                          types = types.type;
2538                                  }
2539  
2540                                  // Handle multiple events seperated by a space
2541                                  // jQuery(...).unbind("mouseover mouseout", fn);
2542                                  jQuery.each(types.split(/\s+/), function(index, type){
2543                                          // Namespaced event handlers
2544                                          var namespaces = type.split(".");
2545                                          type = namespaces.shift();
2546                                          var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
2547  
2548                                          if ( events[type] ) {
2549                                                  // remove the given handler for the given type
2550                                                  if ( handler )
2551                                                          delete events[type][handler.guid];
2552  
2553                                                  // remove all handlers for the given type
2554                                                  else
2555                                                          for ( var handle in events[type] )
2556                                                                  // Handle the removal of namespaced events
2557                                                                  if ( namespace.test(events[type][handle].type) )
2558                                                                          delete events[type][handle];
2559                                                                         
2560                                                  if ( jQuery.event.specialAll[type] )
2561                                                          jQuery.event.specialAll[type].teardown.call(elem, namespaces);
2562  
2563                                                  // remove generic event handler if no more handlers exist
2564                                                  for ( ret in events[type] ) break;
2565                                                  if ( !ret ) {
2566                                                          if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem, namespaces) === false ) {
2567                                                                  if (elem.removeEventListener)
2568                                                                          elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
2569                                                                  else if (elem.detachEvent)
2570                                                                          elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
2571                                                          }
2572                                                          ret = null;
2573                                                          delete events[type];
2574                                                  }
2575                                          }
2576                                  });
2577                          }
2578  
2579                          // Remove the expando if it's no longer used
2580                          for ( ret in events ) break;
2581                          if ( !ret ) {
2582                                  var handle = jQuery.data( elem, "handle" );
2583                                  if ( handle ) handle.elem = null;
2584                                  jQuery.removeData( elem, "events" );
2585                                  jQuery.removeData( elem, "handle" );
2586                          }
2587                  }
2588          },
2589  
2590          // bubbling is internal
2591          trigger: function( event, data, elem, bubbling ) {
2592                  // Event object or event type
2593                  var type = event.type || event;
2594  
2595                  if( !bubbling ){
2596                          event = typeof event === "object" ?
2597                                  // jQuery.Event object
2598                                  event[expando] ? event :
2599                                  // Object literal
2600                                  jQuery.extend( jQuery.Event(type), event ) :
2601                                  // Just the event type (string)
2602                                  jQuery.Event(type);
2603  
2604                          if ( type.indexOf("!") >= 0 ) {
2605                                  event.type = type = type.slice(0, -1);
2606                                  event.exclusive = true;
2607                          }
2608  
2609                          // Handle a global trigger
2610                          if ( !elem ) {
2611                                  // Don't bubble custom events when global (to avoid too much overhead)
2612                                  event.stopPropagation();
2613                                  // Only trigger if we've ever bound an event for it
2614                                  if ( this.global[type] )
2615                                          jQuery.each( jQuery.cache, function(){
2616                                                  if ( this.events && this.events[type] )
2617                                                          jQuery.event.trigger( event, data, this.handle.elem );
2618                                          });
2619                          }
2620  
2621                          // Handle triggering a single element
2622  
2623                          // don't do events on text and comment nodes
2624                          if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 )
2625                                  return undefined;
2626                         
2627                          // Clean up in case it is reused
2628                          event.result = undefined;
2629                          event.target = elem;
2630                         
2631                          // Clone the incoming data, if any
2632                          data = jQuery.makeArray(data);
2633                          data.unshift( event );
2634                  }
2635  
2636                  event.currentTarget = elem;
2637  
2638                  // Trigger the event, it is assumed that "handle" is a function
2639                  var handle = jQuery.data(elem, "handle");
2640                  if ( handle )
2641                          handle.apply( elem, data );
2642  
2643                  // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
2644                  if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
2645                          event.result = false;
2646  
2647                  // Trigger the native events (except for clicks on links)
2648                  if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
2649                          this.triggered = true;
2650                          try {
2651                                  elem[ type ]();
2652                          // prevent IE from throwing an error for some hidden elements
2653                          } catch (e) {}
2654                  }
2655  
2656                  this.triggered = false;
2657  
2658                  if ( !event.isPropagationStopped() ) {
2659                          var parent = elem.parentNode || elem.ownerDocument;
2660                          if ( parent )
2661                                  jQuery.event.trigger(event, data, parent, true);
2662                  }
2663          },
2664  
2665          handle: function(event) {
2666                  // returned undefined or false
2667                  var all, handlers;
2668  
2669                  event = arguments[0] = jQuery.event.fix( event || window.event );
2670                  event.currentTarget = this;
2671                 
2672                  // Namespaced event handlers
2673                  var namespaces = event.type.split(".");
2674                  event.type = namespaces.shift();
2675  
2676                  // Cache this now, all = true means, any handler
2677                  all = !namespaces.length && !event.exclusive;
2678                 
2679                  var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
2680  
2681                  handlers = ( jQuery.data(this, "events") || {} )[event.type];
2682  
2683                  for ( var j in handlers ) {
2684                          var handler = handlers[j];
2685  
2686                          // Filter the functions by class
2687                          if ( all || namespace.test(handler.type) ) {
2688                                  // Pass in a reference to the handler function itself
2689                                  // So that we can later remove it
2690                                  event.handler = handler;
2691                                  event.data = handler.data;
2692  
2693                                  var ret = handler.apply(this, arguments);
2694  
2695                                  if( ret !== undefined ){
2696                                          event.result = ret;
2697                                          if ( ret === false ) {
2698                                                  event.preventDefault();
2699                                                  event.stopPropagation();
2700                                          }
2701                                  }
2702  
2703                                  if( event.isImmediatePropagationStopped() )
2704                                          break;
2705  
2706                          }
2707                  }
2708          },
2709  
2710          props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
2711  
2712          fix: function(event) {
2713                  if ( event[expando] )
2714                          return event;
2715  
2716                  // store a copy of the original event object
2717                  // and "clone" to set read-only properties
2718                  var originalEvent = event;
2719                  event = jQuery.Event( originalEvent );
2720  
2721                  for ( var i = this.props.length, prop; i; ){
2722                          prop = this.props[ --i ];
2723                          event[ prop ] = originalEvent[ prop ];
2724                  }
2725  
2726                  // Fix target property, if necessary
2727                  if ( !event.target )
2728                          event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
2729  
2730                  // check if target is a textnode (safari)
2731                  if ( event.target.nodeType == 3 )
2732                          event.target = event.target.parentNode;
2733  
2734                  // Add relatedTarget, if necessary
2735                  if ( !event.relatedTarget && event.fromElement )
2736                          event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
2737  
2738                  // Calculate pageX/Y if missing and clientX/Y available
2739                  if ( event.pageX == null && event.clientX != null ) {
2740                          var doc = document.documentElement, body = document.body;
2741                          event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
2742                          event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
2743                  }
2744  
2745                  // Add which for key events
2746                  if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
2747                          event.which = event.charCode || event.keyCode;
2748  
2749                  // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
2750                  if ( !event.metaKey && event.ctrlKey )
2751                          event.metaKey = event.ctrlKey;
2752  
2753                  // Add which for click: 1 == left; 2 == middle; 3 == right
2754                  // Note: button is not normalized, so don't use it
2755                  if ( !event.which && event.button )
2756                          event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
2757  
2758                  return event;
2759          },
2760  
2761          proxy: function( fn, proxy ){
2762                  proxy = proxy || function(){ return fn.apply(this, arguments); };
2763                  // Set the guid of unique handler to the same of original handler, so it can be removed
2764                  proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
2765                  // So proxy can be declared as an argument
2766                  return proxy;
2767          },
2768  
2769          special: {
2770                  ready: {
2771                          // Make sure the ready event is setup
2772                          setup: bindReady,
2773                          teardown: function() {}
2774                  }
2775          },
2776         
2777          specialAll: {
2778                  live: {
2779                          setup: function( selector, namespaces ){
2780                                  jQuery.event.add( this, namespaces[0], liveHandler );
2781                          },
2782                          teardown:  function( namespaces ){
2783                                  if ( namespaces.length ) {
2784                                          var remove = 0, name = RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)");
2785                                         
2786                                          jQuery.each( (jQuery.data(this, "events").live || {}), function(){
2787                                                  if ( name.test(this.type) )
2788                                                          remove++;
2789                                          });
2790                                         
2791                                          if ( remove < 1 )
2792                                                  jQuery.event.remove( this, namespaces[0], liveHandler );
2793                                  }
2794                          }
2795                  }
2796          }
2797  };
2798  
2799  jQuery.Event = function( src ){
2800          // Allow instantiation without the 'new' keyword
2801          if( !this.preventDefault )
2802                  return new jQuery.Event(src);
2803         
2804          // Event object
2805          if( src && src.type ){
2806                  this.originalEvent = src;
2807                  this.type = src.type;
2808          // Event type
2809          }else
2810                  this.type = src;
2811  
2812          // timeStamp is buggy for some events on Firefox(#3843)
2813          // So we won't rely on the native value
2814          this.timeStamp = now();
2815         
2816          // Mark it as fixed
2817          this[expando] = true;
2818  };
2819  
2820  function returnFalse(){
2821          return false;
2822  }
2823  function returnTrue(){
2824          return true;
2825  }
2826  
2827  // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
2828  // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
2829  jQuery.Event.prototype = {
2830          preventDefault: function() {
2831                  this.isDefaultPrevented = returnTrue;
2832  
2833                  var e = this.originalEvent;
2834                  if( !e )
2835                          return;
2836                  // if preventDefault exists run it on the original event
2837                  if (e.preventDefault)
2838                          e.preventDefault();
2839                  // otherwise set the returnValue property of the original event to false (IE)
2840                  e.returnValue = false;
2841          },
2842          stopPropagation: function() {
2843                  this.isPropagationStopped = returnTrue;
2844  
2845                  var e = this.originalEvent;
2846                  if( !e )
2847                          return;
2848                  // if stopPropagation exists run it on the original event
2849                  if (e.stopPropagation)
2850                          e.stopPropagation();
2851                  // otherwise set the cancelBubble property of the original event to true (IE)
2852                  e.cancelBubble = true;
2853          },
2854          stopImmediatePropagation:function(){
2855                  this.isImmediatePropagationStopped = returnTrue;
2856                  this.stopPropagation();
2857          },
2858          isDefaultPrevented: returnFalse,
2859          isPropagationStopped: returnFalse,
2860          isImmediatePropagationStopped: returnFalse
2861  };
2862  // Checks if an event happened on an element within another element
2863  // Used in jQuery.event.special.mouseenter and mouseleave handlers
2864  var withinElement = function(event) {
2865          // Check if mouse(over|out) are still within the same parent element
2866          var parent = event.relatedTarget;
2867          // Traverse up the tree
2868          while ( parent && parent != this )
2869                  try { parent = parent.parentNode; }
2870                  catch(e) { parent = this; }
2871         
2872          if( parent != this ){
2873                  // set the correct event type
2874                  event.type = event.data;
2875                  // handle event if we actually just moused on to a non sub-element
2876                  jQuery.event.handle.apply( this, arguments );
2877          }
2878  };
2879         
2880  jQuery.each({ 
2881          mouseover: 'mouseenter', 
2882          mouseout: 'mouseleave'
2883  }, function( orig, fix ){
2884          jQuery.event.special[ fix ] = {
2885                  setup: function(){
2886                          jQuery.event.add( this, orig, withinElement, fix );
2887                  },
2888                  teardown: function(){
2889                          jQuery.event.remove( this, orig, withinElement );
2890                  }
2891          };                         
2892  });
2893  
2894  jQuery.fn.extend({
2895          bind: function( type, data, fn ) {
2896                  return type == "unload" ? this.one(type, data, fn) : this.each(function(){
2897                          jQuery.event.add( this, type, fn || data, fn && data );
2898                  });
2899          },
2900  
2901          one: function( type, data, fn ) {
2902                  var one = jQuery.event.proxy( fn || data, function(event) {
2903                          jQuery(this).unbind(event, one);
2904                          return (fn || data).apply( this, arguments );
2905                  });
2906                  return this.each(function(){
2907                          jQuery.event.add( this, type, one, fn && data);
2908                  });
2909          },
2910  
2911          unbind: function( type, fn ) {
2912                  return this.each(function(){
2913                          jQuery.event.remove( this, type, fn );
2914                  });
2915          },
2916  
2917          trigger: function( type, data ) {
2918                  return this.each(function(){
2919                          jQuery.event.trigger( type, data, this );
2920                  });
2921          },
2922  
2923          triggerHandler: function( type, data ) {
2924                  if( this[0] ){
2925                          var event = jQuery.Event(type);
2926                          event.preventDefault();
2927                          event.stopPropagation();
2928                          jQuery.event.trigger( event, data, this[0] );
2929                          return event.result;
2930                  }               
2931          },
2932  
2933          toggle: function( fn ) {
2934                  // Save reference to arguments for access in closure
2935                  var args = arguments, i = 1;
2936  
2937                  // link all the functions, so any of them can unbind this click handler
2938                  while( i < args.length )
2939                          jQuery.event.proxy( fn, args[i++] );
2940  
2941                  return this.click( jQuery.event.proxy( fn, function(event) {
2942                          // Figure out which function to execute
2943                          this.lastToggle = ( this.lastToggle || 0 ) % i;
2944  
2945                          // Make sure that clicks stop
2946                          event.preventDefault();
2947  
2948                          // and execute the function
2949                          return args[ this.lastToggle++ ].apply( this, arguments ) || false;
2950                  }));
2951          },
2952  
2953          hover: function(fnOver, fnOut) {
2954                  return this.mouseenter(fnOver).mouseleave(fnOut);
2955          },
2956  
2957          ready: function(fn) {
2958                  // Attach the listeners
2959                  bindReady();
2960  
2961                  // If the DOM is already ready
2962                  if ( jQuery.isReady )
2963                          // Execute the function immediately
2964                          fn.call( document, jQuery );
2965  
2966                  // Otherwise, remember the function for later
2967                  else
2968                          // Add the function to the wait list
2969                          jQuery.readyList.push( fn );
2970  
2971                  return this;
2972          },
2973         
2974          live: function( type, fn ){
2975                  var proxy = jQuery.event.proxy( fn );
2976                  proxy.guid += this.selector + type;
2977  
2978                  jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy );
2979  
2980                  return this;
2981          },
2982         
2983          die: function( type, fn ){
2984                  jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null );
2985                  return this;
2986          }
2987  });
2988  
2989  function liveHandler( event ){
2990          var check = RegExp("(^|\\.)" + event.type + "(\\.|$)"),
2991                  stop = true,
2992                  elems = [];
2993  
2994          jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){
2995                  if ( check.test(fn.type) ) {
2996                          var elem = jQuery(event.target).closest(fn.data)[0];
2997                          if ( elem )
2998                                  elems.push({ elem: elem, fn: fn });
2999                  }
3000          });
3001  
3002          elems.sort(function(a,b) {
3003                  return jQuery.data(a.elem, "closest") - jQuery.data(b.elem, "closest");
3004          });
3005         
3006          jQuery.each(elems, function(){
3007                  if ( this.fn.call(this.elem, event, this.fn.data) === false )
3008                          return (stop = false);
3009          });
3010  
3011          return stop;
3012  }
3013  
3014  function liveConvert(type, selector){
3015          return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "|")].join(".");
3016  }
3017  
3018  jQuery.extend({
3019          isReady: false,
3020          readyList: [],
3021          // Handle when the DOM is ready
3022          ready: function() {
3023                  // Make sure that the DOM is not already loaded
3024                  if ( !jQuery.isReady ) {
3025                          // Remember that the DOM is ready
3026                          jQuery.isReady = true;
3027  
3028                          // If there are functions bound, to execute
3029                          if ( jQuery.readyList ) {
3030                                  // Execute all of them
3031                                  jQuery.each( jQuery.readyList, function(){
3032                                          this.call( document, jQuery );
3033                                  });
3034  
3035                                  // Reset the list of functions
3036                                  jQuery.readyList = null;
3037                          }
3038  
3039                          // Trigger any bound ready events
3040                          jQuery(document).triggerHandler("ready");
3041                  }
3042          }
3043  });
3044  
3045  var readyBound = false;
3046  
3047  function bindReady(){
3048          if ( readyBound ) return;
3049          readyBound = true;
3050  
3051          // Mozilla, Opera and webkit nightlies currently support this event
3052          if ( document.addEventListener ) {
3053                  // Use the handy event callback
3054                  document.addEventListener( "DOMContentLoaded", function(){
3055                          document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
3056                          jQuery.ready();
3057                  }, false );
3058  
3059          // If IE event model is used
3060          } else if ( document.attachEvent ) {
3061                  // ensure firing before onload,
3062                  // maybe late but safe also for iframes
3063                  document.attachEvent("onreadystatechange", function(){
3064                          if ( document.readyState === "complete" ) {
3065                                  document.detachEvent( "onreadystatechange", arguments.callee );
3066                                  jQuery.ready();
3067                          }
3068                  });
3069  
3070                  // If IE and not an iframe
3071                  // continually check to see if the document is ready
3072                  if ( document.documentElement.doScroll && window == window.top ) (function(){
3073                          if ( jQuery.isReady ) return;
3074  
3075                          try {
3076                                  // If IE is used, use the trick by Diego Perini
3077                                  // http://javascript.nwbox.com/IEContentLoaded/
3078                                  document.documentElement.doScroll("left");
3079                          } catch( error ) {
3080                                  setTimeout( arguments.callee, 0 );
3081                                  return;
3082                          }
3083  
3084                          // and execute any waiting functions
3085                          jQuery.ready();
3086                  })();
3087          }
3088  
3089          // A fallback to window.onload, that will always work
3090          jQuery.event.add( window, "load", jQuery.ready );
3091  }
3092  
3093  jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
3094          "mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," +
3095          "change,select,submit,keydown,keypress,keyup,error").split(","), function(i, name){
3096  
3097          // Handle event binding
3098          jQuery.fn[name] = function(fn){
3099                  return fn ? this.bind(name, fn) : this.trigger(name);
3100          };
3101  });
3102  
3103  // Prevent memory leaks in IE
3104  // And prevent errors on refresh with events like mouseover in other browsers
3105  // Window isn't included so as not to unbind existing unload events
3106  jQuery( window ).bind( 'unload', function(){ 
3107          for ( var id in jQuery.cache )
3108                  // Skip the window
3109                  if ( id != 1 && jQuery.cache[ id ].handle )
3110                          jQuery.event.remove( jQuery.cache[ id ].handle.elem );
3111  }); 
3112  (function(){
3113  
3114          jQuery.support = {};
3115  
3116          var root = document.documentElement,
3117                  script = document.createElement("script"),
3118                  div = document.createElement("div"),
3119                  id = "script" + (new Date).getTime();
3120  
3121          div.style.display = "none";
3122          div.innerHTML = '   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';
3123  
3124          var all = div.getElementsByTagName("*"),
3125                  a = div.getElementsByTagName("a")[0];
3126  
3127          // Can't get basic test support
3128          if ( !all || !all.length || !a ) {
3129                  return;
3130          }
3131  
3132          jQuery.support = {
3133                  // IE strips leading whitespace when .innerHTML is used
3134                  leadingWhitespace: div.firstChild.nodeType == 3,
3135                 
3136                  // Make sure that tbody elements aren't automatically inserted
3137                  // IE will insert them into empty tables
3138                  tbody: !div.getElementsByTagName("tbody").length,
3139                 
3140                  // Make sure that you can get all elements in an <object> element
3141                  // IE 7 always returns no results
3142                  objectAll: !!div.getElementsByTagName("object")[0]
3143                          .getElementsByTagName("*").length,
3144                 
3145                  // Make sure that link elements get serialized correctly by innerHTML
3146                  // This requires a wrapper element in IE
3147                  htmlSerialize: !!div.getElementsByTagName("link").length,
3148                 
3149                  // Get the style information from getAttribute
3150                  // (IE uses .cssText insted)
3151                  style: /red/.test( a.getAttribute("style") ),
3152                 
3153                  // Make sure that URLs aren't manipulated
3154                  // (IE normalizes it by default)
3155                  hrefNormalized: a.getAttribute("href") === "/a",
3156                 
3157                  // Make sure that element opacity exists
3158                  // (IE uses filter instead)
3159                  opacity: a.style.opacity === "0.5",
3160                 
3161                  // Verify style float existence
3162                  // (IE uses styleFloat instead of cssFloat)
3163                  cssFloat: !!a.style.cssFloat,
3164  
3165                  // Will be defined later
3166                  scriptEval: false,
3167                  noCloneEvent: true,
3168                  boxModel: null
3169          };
3170         
3171          script.type = "text/javascript";
3172          try {
3173                  script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
3174          } catch(e){}
3175  
3176          root.insertBefore( script, root.firstChild );
3177         
3178          // Make sure that the execution of code works by injecting a script
3179          // tag with appendChild/createTextNode
3180          // (IE doesn't support this, fails, and uses .text instead)
3181          if ( window[ id ] ) {
3182                  jQuery.support.scriptEval = true;
3183                  delete window[ id ];
3184          }
3185  
3186          root.removeChild( script );
3187  
3188          if ( div.attachEvent && div.fireEvent ) {
3189                  div.attachEvent("onclick", function(){
3190                          // Cloning a node shouldn't copy over any
3191                          // bound event handlers (IE does this)
3192                          jQuery.support.noCloneEvent = false;
3193                          div.detachEvent("onclick", arguments.callee);
3194                  });
3195                  div.cloneNode(true).fireEvent("onclick");
3196          }
3197  
3198          // Figure out if the W3C box model works as expected
3199          // document.body must exist before we can do this
3200          jQuery(function(){
3201                  var div = document.createElement("div");
3202                  div.style.width = div.style.paddingLeft = "1px";
3203  
3204                  document.body.appendChild( div );
3205                  jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
3206                  document.body.removeChild( div ).style.display = 'none';
3207          });
3208  })();
3209  
3210  var styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat";
3211  
3212  jQuery.props = {
3213          "for": "htmlFor",
3214          "class": "className",
3215          "float": styleFloat,
3216          cssFloat: styleFloat,
3217          styleFloat: styleFloat,
3218          readonly: "readOnly",
3219          maxlength: "maxLength",
3220          cellspacing: "cellSpacing",
3221          rowspan: "rowSpan",
3222          tabindex: "tabIndex"
3223  };
3224  jQuery.fn.extend({
3225          // Keep a copy of the old load
3226          _load: jQuery.fn.load,
3227  
3228          load: function( url, params, callback ) {
3229                  if ( typeof url !== "string" )
3230                          return this._load( url );
3231  
3232                  var off = url.indexOf(" ");
3233                  if ( off >= 0 ) {
3234                          var selector = url.slice(off, url.length);
3235                          url = url.slice(0, off);
3236                  }
3237  
3238                  // Default to a GET request
3239                  var type = "GET";
3240  
3241                  // If the second parameter was provided
3242                  if ( params )
3243                          // If it's a function
3244                          if ( jQuery.isFunction( params ) ) {
3245                                  // We assume that it's the callback
3246                                  callback = params;
3247                                  params = null;
3248  
3249                          // Otherwise, build a param string
3250                          } else if( typeof params === "object" ) {
3251                                  params = jQuery.param( params );
3252                                  type = "POST";
3253                          }
3254  
3255                  var self = this;
3256  
3257                  // Request the remote document
3258                  jQuery.ajax({
3259                          url: url,
3260                          type: type,
3261                          dataType: "html",
3262                          data: params,
3263                          complete: function(res, status){
3264                                  // If successful, inject the HTML into all the matched elements
3265                                  if ( status == "success" || status == "notmodified" )
3266                                          // See if a selector was specified
3267                                          self.html( selector ?
3268                                                  // Create a dummy div to hold the results
3269                                                  jQuery("<div/>")
3270                                                          // inject the contents of the document in, removing the scripts
3271                                                          // to avoid any 'Permission Denied' errors in IE
3272                                                          .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
3273  
3274                                                          // Locate the specified elements
3275                                                          .find(selector) :
3276  
3277                                                  // If not, just inject the full result
3278                                                  res.responseText );
3279  
3280                                  if( callback )
3281                                          self.each( callback, [res.responseText, status, res] );
3282                          }
3283                  });
3284                  return this;
3285          },
3286  
3287          serialize: function() {
3288                  return jQuery.param(this.serializeArray());
3289          },
3290          serializeArray: function() {
3291                  return this.map(function(){
3292                          return this.elements ? jQuery.makeArray(this.elements) : this;
3293                  })
3294                  .filter(function(){
3295                          return this.name && !this.disabled &&
3296                                  (this.checked || /select|textarea/i.test(this.nodeName) ||
3297                                          /text|hidden|password|search/i.test(this.type));
3298                  })
3299                  .map(function(i, elem){
3300                          var val = jQuery(this).val();
3301                          return val == null ? null :
3302                                  jQuery.isArray(val) ?
3303                                          jQuery.map( val, function(val, i){
3304                                                  return {name: elem.name, value: val};
3305                                          }) :
3306                                          {name: elem.name, value: val};
3307                  }).get();
3308          }
3309  });
3310  
3311  // Attach a bunch of functions for handling common AJAX events
3312  jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
3313          jQuery.fn[o] = function(f){
3314                  return this.bind(o, f);
3315          };
3316  });
3317  
3318  var jsc = now();
3319  
3320  jQuery.extend({
3321   
3322          get: function( url, data, callback, type ) {
3323                  // shift arguments if data argument was ommited
3324                  if ( jQuery.isFunction( data ) ) {
3325                          callback = data;
3326                          data = null;
3327                  }
3328  
3329                  return jQuery.ajax({
3330                          type: "GET",
3331                          url: url,
3332                          data: data,
3333                          success: callback,
3334                          dataType: type
3335                  });
3336          },
3337  
3338          getScript: function( url, callback ) {
3339                  return jQuery.get(url, null, callback, "script");
3340          },
3341  
3342          getJSON: function( url, data, callback ) {
3343                  return jQuery.get(url, data, callback, "json");
3344          },
3345  
3346          post: function( url, data, callback, type ) {
3347                  if ( jQuery.isFunction( data ) ) {
3348                          callback = data;
3349                          data = {};
3350                  }
3351  
3352                  return jQuery.ajax({
3353                          type: "POST",
3354                          url: url,
3355                          data: data,
3356                          success: callback,
3357                          dataType: type
3358                  });
3359          },
3360  
3361          ajaxSetup: function( settings ) {
3362                  jQuery.extend( jQuery.ajaxSettings, settings );
3363          },
3364  
3365          ajaxSettings: {
3366                  url: location.href,
3367                  global: true,
3368                  type: "GET",
3369                  contentType: "application/x-www-form-urlencoded",
3370                  processData: true,
3371                  async: true,
3372                  /*
3373                  timeout: 0,
3374                  data: null,
3375                  username: null,
3376                  password: null,
3377                  */
3378                  // Create the request object; Microsoft failed to properly
3379                  // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
3380                  // This function can be overriden by calling jQuery.ajaxSetup
3381                  xhr:function(){
3382                          return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
3383                  },
3384                  accepts: {
3385                          xml: "application/xml, text/xml",
3386                          html: "text/html",
3387                          script: "text/javascript, application/javascript",
3388                          json: "application/json, text/javascript",
3389                          text: "text/plain",
3390                          _default: "*/*"
3391                  }
3392          },
3393  
3394          // Last-Modified header cache for next request
3395          lastModified: {},
3396  
3397          ajax: function( s ) {
3398                  // Extend the settings, but re-extend 's' so that it can be
3399                  // checked again later (in the test suite, specifically)
3400                  s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
3401  
3402                  var jsonp, jsre = /=\?(&|$)/g, status, data,
3403                          type = s.type.toUpperCase();
3404  
3405                  // convert data if not already a string
3406                  if ( s.data && s.processData && typeof s.data !== "string" )
3407                          s.data = jQuery.param(s.data);
3408  
3409                  // Handle JSONP Parameter Callbacks
3410                  if ( s.dataType == "jsonp" ) {
3411                          if ( type == "GET" ) {
3412                                  if ( !s.url.match(jsre) )
3413                                          s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
3414                          } else if ( !s.data || !s.data.match(jsre) )
3415                                  s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
3416                          s.dataType = "json";
3417                  }
3418  
3419                  // Build temporary JSONP function
3420                  if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
3421                          jsonp = "jsonp" + jsc++;
3422  
3423                          // Replace the =? sequence both in the query string and the data
3424                          if ( s.data )
3425                                  s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
3426                          s.url = s.url.replace(jsre, "=" + jsonp + "$1");
3427  
3428                          // We need to make sure
3429                          // that a JSONP style response is executed properly
3430                          s.dataType = "script";
3431  
3432                          // Handle JSONP-style loading
3433                          window[ jsonp ] = function(tmp){
3434                                  data = tmp;
3435                                  success();
3436                                  complete();
3437                                  // Garbage collect
3438                                  window[ jsonp ] = undefined;
3439                                  try{ delete window[ jsonp ]; } catch(e){}
3440                                  if ( head )
3441                                          head.removeChild( script );
3442                          };
3443                  }
3444  
3445                  if ( s.dataType == "script" && s.cache == null )
3446                          s.cache = false;
3447  
3448                  if ( s.cache === false && type == "GET" ) {
3449                          var ts = now();
3450                          // try replacing _= if it is there
3451                          var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
3452                          // if nothing was replaced, add timestamp to the end
3453                          s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
3454                  }
3455  
3456                  // If data is available, append data to url for get requests
3457                  if ( s.data && type == "GET" ) {
3458                          s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
3459  
3460                          // IE likes to send both get and post data, prevent this
3461                          s.data = null;
3462                  }
3463  
3464                  // Watch for a new set of requests
3465                  if ( s.global && ! jQuery.active++ )
3466                          jQuery.event.trigger( "ajaxStart" );
3467  
3468                  // Matches an absolute URL, and saves the domain
3469                  var parts = /^(\w+:)?\/\/([^\/?#]+)/.exec( s.url );
3470  
3471                  // If we're requesting a remote document
3472                  // and trying to load JSON or Script with a GET
3473                  if ( s.dataType == "script" && type == "GET" && parts
3474                          && ( parts[1] && parts[1] != location.protocol || parts[2] != location.host )){
3475  
3476                          var head = document.getElementsByTagName("head")[0];
3477                          var script = document.createElement("script");
3478                          script.src = s.url;
3479                          if (s.scriptCharset)
3480                                  script.charset = s.scriptCharset;
3481  
3482                          // Handle Script loading
3483                          if ( !jsonp ) {
3484                                  var done = false;
3485  
3486                                  // Attach handlers for all browsers
3487                                  script.onload = script.onreadystatechange = function(){
3488                                          if ( !done && (!this.readyState ||
3489                                                          this.readyState == "loaded" || this.readyState == "complete") ) {
3490                                                  done = true;
3491                                                  success();
3492                                                  complete();
3493  
3494                                                  // Handle memory leak in IE
3495                                                  script.onload = script.onreadystatechange = null;
3496                                                  head.removeChild( script );
3497                                          }
3498                                  };
3499                          }
3500  
3501                          head.appendChild(script);
3502  
3503                          // We handle everything using the script element injection
3504                          return undefined;
3505                  }
3506  
3507                  var requestDone = false;
3508  
3509                  // Create the request object
3510                  var xhr = s.xhr();
3511  
3512                  // Open the socket
3513                  // Passing null username, generates a login popup on Opera (#2865)
3514                  if( s.username )
3515                          xhr.open(type, s.url, s.async, s.username, s.password);
3516                  else
3517                          xhr.open(type, s.url, s.async);
3518  
3519                  // Need an extra try/catch for cross domain requests in Firefox 3
3520                  try {
3521                          // Set the correct header, if data is being sent
3522                          if ( s.data )
3523                                  xhr.setRequestHeader("Content-Type", s.contentType);
3524  
3525                          // Set the If-Modified-Since header, if ifModified mode.
3526                          if ( s.ifModified )
3527                                  xhr.setRequestHeader("If-Modified-Since",
3528                                          jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
3529  
3530                          // Set header so the called script knows that it's an XMLHttpRequest
3531                          xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
3532  
3533                          // Set the Accepts header for the server, depending on the dataType
3534                          xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
3535                                  s.accepts[ s.dataType ] + ", */*" :
3536                                  s.accepts._default );
3537                  } catch(e){}
3538  
3539                  // Allow custom headers/mimetypes and early abort
3540                  if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
3541                          // Handle the global AJAX counter
3542                          if ( s.global && ! --jQuery.active )
3543                                  jQuery.event.trigger( "ajaxStop" );
3544                          // close opended socket
3545                          xhr.abort();
3546                          return false;
3547                  }
3548  
3549                  if ( s.global )
3550                          jQuery.event.trigger("ajaxSend", [xhr, s]);
3551  
3552                  // Wait for a response to come back
3553                  var onreadystatechange = function(isTimeout){
3554                          // The request was aborted, clear the interval and decrement jQuery.active
3555                          if (xhr.readyState == 0) {
3556                                  if (ival) {
3557                                          // clear poll interval
3558                                          clearInterval(ival);
3559                                          ival = null;
3560                                          // Handle the global AJAX counter
3561                                          if ( s.global && ! --jQuery.active )
3562                                                  jQuery.event.trigger( "ajaxStop" );
3563                                  }
3564                          // The transfer is complete and the data is available, or the request timed out
3565                          } else if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
3566                                  requestDone = true;
3567  
3568                                  // clear poll interval
3569                                  if (ival) {
3570                                          clearInterval(ival);
3571                                          ival = null;
3572                                  }
3573  
3574                                  status = isTimeout == "timeout" ? "timeout" :
3575                                          !jQuery.httpSuccess( xhr ) ? "error" :
3576                                          s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? "notmodified" :
3577                                          "success";
3578  
3579                                  if ( status == "success" ) {
3580                                          // Watch for, and catch, XML document parse errors
3581                                          try {
3582                                                  // process the data (runs the xml through httpData regardless of callback)
3583                                                  data = jQuery.httpData( xhr, s.dataType, s );
3584                                          } catch(e) {
3585                                                  status = "parsererror";
3586                                          }
3587                                  }
3588  
3589                                  // Make sure that the request was successful or notmodified
3590                                  if ( status == "success" ) {
3591                                          // Cache Last-Modified header, if ifModified mode.
3592                                          var modRes;
3593                                          try {
3594                                                  modRes = xhr.getResponseHeader("Last-Modified");
3595                                          } catch(e) {} // swallow exception thrown by FF if header is not available
3596  
3597                                          if ( s.ifModified && modRes )
3598                                                  jQuery.lastModified[s.url] = modRes;
3599  
3600                                          // JSONP handles its own success callback
3601                                          if ( !jsonp )
3602                                                  success();
3603                                  } else
3604                                          jQuery.handleError(s, xhr, status);
3605  
3606                                  // Fire the complete handlers
3607                                  complete();
3608  
3609                                  if ( isTimeout )
3610                                          xhr.abort();
3611  
3612                                  // Stop memory leaks
3613                                  if ( s.async )
3614                                          xhr = null;
3615                          }
3616                  };
3617  
3618                  if ( s.async ) {
3619                          // don't attach the handler to the request, just poll it instead
3620                          var ival = setInterval(onreadystatechange, 13);
3621  
3622                          // Timeout checker
3623                          if ( s.timeout > 0 )
3624                                  setTimeout(function(){
3625                                          // Check to see if the request is still happening
3626                                          if ( xhr && !requestDone )
3627                                                  onreadystatechange( "timeout" );
3628                                  }, s.timeout);
3629                  }
3630  
3631                  // Send the data
3632                  try {
3633                          xhr.send(s.data);
3634                  } catch(e) {
3635                          jQuery.handleError(s, xhr, null, e);
3636                  }
3637  
3638                  // firefox 1.5 doesn't fire statechange for sync requests
3639                  if ( !s.async )
3640                          onreadystatechange();
3641  
3642                  function success(){
3643                          // If a local callback was specified, fire it and pass it the data
3644                          if ( s.success )
3645                                  s.success( data, status );
3646  
3647                          // Fire the global callback
3648                          if ( s.global )
3649                                  jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
3650                  }
3651  
3652                  function complete(){
3653                          // Process result
3654                          if ( s.complete )
3655                                  s.complete(xhr, status);
3656  
3657                          // The request was completed
3658                          if ( s.global )
3659                                  jQuery.event.trigger( "ajaxComplete", [xhr, s] );
3660  
3661                          // Handle the global AJAX counter
3662                          if ( s.global && ! --jQuery.active )
3663                                  jQuery.event.trigger( "ajaxStop" );
3664                  }
3665  
3666                  // return XMLHttpRequest to allow aborting the request etc.
3667                  return xhr;
3668          },
3669  
3670          handleError: function( s, xhr, status, e ) {
3671                  // If a local callback was specified, fire it
3672                  if ( s.error ) s.error( xhr, status, e );
3673  
3674                  // Fire the global callback
3675                  if ( s.global )
3676                          jQuery.event.trigger( "ajaxError", [xhr, s, e] );
3677          },
3678  
3679          // Counter for holding the number of active queries
3680          active: 0,
3681  
3682          // Determines if an XMLHttpRequest was successful or not
3683          httpSuccess: function( xhr ) {
3684                  try {
3685                          // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
3686                          return !xhr.status && location.protocol == "file:" ||
3687                                  ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223;
3688                  } catch(e){}
3689                  return false;
3690          },
3691  
3692          // Determines if an XMLHttpRequest returns NotModified
3693          httpNotModified: function( xhr, url ) {
3694                  try {
3695                          var xhrRes = xhr.getResponseHeader("Last-Modified");
3696  
3697                          // Firefox always returns 200. check Last-Modified date
3698                          return xhr.status == 304 || xhrRes == jQuery.lastModified[url];
3699                  } catch(e){}
3700                  return false;
3701          },
3702  
3703          httpData: function( xhr, type, s ) {
3704                  var ct = xhr.getResponseHeader("content-type"),
3705                          xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
3706                          data = xml ? xhr.responseXML : xhr.responseText;
3707  
3708                  if ( xml && data.documentElement.tagName == "parsererror" )
3709                          throw "parsererror";
3710                         
3711                  // Allow a pre-filtering function to sanitize the response
3712                  // s != null is checked to keep backwards compatibility
3713                  if( s && s.dataFilter )
3714                          data = s.dataFilter( data, type );
3715  
3716                  // The filter can actually parse the response
3717                  if( typeof data === "string" ){
3718  
3719                          // If the type is "script", eval it in global context
3720                          if ( type == "script" )
3721                                  jQuery.globalEval( data );
3722  
3723                          // Get the JavaScript object, if JSON is used.
3724                          if ( type == "json" )
3725                                  data = window["eval"]("(" + data + ")");
3726                  }
3727                 
3728                  return data;
3729          },
3730  
3731          // Serialize an array of form elements or a set of
3732          // key/values into a query string
3733          param: function( a ) {
3734                  var s = [ ];
3735  
3736                  function add( key, value ){
3737                          s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
3738                  };
3739  
3740                  // If an array was passed in, assume that it is an array
3741                  // of form elements
3742                  if ( jQuery.isArray(a) || a.jquery )
3743                          // Serialize the form elements
3744                          jQuery.each( a, function(){
3745                                  add( this.name, this.value );
3746                          });
3747  
3748                  // Otherwise, assume that it's an object of key/value pairs
3749                  else
3750                          // Serialize the key/values
3751                          for ( var j in a )
3752                                  // If the value is an array then the key names need to be repeated
3753                                  if ( jQuery.isArray(a[j]) )
3754                                          jQuery.each( a[j], function(){
3755                                                  add( j, this );
3756                                          });
3757                                  else
3758                                          add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] );
3759  
3760                  // Return the resulting serialization
3761                  return s.join("&").replace(/%20/g, "+");
3762          }
3763  
3764  });
3765  var elemdisplay = {},
3766          timerId,
3767          fxAttrs = [
3768                  // height animations
3769                  [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
3770                  // width animations
3771                  [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
3772                  // opacity animations
3773                  [ "opacity" ]
3774          ];
3775  
3776  function genFx( type, num ){
3777          var obj = {};
3778          jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function(){
3779                  obj[ this ] = type;
3780          });
3781          return obj;
3782  }
3783  
3784  jQuery.fn.extend({
3785          show: function(speed,callback){
3786                  if ( speed ) {
3787                          return this.animate( genFx("show", 3), speed, callback);
3788                  } else {
3789                          for ( var i = 0, l = this.length; i < l; i++ ){
3790                                  var old = jQuery.data(this[i], "olddisplay");
3791                                 
3792                                  this[i].style.display = old || "";
3793                                 
3794                                  if ( jQuery.css(this[i], "display") === "none" ) {
3795                                          var tagName = this[i].tagName, display;
3796                                         
3797                                          if ( elemdisplay[ tagName ] ) {
3798                                                  display = elemdisplay[ tagName ];
3799                                          } else {
3800                                                  var elem = jQuery("<" + tagName + " />").appendTo("body");
3801                                                 
3802                                                  display = elem.css("display");
3803                                                  if ( display === "none" )
3804                                                          display = "block";
3805                                                 
3806                                                  elem.remove();
3807                                                 
3808                                                  elemdisplay[ tagName ] = display;
3809                                          }
3810                                         
3811                                          jQuery.data(this[i], "olddisplay", display);
3812                                  }
3813                          }
3814  
3815                          // Set the display of the elements in a second loop
3816                          // to avoid the constant reflow
3817                          for ( var i = 0, l = this.length; i < l; i++ ){
3818                                  this[i].style.display = jQuery.data(this[i], "olddisplay") || "";
3819                          }
3820                         
3821                          return this;
3822                  }
3823          },
3824  
3825          hide: function(speed,callback){
3826                  if ( speed ) {
3827                          return this.animate( genFx("hide", 3), speed, callback);
3828                  } else {
3829                          for ( var i = 0, l = this.length; i < l; i++ ){
3830                                  var old = jQuery.data(this[i], "olddisplay");
3831                                  if ( !old && old !== "none" )
3832                                          jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
3833                          }
3834  
3835                          // Set the display of the elements in a second loop
3836                          // to avoid the constant reflow
3837                          for ( var i = 0, l = this.length; i < l; i++ ){
3838                                  this[i].style.display = "none";
3839                          }
3840  
3841                          return this;
3842                  }
3843          },
3844  
3845          // Save the old toggle function
3846          _toggle: jQuery.fn.toggle,
3847  
3848          toggle: function( fn, fn2 ){
3849                  var bool = typeof fn === "boolean";
3850  
3851                  return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
3852                          this._toggle.apply( this, arguments ) :
3853                          fn == null || bool ?
3854                                  this.each(function(){
3855                                          var state = bool ? fn : jQuery(this).is(":hidden");
3856                                          jQuery(this)[ state ? "show" : "hide" ]();
3857                                  }) :
3858                                  this.animate(genFx("toggle", 3), fn, fn2);
3859          },
3860  
3861          fadeTo: function(speed,to,callback){
3862                  return this.animate({opacity: to}, speed, callback);
3863          },
3864  
3865          animate: function( prop, speed, easing, callback ) {
3866                  var optall = jQuery.speed(speed, easing, callback);
3867  
3868                  return this[ optall.queue === false ? "each" : "queue" ](function(){
3869                 
3870                          var opt = jQuery.extend({}, optall), p,
3871                                  hidden = this.nodeType == 1 && jQuery(this).is(":hidden"),
3872                                  self = this;
3873         
3874                          for ( p in prop ) {
3875                                  if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
3876                                          return opt.complete.call(this);
3877  
3878                                  if ( ( p == "height" || p == "width" ) && this.style ) {
3879                                          // Store display property
3880                                          opt.display = jQuery.css(this, "display");
3881  
3882                                          // Make sure that nothing sneaks out
3883                                          opt.overflow = this.style.overflow;
3884                                  }
3885                          }
3886  
3887                          if ( opt.overflow != null )
3888                                  this.style.overflow = "hidden";
3889  
3890                          opt.curAnim = jQuery.extend({}, prop);
3891  
3892                          jQuery.each( prop, function(name, val){
3893                                  var e = new jQuery.fx( self, opt, name );
3894  
3895                                  if ( /toggle|show|hide/.test(val) )
3896                                          e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
3897                                  else {
3898                                          var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
3899                                                  start = e.cur(true) || 0;
3900  
3901                                          if ( parts ) {
3902                                                  var end = parseFloat(parts[2]),
3903                                                          unit = parts[3] || "px";
3904  
3905                                                  // We need to compute starting value
3906                                                  if ( unit != "px" ) {
3907                                                          self.style[ name ] = (end || 1) + unit;
3908                                                          start = ((end || 1) / e.cur(true)) * start;
3909                                                          self.style[ name ] = start + unit;
3910                                                  }
3911  
3912                                                  // If a +=/-= token was provided, we're doing a relative animation
3913                                                  if ( parts[1] )
3914                                                          end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
3915  
3916                                                  e.custom( start, end, unit );
3917                                          } else
3918                                                  e.custom( start, val, "" );
3919                                  }
3920                          });
3921  
3922                          // For JS strict compliance
3923                          return true;
3924                  });
3925          },
3926  
3927          stop: function(clearQueue, gotoEnd){
3928                  var timers = jQuery.timers;
3929  
3930                  if (clearQueue)
3931                          this.queue([]);
3932  
3933                  this.each(function(){
3934                          // go in reverse order so anything added to the queue during the loop is ignored
3935                          for ( var i = timers.length - 1; i >= 0; i-- )
3936                                  if ( timers[i].elem == this ) {
3937                                          if (gotoEnd)
3938                                                  // force the next step to be the last
3939                                                  timers[i](true);
3940                                          timers.splice(i, 1);
3941                                  }
3942                  });
3943  
3944                  // start the next in the queue if the last step wasn't forced
3945                  if (!gotoEnd)
3946                          this.dequeue();
3947  
3948                  return this;
3949          }
3950  
3951  });
3952  
3953  // Generate shortcuts for custom animations
3954  jQuery.each({
3955          slideDown: genFx("show", 1),
3956          slideUp: genFx("hide", 1),
3957          slideToggle: genFx("toggle", 1),
3958          fadeIn: { opacity: "show" },
3959          fadeOut: { opacity: "hide" }
3960  }, function( name, props ){
3961          jQuery.fn[ name ] = function( speed, callback ){
3962                  return this.animate( props, speed, callback );
3963          };
3964  });
3965  
3966  jQuery.extend({
3967  
3968          speed: function(speed, easing, fn) {
3969                  var opt = typeof speed === "object" ? speed : {
3970                          complete: fn || !fn && easing ||
3971                                  jQuery.isFunction( speed ) && speed,
3972                          duration: speed,
3973                          easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
3974                  };
3975  
3976                  opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
3977                          jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
3978  
3979                  // Queueing
3980                  opt.old = opt.complete;
3981                  opt.complete = function(){
3982                          if ( opt.queue !== false )
3983                                  jQuery(this).dequeue();
3984                          if ( jQuery.isFunction( opt.old ) )
3985                                  opt.old.call( this );
3986                  };
3987  
3988                  return opt;
3989          },
3990  
3991          easing: {
3992                  linear: function( p, n, firstNum, diff ) {
3993                          return firstNum + diff * p;
3994                  },
3995                  swing: function( p, n, firstNum, diff ) {
3996                          return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
3997                  }
3998          },
3999  
4000          timers: [],
4001  
4002          fx: function( elem, options, prop ){
4003                  this.options = options;
4004                  this.elem = elem;
4005                  this.prop = prop;
4006  
4007                  if ( !options.orig )
4008                          options.orig = {};
4009          }
4010  
4011  });
4012  
4013  jQuery.fx.prototype = {
4014  
4015          // Simple function for setting a style value
4016          update: function(){
4017                  if ( this.options.step )
4018                          this.options.step.call( this.elem, this.now, this );
4019  
4020                  (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
4021  
4022                  // Set display property to block for height/width animations
4023                  if ( ( this.prop == "height" || this.prop == "width" ) && this.elem.style )
4024                          this.elem.style.display = "block";
4025          },
4026  
4027          // Get the current size
4028          cur: function(force){
4029                  if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) )
4030                          return this.elem[ this.prop ];
4031  
4032                  var r = parseFloat(jQuery.css(this.elem, this.prop, force));
4033                  return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
4034          },
4035  
4036          // Start an animation from one number to another
4037          custom: function(from, to, unit){
4038                  this.startTime = now();
4039                  this.start = from;
4040                  this.end = to;
4041                  this.unit = unit || this.unit || "px";
4042                  this.now = this.start;
4043                  this.pos = this.state = 0;
4044  
4045                  var self = this;
4046                  function t(gotoEnd){
4047                          return self.step(gotoEnd);
4048                  }
4049  
4050                  t.elem = this.elem;
4051  
4052                  if ( t() && jQuery.timers.push(t) && !timerId ) {
4053                          timerId = setInterval(function(){
4054                                  var timers = jQuery.timers;
4055  
4056                                  for ( var i = 0; i < timers.length; i++ )
4057                                          if ( !timers[i]() )
4058                                                  timers.splice(i--, 1);
4059  
4060                                  if ( !timers.length ) {
4061                                          clearInterval( timerId );
4062                                          timerId = undefined;
4063                                  }
4064                          }, 13);
4065                  }
4066          },
4067  
4068          // Simple 'show' function
4069          show: function(){
4070                  // Remember where we started, so that we can go back to it later
4071                  this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
4072                  this.options.show = true;
4073  
4074                  // Begin the animation
4075                  // Make sure that we start at a small width/height to avoid any
4076                  // flash of content
4077                  this.custom(this.prop == "width" || this.prop == "height" ? 1 : 0, this.cur());
4078  
4079                  // Start by showing the element
4080                  jQuery(this.elem).show();
4081          },
4082  
4083          // Simple 'hide' function
4084          hide: function(){
4085                  // Remember where we started, so that we can go back to it later
4086                  this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
4087                  this.options.hide = true;
4088  
4089                  // Begin the animation
4090                  this.custom(this.cur(), 0);
4091          },
4092  
4093          // Each step of an animation
4094          step: function(gotoEnd){
4095                  var t = now();
4096  
4097                  if ( gotoEnd || t >= this.options.duration + this.startTime ) {
4098                          this.now = this.end;
4099                          this.pos = this.state = 1;
4100                          this.update();
4101  
4102                          this.options.curAnim[ this.prop ] = true;
4103  
4104                          var done = true;
4105                          for ( var i in this.options.curAnim )
4106                                  if ( this.options.curAnim[i] !== true )
4107                                          done = false;
4108  
4109                          if ( done ) {
4110                                  if ( this.options.display != null ) {
4111                                          // Reset the overflow
4112                                          this.elem.style.overflow = this.options.overflow;
4113  
4114                                          // Reset the display
4115                                          this.elem.style.display = this.options.display;
4116                                          if ( jQuery.css(this.elem, "display") == "none" )
4117                                                  this.elem.style.display = "block";
4118                                  }
4119  
4120                                  // Hide the element if the "hide" operation was done
4121                                  if ( this.options.hide )
4122                                          jQuery(this.elem).hide();
4123  
4124                                  // Reset the properties, if the item has been hidden or shown
4125                                  if ( this.options.hide || this.options.show )
4126                                          for ( var p in this.options.curAnim )
4127                                                  jQuery.attr(this.elem.style, p, this.options.orig[p]);
4128                                         
4129                                  // Execute the complete function
4130                                  this.options.complete.call( this.elem );
4131                          }
4132  
4133                          return false;
4134                  } else {
4135                          var n = t - this.startTime;
4136                          this.state = n / this.options.duration;
4137  
4138                          // Perform the easing function, defaults to swing
4139                          this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
4140                          this.now = this.start + ((this.end - this.start) * this.pos);
4141  
4142                          // Perform the next step of the animation
4143                          this.update();
4144                  }
4145  
4146                  return true;
4147          }
4148  
4149  };
4150  
4151  jQuery.extend( jQuery.fx, {
4152          speeds:{
4153                  slow: 600,
4154                  fast: 200,
4155                  // Default speed
4156                  _default: 400
4157          },
4158          step: {
4159  
4160                  opacity: function(fx){
4161                          jQuery.attr(fx.elem.style, "opacity", fx.now);
4162                  },
4163  
4164                  _default: function(fx){
4165                          if ( fx.elem.style && fx.elem.style[ fx.prop ] != null )
4166                                  fx.elem.style[ fx.prop ] = fx.now + fx.unit;
4167                          else
4168                                  fx.elem[ fx.prop ] = fx.now;
4169                  }
4170          }
4171  });
4172  if ( document.documentElement["getBoundingClientRect"] )
4173          jQuery.fn.offset = function() {
4174                  if ( !this[0] ) return { top: 0, left: 0 };
4175                  if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
4176                  var box  = this[0].getBoundingClientRect(), doc = this[0].ownerDocument, body = doc.body, docElem = doc.documentElement,
4177                          clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
4178                          top  = box.top  + (self.pageYOffset || jQuery.boxModel && docElem.scrollTop  || body.scrollTop ) - clientTop,
4179                          left = box.left + (self.pageXOffset || jQuery.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
4180                  return { top: top, left: left };
4181          };
4182  else 
4183          jQuery.fn.offset = function() {
4184                  if ( !this[0] ) return { top: 0, left: 0 };
4185                  if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
4186                  jQuery.offset.initialized || jQuery.offset.initialize();
4187  
4188                  var elem = this[0], offsetParent = elem.offsetParent, prevOffsetParent = elem,
4189                          doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
4190                          body = doc.body, defaultView = doc.defaultView,
4191                          prevComputedStyle = defaultView.getComputedStyle(elem, null),
4192                          top = elem.offsetTop, left = elem.offsetLeft;
4193  
4194                  while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
4195                          computedStyle = defaultView.getComputedStyle(elem, null);
4196                          top -= elem.scrollTop, left -= elem.scrollLeft;
4197                          if ( elem === offsetParent ) {
4198                                  top += elem.offsetTop, left += elem.offsetLeft;
4199                                  if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.tagName)) )
4200                                          top  += parseInt( computedStyle.borderTopWidth,  10) || 0,
4201                                          left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
4202                                  prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
4203                          }
4204                          if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" )
4205                                  top  += parseInt( computedStyle.borderTopWidth,  10) || 0,
4206                                  left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
4207                          prevComputedStyle = computedStyle;
4208                  }
4209  
4210                  if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" )
4211                          top  += body.offsetTop,
4212                          left += body.offsetLeft;
4213  
4214                  if ( prevComputedStyle.position === "fixed" )
4215                          top  += Math.max(docElem.scrollTop, body.scrollTop),
4216                          left += Math.max(docElem.scrollLeft, body.scrollLeft);
4217  
4218                  return { top: top, left: left };
4219          };
4220  
4221  jQuery.offset = {
4222          initialize: function() {
4223                  if ( this.initialized ) return;
4224                  var body = document.body, container = document.createElement('div'), innerDiv, checkDiv, table, td, rules, prop, bodyMarginTop = body.style.marginTop,
4225                          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>';
4226  
4227                  rules = { position: 'absolute', top: 0, left: 0, margin: 0, border: 0, width: '1px', height: '1px', visibility: 'hidden' };
4228                  for ( prop in rules ) container.style[prop] = rules[prop];
4229  
4230                  container.innerHTML = html;
4231                  body.insertBefore(container, body.firstChild);
4232                  innerDiv = container.firstChild, checkDiv = innerDiv.firstChild, td = innerDiv.nextSibling.firstChild.firstChild;
4233  
4234                  this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
4235                  this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
4236  
4237                  innerDiv.style.overflow = 'hidden', innerDiv.style.position = 'relative';
4238                  this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
4239  
4240                  body.style.marginTop = '1px';
4241                  this.doesNotIncludeMarginInBodyOffset = (body.offsetTop === 0);
4242                  body.style.marginTop = bodyMarginTop;
4243  
4244                  body.removeChild(container);
4245                  this.initialized = true;
4246          },
4247  
4248          bodyOffset: function(body) {
4249                  jQuery.offset.initialized || jQuery.offset.initialize();
4250                  var top = body.offsetTop, left = body.offsetLeft;
4251                  if ( jQuery.offset.doesNotIncludeMarginInBodyOffset )
4252                          top  += parseInt( jQuery.curCSS(body, 'marginTop',  true), 10 ) || 0,
4253                          left += parseInt( jQuery.curCSS(body, 'marginLeft', true), 10 ) || 0;
4254                  return { top: top, left: left };
4255          }
4256  };
4257  
4258  
4259  jQuery.fn.extend({
4260          position: function() {
4261                  var left = 0, top = 0, results;
4262  
4263                  if ( this[0] ) {
4264                          // Get *real* offsetParent
4265                          var offsetParent = this.offsetParent(),
4266  
4267                          // Get correct offsets
4268                          offset       = this.offset(),
4269                          parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
4270  
4271                          // Subtract element margins
4272                          // note: when an element has margin: auto the offsetLeft and marginLeft
4273                          // are the same in Safari causing offset.left to incorrectly be 0
4274                          offset.top  -= num( this, 'marginTop'  );
4275                          offset.left -= num( this, 'marginLeft' );
4276  
4277                          // Add offsetParent borders
4278                          parentOffset.top  += num( offsetParent, 'borderTopWidth'  );
4279                          parentOffset.left += num( offsetParent, 'borderLeftWidth' );
4280  
4281                          // Subtract the two offsets
4282                          results = {
4283                                  top:  offset.top  - parentOffset.top,
4284                                  left: offset.left - parentOffset.left
4285                          };
4286                  }
4287  
4288                  return results;
4289          },
4290  
4291          offsetParent: function() {
4292                  var offsetParent = this[0].offsetParent || document.body;
4293                  while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
4294                          offsetParent = offsetParent.offsetParent;
4295                  return jQuery(offsetParent);
4296          }
4297  });
4298  
4299  
4300  // Create scrollLeft and scrollTop methods
4301  jQuery.each( ['Left', 'Top'], function(i, name) {
4302          var method = 'scroll' + name;
4303         
4304          jQuery.fn[ method ] = function(val) {
4305                  if (!this[0]) return null;
4306  
4307                  return val !== undefined ?
4308  
4309                          // Set the scroll offset
4310                          this.each(function() {
4311                                  this == window || this == document ?
4312                                          window.scrollTo(
4313                                                  !i ? val : jQuery(window).scrollLeft(),
4314                                                   i ? val : jQuery(window).scrollTop()
4315                                          ) :
4316                                          this[ method ] = val;
4317                          }) :
4318  
4319                          // Return the scroll offset
4320                          this[0] == window || this[0] == document ?
4321                                  self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
4322                                          jQuery.boxModel && document.documentElement[ method ] ||
4323                                          document.body[ method ] :
4324                                  this[0][ method ];
4325          };
4326  });
4327  // Create innerHeight, innerWidth, outerHeight and outerWidth methods
4328  jQuery.each([ "Height", "Width" ], function(i, name){
4329  
4330          var tl = i ? "Left"  : "Top",  // top or left
4331                  br = i ? "Right" : "Bottom", // bottom or right
4332                  lower = name.toLowerCase();
4333  
4334          // innerHeight and innerWidth
4335          jQuery.fn["inner" + name] = function(){
4336                  return this[0] ?
4337                          jQuery.css( this[0], lower, false, "padding" ) :
4338                          null;
4339          };
4340  
4341          // outerHeight and outerWidth
4342          jQuery.fn["outer" + name] = function(margin) {
4343                  return this[0] ?
4344                          jQuery.css( this[0], lower, false, margin ? "margin" : "border" ) :
4345                          null;
4346          };
4347         
4348          var type = name.toLowerCase();
4349  
4350          jQuery.fn[ type ] = function( size ) {
4351                  // Get window width or height
4352                  return this[0] == window ?
4353                          // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
4354                          document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] ||
4355                          document.body[ "client" + name ] :
4356  
4357                          // Get document width or height
4358                          this[0] == document ?
4359                                  // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
4360                                  Math.max(
4361                                          document.documentElement["client" + name],
4362                                          document.body["scroll" + name], document.documentElement["scroll" + name],
4363                                          document.body["offset" + name], document.documentElement["offset" + name]
4364                                  ) :
4365  
4366                                  // Get or set width or height on the element
4367                                  size === undefined ?
4368                                          // Get width or height on the element
4369                                          (this.length ? jQuery.css( this[0], type ) : null) :
4370  
4371                                          // Set the width or height on the element (default to pixels if value is unitless)
4372                                          this.css( type, typeof size === "string" ? size : size + "px" );
4373          };
4374  
4375  });
4376  })();
1 /*! 2 * jQuery JavaScript Library v1.3.2 3 * http://jquery.com/ 4 * 5 * Copyright (c) 2009 John Resig 6 * Dual licensed under the MIT and GPL licenses. 7 * http://docs.jquery.com/License 8 * 9 * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) 10 * Revision: 6246 11 */ 12 (function(){ 13 14 var 15 // Will speed up references to window, and allows munging its name. 16 window = this, 17 // Will speed up references to undefined, and allows munging its name. 18 undefined, 19 // Map over jQuery in case of overwrite 20 _jQuery = window.jQuery, 21 // Map over the $ in case of overwrite 22 _$ = window.$, 23 24 jQuery = window.jQuery = window.$ = function( selector, context ) { 25 // The jQuery object is actually just the init constructor 'enhanced' 26 return new jQuery.fn.init( selector, context ); 27 }, 28 29 // A simple way to check for HTML strings or ID strings 30 // (both of which we optimize for) 31 quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/, 32 // Is it a simple selector 33 isSimple = /^.[^:#\[\.,]*$/; 34 35 jQuery.fn = jQuery.prototype = { 36 init: function( selector, context ) { 37 // Make sure that a selection was provided 38 selector = selector || document; 39 40 // Handle $(DOMElement) 41 if ( selector.nodeType ) { 42 this[0] = selector; 43 this.length = 1; 44 this.context = selector; 45 return this; 46 } 47 // Handle HTML strings 48 if ( typeof selector === "string" ) { 49 // Are we dealing with HTML string or an ID? 50 var match = quickExpr.exec( selector ); 51 52 // Verify a match, and that no context was specified for #id 53 if ( match && (match[1] || !context) ) { 54 55 // HANDLE: $(html) -> $(array) 56 if ( match[1] ) 57 selector = jQuery.clean( [ match[1] ], context ); 58 59 // HANDLE: $("#id") 60 else { 61 var elem = document.getElementById( match[3] ); 62 63 // Handle the case where IE and Opera return items 64 // by name instead of ID 65 if ( elem && elem.id != match[3] ) 66 return jQuery().find( selector ); 67 68 // Otherwise, we inject the element directly into the jQuery object 69 var ret = jQuery( elem || [] ); 70 ret.context = document; 71 ret.selector = selector; 72 return ret; 73 } 74 75 // HANDLE: $(expr, [context]) 76 // (which is just equivalent to: $(content).find(expr) 77 } else 78 return jQuery( context ).find( selector ); 79 80 // HANDLE: $(function) 81 // Shortcut for document ready 82 } else if ( jQuery.isFunction( selector ) ) 83 return jQuery( document ).ready( selector ); 84 85 // Make sure that old selector state is passed along 86 if ( selector.selector && selector.context ) { 87 this.selector = selector.selector; 88 this.context = selector.context; 89 } 90 91 return this.setArray(jQuery.isArray( selector ) ? 92 selector : 93 jQuery.makeArray(selector)); 94 }, 95 96 // Start with an empty selector 97 selector: "", 98 99 // The current version of jQuery being used 100 jquery: "1.3.2", 101 102 // The number of elements contained in the matched element set 103 size: function() { 104 return this.length; 105 }, 106 107 // Get the Nth element in the matched element set OR 108 // Get the whole matched element set as a clean array 109 get: function( num ) { 110 return num === undefined ? 111 112 // Return a 'clean' array 113 Array.prototype.slice.call( this ) : 114 115 // Return just the object 116 this[ num ]; 117 }, 118 119 // Take an array of elements and push it onto the stack 120 // (returning the new matched element set) 121 pushStack: function( elems, name, selector ) { 122 // Build a new jQuery matched element set 123 var ret = jQuery( elems ); 124 125 // Add the old object onto the stack (as a reference) 126 ret.prevObject = this; 127 128 ret.context = this.context; 129 130 if ( name === "find" ) 131 ret.selector = this.selector + (this.selector ? " " : "") + selector; 132 else if ( name ) 133 ret.selector = this.selector + "." + name + "(" + selector + ")"; 134 135 // Return the newly-formed element set 136 return ret; 137 }, 138 139 // Force the current matched set of elements to become 140 // the specified array of elements (destroying the stack in the process) 141 // You should use pushStack() in order to do this, but maintain the stack 142 setArray: function( elems ) { 143 // Resetting the length to 0, then using the native Array push 144 // is a super-fast way to populate an object with array-like properties 145 this.length = 0; 146 Array.prototype.push.apply( this, elems ); 147 148 return this; 149 }, 150 151 // Execute a callback for every element in the matched set. 152 // (You can seed the arguments with an array of args, but this is 153 // only used internally.) 154 each: function( callback, args ) { 155 return jQuery.each( this, callback, args ); 156 }, 157 158 // Determine the position of an element within 159 // the matched set of elements 160 index: function( elem ) { 161 // Locate the position of the desired element 162 return jQuery.inArray( 163 // If it receives a jQuery object, the first element is used 164 elem && elem.jquery ? elem[0] : elem 165 , this ); 166 }, 167 168 attr: function( name, value, type ) { 169 var options = name; 170 171 // Look for the case where we're accessing a style value 172 if ( typeof name === "string" ) 173 if ( value === undefined ) 174 return this[0] && jQuery[ type || "attr" ]( this[0], name ); 175 176 else { 177 options = {}; 178 options[ name ] = value; 179 } 180 181 // Check to see if we're setting style values 182 return this.each(function(i){ 183 // Set all the styles 184 for ( name in options ) 185 jQuery.attr( 186 type ? 187 this.style : 188 this, 189 name, jQuery.prop( this, options[ name ], type, i, name ) 190 ); 191 }); 192 }, 193 194 css: function( key, value ) { 195 // ignore negative width and height values 196 if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 ) 197 value = undefined; 198 return this.attr( key, value, "curCSS" ); 199 }, 200 201 text: function( text ) { 202 if ( typeof text !== "object" && text != null ) 203 return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); 204 205 var ret = ""; 206 207 jQuery.each( text || this, function(){ 208 jQuery.each( this.childNodes, function(){ 209 if ( this.nodeType != 8 ) 210 ret += this.nodeType != 1 ? 211 this.nodeValue : 212 jQuery.fn.text( [ this ] ); 213 }); 214 }); 215 216 return ret; 217 }, 218 219 wrapAll: function( html ) { 220 if ( this[0] ) { 221 // The elements to wrap the target around 222 var wrap = jQuery( html, this[0].ownerDocument ).clone(); 223 224 if ( this[0].parentNode ) 225 wrap.insertBefore( this[0] ); 226 227 wrap.map(function(){ 228 var elem = this; 229 230 while ( elem.firstChild ) 231 elem = elem.firstChild; 232 233 return elem; 234 }).append(this); 235 } 236 237 return this; 238 }, 239 240 wrapInner: function( html ) { 241 return this.each(function(){ 242 jQuery( this ).contents().wrapAll( html ); 243 }); 244 }, 245 246 wrap: function( html ) { 247 return this.each(function(){ 248 jQuery( this ).wrapAll( html ); 249 }); 250 }, 251 252 append: function() { 253 return this.domManip(arguments, true, function(elem){ 254 if (this.nodeType == 1) 255 this.appendChild( elem ); 256 }); 257 }, 258 259 prepend: function() { 260 return this.domManip(arguments, true, function(elem){ 261 if (this.nodeType == 1) 262 this.insertBefore( elem, this.firstChild ); 263 }); 264 }, 265 266 before: function() { 267 return this.domManip(arguments, false, function(elem){ 268 this.parentNode.insertBefore( elem, this ); 269 }); 270 }, 271 272 after: function() { 273 return this.domManip(arguments, false, function(elem){ 274 this.parentNode.insertBefore( elem, this.nextSibling ); 275 }); 276 }, 277 278 end: function() { 279 return this.prevObject || jQuery( [] ); 280 }, 281 282 // For internal use only. 283 // Behaves like an Array's method, not like a jQuery method. 284 push: [].push, 285 sort: [].sort, 286 splice: [].splice, 287 288 find: function( selector ) { 289 if ( this.length === 1 ) { 290 var ret = this.pushStack( [], "find", selector ); 291 ret.length = 0; 292 jQuery.find( selector, this[0], ret ); 293 return ret; 294 } else { 295 return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){ 296 return jQuery.find( selector, elem ); 297 })), "find", selector ); 298 } 299 }, 300 301 clone: function( events ) { 302 // Do the clone 303 var ret = this.map(function(){ 304 if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) { 305 // IE copies events bound via attachEvent when 306 // using cloneNode. Calling detachEvent on the 307 // clone will also remove the events from the orignal 308 // In order to get around this, we use innerHTML. 309 // Unfortunately, this means some modifications to 310 // attributes in IE that are actually only stored 311 // as properties will not be copied (such as the 312 // the name attribute on an input). 313 var html = this.outerHTML; 314 if ( !html ) { 315 var div = this.ownerDocument.createElement("div"); 316 div.appendChild( this.cloneNode(true) ); 317 html = div.innerHTML; 318 } 319 320 return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0]; 321 } else 322 return this.cloneNode(true); 323 }); 324 325 // Copy the events from the original to the clone 326 if ( events === true ) { 327 var orig = this.find("*").andSelf(), i = 0; 328 329 ret.find("*").andSelf().each(function(){ 330 if ( this.nodeName !== orig[i].nodeName ) 331 return; 332 333 var events = jQuery.data( orig[i], "events" ); 334 335 for ( var type in events ) { 336 for ( var handler in events[ type ] ) { 337 jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data ); 338 } 339 } 340 341 i++; 342 }); 343 } 344 345 // Return the cloned set 346 return ret; 347 }, 348 349 filter: function( selector ) { 350 return this.pushStack( 351 jQuery.isFunction( selector ) && 352 jQuery.grep(this, function(elem, i){ 353 return selector.call( elem, i ); 354 }) || 355 356 jQuery.multiFilter( selector, jQuery.grep(this, function(elem){ 357 return elem.nodeType === 1; 358 }) ), "filter", selector ); 359 }, 360 361 closest: function( selector ) { 362 var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null, 363 closer = 0; 364 365 return this.map(function(){ 366 var cur = this; 367 while ( cur && cur.ownerDocument ) { 368 if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) { 369 jQuery.data(cur, "closest", closer); 370 return cur; 371 } 372 cur = cur.parentNode; 373 closer++; 374 } 375 }); 376 }, 377 378 not: function( selector ) { 379 if ( typeof selector === "string" ) 380 // test special case where just one selector is passed in 381 if ( isSimple.test( selector ) ) 382 return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector ); 383 else 384 selector = jQuery.multiFilter( selector, this ); 385 386 var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType; 387 return this.filter(function() { 388 return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector; 389 }); 390 }, 391 392 add: function( selector ) { 393 return this.pushStack( jQuery.unique( jQuery.merge( 394 this.get(), 395 typeof selector === "string" ? 396 jQuery( selector ) : 397 jQuery.makeArray( selector ) 398 ))); 399 }, 400 401 is: function( selector ) { 402 return !!selector && jQuery.multiFilter( selector, this ).length > 0; 403 }, 404 405 hasClass: function( selector ) { 406 return !!selector && this.is( "." + selector ); 407 }, 408 409 val: function( value ) { 410 if ( value === undefined ) { 411 var elem = this[0]; 412 413 if ( elem ) { 414 if( jQuery.nodeName( elem, 'option' ) ) 415 return (elem.attributes.value || {}).specified ? elem.value : elem.text; 416 417 // We need to handle select boxes special 418 if ( jQuery.nodeName( elem, "select" ) ) { 419 var index = elem.selectedIndex, 420 values = [], 421 options = elem.options, 422 one = elem.type == "select-one"; 423 424 // Nothing was selected 425 if ( index < 0 ) 426 return null; 427 428 // Loop through all the selected options 429 for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { 430 var option = options[ i ]; 431 432 if ( option.selected ) { 433 // Get the specifc value for the option 434 value = jQuery(option).val(); 435 436 // We don't need an array for one selects 437 if ( one ) 438 return value; 439 440 // Multi-Selects return an array 441 values.push( value ); 442 } 443 } 444 445 return values; 446 } 447 448 // Everything else, we just grab the value 449 return (elem.value || "").replace(/\r/g, ""); 450 451 } 452 453 return undefined; 454 } 455 456 if ( typeof value === "number" ) 457 value += ''; 458 459 return this.each(function(){ 460 if ( this.nodeType != 1 ) 461 return; 462 463 if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) ) 464 this.checked = (jQuery.inArray(this.value, value) >= 0 || 465 jQuery.inArray(this.name, value) >= 0); 466 467 else if ( jQuery.nodeName( this, "select" ) ) { 468 var values = jQuery.makeArray(value); 469 470 jQuery( "option", this ).each(function(){ 471 this.selected = (jQuery.inArray( this.value, values ) >= 0 || 472 jQuery.inArray( this.text, values ) >= 0); 473 }); 474 475 if ( !values.length ) 476 this.selectedIndex = -1; 477 478 } else 479 this.value = value; 480 }); 481 }, 482 483 html: function( value ) { 484 return value === undefined ? 485 (this[0] ? 486 this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") : 487 null) : 488 this.empty().append( value ); 489 }, 490 491 replaceWith: function( value ) { 492 return this.after( value ).remove(); 493 }, 494 495 eq: function( i ) { 496 return this.slice( i, +i + 1 ); 497 }, 498 499 slice: function() { 500 return this.pushStack( Array.prototype.slice.apply( this, arguments ), 501 "slice", Array.prototype.slice.call(arguments).join(",") ); 502 }, 503 504 map: function( callback ) { 505 return this.pushStack( jQuery.map(this, function(elem, i){ 506 return callback.call( elem, i, elem ); 507 })); 508 }, 509 510 andSelf: function() { 511 return this.add( this.prevObject ); 512 }, 513 514 domManip: function( args, table, callback ) { 515 if ( this[0] ) { 516 var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(), 517 scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ), 518 first = fragment.firstChild; 519 520 if ( first ) 521 for ( var i = 0, l = this.length; i < l; i++ ) 522 callback.call( root(this[i], first), this.length > 1 || i > 0 ? 523 fragment.cloneNode(true) : fragment ); 524 525 if ( scripts ) 526 jQuery.each( scripts, evalScript ); 527 } 528 529 return this; 530 531 function root( elem, cur ) { 532 return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ? 533 (elem.getElementsByTagName("tbody")[0] || 534 elem.appendChild(elem.ownerDocument.createElement("tbody"))) : 535 elem; 536 } 537 } 538 }; 539 540 // Give the init function the jQuery prototype for later instantiation 541 jQuery.fn.init.prototype = jQuery.fn; 542 543 function evalScript( i, elem ) { 544 if ( elem.src ) 545 jQuery.ajax({ 546 url: elem.src, 547 async: false, 548 dataType: "script" 549 }); 550 551 else 552 jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); 553 554 if ( elem.parentNode ) 555 elem.parentNode.removeChild( elem ); 556 } 557 558 function now(){ 559 return +new Date; 560 } 561 562 jQuery.extend = jQuery.fn.extend = function() { 563 // copy reference to target object 564 var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options; 565 566 // Handle a deep copy situation 567 if ( typeof target === "boolean" ) { 568 deep = target; 569 target = arguments[1] || {}; 570 // skip the boolean and the target 571 i = 2; 572 } 573 574 // Handle case when target is a string or something (possible in deep copy) 575 if ( typeof target !== "object" && !jQuery.isFunction(target) ) 576 target = {}; 577 578 // extend jQuery itself if only one argument is passed 579 if ( length == i ) { 580 target = this; 581 --i; 582 } 583 584 for ( ; i < length; i++ ) 585 // Only deal with non-null/undefined values 586 if ( (options = arguments[ i ]) != null ) 587 // Extend the base object 588 for ( var name in options ) { 589 var src = target[ name ], copy = options[ name ]; 590 591 // Prevent never-ending loop 592 if ( target === copy ) 593 continue; 594 595 // Recurse if we're merging object values 596 if ( deep && copy && typeof copy === "object" && !copy.nodeType ) 597 target[ name ] = jQuery.extend( deep, 598 // Never move original objects, clone them 599 src || ( copy.length != null ? [ ] : { } ) 600 , copy ); 601 602 // Don't bring in undefined values 603 else if ( copy !== undefined ) 604 target[ name ] = copy; 605 606 } 607 608 // Return the modified object 609 return target; 610 }; 611 612 // exclude the following css properties to add px 613 var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, 614 // cache defaultView 615 defaultView = document.defaultView || {}, 616 toString = Object.prototype.toString; 617 618 jQuery.extend({ 619 noConflict: function( deep ) { 620 window.$ = _$; 621 622 if ( deep ) 623 window.jQuery = _jQuery; 624 625 return jQuery; 626 }, 627 628 // See test/unit/core.js for details concerning isFunction. 629 // Since version 1.3, DOM methods and functions like alert 630 // aren't supported. They return false on IE (#2968). 631 isFunction: function( obj ) { 632 return toString.call(obj) === "[object Function]"; 633 }, 634 635 isArray: function( obj ) { 636 return toString.call(obj) === "[object Array]"; 637 }, 638 639 // check if an element is in a (or is an) XML document 640 isXMLDoc: function( elem ) { 641 return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || 642 !!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument ); 643 }, 644 645 // Evalulates a script in a global context 646 globalEval: function( data ) { 647 if ( data && /\S/.test(data) ) { 648 // Inspired by code by Andrea Giammarchi 649 // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html 650 var head = document.getElementsByTagName("head")[0] || document.documentElement, 651 script = document.createElement("script"); 652 653 script.type = "text/javascript"; 654 if ( jQuery.support.scriptEval ) 655 script.appendChild( document.createTextNode( data ) ); 656 else 657 script.text = data; 658 659 // Use insertBefore instead of appendChild to circumvent an IE6 bug. 660 // This arises when a base node is used (#2709). 661 head.insertBefore( script, head.firstChild ); 662 head.removeChild( script ); 663 } 664 }, 665 666 nodeName: function( elem, name ) { 667 return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); 668 }, 669 670 // args is for internal usage only 671 each: function( object, callback, args ) { 672 var name, i = 0, length = object.length; 673 674 if ( args ) { 675 if ( length === undefined ) { 676 for ( name in object ) 677 if ( callback.apply( object[ name ], args ) === false ) 678 break; 679 } else 680 for ( ; i < length; ) 681 if ( callback.apply( object[ i++ ], args ) === false ) 682 break; 683 684 // A special, fast, case for the most common use of each 685 } else { 686 if ( length === undefined ) { 687 for ( name in object ) 688 if ( callback.call( object[ name ], name, object[ name ] ) === false ) 689 break; 690 } else 691 for ( var value = object[0]; 692 i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} 693 } 694 695 return object; 696 }, 697 698 prop: function( elem, value, type, i, name ) { 699 // Handle executable functions 700 if ( jQuery.isFunction( value ) ) 701 value = value.call( elem, i ); 702 703 // Handle passing in a number to a CSS property 704 return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ? 705 value + "px" : 706 value; 707 }, 708 709 className: { 710 // internal only, use addClass("class") 711 add: function( elem, classNames ) { 712 jQuery.each((classNames || "").split(/\s+/), function(i, className){ 713 if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) ) 714 elem.className += (elem.className ? " " : "") + className; 715 }); 716 }, 717 718 // internal only, use removeClass("class") 719 remove: function( elem, classNames ) { 720 if (elem.nodeType == 1) 721 elem.className = classNames !== undefined ? 722 jQuery.grep(elem.className.split(/\s+/), function(className){ 723 return !jQuery.className.has( classNames, className ); 724 }).join(" ") : 725 ""; 726 }, 727 728 // internal only, use hasClass("class") 729 has: function( elem, className ) { 730 return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1; 731 } 732 }, 733 734 // A method for quickly swapping in/out CSS properties to get correct calculations 735 swap: function( elem, options, callback ) { 736 var old = {}; 737 // Remember the old values, and insert the new ones 738 for ( var name in options ) { 739 old[ name ] = elem.style[ name ]; 740 elem.style[ name ] = options[ name ]; 741 } 742 743 callback.call( elem ); 744 745 // Revert the old values 746 for ( var name in options ) 747 elem.style[ name ] = old[ name ]; 748 }, 749 750 css: function( elem, name, force, extra ) { 751 if ( name == "width" || name == "height" ) { 752 var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; 753 754 function getWH() { 755 val = name == "width" ? elem.offsetWidth : elem.offsetHeight; 756 757 if ( extra === "border" ) 758 return; 759 760 jQuery.each( which, function() { 761 if ( !extra ) 762 val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; 763 if ( extra === "margin" ) 764 val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0; 765 else 766 val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; 767 }); 768 } 769 770 if ( elem.offsetWidth !== 0 ) 771 getWH(); 772 else 773 jQuery.swap( elem, props, getWH ); 774 775 return Math.max(0, Math.round(val)); 776 } 777 778 return jQuery.curCSS( elem, name, force ); 779 }, 780 781 curCSS: function( elem, name, force ) { 782 var ret, style = elem.style; 783 784 // We need to handle opacity special in IE 785 if ( name == "opacity" && !jQuery.support.opacity ) { 786 ret = jQuery.attr( style, "opacity" ); 787 788 return ret == "" ? 789 "1" : 790 ret; 791 } 792 793 // Make sure we're using the right name for getting the float value 794 if ( name.match( /float/i ) ) 795 name = styleFloat; 796 797 if ( !force && style && style[ name ] ) 798 ret = style[ name ]; 799 800 else if ( defaultView.getComputedStyle ) { 801 802 // Only "float" is needed here 803 if ( name.match( /float/i ) ) 804 name = "float"; 805 806 name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); 807 808 var computedStyle = defaultView.getComputedStyle( elem, null ); 809 810 if ( computedStyle ) 811 ret = computedStyle.getPropertyValue( name ); 812 813 // We should always get a number back from opacity 814 if ( name == "opacity" && ret == "" ) 815 ret = "1"; 816 817 } else if ( elem.currentStyle ) { 818 var camelCase = name.replace(/\-(\w)/g, function(all, letter){ 819 return letter.toUpperCase(); 820 }); 821 822 ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; 823 824 // From the awesome hack by Dean Edwards 825 // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 826 827 // If we're not dealing with a regular pixel number 828 // but a number that has a weird ending, we need to convert it to pixels 829 if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) { 830 // Remember the original values 831 var left = style.left, rsLeft = elem.runtimeStyle.left; 832 833 // Put in the new values to get a computed value out 834 elem.runtimeStyle.left = elem.currentStyle.left; 835 style.left = ret || 0; 836 ret = style.pixelLeft + "px"; 837 838 // Revert the changed values 839 style.left = left; 840 elem.runtimeStyle.left = rsLeft; 841 } 842 } 843 844 return ret; 845 }, 846 847 clean: function( elems, context, fragment ) { 848 context = context || document; 849 850 // !context.createElement fails in IE with an error but returns typeof 'object' 851 if ( typeof context.createElement === "undefined" ) 852 context = context.ownerDocument || context[0] && context[0].ownerDocument || document; 853 854 // If a single string is passed in and it's a single tag 855 // just do a createElement and skip the rest 856 if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) { 857 var match = /^<(\w+)\s*\/?>$/.exec(elems[0]); 858 if ( match ) 859 return [ context.createElement( match[1] ) ]; 860 } 861 862 var ret = [], scripts = [], div = context.createElement("div"); 863 864 jQuery.each(elems, function(i, elem){ 865 if ( typeof elem === "number" ) 866 elem += ''; 867 868 if ( !elem ) 869 return; 870 871 // Convert html string into DOM nodes 872 if ( typeof elem === "string" ) { 873 // Fix "XHTML"-style tags in all browsers 874 elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){ 875 return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? 876 all : 877 front + "></" + tag + ">"; 878 }); 879 880 // Trim whitespace, otherwise indexOf won't work as expected 881 var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase(); 882 883 var wrap = 884 // option or optgroup 885 !tags.indexOf("<opt") && 886 [ 1, "<select multiple='multiple'>", "</select>" ] || 887 888 !tags.indexOf("<leg") && 889 [ 1, "<fieldset>", "</fieldset>" ] || 890 891 tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && 892 [ 1, "<table>", "</table>" ] || 893 894 !tags.indexOf("<tr") && 895 [ 2, "<table><tbody>", "</tbody></table>" ] || 896 897 // <thead> matched above 898 (!tags.indexOf("<td") || !tags.indexOf("<th")) && 899 [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] || 900 901 !tags.indexOf("<col") && 902 [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] || 903 904 // IE can't serialize <link> and <script> tags normally 905 !jQuery.support.htmlSerialize && 906 [ 1, "div<div>", "</div>" ] || 907 908 [ 0, "", "" ]; 909 910 // Go to html and back, then peel off extra wrappers 911 div.innerHTML = wrap[1] + elem + wrap[2]; 912 913 // Move to the right depth 914 while ( wrap[0]-- ) 915 div = div.lastChild; 916 917 // Remove IE's autoinserted <tbody> from table fragments 918 if ( !jQuery.support.tbody ) { 919 920 // String was a <table>, *may* have spurious <tbody> 921 var hasBody = /<tbody/i.test(elem), 922 tbody = !tags.indexOf("<table") && !hasBody ? 923 div.firstChild && div.firstChild.childNodes : 924 925 // String was a bare <thead> or <tfoot> 926 wrap[1] == "<table>" && !hasBody ? 927 div.childNodes : 928 []; 929 930 for ( var j = tbody.length - 1; j >= 0 ; --j ) 931 if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) 932 tbody[ j ].parentNode.removeChild( tbody[ j ] ); 933 934 } 935 936 // IE completely kills leading whitespace when innerHTML is used 937 if ( !jQuery.support.leadingWhitespace && /^\s/.test( elem ) ) 938 div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild ); 939 940 elem = jQuery.makeArray( div.childNodes ); 941 } 942 943 if ( elem.nodeType ) 944 ret.push( elem ); 945 else 946 ret = jQuery.merge( ret, elem ); 947 948 }); 949 950 if ( fragment ) { 951 for ( var i = 0; ret[i]; i++ ) { 952 if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) { 953 scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] ); 954 } else { 955 if ( ret[i].nodeType === 1 ) 956 ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) ); 957 fragment.appendChild( ret[i] ); 958 } 959 } 960 961 return scripts; 962 } 963 964 return ret; 965 }, 966 967 attr: function( elem, name, value ) { 968 // don't set attributes on text and comment nodes 969 if (!elem || elem.nodeType == 3 || elem.nodeType == 8) 970 return undefined; 971 972 var notxml = !jQuery.isXMLDoc( elem ), 973 // Whether we are setting (or getting) 974 set = value !== undefined; 975 976 // Try to normalize/fix the name 977 name = notxml && jQuery.props[ name ] || name; 978 979 // Only do all the following if this is a node (faster for style) 980 // IE elem.getAttribute passes even for style 981 if ( elem.tagName ) { 982 983 // These attributes require special treatment 984 var special = /href|src|style/.test( name ); 985 986 // Safari mis-reports the default selected property of a hidden option 987 // Accessing the parent's selectedIndex property fixes it 988 if ( name == "selected" && elem.parentNode ) 989 elem.parentNode.selectedIndex; 990 991 // If applicable, access the attribute via the DOM 0 way 992 if ( name in elem && notxml && !special ) { 993 if ( set ){ 994 // We can't allow the type property to be changed (since it causes problems in IE) 995 if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode ) 996 throw "type property can't be changed"; 997 998 elem[ name ] = value; 999 } 1000 1001 // browsers index elements by id/name on forms, give priority to attributes. 1002 if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) 1003 return elem.getAttributeNode( name ).nodeValue; 1004 1005 // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set 1006 // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ 1007 if ( name == "tabIndex" ) { 1008 var attributeNode = elem.getAttributeNode( "tabIndex" ); 1009 return attributeNode && attributeNode.specified 1010 ? attributeNode.value 1011 : elem.nodeName.match(/(button|input|object|select|textarea)/i) 1012 ? 0 1013 : elem.nodeName.match(/^(a|area)$/i) && elem.href 1014 ? 0 1015 : undefined; 1016 } 1017 1018 return elem[ name ]; 1019 } 1020 1021 if ( !jQuery.support.style && notxml && name == "style" ) 1022 return jQuery.attr( elem.style, "cssText", value ); 1023 1024 if ( set ) 1025 // convert the value to a string (all browsers do this but IE) see #1070 1026 elem.setAttribute( name, "" + value ); 1027 1028 var attr = !jQuery.support.hrefNormalized && notxml && special 1029 // Some attributes require a special call on IE 1030 ? elem.getAttribute( name, 2 ) 1031 : elem.getAttribute( name ); 1032 1033 // Non-existent attributes return null, we normalize to undefined 1034 return attr === null ? undefined : attr; 1035 } 1036 1037 // elem is actually elem.style ... set the style 1038 1039 // IE uses filters for opacity 1040 if ( !jQuery.support.opacity && name == "opacity" ) { 1041 if ( set ) { 1042 // IE has trouble with opacity if it does not have layout 1043 // Force it by setting the zoom level 1044 elem.zoom = 1; 1045 1046 // Set the alpha filter to set the opacity 1047 elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) + 1048 (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")"); 1049 } 1050 1051 return elem.filter && elem.filter.indexOf("opacity=") >= 0 ? 1052 (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '': 1053 ""; 1054 } 1055 1056 name = name.replace(/-([a-z])/ig, function(all, letter){ 1057 return letter.toUpperCase(); 1058 }); 1059 1060 if ( set ) 1061 elem[ name ] = value; 1062 1063 return elem[ name ]; 1064 }, 1065 1066 trim: function( text ) { 1067 return (text || "").replace( /^\s+|\s+$/g, "" ); 1068 }, 1069 1070 makeArray: function( array ) { 1071 var ret = []; 1072 1073 if( array != null ){ 1074 var i = array.length; 1075 // The window, strings (and functions) also have 'length' 1076 if( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval ) 1077 ret[0] = array; 1078 else 1079 while( i ) 1080 ret[--i] = array[i]; 1081 } 1082 1083 return ret; 1084 }, 1085 1086 inArray: function( elem, array ) { 1087 for ( var i = 0, length = array.length; i < length; i++ ) 1088 // Use === because on IE, window == document 1089 if ( array[ i ] === elem ) 1090 return i; 1091 1092 return -1; 1093 }, 1094 1095 merge: function( first, second ) { 1096 // We have to loop this way because IE & Opera overwrite the length 1097 // expando of getElementsByTagName 1098 var i = 0, elem, pos = first.length; 1099 // Also, we need to make sure that the correct elements are being returned 1100 // (IE returns comment nodes in a '*' query) 1101 if ( !jQuery.support.getAll ) { 1102 while ( (elem = second[ i++ ]) != null ) 1103 if ( elem.nodeType != 8 ) 1104 first[ pos++ ] = elem; 1105 1106 } else 1107 while ( (elem = second[ i++ ]) != null ) 1108 first[ pos++ ] = elem; 1109 1110 return first; 1111 }, 1112 1113 unique: function( array ) { 1114 var ret = [], done = {}; 1115 1116 try { 1117 1118 for ( var i = 0, length = array.length; i < length; i++ ) { 1119 var id = jQuery.data( array[ i ] ); 1120 1121 if ( !done[ id ] ) { 1122 done[ id ] = true; 1123 ret.push( array[ i ] ); 1124 } 1125 } 1126 1127 } catch( e ) { 1128 ret = array; 1129 } 1130 1131 return ret; 1132 }, 1133 1134 grep: function( elems, callback, inv ) { 1135 var ret = []; 1136 1137 // Go through the array, only saving the items 1138 // that pass the validator function 1139 for ( var i = 0, length = elems.length; i < length; i++ ) 1140 if ( !inv != !callback( elems[ i ], i ) ) 1141 ret.push( elems[ i ] ); 1142 1143 return ret; 1144 }, 1145 1146 map: function( elems, callback ) { 1147 var ret = []; 1148 1149 // Go through the array, translating each of the items to their 1150 // new value (or values). 1151 for ( var i = 0, length = elems.length; i < length; i++ ) { 1152 var value = callback( elems[ i ], i ); 1153 1154 if ( value != null ) 1155 ret[ ret.length ] = value; 1156 } 1157 1158 return ret.concat.apply( [], ret ); 1159 } 1160 }); 1161 1162 // Use of jQuery.browser is deprecated. 1163 // It's included for backwards compatibility and plugins, 1164 // although they should work to migrate away. 1165 1166 var userAgent = navigator.userAgent.toLowerCase(); 1167 1168 // Figure out what browser is being used 1169 jQuery.browser = { 1170 version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1], 1171 safari: /webkit/.test( userAgent ), 1172 opera: /opera/.test( userAgent ), 1173 msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ), 1174 mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent ) 1175 }; 1176 1177 jQuery.each({ 1178 parent: function(elem){return elem.parentNode;}, 1179 parents: function(elem){return jQuery.dir(elem,"parentNode");}, 1180 next: function(elem){return jQuery.nth(elem,2,"nextSibling");}, 1181 prev: function(elem){return jQuery.nth(elem,2,"previousSibling");}, 1182 nextAll: function(elem){return jQuery.dir(elem,"nextSibling");}, 1183 prevAll: function(elem){return jQuery.dir(elem,"previousSibling");}, 1184 siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);}, 1185 children: function(elem){return jQuery.sibling(elem.firstChild);}, 1186 contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);} 1187 }, function(name, fn){ 1188 jQuery.fn[ name ] = function( selector ) { 1189 var ret = jQuery.map( this, fn ); 1190 1191 if ( selector && typeof selector == "string" ) 1192 ret = jQuery.multiFilter( selector, ret ); 1193 1194 return this.pushStack( jQuery.unique( ret ), name, selector ); 1195 }; 1196 }); 1197 1198 jQuery.each({ 1199 appendTo: "append", 1200 prependTo: "prepend", 1201 insertBefore: "before", 1202 insertAfter: "after", 1203 replaceAll: "replaceWith" 1204 }, function(name, original){ 1205 jQuery.fn[ name ] = function( selector ) { 1206 var ret = [], insert = jQuery( selector ); 1207 1208 for ( var i = 0, l = insert.length; i < l; i++ ) { 1209 var elems = (i > 0 ? this.clone(true) : this).get(); 1210 jQuery.fn[ original ].apply( jQuery(insert[i]), elems ); 1211 ret = ret.concat( elems ); 1212 } 1213 1214 return this.pushStack( ret, name, selector ); 1215 }; 1216 }); 1217 1218 jQuery.each({ 1219 removeAttr: function( name ) { 1220 jQuery.attr( this, name, "" ); 1221 if (this.nodeType == 1) 1222 this.removeAttribute( name ); 1223 }, 1224 1225 addClass: function( classNames ) { 1226 jQuery.className.add( this, classNames ); 1227 }, 1228 1229 removeClass: function( classNames ) { 1230 jQuery.className.remove( this, classNames ); 1231 }, 1232 1233 toggleClass: function( classNames, state ) { 1234 if( typeof state !== "boolean" ) 1235 state = !jQuery.className.has( this, classNames ); 1236 jQuery.className[ state ? "add" : "remove" ]( this, classNames ); 1237 }, 1238 1239 remove: function( selector ) { 1240 if ( !selector || jQuery.filter( selector, [ this ] ).length ) { 1241 // Prevent memory leaks 1242 jQuery( "*", this ).add([this]).each(function(){ 1243 jQuery.event.remove(this); 1244 jQuery.removeData(this); 1245 }); 1246 if (this.parentNode) 1247 this.parentNode.removeChild( this ); 1248 } 1249 }, 1250 1251 empty: function() { 1252 // Remove element nodes and prevent memory leaks 1253 jQuery(this).children().remove(); 1254 1255 // Remove any remaining nodes 1256 while ( this.firstChild ) 1257 this.removeChild( this.firstChild ); 1258 } 1259 }, function(name, fn){ 1260 jQuery.fn[ name ] = function(){ 1261 return this.each( fn, arguments ); 1262 }; 1263 }); 1264 1265 // Helper function used by the dimensions and offset modules 1266 function num(elem, prop) { 1267 return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0; 1268 } 1269 var expando = "jQuery" + now(), uuid = 0, windowData = {}; 1270 1271 jQuery.extend({ 1272 cache: {}, 1273 1274 data: function( elem, name, data ) { 1275 elem = elem == window ? 1276 windowData : 1277 elem; 1278 1279 var id = elem[ expando ]; 1280 1281 // Compute a unique ID for the element 1282 if ( !id ) 1283 id = elem[ expando ] = ++uuid; 1284 1285 // Only generate the data cache if we're 1286 // trying to access or manipulate it 1287 if ( name && !jQuery.cache[ id ] ) 1288 jQuery.cache[ id ] = {}; 1289 1290 // Prevent overriding the named cache with undefined values 1291 if ( data !== undefined ) 1292 jQuery.cache[ id ][ name ] = data; 1293 1294 // Return the named cache data, or the ID for the element 1295 return name ? 1296 jQuery.cache[ id ][ name ] : 1297 id; 1298 }, 1299 1300 removeData: function( elem, name ) { 1301 elem = elem == window ? 1302 windowData : 1303 elem; 1304 1305 var id = elem[ expando ]; 1306 1307 // If we want to remove a specific section of the element's data 1308 if ( name ) { 1309 if ( jQuery.cache[ id ] ) { 1310 // Remove the section of cache data 1311 delete jQuery.cache[ id ][ name ]; 1312 1313 // If we've removed all the data, remove the element's cache 1314 name = ""; 1315 1316 for ( name in jQuery.cache[ id ] ) 1317 break; 1318 1319 if ( !name ) 1320 jQuery.removeData( elem ); 1321 } 1322 1323 // Otherwise, we want to remove all of the element's data 1324 } else { 1325 // Clean up the element expando 1326 try { 1327 delete elem[ expando ]; 1328 } catch(e){ 1329 // IE has trouble directly removing the expando 1330 // but it's ok with using removeAttribute 1331 if ( elem.removeAttribute ) 1332 elem.removeAttribute( expando ); 1333 } 1334 1335 // Completely remove the data cache 1336 delete jQuery.cache[ id ]; 1337 } 1338 }, 1339 queue: function( elem, type, data ) { 1340 if ( elem ){ 1341 1342 type = (type || "fx") + "queue"; 1343 1344 var q = jQuery.data( elem, type ); 1345 1346 if ( !q || jQuery.isArray(data) ) 1347 q = jQuery.data( elem, type, jQuery.makeArray(data) ); 1348 else if( data ) 1349 q.push( data ); 1350 1351 } 1352 return q; 1353 }, 1354 1355 dequeue: function( elem, type ){ 1356 var queue = jQuery.queue( elem, type ), 1357 fn = queue.shift(); 1358 1359 if( !type || type === "fx" ) 1360 fn = queue[0]; 1361 1362 if( fn !== undefined ) 1363 fn.call(elem); 1364 } 1365 }); 1366 1367 jQuery.fn.extend({ 1368 data: function( key, value ){ 1369 var parts = key.split("."); 1370 parts[1] = parts[1] ? "." + parts[1] : ""; 1371 1372 if ( value === undefined ) { 1373 var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); 1374 1375 if ( data === undefined && this.length ) 1376 data = jQuery.data( this[0], key ); 1377 1378 return data === undefined && parts[1] ? 1379 this.data( parts[0] ) : 1380 data; 1381 } else 1382 return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){ 1383 jQuery.data( this, key, value ); 1384 }); 1385 }, 1386 1387 removeData: function( key ){ 1388 return this.each(function(){ 1389 jQuery.removeData( this, key ); 1390 }); 1391 }, 1392 queue: function(type, data){ 1393 if ( typeof type !== "string" ) { 1394 data = type; 1395 type = "fx"; 1396 } 1397 1398 if ( data === undefined ) 1399 return jQuery.queue( this[0], type ); 1400 1401 return this.each(function(){ 1402 var queue = jQuery.queue( this, type, data ); 1403 1404 if( type == "fx" && queue.length == 1 ) 1405 queue[0].call(this); 1406 }); 1407 }, 1408 dequeue: function(type){ 1409 return this.each(function(){ 1410 jQuery.dequeue( this, type ); 1411 }); 1412 } 1413 });/*! 1414 * Sizzle CSS Selector Engine - v0.9.3 1415 * Copyright 2009, The Dojo Foundation 1416 * Released under the MIT, BSD, and GPL Licenses. 1417 * More information: http://sizzlejs.com/ 1418 */ 1419 (function(){ 1420 1421 var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g, 1422 done = 0, 1423 toString = Object.prototype.toString; 1424 1425 var Sizzle = function(selector, context, results, seed) { 1426 results = results || []; 1427 context = context || document; 1428 1429 if ( context.nodeType !== 1 && context.nodeType !== 9 ) 1430 return []; 1431 1432 if ( !selector || typeof selector !== "string" ) { 1433 return results; 1434 } 1435 1436 var parts = [], m, set, checkSet, check, mode, extra, prune = true; 1437 1438 // Reset the position of the chunker regexp (start from head) 1439 chunker.lastIndex = 0; 1440 1441 while ( (m = chunker.exec(selector)) !== null ) { 1442 parts.push( m[1] ); 1443 1444 if ( m[2] ) { 1445 extra = RegExp.rightContext; 1446 break; 1447 } 1448 } 1449 1450 if ( parts.length > 1 && origPOS.exec( selector ) ) { 1451 if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { 1452 set = posProcess( parts[0] + parts[1], context ); 1453 } else { 1454 set = Expr.relative[ parts[0] ] ? 1455 [ context ] : 1456 Sizzle( parts.shift(), context ); 1457 1458 while ( parts.length ) { 1459 selector = parts.shift(); 1460 1461 if ( Expr.relative[ selector ] ) 1462 selector += parts.shift(); 1463 1464 set = posProcess( selector, set ); 1465 } 1466 } 1467 } else { 1468 var ret = seed ? 1469 { expr: parts.pop(), set: makeArray(seed) } : 1470 Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context, isXML(context) ); 1471 set = Sizzle.filter( ret.expr, ret.set ); 1472 1473 if ( parts.length > 0 ) { 1474 checkSet = makeArray(set); 1475 } else { 1476 prune = false; 1477 } 1478 1479 while ( parts.length ) { 1480 var cur = parts.pop(), pop = cur; 1481 1482 if ( !Expr.relative[ cur ] ) { 1483 cur = ""; 1484 } else { 1485 pop = parts.pop(); 1486 } 1487 1488 if ( pop == null ) { 1489 pop = context; 1490 } 1491 1492 Expr.relative[ cur ]( checkSet, pop, isXML(context) ); 1493 } 1494 } 1495 1496 if ( !checkSet ) { 1497 checkSet = set; 1498 } 1499 1500 if ( !checkSet ) { 1501 throw "Syntax error, unrecognized expression: " + (cur || selector); 1502 } 1503 1504 if ( toString.call(checkSet) === "[object Array]" ) { 1505 if ( !prune ) { 1506 results.push.apply( results, checkSet ); 1507 } else if ( context.nodeType === 1 ) { 1508 for ( var i = 0; checkSet[i] != null; i++ ) { 1509 if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) { 1510 results.push( set[i] ); 1511 } 1512 } 1513 } else { 1514 for ( var i = 0; checkSet[i] != null; i++ ) { 1515 if ( checkSet[i] && checkSet[i].nodeType === 1 ) { 1516 results.push( set[i] ); 1517 } 1518 } 1519 } 1520 } else { 1521 makeArray( checkSet, results ); 1522 } 1523 1524 if ( extra ) { 1525 Sizzle( extra, context, results, seed ); 1526 1527 if ( sortOrder ) { 1528 hasDuplicate = false; 1529 results.sort(sortOrder); 1530 1531 if ( hasDuplicate ) { 1532 for ( var i = 1; i < results.length; i++ ) { 1533 if ( results[i] === results[i-1] ) { 1534 results.splice(i--, 1); 1535 } 1536 } 1537 } 1538 } 1539 } 1540 1541 return results; 1542 }; 1543 1544 Sizzle.matches = function(expr, set){ 1545 return Sizzle(expr, null, null, set); 1546 }; 1547 1548 Sizzle.find = function(expr, context, isXML){ 1549 var set, match; 1550 1551 if ( !expr ) { 1552 return []; 1553 } 1554 1555 for ( var i = 0, l = Expr.order.length; i < l; i++ ) { 1556 var type = Expr.order[i], match; 1557 1558 if ( (match = Expr.match[ type ].exec( expr )) ) { 1559 var left = RegExp.leftContext; 1560 1561 if ( left.substr( left.length - 1 ) !== "\\" ) { 1562 match[1] = (match[1] || "").replace(/\\/g, ""); 1563 set = Expr.find[ type ]( match, context, isXML ); 1564 if ( set != null ) { 1565 expr = expr.replace( Expr.match[ type ], "" ); 1566 break; 1567 } 1568 } 1569 } 1570 } 1571 1572 if ( !set ) { 1573 set = context.getElementsByTagName("*"); 1574 } 1575 1576 return {set: set, expr: expr}; 1577 }; 1578 1579 Sizzle.filter = function(expr, set, inplace, not){ 1580 var old = expr, result = [], curLoop = set, match, anyFound, 1581 isXMLFilter = set && set[0] && isXML(set[0]); 1582 1583 while ( expr && set.length ) { 1584 for ( var type in Expr.filter ) { 1585 if ( (match = Expr.match[ type ].exec( expr )) != null ) { 1586 var filter = Expr.filter[ type ], found, item; 1587 anyFound = false; 1588 1589 if ( curLoop == result ) { 1590 result = []; 1591 } 1592 1593 if ( Expr.preFilter[ type ] ) { 1594 match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); 1595 1596 if ( !match ) { 1597 anyFound = found = true; 1598 } else if ( match === true ) { 1599 continue; 1600 } 1601 } 1602 1603 if ( match ) { 1604 for ( var i = 0; (item = curLoop[i]) != null; i++ ) { 1605 if ( item ) { 1606 found = filter( item, match, i, curLoop ); 1607 var pass = not ^ !!found; 1608 1609 if ( inplace && found != null ) { 1610 if ( pass ) { 1611 anyFound = true; 1612 } else { 1613 curLoop[i] = false; 1614 } 1615 } else if ( pass ) { 1616 result.push( item ); 1617 anyFound = true; 1618 } 1619 } 1620 } 1621 } 1622 1623 if ( found !== undefined ) { 1624 if ( !inplace ) { 1625 curLoop = result; 1626 } 1627 1628 expr = expr.replace( Expr.match[ type ], "" ); 1629 1630 if ( !anyFound ) { 1631 return []; 1632 } 1633 1634 break; 1635 } 1636 } 1637 } 1638 1639 // Improper expression 1640 if ( expr == old ) { 1641 if ( anyFound == null ) { 1642 throw "Syntax error, unrecognized expression: " + expr; 1643 } else { 1644 break; 1645 } 1646 } 1647 1648 old = expr; 1649 } 1650 1651 return curLoop; 1652 }; 1653 1654 var Expr = Sizzle.selectors = { 1655 order: [ "ID", "NAME", "TAG" ], 1656 match: { 1657 ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/, 1658 CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/, 1659 NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/, 1660 ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, 1661 TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/, 1662 CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, 1663 POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, 1664 PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/ 1665 }, 1666 attrMap: { 1667 "class": "className", 1668 "for": "htmlFor" 1669 }, 1670 attrHandle: { 1671 href: function(elem){ 1672 return elem.getAttribute("href"); 1673 } 1674 }, 1675 relative: { 1676 "+": function(checkSet, part, isXML){ 1677 var isPartStr = typeof part === "string", 1678 isTag = isPartStr && !/\W/.test(part), 1679 isPartStrNotTag = isPartStr && !isTag; 1680 1681 if ( isTag && !isXML ) { 1682 part = part.toUpperCase(); 1683 } 1684 1685 for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { 1686 if ( (elem = checkSet[i]) ) { 1687 while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} 1688 1689 checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ? 1690 elem || false : 1691 elem === part; 1692 } 1693 } 1694 1695 if ( isPartStrNotTag ) { 1696 Sizzle.filter( part, checkSet, true ); 1697 } 1698 }, 1699 ">": function(checkSet, part, isXML){ 1700 var isPartStr = typeof part === "string"; 1701 1702 if ( isPartStr && !/\W/.test(part) ) { 1703 part = isXML ? part : part.toUpperCase(); 1704 1705 for ( var i = 0, l = checkSet.length; i < l; i++ ) { 1706 var elem = checkSet[i]; 1707 if ( elem ) { 1708 var parent = elem.parentNode; 1709 checkSet[i] = parent.nodeName === part ? parent : false; 1710 } 1711 } 1712 } else { 1713 for ( var i = 0, l = checkSet.length; i < l; i++ ) { 1714 var elem = checkSet[i]; 1715 if ( elem ) { 1716 checkSet[i] = isPartStr ? 1717 elem.parentNode : 1718 elem.parentNode === part; 1719 } 1720 } 1721 1722 if ( isPartStr ) { 1723 Sizzle.filter( part, checkSet, true ); 1724 } 1725 } 1726 }, 1727 "": function(checkSet, part, isXML){ 1728 var doneName = done++, checkFn = dirCheck; 1729 1730 if ( !part.match(/\W/) ) { 1731 var nodeCheck = part = isXML ? part : part.toUpperCase(); 1732 checkFn = dirNodeCheck; 1733 } 1734 1735 checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); 1736 }, 1737 "~": function(checkSet, part, isXML){ 1738 var doneName = done++, checkFn = dirCheck; 1739 1740 if ( typeof part === "string" && !part.match(/\W/) ) { 1741 var nodeCheck = part = isXML ? part : part.toUpperCase(); 1742 checkFn = dirNodeCheck; 1743 } 1744 1745 checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); 1746 } 1747 }, 1748 find: { 1749 ID: function(match, context, isXML){ 1750 if ( typeof context.getElementById !== "undefined" && !isXML ) { 1751 var m = context.getElementById(match[1]); 1752 return m ? [m] : []; 1753 } 1754 }, 1755 NAME: function(match, context, isXML){ 1756 if ( typeof context.getElementsByName !== "undefined" ) { 1757 var ret = [], results = context.getElementsByName(match[1]); 1758 1759 for ( var i = 0, l = results.length; i < l; i++ ) { 1760 if ( results[i].getAttribute("name") === match[1] ) { 1761 ret.push( results[i] ); 1762 } 1763 } 1764 1765 return ret.length === 0 ? null : ret; 1766 } 1767 }, 1768 TAG: function(match, context){ 1769 return context.getElementsByTagName(match[1]); 1770 } 1771 }, 1772 preFilter: { 1773 CLASS: function(match, curLoop, inplace, result, not, isXML){ 1774 match = " " + match[1].replace(/\\/g, "") + " "; 1775 1776 if ( isXML ) { 1777 return match; 1778 } 1779 1780 for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { 1781 if ( elem ) { 1782 if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) { 1783 if ( !inplace ) 1784 result.push( elem ); 1785 } else if ( inplace ) { 1786 curLoop[i] = false; 1787 } 1788 } 1789 } 1790 1791 return false; 1792 }, 1793 ID: function(match){ 1794 return match[1].replace(/\\/g, ""); 1795 }, 1796 TAG: function(match, curLoop){ 1797 for ( var i = 0; curLoop[i] === false; i++ ){} 1798 return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase(); 1799 }, 1800 CHILD: function(match){ 1801 if ( match[1] == "nth" ) { 1802 // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' 1803 var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( 1804 match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" || 1805 !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); 1806 1807 // calculate the numbers (first)n+(last) including if they are negative 1808 match[2] = (test[1] + (test[2] || 1)) - 0; 1809 match[3] = test[3] - 0; 1810 } 1811 1812 // TODO: Move to normal caching system 1813 match[0] = done++; 1814 1815 return match; 1816 }, 1817 ATTR: function(match, curLoop, inplace, result, not, isXML){ 1818 var name = match[1].replace(/\\/g, ""); 1819 1820 if ( !isXML && Expr.attrMap[name] ) { 1821 match[1] = Expr.attrMap[name]; 1822 } 1823 1824 if ( match[2] === "~=" ) { 1825 match[4] = " " + match[4] + " "; 1826 } 1827 1828 return match; 1829 }, 1830 PSEUDO: function(match, curLoop, inplace, result, not){ 1831 if ( match[1] === "not" ) { 1832 // If we're dealing with a complex expression, or a simple one 1833 if ( match[3].match(chunker).length > 1 || /^\w/.test(match[3]) ) { 1834 match[3] = Sizzle(match[3], null, null, curLoop); 1835 } else { 1836 var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); 1837 if ( !inplace ) { 1838 result.push.apply( result, ret ); 1839 } 1840 return false; 1841 } 1842 } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { 1843 return true; 1844 } 1845 1846 return match; 1847 }, 1848 POS: function(match){ 1849 match.unshift( true ); 1850 return match; 1851 } 1852 }, 1853 filters: { 1854 enabled: function(elem){ 1855 return elem.disabled === false && elem.type !== "hidden"; 1856 }, 1857 disabled: function(elem){ 1858 return elem.disabled === true; 1859 }, 1860 checked: function(elem){ 1861 return elem.checked === true; 1862 }, 1863 selected: function(elem){ 1864 // Accessing this property makes selected-by-default 1865 // options in Safari work properly 1866 elem.parentNode.selectedIndex; 1867 return elem.selected === true; 1868 }, 1869 parent: function(elem){ 1870 return !!elem.firstChild; 1871 }, 1872 empty: function(elem){ 1873 return !elem.firstChild; 1874 }, 1875 has: function(elem, i, match){ 1876 return !!Sizzle( match[3], elem ).length; 1877 }, 1878 header: function(elem){ 1879 return /h\d/i.test( elem.nodeName ); 1880 }, 1881 text: function(elem){ 1882 return "text" === elem.type; 1883 }, 1884 radio: function(elem){ 1885 return "radio" === elem.type; 1886 }, 1887 checkbox: function(elem){ 1888 return "checkbox" === elem.type; 1889 }, 1890 file: function(elem){ 1891 return "file" === elem.type; 1892 }, 1893 password: function(elem){ 1894 return "password" === elem.type; 1895 }, 1896 submit: function(elem){ 1897 return "submit" === elem.type; 1898 }, 1899 image: function(elem){ 1900 return "image" === elem.type; 1901 }, 1902 reset: function(elem){ 1903 return "reset" === elem.type; 1904 }, 1905 button: function(elem){ 1906 return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON"; 1907 }, 1908 input: function(elem){ 1909 return /input|select|textarea|button/i.test(elem.nodeName); 1910 } 1911 }, 1912 setFilters: { 1913 first: function(elem, i){ 1914 return i === 0; 1915 }, 1916 last: function(elem, i, match, array){ 1917 return i === array.length - 1; 1918 }, 1919 even: function(elem, i){ 1920 return i % 2 === 0; 1921 }, 1922 odd: function(elem, i){ 1923 return i % 2 === 1; 1924 }, 1925 lt: function(elem, i, match){ 1926 return i < match[3] - 0; 1927 }, 1928 gt: function(elem, i, match){ 1929 return i > match[3] - 0; 1930 }, 1931 nth: function(elem, i, match){ 1932 return match[3] - 0 == i; 1933 }, 1934 eq: function(elem, i, match){ 1935 return match[3] - 0 == i; 1936 } 1937 }, 1938 filter: { 1939 PSEUDO: function(elem, match, i, array){ 1940 var name = match[1], filter = Expr.filters[ name ]; 1941 1942 if ( filter ) { 1943 return filter( elem, i, match, array ); 1944 } else if ( name === "contains" ) { 1945 return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0; 1946 } else if ( name === "not" ) { 1947 var not = match[3]; 1948 1949 for ( var i = 0, l = not.length; i < l; i++ ) { 1950 if ( not[i] === elem ) { 1951 return false; 1952 } 1953 } 1954 1955 return true; 1956 } 1957 }, 1958 CHILD: function(elem, match){ 1959 var type = match[1], node = elem; 1960 switch (type) { 1961 case 'only': 1962 case 'first': 1963 while (node = node.previousSibling) { 1964 if ( node.nodeType === 1 ) return false; 1965 } 1966 if ( type == 'first') return true; 1967 node = elem; 1968 case 'last': 1969 while (node = node.nextSibling) { 1970 if ( node.nodeType === 1 ) return false; 1971 } 1972 return true; 1973 case 'nth': 1974 var first = match[2], last = match[3]; 1975 1976 if ( first == 1 && last == 0 ) { 1977 return true; 1978 } 1979 1980 var doneName = match[0], 1981 parent = elem.parentNode; 1982 1983 if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { 1984 var count = 0; 1985 for ( node = parent.firstChild; node; node = node.nextSibling ) { 1986 if ( node.nodeType === 1 ) { 1987 node.nodeIndex = ++count; 1988 } 1989 } 1990 parent.sizcache = doneName; 1991 } 1992 1993 var diff = elem.nodeIndex - last; 1994 if ( first == 0 ) { 1995 return diff == 0; 1996 } else { 1997 return ( diff % first == 0 && diff / first >= 0 ); 1998 } 1999 } 2000 }, 2001 ID: function(elem, match){ 2002 return elem.nodeType === 1 && elem.getAttribute("id") === match; 2003 }, 2004 TAG: function(elem, match){ 2005 return (match === "*" && elem.nodeType === 1) || elem.nodeName === match; 2006 }, 2007 CLASS: function(elem, match){ 2008 return (" " + (elem.className || elem.getAttribute("class")) + " ") 2009 .indexOf( match ) > -1; 2010 }, 2011 ATTR: function(elem, match){ 2012 var name = match[1], 2013 result = Expr.attrHandle[ name ] ? 2014 Expr.attrHandle[ name ]( elem ) : 2015 elem[ name ] != null ? 2016 elem[ name ] : 2017 elem.getAttribute( name ), 2018 value = result + "", 2019 type = match[2], 2020 check = match[4]; 2021 2022 return result == null ? 2023 type === "!=" : 2024 type === "=" ? 2025 value === check : 2026 type === "*=" ? 2027 value.indexOf(check) >= 0 : 2028 type === "~=" ? 2029 (" " + value + " ").indexOf(check) >= 0 : 2030 !check ? 2031 value && result !== false : 2032 type === "!=" ? 2033 value != check : 2034 type === "^=" ? 2035 value.indexOf(check) === 0 : 2036 type === "$=" ? 2037 value.substr(value.length - check.length) === check : 2038 type === "|=" ? 2039 value === check || value.substr(0, check.length + 1) === check + "-" : 2040 false; 2041 }, 2042 POS: function(elem, match, i, array){ 2043 var name = match[2], filter = Expr.setFilters[ name ]; 2044 2045 if ( filter ) { 2046 return filter( elem, i, match, array ); 2047 } 2048 } 2049 } 2050 }; 2051 2052 var origPOS = Expr.match.POS; 2053 2054 for ( var type in Expr.match ) { 2055 Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source ); 2056 } 2057 2058 var makeArray = function(array, results) { 2059 array = Array.prototype.slice.call( array ); 2060 2061 if ( results ) { 2062 results.push.apply( results, array ); 2063 return results; 2064 } 2065 2066 return array; 2067 }; 2068 2069 // Perform a simple check to determine if the browser is capable of 2070 // converting a NodeList to an array using builtin methods. 2071 try { 2072 Array.prototype.slice.call( document.documentElement.childNodes ); 2073 2074 // Provide a fallback method if it does not work 2075 } catch(e){ 2076 makeArray = function(array, results) { 2077 var ret = results || []; 2078 2079 if ( toString.call(array) === "[object Array]" ) { 2080 Array.prototype.push.apply( ret, array ); 2081 } else { 2082 if ( typeof array.length === "number" ) { 2083 for ( var i = 0, l = array.length; i < l; i++ ) { 2084 ret.push( array[i] ); 2085 } 2086 } else { 2087 for ( var i = 0; array[i]; i++ ) { 2088 ret.push( array[i] ); 2089 } 2090 } 2091 } 2092 2093 return ret; 2094 }; 2095 } 2096 2097 var sortOrder; 2098 2099 if ( document.documentElement.compareDocumentPosition ) { 2100 sortOrder = function( a, b ) { 2101 var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; 2102 if ( ret === 0 ) { 2103 hasDuplicate = true; 2104 } 2105 return ret; 2106 }; 2107 } else if ( "sourceIndex" in document.documentElement ) { 2108 sortOrder = function( a, b ) { 2109 var ret = a.sourceIndex - b.sourceIndex; 2110 if ( ret === 0 ) { 2111 hasDuplicate = true; 2112 } 2113 return ret; 2114 }; 2115 } else if ( document.createRange ) { 2116 sortOrder = function( a, b ) { 2117 var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); 2118 aRange.selectNode(a); 2119 aRange.collapse(true); 2120 bRange.selectNode(b); 2121 bRange.collapse(true); 2122 var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); 2123 if ( ret === 0 ) { 2124 hasDuplicate = true; 2125 } 2126 return ret; 2127 }; 2128 } 2129 2130 // Check to see if the browser returns elements by name when 2131 // querying by getElementById (and provide a workaround) 2132 (function(){ 2133 // We're going to inject a fake input element with a specified name 2134 var form = document.createElement("form"), 2135 id = "script" + (new Date).getTime(); 2136 form.innerHTML = "<input name='" + id + "'/>"; 2137 2138 // Inject it into the root element, check its status, and remove it quickly 2139 var root = document.documentElement; 2140 root.insertBefore( form, root.firstChild ); 2141 2142 // The workaround has to do additional checks after a getElementById 2143 // Which slows things down for other browsers (hence the branching) 2144 if ( !!document.getElementById( id ) ) { 2145 Expr.find.ID = function(match, context, isXML){ 2146 if ( typeof context.getElementById !== "undefined" && !isXML ) { 2147 var m = context.getElementById(match[1]); 2148 return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; 2149 } 2150 }; 2151 2152 Expr.filter.ID = function(elem, match){ 2153 var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); 2154 return elem.nodeType === 1 && node && node.nodeValue === match; 2155 }; 2156 } 2157 2158 root.removeChild( form ); 2159 })(); 2160 2161 (function(){ 2162 // Check to see if the browser returns only elements 2163 // when doing getElementsByTagName("*") 2164 2165 // Create a fake element 2166 var div = document.createElement("div"); 2167 div.appendChild( document.createComment("") ); 2168 2169 // Make sure no comments are found 2170 if ( div.getElementsByTagName("*").length > 0 ) { 2171 Expr.find.TAG = function(match, context){ 2172 var results = context.getElementsByTagName(match[1]); 2173 2174 // Filter out possible comments 2175 if ( match[1] === "*" ) { 2176 var tmp = []; 2177 2178 for ( var i = 0; results[i]; i++ ) { 2179 if ( results[i].nodeType === 1 ) { 2180 tmp.push( results[i] ); 2181 } 2182 } 2183 2184 results = tmp; 2185 } 2186 2187 return results; 2188 }; 2189 } 2190 2191 // Check to see if an attribute returns normalized href attributes 2192 div.innerHTML = "<a href='#'></a>"; 2193 if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && 2194 div.firstChild.getAttribute("href") !== "#" ) { 2195 Expr.attrHandle.href = function(elem){ 2196 return elem.getAttribute("href", 2); 2197 }; 2198 } 2199 })(); 2200 2201 if ( document.querySelectorAll ) (function(){ 2202 var oldSizzle = Sizzle, div = document.createElement("div"); 2203 div.innerHTML = "<p class='TEST'></p>"; 2204 2205 // Safari can't handle uppercase or unicode characters when 2206 // in quirks mode. 2207 if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { 2208 return; 2209 } 2210 2211 Sizzle = function(query, context, extra, seed){ 2212 context = context || document; 2213 2214 // Only use querySelectorAll on non-XML documents 2215 // (ID selectors don't work in non-HTML documents) 2216 if ( !seed && context.nodeType === 9 && !isXML(context) ) { 2217 try { 2218 return makeArray( context.querySelectorAll(query), extra ); 2219 } catch(e){} 2220 } 2221 2222 return oldSizzle(query, context, extra, seed); 2223 }; 2224 2225 Sizzle.find = oldSizzle.find; 2226 Sizzle.filter = oldSizzle.filter; 2227 Sizzle.selectors = oldSizzle.selectors; 2228 Sizzle.matches = oldSizzle.matches; 2229 })(); 2230 2231 if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){ 2232 var div = document.createElement("div"); 2233 div.innerHTML = "<div class='test e'></div><div class='test'></div>"; 2234 2235 // Opera can't find a second classname (in 9.6) 2236 if ( div.getElementsByClassName("e").length === 0 ) 2237 return; 2238 2239 // Safari caches class attributes, doesn't catch changes (in 3.2) 2240 div.lastChild.className = "e"; 2241 2242 if ( div.getElementsByClassName("e").length === 1 ) 2243 return; 2244 2245 Expr.order.splice(1, 0, "CLASS"); 2246 Expr.find.CLASS = function(match, context, isXML) { 2247 if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { 2248 return context.getElementsByClassName(match[1]); 2249 } 2250 }; 2251 })(); 2252 2253 function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { 2254 var sibDir = dir == "previousSibling" && !isXML; 2255 for ( var i = 0, l = checkSet.length; i < l; i++ ) { 2256 var elem = checkSet[i]; 2257 if ( elem ) { 2258 if ( sibDir && elem.nodeType === 1 ){ 2259 elem.sizcache = doneName; 2260 elem.sizset = i; 2261 } 2262 elem = elem[dir]; 2263 var match = false; 2264 2265 while ( elem ) { 2266 if ( elem.sizcache === doneName ) { 2267 match = checkSet[elem.sizset]; 2268 break; 2269 } 2270 2271 if ( elem.nodeType === 1 && !isXML ){ 2272 elem.sizcache = doneName; 2273 elem.sizset = i; 2274 } 2275 2276 if ( elem.nodeName === cur ) { 2277 match = elem; 2278 break; 2279 } 2280 2281 elem = elem[dir]; 2282 } 2283 2284 checkSet[i] = match; 2285 } 2286 } 2287 } 2288 2289 function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { 2290 var sibDir = dir == "previousSibling" && !isXML; 2291 for ( var i = 0, l = checkSet.length; i < l; i++ ) { 2292 var elem = checkSet[i]; 2293 if ( elem ) { 2294 if ( sibDir && elem.nodeType === 1 ) { 2295 elem.sizcache = doneName; 2296 elem.sizset = i; 2297 } 2298 elem = elem[dir]; 2299 var match = false; 2300 2301 while ( elem ) { 2302 if ( elem.sizcache === doneName ) { 2303 match = checkSet[elem.sizset]; 2304 break; 2305 } 2306 2307 if ( elem.nodeType === 1 ) { 2308 if ( !isXML ) { 2309 elem.sizcache = doneName; 2310 elem.sizset = i; 2311 } 2312 if ( typeof cur !== "string" ) { 2313 if ( elem === cur ) { 2314 match = true; 2315 break; 2316 } 2317 2318 } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { 2319 match = elem; 2320 break; 2321 } 2322 } 2323 2324 elem = elem[dir]; 2325 } 2326 2327 checkSet[i] = match; 2328 } 2329 } 2330 } 2331 2332 var contains = document.compareDocumentPosition ? function(a, b){ 2333 return a.compareDocumentPosition(b) & 16; 2334 } : function(a, b){ 2335 return a !== b && (a.contains ? a.contains(b) : true); 2336 }; 2337 2338 var isXML = function(elem){ 2339 return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || 2340 !!elem.ownerDocument && isXML( elem.ownerDocument ); 2341 }; 2342 2343 var posProcess = function(selector, context){ 2344 var tmpSet = [], later = "", match, 2345 root = context.nodeType ? [context] : context; 2346 2347 // Position selectors must be done after the filter 2348 // And so must :not(positional) so we move all PSEUDOs to the end 2349 while ( (match = Expr.match.PSEUDO.exec( selector )) ) { 2350 later += match[0]; 2351 selector = selector.replace( Expr.match.PSEUDO, "" ); 2352 } 2353 2354 selector = Expr.relative[selector] ? selector + "*" : selector; 2355 2356 for ( var i = 0, l = root.length; i < l; i++ ) { 2357 Sizzle( selector, root[i], tmpSet ); 2358 } 2359 2360 return Sizzle.filter( later, tmpSet ); 2361 }; 2362 2363 // EXPOSE 2364 jQuery.find = Sizzle; 2365 jQuery.filter = Sizzle.filter; 2366 jQuery.expr = Sizzle.selectors; 2367 jQuery.expr[":"] = jQuery.expr.filters; 2368 2369 Sizzle.selectors.filters.hidden = function(elem){ 2370 return elem.offsetWidth === 0 || elem.offsetHeight === 0; 2371 }; 2372 2373 Sizzle.selectors.filters.visible = function(elem){ 2374 return elem.offsetWidth > 0 || elem.offsetHeight > 0; 2375 }; 2376 2377 Sizzle.selectors.filters.animated = function(elem){ 2378 return jQuery.grep(jQuery.timers, function(fn){ 2379 return elem === fn.elem; 2380 }).length; 2381 }; 2382 2383 jQuery.multiFilter = function( expr, elems, not ) { 2384 if ( not ) { 2385 expr = ":not(" + expr + ")"; 2386 } 2387 2388 return Sizzle.matches(expr, elems); 2389 }; 2390 2391 jQuery.dir = function( elem, dir ){ 2392 var matched = [], cur = elem[dir]; 2393 while ( cur && cur != document ) { 2394 if ( cur.nodeType == 1 ) 2395 matched.push( cur ); 2396 cur = cur[dir]; 2397 } 2398 return matched; 2399 }; 2400 2401 jQuery.nth = function(cur, result, dir, elem){ 2402 result = result || 1; 2403 var num = 0; 2404 2405 for ( ; cur; cur = cur[dir] ) 2406 if ( cur.nodeType == 1 && ++num == result ) 2407 break; 2408 2409 return cur; 2410 }; 2411 2412 jQuery.sibling = function(n, elem){ 2413 var r = []; 2414 2415 for ( ; n; n = n.nextSibling ) { 2416 if ( n.nodeType == 1 && n != elem ) 2417 r.push( n ); 2418 } 2419 2420 return r; 2421 }; 2422 2423 return; 2424 2425 window.Sizzle = Sizzle; 2426 2427 })(); 2428 /* 2429 * A number of helper functions used for managing events. 2430 * Many of the ideas behind this code originated from 2431 * Dean Edwards' addEvent library. 2432 */ 2433 jQuery.event = { 2434 2435 // Bind an event to an element 2436 // Original by Dean Edwards 2437 add: function(elem, types, handler, data) { 2438 if ( elem.nodeType == 3 || elem.nodeType == 8 ) 2439 return; 2440 2441 // For whatever reason, IE has trouble passing the window object 2442 // around, causing it to be cloned in the process 2443 if ( elem.setInterval && elem != window ) 2444 elem = window; 2445 2446 // Make sure that the function being executed has a unique ID 2447 if ( !handler.guid ) 2448 handler.guid = this.guid++; 2449 2450 // if data is passed, bind to handler 2451 if ( data !== undefined ) { 2452 // Create temporary function pointer to original handler 2453 var fn = handler; 2454 2455 // Create unique handler function, wrapped around original handler 2456 handler = this.proxy( fn ); 2457 2458 // Store data in unique handler 2459 handler.data = data; 2460 } 2461 2462 // Init the element's event structure 2463 var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}), 2464 handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){ 2465 // Handle the second event of a trigger and when 2466 // an event is called after a page has unloaded 2467 return typeof jQuery !== "undefined" && !jQuery.event.triggered ? 2468 jQuery.event.handle.apply(arguments.callee.elem, arguments) : 2469 undefined; 2470 }); 2471 // Add elem as a property of the handle function 2472 // This is to prevent a memory leak with non-native 2473 // event in IE. 2474 handle.elem = elem; 2475 2476 // Handle multiple events separated by a space 2477 // jQuery(...).bind("mouseover mouseout", fn); 2478 jQuery.each(types.split(/\s+/), function(index, type) { 2479 // Namespaced event handlers 2480 var namespaces = type.split("."); 2481 type = namespaces.shift(); 2482 handler.type = namespaces.slice().sort().join("."); 2483 2484 // Get the current list of functions bound to this event 2485 var handlers = events[type]; 2486 2487 if ( jQuery.event.specialAll[type] ) 2488 jQuery.event.specialAll[type].setup.call(elem, data, namespaces); 2489 2490 // Init the event handler queue 2491 if (!handlers) { 2492 handlers = events[type] = {}; 2493 2494 // Check for a special event handler 2495 // Only use addEventListener/attachEvent if the special 2496 // events handler returns false 2497 if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) { 2498 // Bind the global event handler to the element 2499 if (elem.addEventListener) 2500 elem.addEventListener(type, handle, false); 2501 else if (elem.attachEvent) 2502 elem.attachEvent("on" + type, handle); 2503 } 2504 } 2505 2506 // Add the function to the element's handler list 2507 handlers[handler.guid] = handler; 2508 2509 // Keep track of which events have been used, for global triggering 2510 jQuery.event.global[type] = true; 2511 }); 2512 2513 // Nullify elem to prevent memory leaks in IE 2514 elem = null; 2515 }, 2516 2517 guid: 1, 2518 global: {}, 2519 2520 // Detach an event or set of events from an element 2521 remove: function(elem, types, handler) { 2522 // don't do events on text and comment nodes 2523 if ( elem.nodeType == 3 || elem.nodeType == 8 ) 2524 return; 2525 2526 var events = jQuery.data(elem, "events"), ret, index; 2527 2528 if ( events ) { 2529 // Unbind all events for the element 2530 if ( types === undefined || (typeof types === "string" && types.charAt(0) == ".") ) 2531 for ( var type in events ) 2532 this.remove( elem, type + (types || "") ); 2533 else { 2534 // types is actually an event object here 2535 if ( types.type ) { 2536 handler = types.handler; 2537 types = types.type; 2538 } 2539 2540 // Handle multiple events seperated by a space 2541 // jQuery(...).unbind("mouseover mouseout", fn); 2542 jQuery.each(types.split(/\s+/), function(index, type){ 2543 // Namespaced event handlers 2544 var namespaces = type.split("."); 2545 type = namespaces.shift(); 2546 var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)"); 2547 2548 if ( events[type] ) { 2549 // remove the given handler for the given type 2550 if ( handler ) 2551 delete events[type][handler.guid]; 2552 2553 // remove all handlers for the given type 2554 else 2555 for ( var handle in events[type] ) 2556 // Handle the removal of namespaced events 2557 if ( namespace.test(events[type][handle].type) ) 2558 delete events[type][handle]; 2559 2560 if ( jQuery.event.specialAll[type] ) 2561 jQuery.event.specialAll[type].teardown.call(elem, namespaces); 2562 2563 // remove generic event handler if no more handlers exist 2564 for ( ret in events[type] ) break; 2565 if ( !ret ) { 2566 if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem, namespaces) === false ) { 2567 if (elem.removeEventListener) 2568 elem.removeEventListener(type, jQuery.data(elem, "handle"), false); 2569 else if (elem.detachEvent) 2570 elem.detachEvent("on" + type, jQuery.data(elem, "handle")); 2571 } 2572 ret = null; 2573 delete events[type]; 2574 } 2575 } 2576 }); 2577 } 2578 2579 // Remove the expando if it's no longer used 2580 for ( ret in events ) break; 2581 if ( !ret ) { 2582 var handle = jQuery.data( elem, "handle" ); 2583 if ( handle ) handle.elem = null; 2584 jQuery.removeData( elem, "events" ); 2585 jQuery.removeData( elem, "handle" ); 2586 } 2587 } 2588 }, 2589 2590 // bubbling is internal 2591 trigger: function( event, data, elem, bubbling ) { 2592 // Event object or event type 2593 var type = event.type || event; 2594 2595 if( !bubbling ){ 2596 event = typeof event === "object" ? 2597 // jQuery.Event object 2598 event[expando] ? event : 2599 // Object literal 2600 jQuery.extend( jQuery.Event(type), event ) : 2601 // Just the event type (string) 2602 jQuery.Event(type); 2603 2604 if ( type.indexOf("!") >= 0 ) { 2605 event.type = type = type.slice(0, -1); 2606 event.exclusive = true; 2607 } 2608 2609 // Handle a global trigger 2610 if ( !elem ) { 2611 // Don't bubble custom events when global (to avoid too much overhead) 2612 event.stopPropagation(); 2613 // Only trigger if we've ever bound an event for it 2614 if ( this.global[type] ) 2615 jQuery.each( jQuery.cache, function(){ 2616 if ( this.events && this.events[type] ) 2617 jQuery.event.trigger( event, data, this.handle.elem ); 2618 }); 2619 } 2620 2621 // Handle triggering a single element 2622 2623 // don't do events on text and comment nodes 2624 if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 ) 2625 return undefined; 2626 2627 // Clean up in case it is reused 2628 event.result = undefined; 2629 event.target = elem; 2630 2631 // Clone the incoming data, if any 2632 data = jQuery.makeArray(data); 2633 data.unshift( event ); 2634 } 2635 2636 event.currentTarget = elem; 2637 2638 // Trigger the event, it is assumed that "handle" is a function 2639 var handle = jQuery.data(elem, "handle"); 2640 if ( handle ) 2641 handle.apply( elem, data ); 2642 2643 // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links) 2644 if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false ) 2645 event.result = false; 2646 2647 // Trigger the native events (except for clicks on links) 2648 if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) { 2649 this.triggered = true; 2650 try { 2651 elem[ type ](); 2652 // prevent IE from throwing an error for some hidden elements 2653 } catch (e) {} 2654 } 2655 2656 this.triggered = false; 2657 2658 if ( !event.isPropagationStopped() ) { 2659 var parent = elem.parentNode || elem.ownerDocument; 2660 if ( parent ) 2661 jQuery.event.trigger(event, data, parent, true); 2662 } 2663 }, 2664 2665 handle: function(event) { 2666 // returned undefined or false 2667 var all, handlers; 2668 2669 event = arguments[0] = jQuery.event.fix( event || window.event ); 2670 event.currentTarget = this; 2671 2672 // Namespaced event handlers 2673 var namespaces = event.type.split("."); 2674 event.type = namespaces.shift(); 2675 2676 // Cache this now, all = true means, any handler 2677 all = !namespaces.length && !event.exclusive; 2678 2679 var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)"); 2680 2681 handlers = ( jQuery.data(this, "events") || {} )[event.type]; 2682 2683 for ( var j in handlers ) { 2684 var handler = handlers[j]; 2685 2686 // Filter the functions by class 2687 if ( all || namespace.test(handler.type) ) { 2688 // Pass in a reference to the handler function itself 2689 // So that we can later remove it 2690 event.handler = handler; 2691 event.data = handler.data; 2692 2693 var ret = handler.apply(this, arguments); 2694 2695 if( ret !== undefined ){ 2696 event.result = ret; 2697 if ( ret === false ) { 2698 event.preventDefault(); 2699 event.stopPropagation(); 2700 } 2701 } 2702 2703 if( event.isImmediatePropagationStopped() ) 2704 break; 2705 2706 } 2707 } 2708 }, 2709 2710 props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), 2711 2712 fix: function(event) { 2713 if ( event[expando] ) 2714 return event; 2715 2716 // store a copy of the original event object 2717 // and "clone" to set read-only properties 2718 var originalEvent = event; 2719 event = jQuery.Event( originalEvent ); 2720 2721 for ( var i = this.props.length, prop; i; ){ 2722 prop = this.props[ --i ]; 2723 event[ prop ] = originalEvent[ prop ]; 2724 } 2725 2726 // Fix target property, if necessary 2727 if ( !event.target ) 2728 event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either 2729 2730 // check if target is a textnode (safari) 2731 if ( event.target.nodeType == 3 ) 2732 event.target = event.target.parentNode; 2733 2734 // Add relatedTarget, if necessary 2735 if ( !event.relatedTarget && event.fromElement ) 2736 event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement; 2737 2738 // Calculate pageX/Y if missing and clientX/Y available 2739 if ( event.pageX == null && event.clientX != null ) { 2740 var doc = document.documentElement, body = document.body; 2741 event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0); 2742 event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0); 2743 } 2744 2745 // Add which for key events 2746 if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) 2747 event.which = event.charCode || event.keyCode; 2748 2749 // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) 2750 if ( !event.metaKey && event.ctrlKey ) 2751 event.metaKey = event.ctrlKey; 2752 2753 // Add which for click: 1 == left; 2 == middle; 3 == right 2754 // Note: button is not normalized, so don't use it 2755 if ( !event.which && event.button ) 2756 event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); 2757 2758 return event; 2759 }, 2760 2761 proxy: function( fn, proxy ){ 2762 proxy = proxy || function(){ return fn.apply(this, arguments); }; 2763 // Set the guid of unique handler to the same of original handler, so it can be removed 2764 proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++; 2765 // So proxy can be declared as an argument 2766 return proxy; 2767 }, 2768 2769 special: { 2770 ready: { 2771 // Make sure the ready event is setup 2772 setup: bindReady, 2773 teardown: function() {} 2774 } 2775 }, 2776 2777 specialAll: { 2778 live: { 2779 setup: function( selector, namespaces ){ 2780 jQuery.event.add( this, namespaces[0], liveHandler ); 2781 }, 2782 teardown: function( namespaces ){ 2783 if ( namespaces.length ) { 2784 var remove = 0, name = RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)"); 2785 2786 jQuery.each( (jQuery.data(this, "events").live || {}), function(){ 2787 if ( name.test(this.type) ) 2788 remove++; 2789 }); 2790 2791 if ( remove < 1 ) 2792 jQuery.event.remove( this, namespaces[0], liveHandler ); 2793 } 2794 } 2795 } 2796 } 2797 }; 2798 2799 jQuery.Event = function( src ){ 2800 // Allow instantiation without the 'new' keyword 2801 if( !this.preventDefault ) 2802 return new jQuery.Event(src); 2803 2804 // Event object 2805 if( src && src.type ){ 2806 this.originalEvent = src; 2807 this.type = src.type; 2808 // Event type 2809 }else 2810 this.type = src; 2811 2812 // timeStamp is buggy for some events on Firefox(#3843) 2813 // So we won't rely on the native value 2814 this.timeStamp = now(); 2815 2816 // Mark it as fixed 2817 this[expando] = true; 2818 }; 2819 2820 function returnFalse(){ 2821 return false; 2822 } 2823 function returnTrue(){ 2824 return true; 2825 } 2826 2827 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding 2828 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html 2829 jQuery.Event.prototype = { 2830 preventDefault: function() { 2831 this.isDefaultPrevented = returnTrue; 2832 2833 var e = this.originalEvent; 2834 if( !e ) 2835 return; 2836 // if preventDefault exists run it on the original event 2837 if (e.preventDefault) 2838 e.preventDefault(); 2839 // otherwise set the returnValue property of the original event to false (IE) 2840 e.returnValue = false; 2841 }, 2842 stopPropagation: function() { 2843 this.isPropagationStopped = returnTrue; 2844 2845 var e = this.originalEvent; 2846 if( !e ) 2847 return; 2848 // if stopPropagation exists run it on the original event 2849 if (e.stopPropagation) 2850 e.stopPropagation(); 2851 // otherwise set the cancelBubble property of the original event to true (IE) 2852 e.cancelBubble = true; 2853 }, 2854 stopImmediatePropagation:function(){ 2855 this.isImmediatePropagationStopped = returnTrue; 2856 this.stopPropagation(); 2857 }, 2858 isDefaultPrevented: returnFalse, 2859 isPropagationStopped: returnFalse, 2860 isImmediatePropagationStopped: returnFalse 2861 }; 2862 // Checks if an event happened on an element within another element 2863 // Used in jQuery.event.special.mouseenter and mouseleave handlers 2864 var withinElement = function(event) { 2865 // Check if mouse(over|out) are still within the same parent element 2866 var parent = event.relatedTarget; 2867 // Traverse up the tree 2868 while ( parent && parent != this ) 2869 try { parent = parent.parentNode; } 2870 catch(e) { parent = this; } 2871 2872 if( parent != this ){ 2873 // set the correct event type 2874 event.type = event.data; 2875 // handle event if we actually just moused on to a non sub-element 2876 jQuery.event.handle.apply( this, arguments ); 2877 } 2878 }; 2879 2880 jQuery.each({ 2881 mouseover: 'mouseenter', 2882 mouseout: 'mouseleave' 2883 }, function( orig, fix ){ 2884 jQuery.event.special[ fix ] = { 2885 setup: function(){ 2886 jQuery.event.add( this, orig, withinElement, fix ); 2887 }, 2888 teardown: function(){ 2889 jQuery.event.remove( this, orig, withinElement ); 2890 } 2891 }; 2892 }); 2893 2894 jQuery.fn.extend({ 2895 bind: function( type, data, fn ) { 2896 return type == "unload" ? this.one(type, data, fn) : this.each(function(){ 2897 jQuery.event.add( this, type, fn || data, fn && data ); 2898 }); 2899 }, 2900 2901 one: function( type, data, fn ) { 2902 var one = jQuery.event.proxy( fn || data, function(event) { 2903 jQuery(this).unbind(event, one); 2904 return (fn || data).apply( this, arguments ); 2905 }); 2906 return this.each(function(){ 2907 jQuery.event.add( this, type, one, fn && data); 2908 }); 2909 }, 2910 2911 unbind: function( type, fn ) { 2912 return this.each(function(){ 2913 jQuery.event.remove( this, type, fn ); 2914 }); 2915 }, 2916 2917 trigger: function( type, data ) { 2918 return this.each(function(){ 2919 jQuery.event.trigger( type, data, this ); 2920 }); 2921 }, 2922 2923 triggerHandler: function( type, data ) { 2924 if( this[0] ){ 2925 var event = jQuery.Event(type); 2926 event.preventDefault(); 2927 event.stopPropagation(); 2928 jQuery.event.trigger( event, data, this[0] ); 2929 return event.result; 2930 } 2931 }, 2932 2933 toggle: function( fn ) { 2934 // Save reference to arguments for access in closure 2935 var args = arguments, i = 1; 2936 2937 // link all the functions, so any of them can unbind this click handler 2938 while( i < args.length ) 2939 jQuery.event.proxy( fn, args[i++] ); 2940 2941 return this.click( jQuery.event.proxy( fn, function(event) { 2942 // Figure out which function to execute 2943 this.lastToggle = ( this.lastToggle || 0 ) % i; 2944 2945 // Make sure that clicks stop 2946 event.preventDefault(); 2947 2948 // and execute the function 2949 return args[ this.lastToggle++ ].apply( this, arguments ) || false; 2950 })); 2951 }, 2952 2953 hover: function(fnOver, fnOut) { 2954 return this.mouseenter(fnOver).mouseleave(fnOut); 2955 }, 2956 2957 ready: function(fn) { 2958 // Attach the listeners 2959 bindReady(); 2960 2961 // If the DOM is already ready 2962 if ( jQuery.isReady ) 2963 // Execute the function immediately 2964 fn.call( document, jQuery ); 2965 2966 // Otherwise, remember the function for later 2967 else 2968 // Add the function to the wait list 2969 jQuery.readyList.push( fn ); 2970 2971 return this; 2972 }, 2973 2974 live: function( type, fn ){ 2975 var proxy = jQuery.event.proxy( fn ); 2976 proxy.guid += this.selector + type; 2977 2978 jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy ); 2979 2980 return this; 2981 }, 2982 2983 die: function( type, fn ){ 2984 jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null ); 2985 return this; 2986 } 2987 }); 2988 2989 function liveHandler( event ){ 2990 var check = RegExp("(^|\\.)" + event.type + "(\\.|$)"), 2991 stop = true, 2992 elems = []; 2993 2994 jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){ 2995 if ( check.test(fn.type) ) { 2996 var elem = jQuery(event.target).closest(fn.data)[0]; 2997 if ( elem ) 2998 elems.push({ elem: elem, fn: fn }); 2999 } 3000 }); 3001 3002 elems.sort(function(a,b) { 3003 return jQuery.data(a.elem, "closest") - jQuery.data(b.elem, "closest"); 3004 }); 3005 3006 jQuery.each(elems, function(){ 3007 if ( this.fn.call(this.elem, event, this.fn.data) === false ) 3008 return (stop = false); 3009 }); 3010 3011 return stop; 3012 } 3013 3014 function liveConvert(type, selector){ 3015 return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "|")].join("."); 3016 } 3017 3018 jQuery.extend({ 3019 isReady: false, 3020 readyList: [], 3021 // Handle when the DOM is ready 3022 ready: function() { 3023 // Make sure that the DOM is not already loaded 3024 if ( !jQuery.isReady ) { 3025 // Remember that the DOM is ready 3026 jQuery.isReady = true; 3027 3028 // If there are functions bound, to execute 3029 if ( jQuery.readyList ) { 3030 // Execute all of them 3031 jQuery.each( jQuery.readyList, function(){ 3032 this.call( document, jQuery ); 3033 }); 3034 3035 // Reset the list of functions 3036 jQuery.readyList = null; 3037 } 3038 3039 // Trigger any bound ready events 3040 jQuery(document).triggerHandler("ready"); 3041 } 3042 } 3043 }); 3044 3045 var readyBound = false; 3046 3047 function bindReady(){ 3048 if ( readyBound ) return; 3049 readyBound = true; 3050 3051 // Mozilla, Opera and webkit nightlies currently support this event 3052 if ( document.addEventListener ) { 3053 // Use the handy event callback 3054 document.addEventListener( "DOMContentLoaded", function(){ 3055 document.removeEventListener( "DOMContentLoaded", arguments.callee, false ); 3056 jQuery.ready(); 3057 }, false ); 3058 3059 // If IE event model is used 3060 } else if ( document.attachEvent ) { 3061 // ensure firing before onload, 3062 // maybe late but safe also for iframes 3063 document.attachEvent("onreadystatechange", function(){ 3064 if ( document.readyState === "complete" ) { 3065 document.detachEvent( "onreadystatechange", arguments.callee ); 3066 jQuery.ready(); 3067 } 3068 }); 3069 3070 // If IE and not an iframe 3071 // continually check to see if the document is ready 3072 if ( document.documentElement.doScroll && window == window.top ) (function(){ 3073 if ( jQuery.isReady ) return; 3074 3075 try { 3076 // If IE is used, use the trick by Diego Perini 3077 // http://javascript.nwbox.com/IEContentLoaded/ 3078 document.documentElement.doScroll("left"); 3079 } catch( error ) { 3080 setTimeout( arguments.callee, 0 ); 3081 return; 3082 } 3083 3084 // and execute any waiting functions 3085 jQuery.ready(); 3086 })(); 3087 } 3088 3089 // A fallback to window.onload, that will always work 3090 jQuery.event.add( window, "load", jQuery.ready ); 3091 } 3092 3093 jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," + 3094 "mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," + 3095 "change,select,submit,keydown,keypress,keyup,error").split(","), function(i, name){ 3096 3097 // Handle event binding 3098 jQuery.fn[name] = function(fn){ 3099 return fn ? this.bind(name, fn) : this.trigger(name); 3100 }; 3101 }); 3102 3103 // Prevent memory leaks in IE 3104 // And prevent errors on refresh with events like mouseover in other browsers 3105 // Window isn't included so as not to unbind existing unload events 3106 jQuery( window ).bind( 'unload', function(){ 3107 for ( var id in jQuery.cache ) 3108 // Skip the window 3109 if ( id != 1 && jQuery.cache[ id ].handle ) 3110 jQuery.event.remove( jQuery.cache[ id ].handle.elem ); 3111 }); 3112 (function(){ 3113 3114 jQuery.support = {}; 3115 3116 var root = document.documentElement, 3117 script = document.createElement("script"), 3118 div = document.createElement("div"), 3119 id = "script" + (new Date).getTime(); 3120 3121 div.style.display = "none"; 3122 div.innerHTML = ' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>'; 3123 3124 var all = div.getElementsByTagName("*"), 3125 a = div.getElementsByTagName("a")[0]; 3126 3127 // Can't get basic test support 3128 if ( !all || !all.length || !a ) { 3129 return; 3130 } 3131 3132 jQuery.support = { 3133 // IE strips leading whitespace when .innerHTML is used 3134 leadingWhitespace: div.firstChild.nodeType == 3, 3135 3136 // Make sure that tbody elements aren't automatically inserted 3137 // IE will insert them into empty tables 3138 tbody: !div.getElementsByTagName("tbody").length, 3139 3140 // Make sure that you can get all elements in an <object> element 3141 // IE 7 always returns no results 3142 objectAll: !!div.getElementsByTagName("object")[0] 3143 .getElementsByTagName("*").length, 3144 3145 // Make sure that link elements get serialized correctly by innerHTML 3146 // This requires a wrapper element in IE 3147 htmlSerialize: !!div.getElementsByTagName("link").length, 3148 3149 // Get the style information from getAttribute 3150 // (IE uses .cssText insted) 3151 style: /red/.test( a.getAttribute("style") ), 3152 3153 // Make sure that URLs aren't manipulated 3154 // (IE normalizes it by default) 3155 hrefNormalized: a.getAttribute("href") === "/a", 3156 3157 // Make sure that element opacity exists 3158 // (IE uses filter instead) 3159 opacity: a.style.opacity === "0.5", 3160 3161 // Verify style float existence 3162 // (IE uses styleFloat instead of cssFloat) 3163 cssFloat: !!a.style.cssFloat, 3164 3165 // Will be defined later 3166 scriptEval: false, 3167 noCloneEvent: true, 3168 boxModel: null 3169 }; 3170 3171 script.type = "text/javascript"; 3172 try { 3173 script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); 3174 } catch(e){} 3175 3176 root.insertBefore( script, root.firstChild ); 3177 3178 // Make sure that the execution of code works by injecting a script 3179 // tag with appendChild/createTextNode 3180 // (IE doesn't support this, fails, and uses .text instead) 3181 if ( window[ id ] ) { 3182 jQuery.support.scriptEval = true; 3183 delete window[ id ]; 3184 } 3185 3186 root.removeChild( script ); 3187 3188 if ( div.attachEvent && div.fireEvent ) { 3189 div.attachEvent("onclick", function(){ 3190 // Cloning a node shouldn't copy over any 3191 // bound event handlers (IE does this) 3192 jQuery.support.noCloneEvent = false; 3193 div.detachEvent("onclick", arguments.callee); 3194 }); 3195 div.cloneNode(true).fireEvent("onclick"); 3196 } 3197 3198 // Figure out if the W3C box model works as expected 3199 // document.body must exist before we can do this 3200 jQuery(function(){ 3201 var div = document.createElement("div"); 3202 div.style.width = div.style.paddingLeft = "1px"; 3203 3204 document.body.appendChild( div ); 3205 jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; 3206 document.body.removeChild( div ).style.display = 'none'; 3207 }); 3208 })(); 3209 3210 var styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat"; 3211 3212 jQuery.props = { 3213 "for": "htmlFor", 3214 "class": "className", 3215 "float": styleFloat, 3216 cssFloat: styleFloat, 3217 styleFloat: styleFloat, 3218 readonly: "readOnly", 3219 maxlength: "maxLength", 3220 cellspacing: "cellSpacing", 3221 rowspan: "rowSpan", 3222 tabindex: "tabIndex" 3223 }; 3224 jQuery.fn.extend({ 3225 // Keep a copy of the old load 3226 _load: jQuery.fn.load, 3227 3228 load: function( url, params, callback ) { 3229 if ( typeof url !== "string" ) 3230 return this._load( url ); 3231 3232 var off = url.indexOf(" "); 3233 if ( off >= 0 ) { 3234 var selector = url.slice(off, url.length); 3235 url = url.slice(0, off); 3236 } 3237 3238 // Default to a GET request 3239 var type = "GET"; 3240 3241 // If the second parameter was provided 3242 if ( params ) 3243 // If it's a function 3244 if ( jQuery.isFunction( params ) ) { 3245 // We assume that it's the callback 3246 callback = params; 3247 params = null; 3248 3249 // Otherwise, build a param string 3250 } else if( typeof params === "object" ) { 3251 params = jQuery.param( params ); 3252 type = "POST"; 3253 } 3254 3255 var self = this; 3256 3257 // Request the remote document 3258 jQuery.ajax({ 3259 url: url, 3260 type: type, 3261 dataType: "html", 3262 data: params, 3263 complete: function(res, status){ 3264 // If successful, inject the HTML into all the matched elements 3265 if ( status == "success" || status == "notmodified" ) 3266 // See if a selector was specified 3267 self.html( selector ? 3268 // Create a dummy div to hold the results 3269 jQuery("<div/>") 3270 // inject the contents of the document in, removing the scripts 3271 // to avoid any 'Permission Denied' errors in IE 3272 .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, "")) 3273 3274 // Locate the specified elements 3275 .find(selector) : 3276 3277 // If not, just inject the full result 3278 res.responseText ); 3279 3280 if( callback ) 3281 self.each( callback, [res.responseText, status, res] ); 3282 } 3283 }); 3284 return this; 3285 }, 3286 3287 serialize: function() { 3288 return jQuery.param(this.serializeArray()); 3289 }, 3290 serializeArray: function() { 3291 return this.map(function(){ 3292 return this.elements ? jQuery.makeArray(this.elements) : this; 3293 }) 3294 .filter(function(){ 3295 return this.name && !this.disabled && 3296 (this.checked || /select|textarea/i.test(this.nodeName) || 3297 /text|hidden|password|search/i.test(this.type)); 3298 }) 3299 .map(function(i, elem){ 3300 var val = jQuery(this).val(); 3301 return val == null ? null : 3302 jQuery.isArray(val) ? 3303 jQuery.map( val, function(val, i){ 3304 return {name: elem.name, value: val}; 3305 }) : 3306 {name: elem.name, value: val}; 3307 }).get(); 3308 } 3309 }); 3310 3311 // Attach a bunch of functions for handling common AJAX events 3312 jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){ 3313 jQuery.fn[o] = function(f){ 3314 return this.bind(o, f); 3315 }; 3316 }); 3317 3318 var jsc = now(); 3319 3320 jQuery.extend({ 3321 3322 get: function( url, data, callback, type ) { 3323 // shift arguments if data argument was ommited 3324 if ( jQuery.isFunction( data ) ) { 3325 callback = data; 3326 data = null; 3327 } 3328 3329 return jQuery.ajax({ 3330 type: "GET", 3331 url: url, 3332 data: data, 3333 success: callback, 3334 dataType: type 3335 }); 3336 }, 3337 3338 getScript: function( url, callback ) { 3339 return jQuery.get(url, null, callback, "script"); 3340 }, 3341 3342 getJSON: function( url, data, callback ) { 3343 return jQuery.get(url, data, callback, "json"); 3344 }, 3345 3346 post: function( url, data, callback, type ) { 3347 if ( jQuery.isFunction( data ) ) { 3348 callback = data; 3349 data = {}; 3350 } 3351 3352 return jQuery.ajax({ 3353 type: "POST", 3354 url: url, 3355 data: data, 3356 success: callback, 3357 dataType: type 3358 }); 3359 }, 3360 3361 ajaxSetup: function( settings ) { 3362 jQuery.extend( jQuery.ajaxSettings, settings ); 3363 }, 3364 3365 ajaxSettings: { 3366 url: location.href, 3367 global: true, 3368 type: "GET", 3369 contentType: "application/x-www-form-urlencoded", 3370 processData: true, 3371 async: true, 3372 /* 3373 timeout: 0, 3374 data: null, 3375 username: null, 3376 password: null, 3377 */ 3378 // Create the request object; Microsoft failed to properly 3379 // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available 3380 // This function can be overriden by calling jQuery.ajaxSetup 3381 xhr:function(){ 3382 return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(); 3383 }, 3384 accepts: { 3385 xml: "application/xml, text/xml", 3386 html: "text/html", 3387 script: "text/javascript, application/javascript", 3388 json: "application/json, text/javascript", 3389 text: "text/plain", 3390 _default: "*/*" 3391 } 3392 }, 3393 3394 // Last-Modified header cache for next request 3395 lastModified: {}, 3396 3397 ajax: function( s ) { 3398 // Extend the settings, but re-extend 's' so that it can be 3399 // checked again later (in the test suite, specifically) 3400 s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s)); 3401 3402 var jsonp, jsre = /=\?(&|$)/g, status, data, 3403 type = s.type.toUpperCase(); 3404 3405 // convert data if not already a string 3406 if ( s.data && s.processData && typeof s.data !== "string" ) 3407 s.data = jQuery.param(s.data); 3408 3409 // Handle JSONP Parameter Callbacks 3410 if ( s.dataType == "jsonp" ) { 3411 if ( type == "GET" ) { 3412 if ( !s.url.match(jsre) ) 3413 s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?"; 3414 } else if ( !s.data || !s.data.match(jsre) ) 3415 s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?"; 3416 s.dataType = "json"; 3417 } 3418 3419 // Build temporary JSONP function 3420 if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) { 3421 jsonp = "jsonp" + jsc++; 3422 3423 // Replace the =? sequence both in the query string and the data 3424 if ( s.data ) 3425 s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1"); 3426 s.url = s.url.replace(jsre, "=" + jsonp + "$1"); 3427 3428 // We need to make sure 3429 // that a JSONP style response is executed properly 3430 s.dataType = "script"; 3431 3432 // Handle JSONP-style loading 3433 window[ jsonp ] = function(tmp){ 3434 data = tmp; 3435 success(); 3436 complete(); 3437 // Garbage collect 3438 window[ jsonp ] = undefined; 3439 try{ delete window[ jsonp ]; } catch(e){} 3440 if ( head ) 3441 head.removeChild( script ); 3442 }; 3443 } 3444 3445 if ( s.dataType == "script" && s.cache == null ) 3446 s.cache = false; 3447 3448 if ( s.cache === false && type == "GET" ) { 3449 var ts = now(); 3450 // try replacing _= if it is there 3451 var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2"); 3452 // if nothing was replaced, add timestamp to the end 3453 s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : ""); 3454 } 3455 3456 // If data is available, append data to url for get requests 3457 if ( s.data && type == "GET" ) { 3458 s.url += (s.url.match(/\?/) ? "&" : "?") + s.data; 3459 3460 // IE likes to send both get and post data, prevent this 3461 s.data = null; 3462 } 3463 3464 // Watch for a new set of requests 3465 if ( s.global && ! jQuery.active++ ) 3466 jQuery.event.trigger( "ajaxStart" ); 3467 3468 // Matches an absolute URL, and saves the domain 3469 var parts = /^(\w+:)?\/\/([^\/?#]+)/.exec( s.url ); 3470 3471 // If we're requesting a remote document 3472 // and trying to load JSON or Script with a GET 3473 if ( s.dataType == "script" && type == "GET" && parts 3474 && ( parts[1] && parts[1] != location.protocol || parts[2] != location.host )){ 3475 3476 var head = document.getElementsByTagName("head")[0]; 3477 var script = document.createElement("script"); 3478 script.src = s.url; 3479 if (s.scriptCharset) 3480 script.charset = s.scriptCharset; 3481 3482 // Handle Script loading 3483 if ( !jsonp ) { 3484 var done = false; 3485 3486 // Attach handlers for all browsers 3487 script.onload = script.onreadystatechange = function(){ 3488 if ( !done && (!this.readyState || 3489 this.readyState == "loaded" || this.readyState == "complete") ) { 3490 done = true; 3491 success(); 3492 complete(); 3493 3494 // Handle memory leak in IE 3495 script.onload = script.onreadystatechange = null; 3496 head.removeChild( script ); 3497 } 3498 }; 3499 } 3500 3501 head.appendChild(script); 3502 3503 // We handle everything using the script element injection 3504 return undefined; 3505 } 3506 3507 var requestDone = false; 3508 3509 // Create the request object 3510 var xhr = s.xhr(); 3511 3512 // Open the socket 3513 // Passing null username, generates a login popup on Opera (#2865) 3514 if( s.username ) 3515 xhr.open(type, s.url, s.async, s.username, s.password); 3516 else 3517 xhr.open(type, s.url, s.async); 3518 3519 // Need an extra try/catch for cross domain requests in Firefox 3 3520 try { 3521 // Set the correct header, if data is being sent 3522 if ( s.data ) 3523 xhr.setRequestHeader("Content-Type", s.contentType); 3524 3525 // Set the If-Modified-Since header, if ifModified mode. 3526 if ( s.ifModified ) 3527 xhr.setRequestHeader("If-Modified-Since", 3528 jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" ); 3529 3530 // Set header so the called script knows that it's an XMLHttpRequest 3531 xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 3532 3533 // Set the Accepts header for the server, depending on the dataType 3534 xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ? 3535 s.accepts[ s.dataType ] + ", */*" : 3536 s.accepts._default ); 3537 } catch(e){} 3538 3539 // Allow custom headers/mimetypes and early abort 3540 if ( s.beforeSend && s.beforeSend(xhr, s) === false ) { 3541 // Handle the global AJAX counter 3542 if ( s.global && ! --jQuery.active ) 3543 jQuery.event.trigger( "ajaxStop" ); 3544 // close opended socket 3545 xhr.abort(); 3546 return false; 3547 } 3548 3549 if ( s.global ) 3550 jQuery.event.trigger("ajaxSend", [xhr, s]); 3551 3552 // Wait for a response to come back 3553 var onreadystatechange = function(isTimeout){ 3554 // The request was aborted, clear the interval and decrement jQuery.active 3555 if (xhr.readyState == 0) { 3556 if (ival) { 3557 // clear poll interval 3558 clearInterval(ival); 3559 ival = null; 3560 // Handle the global AJAX counter 3561 if ( s.global && ! --jQuery.active ) 3562 jQuery.event.trigger( "ajaxStop" ); 3563 } 3564 // The transfer is complete and the data is available, or the request timed out 3565 } else if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) { 3566 requestDone = true; 3567 3568 // clear poll interval 3569 if (ival) { 3570 clearInterval(ival); 3571 ival = null; 3572 } 3573 3574 status = isTimeout == "timeout" ? "timeout" : 3575 !jQuery.httpSuccess( xhr ) ? "error" : 3576 s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? "notmodified" : 3577 "success"; 3578 3579 if ( status == "success" ) { 3580 // Watch for, and catch, XML document parse errors 3581 try { 3582 // process the data (runs the xml through httpData regardless of callback) 3583 data = jQuery.httpData( xhr, s.dataType, s ); 3584 } catch(e) { 3585 status = "parsererror"; 3586 } 3587 } 3588 3589 // Make sure that the request was successful or notmodified 3590 if ( status == "success" ) { 3591 // Cache Last-Modified header, if ifModified mode. 3592 var modRes; 3593 try { 3594 modRes = xhr.getResponseHeader("Last-Modified"); 3595 } catch(e) {} // swallow exception thrown by FF if header is not available 3596 3597 if ( s.ifModified && modRes ) 3598 jQuery.lastModified[s.url] = modRes; 3599 3600 // JSONP handles its own success callback 3601 if ( !jsonp ) 3602 success(); 3603 } else 3604 jQuery.handleError(s, xhr, status); 3605 3606 // Fire the complete handlers 3607 complete(); 3608 3609 if ( isTimeout ) 3610 xhr.abort(); 3611 3612 // Stop memory leaks 3613 if ( s.async ) 3614 xhr = null; 3615 } 3616 }; 3617 3618 if ( s.async ) { 3619 // don't attach the handler to the request, just poll it instead 3620 var ival = setInterval(onreadystatechange, 13); 3621 3622 // Timeout checker 3623 if ( s.timeout > 0 ) 3624 setTimeout(function(){ 3625 // Check to see if the request is still happening 3626 if ( xhr && !requestDone ) 3627 onreadystatechange( "timeout" ); 3628 }, s.timeout); 3629 } 3630 3631 // Send the data 3632 try { 3633 xhr.send(s.data); 3634 } catch(e) { 3635 jQuery.handleError(s, xhr, null, e); 3636 } 3637 3638 // firefox 1.5 doesn't fire statechange for sync requests 3639 if ( !s.async ) 3640 onreadystatechange(); 3641 3642 function success(){ 3643 // If a local callback was specified, fire it and pass it the data 3644 if ( s.success ) 3645 s.success( data, status ); 3646 3647 // Fire the global callback 3648 if ( s.global ) 3649 jQuery.event.trigger( "ajaxSuccess", [xhr, s] ); 3650 } 3651 3652 function complete(){ 3653 // Process result 3654 if ( s.complete ) 3655 s.complete(xhr, status); 3656 3657 // The request was completed 3658 if ( s.global ) 3659 jQuery.event.trigger( "ajaxComplete", [xhr, s] ); 3660 3661 // Handle the global AJAX counter 3662 if ( s.global && ! --jQuery.active ) 3663 jQuery.event.trigger( "ajaxStop" ); 3664 } 3665 3666 // return XMLHttpRequest to allow aborting the request etc. 3667 return xhr; 3668 }, 3669 3670 handleError: function( s, xhr, status, e ) { 3671 // If a local callback was specified, fire it 3672 if ( s.error ) s.error( xhr, status, e ); 3673 3674 // Fire the global callback 3675 if ( s.global ) 3676 jQuery.event.trigger( "ajaxError", [xhr, s, e] ); 3677 }, 3678 3679 // Counter for holding the number of active queries 3680 active: 0, 3681 3682 // Determines if an XMLHttpRequest was successful or not 3683 httpSuccess: function( xhr ) { 3684 try { 3685 // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450 3686 return !xhr.status && location.protocol == "file:" || 3687 ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223; 3688 } catch(e){} 3689 return false; 3690 }, 3691 3692 // Determines if an XMLHttpRequest returns NotModified 3693 httpNotModified: function( xhr, url ) { 3694 try { 3695 var xhrRes = xhr.getResponseHeader("Last-Modified"); 3696 3697 // Firefox always returns 200. check Last-Modified date 3698 return xhr.status == 304 || xhrRes == jQuery.lastModified[url]; 3699 } catch(e){} 3700 return false; 3701 }, 3702 3703 httpData: function( xhr, type, s ) { 3704 var ct = xhr.getResponseHeader("content-type"), 3705 xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0, 3706 data = xml ? xhr.responseXML : xhr.responseText; 3707 3708 if ( xml && data.documentElement.tagName == "parsererror" ) 3709 throw "parsererror"; 3710 3711 // Allow a pre-filtering function to sanitize the response 3712 // s != null is checked to keep backwards compatibility 3713 if( s && s.dataFilter ) 3714 data = s.dataFilter( data, type ); 3715 3716 // The filter can actually parse the response 3717 if( typeof data === "string" ){ 3718 3719 // If the type is "script", eval it in global context 3720 if ( type == "script" ) 3721 jQuery.globalEval( data ); 3722 3723 // Get the JavaScript object, if JSON is used. 3724 if ( type == "json" ) 3725 data = window["eval"]("(" + data + ")"); 3726 } 3727 3728 return data; 3729 }, 3730 3731 // Serialize an array of form elements or a set of 3732 // key/values into a query string 3733 param: function( a ) { 3734 var s = [ ]; 3735 3736 function add( key, value ){ 3737 s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value); 3738 }; 3739 3740 // If an array was passed in, assume that it is an array 3741 // of form elements 3742 if ( jQuery.isArray(a) || a.jquery ) 3743 // Serialize the form elements 3744 jQuery.each( a, function(){ 3745 add( this.name, this.value ); 3746 }); 3747 3748 // Otherwise, assume that it's an object of key/value pairs 3749 else 3750 // Serialize the key/values 3751 for ( var j in a ) 3752 // If the value is an array then the key names need to be repeated 3753 if ( jQuery.isArray(a[j]) ) 3754 jQuery.each( a[j], function(){ 3755 add( j, this ); 3756 }); 3757 else 3758 add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] ); 3759 3760 // Return the resulting serialization 3761 return s.join("&").replace(/%20/g, "+"); 3762 } 3763 3764 }); 3765 var elemdisplay = {}, 3766 timerId, 3767 fxAttrs = [ 3768 // height animations 3769 [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ], 3770 // width animations 3771 [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ], 3772 // opacity animations 3773 [ "opacity" ] 3774 ]; 3775 3776 function genFx( type, num ){ 3777 var obj = {}; 3778 jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function(){ 3779 obj[ this ] = type; 3780 }); 3781 return obj; 3782 } 3783 3784 jQuery.fn.extend({ 3785 show: function(speed,callback){ 3786 if ( speed ) { 3787 return this.animate( genFx("show", 3), speed, callback); 3788 } else { 3789 for ( var i = 0, l = this.length; i < l; i++ ){ 3790 var old = jQuery.data(this[i], "olddisplay"); 3791 3792 this[i].style.display = old || ""; 3793 3794 if ( jQuery.css(this[i], "display") === "none" ) { 3795 var tagName = this[i].tagName, display; 3796 3797 if ( elemdisplay[ tagName ] ) { 3798 display = elemdisplay[ tagName ]; 3799 } else { 3800 var elem = jQuery("<" + tagName + " />").appendTo("body"); 3801 3802 display = elem.css("display"); 3803 if ( display === "none" ) 3804 display = "block"; 3805 3806 elem.remove(); 3807 3808 elemdisplay[ tagName ] = display; 3809 } 3810 3811 jQuery.data(this[i], "olddisplay", display); 3812 } 3813 } 3814 3815 // Set the display of the elements in a second loop 3816 // to avoid the constant reflow 3817 for ( var i = 0, l = this.length; i < l; i++ ){ 3818 this[i].style.display = jQuery.data(this[i], "olddisplay") || ""; 3819 } 3820 3821 return this; 3822 } 3823 }, 3824 3825 hide: function(speed,callback){ 3826 if ( speed ) { 3827 return this.animate( genFx("hide", 3), speed, callback); 3828 } else { 3829 for ( var i = 0, l = this.length; i < l; i++ ){ 3830 var old = jQuery.data(this[i], "olddisplay"); 3831 if ( !old && old !== "none" ) 3832 jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display")); 3833 } 3834 3835 // Set the display of the elements in a second loop 3836 // to avoid the constant reflow 3837 for ( var i = 0, l = this.length; i < l; i++ ){ 3838 this[i].style.display = "none"; 3839 } 3840 3841 return this; 3842 } 3843 }, 3844 3845 // Save the old toggle function 3846 _toggle: jQuery.fn.toggle, 3847 3848 toggle: function( fn, fn2 ){ 3849 var bool = typeof fn === "boolean"; 3850 3851 return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ? 3852 this._toggle.apply( this, arguments ) : 3853 fn == null || bool ? 3854 this.each(function(){ 3855 var state = bool ? fn : jQuery(this).is(":hidden"); 3856 jQuery(this)[ state ? "show" : "hide" ](); 3857 }) : 3858 this.animate(genFx("toggle", 3), fn, fn2); 3859 }, 3860 3861 fadeTo: function(speed,to,callback){ 3862 return this.animate({opacity: to}, speed, callback); 3863 }, 3864 3865 animate: function( prop, speed, easing, callback ) { 3866 var optall = jQuery.speed(speed, easing, callback); 3867 3868 return this[ optall.queue === false ? "each" : "queue" ](function(){ 3869 3870 var opt = jQuery.extend({}, optall), p, 3871 hidden = this.nodeType == 1 && jQuery(this).is(":hidden"), 3872 self = this; 3873 3874 for ( p in prop ) { 3875 if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden ) 3876 return opt.complete.call(this); 3877 3878 if ( ( p == "height" || p == "width" ) && this.style ) { 3879 // Store display property 3880 opt.display = jQuery.css(this, "display"); 3881 3882 // Make sure that nothing sneaks out 3883 opt.overflow = this.style.overflow; 3884 } 3885 } 3886 3887 if ( opt.overflow != null ) 3888 this.style.overflow = "hidden"; 3889 3890 opt.curAnim = jQuery.extend({}, prop); 3891 3892 jQuery.each( prop, function(name, val){ 3893 var e = new jQuery.fx( self, opt, name ); 3894 3895 if ( /toggle|show|hide/.test(val) ) 3896 e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop ); 3897 else { 3898 var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/), 3899 start = e.cur(true) || 0; 3900 3901 if ( parts ) { 3902 var end = parseFloat(parts[2]), 3903 unit = parts[3] || "px"; 3904 3905 // We need to compute starting value 3906 if ( unit != "px" ) { 3907 self.style[ name ] = (end || 1) + unit; 3908 start = ((end || 1) / e.cur(true)) * start; 3909 self.style[ name ] = start + unit; 3910 } 3911 3912 // If a +=/-= token was provided, we're doing a relative animation 3913 if ( parts[1] ) 3914 end = ((parts[1] == "-=" ? -1 : 1) * end) + start; 3915 3916 e.custom( start, end, unit ); 3917 } else 3918 e.custom( start, val, "" ); 3919 } 3920 }); 3921 3922 // For JS strict compliance 3923 return true; 3924 }); 3925 }, 3926 3927 stop: function(clearQueue, gotoEnd){ 3928 var timers = jQuery.timers; 3929 3930 if (clearQueue) 3931 this.queue([]); 3932 3933 this.each(function(){ 3934 // go in reverse order so anything added to the queue during the loop is ignored 3935 for ( var i = timers.length - 1; i >= 0; i-- ) 3936 if ( timers[i].elem == this ) { 3937 if (gotoEnd) 3938 // force the next step to be the last 3939 timers[i](true); 3940 timers.splice(i, 1); 3941 } 3942 }); 3943 3944 // start the next in the queue if the last step wasn't forced 3945 if (!gotoEnd) 3946 this.dequeue(); 3947 3948 return this; 3949 } 3950 3951 }); 3952 3953 // Generate shortcuts for custom animations 3954 jQuery.each({ 3955 slideDown: genFx("show", 1), 3956 slideUp: genFx("hide", 1), 3957 slideToggle: genFx("toggle", 1), 3958 fadeIn: { opacity: "show" }, 3959 fadeOut: { opacity: "hide" } 3960 }, function( name, props ){ 3961 jQuery.fn[ name ] = function( speed, callback ){ 3962 return this.animate( props, speed, callback ); 3963 }; 3964 }); 3965 3966 jQuery.extend({ 3967 3968 speed: function(speed, easing, fn) { 3969 var opt = typeof speed === "object" ? speed : { 3970 complete: fn || !fn && easing || 3971 jQuery.isFunction( speed ) && speed, 3972 duration: speed, 3973 easing: fn && easing || easing && !jQuery.isFunction(easing) && easing 3974 }; 3975 3976 opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : 3977 jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default; 3978 3979 // Queueing 3980 opt.old = opt.complete; 3981 opt.complete = function(){ 3982 if ( opt.queue !== false ) 3983 jQuery(this).dequeue(); 3984 if ( jQuery.isFunction( opt.old ) ) 3985 opt.old.call( this ); 3986 }; 3987 3988 return opt; 3989 }, 3990 3991 easing: { 3992 linear: function( p, n, firstNum, diff ) { 3993 return firstNum + diff * p; 3994 }, 3995 swing: function( p, n, firstNum, diff ) { 3996 return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum; 3997 } 3998 }, 3999 4000 timers: [], 4001 4002 fx: function( elem, options, prop ){ 4003 this.options = options; 4004 this.elem = elem; 4005 this.prop = prop; 4006 4007 if ( !options.orig ) 4008 options.orig = {}; 4009 } 4010 4011 }); 4012 4013 jQuery.fx.prototype = { 4014 4015 // Simple function for setting a style value 4016 update: function(){ 4017 if ( this.options.step ) 4018 this.options.step.call( this.elem, this.now, this ); 4019 4020 (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this ); 4021 4022 // Set display property to block for height/width animations 4023 if ( ( this.prop == "height" || this.prop == "width" ) && this.elem.style ) 4024 this.elem.style.display = "block"; 4025 }, 4026 4027 // Get the current size 4028 cur: function(force){ 4029 if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) 4030 return this.elem[ this.prop ]; 4031 4032 var r = parseFloat(jQuery.css(this.elem, this.prop, force)); 4033 return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0; 4034 }, 4035 4036 // Start an animation from one number to another 4037 custom: function(from, to, unit){ 4038 this.startTime = now(); 4039 this.start = from; 4040 this.end = to; 4041 this.unit = unit || this.unit || "px"; 4042 this.now = this.start; 4043 this.pos = this.state = 0; 4044 4045 var self = this; 4046 function t(gotoEnd){ 4047 return self.step(gotoEnd); 4048 } 4049 4050 t.elem = this.elem; 4051 4052 if ( t() && jQuery.timers.push(t) && !timerId ) { 4053 timerId = setInterval(function(){ 4054 var timers = jQuery.timers; 4055 4056 for ( var i = 0; i < timers.length; i++ ) 4057 if ( !timers[i]() ) 4058 timers.splice(i--, 1); 4059 4060 if ( !timers.length ) { 4061 clearInterval( timerId ); 4062 timerId = undefined; 4063 } 4064 }, 13); 4065 } 4066 }, 4067 4068 // Simple 'show' function 4069 show: function(){ 4070 // Remember where we started, so that we can go back to it later 4071 this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop ); 4072 this.options.show = true; 4073 4074 // Begin the animation 4075 // Make sure that we start at a small width/height to avoid any 4076 // flash of content 4077 this.custom(this.prop == "width" || this.prop == "height" ? 1 : 0, this.cur()); 4078 4079 // Start by showing the element 4080 jQuery(this.elem).show(); 4081 }, 4082 4083 // Simple 'hide' function 4084 hide: function(){ 4085 // Remember where we started, so that we can go back to it later 4086 this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop ); 4087 this.options.hide = true; 4088 4089 // Begin the animation 4090 this.custom(this.cur(), 0); 4091 }, 4092 4093 // Each step of an animation 4094 step: function(gotoEnd){ 4095 var t = now(); 4096 4097 if ( gotoEnd || t >= this.options.duration + this.startTime ) { 4098 this.now = this.end; 4099 this.pos = this.state = 1; 4100 this.update(); 4101 4102 this.options.curAnim[ this.prop ] = true; 4103 4104 var done = true; 4105 for ( var i in this.options.curAnim ) 4106 if ( this.options.curAnim[i] !== true ) 4107 done = false; 4108 4109 if ( done ) { 4110 if ( this.options.display != null ) { 4111 // Reset the overflow 4112 this.elem.style.overflow = this.options.overflow; 4113 4114 // Reset the display 4115 this.elem.style.display = this.options.display; 4116 if ( jQuery.css(this.elem, "display") == "none" ) 4117 this.elem.style.display = "block"; 4118 } 4119 4120 // Hide the element if the "hide" operation was done 4121 if ( this.options.hide ) 4122 jQuery(this.elem).hide(); 4123 4124 // Reset the properties, if the item has been hidden or shown 4125 if ( this.options.hide || this.options.show ) 4126 for ( var p in this.options.curAnim ) 4127 jQuery.attr(this.elem.style, p, this.options.orig[p]); 4128 4129 // Execute the complete function 4130 this.options.complete.call( this.elem ); 4131 } 4132 4133 return false; 4134 } else { 4135 var n = t - this.startTime; 4136 this.state = n / this.options.duration; 4137 4138 // Perform the easing function, defaults to swing 4139 this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration); 4140 this.now = this.start + ((this.end - this.start) * this.pos); 4141 4142 // Perform the next step of the animation 4143 this.update(); 4144 } 4145 4146 return true; 4147 } 4148 4149 }; 4150 4151 jQuery.extend( jQuery.fx, { 4152 speeds:{ 4153 slow: 600, 4154 fast: 200, 4155 // Default speed 4156 _default: 400 4157 }, 4158 step: { 4159 4160 opacity: function(fx){ 4161 jQuery.attr(fx.elem.style, "opacity", fx.now); 4162 }, 4163 4164 _default: function(fx){ 4165 if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) 4166 fx.elem.style[ fx.prop ] = fx.now + fx.unit; 4167 else 4168 fx.elem[ fx.prop ] = fx.now; 4169 } 4170 } 4171 }); 4172 if ( document.documentElement["getBoundingClientRect"] ) 4173 jQuery.fn.offset = function() { 4174 if ( !this[0] ) return { top: 0, left: 0 }; 4175 if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] ); 4176 var box = this[0].getBoundingClientRect(), doc = this[0].ownerDocument, body = doc.body, docElem = doc.documentElement, 4177 clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, 4178 top = box.top + (self.pageYOffset || jQuery.boxModel && docElem.scrollTop || body.scrollTop ) - clientTop, 4179 left = box.left + (self.pageXOffset || jQuery.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft; 4180 return { top: top, left: left }; 4181 }; 4182 else 4183 jQuery.fn.offset = function() { 4184 if ( !this[0] ) return { top: 0, left: 0 }; 4185 if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] ); 4186 jQuery.offset.initialized || jQuery.offset.initialize(); 4187 4188 var elem = this[0], offsetParent = elem.offsetParent, prevOffsetParent = elem, 4189 doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement, 4190 body = doc.body, defaultView = doc.defaultView, 4191 prevComputedStyle = defaultView.getComputedStyle(elem, null), 4192 top = elem.offsetTop, left = elem.offsetLeft; 4193 4194 while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) { 4195 computedStyle = defaultView.getComputedStyle(elem, null); 4196 top -= elem.scrollTop, left -= elem.scrollLeft; 4197 if ( elem === offsetParent ) { 4198 top += elem.offsetTop, left += elem.offsetLeft; 4199 if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.tagName)) ) 4200 top += parseInt( computedStyle.borderTopWidth, 10) || 0, 4201 left += parseInt( computedStyle.borderLeftWidth, 10) || 0; 4202 prevOffsetParent = offsetParent, offsetParent = elem.offsetParent; 4203 } 4204 if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) 4205 top += parseInt( computedStyle.borderTopWidth, 10) || 0, 4206 left += parseInt( computedStyle.borderLeftWidth, 10) || 0; 4207 prevComputedStyle = computedStyle; 4208 } 4209 4210 if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) 4211 top += body.offsetTop, 4212 left += body.offsetLeft; 4213 4214 if ( prevComputedStyle.position === "fixed" ) 4215 top += Math.max(docElem.scrollTop, body.scrollTop), 4216 left += Math.max(docElem.scrollLeft, body.scrollLeft); 4217 4218 return { top: top, left: left }; 4219 }; 4220 4221 jQuery.offset = { 4222 initialize: function() { 4223 if ( this.initialized ) return; 4224 var body = document.body, container = document.createElement('div'), innerDiv, checkDiv, table, td, rules, prop, bodyMarginTop = body.style.marginTop, 4225 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>'; 4226 4227 rules = { position: 'absolute', top: 0, left: 0, margin: 0, border: 0, width: '1px', height: '1px', visibility: 'hidden' }; 4228 for ( prop in rules ) container.style[prop] = rules[prop]; 4229 4230 container.innerHTML = html; 4231 body.insertBefore(container, body.firstChild); 4232 innerDiv = container.firstChild, checkDiv = innerDiv.firstChild, td = innerDiv.nextSibling.firstChild.firstChild; 4233 4234 this.doesNotAddBorder = (checkDiv.offsetTop !== 5); 4235 this.doesAddBorderForTableAndCells = (td.offsetTop === 5); 4236 4237 innerDiv.style.overflow = 'hidden', innerDiv.style.position = 'relative'; 4238 this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5); 4239 4240 body.style.marginTop = '1px'; 4241 this.doesNotIncludeMarginInBodyOffset = (body.offsetTop === 0); 4242 body.style.marginTop = bodyMarginTop; 4243 4244 body.removeChild(container); 4245 this.initialized = true; 4246 }, 4247 4248 bodyOffset: function(body) { 4249 jQuery.offset.initialized || jQuery.offset.initialize(); 4250 var top = body.offsetTop, left = body.offsetLeft; 4251 if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) 4252 top += parseInt( jQuery.curCSS(body, 'marginTop', true), 10 ) || 0, 4253 left += parseInt( jQuery.curCSS(body, 'marginLeft', true), 10 ) || 0; 4254 return { top: top, left: left }; 4255 } 4256 }; 4257 4258 4259 jQuery.fn.extend({ 4260 position: function() { 4261 var left = 0, top = 0, results; 4262 4263 if ( this[0] ) { 4264 // Get *real* offsetParent 4265 var offsetParent = this.offsetParent(), 4266 4267 // Get correct offsets 4268 offset = this.offset(), 4269 parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset(); 4270 4271 // Subtract element margins 4272 // note: when an element has margin: auto the offsetLeft and marginLeft 4273 // are the same in Safari causing offset.left to incorrectly be 0 4274 offset.top -= num( this, 'marginTop' ); 4275 offset.left -= num( this, 'marginLeft' ); 4276 4277 // Add offsetParent borders 4278 parentOffset.top += num( offsetParent, 'borderTopWidth' ); 4279 parentOffset.left += num( offsetParent, 'borderLeftWidth' ); 4280 4281 // Subtract the two offsets 4282 results = { 4283 top: offset.top - parentOffset.top, 4284 left: offset.left - parentOffset.left 4285 }; 4286 } 4287 4288 return results; 4289 }, 4290 4291 offsetParent: function() { 4292 var offsetParent = this[0].offsetParent || document.body; 4293 while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') ) 4294 offsetParent = offsetParent.offsetParent; 4295 return jQuery(offsetParent); 4296 } 4297 }); 4298 4299 4300 // Create scrollLeft and scrollTop methods 4301 jQuery.each( ['Left', 'Top'], function(i, name) { 4302 var method = 'scroll' + name; 4303 4304 jQuery.fn[ method ] = function(val) { 4305 if (!this[0]) return null; 4306 4307 return val !== undefined ? 4308 4309 // Set the scroll offset 4310 this.each(function() { 4311 this == window || this == document ? 4312 window.scrollTo( 4313 !i ? val : jQuery(window).scrollLeft(), 4314 i ? val : jQuery(window).scrollTop() 4315 ) : 4316 this[ method ] = val; 4317 }) : 4318 4319 // Return the scroll offset 4320 this[0] == window || this[0] == document ? 4321 self[ i ? 'pageYOffset' : 'pageXOffset' ] || 4322 jQuery.boxModel && document.documentElement[ method ] || 4323 document.body[ method ] : 4324 this[0][ method ]; 4325 }; 4326 }); 4327 // Create innerHeight, innerWidth, outerHeight and outerWidth methods 4328 jQuery.each([ "Height", "Width" ], function(i, name){ 4329 4330 var tl = i ? "Left" : "Top", // top or left 4331 br = i ? "Right" : "Bottom", // bottom or right 4332 lower = name.toLowerCase(); 4333 4334 // innerHeight and innerWidth 4335 jQuery.fn["inner" + name] = function(){ 4336 return this[0] ? 4337 jQuery.css( this[0], lower, false, "padding" ) : 4338 null; 4339 }; 4340 4341 // outerHeight and outerWidth 4342 jQuery.fn["outer" + name] = function(margin) { 4343 return this[0] ? 4344 jQuery.css( this[0], lower, false, margin ? "margin" : "border" ) : 4345 null; 4346 }; 4347 4348 var type = name.toLowerCase(); 4349 4350 jQuery.fn[ type ] = function( size ) { 4351 // Get window width or height 4352 return this[0] == window ? 4353 // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode 4354 document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || 4355 document.body[ "client" + name ] : 4356 4357 // Get document width or height 4358 this[0] == document ? 4359 // Either scroll[Width/Height] or offset[Width/Height], whichever is greater 4360 Math.max( 4361 document.documentElement["client" + name], 4362 document.body["scroll" + name], document.documentElement["scroll" + name], 4363 document.body["offset" + name], document.documentElement["offset" + name] 4364 ) : 4365 4366 // Get or set width or height on the element 4367 size === undefined ? 4368 // Get width or height on the element 4369 (this.length ? jQuery.css( this[0], type ) : null) : 4370 4371 // Set the width or height on the element (default to pixels if value is unitless) 4372 this.css( type, typeof size === "string" ? size : size + "px" ); 4373 }; 4374 4375 }); 4376 })();

Contacte con nosotros
¿No puede leer el artículo? ¡Póngase en contacto con nosotros para obtener una respuesta gratuita! Ayuda gratuita para sitios personales y de pequeñas empresas
Tel: 020-2206-9892
QQ咨询:1025174874
(iii) Correo electrónico: info@361sale.com
Horario de trabajo: de lunes a viernes, de 9:30 a 18:30, días festivos libres
© Declaración de reproducción
Este artículo fue escrito por Harry
EL FIN
Si le gusta, apóyela.
felicitaciones0 compartir (alegrías, beneficios, privilegios, etc.) con los demás
comentarios compra de sofás

Por favor, inicie sesión para enviar un comentario

    Sin comentarios