WordPress源代码——jquery(jquery-1.3.2.js)

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

请登录后发表评论

    暂无评论内容