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

1	/*!
2	 * jQuery JavaScript Library v1.4.2
3	 * http://jquery.com/
4	 *
5	 * Copyright 2010, John Resig
6	 * Dual licensed under the MIT or GPL Version 2 licenses.
7	 * http://jquery.org/license
8	 *
9	 * Includes Sizzle.js
10	 * http://sizzlejs.com/
11	 * Copyright 2010, The Dojo Foundation
12	 * Released under the MIT, BSD, and GPL Licenses.
13	 *
14	 * Date: Sat Feb 13 22:33:48 2010 -0500
15	 */
16	(function( window, undefined ) {
17	
18	// Define a local copy of jQuery
19	var jQuery = function( selector, context ) {
20	                // The jQuery object is actually just the init constructor 'enhanced'
21	                return new jQuery.fn.init( selector, context );
22	        },
23	
24	        // Map over jQuery in case of overwrite
25	        _jQuery = window.jQuery,
26	
27	        // Map over the $ in case of overwrite
28	        _$ = window.$,
29	
30	        // Use the correct document accordingly with window argument (sandbox)
31	        document = window.document,
32	
33	        // A central reference to the root jQuery(document)
34	        rootjQuery,
35	
36	        // A simple way to check for HTML strings or ID strings
37	        // (both of which we optimize for)
38	        quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,
39	
40	        // Is it a simple selector
41	        isSimple = /^.[^:#\[\.,]*$/,
42	
43	        // Check if a string has a non-whitespace character in it
44	        rnotwhite = /\S/,
45	
46	        // Used for trimming whitespace
47	        rtrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g,
48	
49	        // Match a standalone tag
50	        rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
51	
52	        // Keep a UserAgent string for use with jQuery.browser
53	        userAgent = navigator.userAgent,
54	
55	        // For matching the engine and version of the browser
56	        browserMatch,
57	       
58	        // Has the ready events already been bound?
59	        readyBound = false,
60	       
61	        // The functions to execute on DOM ready
62	        readyList = [],
63	
64	        // The ready event handler
65	        DOMContentLoaded,
66	
67	        // Save a reference to some core methods
68	        toString = Object.prototype.toString,
69	        hasOwnProperty = Object.prototype.hasOwnProperty,
70	        push = Array.prototype.push,
71	        slice = Array.prototype.slice,
72	        indexOf = Array.prototype.indexOf;
73	
74	jQuery.fn = jQuery.prototype = {
75	        init: function( selector, context ) {
76	                var match, elem, ret, doc;
77	
78	                // Handle $(""), $(null), or $(undefined)
79	                if ( !selector ) {
80	                        return this;
81	                }
82	
83	                // Handle $(DOMElement)
84	                if ( selector.nodeType ) {
85	                        this.context = this[0] = selector;
86	                        this.length = 1;
87	                        return this;
88	                }
89	               
90	                // The body element only exists once, optimize finding it
91	                if ( selector === "body" && !context ) {
92	                        this.context = document;
93	                        this[0] = document.body;
94	                        this.selector = "body";
95	                        this.length = 1;
96	                        return this;
97	                }
98	
99	                // Handle HTML strings
100	                if ( typeof selector === "string" ) {
101	                        // Are we dealing with HTML string or an ID?
102	                        match = quickExpr.exec( selector );
103	
104	                        // Verify a match, and that no context was specified for #id
105	                        if ( match && (match[1] || !context) ) {
106	
107	                                // HANDLE: $(html) -> $(array)
108	                                if ( match[1] ) {
109	                                        doc = (context ? context.ownerDocument || context : document);
110	
111	                                        // If a single string is passed in and it's a single tag
112	                                        // just do a createElement and skip the rest
113	                                        ret = rsingleTag.exec( selector );
114	
115	                                        if ( ret ) {
116	                                                if ( jQuery.isPlainObject( context ) ) {
117	                                                        selector = [ document.createElement( ret[1] ) ];
118	                                                        jQuery.fn.attr.call( selector, context, true );
119	
120	                                                } else {
121	                                                        selector = [ doc.createElement( ret[1] ) ];
122	                                                }
123	
124	                                        } else {
125	                                                ret = buildFragment( [ match[1] ], [ doc ] );
126	                                                selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
127	                                        }
128	                                       
129	                                        return jQuery.merge( this, selector );
130	                                       
131	                                // HANDLE: $("#id")
132	                                } else {
133	                                        elem = document.getElementById( match[2] );
134	
135	                                        if ( elem ) {
136	                                                // Handle the case where IE and Opera return items
137	                                                // by name instead of ID
138	                                                if ( elem.id !== match[2] ) {
139	                                                        return rootjQuery.find( selector );
140	                                                }
141	
142	                                                // Otherwise, we inject the element directly into the jQuery object
143	                                                this.length = 1;
144	                                                this[0] = elem;
145	                                        }
146	
147	                                        this.context = document;
148	                                        this.selector = selector;
149	                                        return this;
150	                                }
151	
152	                        // HANDLE: $("TAG")
153	                        } else if ( !context && /^\w+$/.test( selector ) ) {
154	                                this.selector = selector;
155	                                this.context = document;
156	                                selector = document.getElementsByTagName( selector );
157	                                return jQuery.merge( this, selector );
158	
159	                        // HANDLE: $(expr, $(...))
160	                        } else if ( !context || context.jquery ) {
161	                                return (context || rootjQuery).find( selector );
162	
163	                        // HANDLE: $(expr, context)
164	                        // (which is just equivalent to: $(context).find(expr)
165	                        } else {
166	                                return jQuery( context ).find( selector );
167	                        }
168	
169	                // HANDLE: $(function)
170	                // Shortcut for document ready
171	                } else if ( jQuery.isFunction( selector ) ) {
172	                        return rootjQuery.ready( selector );
173	                }
174	
175	                if (selector.selector !== undefined) {
176	                        this.selector = selector.selector;
177	                        this.context = selector.context;
178	                }
179	
180	                return jQuery.makeArray( selector, this );
181	        },
182	
183	        // Start with an empty selector
184	        selector: "",
185	
186	        // The current version of jQuery being used
187	        jquery: "1.4.2",
188	
189	        // The default length of a jQuery object is 0
190	        length: 0,
191	
192	        // The number of elements contained in the matched element set
193	        size: function() {
194	                return this.length;
195	        },
196	
197	        toArray: function() {
198	                return slice.call( this, 0 );
199	        },
200	
201	        // Get the Nth element in the matched element set OR
202	        // Get the whole matched element set as a clean array
203	        get: function( num ) {
204	                return num == null ?
205	
206	                        // Return a 'clean' array
207	                        this.toArray() :
208	
209	                        // Return just the object
210	                        ( num < 0 ? this.slice(num)[ 0 ] : this[ num ] );
211	        },
212	
213	        // Take an array of elements and push it onto the stack
214	        // (returning the new matched element set)
215	        pushStack: function( elems, name, selector ) {
216	                // Build a new jQuery matched element set
217	                var ret = jQuery();
218	
219	                if ( jQuery.isArray( elems ) ) {
220	                        push.apply( ret, elems );
221	               
222	                } else {
223	                        jQuery.merge( ret, elems );
224	                }
225	
226	                // Add the old object onto the stack (as a reference)
227	                ret.prevObject = this;
228	
229	                ret.context = this.context;
230	
231	                if ( name === "find" ) {
232	                        ret.selector = this.selector + (this.selector ? " " : "") + selector;
233	                } else if ( name ) {
234	                        ret.selector = this.selector + "." + name + "(" + selector + ")";
235	                }
236	
237	                // Return the newly-formed element set
238	                return ret;
239	        },
240	
241	        // Execute a callback for every element in the matched set.
242	        // (You can seed the arguments with an array of args, but this is
243	        // only used internally.)
244	        each: function( callback, args ) {
245	                return jQuery.each( this, callback, args );
246	        },
247	       
248	        ready: function( fn ) {
249	                // Attach the listeners
250	                jQuery.bindReady();
251	
252	                // If the DOM is already ready
253	                if ( jQuery.isReady ) {
254	                        // Execute the function immediately
255	                        fn.call( document, jQuery );
256	
257	                // Otherwise, remember the function for later
258	                } else if ( readyList ) {
259	                        // Add the function to the wait list
260	                        readyList.push( fn );
261	                }
262	
263	                return this;
264	        },
265	       
266	        eq: function( i ) {
267	                return i === -1 ?
268	                        this.slice( i ) :
269	                        this.slice( i, +i + 1 );
270	        },
271	
272	        first: function() {
273	                return this.eq( 0 );
274	        },
275	
276	        last: function() {
277	                return this.eq( -1 );
278	        },
279	
280	        slice: function() {
281	                return this.pushStack( slice.apply( this, arguments ),
282	                        "slice", slice.call(arguments).join(",") );
283	        },
284	
285	        map: function( callback ) {
286	                return this.pushStack( jQuery.map(this, function( elem, i ) {
287	                        return callback.call( elem, i, elem );
288	                }));
289	        },
290	       
291	        end: function() {
292	                return this.prevObject || jQuery(null);
293	        },
294	
295	        // For internal use only.
296	        // Behaves like an Array's method, not like a jQuery method.
297	        push: push,
298	        sort: [].sort,
299	        splice: [].splice
300	};
301	
302	// Give the init function the jQuery prototype for later instantiation
303	jQuery.fn.init.prototype = jQuery.fn;
304	
305	jQuery.extend = jQuery.fn.extend = function() {
306	        // copy reference to target object
307	        var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy;
308	
309	        // Handle a deep copy situation
310	        if ( typeof target === "boolean" ) {
311	                deep = target;
312	                target = arguments[1] || {};
313	                // skip the boolean and the target
314	                i = 2;
315	        }
316	
317	        // Handle case when target is a string or something (possible in deep copy)
318	        if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
319	                target = {};
320	        }
321	
322	        // extend jQuery itself if only one argument is passed
323	        if ( length === i ) {
324	                target = this;
325	                --i;
326	        }
327	
328	        for ( ; i < length; i++ ) {
329	                // Only deal with non-null/undefined values
330	                if ( (options = arguments[ i ]) != null ) {
331	                        // Extend the base object
332	                        for ( name in options ) {
333	                                src = target[ name ];
334	                                copy = options[ name ];
335	
336	                                // Prevent never-ending loop
337	                                if ( target === copy ) {
338	                                        continue;
339	                                }
340	
341	                                // Recurse if we're merging object literal values or arrays
342	                                if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) {
343	                                        var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src
344	                                                : jQuery.isArray(copy) ? [] : {};
345	
346	                                        // Never move original objects, clone them
347	                                        target[ name ] = jQuery.extend( deep, clone, copy );
348	
349	                                // Don't bring in undefined values
350	                                } else if ( copy !== undefined ) {
351	                                        target[ name ] = copy;
352	                                }
353	                        }
354	                }
355	        }
356	
357	        // Return the modified object
358	        return target;
359	};
360	
361	jQuery.extend({
362	        noConflict: function( deep ) {
363	                window.$ = _$;
364	
365	                if ( deep ) {
366	                        window.jQuery = _jQuery;
367	                }
368	
369	                return jQuery;
370	        },
371	       
372	        // Is the DOM ready to be used? Set to true once it occurs.
373	        isReady: false,
374	       
375	        // Handle when the DOM is ready
376	        ready: function() {
377	                // Make sure that the DOM is not already loaded
378	                if ( !jQuery.isReady ) {
379	                        // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
380	                        if ( !document.body ) {
381	                                return setTimeout( jQuery.ready, 13 );
382	                        }
383	
384	                        // Remember that the DOM is ready
385	                        jQuery.isReady = true;
386	
387	                        // If there are functions bound, to execute
388	                        if ( readyList ) {
389	                                // Execute all of them
390	                                var fn, i = 0;
391	                                while ( (fn = readyList[ i++ ]) ) {
392	                                        fn.call( document, jQuery );
393	                                }
394	
395	                                // Reset the list of functions
396	                                readyList = null;
397	                        }
398	
399	                        // Trigger any bound ready events
400	                        if ( jQuery.fn.triggerHandler ) {
401	                                jQuery( document ).triggerHandler( "ready" );
402	                        }
403	                }
404	        },
405	       
406	        bindReady: function() {
407	                if ( readyBound ) {
408	                        return;
409	                }
410	
411	                readyBound = true;
412	
413	                // Catch cases where $(document).ready() is called after the
414	                // browser event has already occurred.
415	                if ( document.readyState === "complete" ) {
416	                        return jQuery.ready();
417	                }
418	
419	                // Mozilla, Opera and webkit nightlies currently support this event
420	                if ( document.addEventListener ) {
421	                        // Use the handy event callback
422	                        document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
423	                       
424	                        // A fallback to window.onload, that will always work
425	                        window.addEventListener( "load", jQuery.ready, false );
426	
427	                // If IE event model is used
428	                } else if ( document.attachEvent ) {
429	                        // ensure firing before onload,
430	                        // maybe late but safe also for iframes
431	                        document.attachEvent("onreadystatechange", DOMContentLoaded);
432	                       
433	                        // A fallback to window.onload, that will always work
434	                        window.attachEvent( "onload", jQuery.ready );
435	
436	                        // If IE and not a frame
437	                        // continually check to see if the document is ready
438	                        var toplevel = false;
439	
440	                        try {
441	                                toplevel = window.frameElement == null;
442	                        } catch(e) {}
443	
444	                        if ( document.documentElement.doScroll && toplevel ) {
445	                                doScrollCheck();
446	                        }
447	                }
448	        },
449	
450	        // See test/unit/core.js for details concerning isFunction.
451	        // Since version 1.3, DOM methods and functions like alert
452	        // aren't supported. They return false on IE (#2968).
453	        isFunction: function( obj ) {
454	                return toString.call(obj) === "[object Function]";
455	        },
456	
457	        isArray: function( obj ) {
458	                return toString.call(obj) === "[object Array]";
459	        },
460	
461	        isPlainObject: function( obj ) {
462	                // Must be an Object.
463	                // Because of IE, we also have to check the presence of the constructor property.
464	                // Make sure that DOM nodes and window objects don't pass through, as well
465	                if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) {
466	                        return false;
467	                }
468	               
469	                // Not own constructor property must be Object
470	                if ( obj.constructor
471	                        && !hasOwnProperty.call(obj, "constructor")
472	                        && !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) {
473	                        return false;
474	                }
475	               
476	                // Own properties are enumerated firstly, so to speed up,
477	                // if last one is own, then all properties are own.
478	       
479	                var key;
480	                for ( key in obj ) {}
481	               
482	                return key === undefined || hasOwnProperty.call( obj, key );
483	        },
484	
485	        isEmptyObject: function( obj ) {
486	                for ( var name in obj ) {
487	                        return false;
488	                }
489	                return true;
490	        },
491	       
492	        error: function( msg ) {
493	                throw msg;
494	        },
495	       
496	        parseJSON: function( data ) {
497	                if ( typeof data !== "string" || !data ) {
498	                        return null;
499	                }
500	
501	                // Make sure leading/trailing whitespace is removed (IE can't handle it)
502	                data = jQuery.trim( data );
503	               
504	                // Make sure the incoming data is actual JSON
505	                // Logic borrowed from http://json.org/json2.js
506	                if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
507	                        .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
508	                        .replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) {
509	
510	                        // Try to use the native JSON parser first
511	                        return window.JSON && window.JSON.parse ?
512	                                window.JSON.parse( data ) :
513	                                (new Function("return " + data))();
514	
515	                } else {
516	                        jQuery.error( "Invalid JSON: " + data );
517	                }
518	        },
519	
520	        noop: function() {},
521	
522	        // Evalulates a script in a global context
523	        globalEval: function( data ) {
524	                if ( data && rnotwhite.test(data) ) {
525	                        // Inspired by code by Andrea Giammarchi
526	                        // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
527	                        var head = document.getElementsByTagName("head")[0] || document.documentElement,
528	                                script = document.createElement("script");
529	
530	                        script.type = "text/javascript";
531	
532	                        if ( jQuery.support.scriptEval ) {
533	                                script.appendChild( document.createTextNode( data ) );
534	                        } else {
535	                                script.text = data;
536	                        }
537	
538	                        // Use insertBefore instead of appendChild to circumvent an IE6 bug.
539	                        // This arises when a base node is used (#2709).
540	                        head.insertBefore( script, head.firstChild );
541	                        head.removeChild( script );
542	                }
543	        },
544	
545	        nodeName: function( elem, name ) {
546	                return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
547	        },
548	
549	        // args is for internal usage only
550	        each: function( object, callback, args ) {
551	                var name, i = 0,
552	                        length = object.length,
553	                        isObj = length === undefined || jQuery.isFunction(object);
554	
555	                if ( args ) {
556	                        if ( isObj ) {
557	                                for ( name in object ) {
558	                                        if ( callback.apply( object[ name ], args ) === false ) {
559	                                                break;
560	                                        }
561	                                }
562	                        } else {
563	                                for ( ; i < length; ) {
564	                                        if ( callback.apply( object[ i++ ], args ) === false ) {
565	                                                break;
566	                                        }
567	                                }
568	                        }
569	
570	                // A special, fast, case for the most common use of each
571	                } else {
572	                        if ( isObj ) {
573	                                for ( name in object ) {
574	                                        if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
575	                                                break;
576	                                        }
577	                                }
578	                        } else {
579	                                for ( var value = object[0];
580	                                        i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
581	                        }
582	                }
583	
584	                return object;
585	        },
586	
587	        trim: function( text ) {
588	                return (text || "").replace( rtrim, "" );
589	        },
590	
591	        // results is for internal usage only
592	        makeArray: function( array, results ) {
593	                var ret = results || [];
594	
595	                if ( array != null ) {
596	                        // The window, strings (and functions) also have 'length'
597	                        // The extra typeof function check is to prevent crashes
598	                        // in Safari 2 (See: #3039)
599	                        if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) {
600	                                push.call( ret, array );
601	                        } else {
602	                                jQuery.merge( ret, array );
603	                        }
604	                }
605	
606	                return ret;
607	        },
608	
609	        inArray: function( elem, array ) {
610	                if ( array.indexOf ) {
611	                        return array.indexOf( elem );
612	                }
613	
614	                for ( var i = 0, length = array.length; i < length; i++ ) {
615	                        if ( array[ i ] === elem ) {
616	                                return i;
617	                        }
618	                }
619	
620	                return -1;
621	        },
622	
623	        merge: function( first, second ) {
624	                var i = first.length, j = 0;
625	
626	                if ( typeof second.length === "number" ) {
627	                        for ( var l = second.length; j < l; j++ ) {
628	                                first[ i++ ] = second[ j ];
629	                        }
630	               
631	                } else {
632	                        while ( second[j] !== undefined ) {
633	                                first[ i++ ] = second[ j++ ];
634	                        }
635	                }
636	
637	                first.length = i;
638	
639	                return first;
640	        },
641	
642	        grep: function( elems, callback, inv ) {
643	                var ret = [];
644	
645	                // Go through the array, only saving the items
646	                // that pass the validator function
647	                for ( var i = 0, length = elems.length; i < length; i++ ) {
648	                        if ( !inv !== !callback( elems[ i ], i ) ) {
649	                                ret.push( elems[ i ] );
650	                        }
651	                }
652	
653	                return ret;
654	        },
655	
656	        // arg is for internal usage only
657	        map: function( elems, callback, arg ) {
658	                var ret = [], value;
659	
660	                // Go through the array, translating each of the items to their
661	                // new value (or values).
662	                for ( var i = 0, length = elems.length; i < length; i++ ) {
663	                        value = callback( elems[ i ], i, arg );
664	
665	                        if ( value != null ) {
666	                                ret[ ret.length ] = value;
667	                        }
668	                }
669	
670	                return ret.concat.apply( [], ret );
671	        },
672	
673	        // A global GUID counter for objects
674	        guid: 1,
675	
676	        proxy: function( fn, proxy, thisObject ) {
677	                if ( arguments.length === 2 ) {
678	                        if ( typeof proxy === "string" ) {
679	                                thisObject = fn;
680	                                fn = thisObject[ proxy ];
681	                                proxy = undefined;
682	
683	                        } else if ( proxy && !jQuery.isFunction( proxy ) ) {
684	                                thisObject = proxy;
685	                                proxy = undefined;
686	                        }
687	                }
688	
689	                if ( !proxy && fn ) {
690	                        proxy = function() {
691	                                return fn.apply( thisObject || this, arguments );
692	                        };
693	                }
694	
695	                // Set the guid of unique handler to the same of original handler, so it can be removed
696	                if ( fn ) {
697	                        proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
698	                }
699	
700	                // So proxy can be declared as an argument
701	                return proxy;
702	        },
703	
704	        // Use of jQuery.browser is frowned upon.
705	        // More details: http://docs.jquery.com/Utilities/jQuery.browser
706	        uaMatch: function( ua ) {
707	                ua = ua.toLowerCase();
708	
709	                var match = /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
710	                        /(opera)(?:.*version)?[ \/]([\w.]+)/.exec( ua ) ||
711	                        /(msie) ([\w.]+)/.exec( ua ) ||
712	                        !/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec( ua ) ||
713	                        [];
714	
715	                return { browser: match[1] || "", version: match[2] || "0" };
716	        },
717	
718	        browser: {}
719	});
720	
721	browserMatch = jQuery.uaMatch( userAgent );
722	if ( browserMatch.browser ) {
723	        jQuery.browser[ browserMatch.browser ] = true;
724	        jQuery.browser.version = browserMatch.version;
725	}
726	
727	// Deprecated, use jQuery.browser.webkit instead
728	if ( jQuery.browser.webkit ) {
729	        jQuery.browser.safari = true;
730	}
731	
732	if ( indexOf ) {
733	        jQuery.inArray = function( elem, array ) {
734	                return indexOf.call( array, elem );
735	        };
736	}
737	
738	// All jQuery objects should point back to these
739	rootjQuery = jQuery(document);
740	
741	// Cleanup functions for the document ready method
742	if ( document.addEventListener ) {
743	        DOMContentLoaded = function() {
744	                document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
745	                jQuery.ready();
746	        };
747	
748	} else if ( document.attachEvent ) {
749	        DOMContentLoaded = function() {
750	                // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
751	                if ( document.readyState === "complete" ) {
752	                        document.detachEvent( "onreadystatechange", DOMContentLoaded );
753	                        jQuery.ready();
754	                }
755	        };
756	}
757	
758	// The DOM ready check for Internet Explorer
759	function doScrollCheck() {
760	        if ( jQuery.isReady ) {
761	                return;
762	        }
763	
764	        try {
765	                // If IE is used, use the trick by Diego Perini
766	                // http://javascript.nwbox.com/IEContentLoaded/
767	                document.documentElement.doScroll("left");
768	        } catch( error ) {
769	                setTimeout( doScrollCheck, 1 );
770	                return;
771	        }
772	
773	        // and execute any waiting functions
774	        jQuery.ready();
775	}
776	
777	function evalScript( i, elem ) {
778	        if ( elem.src ) {
779	                jQuery.ajax({
780	                        url: elem.src,
781	                        async: false,
782	                        dataType: "script"
783	                });
784	        } else {
785	                jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
786	        }
787	
788	        if ( elem.parentNode ) {
789	                elem.parentNode.removeChild( elem );
790	        }
791	}
792	
793	// Mutifunctional method to get and set values to a collection
794	// The value/s can be optionally by executed if its a function
795	function access( elems, key, value, exec, fn, pass ) {
796	        var length = elems.length;
797	       
798	        // Setting many attributes
799	        if ( typeof key === "object" ) {
800	                for ( var k in key ) {
801	                        access( elems, k, key[k], exec, fn, value );
802	                }
803	                return elems;
804	        }
805	       
806	        // Setting one attribute
807	        if ( value !== undefined ) {
808	                // Optionally, function values get executed if exec is true
809	                exec = !pass && exec && jQuery.isFunction(value);
810	               
811	                for ( var i = 0; i < length; i++ ) {
812	                        fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
813	                }
814	               
815	                return elems;
816	        }
817	       
818	        // Getting an attribute
819	        return length ? fn( elems[0], key ) : undefined;
820	}
821	
822	function now() {
823	        return (new Date).getTime();
824	}
825	(function() {
826	
827	        jQuery.support = {};
828	
829	        var root = document.documentElement,
830	                script = document.createElement("script"),
831	                div = document.createElement("div"),
832	                id = "script" + now();
833	
834	        div.style.display = "none";
835	        div.innerHTML = "   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
836	
837	        var all = div.getElementsByTagName("*"),
838	                a = div.getElementsByTagName("a")[0];
839	
840	        // Can't get basic test support
841	        if ( !all || !all.length || !a ) {
842	                return;
843	        }
844	
845	        jQuery.support = {
846	                // IE strips leading whitespace when .innerHTML is used
847	                leadingWhitespace: div.firstChild.nodeType === 3,
848	
849	                // Make sure that tbody elements aren't automatically inserted
850	                // IE will insert them into empty tables
851	                tbody: !div.getElementsByTagName("tbody").length,
852	
853	                // Make sure that link elements get serialized correctly by innerHTML
854	                // This requires a wrapper element in IE
855	                htmlSerialize: !!div.getElementsByTagName("link").length,
856	
857	                // Get the style information from getAttribute
858	                // (IE uses .cssText insted)
859	                style: /red/.test( a.getAttribute("style") ),
860	
861	                // Make sure that URLs aren't manipulated
862	                // (IE normalizes it by default)
863	                hrefNormalized: a.getAttribute("href") === "/a",
864	
865	                // Make sure that element opacity exists
866	                // (IE uses filter instead)
867	                // Use a regex to work around a WebKit issue. See #5145
868	                opacity: /^0.55$/.test( a.style.opacity ),
869	
870	                // Verify style float existence
871	                // (IE uses styleFloat instead of cssFloat)
872	                cssFloat: !!a.style.cssFloat,
873	
874	                // Make sure that if no value is specified for a checkbox
875	                // that it defaults to "on".
876	                // (WebKit defaults to "" instead)
877	                checkOn: div.getElementsByTagName("input")[0].value === "on",
878	
879	                // Make sure that a selected-by-default option has a working selected property.
880	                // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
881	                optSelected: document.createElement("select").appendChild( document.createElement("option") ).selected,
882	
883	                parentNode: div.removeChild( div.appendChild( document.createElement("div") ) ).parentNode === null,
884	
885	                // Will be defined later
886	                deleteExpando: true,
887	                checkClone: false,
888	                scriptEval: false,
889	                noCloneEvent: true,
890	                boxModel: null
891	        };
892	
893	        script.type = "text/javascript";
894	        try {
895	                script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
896	        } catch(e) {}
897	
898	        root.insertBefore( script, root.firstChild );
899	
900	        // Make sure that the execution of code works by injecting a script
901	        // tag with appendChild/createTextNode
902	        // (IE doesn't support this, fails, and uses .text instead)
903	        if ( window[ id ] ) {
904	                jQuery.support.scriptEval = true;
905	                delete window[ id ];
906	        }
907	
908	        // Test to see if it's possible to delete an expando from an element
909	        // Fails in Internet Explorer
910	        try {
911	                delete script.test;
912	       
913	        } catch(e) {
914	                jQuery.support.deleteExpando = false;
915	        }
916	
917	        root.removeChild( script );
918	
919	        if ( div.attachEvent && div.fireEvent ) {
920	                div.attachEvent("onclick", function click() {
921	                        // Cloning a node shouldn't copy over any
922	                        // bound event handlers (IE does this)
923	                        jQuery.support.noCloneEvent = false;
924	                        div.detachEvent("onclick", click);
925	                });
926	                div.cloneNode(true).fireEvent("onclick");
927	        }
928	
929	        div = document.createElement("div");
930	        div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
931	
932	        var fragment = document.createDocumentFragment();
933	        fragment.appendChild( div.firstChild );
934	
935	        // WebKit doesn't clone checked state correctly in fragments
936	        jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
937	
938	        // Figure out if the W3C box model works as expected
939	        // document.body must exist before we can do this
940	        jQuery(function() {
941	                var div = document.createElement("div");
942	                div.style.width = div.style.paddingLeft = "1px";
943	
944	                document.body.appendChild( div );
945	                jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
946	                document.body.removeChild( div ).style.display = 'none';
947	
948	                div = null;
949	        });
950	
951	        // Technique from Juriy Zaytsev
952	        // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
953	        var eventSupported = function( eventName ) { 
954	                var el = document.createElement("div"); 
955	                eventName = "on" + eventName; 
956	
957	                var isSupported = (eventName in el); 
958	                if ( !isSupported ) { 
959	                        el.setAttribute(eventName, "return;"); 
960	                        isSupported = typeof el[eventName] === "function"; 
961	                } 
962	                el = null; 
963	
964	                return isSupported; 
965	        };
966	       
967	        jQuery.support.submitBubbles = eventSupported("submit");
968	        jQuery.support.changeBubbles = eventSupported("change");
969	
970	        // release memory in IE
971	        root = script = div = all = a = null;
972	})();
973	
974	jQuery.props = {
975	        "for": "htmlFor",
976	        "class": "className",
977	        readonly: "readOnly",
978	        maxlength: "maxLength",
979	        cellspacing: "cellSpacing",
980	        rowspan: "rowSpan",
981	        colspan: "colSpan",
982	        tabindex: "tabIndex",
983	        usemap: "useMap",
984	        frameborder: "frameBorder"
985	};
986	var expando = "jQuery" + now(), uuid = 0, windowData = {};
987	
988	jQuery.extend({
989	        cache: {},
990	       
991	        expando:expando,
992	
993	        // The following elements throw uncatchable exceptions if you
994	        // attempt to add expando properties to them.
995	        noData: {
996	                "embed": true,
997	                "object": true,
998	                "applet": true
999	        },
1000	
1001	        data: function( elem, name, data ) {
1002	                if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
1003	                        return;
1004	                }
1005	
1006	                elem = elem == window ?
1007	                        windowData :
1008	                        elem;
1009	
1010	                var id = elem[ expando ], cache = jQuery.cache, thisCache;
1011	
1012	                if ( !id && typeof name === "string" && data === undefined ) {
1013	                        return null;
1014	                }
1015	
1016	                // Compute a unique ID for the element
1017	                if ( !id ) { 
1018	                        id = ++uuid;
1019	                }
1020	
1021	                // Avoid generating a new cache unless none exists and we
1022	                // want to manipulate it.
1023	                if ( typeof name === "object" ) {
1024	                        elem[ expando ] = id;
1025	                        thisCache = cache[ id ] = jQuery.extend(true, {}, name);
1026	
1027	                } else if ( !cache[ id ] ) {
1028	                        elem[ expando ] = id;
1029	                        cache[ id ] = {};
1030	                }
1031	
1032	                thisCache = cache[ id ];
1033	
1034	                // Prevent overriding the named cache with undefined values
1035	                if ( data !== undefined ) {
1036	                        thisCache[ name ] = data;
1037	                }
1038	
1039	                return typeof name === "string" ? thisCache[ name ] : thisCache;
1040	        },
1041	
1042	        removeData: function( elem, name ) {
1043	                if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
1044	                        return;
1045	                }
1046	
1047	                elem = elem == window ?
1048	                        windowData :
1049	                        elem;
1050	
1051	                var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ];
1052	
1053	                // If we want to remove a specific section of the element's data
1054	                if ( name ) {
1055	                        if ( thisCache ) {
1056	                                // Remove the section of cache data
1057	                                delete thisCache[ name ];
1058	
1059	                                // If we've removed all the data, remove the element's cache
1060	                                if ( jQuery.isEmptyObject(thisCache) ) {
1061	                                        jQuery.removeData( elem );
1062	                                }
1063	                        }
1064	
1065	                // Otherwise, we want to remove all of the element's data
1066	                } else {
1067	                        if ( jQuery.support.deleteExpando ) {
1068	                                delete elem[ jQuery.expando ];
1069	
1070	                        } else if ( elem.removeAttribute ) {
1071	                                elem.removeAttribute( jQuery.expando );
1072	                        }
1073	
1074	                        // Completely remove the data cache
1075	                        delete cache[ id ];
1076	                }
1077	        }
1078	});
1079	
1080	jQuery.fn.extend({
1081	        data: function( key, value ) {
1082	                if ( typeof key === "undefined" && this.length ) {
1083	                        return jQuery.data( this[0] );
1084	
1085	                } else if ( typeof key === "object" ) {
1086	                        return this.each(function() {
1087	                                jQuery.data( this, key );
1088	                        });
1089	                }
1090	
1091	                var parts = key.split(".");
1092	                parts[1] = parts[1] ? "." + parts[1] : "";
1093	
1094	                if ( value === undefined ) {
1095	                        var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1096	
1097	                        if ( data === undefined && this.length ) {
1098	                                data = jQuery.data( this[0], key );
1099	                        }
1100	                        return data === undefined && parts[1] ?
1101	                                this.data( parts[0] ) :
1102	                                data;
1103	                } else {
1104	                        return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function() {
1105	                                jQuery.data( this, key, value );
1106	                        });
1107	                }
1108	        },
1109	
1110	        removeData: function( key ) {
1111	                return this.each(function() {
1112	                        jQuery.removeData( this, key );
1113	                });
1114	        }
1115	});
1116	jQuery.extend({
1117	        queue: function( elem, type, data ) {
1118	                if ( !elem ) {
1119	                        return;
1120	                }
1121	
1122	                type = (type || "fx") + "queue";
1123	                var q = jQuery.data( elem, type );
1124	
1125	                // Speed up dequeue by getting out quickly if this is just a lookup
1126	                if ( !data ) {
1127	                        return q || [];
1128	                }
1129	
1130	                if ( !q || jQuery.isArray(data) ) {
1131	                        q = jQuery.data( elem, type, jQuery.makeArray(data) );
1132	
1133	                } else {
1134	                        q.push( data );
1135	                }
1136	
1137	                return q;
1138	        },
1139	
1140	        dequeue: function( elem, type ) {
1141	                type = type || "fx";
1142	
1143	                var queue = jQuery.queue( elem, type ), fn = queue.shift();
1144	
1145	                // If the fx queue is dequeued, always remove the progress sentinel
1146	                if ( fn === "inprogress" ) {
1147	                        fn = queue.shift();
1148	                }
1149	
1150	                if ( fn ) {
1151	                        // Add a progress sentinel to prevent the fx queue from being
1152	                        // automatically dequeued
1153	                        if ( type === "fx" ) {
1154	                                queue.unshift("inprogress");
1155	                        }
1156	
1157	                        fn.call(elem, function() {
1158	                                jQuery.dequeue(elem, type);
1159	                        });
1160	                }
1161	        }
1162	});
1163	
1164	jQuery.fn.extend({
1165	        queue: function( type, data ) {
1166	                if ( typeof type !== "string" ) {
1167	                        data = type;
1168	                        type = "fx";
1169	                }
1170	
1171	                if ( data === undefined ) {
1172	                        return jQuery.queue( this[0], type );
1173	                }
1174	                return this.each(function( i, elem ) {
1175	                        var queue = jQuery.queue( this, type, data );
1176	
1177	                        if ( type === "fx" && queue[0] !== "inprogress" ) {
1178	                                jQuery.dequeue( this, type );
1179	                        }
1180	                });
1181	        },
1182	        dequeue: function( type ) {
1183	                return this.each(function() {
1184	                        jQuery.dequeue( this, type );
1185	                });
1186	        },
1187	
1188	        // Based off of the plugin by Clint Helfers, with permission.
1189	        // http://blindsignals.com/index.php/2009/07/jquery-delay/
1190	        delay: function( time, type ) {
1191	                time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
1192	                type = type || "fx";
1193	
1194	                return this.queue( type, function() {
1195	                        var elem = this;
1196	                        setTimeout(function() {
1197	                                jQuery.dequeue( elem, type );
1198	                        }, time );
1199	                });
1200	        },
1201	
1202	        clearQueue: function( type ) {
1203	                return this.queue( type || "fx", [] );
1204	        }
1205	});
1206	var rclass = /[\n\t]/g,
1207	        rspace = /\s+/,
1208	        rreturn = /\r/g,
1209	        rspecialurl = /href|src|style/,
1210	        rtype = /(button|input)/i,
1211	        rfocusable = /(button|input|object|select|textarea)/i,
1212	        rclickable = /^(a|area)$/i,
1213	        rradiocheck = /radio|checkbox/;
1214	
1215	jQuery.fn.extend({
1216	        attr: function( name, value ) {
1217	                return access( this, name, value, true, jQuery.attr );
1218	        },
1219	
1220	        removeAttr: function( name, fn ) {
1221	                return this.each(function(){
1222	                        jQuery.attr( this, name, "" );
1223	                        if ( this.nodeType === 1 ) {
1224	                                this.removeAttribute( name );
1225	                        }
1226	                });
1227	        },
1228	
1229	        addClass: function( value ) {
1230	                if ( jQuery.isFunction(value) ) {
1231	                        return this.each(function(i) {
1232	                                var self = jQuery(this);
1233	                                self.addClass( value.call(this, i, self.attr("class")) );
1234	                        });
1235	                }
1236	
1237	                if ( value && typeof value === "string" ) {
1238	                        var classNames = (value || "").split( rspace );
1239	
1240	                        for ( var i = 0, l = this.length; i < l; i++ ) {
1241	                                var elem = this[i];
1242	
1243	                                if ( elem.nodeType === 1 ) {
1244	                                        if ( !elem.className ) {
1245	                                                elem.className = value;
1246	
1247	                                        } else {
1248	                                                var className = " " + elem.className + " ", setClass = elem.className;
1249	                                                for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
1250	                                                        if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
1251	                                                                setClass += " " + classNames[c];
1252	                                                        }
1253	                                                }
1254	                                                elem.className = jQuery.trim( setClass );
1255	                                        }
1256	                                }
1257	                        }
1258	                }
1259	
1260	                return this;
1261	        },
1262	
1263	        removeClass: function( value ) {
1264	                if ( jQuery.isFunction(value) ) {
1265	                        return this.each(function(i) {
1266	                                var self = jQuery(this);
1267	                                self.removeClass( value.call(this, i, self.attr("class")) );
1268	                        });
1269	                }
1270	
1271	                if ( (value && typeof value === "string") || value === undefined ) {
1272	                        var classNames = (value || "").split(rspace);
1273	
1274	                        for ( var i = 0, l = this.length; i < l; i++ ) {
1275	                                var elem = this[i];
1276	
1277	                                if ( elem.nodeType === 1 && elem.className ) {
1278	                                        if ( value ) {
1279	                                                var className = (" " + elem.className + " ").replace(rclass, " ");
1280	                                                for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
1281	                                                        className = className.replace(" " + classNames[c] + " ", " ");
1282	                                                }
1283	                                                elem.className = jQuery.trim( className );
1284	
1285	                                        } else {
1286	                                                elem.className = "";
1287	                                        }
1288	                                }
1289	                        }
1290	                }
1291	
1292	                return this;
1293	        },
1294	
1295	        toggleClass: function( value, stateVal ) {
1296	                var type = typeof value, isBool = typeof stateVal === "boolean";
1297	
1298	                if ( jQuery.isFunction( value ) ) {
1299	                        return this.each(function(i) {
1300	                                var self = jQuery(this);
1301	                                self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
1302	                        });
1303	                }
1304	
1305	                return this.each(function() {
1306	                        if ( type === "string" ) {
1307	                                // toggle individual class names
1308	                                var className, i = 0, self = jQuery(this),
1309	                                        state = stateVal,
1310	                                        classNames = value.split( rspace );
1311	
1312	                                while ( (className = classNames[ i++ ]) ) {
1313	                                        // check each className given, space seperated list
1314	                                        state = isBool ? state : !self.hasClass( className );
1315	                                        self[ state ? "addClass" : "removeClass" ]( className );
1316	                                }
1317	
1318	                        } else if ( type === "undefined" || type === "boolean" ) {
1319	                                if ( this.className ) {
1320	                                        // store className if set
1321	                                        jQuery.data( this, "__className__", this.className );
1322	                                }
1323	
1324	                                // toggle whole className
1325	                                this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || "";
1326	                        }
1327	                });
1328	        },
1329	
1330	        hasClass: function( selector ) {
1331	                var className = " " + selector + " ";
1332	                for ( var i = 0, l = this.length; i < l; i++ ) {
1333	                        if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
1334	                                return true;
1335	                        }
1336	                }
1337	
1338	                return false;
1339	        },
1340	
1341	        val: function( value ) {
1342	                if ( value === undefined ) {
1343	                        var elem = this[0];
1344	
1345	                        if ( elem ) {
1346	                                if ( jQuery.nodeName( elem, "option" ) ) {
1347	                                        return (elem.attributes.value || {}).specified ? elem.value : elem.text;
1348	                                }
1349	
1350	                                // We need to handle select boxes special
1351	                                if ( jQuery.nodeName( elem, "select" ) ) {
1352	                                        var index = elem.selectedIndex,
1353	                                                values = [],
1354	                                                options = elem.options,
1355	                                                one = elem.type === "select-one";
1356	
1357	                                        // Nothing was selected
1358	                                        if ( index < 0 ) {
1359	                                                return null;
1360	                                        }
1361	
1362	                                        // Loop through all the selected options
1363	                                        for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
1364	                                                var option = options[ i ];
1365	
1366	                                                if ( option.selected ) {
1367	                                                        // Get the specifc value for the option
1368	                                                        value = jQuery(option).val();
1369	
1370	                                                        // We don't need an array for one selects
1371	                                                        if ( one ) {
1372	                                                                return value;
1373	                                                        }
1374	
1375	                                                        // Multi-Selects return an array
1376	                                                        values.push( value );
1377	                                                }
1378	                                        }
1379	
1380	                                        return values;
1381	                                }
1382	
1383	                                // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
1384	                                if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
1385	                                        return elem.getAttribute("value") === null ? "on" : elem.value;
1386	                                }
1387	                               
1388	
1389	                                // Everything else, we just grab the value
1390	                                return (elem.value || "").replace(rreturn, "");
1391	
1392	                        }
1393	
1394	                        return undefined;
1395	                }
1396	
1397	                var isFunction = jQuery.isFunction(value);
1398	
1399	                return this.each(function(i) {
1400	                        var self = jQuery(this), val = value;
1401	
1402	                        if ( this.nodeType !== 1 ) {
1403	                                return;
1404	                        }
1405	
1406	                        if ( isFunction ) {
1407	                                val = value.call(this, i, self.val());
1408	                        }
1409	
1410	                        // Typecast each time if the value is a Function and the appended
1411	                        // value is therefore different each time.
1412	                        if ( typeof val === "number" ) {
1413	                                val += "";
1414	                        }
1415	
1416	                        if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
1417	                                this.checked = jQuery.inArray( self.val(), val ) >= 0;
1418	
1419	                        } else if ( jQuery.nodeName( this, "select" ) ) {
1420	                                var values = jQuery.makeArray(val);
1421	
1422	                                jQuery( "option", this ).each(function() {
1423	                                        this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
1424	                                });
1425	
1426	                                if ( !values.length ) {
1427	                                        this.selectedIndex = -1;
1428	                                }
1429	
1430	                        } else {
1431	                                this.value = val;
1432	                        }
1433	                });
1434	        }
1435	});
1436	
1437	jQuery.extend({
1438	        attrFn: {
1439	                val: true,
1440	                css: true,
1441	                html: true,
1442	                text: true,
1443	                data: true,
1444	                width: true,
1445	                height: true,
1446	                offset: true
1447	        },
1448	               
1449	        attr: function( elem, name, value, pass ) {
1450	                // don't set attributes on text and comment nodes
1451	                if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
1452	                        return undefined;
1453	                }
1454	
1455	                if ( pass && name in jQuery.attrFn ) {
1456	                        return jQuery(elem)[name](value);
1457	                }
1458	
1459	                var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
1460	                        // Whether we are setting (or getting)
1461	                        set = value !== undefined;
1462	
1463	                // Try to normalize/fix the name
1464	                name = notxml && jQuery.props[ name ] || name;
1465	
1466	                // Only do all the following if this is a node (faster for style)
1467	                if ( elem.nodeType === 1 ) {
1468	                        // These attributes require special treatment
1469	                        var special = rspecialurl.test( name );
1470	
1471	                        // Safari mis-reports the default selected property of an option
1472	                        // Accessing the parent's selectedIndex property fixes it
1473	                        if ( name === "selected" && !jQuery.support.optSelected ) {
1474	                                var parent = elem.parentNode;
1475	                                if ( parent ) {
1476	                                        parent.selectedIndex;
1477	       
1478	                                        // Make sure that it also works with optgroups, see #5701
1479	                                        if ( parent.parentNode ) {
1480	                                                parent.parentNode.selectedIndex;
1481	                                        }
1482	                                }
1483	                        }
1484	
1485	                        // If applicable, access the attribute via the DOM 0 way
1486	                        if ( name in elem && notxml && !special ) {
1487	                                if ( set ) {
1488	                                        // We can't allow the type property to be changed (since it causes problems in IE)
1489	                                        if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
1490	                                                jQuery.error( "type property can't be changed" );
1491	                                        }
1492	
1493	                                        elem[ name ] = value;
1494	                                }
1495	
1496	                                // browsers index elements by id/name on forms, give priority to attributes.
1497	                                if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
1498	                                        return elem.getAttributeNode( name ).nodeValue;
1499	                                }
1500	
1501	                                // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
1502	                                // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
1503	                                if ( name === "tabIndex" ) {
1504	                                        var attributeNode = elem.getAttributeNode( "tabIndex" );
1505	
1506	                                        return attributeNode && attributeNode.specified ?
1507	                                                attributeNode.value :
1508	                                                rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
1509	                                                        0 :
1510	                                                        undefined;
1511	                                }
1512	
1513	                                return elem[ name ];
1514	                        }
1515	
1516	                        if ( !jQuery.support.style && notxml && name === "style" ) {
1517	                                if ( set ) {
1518	                                        elem.style.cssText = "" + value;
1519	                                }
1520	
1521	                                return elem.style.cssText;
1522	                        }
1523	
1524	                        if ( set ) {
1525	                                // convert the value to a string (all browsers do this but IE) see #1070
1526	                                elem.setAttribute( name, "" + value );
1527	                        }
1528	
1529	                        var attr = !jQuery.support.hrefNormalized && notxml && special ?
1530	                                        // Some attributes require a special call on IE
1531	                                        elem.getAttribute( name, 2 ) :
1532	                                        elem.getAttribute( name );
1533	
1534	                        // Non-existent attributes return null, we normalize to undefined
1535	                        return attr === null ? undefined : attr;
1536	                }
1537	
1538	                // elem is actually elem.style ... set the style
1539	                // Using attr for specific style information is now deprecated. Use style instead.
1540	                return jQuery.style( elem, name, value );
1541	        }
1542	});
1543	var rnamespaces = /\.(.*)$/,
1544	        fcleanup = function( nm ) {
1545	                return nm.replace(/[^\w\s\.\|`]/g, function( ch ) {
1546	                        return "\\" + ch;
1547	                });
1548	        };
1549	
1550	/*
1551	 * A number of helper functions used for managing events.
1552	 * Many of the ideas behind this code originated from
1553	 * Dean Edwards' addEvent library.
1554	 */
1555	jQuery.event = {
1556	
1557	        // Bind an event to an element
1558	        // Original by Dean Edwards
1559	        add: function( elem, types, handler, data ) {
1560	                if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
1561	                        return;
1562	                }
1563	
1564	                // For whatever reason, IE has trouble passing the window object
1565	                // around, causing it to be cloned in the process
1566	                if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) {
1567	                        elem = window;
1568	                }
1569	
1570	                var handleObjIn, handleObj;
1571	
1572	                if ( handler.handler ) {
1573	                        handleObjIn = handler;
1574	                        handler = handleObjIn.handler;
1575	                }
1576	
1577	                // Make sure that the function being executed has a unique ID
1578	                if ( !handler.guid ) {
1579	                        handler.guid = jQuery.guid++;
1580	                }
1581	
1582	                // Init the element's event structure
1583	                var elemData = jQuery.data( elem );
1584	
1585	                // If no elemData is found then we must be trying to bind to one of the
1586	                // banned noData elements
1587	                if ( !elemData ) {
1588	                        return;
1589	                }
1590	
1591	                var events = elemData.events = elemData.events || {},
1592	                        eventHandle = elemData.handle, eventHandle;
1593	
1594	                if ( !eventHandle ) {
1595	                        elemData.handle = eventHandle = function() {
1596	                                // Handle the second event of a trigger and when
1597	                                // an event is called after a page has unloaded
1598	                                return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
1599	                                        jQuery.event.handle.apply( eventHandle.elem, arguments ) :
1600	                                        undefined;
1601	                        };
1602	                }
1603	
1604	                // Add elem as a property of the handle function
1605	                // This is to prevent a memory leak with non-native events in IE.
1606	                eventHandle.elem = elem;
1607	
1608	                // Handle multiple events separated by a space
1609	                // jQuery(...).bind("mouseover mouseout", fn);
1610	                types = types.split(" ");
1611	
1612	                var type, i = 0, namespaces;
1613	
1614	                while ( (type = types[ i++ ]) ) {
1615	                        handleObj = handleObjIn ?
1616	                                jQuery.extend({}, handleObjIn) :
1617	                                { handler: handler, data: data };
1618	
1619	                        // Namespaced event handlers
1620	                        if ( type.indexOf(".") > -1 ) {
1621	                                namespaces = type.split(".");
1622	                                type = namespaces.shift();
1623	                                handleObj.namespace = namespaces.slice(0).sort().join(".");
1624	
1625	                        } else {
1626	                                namespaces = [];
1627	                                handleObj.namespace = "";
1628	                        }
1629	
1630	                        handleObj.type = type;
1631	                        handleObj.guid = handler.guid;
1632	
1633	                        // Get the current list of functions bound to this event
1634	                        var handlers = events[ type ],
1635	                                special = jQuery.event.special[ type ] || {};
1636	
1637	                        // Init the event handler queue
1638	                        if ( !handlers ) {
1639	                                handlers = events[ type ] = [];
1640	
1641	                                // Check for a special event handler
1642	                                // Only use addEventListener/attachEvent if the special
1643	                                // events handler returns false
1644	                                if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
1645	                                        // Bind the global event handler to the element
1646	                                        if ( elem.addEventListener ) {
1647	                                                elem.addEventListener( type, eventHandle, false );
1648	
1649	                                        } else if ( elem.attachEvent ) {
1650	                                                elem.attachEvent( "on" + type, eventHandle );
1651	                                        }
1652	                                }
1653	                        }
1654	                       
1655	                        if ( special.add ) { 
1656	                                special.add.call( elem, handleObj ); 
1657	
1658	                                if ( !handleObj.handler.guid ) {
1659	                                        handleObj.handler.guid = handler.guid;
1660	                                }
1661	                        }
1662	
1663	                        // Add the function to the element's handler list
1664	                        handlers.push( handleObj );
1665	
1666	                        // Keep track of which events have been used, for global triggering
1667	                        jQuery.event.global[ type ] = true;
1668	                }
1669	
1670	                // Nullify elem to prevent memory leaks in IE
1671	                elem = null;
1672	        },
1673	
1674	        global: {},
1675	
1676	        // Detach an event or set of events from an element
1677	        remove: function( elem, types, handler, pos ) {
1678	                // don't do events on text and comment nodes
1679	                if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
1680	                        return;
1681	                }
1682	
1683	                var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
1684	                        elemData = jQuery.data( elem ),
1685	                        events = elemData && elemData.events;
1686	
1687	                if ( !elemData || !events ) {
1688	                        return;
1689	                }
1690	
1691	                // types is actually an event object here
1692	                if ( types && types.type ) {
1693	                        handler = types.handler;
1694	                        types = types.type;
1695	                }
1696	
1697	                // Unbind all events for the element
1698	                if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
1699	                        types = types || "";
1700	
1701	                        for ( type in events ) {
1702	                                jQuery.event.remove( elem, type + types );
1703	                        }
1704	
1705	                        return;
1706	                }
1707	
1708	                // Handle multiple events separated by a space
1709	                // jQuery(...).unbind("mouseover mouseout", fn);
1710	                types = types.split(" ");
1711	
1712	                while ( (type = types[ i++ ]) ) {
1713	                        origType = type;
1714	                        handleObj = null;
1715	                        all = type.indexOf(".") < 0;
1716	                        namespaces = [];
1717	
1718	                        if ( !all ) {
1719	                                // Namespaced event handlers
1720	                                namespaces = type.split(".");
1721	                                type = namespaces.shift();
1722	
1723	                                namespace = new RegExp("(^|\\.)" + 
1724	                                        jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)")
1725	                        }
1726	
1727	                        eventType = events[ type ];
1728	
1729	                        if ( !eventType ) {
1730	                                continue;
1731	                        }
1732	
1733	                        if ( !handler ) {
1734	                                for ( var j = 0; j < eventType.length; j++ ) {
1735	                                        handleObj = eventType[ j ];
1736	
1737	                                        if ( all || namespace.test( handleObj.namespace ) ) {
1738	                                                jQuery.event.remove( elem, origType, handleObj.handler, j );
1739	                                                eventType.splice( j--, 1 );
1740	                                        }
1741	                                }
1742	
1743	                                continue;
1744	                        }
1745	
1746	                        special = jQuery.event.special[ type ] || {};
1747	
1748	                        for ( var j = pos || 0; j < eventType.length; j++ ) {
1749	                                handleObj = eventType[ j ];
1750	
1751	                                if ( handler.guid === handleObj.guid ) {
1752	                                        // remove the given handler for the given type
1753	                                        if ( all || namespace.test( handleObj.namespace ) ) {
1754	                                                if ( pos == null ) {
1755	                                                        eventType.splice( j--, 1 );
1756	                                                }
1757	
1758	                                                if ( special.remove ) {
1759	                                                        special.remove.call( elem, handleObj );
1760	                                                }
1761	                                        }
1762	
1763	                                        if ( pos != null ) {
1764	                                                break;
1765	                                        }
1766	                                }
1767	                        }
1768	
1769	                        // remove generic event handler if no more handlers exist
1770	                        if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
1771	                                if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
1772	                                        removeEvent( elem, type, elemData.handle );
1773	                                }
1774	
1775	                                ret = null;
1776	                                delete events[ type ];
1777	                        }
1778	                }
1779	
1780	                // Remove the expando if it's no longer used
1781	                if ( jQuery.isEmptyObject( events ) ) {
1782	                        var handle = elemData.handle;
1783	                        if ( handle ) {
1784	                                handle.elem = null;
1785	                        }
1786	
1787	                        delete elemData.events;
1788	                        delete elemData.handle;
1789	
1790	                        if ( jQuery.isEmptyObject( elemData ) ) {
1791	                                jQuery.removeData( elem );
1792	                        }
1793	                }
1794	        },
1795	
1796	        // bubbling is internal
1797	        trigger: function( event, data, elem /*, bubbling */ ) {
1798	                // Event object or event type
1799	                var type = event.type || event,
1800	                        bubbling = arguments[3];
1801	
1802	                if ( !bubbling ) {
1803	                        event = typeof event === "object" ?
1804	                                // jQuery.Event object
1805	                                event[expando] ? event :
1806	                                // Object literal
1807	                                jQuery.extend( jQuery.Event(type), event ) :
1808	                                // Just the event type (string)
1809	                                jQuery.Event(type);
1810	
1811	                        if ( type.indexOf("!") >= 0 ) {
1812	                                event.type = type = type.slice(0, -1);
1813	                                event.exclusive = true;
1814	                        }
1815	
1816	                        // Handle a global trigger
1817	                        if ( !elem ) {
1818	                                // Don't bubble custom events when global (to avoid too much overhead)
1819	                                event.stopPropagation();
1820	
1821	                                // Only trigger if we've ever bound an event for it
1822	                                if ( jQuery.event.global[ type ] ) {
1823	                                        jQuery.each( jQuery.cache, function() {
1824	                                                if ( this.events && this.events[type] ) {
1825	                                                        jQuery.event.trigger( event, data, this.handle.elem );
1826	                                                }
1827	                                        });
1828	                                }
1829	                        }
1830	
1831	                        // Handle triggering a single element
1832	
1833	                        // don't do events on text and comment nodes
1834	                        if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
1835	                                return undefined;
1836	                        }
1837	
1838	                        // Clean up in case it is reused
1839	                        event.result = undefined;
1840	                        event.target = elem;
1841	
1842	                        // Clone the incoming data, if any
1843	                        data = jQuery.makeArray( data );
1844	                        data.unshift( event );
1845	                }
1846	
1847	                event.currentTarget = elem;
1848	
1849	                // Trigger the event, it is assumed that "handle" is a function
1850	                var handle = jQuery.data( elem, "handle" );
1851	                if ( handle ) {
1852	                        handle.apply( elem, data );
1853	                }
1854	
1855	                var parent = elem.parentNode || elem.ownerDocument;
1856	
1857	                // Trigger an inline bound script
1858	                try {
1859	                        if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
1860	                                if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {
1861	                                        event.result = false;
1862	                                }
1863	                        }
1864	
1865	                // prevent IE from throwing an error for some elements with some event types, see #3533
1866	                } catch (e) {}
1867	
1868	                if ( !event.isPropagationStopped() && parent ) {
1869	                        jQuery.event.trigger( event, data, parent, true );
1870	
1871	                } else if ( !event.isDefaultPrevented() ) {
1872	                        var target = event.target, old,
1873	                                isClick = jQuery.nodeName(target, "a") && type === "click",
1874	                                special = jQuery.event.special[ type ] || {};
1875	
1876	                        if ( (!special._default || special._default.call( elem, event ) === false) && 
1877	                                !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
1878	
1879	                                try {
1880	                                        if ( target[ type ] ) {
1881	                                                // Make sure that we don't accidentally re-trigger the onFOO events
1882	                                                old = target[ "on" + type ];
1883	
1884	                                                if ( old ) {
1885	                                                        target[ "on" + type ] = null;
1886	                                                }
1887	
1888	                                                jQuery.event.triggered = true;
1889	                                                target[ type ]();
1890	                                        }
1891	
1892	                                // prevent IE from throwing an error for some elements with some event types, see #3533
1893	                                } catch (e) {}
1894	
1895	                                if ( old ) {
1896	                                        target[ "on" + type ] = old;
1897	                                }
1898	
1899	                                jQuery.event.triggered = false;
1900	                        }
1901	                }
1902	        },
1903	
1904	        handle: function( event ) {
1905	                var all, handlers, namespaces, namespace, events;
1906	
1907	                event = arguments[0] = jQuery.event.fix( event || window.event );
1908	                event.currentTarget = this;
1909	
1910	                // Namespaced event handlers
1911	                all = event.type.indexOf(".") < 0 && !event.exclusive;
1912	
1913	                if ( !all ) {
1914	                        namespaces = event.type.split(".");
1915	                        event.type = namespaces.shift();
1916	                        namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)");
1917	                }
1918	
1919	                var events = jQuery.data(this, "events"), handlers = events[ event.type ];
1920	
1921	                if ( events && handlers ) {
1922	                        // Clone the handlers to prevent manipulation
1923	                        handlers = handlers.slice(0);
1924	
1925	                        for ( var j = 0, l = handlers.length; j < l; j++ ) {
1926	                                var handleObj = handlers[ j ];
1927	
1928	                                // Filter the functions by class
1929	                                if ( all || namespace.test( handleObj.namespace ) ) {
1930	                                        // Pass in a reference to the handler function itself
1931	                                        // So that we can later remove it
1932	                                        event.handler = handleObj.handler;
1933	                                        event.data = handleObj.data;
1934	                                        event.handleObj = handleObj;
1935	       
1936	                                        var ret = handleObj.handler.apply( this, arguments );
1937	
1938	                                        if ( ret !== undefined ) {
1939	                                                event.result = ret;
1940	                                                if ( ret === false ) {
1941	                                                        event.preventDefault();
1942	                                                        event.stopPropagation();
1943	                                                }
1944	                                        }
1945	
1946	                                        if ( event.isImmediatePropagationStopped() ) {
1947	                                                break;
1948	                                        }
1949	                                }
1950	                        }
1951	                }
1952	
1953	                return event.result;
1954	        },
1955	
1956	        props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
1957	
1958	        fix: function( event ) {
1959	                if ( event[ expando ] ) {
1960	                        return event;
1961	                }
1962	
1963	                // store a copy of the original event object
1964	                // and "clone" to set read-only properties
1965	                var originalEvent = event;
1966	                event = jQuery.Event( originalEvent );
1967	
1968	                for ( var i = this.props.length, prop; i; ) {
1969	                        prop = this.props[ --i ];
1970	                        event[ prop ] = originalEvent[ prop ];
1971	                }
1972	
1973	                // Fix target property, if necessary
1974	                if ( !event.target ) {
1975	                        event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
1976	                }
1977	
1978	                // check if target is a textnode (safari)
1979	                if ( event.target.nodeType === 3 ) {
1980	                        event.target = event.target.parentNode;
1981	                }
1982	
1983	                // Add relatedTarget, if necessary
1984	                if ( !event.relatedTarget && event.fromElement ) {
1985	                        event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
1986	                }
1987	
1988	                // Calculate pageX/Y if missing and clientX/Y available
1989	                if ( event.pageX == null && event.clientX != null ) {
1990	                        var doc = document.documentElement, body = document.body;
1991	                        event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
1992	                        event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
1993	                }
1994	
1995	                // Add which for key events
1996	                if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) {
1997	                        event.which = event.charCode || event.keyCode;
1998	                }
1999	
2000	                // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
2001	                if ( !event.metaKey && event.ctrlKey ) {
2002	                        event.metaKey = event.ctrlKey;
2003	                }
2004	
2005	                // Add which for click: 1 === left; 2 === middle; 3 === right
2006	                // Note: button is not normalized, so don't use it
2007	                if ( !event.which && event.button !== undefined ) {
2008	                        event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
2009	                }
2010	
2011	                return event;
2012	        },
2013	
2014	        // Deprecated, use jQuery.guid instead
2015	        guid: 1E8,
2016	
2017	        // Deprecated, use jQuery.proxy instead
2018	        proxy: jQuery.proxy,
2019	
2020	        special: {
2021	                ready: {
2022	                        // Make sure the ready event is setup
2023	                        setup: jQuery.bindReady,
2024	                        teardown: jQuery.noop
2025	                },
2026	
2027	                live: {
2028	                        add: function( handleObj ) {
2029	                                jQuery.event.add( this, handleObj.origType, jQuery.extend({}, handleObj, {handler: liveHandler}) ); 
2030	                        },
2031	
2032	                        remove: function( handleObj ) {
2033	                                var remove = true,
2034	                                        type = handleObj.origType.replace(rnamespaces, "");
2035	                               
2036	                                jQuery.each( jQuery.data(this, "events").live || [], function() {
2037	                                        if ( type === this.origType.replace(rnamespaces, "") ) {
2038	                                                remove = false;
2039	                                                return false;
2040	                                        }
2041	                                });
2042	
2043	                                if ( remove ) {
2044	                                        jQuery.event.remove( this, handleObj.origType, liveHandler );
2045	                                }
2046	                        }
2047	
2048	                },
2049	
2050	                beforeunload: {
2051	                        setup: function( data, namespaces, eventHandle ) {
2052	                                // We only want to do this special case on windows
2053	                                if ( this.setInterval ) {
2054	                                        this.onbeforeunload = eventHandle;
2055	                                }
2056	
2057	                                return false;
2058	                        },
2059	                        teardown: function( namespaces, eventHandle ) {
2060	                                if ( this.onbeforeunload === eventHandle ) {
2061	                                        this.onbeforeunload = null;
2062	                                }
2063	                        }
2064	                }
2065	        }
2066	};
2067	
2068	var removeEvent = document.removeEventListener ?
2069	        function( elem, type, handle ) {
2070	                elem.removeEventListener( type, handle, false );
2071	        } : 
2072	        function( elem, type, handle ) {
2073	                elem.detachEvent( "on" + type, handle );
2074	        };
2075	
2076	jQuery.Event = function( src ) {
2077	        // Allow instantiation without the 'new' keyword
2078	        if ( !this.preventDefault ) {
2079	                return new jQuery.Event( src );
2080	        }
2081	
2082	        // Event object
2083	        if ( src && src.type ) {
2084	                this.originalEvent = src;
2085	                this.type = src.type;
2086	        // Event type
2087	        } else {
2088	                this.type = src;
2089	        }
2090	
2091	        // timeStamp is buggy for some events on Firefox(#3843)
2092	        // So we won't rely on the native value
2093	        this.timeStamp = now();
2094	
2095	        // Mark it as fixed
2096	        this[ expando ] = true;
2097	};
2098	
2099	function returnFalse() {
2100	        return false;
2101	}
2102	function returnTrue() {
2103	        return true;
2104	}
2105	
2106	// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
2107	// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
2108	jQuery.Event.prototype = {
2109	        preventDefault: function() {
2110	                this.isDefaultPrevented = returnTrue;
2111	
2112	                var e = this.originalEvent;
2113	                if ( !e ) {
2114	                        return;
2115	                }
2116	               
2117	                // if preventDefault exists run it on the original event
2118	                if ( e.preventDefault ) {
2119	                        e.preventDefault();
2120	                }
2121	                // otherwise set the returnValue property of the original event to false (IE)
2122	                e.returnValue = false;
2123	        },
2124	        stopPropagation: function() {
2125	                this.isPropagationStopped = returnTrue;
2126	
2127	                var e = this.originalEvent;
2128	                if ( !e ) {
2129	                        return;
2130	                }
2131	                // if stopPropagation exists run it on the original event
2132	                if ( e.stopPropagation ) {
2133	                        e.stopPropagation();
2134	                }
2135	                // otherwise set the cancelBubble property of the original event to true (IE)
2136	                e.cancelBubble = true;
2137	        },
2138	        stopImmediatePropagation: function() {
2139	                this.isImmediatePropagationStopped = returnTrue;
2140	                this.stopPropagation();
2141	        },
2142	        isDefaultPrevented: returnFalse,
2143	        isPropagationStopped: returnFalse,
2144	        isImmediatePropagationStopped: returnFalse
2145	};
2146	
2147	// Checks if an event happened on an element within another element
2148	// Used in jQuery.event.special.mouseenter and mouseleave handlers
2149	var withinElement = function( event ) {
2150	        // Check if mouse(over|out) are still within the same parent element
2151	        var parent = event.relatedTarget;
2152	
2153	        // Firefox sometimes assigns relatedTarget a XUL element
2154	        // which we cannot access the parentNode property of
2155	        try {
2156	                // Traverse up the tree
2157	                while ( parent && parent !== this ) {
2158	                        parent = parent.parentNode;
2159	                }
2160	
2161	                if ( parent !== this ) {
2162	                        // set the correct event type
2163	                        event.type = event.data;
2164	
2165	                        // handle event if we actually just moused on to a non sub-element
2166	                        jQuery.event.handle.apply( this, arguments );
2167	                }
2168	
2169	        // assuming we've left the element since we most likely mousedover a xul element
2170	        } catch(e) { }
2171	},
2172	
2173	// In case of event delegation, we only need to rename the event.type,
2174	// liveHandler will take care of the rest.
2175	delegate = function( event ) {
2176	        event.type = event.data;
2177	        jQuery.event.handle.apply( this, arguments );
2178	};
2179	
2180	// Create mouseenter and mouseleave events
2181	jQuery.each({
2182	        mouseenter: "mouseover",
2183	        mouseleave: "mouseout"
2184	}, function( orig, fix ) {
2185	        jQuery.event.special[ orig ] = {
2186	                setup: function( data ) {
2187	                        jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
2188	                },
2189	                teardown: function( data ) {
2190	                        jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
2191	                }
2192	        };
2193	});
2194	
2195	// submit delegation
2196	if ( !jQuery.support.submitBubbles ) {
2197	
2198	        jQuery.event.special.submit = {
2199	                setup: function( data, namespaces ) {
2200	                        if ( this.nodeName.toLowerCase() !== "form" ) {
2201	                                jQuery.event.add(this, "click.specialSubmit", function( e ) {
2202	                                        var elem = e.target, type = elem.type;
2203	
2204	                                        if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
2205	                                                return trigger( "submit", this, arguments );
2206	                                        }
2207	                                });
2208	         
2209	                                jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
2210	                                        var elem = e.target, type = elem.type;
2211	
2212	                                        if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
2213	                                                return trigger( "submit", this, arguments );
2214	                                        }
2215	                                });
2216	
2217	                        } else {
2218	                                return false;
2219	                        }
2220	                },
2221	
2222	                teardown: function( namespaces ) {
2223	                        jQuery.event.remove( this, ".specialSubmit" );
2224	                }
2225	        };
2226	
2227	}
2228	
2229	// change delegation, happens here so we have bind.
2230	if ( !jQuery.support.changeBubbles ) {
2231	
2232	        var formElems = /textarea|input|select/i,
2233	
2234	        changeFilters,
2235	
2236	        getVal = function( elem ) {
2237	                var type = elem.type, val = elem.value;
2238	
2239	                if ( type === "radio" || type === "checkbox" ) {
2240	                        val = elem.checked;
2241	
2242	                } else if ( type === "select-multiple" ) {
2243	                        val = elem.selectedIndex > -1 ?
2244	                                jQuery.map( elem.options, function( elem ) {
2245	                                        return elem.selected;
2246	                                }).join("-") :
2247	                                "";
2248	
2249	                } else if ( elem.nodeName.toLowerCase() === "select" ) {
2250	                        val = elem.selectedIndex;
2251	                }
2252	
2253	                return val;
2254	        },
2255	
2256	        testChange = function testChange( e ) {
2257	                var elem = e.target, data, val;
2258	
2259	                if ( !formElems.test( elem.nodeName ) || elem.readOnly ) {
2260	                        return;
2261	                }
2262	
2263	                data = jQuery.data( elem, "_change_data" );
2264	                val = getVal(elem);
2265	
2266	                // the current data will be also retrieved by beforeactivate
2267	                if ( e.type !== "focusout" || elem.type !== "radio" ) {
2268	                        jQuery.data( elem, "_change_data", val );
2269	                }
2270	               
2271	                if ( data === undefined || val === data ) {
2272	                        return;
2273	                }
2274	
2275	                if ( data != null || val ) {
2276	                        e.type = "change";
2277	                        return jQuery.event.trigger( e, arguments[1], elem );
2278	                }
2279	        };
2280	
2281	        jQuery.event.special.change = {
2282	                filters: {
2283	                        focusout: testChange, 
2284	
2285	                        click: function( e ) {
2286	                                var elem = e.target, type = elem.type;
2287	
2288	                                if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
2289	                                        return testChange.call( this, e );
2290	                                }
2291	                        },
2292	
2293	                        // Change has to be called before submit
2294	                        // Keydown will be called before keypress, which is used in submit-event delegation
2295	                        keydown: function( e ) {
2296	                                var elem = e.target, type = elem.type;
2297	
2298	                                if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
2299	                                        (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
2300	                                        type === "select-multiple" ) {
2301	                                        return testChange.call( this, e );
2302	                                }
2303	                        },
2304	
2305	                        // Beforeactivate happens also before the previous element is blurred
2306	                        // with this event you can't trigger a change event, but you can store
2307	                        // information/focus[in] is not needed anymore
2308	                        beforeactivate: function( e ) {
2309	                                var elem = e.target;
2310	                                jQuery.data( elem, "_change_data", getVal(elem) );
2311	                        }
2312	                },
2313	
2314	                setup: function( data, namespaces ) {
2315	                        if ( this.type === "file" ) {
2316	                                return false;
2317	                        }
2318	
2319	                        for ( var type in changeFilters ) {
2320	                                jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
2321	                        }
2322	
2323	                        return formElems.test( this.nodeName );
2324	                },
2325	
2326	                teardown: function( namespaces ) {
2327	                        jQuery.event.remove( this, ".specialChange" );
2328	
2329	                        return formElems.test( this.nodeName );
2330	                }
2331	        };
2332	
2333	        changeFilters = jQuery.event.special.change.filters;
2334	}
2335	
2336	function trigger( type, elem, args ) {
2337	        args[0].type = type;
2338	        return jQuery.event.handle.apply( elem, args );
2339	}
2340	
2341	// Create "bubbling" focus and blur events
2342	if ( document.addEventListener ) {
2343	        jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
2344	                jQuery.event.special[ fix ] = {
2345	                        setup: function() {
2346	                                this.addEventListener( orig, handler, true );
2347	                        }, 
2348	                        teardown: function() { 
2349	                                this.removeEventListener( orig, handler, true );
2350	                        }
2351	                };
2352	
2353	                function handler( e ) { 
2354	                        e = jQuery.event.fix( e );
2355	                        e.type = fix;
2356	                        return jQuery.event.handle.call( this, e );
2357	                }
2358	        });
2359	}
2360	
2361	jQuery.each(["bind", "one"], function( i, name ) {
2362	        jQuery.fn[ name ] = function( type, data, fn ) {
2363	                // Handle object literals
2364	                if ( typeof type === "object" ) {
2365	                        for ( var key in type ) {
2366	                                this[ name ](key, data, type[key], fn);
2367	                        }
2368	                        return this;
2369	                }
2370	               
2371	                if ( jQuery.isFunction( data ) ) {
2372	                        fn = data;
2373	                        data = undefined;
2374	                }
2375	
2376	                var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
2377	                        jQuery( this ).unbind( event, handler );
2378	                        return fn.apply( this, arguments );
2379	                }) : fn;
2380	
2381	                if ( type === "unload" && name !== "one" ) {
2382	                        this.one( type, data, fn );
2383	
2384	                } else {
2385	                        for ( var i = 0, l = this.length; i < l; i++ ) {
2386	                                jQuery.event.add( this[i], type, handler, data );
2387	                        }
2388	                }
2389	
2390	                return this;
2391	        };
2392	});
2393	
2394	jQuery.fn.extend({
2395	        unbind: function( type, fn ) {
2396	                // Handle object literals
2397	                if ( typeof type === "object" && !type.preventDefault ) {
2398	                        for ( var key in type ) {
2399	                                this.unbind(key, type[key]);
2400	                        }
2401	
2402	                } else {
2403	                        for ( var i = 0, l = this.length; i < l; i++ ) {
2404	                                jQuery.event.remove( this[i], type, fn );
2405	                        }
2406	                }
2407	
2408	                return this;
2409	        },
2410	       
2411	        delegate: function( selector, types, data, fn ) {
2412	                return this.live( types, data, fn, selector );
2413	        },
2414	       
2415	        undelegate: function( selector, types, fn ) {
2416	                if ( arguments.length === 0 ) {
2417	                                return this.unbind( "live" );
2418	               
2419	                } else {
2420	                        return this.die( types, null, fn, selector );
2421	                }
2422	        },
2423	       
2424	        trigger: function( type, data ) {
2425	                return this.each(function() {
2426	                        jQuery.event.trigger( type, data, this );
2427	                });
2428	        },
2429	
2430	        triggerHandler: function( type, data ) {
2431	                if ( this[0] ) {
2432	                        var event = jQuery.Event( type );
2433	                        event.preventDefault();
2434	                        event.stopPropagation();
2435	                        jQuery.event.trigger( event, data, this[0] );
2436	                        return event.result;
2437	                }
2438	        },
2439	
2440	        toggle: function( fn ) {
2441	                // Save reference to arguments for access in closure
2442	                var args = arguments, i = 1;
2443	
2444	                // link all the functions, so any of them can unbind this click handler
2445	                while ( i < args.length ) {
2446	                        jQuery.proxy( fn, args[ i++ ] );
2447	                }
2448	
2449	                return this.click( jQuery.proxy( fn, function( event ) {
2450	                        // Figure out which function to execute
2451	                        var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
2452	                        jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
2453	
2454	                        // Make sure that clicks stop
2455	                        event.preventDefault();
2456	
2457	                        // and execute the function
2458	                        return args[ lastToggle ].apply( this, arguments ) || false;
2459	                }));
2460	        },
2461	
2462	        hover: function( fnOver, fnOut ) {
2463	                return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
2464	        }
2465	});
2466	
2467	var liveMap = {
2468	        focus: "focusin",
2469	        blur: "focusout",
2470	        mouseenter: "mouseover",
2471	        mouseleave: "mouseout"
2472	};
2473	
2474	jQuery.each(["live", "die"], function( i, name ) {
2475	        jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
2476	                var type, i = 0, match, namespaces, preType,
2477	                        selector = origSelector || this.selector,
2478	                        context = origSelector ? this : jQuery( this.context );
2479	
2480	                if ( jQuery.isFunction( data ) ) {
2481	                        fn = data;
2482	                        data = undefined;
2483	                }
2484	
2485	                types = (types || "").split(" ");
2486	
2487	                while ( (type = types[ i++ ]) != null ) {
2488	                        match = rnamespaces.exec( type );
2489	                        namespaces = "";
2490	
2491	                        if ( match )  {
2492	                                namespaces = match[0];
2493	                                type = type.replace( rnamespaces, "" );
2494	                        }
2495	
2496	                        if ( type === "hover" ) {
2497	                                types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
2498	                                continue;
2499	                        }
2500	
2501	                        preType = type;
2502	
2503	                        if ( type === "focus" || type === "blur" ) {
2504	                                types.push( liveMap[ type ] + namespaces );
2505	                                type = type + namespaces;
2506	
2507	                        } else {
2508	                                type = (liveMap[ type ] || type) + namespaces;
2509	                        }
2510	
2511	                        if ( name === "live" ) {
2512	                                // bind live handler
2513	                                context.each(function(){
2514	                                        jQuery.event.add( this, liveConvert( type, selector ),
2515	                                                { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
2516	                                });
2517	
2518	                        } else {
2519	                                // unbind live handler
2520	                                context.unbind( liveConvert( type, selector ), fn );
2521	                        }
2522	                }
2523	               
2524	                return this;
2525	        }
2526	});
2527	
2528	function liveHandler( event ) {
2529	        var stop, elems = [], selectors = [], args = arguments,
2530	                related, match, handleObj, elem, j, i, l, data,
2531	                events = jQuery.data( this, "events" );
2532	
2533	        // Make sure we avoid non-left-click bubbling in Firefox (#3861)
2534	        if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) {
2535	                return;
2536	        }
2537	
2538	        event.liveFired = this;
2539	
2540	        var live = events.live.slice(0);
2541	
2542	        for ( j = 0; j < live.length; j++ ) {
2543	                handleObj = live[j];
2544	
2545	                if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
2546	                        selectors.push( handleObj.selector );
2547	
2548	                } else {
2549	                        live.splice( j--, 1 );
2550	                }
2551	        }
2552	
2553	        match = jQuery( event.target ).closest( selectors, event.currentTarget );
2554	
2555	        for ( i = 0, l = match.length; i < l; i++ ) {
2556	                for ( j = 0; j < live.length; j++ ) {
2557	                        handleObj = live[j];
2558	
2559	                        if ( match[i].selector === handleObj.selector ) {
2560	                                elem = match[i].elem;
2561	                                related = null;
2562	
2563	                                // Those two events require additional checking
2564	                                if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
2565	                                        related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
2566	                                }
2567	
2568	                                if ( !related || related !== elem ) {
2569	                                        elems.push({ elem: elem, handleObj: handleObj });
2570	                                }
2571	                        }
2572	                }
2573	        }
2574	
2575	        for ( i = 0, l = elems.length; i < l; i++ ) {
2576	                match = elems[i];
2577	                event.currentTarget = match.elem;
2578	                event.data = match.handleObj.data;
2579	                event.handleObj = match.handleObj;
2580	
2581	                if ( match.handleObj.origHandler.apply( match.elem, args ) === false ) {
2582	                        stop = false;
2583	                        break;
2584	                }
2585	        }
2586	
2587	        return stop;
2588	}
2589	
2590	function liveConvert( type, selector ) {
2591	        return "live." + (type && type !== "*" ? type + "." : "") + selector.replace(/\./g, "`").replace(/ /g, "&");
2592	}
2593	
2594	jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
2595	        "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
2596	        "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
2597	
2598	        // Handle event binding
2599	        jQuery.fn[ name ] = function( fn ) {
2600	                return fn ? this.bind( name, fn ) : this.trigger( name );
2601	        };
2602	
2603	        if ( jQuery.attrFn ) {
2604	                jQuery.attrFn[ name ] = true;
2605	        }
2606	});
2607	
2608	// Prevent memory leaks in IE
2609	// Window isn't included so as not to unbind existing unload events
2610	// More info:
2611	//  - http://isaacschlueter.com/2006/10/msie-memory-leaks/
2612	if ( window.attachEvent && !window.addEventListener ) {
2613	        window.attachEvent("onunload", function() {
2614	                for ( var id in jQuery.cache ) {
2615	                        if ( jQuery.cache[ id ].handle ) {
2616	                                // Try/Catch is to handle iframes being unloaded, see #4280
2617	                                try {
2618	                                        jQuery.event.remove( jQuery.cache[ id ].handle.elem );
2619	                                } catch(e) {}
2620	                        }
2621	                }
2622	        });
2623	}
2624	/*!
2625	 * Sizzle CSS Selector Engine - v1.0
2626	 *  Copyright 2009, The Dojo Foundation
2627	 *  Released under the MIT, BSD, and GPL Licenses.
2628	 *  More information: http://sizzlejs.com/
2629	 */
2630	(function(){
2631	
2632	var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
2633	        done = 0,
2634	        toString = Object.prototype.toString,
2635	        hasDuplicate = false,
2636	        baseHasDuplicate = true;
2637	
2638	// Here we check if the JavaScript engine is using some sort of
2639	// optimization where it does not always call our comparision
2640	// function. If that is the case, discard the hasDuplicate value.
2641	//   Thus far that includes Google Chrome.
2642	[0, 0].sort(function(){
2643	        baseHasDuplicate = false;
2644	        return 0;
2645	});
2646	
2647	var Sizzle = function(selector, context, results, seed) {
2648	        results = results || [];
2649	        var origContext = context = context || document;
2650	
2651	        if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
2652	                return [];
2653	        }
2654	       
2655	        if ( !selector || typeof selector !== "string" ) {
2656	                return results;
2657	        }
2658	
2659	        var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context),
2660	                soFar = selector;
2661	       
2662	        // Reset the position of the chunker regexp (start from head)
2663	        while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) {
2664	                soFar = m[3];
2665	               
2666	                parts.push( m[1] );
2667	               
2668	                if ( m[2] ) {
2669	                        extra = m[3];
2670	                        break;
2671	                }
2672	        }
2673	
2674	        if ( parts.length > 1 && origPOS.exec( selector ) ) {
2675	                if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
2676	                        set = posProcess( parts[0] + parts[1], context );
2677	                } else {
2678	                        set = Expr.relative[ parts[0] ] ?
2679	                                [ context ] :
2680	                                Sizzle( parts.shift(), context );
2681	
2682	                        while ( parts.length ) {
2683	                                selector = parts.shift();
2684	
2685	                                if ( Expr.relative[ selector ] ) {
2686	                                        selector += parts.shift();
2687	                                }
2688	                               
2689	                                set = posProcess( selector, set );
2690	                        }
2691	                }
2692	        } else {
2693	                // Take a shortcut and set the context if the root selector is an ID
2694	                // (but not if it'll be faster if the inner selector is an ID)
2695	                if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
2696	                                Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
2697	                        var ret = Sizzle.find( parts.shift(), context, contextXML );
2698	                        context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
2699	                }
2700	
2701	                if ( context ) {
2702	                        var ret = seed ?
2703	                                { expr: parts.pop(), set: makeArray(seed) } :
2704	                                Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
2705	                        set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
2706	
2707	                        if ( parts.length > 0 ) {
2708	                                checkSet = makeArray(set);
2709	                        } else {
2710	                                prune = false;
2711	                        }
2712	
2713	                        while ( parts.length ) {
2714	                                var cur = parts.pop(), pop = cur;
2715	
2716	                                if ( !Expr.relative[ cur ] ) {
2717	                                        cur = "";
2718	                                } else {
2719	                                        pop = parts.pop();
2720	                                }
2721	
2722	                                if ( pop == null ) {
2723	                                        pop = context;
2724	                                }
2725	
2726	                                Expr.relative[ cur ]( checkSet, pop, contextXML );
2727	                        }
2728	                } else {
2729	                        checkSet = parts = [];
2730	                }
2731	        }
2732	
2733	        if ( !checkSet ) {
2734	                checkSet = set;
2735	        }
2736	
2737	        if ( !checkSet ) {
2738	                Sizzle.error( cur || selector );
2739	        }
2740	
2741	        if ( toString.call(checkSet) === "[object Array]" ) {
2742	                if ( !prune ) {
2743	                        results.push.apply( results, checkSet );
2744	                } else if ( context && context.nodeType === 1 ) {
2745	                        for ( var i = 0; checkSet[i] != null; i++ ) {
2746	                                if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
2747	                                        results.push( set[i] );
2748	                                }
2749	                        }
2750	                } else {
2751	                        for ( var i = 0; checkSet[i] != null; i++ ) {
2752	                                if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
2753	                                        results.push( set[i] );
2754	                                }
2755	                        }
2756	                }
2757	        } else {
2758	                makeArray( checkSet, results );
2759	        }
2760	
2761	        if ( extra ) {
2762	                Sizzle( extra, origContext, results, seed );
2763	                Sizzle.uniqueSort( results );
2764	        }
2765	
2766	        return results;
2767	};
2768	
2769	Sizzle.uniqueSort = function(results){
2770	        if ( sortOrder ) {
2771	                hasDuplicate = baseHasDuplicate;
2772	                results.sort(sortOrder);
2773	
2774	                if ( hasDuplicate ) {
2775	                        for ( var i = 1; i < results.length; i++ ) {
2776	                                if ( results[i] === results[i-1] ) {
2777	                                        results.splice(i--, 1);
2778	                                }
2779	                        }
2780	                }
2781	        }
2782	
2783	        return results;
2784	};
2785	
2786	Sizzle.matches = function(expr, set){
2787	        return Sizzle(expr, null, null, set);
2788	};
2789	
2790	Sizzle.find = function(expr, context, isXML){
2791	        var set, match;
2792	
2793	        if ( !expr ) {
2794	                return [];
2795	        }
2796	
2797	        for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
2798	                var type = Expr.order[i], match;
2799	               
2800	                if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
2801	                        var left = match[1];
2802	                        match.splice(1,1);
2803	
2804	                        if ( left.substr( left.length - 1 ) !== "\\" ) {
2805	                                match[1] = (match[1] || "").replace(/\\/g, "");
2806	                                set = Expr.find[ type ]( match, context, isXML );
2807	                                if ( set != null ) {
2808	                                        expr = expr.replace( Expr.match[ type ], "" );
2809	                                        break;
2810	                                }
2811	                        }
2812	                }
2813	        }
2814	
2815	        if ( !set ) {
2816	                set = context.getElementsByTagName("*");
2817	        }
2818	
2819	        return {set: set, expr: expr};
2820	};
2821	
2822	Sizzle.filter = function(expr, set, inplace, not){
2823	        var old = expr, result = [], curLoop = set, match, anyFound,
2824	                isXMLFilter = set && set[0] && isXML(set[0]);
2825	
2826	        while ( expr && set.length ) {
2827	                for ( var type in Expr.filter ) {
2828	                        if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
2829	                                var filter = Expr.filter[ type ], found, item, left = match[1];
2830	                                anyFound = false;
2831	
2832	                                match.splice(1,1);
2833	
2834	                                if ( left.substr( left.length - 1 ) === "\\" ) {
2835	                                        continue;
2836	                                }
2837	
2838	                                if ( curLoop === result ) {
2839	                                        result = [];
2840	                                }
2841	
2842	                                if ( Expr.preFilter[ type ] ) {
2843	                                        match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
2844	
2845	                                        if ( !match ) {
2846	                                                anyFound = found = true;
2847	                                        } else if ( match === true ) {
2848	                                                continue;
2849	                                        }
2850	                                }
2851	
2852	                                if ( match ) {
2853	                                        for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
2854	                                                if ( item ) {
2855	                                                        found = filter( item, match, i, curLoop );
2856	                                                        var pass = not ^ !!found;
2857	
2858	                                                        if ( inplace && found != null ) {
2859	                                                                if ( pass ) {
2860	                                                                        anyFound = true;
2861	                                                                } else {
2862	                                                                        curLoop[i] = false;
2863	                                                                }
2864	                                                        } else if ( pass ) {
2865	                                                                result.push( item );
2866	                                                                anyFound = true;
2867	                                                        }
2868	                                                }
2869	                                        }
2870	                                }
2871	
2872	                                if ( found !== undefined ) {
2873	                                        if ( !inplace ) {
2874	                                                curLoop = result;
2875	                                        }
2876	
2877	                                        expr = expr.replace( Expr.match[ type ], "" );
2878	
2879	                                        if ( !anyFound ) {
2880	                                                return [];
2881	                                        }
2882	
2883	                                        break;
2884	                                }
2885	                        }
2886	                }
2887	
2888	                // Improper expression
2889	                if ( expr === old ) {
2890	                        if ( anyFound == null ) {
2891	                                Sizzle.error( expr );
2892	                        } else {
2893	                                break;
2894	                        }
2895	                }
2896	
2897	                old = expr;
2898	        }
2899	
2900	        return curLoop;
2901	};
2902	
2903	Sizzle.error = function( msg ) {
2904	        throw "Syntax error, unrecognized expression: " + msg;
2905	};
2906	
2907	var Expr = Sizzle.selectors = {
2908	        order: [ "ID", "NAME", "TAG" ],
2909	        match: {
2910	                ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
2911	                CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
2912	                NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,
2913	                ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
2914	                TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,
2915	                CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
2916	                POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
2917	                PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
2918	        },
2919	        leftMatch: {},
2920	        attrMap: {
2921	                "class": "className",
2922	                "for": "htmlFor"
2923	        },
2924	        attrHandle: {
2925	                href: function(elem){
2926	                        return elem.getAttribute("href");
2927	                }
2928	        },
2929	        relative: {
2930	                "+": function(checkSet, part){
2931	                        var isPartStr = typeof part === "string",
2932	                                isTag = isPartStr && !/\W/.test(part),
2933	                                isPartStrNotTag = isPartStr && !isTag;
2934	
2935	                        if ( isTag ) {
2936	                                part = part.toLowerCase();
2937	                        }
2938	
2939	                        for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
2940	                                if ( (elem = checkSet[i]) ) {
2941	                                        while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
2942	
2943	                                        checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
2944	                                                elem || false :
2945	                                                elem === part;
2946	                                }
2947	                        }
2948	
2949	                        if ( isPartStrNotTag ) {
2950	                                Sizzle.filter( part, checkSet, true );
2951	                        }
2952	                },
2953	                ">": function(checkSet, part){
2954	                        var isPartStr = typeof part === "string";
2955	
2956	                        if ( isPartStr && !/\W/.test(part) ) {
2957	                                part = part.toLowerCase();
2958	
2959	                                for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2960	                                        var elem = checkSet[i];
2961	                                        if ( elem ) {
2962	                                                var parent = elem.parentNode;
2963	                                                checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
2964	                                        }
2965	                                }
2966	                        } else {
2967	                                for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2968	                                        var elem = checkSet[i];
2969	                                        if ( elem ) {
2970	                                                checkSet[i] = isPartStr ?
2971	                                                        elem.parentNode :
2972	                                                        elem.parentNode === part;
2973	                                        }
2974	                                }
2975	
2976	                                if ( isPartStr ) {
2977	                                        Sizzle.filter( part, checkSet, true );
2978	                                }
2979	                        }
2980	                },
2981	                "": function(checkSet, part, isXML){
2982	                        var doneName = done++, checkFn = dirCheck;
2983	
2984	                        if ( typeof part === "string" && !/\W/.test(part) ) {
2985	                                var nodeCheck = part = part.toLowerCase();
2986	                                checkFn = dirNodeCheck;
2987	                        }
2988	
2989	                        checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
2990	                },
2991	                "~": function(checkSet, part, isXML){
2992	                        var doneName = done++, checkFn = dirCheck;
2993	
2994	                        if ( typeof part === "string" && !/\W/.test(part) ) {
2995	                                var nodeCheck = part = part.toLowerCase();
2996	                                checkFn = dirNodeCheck;
2997	                        }
2998	
2999	                        checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
3000	                }
3001	        },
3002	        find: {
3003	                ID: function(match, context, isXML){
3004	                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
3005	                                var m = context.getElementById(match[1]);
3006	                                return m ? [m] : [];
3007	                        }
3008	                },
3009	                NAME: function(match, context){
3010	                        if ( typeof context.getElementsByName !== "undefined" ) {
3011	                                var ret = [], results = context.getElementsByName(match[1]);
3012	
3013	                                for ( var i = 0, l = results.length; i < l; i++ ) {
3014	                                        if ( results[i].getAttribute("name") === match[1] ) {
3015	                                                ret.push( results[i] );
3016	                                        }
3017	                                }
3018	
3019	                                return ret.length === 0 ? null : ret;
3020	                        }
3021	                },
3022	                TAG: function(match, context){
3023	                        return context.getElementsByTagName(match[1]);
3024	                }
3025	        },
3026	        preFilter: {
3027	                CLASS: function(match, curLoop, inplace, result, not, isXML){
3028	                        match = " " + match[1].replace(/\\/g, "") + " ";
3029	
3030	                        if ( isXML ) {
3031	                                return match;
3032	                        }
3033	
3034	                        for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
3035	                                if ( elem ) {
3036	                                        if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) {
3037	                                                if ( !inplace ) {
3038	                                                        result.push( elem );
3039	                                                }
3040	                                        } else if ( inplace ) {
3041	                                                curLoop[i] = false;
3042	                                        }
3043	                                }
3044	                        }
3045	
3046	                        return false;
3047	                },
3048	                ID: function(match){
3049	                        return match[1].replace(/\\/g, "");
3050	                },
3051	                TAG: function(match, curLoop){
3052	                        return match[1].toLowerCase();
3053	                },
3054	                CHILD: function(match){
3055	                        if ( match[1] === "nth" ) {
3056	                                // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
3057	                                var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
3058	                                        match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
3059	                                        !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
3060	
3061	                                // calculate the numbers (first)n+(last) including if they are negative
3062	                                match[2] = (test[1] + (test[2] || 1)) - 0;
3063	                                match[3] = test[3] - 0;
3064	                        }
3065	
3066	                        // TODO: Move to normal caching system
3067	                        match[0] = done++;
3068	
3069	                        return match;
3070	                },
3071	                ATTR: function(match, curLoop, inplace, result, not, isXML){
3072	                        var name = match[1].replace(/\\/g, "");
3073	                       
3074	                        if ( !isXML && Expr.attrMap[name] ) {
3075	                                match[1] = Expr.attrMap[name];
3076	                        }
3077	
3078	                        if ( match[2] === "~=" ) {
3079	                                match[4] = " " + match[4] + " ";
3080	                        }
3081	
3082	                        return match;
3083	                },
3084	                PSEUDO: function(match, curLoop, inplace, result, not){
3085	                        if ( match[1] === "not" ) {
3086	                                // If we're dealing with a complex expression, or a simple one
3087	                                if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
3088	                                        match[3] = Sizzle(match[3], null, null, curLoop);
3089	                                } else {
3090	                                        var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
3091	                                        if ( !inplace ) {
3092	                                                result.push.apply( result, ret );
3093	                                        }
3094	                                        return false;
3095	                                }
3096	                        } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
3097	                                return true;
3098	                        }
3099	                       
3100	                        return match;
3101	                },
3102	                POS: function(match){
3103	                        match.unshift( true );
3104	                        return match;
3105	                }
3106	        },
3107	        filters: {
3108	                enabled: function(elem){
3109	                        return elem.disabled === false && elem.type !== "hidden";
3110	                },
3111	                disabled: function(elem){
3112	                        return elem.disabled === true;
3113	                },
3114	                checked: function(elem){
3115	                        return elem.checked === true;
3116	                },
3117	                selected: function(elem){
3118	                        // Accessing this property makes selected-by-default
3119	                        // options in Safari work properly
3120	                        elem.parentNode.selectedIndex;
3121	                        return elem.selected === true;
3122	                },
3123	                parent: function(elem){
3124	                        return !!elem.firstChild;
3125	                },
3126	                empty: function(elem){
3127	                        return !elem.firstChild;
3128	                },
3129	                has: function(elem, i, match){
3130	                        return !!Sizzle( match[3], elem ).length;
3131	                },
3132	                header: function(elem){
3133	                        return /h\d/i.test( elem.nodeName );
3134	                },
3135	                text: function(elem){
3136	                        return "text" === elem.type;
3137	                },
3138	                radio: function(elem){
3139	                        return "radio" === elem.type;
3140	                },
3141	                checkbox: function(elem){
3142	                        return "checkbox" === elem.type;
3143	                },
3144	                file: function(elem){
3145	                        return "file" === elem.type;
3146	                },
3147	                password: function(elem){
3148	                        return "password" === elem.type;
3149	                },
3150	                submit: function(elem){
3151	                        return "submit" === elem.type;
3152	                },
3153	                image: function(elem){
3154	                        return "image" === elem.type;
3155	                },
3156	                reset: function(elem){
3157	                        return "reset" === elem.type;
3158	                },
3159	                button: function(elem){
3160	                        return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
3161	                },
3162	                input: function(elem){
3163	                        return /input|select|textarea|button/i.test(elem.nodeName);
3164	                }
3165	        },
3166	        setFilters: {
3167	                first: function(elem, i){
3168	                        return i === 0;
3169	                },
3170	                last: function(elem, i, match, array){
3171	                        return i === array.length - 1;
3172	                },
3173	                even: function(elem, i){
3174	                        return i % 2 === 0;
3175	                },
3176	                odd: function(elem, i){
3177	                        return i % 2 === 1;
3178	                },
3179	                lt: function(elem, i, match){
3180	                        return i < match[3] - 0;
3181	                },
3182	                gt: function(elem, i, match){
3183	                        return i > match[3] - 0;
3184	                },
3185	                nth: function(elem, i, match){
3186	                        return match[3] - 0 === i;
3187	                },
3188	                eq: function(elem, i, match){
3189	                        return match[3] - 0 === i;
3190	                }
3191	        },
3192	        filter: {
3193	                PSEUDO: function(elem, match, i, array){
3194	                        var name = match[1], filter = Expr.filters[ name ];
3195	
3196	                        if ( filter ) {
3197	                                return filter( elem, i, match, array );
3198	                        } else if ( name === "contains" ) {
3199	                                return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
3200	                        } else if ( name === "not" ) {
3201	                                var not = match[3];
3202	
3203	                                for ( var i = 0, l = not.length; i < l; i++ ) {
3204	                                        if ( not[i] === elem ) {
3205	                                                return false;
3206	                                        }
3207	                                }
3208	
3209	                                return true;
3210	                        } else {
3211	                                Sizzle.error( "Syntax error, unrecognized expression: " + name );
3212	                        }
3213	                },
3214	                CHILD: function(elem, match){
3215	                        var type = match[1], node = elem;
3216	                        switch (type) {
3217	                                case 'only':
3218	                                case 'first':
3219	                                        while ( (node = node.previousSibling) )  {
3220	                                                if ( node.nodeType === 1 ) { 
3221	                                                        return false; 
3222	                                                }
3223	                                        }
3224	                                        if ( type === "first" ) { 
3225	                                                return true; 
3226	                                        }
3227	                                        node = elem;
3228	                                case 'last':
3229	                                        while ( (node = node.nextSibling) )      {
3230	                                                if ( node.nodeType === 1 ) { 
3231	                                                        return false; 
3232	                                                }
3233	                                        }
3234	                                        return true;
3235	                                case 'nth':
3236	                                        var first = match[2], last = match[3];
3237	
3238	                                        if ( first === 1 && last === 0 ) {
3239	                                                return true;
3240	                                        }
3241	                                       
3242	                                        var doneName = match[0],
3243	                                                parent = elem.parentNode;
3244	       
3245	                                        if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
3246	                                                var count = 0;
3247	                                                for ( node = parent.firstChild; node; node = node.nextSibling ) {
3248	                                                        if ( node.nodeType === 1 ) {
3249	                                                                node.nodeIndex = ++count;
3250	                                                        }
3251	                                                } 
3252	                                                parent.sizcache = doneName;
3253	                                        }
3254	                                       
3255	                                        var diff = elem.nodeIndex - last;
3256	                                        if ( first === 0 ) {
3257	                                                return diff === 0;
3258	                                        } else {
3259	                                                return ( diff % first === 0 && diff / first >= 0 );
3260	                                        }
3261	                        }
3262	                },
3263	                ID: function(elem, match){
3264	                        return elem.nodeType === 1 && elem.getAttribute("id") === match;
3265	                },
3266	                TAG: function(elem, match){
3267	                        return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
3268	                },
3269	                CLASS: function(elem, match){
3270	                        return (" " + (elem.className || elem.getAttribute("class")) + " ")
3271	                                .indexOf( match ) > -1;
3272	                },
3273	                ATTR: function(elem, match){
3274	                        var name = match[1],
3275	                                result = Expr.attrHandle[ name ] ?
3276	                                        Expr.attrHandle[ name ]( elem ) :
3277	                                        elem[ name ] != null ?
3278	                                                elem[ name ] :
3279	                                                elem.getAttribute( name ),
3280	                                value = result + "",
3281	                                type = match[2],
3282	                                check = match[4];
3283	
3284	                        return result == null ?
3285	                                type === "!=" :
3286	                                type === "=" ?
3287	                                value === check :
3288	                                type === "*=" ?
3289	                                value.indexOf(check) >= 0 :
3290	                                type === "~=" ?
3291	                                (" " + value + " ").indexOf(check) >= 0 :
3292	                                !check ?
3293	                                value && result !== false :
3294	                                type === "!=" ?
3295	                                value !== check :
3296	                                type === "^=" ?
3297	                                value.indexOf(check) === 0 :
3298	                                type === "$=" ?
3299	                                value.substr(value.length - check.length) === check :
3300	                                type === "|=" ?
3301	                                value === check || value.substr(0, check.length + 1) === check + "-" :
3302	                                false;
3303	                },
3304	                POS: function(elem, match, i, array){
3305	                        var name = match[2], filter = Expr.setFilters[ name ];
3306	
3307	                        if ( filter ) {
3308	                                return filter( elem, i, match, array );
3309	                        }
3310	                }
3311	        }
3312	};
3313	
3314	var origPOS = Expr.match.POS;
3315	
3316	for ( var type in Expr.match ) {
3317	        Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
3318	        Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, function(all, num){
3319	                return "\\" + (num - 0 + 1);
3320	        }));
3321	}
3322	
3323	var makeArray = function(array, results) {
3324	        array = Array.prototype.slice.call( array, 0 );
3325	
3326	        if ( results ) {
3327	                results.push.apply( results, array );
3328	                return results;
3329	        }
3330	       
3331	        return array;
3332	};
3333	
3334	// Perform a simple check to determine if the browser is capable of
3335	// converting a NodeList to an array using builtin methods.
3336	// Also verifies that the returned array holds DOM nodes
3337	// (which is not the case in the Blackberry browser)
3338	try {
3339	        Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
3340	
3341	// Provide a fallback method if it does not work
3342	} catch(e){
3343	        makeArray = function(array, results) {
3344	                var ret = results || [];
3345	
3346	                if ( toString.call(array) === "[object Array]" ) {
3347	                        Array.prototype.push.apply( ret, array );
3348	                } else {
3349	                        if ( typeof array.length === "number" ) {
3350	                                for ( var i = 0, l = array.length; i < l; i++ ) {
3351	                                        ret.push( array[i] );
3352	                                }
3353	                        } else {
3354	                                for ( var i = 0; array[i]; i++ ) {
3355	                                        ret.push( array[i] );
3356	                                }
3357	                        }
3358	                }
3359	
3360	                return ret;
3361	        };
3362	}
3363	
3364	var sortOrder;
3365	
3366	if ( document.documentElement.compareDocumentPosition ) {
3367	        sortOrder = function( a, b ) {
3368	                if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
3369	                        if ( a == b ) {
3370	                                hasDuplicate = true;
3371	                        }
3372	                        return a.compareDocumentPosition ? -1 : 1;
3373	                }
3374	
3375	                var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
3376	                if ( ret === 0 ) {
3377	                        hasDuplicate = true;
3378	                }
3379	                return ret;
3380	        };
3381	} else if ( "sourceIndex" in document.documentElement ) {
3382	        sortOrder = function( a, b ) {
3383	                if ( !a.sourceIndex || !b.sourceIndex ) {
3384	                        if ( a == b ) {
3385	                                hasDuplicate = true;
3386	                        }
3387	                        return a.sourceIndex ? -1 : 1;
3388	                }
3389	
3390	                var ret = a.sourceIndex - b.sourceIndex;
3391	                if ( ret === 0 ) {
3392	                        hasDuplicate = true;
3393	                }
3394	                return ret;
3395	        };
3396	} else if ( document.createRange ) {
3397	        sortOrder = function( a, b ) {
3398	                if ( !a.ownerDocument || !b.ownerDocument ) {
3399	                        if ( a == b ) {
3400	                                hasDuplicate = true;
3401	                        }
3402	                        return a.ownerDocument ? -1 : 1;
3403	                }
3404	
3405	                var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
3406	                aRange.setStart(a, 0);
3407	                aRange.setEnd(a, 0);
3408	                bRange.setStart(b, 0);
3409	                bRange.setEnd(b, 0);
3410	                var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
3411	                if ( ret === 0 ) {
3412	                        hasDuplicate = true;
3413	                }
3414	                return ret;
3415	        };
3416	}
3417	
3418	// Utility function for retreiving the text value of an array of DOM nodes
3419	function getText( elems ) {
3420	        var ret = "", elem;
3421	
3422	        for ( var i = 0; elems[i]; i++ ) {
3423	                elem = elems[i];
3424	
3425	                // Get the text from text nodes and CDATA nodes
3426	                if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
3427	                        ret += elem.nodeValue;
3428	
3429	                // Traverse everything else, except comment nodes
3430	                } else if ( elem.nodeType !== 8 ) {
3431	                        ret += getText( elem.childNodes );
3432	                }
3433	        }
3434	
3435	        return ret;
3436	}
3437	
3438	// Check to see if the browser returns elements by name when
3439	// querying by getElementById (and provide a workaround)
3440	(function(){
3441	        // We're going to inject a fake input element with a specified name
3442	        var form = document.createElement("div"),
3443	                id = "script" + (new Date).getTime();
3444	        form.innerHTML = "<a name='" + id + "'/>";
3445	
3446	        // Inject it into the root element, check its status, and remove it quickly
3447	        var root = document.documentElement;
3448	        root.insertBefore( form, root.firstChild );
3449	
3450	        // The workaround has to do additional checks after a getElementById
3451	        // Which slows things down for other browsers (hence the branching)
3452	        if ( document.getElementById( id ) ) {
3453	                Expr.find.ID = function(match, context, isXML){
3454	                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
3455	                                var m = context.getElementById(match[1]);
3456	                                return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
3457	                        }
3458	                };
3459	
3460	                Expr.filter.ID = function(elem, match){
3461	                        var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
3462	                        return elem.nodeType === 1 && node && node.nodeValue === match;
3463	                };
3464	        }
3465	
3466	        root.removeChild( form );
3467	        root = form = null; // release memory in IE
3468	})();
3469	
3470	(function(){
3471	        // Check to see if the browser returns only elements
3472	        // when doing getElementsByTagName("*")
3473	
3474	        // Create a fake element
3475	        var div = document.createElement("div");
3476	        div.appendChild( document.createComment("") );
3477	
3478	        // Make sure no comments are found
3479	        if ( div.getElementsByTagName("*").length > 0 ) {
3480	                Expr.find.TAG = function(match, context){
3481	                        var results = context.getElementsByTagName(match[1]);
3482	
3483	                        // Filter out possible comments
3484	                        if ( match[1] === "*" ) {
3485	                                var tmp = [];
3486	
3487	                                for ( var i = 0; results[i]; i++ ) {
3488	                                        if ( results[i].nodeType === 1 ) {
3489	                                                tmp.push( results[i] );
3490	                                        }
3491	                                }
3492	
3493	                                results = tmp;
3494	                        }
3495	
3496	                        return results;
3497	                };
3498	        }
3499	
3500	        // Check to see if an attribute returns normalized href attributes
3501	        div.innerHTML = "<a href='#'></a>";
3502	        if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
3503	                        div.firstChild.getAttribute("href") !== "#" ) {
3504	                Expr.attrHandle.href = function(elem){
3505	                        return elem.getAttribute("href", 2);
3506	                };
3507	        }
3508	
3509	        div = null; // release memory in IE
3510	})();
3511	
3512	if ( document.querySelectorAll ) {
3513	        (function(){
3514	                var oldSizzle = Sizzle, div = document.createElement("div");
3515	                div.innerHTML = "<p class='TEST'></p>";
3516	
3517	                // Safari can't handle uppercase or unicode characters when
3518	                // in quirks mode.
3519	                if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
3520	                        return;
3521	                }
3522	       
3523	                Sizzle = function(query, context, extra, seed){
3524	                        context = context || document;
3525	
3526	                        // Only use querySelectorAll on non-XML documents
3527	                        // (ID selectors don't work in non-HTML documents)
3528	                        if ( !seed && context.nodeType === 9 && !isXML(context) ) {
3529	                                try {
3530	                                        return makeArray( context.querySelectorAll(query), extra );
3531	                                } catch(e){}
3532	                        }
3533	               
3534	                        return oldSizzle(query, context, extra, seed);
3535	                };
3536	
3537	                for ( var prop in oldSizzle ) {
3538	                        Sizzle[ prop ] = oldSizzle[ prop ];
3539	                }
3540	
3541	                div = null; // release memory in IE
3542	        })();
3543	}
3544	
3545	(function(){
3546	        var div = document.createElement("div");
3547	
3548	        div.innerHTML = "<div class='test e'></div><div class='test'></div>";
3549	
3550	        // Opera can't find a second classname (in 9.6)
3551	        // Also, make sure that getElementsByClassName actually exists
3552	        if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
3553	                return;
3554	        }
3555	
3556	        // Safari caches class attributes, doesn't catch changes (in 3.2)
3557	        div.lastChild.className = "e";
3558	
3559	        if ( div.getElementsByClassName("e").length === 1 ) {
3560	                return;
3561	        }
3562	       
3563	        Expr.order.splice(1, 0, "CLASS");
3564	        Expr.find.CLASS = function(match, context, isXML) {
3565	                if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
3566	                        return context.getElementsByClassName(match[1]);
3567	                }
3568	        };
3569	
3570	        div = null; // release memory in IE
3571	})();
3572	
3573	function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
3574	        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
3575	                var elem = checkSet[i];
3576	                if ( elem ) {
3577	                        elem = elem[dir];
3578	                        var match = false;
3579	
3580	                        while ( elem ) {
3581	                                if ( elem.sizcache === doneName ) {
3582	                                        match = checkSet[elem.sizset];
3583	                                        break;
3584	                                }
3585	
3586	                                if ( elem.nodeType === 1 && !isXML ){
3587	                                        elem.sizcache = doneName;
3588	                                        elem.sizset = i;
3589	                                }
3590	
3591	                                if ( elem.nodeName.toLowerCase() === cur ) {
3592	                                        match = elem;
3593	                                        break;
3594	                                }
3595	
3596	                                elem = elem[dir];
3597	                        }
3598	
3599	                        checkSet[i] = match;
3600	                }
3601	        }
3602	}
3603	
3604	function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
3605	        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
3606	                var elem = checkSet[i];
3607	                if ( elem ) {
3608	                        elem = elem[dir];
3609	                        var match = false;
3610	
3611	                        while ( elem ) {
3612	                                if ( elem.sizcache === doneName ) {
3613	                                        match = checkSet[elem.sizset];
3614	                                        break;
3615	                                }
3616	
3617	                                if ( elem.nodeType === 1 ) {
3618	                                        if ( !isXML ) {
3619	                                                elem.sizcache = doneName;
3620	                                                elem.sizset = i;
3621	                                        }
3622	                                        if ( typeof cur !== "string" ) {
3623	                                                if ( elem === cur ) {
3624	                                                        match = true;
3625	                                                        break;
3626	                                                }
3627	
3628	                                        } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
3629	                                                match = elem;
3630	                                                break;
3631	                                        }
3632	                                }
3633	
3634	                                elem = elem[dir];
3635	                        }
3636	
3637	                        checkSet[i] = match;
3638	                }
3639	        }
3640	}
3641	
3642	var contains = document.compareDocumentPosition ? function(a, b){
3643	        return !!(a.compareDocumentPosition(b) & 16);
3644	} : function(a, b){
3645	        return a !== b && (a.contains ? a.contains(b) : true);
3646	};
3647	
3648	var isXML = function(elem){
3649	        // documentElement is verified for cases where it doesn't yet exist
3650	        // (such as loading iframes in IE - #4833)
3651	        var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
3652	        return documentElement ? documentElement.nodeName !== "HTML" : false;
3653	};
3654	
3655	var posProcess = function(selector, context){
3656	        var tmpSet = [], later = "", match,
3657	                root = context.nodeType ? [context] : context;
3658	
3659	        // Position selectors must be done after the filter
3660	        // And so must :not(positional) so we move all PSEUDOs to the end
3661	        while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
3662	                later += match[0];
3663	                selector = selector.replace( Expr.match.PSEUDO, "" );
3664	        }
3665	
3666	        selector = Expr.relative[selector] ? selector + "*" : selector;
3667	
3668	        for ( var i = 0, l = root.length; i < l; i++ ) {
3669	                Sizzle( selector, root[i], tmpSet );
3670	        }
3671	
3672	        return Sizzle.filter( later, tmpSet );
3673	};
3674	
3675	// EXPOSE
3676	jQuery.find = Sizzle;
3677	jQuery.expr = Sizzle.selectors;
3678	jQuery.expr[":"] = jQuery.expr.filters;
3679	jQuery.unique = Sizzle.uniqueSort;
3680	jQuery.text = getText;
3681	jQuery.isXMLDoc = isXML;
3682	jQuery.contains = contains;
3683	
3684	return;
3685	
3686	window.Sizzle = Sizzle;
3687	
3688	})();
3689	var runtil = /Until$/,
3690	        rparentsprev = /^(?:parents|prevUntil|prevAll)/,
3691	        // Note: This RegExp should be improved, or likely pulled from Sizzle
3692	        rmultiselector = /,/,
3693	        slice = Array.prototype.slice;
3694	
3695	// Implement the identical functionality for filter and not
3696	var winnow = function( elements, qualifier, keep ) {
3697	        if ( jQuery.isFunction( qualifier ) ) {
3698	                return jQuery.grep(elements, function( elem, i ) {
3699	                        return !!qualifier.call( elem, i, elem ) === keep;
3700	                });
3701	
3702	        } else if ( qualifier.nodeType ) {
3703	                return jQuery.grep(elements, function( elem, i ) {
3704	                        return (elem === qualifier) === keep;
3705	                });
3706	
3707	        } else if ( typeof qualifier === "string" ) {
3708	                var filtered = jQuery.grep(elements, function( elem ) {
3709	                        return elem.nodeType === 1;
3710	                });
3711	
3712	                if ( isSimple.test( qualifier ) ) {
3713	                        return jQuery.filter(qualifier, filtered, !keep);
3714	                } else {
3715	                        qualifier = jQuery.filter( qualifier, filtered );
3716	                }
3717	        }
3718	
3719	        return jQuery.grep(elements, function( elem, i ) {
3720	                return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
3721	        });
3722	};
3723	
3724	jQuery.fn.extend({
3725	        find: function( selector ) {
3726	                var ret = this.pushStack( "", "find", selector ), length = 0;
3727	
3728	                for ( var i = 0, l = this.length; i < l; i++ ) {
3729	                        length = ret.length;
3730	                        jQuery.find( selector, this[i], ret );
3731	
3732	                        if ( i > 0 ) {
3733	                                // Make sure that the results are unique
3734	                                for ( var n = length; n < ret.length; n++ ) {
3735	                                        for ( var r = 0; r < length; r++ ) {
3736	                                                if ( ret[r] === ret[n] ) {
3737	                                                        ret.splice(n--, 1);
3738	                                                        break;
3739	                                                }
3740	                                        }
3741	                                }
3742	                        }
3743	                }
3744	
3745	                return ret;
3746	        },
3747	
3748	        has: function( target ) {
3749	                var targets = jQuery( target );
3750	                return this.filter(function() {
3751	                        for ( var i = 0, l = targets.length; i < l; i++ ) {
3752	                                if ( jQuery.contains( this, targets[i] ) ) {
3753	                                        return true;
3754	                                }
3755	                        }
3756	                });
3757	        },
3758	
3759	        not: function( selector ) {
3760	                return this.pushStack( winnow(this, selector, false), "not", selector);
3761	        },
3762	
3763	        filter: function( selector ) {
3764	                return this.pushStack( winnow(this, selector, true), "filter", selector );
3765	        },
3766	       
3767	        is: function( selector ) {
3768	                return !!selector && jQuery.filter( selector, this ).length > 0;
3769	        },
3770	
3771	        closest: function( selectors, context ) {
3772	                if ( jQuery.isArray( selectors ) ) {
3773	                        var ret = [], cur = this[0], match, matches = {}, selector;
3774	
3775	                        if ( cur && selectors.length ) {
3776	                                for ( var i = 0, l = selectors.length; i < l; i++ ) {
3777	                                        selector = selectors[i];
3778	
3779	                                        if ( !matches[selector] ) {
3780	                                                matches[selector] = jQuery.expr.match.POS.test( selector ) ? 
3781	                                                        jQuery( selector, context || this.context ) :
3782	                                                        selector;
3783	                                        }
3784	                                }
3785	
3786	                                while ( cur && cur.ownerDocument && cur !== context ) {
3787	                                        for ( selector in matches ) {
3788	                                                match = matches[selector];
3789	
3790	                                                if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
3791	                                                        ret.push({ selector: selector, elem: cur });
3792	                                                        delete matches[selector];
3793	                                                }
3794	                                        }
3795	                                        cur = cur.parentNode;
3796	                                }
3797	                        }
3798	
3799	                        return ret;
3800	                }
3801	
3802	                var pos = jQuery.expr.match.POS.test( selectors ) ? 
3803	                        jQuery( selectors, context || this.context ) : null;
3804	
3805	                return this.map(function( i, cur ) {
3806	                        while ( cur && cur.ownerDocument && cur !== context ) {
3807	                                if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) {
3808	                                        return cur;
3809	                                }
3810	                                cur = cur.parentNode;
3811	                        }
3812	                        return null;
3813	                });
3814	        },
3815	       
3816	        // Determine the position of an element within
3817	        // the matched set of elements
3818	        index: function( elem ) {
3819	                if ( !elem || typeof elem === "string" ) {
3820	                        return jQuery.inArray( this[0],
3821	                                // If it receives a string, the selector is used
3822	                                // If it receives nothing, the siblings are used
3823	                                elem ? jQuery( elem ) : this.parent().children() );
3824	                }
3825	                // Locate the position of the desired element
3826	                return jQuery.inArray(
3827	                        // If it receives a jQuery object, the first element is used
3828	                        elem.jquery ? elem[0] : elem, this );
3829	        },
3830	
3831	        add: function( selector, context ) {
3832	                var set = typeof selector === "string" ?
3833	                                jQuery( selector, context || this.context ) :
3834	                                jQuery.makeArray( selector ),
3835	                        all = jQuery.merge( this.get(), set );
3836	
3837	                return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
3838	                        all :
3839	                        jQuery.unique( all ) );
3840	        },
3841	
3842	        andSelf: function() {
3843	                return this.add( this.prevObject );
3844	        }
3845	});
3846	
3847	// A painfully simple check to see if an element is disconnected
3848	// from a document (should be improved, where feasible).
3849	function isDisconnected( node ) {
3850	        return !node || !node.parentNode || node.parentNode.nodeType === 11;
3851	}
3852	
3853	jQuery.each({
3854	        parent: function( elem ) {
3855	                var parent = elem.parentNode;
3856	                return parent && parent.nodeType !== 11 ? parent : null;
3857	        },
3858	        parents: function( elem ) {
3859	                return jQuery.dir( elem, "parentNode" );
3860	        },
3861	        parentsUntil: function( elem, i, until ) {
3862	                return jQuery.dir( elem, "parentNode", until );
3863	        },
3864	        next: function( elem ) {
3865	                return jQuery.nth( elem, 2, "nextSibling" );
3866	        },
3867	        prev: function( elem ) {
3868	                return jQuery.nth( elem, 2, "previousSibling" );
3869	        },
3870	        nextAll: function( elem ) {
3871	                return jQuery.dir( elem, "nextSibling" );
3872	        },
3873	        prevAll: function( elem ) {
3874	                return jQuery.dir( elem, "previousSibling" );
3875	        },
3876	        nextUntil: function( elem, i, until ) {
3877	                return jQuery.dir( elem, "nextSibling", until );
3878	        },
3879	        prevUntil: function( elem, i, until ) {
3880	                return jQuery.dir( elem, "previousSibling", until );
3881	        },
3882	        siblings: function( elem ) {
3883	                return jQuery.sibling( elem.parentNode.firstChild, elem );
3884	        },
3885	        children: function( elem ) {
3886	                return jQuery.sibling( elem.firstChild );
3887	        },
3888	        contents: function( elem ) {
3889	                return jQuery.nodeName( elem, "iframe" ) ?
3890	                        elem.contentDocument || elem.contentWindow.document :
3891	                        jQuery.makeArray( elem.childNodes );
3892	        }
3893	}, function( name, fn ) {
3894	        jQuery.fn[ name ] = function( until, selector ) {
3895	                var ret = jQuery.map( this, fn, until );
3896	               
3897	                if ( !runtil.test( name ) ) {
3898	                        selector = until;
3899	                }
3900	
3901	                if ( selector && typeof selector === "string" ) {
3902	                        ret = jQuery.filter( selector, ret );
3903	                }
3904	
3905	                ret = this.length > 1 ? jQuery.unique( ret ) : ret;
3906	
3907	                if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
3908	                        ret = ret.reverse();
3909	                }
3910	
3911	                return this.pushStack( ret, name, slice.call(arguments).join(",") );
3912	        };
3913	});
3914	
3915	jQuery.extend({
3916	        filter: function( expr, elems, not ) {
3917	                if ( not ) {
3918	                        expr = ":not(" + expr + ")";
3919	                }
3920	
3921	                return jQuery.find.matches(expr, elems);
3922	        },
3923	       
3924	        dir: function( elem, dir, until ) {
3925	                var matched = [], cur = elem[dir];
3926	                while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
3927	                        if ( cur.nodeType === 1 ) {
3928	                                matched.push( cur );
3929	                        }
3930	                        cur = cur[dir];
3931	                }
3932	                return matched;
3933	        },
3934	
3935	        nth: function( cur, result, dir, elem ) {
3936	                result = result || 1;
3937	                var num = 0;
3938	
3939	                for ( ; cur; cur = cur[dir] ) {
3940	                        if ( cur.nodeType === 1 && ++num === result ) {
3941	                                break;
3942	                        }
3943	                }
3944	
3945	                return cur;
3946	        },
3947	
3948	        sibling: function( n, elem ) {
3949	                var r = [];
3950	
3951	                for ( ; n; n = n.nextSibling ) {
3952	                        if ( n.nodeType === 1 && n !== elem ) {
3953	                                r.push( n );
3954	                        }
3955	                }
3956	
3957	                return r;
3958	        }
3959	});
3960	var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
3961	        rleadingWhitespace = /^\s+/,
3962	        rxhtmlTag = /(<([\w:]+)[^>]*?)\/>/g,
3963	        rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,
3964	        rtagName = /<([\w:]+)/,
3965	        rtbody = /<tbody/i,
3966	        rhtml = /<|&#?\w+;/,
3967	        rnocache = /<script|<object|<embed|<option|<style/i,
3968	        rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,  // checked="checked" or checked (html5)
3969	        fcloseTag = function( all, front, tag ) {
3970	                return rselfClosing.test( tag ) ?
3971	                        all :
3972	                        front + "></" + tag + ">";
3973	        },
3974	        wrapMap = {
3975	                option: [ 1, "<select multiple='multiple'>", "</select>" ],
3976	                legend: [ 1, "<fieldset>", "</fieldset>" ],
3977	                thead: [ 1, "<table>", "</table>" ],
3978	                tr: [ 2, "<table><tbody>", "</tbody></table>" ],
3979	                td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
3980	                col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
3981	                area: [ 1, "<map>", "</map>" ],
3982	                _default: [ 0, "", "" ]
3983	        };
3984	
3985	wrapMap.optgroup = wrapMap.option;
3986	wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
3987	wrapMap.th = wrapMap.td;
3988	
3989	// IE can't serialize <link> and <script> tags normally
3990	if ( !jQuery.support.htmlSerialize ) {
3991	        wrapMap._default = [ 1, "div<div>", "</div>" ];
3992	}
3993	
3994	jQuery.fn.extend({
3995	        text: function( text ) {
3996	                if ( jQuery.isFunction(text) ) {
3997	                        return this.each(function(i) {
3998	                                var self = jQuery(this);
3999	                                self.text( text.call(this, i, self.text()) );
4000	                        });
4001	                }
4002	
4003	                if ( typeof text !== "object" && text !== undefined ) {
4004	                        return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
4005	                }
4006	
4007	                return jQuery.text( this );
4008	        },
4009	
4010	        wrapAll: function( html ) {
4011	                if ( jQuery.isFunction( html ) ) {
4012	                        return this.each(function(i) {
4013	                                jQuery(this).wrapAll( html.call(this, i) );
4014	                        });
4015	                }
4016	
4017	                if ( this[0] ) {
4018	                        // The elements to wrap the target around
4019	                        var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
4020	
4021	                        if ( this[0].parentNode ) {
4022	                                wrap.insertBefore( this[0] );
4023	                        }
4024	
4025	                        wrap.map(function() {
4026	                                var elem = this;
4027	
4028	                                while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
4029	                                        elem = elem.firstChild;
4030	                                }
4031	
4032	                                return elem;
4033	                        }).append(this);
4034	                }
4035	
4036	                return this;
4037	        },
4038	
4039	        wrapInner: function( html ) {
4040	                if ( jQuery.isFunction( html ) ) {
4041	                        return this.each(function(i) {
4042	                                jQuery(this).wrapInner( html.call(this, i) );
4043	                        });
4044	                }
4045	
4046	                return this.each(function() {
4047	                        var self = jQuery( this ), contents = self.contents();
4048	
4049	                        if ( contents.length ) {
4050	                                contents.wrapAll( html );
4051	
4052	                        } else {
4053	                                self.append( html );
4054	                        }
4055	                });
4056	        },
4057	
4058	        wrap: function( html ) {
4059	                return this.each(function() {
4060	                        jQuery( this ).wrapAll( html );
4061	                });
4062	        },
4063	
4064	        unwrap: function() {
4065	                return this.parent().each(function() {
4066	                        if ( !jQuery.nodeName( this, "body" ) ) {
4067	                                jQuery( this ).replaceWith( this.childNodes );
4068	                        }
4069	                }).end();
4070	        },
4071	
4072	        append: function() {
4073	                return this.domManip(arguments, true, function( elem ) {
4074	                        if ( this.nodeType === 1 ) {
4075	                                this.appendChild( elem );
4076	                        }
4077	                });
4078	        },
4079	
4080	        prepend: function() {
4081	                return this.domManip(arguments, true, function( elem ) {
4082	                        if ( this.nodeType === 1 ) {
4083	                                this.insertBefore( elem, this.firstChild );
4084	                        }
4085	                });
4086	        },
4087	
4088	        before: function() {
4089	                if ( this[0] && this[0].parentNode ) {
4090	                        return this.domManip(arguments, false, function( elem ) {
4091	                                this.parentNode.insertBefore( elem, this );
4092	                        });
4093	                } else if ( arguments.length ) {
4094	                        var set = jQuery(arguments[0]);
4095	                        set.push.apply( set, this.toArray() );
4096	                        return this.pushStack( set, "before", arguments );
4097	                }
4098	        },
4099	
4100	        after: function() {
4101	                if ( this[0] && this[0].parentNode ) {
4102	                        return this.domManip(arguments, false, function( elem ) {
4103	                                this.parentNode.insertBefore( elem, this.nextSibling );
4104	                        });
4105	                } else if ( arguments.length ) {
4106	                        var set = this.pushStack( this, "after", arguments );
4107	                        set.push.apply( set, jQuery(arguments[0]).toArray() );
4108	                        return set;
4109	                }
4110	        },
4111	       
4112	        // keepData is for internal use only--do not document
4113	        remove: function( selector, keepData ) {
4114	                for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
4115	                        if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
4116	                                if ( !keepData && elem.nodeType === 1 ) {
4117	                                        jQuery.cleanData( elem.getElementsByTagName("*") );
4118	                                        jQuery.cleanData( [ elem ] );
4119	                                }
4120	
4121	                                if ( elem.parentNode ) {
4122	                                         elem.parentNode.removeChild( elem );
4123	                                }
4124	                        }
4125	                }
4126	               
4127	                return this;
4128	        },
4129	
4130	        empty: function() {
4131	                for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
4132	                        // Remove element nodes and prevent memory leaks
4133	                        if ( elem.nodeType === 1 ) {
4134	                                jQuery.cleanData( elem.getElementsByTagName("*") );
4135	                        }
4136	
4137	                        // Remove any remaining nodes
4138	                        while ( elem.firstChild ) {
4139	                                elem.removeChild( elem.firstChild );
4140	                        }
4141	                }
4142	               
4143	                return this;
4144	        },
4145	
4146	        clone: function( events ) {
4147	                // Do the clone
4148	                var ret = this.map(function() {
4149	                        if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
4150	                                // IE copies events bound via attachEvent when
4151	                                // using cloneNode. Calling detachEvent on the
4152	                                // clone will also remove the events from the orignal
4153	                                // In order to get around this, we use innerHTML.
4154	                                // Unfortunately, this means some modifications to
4155	                                // attributes in IE that are actually only stored
4156	                                // as properties will not be copied (such as the
4157	                                // the name attribute on an input).
4158	                                var html = this.outerHTML, ownerDocument = this.ownerDocument;
4159	                                if ( !html ) {
4160	                                        var div = ownerDocument.createElement("div");
4161	                                        div.appendChild( this.cloneNode(true) );
4162	                                        html = div.innerHTML;
4163	                                }
4164	
4165	                                return jQuery.clean([html.replace(rinlinejQuery, "")
4166	                                        // Handle the case in IE 8 where action=/test/> self-closes a tag
4167	                                        .replace(/=([^="'>\s]+\/)>/g, '="$1">')
4168	                                        .replace(rleadingWhitespace, "")], ownerDocument)[0];
4169	                        } else {
4170	                                return this.cloneNode(true);
4171	                        }
4172	                });
4173	
4174	                // Copy the events from the original to the clone
4175	                if ( events === true ) {
4176	                        cloneCopyEvent( this, ret );
4177	                        cloneCopyEvent( this.find("*"), ret.find("*") );
4178	                }
4179	
4180	                // Return the cloned set
4181	                return ret;
4182	        },
4183	
4184	        html: function( value ) {
4185	                if ( value === undefined ) {
4186	                        return this[0] && this[0].nodeType === 1 ?
4187	                                this[0].innerHTML.replace(rinlinejQuery, "") :
4188	                                null;
4189	
4190	                // See if we can take a shortcut and just use innerHTML
4191	                } else if ( typeof value === "string" && !rnocache.test( value ) &&
4192	                        (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
4193	                        !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
4194	
4195	                        value = value.replace(rxhtmlTag, fcloseTag);
4196	
4197	                        try {
4198	                                for ( var i = 0, l = this.length; i < l; i++ ) {
4199	                                        // Remove element nodes and prevent memory leaks
4200	                                        if ( this[i].nodeType === 1 ) {
4201	                                                jQuery.cleanData( this[i].getElementsByTagName("*") );
4202	                                                this[i].innerHTML = value;
4203	                                        }
4204	                                }
4205	
4206	                        // If using innerHTML throws an exception, use the fallback method
4207	                        } catch(e) {
4208	                                this.empty().append( value );
4209	                        }
4210	
4211	                } else if ( jQuery.isFunction( value ) ) {
4212	                        this.each(function(i){
4213	                                var self = jQuery(this), old = self.html();
4214	                                self.empty().append(function(){
4215	                                        return value.call( this, i, old );
4216	                                });
4217	                        });
4218	
4219	                } else {
4220	                        this.empty().append( value );
4221	                }
4222	
4223	                return this;
4224	        },
4225	
4226	        replaceWith: function( value ) {
4227	                if ( this[0] && this[0].parentNode ) {
4228	                        // Make sure that the elements are removed from the DOM before they are inserted
4229	                        // this can help fix replacing a parent with child elements
4230	                        if ( jQuery.isFunction( value ) ) {
4231	                                return this.each(function(i) {
4232	                                        var self = jQuery(this), old = self.html();
4233	                                        self.replaceWith( value.call( this, i, old ) );
4234	                                });
4235	                        }
4236	
4237	                        if ( typeof value !== "string" ) {
4238	                                value = jQuery(value).detach();
4239	                        }
4240	
4241	                        return this.each(function() {
4242	                                var next = this.nextSibling, parent = this.parentNode;
4243	
4244	                                jQuery(this).remove();
4245	
4246	                                if ( next ) {
4247	                                        jQuery(next).before( value );
4248	                                } else {
4249	                                        jQuery(parent).append( value );
4250	                                }
4251	                        });
4252	                } else {
4253	                        return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
4254	                }
4255	        },
4256	
4257	        detach: function( selector ) {
4258	                return this.remove( selector, true );
4259	        },
4260	
4261	        domManip: function( args, table, callback ) {
4262	                var results, first, value = args[0], scripts = [], fragment, parent;
4263	
4264	                // We can't cloneNode fragments that contain checked, in WebKit
4265	                if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
4266	                        return this.each(function() {
4267	                                jQuery(this).domManip( args, table, callback, true );
4268	                        });
4269	                }
4270	
4271	                if ( jQuery.isFunction(value) ) {
4272	                        return this.each(function(i) {
4273	                                var self = jQuery(this);
4274	                                args[0] = value.call(this, i, table ? self.html() : undefined);
4275	                                self.domManip( args, table, callback );
4276	                        });
4277	                }
4278	
4279	                if ( this[0] ) {
4280	                        parent = value && value.parentNode;
4281	
4282	                        // If we're in a fragment, just use that instead of building a new one
4283	                        if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
4284	                                results = { fragment: parent };
4285	
4286	                        } else {
4287	                                results = buildFragment( args, this, scripts );
4288	                        }
4289	                       
4290	                        fragment = results.fragment;
4291	                       
4292	                        if ( fragment.childNodes.length === 1 ) {
4293	                                first = fragment = fragment.firstChild;
4294	                        } else {
4295	                                first = fragment.firstChild;
4296	                        }
4297	
4298	                        if ( first ) {
4299	                                table = table && jQuery.nodeName( first, "tr" );
4300	
4301	                                for ( var i = 0, l = this.length; i < l; i++ ) {
4302	                                        callback.call(
4303	                                                table ?
4304	                                                        root(this[i], first) :
4305	                                                        this[i],
4306	                                                i > 0 || results.cacheable || this.length > 1  ?
4307	                                                        fragment.cloneNode(true) :
4308	                                                        fragment
4309	                                        );
4310	                                }
4311	                        }
4312	
4313	                        if ( scripts.length ) {
4314	                                jQuery.each( scripts, evalScript );
4315	                        }
4316	                }
4317	
4318	                return this;
4319	
4320	                function root( elem, cur ) {
4321	                        return jQuery.nodeName(elem, "table") ?
4322	                                (elem.getElementsByTagName("tbody")[0] ||
4323	                                elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
4324	                                elem;
4325	                }
4326	        }
4327	});
4328	
4329	function cloneCopyEvent(orig, ret) {
4330	        var i = 0;
4331	
4332	        ret.each(function() {
4333	                if ( this.nodeName !== (orig[i] && orig[i].nodeName) ) {
4334	                        return;
4335	                }
4336	
4337	                var oldData = jQuery.data( orig[i++] ), curData = jQuery.data( this, oldData ), events = oldData && oldData.events;
4338	
4339	                if ( events ) {
4340	                        delete curData.handle;
4341	                        curData.events = {};
4342	
4343	                        for ( var type in events ) {
4344	                                for ( var handler in events[ type ] ) {
4345	                                        jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
4346	                                }
4347	                        }
4348	                }
4349	        });
4350	}
4351	
4352	function buildFragment( args, nodes, scripts ) {
4353	        var fragment, cacheable, cacheresults,
4354	                doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
4355	
4356	        // Only cache "small" (1/2 KB) strings that are associated with the main document
4357	        // Cloning options loses the selected state, so don't cache them
4358	        // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
4359	        // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
4360	        if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
4361	                !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
4362	
4363	                cacheable = true;
4364	                cacheresults = jQuery.fragments[ args[0] ];
4365	                if ( cacheresults ) {
4366	                        if ( cacheresults !== 1 ) {
4367	                                fragment = cacheresults;
4368	                        }
4369	                }
4370	        }
4371	
4372	        if ( !fragment ) {
4373	                fragment = doc.createDocumentFragment();
4374	                jQuery.clean( args, doc, fragment, scripts );
4375	        }
4376	
4377	        if ( cacheable ) {
4378	                jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
4379	        }
4380	
4381	        return { fragment: fragment, cacheable: cacheable };
4382	}
4383	
4384	jQuery.fragments = {};
4385	
4386	jQuery.each({
4387	        appendTo: "append",
4388	        prependTo: "prepend",
4389	        insertBefore: "before",
4390	        insertAfter: "after",
4391	        replaceAll: "replaceWith"
4392	}, function( name, original ) {
4393	        jQuery.fn[ name ] = function( selector ) {
4394	                var ret = [], insert = jQuery( selector ),
4395	                        parent = this.length === 1 && this[0].parentNode;
4396	               
4397	                if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
4398	                        insert[ original ]( this[0] );
4399	                        return this;
4400	                       
4401	                } else {
4402	                        for ( var i = 0, l = insert.length; i < l; i++ ) {
4403	                                var elems = (i > 0 ? this.clone(true) : this).get();
4404	                                jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
4405	                                ret = ret.concat( elems );
4406	                        }
4407	               
4408	                        return this.pushStack( ret, name, insert.selector );
4409	                }
4410	        };
4411	});
4412	
4413	jQuery.extend({
4414	        clean: function( elems, context, fragment, scripts ) {
4415	                context = context || document;
4416	
4417	                // !context.createElement fails in IE with an error but returns typeof 'object'
4418	                if ( typeof context.createElement === "undefined" ) {
4419	                        context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
4420	                }
4421	
4422	                var ret = [];
4423	
4424	                for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
4425	                        if ( typeof elem === "number" ) {
4426	                                elem += "";
4427	                        }
4428	
4429	                        if ( !elem ) {
4430	                                continue;
4431	                        }
4432	
4433	                        // Convert html string into DOM nodes
4434	                        if ( typeof elem === "string" && !rhtml.test( elem ) ) {
4435	                                elem = context.createTextNode( elem );
4436	
4437	                        } else if ( typeof elem === "string" ) {
4438	                                // Fix "XHTML"-style tags in all browsers
4439	                                elem = elem.replace(rxhtmlTag, fcloseTag);
4440	
4441	                                // Trim whitespace, otherwise indexOf won't work as expected
4442	                                var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
4443	                                        wrap = wrapMap[ tag ] || wrapMap._default,
4444	                                        depth = wrap[0],
4445	                                        div = context.createElement("div");
4446	
4447	                                // Go to html and back, then peel off extra wrappers
4448	                                div.innerHTML = wrap[1] + elem + wrap[2];
4449	
4450	                                // Move to the right depth
4451	                                while ( depth-- ) {
4452	                                        div = div.lastChild;
4453	                                }
4454	
4455	                                // Remove IE's autoinserted <tbody> from table fragments
4456	                                if ( !jQuery.support.tbody ) {
4457	
4458	                                        // String was a <table>, *may* have spurious <tbody>
4459	                                        var hasBody = rtbody.test(elem),
4460	                                                tbody = tag === "table" && !hasBody ?
4461	                                                        div.firstChild && div.firstChild.childNodes :
4462	
4463	                                                        // String was a bare <thead> or <tfoot>
4464	                                                        wrap[1] === "<table>" && !hasBody ?
4465	                                                                div.childNodes :
4466	                                                                [];
4467	
4468	                                        for ( var j = tbody.length - 1; j >= 0 ; --j ) {
4469	                                                if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
4470	                                                        tbody[ j ].parentNode.removeChild( tbody[ j ] );
4471	                                                }
4472	                                        }
4473	
4474	                                }
4475	
4476	                                // IE completely kills leading whitespace when innerHTML is used
4477	                                if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
4478	                                        div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
4479	                                }
4480	
4481	                                elem = div.childNodes;
4482	                        }
4483	
4484	                        if ( elem.nodeType ) {
4485	                                ret.push( elem );
4486	                        } else {
4487	                                ret = jQuery.merge( ret, elem );
4488	                        }
4489	                }
4490	
4491	                if ( fragment ) {
4492	                        for ( var i = 0; ret[i]; i++ ) {
4493	                                if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
4494	                                        scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
4495	                               
4496	                                } else {
4497	                                        if ( ret[i].nodeType === 1 ) {
4498	                                                ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
4499	                                        }
4500	                                        fragment.appendChild( ret[i] );
4501	                                }
4502	                        }
4503	                }
4504	
4505	                return ret;
4506	        },
4507	       
4508	        cleanData: function( elems ) {
4509	                var data, id, cache = jQuery.cache,
4510	                        special = jQuery.event.special,
4511	                        deleteExpando = jQuery.support.deleteExpando;
4512	               
4513	                for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
4514	                        id = elem[ jQuery.expando ];
4515	                       
4516	                        if ( id ) {
4517	                                data = cache[ id ];
4518	                               
4519	                                if ( data.events ) {
4520	                                        for ( var type in data.events ) {
4521	                                                if ( special[ type ] ) {
4522	                                                        jQuery.event.remove( elem, type );
4523	
4524	                                                } else {
4525	                                                        removeEvent( elem, type, data.handle );
4526	                                                }
4527	                                        }
4528	                                }
4529	                               
4530	                                if ( deleteExpando ) {
4531	                                        delete elem[ jQuery.expando ];
4532	
4533	                                } else if ( elem.removeAttribute ) {
4534	                                        elem.removeAttribute( jQuery.expando );
4535	                                }
4536	                               
4537	                                delete cache[ id ];
4538	                        }
4539	                }
4540	        }
4541	});
4542	// exclude the following css properties to add px
4543	var rexclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
4544	        ralpha = /alpha\([^)]*\)/,
4545	        ropacity = /opacity=([^)]*)/,
4546	        rfloat = /float/i,
4547	        rdashAlpha = /-([a-z])/ig,
4548	        rupper = /([A-Z])/g,
4549	        rnumpx = /^-?\d+(?:px)?$/i,
4550	        rnum = /^-?\d/,
4551	
4552	        cssShow = { position: "absolute", visibility: "hidden", display:"block" },
4553	        cssWidth = [ "Left", "Right" ],
4554	        cssHeight = [ "Top", "Bottom" ],
4555	
4556	        // cache check for defaultView.getComputedStyle
4557	        getComputedStyle = document.defaultView && document.defaultView.getComputedStyle,
4558	        // normalize float css property
4559	        styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat",
4560	        fcamelCase = function( all, letter ) {
4561	                return letter.toUpperCase();
4562	        };
4563	
4564	jQuery.fn.css = function( name, value ) {
4565	        return access( this, name, value, true, function( elem, name, value ) {
4566	                if ( value === undefined ) {
4567	                        return jQuery.curCSS( elem, name );
4568	                }
4569	               
4570	                if ( typeof value === "number" && !rexclude.test(name) ) {
4571	                        value += "px";
4572	                }
4573	
4574	                jQuery.style( elem, name, value );
4575	        });
4576	};
4577	
4578	jQuery.extend({
4579	        style: function( elem, name, value ) {
4580	                // don't set styles on text and comment nodes
4581	                if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
4582	                        return undefined;
4583	                }
4584	
4585	                // ignore negative width and height values #1599
4586	                if ( (name === "width" || name === "height") && parseFloat(value) < 0 ) {
4587	                        value = undefined;
4588	                }
4589	
4590	                var style = elem.style || elem, set = value !== undefined;
4591	
4592	                // IE uses filters for opacity
4593	                if ( !jQuery.support.opacity && name === "opacity" ) {
4594	                        if ( set ) {
4595	                                // IE has trouble with opacity if it does not have layout
4596	                                // Force it by setting the zoom level
4597	                                style.zoom = 1;
4598	
4599	                                // Set the alpha filter to set the opacity
4600	                                var opacity = parseInt( value, 10 ) + "" === "NaN" ? "" : "alpha(opacity=" + value * 100 + ")";
4601	                                var filter = style.filter || jQuery.curCSS( elem, "filter" ) || "";
4602	                                style.filter = ralpha.test(filter) ? filter.replace(ralpha, opacity) : opacity;
4603	                        }
4604	
4605	                        return style.filter && style.filter.indexOf("opacity=") >= 0 ?
4606	                                (parseFloat( ropacity.exec(style.filter)[1] ) / 100) + "":
4607	                                "";
4608	                }
4609	
4610	                // Make sure we're using the right name for getting the float value
4611	                if ( rfloat.test( name ) ) {
4612	                        name = styleFloat;
4613	                }
4614	
4615	                name = name.replace(rdashAlpha, fcamelCase);
4616	
4617	                if ( set ) {
4618	                        style[ name ] = value;
4619	                }
4620	
4621	                return style[ name ];
4622	        },
4623	
4624	        css: function( elem, name, force, extra ) {
4625	                if ( name === "width" || name === "height" ) {
4626	                        var val, props = cssShow, which = name === "width" ? cssWidth : cssHeight;
4627	
4628	                        function getWH() {
4629	                                val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
4630	
4631	                                if ( extra === "border" ) {
4632	                                        return;
4633	                                }
4634	
4635	                                jQuery.each( which, function() {
4636	                                        if ( !extra ) {
4637	                                                val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
4638	                                        }
4639	
4640	                                        if ( extra === "margin" ) {
4641	                                                val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
4642	                                        } else {
4643	                                                val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
4644	                                        }
4645	                                });
4646	                        }
4647	
4648	                        if ( elem.offsetWidth !== 0 ) {
4649	                                getWH();
4650	                        } else {
4651	                                jQuery.swap( elem, props, getWH );
4652	                        }
4653	
4654	                        return Math.max(0, Math.round(val));
4655	                }
4656	
4657	                return jQuery.curCSS( elem, name, force );
4658	        },
4659	
4660	        curCSS: function( elem, name, force ) {
4661	                var ret, style = elem.style, filter;
4662	
4663	                // IE uses filters for opacity
4664	                if ( !jQuery.support.opacity && name === "opacity" && elem.currentStyle ) {
4665	                        ret = ropacity.test(elem.currentStyle.filter || "") ?
4666	                                (parseFloat(RegExp.$1) / 100) + "" :
4667	                                "";
4668	
4669	                        return ret === "" ?
4670	                                "1" :
4671	                                ret;
4672	                }
4673	
4674	                // Make sure we're using the right name for getting the float value
4675	                if ( rfloat.test( name ) ) {
4676	                        name = styleFloat;
4677	                }
4678	
4679	                if ( !force && style && style[ name ] ) {
4680	                        ret = style[ name ];
4681	
4682	                } else if ( getComputedStyle ) {
4683	
4684	                        // Only "float" is needed here
4685	                        if ( rfloat.test( name ) ) {
4686	                                name = "float";
4687	                        }
4688	
4689	                        name = name.replace( rupper, "-$1" ).toLowerCase();
4690	
4691	                        var defaultView = elem.ownerDocument.defaultView;
4692	
4693	                        if ( !defaultView ) {
4694	                                return null;
4695	                        }
4696	
4697	                        var computedStyle = defaultView.getComputedStyle( elem, null );
4698	
4699	                        if ( computedStyle ) {
4700	                                ret = computedStyle.getPropertyValue( name );
4701	                        }
4702	
4703	                        // We should always get a number back from opacity
4704	                        if ( name === "opacity" && ret === "" ) {
4705	                                ret = "1";
4706	                        }
4707	
4708	                } else if ( elem.currentStyle ) {
4709	                        var camelCase = name.replace(rdashAlpha, fcamelCase);
4710	
4711	                        ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
4712	
4713	                        // From the awesome hack by Dean Edwards
4714	                        // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
4715	
4716	                        // If we're not dealing with a regular pixel number
4717	                        // but a number that has a weird ending, we need to convert it to pixels
4718	                        if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
4719	                                // Remember the original values
4720	                                var left = style.left, rsLeft = elem.runtimeStyle.left;
4721	
4722	                                // Put in the new values to get a computed value out
4723	                                elem.runtimeStyle.left = elem.currentStyle.left;
4724	                                style.left = camelCase === "fontSize" ? "1em" : (ret || 0);
4725	                                ret = style.pixelLeft + "px";
4726	
4727	                                // Revert the changed values
4728	                                style.left = left;
4729	                                elem.runtimeStyle.left = rsLeft;
4730	                        }
4731	                }
4732	
4733	                return ret;
4734	        },
4735	
4736	        // A method for quickly swapping in/out CSS properties to get correct calculations
4737	        swap: function( elem, options, callback ) {
4738	                var old = {};
4739	
4740	                // Remember the old values, and insert the new ones
4741	                for ( var name in options ) {
4742	                        old[ name ] = elem.style[ name ];
4743	                        elem.style[ name ] = options[ name ];
4744	                }
4745	
4746	                callback.call( elem );
4747	
4748	                // Revert the old values
4749	                for ( var name in options ) {
4750	                        elem.style[ name ] = old[ name ];
4751	                }
4752	        }
4753	});
4754	
4755	if ( jQuery.expr && jQuery.expr.filters ) {
4756	        jQuery.expr.filters.hidden = function( elem ) {
4757	                var width = elem.offsetWidth, height = elem.offsetHeight,
4758	                        skip = elem.nodeName.toLowerCase() === "tr";
4759	
4760	                return width === 0 && height === 0 && !skip ?
4761	                        true :
4762	                        width > 0 && height > 0 && !skip ?
4763	                                false :
4764	                                jQuery.curCSS(elem, "display") === "none";
4765	        };
4766	
4767	        jQuery.expr.filters.visible = function( elem ) {
4768	                return !jQuery.expr.filters.hidden( elem );
4769	        };
4770	}
4771	var jsc = now(),
4772	        rscript = /<script(.|\s)*?\/script>/gi,
4773	        rselectTextarea = /select|textarea/i,
4774	        rinput = /color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,
4775	        jsre = /=\?(&|$)/,
4776	        rquery = /\?/,
4777	        rts = /(\?|&)_=.*?(&|$)/,
4778	        rurl = /^(\w+:)?\/\/([^\/?#]+)/,
4779	        r20 = /%20/g,
4780	
4781	        // Keep a copy of the old load method
4782	        _load = jQuery.fn.load;
4783	
4784	jQuery.fn.extend({
4785	        load: function( url, params, callback ) {
4786	                if ( typeof url !== "string" ) {
4787	                        return _load.call( this, url );
4788	
4789	                // Don't do a request if no elements are being requested
4790	                } else if ( !this.length ) {
4791	                        return this;
4792	                }
4793	
4794	                var off = url.indexOf(" ");
4795	                if ( off >= 0 ) {
4796	                        var selector = url.slice(off, url.length);
4797	                        url = url.slice(0, off);
4798	                }
4799	
4800	                // Default to a GET request
4801	                var type = "GET";
4802	
4803	                // If the second parameter was provided
4804	                if ( params ) {
4805	                        // If it's a function
4806	                        if ( jQuery.isFunction( params ) ) {
4807	                                // We assume that it's the callback
4808	                                callback = params;
4809	                                params = null;
4810	
4811	                        // Otherwise, build a param string
4812	                        } else if ( typeof params === "object" ) {
4813	                                params = jQuery.param( params, jQuery.ajaxSettings.traditional );
4814	                                type = "POST";
4815	                        }
4816	                }
4817	
4818	                var self = this;
4819	
4820	                // Request the remote document
4821	                jQuery.ajax({
4822	                        url: url,
4823	                        type: type,
4824	                        dataType: "html",
4825	                        data: params,
4826	                        complete: function( res, status ) {
4827	                                // If successful, inject the HTML into all the matched elements
4828	                                if ( status === "success" || status === "notmodified" ) {
4829	                                        // See if a selector was specified
4830	                                        self.html( selector ?
4831	                                                // Create a dummy div to hold the results
4832	                                                jQuery("<div />")
4833	                                                        // inject the contents of the document in, removing the scripts
4834	                                                        // to avoid any 'Permission Denied' errors in IE
4835	                                                        .append(res.responseText.replace(rscript, ""))
4836	
4837	                                                        // Locate the specified elements
4838	                                                        .find(selector) :
4839	
4840	                                                // If not, just inject the full result
4841	                                                res.responseText );
4842	                                }
4843	
4844	                                if ( callback ) {
4845	                                        self.each( callback, [res.responseText, status, res] );
4846	                                }
4847	                        }
4848	                });
4849	
4850	                return this;
4851	        },
4852	
4853	        serialize: function() {
4854	                return jQuery.param(this.serializeArray());
4855	        },
4856	        serializeArray: function() {
4857	                return this.map(function() {
4858	                        return this.elements ? jQuery.makeArray(this.elements) : this;
4859	                })
4860	                .filter(function() {
4861	                        return this.name && !this.disabled &&
4862	                                (this.checked || rselectTextarea.test(this.nodeName) ||
4863	                                        rinput.test(this.type));
4864	                })
4865	                .map(function( i, elem ) {
4866	                        var val = jQuery(this).val();
4867	
4868	                        return val == null ?
4869	                                null :
4870	                                jQuery.isArray(val) ?
4871	                                        jQuery.map( val, function( val, i ) {
4872	                                                return { name: elem.name, value: val };
4873	                                        }) :
4874	                                        { name: elem.name, value: val };
4875	                }).get();
4876	        }
4877	});
4878	
4879	// Attach a bunch of functions for handling common AJAX events
4880	jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function( i, o ) {
4881	        jQuery.fn[o] = function( f ) {
4882	                return this.bind(o, f);
4883	        };
4884	});
4885	
4886	jQuery.extend({
4887	
4888	        get: function( url, data, callback, type ) {
4889	                // shift arguments if data argument was omited
4890	                if ( jQuery.isFunction( data ) ) {
4891	                        type = type || callback;
4892	                        callback = data;
4893	                        data = null;
4894	                }
4895	
4896	                return jQuery.ajax({
4897	                        type: "GET",
4898	                        url: url,
4899	                        data: data,
4900	                        success: callback,
4901	                        dataType: type
4902	                });
4903	        },
4904	
4905	        getScript: function( url, callback ) {
4906	                return jQuery.get(url, null, callback, "script");
4907	        },
4908	
4909	        getJSON: function( url, data, callback ) {
4910	                return jQuery.get(url, data, callback, "json");
4911	        },
4912	
4913	        post: function( url, data, callback, type ) {
4914	                // shift arguments if data argument was omited
4915	                if ( jQuery.isFunction( data ) ) {
4916	                        type = type || callback;
4917	                        callback = data;
4918	                        data = {};
4919	                }
4920	
4921	                return jQuery.ajax({
4922	                        type: "POST",
4923	                        url: url,
4924	                        data: data,
4925	                        success: callback,
4926	                        dataType: type
4927	                });
4928	        },
4929	
4930	        ajaxSetup: function( settings ) {
4931	                jQuery.extend( jQuery.ajaxSettings, settings );
4932	        },
4933	
4934	        ajaxSettings: {
4935	                url: location.href,
4936	                global: true,
4937	                type: "GET",
4938	                contentType: "application/x-www-form-urlencoded",
4939	                processData: true,
4940	                async: true,
4941	                /*
4942	                timeout: 0,
4943	                data: null,
4944	                username: null,
4945	                password: null,
4946	                traditional: false,
4947	                */
4948	                // Create the request object; Microsoft failed to properly
4949	                // implement the XMLHttpRequest in IE7 (can't request local files),
4950	                // so we use the ActiveXObject when it is available
4951	                // This function can be overriden by calling jQuery.ajaxSetup
4952	                xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ?
4953	                        function() {
4954	                                return new window.XMLHttpRequest();
4955	                        } :
4956	                        function() {
4957	                                try {
4958	                                        return new window.ActiveXObject("Microsoft.XMLHTTP");
4959	                                } catch(e) {}
4960	                        },
4961	                accepts: {
4962	                        xml: "application/xml, text/xml",
4963	                        html: "text/html",
4964	                        script: "text/javascript, application/javascript",
4965	                        json: "application/json, text/javascript",
4966	                        text: "text/plain",
4967	                        _default: "*/*"
4968	                }
4969	        },
4970	
4971	        // Last-Modified header cache for next request
4972	        lastModified: {},
4973	        etag: {},
4974	
4975	        ajax: function( origSettings ) {
4976	                var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings);
4977	               
4978	                var jsonp, status, data,
4979	                        callbackContext = origSettings && origSettings.context || s,
4980	                        type = s.type.toUpperCase();
4981	
4982	                // convert data if not already a string
4983	                if ( s.data && s.processData && typeof s.data !== "string" ) {
4984	                        s.data = jQuery.param( s.data, s.traditional );
4985	                }
4986	
4987	                // Handle JSONP Parameter Callbacks
4988	                if ( s.dataType === "jsonp" ) {
4989	                        if ( type === "GET" ) {
4990	                                if ( !jsre.test( s.url ) ) {
4991	                                        s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?";
4992	                                }
4993	                        } else if ( !s.data || !jsre.test(s.data) ) {
4994	                                s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
4995	                        }
4996	                        s.dataType = "json";
4997	                }
4998	
4999	                // Build temporary JSONP function
5000	                if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {
5001	                        jsonp = s.jsonpCallback || ("jsonp" + jsc++);
5002	
5003	                        // Replace the =? sequence both in the query string and the data
5004	                        if ( s.data ) {
5005	                                s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
5006	                        }
5007	
5008	                        s.url = s.url.replace(jsre, "=" + jsonp + "$1");
5009	
5010	                        // We need to make sure
5011	                        // that a JSONP style response is executed properly
5012	                        s.dataType = "script";
5013	
5014	                        // Handle JSONP-style loading
5015	                        window[ jsonp ] = window[ jsonp ] || function( tmp ) {
5016	                                data = tmp;
5017	                                success();
5018	                                complete();
5019	                                // Garbage collect
5020	                                window[ jsonp ] = undefined;
5021	
5022	                                try {
5023	                                        delete window[ jsonp ];
5024	                                } catch(e) {}
5025	
5026	                                if ( head ) {
5027	                                        head.removeChild( script );
5028	                                }
5029	                        };
5030	                }
5031	
5032	                if ( s.dataType === "script" && s.cache === null ) {
5033	                        s.cache = false;
5034	                }
5035	
5036	                if ( s.cache === false && type === "GET" ) {
5037	                        var ts = now();
5038	
5039	                        // try replacing _= if it is there
5040	                        var ret = s.url.replace(rts, "$1_=" + ts + "$2");
5041	
5042	                        // if nothing was replaced, add timestamp to the end
5043	                        s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
5044	                }
5045	
5046	                // If data is available, append data to url for get requests
5047	                if ( s.data && type === "GET" ) {
5048	                        s.url += (rquery.test(s.url) ? "&" : "?") + s.data;
5049	                }
5050	
5051	                // Watch for a new set of requests
5052	                if ( s.global && ! jQuery.active++ ) {
5053	                        jQuery.event.trigger( "ajaxStart" );
5054	                }
5055	
5056	                // Matches an absolute URL, and saves the domain
5057	                var parts = rurl.exec( s.url ),
5058	                        remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
5059	
5060	                // If we're requesting a remote document
5061	                // and trying to load JSON or Script with a GET
5062	                if ( s.dataType === "script" && type === "GET" && remote ) {
5063	                        var head = document.getElementsByTagName("head")[0] || document.documentElement;
5064	                        var script = document.createElement("script");
5065	                        script.src = s.url;
5066	                        if ( s.scriptCharset ) {
5067	                                script.charset = s.scriptCharset;
5068	                        }
5069	
5070	                        // Handle Script loading
5071	                        if ( !jsonp ) {
5072	                                var done = false;
5073	
5074	                                // Attach handlers for all browsers
5075	                                script.onload = script.onreadystatechange = function() {
5076	                                        if ( !done && (!this.readyState ||
5077	                                                        this.readyState === "loaded" || this.readyState === "complete") ) {
5078	                                                done = true;
5079	                                                success();
5080	                                                complete();
5081	
5082	                                                // Handle memory leak in IE
5083	                                                script.onload = script.onreadystatechange = null;
5084	                                                if ( head && script.parentNode ) {
5085	                                                        head.removeChild( script );
5086	                                                }
5087	                                        }
5088	                                };
5089	                        }
5090	
5091	                        // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
5092	                        // This arises when a base node is used (#2709 and #4378).
5093	                        head.insertBefore( script, head.firstChild );
5094	
5095	                        // We handle everything using the script element injection
5096	                        return undefined;
5097	                }
5098	
5099	                var requestDone = false;
5100	
5101	                // Create the request object
5102	                var xhr = s.xhr();
5103	
5104	                if ( !xhr ) {
5105	                        return;
5106	                }
5107	
5108	                // Open the socket
5109	                // Passing null username, generates a login popup on Opera (#2865)
5110	                if ( s.username ) {
5111	                        xhr.open(type, s.url, s.async, s.username, s.password);
5112	                } else {
5113	                        xhr.open(type, s.url, s.async);
5114	                }
5115	
5116	                // Need an extra try/catch for cross domain requests in Firefox 3
5117	                try {
5118	                        // Set the correct header, if data is being sent
5119	                        if ( s.data || origSettings && origSettings.contentType ) {
5120	                                xhr.setRequestHeader("Content-Type", s.contentType);
5121	                        }
5122	
5123	                        // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
5124	                        if ( s.ifModified ) {
5125	                                if ( jQuery.lastModified[s.url] ) {
5126	                                        xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]);
5127	                                }
5128	
5129	                                if ( jQuery.etag[s.url] ) {
5130	                                        xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]);
5131	                                }
5132	                        }
5133	
5134	                        // Set header so the called script knows that it's an XMLHttpRequest
5135	                        // Only send the header if it's not a remote XHR
5136	                        if ( !remote ) {
5137	                                xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
5138	                        }
5139	
5140	                        // Set the Accepts header for the server, depending on the dataType
5141	                        xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
5142	                                s.accepts[ s.dataType ] + ", */*" :
5143	                                s.accepts._default );
5144	                } catch(e) {}
5145	
5146	                // Allow custom headers/mimetypes and early abort
5147	                if ( s.beforeSend && s.beforeSend.call(callbackContext, xhr, s) === false ) {
5148	                        // Handle the global AJAX counter
5149	                        if ( s.global && ! --jQuery.active ) {
5150	                                jQuery.event.trigger( "ajaxStop" );
5151	                        }
5152	
5153	                        // close opended socket
5154	                        xhr.abort();
5155	                        return false;
5156	                }
5157	
5158	                if ( s.global ) {
5159	                        trigger("ajaxSend", [xhr, s]);
5160	                }
5161	
5162	                // Wait for a response to come back
5163	                var onreadystatechange = xhr.onreadystatechange = function( isTimeout ) {
5164	                        // The request was aborted
5165	                        if ( !xhr || xhr.readyState === 0 || isTimeout === "abort" ) {
5166	                                // Opera doesn't call onreadystatechange before this point
5167	                                // so we simulate the call
5168	                                if ( !requestDone ) {
5169	                                        complete();
5170	                                }
5171	
5172	                                requestDone = true;
5173	                                if ( xhr ) {
5174	                                        xhr.onreadystatechange = jQuery.noop;
5175	                                }
5176	
5177	                        // The transfer is complete and the data is available, or the request timed out
5178	                        } else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) {
5179	                                requestDone = true;
5180	                                xhr.onreadystatechange = jQuery.noop;
5181	
5182	                                status = isTimeout === "timeout" ?
5183	                                        "timeout" :
5184	                                        !jQuery.httpSuccess( xhr ) ?
5185	                                                "error" :
5186	                                                s.ifModified && jQuery.httpNotModified( xhr, s.url ) ?
5187	                                                        "notmodified" :
5188	                                                        "success";
5189	
5190	                                var errMsg;
5191	
5192	                                if ( status === "success" ) {
5193	                                        // Watch for, and catch, XML document parse errors
5194	                                        try {
5195	                                                // process the data (runs the xml through httpData regardless of callback)
5196	                                                data = jQuery.httpData( xhr, s.dataType, s );
5197	                                        } catch(err) {
5198	                                                status = "parsererror";
5199	                                                errMsg = err;
5200	                                        }
5201	                                }
5202	
5203	                                // Make sure that the request was successful or notmodified
5204	                                if ( status === "success" || status === "notmodified" ) {
5205	                                        // JSONP handles its own success callback
5206	                                        if ( !jsonp ) {
5207	                                                success();
5208	                                        }
5209	                                } else {
5210	                                        jQuery.handleError(s, xhr, status, errMsg);
5211	                                }
5212	
5213	                                // Fire the complete handlers
5214	                                complete();
5215	
5216	                                if ( isTimeout === "timeout" ) {
5217	                                        xhr.abort();
5218	                                }
5219	
5220	                                // Stop memory leaks
5221	                                if ( s.async ) {
5222	                                        xhr = null;
5223	                                }
5224	                        }
5225	                };
5226	
5227	                // Override the abort handler, if we can (IE doesn't allow it, but that's OK)
5228	                // Opera doesn't fire onreadystatechange at all on abort
5229	                try {
5230	                        var oldAbort = xhr.abort;
5231	                        xhr.abort = function() {
5232	                                if ( xhr ) {
5233	                                        oldAbort.call( xhr );
5234	                                }
5235	
5236	                                onreadystatechange( "abort" );
5237	                        };
5238	                } catch(e) { }
5239	
5240	                // Timeout checker
5241	                if ( s.async && s.timeout > 0 ) {
5242	                        setTimeout(function() {
5243	                                // Check to see if the request is still happening
5244	                                if ( xhr && !requestDone ) {
5245	                                        onreadystatechange( "timeout" );
5246	                                }
5247	                        }, s.timeout);
5248	                }
5249	
5250	                // Send the data
5251	                try {
5252	                        xhr.send( type === "POST" || type === "PUT" || type === "DELETE" ? s.data : null );
5253	                } catch(e) {
5254	                        jQuery.handleError(s, xhr, null, e);
5255	                        // Fire the complete handlers
5256	                        complete();
5257	                }
5258	
5259	                // firefox 1.5 doesn't fire statechange for sync requests
5260	                if ( !s.async ) {
5261	                        onreadystatechange();
5262	                }
5263	
5264	                function success() {
5265	                        // If a local callback was specified, fire it and pass it the data
5266	                        if ( s.success ) {
5267	                                s.success.call( callbackContext, data, status, xhr );
5268	                        }
5269	
5270	                        // Fire the global callback
5271	                        if ( s.global ) {
5272	                                trigger( "ajaxSuccess", [xhr, s] );
5273	                        }
5274	                }
5275	
5276	                function complete() {
5277	                        // Process result
5278	                        if ( s.complete ) {
5279	                                s.complete.call( callbackContext, xhr, status);
5280	                        }
5281	
5282	                        // The request was completed
5283	                        if ( s.global ) {
5284	                                trigger( "ajaxComplete", [xhr, s] );
5285	                        }
5286	
5287	                        // Handle the global AJAX counter
5288	                        if ( s.global && ! --jQuery.active ) {
5289	                                jQuery.event.trigger( "ajaxStop" );
5290	                        }
5291	                }
5292	               
5293	                function trigger(type, args) {
5294	                        (s.context ? jQuery(s.context) : jQuery.event).trigger(type, args);
5295	                }
5296	
5297	                // return XMLHttpRequest to allow aborting the request etc.
5298	                return xhr;
5299	        },
5300	
5301	        handleError: function( s, xhr, status, e ) {
5302	                // If a local callback was specified, fire it
5303	                if ( s.error ) {
5304	                        s.error.call( s.context || s, xhr, status, e );
5305	                }
5306	
5307	                // Fire the global callback
5308	                if ( s.global ) {
5309	                        (s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] );
5310	                }
5311	        },
5312	
5313	        // Counter for holding the number of active queries
5314	        active: 0,
5315	
5316	        // Determines if an XMLHttpRequest was successful or not
5317	        httpSuccess: function( xhr ) {
5318	                try {
5319	                        // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
5320	                        return !xhr.status && location.protocol === "file:" ||
5321	                                // Opera returns 0 when status is 304
5322	                                ( xhr.status >= 200 && xhr.status < 300 ) ||
5323	                                xhr.status === 304 || xhr.status === 1223 || xhr.status === 0;
5324	                } catch(e) {}
5325	
5326	                return false;
5327	        },
5328	
5329	        // Determines if an XMLHttpRequest returns NotModified
5330	        httpNotModified: function( xhr, url ) {
5331	                var lastModified = xhr.getResponseHeader("Last-Modified"),
5332	                        etag = xhr.getResponseHeader("Etag");
5333	
5334	                if ( lastModified ) {
5335	                        jQuery.lastModified[url] = lastModified;
5336	                }
5337	
5338	                if ( etag ) {
5339	                        jQuery.etag[url] = etag;
5340	                }
5341	
5342	                // Opera returns 0 when status is 304
5343	                return xhr.status === 304 || xhr.status === 0;
5344	        },
5345	
5346	        httpData: function( xhr, type, s ) {
5347	                var ct = xhr.getResponseHeader("content-type") || "",
5348	                        xml = type === "xml" || !type && ct.indexOf("xml") >= 0,
5349	                        data = xml ? xhr.responseXML : xhr.responseText;
5350	
5351	                if ( xml && data.documentElement.nodeName === "parsererror" ) {
5352	                        jQuery.error( "parsererror" );
5353	                }
5354	
5355	                // Allow a pre-filtering function to sanitize the response
5356	                // s is checked to keep backwards compatibility
5357	                if ( s && s.dataFilter ) {
5358	                        data = s.dataFilter( data, type );
5359	                }
5360	
5361	                // The filter can actually parse the response
5362	                if ( typeof data === "string" ) {
5363	                        // Get the JavaScript object, if JSON is used.
5364	                        if ( type === "json" || !type && ct.indexOf("json") >= 0 ) {
5365	                                data = jQuery.parseJSON( data );
5366	
5367	                        // If the type is "script", eval it in global context
5368	                        } else if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) {
5369	                                jQuery.globalEval( data );
5370	                        }
5371	                }
5372	
5373	                return data;
5374	        },
5375	
5376	        // Serialize an array of form elements or a set of
5377	        // key/values into a query string
5378	        param: function( a, traditional ) {
5379	                var s = [];
5380	               
5381	                // Set traditional to true for jQuery <= 1.3.2 behavior.
5382	                if ( traditional === undefined ) {
5383	                        traditional = jQuery.ajaxSettings.traditional;
5384	                }
5385	               
5386	                // If an array was passed in, assume that it is an array of form elements.
5387	                if ( jQuery.isArray(a) || a.jquery ) {
5388	                        // Serialize the form elements
5389	                        jQuery.each( a, function() {
5390	                                add( this.name, this.value );
5391	                        });
5392	                       
5393	                } else {
5394	                        // If traditional, encode the "old" way (the way 1.3.2 or older
5395	                        // did it), otherwise encode params recursively.
5396	                        for ( var prefix in a ) {
5397	                                buildParams( prefix, a[prefix] );
5398	                        }
5399	                }
5400	
5401	                // Return the resulting serialization
5402	                return s.join("&").replace(r20, "+");
5403	
5404	                function buildParams( prefix, obj ) {
5405	                        if ( jQuery.isArray(obj) ) {
5406	                                // Serialize array item.
5407	                                jQuery.each( obj, function( i, v ) {
5408	                                        if ( traditional || /\[\]$/.test( prefix ) ) {
5409	                                                // Treat each array item as a scalar.
5410	                                                add( prefix, v );
5411	                                        } else {
5412	                                                // If array item is non-scalar (array or object), encode its
5413	                                                // numeric index to resolve deserialization ambiguity issues.
5414	                                                // Note that rack (as of 1.0.0) can't currently deserialize
5415	                                                // nested arrays properly, and attempting to do so may cause
5416	                                                // a server error. Possible fixes are to modify rack's
5417	                                                // deserialization algorithm or to provide an option or flag
5418	                                                // to force array serialization to be shallow.
5419	                                                buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v );
5420	                                        }
5421	                                });
5422	                                       
5423	                        } else if ( !traditional && obj != null && typeof obj === "object" ) {
5424	                                // Serialize object item.
5425	                                jQuery.each( obj, function( k, v ) {
5426	                                        buildParams( prefix + "[" + k + "]", v );
5427	                                });
5428	                                       
5429	                        } else {
5430	                                // Serialize scalar item.
5431	                                add( prefix, obj );
5432	                        }
5433	                }
5434	
5435	                function add( key, value ) {
5436	                        // If value is a function, invoke it and return its value
5437	                        value = jQuery.isFunction(value) ? value() : value;
5438	                        s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
5439	                }
5440	        }
5441	});
5442	var elemdisplay = {},
5443	        rfxtypes = /toggle|show|hide/,
5444	        rfxnum = /^([+-]=)?([\d+-.]+)(.*)$/,
5445	        timerId,
5446	        fxAttrs = [
5447	                // height animations
5448	                [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
5449	                // width animations
5450	                [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
5451	                // opacity animations
5452	                [ "opacity" ]
5453	        ];
5454	
5455	jQuery.fn.extend({
5456	        show: function( speed, callback ) {
5457	                if ( speed || speed === 0) {
5458	                        return this.animate( genFx("show", 3), speed, callback);
5459	
5460	                } else {
5461	                        for ( var i = 0, l = this.length; i < l; i++ ) {
5462	                                var old = jQuery.data(this[i], "olddisplay");
5463	
5464	                                this[i].style.display = old || "";
5465	
5466	                                if ( jQuery.css(this[i], "display") === "none" ) {
5467	                                        var nodeName = this[i].nodeName, display;
5468	
5469	                                        if ( elemdisplay[ nodeName ] ) {
5470	                                                display = elemdisplay[ nodeName ];
5471	
5472	                                        } else {
5473	                                                var elem = jQuery("<" + nodeName + " />").appendTo("body");
5474	
5475	                                                display = elem.css("display");
5476	
5477	                                                if ( display === "none" ) {
5478	                                                        display = "block";
5479	                                                }
5480	
5481	                                                elem.remove();
5482	
5483	                                                elemdisplay[ nodeName ] = display;
5484	                                        }
5485	
5486	                                        jQuery.data(this[i], "olddisplay", display);
5487	                                }
5488	                        }
5489	
5490	                        // Set the display of the elements in a second loop
5491	                        // to avoid the constant reflow
5492	                        for ( var j = 0, k = this.length; j < k; j++ ) {
5493	                                this[j].style.display = jQuery.data(this[j], "olddisplay") || "";
5494	                        }
5495	
5496	                        return this;
5497	                }
5498	        },
5499	
5500	        hide: function( speed, callback ) {
5501	                if ( speed || speed === 0 ) {
5502	                        return this.animate( genFx("hide", 3), speed, callback);
5503	
5504	                } else {
5505	                        for ( var i = 0, l = this.length; i < l; i++ ) {
5506	                                var old = jQuery.data(this[i], "olddisplay");
5507	                                if ( !old && old !== "none" ) {
5508	                                        jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
5509	                                }
5510	                        }
5511	
5512	                        // Set the display of the elements in a second loop
5513	                        // to avoid the constant reflow
5514	                        for ( var j = 0, k = this.length; j < k; j++ ) {
5515	                                this[j].style.display = "none";
5516	                        }
5517	
5518	                        return this;
5519	                }
5520	        },
5521	
5522	        // Save the old toggle function
5523	        _toggle: jQuery.fn.toggle,
5524	
5525	        toggle: function( fn, fn2 ) {
5526	                var bool = typeof fn === "boolean";
5527	
5528	                if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
5529	                        this._toggle.apply( this, arguments );
5530	
5531	                } else if ( fn == null || bool ) {
5532	                        this.each(function() {
5533	                                var state = bool ? fn : jQuery(this).is(":hidden");
5534	                                jQuery(this)[ state ? "show" : "hide" ]();
5535	                        });
5536	
5537	                } else {
5538	                        this.animate(genFx("toggle", 3), fn, fn2);
5539	                }
5540	
5541	                return this;
5542	        },
5543	
5544	        fadeTo: function( speed, to, callback ) {
5545	                return this.filter(":hidden").css("opacity", 0).show().end()
5546	                                        .animate({opacity: to}, speed, callback);
5547	        },
5548	
5549	        animate: function( prop, speed, easing, callback ) {
5550	                var optall = jQuery.speed(speed, easing, callback);
5551	
5552	                if ( jQuery.isEmptyObject( prop ) ) {
5553	                        return this.each( optall.complete );
5554	                }
5555	
5556	                return this[ optall.queue === false ? "each" : "queue" ](function() {
5557	                        var opt = jQuery.extend({}, optall), p,
5558	                                hidden = this.nodeType === 1 && jQuery(this).is(":hidden"),
5559	                                self = this;
5560	
5561	                        for ( p in prop ) {
5562	                                var name = p.replace(rdashAlpha, fcamelCase);
5563	
5564	                                if ( p !== name ) {
5565	                                        prop[ name ] = prop[ p ];
5566	                                        delete prop[ p ];
5567	                                        p = name;
5568	                                }
5569	
5570	                                if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {
5571	                                        return opt.complete.call(this);
5572	                                }
5573	
5574	                                if ( ( p === "height" || p === "width" ) && this.style ) {
5575	                                        // Store display property
5576	                                        opt.display = jQuery.css(this, "display");
5577	
5578	                                        // Make sure that nothing sneaks out
5579	                                        opt.overflow = this.style.overflow;
5580	                                }
5581	
5582	                                if ( jQuery.isArray( prop[p] ) ) {
5583	                                        // Create (if needed) and add to specialEasing
5584	                                        (opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
5585	                                        prop[p] = prop[p][0];
5586	                                }
5587	                        }
5588	
5589	                        if ( opt.overflow != null ) {
5590	                                this.style.overflow = "hidden";
5591	                        }
5592	
5593	                        opt.curAnim = jQuery.extend({}, prop);
5594	
5595	                        jQuery.each( prop, function( name, val ) {
5596	                                var e = new jQuery.fx( self, opt, name );
5597	
5598	                                if ( rfxtypes.test(val) ) {
5599	                                        e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );
5600	
5601	                                } else {
5602	                                        var parts = rfxnum.exec(val),
5603	                                                start = e.cur(true) || 0;
5604	
5605	                                        if ( parts ) {
5606	                                                var end = parseFloat( parts[2] ),
5607	                                                        unit = parts[3] || "px";
5608	
5609	                                                // We need to compute starting value
5610	                                                if ( unit !== "px" ) {
5611	                                                        self.style[ name ] = (end || 1) + unit;
5612	                                                        start = ((end || 1) / e.cur(true)) * start;
5613	                                                        self.style[ name ] = start + unit;
5614	                                                }
5615	
5616	                                                // If a +=/-= token was provided, we're doing a relative animation
5617	                                                if ( parts[1] ) {
5618	                                                        end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
5619	                                                }
5620	
5621	                                                e.custom( start, end, unit );
5622	
5623	                                        } else {
5624	                                                e.custom( start, val, "" );
5625	                                        }
5626	                                }
5627	                        });
5628	
5629	                        // For JS strict compliance
5630	                        return true;
5631	                });
5632	        },
5633	
5634	        stop: function( clearQueue, gotoEnd ) {
5635	                var timers = jQuery.timers;
5636	
5637	                if ( clearQueue ) {
5638	                        this.queue([]);
5639	                }
5640	
5641	                this.each(function() {
5642	                        // go in reverse order so anything added to the queue during the loop is ignored
5643	                        for ( var i = timers.length - 1; i >= 0; i-- ) {
5644	                                if ( timers[i].elem === this ) {
5645	                                        if (gotoEnd) {
5646	                                                // force the next step to be the last
5647	                                                timers[i](true);
5648	                                        }
5649	
5650	                                        timers.splice(i, 1);
5651	                                }
5652	                        }
5653	                });
5654	
5655	                // start the next in the queue if the last step wasn't forced
5656	                if ( !gotoEnd ) {
5657	                        this.dequeue();
5658	                }
5659	
5660	                return this;
5661	        }
5662	
5663	});
5664	
5665	// Generate shortcuts for custom animations
5666	jQuery.each({
5667	        slideDown: genFx("show", 1),
5668	        slideUp: genFx("hide", 1),
5669	        slideToggle: genFx("toggle", 1),
5670	        fadeIn: { opacity: "show" },
5671	        fadeOut: { opacity: "hide" }
5672	}, function( name, props ) {
5673	        jQuery.fn[ name ] = function( speed, callback ) {
5674	                return this.animate( props, speed, callback );
5675	        };
5676	});
5677	
5678	jQuery.extend({
5679	        speed: function( speed, easing, fn ) {
5680	                var opt = speed && typeof speed === "object" ? speed : {
5681	                        complete: fn || !fn && easing ||
5682	                                jQuery.isFunction( speed ) && speed,
5683	                        duration: speed,
5684	                        easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
5685	                };
5686	
5687	                opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
5688	                        jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
5689	
5690	                // Queueing
5691	                opt.old = opt.complete;
5692	                opt.complete = function() {
5693	                        if ( opt.queue !== false ) {
5694	                                jQuery(this).dequeue();
5695	                        }
5696	                        if ( jQuery.isFunction( opt.old ) ) {
5697	                                opt.old.call( this );
5698	                        }
5699	                };
5700	
5701	                return opt;
5702	        },
5703	
5704	        easing: {
5705	                linear: function( p, n, firstNum, diff ) {
5706	                        return firstNum + diff * p;
5707	                },
5708	                swing: function( p, n, firstNum, diff ) {
5709	                        return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
5710	                }
5711	        },
5712	
5713	        timers: [],
5714	
5715	        fx: function( elem, options, prop ) {
5716	                this.options = options;
5717	                this.elem = elem;
5718	                this.prop = prop;
5719	
5720	                if ( !options.orig ) {
5721	                        options.orig = {};
5722	                }
5723	        }
5724	
5725	});
5726	
5727	jQuery.fx.prototype = {
5728	        // Simple function for setting a style value
5729	        update: function() {
5730	                if ( this.options.step ) {
5731	                        this.options.step.call( this.elem, this.now, this );
5732	                }
5733	
5734	                (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
5735	
5736	                // Set display property to block for height/width animations
5737	                if ( ( this.prop === "height" || this.prop === "width" ) && this.elem.style ) {
5738	                        this.elem.style.display = "block";
5739	                }
5740	        },
5741	
5742	        // Get the current size
5743	        cur: function( force ) {
5744	                if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
5745	                        return this.elem[ this.prop ];
5746	                }
5747	
5748	                var r = parseFloat(jQuery.css(this.elem, this.prop, force));
5749	                return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
5750	        },
5751	
5752	        // Start an animation from one number to another
5753	        custom: function( from, to, unit ) {
5754	                this.startTime = now();
5755	                this.start = from;
5756	                this.end = to;
5757	                this.unit = unit || this.unit || "px";
5758	                this.now = this.start;
5759	                this.pos = this.state = 0;
5760	
5761	                var self = this;
5762	                function t( gotoEnd ) {
5763	                        return self.step(gotoEnd);
5764	                }
5765	
5766	                t.elem = this.elem;
5767	
5768	                if ( t() && jQuery.timers.push(t) && !timerId ) {
5769	                        timerId = setInterval(jQuery.fx.tick, 13);
5770	                }
5771	        },
5772	
5773	        // Simple 'show' function
5774	        show: function() {
5775	                // Remember where we started, so that we can go back to it later
5776	                this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
5777	                this.options.show = true;
5778	
5779	                // Begin the animation
5780	                // Make sure that we start at a small width/height to avoid any
5781	                // flash of content
5782	                this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
5783	
5784	                // Start by showing the element
5785	                jQuery( this.elem ).show();
5786	        },
5787	
5788	        // Simple 'hide' function
5789	        hide: function() {
5790	                // Remember where we started, so that we can go back to it later
5791	                this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
5792	                this.options.hide = true;
5793	
5794	                // Begin the animation
5795	                this.custom(this.cur(), 0);
5796	        },
5797	
5798	        // Each step of an animation
5799	        step: function( gotoEnd ) {
5800	                var t = now(), done = true;
5801	
5802	                if ( gotoEnd || t >= this.options.duration + this.startTime ) {
5803	                        this.now = this.end;
5804	                        this.pos = this.state = 1;
5805	                        this.update();
5806	
5807	                        this.options.curAnim[ this.prop ] = true;
5808	
5809	                        for ( var i in this.options.curAnim ) {
5810	                                if ( this.options.curAnim[i] !== true ) {
5811	                                        done = false;
5812	                                }
5813	                        }
5814	
5815	                        if ( done ) {
5816	                                if ( this.options.display != null ) {
5817	                                        // Reset the overflow
5818	                                        this.elem.style.overflow = this.options.overflow;
5819	
5820	                                        // Reset the display
5821	                                        var old = jQuery.data(this.elem, "olddisplay");
5822	                                        this.elem.style.display = old ? old : this.options.display;
5823	
5824	                                        if ( jQuery.css(this.elem, "display") === "none" ) {
5825	                                                this.elem.style.display = "block";
5826	                                        }
5827	                                }
5828	
5829	                                // Hide the element if the "hide" operation was done
5830	                                if ( this.options.hide ) {
5831	                                        jQuery(this.elem).hide();
5832	                                }
5833	
5834	                                // Reset the properties, if the item has been hidden or shown
5835	                                if ( this.options.hide || this.options.show ) {
5836	                                        for ( var p in this.options.curAnim ) {
5837	                                                jQuery.style(this.elem, p, this.options.orig[p]);
5838	                                        }
5839	                                }
5840	
5841	                                // Execute the complete function
5842	                                this.options.complete.call( this.elem );
5843	                        }
5844	
5845	                        return false;
5846	
5847	                } else {
5848	                        var n = t - this.startTime;
5849	                        this.state = n / this.options.duration;
5850	
5851	                        // Perform the easing function, defaults to swing
5852	                        var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
5853	                        var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
5854	                        this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
5855	                        this.now = this.start + ((this.end - this.start) * this.pos);
5856	
5857	                        // Perform the next step of the animation
5858	                        this.update();
5859	                }
5860	
5861	                return true;
5862	        }
5863	};
5864	
5865	jQuery.extend( jQuery.fx, {
5866	        tick: function() {
5867	                var timers = jQuery.timers;
5868	
5869	                for ( var i = 0; i < timers.length; i++ ) {
5870	                        if ( !timers[i]() ) {
5871	                                timers.splice(i--, 1);
5872	                        }
5873	                }
5874	
5875	                if ( !timers.length ) {
5876	                        jQuery.fx.stop();
5877	                }
5878	        },
5879	               
5880	        stop: function() {
5881	                clearInterval( timerId );
5882	                timerId = null;
5883	        },
5884	       
5885	        speeds: {
5886	                slow: 600,
5887	                fast: 200,
5888	                // Default speed
5889	                _default: 400
5890	        },
5891	
5892	        step: {
5893	                opacity: function( fx ) {
5894	                        jQuery.style(fx.elem, "opacity", fx.now);
5895	                },
5896	
5897	                _default: function( fx ) {
5898	                        if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
5899	                                fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
5900	                        } else {
5901	                                fx.elem[ fx.prop ] = fx.now;
5902	                        }
5903	                }
5904	        }
5905	});
5906	
5907	if ( jQuery.expr && jQuery.expr.filters ) {
5908	        jQuery.expr.filters.animated = function( elem ) {
5909	                return jQuery.grep(jQuery.timers, function( fn ) {
5910	                        return elem === fn.elem;
5911	                }).length;
5912	        };
5913	}
5914	
5915	function genFx( type, num ) {
5916	        var obj = {};
5917	
5918	        jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
5919	                obj[ this ] = type;
5920	        });
5921	
5922	        return obj;
5923	}
5924	if ( "getBoundingClientRect" in document.documentElement ) {
5925	        jQuery.fn.offset = function( options ) {
5926	                var elem = this[0];
5927	
5928	                if ( options ) { 
5929	                        return this.each(function( i ) {
5930	                                jQuery.offset.setOffset( this, options, i );
5931	                        });
5932	                }
5933	
5934	                if ( !elem || !elem.ownerDocument ) {
5935	                        return null;
5936	                }
5937	
5938	                if ( elem === elem.ownerDocument.body ) {
5939	                        return jQuery.offset.bodyOffset( elem );
5940	                }
5941	
5942	                var box = elem.getBoundingClientRect(), doc = elem.ownerDocument, body = doc.body, docElem = doc.documentElement,
5943	                        clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
5944	                        top  = box.top  + (self.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop ) - clientTop,
5945	                        left = box.left + (self.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
5946	
5947	                return { top: top, left: left };
5948	        };
5949	
5950	} else {
5951	        jQuery.fn.offset = function( options ) {
5952	                var elem = this[0];
5953	
5954	                if ( options ) { 
5955	                        return this.each(function( i ) {
5956	                                jQuery.offset.setOffset( this, options, i );
5957	                        });
5958	                }
5959	
5960	                if ( !elem || !elem.ownerDocument ) {
5961	                        return null;
5962	                }
5963	
5964	                if ( elem === elem.ownerDocument.body ) {
5965	                        return jQuery.offset.bodyOffset( elem );
5966	                }
5967	
5968	                jQuery.offset.initialize();
5969	
5970	                var offsetParent = elem.offsetParent, prevOffsetParent = elem,
5971	                        doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
5972	                        body = doc.body, defaultView = doc.defaultView,
5973	                        prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
5974	                        top = elem.offsetTop, left = elem.offsetLeft;
5975	
5976	                while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
5977	                        if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
5978	                                break;
5979	                        }
5980	
5981	                        computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
5982	                        top  -= elem.scrollTop;
5983	                        left -= elem.scrollLeft;
5984	
5985	                        if ( elem === offsetParent ) {
5986	                                top  += elem.offsetTop;
5987	                                left += elem.offsetLeft;
5988	
5989	                                if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.nodeName)) ) {
5990	                                        top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
5991	                                        left += parseFloat( computedStyle.borderLeftWidth ) || 0;
5992	                                }
5993	
5994	                                prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
5995	                        }
5996	
5997	                        if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
5998	                                top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
5999	                                left += parseFloat( computedStyle.borderLeftWidth ) || 0;
6000	                        }
6001	
6002	                        prevComputedStyle = computedStyle;
6003	                }
6004	
6005	                if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
6006	                        top  += body.offsetTop;
6007	                        left += body.offsetLeft;
6008	                }
6009	
6010	                if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
6011	                        top  += Math.max( docElem.scrollTop, body.scrollTop );
6012	                        left += Math.max( docElem.scrollLeft, body.scrollLeft );
6013	                }
6014	
6015	                return { top: top, left: left };
6016	        };
6017	}
6018	
6019	jQuery.offset = {
6020	        initialize: function() {
6021	                var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.curCSS(body, "marginTop", true) ) || 0,
6022	                        html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
6023	
6024	                jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
6025	
6026	                container.innerHTML = html;
6027	                body.insertBefore( container, body.firstChild );
6028	                innerDiv = container.firstChild;
6029	                checkDiv = innerDiv.firstChild;
6030	                td = innerDiv.nextSibling.firstChild.firstChild;
6031	
6032	                this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
6033	                this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
6034	
6035	                checkDiv.style.position = "fixed", checkDiv.style.top = "20px";
6036	                // safari subtracts parent border width here which is 5px
6037	                this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
6038	                checkDiv.style.position = checkDiv.style.top = "";
6039	
6040	                innerDiv.style.overflow = "hidden", innerDiv.style.position = "relative";
6041	                this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
6042	
6043	                this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
6044	
6045	                body.removeChild( container );
6046	                body = container = innerDiv = checkDiv = table = td = null;
6047	                jQuery.offset.initialize = jQuery.noop;
6048	        },
6049	
6050	        bodyOffset: function( body ) {
6051	                var top = body.offsetTop, left = body.offsetLeft;
6052	
6053	                jQuery.offset.initialize();
6054	
6055	                if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
6056	                        top  += parseFloat( jQuery.curCSS(body, "marginTop",  true) ) || 0;
6057	                        left += parseFloat( jQuery.curCSS(body, "marginLeft", true) ) || 0;
6058	                }
6059	
6060	                return { top: top, left: left };
6061	        },
6062	       
6063	        setOffset: function( elem, options, i ) {
6064	                // set position first, in-case top/left are set even on static elem
6065	                if ( /static/.test( jQuery.curCSS( elem, "position" ) ) ) {
6066	                        elem.style.position = "relative";
6067	                }
6068	                var curElem   = jQuery( elem ),
6069	                        curOffset = curElem.offset(),
6070	                        curTop    = parseInt( jQuery.curCSS( elem, "top",  true ), 10 ) || 0,
6071	                        curLeft   = parseInt( jQuery.curCSS( elem, "left", true ), 10 ) || 0;
6072	
6073	                if ( jQuery.isFunction( options ) ) {
6074	                        options = options.call( elem, i, curOffset );
6075	                }
6076	
6077	                var props = {
6078	                        top:  (options.top  - curOffset.top)  + curTop,
6079	                        left: (options.left - curOffset.left) + curLeft
6080	                };
6081	               
6082	                if ( "using" in options ) {
6083	                        options.using.call( elem, props );
6084	                } else {
6085	                        curElem.css( props );
6086	                }
6087	        }
6088	};
6089	
6090	
6091	jQuery.fn.extend({
6092	        position: function() {
6093	                if ( !this[0] ) {
6094	                        return null;
6095	                }
6096	
6097	                var elem = this[0],
6098	
6099	                // Get *real* offsetParent
6100	                offsetParent = this.offsetParent(),
6101	
6102	                // Get correct offsets
6103	                offset       = this.offset(),
6104	                parentOffset = /^body|html$/i.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
6105	
6106	                // Subtract element margins
6107	                // note: when an element has margin: auto the offsetLeft and marginLeft
6108	                // are the same in Safari causing offset.left to incorrectly be 0
6109	                offset.top  -= parseFloat( jQuery.curCSS(elem, "marginTop",  true) ) || 0;
6110	                offset.left -= parseFloat( jQuery.curCSS(elem, "marginLeft", true) ) || 0;
6111	
6112	                // Add offsetParent borders
6113	                parentOffset.top  += parseFloat( jQuery.curCSS(offsetParent[0], "borderTopWidth",  true) ) || 0;
6114	                parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], "borderLeftWidth", true) ) || 0;
6115	
6116	                // Subtract the two offsets
6117	                return {
6118	                        top:  offset.top  - parentOffset.top,
6119	                        left: offset.left - parentOffset.left
6120	                };
6121	        },
6122	
6123	        offsetParent: function() {
6124	                return this.map(function() {
6125	                        var offsetParent = this.offsetParent || document.body;
6126	                        while ( offsetParent && (!/^body|html$/i.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
6127	                                offsetParent = offsetParent.offsetParent;
6128	                        }
6129	                        return offsetParent;
6130	                });
6131	        }
6132	});
6133	
6134	
6135	// Create scrollLeft and scrollTop methods
6136	jQuery.each( ["Left", "Top"], function( i, name ) {
6137	        var method = "scroll" + name;
6138	
6139	        jQuery.fn[ method ] = function(val) {
6140	                var elem = this[0], win;
6141	               
6142	                if ( !elem ) {
6143	                        return null;
6144	                }
6145	
6146	                if ( val !== undefined ) {
6147	                        // Set the scroll offset
6148	                        return this.each(function() {
6149	                                win = getWindow( this );
6150	
6151	                                if ( win ) {
6152	                                        win.scrollTo(
6153	                                                !i ? val : jQuery(win).scrollLeft(),
6154	                                                 i ? val : jQuery(win).scrollTop()
6155	                                        );
6156	
6157	                                } else {
6158	                                        this[ method ] = val;
6159	                                }
6160	                        });
6161	                } else {
6162	                        win = getWindow( elem );
6163	
6164	                        // Return the scroll offset
6165	                        return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
6166	                                jQuery.support.boxModel && win.document.documentElement[ method ] ||
6167	                                        win.document.body[ method ] :
6168	                                elem[ method ];
6169	                }
6170	        };
6171	});
6172	
6173	function getWindow( elem ) {
6174	        return ("scrollTo" in elem && elem.document) ?
6175	                elem :
6176	                elem.nodeType === 9 ?
6177	                        elem.defaultView || elem.parentWindow :
6178	                        false;
6179	}
6180	// Create innerHeight, innerWidth, outerHeight and outerWidth methods
6181	jQuery.each([ "Height", "Width" ], function( i, name ) {
6182	
6183	        var type = name.toLowerCase();
6184	
6185	        // innerHeight and innerWidth
6186	        jQuery.fn["inner" + name] = function() {
6187	                return this[0] ?
6188	                        jQuery.css( this[0], type, false, "padding" ) :
6189	                        null;
6190	        };
6191	
6192	        // outerHeight and outerWidth
6193	        jQuery.fn["outer" + name] = function( margin ) {
6194	                return this[0] ?
6195	                        jQuery.css( this[0], type, false, margin ? "margin" : "border" ) :
6196	                        null;
6197	        };
6198	
6199	        jQuery.fn[ type ] = function( size ) {
6200	                // Get window width or height
6201	                var elem = this[0];
6202	                if ( !elem ) {
6203	                        return size == null ? null : this;
6204	                }
6205	               
6206	                if ( jQuery.isFunction( size ) ) {
6207	                        return this.each(function( i ) {
6208	                                var self = jQuery( this );
6209	                                self[ type ]( size.call( this, i, self[ type ]() ) );
6210	                        });
6211	                }
6212	
6213	                return ("scrollTo" in elem && elem.document) ? // does it walk and quack like a window?
6214	                        // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
6215	                        elem.document.compatMode === "CSS1Compat" && elem.document.documentElement[ "client" + name ] ||
6216	                        elem.document.body[ "client" + name ] :
6217	
6218	                        // Get document width or height
6219	                        (elem.nodeType === 9) ? // is it a document
6220	                                // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
6221	                                Math.max(
6222	                                        elem.documentElement["client" + name],
6223	                                        elem.body["scroll" + name], elem.documentElement["scroll" + name],
6224	                                        elem.body["offset" + name], elem.documentElement["offset" + name]
6225	                                ) :
6226	
6227	                                // Get or set width or height on the element
6228	                                size === undefined ?
6229	                                        // Get width or height on the element
6230	                                        jQuery.css( elem, type ) :
6231	
6232	                                        // Set the width or height on the element (default to pixels if value is unitless)
6233	                                        this.css( type, typeof size === "string" ? size : size + "px" );
6234	        };
6235	
6236	});
6237	// Expose jQuery to the global object
6238	window.jQuery = window.$ = jQuery;
6239	
6240	})(window);
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容