root/trunk/Wierszowki/Wierszowki.Web/Scripts/jquery-1.3.1.js @ 752

Wersja 752, 114.7 KB (wprowadzona przez marek, 17 years temu)

wiersz

Line 
1/*!
2 * jQuery JavaScript Library v1.3.1
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-01-21 20:42:16 -0500 (Wed, 21 Jan 2009)
10 * Revision: 6158
11 */
12(function(){
13
14var
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
35jQuery.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.makeArray(selector));
92        },
93
94        // Start with an empty selector
95        selector: "",
96
97        // The current version of jQuery being used
98        jquery: "1.3.1",
99
100        // The number of elements contained in the matched element set
101        size: function() {
102                return this.length;
103        },
104
105        // Get the Nth element in the matched element set OR
106        // Get the whole matched element set as a clean array
107        get: function( num ) {
108                return num === undefined ?
109
110                        // Return a 'clean' array
111                        jQuery.makeArray( this ) :
112
113                        // Return just the object
114                        this[ num ];
115        },
116
117        // Take an array of elements and push it onto the stack
118        // (returning the new matched element set)
119        pushStack: function( elems, name, selector ) {
120                // Build a new jQuery matched element set
121                var ret = jQuery( elems );
122
123                // Add the old object onto the stack (as a reference)
124                ret.prevObject = this;
125
126                ret.context = this.context;
127
128                if ( name === "find" )
129                        ret.selector = this.selector + (this.selector ? " " : "") + selector;
130                else if ( name )
131                        ret.selector = this.selector + "." + name + "(" + selector + ")";
132
133                // Return the newly-formed element set
134                return ret;
135        },
136
137        // Force the current matched set of elements to become
138        // the specified array of elements (destroying the stack in the process)
139        // You should use pushStack() in order to do this, but maintain the stack
140        setArray: function( elems ) {
141                // Resetting the length to 0, then using the native Array push
142                // is a super-fast way to populate an object with array-like properties
143                this.length = 0;
144                Array.prototype.push.apply( this, elems );
145
146                return this;
147        },
148
149        // Execute a callback for every element in the matched set.
150        // (You can seed the arguments with an array of args, but this is
151        // only used internally.)
152        each: function( callback, args ) {
153                return jQuery.each( this, callback, args );
154        },
155
156        // Determine the position of an element within
157        // the matched set of elements
158        index: function( elem ) {
159                // Locate the position of the desired element
160                return jQuery.inArray(
161                        // If it receives a jQuery object, the first element is used
162                        elem && elem.jquery ? elem[0] : elem
163                , this );
164        },
165
166        attr: function( name, value, type ) {
167                var options = name;
168
169                // Look for the case where we're accessing a style value
170                if ( typeof name === "string" )
171                        if ( value === undefined )
172                                return this[0] && jQuery[ type || "attr" ]( this[0], name );
173
174                        else {
175                                options = {};
176                                options[ name ] = value;
177                        }
178
179                // Check to see if we're setting style values
180                return this.each(function(i){
181                        // Set all the styles
182                        for ( name in options )
183                                jQuery.attr(
184                                        type ?
185                                                this.style :
186                                                this,
187                                        name, jQuery.prop( this, options[ name ], type, i, name )
188                                );
189                });
190        },
191
192        css: function( key, value ) {
193                // ignore negative width and height values
194                if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
195                        value = undefined;
196                return this.attr( key, value, "curCSS" );
197        },
198
199        text: function( text ) {
200                if ( typeof text !== "object" && text != null )
201                        return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
202
203                var ret = "";
204
205                jQuery.each( text || this, function(){
206                        jQuery.each( this.childNodes, function(){
207                                if ( this.nodeType != 8 )
208                                        ret += this.nodeType != 1 ?
209                                                this.nodeValue :
210                                                jQuery.fn.text( [ this ] );
211                        });
212                });
213
214                return ret;
215        },
216
217        wrapAll: function( html ) {
218                if ( this[0] ) {
219                        // The elements to wrap the target around
220                        var wrap = jQuery( html, this[0].ownerDocument ).clone();
221
222                        if ( this[0].parentNode )
223                                wrap.insertBefore( this[0] );
224
225                        wrap.map(function(){
226                                var elem = this;
227
228                                while ( elem.firstChild )
229                                        elem = elem.firstChild;
230
231                                return elem;
232                        }).append(this);
233                }
234
235                return this;
236        },
237
238        wrapInner: function( html ) {
239                return this.each(function(){
240                        jQuery( this ).contents().wrapAll( html );
241                });
242        },
243
244        wrap: function( html ) {
245                return this.each(function(){
246                        jQuery( this ).wrapAll( html );
247                });
248        },
249
250        append: function() {
251                return this.domManip(arguments, true, function(elem){
252                        if (this.nodeType == 1)
253                                this.appendChild( elem );
254                });
255        },
256
257        prepend: function() {
258                return this.domManip(arguments, true, function(elem){
259                        if (this.nodeType == 1)
260                                this.insertBefore( elem, this.firstChild );
261                });
262        },
263
264        before: function() {
265                return this.domManip(arguments, false, function(elem){
266                        this.parentNode.insertBefore( elem, this );
267                });
268        },
269
270        after: function() {
271                return this.domManip(arguments, false, function(elem){
272                        this.parentNode.insertBefore( elem, this.nextSibling );
273                });
274        },
275
276        end: function() {
277                return this.prevObject || jQuery( [] );
278        },
279
280        // For internal use only.
281        // Behaves like an Array's .push method, not like a jQuery method.
282        push: [].push,
283
284        find: function( selector ) {
285                if ( this.length === 1 && !/,/.test(selector) ) {
286                        var ret = this.pushStack( [], "find", selector );
287                        ret.length = 0;
288                        jQuery.find( selector, this[0], ret );
289                        return ret;
290                } else {
291                        var elems = jQuery.map(this, function(elem){
292                                return jQuery.find( selector, elem );
293                        });
294
295                        return this.pushStack( /[^+>] [^+>]/.test( selector ) ?
296                                jQuery.unique( elems ) :
297                                elems, "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 clone = this.cloneNode(true),
314                                        container = document.createElement("div");
315                                container.appendChild(clone);
316                                return jQuery.clean([container.innerHTML])[0];
317                        } else
318                                return this.cloneNode(true);
319                });
320
321                // Need to set the expando to null on the cloned set if it exists
322                // removeData doesn't work here, IE removes it from the original as well
323                // this is primarily for IE but the data expando shouldn't be copied over in any browser
324                var clone = ret.find("*").andSelf().each(function(){
325                        if ( this[ expando ] !== undefined )
326                                this[ expando ] = null;
327                });
328
329                // Copy the events from the original to the clone
330                if ( events === true )
331                        this.find("*").andSelf().each(function(i){
332                                if (this.nodeType == 3)
333                                        return;
334                                var events = jQuery.data( this, "events" );
335
336                                for ( var type in events )
337                                        for ( var handler in events[ type ] )
338                                                jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data );
339                        });
340
341                // Return the cloned set
342                return ret;
343        },
344
345        filter: function( selector ) {
346                return this.pushStack(
347                        jQuery.isFunction( selector ) &&
348                        jQuery.grep(this, function(elem, i){
349                                return selector.call( elem, i );
350                        }) ||
351
352                        jQuery.multiFilter( selector, jQuery.grep(this, function(elem){
353                                return elem.nodeType === 1;
354                        }) ), "filter", selector );
355        },
356
357        closest: function( selector ) {
358                var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null;
359
360                return this.map(function(){
361                        var cur = this;
362                        while ( cur && cur.ownerDocument ) {
363                                if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) )
364                                        return cur;
365                                cur = cur.parentNode;
366                        }
367                });
368        },
369
370        not: function( selector ) {
371                if ( typeof selector === "string" )
372                        // test special case where just one selector is passed in
373                        if ( isSimple.test( selector ) )
374                                return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector );
375                        else
376                                selector = jQuery.multiFilter( selector, this );
377
378                var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
379                return this.filter(function() {
380                        return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
381                });
382        },
383
384        add: function( selector ) {
385                return this.pushStack( jQuery.unique( jQuery.merge(
386                        this.get(),
387                        typeof selector === "string" ?
388                                jQuery( selector ) :
389                                jQuery.makeArray( selector )
390                )));
391        },
392
393        is: function( selector ) {
394                return !!selector && jQuery.multiFilter( selector, this ).length > 0;
395        },
396
397        hasClass: function( selector ) {
398                return !!selector && this.is( "." + selector );
399        },
400
401        val: function( value ) {
402                if ( value === undefined ) {                   
403                        var elem = this[0];
404
405                        if ( elem ) {
406                                if( jQuery.nodeName( elem, 'option' ) )
407                                        return (elem.attributes.value || {}).specified ? elem.value : elem.text;
408                               
409                                // We need to handle select boxes special
410                                if ( jQuery.nodeName( elem, "select" ) ) {
411                                        var index = elem.selectedIndex,
412                                                values = [],
413                                                options = elem.options,
414                                                one = elem.type == "select-one";
415
416                                        // Nothing was selected
417                                        if ( index < 0 )
418                                                return null;
419
420                                        // Loop through all the selected options
421                                        for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
422                                                var option = options[ i ];
423
424                                                if ( option.selected ) {
425                                                        // Get the specifc value for the option
426                                                        value = jQuery(option).val();
427
428                                                        // We don't need an array for one selects
429                                                        if ( one )
430                                                                return value;
431
432                                                        // Multi-Selects return an array
433                                                        values.push( value );
434                                                }
435                                        }
436
437                                        return values;                         
438                                }
439
440                                // Everything else, we just grab the value
441                                return (elem.value || "").replace(/\r/g, "");
442
443                        }
444
445                        return undefined;
446                }
447
448                if ( typeof value === "number" )
449                        value += '';
450
451                return this.each(function(){
452                        if ( this.nodeType != 1 )
453                                return;
454
455                        if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) )
456                                this.checked = (jQuery.inArray(this.value, value) >= 0 ||
457                                        jQuery.inArray(this.name, value) >= 0);
458
459                        else if ( jQuery.nodeName( this, "select" ) ) {
460                                var values = jQuery.makeArray(value);
461
462                                jQuery( "option", this ).each(function(){
463                                        this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
464                                                jQuery.inArray( this.text, values ) >= 0);
465                                });
466
467                                if ( !values.length )
468                                        this.selectedIndex = -1;
469
470                        } else
471                                this.value = value;
472                });
473        },
474
475        html: function( value ) {
476                return value === undefined ?
477                        (this[0] ?
478                                this[0].innerHTML :
479                                null) :
480                        this.empty().append( value );
481        },
482
483        replaceWith: function( value ) {
484                return this.after( value ).remove();
485        },
486
487        eq: function( i ) {
488                return this.slice( i, +i + 1 );
489        },
490
491        slice: function() {
492                return this.pushStack( Array.prototype.slice.apply( this, arguments ),
493                        "slice", Array.prototype.slice.call(arguments).join(",") );
494        },
495
496        map: function( callback ) {
497                return this.pushStack( jQuery.map(this, function(elem, i){
498                        return callback.call( elem, i, elem );
499                }));
500        },
501
502        andSelf: function() {
503                return this.add( this.prevObject );
504        },
505
506        domManip: function( args, table, callback ) {
507                if ( this[0] ) {
508                        var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(),
509                                scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ),
510                                first = fragment.firstChild,
511                                extra = this.length > 1 ? fragment.cloneNode(true) : fragment;
512
513                        if ( first )
514                                for ( var i = 0, l = this.length; i < l; i++ )
515                                        callback.call( root(this[i], first), i > 0 ? extra.cloneNode(true) : fragment );
516                       
517                        if ( scripts )
518                                jQuery.each( scripts, evalScript );
519                }
520
521                return this;
522               
523                function root( elem, cur ) {
524                        return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ?
525                                (elem.getElementsByTagName("tbody")[0] ||
526                                elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
527                                elem;
528                }
529        }
530};
531
532// Give the init function the jQuery prototype for later instantiation
533jQuery.fn.init.prototype = jQuery.fn;
534
535function evalScript( i, elem ) {
536        if ( elem.src )
537                jQuery.ajax({
538                        url: elem.src,
539                        async: false,
540                        dataType: "script"
541                });
542
543        else
544                jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
545
546        if ( elem.parentNode )
547                elem.parentNode.removeChild( elem );
548}
549
550function now(){
551        return +new Date;
552}
553
554jQuery.extend = jQuery.fn.extend = function() {
555        // copy reference to target object
556        var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
557
558        // Handle a deep copy situation
559        if ( typeof target === "boolean" ) {
560                deep = target;
561                target = arguments[1] || {};
562                // skip the boolean and the target
563                i = 2;
564        }
565
566        // Handle case when target is a string or something (possible in deep copy)
567        if ( typeof target !== "object" && !jQuery.isFunction(target) )
568                target = {};
569
570        // extend jQuery itself if only one argument is passed
571        if ( length == i ) {
572                target = this;
573                --i;
574        }
575
576        for ( ; i < length; i++ )
577                // Only deal with non-null/undefined values
578                if ( (options = arguments[ i ]) != null )
579                        // Extend the base object
580                        for ( var name in options ) {
581                                var src = target[ name ], copy = options[ name ];
582
583                                // Prevent never-ending loop
584                                if ( target === copy )
585                                        continue;
586
587                                // Recurse if we're merging object values
588                                if ( deep && copy && typeof copy === "object" && !copy.nodeType )
589                                        target[ name ] = jQuery.extend( deep,
590                                                // Never move original objects, clone them
591                                                src || ( copy.length != null ? [ ] : { } )
592                                        , copy );
593
594                                // Don't bring in undefined values
595                                else if ( copy !== undefined )
596                                        target[ name ] = copy;
597
598                        }
599
600        // Return the modified object
601        return target;
602};
603
604// exclude the following css properties to add px
605var     exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
606        // cache defaultView
607        defaultView = document.defaultView || {},
608        toString = Object.prototype.toString;
609
610jQuery.extend({
611        noConflict: function( deep ) {
612                window.$ = _$;
613
614                if ( deep )
615                        window.jQuery = _jQuery;
616
617                return jQuery;
618        },
619
620        // See test/unit/core.js for details concerning isFunction.
621        // Since version 1.3, DOM methods and functions like alert
622        // aren't supported. They return false on IE (#2968).
623        isFunction: function( obj ) {
624                return toString.call(obj) === "[object Function]";
625        },
626
627        isArray: function( obj ) {
628                return toString.call(obj) === "[object Array]";
629        },
630
631        // check if an element is in a (or is an) XML document
632        isXMLDoc: function( elem ) {
633                return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
634                        !!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument );
635        },
636
637        // Evalulates a script in a global context
638        globalEval: function( data ) {
639                data = jQuery.trim( data );
640
641                if ( data ) {
642                        // Inspired by code by Andrea Giammarchi
643                        // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
644                        var head = document.getElementsByTagName("head")[0] || document.documentElement,
645                                script = document.createElement("script");
646
647                        script.type = "text/javascript";
648                        if ( jQuery.support.scriptEval )
649                                script.appendChild( document.createTextNode( data ) );
650                        else
651                                script.text = data;
652
653                        // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
654                        // This arises when a base node is used (#2709).
655                        head.insertBefore( script, head.firstChild );
656                        head.removeChild( script );
657                }
658        },
659
660        nodeName: function( elem, name ) {
661                return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
662        },
663
664        // args is for internal usage only
665        each: function( object, callback, args ) {
666                var name, i = 0, length = object.length;
667
668                if ( args ) {
669                        if ( length === undefined ) {
670                                for ( name in object )
671                                        if ( callback.apply( object[ name ], args ) === false )
672                                                break;
673                        } else
674                                for ( ; i < length; )
675                                        if ( callback.apply( object[ i++ ], args ) === false )
676                                                break;
677
678                // A special, fast, case for the most common use of each
679                } else {
680                        if ( length === undefined ) {
681                                for ( name in object )
682                                        if ( callback.call( object[ name ], name, object[ name ] ) === false )
683                                                break;
684                        } else
685                                for ( var value = object[0];
686                                        i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
687                }
688
689                return object;
690        },
691
692        prop: function( elem, value, type, i, name ) {
693                // Handle executable functions
694                if ( jQuery.isFunction( value ) )
695                        value = value.call( elem, i );
696
697                // Handle passing in a number to a CSS property
698                return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ?
699                        value + "px" :
700                        value;
701        },
702
703        className: {
704                // internal only, use addClass("class")
705                add: function( elem, classNames ) {
706                        jQuery.each((classNames || "").split(/\s+/), function(i, className){
707                                if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
708                                        elem.className += (elem.className ? " " : "") + className;
709                        });
710                },
711
712                // internal only, use removeClass("class")
713                remove: function( elem, classNames ) {
714                        if (elem.nodeType == 1)
715                                elem.className = classNames !== undefined ?
716                                        jQuery.grep(elem.className.split(/\s+/), function(className){
717                                                return !jQuery.className.has( classNames, className );
718                                        }).join(" ") :
719                                        "";
720                },
721
722                // internal only, use hasClass("class")
723                has: function( elem, className ) {
724                        return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
725                }
726        },
727
728        // A method for quickly swapping in/out CSS properties to get correct calculations
729        swap: function( elem, options, callback ) {
730                var old = {};
731                // Remember the old values, and insert the new ones
732                for ( var name in options ) {
733                        old[ name ] = elem.style[ name ];
734                        elem.style[ name ] = options[ name ];
735                }
736
737                callback.call( elem );
738
739                // Revert the old values
740                for ( var name in options )
741                        elem.style[ name ] = old[ name ];
742        },
743
744        css: function( elem, name, force ) {
745                if ( name == "width" || name == "height" ) {
746                        var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
747
748                        function getWH() {
749                                val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
750                                var padding = 0, border = 0;
751                                jQuery.each( which, function() {
752                                        padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
753                                        border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
754                                });
755                                val -= Math.round(padding + border);
756                        }
757
758                        if ( jQuery(elem).is(":visible") )
759                                getWH();
760                        else
761                                jQuery.swap( elem, props, getWH );
762
763                        return Math.max(0, val);
764                }
765
766                return jQuery.curCSS( elem, name, force );
767        },
768
769        curCSS: function( elem, name, force ) {
770                var ret, style = elem.style;
771
772                // We need to handle opacity special in IE
773                if ( name == "opacity" && !jQuery.support.opacity ) {
774                        ret = jQuery.attr( style, "opacity" );
775
776                        return ret == "" ?
777                                "1" :
778                                ret;
779                }
780
781                // Make sure we're using the right name for getting the float value
782                if ( name.match( /float/i ) )
783                        name = styleFloat;
784
785                if ( !force && style && style[ name ] )
786                        ret = style[ name ];
787
788                else if ( defaultView.getComputedStyle ) {
789
790                        // Only "float" is needed here
791                        if ( name.match( /float/i ) )
792                                name = "float";
793
794                        name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
795
796                        var computedStyle = defaultView.getComputedStyle( elem, null );
797
798                        if ( computedStyle )
799                                ret = computedStyle.getPropertyValue( name );
800
801                        // We should always get a number back from opacity
802                        if ( name == "opacity" && ret == "" )
803                                ret = "1";
804
805                } else if ( elem.currentStyle ) {
806                        var camelCase = name.replace(/\-(\w)/g, function(all, letter){
807                                return letter.toUpperCase();
808                        });
809
810                        ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
811
812                        // From the awesome hack by Dean Edwards
813                        // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
814
815                        // If we're not dealing with a regular pixel number
816                        // but a number that has a weird ending, we need to convert it to pixels
817                        if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
818                                // Remember the original values
819                                var left = style.left, rsLeft = elem.runtimeStyle.left;
820
821                                // Put in the new values to get a computed value out
822                                elem.runtimeStyle.left = elem.currentStyle.left;
823                                style.left = ret || 0;
824                                ret = style.pixelLeft + "px";
825
826                                // Revert the changed values
827                                style.left = left;
828                                elem.runtimeStyle.left = rsLeft;
829                        }
830                }
831
832                return ret;
833        },
834
835        clean: function( elems, context, fragment ) {
836                context = context || document;
837
838                // !context.createElement fails in IE with an error but returns typeof 'object'
839                if ( typeof context.createElement === "undefined" )
840                        context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
841
842                // If a single string is passed in and it's a single tag
843                // just do a createElement and skip the rest
844                if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) {
845                        var match = /^<(\w+)\s*\/?>$/.exec(elems[0]);
846                        if ( match )
847                                return [ context.createElement( match[1] ) ];
848                }
849
850                var ret = [], scripts = [], div = context.createElement("div");
851
852                jQuery.each(elems, function(i, elem){
853                        if ( typeof elem === "number" )
854                                elem += '';
855
856                        if ( !elem )
857                                return;
858
859                        // Convert html string into DOM nodes
860                        if ( typeof elem === "string" ) {
861                                // Fix "XHTML"-style tags in all browsers
862                                elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
863                                        return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
864                                                all :
865                                                front + "></" + tag + ">";
866                                });
867
868                                // Trim whitespace, otherwise indexOf won't work as expected
869                                var tags = jQuery.trim( elem ).toLowerCase();
870
871                                var wrap =
872                                        // option or optgroup
873                                        !tags.indexOf("<opt") &&
874                                        [ 1, "<select multiple='multiple'>", "</select>" ] ||
875
876                                        !tags.indexOf("<leg") &&
877                                        [ 1, "<fieldset>", "</fieldset>" ] ||
878
879                                        tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
880                                        [ 1, "<table>", "</table>" ] ||
881
882                                        !tags.indexOf("<tr") &&
883                                        [ 2, "<table><tbody>", "</tbody></table>" ] ||
884
885                                        // <thead> matched above
886                                        (!tags.indexOf("<td") || !tags.indexOf("<th")) &&
887                                        [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
888
889                                        !tags.indexOf("<col") &&
890                                        [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
891
892                                        // IE can't serialize <link> and <script> tags normally
893                                        !jQuery.support.htmlSerialize &&
894                                        [ 1, "div<div>", "</div>" ] ||
895
896                                        [ 0, "", "" ];
897
898                                // Go to html and back, then peel off extra wrappers
899                                div.innerHTML = wrap[1] + elem + wrap[2];
900
901                                // Move to the right depth
902                                while ( wrap[0]-- )
903                                        div = div.lastChild;
904
905                                // Remove IE's autoinserted <tbody> from table fragments
906                                if ( !jQuery.support.tbody ) {
907
908                                        // String was a <table>, *may* have spurious <tbody>
909                                        var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ?
910                                                div.firstChild && div.firstChild.childNodes :
911
912                                                // String was a bare <thead> or <tfoot>
913                                                wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ?
914                                                        div.childNodes :
915                                                        [];
916
917                                        for ( var j = tbody.length - 1; j >= 0 ; --j )
918                                                if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
919                                                        tbody[ j ].parentNode.removeChild( tbody[ j ] );
920
921                                        }
922
923                                // IE completely kills leading whitespace when innerHTML is used
924                                if ( !jQuery.support.leadingWhitespace && /^\s/.test( elem ) )
925                                        div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
926                               
927                                elem = jQuery.makeArray( div.childNodes );
928                        }
929
930                        if ( elem.nodeType )
931                                ret.push( elem );
932                        else
933                                ret = jQuery.merge( ret, elem );
934
935                });
936
937                if ( fragment ) {
938                        for ( var i = 0; ret[i]; i++ ) {
939                                if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
940                                        scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
941                                } else {
942                                        if ( ret[i].nodeType === 1 )
943                                                ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
944                                        fragment.appendChild( ret[i] );
945                                }
946                        }
947                       
948                        return scripts;
949                }
950
951                return ret;
952        },
953
954        attr: function( elem, name, value ) {
955                // don't set attributes on text and comment nodes
956                if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
957                        return undefined;
958
959                var notxml = !jQuery.isXMLDoc( elem ),
960                        // Whether we are setting (or getting)
961                        set = value !== undefined;
962
963                // Try to normalize/fix the name
964                name = notxml && jQuery.props[ name ] || name;
965
966                // Only do all the following if this is a node (faster for style)
967                // IE elem.getAttribute passes even for style
968                if ( elem.tagName ) {
969
970                        // These attributes require special treatment
971                        var special = /href|src|style/.test( name );
972
973                        // Safari mis-reports the default selected property of a hidden option
974                        // Accessing the parent's selectedIndex property fixes it
975                        if ( name == "selected" && elem.parentNode )
976                                elem.parentNode.selectedIndex;
977
978                        // If applicable, access the attribute via the DOM 0 way
979                        if ( name in elem && notxml && !special ) {
980                                if ( set ){
981                                        // We can't allow the type property to be changed (since it causes problems in IE)
982                                        if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
983                                                throw "type property can't be changed";
984
985                                        elem[ name ] = value;
986                                }
987
988                                // browsers index elements by id/name on forms, give priority to attributes.
989                                if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
990                                        return elem.getAttributeNode( name ).nodeValue;
991
992                                // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
993                                // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
994                                if ( name == "tabIndex" ) {
995                                        var attributeNode = elem.getAttributeNode( "tabIndex" );
996                                        return attributeNode && attributeNode.specified
997                                                ? attributeNode.value
998                                                : elem.nodeName.match(/(button|input|object|select|textarea)/i)
999                                                        ? 0
1000                                                        : elem.nodeName.match(/^(a|area)$/i) && elem.href
1001                                                                ? 0
1002                                                                : undefined;
1003                                }
1004
1005                                return elem[ name ];
1006                        }
1007
1008                        if ( !jQuery.support.style && notxml &&  name == "style" )
1009                                return jQuery.attr( elem.style, "cssText", value );
1010
1011                        if ( set )
1012                                // convert the value to a string (all browsers do this but IE) see #1070
1013                                elem.setAttribute( name, "" + value );
1014
1015                        var attr = !jQuery.support.hrefNormalized && notxml && special
1016                                        // Some attributes require a special call on IE
1017                                        ? elem.getAttribute( name, 2 )
1018                                        : elem.getAttribute( name );
1019
1020                        // Non-existent attributes return null, we normalize to undefined
1021                        return attr === null ? undefined : attr;
1022                }
1023
1024                // elem is actually elem.style ... set the style
1025
1026                // IE uses filters for opacity
1027                if ( !jQuery.support.opacity && name == "opacity" ) {
1028                        if ( set ) {
1029                                // IE has trouble with opacity if it does not have layout
1030                                // Force it by setting the zoom level
1031                                elem.zoom = 1;
1032
1033                                // Set the alpha filter to set the opacity
1034                                elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +
1035                                        (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
1036                        }
1037
1038                        return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
1039                                (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
1040                                "";
1041                }
1042
1043                name = name.replace(/-([a-z])/ig, function(all, letter){
1044                        return letter.toUpperCase();
1045                });
1046
1047                if ( set )
1048                        elem[ name ] = value;
1049
1050                return elem[ name ];
1051        },
1052
1053        trim: function( text ) {
1054                return (text || "").replace( /^\s+|\s+$/g, "" );
1055        },
1056
1057        makeArray: function( array ) {
1058                var ret = [];
1059
1060                if( array != null ){
1061                        var i = array.length;
1062                        // The window, strings (and functions) also have 'length'
1063                        if( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval )
1064                                ret[0] = array;
1065                        else
1066                                while( i )
1067                                        ret[--i] = array[i];
1068                }
1069
1070                return ret;
1071        },
1072
1073        inArray: function( elem, array ) {
1074                for ( var i = 0, length = array.length; i < length; i++ )
1075                // Use === because on IE, window == document
1076                        if ( array[ i ] === elem )
1077                                return i;
1078
1079                return -1;
1080        },
1081
1082        merge: function( first, second ) {
1083                // We have to loop this way because IE & Opera overwrite the length
1084                // expando of getElementsByTagName
1085                var i = 0, elem, pos = first.length;
1086                // Also, we need to make sure that the correct elements are being returned
1087                // (IE returns comment nodes in a '*' query)
1088                if ( !jQuery.support.getAll ) {
1089                        while ( (elem = second[ i++ ]) != null )
1090                                if ( elem.nodeType != 8 )
1091                                        first[ pos++ ] = elem;
1092
1093                } else
1094                        while ( (elem = second[ i++ ]) != null )
1095                                first[ pos++ ] = elem;
1096
1097                return first;
1098        },
1099
1100        unique: function( array ) {
1101                var ret = [], done = {};
1102
1103                try {
1104
1105                        for ( var i = 0, length = array.length; i < length; i++ ) {
1106                                var id = jQuery.data( array[ i ] );
1107
1108                                if ( !done[ id ] ) {
1109                                        done[ id ] = true;
1110                                        ret.push( array[ i ] );
1111                                }
1112                        }
1113
1114                } catch( e ) {
1115                        ret = array;
1116                }
1117
1118                return ret;
1119        },
1120
1121        grep: function( elems, callback, inv ) {
1122                var ret = [];
1123
1124                // Go through the array, only saving the items
1125                // that pass the validator function
1126                for ( var i = 0, length = elems.length; i < length; i++ )
1127                        if ( !inv != !callback( elems[ i ], i ) )
1128                                ret.push( elems[ i ] );
1129
1130                return ret;
1131        },
1132
1133        map: function( elems, callback ) {
1134                var ret = [];
1135
1136                // Go through the array, translating each of the items to their
1137                // new value (or values).
1138                for ( var i = 0, length = elems.length; i < length; i++ ) {
1139                        var value = callback( elems[ i ], i );
1140
1141                        if ( value != null )
1142                                ret[ ret.length ] = value;
1143                }
1144
1145                return ret.concat.apply( [], ret );
1146        }
1147});
1148
1149// Use of jQuery.browser is deprecated.
1150// It's included for backwards compatibility and plugins,
1151// although they should work to migrate away.
1152
1153var userAgent = navigator.userAgent.toLowerCase();
1154
1155// Figure out what browser is being used
1156jQuery.browser = {
1157        version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
1158        safari: /webkit/.test( userAgent ),
1159        opera: /opera/.test( userAgent ),
1160        msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
1161        mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
1162};
1163
1164jQuery.each({
1165        parent: function(elem){return elem.parentNode;},
1166        parents: function(elem){return jQuery.dir(elem,"parentNode");},
1167        next: function(elem){return jQuery.nth(elem,2,"nextSibling");},
1168        prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},
1169        nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},
1170        prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},
1171        siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
1172        children: function(elem){return jQuery.sibling(elem.firstChild);},
1173        contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
1174}, function(name, fn){
1175        jQuery.fn[ name ] = function( selector ) {
1176                var ret = jQuery.map( this, fn );
1177
1178                if ( selector && typeof selector == "string" )
1179                        ret = jQuery.multiFilter( selector, ret );
1180
1181                return this.pushStack( jQuery.unique( ret ), name, selector );
1182        };
1183});
1184
1185jQuery.each({
1186        appendTo: "append",
1187        prependTo: "prepend",
1188        insertBefore: "before",
1189        insertAfter: "after",
1190        replaceAll: "replaceWith"
1191}, function(name, original){
1192        jQuery.fn[ name ] = function() {
1193                var args = arguments;
1194
1195                return this.each(function(){
1196                        for ( var i = 0, length = args.length; i < length; i++ )
1197                                jQuery( args[ i ] )[ original ]( this );
1198                });
1199        };
1200});
1201
1202jQuery.each({
1203        removeAttr: function( name ) {
1204                jQuery.attr( this, name, "" );
1205                if (this.nodeType == 1)
1206                        this.removeAttribute( name );
1207        },
1208
1209        addClass: function( classNames ) {
1210                jQuery.className.add( this, classNames );
1211        },
1212
1213        removeClass: function( classNames ) {
1214                jQuery.className.remove( this, classNames );
1215        },
1216
1217        toggleClass: function( classNames, state ) {
1218                if( typeof state !== "boolean" )
1219                        state = !jQuery.className.has( this, classNames );
1220                jQuery.className[ state ? "add" : "remove" ]( this, classNames );
1221        },
1222
1223        remove: function( selector ) {
1224                if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
1225                        // Prevent memory leaks
1226                        jQuery( "*", this ).add([this]).each(function(){
1227                                jQuery.event.remove(this);
1228                                jQuery.removeData(this);
1229                        });
1230                        if (this.parentNode)
1231                                this.parentNode.removeChild( this );
1232                }
1233        },
1234
1235        empty: function() {
1236                // Remove element nodes and prevent memory leaks
1237                jQuery( ">*", this ).remove();
1238
1239                // Remove any remaining nodes
1240                while ( this.firstChild )
1241                        this.removeChild( this.firstChild );
1242        }
1243}, function(name, fn){
1244        jQuery.fn[ name ] = function(){
1245                return this.each( fn, arguments );
1246        };
1247});
1248
1249// Helper function used by the dimensions and offset modules
1250function num(elem, prop) {
1251        return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
1252}
1253var expando = "jQuery" + now(), uuid = 0, windowData = {};
1254
1255jQuery.extend({
1256        cache: {},
1257
1258        data: function( elem, name, data ) {
1259                elem = elem == window ?
1260                        windowData :
1261                        elem;
1262
1263                var id = elem[ expando ];
1264
1265                // Compute a unique ID for the element
1266                if ( !id )
1267                        id = elem[ expando ] = ++uuid;
1268
1269                // Only generate the data cache if we're
1270                // trying to access or manipulate it
1271                if ( name && !jQuery.cache[ id ] )
1272                        jQuery.cache[ id ] = {};
1273
1274                // Prevent overriding the named cache with undefined values
1275                if ( data !== undefined )
1276                        jQuery.cache[ id ][ name ] = data;
1277
1278                // Return the named cache data, or the ID for the element
1279                return name ?
1280                        jQuery.cache[ id ][ name ] :
1281                        id;
1282        },
1283
1284        removeData: function( elem, name ) {
1285                elem = elem == window ?
1286                        windowData :
1287                        elem;
1288
1289                var id = elem[ expando ];
1290
1291                // If we want to remove a specific section of the element's data
1292                if ( name ) {
1293                        if ( jQuery.cache[ id ] ) {
1294                                // Remove the section of cache data
1295                                delete jQuery.cache[ id ][ name ];
1296
1297                                // If we've removed all the data, remove the element's cache
1298                                name = "";
1299
1300                                for ( name in jQuery.cache[ id ] )
1301                                        break;
1302
1303                                if ( !name )
1304                                        jQuery.removeData( elem );
1305                        }
1306
1307                // Otherwise, we want to remove all of the element's data
1308                } else {
1309                        // Clean up the element expando
1310                        try {
1311                                delete elem[ expando ];
1312                        } catch(e){
1313                                // IE has trouble directly removing the expando
1314                                // but it's ok with using removeAttribute
1315                                if ( elem.removeAttribute )
1316                                        elem.removeAttribute( expando );
1317                        }
1318
1319                        // Completely remove the data cache
1320                        delete jQuery.cache[ id ];
1321                }
1322        },
1323        queue: function( elem, type, data ) {
1324                if ( elem ){
1325       
1326                        type = (type || "fx") + "queue";
1327       
1328                        var q = jQuery.data( elem, type );
1329       
1330                        if ( !q || jQuery.isArray(data) )
1331                                q = jQuery.data( elem, type, jQuery.makeArray(data) );
1332                        else if( data )
1333                                q.push( data );
1334       
1335                }
1336                return q;
1337        },
1338
1339        dequeue: function( elem, type ){
1340                var queue = jQuery.queue( elem, type ),
1341                        fn = queue.shift();
1342               
1343                if( !type || type === "fx" )
1344                        fn = queue[0];
1345                       
1346                if( fn !== undefined )
1347                        fn.call(elem);
1348        }
1349});
1350
1351jQuery.fn.extend({
1352        data: function( key, value ){
1353                var parts = key.split(".");
1354                parts[1] = parts[1] ? "." + parts[1] : "";
1355
1356                if ( value === undefined ) {
1357                        var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1358
1359                        if ( data === undefined && this.length )
1360                                data = jQuery.data( this[0], key );
1361
1362                        return data === undefined && parts[1] ?
1363                                this.data( parts[0] ) :
1364                                data;
1365                } else
1366                        return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
1367                                jQuery.data( this, key, value );
1368                        });
1369        },
1370
1371        removeData: function( key ){
1372                return this.each(function(){
1373                        jQuery.removeData( this, key );
1374                });
1375        },
1376        queue: function(type, data){
1377                if ( typeof type !== "string" ) {
1378                        data = type;
1379                        type = "fx";
1380                }
1381
1382                if ( data === undefined )
1383                        return jQuery.queue( this[0], type );
1384
1385                return this.each(function(){
1386                        var queue = jQuery.queue( this, type, data );
1387                       
1388                         if( type == "fx" && queue.length == 1 )
1389                                queue[0].call(this);
1390                });
1391        },
1392        dequeue: function(type){
1393                return this.each(function(){
1394                        jQuery.dequeue( this, type );
1395                });
1396        }
1397});/*!
1398 * Sizzle CSS Selector Engine - v0.9.3
1399 *  Copyright 2009, The Dojo Foundation
1400 *  Released under the MIT, BSD, and GPL Licenses.
1401 *  More information: http://sizzlejs.com/
1402 */
1403(function(){
1404
1405var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]+['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g,
1406        done = 0,
1407        toString = Object.prototype.toString;
1408
1409var Sizzle = function(selector, context, results, seed) {
1410        results = results || [];
1411        context = context || document;
1412
1413        if ( context.nodeType !== 1 && context.nodeType !== 9 )
1414                return [];
1415       
1416        if ( !selector || typeof selector !== "string" ) {
1417                return results;
1418        }
1419
1420        var parts = [], m, set, checkSet, check, mode, extra, prune = true;
1421       
1422        // Reset the position of the chunker regexp (start from head)
1423        chunker.lastIndex = 0;
1424       
1425        while ( (m = chunker.exec(selector)) !== null ) {
1426                parts.push( m[1] );
1427               
1428                if ( m[2] ) {
1429                        extra = RegExp.rightContext;
1430                        break;
1431                }
1432        }
1433
1434        if ( parts.length > 1 && origPOS.exec( selector ) ) {
1435                if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
1436                        set = posProcess( parts[0] + parts[1], context );
1437                } else {
1438                        set = Expr.relative[ parts[0] ] ?
1439                                [ context ] :
1440                                Sizzle( parts.shift(), context );
1441
1442                        while ( parts.length ) {
1443                                selector = parts.shift();
1444
1445                                if ( Expr.relative[ selector ] )
1446                                        selector += parts.shift();
1447
1448                                set = posProcess( selector, set );
1449                        }
1450                }
1451        } else {
1452                var ret = seed ?
1453                        { expr: parts.pop(), set: makeArray(seed) } :
1454                        Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context, isXML(context) );
1455                set = Sizzle.filter( ret.expr, ret.set );
1456
1457                if ( parts.length > 0 ) {
1458                        checkSet = makeArray(set);
1459                } else {
1460                        prune = false;
1461                }
1462
1463                while ( parts.length ) {
1464                        var cur = parts.pop(), pop = cur;
1465
1466                        if ( !Expr.relative[ cur ] ) {
1467                                cur = "";
1468                        } else {
1469                                pop = parts.pop();
1470                        }
1471
1472                        if ( pop == null ) {
1473                                pop = context;
1474                        }
1475
1476                        Expr.relative[ cur ]( checkSet, pop, isXML(context) );
1477                }
1478        }
1479
1480        if ( !checkSet ) {
1481                checkSet = set;
1482        }
1483
1484        if ( !checkSet ) {
1485                throw "Syntax error, unrecognized expression: " + (cur || selector);
1486        }
1487
1488        if ( toString.call(checkSet) === "[object Array]" ) {
1489                if ( !prune ) {
1490                        results.push.apply( results, checkSet );
1491                } else if ( context.nodeType === 1 ) {
1492                        for ( var i = 0; checkSet[i] != null; i++ ) {
1493                                if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
1494                                        results.push( set[i] );
1495                                }
1496                        }
1497                } else {
1498                        for ( var i = 0; checkSet[i] != null; i++ ) {
1499                                if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
1500                                        results.push( set[i] );
1501                                }
1502                        }
1503                }
1504        } else {
1505                makeArray( checkSet, results );
1506        }
1507
1508        if ( extra ) {
1509                Sizzle( extra, context, results, seed );
1510        }
1511
1512        return results;
1513};
1514
1515Sizzle.matches = function(expr, set){
1516        return Sizzle(expr, null, null, set);
1517};
1518
1519Sizzle.find = function(expr, context, isXML){
1520        var set, match;
1521
1522        if ( !expr ) {
1523                return [];
1524        }
1525
1526        for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
1527                var type = Expr.order[i], match;
1528               
1529                if ( (match = Expr.match[ type ].exec( expr )) ) {
1530                        var left = RegExp.leftContext;
1531
1532                        if ( left.substr( left.length - 1 ) !== "\\" ) {
1533                                match[1] = (match[1] || "").replace(/\\/g, "");
1534                                set = Expr.find[ type ]( match, context, isXML );
1535                                if ( set != null ) {
1536                                        expr = expr.replace( Expr.match[ type ], "" );
1537                                        break;
1538                                }
1539                        }
1540                }
1541        }
1542
1543        if ( !set ) {
1544                set = context.getElementsByTagName("*");
1545        }
1546
1547        return {set: set, expr: expr};
1548};
1549
1550Sizzle.filter = function(expr, set, inplace, not){
1551        var old = expr, result = [], curLoop = set, match, anyFound;
1552
1553        while ( expr && set.length ) {
1554                for ( var type in Expr.filter ) {
1555                        if ( (match = Expr.match[ type ].exec( expr )) != null ) {
1556                                var filter = Expr.filter[ type ], found, item;
1557                                anyFound = false;
1558
1559                                if ( curLoop == result ) {
1560                                        result = [];
1561                                }
1562
1563                                if ( Expr.preFilter[ type ] ) {
1564                                        match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not );
1565
1566                                        if ( !match ) {
1567                                                anyFound = found = true;
1568                                        } else if ( match === true ) {
1569                                                continue;
1570                                        }
1571                                }
1572
1573                                if ( match ) {
1574                                        for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
1575                                                if ( item ) {
1576                                                        found = filter( item, match, i, curLoop );
1577                                                        var pass = not ^ !!found;
1578
1579                                                        if ( inplace && found != null ) {
1580                                                                if ( pass ) {
1581                                                                        anyFound = true;
1582                                                                } else {
1583                                                                        curLoop[i] = false;
1584                                                                }
1585                                                        } else if ( pass ) {
1586                                                                result.push( item );
1587                                                                anyFound = true;
1588                                                        }
1589                                                }
1590                                        }
1591                                }
1592
1593                                if ( found !== undefined ) {
1594                                        if ( !inplace ) {
1595                                                curLoop = result;
1596                                        }
1597
1598                                        expr = expr.replace( Expr.match[ type ], "" );
1599
1600                                        if ( !anyFound ) {
1601                                                return [];
1602                                        }
1603
1604                                        break;
1605                                }
1606                        }
1607                }
1608
1609                expr = expr.replace(/\s*,\s*/, "");
1610
1611                // Improper expression
1612                if ( expr == old ) {
1613                        if ( anyFound == null ) {
1614                                throw "Syntax error, unrecognized expression: " + expr;
1615                        } else {
1616                                break;
1617                        }
1618                }
1619
1620                old = expr;
1621        }
1622
1623        return curLoop;
1624};
1625
1626var Expr = Sizzle.selectors = {
1627        order: [ "ID", "NAME", "TAG" ],
1628        match: {
1629                ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
1630                CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
1631                NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,
1632                ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
1633                TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,
1634                CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
1635                POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
1636                PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
1637        },
1638        attrMap: {
1639                "class": "className",
1640                "for": "htmlFor"
1641        },
1642        attrHandle: {
1643                href: function(elem){
1644                        return elem.getAttribute("href");
1645                }
1646        },
1647        relative: {
1648                "+": function(checkSet, part){
1649                        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
1650                                var elem = checkSet[i];
1651                                if ( elem ) {
1652                                        var cur = elem.previousSibling;
1653                                        while ( cur && cur.nodeType !== 1 ) {
1654                                                cur = cur.previousSibling;
1655                                        }
1656                                        checkSet[i] = typeof part === "string" ?
1657                                                cur || false :
1658                                                cur === part;
1659                                }
1660                        }
1661
1662                        if ( typeof part === "string" ) {
1663                                Sizzle.filter( part, checkSet, true );
1664                        }
1665                },
1666                ">": function(checkSet, part, isXML){
1667                        if ( typeof part === "string" && !/\W/.test(part) ) {
1668                                part = isXML ? part : part.toUpperCase();
1669
1670                                for ( var i = 0, l = checkSet.length; i < l; i++ ) {
1671                                        var elem = checkSet[i];
1672                                        if ( elem ) {
1673                                                var parent = elem.parentNode;
1674                                                checkSet[i] = parent.nodeName === part ? parent : false;
1675                                        }
1676                                }
1677                        } else {
1678                                for ( var i = 0, l = checkSet.length; i < l; i++ ) {
1679                                        var elem = checkSet[i];
1680                                        if ( elem ) {
1681                                                checkSet[i] = typeof part === "string" ?
1682                                                        elem.parentNode :
1683                                                        elem.parentNode === part;
1684                                        }
1685                                }
1686
1687                                if ( typeof part === "string" ) {
1688                                        Sizzle.filter( part, checkSet, true );
1689                                }
1690                        }
1691                },
1692                "": function(checkSet, part, isXML){
1693                        var doneName = "done" + (done++), checkFn = dirCheck;
1694
1695                        if ( !part.match(/\W/) ) {
1696                                var nodeCheck = part = isXML ? part : part.toUpperCase();
1697                                checkFn = dirNodeCheck;
1698                        }
1699
1700                        checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
1701                },
1702                "~": function(checkSet, part, isXML){
1703                        var doneName = "done" + (done++), checkFn = dirCheck;
1704
1705                        if ( typeof part === "string" && !part.match(/\W/) ) {
1706                                var nodeCheck = part = isXML ? part : part.toUpperCase();
1707                                checkFn = dirNodeCheck;
1708                        }
1709
1710                        checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
1711                }
1712        },
1713        find: {
1714                ID: function(match, context, isXML){
1715                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
1716                                var m = context.getElementById(match[1]);
1717                                return m ? [m] : [];
1718                        }
1719                },
1720                NAME: function(match, context, isXML){
1721                        if ( typeof context.getElementsByName !== "undefined" && !isXML ) {
1722                                return context.getElementsByName(match[1]);
1723                        }
1724                },
1725                TAG: function(match, context){
1726                        return context.getElementsByTagName(match[1]);
1727                }
1728        },
1729        preFilter: {
1730                CLASS: function(match, curLoop, inplace, result, not){
1731                        match = " " + match[1].replace(/\\/g, "") + " ";
1732
1733                        var elem;
1734                        for ( var i = 0; (elem = curLoop[i]) != null; i++ ) {
1735                                if ( elem ) {
1736                                        if ( not ^ (" " + elem.className + " ").indexOf(match) >= 0 ) {
1737                                                if ( !inplace )
1738                                                        result.push( elem );
1739                                        } else if ( inplace ) {
1740                                                curLoop[i] = false;
1741                                        }
1742                                }
1743                        }
1744
1745                        return false;
1746                },
1747                ID: function(match){
1748                        return match[1].replace(/\\/g, "");
1749                },
1750                TAG: function(match, curLoop){
1751                        for ( var i = 0; curLoop[i] === false; i++ ){}
1752                        return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
1753                },
1754                CHILD: function(match){
1755                        if ( match[1] == "nth" ) {
1756                                // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
1757                                var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
1758                                        match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
1759                                        !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
1760
1761                                // calculate the numbers (first)n+(last) including if they are negative
1762                                match[2] = (test[1] + (test[2] || 1)) - 0;
1763                                match[3] = test[3] - 0;
1764                        }
1765
1766                        // TODO: Move to normal caching system
1767                        match[0] = "done" + (done++);
1768
1769                        return match;
1770                },
1771                ATTR: function(match){
1772                        var name = match[1].replace(/\\/g, "");
1773                       
1774                        if ( Expr.attrMap[name] ) {
1775                                match[1] = Expr.attrMap[name];
1776                        }
1777
1778                        if ( match[2] === "~=" ) {
1779                                match[4] = " " + match[4] + " ";
1780                        }
1781
1782                        return match;
1783                },
1784                PSEUDO: function(match, curLoop, inplace, result, not){
1785                        if ( match[1] === "not" ) {
1786                                // If we're dealing with a complex expression, or a simple one
1787                                if ( match[3].match(chunker).length > 1 ) {
1788                                        match[3] = Sizzle(match[3], null, null, curLoop);
1789                                } else {
1790                                        var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
1791                                        if ( !inplace ) {
1792                                                result.push.apply( result, ret );
1793                                        }
1794                                        return false;
1795                                }
1796                        } else if ( Expr.match.POS.test( match[0] ) ) {
1797                                return true;
1798                        }
1799                       
1800                        return match;
1801                },
1802                POS: function(match){
1803                        match.unshift( true );
1804                        return match;
1805                }
1806        },
1807        filters: {
1808                enabled: function(elem){
1809                        return elem.disabled === false && elem.type !== "hidden";
1810                },
1811                disabled: function(elem){
1812                        return elem.disabled === true;
1813                },
1814                checked: function(elem){
1815                        return elem.checked === true;
1816                },
1817                selected: function(elem){
1818                        // Accessing this property makes selected-by-default
1819                        // options in Safari work properly
1820                        elem.parentNode.selectedIndex;
1821                        return elem.selected === true;
1822                },
1823                parent: function(elem){
1824                        return !!elem.firstChild;
1825                },
1826                empty: function(elem){
1827                        return !elem.firstChild;
1828                },
1829                has: function(elem, i, match){
1830                        return !!Sizzle( match[3], elem ).length;
1831                },
1832                header: function(elem){
1833                        return /h\d/i.test( elem.nodeName );
1834                },
1835                text: function(elem){
1836                        return "text" === elem.type;
1837                },
1838                radio: function(elem){
1839                        return "radio" === elem.type;
1840                },
1841                checkbox: function(elem){
1842                        return "checkbox" === elem.type;
1843                },
1844                file: function(elem){
1845                        return "file" === elem.type;
1846                },
1847                password: function(elem){
1848                        return "password" === elem.type;
1849                },
1850                submit: function(elem){
1851                        return "submit" === elem.type;
1852                },
1853                image: function(elem){
1854                        return "image" === elem.type;
1855                },
1856                reset: function(elem){
1857                        return "reset" === elem.type;
1858                },
1859                button: function(elem){
1860                        return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
1861                },
1862                input: function(elem){
1863                        return /input|select|textarea|button/i.test(elem.nodeName);
1864                }
1865        },
1866        setFilters: {
1867                first: function(elem, i){
1868                        return i === 0;
1869                },
1870                last: function(elem, i, match, array){
1871                        return i === array.length - 1;
1872                },
1873                even: function(elem, i){
1874                        return i % 2 === 0;
1875                },
1876                odd: function(elem, i){
1877                        return i % 2 === 1;
1878                },
1879                lt: function(elem, i, match){
1880                        return i < match[3] - 0;
1881                },
1882                gt: function(elem, i, match){
1883                        return i > match[3] - 0;
1884                },
1885                nth: function(elem, i, match){
1886                        return match[3] - 0 == i;
1887                },
1888                eq: function(elem, i, match){
1889                        return match[3] - 0 == i;
1890                }
1891        },
1892        filter: {
1893                CHILD: function(elem, match){
1894                        var type = match[1], parent = elem.parentNode;
1895
1896                        var doneName = match[0];
1897                       
1898                        if ( parent && (!parent[ doneName ] || !elem.nodeIndex) ) {
1899                                var count = 1;
1900
1901                                for ( var node = parent.firstChild; node; node = node.nextSibling ) {
1902                                        if ( node.nodeType == 1 ) {
1903                                                node.nodeIndex = count++;
1904                                        }
1905                                }
1906
1907                                parent[ doneName ] = count - 1;
1908                        }
1909
1910                        if ( type == "first" ) {
1911                                return elem.nodeIndex == 1;
1912                        } else if ( type == "last" ) {
1913                                return elem.nodeIndex == parent[ doneName ];
1914                        } else if ( type == "only" ) {
1915                                return parent[ doneName ] == 1;
1916                        } else if ( type == "nth" ) {
1917                                var add = false, first = match[2], last = match[3];
1918
1919                                if ( first == 1 && last == 0 ) {
1920                                        return true;
1921                                }
1922
1923                                if ( first == 0 ) {
1924                                        if ( elem.nodeIndex == last ) {
1925                                                add = true;
1926                                        }
1927                                } else if ( (elem.nodeIndex - last) % first == 0 && (elem.nodeIndex - last) / first >= 0 ) {
1928                                        add = true;
1929                                }
1930
1931                                return add;
1932                        }
1933                },
1934                PSEUDO: function(elem, match, i, array){
1935                        var name = match[1], filter = Expr.filters[ name ];
1936
1937                        if ( filter ) {
1938                                return filter( elem, i, match, array );
1939                        } else if ( name === "contains" ) {
1940                                return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
1941                        } else if ( name === "not" ) {
1942                                var not = match[3];
1943
1944                                for ( var i = 0, l = not.length; i < l; i++ ) {
1945                                        if ( not[i] === elem ) {
1946                                                return false;
1947                                        }
1948                                }
1949
1950                                return true;
1951                        }
1952                },
1953                ID: function(elem, match){
1954                        return elem.nodeType === 1 && elem.getAttribute("id") === match;
1955                },
1956                TAG: function(elem, match){
1957                        return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
1958                },
1959                CLASS: function(elem, match){
1960                        return match.test( elem.className );
1961                },
1962                ATTR: function(elem, match){
1963                        var result = Expr.attrHandle[ match[1] ] ? Expr.attrHandle[ match[1] ]( elem ) : elem[ match[1] ] || elem.getAttribute( match[1] ), value = result + "", type = match[2], check = match[4];
1964                        return result == null ?
1965                                type === "!=" :
1966                                type === "=" ?
1967                                value === check :
1968                                type === "*=" ?
1969                                value.indexOf(check) >= 0 :
1970                                type === "~=" ?
1971                                (" " + value + " ").indexOf(check) >= 0 :
1972                                !match[4] ?
1973                                result :
1974                                type === "!=" ?
1975                                value != check :
1976                                type === "^=" ?
1977                                value.indexOf(check) === 0 :
1978                                type === "$=" ?
1979                                value.substr(value.length - check.length) === check :
1980                                type === "|=" ?
1981                                value === check || value.substr(0, check.length + 1) === check + "-" :
1982                                false;
1983                },
1984                POS: function(elem, match, i, array){
1985                        var name = match[2], filter = Expr.setFilters[ name ];
1986
1987                        if ( filter ) {
1988                                return filter( elem, i, match, array );
1989                        }
1990                }
1991        }
1992};
1993
1994var origPOS = Expr.match.POS;
1995
1996for ( var type in Expr.match ) {
1997        Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
1998}
1999
2000var makeArray = function(array, results) {
2001        array = Array.prototype.slice.call( array );
2002
2003        if ( results ) {
2004                results.push.apply( results, array );
2005                return results;
2006        }
2007       
2008        return array;
2009};
2010
2011// Perform a simple check to determine if the browser is capable of
2012// converting a NodeList to an array using builtin methods.
2013try {
2014        Array.prototype.slice.call( document.documentElement.childNodes );
2015
2016// Provide a fallback method if it does not work
2017} catch(e){
2018        makeArray = function(array, results) {
2019                var ret = results || [];
2020
2021                if ( toString.call(array) === "[object Array]" ) {
2022                        Array.prototype.push.apply( ret, array );
2023                } else {
2024                        if ( typeof array.length === "number" ) {
2025                                for ( var i = 0, l = array.length; i < l; i++ ) {
2026                                        ret.push( array[i] );
2027                                }
2028                        } else {
2029                                for ( var i = 0; array[i]; i++ ) {
2030                                        ret.push( array[i] );
2031                                }
2032                        }
2033                }
2034
2035                return ret;
2036        };
2037}
2038
2039// Check to see if the browser returns elements by name when
2040// querying by getElementById (and provide a workaround)
2041(function(){
2042        // We're going to inject a fake input element with a specified name
2043        var form = document.createElement("form"),
2044                id = "script" + (new Date).getTime();
2045        form.innerHTML = "<input name='" + id + "'/>";
2046
2047        // Inject it into the root element, check its status, and remove it quickly
2048        var root = document.documentElement;
2049        root.insertBefore( form, root.firstChild );
2050
2051        // The workaround has to do additional checks after a getElementById
2052        // Which slows things down for other browsers (hence the branching)
2053        if ( !!document.getElementById( id ) ) {
2054                Expr.find.ID = function(match, context, isXML){
2055                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
2056                                var m = context.getElementById(match[1]);
2057                                return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
2058                        }
2059                };
2060
2061                Expr.filter.ID = function(elem, match){
2062                        var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
2063                        return elem.nodeType === 1 && node && node.nodeValue === match;
2064                };
2065        }
2066
2067        root.removeChild( form );
2068})();
2069
2070(function(){
2071        // Check to see if the browser returns only elements
2072        // when doing getElementsByTagName("*")
2073
2074        // Create a fake element
2075        var div = document.createElement("div");
2076        div.appendChild( document.createComment("") );
2077
2078        // Make sure no comments are found
2079        if ( div.getElementsByTagName("*").length > 0 ) {
2080                Expr.find.TAG = function(match, context){
2081                        var results = context.getElementsByTagName(match[1]);
2082
2083                        // Filter out possible comments
2084                        if ( match[1] === "*" ) {
2085                                var tmp = [];
2086
2087                                for ( var i = 0; results[i]; i++ ) {
2088                                        if ( results[i].nodeType === 1 ) {
2089                                                tmp.push( results[i] );
2090                                        }
2091                                }
2092
2093                                results = tmp;
2094                        }
2095
2096                        return results;
2097                };
2098        }
2099
2100        // Check to see if an attribute returns normalized href attributes
2101        div.innerHTML = "<a href='#'></a>";
2102        if ( div.firstChild && div.firstChild.getAttribute("href") !== "#" ) {
2103                Expr.attrHandle.href = function(elem){
2104                        return elem.getAttribute("href", 2);
2105                };
2106        }
2107})();
2108
2109if ( document.querySelectorAll ) (function(){
2110        var oldSizzle = Sizzle, div = document.createElement("div");
2111        div.innerHTML = "<p class='TEST'></p>";
2112
2113        // Safari can't handle uppercase or unicode characters when
2114        // in quirks mode.
2115        if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
2116                return;
2117        }
2118       
2119        Sizzle = function(query, context, extra, seed){
2120                context = context || document;
2121
2122                // Only use querySelectorAll on non-XML documents
2123                // (ID selectors don't work in non-HTML documents)
2124                if ( !seed && context.nodeType === 9 && !isXML(context) ) {
2125                        try {
2126                                return makeArray( context.querySelectorAll(query), extra );
2127                        } catch(e){}
2128                }
2129               
2130                return oldSizzle(query, context, extra, seed);
2131        };
2132
2133        Sizzle.find = oldSizzle.find;
2134        Sizzle.filter = oldSizzle.filter;
2135        Sizzle.selectors = oldSizzle.selectors;
2136        Sizzle.matches = oldSizzle.matches;
2137})();
2138
2139if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) {
2140        Expr.order.splice(1, 0, "CLASS");
2141        Expr.find.CLASS = function(match, context) {
2142                return context.getElementsByClassName(match[1]);
2143        };
2144}
2145
2146function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
2147        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2148                var elem = checkSet[i];
2149                if ( elem ) {
2150                        elem = elem[dir];
2151                        var match = false;
2152
2153                        while ( elem && elem.nodeType ) {
2154                                var done = elem[doneName];
2155                                if ( done ) {
2156                                        match = checkSet[ done ];
2157                                        break;
2158                                }
2159
2160                                if ( elem.nodeType === 1 && !isXML )
2161                                        elem[doneName] = i;
2162
2163                                if ( elem.nodeName === cur ) {
2164                                        match = elem;
2165                                        break;
2166                                }
2167
2168                                elem = elem[dir];
2169                        }
2170
2171                        checkSet[i] = match;
2172                }
2173        }
2174}
2175
2176function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
2177        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2178                var elem = checkSet[i];
2179                if ( elem ) {
2180                        elem = elem[dir];
2181                        var match = false;
2182
2183                        while ( elem && elem.nodeType ) {
2184                                if ( elem[doneName] ) {
2185                                        match = checkSet[ elem[doneName] ];
2186                                        break;
2187                                }
2188
2189                                if ( elem.nodeType === 1 ) {
2190                                        if ( !isXML )
2191                                                elem[doneName] = i;
2192
2193                                        if ( typeof cur !== "string" ) {
2194                                                if ( elem === cur ) {
2195                                                        match = true;
2196                                                        break;
2197                                                }
2198
2199                                        } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
2200                                                match = elem;
2201                                                break;
2202                                        }
2203                                }
2204
2205                                elem = elem[dir];
2206                        }
2207
2208                        checkSet[i] = match;
2209                }
2210        }
2211}
2212
2213var contains = document.compareDocumentPosition ?  function(a, b){
2214        return a.compareDocumentPosition(b) & 16;
2215} : function(a, b){
2216        return a !== b && (a.contains ? a.contains(b) : true);
2217};
2218
2219var isXML = function(elem){
2220        return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
2221                !!elem.ownerDocument && isXML( elem.ownerDocument );
2222};
2223
2224var posProcess = function(selector, context){
2225        var tmpSet = [], later = "", match,
2226                root = context.nodeType ? [context] : context;
2227
2228        // Position selectors must be done after the filter
2229        // And so must :not(positional) so we move all PSEUDOs to the end
2230        while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
2231                later += match[0];
2232                selector = selector.replace( Expr.match.PSEUDO, "" );
2233        }
2234
2235        selector = Expr.relative[selector] ? selector + "*" : selector;
2236
2237        for ( var i = 0, l = root.length; i < l; i++ ) {
2238                Sizzle( selector, root[i], tmpSet );
2239        }
2240
2241        return Sizzle.filter( later, tmpSet );
2242};
2243
2244// EXPOSE
2245jQuery.find = Sizzle;
2246jQuery.filter = Sizzle.filter;
2247jQuery.expr = Sizzle.selectors;
2248jQuery.expr[":"] = jQuery.expr.filters;
2249
2250Sizzle.selectors.filters.hidden = function(elem){
2251        return "hidden" === elem.type ||
2252                jQuery.css(elem, "display") === "none" ||
2253                jQuery.css(elem, "visibility") === "hidden";
2254};
2255
2256Sizzle.selectors.filters.visible = function(elem){
2257        return "hidden" !== elem.type &&
2258                jQuery.css(elem, "display") !== "none" &&
2259                jQuery.css(elem, "visibility") !== "hidden";
2260};
2261
2262Sizzle.selectors.filters.animated = function(elem){
2263        return jQuery.grep(jQuery.timers, function(fn){
2264                return elem === fn.elem;
2265        }).length;
2266};
2267
2268jQuery.multiFilter = function( expr, elems, not ) {
2269        if ( not ) {
2270                expr = ":not(" + expr + ")";
2271        }
2272
2273        return Sizzle.matches(expr, elems);
2274};
2275
2276jQuery.dir = function( elem, dir ){
2277        var matched = [], cur = elem[dir];
2278        while ( cur && cur != document ) {
2279                if ( cur.nodeType == 1 )
2280                        matched.push( cur );
2281                cur = cur[dir];
2282        }
2283        return matched;
2284};
2285
2286jQuery.nth = function(cur, result, dir, elem){
2287        result = result || 1;
2288        var num = 0;
2289
2290        for ( ; cur; cur = cur[dir] )
2291                if ( cur.nodeType == 1 && ++num == result )
2292                        break;
2293
2294        return cur;
2295};
2296
2297jQuery.sibling = function(n, elem){
2298        var r = [];
2299
2300        for ( ; n; n = n.nextSibling ) {
2301                if ( n.nodeType == 1 && n != elem )
2302                        r.push( n );
2303        }
2304
2305        return r;
2306};
2307
2308return;
2309
2310window.Sizzle = Sizzle;
2311
2312})();
2313/*
2314 * A number of helper functions used for managing events.
2315 * Many of the ideas behind this code originated from
2316 * Dean Edwards' addEvent library.
2317 */
2318jQuery.event = {
2319
2320        // Bind an event to an element
2321        // Original by Dean Edwards
2322        add: function(elem, types, handler, data) {
2323                if ( elem.nodeType == 3 || elem.nodeType == 8 )
2324                        return;
2325
2326                // For whatever reason, IE has trouble passing the window object
2327                // around, causing it to be cloned in the process
2328                if ( elem.setInterval && elem != window )
2329                        elem = window;
2330
2331                // Make sure that the function being executed has a unique ID
2332                if ( !handler.guid )
2333                        handler.guid = this.guid++;
2334
2335                // if data is passed, bind to handler
2336                if ( data !== undefined ) {
2337                        // Create temporary function pointer to original handler
2338                        var fn = handler;
2339
2340                        // Create unique handler function, wrapped around original handler
2341                        handler = this.proxy( fn );
2342
2343                        // Store data in unique handler
2344                        handler.data = data;
2345                }
2346
2347                // Init the element's event structure
2348                var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
2349                        handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
2350                                // Handle the second event of a trigger and when
2351                                // an event is called after a page has unloaded
2352                                return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
2353                                        jQuery.event.handle.apply(arguments.callee.elem, arguments) :
2354                                        undefined;
2355                        });
2356                // Add elem as a property of the handle function
2357                // This is to prevent a memory leak with non-native
2358                // event in IE.
2359                handle.elem = elem;
2360
2361                // Handle multiple events separated by a space
2362                // jQuery(...).bind("mouseover mouseout", fn);
2363                jQuery.each(types.split(/\s+/), function(index, type) {
2364                        // Namespaced event handlers
2365                        var namespaces = type.split(".");
2366                        type = namespaces.shift();
2367                        handler.type = namespaces.slice().sort().join(".");
2368
2369                        // Get the current list of functions bound to this event
2370                        var handlers = events[type];
2371                       
2372                        if ( jQuery.event.specialAll[type] )
2373                                jQuery.event.specialAll[type].setup.call(elem, data, namespaces);
2374
2375                        // Init the event handler queue
2376                        if (!handlers) {
2377                                handlers = events[type] = {};
2378
2379                                // Check for a special event handler
2380                                // Only use addEventListener/attachEvent if the special
2381                                // events handler returns false
2382                                if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) {
2383                                        // Bind the global event handler to the element
2384                                        if (elem.addEventListener)
2385                                                elem.addEventListener(type, handle, false);
2386                                        else if (elem.attachEvent)
2387                                                elem.attachEvent("on" + type, handle);
2388                                }
2389                        }
2390
2391                        // Add the function to the element's handler list
2392                        handlers[handler.guid] = handler;
2393
2394                        // Keep track of which events have been used, for global triggering
2395                        jQuery.event.global[type] = true;
2396                });
2397
2398                // Nullify elem to prevent memory leaks in IE
2399                elem = null;
2400        },
2401
2402        guid: 1,
2403        global: {},
2404
2405        // Detach an event or set of events from an element
2406        remove: function(elem, types, handler) {
2407                // don't do events on text and comment nodes
2408                if ( elem.nodeType == 3 || elem.nodeType == 8 )
2409                        return;
2410
2411                var events = jQuery.data(elem, "events"), ret, index;
2412
2413                if ( events ) {
2414                        // Unbind all events for the element
2415                        if ( types === undefined || (typeof types === "string" && types.charAt(0) == ".") )
2416                                for ( var type in events )
2417                                        this.remove( elem, type + (types || "") );
2418                        else {
2419                                // types is actually an event object here
2420                                if ( types.type ) {
2421                                        handler = types.handler;
2422                                        types = types.type;
2423                                }
2424
2425                                // Handle multiple events seperated by a space
2426                                // jQuery(...).unbind("mouseover mouseout", fn);
2427                                jQuery.each(types.split(/\s+/), function(index, type){
2428                                        // Namespaced event handlers
2429                                        var namespaces = type.split(".");
2430                                        type = namespaces.shift();
2431                                        var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
2432
2433                                        if ( events[type] ) {
2434                                                // remove the given handler for the given type
2435                                                if ( handler )
2436                                                        delete events[type][handler.guid];
2437
2438                                                // remove all handlers for the given type
2439                                                else
2440                                                        for ( var handle in events[type] )
2441                                                                // Handle the removal of namespaced events
2442                                                                if ( namespace.test(events[type][handle].type) )
2443                                                                        delete events[type][handle];
2444                                                                       
2445                                                if ( jQuery.event.specialAll[type] )
2446                                                        jQuery.event.specialAll[type].teardown.call(elem, namespaces);
2447
2448                                                // remove generic event handler if no more handlers exist
2449                                                for ( ret in events[type] ) break;
2450                                                if ( !ret ) {
2451                                                        if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem, namespaces) === false ) {
2452                                                                if (elem.removeEventListener)
2453                                                                        elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
2454                                                                else if (elem.detachEvent)
2455                                                                        elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
2456                                                        }
2457                                                        ret = null;
2458                                                        delete events[type];
2459                                                }
2460                                        }
2461                                });
2462                        }
2463
2464                        // Remove the expando if it's no longer used
2465                        for ( ret in events ) break;
2466                        if ( !ret ) {
2467                                var handle = jQuery.data( elem, "handle" );
2468                                if ( handle ) handle.elem = null;
2469                                jQuery.removeData( elem, "events" );
2470                                jQuery.removeData( elem, "handle" );
2471                        }
2472                }
2473        },
2474
2475        // bubbling is internal
2476        trigger: function( event, data, elem, bubbling ) {
2477                // Event object or event type
2478                var type = event.type || event;
2479
2480                if( !bubbling ){
2481                        event = typeof event === "object" ?
2482                                // jQuery.Event object
2483                                event[expando] ? event :
2484                                // Object literal
2485                                jQuery.extend( jQuery.Event(type), event ) :
2486                                // Just the event type (string)
2487                                jQuery.Event(type);
2488
2489                        if ( type.indexOf("!") >= 0 ) {
2490                                event.type = type = type.slice(0, -1);
2491                                event.exclusive = true;
2492                        }
2493
2494                        // Handle a global trigger
2495                        if ( !elem ) {
2496                                // Don't bubble custom events when global (to avoid too much overhead)
2497                                event.stopPropagation();
2498                                // Only trigger if we've ever bound an event for it
2499                                if ( this.global[type] )
2500                                        jQuery.each( jQuery.cache, function(){
2501                                                if ( this.events && this.events[type] )
2502                                                        jQuery.event.trigger( event, data, this.handle.elem );
2503                                        });
2504                        }
2505
2506                        // Handle triggering a single element
2507
2508                        // don't do events on text and comment nodes
2509                        if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 )
2510                                return undefined;
2511                       
2512                        // Clean up in case it is reused
2513                        event.result = undefined;
2514                        event.target = elem;
2515                       
2516                        // Clone the incoming data, if any
2517                        data = jQuery.makeArray(data);
2518                        data.unshift( event );
2519                }
2520
2521                event.currentTarget = elem;
2522
2523                // Trigger the event, it is assumed that "handle" is a function
2524                var handle = jQuery.data(elem, "handle");
2525                if ( handle )
2526                        handle.apply( elem, data );
2527
2528                // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
2529                if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
2530                        event.result = false;
2531
2532                // Trigger the native events (except for clicks on links)
2533                if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
2534                        this.triggered = true;
2535                        try {
2536                                elem[ type ]();
2537                        // prevent IE from throwing an error for some hidden elements
2538                        } catch (e) {}
2539                }
2540
2541                this.triggered = false;
2542
2543                if ( !event.isPropagationStopped() ) {
2544                        var parent = elem.parentNode || elem.ownerDocument;
2545                        if ( parent )
2546                                jQuery.event.trigger(event, data, parent, true);
2547                }
2548        },
2549
2550        handle: function(event) {
2551                // returned undefined or false
2552                var all, handlers;
2553
2554                event = arguments[0] = jQuery.event.fix( event || window.event );
2555
2556                // Namespaced event handlers
2557                var namespaces = event.type.split(".");
2558                event.type = namespaces.shift();
2559
2560                // Cache this now, all = true means, any handler
2561                all = !namespaces.length && !event.exclusive;
2562               
2563                var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
2564
2565                handlers = ( jQuery.data(this, "events") || {} )[event.type];
2566
2567                for ( var j in handlers ) {
2568                        var handler = handlers[j];
2569
2570                        // Filter the functions by class
2571                        if ( all || namespace.test(handler.type) ) {
2572                                // Pass in a reference to the handler function itself
2573                                // So that we can later remove it
2574                                event.handler = handler;
2575                                event.data = handler.data;
2576
2577                                var ret = handler.apply(this, arguments);
2578
2579                                if( ret !== undefined ){
2580                                        event.result = ret;
2581                                        if ( ret === false ) {
2582                                                event.preventDefault();
2583                                                event.stopPropagation();
2584                                        }
2585                                }
2586
2587                                if( event.isImmediatePropagationStopped() )
2588                                        break;
2589
2590                        }
2591                }
2592        },
2593
2594        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(" "),
2595
2596        fix: function(event) {
2597                if ( event[expando] )
2598                        return event;
2599
2600                // store a copy of the original event object
2601                // and "clone" to set read-only properties
2602                var originalEvent = event;
2603                event = jQuery.Event( originalEvent );
2604
2605                for ( var i = this.props.length, prop; i; ){
2606                        prop = this.props[ --i ];
2607                        event[ prop ] = originalEvent[ prop ];
2608                }
2609
2610                // Fix target property, if necessary
2611                if ( !event.target )
2612                        event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
2613
2614                // check if target is a textnode (safari)
2615                if ( event.target.nodeType == 3 )
2616                        event.target = event.target.parentNode;
2617
2618                // Add relatedTarget, if necessary
2619                if ( !event.relatedTarget && event.fromElement )
2620                        event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
2621
2622                // Calculate pageX/Y if missing and clientX/Y available
2623                if ( event.pageX == null && event.clientX != null ) {
2624                        var doc = document.documentElement, body = document.body;
2625                        event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
2626                        event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
2627                }
2628
2629                // Add which for key events
2630                if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
2631                        event.which = event.charCode || event.keyCode;
2632
2633                // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
2634                if ( !event.metaKey && event.ctrlKey )
2635                        event.metaKey = event.ctrlKey;
2636
2637                // Add which for click: 1 == left; 2 == middle; 3 == right
2638                // Note: button is not normalized, so don't use it
2639                if ( !event.which && event.button )
2640                        event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
2641
2642                return event;
2643        },
2644
2645        proxy: function( fn, proxy ){
2646                proxy = proxy || function(){ return fn.apply(this, arguments); };
2647                // Set the guid of unique handler to the same of original handler, so it can be removed
2648                proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
2649                // So proxy can be declared as an argument
2650                return proxy;
2651        },
2652
2653        special: {
2654                ready: {
2655                        // Make sure the ready event is setup
2656                        setup: bindReady,
2657                        teardown: function() {}
2658                }
2659        },
2660       
2661        specialAll: {
2662                live: {
2663                        setup: function( selector, namespaces ){
2664                                jQuery.event.add( this, namespaces[0], liveHandler );
2665                        },
2666                        teardown:  function( namespaces ){
2667                                if ( namespaces.length ) {
2668                                        var remove = 0, name = RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)");
2669                                       
2670                                        jQuery.each( (jQuery.data(this, "events").live || {}), function(){
2671                                                if ( name.test(this.type) )
2672                                                        remove++;
2673                                        });
2674                                       
2675                                        if ( remove < 1 )
2676                                                jQuery.event.remove( this, namespaces[0], liveHandler );
2677                                }
2678                        }
2679                }
2680        }
2681};
2682
2683jQuery.Event = function( src ){
2684        // Allow instantiation without the 'new' keyword
2685        if( !this.preventDefault )
2686                return new jQuery.Event(src);
2687       
2688        // Event object
2689        if( src && src.type ){
2690                this.originalEvent = src;
2691                this.type = src.type;
2692        // Event type
2693        }else
2694                this.type = src;
2695
2696        // timeStamp is buggy for some events on Firefox(#3843)
2697        // So we won't rely on the native value
2698        this.timeStamp = now();
2699       
2700        // Mark it as fixed
2701        this[expando] = true;
2702};
2703
2704function returnFalse(){
2705        return false;
2706}
2707function returnTrue(){
2708        return true;
2709}
2710
2711// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
2712// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
2713jQuery.Event.prototype = {
2714        preventDefault: function() {
2715                this.isDefaultPrevented = returnTrue;
2716
2717                var e = this.originalEvent;
2718                if( !e )
2719                        return;
2720                // if preventDefault exists run it on the original event
2721                if (e.preventDefault)
2722                        e.preventDefault();
2723                // otherwise set the returnValue property of the original event to false (IE)
2724                e.returnValue = false;
2725        },
2726        stopPropagation: function() {
2727                this.isPropagationStopped = returnTrue;
2728
2729                var e = this.originalEvent;
2730                if( !e )
2731                        return;
2732                // if stopPropagation exists run it on the original event
2733                if (e.stopPropagation)
2734                        e.stopPropagation();
2735                // otherwise set the cancelBubble property of the original event to true (IE)
2736                e.cancelBubble = true;
2737        },
2738        stopImmediatePropagation:function(){
2739                this.isImmediatePropagationStopped = returnTrue;
2740                this.stopPropagation();
2741        },
2742        isDefaultPrevented: returnFalse,
2743        isPropagationStopped: returnFalse,
2744        isImmediatePropagationStopped: returnFalse
2745};
2746// Checks if an event happened on an element within another element
2747// Used in jQuery.event.special.mouseenter and mouseleave handlers
2748var withinElement = function(event) {
2749        // Check if mouse(over|out) are still within the same parent element
2750        var parent = event.relatedTarget;
2751        // Traverse up the tree
2752        while ( parent && parent != this )
2753                try { parent = parent.parentNode; }
2754                catch(e) { parent = this; }
2755       
2756        if( parent != this ){
2757                // set the correct event type
2758                event.type = event.data;
2759                // handle event if we actually just moused on to a non sub-element
2760                jQuery.event.handle.apply( this, arguments );
2761        }
2762};
2763       
2764jQuery.each({
2765        mouseover: 'mouseenter',
2766        mouseout: 'mouseleave'
2767}, function( orig, fix ){
2768        jQuery.event.special[ fix ] = {
2769                setup: function(){
2770                        jQuery.event.add( this, orig, withinElement, fix );
2771                },
2772                teardown: function(){
2773                        jQuery.event.remove( this, orig, withinElement );
2774                }
2775        };                         
2776});
2777
2778jQuery.fn.extend({
2779        bind: function( type, data, fn ) {
2780                return type == "unload" ? this.one(type, data, fn) : this.each(function(){
2781                        jQuery.event.add( this, type, fn || data, fn && data );
2782                });
2783        },
2784
2785        one: function( type, data, fn ) {
2786                var one = jQuery.event.proxy( fn || data, function(event) {
2787                        jQuery(this).unbind(event, one);
2788                        return (fn || data).apply( this, arguments );
2789                });
2790                return this.each(function(){
2791                        jQuery.event.add( this, type, one, fn && data);
2792                });
2793        },
2794
2795        unbind: function( type, fn ) {
2796                return this.each(function(){
2797                        jQuery.event.remove( this, type, fn );
2798                });
2799        },
2800
2801        trigger: function( type, data ) {
2802                return this.each(function(){
2803                        jQuery.event.trigger( type, data, this );
2804                });
2805        },
2806
2807        triggerHandler: function( type, data ) {
2808                if( this[0] ){
2809                        var event = jQuery.Event(type);
2810                        event.preventDefault();
2811                        event.stopPropagation();
2812                        jQuery.event.trigger( event, data, this[0] );
2813                        return event.result;
2814                }               
2815        },
2816
2817        toggle: function( fn ) {
2818                // Save reference to arguments for access in closure
2819                var args = arguments, i = 1;
2820
2821                // link all the functions, so any of them can unbind this click handler
2822                while( i < args.length )
2823                        jQuery.event.proxy( fn, args[i++] );
2824
2825                return this.click( jQuery.event.proxy( fn, function(event) {
2826                        // Figure out which function to execute
2827                        this.lastToggle = ( this.lastToggle || 0 ) % i;
2828
2829                        // Make sure that clicks stop
2830                        event.preventDefault();
2831
2832                        // and execute the function
2833                        return args[ this.lastToggle++ ].apply( this, arguments ) || false;
2834                }));
2835        },
2836
2837        hover: function(fnOver, fnOut) {
2838                return this.mouseenter(fnOver).mouseleave(fnOut);
2839        },
2840
2841        ready: function(fn) {
2842                // Attach the listeners
2843                bindReady();
2844
2845                // If the DOM is already ready
2846                if ( jQuery.isReady )
2847                        // Execute the function immediately
2848                        fn.call( document, jQuery );
2849
2850                // Otherwise, remember the function for later
2851                else
2852                        // Add the function to the wait list
2853                        jQuery.readyList.push( fn );
2854
2855                return this;
2856        },
2857       
2858        live: function( type, fn ){
2859                var proxy = jQuery.event.proxy( fn );
2860                proxy.guid += this.selector + type;
2861
2862                jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy );
2863
2864                return this;
2865        },
2866       
2867        die: function( type, fn ){
2868                jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null );
2869                return this;
2870        }
2871});
2872
2873function liveHandler( event ){
2874        var check = RegExp("(^|\\.)" + event.type + "(\\.|$)"),
2875                stop = true,
2876                elems = [];
2877
2878        jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){
2879                if ( check.test(fn.type) ) {
2880                        var elem = jQuery(event.target).closest(fn.data)[0];
2881                        if ( elem )
2882                                elems.push({ elem: elem, fn: fn });
2883                }
2884        });
2885
2886        jQuery.each(elems, function(){
2887                if ( this.fn.call(this.elem, event, this.fn.data) === false )
2888                        stop = false;
2889        });
2890
2891        return stop;
2892}
2893
2894function liveConvert(type, selector){
2895        return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "|")].join(".");
2896}
2897
2898jQuery.extend({
2899        isReady: false,
2900        readyList: [],
2901        // Handle when the DOM is ready
2902        ready: function() {
2903                // Make sure that the DOM is not already loaded
2904                if ( !jQuery.isReady ) {
2905                        // Remember that the DOM is ready
2906                        jQuery.isReady = true;
2907
2908                        // If there are functions bound, to execute
2909                        if ( jQuery.readyList ) {
2910                                // Execute all of them
2911                                jQuery.each( jQuery.readyList, function(){
2912                                        this.call( document, jQuery );
2913                                });
2914
2915                                // Reset the list of functions
2916                                jQuery.readyList = null;
2917                        }
2918
2919                        // Trigger any bound ready events
2920                        jQuery(document).triggerHandler("ready");
2921                }
2922        }
2923});
2924
2925var readyBound = false;
2926
2927function bindReady(){
2928        if ( readyBound ) return;
2929        readyBound = true;
2930
2931        // Mozilla, Opera and webkit nightlies currently support this event
2932        if ( document.addEventListener ) {
2933                // Use the handy event callback
2934                document.addEventListener( "DOMContentLoaded", function(){
2935                        document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
2936                        jQuery.ready();
2937                }, false );
2938
2939        // If IE event model is used
2940        } else if ( document.attachEvent ) {
2941                // ensure firing before onload,
2942                // maybe late but safe also for iframes
2943                document.attachEvent("onreadystatechange", function(){
2944                        if ( document.readyState === "complete" ) {
2945                                document.detachEvent( "onreadystatechange", arguments.callee );
2946                                jQuery.ready();
2947                        }
2948                });
2949
2950                // If IE and not an iframe
2951                // continually check to see if the document is ready
2952                if ( document.documentElement.doScroll && typeof window.frameElement === "undefined" ) (function(){
2953                        if ( jQuery.isReady ) return;
2954
2955                        try {
2956                                // If IE is used, use the trick by Diego Perini
2957                                // http://javascript.nwbox.com/IEContentLoaded/
2958                                document.documentElement.doScroll("left");
2959                        } catch( error ) {
2960                                setTimeout( arguments.callee, 0 );
2961                                return;
2962                        }
2963
2964                        // and execute any waiting functions
2965                        jQuery.ready();
2966                })();
2967        }
2968
2969        // A fallback to window.onload, that will always work
2970        jQuery.event.add( window, "load", jQuery.ready );
2971}
2972
2973jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
2974        "mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," +
2975        "change,select,submit,keydown,keypress,keyup,error").split(","), function(i, name){
2976
2977        // Handle event binding
2978        jQuery.fn[name] = function(fn){
2979                return fn ? this.bind(name, fn) : this.trigger(name);
2980        };
2981});
2982
2983// Prevent memory leaks in IE
2984// And prevent errors on refresh with events like mouseover in other browsers
2985// Window isn't included so as not to unbind existing unload events
2986jQuery( window ).bind( 'unload', function(){
2987        for ( var id in jQuery.cache )
2988                // Skip the window
2989                if ( id != 1 && jQuery.cache[ id ].handle )
2990                        jQuery.event.remove( jQuery.cache[ id ].handle.elem );
2991});
2992(function(){
2993
2994        jQuery.support = {};
2995
2996        var root = document.documentElement,
2997                script = document.createElement("script"),
2998                div = document.createElement("div"),
2999                id = "script" + (new Date).getTime();
3000
3001        div.style.display = "none";
3002        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>';
3003
3004        var all = div.getElementsByTagName("*"),
3005                a = div.getElementsByTagName("a")[0];
3006
3007        // Can't get basic test support
3008        if ( !all || !all.length || !a ) {
3009                return;
3010        }
3011
3012        jQuery.support = {
3013                // IE strips leading whitespace when .innerHTML is used
3014                leadingWhitespace: div.firstChild.nodeType == 3,
3015               
3016                // Make sure that tbody elements aren't automatically inserted
3017                // IE will insert them into empty tables
3018                tbody: !div.getElementsByTagName("tbody").length,
3019               
3020                // Make sure that you can get all elements in an <object> element
3021                // IE 7 always returns no results
3022                objectAll: !!div.getElementsByTagName("object")[0]
3023                        .getElementsByTagName("*").length,
3024               
3025                // Make sure that link elements get serialized correctly by innerHTML
3026                // This requires a wrapper element in IE
3027                htmlSerialize: !!div.getElementsByTagName("link").length,
3028               
3029                // Get the style information from getAttribute
3030                // (IE uses .cssText insted)
3031                style: /red/.test( a.getAttribute("style") ),
3032               
3033                // Make sure that URLs aren't manipulated
3034                // (IE normalizes it by default)
3035                hrefNormalized: a.getAttribute("href") === "/a",
3036               
3037                // Make sure that element opacity exists
3038                // (IE uses filter instead)
3039                opacity: a.style.opacity === "0.5",
3040               
3041                // Verify style float existence
3042                // (IE uses styleFloat instead of cssFloat)
3043                cssFloat: !!a.style.cssFloat,
3044
3045                // Will be defined later
3046                scriptEval: false,
3047                noCloneEvent: true,
3048                boxModel: null
3049        };
3050       
3051        script.type = "text/javascript";
3052        try {
3053                script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
3054        } catch(e){}
3055
3056        root.insertBefore( script, root.firstChild );
3057       
3058        // Make sure that the execution of code works by injecting a script
3059        // tag with appendChild/createTextNode
3060        // (IE doesn't support this, fails, and uses .text instead)
3061        if ( window[ id ] ) {
3062                jQuery.support.scriptEval = true;
3063                delete window[ id ];
3064        }
3065
3066        root.removeChild( script );
3067
3068        if ( div.attachEvent && div.fireEvent ) {
3069                div.attachEvent("onclick", function(){
3070                        // Cloning a node shouldn't copy over any
3071                        // bound event handlers (IE does this)
3072                        jQuery.support.noCloneEvent = false;
3073                        div.detachEvent("onclick", arguments.callee);
3074                });
3075                div.cloneNode(true).fireEvent("onclick");
3076        }
3077
3078        // Figure out if the W3C box model works as expected
3079        // document.body must exist before we can do this
3080        jQuery(function(){
3081                var div = document.createElement("div");
3082                div.style.width = "1px";
3083                div.style.paddingLeft = "1px";
3084
3085                document.body.appendChild( div );
3086                jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
3087                document.body.removeChild( div );
3088        });
3089})();
3090
3091var styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat";
3092
3093jQuery.props = {
3094        "for": "htmlFor",
3095        "class": "className",
3096        "float": styleFloat,
3097        cssFloat: styleFloat,
3098        styleFloat: styleFloat,
3099        readonly: "readOnly",
3100        maxlength: "maxLength",
3101        cellspacing: "cellSpacing",
3102        rowspan: "rowSpan",
3103        tabindex: "tabIndex"
3104};
3105jQuery.fn.extend({
3106        // Keep a copy of the old load
3107        _load: jQuery.fn.load,
3108
3109        load: function( url, params, callback ) {
3110                if ( typeof url !== "string" )
3111                        return this._load( url );
3112
3113                var off = url.indexOf(" ");
3114                if ( off >= 0 ) {
3115                        var selector = url.slice(off, url.length);
3116                        url = url.slice(0, off);
3117                }
3118
3119                // Default to a GET request
3120                var type = "GET";
3121
3122                // If the second parameter was provided
3123                if ( params )
3124                        // If it's a function
3125                        if ( jQuery.isFunction( params ) ) {
3126                                // We assume that it's the callback
3127                                callback = params;
3128                                params = null;
3129
3130                        // Otherwise, build a param string
3131                        } else if( typeof params === "object" ) {
3132                                params = jQuery.param( params );
3133                                type = "POST";
3134                        }
3135
3136                var self = this;
3137
3138                // Request the remote document
3139                jQuery.ajax({
3140                        url: url,
3141                        type: type,
3142                        dataType: "html",
3143                        data: params,
3144                        complete: function(res, status){
3145                                // If successful, inject the HTML into all the matched elements
3146                                if ( status == "success" || status == "notmodified" )
3147                                        // See if a selector was specified
3148                                        self.html( selector ?
3149                                                // Create a dummy div to hold the results
3150                                                jQuery("<div/>")
3151                                                        // inject the contents of the document in, removing the scripts
3152                                                        // to avoid any 'Permission Denied' errors in IE
3153                                                        .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
3154
3155                                                        // Locate the specified elements
3156                                                        .find(selector) :
3157
3158                                                // If not, just inject the full result
3159                                                res.responseText );
3160
3161                                if( callback )
3162                                        self.each( callback, [res.responseText, status, res] );
3163                        }
3164                });
3165                return this;
3166        },
3167
3168        serialize: function() {
3169                return jQuery.param(this.serializeArray());
3170        },
3171        serializeArray: function() {
3172                return this.map(function(){
3173                        return this.elements ? jQuery.makeArray(this.elements) : this;
3174                })
3175                .filter(function(){
3176                        return this.name && !this.disabled &&
3177                                (this.checked || /select|textarea/i.test(this.nodeName) ||
3178                                        /text|hidden|password/i.test(this.type));
3179                })
3180                .map(function(i, elem){
3181                        var val = jQuery(this).val();
3182                        return val == null ? null :
3183                                jQuery.isArray(val) ?
3184                                        jQuery.map( val, function(val, i){
3185                                                return {name: elem.name, value: val};
3186                                        }) :
3187                                        {name: elem.name, value: val};
3188                }).get();
3189        }
3190});
3191
3192// Attach a bunch of functions for handling common AJAX events
3193jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
3194        jQuery.fn[o] = function(f){
3195                return this.bind(o, f);
3196        };
3197});
3198
3199var jsc = now();
3200
3201jQuery.extend({
3202 
3203        get: function( url, data, callback, type ) {
3204                // shift arguments if data argument was ommited
3205                if ( jQuery.isFunction( data ) ) {
3206                        callback = data;
3207                        data = null;
3208                }
3209
3210                return jQuery.ajax({
3211                        type: "GET",
3212                        url: url,
3213                        data: data,
3214                        success: callback,
3215                        dataType: type
3216                });
3217        },
3218
3219        getScript: function( url, callback ) {
3220                return jQuery.get(url, null, callback, "script");
3221        },
3222
3223        getJSON: function( url, data, callback ) {
3224                return jQuery.get(url, data, callback, "json");
3225        },
3226
3227        post: function( url, data, callback, type ) {
3228                if ( jQuery.isFunction( data ) ) {
3229                        callback = data;
3230                        data = {};
3231                }
3232
3233                return jQuery.ajax({
3234                        type: "POST",
3235                        url: url,
3236                        data: data,
3237                        success: callback,
3238                        dataType: type
3239                });
3240        },
3241
3242        ajaxSetup: function( settings ) {
3243                jQuery.extend( jQuery.ajaxSettings, settings );
3244        },
3245
3246        ajaxSettings: {
3247                url: location.href,
3248                global: true,
3249                type: "GET",
3250                contentType: "application/x-www-form-urlencoded",
3251                processData: true,
3252                async: true,
3253                /*
3254                timeout: 0,
3255                data: null,
3256                username: null,
3257                password: null,
3258                */
3259                // Create the request object; Microsoft failed to properly
3260                // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
3261                // This function can be overriden by calling jQuery.ajaxSetup
3262                xhr:function(){
3263                        return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
3264                },
3265                accepts: {
3266                        xml: "application/xml, text/xml",
3267                        html: "text/html",
3268                        script: "text/javascript, application/javascript",
3269                        json: "application/json, text/javascript",
3270                        text: "text/plain",
3271                        _default: "*/*"
3272                }
3273        },
3274
3275        // Last-Modified header cache for next request
3276        lastModified: {},
3277
3278        ajax: function( s ) {
3279                // Extend the settings, but re-extend 's' so that it can be
3280                // checked again later (in the test suite, specifically)
3281                s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
3282
3283                var jsonp, jsre = /=\?(&|$)/g, status, data,
3284                        type = s.type.toUpperCase();
3285
3286                // convert data if not already a string
3287                if ( s.data && s.processData && typeof s.data !== "string" )
3288                        s.data = jQuery.param(s.data);
3289
3290                // Handle JSONP Parameter Callbacks
3291                if ( s.dataType == "jsonp" ) {
3292                        if ( type == "GET" ) {
3293                                if ( !s.url.match(jsre) )
3294                                        s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
3295                        } else if ( !s.data || !s.data.match(jsre) )
3296                                s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
3297                        s.dataType = "json";
3298                }
3299
3300                // Build temporary JSONP function
3301                if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
3302                        jsonp = "jsonp" + jsc++;
3303
3304                        // Replace the =? sequence both in the query string and the data
3305                        if ( s.data )
3306                                s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
3307                        s.url = s.url.replace(jsre, "=" + jsonp + "$1");
3308
3309                        // We need to make sure
3310                        // that a JSONP style response is executed properly
3311                        s.dataType = "script";
3312
3313                        // Handle JSONP-style loading
3314                        window[ jsonp ] = function(tmp){
3315                                data = tmp;
3316                                success();
3317                                complete();
3318                                // Garbage collect
3319                                window[ jsonp ] = undefined;
3320                                try{ delete window[ jsonp ]; } catch(e){}
3321                                if ( head )
3322                                        head.removeChild( script );
3323                        };
3324                }
3325
3326                if ( s.dataType == "script" && s.cache == null )
3327                        s.cache = false;
3328
3329                if ( s.cache === false && type == "GET" ) {
3330                        var ts = now();
3331                        // try replacing _= if it is there
3332                        var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
3333                        // if nothing was replaced, add timestamp to the end
3334                        s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
3335                }
3336
3337                // If data is available, append data to url for get requests
3338                if ( s.data && type == "GET" ) {
3339                        s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
3340
3341                        // IE likes to send both get and post data, prevent this
3342                        s.data = null;
3343                }
3344
3345                // Watch for a new set of requests
3346                if ( s.global && ! jQuery.active++ )
3347                        jQuery.event.trigger( "ajaxStart" );
3348
3349                // Matches an absolute URL, and saves the domain
3350                var parts = /^(\w+:)?\/\/([^\/?#]+)/.exec( s.url );
3351
3352                // If we're requesting a remote document
3353                // and trying to load JSON or Script with a GET
3354                if ( s.dataType == "script" && type == "GET" && parts
3355                        && ( parts[1] && parts[1] != location.protocol || parts[2] != location.host )){
3356
3357                        var head = document.getElementsByTagName("head")[0];
3358                        var script = document.createElement("script");
3359                        script.src = s.url;
3360                        if (s.scriptCharset)
3361                                script.charset = s.scriptCharset;
3362
3363                        // Handle Script loading
3364                        if ( !jsonp ) {
3365                                var done = false;
3366
3367                                // Attach handlers for all browsers
3368                                script.onload = script.onreadystatechange = function(){
3369                                        if ( !done && (!this.readyState ||
3370                                                        this.readyState == "loaded" || this.readyState == "complete") ) {
3371                                                done = true;
3372                                                success();
3373                                                complete();
3374                                                head.removeChild( script );
3375                                        }
3376                                };
3377                        }
3378
3379                        head.appendChild(script);
3380
3381                        // We handle everything using the script element injection
3382                        return undefined;
3383                }
3384
3385                var requestDone = false;
3386
3387                // Create the request object
3388                var xhr = s.xhr();
3389
3390                // Open the socket
3391                // Passing null username, generates a login popup on Opera (#2865)
3392                if( s.username )
3393                        xhr.open(type, s.url, s.async, s.username, s.password);
3394                else
3395                        xhr.open(type, s.url, s.async);
3396
3397                // Need an extra try/catch for cross domain requests in Firefox 3
3398                try {
3399                        // Set the correct header, if data is being sent
3400                        if ( s.data )
3401                                xhr.setRequestHeader("Content-Type", s.contentType);
3402
3403                        // Set the If-Modified-Since header, if ifModified mode.
3404                        if ( s.ifModified )
3405                                xhr.setRequestHeader("If-Modified-Since",
3406                                        jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
3407
3408                        // Set header so the called script knows that it's an XMLHttpRequest
3409                        xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
3410
3411                        // Set the Accepts header for the server, depending on the dataType
3412                        xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
3413                                s.accepts[ s.dataType ] + ", */*" :
3414                                s.accepts._default );
3415                } catch(e){}
3416
3417                // Allow custom headers/mimetypes and early abort
3418                if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
3419                        // Handle the global AJAX counter
3420                        if ( s.global && ! --jQuery.active )
3421                                jQuery.event.trigger( "ajaxStop" );
3422                        // close opended socket
3423                        xhr.abort();
3424                        return false;
3425                }
3426
3427                if ( s.global )
3428                        jQuery.event.trigger("ajaxSend", [xhr, s]);
3429
3430                // Wait for a response to come back
3431                var onreadystatechange = function(isTimeout){
3432                        // The request was aborted, clear the interval and decrement jQuery.active
3433                        if (xhr.readyState == 0) {
3434                                if (ival) {
3435                                        // clear poll interval
3436                                        clearInterval(ival);
3437                                        ival = null;
3438                                        // Handle the global AJAX counter
3439                                        if ( s.global && ! --jQuery.active )
3440                                                jQuery.event.trigger( "ajaxStop" );
3441                                }
3442                        // The transfer is complete and the data is available, or the request timed out
3443                        } else if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
3444                                requestDone = true;
3445
3446                                // clear poll interval
3447                                if (ival) {
3448                                        clearInterval(ival);
3449                                        ival = null;
3450                                }
3451
3452                                status = isTimeout == "timeout" ? "timeout" :
3453                                        !jQuery.httpSuccess( xhr ) ? "error" :
3454                                        s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? "notmodified" :
3455                                        "success";
3456
3457                                if ( status == "success" ) {
3458                                        // Watch for, and catch, XML document parse errors
3459                                        try {
3460                                                // process the data (runs the xml through httpData regardless of callback)
3461                                                data = jQuery.httpData( xhr, s.dataType, s );
3462                                        } catch(e) {
3463                                                status = "parsererror";
3464                                        }
3465                                }
3466
3467                                // Make sure that the request was successful or notmodified
3468                                if ( status == "success" ) {
3469                                        // Cache Last-Modified header, if ifModified mode.
3470                                        var modRes;
3471                                        try {
3472                                                modRes = xhr.getResponseHeader("Last-Modified");
3473                                        } catch(e) {} // swallow exception thrown by FF if header is not available
3474
3475                                        if ( s.ifModified && modRes )
3476                                                jQuery.lastModified[s.url] = modRes;
3477
3478                                        // JSONP handles its own success callback
3479                                        if ( !jsonp )
3480                                                success();
3481                                } else
3482                                        jQuery.handleError(s, xhr, status);
3483
3484                                // Fire the complete handlers
3485                                complete();
3486
3487                                if ( isTimeout )
3488                                        xhr.abort();
3489
3490                                // Stop memory leaks
3491                                if ( s.async )
3492                                        xhr = null;
3493                        }
3494                };
3495
3496                if ( s.async ) {
3497                        // don't attach the handler to the request, just poll it instead
3498                        var ival = setInterval(onreadystatechange, 13);
3499
3500                        // Timeout checker
3501                        if ( s.timeout > 0 )
3502                                setTimeout(function(){
3503                                        // Check to see if the request is still happening
3504                                        if ( xhr && !requestDone )
3505                                                onreadystatechange( "timeout" );
3506                                }, s.timeout);
3507                }
3508
3509                // Send the data
3510                try {
3511                        xhr.send(s.data);
3512                } catch(e) {
3513                        jQuery.handleError(s, xhr, null, e);
3514                }
3515
3516                // firefox 1.5 doesn't fire statechange for sync requests
3517                if ( !s.async )
3518                        onreadystatechange();
3519
3520                function success(){
3521                        // If a local callback was specified, fire it and pass it the data
3522                        if ( s.success )
3523                                s.success( data, status );
3524
3525                        // Fire the global callback
3526                        if ( s.global )
3527                                jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
3528                }
3529
3530                function complete(){
3531                        // Process result
3532                        if ( s.complete )
3533                                s.complete(xhr, status);
3534
3535                        // The request was completed
3536                        if ( s.global )
3537                                jQuery.event.trigger( "ajaxComplete", [xhr, s] );
3538
3539                        // Handle the global AJAX counter
3540                        if ( s.global && ! --jQuery.active )
3541                                jQuery.event.trigger( "ajaxStop" );
3542                }
3543
3544                // return XMLHttpRequest to allow aborting the request etc.
3545                return xhr;
3546        },
3547
3548        handleError: function( s, xhr, status, e ) {
3549                // If a local callback was specified, fire it
3550                if ( s.error ) s.error( xhr, status, e );
3551
3552                // Fire the global callback
3553                if ( s.global )
3554                        jQuery.event.trigger( "ajaxError", [xhr, s, e] );
3555        },
3556
3557        // Counter for holding the number of active queries
3558        active: 0,
3559
3560        // Determines if an XMLHttpRequest was successful or not
3561        httpSuccess: function( xhr ) {
3562                try {
3563                        // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
3564                        return !xhr.status && location.protocol == "file:" ||
3565                                ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223;
3566                } catch(e){}
3567                return false;
3568        },
3569
3570        // Determines if an XMLHttpRequest returns NotModified
3571        httpNotModified: function( xhr, url ) {
3572                try {
3573                        var xhrRes = xhr.getResponseHeader("Last-Modified");
3574
3575                        // Firefox always returns 200. check Last-Modified date
3576                        return xhr.status == 304 || xhrRes == jQuery.lastModified[url];
3577                } catch(e){}
3578                return false;
3579        },
3580
3581        httpData: function( xhr, type, s ) {
3582                var ct = xhr.getResponseHeader("content-type"),
3583                        xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
3584                        data = xml ? xhr.responseXML : xhr.responseText;
3585
3586                if ( xml && data.documentElement.tagName == "parsererror" )
3587                        throw "parsererror";
3588                       
3589                // Allow a pre-filtering function to sanitize the response
3590                // s != null is checked to keep backwards compatibility
3591                if( s && s.dataFilter )
3592                        data = s.dataFilter( data, type );
3593
3594                // The filter can actually parse the response
3595                if( typeof data === "string" ){
3596
3597                        // If the type is "script", eval it in global context
3598                        if ( type == "script" )
3599                                jQuery.globalEval( data );
3600
3601                        // Get the JavaScript object, if JSON is used.
3602                        if ( type == "json" )
3603                                data = window["eval"]("(" + data + ")");
3604                }
3605               
3606                return data;
3607        },
3608
3609        // Serialize an array of form elements or a set of
3610        // key/values into a query string
3611        param: function( a ) {
3612                var s = [ ];
3613
3614                function add( key, value ){
3615                        s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
3616                };
3617
3618                // If an array was passed in, assume that it is an array
3619                // of form elements
3620                if ( jQuery.isArray(a) || a.jquery )
3621                        // Serialize the form elements
3622                        jQuery.each( a, function(){
3623                                add( this.name, this.value );
3624                        });
3625
3626                // Otherwise, assume that it's an object of key/value pairs
3627                else
3628                        // Serialize the key/values
3629                        for ( var j in a )
3630                                // If the value is an array then the key names need to be repeated
3631                                if ( jQuery.isArray(a[j]) )
3632                                        jQuery.each( a[j], function(){
3633                                                add( j, this );
3634                                        });
3635                                else
3636                                        add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] );
3637
3638                // Return the resulting serialization
3639                return s.join("&").replace(/%20/g, "+");
3640        }
3641
3642});
3643var elemdisplay = {},
3644        timerId,
3645        fxAttrs = [
3646                // height animations
3647                [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
3648                // width animations
3649                [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
3650                // opacity animations
3651                [ "opacity" ]
3652        ];
3653
3654function genFx( type, num ){
3655        var obj = {};
3656        jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function(){
3657                obj[ this ] = type;
3658        });
3659        return obj;
3660}
3661
3662jQuery.fn.extend({
3663        show: function(speed,callback){
3664                if ( speed ) {
3665                        return this.animate( genFx("show", 3), speed, callback);
3666                } else {
3667                        for ( var i = 0, l = this.length; i < l; i++ ){
3668                                var old = jQuery.data(this[i], "olddisplay");
3669                               
3670                                this[i].style.display = old || "";
3671                               
3672                                if ( jQuery.css(this[i], "display") === "none" ) {
3673                                        var tagName = this[i].tagName, display;
3674                                       
3675                                        if ( elemdisplay[ tagName ] ) {
3676                                                display = elemdisplay[ tagName ];
3677                                        } else {
3678                                                var elem = jQuery("<" + tagName + " />").appendTo("body");
3679                                               
3680                                                display = elem.css("display");
3681                                                if ( display === "none" )
3682                                                        display = "block";
3683                                               
3684                                                elem.remove();
3685                                               
3686                                                elemdisplay[ tagName ] = display;
3687                                        }
3688                                       
3689                                        this[i].style.display = jQuery.data(this[i], "olddisplay", display);
3690                                }
3691                        }
3692                       
3693                        return this;
3694                }
3695        },
3696
3697        hide: function(speed,callback){
3698                if ( speed ) {
3699                        return this.animate( genFx("hide", 3), speed, callback);
3700                } else {
3701                        for ( var i = 0, l = this.length; i < l; i++ ){
3702                                var old = jQuery.data(this[i], "olddisplay");
3703                                if ( !old && old !== "none" )
3704                                        jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
3705                                this[i].style.display = "none";
3706                        }
3707                        return this;
3708                }
3709        },
3710
3711        // Save the old toggle function
3712        _toggle: jQuery.fn.toggle,
3713
3714        toggle: function( fn, fn2 ){
3715                var bool = typeof fn === "boolean";
3716
3717                return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
3718                        this._toggle.apply( this, arguments ) :
3719                        fn == null || bool ?
3720                                this.each(function(){
3721                                        var state = bool ? fn : jQuery(this).is(":hidden");
3722                                        jQuery(this)[ state ? "show" : "hide" ]();
3723                                }) :
3724                                this.animate(genFx("toggle", 3), fn, fn2);
3725        },
3726
3727        fadeTo: function(speed,to,callback){
3728                return this.animate({opacity: to}, speed, callback);
3729        },
3730
3731        animate: function( prop, speed, easing, callback ) {
3732                var optall = jQuery.speed(speed, easing, callback);
3733
3734                return this[ optall.queue === false ? "each" : "queue" ](function(){
3735               
3736                        var opt = jQuery.extend({}, optall), p,
3737                                hidden = this.nodeType == 1 && jQuery(this).is(":hidden"),
3738                                self = this;
3739       
3740                        for ( p in prop ) {
3741                                if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
3742                                        return opt.complete.call(this);
3743
3744                                if ( ( p == "height" || p == "width" ) && this.style ) {
3745                                        // Store display property
3746                                        opt.display = jQuery.css(this, "display");
3747
3748                                        // Make sure that nothing sneaks out
3749                                        opt.overflow = this.style.overflow;
3750                                }
3751                        }
3752
3753                        if ( opt.overflow != null )
3754                                this.style.overflow = "hidden";
3755
3756                        opt.curAnim = jQuery.extend({}, prop);
3757
3758                        jQuery.each( prop, function(name, val){
3759                                var e = new jQuery.fx( self, opt, name );
3760
3761                                if ( /toggle|show|hide/.test(val) )
3762                                        e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
3763                                else {
3764                                        var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
3765                                                start = e.cur(true) || 0;
3766
3767                                        if ( parts ) {
3768                                                var end = parseFloat(parts[2]),
3769                                                        unit = parts[3] || "px";
3770
3771                                                // We need to compute starting value
3772                                                if ( unit != "px" ) {
3773                                                        self.style[ name ] = (end || 1) + unit;
3774                                                        start = ((end || 1) / e.cur(true)) * start;
3775                                                        self.style[ name ] = start + unit;
3776                                                }
3777
3778                                                // If a +=/-= token was provided, we're doing a relative animation
3779                                                if ( parts[1] )
3780                                                        end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
3781
3782                                                e.custom( start, end, unit );
3783                                        } else
3784                                                e.custom( start, val, "" );
3785                                }
3786                        });
3787
3788                        // For JS strict compliance
3789                        return true;
3790                });
3791        },
3792
3793        stop: function(clearQueue, gotoEnd){
3794                var timers = jQuery.timers;
3795
3796                if (clearQueue)
3797                        this.queue([]);
3798
3799                this.each(function(){
3800                        // go in reverse order so anything added to the queue during the loop is ignored
3801                        for ( var i = timers.length - 1; i >= 0; i-- )
3802                                if ( timers[i].elem == this ) {
3803                                        if (gotoEnd)
3804                                                // force the next step to be the last
3805                                                timers[i](true);
3806                                        timers.splice(i, 1);
3807                                }
3808                });
3809
3810                // start the next in the queue if the last step wasn't forced
3811                if (!gotoEnd)
3812                        this.dequeue();
3813
3814                return this;
3815        }
3816
3817});
3818
3819// Generate shortcuts for custom animations
3820jQuery.each({
3821        slideDown: genFx("show", 1),
3822        slideUp: genFx("hide", 1),
3823        slideToggle: genFx("toggle", 1),
3824        fadeIn: { opacity: "show" },
3825        fadeOut: { opacity: "hide" }
3826}, function( name, props ){
3827        jQuery.fn[ name ] = function( speed, callback ){
3828                return this.animate( props, speed, callback );
3829        };
3830});
3831
3832jQuery.extend({
3833
3834        speed: function(speed, easing, fn) {
3835                var opt = typeof speed === "object" ? speed : {
3836                        complete: fn || !fn && easing ||
3837                                jQuery.isFunction( speed ) && speed,
3838                        duration: speed,
3839                        easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
3840                };
3841
3842                opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
3843                        jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
3844
3845                // Queueing
3846                opt.old = opt.complete;
3847                opt.complete = function(){
3848                        if ( opt.queue !== false )
3849                                jQuery(this).dequeue();
3850                        if ( jQuery.isFunction( opt.old ) )
3851                                opt.old.call( this );
3852                };
3853
3854                return opt;
3855        },
3856
3857        easing: {
3858                linear: function( p, n, firstNum, diff ) {
3859                        return firstNum + diff * p;
3860                },
3861                swing: function( p, n, firstNum, diff ) {
3862                        return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
3863                }
3864        },
3865
3866        timers: [],
3867
3868        fx: function( elem, options, prop ){
3869                this.options = options;
3870                this.elem = elem;
3871                this.prop = prop;
3872
3873                if ( !options.orig )
3874                        options.orig = {};
3875        }
3876
3877});
3878
3879jQuery.fx.prototype = {
3880
3881        // Simple function for setting a style value
3882        update: function(){
3883                if ( this.options.step )
3884                        this.options.step.call( this.elem, this.now, this );
3885
3886                (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
3887
3888                // Set display property to block for height/width animations
3889                if ( ( this.prop == "height" || this.prop == "width" ) && this.elem.style )
3890                        this.elem.style.display = "block";
3891        },
3892
3893        // Get the current size
3894        cur: function(force){
3895                if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) )
3896                        return this.elem[ this.prop ];
3897
3898                var r = parseFloat(jQuery.css(this.elem, this.prop, force));
3899                return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
3900        },
3901
3902        // Start an animation from one number to another
3903        custom: function(from, to, unit){
3904                this.startTime = now();
3905                this.start = from;
3906                this.end = to;
3907                this.unit = unit || this.unit || "px";
3908                this.now = this.start;
3909                this.pos = this.state = 0;
3910
3911                var self = this;
3912                function t(gotoEnd){
3913                        return self.step(gotoEnd);
3914                }
3915
3916                t.elem = this.elem;
3917
3918                if ( t() && jQuery.timers.push(t) == 1 ) {
3919                        timerId = setInterval(function(){
3920                                var timers = jQuery.timers;
3921
3922                                for ( var i = 0; i < timers.length; i++ )
3923                                        if ( !timers[i]() )
3924                                                timers.splice(i--, 1);
3925
3926                                if ( !timers.length ) {
3927                                        clearInterval( timerId );
3928                                }
3929                        }, 13);
3930                }
3931        },
3932
3933        // Simple 'show' function
3934        show: function(){
3935                // Remember where we started, so that we can go back to it later
3936                this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
3937                this.options.show = true;
3938
3939                // Begin the animation
3940                // Make sure that we start at a small width/height to avoid any
3941                // flash of content
3942                this.custom(this.prop == "width" || this.prop == "height" ? 1 : 0, this.cur());
3943
3944                // Start by showing the element
3945                jQuery(this.elem).show();
3946        },
3947
3948        // Simple 'hide' function
3949        hide: function(){
3950                // Remember where we started, so that we can go back to it later
3951                this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
3952                this.options.hide = true;
3953
3954                // Begin the animation
3955                this.custom(this.cur(), 0);
3956        },
3957
3958        // Each step of an animation
3959        step: function(gotoEnd){
3960                var t = now();
3961
3962                if ( gotoEnd || t >= this.options.duration + this.startTime ) {
3963                        this.now = this.end;
3964                        this.pos = this.state = 1;
3965                        this.update();
3966
3967                        this.options.curAnim[ this.prop ] = true;
3968
3969                        var done = true;
3970                        for ( var i in this.options.curAnim )
3971                                if ( this.options.curAnim[i] !== true )
3972                                        done = false;
3973
3974                        if ( done ) {
3975                                if ( this.options.display != null ) {
3976                                        // Reset the overflow
3977                                        this.elem.style.overflow = this.options.overflow;
3978
3979                                        // Reset the display
3980                                        this.elem.style.display = this.options.display;
3981                                        if ( jQuery.css(this.elem, "display") == "none" )
3982                                                this.elem.style.display = "block";
3983                                }
3984
3985                                // Hide the element if the "hide" operation was done
3986                                if ( this.options.hide )
3987                                        jQuery(this.elem).hide();
3988
3989                                // Reset the properties, if the item has been hidden or shown
3990                                if ( this.options.hide || this.options.show )
3991                                        for ( var p in this.options.curAnim )
3992                                                jQuery.attr(this.elem.style, p, this.options.orig[p]);
3993                                       
3994                                // Execute the complete function
3995                                this.options.complete.call( this.elem );
3996                        }
3997
3998                        return false;
3999                } else {
4000                        var n = t - this.startTime;
4001                        this.state = n / this.options.duration;
4002
4003                        // Perform the easing function, defaults to swing
4004                        this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
4005                        this.now = this.start + ((this.end - this.start) * this.pos);
4006
4007                        // Perform the next step of the animation
4008                        this.update();
4009                }
4010
4011                return true;
4012        }
4013
4014};
4015
4016jQuery.extend( jQuery.fx, {
4017        speeds:{
4018                slow: 600,
4019                fast: 200,
4020                // Default speed
4021                _default: 400
4022        },
4023        step: {
4024
4025                opacity: function(fx){
4026                        jQuery.attr(fx.elem.style, "opacity", fx.now);
4027                },
4028
4029                _default: function(fx){
4030                        if ( fx.elem.style && fx.elem.style[ fx.prop ] != null )
4031                                fx.elem.style[ fx.prop ] = fx.now + fx.unit;
4032                        else
4033                                fx.elem[ fx.prop ] = fx.now;
4034                }
4035        }
4036});
4037if ( document.documentElement["getBoundingClientRect"] )
4038        jQuery.fn.offset = function() {
4039                if ( !this[0] ) return { top: 0, left: 0 };
4040                if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
4041                var box  = this[0].getBoundingClientRect(), doc = this[0].ownerDocument, body = doc.body, docElem = doc.documentElement,
4042                        clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
4043                        top  = box.top  + (self.pageYOffset || jQuery.boxModel && docElem.scrollTop  || body.scrollTop ) - clientTop,
4044                        left = box.left + (self.pageXOffset || jQuery.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
4045                return { top: top, left: left };
4046        };
4047else
4048        jQuery.fn.offset = function() {
4049                if ( !this[0] ) return { top: 0, left: 0 };
4050                if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
4051                jQuery.offset.initialized || jQuery.offset.initialize();
4052
4053                var elem = this[0], offsetParent = elem.offsetParent, prevOffsetParent = elem,
4054                        doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
4055                        body = doc.body, defaultView = doc.defaultView,
4056                        prevComputedStyle = defaultView.getComputedStyle(elem, null),
4057                        top = elem.offsetTop, left = elem.offsetLeft;
4058
4059                while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
4060                        computedStyle = defaultView.getComputedStyle(elem, null);
4061                        top -= elem.scrollTop, left -= elem.scrollLeft;
4062                        if ( elem === offsetParent ) {
4063                                top += elem.offsetTop, left += elem.offsetLeft;
4064                                if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.tagName)) )
4065                                        top  += parseInt( computedStyle.borderTopWidth,  10) || 0,
4066                                        left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
4067                                prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
4068                        }
4069                        if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" )
4070                                top  += parseInt( computedStyle.borderTopWidth,  10) || 0,
4071                                left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
4072                        prevComputedStyle = computedStyle;
4073                }
4074
4075                if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" )
4076                        top  += body.offsetTop,
4077                        left += body.offsetLeft;
4078
4079                if ( prevComputedStyle.position === "fixed" )
4080                        top  += Math.max(docElem.scrollTop, body.scrollTop),
4081                        left += Math.max(docElem.scrollLeft, body.scrollLeft);
4082
4083                return { top: top, left: left };
4084        };
4085
4086jQuery.offset = {
4087        initialize: function() {
4088                if ( this.initialized ) return;
4089                var body = document.body, container = document.createElement('div'), innerDiv, checkDiv, table, td, rules, prop, bodyMarginTop = body.style.marginTop,
4090                        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>';
4091
4092                rules = { position: 'absolute', top: 0, left: 0, margin: 0, border: 0, width: '1px', height: '1px', visibility: 'hidden' };
4093                for ( prop in rules ) container.style[prop] = rules[prop];
4094
4095                container.innerHTML = html;
4096                body.insertBefore(container, body.firstChild);
4097                innerDiv = container.firstChild, checkDiv = innerDiv.firstChild, td = innerDiv.nextSibling.firstChild.firstChild;
4098
4099                this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
4100                this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
4101
4102                innerDiv.style.overflow = 'hidden', innerDiv.style.position = 'relative';
4103                this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
4104
4105                body.style.marginTop = '1px';
4106                this.doesNotIncludeMarginInBodyOffset = (body.offsetTop === 0);
4107                body.style.marginTop = bodyMarginTop;
4108
4109                body.removeChild(container);
4110                this.initialized = true;
4111        },
4112
4113        bodyOffset: function(body) {
4114                jQuery.offset.initialized || jQuery.offset.initialize();
4115                var top = body.offsetTop, left = body.offsetLeft;
4116                if ( jQuery.offset.doesNotIncludeMarginInBodyOffset )
4117                        top  += parseInt( jQuery.curCSS(body, 'marginTop',  true), 10 ) || 0,
4118                        left += parseInt( jQuery.curCSS(body, 'marginLeft', true), 10 ) || 0;
4119                return { top: top, left: left };
4120        }
4121};
4122
4123
4124jQuery.fn.extend({
4125        position: function() {
4126                var left = 0, top = 0, results;
4127
4128                if ( this[0] ) {
4129                        // Get *real* offsetParent
4130                        var offsetParent = this.offsetParent(),
4131
4132                        // Get correct offsets
4133                        offset       = this.offset(),
4134                        parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
4135
4136                        // Subtract element margins
4137                        // note: when an element has margin: auto the offsetLeft and marginLeft
4138                        // are the same in Safari causing offset.left to incorrectly be 0
4139                        offset.top  -= num( this, 'marginTop'  );
4140                        offset.left -= num( this, 'marginLeft' );
4141
4142                        // Add offsetParent borders
4143                        parentOffset.top  += num( offsetParent, 'borderTopWidth'  );
4144                        parentOffset.left += num( offsetParent, 'borderLeftWidth' );
4145
4146                        // Subtract the two offsets
4147                        results = {
4148                                top:  offset.top  - parentOffset.top,
4149                                left: offset.left - parentOffset.left
4150                        };
4151                }
4152
4153                return results;
4154        },
4155
4156        offsetParent: function() {
4157                var offsetParent = this[0].offsetParent || document.body;
4158                while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
4159                        offsetParent = offsetParent.offsetParent;
4160                return jQuery(offsetParent);
4161        }
4162});
4163
4164
4165// Create scrollLeft and scrollTop methods
4166jQuery.each( ['Left', 'Top'], function(i, name) {
4167        var method = 'scroll' + name;
4168       
4169        jQuery.fn[ method ] = function(val) {
4170                if (!this[0]) return null;
4171
4172                return val !== undefined ?
4173
4174                        // Set the scroll offset
4175                        this.each(function() {
4176                                this == window || this == document ?
4177                                        window.scrollTo(
4178                                                !i ? val : jQuery(window).scrollLeft(),
4179                                                 i ? val : jQuery(window).scrollTop()
4180                                        ) :
4181                                        this[ method ] = val;
4182                        }) :
4183
4184                        // Return the scroll offset
4185                        this[0] == window || this[0] == document ?
4186                                self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
4187                                        jQuery.boxModel && document.documentElement[ method ] ||
4188                                        document.body[ method ] :
4189                                this[0][ method ];
4190        };
4191});
4192// Create innerHeight, innerWidth, outerHeight and outerWidth methods
4193jQuery.each([ "Height", "Width" ], function(i, name){
4194
4195        var tl = i ? "Left"  : "Top",  // top or left
4196                br = i ? "Right" : "Bottom"; // bottom or right
4197
4198        // innerHeight and innerWidth
4199        jQuery.fn["inner" + name] = function(){
4200                return this[ name.toLowerCase() ]() +
4201                        num(this, "padding" + tl) +
4202                        num(this, "padding" + br);
4203        };
4204
4205        // outerHeight and outerWidth
4206        jQuery.fn["outer" + name] = function(margin) {
4207                return this["inner" + name]() +
4208                        num(this, "border" + tl + "Width") +
4209                        num(this, "border" + br + "Width") +
4210                        (margin ?
4211                                num(this, "margin" + tl) + num(this, "margin" + br) : 0);
4212        };
4213       
4214        var type = name.toLowerCase();
4215
4216        jQuery.fn[ type ] = function( size ) {
4217                // Get window width or height
4218                return this[0] == window ?
4219                        // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
4220                        document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] ||
4221                        document.body[ "client" + name ] :
4222
4223                        // Get document width or height
4224                        this[0] == document ?
4225                                // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
4226                                Math.max(
4227                                        document.documentElement["client" + name],
4228                                        document.body["scroll" + name], document.documentElement["scroll" + name],
4229                                        document.body["offset" + name], document.documentElement["offset" + name]
4230                                ) :
4231
4232                                // Get or set width or height on the element
4233                                size === undefined ?
4234                                        // Get width or height on the element
4235                                        (this.length ? jQuery.css( this[0], type ) : null) :
4236
4237                                        // Set the width or height on the element (default to pixels if value is unitless)
4238                                        this.css( type, typeof size === "string" ? size : size + "px" );
4239        };
4240
4241});})();
Notatka: Zobacz TracBrowser aby uzyskać więcej informacji.