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

1	/*!
2	 * jQuery JavaScript Library v1.6.1
3	 * http://jquery.com/
4	 *
5	 * Copyright 2011, 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 2011, The Dojo Foundation
12	 * Released under the MIT, BSD, and GPL Licenses.
13	 *
14	 * Date: Thu May 12 15:04:36 2011 -0400
15	 */
16	(function( window, undefined ) {
17	
18	// Use the correct document accordingly with window argument (sandbox)
19	var document = window.document,
20	        navigator = window.navigator,
21	        location = window.location;
22	var jQuery = (function() {
23	
24	// Define a local copy of jQuery
25	var jQuery = function( selector, context ) {
26	                // The jQuery object is actually just the init constructor 'enhanced'
27	                return new jQuery.fn.init( selector, context, rootjQuery );
28	        },
29	
30	        // Map over jQuery in case of overwrite
31	        _jQuery = window.jQuery,
32	
33	        // Map over the $ in case of overwrite
34	        _$ = window.$,
35	
36	        // A central reference to the root jQuery(document)
37	        rootjQuery,
38	
39	        // A simple way to check for HTML strings or ID strings
40	        // (both of which we optimize for)
41	        quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
42	
43	        // Check if a string has a non-whitespace character in it
44	        rnotwhite = /\S/,
45	
46	        // Used for trimming whitespace
47	        trimLeft = /^\s+/,
48	        trimRight = /\s+$/,
49	
50	        // Check for digits
51	        rdigit = /\d/,
52	
53	        // Match a standalone tag
54	        rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
55	
56	        // JSON RegExp
57	        rvalidchars = /^[\],:{}\s]*$/,
58	        rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
59	        rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
60	        rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
61	
62	        // Useragent RegExp
63	        rwebkit = /(webkit)[ \/]([\w.]+)/,
64	        ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
65	        rmsie = /(msie) ([\w.]+)/,
66	        rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
67	
68	        // Keep a UserAgent string for use with jQuery.browser
69	        userAgent = navigator.userAgent,
70	
71	        // For matching the engine and version of the browser
72	        browserMatch,
73	
74	        // The deferred used on DOM ready
75	        readyList,
76	
77	        // The ready event handler
78	        DOMContentLoaded,
79	
80	        // Save a reference to some core methods
81	        toString = Object.prototype.toString,
82	        hasOwn = Object.prototype.hasOwnProperty,
83	        push = Array.prototype.push,
84	        slice = Array.prototype.slice,
85	        trim = String.prototype.trim,
86	        indexOf = Array.prototype.indexOf,
87	
88	        // [[Class]] -> type pairs
89	        class2type = {};
90	
91	jQuery.fn = jQuery.prototype = {
92	        constructor: jQuery,
93	        init: function( selector, context, rootjQuery ) {
94	                var match, elem, ret, doc;
95	
96	                // Handle $(""), $(null), or $(undefined)
97	                if ( !selector ) {
98	                        return this;
99	                }
100	
101	                // Handle $(DOMElement)
102	                if ( selector.nodeType ) {
103	                        this.context = this[0] = selector;
104	                        this.length = 1;
105	                        return this;
106	                }
107	
108	                // The body element only exists once, optimize finding it
109	                if ( selector === "body" && !context && document.body ) {
110	                        this.context = document;
111	                        this[0] = document.body;
112	                        this.selector = selector;
113	                        this.length = 1;
114	                        return this;
115	                }
116	
117	                // Handle HTML strings
118	                if ( typeof selector === "string" ) {
119	                        // Are we dealing with HTML string or an ID?
120	                        if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
121	                                // Assume that strings that start and end with <> are HTML and skip the regex check
122	                                match = [ null, selector, null ];
123	
124	                        } else {
125	                                match = quickExpr.exec( selector );
126	                        }
127	
128	                        // Verify a match, and that no context was specified for #id
129	                        if ( match && (match[1] || !context) ) {
130	
131	                                // HANDLE: $(html) -> $(array)
132	                                if ( match[1] ) {
133	                                        context = context instanceof jQuery ? context[0] : context;
134	                                        doc = (context ? context.ownerDocument || context : document);
135	
136	                                        // If a single string is passed in and it's a single tag
137	                                        // just do a createElement and skip the rest
138	                                        ret = rsingleTag.exec( selector );
139	
140	                                        if ( ret ) {
141	                                                if ( jQuery.isPlainObject( context ) ) {
142	                                                        selector = [ document.createElement( ret[1] ) ];
143	                                                        jQuery.fn.attr.call( selector, context, true );
144	
145	                                                } else {
146	                                                        selector = [ doc.createElement( ret[1] ) ];
147	                                                }
148	
149	                                        } else {
150	                                                ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
151	                                                selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
152	                                        }
153	
154	                                        return jQuery.merge( this, selector );
155	
156	                                // HANDLE: $("#id")
157	                                } else {
158	                                        elem = document.getElementById( match[2] );
159	
160	                                        // Check parentNode to catch when Blackberry 4.6 returns
161	                                        // nodes that are no longer in the document #6963
162	                                        if ( elem && elem.parentNode ) {
163	                                                // Handle the case where IE and Opera return items
164	                                                // by name instead of ID
165	                                                if ( elem.id !== match[2] ) {
166	                                                        return rootjQuery.find( selector );
167	                                                }
168	
169	                                                // Otherwise, we inject the element directly into the jQuery object
170	                                                this.length = 1;
171	                                                this[0] = elem;
172	                                        }
173	
174	                                        this.context = document;
175	                                        this.selector = selector;
176	                                        return this;
177	                                }
178	
179	                        // HANDLE: $(expr, $(...))
180	                        } else if ( !context || context.jquery ) {
181	                                return (context || rootjQuery).find( selector );
182	
183	                        // HANDLE: $(expr, context)
184	                        // (which is just equivalent to: $(context).find(expr)
185	                        } else {
186	                                return this.constructor( context ).find( selector );
187	                        }
188	
189	                // HANDLE: $(function)
190	                // Shortcut for document ready
191	                } else if ( jQuery.isFunction( selector ) ) {
192	                        return rootjQuery.ready( selector );
193	                }
194	
195	                if (selector.selector !== undefined) {
196	                        this.selector = selector.selector;
197	                        this.context = selector.context;
198	                }
199	
200	                return jQuery.makeArray( selector, this );
201	        },
202	
203	        // Start with an empty selector
204	        selector: "",
205	
206	        // The current version of jQuery being used
207	        jquery: "1.6.1",
208	
209	        // The default length of a jQuery object is 0
210	        length: 0,
211	
212	        // The number of elements contained in the matched element set
213	        size: function() {
214	                return this.length;
215	        },
216	
217	        toArray: function() {
218	                return slice.call( this, 0 );
219	        },
220	
221	        // Get the Nth element in the matched element set OR
222	        // Get the whole matched element set as a clean array
223	        get: function( num ) {
224	                return num == null ?
225	
226	                        // Return a 'clean' array
227	                        this.toArray() :
228	
229	                        // Return just the object
230	                        ( num < 0 ? this[ this.length + num ] : this[ num ] );
231	        },
232	
233	        // Take an array of elements and push it onto the stack
234	        // (returning the new matched element set)
235	        pushStack: function( elems, name, selector ) {
236	                // Build a new jQuery matched element set
237	                var ret = this.constructor();
238	
239	                if ( jQuery.isArray( elems ) ) {
240	                        push.apply( ret, elems );
241	
242	                } else {
243	                        jQuery.merge( ret, elems );
244	                }
245	
246	                // Add the old object onto the stack (as a reference)
247	                ret.prevObject = this;
248	
249	                ret.context = this.context;
250	
251	                if ( name === "find" ) {
252	                        ret.selector = this.selector + (this.selector ? " " : "") + selector;
253	                } else if ( name ) {
254	                        ret.selector = this.selector + "." + name + "(" + selector + ")";
255	                }
256	
257	                // Return the newly-formed element set
258	                return ret;
259	        },
260	
261	        // Execute a callback for every element in the matched set.
262	        // (You can seed the arguments with an array of args, but this is
263	        // only used internally.)
264	        each: function( callback, args ) {
265	                return jQuery.each( this, callback, args );
266	        },
267	
268	        ready: function( fn ) {
269	                // Attach the listeners
270	                jQuery.bindReady();
271	
272	                // Add the callback
273	                readyList.done( fn );
274	
275	                return this;
276	        },
277	
278	        eq: function( i ) {
279	                return i === -1 ?
280	                        this.slice( i ) :
281	                        this.slice( i, +i + 1 );
282	        },
283	
284	        first: function() {
285	                return this.eq( 0 );
286	        },
287	
288	        last: function() {
289	                return this.eq( -1 );
290	        },
291	
292	        slice: function() {
293	                return this.pushStack( slice.apply( this, arguments ),
294	                        "slice", slice.call(arguments).join(",") );
295	        },
296	
297	        map: function( callback ) {
298	                return this.pushStack( jQuery.map(this, function( elem, i ) {
299	                        return callback.call( elem, i, elem );
300	                }));
301	        },
302	
303	        end: function() {
304	                return this.prevObject || this.constructor(null);
305	        },
306	
307	        // For internal use only.
308	        // Behaves like an Array's method, not like a jQuery method.
309	        push: push,
310	        sort: [].sort,
311	        splice: [].splice
312	};
313	
314	// Give the init function the jQuery prototype for later instantiation
315	jQuery.fn.init.prototype = jQuery.fn;
316	
317	jQuery.extend = jQuery.fn.extend = function() {
318	        var options, name, src, copy, copyIsArray, clone,
319	                target = arguments[0] || {},
320	                i = 1,
321	                length = arguments.length,
322	                deep = false;
323	
324	        // Handle a deep copy situation
325	        if ( typeof target === "boolean" ) {
326	                deep = target;
327	                target = arguments[1] || {};
328	                // skip the boolean and the target
329	                i = 2;
330	        }
331	
332	        // Handle case when target is a string or something (possible in deep copy)
333	        if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
334	                target = {};
335	        }
336	
337	        // extend jQuery itself if only one argument is passed
338	        if ( length === i ) {
339	                target = this;
340	                --i;
341	        }
342	
343	        for ( ; i < length; i++ ) {
344	                // Only deal with non-null/undefined values
345	                if ( (options = arguments[ i ]) != null ) {
346	                        // Extend the base object
347	                        for ( name in options ) {
348	                                src = target[ name ];
349	                                copy = options[ name ];
350	
351	                                // Prevent never-ending loop
352	                                if ( target === copy ) {
353	                                        continue;
354	                                }
355	
356	                                // Recurse if we're merging plain objects or arrays
357	                                if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
358	                                        if ( copyIsArray ) {
359	                                                copyIsArray = false;
360	                                                clone = src && jQuery.isArray(src) ? src : [];
361	
362	                                        } else {
363	                                                clone = src && jQuery.isPlainObject(src) ? src : {};
364	                                        }
365	
366	                                        // Never move original objects, clone them
367	                                        target[ name ] = jQuery.extend( deep, clone, copy );
368	
369	                                // Don't bring in undefined values
370	                                } else if ( copy !== undefined ) {
371	                                        target[ name ] = copy;
372	                                }
373	                        }
374	                }
375	        }
376	
377	        // Return the modified object
378	        return target;
379	};
380	
381	jQuery.extend({
382	        noConflict: function( deep ) {
383	                if ( window.$ === jQuery ) {
384	                        window.$ = _$;
385	                }
386	
387	                if ( deep && window.jQuery === jQuery ) {
388	                        window.jQuery = _jQuery;
389	                }
390	
391	                return jQuery;
392	        },
393	
394	        // Is the DOM ready to be used? Set to true once it occurs.
395	        isReady: false,
396	
397	        // A counter to track how many items to wait for before
398	        // the ready event fires. See #6781
399	        readyWait: 1,
400	
401	        // Hold (or release) the ready event
402	        holdReady: function( hold ) {
403	                if ( hold ) {
404	                        jQuery.readyWait++;
405	                } else {
406	                        jQuery.ready( true );
407	                }
408	        },
409	
410	        // Handle when the DOM is ready
411	        ready: function( wait ) {
412	                // Either a released hold or an DOMready/load event and not yet ready
413	                if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
414	                        // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
415	                        if ( !document.body ) {
416	                                return setTimeout( jQuery.ready, 1 );
417	                        }
418	
419	                        // Remember that the DOM is ready
420	                        jQuery.isReady = true;
421	
422	                        // If a normal DOM Ready event fired, decrement, and wait if need be
423	                        if ( wait !== true && --jQuery.readyWait > 0 ) {
424	                                return;
425	                        }
426	
427	                        // If there are functions bound, to execute
428	                        readyList.resolveWith( document, [ jQuery ] );
429	
430	                        // Trigger any bound ready events
431	                        if ( jQuery.fn.trigger ) {
432	                                jQuery( document ).trigger( "ready" ).unbind( "ready" );
433	                        }
434	                }
435	        },
436	
437	        bindReady: function() {
438	                if ( readyList ) {
439	                        return;
440	                }
441	
442	                readyList = jQuery._Deferred();
443	
444	                // Catch cases where $(document).ready() is called after the
445	                // browser event has already occurred.
446	                if ( document.readyState === "complete" ) {
447	                        // Handle it asynchronously to allow scripts the opportunity to delay ready
448	                        return setTimeout( jQuery.ready, 1 );
449	                }
450	
451	                // Mozilla, Opera and webkit nightlies currently support this event
452	                if ( document.addEventListener ) {
453	                        // Use the handy event callback
454	                        document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
455	
456	                        // A fallback to window.onload, that will always work
457	                        window.addEventListener( "load", jQuery.ready, false );
458	
459	                // If IE event model is used
460	                } else if ( document.attachEvent ) {
461	                        // ensure firing before onload,
462	                        // maybe late but safe also for iframes
463	                        document.attachEvent( "onreadystatechange", DOMContentLoaded );
464	
465	                        // A fallback to window.onload, that will always work
466	                        window.attachEvent( "onload", jQuery.ready );
467	
468	                        // If IE and not a frame
469	                        // continually check to see if the document is ready
470	                        var toplevel = false;
471	
472	                        try {
473	                                toplevel = window.frameElement == null;
474	                        } catch(e) {}
475	
476	                        if ( document.documentElement.doScroll && toplevel ) {
477	                                doScrollCheck();
478	                        }
479	                }
480	        },
481	
482	        // See test/unit/core.js for details concerning isFunction.
483	        // Since version 1.3, DOM methods and functions like alert
484	        // aren't supported. They return false on IE (#2968).
485	        isFunction: function( obj ) {
486	                return jQuery.type(obj) === "function";
487	        },
488	
489	        isArray: Array.isArray || function( obj ) {
490	                return jQuery.type(obj) === "array";
491	        },
492	
493	        // A crude way of determining if an object is a window
494	        isWindow: function( obj ) {
495	                return obj && typeof obj === "object" && "setInterval" in obj;
496	        },
497	
498	        isNaN: function( obj ) {
499	                return obj == null || !rdigit.test( obj ) || isNaN( obj );
500	        },
501	
502	        type: function( obj ) {
503	                return obj == null ?
504	                        String( obj ) :
505	                        class2type[ toString.call(obj) ] || "object";
506	        },
507	
508	        isPlainObject: function( obj ) {
509	                // Must be an Object.
510	                // Because of IE, we also have to check the presence of the constructor property.
511	                // Make sure that DOM nodes and window objects don't pass through, as well
512	                if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
513	                        return false;
514	                }
515	
516	                // Not own constructor property must be Object
517	                if ( obj.constructor &&
518	                        !hasOwn.call(obj, "constructor") &&
519	                        !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
520	                        return false;
521	                }
522	
523	                // Own properties are enumerated firstly, so to speed up,
524	                // if last one is own, then all properties are own.
525	
526	                var key;
527	                for ( key in obj ) {}
528	
529	                return key === undefined || hasOwn.call( obj, key );
530	        },
531	
532	        isEmptyObject: function( obj ) {
533	                for ( var name in obj ) {
534	                        return false;
535	                }
536	                return true;
537	        },
538	
539	        error: function( msg ) {
540	                throw msg;
541	        },
542	
543	        parseJSON: function( data ) {
544	                if ( typeof data !== "string" || !data ) {
545	                        return null;
546	                }
547	
548	                // Make sure leading/trailing whitespace is removed (IE can't handle it)
549	                data = jQuery.trim( data );
550	
551	                // Attempt to parse using the native JSON parser first
552	                if ( window.JSON && window.JSON.parse ) {
553	                        return window.JSON.parse( data );
554	                }
555	
556	                // Make sure the incoming data is actual JSON
557	                // Logic borrowed from http://json.org/json2.js
558	                if ( rvalidchars.test( data.replace( rvalidescape, "@" )
559	                        .replace( rvalidtokens, "]" )
560	                        .replace( rvalidbraces, "")) ) {
561	
562	                        return (new Function( "return " + data ))();
563	
564	                }
565	                jQuery.error( "Invalid JSON: " + data );
566	        },
567	
568	        // Cross-browser xml parsing
569	        // (xml & tmp used internally)
570	        parseXML: function( data , xml , tmp ) {
571	
572	                if ( window.DOMParser ) { // Standard
573	                        tmp = new DOMParser();
574	                        xml = tmp.parseFromString( data , "text/xml" );
575	                } else { // IE
576	                        xml = new ActiveXObject( "Microsoft.XMLDOM" );
577	                        xml.async = "false";
578	                        xml.loadXML( data );
579	                }
580	
581	                tmp = xml.documentElement;
582	
583	                if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) {
584	                        jQuery.error( "Invalid XML: " + data );
585	                }
586	
587	                return xml;
588	        },
589	
590	        noop: function() {},
591	
592	        // Evaluates a script in a global context
593	        // Workarounds based on findings by Jim Driscoll
594	        // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
595	        globalEval: function( data ) {
596	                if ( data && rnotwhite.test( data ) ) {
597	                        // We use execScript on Internet Explorer
598	                        // We use an anonymous function so that context is window
599	                        // rather than jQuery in Firefox
600	                        ( window.execScript || function( data ) {
601	                                window[ "eval" ].call( window, data );
602	                        } )( data );
603	                }
604	        },
605	
606	        nodeName: function( elem, name ) {
607	                return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
608	        },
609	
610	        // args is for internal usage only
611	        each: function( object, callback, args ) {
612	                var name, i = 0,
613	                        length = object.length,
614	                        isObj = length === undefined || jQuery.isFunction( object );
615	
616	                if ( args ) {
617	                        if ( isObj ) {
618	                                for ( name in object ) {
619	                                        if ( callback.apply( object[ name ], args ) === false ) {
620	                                                break;
621	                                        }
622	                                }
623	                        } else {
624	                                for ( ; i < length; ) {
625	                                        if ( callback.apply( object[ i++ ], args ) === false ) {
626	                                                break;
627	                                        }
628	                                }
629	                        }
630	
631	                // A special, fast, case for the most common use of each
632	                } else {
633	                        if ( isObj ) {
634	                                for ( name in object ) {
635	                                        if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
636	                                                break;
637	                                        }
638	                                }
639	                        } else {
640	                                for ( ; i < length; ) {
641	                                        if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
642	                                                break;
643	                                        }
644	                                }
645	                        }
646	                }
647	
648	                return object;
649	        },
650	
651	        // Use native String.trim function wherever possible
652	        trim: trim ?
653	                function( text ) {
654	                        return text == null ?
655	                                "" :
656	                                trim.call( text );
657	                } :
658	
659	                // Otherwise use our own trimming functionality
660	                function( text ) {
661	                        return text == null ?
662	                                "" :
663	                                text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
664	                },
665	
666	        // results is for internal usage only
667	        makeArray: function( array, results ) {
668	                var ret = results || [];
669	
670	                if ( array != null ) {
671	                        // The window, strings (and functions) also have 'length'
672	                        // The extra typeof function check is to prevent crashes
673	                        // in Safari 2 (See: #3039)
674	                        // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
675	                        var type = jQuery.type( array );
676	
677	                        if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
678	                                push.call( ret, array );
679	                        } else {
680	                                jQuery.merge( ret, array );
681	                        }
682	                }
683	
684	                return ret;
685	        },
686	
687	        inArray: function( elem, array ) {
688	
689	                if ( indexOf ) {
690	                        return indexOf.call( array, elem );
691	                }
692	
693	                for ( var i = 0, length = array.length; i < length; i++ ) {
694	                        if ( array[ i ] === elem ) {
695	                                return i;
696	                        }
697	                }
698	
699	                return -1;
700	        },
701	
702	        merge: function( first, second ) {
703	                var i = first.length,
704	                        j = 0;
705	
706	                if ( typeof second.length === "number" ) {
707	                        for ( var l = second.length; j < l; j++ ) {
708	                                first[ i++ ] = second[ j ];
709	                        }
710	
711	                } else {
712	                        while ( second[j] !== undefined ) {
713	                                first[ i++ ] = second[ j++ ];
714	                        }
715	                }
716	
717	                first.length = i;
718	
719	                return first;
720	        },
721	
722	        grep: function( elems, callback, inv ) {
723	                var ret = [], retVal;
724	                inv = !!inv;
725	
726	                // Go through the array, only saving the items
727	                // that pass the validator function
728	                for ( var i = 0, length = elems.length; i < length; i++ ) {
729	                        retVal = !!callback( elems[ i ], i );
730	                        if ( inv !== retVal ) {
731	                                ret.push( elems[ i ] );
732	                        }
733	                }
734	
735	                return ret;
736	        },
737	
738	        // arg is for internal usage only
739	        map: function( elems, callback, arg ) {
740	                var value, key, ret = [],
741	                        i = 0,
742	                        length = elems.length,
743	                        // jquery objects are treated as arrays
744	                        isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
745	
746	                // Go through the array, translating each of the items to their
747	                if ( isArray ) {
748	                        for ( ; i < length; i++ ) {
749	                                value = callback( elems[ i ], i, arg );
750	
751	                                if ( value != null ) {
752	                                        ret[ ret.length ] = value;
753	                                }
754	                        }
755	
756	                // Go through every key on the object,
757	                } else {
758	                        for ( key in elems ) {
759	                                value = callback( elems[ key ], key, arg );
760	
761	                                if ( value != null ) {
762	                                        ret[ ret.length ] = value;
763	                                }
764	                        }
765	                }
766	
767	                // Flatten any nested arrays
768	                return ret.concat.apply( [], ret );
769	        },
770	
771	        // A global GUID counter for objects
772	        guid: 1,
773	
774	        // Bind a function to a context, optionally partially applying any
775	        // arguments.
776	        proxy: function( fn, context ) {
777	                if ( typeof context === "string" ) {
778	                        var tmp = fn[ context ];
779	                        context = fn;
780	                        fn = tmp;
781	                }
782	
783	                // Quick check to determine if target is callable, in the spec
784	                // this throws a TypeError, but we will just return undefined.
785	                if ( !jQuery.isFunction( fn ) ) {
786	                        return undefined;
787	                }
788	
789	                // Simulated bind
790	                var args = slice.call( arguments, 2 ),
791	                        proxy = function() {
792	                                return fn.apply( context, args.concat( slice.call( arguments ) ) );
793	                        };
794	
795	                // Set the guid of unique handler to the same of original handler, so it can be removed
796	                proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
797	
798	                return proxy;
799	        },
800	
801	        // Mutifunctional method to get and set values to a collection
802	        // The value/s can be optionally by executed if its a function
803	        access: function( elems, key, value, exec, fn, pass ) {
804	                var length = elems.length;
805	
806	                // Setting many attributes
807	                if ( typeof key === "object" ) {
808	                        for ( var k in key ) {
809	                                jQuery.access( elems, k, key[k], exec, fn, value );
810	                        }
811	                        return elems;
812	                }
813	
814	                // Setting one attribute
815	                if ( value !== undefined ) {
816	                        // Optionally, function values get executed if exec is true
817	                        exec = !pass && exec && jQuery.isFunction(value);
818	
819	                        for ( var i = 0; i < length; i++ ) {
820	                                fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
821	                        }
822	
823	                        return elems;
824	                }
825	
826	                // Getting an attribute
827	                return length ? fn( elems[0], key ) : undefined;
828	        },
829	
830	        now: function() {
831	                return (new Date()).getTime();
832	        },
833	
834	        // Use of jQuery.browser is frowned upon.
835	        // More details: http://docs.jquery.com/Utilities/jQuery.browser
836	        uaMatch: function( ua ) {
837	                ua = ua.toLowerCase();
838	
839	                var match = rwebkit.exec( ua ) ||
840	                        ropera.exec( ua ) ||
841	                        rmsie.exec( ua ) ||
842	                        ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
843	                        [];
844	
845	                return { browser: match[1] || "", version: match[2] || "0" };
846	        },
847	
848	        sub: function() {
849	                function jQuerySub( selector, context ) {
850	                        return new jQuerySub.fn.init( selector, context );
851	                }
852	                jQuery.extend( true, jQuerySub, this );
853	                jQuerySub.superclass = this;
854	                jQuerySub.fn = jQuerySub.prototype = this();
855	                jQuerySub.fn.constructor = jQuerySub;
856	                jQuerySub.sub = this.sub;
857	                jQuerySub.fn.init = function init( selector, context ) {
858	                        if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
859	                                context = jQuerySub( context );
860	                        }
861	
862	                        return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
863	                };
864	                jQuerySub.fn.init.prototype = jQuerySub.fn;
865	                var rootjQuerySub = jQuerySub(document);
866	                return jQuerySub;
867	        },
868	
869	        browser: {}
870	});
871	
872	// Populate the class2type map
873	jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
874	        class2type[ "[object " + name + "]" ] = name.toLowerCase();
875	});
876	
877	browserMatch = jQuery.uaMatch( userAgent );
878	if ( browserMatch.browser ) {
879	        jQuery.browser[ browserMatch.browser ] = true;
880	        jQuery.browser.version = browserMatch.version;
881	}
882	
883	// Deprecated, use jQuery.browser.webkit instead
884	if ( jQuery.browser.webkit ) {
885	        jQuery.browser.safari = true;
886	}
887	
888	// IE doesn't match non-breaking spaces with \s
889	if ( rnotwhite.test( "\xA0" ) ) {
890	        trimLeft = /^[\s\xA0]+/;
891	        trimRight = /[\s\xA0]+$/;
892	}
893	
894	// All jQuery objects should point back to these
895	rootjQuery = jQuery(document);
896	
897	// Cleanup functions for the document ready method
898	if ( document.addEventListener ) {
899	        DOMContentLoaded = function() {
900	                document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
901	                jQuery.ready();
902	        };
903	
904	} else if ( document.attachEvent ) {
905	        DOMContentLoaded = function() {
906	                // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
907	                if ( document.readyState === "complete" ) {
908	                        document.detachEvent( "onreadystatechange", DOMContentLoaded );
909	                        jQuery.ready();
910	                }
911	        };
912	}
913	
914	// The DOM ready check for Internet Explorer
915	function doScrollCheck() {
916	        if ( jQuery.isReady ) {
917	                return;
918	        }
919	
920	        try {
921	                // If IE is used, use the trick by Diego Perini
922	                // http://javascript.nwbox.com/IEContentLoaded/
923	                document.documentElement.doScroll("left");
924	        } catch(e) {
925	                setTimeout( doScrollCheck, 1 );
926	                return;
927	        }
928	
929	        // and execute any waiting functions
930	        jQuery.ready();
931	}
932	
933	// Expose jQuery to the global object
934	return jQuery;
935	
936	})();
937	
938	
939	var // Promise methods
940	        promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ),
941	        // Static reference to slice
942	        sliceDeferred = [].slice;
943	
944	jQuery.extend({
945	        // Create a simple deferred (one callbacks list)
946	        _Deferred: function() {
947	                var // callbacks list
948	                        callbacks = [],
949	                        // stored [ context , args ]
950	                        fired,
951	                        // to avoid firing when already doing so
952	                        firing,
953	                        // flag to know if the deferred has been cancelled
954	                        cancelled,
955	                        // the deferred itself
956	                        deferred  = {
957	
958	                                // done( f1, f2, ...)
959	                                done: function() {
960	                                        if ( !cancelled ) {
961	                                                var args = arguments,
962	                                                        i,
963	                                                        length,
964	                                                        elem,
965	                                                        type,
966	                                                        _fired;
967	                                                if ( fired ) {
968	                                                        _fired = fired;
969	                                                        fired = 0;
970	                                                }
971	                                                for ( i = 0, length = args.length; i < length; i++ ) {
972	                                                        elem = args[ i ];
973	                                                        type = jQuery.type( elem );
974	                                                        if ( type === "array" ) {
975	                                                                deferred.done.apply( deferred, elem );
976	                                                        } else if ( type === "function" ) {
977	                                                                callbacks.push( elem );
978	                                                        }
979	                                                }
980	                                                if ( _fired ) {
981	                                                        deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
982	                                                }
983	                                        }
984	                                        return this;
985	                                },
986	
987	                                // resolve with given context and args
988	                                resolveWith: function( context, args ) {
989	                                        if ( !cancelled && !fired && !firing ) {
990	                                                // make sure args are available (#8421)
991	                                                args = args || [];
992	                                                firing = 1;
993	                                                try {
994	                                                        while( callbacks[ 0 ] ) {
995	                                                                callbacks.shift().apply( context, args );
996	                                                        }
997	                                                }
998	                                                finally {
999	                                                        fired = [ context, args ];
1000	                                                        firing = 0;
1001	                                                }
1002	                                        }
1003	                                        return this;
1004	                                },
1005	
1006	                                // resolve with this as context and given arguments
1007	                                resolve: function() {
1008	                                        deferred.resolveWith( this, arguments );
1009	                                        return this;
1010	                                },
1011	
1012	                                // Has this deferred been resolved?
1013	                                isResolved: function() {
1014	                                        return !!( firing || fired );
1015	                                },
1016	
1017	                                // Cancel
1018	                                cancel: function() {
1019	                                        cancelled = 1;
1020	                                        callbacks = [];
1021	                                        return this;
1022	                                }
1023	                        };
1024	
1025	                return deferred;
1026	        },
1027	
1028	        // Full fledged deferred (two callbacks list)
1029	        Deferred: function( func ) {
1030	                var deferred = jQuery._Deferred(),
1031	                        failDeferred = jQuery._Deferred(),
1032	                        promise;
1033	                // Add errorDeferred methods, then and promise
1034	                jQuery.extend( deferred, {
1035	                        then: function( doneCallbacks, failCallbacks ) {
1036	                                deferred.done( doneCallbacks ).fail( failCallbacks );
1037	                                return this;
1038	                        },
1039	                        always: function() {
1040	                                return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments );
1041	                        },
1042	                        fail: failDeferred.done,
1043	                        rejectWith: failDeferred.resolveWith,
1044	                        reject: failDeferred.resolve,
1045	                        isRejected: failDeferred.isResolved,
1046	                        pipe: function( fnDone, fnFail ) {
1047	                                return jQuery.Deferred(function( newDefer ) {
1048	                                        jQuery.each( {
1049	                                                done: [ fnDone, "resolve" ],
1050	                                                fail: [ fnFail, "reject" ]
1051	                                        }, function( handler, data ) {
1052	                                                var fn = data[ 0 ],
1053	                                                        action = data[ 1 ],
1054	                                                        returned;
1055	                                                if ( jQuery.isFunction( fn ) ) {
1056	                                                        deferred[ handler ](function() {
1057	                                                                returned = fn.apply( this, arguments );
1058	                                                                if ( returned && jQuery.isFunction( returned.promise ) ) {
1059	                                                                        returned.promise().then( newDefer.resolve, newDefer.reject );
1060	                                                                } else {
1061	                                                                        newDefer[ action ]( returned );
1062	                                                                }
1063	                                                        });
1064	                                                } else {
1065	                                                        deferred[ handler ]( newDefer[ action ] );
1066	                                                }
1067	                                        });
1068	                                }).promise();
1069	                        },
1070	                        // Get a promise for this deferred
1071	                        // If obj is provided, the promise aspect is added to the object
1072	                        promise: function( obj ) {
1073	                                if ( obj == null ) {
1074	                                        if ( promise ) {
1075	                                                return promise;
1076	                                        }
1077	                                        promise = obj = {};
1078	                                }
1079	                                var i = promiseMethods.length;
1080	                                while( i-- ) {
1081	                                        obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
1082	                                }
1083	                                return obj;
1084	                        }
1085	                });
1086	                // Make sure only one callback list will be used
1087	                deferred.done( failDeferred.cancel ).fail( deferred.cancel );
1088	                // Unexpose cancel
1089	                delete deferred.cancel;
1090	                // Call given func if any
1091	                if ( func ) {
1092	                        func.call( deferred, deferred );
1093	                }
1094	                return deferred;
1095	        },
1096	
1097	        // Deferred helper
1098	        when: function( firstParam ) {
1099	                var args = arguments,
1100	                        i = 0,
1101	                        length = args.length,
1102	                        count = length,
1103	                        deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
1104	                                firstParam :
1105	                                jQuery.Deferred();
1106	                function resolveFunc( i ) {
1107	                        return function( value ) {
1108	                                args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
1109	                                if ( !( --count ) ) {
1110	                                        // Strange bug in FF4:
1111	                                        // Values changed onto the arguments object sometimes end up as undefined values
1112	                                        // outside the $.when method. Cloning the object into a fresh array solves the issue
1113	                                        deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) );
1114	                                }
1115	                        };
1116	                }
1117	                if ( length > 1 ) {
1118	                        for( ; i < length; i++ ) {
1119	                                if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) {
1120	                                        args[ i ].promise().then( resolveFunc(i), deferred.reject );
1121	                                } else {
1122	                                        --count;
1123	                                }
1124	                        }
1125	                        if ( !count ) {
1126	                                deferred.resolveWith( deferred, args );
1127	                        }
1128	                } else if ( deferred !== firstParam ) {
1129	                        deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
1130	                }
1131	                return deferred.promise();
1132	        }
1133	});
1134	
1135	
1136	
1137	jQuery.support = (function() {
1138	
1139	        var div = document.createElement( "div" ),
1140	                documentElement = document.documentElement,
1141	                all,
1142	                a,
1143	                select,
1144	                opt,
1145	                input,
1146	                marginDiv,
1147	                support,
1148	                fragment,
1149	                body,
1150	                bodyStyle,
1151	                tds,
1152	                events,
1153	                eventName,
1154	                i,
1155	                isSupported;
1156	
1157	        // Preliminary tests
1158	        div.setAttribute("className", "t");
1159	        div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
1160	
1161	        all = div.getElementsByTagName( "*" );
1162	        a = div.getElementsByTagName( "a" )[ 0 ];
1163	
1164	        // Can't get basic test support
1165	        if ( !all || !all.length || !a ) {
1166	                return {};
1167	        }
1168	
1169	        // First batch of supports tests
1170	        select = document.createElement( "select" );
1171	        opt = select.appendChild( document.createElement("option") );
1172	        input = div.getElementsByTagName( "input" )[ 0 ];
1173	
1174	        support = {
1175	                // IE strips leading whitespace when .innerHTML is used
1176	                leadingWhitespace: ( div.firstChild.nodeType === 3 ),
1177	
1178	                // Make sure that tbody elements aren't automatically inserted
1179	                // IE will insert them into empty tables
1180	                tbody: !div.getElementsByTagName( "tbody" ).length,
1181	
1182	                // Make sure that link elements get serialized correctly by innerHTML
1183	                // This requires a wrapper element in IE
1184	                htmlSerialize: !!div.getElementsByTagName( "link" ).length,
1185	
1186	                // Get the style information from getAttribute
1187	                // (IE uses .cssText instead)
1188	                style: /top/.test( a.getAttribute("style") ),
1189	
1190	                // Make sure that URLs aren't manipulated
1191	                // (IE normalizes it by default)
1192	                hrefNormalized: ( a.getAttribute( "href" ) === "/a" ),
1193	
1194	                // Make sure that element opacity exists
1195	                // (IE uses filter instead)
1196	                // Use a regex to work around a WebKit issue. See #5145
1197	                opacity: /^0.55$/.test( a.style.opacity ),
1198	
1199	                // Verify style float existence
1200	                // (IE uses styleFloat instead of cssFloat)
1201	                cssFloat: !!a.style.cssFloat,
1202	
1203	                // Make sure that if no value is specified for a checkbox
1204	                // that it defaults to "on".
1205	                // (WebKit defaults to "" instead)
1206	                checkOn: ( input.value === "on" ),
1207	
1208	                // Make sure that a selected-by-default option has a working selected property.
1209	                // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
1210	                optSelected: opt.selected,
1211	
1212	                // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
1213	                getSetAttribute: div.className !== "t",
1214	
1215	                // Will be defined later
1216	                submitBubbles: true,
1217	                changeBubbles: true,
1218	                focusinBubbles: false,
1219	                deleteExpando: true,
1220	                noCloneEvent: true,
1221	                inlineBlockNeedsLayout: false,
1222	                shrinkWrapBlocks: false,
1223	                reliableMarginRight: true
1224	        };
1225	
1226	        // Make sure checked status is properly cloned
1227	        input.checked = true;
1228	        support.noCloneChecked = input.cloneNode( true ).checked;
1229	
1230	        // Make sure that the options inside disabled selects aren't marked as disabled
1231	        // (WebKit marks them as disabled)
1232	        select.disabled = true;
1233	        support.optDisabled = !opt.disabled;
1234	
1235	        // Test to see if it's possible to delete an expando from an element
1236	        // Fails in Internet Explorer
1237	        try {
1238	                delete div.test;
1239	        } catch( e ) {
1240	                support.deleteExpando = false;
1241	        }
1242	
1243	        if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
1244	                div.attachEvent( "onclick", function click() {
1245	                        // Cloning a node shouldn't copy over any
1246	                        // bound event handlers (IE does this)
1247	                        support.noCloneEvent = false;
1248	                        div.detachEvent( "onclick", click );
1249	                });
1250	                div.cloneNode( true ).fireEvent( "onclick" );
1251	        }
1252	
1253	        // Check if a radio maintains it's value
1254	        // after being appended to the DOM
1255	        input = document.createElement("input");
1256	        input.value = "t";
1257	        input.setAttribute("type", "radio");
1258	        support.radioValue = input.value === "t";
1259	
1260	        input.setAttribute("checked", "checked");
1261	        div.appendChild( input );
1262	        fragment = document.createDocumentFragment();
1263	        fragment.appendChild( div.firstChild );
1264	
1265	        // WebKit doesn't clone checked state correctly in fragments
1266	        support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
1267	
1268	        div.innerHTML = "";
1269	
1270	        // Figure out if the W3C box model works as expected
1271	        div.style.width = div.style.paddingLeft = "1px";
1272	
1273	        // We use our own, invisible, body
1274	        body = document.createElement( "body" );
1275	        bodyStyle = {
1276	                visibility: "hidden",
1277	                width: 0,
1278	                height: 0,
1279	                border: 0,
1280	                margin: 0,
1281	                // Set background to avoid IE crashes when removing (#9028)
1282	                background: "none"
1283	        };
1284	        for ( i in bodyStyle ) {
1285	                body.style[ i ] = bodyStyle[ i ];
1286	        }
1287	        body.appendChild( div );
1288	        documentElement.insertBefore( body, documentElement.firstChild );
1289	
1290	        // Check if a disconnected checkbox will retain its checked
1291	        // value of true after appended to the DOM (IE6/7)
1292	        support.appendChecked = input.checked;
1293	
1294	        support.boxModel = div.offsetWidth === 2;
1295	
1296	        if ( "zoom" in div.style ) {
1297	                // Check if natively block-level elements act like inline-block
1298	                // elements when setting their display to 'inline' and giving
1299	                // them layout
1300	                // (IE < 8 does this)
1301	                div.style.display = "inline";
1302	                div.style.zoom = 1;
1303	                support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
1304	
1305	                // Check if elements with layout shrink-wrap their children
1306	                // (IE 6 does this)
1307	                div.style.display = "";
1308	                div.innerHTML = "<div style='width:4px;'></div>";
1309	                support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
1310	        }
1311	
1312	        div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
1313	        tds = div.getElementsByTagName( "td" );
1314	
1315	        // Check if table cells still have offsetWidth/Height when they are set
1316	        // to display:none and there are still other visible table cells in a
1317	        // table row; if so, offsetWidth/Height are not reliable for use when
1318	        // determining if an element has been hidden directly using
1319	        // display:none (it is still safe to use offsets if a parent element is
1320	        // hidden; don safety goggles and see bug #4512 for more information).
1321	        // (only IE 8 fails this test)
1322	        isSupported = ( tds[ 0 ].offsetHeight === 0 );
1323	
1324	        tds[ 0 ].style.display = "";
1325	        tds[ 1 ].style.display = "none";
1326	
1327	        // Check if empty table cells still have offsetWidth/Height
1328	        // (IE < 8 fail this test)
1329	        support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
1330	        div.innerHTML = "";
1331	
1332	        // Check if div with explicit width and no margin-right incorrectly
1333	        // gets computed margin-right based on width of container. For more
1334	        // info see bug #3333
1335	        // Fails in WebKit before Feb 2011 nightlies
1336	        // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
1337	        if ( document.defaultView && document.defaultView.getComputedStyle ) {
1338	                marginDiv = document.createElement( "div" );
1339	                marginDiv.style.width = "0";
1340	                marginDiv.style.marginRight = "0";
1341	                div.appendChild( marginDiv );
1342	                support.reliableMarginRight =
1343	                        ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
1344	        }
1345	
1346	        // Remove the body element we added
1347	        body.innerHTML = "";
1348	        documentElement.removeChild( body );
1349	
1350	        // Technique from Juriy Zaytsev
1351	        // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
1352	        // We only care about the case where non-standard event systems
1353	        // are used, namely in IE. Short-circuiting here helps us to
1354	        // avoid an eval call (in setAttribute) which can cause CSP
1355	        // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
1356	        if ( div.attachEvent ) {
1357	                for( i in {
1358	                        submit: 1,
1359	                        change: 1,
1360	                        focusin: 1
1361	                } ) {
1362	                        eventName = "on" + i;
1363	                        isSupported = ( eventName in div );
1364	                        if ( !isSupported ) {
1365	                                div.setAttribute( eventName, "return;" );
1366	                                isSupported = ( typeof div[ eventName ] === "function" );
1367	                        }
1368	                        support[ i + "Bubbles" ] = isSupported;
1369	                }
1370	        }
1371	
1372	        return support;
1373	})();
1374	
1375	// Keep track of boxModel
1376	jQuery.boxModel = jQuery.support.boxModel;
1377	
1378	
1379	
1380	
1381	var rbrace = /^(?:\{.*\}|\[.*\])$/,
1382	        rmultiDash = /([a-z])([A-Z])/g;
1383	
1384	jQuery.extend({
1385	        cache: {},
1386	
1387	        // Please use with caution
1388	        uuid: 0,
1389	
1390	        // Unique for each copy of jQuery on the page
1391	        // Non-digits removed to match rinlinejQuery
1392	        expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
1393	
1394	        // The following elements throw uncatchable exceptions if you
1395	        // attempt to add expando properties to them.
1396	        noData: {
1397	                "embed": true,
1398	                // Ban all objects except for Flash (which handle expandos)
1399	                "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
1400	                "applet": true
1401	        },
1402	
1403	        hasData: function( elem ) {
1404	                elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
1405	
1406	                return !!elem && !isEmptyDataObject( elem );
1407	        },
1408	
1409	        data: function( elem, name, data, pvt /* Internal Use Only */ ) {
1410	                if ( !jQuery.acceptData( elem ) ) {
1411	                        return;
1412	                }
1413	
1414	                var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache,
1415	
1416	                        // We have to handle DOM nodes and JS objects differently because IE6-7
1417	                        // can't GC object references properly across the DOM-JS boundary
1418	                        isNode = elem.nodeType,
1419	
1420	                        // Only DOM nodes need the global jQuery cache; JS object data is
1421	                        // attached directly to the object so GC can occur automatically
1422	                        cache = isNode ? jQuery.cache : elem,
1423	
1424	                        // Only defining an ID for JS objects if its cache already exists allows
1425	                        // the code to shortcut on the same path as a DOM node with no cache
1426	                        id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
1427	
1428	                // Avoid doing any more work than we need to when trying to get data on an
1429	                // object that has no data at all
1430	                if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) {
1431	                        return;
1432	                }
1433	
1434	                if ( !id ) {
1435	                        // Only DOM nodes need a new unique ID for each element since their data
1436	                        // ends up in the global cache
1437	                        if ( isNode ) {
1438	                                elem[ jQuery.expando ] = id = ++jQuery.uuid;
1439	                        } else {
1440	                                id = jQuery.expando;
1441	                        }
1442	                }
1443	
1444	                if ( !cache[ id ] ) {
1445	                        cache[ id ] = {};
1446	
1447	                        // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
1448	                        // metadata on plain JS objects when the object is serialized using
1449	                        // JSON.stringify
1450	                        if ( !isNode ) {
1451	                                cache[ id ].toJSON = jQuery.noop;
1452	                        }
1453	                }
1454	
1455	                // An object can be passed to jQuery.data instead of a key/value pair; this gets
1456	                // shallow copied over onto the existing cache
1457	                if ( typeof name === "object" || typeof name === "function" ) {
1458	                        if ( pvt ) {
1459	                                cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
1460	                        } else {
1461	                                cache[ id ] = jQuery.extend(cache[ id ], name);
1462	                        }
1463	                }
1464	
1465	                thisCache = cache[ id ];
1466	
1467	                // Internal jQuery data is stored in a separate object inside the object's data
1468	                // cache in order to avoid key collisions between internal data and user-defined
1469	                // data
1470	                if ( pvt ) {
1471	                        if ( !thisCache[ internalKey ] ) {
1472	                                thisCache[ internalKey ] = {};
1473	                        }
1474	
1475	                        thisCache = thisCache[ internalKey ];
1476	                }
1477	
1478	                if ( data !== undefined ) {
1479	                        thisCache[ jQuery.camelCase( name ) ] = data;
1480	                }
1481	
1482	                // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
1483	                // not attempt to inspect the internal events object using jQuery.data, as this
1484	                // internal data object is undocumented and subject to change.
1485	                if ( name === "events" && !thisCache[name] ) {
1486	                        return thisCache[ internalKey ] && thisCache[ internalKey ].events;
1487	                }
1488	
1489	                return getByName ? thisCache[ jQuery.camelCase( name ) ] : thisCache;
1490	        },
1491	
1492	        removeData: function( elem, name, pvt /* Internal Use Only */ ) {
1493	                if ( !jQuery.acceptData( elem ) ) {
1494	                        return;
1495	                }
1496	
1497	                var internalKey = jQuery.expando, isNode = elem.nodeType,
1498	
1499	                        // See jQuery.data for more information
1500	                        cache = isNode ? jQuery.cache : elem,
1501	
1502	                        // See jQuery.data for more information
1503	                        id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
1504	
1505	                // If there is already no cache entry for this object, there is no
1506	                // purpose in continuing
1507	                if ( !cache[ id ] ) {
1508	                        return;
1509	                }
1510	
1511	                if ( name ) {
1512	                        var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
1513	
1514	                        if ( thisCache ) {
1515	                                delete thisCache[ name ];
1516	
1517	                                // If there is no data left in the cache, we want to continue
1518	                                // and let the cache object itself get destroyed
1519	                                if ( !isEmptyDataObject(thisCache) ) {
1520	                                        return;
1521	                                }
1522	                        }
1523	                }
1524	
1525	                // See jQuery.data for more information
1526	                if ( pvt ) {
1527	                        delete cache[ id ][ internalKey ];
1528	
1529	                        // Don't destroy the parent cache unless the internal data object
1530	                        // had been the only thing left in it
1531	                        if ( !isEmptyDataObject(cache[ id ]) ) {
1532	                                return;
1533	                        }
1534	                }
1535	
1536	                var internalCache = cache[ id ][ internalKey ];
1537	
1538	                // Browsers that fail expando deletion also refuse to delete expandos on
1539	                // the window, but it will allow it on all other JS objects; other browsers
1540	                // don't care
1541	                if ( jQuery.support.deleteExpando || cache != window ) {
1542	                        delete cache[ id ];
1543	                } else {
1544	                        cache[ id ] = null;
1545	                }
1546	
1547	                // We destroyed the entire user cache at once because it's faster than
1548	                // iterating through each key, but we need to continue to persist internal
1549	                // data if it existed
1550	                if ( internalCache ) {
1551	                        cache[ id ] = {};
1552	                        // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
1553	                        // metadata on plain JS objects when the object is serialized using
1554	                        // JSON.stringify
1555	                        if ( !isNode ) {
1556	                                cache[ id ].toJSON = jQuery.noop;
1557	                        }
1558	
1559	                        cache[ id ][ internalKey ] = internalCache;
1560	
1561	                // Otherwise, we need to eliminate the expando on the node to avoid
1562	                // false lookups in the cache for entries that no longer exist
1563	                } else if ( isNode ) {
1564	                        // IE does not allow us to delete expando properties from nodes,
1565	                        // nor does it have a removeAttribute function on Document nodes;
1566	                        // we must handle all of these cases
1567	                        if ( jQuery.support.deleteExpando ) {
1568	                                delete elem[ jQuery.expando ];
1569	                        } else if ( elem.removeAttribute ) {
1570	                                elem.removeAttribute( jQuery.expando );
1571	                        } else {
1572	                                elem[ jQuery.expando ] = null;
1573	                        }
1574	                }
1575	        },
1576	
1577	        // For internal use only.
1578	        _data: function( elem, name, data ) {
1579	                return jQuery.data( elem, name, data, true );
1580	        },
1581	
1582	        // A method for determining if a DOM node can handle the data expando
1583	        acceptData: function( elem ) {
1584	                if ( elem.nodeName ) {
1585	                        var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
1586	
1587	                        if ( match ) {
1588	                                return !(match === true || elem.getAttribute("classid") !== match);
1589	                        }
1590	                }
1591	
1592	                return true;
1593	        }
1594	});
1595	
1596	jQuery.fn.extend({
1597	        data: function( key, value ) {
1598	                var data = null;
1599	
1600	                if ( typeof key === "undefined" ) {
1601	                        if ( this.length ) {
1602	                                data = jQuery.data( this[0] );
1603	
1604	                                if ( this[0].nodeType === 1 ) {
1605	                            var attr = this[0].attributes, name;
1606	                                        for ( var i = 0, l = attr.length; i < l; i++ ) {
1607	                                                name = attr[i].name;
1608	
1609	                                                if ( name.indexOf( "data-" ) === 0 ) {
1610	                                                        name = jQuery.camelCase( name.substring(5) );
1611	
1612	                                                        dataAttr( this[0], name, data[ name ] );
1613	                                                }
1614	                                        }
1615	                                }
1616	                        }
1617	
1618	                        return data;
1619	
1620	                } else if ( typeof key === "object" ) {
1621	                        return this.each(function() {
1622	                                jQuery.data( this, key );
1623	                        });
1624	                }
1625	
1626	                var parts = key.split(".");
1627	                parts[1] = parts[1] ? "." + parts[1] : "";
1628	
1629	                if ( value === undefined ) {
1630	                        data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1631	
1632	                        // Try to fetch any internally stored data first
1633	                        if ( data === undefined && this.length ) {
1634	                                data = jQuery.data( this[0], key );
1635	                                data = dataAttr( this[0], key, data );
1636	                        }
1637	
1638	                        return data === undefined && parts[1] ?
1639	                                this.data( parts[0] ) :
1640	                                data;
1641	
1642	                } else {
1643	                        return this.each(function() {
1644	                                var $this = jQuery( this ),
1645	                                        args = [ parts[0], value ];
1646	
1647	                                $this.triggerHandler( "setData" + parts[1] + "!", args );
1648	                                jQuery.data( this, key, value );
1649	                                $this.triggerHandler( "changeData" + parts[1] + "!", args );
1650	                        });
1651	                }
1652	        },
1653	
1654	        removeData: function( key ) {
1655	                return this.each(function() {
1656	                        jQuery.removeData( this, key );
1657	                });
1658	        }
1659	});
1660	
1661	function dataAttr( elem, key, data ) {
1662	        // If nothing was found internally, try to fetch any
1663	        // data from the HTML5 data-* attribute
1664	        if ( data === undefined && elem.nodeType === 1 ) {
1665	                var name = "data-" + key.replace( rmultiDash, "$1-$2" ).toLowerCase();
1666	
1667	                data = elem.getAttribute( name );
1668	
1669	                if ( typeof data === "string" ) {
1670	                        try {
1671	                                data = data === "true" ? true :
1672	                                data === "false" ? false :
1673	                                data === "null" ? null :
1674	                                !jQuery.isNaN( data ) ? parseFloat( data ) :
1675	                                        rbrace.test( data ) ? jQuery.parseJSON( data ) :
1676	                                        data;
1677	                        } catch( e ) {}
1678	
1679	                        // Make sure we set the data so it isn't changed later
1680	                        jQuery.data( elem, key, data );
1681	
1682	                } else {
1683	                        data = undefined;
1684	                }
1685	        }
1686	
1687	        return data;
1688	}
1689	
1690	// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
1691	// property to be considered empty objects; this property always exists in
1692	// order to make sure JSON.stringify does not expose internal metadata
1693	function isEmptyDataObject( obj ) {
1694	        for ( var name in obj ) {
1695	                if ( name !== "toJSON" ) {
1696	                        return false;
1697	                }
1698	        }
1699	
1700	        return true;
1701	}
1702	
1703	
1704	
1705	
1706	function handleQueueMarkDefer( elem, type, src ) {
1707	        var deferDataKey = type + "defer",
1708	                queueDataKey = type + "queue",
1709	                markDataKey = type + "mark",
1710	                defer = jQuery.data( elem, deferDataKey, undefined, true );
1711	        if ( defer &&
1712	                ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) &&
1713	                ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) {
1714	                // Give room for hard-coded callbacks to fire first
1715	                // and eventually mark/queue something else on the element
1716	                setTimeout( function() {
1717	                        if ( !jQuery.data( elem, queueDataKey, undefined, true ) &&
1718	                                !jQuery.data( elem, markDataKey, undefined, true ) ) {
1719	                                jQuery.removeData( elem, deferDataKey, true );
1720	                                defer.resolve();
1721	                        }
1722	                }, 0 );
1723	        }
1724	}
1725	
1726	jQuery.extend({
1727	
1728	        _mark: function( elem, type ) {
1729	                if ( elem ) {
1730	                        type = (type || "fx") + "mark";
1731	                        jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true );
1732	                }
1733	        },
1734	
1735	        _unmark: function( force, elem, type ) {
1736	                if ( force !== true ) {
1737	                        type = elem;
1738	                        elem = force;
1739	                        force = false;
1740	                }
1741	                if ( elem ) {
1742	                        type = type || "fx";
1743	                        var key = type + "mark",
1744	                                count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 );
1745	                        if ( count ) {
1746	                                jQuery.data( elem, key, count, true );
1747	                        } else {
1748	                                jQuery.removeData( elem, key, true );
1749	                                handleQueueMarkDefer( elem, type, "mark" );
1750	                        }
1751	                }
1752	        },
1753	
1754	        queue: function( elem, type, data ) {
1755	                if ( elem ) {
1756	                        type = (type || "fx") + "queue";
1757	                        var q = jQuery.data( elem, type, undefined, true );
1758	                        // Speed up dequeue by getting out quickly if this is just a lookup
1759	                        if ( data ) {
1760	                                if ( !q || jQuery.isArray(data) ) {
1761	                                        q = jQuery.data( elem, type, jQuery.makeArray(data), true );
1762	                                } else {
1763	                                        q.push( data );
1764	                                }
1765	                        }
1766	                        return q || [];
1767	                }
1768	        },
1769	
1770	        dequeue: function( elem, type ) {
1771	                type = type || "fx";
1772	
1773	                var queue = jQuery.queue( elem, type ),
1774	                        fn = queue.shift(),
1775	                        defer;
1776	
1777	                // If the fx queue is dequeued, always remove the progress sentinel
1778	                if ( fn === "inprogress" ) {
1779	                        fn = queue.shift();
1780	                }
1781	
1782	                if ( fn ) {
1783	                        // Add a progress sentinel to prevent the fx queue from being
1784	                        // automatically dequeued
1785	                        if ( type === "fx" ) {
1786	                                queue.unshift("inprogress");
1787	                        }
1788	
1789	                        fn.call(elem, function() {
1790	                                jQuery.dequeue(elem, type);
1791	                        });
1792	                }
1793	
1794	                if ( !queue.length ) {
1795	                        jQuery.removeData( elem, type + "queue", true );
1796	                        handleQueueMarkDefer( elem, type, "queue" );
1797	                }
1798	        }
1799	});
1800	
1801	jQuery.fn.extend({
1802	        queue: function( type, data ) {
1803	                if ( typeof type !== "string" ) {
1804	                        data = type;
1805	                        type = "fx";
1806	                }
1807	
1808	                if ( data === undefined ) {
1809	                        return jQuery.queue( this[0], type );
1810	                }
1811	                return this.each(function() {
1812	                        var queue = jQuery.queue( this, type, data );
1813	
1814	                        if ( type === "fx" && queue[0] !== "inprogress" ) {
1815	                                jQuery.dequeue( this, type );
1816	                        }
1817	                });
1818	        },
1819	        dequeue: function( type ) {
1820	                return this.each(function() {
1821	                        jQuery.dequeue( this, type );
1822	                });
1823	        },
1824	        // Based off of the plugin by Clint Helfers, with permission.
1825	        // http://blindsignals.com/index.php/2009/07/jquery-delay/
1826	        delay: function( time, type ) {
1827	                time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
1828	                type = type || "fx";
1829	
1830	                return this.queue( type, function() {
1831	                        var elem = this;
1832	                        setTimeout(function() {
1833	                                jQuery.dequeue( elem, type );
1834	                        }, time );
1835	                });
1836	        },
1837	        clearQueue: function( type ) {
1838	                return this.queue( type || "fx", [] );
1839	        },
1840	        // Get a promise resolved when queues of a certain type
1841	        // are emptied (fx is the type by default)
1842	        promise: function( type, object ) {
1843	                if ( typeof type !== "string" ) {
1844	                        object = type;
1845	                        type = undefined;
1846	                }
1847	                type = type || "fx";
1848	                var defer = jQuery.Deferred(),
1849	                        elements = this,
1850	                        i = elements.length,
1851	                        count = 1,
1852	                        deferDataKey = type + "defer",
1853	                        queueDataKey = type + "queue",
1854	                        markDataKey = type + "mark",
1855	                        tmp;
1856	                function resolve() {
1857	                        if ( !( --count ) ) {
1858	                                defer.resolveWith( elements, [ elements ] );
1859	                        }
1860	                }
1861	                while( i-- ) {
1862	                        if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
1863	                                        ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
1864	                                                jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
1865	                                        jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) {
1866	                                count++;
1867	                                tmp.done( resolve );
1868	                        }
1869	                }
1870	                resolve();
1871	                return defer.promise();
1872	        }
1873	});
1874	
1875	
1876	
1877	
1878	var rclass = /[\n\t\r]/g,
1879	        rspace = /\s+/,
1880	        rreturn = /\r/g,
1881	        rtype = /^(?:button|input)$/i,
1882	        rfocusable = /^(?:button|input|object|select|textarea)$/i,
1883	        rclickable = /^a(?:rea)?$/i,
1884	        rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
1885	        rinvalidChar = /\:/,
1886	        formHook, boolHook;
1887	
1888	jQuery.fn.extend({
1889	        attr: function( name, value ) {
1890	                return jQuery.access( this, name, value, true, jQuery.attr );
1891	        },
1892	
1893	        removeAttr: function( name ) {
1894	                return this.each(function() {
1895	                        jQuery.removeAttr( this, name );
1896	                });
1897	        },
1898	       
1899	        prop: function( name, value ) {
1900	                return jQuery.access( this, name, value, true, jQuery.prop );
1901	        },
1902	       
1903	        removeProp: function( name ) {
1904	                name = jQuery.propFix[ name ] || name;
1905	                return this.each(function() {
1906	                        // try/catch handles cases where IE balks (such as removing a property on window)
1907	                        try {
1908	                                this[ name ] = undefined;
1909	                                delete this[ name ];
1910	                        } catch( e ) {}
1911	                });
1912	        },
1913	
1914	        addClass: function( value ) {
1915	                if ( jQuery.isFunction( value ) ) {
1916	                        return this.each(function(i) {
1917	                                var self = jQuery(this);
1918	                                self.addClass( value.call(this, i, self.attr("class") || "") );
1919	                        });
1920	                }
1921	
1922	                if ( value && typeof value === "string" ) {
1923	                        var classNames = (value || "").split( rspace );
1924	
1925	                        for ( var i = 0, l = this.length; i < l; i++ ) {
1926	                                var elem = this[i];
1927	
1928	                                if ( elem.nodeType === 1 ) {
1929	                                        if ( !elem.className ) {
1930	                                                elem.className = value;
1931	
1932	                                        } else {
1933	                                                var className = " " + elem.className + " ",
1934	                                                        setClass = elem.className;
1935	
1936	                                                for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
1937	                                                        if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
1938	                                                                setClass += " " + classNames[c];
1939	                                                        }
1940	                                                }
1941	                                                elem.className = jQuery.trim( setClass );
1942	                                        }
1943	                                }
1944	                        }
1945	                }
1946	
1947	                return this;
1948	        },
1949	
1950	        removeClass: function( value ) {
1951	                if ( jQuery.isFunction(value) ) {
1952	                        return this.each(function(i) {
1953	                                var self = jQuery(this);
1954	                                self.removeClass( value.call(this, i, self.attr("class")) );
1955	                        });
1956	                }
1957	
1958	                if ( (value && typeof value === "string") || value === undefined ) {
1959	                        var classNames = (value || "").split( rspace );
1960	
1961	                        for ( var i = 0, l = this.length; i < l; i++ ) {
1962	                                var elem = this[i];
1963	
1964	                                if ( elem.nodeType === 1 && elem.className ) {
1965	                                        if ( value ) {
1966	                                                var className = (" " + elem.className + " ").replace(rclass, " ");
1967	                                                for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
1968	                                                        className = className.replace(" " + classNames[c] + " ", " ");
1969	                                                }
1970	                                                elem.className = jQuery.trim( className );
1971	
1972	                                        } else {
1973	                                                elem.className = "";
1974	                                        }
1975	                                }
1976	                        }
1977	                }
1978	
1979	                return this;
1980	        },
1981	
1982	        toggleClass: function( value, stateVal ) {
1983	                var type = typeof value,
1984	                        isBool = typeof stateVal === "boolean";
1985	
1986	                if ( jQuery.isFunction( value ) ) {
1987	                        return this.each(function(i) {
1988	                                var self = jQuery(this);
1989	                                self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
1990	                        });
1991	                }
1992	
1993	                return this.each(function() {
1994	                        if ( type === "string" ) {
1995	                                // toggle individual class names
1996	                                var className,
1997	                                        i = 0,
1998	                                        self = jQuery( this ),
1999	                                        state = stateVal,
2000	                                        classNames = value.split( rspace );
2001	
2002	                                while ( (className = classNames[ i++ ]) ) {
2003	                                        // check each className given, space seperated list
2004	                                        state = isBool ? state : !self.hasClass( className );
2005	                                        self[ state ? "addClass" : "removeClass" ]( className );
2006	                                }
2007	
2008	                        } else if ( type === "undefined" || type === "boolean" ) {
2009	                                if ( this.className ) {
2010	                                        // store className if set
2011	                                        jQuery._data( this, "__className__", this.className );
2012	                                }
2013	
2014	                                // toggle whole className
2015	                                this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
2016	                        }
2017	                });
2018	        },
2019	
2020	        hasClass: function( selector ) {
2021	                var className = " " + selector + " ";
2022	                for ( var i = 0, l = this.length; i < l; i++ ) {
2023	                        if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
2024	                                return true;
2025	                        }
2026	                }
2027	
2028	                return false;
2029	        },
2030	
2031	        val: function( value ) {
2032	                var hooks, ret,
2033	                        elem = this[0];
2034	               
2035	                if ( !arguments.length ) {
2036	                        if ( elem ) {
2037	                                hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
2038	
2039	                                if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
2040	                                        return ret;
2041	                                }
2042	
2043	                                return (elem.value || "").replace(rreturn, "");
2044	                        }
2045	
2046	                        return undefined;
2047	                }
2048	
2049	                var isFunction = jQuery.isFunction( value );
2050	
2051	                return this.each(function( i ) {
2052	                        var self = jQuery(this), val;
2053	
2054	                        if ( this.nodeType !== 1 ) {
2055	                                return;
2056	                        }
2057	
2058	                        if ( isFunction ) {
2059	                                val = value.call( this, i, self.val() );
2060	                        } else {
2061	                                val = value;
2062	                        }
2063	
2064	                        // Treat null/undefined as ""; convert numbers to string
2065	                        if ( val == null ) {
2066	                                val = "";
2067	                        } else if ( typeof val === "number" ) {
2068	                                val += "";
2069	                        } else if ( jQuery.isArray( val ) ) {
2070	                                val = jQuery.map(val, function ( value ) {
2071	                                        return value == null ? "" : value + "";
2072	                                });
2073	                        }
2074	
2075	                        hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
2076	
2077	                        // If set returns undefined, fall back to normal setting
2078	                        if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
2079	                                this.value = val;
2080	                        }
2081	                });
2082	        }
2083	});
2084	
2085	jQuery.extend({
2086	        valHooks: {
2087	                option: {
2088	                        get: function( elem ) {
2089	                                // attributes.value is undefined in Blackberry 4.7 but
2090	                                // uses .value. See #6932
2091	                                var val = elem.attributes.value;
2092	                                return !val || val.specified ? elem.value : elem.text;
2093	                        }
2094	                },
2095	                select: {
2096	                        get: function( elem ) {
2097	                                var value,
2098	                                        index = elem.selectedIndex,
2099	                                        values = [],
2100	                                        options = elem.options,
2101	                                        one = elem.type === "select-one";
2102	
2103	                                // Nothing was selected
2104	                                if ( index < 0 ) {
2105	                                        return null;
2106	                                }
2107	
2108	                                // Loop through all the selected options
2109	                                for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
2110	                                        var option = options[ i ];
2111	
2112	                                        // Don't return options that are disabled or in a disabled optgroup
2113	                                        if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
2114	                                                        (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
2115	
2116	                                                // Get the specific value for the option
2117	                                                value = jQuery( option ).val();
2118	
2119	                                                // We don't need an array for one selects
2120	                                                if ( one ) {
2121	                                                        return value;
2122	                                                }
2123	
2124	                                                // Multi-Selects return an array
2125	                                                values.push( value );
2126	                                        }
2127	                                }
2128	
2129	                                // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
2130	                                if ( one && !values.length && options.length ) {
2131	                                        return jQuery( options[ index ] ).val();
2132	                                }
2133	
2134	                                return values;
2135	                        },
2136	
2137	                        set: function( elem, value ) {
2138	                                var values = jQuery.makeArray( value );
2139	
2140	                                jQuery(elem).find("option").each(function() {
2141	                                        this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
2142	                                });
2143	
2144	                                if ( !values.length ) {
2145	                                        elem.selectedIndex = -1;
2146	                                }
2147	                                return values;
2148	                        }
2149	                }
2150	        },
2151	
2152	        attrFn: {
2153	                val: true,
2154	                css: true,
2155	                html: true,
2156	                text: true,
2157	                data: true,
2158	                width: true,
2159	                height: true,
2160	                offset: true
2161	        },
2162	       
2163	        attrFix: {
2164	                // Always normalize to ensure hook usage
2165	                tabindex: "tabIndex"
2166	        },
2167	       
2168	        attr: function( elem, name, value, pass ) {
2169	                var nType = elem.nodeType;
2170	               
2171	                // don't get/set attributes on text, comment and attribute nodes
2172	                if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2173	                        return undefined;
2174	                }
2175	
2176	                if ( pass && name in jQuery.attrFn ) {
2177	                        return jQuery( elem )[ name ]( value );
2178	                }
2179	
2180	                // Fallback to prop when attributes are not supported
2181	                if ( !("getAttribute" in elem) ) {
2182	                        return jQuery.prop( elem, name, value );
2183	                }
2184	
2185	                var ret, hooks,
2186	                        notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2187	
2188	                // Normalize the name if needed
2189	                name = notxml && jQuery.attrFix[ name ] || name;
2190	
2191	                hooks = jQuery.attrHooks[ name ];
2192	
2193	                if ( !hooks ) {
2194	                        // Use boolHook for boolean attributes
2195	                        if ( rboolean.test( name ) &&
2196	                                (typeof value === "boolean" || value === undefined || value.toLowerCase() === name.toLowerCase()) ) {
2197	
2198	                                hooks = boolHook;
2199	
2200	                        // Use formHook for forms and if the name contains certain characters
2201	                        } else if ( formHook && (jQuery.nodeName( elem, "form" ) || rinvalidChar.test( name )) ) {
2202	                                hooks = formHook;
2203	                        }
2204	                }
2205	
2206	                if ( value !== undefined ) {
2207	
2208	                        if ( value === null ) {
2209	                                jQuery.removeAttr( elem, name );
2210	                                return undefined;
2211	
2212	                        } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
2213	                                return ret;
2214	
2215	                        } else {
2216	                                elem.setAttribute( name, "" + value );
2217	                                return value;
2218	                        }
2219	
2220	                } else if ( hooks && "get" in hooks && notxml ) {
2221	                        return hooks.get( elem, name );
2222	
2223	                } else {
2224	
2225	                        ret = elem.getAttribute( name );
2226	
2227	                        // Non-existent attributes return null, we normalize to undefined
2228	                        return ret === null ?
2229	                                undefined :
2230	                                ret;
2231	                }
2232	        },
2233	
2234	        removeAttr: function( elem, name ) {
2235	                var propName;
2236	                if ( elem.nodeType === 1 ) {
2237	                        name = jQuery.attrFix[ name ] || name;
2238	               
2239	                        if ( jQuery.support.getSetAttribute ) {
2240	                                // Use removeAttribute in browsers that support it
2241	                                elem.removeAttribute( name );
2242	                        } else {
2243	                                jQuery.attr( elem, name, "" );
2244	                                elem.removeAttributeNode( elem.getAttributeNode( name ) );
2245	                        }
2246	
2247	                        // Set corresponding property to false for boolean attributes
2248	                        if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) {
2249	                                elem[ propName ] = false;
2250	                        }
2251	                }
2252	        },
2253	
2254	        attrHooks: {
2255	                type: {
2256	                        set: function( elem, value ) {
2257	                                // We can't allow the type property to be changed (since it causes problems in IE)
2258	                                if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
2259	                                        jQuery.error( "type property can't be changed" );
2260	                                } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
2261	                                        // Setting the type on a radio button after the value resets the value in IE6-9
2262	                                        // Reset value to it's default in case type is set after value
2263	                                        // This is for element creation
2264	                                        var val = elem.value;
2265	                                        elem.setAttribute( "type", value );
2266	                                        if ( val ) {
2267	                                                elem.value = val;
2268	                                        }
2269	                                        return value;
2270	                                }
2271	                        }
2272	                },
2273	                tabIndex: {
2274	                        get: function( elem ) {
2275	                                // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
2276	                                // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
2277	                                var attributeNode = elem.getAttributeNode("tabIndex");
2278	
2279	                                return attributeNode && attributeNode.specified ?
2280	                                        parseInt( attributeNode.value, 10 ) :
2281	                                        rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
2282	                                                0 :
2283	                                                undefined;
2284	                        }
2285	                }
2286	        },
2287	
2288	        propFix: {
2289	                tabindex: "tabIndex",
2290	                readonly: "readOnly",
2291	                "for": "htmlFor",
2292	                "class": "className",
2293	                maxlength: "maxLength",
2294	                cellspacing: "cellSpacing",
2295	                cellpadding: "cellPadding",
2296	                rowspan: "rowSpan",
2297	                colspan: "colSpan",
2298	                usemap: "useMap",
2299	                frameborder: "frameBorder",
2300	                contenteditable: "contentEditable"
2301	        },
2302	       
2303	        prop: function( elem, name, value ) {
2304	                var nType = elem.nodeType;
2305	
2306	                // don't get/set properties on text, comment and attribute nodes
2307	                if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2308	                        return undefined;
2309	                }
2310	
2311	                var ret, hooks,
2312	                        notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2313	
2314	                // Try to normalize/fix the name
2315	                name = notxml && jQuery.propFix[ name ] || name;
2316	               
2317	                hooks = jQuery.propHooks[ name ];
2318	
2319	                if ( value !== undefined ) {
2320	                        if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
2321	                                return ret;
2322	
2323	                        } else {
2324	                                return (elem[ name ] = value);
2325	                        }
2326	
2327	                } else {
2328	                        if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== undefined ) {
2329	                                return ret;
2330	
2331	                        } else {
2332	                                return elem[ name ];
2333	                        }
2334	                }
2335	        },
2336	       
2337	        propHooks: {}
2338	});
2339	
2340	// Hook for boolean attributes
2341	boolHook = {
2342	        get: function( elem, name ) {
2343	                // Align boolean attributes with corresponding properties
2344	                return elem[ jQuery.propFix[ name ] || name ] ?
2345	                        name.toLowerCase() :
2346	                        undefined;
2347	        },
2348	        set: function( elem, value, name ) {
2349	                var propName;
2350	                if ( value === false ) {
2351	                        // Remove boolean attributes when set to false
2352	                        jQuery.removeAttr( elem, name );
2353	                } else {
2354	                        // value is true since we know at this point it's type boolean and not false
2355	                        // Set boolean attributes to the same name and set the DOM property
2356	                        propName = jQuery.propFix[ name ] || name;
2357	                        if ( propName in elem ) {
2358	                                // Only set the IDL specifically if it already exists on the element
2359	                                elem[ propName ] = value;
2360	                        }
2361	
2362	                        elem.setAttribute( name, name.toLowerCase() );
2363	                }
2364	                return name;
2365	        }
2366	};
2367	
2368	// Use the value property for back compat
2369	// Use the formHook for button elements in IE6/7 (#1954)
2370	jQuery.attrHooks.value = {
2371	        get: function( elem, name ) {
2372	                if ( formHook && jQuery.nodeName( elem, "button" ) ) {
2373	                        return formHook.get( elem, name );
2374	                }
2375	                return elem.value;
2376	        },
2377	        set: function( elem, value, name ) {
2378	                if ( formHook && jQuery.nodeName( elem, "button" ) ) {
2379	                        return formHook.set( elem, value, name );
2380	                }
2381	                // Does not return so that setAttribute is also used
2382	                elem.value = value;
2383	        }
2384	};
2385	
2386	// IE6/7 do not support getting/setting some attributes with get/setAttribute
2387	if ( !jQuery.support.getSetAttribute ) {
2388	
2389	        // propFix is more comprehensive and contains all fixes
2390	        jQuery.attrFix = jQuery.propFix;
2391	       
2392	        // Use this for any attribute on a form in IE6/7
2393	        formHook = jQuery.attrHooks.name = jQuery.valHooks.button = {
2394	                get: function( elem, name ) {
2395	                        var ret;
2396	                        ret = elem.getAttributeNode( name );
2397	                        // Return undefined if nodeValue is empty string
2398	                        return ret && ret.nodeValue !== "" ?
2399	                                ret.nodeValue :
2400	                                undefined;
2401	                },
2402	                set: function( elem, value, name ) {
2403	                        // Check form objects in IE (multiple bugs related)
2404	                        // Only use nodeValue if the attribute node exists on the form
2405	                        var ret = elem.getAttributeNode( name );
2406	                        if ( ret ) {
2407	                                ret.nodeValue = value;
2408	                                return value;
2409	                        }
2410	                }
2411	        };
2412	
2413	        // Set width and height to auto instead of 0 on empty string( Bug #8150 )
2414	        // This is for removals
2415	        jQuery.each([ "width", "height" ], function( i, name ) {
2416	                jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2417	                        set: function( elem, value ) {
2418	                                if ( value === "" ) {
2419	                                        elem.setAttribute( name, "auto" );
2420	                                        return value;
2421	                                }
2422	                        }
2423	                });
2424	        });
2425	}
2426	
2427	
2428	// Some attributes require a special call on IE
2429	if ( !jQuery.support.hrefNormalized ) {
2430	        jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
2431	                jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2432	                        get: function( elem ) {
2433	                                var ret = elem.getAttribute( name, 2 );
2434	                                return ret === null ? undefined : ret;
2435	                        }
2436	                });
2437	        });
2438	}
2439	
2440	if ( !jQuery.support.style ) {
2441	        jQuery.attrHooks.style = {
2442	                get: function( elem ) {
2443	                        // Return undefined in the case of empty string
2444	                        // Normalize to lowercase since IE uppercases css property names
2445	                        return elem.style.cssText.toLowerCase() || undefined;
2446	                },
2447	                set: function( elem, value ) {
2448	                        return (elem.style.cssText = "" + value);
2449	                }
2450	        };
2451	}
2452	
2453	// Safari mis-reports the default selected property of an option
2454	// Accessing the parent's selectedIndex property fixes it
2455	if ( !jQuery.support.optSelected ) {
2456	        jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
2457	                get: function( elem ) {
2458	                        var parent = elem.parentNode;
2459	
2460	                        if ( parent ) {
2461	                                parent.selectedIndex;
2462	
2463	                                // Make sure that it also works with optgroups, see #5701
2464	                                if ( parent.parentNode ) {
2465	                                        parent.parentNode.selectedIndex;
2466	                                }
2467	                        }
2468	                }
2469	        });
2470	}
2471	
2472	// Radios and checkboxes getter/setter
2473	if ( !jQuery.support.checkOn ) {
2474	        jQuery.each([ "radio", "checkbox" ], function() {
2475	                jQuery.valHooks[ this ] = {
2476	                        get: function( elem ) {
2477	                                // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
2478	                                return elem.getAttribute("value") === null ? "on" : elem.value;
2479	                        }
2480	                };
2481	        });
2482	}
2483	jQuery.each([ "radio", "checkbox" ], function() {
2484	        jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
2485	                set: function( elem, value ) {
2486	                        if ( jQuery.isArray( value ) ) {
2487	                                return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0);
2488	                        }
2489	                }
2490	        });
2491	});
2492	
2493	
2494	
2495	
2496	var hasOwn = Object.prototype.hasOwnProperty,
2497	        rnamespaces = /\.(.*)$/,
2498	        rformElems = /^(?:textarea|input|select)$/i,
2499	        rperiod = /\./g,
2500	        rspaces = / /g,
2501	        rescape = /[^\w\s.|`]/g,
2502	        fcleanup = function( nm ) {
2503	                return nm.replace(rescape, "\\$&");
2504	        };
2505	
2506	/*
2507	 * A number of helper functions used for managing events.
2508	 * Many of the ideas behind this code originated from
2509	 * Dean Edwards' addEvent library.
2510	 */
2511	jQuery.event = {
2512	
2513	        // Bind an event to an element
2514	        // Original by Dean Edwards
2515	        add: function( elem, types, handler, data ) {
2516	                if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
2517	                        return;
2518	                }
2519	
2520	                if ( handler === false ) {
2521	                        handler = returnFalse;
2522	                } else if ( !handler ) {
2523	                        // Fixes bug #7229. Fix recommended by jdalton
2524	                        return;
2525	                }
2526	
2527	                var handleObjIn, handleObj;
2528	
2529	                if ( handler.handler ) {
2530	                        handleObjIn = handler;
2531	                        handler = handleObjIn.handler;
2532	                }
2533	
2534	                // Make sure that the function being executed has a unique ID
2535	                if ( !handler.guid ) {
2536	                        handler.guid = jQuery.guid++;
2537	                }
2538	
2539	                // Init the element's event structure
2540	                var elemData = jQuery._data( elem );
2541	
2542	                // If no elemData is found then we must be trying to bind to one of the
2543	                // banned noData elements
2544	                if ( !elemData ) {
2545	                        return;
2546	                }
2547	
2548	                var events = elemData.events,
2549	                        eventHandle = elemData.handle;
2550	
2551	                if ( !events ) {
2552	                        elemData.events = events = {};
2553	                }
2554	
2555	                if ( !eventHandle ) {
2556	                        elemData.handle = eventHandle = function( e ) {
2557	                                // Discard the second event of a jQuery.event.trigger() and
2558	                                // when an event is called after a page has unloaded
2559	                                return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
2560	                                        jQuery.event.handle.apply( eventHandle.elem, arguments ) :
2561	                                        undefined;
2562	                        };
2563	                }
2564	
2565	                // Add elem as a property of the handle function
2566	                // This is to prevent a memory leak with non-native events in IE.
2567	                eventHandle.elem = elem;
2568	
2569	                // Handle multiple events separated by a space
2570	                // jQuery(...).bind("mouseover mouseout", fn);
2571	                types = types.split(" ");
2572	
2573	                var type, i = 0, namespaces;
2574	
2575	                while ( (type = types[ i++ ]) ) {
2576	                        handleObj = handleObjIn ?
2577	                                jQuery.extend({}, handleObjIn) :
2578	                                { handler: handler, data: data };
2579	
2580	                        // Namespaced event handlers
2581	                        if ( type.indexOf(".") > -1 ) {
2582	                                namespaces = type.split(".");
2583	                                type = namespaces.shift();
2584	                                handleObj.namespace = namespaces.slice(0).sort().join(".");
2585	
2586	                        } else {
2587	                                namespaces = [];
2588	                                handleObj.namespace = "";
2589	                        }
2590	
2591	                        handleObj.type = type;
2592	                        if ( !handleObj.guid ) {
2593	                                handleObj.guid = handler.guid;
2594	                        }
2595	
2596	                        // Get the current list of functions bound to this event
2597	                        var handlers = events[ type ],
2598	                                special = jQuery.event.special[ type ] || {};
2599	
2600	                        // Init the event handler queue
2601	                        if ( !handlers ) {
2602	                                handlers = events[ type ] = [];
2603	
2604	                                // Check for a special event handler
2605	                                // Only use addEventListener/attachEvent if the special
2606	                                // events handler returns false
2607	                                if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
2608	                                        // Bind the global event handler to the element
2609	                                        if ( elem.addEventListener ) {
2610	                                                elem.addEventListener( type, eventHandle, false );
2611	
2612	                                        } else if ( elem.attachEvent ) {
2613	                                                elem.attachEvent( "on" + type, eventHandle );
2614	                                        }
2615	                                }
2616	                        }
2617	
2618	                        if ( special.add ) {
2619	                                special.add.call( elem, handleObj );
2620	
2621	                                if ( !handleObj.handler.guid ) {
2622	                                        handleObj.handler.guid = handler.guid;
2623	                                }
2624	                        }
2625	
2626	                        // Add the function to the element's handler list
2627	                        handlers.push( handleObj );
2628	
2629	                        // Keep track of which events have been used, for event optimization
2630	                        jQuery.event.global[ type ] = true;
2631	                }
2632	
2633	                // Nullify elem to prevent memory leaks in IE
2634	                elem = null;
2635	        },
2636	
2637	        global: {},
2638	
2639	        // Detach an event or set of events from an element
2640	        remove: function( elem, types, handler, pos ) {
2641	                // don't do events on text and comment nodes
2642	                if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
2643	                        return;
2644	                }
2645	
2646	                if ( handler === false ) {
2647	                        handler = returnFalse;
2648	                }
2649	
2650	                var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
2651	                        elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
2652	                        events = elemData && elemData.events;
2653	
2654	                if ( !elemData || !events ) {
2655	                        return;
2656	                }
2657	
2658	                // types is actually an event object here
2659	                if ( types && types.type ) {
2660	                        handler = types.handler;
2661	                        types = types.type;
2662	                }
2663	
2664	                // Unbind all events for the element
2665	                if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
2666	                        types = types || "";
2667	
2668	                        for ( type in events ) {
2669	                                jQuery.event.remove( elem, type + types );
2670	                        }
2671	
2672	                        return;
2673	                }
2674	
2675	                // Handle multiple events separated by a space
2676	                // jQuery(...).unbind("mouseover mouseout", fn);
2677	                types = types.split(" ");
2678	
2679	                while ( (type = types[ i++ ]) ) {
2680	                        origType = type;
2681	                        handleObj = null;
2682	                        all = type.indexOf(".") < 0;
2683	                        namespaces = [];
2684	
2685	                        if ( !all ) {
2686	                                // Namespaced event handlers
2687	                                namespaces = type.split(".");
2688	                                type = namespaces.shift();
2689	
2690	                                namespace = new RegExp("(^|\\.)" +
2691	                                        jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
2692	                        }
2693	
2694	                        eventType = events[ type ];
2695	
2696	                        if ( !eventType ) {
2697	                                continue;
2698	                        }
2699	
2700	                        if ( !handler ) {
2701	                                for ( j = 0; j < eventType.length; j++ ) {
2702	                                        handleObj = eventType[ j ];
2703	
2704	                                        if ( all || namespace.test( handleObj.namespace ) ) {
2705	                                                jQuery.event.remove( elem, origType, handleObj.handler, j );
2706	                                                eventType.splice( j--, 1 );
2707	                                        }
2708	                                }
2709	
2710	                                continue;
2711	                        }
2712	
2713	                        special = jQuery.event.special[ type ] || {};
2714	
2715	                        for ( j = pos || 0; j < eventType.length; j++ ) {
2716	                                handleObj = eventType[ j ];
2717	
2718	                                if ( handler.guid === handleObj.guid ) {
2719	                                        // remove the given handler for the given type
2720	                                        if ( all || namespace.test( handleObj.namespace ) ) {
2721	                                                if ( pos == null ) {
2722	                                                        eventType.splice( j--, 1 );
2723	                                                }
2724	
2725	                                                if ( special.remove ) {
2726	                                                        special.remove.call( elem, handleObj );
2727	                                                }
2728	                                        }
2729	
2730	                                        if ( pos != null ) {
2731	                                                break;
2732	                                        }
2733	                                }
2734	                        }
2735	
2736	                        // remove generic event handler if no more handlers exist
2737	                        if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
2738	                                if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
2739	                                        jQuery.removeEvent( elem, type, elemData.handle );
2740	                                }
2741	
2742	                                ret = null;
2743	                                delete events[ type ];
2744	                        }
2745	                }
2746	
2747	                // Remove the expando if it's no longer used
2748	                if ( jQuery.isEmptyObject( events ) ) {
2749	                        var handle = elemData.handle;
2750	                        if ( handle ) {
2751	                                handle.elem = null;
2752	                        }
2753	
2754	                        delete elemData.events;
2755	                        delete elemData.handle;
2756	
2757	                        if ( jQuery.isEmptyObject( elemData ) ) {
2758	                                jQuery.removeData( elem, undefined, true );
2759	                        }
2760	                }
2761	        },
2762	       
2763	        // Events that are safe to short-circuit if no handlers are attached.
2764	        // Native DOM events should not be added, they may have inline handlers.
2765	        customEvent: {
2766	                "getData": true,
2767	                "setData": true,
2768	                "changeData": true
2769	        },
2770	
2771	        trigger: function( event, data, elem, onlyHandlers ) {
2772	                // Event object or event type
2773	                var type = event.type || event,
2774	                        namespaces = [],
2775	                        exclusive;
2776	
2777	                if ( type.indexOf("!") >= 0 ) {
2778	                        // Exclusive events trigger only for the exact event (no namespaces)
2779	                        type = type.slice(0, -1);
2780	                        exclusive = true;
2781	                }
2782	
2783	                if ( type.indexOf(".") >= 0 ) {
2784	                        // Namespaced trigger; create a regexp to match event type in handle()
2785	                        namespaces = type.split(".");
2786	                        type = namespaces.shift();
2787	                        namespaces.sort();
2788	                }
2789	
2790	                if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
2791	                        // No jQuery handlers for this event type, and it can't have inline handlers
2792	                        return;
2793	                }
2794	
2795	                // Caller can pass in an Event, Object, or just an event type string
2796	                event = typeof event === "object" ?
2797	                        // jQuery.Event object
2798	                        event[ jQuery.expando ] ? event :
2799	                        // Object literal
2800	                        new jQuery.Event( type, event ) :
2801	                        // Just the event type (string)
2802	                        new jQuery.Event( type );
2803	
2804	                event.type = type;
2805	                event.exclusive = exclusive;
2806	                event.namespace = namespaces.join(".");
2807	                event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)");
2808	               
2809	                // triggerHandler() and global events don't bubble or run the default action
2810	                if ( onlyHandlers || !elem ) {
2811	                        event.preventDefault();
2812	                        event.stopPropagation();
2813	                }
2814	
2815	                // Handle a global trigger
2816	                if ( !elem ) {
2817	                        // TODO: Stop taunting the data cache; remove global events and always attach to document
2818	                        jQuery.each( jQuery.cache, function() {
2819	                                // internalKey variable is just used to make it easier to find
2820	                                // and potentially change this stuff later; currently it just
2821	                                // points to jQuery.expando
2822	                                var internalKey = jQuery.expando,
2823	                                        internalCache = this[ internalKey ];
2824	                                if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
2825	                                        jQuery.event.trigger( event, data, internalCache.handle.elem );
2826	                                }
2827	                        });
2828	                        return;
2829	                }
2830	
2831	                // Don't do events on text and comment nodes
2832	                if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
2833	                        return;
2834	                }
2835	
2836	                // Clean up the event in case it is being reused
2837	                event.result = undefined;
2838	                event.target = elem;
2839	
2840	                // Clone any incoming data and prepend the event, creating the handler arg list
2841	                data = data ? jQuery.makeArray( data ) : [];
2842	                data.unshift( event );
2843	
2844	                var cur = elem,
2845	                        // IE doesn't like method names with a colon (#3533, #8272)
2846	                        ontype = type.indexOf(":") < 0 ? "on" + type : "";
2847	
2848	                // Fire event on the current element, then bubble up the DOM tree
2849	                do {
2850	                        var handle = jQuery._data( cur, "handle" );
2851	
2852	                        event.currentTarget = cur;
2853	                        if ( handle ) {
2854	                                handle.apply( cur, data );
2855	                        }
2856	
2857	                        // Trigger an inline bound script
2858	                        if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) {
2859	                                event.result = false;
2860	                                event.preventDefault();
2861	                        }
2862	
2863	                        // Bubble up to document, then to window
2864	                        cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window;
2865	                } while ( cur && !event.isPropagationStopped() );
2866	
2867	                // If nobody prevented the default action, do it now
2868	                if ( !event.isDefaultPrevented() ) {
2869	                        var old,
2870	                                special = jQuery.event.special[ type ] || {};
2871	
2872	                        if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) &&
2873	                                !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
2874	
2875	                                // Call a native DOM method on the target with the same name name as the event.
2876	                                // Can't use an .isFunction)() check here because IE6/7 fails that test.
2877	                                // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch.
2878	                                try {
2879	                                        if ( ontype && elem[ type ] ) {
2880	                                                // Don't re-trigger an onFOO event when we call its FOO() method
2881	                                                old = elem[ ontype ];
2882	
2883	                                                if ( old ) {
2884	                                                        elem[ ontype ] = null;
2885	                                                }
2886	
2887	                                                jQuery.event.triggered = type;
2888	                                                elem[ type ]();
2889	                                        }
2890	                                } catch ( ieError ) {}
2891	
2892	                                if ( old ) {
2893	                                        elem[ ontype ] = old;
2894	                                }
2895	
2896	                                jQuery.event.triggered = undefined;
2897	                        }
2898	                }
2899	               
2900	                return event.result;
2901	        },
2902	
2903	        handle: function( event ) {
2904	                event = jQuery.event.fix( event || window.event );
2905	                // Snapshot the handlers list since a called handler may add/remove events.
2906	                var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0),
2907	                        run_all = !event.exclusive && !event.namespace,
2908	                        args = Array.prototype.slice.call( arguments, 0 );
2909	
2910	                // Use the fix-ed Event rather than the (read-only) native event
2911	                args[0] = event;
2912	                event.currentTarget = this;
2913	
2914	                for ( var j = 0, l = handlers.length; j < l; j++ ) {
2915	                        var handleObj = handlers[ j ];
2916	
2917	                        // Triggered event must 1) be non-exclusive and have no namespace, or
2918	                        // 2) have namespace(s) a subset or equal to those in the bound event.
2919	                        if ( run_all || event.namespace_re.test( handleObj.namespace ) ) {
2920	                                // Pass in a reference to the handler function itself
2921	                                // So that we can later remove it
2922	                                event.handler = handleObj.handler;
2923	                                event.data = handleObj.data;
2924	                                event.handleObj = handleObj;
2925	
2926	                                var ret = handleObj.handler.apply( this, args );
2927	
2928	                                if ( ret !== undefined ) {
2929	                                        event.result = ret;
2930	                                        if ( ret === false ) {
2931	                                                event.preventDefault();
2932	                                                event.stopPropagation();
2933	                                        }
2934	                                }
2935	
2936	                                if ( event.isImmediatePropagationStopped() ) {
2937	                                        break;
2938	                                }
2939	                        }
2940	                }
2941	                return event.result;
2942	        },
2943	
2944	        props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
2945	
2946	        fix: function( event ) {
2947	                if ( event[ jQuery.expando ] ) {
2948	                        return event;
2949	                }
2950	
2951	                // store a copy of the original event object
2952	                // and "clone" to set read-only properties
2953	                var originalEvent = event;
2954	                event = jQuery.Event( originalEvent );
2955	
2956	                for ( var i = this.props.length, prop; i; ) {
2957	                        prop = this.props[ --i ];
2958	                        event[ prop ] = originalEvent[ prop ];
2959	                }
2960	
2961	                // Fix target property, if necessary
2962	                if ( !event.target ) {
2963	                        // Fixes #1925 where srcElement might not be defined either
2964	                        event.target = event.srcElement || document;
2965	                }
2966	
2967	                // check if target is a textnode (safari)
2968	                if ( event.target.nodeType === 3 ) {
2969	                        event.target = event.target.parentNode;
2970	                }
2971	
2972	                // Add relatedTarget, if necessary
2973	                if ( !event.relatedTarget && event.fromElement ) {
2974	                        event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
2975	                }
2976	
2977	                // Calculate pageX/Y if missing and clientX/Y available
2978	                if ( event.pageX == null && event.clientX != null ) {
2979	                        var eventDocument = event.target.ownerDocument || document,
2980	                                doc = eventDocument.documentElement,
2981	                                body = eventDocument.body;
2982	
2983	                        event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
2984	                        event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
2985	                }
2986	
2987	                // Add which for key events
2988	                if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
2989	                        event.which = event.charCode != null ? event.charCode : event.keyCode;
2990	                }
2991	
2992	                // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
2993	                if ( !event.metaKey && event.ctrlKey ) {
2994	                        event.metaKey = event.ctrlKey;
2995	                }
2996	
2997	                // Add which for click: 1 === left; 2 === middle; 3 === right
2998	                // Note: button is not normalized, so don't use it
2999	                if ( !event.which && event.button !== undefined ) {
3000	                        event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
3001	                }
3002	
3003	                return event;
3004	        },
3005	
3006	        // Deprecated, use jQuery.guid instead
3007	        guid: 1E8,
3008	
3009	        // Deprecated, use jQuery.proxy instead
3010	        proxy: jQuery.proxy,
3011	
3012	        special: {
3013	                ready: {
3014	                        // Make sure the ready event is setup
3015	                        setup: jQuery.bindReady,
3016	                        teardown: jQuery.noop
3017	                },
3018	
3019	                live: {
3020	                        add: function( handleObj ) {
3021	                                jQuery.event.add( this,
3022	                                        liveConvert( handleObj.origType, handleObj.selector ),
3023	                                        jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
3024	                        },
3025	
3026	                        remove: function( handleObj ) {
3027	                                jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
3028	                        }
3029	                },
3030	
3031	                beforeunload: {
3032	                        setup: function( data, namespaces, eventHandle ) {
3033	                                // We only want to do this special case on windows
3034	                                if ( jQuery.isWindow( this ) ) {
3035	                                        this.onbeforeunload = eventHandle;
3036	                                }
3037	                        },
3038	
3039	                        teardown: function( namespaces, eventHandle ) {
3040	                                if ( this.onbeforeunload === eventHandle ) {
3041	                                        this.onbeforeunload = null;
3042	                                }
3043	                        }
3044	                }
3045	        }
3046	};
3047	
3048	jQuery.removeEvent = document.removeEventListener ?
3049	        function( elem, type, handle ) {
3050	                if ( elem.removeEventListener ) {
3051	                        elem.removeEventListener( type, handle, false );
3052	                }
3053	        } :
3054	        function( elem, type, handle ) {
3055	                if ( elem.detachEvent ) {
3056	                        elem.detachEvent( "on" + type, handle );
3057	                }
3058	        };
3059	
3060	jQuery.Event = function( src, props ) {
3061	        // Allow instantiation without the 'new' keyword
3062	        if ( !this.preventDefault ) {
3063	                return new jQuery.Event( src, props );
3064	        }
3065	
3066	        // Event object
3067	        if ( src && src.type ) {
3068	                this.originalEvent = src;
3069	                this.type = src.type;
3070	
3071	                // Events bubbling up the document may have been marked as prevented
3072	                // by a handler lower down the tree; reflect the correct value.
3073	                this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
3074	                        src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
3075	
3076	        // Event type
3077	        } else {
3078	                this.type = src;
3079	        }
3080	
3081	        // Put explicitly provided properties onto the event object
3082	        if ( props ) {
3083	                jQuery.extend( this, props );
3084	        }
3085	
3086	        // timeStamp is buggy for some events on Firefox(#3843)
3087	        // So we won't rely on the native value
3088	        this.timeStamp = jQuery.now();
3089	
3090	        // Mark it as fixed
3091	        this[ jQuery.expando ] = true;
3092	};
3093	
3094	function returnFalse() {
3095	        return false;
3096	}
3097	function returnTrue() {
3098	        return true;
3099	}
3100	
3101	// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
3102	// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
3103	jQuery.Event.prototype = {
3104	        preventDefault: function() {
3105	                this.isDefaultPrevented = returnTrue;
3106	
3107	                var e = this.originalEvent;
3108	                if ( !e ) {
3109	                        return;
3110	                }
3111	
3112	                // if preventDefault exists run it on the original event
3113	                if ( e.preventDefault ) {
3114	                        e.preventDefault();
3115	
3116	                // otherwise set the returnValue property of the original event to false (IE)
3117	                } else {
3118	                        e.returnValue = false;
3119	                }
3120	        },
3121	        stopPropagation: function() {
3122	                this.isPropagationStopped = returnTrue;
3123	
3124	                var e = this.originalEvent;
3125	                if ( !e ) {
3126	                        return;
3127	                }
3128	                // if stopPropagation exists run it on the original event
3129	                if ( e.stopPropagation ) {
3130	                        e.stopPropagation();
3131	                }
3132	                // otherwise set the cancelBubble property of the original event to true (IE)
3133	                e.cancelBubble = true;
3134	        },
3135	        stopImmediatePropagation: function() {
3136	                this.isImmediatePropagationStopped = returnTrue;
3137	                this.stopPropagation();
3138	        },
3139	        isDefaultPrevented: returnFalse,
3140	        isPropagationStopped: returnFalse,
3141	        isImmediatePropagationStopped: returnFalse
3142	};
3143	
3144	// Checks if an event happened on an element within another element
3145	// Used in jQuery.event.special.mouseenter and mouseleave handlers
3146	var withinElement = function( event ) {
3147	        // Check if mouse(over|out) are still within the same parent element
3148	        var parent = event.relatedTarget;
3149	
3150	        // set the correct event type
3151	        event.type = event.data;
3152	
3153	        // Firefox sometimes assigns relatedTarget a XUL element
3154	        // which we cannot access the parentNode property of
3155	        try {
3156	
3157	                // Chrome does something similar, the parentNode property
3158	                // can be accessed but is null.
3159	                if ( parent && parent !== document && !parent.parentNode ) {
3160	                        return;
3161	                }
3162	
3163	                // Traverse up the tree
3164	                while ( parent && parent !== this ) {
3165	                        parent = parent.parentNode;
3166	                }
3167	
3168	                if ( parent !== this ) {
3169	                        // handle event if we actually just moused on to a non sub-element
3170	                        jQuery.event.handle.apply( this, arguments );
3171	                }
3172	
3173	        // assuming we've left the element since we most likely mousedover a xul element
3174	        } catch(e) { }
3175	},
3176	
3177	// In case of event delegation, we only need to rename the event.type,
3178	// liveHandler will take care of the rest.
3179	delegate = function( event ) {
3180	        event.type = event.data;
3181	        jQuery.event.handle.apply( this, arguments );
3182	};
3183	
3184	// Create mouseenter and mouseleave events
3185	jQuery.each({
3186	        mouseenter: "mouseover",
3187	        mouseleave: "mouseout"
3188	}, function( orig, fix ) {
3189	        jQuery.event.special[ orig ] = {
3190	                setup: function( data ) {
3191	                        jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
3192	                },
3193	                teardown: function( data ) {
3194	                        jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
3195	                }
3196	        };
3197	});
3198	
3199	// submit delegation
3200	if ( !jQuery.support.submitBubbles ) {
3201	
3202	        jQuery.event.special.submit = {
3203	                setup: function( data, namespaces ) {
3204	                        if ( !jQuery.nodeName( this, "form" ) ) {
3205	                                jQuery.event.add(this, "click.specialSubmit", function( e ) {
3206	                                        var elem = e.target,
3207	                                                type = elem.type;
3208	
3209	                                        if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
3210	                                                trigger( "submit", this, arguments );
3211	                                        }
3212	                                });
3213	
3214	                                jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
3215	                                        var elem = e.target,
3216	                                                type = elem.type;
3217	
3218	                                        if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
3219	                                                trigger( "submit", this, arguments );
3220	                                        }
3221	                                });
3222	
3223	                        } else {
3224	                                return false;
3225	                        }
3226	                },
3227	
3228	                teardown: function( namespaces ) {
3229	                        jQuery.event.remove( this, ".specialSubmit" );
3230	                }
3231	        };
3232	
3233	}
3234	
3235	// change delegation, happens here so we have bind.
3236	if ( !jQuery.support.changeBubbles ) {
3237	
3238	        var changeFilters,
3239	
3240	        getVal = function( elem ) {
3241	                var type = elem.type, val = elem.value;
3242	
3243	                if ( type === "radio" || type === "checkbox" ) {
3244	                        val = elem.checked;
3245	
3246	                } else if ( type === "select-multiple" ) {
3247	                        val = elem.selectedIndex > -1 ?
3248	                                jQuery.map( elem.options, function( elem ) {
3249	                                        return elem.selected;
3250	                                }).join("-") :
3251	                                "";
3252	
3253	                } else if ( jQuery.nodeName( elem, "select" ) ) {
3254	                        val = elem.selectedIndex;
3255	                }
3256	
3257	                return val;
3258	        },
3259	
3260	        testChange = function testChange( e ) {
3261	                var elem = e.target, data, val;
3262	
3263	                if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
3264	                        return;
3265	                }
3266	
3267	                data = jQuery._data( elem, "_change_data" );
3268	                val = getVal(elem);
3269	
3270	                // the current data will be also retrieved by beforeactivate
3271	                if ( e.type !== "focusout" || elem.type !== "radio" ) {
3272	                        jQuery._data( elem, "_change_data", val );
3273	                }
3274	
3275	                if ( data === undefined || val === data ) {
3276	                        return;
3277	                }
3278	
3279	                if ( data != null || val ) {
3280	                        e.type = "change";
3281	                        e.liveFired = undefined;
3282	                        jQuery.event.trigger( e, arguments[1], elem );
3283	                }
3284	        };
3285	
3286	        jQuery.event.special.change = {
3287	                filters: {
3288	                        focusout: testChange,
3289	
3290	                        beforedeactivate: testChange,
3291	
3292	                        click: function( e ) {
3293	                                var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
3294	
3295	                                if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) {
3296	                                        testChange.call( this, e );
3297	                                }
3298	                        },
3299	
3300	                        // Change has to be called before submit
3301	                        // Keydown will be called before keypress, which is used in submit-event delegation
3302	                        keydown: function( e ) {
3303	                                var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
3304	
3305	                                if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) ||
3306	                                        (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
3307	                                        type === "select-multiple" ) {
3308	                                        testChange.call( this, e );
3309	                                }
3310	                        },
3311	
3312	                        // Beforeactivate happens also before the previous element is blurred
3313	                        // with this event you can't trigger a change event, but you can store
3314	                        // information
3315	                        beforeactivate: function( e ) {
3316	                                var elem = e.target;
3317	                                jQuery._data( elem, "_change_data", getVal(elem) );
3318	                        }
3319	                },
3320	
3321	                setup: function( data, namespaces ) {
3322	                        if ( this.type === "file" ) {
3323	                                return false;
3324	                        }
3325	
3326	                        for ( var type in changeFilters ) {
3327	                                jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
3328	                        }
3329	
3330	                        return rformElems.test( this.nodeName );
3331	                },
3332	
3333	                teardown: function( namespaces ) {
3334	                        jQuery.event.remove( this, ".specialChange" );
3335	
3336	                        return rformElems.test( this.nodeName );
3337	                }
3338	        };
3339	
3340	        changeFilters = jQuery.event.special.change.filters;
3341	
3342	        // Handle when the input is .focus()'d
3343	        changeFilters.focus = changeFilters.beforeactivate;
3344	}
3345	
3346	function trigger( type, elem, args ) {
3347	        // Piggyback on a donor event to simulate a different one.
3348	        // Fake originalEvent to avoid donor's stopPropagation, but if the
3349	        // simulated event prevents default then we do the same on the donor.
3350	        // Don't pass args or remember liveFired; they apply to the donor event.
3351	        var event = jQuery.extend( {}, args[ 0 ] );
3352	        event.type = type;
3353	        event.originalEvent = {};
3354	        event.liveFired = undefined;
3355	        jQuery.event.handle.call( elem, event );
3356	        if ( event.isDefaultPrevented() ) {
3357	                args[ 0 ].preventDefault();
3358	        }
3359	}
3360	
3361	// Create "bubbling" focus and blur events
3362	if ( !jQuery.support.focusinBubbles ) {
3363	        jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
3364	
3365	                // Attach a single capturing handler while someone wants focusin/focusout
3366	                var attaches = 0;
3367	
3368	                jQuery.event.special[ fix ] = {
3369	                        setup: function() {
3370	                                if ( attaches++ === 0 ) {
3371	                                        document.addEventListener( orig, handler, true );
3372	                                }
3373	                        },
3374	                        teardown: function() {
3375	                                if ( --attaches === 0 ) {
3376	                                        document.removeEventListener( orig, handler, true );
3377	                                }
3378	                        }
3379	                };
3380	
3381	                function handler( donor ) {
3382	                        // Donor event is always a native one; fix it and switch its type.
3383	                        // Let focusin/out handler cancel the donor focus/blur event.
3384	                        var e = jQuery.event.fix( donor );
3385	                        e.type = fix;
3386	                        e.originalEvent = {};
3387	                        jQuery.event.trigger( e, null, e.target );
3388	                        if ( e.isDefaultPrevented() ) {
3389	                                donor.preventDefault();
3390	                        }
3391	                }
3392	        });
3393	}
3394	
3395	jQuery.each(["bind", "one"], function( i, name ) {
3396	        jQuery.fn[ name ] = function( type, data, fn ) {
3397	                var handler;
3398	
3399	                // Handle object literals
3400	                if ( typeof type === "object" ) {
3401	                        for ( var key in type ) {
3402	                                this[ name ](key, data, type[key], fn);
3403	                        }
3404	                        return this;
3405	                }
3406	
3407	                if ( arguments.length === 2 || data === false ) {
3408	                        fn = data;
3409	                        data = undefined;
3410	                }
3411	
3412	                if ( name === "one" ) {
3413	                        handler = function( event ) {
3414	                                jQuery( this ).unbind( event, handler );
3415	                                return fn.apply( this, arguments );
3416	                        };
3417	                        handler.guid = fn.guid || jQuery.guid++;
3418	                } else {
3419	                        handler = fn;
3420	                }
3421	
3422	                if ( type === "unload" && name !== "one" ) {
3423	                        this.one( type, data, fn );
3424	
3425	                } else {
3426	                        for ( var i = 0, l = this.length; i < l; i++ ) {
3427	                                jQuery.event.add( this[i], type, handler, data );
3428	                        }
3429	                }
3430	
3431	                return this;
3432	        };
3433	});
3434	
3435	jQuery.fn.extend({
3436	        unbind: function( type, fn ) {
3437	                // Handle object literals
3438	                if ( typeof type === "object" && !type.preventDefault ) {
3439	                        for ( var key in type ) {
3440	                                this.unbind(key, type[key]);
3441	                        }
3442	
3443	                } else {
3444	                        for ( var i = 0, l = this.length; i < l; i++ ) {
3445	                                jQuery.event.remove( this[i], type, fn );
3446	                        }
3447	                }
3448	
3449	                return this;
3450	        },
3451	
3452	        delegate: function( selector, types, data, fn ) {
3453	                return this.live( types, data, fn, selector );
3454	        },
3455	
3456	        undelegate: function( selector, types, fn ) {
3457	                if ( arguments.length === 0 ) {
3458	                        return this.unbind( "live" );
3459	
3460	                } else {
3461	                        return this.die( types, null, fn, selector );
3462	                }
3463	        },
3464	
3465	        trigger: function( type, data ) {
3466	                return this.each(function() {
3467	                        jQuery.event.trigger( type, data, this );
3468	                });
3469	        },
3470	
3471	        triggerHandler: function( type, data ) {
3472	                if ( this[0] ) {
3473	                        return jQuery.event.trigger( type, data, this[0], true );
3474	                }
3475	        },
3476	
3477	        toggle: function( fn ) {
3478	                // Save reference to arguments for access in closure
3479	                var args = arguments,
3480	                        guid = fn.guid || jQuery.guid++,
3481	                        i = 0,
3482	                        toggler = function( event ) {
3483	                                // Figure out which function to execute
3484	                                var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
3485	                                jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
3486	
3487	                                // Make sure that clicks stop
3488	                                event.preventDefault();
3489	
3490	                                // and execute the function
3491	                                return args[ lastToggle ].apply( this, arguments ) || false;
3492	                        };
3493	
3494	                // link all the functions, so any of them can unbind this click handler
3495	                toggler.guid = guid;
3496	                while ( i < args.length ) {
3497	                        args[ i++ ].guid = guid;
3498	                }
3499	
3500	                return this.click( toggler );
3501	        },
3502	
3503	        hover: function( fnOver, fnOut ) {
3504	                return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
3505	        }
3506	});
3507	
3508	var liveMap = {
3509	        focus: "focusin",
3510	        blur: "focusout",
3511	        mouseenter: "mouseover",
3512	        mouseleave: "mouseout"
3513	};
3514	
3515	jQuery.each(["live", "die"], function( i, name ) {
3516	        jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
3517	                var type, i = 0, match, namespaces, preType,
3518	                        selector = origSelector || this.selector,
3519	                        context = origSelector ? this : jQuery( this.context );
3520	
3521	                if ( typeof types === "object" && !types.preventDefault ) {
3522	                        for ( var key in types ) {
3523	                                context[ name ]( key, data, types[key], selector );
3524	                        }
3525	
3526	                        return this;
3527	                }
3528	
3529	                if ( name === "die" && !types &&
3530	                                        origSelector && origSelector.charAt(0) === "." ) {
3531	
3532	                        context.unbind( origSelector );
3533	
3534	                        return this;
3535	                }
3536	
3537	                if ( data === false || jQuery.isFunction( data ) ) {
3538	                        fn = data || returnFalse;
3539	                        data = undefined;
3540	                }
3541	
3542	                types = (types || "").split(" ");
3543	
3544	                while ( (type = types[ i++ ]) != null ) {
3545	                        match = rnamespaces.exec( type );
3546	                        namespaces = "";
3547	
3548	                        if ( match )  {
3549	                                namespaces = match[0];
3550	                                type = type.replace( rnamespaces, "" );
3551	                        }
3552	
3553	                        if ( type === "hover" ) {
3554	                                types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
3555	                                continue;
3556	                        }
3557	
3558	                        preType = type;
3559	
3560	                        if ( liveMap[ type ] ) {
3561	                                types.push( liveMap[ type ] + namespaces );
3562	                                type = type + namespaces;
3563	
3564	                        } else {
3565	                                type = (liveMap[ type ] || type) + namespaces;
3566	                        }
3567	
3568	                        if ( name === "live" ) {
3569	                                // bind live handler
3570	                                for ( var j = 0, l = context.length; j < l; j++ ) {
3571	                                        jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
3572	                                                { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
3573	                                }
3574	
3575	                        } else {
3576	                                // unbind live handler
3577	                                context.unbind( "live." + liveConvert( type, selector ), fn );
3578	                        }
3579	                }
3580	
3581	                return this;
3582	        };
3583	});
3584	
3585	function liveHandler( event ) {
3586	        var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
3587	                elems = [],
3588	                selectors = [],
3589	                events = jQuery._data( this, "events" );
3590	
3591	        // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
3592	        if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
3593	                return;
3594	        }
3595	
3596	        if ( event.namespace ) {
3597	                namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
3598	        }
3599	
3600	        event.liveFired = this;
3601	
3602	        var live = events.live.slice(0);
3603	
3604	        for ( j = 0; j < live.length; j++ ) {
3605	                handleObj = live[j];
3606	
3607	                if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
3608	                        selectors.push( handleObj.selector );
3609	
3610	                } else {
3611	                        live.splice( j--, 1 );
3612	                }
3613	        }
3614	
3615	        match = jQuery( event.target ).closest( selectors, event.currentTarget );
3616	
3617	        for ( i = 0, l = match.length; i < l; i++ ) {
3618	                close = match[i];
3619	
3620	                for ( j = 0; j < live.length; j++ ) {
3621	                        handleObj = live[j];
3622	
3623	                        if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {
3624	                                elem = close.elem;
3625	                                related = null;
3626	
3627	                                // Those two events require additional checking
3628	                                if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
3629	                                        event.type = handleObj.preType;
3630	                                        related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
3631	
3632	                                        // Make sure not to accidentally match a child element with the same selector
3633	                                        if ( related && jQuery.contains( elem, related ) ) {
3634	                                                related = elem;
3635	                                        }
3636	                                }
3637	
3638	                                if ( !related || related !== elem ) {
3639	                                        elems.push({ elem: elem, handleObj: handleObj, level: close.level });
3640	                                }
3641	                        }
3642	                }
3643	        }
3644	
3645	        for ( i = 0, l = elems.length; i < l; i++ ) {
3646	                match = elems[i];
3647	
3648	                if ( maxLevel && match.level > maxLevel ) {
3649	                        break;
3650	                }
3651	
3652	                event.currentTarget = match.elem;
3653	                event.data = match.handleObj.data;
3654	                event.handleObj = match.handleObj;
3655	
3656	                ret = match.handleObj.origHandler.apply( match.elem, arguments );
3657	
3658	                if ( ret === false || event.isPropagationStopped() ) {
3659	                        maxLevel = match.level;
3660	
3661	                        if ( ret === false ) {
3662	                                stop = false;
3663	                        }
3664	                        if ( event.isImmediatePropagationStopped() ) {
3665	                                break;
3666	                        }
3667	                }
3668	        }
3669	
3670	        return stop;
3671	}
3672	
3673	function liveConvert( type, selector ) {
3674	        return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&");
3675	}
3676	
3677	jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
3678	        "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
3679	        "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
3680	
3681	        // Handle event binding
3682	        jQuery.fn[ name ] = function( data, fn ) {
3683	                if ( fn == null ) {
3684	                        fn = data;
3685	                        data = null;
3686	                }
3687	
3688	                return arguments.length > 0 ?
3689	                        this.bind( name, data, fn ) :
3690	                        this.trigger( name );
3691	        };
3692	
3693	        if ( jQuery.attrFn ) {
3694	                jQuery.attrFn[ name ] = true;
3695	        }
3696	});
3697	
3698	
3699	
3700	/*!
3701	 * Sizzle CSS Selector Engine
3702	 *  Copyright 2011, The Dojo Foundation
3703	 *  Released under the MIT, BSD, and GPL Licenses.
3704	 *  More information: http://sizzlejs.com/
3705	 */
3706	(function(){
3707	
3708	var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
3709	        done = 0,
3710	        toString = Object.prototype.toString,
3711	        hasDuplicate = false,
3712	        baseHasDuplicate = true,
3713	        rBackslash = /\\/g,
3714	        rNonWord = /\W/;
3715	
3716	// Here we check if the JavaScript engine is using some sort of
3717	// optimization where it does not always call our comparision
3718	// function. If that is the case, discard the hasDuplicate value.
3719	//   Thus far that includes Google Chrome.
3720	[0, 0].sort(function() {
3721	        baseHasDuplicate = false;
3722	        return 0;
3723	});
3724	
3725	var Sizzle = function( selector, context, results, seed ) {
3726	        results = results || [];
3727	        context = context || document;
3728	
3729	        var origContext = context;
3730	
3731	        if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
3732	                return [];
3733	        }
3734	       
3735	        if ( !selector || typeof selector !== "string" ) {
3736	                return results;
3737	        }
3738	
3739	        var m, set, checkSet, extra, ret, cur, pop, i,
3740	                prune = true,
3741	                contextXML = Sizzle.isXML( context ),
3742	                parts = [],
3743	                soFar = selector;
3744	       
3745	        // Reset the position of the chunker regexp (start from head)
3746	        do {
3747	                chunker.exec( "" );
3748	                m = chunker.exec( soFar );
3749	
3750	                if ( m ) {
3751	                        soFar = m[3];
3752	               
3753	                        parts.push( m[1] );
3754	               
3755	                        if ( m[2] ) {
3756	                                extra = m[3];
3757	                                break;
3758	                        }
3759	                }
3760	        } while ( m );
3761	
3762	        if ( parts.length > 1 && origPOS.exec( selector ) ) {
3763	
3764	                if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
3765	                        set = posProcess( parts[0] + parts[1], context );
3766	
3767	                } else {
3768	                        set = Expr.relative[ parts[0] ] ?
3769	                                [ context ] :
3770	                                Sizzle( parts.shift(), context );
3771	
3772	                        while ( parts.length ) {
3773	                                selector = parts.shift();
3774	
3775	                                if ( Expr.relative[ selector ] ) {
3776	                                        selector += parts.shift();
3777	                                }
3778	                               
3779	                                set = posProcess( selector, set );
3780	                        }
3781	                }
3782	
3783	        } else {
3784	                // Take a shortcut and set the context if the root selector is an ID
3785	                // (but not if it'll be faster if the inner selector is an ID)
3786	                if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
3787	                                Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
3788	
3789	                        ret = Sizzle.find( parts.shift(), context, contextXML );
3790	                        context = ret.expr ?
3791	                                Sizzle.filter( ret.expr, ret.set )[0] :
3792	                                ret.set[0];
3793	                }
3794	
3795	                if ( context ) {
3796	                        ret = seed ?
3797	                                { expr: parts.pop(), set: makeArray(seed) } :
3798	                                Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
3799	
3800	                        set = ret.expr ?
3801	                                Sizzle.filter( ret.expr, ret.set ) :
3802	                                ret.set;
3803	
3804	                        if ( parts.length > 0 ) {
3805	                                checkSet = makeArray( set );
3806	
3807	                        } else {
3808	                                prune = false;
3809	                        }
3810	
3811	                        while ( parts.length ) {
3812	                                cur = parts.pop();
3813	                                pop = cur;
3814	
3815	                                if ( !Expr.relative[ cur ] ) {
3816	                                        cur = "";
3817	                                } else {
3818	                                        pop = parts.pop();
3819	                                }
3820	
3821	                                if ( pop == null ) {
3822	                                        pop = context;
3823	                                }
3824	
3825	                                Expr.relative[ cur ]( checkSet, pop, contextXML );
3826	                        }
3827	
3828	                } else {
3829	                        checkSet = parts = [];
3830	                }
3831	        }
3832	
3833	        if ( !checkSet ) {
3834	                checkSet = set;
3835	        }
3836	
3837	        if ( !checkSet ) {
3838	                Sizzle.error( cur || selector );
3839	        }
3840	
3841	        if ( toString.call(checkSet) === "[object Array]" ) {
3842	                if ( !prune ) {
3843	                        results.push.apply( results, checkSet );
3844	
3845	                } else if ( context && context.nodeType === 1 ) {
3846	                        for ( i = 0; checkSet[i] != null; i++ ) {
3847	                                if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
3848	                                        results.push( set[i] );
3849	                                }
3850	                        }
3851	
3852	                } else {
3853	                        for ( i = 0; checkSet[i] != null; i++ ) {
3854	                                if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
3855	                                        results.push( set[i] );
3856	                                }
3857	                        }
3858	                }
3859	
3860	        } else {
3861	                makeArray( checkSet, results );
3862	        }
3863	
3864	        if ( extra ) {
3865	                Sizzle( extra, origContext, results, seed );
3866	                Sizzle.uniqueSort( results );
3867	        }
3868	
3869	        return results;
3870	};
3871	
3872	Sizzle.uniqueSort = function( results ) {
3873	        if ( sortOrder ) {
3874	                hasDuplicate = baseHasDuplicate;
3875	                results.sort( sortOrder );
3876	
3877	                if ( hasDuplicate ) {
3878	                        for ( var i = 1; i < results.length; i++ ) {
3879	                                if ( results[i] === results[ i - 1 ] ) {
3880	                                        results.splice( i--, 1 );
3881	                                }
3882	                        }
3883	                }
3884	        }
3885	
3886	        return results;
3887	};
3888	
3889	Sizzle.matches = function( expr, set ) {
3890	        return Sizzle( expr, null, null, set );
3891	};
3892	
3893	Sizzle.matchesSelector = function( node, expr ) {
3894	        return Sizzle( expr, null, null, [node] ).length > 0;
3895	};
3896	
3897	Sizzle.find = function( expr, context, isXML ) {
3898	        var set;
3899	
3900	        if ( !expr ) {
3901	                return [];
3902	        }
3903	
3904	        for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
3905	                var match,
3906	                        type = Expr.order[i];
3907	               
3908	                if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
3909	                        var left = match[1];
3910	                        match.splice( 1, 1 );
3911	
3912	                        if ( left.substr( left.length - 1 ) !== "\\" ) {
3913	                                match[1] = (match[1] || "").replace( rBackslash, "" );
3914	                                set = Expr.find[ type ]( match, context, isXML );
3915	
3916	                                if ( set != null ) {
3917	                                        expr = expr.replace( Expr.match[ type ], "" );
3918	                                        break;
3919	                                }
3920	                        }
3921	                }
3922	        }
3923	
3924	        if ( !set ) {
3925	                set = typeof context.getElementsByTagName !== "undefined" ?
3926	                        context.getElementsByTagName( "*" ) :
3927	                        [];
3928	        }
3929	
3930	        return { set: set, expr: expr };
3931	};
3932	
3933	Sizzle.filter = function( expr, set, inplace, not ) {
3934	        var match, anyFound,
3935	                old = expr,
3936	                result = [],
3937	                curLoop = set,
3938	                isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
3939	
3940	        while ( expr && set.length ) {
3941	                for ( var type in Expr.filter ) {
3942	                        if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
3943	                                var found, item,
3944	                                        filter = Expr.filter[ type ],
3945	                                        left = match[1];
3946	
3947	                                anyFound = false;
3948	
3949	                                match.splice(1,1);
3950	
3951	                                if ( left.substr( left.length - 1 ) === "\\" ) {
3952	                                        continue;
3953	                                }
3954	
3955	                                if ( curLoop === result ) {
3956	                                        result = [];
3957	                                }
3958	
3959	                                if ( Expr.preFilter[ type ] ) {
3960	                                        match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
3961	
3962	                                        if ( !match ) {
3963	                                                anyFound = found = true;
3964	
3965	                                        } else if ( match === true ) {
3966	                                                continue;
3967	                                        }
3968	                                }
3969	
3970	                                if ( match ) {
3971	                                        for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
3972	                                                if ( item ) {
3973	                                                        found = filter( item, match, i, curLoop );
3974	                                                        var pass = not ^ !!found;
3975	
3976	                                                        if ( inplace && found != null ) {
3977	                                                                if ( pass ) {
3978	                                                                        anyFound = true;
3979	
3980	                                                                } else {
3981	                                                                        curLoop[i] = false;
3982	                                                                }
3983	
3984	                                                        } else if ( pass ) {
3985	                                                                result.push( item );
3986	                                                                anyFound = true;
3987	                                                        }
3988	                                                }
3989	                                        }
3990	                                }
3991	
3992	                                if ( found !== undefined ) {
3993	                                        if ( !inplace ) {
3994	                                                curLoop = result;
3995	                                        }
3996	
3997	                                        expr = expr.replace( Expr.match[ type ], "" );
3998	
3999	                                        if ( !anyFound ) {
4000	                                                return [];
4001	                                        }
4002	
4003	                                        break;
4004	                                }
4005	                        }
4006	                }
4007	
4008	                // Improper expression
4009	                if ( expr === old ) {
4010	                        if ( anyFound == null ) {
4011	                                Sizzle.error( expr );
4012	
4013	                        } else {
4014	                                break;
4015	                        }
4016	                }
4017	
4018	                old = expr;
4019	        }
4020	
4021	        return curLoop;
4022	};
4023	
4024	Sizzle.error = function( msg ) {
4025	        throw "Syntax error, unrecognized expression: " + msg;
4026	};
4027	
4028	var Expr = Sizzle.selectors = {
4029	        order: [ "ID", "NAME", "TAG" ],
4030	
4031	        match: {
4032	                ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
4033	                CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
4034	                NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
4035	                ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
4036	                TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
4037	                CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
4038	                POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
4039	                PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
4040	        },
4041	
4042	        leftMatch: {},
4043	
4044	        attrMap: {
4045	                "class": "className",
4046	                "for": "htmlFor"
4047	        },
4048	
4049	        attrHandle: {
4050	                href: function( elem ) {
4051	                        return elem.getAttribute( "href" );
4052	                },
4053	                type: function( elem ) {
4054	                        return elem.getAttribute( "type" );
4055	                }
4056	        },
4057	
4058	        relative: {
4059	                "+": function(checkSet, part){
4060	                        var isPartStr = typeof part === "string",
4061	                                isTag = isPartStr && !rNonWord.test( part ),
4062	                                isPartStrNotTag = isPartStr && !isTag;
4063	
4064	                        if ( isTag ) {
4065	                                part = part.toLowerCase();
4066	                        }
4067	
4068	                        for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
4069	                                if ( (elem = checkSet[i]) ) {
4070	                                        while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
4071	
4072	                                        checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
4073	                                                elem || false :
4074	                                                elem === part;
4075	                                }
4076	                        }
4077	
4078	                        if ( isPartStrNotTag ) {
4079	                                Sizzle.filter( part, checkSet, true );
4080	                        }
4081	                },
4082	
4083	                ">": function( checkSet, part ) {
4084	                        var elem,
4085	                                isPartStr = typeof part === "string",
4086	                                i = 0,
4087	                                l = checkSet.length;
4088	
4089	                        if ( isPartStr && !rNonWord.test( part ) ) {
4090	                                part = part.toLowerCase();
4091	
4092	                                for ( ; i < l; i++ ) {
4093	                                        elem = checkSet[i];
4094	
4095	                                        if ( elem ) {
4096	                                                var parent = elem.parentNode;
4097	                                                checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
4098	                                        }
4099	                                }
4100	
4101	                        } else {
4102	                                for ( ; i < l; i++ ) {
4103	                                        elem = checkSet[i];
4104	
4105	                                        if ( elem ) {
4106	                                                checkSet[i] = isPartStr ?
4107	                                                        elem.parentNode :
4108	                                                        elem.parentNode === part;
4109	                                        }
4110	                                }
4111	
4112	                                if ( isPartStr ) {
4113	                                        Sizzle.filter( part, checkSet, true );
4114	                                }
4115	                        }
4116	                },
4117	
4118	                "": function(checkSet, part, isXML){
4119	                        var nodeCheck,
4120	                                doneName = done++,
4121	                                checkFn = dirCheck;
4122	
4123	                        if ( typeof part === "string" && !rNonWord.test( part ) ) {
4124	                                part = part.toLowerCase();
4125	                                nodeCheck = part;
4126	                                checkFn = dirNodeCheck;
4127	                        }
4128	
4129	                        checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
4130	                },
4131	
4132	                "~": function( checkSet, part, isXML ) {
4133	                        var nodeCheck,
4134	                                doneName = done++,
4135	                                checkFn = dirCheck;
4136	
4137	                        if ( typeof part === "string" && !rNonWord.test( part ) ) {
4138	                                part = part.toLowerCase();
4139	                                nodeCheck = part;
4140	                                checkFn = dirNodeCheck;
4141	                        }
4142	
4143	                        checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
4144	                }
4145	        },
4146	
4147	        find: {
4148	                ID: function( match, context, isXML ) {
4149	                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
4150	                                var m = context.getElementById(match[1]);
4151	                                // Check parentNode to catch when Blackberry 4.6 returns
4152	                                // nodes that are no longer in the document #6963
4153	                                return m && m.parentNode ? [m] : [];
4154	                        }
4155	                },
4156	
4157	                NAME: function( match, context ) {
4158	                        if ( typeof context.getElementsByName !== "undefined" ) {
4159	                                var ret = [],
4160	                                        results = context.getElementsByName( match[1] );
4161	
4162	                                for ( var i = 0, l = results.length; i < l; i++ ) {
4163	                                        if ( results[i].getAttribute("name") === match[1] ) {
4164	                                                ret.push( results[i] );
4165	                                        }
4166	                                }
4167	
4168	                                return ret.length === 0 ? null : ret;
4169	                        }
4170	                },
4171	
4172	                TAG: function( match, context ) {
4173	                        if ( typeof context.getElementsByTagName !== "undefined" ) {
4174	                                return context.getElementsByTagName( match[1] );
4175	                        }
4176	                }
4177	        },
4178	        preFilter: {
4179	                CLASS: function( match, curLoop, inplace, result, not, isXML ) {
4180	                        match = " " + match[1].replace( rBackslash, "" ) + " ";
4181	
4182	                        if ( isXML ) {
4183	                                return match;
4184	                        }
4185	
4186	                        for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
4187	                                if ( elem ) {
4188	                                        if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
4189	                                                if ( !inplace ) {
4190	                                                        result.push( elem );
4191	                                                }
4192	
4193	                                        } else if ( inplace ) {
4194	                                                curLoop[i] = false;
4195	                                        }
4196	                                }
4197	                        }
4198	
4199	                        return false;
4200	                },
4201	
4202	                ID: function( match ) {
4203	                        return match[1].replace( rBackslash, "" );
4204	                },
4205	
4206	                TAG: function( match, curLoop ) {
4207	                        return match[1].replace( rBackslash, "" ).toLowerCase();
4208	                },
4209	
4210	                CHILD: function( match ) {
4211	                        if ( match[1] === "nth" ) {
4212	                                if ( !match[2] ) {
4213	                                        Sizzle.error( match[0] );
4214	                                }
4215	
4216	                                match[2] = match[2].replace(/^\+|\s*/g, '');
4217	
4218	                                // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
4219	                                var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
4220	                                        match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
4221	                                        !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
4222	
4223	                                // calculate the numbers (first)n+(last) including if they are negative
4224	                                match[2] = (test[1] + (test[2] || 1)) - 0;
4225	                                match[3] = test[3] - 0;
4226	                        }
4227	                        else if ( match[2] ) {
4228	                                Sizzle.error( match[0] );
4229	                        }
4230	
4231	                        // TODO: Move to normal caching system
4232	                        match[0] = done++;
4233	
4234	                        return match;
4235	                },
4236	
4237	                ATTR: function( match, curLoop, inplace, result, not, isXML ) {
4238	                        var name = match[1] = match[1].replace( rBackslash, "" );
4239	                       
4240	                        if ( !isXML && Expr.attrMap[name] ) {
4241	                                match[1] = Expr.attrMap[name];
4242	                        }
4243	
4244	                        // Handle if an un-quoted value was used
4245	                        match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
4246	
4247	                        if ( match[2] === "~=" ) {
4248	                                match[4] = " " + match[4] + " ";
4249	                        }
4250	
4251	                        return match;
4252	                },
4253	
4254	                PSEUDO: function( match, curLoop, inplace, result, not ) {
4255	                        if ( match[1] === "not" ) {
4256	                                // If we're dealing with a complex expression, or a simple one
4257	                                if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
4258	                                        match[3] = Sizzle(match[3], null, null, curLoop);
4259	
4260	                                } else {
4261	                                        var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
4262	
4263	                                        if ( !inplace ) {
4264	                                                result.push.apply( result, ret );
4265	                                        }
4266	
4267	                                        return false;
4268	                                }
4269	
4270	                        } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
4271	                                return true;
4272	                        }
4273	                       
4274	                        return match;
4275	                },
4276	
4277	                POS: function( match ) {
4278	                        match.unshift( true );
4279	
4280	                        return match;
4281	                }
4282	        },
4283	       
4284	        filters: {
4285	                enabled: function( elem ) {
4286	                        return elem.disabled === false && elem.type !== "hidden";
4287	                },
4288	
4289	                disabled: function( elem ) {
4290	                        return elem.disabled === true;
4291	                },
4292	
4293	                checked: function( elem ) {
4294	                        return elem.checked === true;
4295	                },
4296	               
4297	                selected: function( elem ) {
4298	                        // Accessing this property makes selected-by-default
4299	                        // options in Safari work properly
4300	                        if ( elem.parentNode ) {
4301	                                elem.parentNode.selectedIndex;
4302	                        }
4303	                       
4304	                        return elem.selected === true;
4305	                },
4306	
4307	                parent: function( elem ) {
4308	                        return !!elem.firstChild;
4309	                },
4310	
4311	                empty: function( elem ) {
4312	                        return !elem.firstChild;
4313	                },
4314	
4315	                has: function( elem, i, match ) {
4316	                        return !!Sizzle( match[3], elem ).length;
4317	                },
4318	
4319	                header: function( elem ) {
4320	                        return (/h\d/i).test( elem.nodeName );
4321	                },
4322	
4323	                text: function( elem ) {
4324	                        var attr = elem.getAttribute( "type" ), type = elem.type;
4325	                        // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
4326	                        // use getAttribute instead to test this case
4327	                        return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
4328	                },
4329	
4330	                radio: function( elem ) {
4331	                        return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
4332	                },
4333	
4334	                checkbox: function( elem ) {
4335	                        return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
4336	                },
4337	
4338	                file: function( elem ) {
4339	                        return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
4340	                },
4341	
4342	                password: function( elem ) {
4343	                        return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
4344	                },
4345	
4346	                submit: function( elem ) {
4347	                        var name = elem.nodeName.toLowerCase();
4348	                        return (name === "input" || name === "button") && "submit" === elem.type;
4349	                },
4350	
4351	                image: function( elem ) {
4352	                        return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
4353	                },
4354	
4355	                reset: function( elem ) {
4356	                        var name = elem.nodeName.toLowerCase();
4357	                        return (name === "input" || name === "button") && "reset" === elem.type;
4358	                },
4359	
4360	                button: function( elem ) {
4361	                        var name = elem.nodeName.toLowerCase();
4362	                        return name === "input" && "button" === elem.type || name === "button";
4363	                },
4364	
4365	                input: function( elem ) {
4366	                        return (/input|select|textarea|button/i).test( elem.nodeName );
4367	                },
4368	
4369	                focus: function( elem ) {
4370	                        return elem === elem.ownerDocument.activeElement;
4371	                }
4372	        },
4373	        setFilters: {
4374	                first: function( elem, i ) {
4375	                        return i === 0;
4376	                },
4377	
4378	                last: function( elem, i, match, array ) {
4379	                        return i === array.length - 1;
4380	                },
4381	
4382	                even: function( elem, i ) {
4383	                        return i % 2 === 0;
4384	                },
4385	
4386	                odd: function( elem, i ) {
4387	                        return i % 2 === 1;
4388	                },
4389	
4390	                lt: function( elem, i, match ) {
4391	                        return i < match[3] - 0;
4392	                },
4393	
4394	                gt: function( elem, i, match ) {
4395	                        return i > match[3] - 0;
4396	                },
4397	
4398	                nth: function( elem, i, match ) {
4399	                        return match[3] - 0 === i;
4400	                },
4401	
4402	                eq: function( elem, i, match ) {
4403	                        return match[3] - 0 === i;
4404	                }
4405	        },
4406	        filter: {
4407	                PSEUDO: function( elem, match, i, array ) {
4408	                        var name = match[1],
4409	                                filter = Expr.filters[ name ];
4410	
4411	                        if ( filter ) {
4412	                                return filter( elem, i, match, array );
4413	
4414	                        } else if ( name === "contains" ) {
4415	                                return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
4416	
4417	                        } else if ( name === "not" ) {
4418	                                var not = match[3];
4419	
4420	                                for ( var j = 0, l = not.length; j < l; j++ ) {
4421	                                        if ( not[j] === elem ) {
4422	                                                return false;
4423	                                        }
4424	                                }
4425	
4426	                                return true;
4427	
4428	                        } else {
4429	                                Sizzle.error( name );
4430	                        }
4431	                },
4432	
4433	                CHILD: function( elem, match ) {
4434	                        var type = match[1],
4435	                                node = elem;
4436	
4437	                        switch ( type ) {
4438	                                case "only":
4439	                                case "first":
4440	                                        while ( (node = node.previousSibling) )  {
4441	                                                if ( node.nodeType === 1 ) { 
4442	                                                        return false; 
4443	                                                }
4444	                                        }
4445	
4446	                                        if ( type === "first" ) { 
4447	                                                return true; 
4448	                                        }
4449	
4450	                                        node = elem;
4451	
4452	                                case "last":
4453	                                        while ( (node = node.nextSibling) )      {
4454	                                                if ( node.nodeType === 1 ) { 
4455	                                                        return false; 
4456	                                                }
4457	                                        }
4458	
4459	                                        return true;
4460	
4461	                                case "nth":
4462	                                        var first = match[2],
4463	                                                last = match[3];
4464	
4465	                                        if ( first === 1 && last === 0 ) {
4466	                                                return true;
4467	                                        }
4468	                                       
4469	                                        var doneName = match[0],
4470	                                                parent = elem.parentNode;
4471	       
4472	                                        if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
4473	                                                var count = 0;
4474	                                               
4475	                                                for ( node = parent.firstChild; node; node = node.nextSibling ) {
4476	                                                        if ( node.nodeType === 1 ) {
4477	                                                                node.nodeIndex = ++count;
4478	                                                        }
4479	                                                } 
4480	
4481	                                                parent.sizcache = doneName;
4482	                                        }
4483	                                       
4484	                                        var diff = elem.nodeIndex - last;
4485	
4486	                                        if ( first === 0 ) {
4487	                                                return diff === 0;
4488	
4489	                                        } else {
4490	                                                return ( diff % first === 0 && diff / first >= 0 );
4491	                                        }
4492	                        }
4493	                },
4494	
4495	                ID: function( elem, match ) {
4496	                        return elem.nodeType === 1 && elem.getAttribute("id") === match;
4497	                },
4498	
4499	                TAG: function( elem, match ) {
4500	                        return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
4501	                },
4502	               
4503	                CLASS: function( elem, match ) {
4504	                        return (" " + (elem.className || elem.getAttribute("class")) + " ")
4505	                                .indexOf( match ) > -1;
4506	                },
4507	
4508	                ATTR: function( elem, match ) {
4509	                        var name = match[1],
4510	                                result = Expr.attrHandle[ name ] ?
4511	                                        Expr.attrHandle[ name ]( elem ) :
4512	                                        elem[ name ] != null ?
4513	                                                elem[ name ] :
4514	                                                elem.getAttribute( name ),
4515	                                value = result + "",
4516	                                type = match[2],
4517	                                check = match[4];
4518	
4519	                        return result == null ?
4520	                                type === "!=" :
4521	                                type === "=" ?
4522	                                value === check :
4523	                                type === "*=" ?
4524	                                value.indexOf(check) >= 0 :
4525	                                type === "~=" ?
4526	                                (" " + value + " ").indexOf(check) >= 0 :
4527	                                !check ?
4528	                                value && result !== false :
4529	                                type === "!=" ?
4530	                                value !== check :
4531	                                type === "^=" ?
4532	                                value.indexOf(check) === 0 :
4533	                                type === "$=" ?
4534	                                value.substr(value.length - check.length) === check :
4535	                                type === "|=" ?
4536	                                value === check || value.substr(0, check.length + 1) === check + "-" :
4537	                                false;
4538	                },
4539	
4540	                POS: function( elem, match, i, array ) {
4541	                        var name = match[2],
4542	                                filter = Expr.setFilters[ name ];
4543	
4544	                        if ( filter ) {
4545	                                return filter( elem, i, match, array );
4546	                        }
4547	                }
4548	        }
4549	};
4550	
4551	var origPOS = Expr.match.POS,
4552	        fescape = function(all, num){
4553	                return "\\" + (num - 0 + 1);
4554	        };
4555	
4556	for ( var type in Expr.match ) {
4557	        Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
4558	        Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
4559	}
4560	
4561	var makeArray = function( array, results ) {
4562	        array = Array.prototype.slice.call( array, 0 );
4563	
4564	        if ( results ) {
4565	                results.push.apply( results, array );
4566	                return results;
4567	        }
4568	       
4569	        return array;
4570	};
4571	
4572	// Perform a simple check to determine if the browser is capable of
4573	// converting a NodeList to an array using builtin methods.
4574	// Also verifies that the returned array holds DOM nodes
4575	// (which is not the case in the Blackberry browser)
4576	try {
4577	        Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
4578	
4579	// Provide a fallback method if it does not work
4580	} catch( e ) {
4581	        makeArray = function( array, results ) {
4582	                var i = 0,
4583	                        ret = results || [];
4584	
4585	                if ( toString.call(array) === "[object Array]" ) {
4586	                        Array.prototype.push.apply( ret, array );
4587	
4588	                } else {
4589	                        if ( typeof array.length === "number" ) {
4590	                                for ( var l = array.length; i < l; i++ ) {
4591	                                        ret.push( array[i] );
4592	                                }
4593	
4594	                        } else {
4595	                                for ( ; array[i]; i++ ) {
4596	                                        ret.push( array[i] );
4597	                                }
4598	                        }
4599	                }
4600	
4601	                return ret;
4602	        };
4603	}
4604	
4605	var sortOrder, siblingCheck;
4606	
4607	if ( document.documentElement.compareDocumentPosition ) {
4608	        sortOrder = function( a, b ) {
4609	                if ( a === b ) {
4610	                        hasDuplicate = true;
4611	                        return 0;
4612	                }
4613	
4614	                if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
4615	                        return a.compareDocumentPosition ? -1 : 1;
4616	                }
4617	
4618	                return a.compareDocumentPosition(b) & 4 ? -1 : 1;
4619	        };
4620	
4621	} else {
4622	        sortOrder = function( a, b ) {
4623	                // The nodes are identical, we can exit early
4624	                if ( a === b ) {
4625	                        hasDuplicate = true;
4626	                        return 0;
4627	
4628	                // Fallback to using sourceIndex (in IE) if it's available on both nodes
4629	                } else if ( a.sourceIndex && b.sourceIndex ) {
4630	                        return a.sourceIndex - b.sourceIndex;
4631	                }
4632	
4633	                var al, bl,
4634	                        ap = [],
4635	                        bp = [],
4636	                        aup = a.parentNode,
4637	                        bup = b.parentNode,
4638	                        cur = aup;
4639	
4640	                // If the nodes are siblings (or identical) we can do a quick check
4641	                if ( aup === bup ) {
4642	                        return siblingCheck( a, b );
4643	
4644	                // If no parents were found then the nodes are disconnected
4645	                } else if ( !aup ) {
4646	                        return -1;
4647	
4648	                } else if ( !bup ) {
4649	                        return 1;
4650	                }
4651	
4652	                // Otherwise they're somewhere else in the tree so we need
4653	                // to build up a full list of the parentNodes for comparison
4654	                while ( cur ) {
4655	                        ap.unshift( cur );
4656	                        cur = cur.parentNode;
4657	                }
4658	
4659	                cur = bup;
4660	
4661	                while ( cur ) {
4662	                        bp.unshift( cur );
4663	                        cur = cur.parentNode;
4664	                }
4665	
4666	                al = ap.length;
4667	                bl = bp.length;
4668	
4669	                // Start walking down the tree looking for a discrepancy
4670	                for ( var i = 0; i < al && i < bl; i++ ) {
4671	                        if ( ap[i] !== bp[i] ) {
4672	                                return siblingCheck( ap[i], bp[i] );
4673	                        }
4674	                }
4675	
4676	                // We ended someplace up the tree so do a sibling check
4677	                return i === al ?
4678	                        siblingCheck( a, bp[i], -1 ) :
4679	                        siblingCheck( ap[i], b, 1 );
4680	        };
4681	
4682	        siblingCheck = function( a, b, ret ) {
4683	                if ( a === b ) {
4684	                        return ret;
4685	                }
4686	
4687	                var cur = a.nextSibling;
4688	
4689	                while ( cur ) {
4690	                        if ( cur === b ) {
4691	                                return -1;
4692	                        }
4693	
4694	                        cur = cur.nextSibling;
4695	                }
4696	
4697	                return 1;
4698	        };
4699	}
4700	
4701	// Utility function for retreiving the text value of an array of DOM nodes
4702	Sizzle.getText = function( elems ) {
4703	        var ret = "", elem;
4704	
4705	        for ( var i = 0; elems[i]; i++ ) {
4706	                elem = elems[i];
4707	
4708	                // Get the text from text nodes and CDATA nodes
4709	                if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
4710	                        ret += elem.nodeValue;
4711	
4712	                // Traverse everything else, except comment nodes
4713	                } else if ( elem.nodeType !== 8 ) {
4714	                        ret += Sizzle.getText( elem.childNodes );
4715	                }
4716	        }
4717	
4718	        return ret;
4719	};
4720	
4721	// Check to see if the browser returns elements by name when
4722	// querying by getElementById (and provide a workaround)
4723	(function(){
4724	        // We're going to inject a fake input element with a specified name
4725	        var form = document.createElement("div"),
4726	                id = "script" + (new Date()).getTime(),
4727	                root = document.documentElement;
4728	
4729	        form.innerHTML = "<a name='" + id + "'/>";
4730	
4731	        // Inject it into the root element, check its status, and remove it quickly
4732	        root.insertBefore( form, root.firstChild );
4733	
4734	        // The workaround has to do additional checks after a getElementById
4735	        // Which slows things down for other browsers (hence the branching)
4736	        if ( document.getElementById( id ) ) {
4737	                Expr.find.ID = function( match, context, isXML ) {
4738	                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
4739	                                var m = context.getElementById(match[1]);
4740	
4741	                                return m ?
4742	                                        m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
4743	                                                [m] :
4744	                                                undefined :
4745	                                        [];
4746	                        }
4747	                };
4748	
4749	                Expr.filter.ID = function( elem, match ) {
4750	                        var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
4751	
4752	                        return elem.nodeType === 1 && node && node.nodeValue === match;
4753	                };
4754	        }
4755	
4756	        root.removeChild( form );
4757	
4758	        // release memory in IE
4759	        root = form = null;
4760	})();
4761	
4762	(function(){
4763	        // Check to see if the browser returns only elements
4764	        // when doing getElementsByTagName("*")
4765	
4766	        // Create a fake element
4767	        var div = document.createElement("div");
4768	        div.appendChild( document.createComment("") );
4769	
4770	        // Make sure no comments are found
4771	        if ( div.getElementsByTagName("*").length > 0 ) {
4772	                Expr.find.TAG = function( match, context ) {
4773	                        var results = context.getElementsByTagName( match[1] );
4774	
4775	                        // Filter out possible comments
4776	                        if ( match[1] === "*" ) {
4777	                                var tmp = [];
4778	
4779	                                for ( var i = 0; results[i]; i++ ) {
4780	                                        if ( results[i].nodeType === 1 ) {
4781	                                                tmp.push( results[i] );
4782	                                        }
4783	                                }
4784	
4785	                                results = tmp;
4786	                        }
4787	
4788	                        return results;
4789	                };
4790	        }
4791	
4792	        // Check to see if an attribute returns normalized href attributes
4793	        div.innerHTML = "<a href='#'></a>";
4794	
4795	        if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
4796	                        div.firstChild.getAttribute("href") !== "#" ) {
4797	
4798	                Expr.attrHandle.href = function( elem ) {
4799	                        return elem.getAttribute( "href", 2 );
4800	                };
4801	        }
4802	
4803	        // release memory in IE
4804	        div = null;
4805	})();
4806	
4807	if ( document.querySelectorAll ) {
4808	        (function(){
4809	                var oldSizzle = Sizzle,
4810	                        div = document.createElement("div"),
4811	                        id = "__sizzle__";
4812	
4813	                div.innerHTML = "<p class='TEST'></p>";
4814	
4815	                // Safari can't handle uppercase or unicode characters when
4816	                // in quirks mode.
4817	                if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
4818	                        return;
4819	                }
4820	       
4821	                Sizzle = function( query, context, extra, seed ) {
4822	                        context = context || document;
4823	
4824	                        // Only use querySelectorAll on non-XML documents
4825	                        // (ID selectors don't work in non-HTML documents)
4826	                        if ( !seed && !Sizzle.isXML(context) ) {
4827	                                // See if we find a selector to speed up
4828	                                var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
4829	                               
4830	                                if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
4831	                                        // Speed-up: Sizzle("TAG")
4832	                                        if ( match[1] ) {
4833	                                                return makeArray( context.getElementsByTagName( query ), extra );
4834	                                       
4835	                                        // Speed-up: Sizzle(".CLASS")
4836	                                        } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
4837	                                                return makeArray( context.getElementsByClassName( match[2] ), extra );
4838	                                        }
4839	                                }
4840	                               
4841	                                if ( context.nodeType === 9 ) {
4842	                                        // Speed-up: Sizzle("body")
4843	                                        // The body element only exists once, optimize finding it
4844	                                        if ( query === "body" && context.body ) {
4845	                                                return makeArray( [ context.body ], extra );
4846	                                               
4847	                                        // Speed-up: Sizzle("#ID")
4848	                                        } else if ( match && match[3] ) {
4849	                                                var elem = context.getElementById( match[3] );
4850	
4851	                                                // Check parentNode to catch when Blackberry 4.6 returns
4852	                                                // nodes that are no longer in the document #6963
4853	                                                if ( elem && elem.parentNode ) {
4854	                                                        // Handle the case where IE and Opera return items
4855	                                                        // by name instead of ID
4856	                                                        if ( elem.id === match[3] ) {
4857	                                                                return makeArray( [ elem ], extra );
4858	                                                        }
4859	                                                       
4860	                                                } else {
4861	                                                        return makeArray( [], extra );
4862	                                                }
4863	                                        }
4864	                                       
4865	                                        try {
4866	                                                return makeArray( context.querySelectorAll(query), extra );
4867	                                        } catch(qsaError) {}
4868	
4869	                                // qSA works strangely on Element-rooted queries
4870	                                // We can work around this by specifying an extra ID on the root
4871	                                // and working up from there (Thanks to Andrew Dupont for the technique)
4872	                                // IE 8 doesn't work on object elements
4873	                                } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
4874	                                        var oldContext = context,
4875	                                                old = context.getAttribute( "id" ),
4876	                                                nid = old || id,
4877	                                                hasParent = context.parentNode,
4878	                                                relativeHierarchySelector = /^\s*[+~]/.test( query );
4879	
4880	                                        if ( !old ) {
4881	                                                context.setAttribute( "id", nid );
4882	                                        } else {
4883	                                                nid = nid.replace( /'/g, "\\$&" );
4884	                                        }
4885	                                        if ( relativeHierarchySelector && hasParent ) {
4886	                                                context = context.parentNode;
4887	                                        }
4888	
4889	                                        try {
4890	                                                if ( !relativeHierarchySelector || hasParent ) {
4891	                                                        return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
4892	                                                }
4893	
4894	                                        } catch(pseudoError) {
4895	                                        } finally {
4896	                                                if ( !old ) {
4897	                                                        oldContext.removeAttribute( "id" );
4898	                                                }
4899	                                        }
4900	                                }
4901	                        }
4902	               
4903	                        return oldSizzle(query, context, extra, seed);
4904	                };
4905	
4906	                for ( var prop in oldSizzle ) {
4907	                        Sizzle[ prop ] = oldSizzle[ prop ];
4908	                }
4909	
4910	                // release memory in IE
4911	                div = null;
4912	        })();
4913	}
4914	
4915	(function(){
4916	        var html = document.documentElement,
4917	                matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
4918	
4919	        if ( matches ) {
4920	                // Check to see if it's possible to do matchesSelector
4921	                // on a disconnected node (IE 9 fails this)
4922	                var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
4923	                        pseudoWorks = false;
4924	
4925	                try {
4926	                        // This should fail with an exception
4927	                        // Gecko does not error, returns false instead
4928	                        matches.call( document.documentElement, "[test!='']:sizzle" );
4929	       
4930	                } catch( pseudoError ) {
4931	                        pseudoWorks = true;
4932	                }
4933	
4934	                Sizzle.matchesSelector = function( node, expr ) {
4935	                        // Make sure that attribute selectors are quoted
4936	                        expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
4937	
4938	                        if ( !Sizzle.isXML( node ) ) {
4939	                                try { 
4940	                                        if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
4941	                                                var ret = matches.call( node, expr );
4942	
4943	                                                // IE 9's matchesSelector returns false on disconnected nodes
4944	                                                if ( ret || !disconnectedMatch ||
4945	                                                                // As well, disconnected nodes are said to be in a document
4946	                                                                // fragment in IE 9, so check for that
4947	                                                                node.document && node.document.nodeType !== 11 ) {
4948	                                                        return ret;
4949	                                                }
4950	                                        }
4951	                                } catch(e) {}
4952	                        }
4953	
4954	                        return Sizzle(expr, null, null, [node]).length > 0;
4955	                };
4956	        }
4957	})();
4958	
4959	(function(){
4960	        var div = document.createElement("div");
4961	
4962	        div.innerHTML = "<div class='test e'></div><div class='test'></div>";
4963	
4964	        // Opera can't find a second classname (in 9.6)
4965	        // Also, make sure that getElementsByClassName actually exists
4966	        if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
4967	                return;
4968	        }
4969	
4970	        // Safari caches class attributes, doesn't catch changes (in 3.2)
4971	        div.lastChild.className = "e";
4972	
4973	        if ( div.getElementsByClassName("e").length === 1 ) {
4974	                return;
4975	        }
4976	       
4977	        Expr.order.splice(1, 0, "CLASS");
4978	        Expr.find.CLASS = function( match, context, isXML ) {
4979	                if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
4980	                        return context.getElementsByClassName(match[1]);
4981	                }
4982	        };
4983	
4984	        // release memory in IE
4985	        div = null;
4986	})();
4987	
4988	function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
4989	        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
4990	                var elem = checkSet[i];
4991	
4992	                if ( elem ) {
4993	                        var match = false;
4994	
4995	                        elem = elem[dir];
4996	
4997	                        while ( elem ) {
4998	                                if ( elem.sizcache === doneName ) {
4999	                                        match = checkSet[elem.sizset];
5000	                                        break;
5001	                                }
5002	
5003	                                if ( elem.nodeType === 1 && !isXML ){
5004	                                        elem.sizcache = doneName;
5005	                                        elem.sizset = i;
5006	                                }
5007	
5008	                                if ( elem.nodeName.toLowerCase() === cur ) {
5009	                                        match = elem;
5010	                                        break;
5011	                                }
5012	
5013	                                elem = elem[dir];
5014	                        }
5015	
5016	                        checkSet[i] = match;
5017	                }
5018	        }
5019	}
5020	
5021	function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
5022	        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
5023	                var elem = checkSet[i];
5024	
5025	                if ( elem ) {
5026	                        var match = false;
5027	                       
5028	                        elem = elem[dir];
5029	
5030	                        while ( elem ) {
5031	                                if ( elem.sizcache === doneName ) {
5032	                                        match = checkSet[elem.sizset];
5033	                                        break;
5034	                                }
5035	
5036	                                if ( elem.nodeType === 1 ) {
5037	                                        if ( !isXML ) {
5038	                                                elem.sizcache = doneName;
5039	                                                elem.sizset = i;
5040	                                        }
5041	
5042	                                        if ( typeof cur !== "string" ) {
5043	                                                if ( elem === cur ) {
5044	                                                        match = true;
5045	                                                        break;
5046	                                                }
5047	
5048	                                        } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
5049	                                                match = elem;
5050	                                                break;
5051	                                        }
5052	                                }
5053	
5054	                                elem = elem[dir];
5055	                        }
5056	
5057	                        checkSet[i] = match;
5058	                }
5059	        }
5060	}
5061	
5062	if ( document.documentElement.contains ) {
5063	        Sizzle.contains = function( a, b ) {
5064	                return a !== b && (a.contains ? a.contains(b) : true);
5065	        };
5066	
5067	} else if ( document.documentElement.compareDocumentPosition ) {
5068	        Sizzle.contains = function( a, b ) {
5069	                return !!(a.compareDocumentPosition(b) & 16);
5070	        };
5071	
5072	} else {
5073	        Sizzle.contains = function() {
5074	                return false;
5075	        };
5076	}
5077	
5078	Sizzle.isXML = function( elem ) {
5079	        // documentElement is verified for cases where it doesn't yet exist
5080	        // (such as loading iframes in IE - #4833)
5081	        var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
5082	
5083	        return documentElement ? documentElement.nodeName !== "HTML" : false;
5084	};
5085	
5086	var posProcess = function( selector, context ) {
5087	        var match,
5088	                tmpSet = [],
5089	                later = "",
5090	                root = context.nodeType ? [context] : context;
5091	
5092	        // Position selectors must be done after the filter
5093	        // And so must :not(positional) so we move all PSEUDOs to the end
5094	        while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
5095	                later += match[0];
5096	                selector = selector.replace( Expr.match.PSEUDO, "" );
5097	        }
5098	
5099	        selector = Expr.relative[selector] ? selector + "*" : selector;
5100	
5101	        for ( var i = 0, l = root.length; i < l; i++ ) {
5102	                Sizzle( selector, root[i], tmpSet );
5103	        }
5104	
5105	        return Sizzle.filter( later, tmpSet );
5106	};
5107	
5108	// EXPOSE
5109	jQuery.find = Sizzle;
5110	jQuery.expr = Sizzle.selectors;
5111	jQuery.expr[":"] = jQuery.expr.filters;
5112	jQuery.unique = Sizzle.uniqueSort;
5113	jQuery.text = Sizzle.getText;
5114	jQuery.isXMLDoc = Sizzle.isXML;
5115	jQuery.contains = Sizzle.contains;
5116	
5117	
5118	})();
5119	
5120	
5121	var runtil = /Until$/,
5122	        rparentsprev = /^(?:parents|prevUntil|prevAll)/,
5123	        // Note: This RegExp should be improved, or likely pulled from Sizzle
5124	        rmultiselector = /,/,
5125	        isSimple = /^.[^:#\[\.,]*$/,
5126	        slice = Array.prototype.slice,
5127	        POS = jQuery.expr.match.POS,
5128	        // methods guaranteed to produce a unique set when starting from a unique set
5129	        guaranteedUnique = {
5130	                children: true,
5131	                contents: true,
5132	                next: true,
5133	                prev: true
5134	        };
5135	
5136	jQuery.fn.extend({
5137	        find: function( selector ) {
5138	                var self = this,
5139	                        i, l;
5140	
5141	                if ( typeof selector !== "string" ) {
5142	                        return jQuery( selector ).filter(function() {
5143	                                for ( i = 0, l = self.length; i < l; i++ ) {
5144	                                        if ( jQuery.contains( self[ i ], this ) ) {
5145	                                                return true;
5146	                                        }
5147	                                }
5148	                        });
5149	                }
5150	
5151	                var ret = this.pushStack( "", "find", selector ),
5152	                        length, n, r;
5153	
5154	                for ( i = 0, l = this.length; i < l; i++ ) {
5155	                        length = ret.length;
5156	                        jQuery.find( selector, this[i], ret );
5157	
5158	                        if ( i > 0 ) {
5159	                                // Make sure that the results are unique
5160	                                for ( n = length; n < ret.length; n++ ) {
5161	                                        for ( r = 0; r < length; r++ ) {
5162	                                                if ( ret[r] === ret[n] ) {
5163	                                                        ret.splice(n--, 1);
5164	                                                        break;
5165	                                                }
5166	                                        }
5167	                                }
5168	                        }
5169	                }
5170	
5171	                return ret;
5172	        },
5173	
5174	        has: function( target ) {
5175	                var targets = jQuery( target );
5176	                return this.filter(function() {
5177	                        for ( var i = 0, l = targets.length; i < l; i++ ) {
5178	                                if ( jQuery.contains( this, targets[i] ) ) {
5179	                                        return true;
5180	                                }
5181	                        }
5182	                });
5183	        },
5184	
5185	        not: function( selector ) {
5186	                return this.pushStack( winnow(this, selector, false), "not", selector);
5187	        },
5188	
5189	        filter: function( selector ) {
5190	                return this.pushStack( winnow(this, selector, true), "filter", selector );
5191	        },
5192	
5193	        is: function( selector ) {
5194	                return !!selector && ( typeof selector === "string" ?
5195	                        jQuery.filter( selector, this ).length > 0 :
5196	                        this.filter( selector ).length > 0 );
5197	        },
5198	
5199	        closest: function( selectors, context ) {
5200	                var ret = [], i, l, cur = this[0];
5201	               
5202	                // Array
5203	                if ( jQuery.isArray( selectors ) ) {
5204	                        var match, selector,
5205	                                matches = {},
5206	                                level = 1;
5207	
5208	                        if ( cur && selectors.length ) {
5209	                                for ( i = 0, l = selectors.length; i < l; i++ ) {
5210	                                        selector = selectors[i];
5211	
5212	                                        if ( !matches[ selector ] ) {
5213	                                                matches[ selector ] = POS.test( selector ) ?
5214	                                                        jQuery( selector, context || this.context ) :
5215	                                                        selector;
5216	                                        }
5217	                                }
5218	
5219	                                while ( cur && cur.ownerDocument && cur !== context ) {
5220	                                        for ( selector in matches ) {
5221	                                                match = matches[ selector ];
5222	
5223	                                                if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) {
5224	                                                        ret.push({ selector: selector, elem: cur, level: level });
5225	                                                }
5226	                                        }
5227	
5228	                                        cur = cur.parentNode;
5229	                                        level++;
5230	                                }
5231	                        }
5232	
5233	                        return ret;
5234	                }
5235	
5236	                // String
5237	                var pos = POS.test( selectors ) || typeof selectors !== "string" ?
5238	                                jQuery( selectors, context || this.context ) :
5239	                                0;
5240	
5241	                for ( i = 0, l = this.length; i < l; i++ ) {
5242	                        cur = this[i];
5243	
5244	                        while ( cur ) {
5245	                                if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
5246	                                        ret.push( cur );
5247	                                        break;
5248	
5249	                                } else {
5250	                                        cur = cur.parentNode;
5251	                                        if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
5252	                                                break;
5253	                                        }
5254	                                }
5255	                        }
5256	                }
5257	
5258	                ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
5259	
5260	                return this.pushStack( ret, "closest", selectors );
5261	        },
5262	
5263	        // Determine the position of an element within
5264	        // the matched set of elements
5265	        index: function( elem ) {
5266	                if ( !elem || typeof elem === "string" ) {
5267	                        return jQuery.inArray( this[0],
5268	                                // If it receives a string, the selector is used
5269	                                // If it receives nothing, the siblings are used
5270	                                elem ? jQuery( elem ) : this.parent().children() );
5271	                }
5272	                // Locate the position of the desired element
5273	                return jQuery.inArray(
5274	                        // If it receives a jQuery object, the first element is used
5275	                        elem.jquery ? elem[0] : elem, this );
5276	        },
5277	
5278	        add: function( selector, context ) {
5279	                var set = typeof selector === "string" ?
5280	                                jQuery( selector, context ) :
5281	                                jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
5282	                        all = jQuery.merge( this.get(), set );
5283	
5284	                return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
5285	                        all :
5286	                        jQuery.unique( all ) );
5287	        },
5288	
5289	        andSelf: function() {
5290	                return this.add( this.prevObject );
5291	        }
5292	});
5293	
5294	// A painfully simple check to see if an element is disconnected
5295	// from a document (should be improved, where feasible).
5296	function isDisconnected( node ) {
5297	        return !node || !node.parentNode || node.parentNode.nodeType === 11;
5298	}
5299	
5300	jQuery.each({
5301	        parent: function( elem ) {
5302	                var parent = elem.parentNode;
5303	                return parent && parent.nodeType !== 11 ? parent : null;
5304	        },
5305	        parents: function( elem ) {
5306	                return jQuery.dir( elem, "parentNode" );
5307	        },
5308	        parentsUntil: function( elem, i, until ) {
5309	                return jQuery.dir( elem, "parentNode", until );
5310	        },
5311	        next: function( elem ) {
5312	                return jQuery.nth( elem, 2, "nextSibling" );
5313	        },
5314	        prev: function( elem ) {
5315	                return jQuery.nth( elem, 2, "previousSibling" );
5316	        },
5317	        nextAll: function( elem ) {
5318	                return jQuery.dir( elem, "nextSibling" );
5319	        },
5320	        prevAll: function( elem ) {
5321	                return jQuery.dir( elem, "previousSibling" );
5322	        },
5323	        nextUntil: function( elem, i, until ) {
5324	                return jQuery.dir( elem, "nextSibling", until );
5325	        },
5326	        prevUntil: function( elem, i, until ) {
5327	                return jQuery.dir( elem, "previousSibling", until );
5328	        },
5329	        siblings: function( elem ) {
5330	                return jQuery.sibling( elem.parentNode.firstChild, elem );
5331	        },
5332	        children: function( elem ) {
5333	                return jQuery.sibling( elem.firstChild );
5334	        },
5335	        contents: function( elem ) {
5336	                return jQuery.nodeName( elem, "iframe" ) ?
5337	                        elem.contentDocument || elem.contentWindow.document :
5338	                        jQuery.makeArray( elem.childNodes );
5339	        }
5340	}, function( name, fn ) {
5341	        jQuery.fn[ name ] = function( until, selector ) {
5342	                var ret = jQuery.map( this, fn, until ),
5343	                        // The variable 'args' was introduced in
5344	                        // https://github.com/jquery/jquery/commit/52a0238
5345	                        // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
5346	                        // http://code.google.com/p/v8/issues/detail?id=1050
5347	                        args = slice.call(arguments);
5348	
5349	                if ( !runtil.test( name ) ) {
5350	                        selector = until;
5351	                }
5352	
5353	                if ( selector && typeof selector === "string" ) {
5354	                        ret = jQuery.filter( selector, ret );
5355	                }
5356	
5357	                ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
5358	
5359	                if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
5360	                        ret = ret.reverse();
5361	                }
5362	
5363	                return this.pushStack( ret, name, args.join(",") );
5364	        };
5365	});
5366	
5367	jQuery.extend({
5368	        filter: function( expr, elems, not ) {
5369	                if ( not ) {
5370	                        expr = ":not(" + expr + ")";
5371	                }
5372	
5373	                return elems.length === 1 ?
5374	                        jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
5375	                        jQuery.find.matches(expr, elems);
5376	        },
5377	
5378	        dir: function( elem, dir, until ) {
5379	                var matched = [],
5380	                        cur = elem[ dir ];
5381	
5382	                while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
5383	                        if ( cur.nodeType === 1 ) {
5384	                                matched.push( cur );
5385	                        }
5386	                        cur = cur[dir];
5387	                }
5388	                return matched;
5389	        },
5390	
5391	        nth: function( cur, result, dir, elem ) {
5392	                result = result || 1;
5393	                var num = 0;
5394	
5395	                for ( ; cur; cur = cur[dir] ) {
5396	                        if ( cur.nodeType === 1 && ++num === result ) {
5397	                                break;
5398	                        }
5399	                }
5400	
5401	                return cur;
5402	        },
5403	
5404	        sibling: function( n, elem ) {
5405	                var r = [];
5406	
5407	                for ( ; n; n = n.nextSibling ) {
5408	                        if ( n.nodeType === 1 && n !== elem ) {
5409	                                r.push( n );
5410	                        }
5411	                }
5412	
5413	                return r;
5414	        }
5415	});
5416	
5417	// Implement the identical functionality for filter and not
5418	function winnow( elements, qualifier, keep ) {
5419	
5420	        // Can't pass null or undefined to indexOf in Firefox 4
5421	        // Set to 0 to skip string check
5422	        qualifier = qualifier || 0;
5423	
5424	        if ( jQuery.isFunction( qualifier ) ) {
5425	                return jQuery.grep(elements, function( elem, i ) {
5426	                        var retVal = !!qualifier.call( elem, i, elem );
5427	                        return retVal === keep;
5428	                });
5429	
5430	        } else if ( qualifier.nodeType ) {
5431	                return jQuery.grep(elements, function( elem, i ) {
5432	                        return (elem === qualifier) === keep;
5433	                });
5434	
5435	        } else if ( typeof qualifier === "string" ) {
5436	                var filtered = jQuery.grep(elements, function( elem ) {
5437	                        return elem.nodeType === 1;
5438	                });
5439	
5440	                if ( isSimple.test( qualifier ) ) {
5441	                        return jQuery.filter(qualifier, filtered, !keep);
5442	                } else {
5443	                        qualifier = jQuery.filter( qualifier, filtered );
5444	                }
5445	        }
5446	
5447	        return jQuery.grep(elements, function( elem, i ) {
5448	                return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
5449	        });
5450	}
5451	
5452	
5453	
5454	
5455	var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
5456	        rleadingWhitespace = /^\s+/,
5457	        rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
5458	        rtagName = /<([\w:]+)/,
5459	        rtbody = /<tbody/i,
5460	        rhtml = /<|&#?\w+;/,
5461	        rnocache = /<(?:script|object|embed|option|style)/i,
5462	        // checked="checked" or checked
5463	        rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5464	        rscriptType = /\/(java|ecma)script/i,
5465	        rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
5466	        wrapMap = {
5467	                option: [ 1, "<select multiple='multiple'>", "</select>" ],
5468	                legend: [ 1, "<fieldset>", "</fieldset>" ],
5469	                thead: [ 1, "<table>", "</table>" ],
5470	                tr: [ 2, "<table><tbody>", "</tbody></table>" ],
5471	                td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
5472	                col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
5473	                area: [ 1, "<map>", "</map>" ],
5474	                _default: [ 0, "", "" ]
5475	        };
5476	
5477	wrapMap.optgroup = wrapMap.option;
5478	wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
5479	wrapMap.th = wrapMap.td;
5480	
5481	// IE can't serialize <link> and <script> tags normally
5482	if ( !jQuery.support.htmlSerialize ) {
5483	        wrapMap._default = [ 1, "div<div>", "</div>" ];
5484	}
5485	
5486	jQuery.fn.extend({
5487	        text: function( text ) {
5488	                if ( jQuery.isFunction(text) ) {
5489	                        return this.each(function(i) {
5490	                                var self = jQuery( this );
5491	
5492	                                self.text( text.call(this, i, self.text()) );
5493	                        });
5494	                }
5495	
5496	                if ( typeof text !== "object" && text !== undefined ) {
5497	                        return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
5498	                }
5499	
5500	                return jQuery.text( this );
5501	        },
5502	
5503	        wrapAll: function( html ) {
5504	                if ( jQuery.isFunction( html ) ) {
5505	                        return this.each(function(i) {
5506	                                jQuery(this).wrapAll( html.call(this, i) );
5507	                        });
5508	                }
5509	
5510	                if ( this[0] ) {
5511	                        // The elements to wrap the target around
5512	                        var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
5513	
5514	                        if ( this[0].parentNode ) {
5515	                                wrap.insertBefore( this[0] );
5516	                        }
5517	
5518	                        wrap.map(function() {
5519	                                var elem = this;
5520	
5521	                                while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
5522	                                        elem = elem.firstChild;
5523	                                }
5524	
5525	                                return elem;
5526	                        }).append( this );
5527	                }
5528	
5529	                return this;
5530	        },
5531	
5532	        wrapInner: function( html ) {
5533	                if ( jQuery.isFunction( html ) ) {
5534	                        return this.each(function(i) {
5535	                                jQuery(this).wrapInner( html.call(this, i) );
5536	                        });
5537	                }
5538	
5539	                return this.each(function() {
5540	                        var self = jQuery( this ),
5541	                                contents = self.contents();
5542	
5543	                        if ( contents.length ) {
5544	                                contents.wrapAll( html );
5545	
5546	                        } else {
5547	                                self.append( html );
5548	                        }
5549	                });
5550	        },
5551	
5552	        wrap: function( html ) {
5553	                return this.each(function() {
5554	                        jQuery( this ).wrapAll( html );
5555	                });
5556	        },
5557	
5558	        unwrap: function() {
5559	                return this.parent().each(function() {
5560	                        if ( !jQuery.nodeName( this, "body" ) ) {
5561	                                jQuery( this ).replaceWith( this.childNodes );
5562	                        }
5563	                }).end();
5564	        },
5565	
5566	        append: function() {
5567	                return this.domManip(arguments, true, function( elem ) {
5568	                        if ( this.nodeType === 1 ) {
5569	                                this.appendChild( elem );
5570	                        }
5571	                });
5572	        },
5573	
5574	        prepend: function() {
5575	                return this.domManip(arguments, true, function( elem ) {
5576	                        if ( this.nodeType === 1 ) {
5577	                                this.insertBefore( elem, this.firstChild );
5578	                        }
5579	                });
5580	        },
5581	
5582	        before: function() {
5583	                if ( this[0] && this[0].parentNode ) {
5584	                        return this.domManip(arguments, false, function( elem ) {
5585	                                this.parentNode.insertBefore( elem, this );
5586	                        });
5587	                } else if ( arguments.length ) {
5588	                        var set = jQuery(arguments[0]);
5589	                        set.push.apply( set, this.toArray() );
5590	                        return this.pushStack( set, "before", arguments );
5591	                }
5592	        },
5593	
5594	        after: function() {
5595	                if ( this[0] && this[0].parentNode ) {
5596	                        return this.domManip(arguments, false, function( elem ) {
5597	                                this.parentNode.insertBefore( elem, this.nextSibling );
5598	                        });
5599	                } else if ( arguments.length ) {
5600	                        var set = this.pushStack( this, "after", arguments );
5601	                        set.push.apply( set, jQuery(arguments[0]).toArray() );
5602	                        return set;
5603	                }
5604	        },
5605	
5606	        // keepData is for internal use only--do not document
5607	        remove: function( selector, keepData ) {
5608	                for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
5609	                        if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
5610	                                if ( !keepData && elem.nodeType === 1 ) {
5611	                                        jQuery.cleanData( elem.getElementsByTagName("*") );
5612	                                        jQuery.cleanData( [ elem ] );
5613	                                }
5614	
5615	                                if ( elem.parentNode ) {
5616	                                        elem.parentNode.removeChild( elem );
5617	                                }
5618	                        }
5619	                }
5620	
5621	                return this;
5622	        },
5623	
5624	        empty: function() {
5625	                for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
5626	                        // Remove element nodes and prevent memory leaks
5627	                        if ( elem.nodeType === 1 ) {
5628	                                jQuery.cleanData( elem.getElementsByTagName("*") );
5629	                        }
5630	
5631	                        // Remove any remaining nodes
5632	                        while ( elem.firstChild ) {
5633	                                elem.removeChild( elem.firstChild );
5634	                        }
5635	                }
5636	
5637	                return this;
5638	        },
5639	
5640	        clone: function( dataAndEvents, deepDataAndEvents ) {
5641	                dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
5642	                deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
5643	
5644	                return this.map( function () {
5645	                        return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
5646	                });
5647	        },
5648	
5649	        html: function( value ) {
5650	                if ( value === undefined ) {
5651	                        return this[0] && this[0].nodeType === 1 ?
5652	                                this[0].innerHTML.replace(rinlinejQuery, "") :
5653	                                null;
5654	
5655	                // See if we can take a shortcut and just use innerHTML
5656	                } else if ( typeof value === "string" && !rnocache.test( value ) &&
5657	                        (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
5658	                        !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
5659	
5660	                        value = value.replace(rxhtmlTag, "<$1></$2>");
5661	
5662	                        try {
5663	                                for ( var i = 0, l = this.length; i < l; i++ ) {
5664	                                        // Remove element nodes and prevent memory leaks
5665	                                        if ( this[i].nodeType === 1 ) {
5666	                                                jQuery.cleanData( this[i].getElementsByTagName("*") );
5667	                                                this[i].innerHTML = value;
5668	                                        }
5669	                                }
5670	
5671	                        // If using innerHTML throws an exception, use the fallback method
5672	                        } catch(e) {
5673	                                this.empty().append( value );
5674	                        }
5675	
5676	                } else if ( jQuery.isFunction( value ) ) {
5677	                        this.each(function(i){
5678	                                var self = jQuery( this );
5679	
5680	                                self.html( value.call(this, i, self.html()) );
5681	                        });
5682	
5683	                } else {
5684	                        this.empty().append( value );
5685	                }
5686	
5687	                return this;
5688	        },
5689	
5690	        replaceWith: function( value ) {
5691	                if ( this[0] && this[0].parentNode ) {
5692	                        // Make sure that the elements are removed from the DOM before they are inserted
5693	                        // this can help fix replacing a parent with child elements
5694	                        if ( jQuery.isFunction( value ) ) {
5695	                                return this.each(function(i) {
5696	                                        var self = jQuery(this), old = self.html();
5697	                                        self.replaceWith( value.call( this, i, old ) );
5698	                                });
5699	                        }
5700	
5701	                        if ( typeof value !== "string" ) {
5702	                                value = jQuery( value ).detach();
5703	                        }
5704	
5705	                        return this.each(function() {
5706	                                var next = this.nextSibling,
5707	                                        parent = this.parentNode;
5708	
5709	                                jQuery( this ).remove();
5710	
5711	                                if ( next ) {
5712	                                        jQuery(next).before( value );
5713	                                } else {
5714	                                        jQuery(parent).append( value );
5715	                                }
5716	                        });
5717	                } else {
5718	                        return this.length ?
5719	                                this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
5720	                                this;
5721	                }
5722	        },
5723	
5724	        detach: function( selector ) {
5725	                return this.remove( selector, true );
5726	        },
5727	
5728	        domManip: function( args, table, callback ) {
5729	                var results, first, fragment, parent,
5730	                        value = args[0],
5731	                        scripts = [];
5732	
5733	                // We can't cloneNode fragments that contain checked, in WebKit
5734	                if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
5735	                        return this.each(function() {
5736	                                jQuery(this).domManip( args, table, callback, true );
5737	                        });
5738	                }
5739	
5740	                if ( jQuery.isFunction(value) ) {
5741	                        return this.each(function(i) {
5742	                                var self = jQuery(this);
5743	                                args[0] = value.call(this, i, table ? self.html() : undefined);
5744	                                self.domManip( args, table, callback );
5745	                        });
5746	                }
5747	
5748	                if ( this[0] ) {
5749	                        parent = value && value.parentNode;
5750	
5751	                        // If we're in a fragment, just use that instead of building a new one
5752	                        if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
5753	                                results = { fragment: parent };
5754	
5755	                        } else {
5756	                                results = jQuery.buildFragment( args, this, scripts );
5757	                        }
5758	
5759	                        fragment = results.fragment;
5760	
5761	                        if ( fragment.childNodes.length === 1 ) {
5762	                                first = fragment = fragment.firstChild;
5763	                        } else {
5764	                                first = fragment.firstChild;
5765	                        }
5766	
5767	                        if ( first ) {
5768	                                table = table && jQuery.nodeName( first, "tr" );
5769	
5770	                                for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
5771	                                        callback.call(
5772	                                                table ?
5773	                                                        root(this[i], first) :
5774	                                                        this[i],
5775	                                                // Make sure that we do not leak memory by inadvertently discarding
5776	                                                // the original fragment (which might have attached data) instead of
5777	                                                // using it; in addition, use the original fragment object for the last
5778	                                                // item instead of first because it can end up being emptied incorrectly
5779	                                                // in certain situations (Bug #8070).
5780	                                                // Fragments from the fragment cache must always be cloned and never used
5781	                                                // in place.
5782	                                                results.cacheable || (l > 1 && i < lastIndex) ?
5783	                                                        jQuery.clone( fragment, true, true ) :
5784	                                                        fragment
5785	                                        );
5786	                                }
5787	                        }
5788	
5789	                        if ( scripts.length ) {
5790	                                jQuery.each( scripts, evalScript );
5791	                        }
5792	                }
5793	
5794	                return this;
5795	        }
5796	});
5797	
5798	function root( elem, cur ) {
5799	        return jQuery.nodeName(elem, "table") ?
5800	                (elem.getElementsByTagName("tbody")[0] ||
5801	                elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
5802	                elem;
5803	}
5804	
5805	function cloneCopyEvent( src, dest ) {
5806	
5807	        if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
5808	                return;
5809	        }
5810	
5811	        var internalKey = jQuery.expando,
5812	                oldData = jQuery.data( src ),
5813	                curData = jQuery.data( dest, oldData );
5814	
5815	        // Switch to use the internal data object, if it exists, for the next
5816	        // stage of data copying
5817	        if ( (oldData = oldData[ internalKey ]) ) {
5818	                var events = oldData.events;
5819	                                curData = curData[ internalKey ] = jQuery.extend({}, oldData);
5820	
5821	                if ( events ) {
5822	                        delete curData.handle;
5823	                        curData.events = {};
5824	
5825	                        for ( var type in events ) {
5826	                                for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
5827	                                        jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
5828	                                }
5829	                        }
5830	                }
5831	        }
5832	}
5833	
5834	function cloneFixAttributes( src, dest ) {
5835	        var nodeName;
5836	
5837	        // We do not need to do anything for non-Elements
5838	        if ( dest.nodeType !== 1 ) {
5839	                return;
5840	        }
5841	
5842	        // clearAttributes removes the attributes, which we don't want,
5843	        // but also removes the attachEvent events, which we *do* want
5844	        if ( dest.clearAttributes ) {
5845	                dest.clearAttributes();
5846	        }
5847	
5848	        // mergeAttributes, in contrast, only merges back on the
5849	        // original attributes, not the events
5850	        if ( dest.mergeAttributes ) {
5851	                dest.mergeAttributes( src );
5852	        }
5853	
5854	        nodeName = dest.nodeName.toLowerCase();
5855	
5856	        // IE6-8 fail to clone children inside object elements that use
5857	        // the proprietary classid attribute value (rather than the type
5858	        // attribute) to identify the type of content to display
5859	        if ( nodeName === "object" ) {
5860	                dest.outerHTML = src.outerHTML;
5861	
5862	        } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
5863	                // IE6-8 fails to persist the checked state of a cloned checkbox
5864	                // or radio button. Worse, IE6-7 fail to give the cloned element
5865	                // a checked appearance if the defaultChecked value isn't also set
5866	                if ( src.checked ) {
5867	                        dest.defaultChecked = dest.checked = src.checked;
5868	                }
5869	
5870	                // IE6-7 get confused and end up setting the value of a cloned
5871	                // checkbox/radio button to an empty string instead of "on"
5872	                if ( dest.value !== src.value ) {
5873	                        dest.value = src.value;
5874	                }
5875	
5876	        // IE6-8 fails to return the selected option to the default selected
5877	        // state when cloning options
5878	        } else if ( nodeName === "option" ) {
5879	                dest.selected = src.defaultSelected;
5880	
5881	        // IE6-8 fails to set the defaultValue to the correct value when
5882	        // cloning other types of input fields
5883	        } else if ( nodeName === "input" || nodeName === "textarea" ) {
5884	                dest.defaultValue = src.defaultValue;
5885	        }
5886	
5887	        // Event data gets referenced instead of copied if the expando
5888	        // gets copied too
5889	        dest.removeAttribute( jQuery.expando );
5890	}
5891	
5892	jQuery.buildFragment = function( args, nodes, scripts ) {
5893	        var fragment, cacheable, cacheresults,
5894	                doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
5895	
5896	        // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
5897	        // Cloning options loses the selected state, so don't cache them
5898	        // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
5899	        // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
5900	        if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
5901	                args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
5902	
5903	                cacheable = true;
5904	
5905	                cacheresults = jQuery.fragments[ args[0] ];
5906	                if ( cacheresults && cacheresults !== 1 ) {
5907	                        fragment = cacheresults;
5908	                }
5909	        }
5910	
5911	        if ( !fragment ) {
5912	                fragment = doc.createDocumentFragment();
5913	                jQuery.clean( args, doc, fragment, scripts );
5914	        }
5915	
5916	        if ( cacheable ) {
5917	                jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
5918	        }
5919	
5920	        return { fragment: fragment, cacheable: cacheable };
5921	};
5922	
5923	jQuery.fragments = {};
5924	
5925	jQuery.each({
5926	        appendTo: "append",
5927	        prependTo: "prepend",
5928	        insertBefore: "before",
5929	        insertAfter: "after",
5930	        replaceAll: "replaceWith"
5931	}, function( name, original ) {
5932	        jQuery.fn[ name ] = function( selector ) {
5933	                var ret = [],
5934	                        insert = jQuery( selector ),
5935	                        parent = this.length === 1 && this[0].parentNode;
5936	
5937	                if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
5938	                        insert[ original ]( this[0] );
5939	                        return this;
5940	
5941	                } else {
5942	                        for ( var i = 0, l = insert.length; i < l; i++ ) {
5943	                                var elems = (i > 0 ? this.clone(true) : this).get();
5944	                                jQuery( insert[i] )[ original ]( elems );
5945	                                ret = ret.concat( elems );
5946	                        }
5947	
5948	                        return this.pushStack( ret, name, insert.selector );
5949	                }
5950	        };
5951	});
5952	
5953	function getAll( elem ) {
5954	        if ( "getElementsByTagName" in elem ) {
5955	                return elem.getElementsByTagName( "*" );
5956	
5957	        } else if ( "querySelectorAll" in elem ) {
5958	                return elem.querySelectorAll( "*" );
5959	
5960	        } else {
5961	                return [];
5962	        }
5963	}
5964	
5965	// Used in clean, fixes the defaultChecked property
5966	function fixDefaultChecked( elem ) {
5967	        if ( elem.type === "checkbox" || elem.type === "radio" ) {
5968	                elem.defaultChecked = elem.checked;
5969	        }
5970	}
5971	// Finds all inputs and passes them to fixDefaultChecked
5972	function findInputs( elem ) {
5973	        if ( jQuery.nodeName( elem, "input" ) ) {
5974	                fixDefaultChecked( elem );
5975	        } else if ( elem.getElementsByTagName ) {
5976	                jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
5977	        }
5978	}
5979	
5980	jQuery.extend({
5981	        clone: function( elem, dataAndEvents, deepDataAndEvents ) {
5982	                var clone = elem.cloneNode(true),
5983	                                srcElements,
5984	                                destElements,
5985	                                i;
5986	
5987	                if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
5988	                                (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
5989	                        // IE copies events bound via attachEvent when using cloneNode.
5990	                        // Calling detachEvent on the clone will also remove the events
5991	                        // from the original. In order to get around this, we use some
5992	                        // proprietary methods to clear the events. Thanks to MooTools
5993	                        // guys for this hotness.
5994	
5995	                        cloneFixAttributes( elem, clone );
5996	
5997	                        // Using Sizzle here is crazy slow, so we use getElementsByTagName
5998	                        // instead
5999	                        srcElements = getAll( elem );
6000	                        destElements = getAll( clone );
6001	
6002	                        // Weird iteration because IE will replace the length property
6003	                        // with an element if you are cloning the body and one of the
6004	                        // elements on the page has a name or id of "length"
6005	                        for ( i = 0; srcElements[i]; ++i ) {
6006	                                cloneFixAttributes( srcElements[i], destElements[i] );
6007	                        }
6008	                }
6009	
6010	                // Copy the events from the original to the clone
6011	                if ( dataAndEvents ) {
6012	                        cloneCopyEvent( elem, clone );
6013	
6014	                        if ( deepDataAndEvents ) {
6015	                                srcElements = getAll( elem );
6016	                                destElements = getAll( clone );
6017	
6018	                                for ( i = 0; srcElements[i]; ++i ) {
6019	                                        cloneCopyEvent( srcElements[i], destElements[i] );
6020	                                }
6021	                        }
6022	                }
6023	
6024	                // Return the cloned set
6025	                return clone;
6026	        },
6027	
6028	        clean: function( elems, context, fragment, scripts ) {
6029	                var checkScriptType;
6030	
6031	                context = context || document;
6032	
6033	                // !context.createElement fails in IE with an error but returns typeof 'object'
6034	                if ( typeof context.createElement === "undefined" ) {
6035	                        context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
6036	                }
6037	
6038	                var ret = [], j;
6039	
6040	                for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
6041	                        if ( typeof elem === "number" ) {
6042	                                elem += "";
6043	                        }
6044	
6045	                        if ( !elem ) {
6046	                                continue;
6047	                        }
6048	
6049	                        // Convert html string into DOM nodes
6050	                        if ( typeof elem === "string" ) {
6051	                                if ( !rhtml.test( elem ) ) {
6052	                                        elem = context.createTextNode( elem );
6053	                                } else {
6054	                                        // Fix "XHTML"-style tags in all browsers
6055	                                        elem = elem.replace(rxhtmlTag, "<$1></$2>");
6056	
6057	                                        // Trim whitespace, otherwise indexOf won't work as expected
6058	                                        var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
6059	                                                wrap = wrapMap[ tag ] || wrapMap._default,
6060	                                                depth = wrap[0],
6061	                                                div = context.createElement("div");
6062	
6063	                                        // Go to html and back, then peel off extra wrappers
6064	                                        div.innerHTML = wrap[1] + elem + wrap[2];
6065	
6066	                                        // Move to the right depth
6067	                                        while ( depth-- ) {
6068	                                                div = div.lastChild;
6069	                                        }
6070	
6071	                                        // Remove IE's autoinserted <tbody> from table fragments
6072	                                        if ( !jQuery.support.tbody ) {
6073	
6074	                                                // String was a <table>, *may* have spurious <tbody>
6075	                                                var hasBody = rtbody.test(elem),
6076	                                                        tbody = tag === "table" && !hasBody ?
6077	                                                                div.firstChild && div.firstChild.childNodes :
6078	
6079	                                                                // String was a bare <thead> or <tfoot>
6080	                                                                wrap[1] === "<table>" && !hasBody ?
6081	                                                                        div.childNodes :
6082	                                                                        [];
6083	
6084	                                                for ( j = tbody.length - 1; j >= 0 ; --j ) {
6085	                                                        if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
6086	                                                                tbody[ j ].parentNode.removeChild( tbody[ j ] );
6087	                                                        }
6088	                                                }
6089	                                        }
6090	
6091	                                        // IE completely kills leading whitespace when innerHTML is used
6092	                                        if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
6093	                                                div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
6094	                                        }
6095	
6096	                                        elem = div.childNodes;
6097	                                }
6098	                        }
6099	
6100	                        // Resets defaultChecked for any radios and checkboxes
6101	                        // about to be appended to the DOM in IE 6/7 (#8060)
6102	                        var len;
6103	                        if ( !jQuery.support.appendChecked ) {
6104	                                if ( elem[0] && typeof (len = elem.length) === "number" ) {
6105	                                        for ( j = 0; j < len; j++ ) {
6106	                                                findInputs( elem[j] );
6107	                                        }
6108	                                } else {
6109	                                        findInputs( elem );
6110	                                }
6111	                        }
6112	
6113	                        if ( elem.nodeType ) {
6114	                                ret.push( elem );
6115	                        } else {
6116	                                ret = jQuery.merge( ret, elem );
6117	                        }
6118	                }
6119	
6120	                if ( fragment ) {
6121	                        checkScriptType = function( elem ) {
6122	                                return !elem.type || rscriptType.test( elem.type );
6123	                        };
6124	                        for ( i = 0; ret[i]; i++ ) {
6125	                                if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
6126	                                        scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
6127	
6128	                                } else {
6129	                                        if ( ret[i].nodeType === 1 ) {
6130	                                                var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
6131	
6132	                                                ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
6133	                                        }
6134	                                        fragment.appendChild( ret[i] );
6135	                                }
6136	                        }
6137	                }
6138	
6139	                return ret;
6140	        },
6141	
6142	        cleanData: function( elems ) {
6143	                var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
6144	                        deleteExpando = jQuery.support.deleteExpando;
6145	
6146	                for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
6147	                        if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
6148	                                continue;
6149	                        }
6150	
6151	                        id = elem[ jQuery.expando ];
6152	
6153	                        if ( id ) {
6154	                                data = cache[ id ] && cache[ id ][ internalKey ];
6155	
6156	                                if ( data && data.events ) {
6157	                                        for ( var type in data.events ) {
6158	                                                if ( special[ type ] ) {
6159	                                                        jQuery.event.remove( elem, type );
6160	
6161	                                                // This is a shortcut to avoid jQuery.event.remove's overhead
6162	                                                } else {
6163	                                                        jQuery.removeEvent( elem, type, data.handle );
6164	                                                }
6165	                                        }
6166	
6167	                                        // Null the DOM reference to avoid IE6/7/8 leak (#7054)
6168	                                        if ( data.handle ) {
6169	                                                data.handle.elem = null;
6170	                                        }
6171	                                }
6172	
6173	                                if ( deleteExpando ) {
6174	                                        delete elem[ jQuery.expando ];
6175	
6176	                                } else if ( elem.removeAttribute ) {
6177	                                        elem.removeAttribute( jQuery.expando );
6178	                                }
6179	
6180	                                delete cache[ id ];
6181	                        }
6182	                }
6183	        }
6184	});
6185	
6186	function evalScript( i, elem ) {
6187	        if ( elem.src ) {
6188	                jQuery.ajax({
6189	                        url: elem.src,
6190	                        async: false,
6191	                        dataType: "script"
6192	                });
6193	        } else {
6194	                jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
6195	        }
6196	
6197	        if ( elem.parentNode ) {
6198	                elem.parentNode.removeChild( elem );
6199	        }
6200	}
6201	
6202	
6203	
6204	
6205	var ralpha = /alpha\([^)]*\)/i,
6206	        ropacity = /opacity=([^)]*)/,
6207	        rdashAlpha = /-([a-z])/ig,
6208	        // fixed for IE9, see #8346
6209	        rupper = /([A-Z]|^ms)/g,
6210	        rnumpx = /^-?\d+(?:px)?$/i,
6211	        rnum = /^-?\d/,
6212	        rrelNum = /^[+\-]=/,
6213	        rrelNumFilter = /[^+\-\.\de]+/g,
6214	
6215	        cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6216	        cssWidth = [ "Left", "Right" ],
6217	        cssHeight = [ "Top", "Bottom" ],
6218	        curCSS,
6219	
6220	        getComputedStyle,
6221	        currentStyle,
6222	
6223	        fcamelCase = function( all, letter ) {
6224	                return letter.toUpperCase();
6225	        };
6226	
6227	jQuery.fn.css = function( name, value ) {
6228	        // Setting 'undefined' is a no-op
6229	        if ( arguments.length === 2 && value === undefined ) {
6230	                return this;
6231	        }
6232	
6233	        return jQuery.access( this, name, value, true, function( elem, name, value ) {
6234	                return value !== undefined ?
6235	                        jQuery.style( elem, name, value ) :
6236	                        jQuery.css( elem, name );
6237	        });
6238	};
6239	
6240	jQuery.extend({
6241	        // Add in style property hooks for overriding the default
6242	        // behavior of getting and setting a style property
6243	        cssHooks: {
6244	                opacity: {
6245	                        get: function( elem, computed ) {
6246	                                if ( computed ) {
6247	                                        // We should always get a number back from opacity
6248	                                        var ret = curCSS( elem, "opacity", "opacity" );
6249	                                        return ret === "" ? "1" : ret;
6250	
6251	                                } else {
6252	                                        return elem.style.opacity;
6253	                                }
6254	                        }
6255	                }
6256	        },
6257	
6258	        // Exclude the following css properties to add px
6259	        cssNumber: {
6260	                "zIndex": true,
6261	                "fontWeight": true,
6262	                "opacity": true,
6263	                "zoom": true,
6264	                "lineHeight": true,
6265	                "widows": true,
6266	                "orphans": true
6267	        },
6268	
6269	        // Add in properties whose names you wish to fix before
6270	        // setting or getting the value
6271	        cssProps: {
6272	                // normalize float css property
6273	                "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
6274	        },
6275	
6276	        // Get and set the style property on a DOM Node
6277	        style: function( elem, name, value, extra ) {
6278	                // Don't set styles on text and comment nodes
6279	                if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6280	                        return;
6281	                }
6282	
6283	                // Make sure that we're working with the right name
6284	                var ret, type, origName = jQuery.camelCase( name ),
6285	                        style = elem.style, hooks = jQuery.cssHooks[ origName ];
6286	
6287	                name = jQuery.cssProps[ origName ] || origName;
6288	
6289	                // Check if we're setting a value
6290	                if ( value !== undefined ) {
6291	                        type = typeof value;
6292	
6293	                        // Make sure that NaN and null values aren't set. See: #7116
6294	                        if ( type === "number" && isNaN( value ) || value == null ) {
6295	                                return;
6296	                        }
6297	
6298	                        // convert relative number strings (+= or -=) to relative numbers. #7345
6299	                        if ( type === "string" && rrelNum.test( value ) ) {
6300	                                value = +value.replace( rrelNumFilter, "" ) + parseFloat( jQuery.css( elem, name ) );
6301	                        }
6302	
6303	                        // If a number was passed in, add 'px' to the (except for certain CSS properties)
6304	                        if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
6305	                                value += "px";
6306	                        }
6307	
6308	                        // If a hook was provided, use that value, otherwise just set the specified value
6309	                        if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
6310	                                // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
6311	                                // Fixes bug #5509
6312	                                try {
6313	                                        style[ name ] = value;
6314	                                } catch(e) {}
6315	                        }
6316	
6317	                } else {
6318	                        // If a hook was provided get the non-computed value from there
6319	                        if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
6320	                                return ret;
6321	                        }
6322	
6323	                        // Otherwise just get the value from the style object
6324	                        return style[ name ];
6325	                }
6326	        },
6327	
6328	        css: function( elem, name, extra ) {
6329	                var ret, hooks;
6330	
6331	                // Make sure that we're working with the right name
6332	                name = jQuery.camelCase( name );
6333	                hooks = jQuery.cssHooks[ name ];
6334	                name = jQuery.cssProps[ name ] || name;
6335	
6336	                // cssFloat needs a special treatment
6337	                if ( name === "cssFloat" ) {
6338	                        name = "float";
6339	                }
6340	
6341	                // If a hook was provided get the computed value from there
6342	                if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
6343	                        return ret;
6344	
6345	                // Otherwise, if a way to get the computed value exists, use that
6346	                } else if ( curCSS ) {
6347	                        return curCSS( elem, name );
6348	                }
6349	        },
6350	
6351	        // A method for quickly swapping in/out CSS properties to get correct calculations
6352	        swap: function( elem, options, callback ) {
6353	                var old = {};
6354	
6355	                // Remember the old values, and insert the new ones
6356	                for ( var name in options ) {
6357	                        old[ name ] = elem.style[ name ];
6358	                        elem.style[ name ] = options[ name ];
6359	                }
6360	
6361	                callback.call( elem );
6362	
6363	                // Revert the old values
6364	                for ( name in options ) {
6365	                        elem.style[ name ] = old[ name ];
6366	                }
6367	        },
6368	
6369	        camelCase: function( string ) {
6370	                return string.replace( rdashAlpha, fcamelCase );
6371	        }
6372	});
6373	
6374	// DEPRECATED, Use jQuery.css() instead
6375	jQuery.curCSS = jQuery.css;
6376	
6377	jQuery.each(["height", "width"], function( i, name ) {
6378	        jQuery.cssHooks[ name ] = {
6379	                get: function( elem, computed, extra ) {
6380	                        var val;
6381	
6382	                        if ( computed ) {
6383	                                if ( elem.offsetWidth !== 0 ) {
6384	                                        val = getWH( elem, name, extra );
6385	
6386	                                } else {
6387	                                        jQuery.swap( elem, cssShow, function() {
6388	                                                val = getWH( elem, name, extra );
6389	                                        });
6390	                                }
6391	
6392	                                if ( val <= 0 ) {
6393	                                        val = curCSS( elem, name, name );
6394	
6395	                                        if ( val === "0px" && currentStyle ) {
6396	                                                val = currentStyle( elem, name, name );
6397	                                        }
6398	
6399	                                        if ( val != null ) {
6400	                                                // Should return "auto" instead of 0, use 0 for
6401	                                                // temporary backwards-compat
6402	                                                return val === "" || val === "auto" ? "0px" : val;
6403	                                        }
6404	                                }
6405	
6406	                                if ( val < 0 || val == null ) {
6407	                                        val = elem.style[ name ];
6408	
6409	                                        // Should return "auto" instead of 0, use 0 for
6410	                                        // temporary backwards-compat
6411	                                        return val === "" || val === "auto" ? "0px" : val;
6412	                                }
6413	
6414	                                return typeof val === "string" ? val : val + "px";
6415	                        }
6416	                },
6417	
6418	                set: function( elem, value ) {
6419	                        if ( rnumpx.test( value ) ) {
6420	                                // ignore negative width and height values #1599
6421	                                value = parseFloat(value);
6422	
6423	                                if ( value >= 0 ) {
6424	                                        return value + "px";
6425	                                }
6426	
6427	                        } else {
6428	                                return value;
6429	                        }
6430	                }
6431	        };
6432	});
6433	
6434	if ( !jQuery.support.opacity ) {
6435	        jQuery.cssHooks.opacity = {
6436	                get: function( elem, computed ) {
6437	                        // IE uses filters for opacity
6438	                        return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
6439	                                ( parseFloat( RegExp.$1 ) / 100 ) + "" :
6440	                                computed ? "1" : "";
6441	                },
6442	
6443	                set: function( elem, value ) {
6444	                        var style = elem.style,
6445	                                currentStyle = elem.currentStyle;
6446	
6447	                        // IE has trouble with opacity if it does not have layout
6448	                        // Force it by setting the zoom level
6449	                        style.zoom = 1;
6450	
6451	                        // Set the alpha filter to set the opacity
6452	                        var opacity = jQuery.isNaN( value ) ?
6453	                                "" :
6454	                                "alpha(opacity=" + value * 100 + ")",
6455	                                filter = currentStyle && currentStyle.filter || style.filter || "";
6456	
6457	                        style.filter = ralpha.test( filter ) ?
6458	                                filter.replace( ralpha, opacity ) :
6459	                                filter + " " + opacity;
6460	                }
6461	        };
6462	}
6463	
6464	jQuery(function() {
6465	        // This hook cannot be added until DOM ready because the support test
6466	        // for it is not run until after DOM ready
6467	        if ( !jQuery.support.reliableMarginRight ) {
6468	                jQuery.cssHooks.marginRight = {
6469	                        get: function( elem, computed ) {
6470	                                // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
6471	                                // Work around by temporarily setting element display to inline-block
6472	                                var ret;
6473	                                jQuery.swap( elem, { "display": "inline-block" }, function() {
6474	                                        if ( computed ) {
6475	                                                ret = curCSS( elem, "margin-right", "marginRight" );
6476	                                        } else {
6477	                                                ret = elem.style.marginRight;
6478	                                        }
6479	                                });
6480	                                return ret;
6481	                        }
6482	                };
6483	        }
6484	});
6485	
6486	if ( document.defaultView && document.defaultView.getComputedStyle ) {
6487	        getComputedStyle = function( elem, name ) {
6488	                var ret, defaultView, computedStyle;
6489	
6490	                name = name.replace( rupper, "-$1" ).toLowerCase();
6491	
6492	                if ( !(defaultView = elem.ownerDocument.defaultView) ) {
6493	                        return undefined;
6494	                }
6495	
6496	                if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
6497	                        ret = computedStyle.getPropertyValue( name );
6498	                        if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
6499	                                ret = jQuery.style( elem, name );
6500	                        }
6501	                }
6502	
6503	                return ret;
6504	        };
6505	}
6506	
6507	if ( document.documentElement.currentStyle ) {
6508	        currentStyle = function( elem, name ) {
6509	                var left,
6510	                        ret = elem.currentStyle && elem.currentStyle[ name ],
6511	                        rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
6512	                        style = elem.style;
6513	
6514	                // From the awesome hack by Dean Edwards
6515	                // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
6516	
6517	                // If we're not dealing with a regular pixel number
6518	                // but a number that has a weird ending, we need to convert it to pixels
6519	                if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
6520	                        // Remember the original values
6521	                        left = style.left;
6522	
6523	                        // Put in the new values to get a computed value out
6524	                        if ( rsLeft ) {
6525	                                elem.runtimeStyle.left = elem.currentStyle.left;
6526	                        }
6527	                        style.left = name === "fontSize" ? "1em" : (ret || 0);
6528	                        ret = style.pixelLeft + "px";
6529	
6530	                        // Revert the changed values
6531	                        style.left = left;
6532	                        if ( rsLeft ) {
6533	                                elem.runtimeStyle.left = rsLeft;
6534	                        }
6535	                }
6536	
6537	                return ret === "" ? "auto" : ret;
6538	        };
6539	}
6540	
6541	curCSS = getComputedStyle || currentStyle;
6542	
6543	function getWH( elem, name, extra ) {
6544	        var which = name === "width" ? cssWidth : cssHeight,
6545	                val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
6546	
6547	        if ( extra === "border" ) {
6548	                return val;
6549	        }
6550	
6551	        jQuery.each( which, function() {
6552	                if ( !extra ) {
6553	                        val -= parseFloat(jQuery.css( elem, "padding" + this )) || 0;
6554	                }
6555	
6556	                if ( extra === "margin" ) {
6557	                        val += parseFloat(jQuery.css( elem, "margin" + this )) || 0;
6558	
6559	                } else {
6560	                        val -= parseFloat(jQuery.css( elem, "border" + this + "Width" )) || 0;
6561	                }
6562	        });
6563	
6564	        return val;
6565	}
6566	
6567	if ( jQuery.expr && jQuery.expr.filters ) {
6568	        jQuery.expr.filters.hidden = function( elem ) {
6569	                var width = elem.offsetWidth,
6570	                        height = elem.offsetHeight;
6571	
6572	                return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
6573	        };
6574	
6575	        jQuery.expr.filters.visible = function( elem ) {
6576	                return !jQuery.expr.filters.hidden( elem );
6577	        };
6578	}
6579	
6580	
6581	
6582	
6583	var r20 = /%20/g,
6584	        rbracket = /\[\]$/,
6585	        rCRLF = /\r?\n/g,
6586	        rhash = /#.*$/,
6587	        rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
6588	        rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
6589	        // #7653, #8125, #8152: local protocol detection
6590	        rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|widget):$/,
6591	        rnoContent = /^(?:GET|HEAD)$/,
6592	        rprotocol = /^\/\//,
6593	        rquery = /\?/,
6594	        rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
6595	        rselectTextarea = /^(?:select|textarea)/i,
6596	        rspacesAjax = /\s+/,
6597	        rts = /([?&])_=[^&]*/,
6598	        rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
6599	
6600	        // Keep a copy of the old load method
6601	        _load = jQuery.fn.load,
6602	
6603	        /* Prefilters
6604	         * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
6605	         * 2) These are called:
6606	         *    - BEFORE asking for a transport
6607	         *    - AFTER param serialization (s.data is a string if s.processData is true)
6608	         * 3) key is the dataType
6609	         * 4) the catchall symbol "*" can be used
6610	         * 5) execution will start with transport dataType and THEN continue down to "*" if needed
6611	         */
6612	        prefilters = {},
6613	
6614	        /* Transports bindings
6615	         * 1) key is the dataType
6616	         * 2) the catchall symbol "*" can be used
6617	         * 3) selection will start with transport dataType and THEN go to "*" if needed
6618	         */
6619	        transports = {},
6620	
6621	        // Document location
6622	        ajaxLocation,
6623	
6624	        // Document location segments
6625	        ajaxLocParts;
6626	
6627	// #8138, IE may throw an exception when accessing
6628	// a field from window.location if document.domain has been set
6629	try {
6630	        ajaxLocation = location.href;
6631	} catch( e ) {
6632	        // Use the href attribute of an A element
6633	        // since IE will modify it given document.location
6634	        ajaxLocation = document.createElement( "a" );
6635	        ajaxLocation.href = "";
6636	        ajaxLocation = ajaxLocation.href;
6637	}
6638	
6639	// Segment location into parts
6640	ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
6641	
6642	// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
6643	function addToPrefiltersOrTransports( structure ) {
6644	
6645	        // dataTypeExpression is optional and defaults to "*"
6646	        return function( dataTypeExpression, func ) {
6647	
6648	                if ( typeof dataTypeExpression !== "string" ) {
6649	                        func = dataTypeExpression;
6650	                        dataTypeExpression = "*";
6651	                }
6652	
6653	                if ( jQuery.isFunction( func ) ) {
6654	                        var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
6655	                                i = 0,
6656	                                length = dataTypes.length,
6657	                                dataType,
6658	                                list,
6659	                                placeBefore;
6660	
6661	                        // For each dataType in the dataTypeExpression
6662	                        for(; i < length; i++ ) {
6663	                                dataType = dataTypes[ i ];
6664	                                // We control if we're asked to add before
6665	                                // any existing element
6666	                                placeBefore = /^\+/.test( dataType );
6667	                                if ( placeBefore ) {
6668	                                        dataType = dataType.substr( 1 ) || "*";
6669	                                }
6670	                                list = structure[ dataType ] = structure[ dataType ] || [];
6671	                                // then we add to the structure accordingly
6672	                                list[ placeBefore ? "unshift" : "push" ]( func );
6673	                        }
6674	                }
6675	        };
6676	}
6677	
6678	// Base inspection function for prefilters and transports
6679	function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
6680	                dataType /* internal */, inspected /* internal */ ) {
6681	
6682	        dataType = dataType || options.dataTypes[ 0 ];
6683	        inspected = inspected || {};
6684	
6685	        inspected[ dataType ] = true;
6686	
6687	        var list = structure[ dataType ],
6688	                i = 0,
6689	                length = list ? list.length : 0,
6690	                executeOnly = ( structure === prefilters ),
6691	                selection;
6692	
6693	        for(; i < length && ( executeOnly || !selection ); i++ ) {
6694	                selection = list[ i ]( options, originalOptions, jqXHR );
6695	                // If we got redirected to another dataType
6696	                // we try there if executing only and not done already
6697	                if ( typeof selection === "string" ) {
6698	                        if ( !executeOnly || inspected[ selection ] ) {
6699	                                selection = undefined;
6700	                        } else {
6701	                                options.dataTypes.unshift( selection );
6702	                                selection = inspectPrefiltersOrTransports(
6703	                                                structure, options, originalOptions, jqXHR, selection, inspected );
6704	                        }
6705	                }
6706	        }
6707	        // If we're only executing or nothing was selected
6708	        // we try the catchall dataType if not done already
6709	        if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
6710	                selection = inspectPrefiltersOrTransports(
6711	                                structure, options, originalOptions, jqXHR, "*", inspected );
6712	        }
6713	        // unnecessary when only executing (prefilters)
6714	        // but it'll be ignored by the caller in that case
6715	        return selection;
6716	}
6717	
6718	jQuery.fn.extend({
6719	        load: function( url, params, callback ) {
6720	                if ( typeof url !== "string" && _load ) {
6721	                        return _load.apply( this, arguments );
6722	
6723	                // Don't do a request if no elements are being requested
6724	                } else if ( !this.length ) {
6725	                        return this;
6726	                }
6727	
6728	                var off = url.indexOf( " " );
6729	                if ( off >= 0 ) {
6730	                        var selector = url.slice( off, url.length );
6731	                        url = url.slice( 0, off );
6732	                }
6733	
6734	                // Default to a GET request
6735	                var type = "GET";
6736	
6737	                // If the second parameter was provided
6738	                if ( params ) {
6739	                        // If it's a function
6740	                        if ( jQuery.isFunction( params ) ) {
6741	                                // We assume that it's the callback
6742	                                callback = params;
6743	                                params = undefined;
6744	
6745	                        // Otherwise, build a param string
6746	                        } else if ( typeof params === "object" ) {
6747	                                params = jQuery.param( params, jQuery.ajaxSettings.traditional );
6748	                                type = "POST";
6749	                        }
6750	                }
6751	
6752	                var self = this;
6753	
6754	                // Request the remote document
6755	                jQuery.ajax({
6756	                        url: url,
6757	                        type: type,
6758	                        dataType: "html",
6759	                        data: params,
6760	                        // Complete callback (responseText is used internally)
6761	                        complete: function( jqXHR, status, responseText ) {
6762	                                // Store the response as specified by the jqXHR object
6763	                                responseText = jqXHR.responseText;
6764	                                // If successful, inject the HTML into all the matched elements
6765	                                if ( jqXHR.isResolved() ) {
6766	                                        // #4825: Get the actual response in case
6767	                                        // a dataFilter is present in ajaxSettings
6768	                                        jqXHR.done(function( r ) {
6769	                                                responseText = r;
6770	                                        });
6771	                                        // See if a selector was specified
6772	                                        self.html( selector ?
6773	                                                // Create a dummy div to hold the results
6774	                                                jQuery("<div>")
6775	                                                        // inject the contents of the document in, removing the scripts
6776	                                                        // to avoid any 'Permission Denied' errors in IE
6777	                                                        .append(responseText.replace(rscript, ""))
6778	
6779	                                                        // Locate the specified elements
6780	                                                        .find(selector) :
6781	
6782	                                                // If not, just inject the full result
6783	                                                responseText );
6784	                                }
6785	
6786	                                if ( callback ) {
6787	                                        self.each( callback, [ responseText, status, jqXHR ] );
6788	                                }
6789	                        }
6790	                });
6791	
6792	                return this;
6793	        },
6794	
6795	        serialize: function() {
6796	                return jQuery.param( this.serializeArray() );
6797	        },
6798	
6799	        serializeArray: function() {
6800	                return this.map(function(){
6801	                        return this.elements ? jQuery.makeArray( this.elements ) : this;
6802	                })
6803	                .filter(function(){
6804	                        return this.name && !this.disabled &&
6805	                                ( this.checked || rselectTextarea.test( this.nodeName ) ||
6806	                                        rinput.test( this.type ) );
6807	                })
6808	                .map(function( i, elem ){
6809	                        var val = jQuery( this ).val();
6810	
6811	                        return val == null ?
6812	                                null :
6813	                                jQuery.isArray( val ) ?
6814	                                        jQuery.map( val, function( val, i ){
6815	                                                return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
6816	                                        }) :
6817	                                        { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
6818	                }).get();
6819	        }
6820	});
6821	
6822	// Attach a bunch of functions for handling common AJAX events
6823	jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
6824	        jQuery.fn[ o ] = function( f ){
6825	                return this.bind( o, f );
6826	        };
6827	});
6828	
6829	jQuery.each( [ "get", "post" ], function( i, method ) {
6830	        jQuery[ method ] = function( url, data, callback, type ) {
6831	                // shift arguments if data argument was omitted
6832	                if ( jQuery.isFunction( data ) ) {
6833	                        type = type || callback;
6834	                        callback = data;
6835	                        data = undefined;
6836	                }
6837	
6838	                return jQuery.ajax({
6839	                        type: method,
6840	                        url: url,
6841	                        data: data,
6842	                        success: callback,
6843	                        dataType: type
6844	                });
6845	        };
6846	});
6847	
6848	jQuery.extend({
6849	
6850	        getScript: function( url, callback ) {
6851	                return jQuery.get( url, undefined, callback, "script" );
6852	        },
6853	
6854	        getJSON: function( url, data, callback ) {
6855	                return jQuery.get( url, data, callback, "json" );
6856	        },
6857	
6858	        // Creates a full fledged settings object into target
6859	        // with both ajaxSettings and settings fields.
6860	        // If target is omitted, writes into ajaxSettings.
6861	        ajaxSetup: function ( target, settings ) {
6862	                if ( !settings ) {
6863	                        // Only one parameter, we extend ajaxSettings
6864	                        settings = target;
6865	                        target = jQuery.extend( true, jQuery.ajaxSettings, settings );
6866	                } else {
6867	                        // target was provided, we extend into it
6868	                        jQuery.extend( true, target, jQuery.ajaxSettings, settings );
6869	                }
6870	                // Flatten fields we don't want deep extended
6871	                for( var field in { context: 1, url: 1 } ) {
6872	                        if ( field in settings ) {
6873	                                target[ field ] = settings[ field ];
6874	                        } else if( field in jQuery.ajaxSettings ) {
6875	                                target[ field ] = jQuery.ajaxSettings[ field ];
6876	                        }
6877	                }
6878	                return target;
6879	        },
6880	
6881	        ajaxSettings: {
6882	                url: ajaxLocation,
6883	                isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
6884	                global: true,
6885	                type: "GET",
6886	                contentType: "application/x-www-form-urlencoded",
6887	                processData: true,
6888	                async: true,
6889	                /*
6890	                timeout: 0,
6891	                data: null,
6892	                dataType: null,
6893	                username: null,
6894	                password: null,
6895	                cache: null,
6896	                traditional: false,
6897	                headers: {},
6898	                */
6899	
6900	                accepts: {
6901	                        xml: "application/xml, text/xml",
6902	                        html: "text/html",
6903	                        text: "text/plain",
6904	                        json: "application/json, text/javascript",
6905	                        "*": "*/*"
6906	                },
6907	
6908	                contents: {
6909	                        xml: /xml/,
6910	                        html: /html/,
6911	                        json: /json/
6912	                },
6913	
6914	                responseFields: {
6915	                        xml: "responseXML",
6916	                        text: "responseText"
6917	                },
6918	
6919	                // List of data converters
6920	                // 1) key format is "source_type destination_type" (a single space in-between)
6921	                // 2) the catchall symbol "*" can be used for source_type
6922	                converters: {
6923	
6924	                        // Convert anything to text
6925	                        "* text": window.String,
6926	
6927	                        // Text to html (true = no transformation)
6928	                        "text html": true,
6929	
6930	                        // Evaluate text as a json expression
6931	                        "text json": jQuery.parseJSON,
6932	
6933	                        // Parse text as xml
6934	                        "text xml": jQuery.parseXML
6935	                }
6936	        },
6937	
6938	        ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
6939	        ajaxTransport: addToPrefiltersOrTransports( transports ),
6940	
6941	        // Main method
6942	        ajax: function( url, options ) {
6943	
6944	                // If url is an object, simulate pre-1.5 signature
6945	                if ( typeof url === "object" ) {
6946	                        options = url;
6947	                        url = undefined;
6948	                }
6949	
6950	                // Force options to be an object
6951	                options = options || {};
6952	
6953	                var // Create the final options object
6954	                        s = jQuery.ajaxSetup( {}, options ),
6955	                        // Callbacks context
6956	                        callbackContext = s.context || s,
6957	                        // Context for global events
6958	                        // It's the callbackContext if one was provided in the options
6959	                        // and if it's a DOM node or a jQuery collection
6960	                        globalEventContext = callbackContext !== s &&
6961	                                ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
6962	                                                jQuery( callbackContext ) : jQuery.event,
6963	                        // Deferreds
6964	                        deferred = jQuery.Deferred(),
6965	                        completeDeferred = jQuery._Deferred(),
6966	                        // Status-dependent callbacks
6967	                        statusCode = s.statusCode || {},
6968	                        // ifModified key
6969	                        ifModifiedKey,
6970	                        // Headers (they are sent all at once)
6971	                        requestHeaders = {},
6972	                        requestHeadersNames = {},
6973	                        // Response headers
6974	                        responseHeadersString,
6975	                        responseHeaders,
6976	                        // transport
6977	                        transport,
6978	                        // timeout handle
6979	                        timeoutTimer,
6980	                        // Cross-domain detection vars
6981	                        parts,
6982	                        // The jqXHR state
6983	                        state = 0,
6984	                        // To know if global events are to be dispatched
6985	                        fireGlobals,
6986	                        // Loop variable
6987	                        i,
6988	                        // Fake xhr
6989	                        jqXHR = {
6990	
6991	                                readyState: 0,
6992	
6993	                                // Caches the header
6994	                                setRequestHeader: function( name, value ) {
6995	                                        if ( !state ) {
6996	                                                var lname = name.toLowerCase();
6997	                                                name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
6998	                                                requestHeaders[ name ] = value;
6999	                                        }
7000	                                        return this;
7001	                                },
7002	
7003	                                // Raw string
7004	                                getAllResponseHeaders: function() {
7005	                                        return state === 2 ? responseHeadersString : null;
7006	                                },
7007	
7008	                                // Builds headers hashtable if needed
7009	                                getResponseHeader: function( key ) {
7010	                                        var match;
7011	                                        if ( state === 2 ) {
7012	                                                if ( !responseHeaders ) {
7013	                                                        responseHeaders = {};
7014	                                                        while( ( match = rheaders.exec( responseHeadersString ) ) ) {
7015	                                                                responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
7016	                                                        }
7017	                                                }
7018	                                                match = responseHeaders[ key.toLowerCase() ];
7019	                                        }
7020	                                        return match === undefined ? null : match;
7021	                                },
7022	
7023	                                // Overrides response content-type header
7024	                                overrideMimeType: function( type ) {
7025	                                        if ( !state ) {
7026	                                                s.mimeType = type;
7027	                                        }
7028	                                        return this;
7029	                                },
7030	
7031	                                // Cancel the request
7032	                                abort: function( statusText ) {
7033	                                        statusText = statusText || "abort";
7034	                                        if ( transport ) {
7035	                                                transport.abort( statusText );
7036	                                        }
7037	                                        done( 0, statusText );
7038	                                        return this;
7039	                                }
7040	                        };
7041	
7042	                // Callback for when everything is done
7043	                // It is defined here because jslint complains if it is declared
7044	                // at the end of the function (which would be more logical and readable)
7045	                function done( status, statusText, responses, headers ) {
7046	
7047	                        // Called once
7048	                        if ( state === 2 ) {
7049	                                return;
7050	                        }
7051	
7052	                        // State is "done" now
7053	                        state = 2;
7054	
7055	                        // Clear timeout if it exists
7056	                        if ( timeoutTimer ) {
7057	                                clearTimeout( timeoutTimer );
7058	                        }
7059	
7060	                        // Dereference transport for early garbage collection
7061	                        // (no matter how long the jqXHR object will be used)
7062	                        transport = undefined;
7063	
7064	                        // Cache response headers
7065	                        responseHeadersString = headers || "";
7066	
7067	                        // Set readyState
7068	                        jqXHR.readyState = status ? 4 : 0;
7069	
7070	                        var isSuccess,
7071	                                success,
7072	                                error,
7073	                                response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
7074	                                lastModified,
7075	                                etag;
7076	
7077	                        // If successful, handle type chaining
7078	                        if ( status >= 200 && status < 300 || status === 304 ) {
7079	
7080	                                // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
7081	                                if ( s.ifModified ) {
7082	
7083	                                        if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
7084	                                                jQuery.lastModified[ ifModifiedKey ] = lastModified;
7085	                                        }
7086	                                        if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
7087	                                                jQuery.etag[ ifModifiedKey ] = etag;
7088	                                        }
7089	                                }
7090	
7091	                                // If not modified
7092	                                if ( status === 304 ) {
7093	
7094	                                        statusText = "notmodified";
7095	                                        isSuccess = true;
7096	
7097	                                // If we have data
7098	                                } else {
7099	
7100	                                        try {
7101	                                                success = ajaxConvert( s, response );
7102	                                                statusText = "success";
7103	                                                isSuccess = true;
7104	                                        } catch(e) {
7105	                                                // We have a parsererror
7106	                                                statusText = "parsererror";
7107	                                                error = e;
7108	                                        }
7109	                                }
7110	                        } else {
7111	                                // We extract error from statusText
7112	                                // then normalize statusText and status for non-aborts
7113	                                error = statusText;
7114	                                if( !statusText || status ) {
7115	                                        statusText = "error";
7116	                                        if ( status < 0 ) {
7117	                                                status = 0;
7118	                                        }
7119	                                }
7120	                        }
7121	
7122	                        // Set data for the fake xhr object
7123	                        jqXHR.status = status;
7124	                        jqXHR.statusText = statusText;
7125	
7126	                        // Success/Error
7127	                        if ( isSuccess ) {
7128	                                deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
7129	                        } else {
7130	                                deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
7131	                        }
7132	
7133	                        // Status-dependent callbacks
7134	                        jqXHR.statusCode( statusCode );
7135	                        statusCode = undefined;
7136	
7137	                        if ( fireGlobals ) {
7138	                                globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
7139	                                                [ jqXHR, s, isSuccess ? success : error ] );
7140	                        }
7141	
7142	                        // Complete
7143	                        completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
7144	
7145	                        if ( fireGlobals ) {
7146	                                globalEventContext.trigger( "ajaxComplete", [ jqXHR, s] );
7147	                                // Handle the global AJAX counter
7148	                                if ( !( --jQuery.active ) ) {
7149	                                        jQuery.event.trigger( "ajaxStop" );
7150	                                }
7151	                        }
7152	                }
7153	
7154	                // Attach deferreds
7155	                deferred.promise( jqXHR );
7156	                jqXHR.success = jqXHR.done;
7157	                jqXHR.error = jqXHR.fail;
7158	                jqXHR.complete = completeDeferred.done;
7159	
7160	                // Status-dependent callbacks
7161	                jqXHR.statusCode = function( map ) {
7162	                        if ( map ) {
7163	                                var tmp;
7164	                                if ( state < 2 ) {
7165	                                        for( tmp in map ) {
7166	                                                statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
7167	                                        }
7168	                                } else {
7169	                                        tmp = map[ jqXHR.status ];
7170	                                        jqXHR.then( tmp, tmp );
7171	                                }
7172	                        }
7173	                        return this;
7174	                };
7175	
7176	                // Remove hash character (#7531: and string promotion)
7177	                // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
7178	                // We also use the url parameter if available
7179	                s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
7180	
7181	                // Extract dataTypes list
7182	                s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
7183	
7184	                // Determine if a cross-domain request is in order
7185	                if ( s.crossDomain == null ) {
7186	                        parts = rurl.exec( s.url.toLowerCase() );
7187	                        s.crossDomain = !!( parts &&
7188	                                ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
7189	                                        ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
7190	                                                ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
7191	                        );
7192	                }
7193	
7194	                // Convert data if not already a string
7195	                if ( s.data && s.processData && typeof s.data !== "string" ) {
7196	                        s.data = jQuery.param( s.data, s.traditional );
7197	                }
7198	
7199	                // Apply prefilters
7200	                inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
7201	
7202	                // If request was aborted inside a prefiler, stop there
7203	                if ( state === 2 ) {
7204	                        return false;
7205	                }
7206	
7207	                // We can fire global events as of now if asked to
7208	                fireGlobals = s.global;
7209	
7210	                // Uppercase the type
7211	                s.type = s.type.toUpperCase();
7212	
7213	                // Determine if request has content
7214	                s.hasContent = !rnoContent.test( s.type );
7215	
7216	                // Watch for a new set of requests
7217	                if ( fireGlobals && jQuery.active++ === 0 ) {
7218	                        jQuery.event.trigger( "ajaxStart" );
7219	                }
7220	
7221	                // More options handling for requests with no content
7222	                if ( !s.hasContent ) {
7223	
7224	                        // If data is available, append data to url
7225	                        if ( s.data ) {
7226	                                s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
7227	                        }
7228	
7229	                        // Get ifModifiedKey before adding the anti-cache parameter
7230	                        ifModifiedKey = s.url;
7231	
7232	                        // Add anti-cache in url if needed
7233	                        if ( s.cache === false ) {
7234	
7235	                                var ts = jQuery.now(),
7236	                                        // try replacing _= if it is there
7237	                                        ret = s.url.replace( rts, "$1_=" + ts );
7238	
7239	                                // if nothing was replaced, add timestamp to the end
7240	                                s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
7241	                        }
7242	                }
7243	
7244	                // Set the correct header, if data is being sent
7245	                if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
7246	                        jqXHR.setRequestHeader( "Content-Type", s.contentType );
7247	                }
7248	
7249	                // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
7250	                if ( s.ifModified ) {
7251	                        ifModifiedKey = ifModifiedKey || s.url;
7252	                        if ( jQuery.lastModified[ ifModifiedKey ] ) {
7253	                                jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
7254	                        }
7255	                        if ( jQuery.etag[ ifModifiedKey ] ) {
7256	                                jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
7257	                        }
7258	                }
7259	
7260	                // Set the Accepts header for the server, depending on the dataType
7261	                jqXHR.setRequestHeader(
7262	                        "Accept",
7263	                        s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
7264	                                s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", */*; q=0.01" : "" ) :
7265	                                s.accepts[ "*" ]
7266	                );
7267	
7268	                // Check for headers option
7269	                for ( i in s.headers ) {
7270	                        jqXHR.setRequestHeader( i, s.headers[ i ] );
7271	                }
7272	
7273	                // Allow custom headers/mimetypes and early abort
7274	                if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
7275	                                // Abort if not done already
7276	                                jqXHR.abort();
7277	                                return false;
7278	
7279	                }
7280	
7281	                // Install callbacks on deferreds
7282	                for ( i in { success: 1, error: 1, complete: 1 } ) {
7283	                        jqXHR[ i ]( s[ i ] );
7284	                }
7285	
7286	                // Get transport
7287	                transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
7288	
7289	                // If no transport, we auto-abort
7290	                if ( !transport ) {
7291	                        done( -1, "No Transport" );
7292	                } else {
7293	                        jqXHR.readyState = 1;
7294	                        // Send global event
7295	                        if ( fireGlobals ) {
7296	                                globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
7297	                        }
7298	                        // Timeout
7299	                        if ( s.async && s.timeout > 0 ) {
7300	                                timeoutTimer = setTimeout( function(){
7301	                                        jqXHR.abort( "timeout" );
7302	                                }, s.timeout );
7303	                        }
7304	
7305	                        try {
7306	                                state = 1;
7307	                                transport.send( requestHeaders, done );
7308	                        } catch (e) {
7309	                                // Propagate exception as error if not done
7310	                                if ( status < 2 ) {
7311	                                        done( -1, e );
7312	                                // Simply rethrow otherwise
7313	                                } else {
7314	                                        jQuery.error( e );
7315	                                }
7316	                        }
7317	                }
7318	
7319	                return jqXHR;
7320	        },
7321	
7322	        // Serialize an array of form elements or a set of
7323	        // key/values into a query string
7324	        param: function( a, traditional ) {
7325	                var s = [],
7326	                        add = function( key, value ) {
7327	                                // If value is a function, invoke it and return its value
7328	                                value = jQuery.isFunction( value ) ? value() : value;
7329	                                s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
7330	                        };
7331	
7332	                // Set traditional to true for jQuery <= 1.3.2 behavior.
7333	                if ( traditional === undefined ) {
7334	                        traditional = jQuery.ajaxSettings.traditional;
7335	                }
7336	
7337	                // If an array was passed in, assume that it is an array of form elements.
7338	                if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
7339	                        // Serialize the form elements
7340	                        jQuery.each( a, function() {
7341	                                add( this.name, this.value );
7342	                        });
7343	
7344	                } else {
7345	                        // If traditional, encode the "old" way (the way 1.3.2 or older
7346	                        // did it), otherwise encode params recursively.
7347	                        for ( var prefix in a ) {
7348	                                buildParams( prefix, a[ prefix ], traditional, add );
7349	                        }
7350	                }
7351	
7352	                // Return the resulting serialization
7353	                return s.join( "&" ).replace( r20, "+" );
7354	        }
7355	});
7356	
7357	function buildParams( prefix, obj, traditional, add ) {
7358	        if ( jQuery.isArray( obj ) ) {
7359	                // Serialize array item.
7360	                jQuery.each( obj, function( i, v ) {
7361	                        if ( traditional || rbracket.test( prefix ) ) {
7362	                                // Treat each array item as a scalar.
7363	                                add( prefix, v );
7364	
7365	                        } else {
7366	                                // If array item is non-scalar (array or object), encode its
7367	                                // numeric index to resolve deserialization ambiguity issues.
7368	                                // Note that rack (as of 1.0.0) can't currently deserialize
7369	                                // nested arrays properly, and attempting to do so may cause
7370	                                // a server error. Possible fixes are to modify rack's
7371	                                // deserialization algorithm or to provide an option or flag
7372	                                // to force array serialization to be shallow.
7373	                                buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
7374	                        }
7375	                });
7376	
7377	        } else if ( !traditional && obj != null && typeof obj === "object" ) {
7378	                // Serialize object item.
7379	                for ( var name in obj ) {
7380	                        buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
7381	                }
7382	
7383	        } else {
7384	                // Serialize scalar item.
7385	                add( prefix, obj );
7386	        }
7387	}
7388	
7389	// This is still on the jQuery object... for now
7390	// Want to move this to jQuery.ajax some day
7391	jQuery.extend({
7392	
7393	        // Counter for holding the number of active queries
7394	        active: 0,
7395	
7396	        // Last-Modified header cache for next request
7397	        lastModified: {},
7398	        etag: {}
7399	
7400	});
7401	
7402	/* Handles responses to an ajax request:
7403	 * - sets all responseXXX fields accordingly
7404	 * - finds the right dataType (mediates between content-type and expected dataType)
7405	 * - returns the corresponding response
7406	 */
7407	function ajaxHandleResponses( s, jqXHR, responses ) {
7408	
7409	        var contents = s.contents,
7410	                dataTypes = s.dataTypes,
7411	                responseFields = s.responseFields,
7412	                ct,
7413	                type,
7414	                finalDataType,
7415	                firstDataType;
7416	
7417	        // Fill responseXXX fields
7418	        for( type in responseFields ) {
7419	                if ( type in responses ) {
7420	                        jqXHR[ responseFields[type] ] = responses[ type ];
7421	                }
7422	        }
7423	
7424	        // Remove auto dataType and get content-type in the process
7425	        while( dataTypes[ 0 ] === "*" ) {
7426	                dataTypes.shift();
7427	                if ( ct === undefined ) {
7428	                        ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
7429	                }
7430	        }
7431	
7432	        // Check if we're dealing with a known content-type
7433	        if ( ct ) {
7434	                for ( type in contents ) {
7435	                        if ( contents[ type ] && contents[ type ].test( ct ) ) {
7436	                                dataTypes.unshift( type );
7437	                                break;
7438	                        }
7439	                }
7440	        }
7441	
7442	        // Check to see if we have a response for the expected dataType
7443	        if ( dataTypes[ 0 ] in responses ) {
7444	                finalDataType = dataTypes[ 0 ];
7445	        } else {
7446	                // Try convertible dataTypes
7447	                for ( type in responses ) {
7448	                        if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
7449	                                finalDataType = type;
7450	                                break;
7451	                        }
7452	                        if ( !firstDataType ) {
7453	                                firstDataType = type;
7454	                        }
7455	                }
7456	                // Or just use first one
7457	                finalDataType = finalDataType || firstDataType;
7458	        }
7459	
7460	        // If we found a dataType
7461	        // We add the dataType to the list if needed
7462	        // and return the corresponding response
7463	        if ( finalDataType ) {
7464	                if ( finalDataType !== dataTypes[ 0 ] ) {
7465	                        dataTypes.unshift( finalDataType );
7466	                }
7467	                return responses[ finalDataType ];
7468	        }
7469	}
7470	
7471	// Chain conversions given the request and the original response
7472	function ajaxConvert( s, response ) {
7473	
7474	        // Apply the dataFilter if provided
7475	        if ( s.dataFilter ) {
7476	                response = s.dataFilter( response, s.dataType );
7477	        }
7478	
7479	        var dataTypes = s.dataTypes,
7480	                converters = {},
7481	                i,
7482	                key,
7483	                length = dataTypes.length,
7484	                tmp,
7485	                // Current and previous dataTypes
7486	                current = dataTypes[ 0 ],
7487	                prev,
7488	                // Conversion expression
7489	                conversion,
7490	                // Conversion function
7491	                conv,
7492	                // Conversion functions (transitive conversion)
7493	                conv1,
7494	                conv2;
7495	
7496	        // For each dataType in the chain
7497	        for( i = 1; i < length; i++ ) {
7498	
7499	                // Create converters map
7500	                // with lowercased keys
7501	                if ( i === 1 ) {
7502	                        for( key in s.converters ) {
7503	                                if( typeof key === "string" ) {
7504	                                        converters[ key.toLowerCase() ] = s.converters[ key ];
7505	                                }
7506	                        }
7507	                }
7508	
7509	                // Get the dataTypes
7510	                prev = current;
7511	                current = dataTypes[ i ];
7512	
7513	                // If current is auto dataType, update it to prev
7514	                if( current === "*" ) {
7515	                        current = prev;
7516	                // If no auto and dataTypes are actually different
7517	                } else if ( prev !== "*" && prev !== current ) {
7518	
7519	                        // Get the converter
7520	                        conversion = prev + " " + current;
7521	                        conv = converters[ conversion ] || converters[ "* " + current ];
7522	
7523	                        // If there is no direct converter, search transitively
7524	                        if ( !conv ) {
7525	                                conv2 = undefined;
7526	                                for( conv1 in converters ) {
7527	                                        tmp = conv1.split( " " );
7528	                                        if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
7529	                                                conv2 = converters[ tmp[1] + " " + current ];
7530	                                                if ( conv2 ) {
7531	                                                        conv1 = converters[ conv1 ];
7532	                                                        if ( conv1 === true ) {
7533	                                                                conv = conv2;
7534	                                                        } else if ( conv2 === true ) {
7535	                                                                conv = conv1;
7536	                                                        }
7537	                                                        break;
7538	                                                }
7539	                                        }
7540	                                }
7541	                        }
7542	                        // If we found no converter, dispatch an error
7543	                        if ( !( conv || conv2 ) ) {
7544	                                jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
7545	                        }
7546	                        // If found converter is not an equivalence
7547	                        if ( conv !== true ) {
7548	                                // Convert with 1 or 2 converters accordingly
7549	                                response = conv ? conv( response ) : conv2( conv1(response) );
7550	                        }
7551	                }
7552	        }
7553	        return response;
7554	}
7555	
7556	
7557	
7558	
7559	var jsc = jQuery.now(),
7560	        jsre = /(\=)\?(&|$)|\?\?/i;
7561	
7562	// Default jsonp settings
7563	jQuery.ajaxSetup({
7564	        jsonp: "callback",
7565	        jsonpCallback: function() {
7566	                return jQuery.expando + "_" + ( jsc++ );
7567	        }
7568	});
7569	
7570	// Detect, normalize options and install callbacks for jsonp requests
7571	jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
7572	
7573	        var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
7574	                ( typeof s.data === "string" );
7575	
7576	        if ( s.dataTypes[ 0 ] === "jsonp" ||
7577	                s.jsonp !== false && ( jsre.test( s.url ) ||
7578	                                inspectData && jsre.test( s.data ) ) ) {
7579	
7580	                var responseContainer,
7581	                        jsonpCallback = s.jsonpCallback =
7582	                                jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
7583	                        previous = window[ jsonpCallback ],
7584	                        url = s.url,
7585	                        data = s.data,
7586	                        replace = "$1" + jsonpCallback + "$2";
7587	
7588	                if ( s.jsonp !== false ) {
7589	                        url = url.replace( jsre, replace );
7590	                        if ( s.url === url ) {
7591	                                if ( inspectData ) {
7592	                                        data = data.replace( jsre, replace );
7593	                                }
7594	                                if ( s.data === data ) {
7595	                                        // Add callback manually
7596	                                        url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
7597	                                }
7598	                        }
7599	                }
7600	
7601	                s.url = url;
7602	                s.data = data;
7603	
7604	                // Install callback
7605	                window[ jsonpCallback ] = function( response ) {
7606	                        responseContainer = [ response ];
7607	                };
7608	
7609	                // Clean-up function
7610	                jqXHR.always(function() {
7611	                        // Set callback back to previous value
7612	                        window[ jsonpCallback ] = previous;
7613	                        // Call if it was a function and we have a response
7614	                        if ( responseContainer && jQuery.isFunction( previous ) ) {
7615	                                window[ jsonpCallback ]( responseContainer[ 0 ] );
7616	                        }
7617	                });
7618	
7619	                // Use data converter to retrieve json after script execution
7620	                s.converters["script json"] = function() {
7621	                        if ( !responseContainer ) {
7622	                                jQuery.error( jsonpCallback + " was not called" );
7623	                        }
7624	                        return responseContainer[ 0 ];
7625	                };
7626	
7627	                // force json dataType
7628	                s.dataTypes[ 0 ] = "json";
7629	
7630	                // Delegate to script
7631	                return "script";
7632	        }
7633	});
7634	
7635	
7636	
7637	
7638	// Install script dataType
7639	jQuery.ajaxSetup({
7640	        accepts: {
7641	                script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
7642	        },
7643	        contents: {
7644	                script: /javascript|ecmascript/
7645	        },
7646	        converters: {
7647	                "text script": function( text ) {
7648	                        jQuery.globalEval( text );
7649	                        return text;
7650	                }
7651	        }
7652	});
7653	
7654	// Handle cache's special case and global
7655	jQuery.ajaxPrefilter( "script", function( s ) {
7656	        if ( s.cache === undefined ) {
7657	                s.cache = false;
7658	        }
7659	        if ( s.crossDomain ) {
7660	                s.type = "GET";
7661	                s.global = false;
7662	        }
7663	});
7664	
7665	// Bind script tag hack transport
7666	jQuery.ajaxTransport( "script", function(s) {
7667	
7668	        // This transport only deals with cross domain requests
7669	        if ( s.crossDomain ) {
7670	
7671	                var script,
7672	                        head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
7673	
7674	                return {
7675	
7676	                        send: function( _, callback ) {
7677	
7678	                                script = document.createElement( "script" );
7679	
7680	                                script.async = "async";
7681	
7682	                                if ( s.scriptCharset ) {
7683	                                        script.charset = s.scriptCharset;
7684	                                }
7685	
7686	                                script.src = s.url;
7687	
7688	                                // Attach handlers for all browsers
7689	                                script.onload = script.onreadystatechange = function( _, isAbort ) {
7690	
7691	                                        if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
7692	
7693	                                                // Handle memory leak in IE
7694	                                                script.onload = script.onreadystatechange = null;
7695	
7696	                                                // Remove the script
7697	                                                if ( head && script.parentNode ) {
7698	                                                        head.removeChild( script );
7699	                                                }
7700	
7701	                                                // Dereference the script
7702	                                                script = undefined;
7703	
7704	                                                // Callback if not abort
7705	                                                if ( !isAbort ) {
7706	                                                        callback( 200, "success" );
7707	                                                }
7708	                                        }
7709	                                };
7710	                                // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
7711	                                // This arises when a base node is used (#2709 and #4378).
7712	                                head.insertBefore( script, head.firstChild );
7713	                        },
7714	
7715	                        abort: function() {
7716	                                if ( script ) {
7717	                                        script.onload( 0, 1 );
7718	                                }
7719	                        }
7720	                };
7721	        }
7722	});
7723	
7724	
7725	
7726	
7727	var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
7728	        xhrOnUnloadAbort = window.ActiveXObject ? function() {
7729	                // Abort all pending requests
7730	                for ( var key in xhrCallbacks ) {
7731	                        xhrCallbacks[ key ]( 0, 1 );
7732	                }
7733	        } : false,
7734	        xhrId = 0,
7735	        xhrCallbacks;
7736	
7737	// Functions to create xhrs
7738	function createStandardXHR() {
7739	        try {
7740	                return new window.XMLHttpRequest();
7741	        } catch( e ) {}
7742	}
7743	
7744	function createActiveXHR() {
7745	        try {
7746	                return new window.ActiveXObject( "Microsoft.XMLHTTP" );
7747	        } catch( e ) {}
7748	}
7749	
7750	// Create the request object
7751	// (This is still attached to ajaxSettings for backward compatibility)
7752	jQuery.ajaxSettings.xhr = window.ActiveXObject ?
7753	        /* Microsoft failed to properly
7754	         * implement the XMLHttpRequest in IE7 (can't request local files),
7755	         * so we use the ActiveXObject when it is available
7756	         * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
7757	         * we need a fallback.
7758	         */
7759	        function() {
7760	                return !this.isLocal && createStandardXHR() || createActiveXHR();
7761	        } :
7762	        // For all other browsers, use the standard XMLHttpRequest object
7763	        createStandardXHR;
7764	
7765	// Determine support properties
7766	(function( xhr ) {
7767	        jQuery.extend( jQuery.support, {
7768	                ajax: !!xhr,
7769	                cors: !!xhr && ( "withCredentials" in xhr )
7770	        });
7771	})( jQuery.ajaxSettings.xhr() );
7772	
7773	// Create transport if the browser can provide an xhr
7774	if ( jQuery.support.ajax ) {
7775	
7776	        jQuery.ajaxTransport(function( s ) {
7777	                // Cross domain only allowed if supported through XMLHttpRequest
7778	                if ( !s.crossDomain || jQuery.support.cors ) {
7779	
7780	                        var callback;
7781	
7782	                        return {
7783	                                send: function( headers, complete ) {
7784	
7785	                                        // Get a new xhr
7786	                                        var xhr = s.xhr(),
7787	                                                handle,
7788	                                                i;
7789	
7790	                                        // Open the socket
7791	                                        // Passing null username, generates a login popup on Opera (#2865)
7792	                                        if ( s.username ) {
7793	                                                xhr.open( s.type, s.url, s.async, s.username, s.password );
7794	                                        } else {
7795	                                                xhr.open( s.type, s.url, s.async );
7796	                                        }
7797	
7798	                                        // Apply custom fields if provided
7799	                                        if ( s.xhrFields ) {
7800	                                                for ( i in s.xhrFields ) {
7801	                                                        xhr[ i ] = s.xhrFields[ i ];
7802	                                                }
7803	                                        }
7804	
7805	                                        // Override mime type if needed
7806	                                        if ( s.mimeType && xhr.overrideMimeType ) {
7807	                                                xhr.overrideMimeType( s.mimeType );
7808	                                        }
7809	
7810	                                        // X-Requested-With header
7811	                                        // For cross-domain requests, seeing as conditions for a preflight are
7812	                                        // akin to a jigsaw puzzle, we simply never set it to be sure.
7813	                                        // (it can always be set on a per-request basis or even using ajaxSetup)
7814	                                        // For same-domain requests, won't change header if already provided.
7815	                                        if ( !s.crossDomain && !headers["X-Requested-With"] ) {
7816	                                                headers[ "X-Requested-With" ] = "XMLHttpRequest";
7817	                                        }
7818	
7819	                                        // Need an extra try/catch for cross domain requests in Firefox 3
7820	                                        try {
7821	                                                for ( i in headers ) {
7822	                                                        xhr.setRequestHeader( i, headers[ i ] );
7823	                                                }
7824	                                        } catch( _ ) {}
7825	
7826	                                        // Do send the request
7827	                                        // This may raise an exception which is actually
7828	                                        // handled in jQuery.ajax (so no try/catch here)
7829	                                        xhr.send( ( s.hasContent && s.data ) || null );
7830	
7831	                                        // Listener
7832	                                        callback = function( _, isAbort ) {
7833	
7834	                                                var status,
7835	                                                        statusText,
7836	                                                        responseHeaders,
7837	                                                        responses,
7838	                                                        xml;
7839	
7840	                                                // Firefox throws exceptions when accessing properties
7841	                                                // of an xhr when a network error occured
7842	                                                // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
7843	                                                try {
7844	
7845	                                                        // Was never called and is aborted or complete
7846	                                                        if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
7847	
7848	                                                                // Only called once
7849	                                                                callback = undefined;
7850	
7851	                                                                // Do not keep as active anymore
7852	                                                                if ( handle ) {
7853	                                                                        xhr.onreadystatechange = jQuery.noop;
7854	                                                                        if ( xhrOnUnloadAbort ) {
7855	                                                                                delete xhrCallbacks[ handle ];
7856	                                                                        }
7857	                                                                }
7858	
7859	                                                                // If it's an abort
7860	                                                                if ( isAbort ) {
7861	                                                                        // Abort it manually if needed
7862	                                                                        if ( xhr.readyState !== 4 ) {
7863	                                                                                xhr.abort();
7864	                                                                        }
7865	                                                                } else {
7866	                                                                        status = xhr.status;
7867	                                                                        responseHeaders = xhr.getAllResponseHeaders();
7868	                                                                        responses = {};
7869	                                                                        xml = xhr.responseXML;
7870	
7871	                                                                        // Construct response list
7872	                                                                        if ( xml && xml.documentElement /* #4958 */ ) {
7873	                                                                                responses.xml = xml;
7874	                                                                        }
7875	                                                                        responses.text = xhr.responseText;
7876	
7877	                                                                        // Firefox throws an exception when accessing
7878	                                                                        // statusText for faulty cross-domain requests
7879	                                                                        try {
7880	                                                                                statusText = xhr.statusText;
7881	                                                                        } catch( e ) {
7882	                                                                                // We normalize with Webkit giving an empty statusText
7883	                                                                                statusText = "";
7884	                                                                        }
7885	
7886	                                                                        // Filter status for non standard behaviors
7887	
7888	                                                                        // If the request is local and we have data: assume a success
7889	                                                                        // (success with no data won't get notified, that's the best we
7890	                                                                        // can do given current implementations)
7891	                                                                        if ( !status && s.isLocal && !s.crossDomain ) {
7892	                                                                                status = responses.text ? 200 : 404;
7893	                                                                        // IE - #1450: sometimes returns 1223 when it should be 204
7894	                                                                        } else if ( status === 1223 ) {
7895	                                                                                status = 204;
7896	                                                                        }
7897	                                                                }
7898	                                                        }
7899	                                                } catch( firefoxAccessException ) {
7900	                                                        if ( !isAbort ) {
7901	                                                                complete( -1, firefoxAccessException );
7902	                                                        }
7903	                                                }
7904	
7905	                                                // Call complete if needed
7906	                                                if ( responses ) {
7907	                                                        complete( status, statusText, responses, responseHeaders );
7908	                                                }
7909	                                        };
7910	
7911	                                        // if we're in sync mode or it's in cache
7912	                                        // and has been retrieved directly (IE6 & IE7)
7913	                                        // we need to manually fire the callback
7914	                                        if ( !s.async || xhr.readyState === 4 ) {
7915	                                                callback();
7916	                                        } else {
7917	                                                handle = ++xhrId;
7918	                                                if ( xhrOnUnloadAbort ) {
7919	                                                        // Create the active xhrs callbacks list if needed
7920	                                                        // and attach the unload handler
7921	                                                        if ( !xhrCallbacks ) {
7922	                                                                xhrCallbacks = {};
7923	                                                                jQuery( window ).unload( xhrOnUnloadAbort );
7924	                                                        }
7925	                                                        // Add to list of active xhrs callbacks
7926	                                                        xhrCallbacks[ handle ] = callback;
7927	                                                }
7928	                                                xhr.onreadystatechange = callback;
7929	                                        }
7930	                                },
7931	
7932	                                abort: function() {
7933	                                        if ( callback ) {
7934	                                                callback(0,1);
7935	                                        }
7936	                                }
7937	                        };
7938	                }
7939	        });
7940	}
7941	
7942	
7943	
7944	
7945	var elemdisplay = {},
7946	        iframe, iframeDoc,
7947	        rfxtypes = /^(?:toggle|show|hide)$/,
7948	        rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
7949	        timerId,
7950	        fxAttrs = [
7951	                // height animations
7952	                [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
7953	                // width animations
7954	                [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
7955	                // opacity animations
7956	                [ "opacity" ]
7957	        ],
7958	        fxNow,
7959	        requestAnimationFrame = window.webkitRequestAnimationFrame ||
7960	            window.mozRequestAnimationFrame ||
7961	            window.oRequestAnimationFrame;
7962	
7963	jQuery.fn.extend({
7964	        show: function( speed, easing, callback ) {
7965	                var elem, display;
7966	
7967	                if ( speed || speed === 0 ) {
7968	                        return this.animate( genFx("show", 3), speed, easing, callback);
7969	
7970	                } else {
7971	                        for ( var i = 0, j = this.length; i < j; i++ ) {
7972	                                elem = this[i];
7973	
7974	                                if ( elem.style ) {
7975	                                        display = elem.style.display;
7976	
7977	                                        // Reset the inline display of this element to learn if it is
7978	                                        // being hidden by cascaded rules or not
7979	                                        if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
7980	                                                display = elem.style.display = "";
7981	                                        }
7982	
7983	                                        // Set elements which have been overridden with display: none
7984	                                        // in a stylesheet to whatever the default browser style is
7985	                                        // for such an element
7986	                                        if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
7987	                                                jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
7988	                                        }
7989	                                }
7990	                        }
7991	
7992	                        // Set the display of most of the elements in a second loop
7993	                        // to avoid the constant reflow
7994	                        for ( i = 0; i < j; i++ ) {
7995	                                elem = this[i];
7996	
7997	                                if ( elem.style ) {
7998	                                        display = elem.style.display;
7999	
8000	                                        if ( display === "" || display === "none" ) {
8001	                                                elem.style.display = jQuery._data(elem, "olddisplay") || "";
8002	                                        }
8003	                                }
8004	                        }
8005	
8006	                        return this;
8007	                }
8008	        },
8009	
8010	        hide: function( speed, easing, callback ) {
8011	                if ( speed || speed === 0 ) {
8012	                        return this.animate( genFx("hide", 3), speed, easing, callback);
8013	
8014	                } else {
8015	                        for ( var i = 0, j = this.length; i < j; i++ ) {
8016	                                if ( this[i].style ) {
8017	                                        var display = jQuery.css( this[i], "display" );
8018	
8019	                                        if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
8020	                                                jQuery._data( this[i], "olddisplay", display );
8021	                                        }
8022	                                }
8023	                        }
8024	
8025	                        // Set the display of the elements in a second loop
8026	                        // to avoid the constant reflow
8027	                        for ( i = 0; i < j; i++ ) {
8028	                                if ( this[i].style ) {
8029	                                        this[i].style.display = "none";
8030	                                }
8031	                        }
8032	
8033	                        return this;
8034	                }
8035	        },
8036	
8037	        // Save the old toggle function
8038	        _toggle: jQuery.fn.toggle,
8039	
8040	        toggle: function( fn, fn2, callback ) {
8041	                var bool = typeof fn === "boolean";
8042	
8043	                if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
8044	                        this._toggle.apply( this, arguments );
8045	
8046	                } else if ( fn == null || bool ) {
8047	                        this.each(function() {
8048	                                var state = bool ? fn : jQuery(this).is(":hidden");
8049	                                jQuery(this)[ state ? "show" : "hide" ]();
8050	                        });
8051	
8052	                } else {
8053	                        this.animate(genFx("toggle", 3), fn, fn2, callback);
8054	                }
8055	
8056	                return this;
8057	        },
8058	
8059	        fadeTo: function( speed, to, easing, callback ) {
8060	                return this.filter(":hidden").css("opacity", 0).show().end()
8061	                                        .animate({opacity: to}, speed, easing, callback);
8062	        },
8063	
8064	        animate: function( prop, speed, easing, callback ) {
8065	                var optall = jQuery.speed(speed, easing, callback);
8066	
8067	                if ( jQuery.isEmptyObject( prop ) ) {
8068	                        return this.each( optall.complete, [ false ] );
8069	                }
8070	
8071	                // Do not change referenced properties as per-property easing will be lost
8072	                prop = jQuery.extend( {}, prop );
8073	
8074	                return this[ optall.queue === false ? "each" : "queue" ](function() {
8075	                        // XXX 'this' does not always have a nodeName when running the
8076	                        // test suite
8077	
8078	                        if ( optall.queue === false ) {
8079	                                jQuery._mark( this );
8080	                        }
8081	
8082	                        var opt = jQuery.extend( {}, optall ),
8083	                                isElement = this.nodeType === 1,
8084	                                hidden = isElement && jQuery(this).is(":hidden"),
8085	                                name, val, p,
8086	                                display, e,
8087	                                parts, start, end, unit;
8088	
8089	                        // will store per property easing and be used to determine when an animation is complete
8090	                        opt.animatedProperties = {};
8091	
8092	                        for ( p in prop ) {
8093	
8094	                                // property name normalization
8095	                                name = jQuery.camelCase( p );
8096	                                if ( p !== name ) {
8097	                                        prop[ name ] = prop[ p ];
8098	                                        delete prop[ p ];
8099	                                }
8100	
8101	                                val = prop[ name ];
8102	
8103	                                // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
8104	                                if ( jQuery.isArray( val ) ) {
8105	                                        opt.animatedProperties[ name ] = val[ 1 ];
8106	                                        val = prop[ name ] = val[ 0 ];
8107	                                } else {
8108	                                        opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
8109	                                }
8110	
8111	                                if ( val === "hide" && hidden || val === "show" && !hidden ) {
8112	                                        return opt.complete.call( this );
8113	                                }
8114	
8115	                                if ( isElement && ( name === "height" || name === "width" ) ) {
8116	                                        // Make sure that nothing sneaks out
8117	                                        // Record all 3 overflow attributes because IE does not
8118	                                        // change the overflow attribute when overflowX and
8119	                                        // overflowY are set to the same value
8120	                                        opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
8121	
8122	                                        // Set display property to inline-block for height/width
8123	                                        // animations on inline elements that are having width/height
8124	                                        // animated
8125	                                        if ( jQuery.css( this, "display" ) === "inline" &&
8126	                                                        jQuery.css( this, "float" ) === "none" ) {
8127	                                                if ( !jQuery.support.inlineBlockNeedsLayout ) {
8128	                                                        this.style.display = "inline-block";
8129	
8130	                                                } else {
8131	                                                        display = defaultDisplay( this.nodeName );
8132	
8133	                                                        // inline-level elements accept inline-block;
8134	                                                        // block-level elements need to be inline with layout
8135	                                                        if ( display === "inline" ) {
8136	                                                                this.style.display = "inline-block";
8137	
8138	                                                        } else {
8139	                                                                this.style.display = "inline";
8140	                                                                this.style.zoom = 1;
8141	                                                        }
8142	                                                }
8143	                                        }
8144	                                }
8145	                        }
8146	
8147	                        if ( opt.overflow != null ) {
8148	                                this.style.overflow = "hidden";
8149	                        }
8150	
8151	                        for ( p in prop ) {
8152	                                e = new jQuery.fx( this, opt, p );
8153	                                val = prop[ p ];
8154	
8155	                                if ( rfxtypes.test(val) ) {
8156	                                        e[ val === "toggle" ? hidden ? "show" : "hide" : val ]();
8157	
8158	                                } else {
8159	                                        parts = rfxnum.exec( val );
8160	                                        start = e.cur();
8161	
8162	                                        if ( parts ) {
8163	                                                end = parseFloat( parts[2] );
8164	                                                unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
8165	
8166	                                                // We need to compute starting value
8167	                                                if ( unit !== "px" ) {
8168	                                                        jQuery.style( this, p, (end || 1) + unit);
8169	                                                        start = ((end || 1) / e.cur()) * start;
8170	                                                        jQuery.style( this, p, start + unit);
8171	                                                }
8172	
8173	                                                // If a +=/-= token was provided, we're doing a relative animation
8174	                                                if ( parts[1] ) {
8175	                                                        end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
8176	                                                }
8177	
8178	                                                e.custom( start, end, unit );
8179	
8180	                                        } else {
8181	                                                e.custom( start, val, "" );
8182	                                        }
8183	                                }
8184	                        }
8185	
8186	                        // For JS strict compliance
8187	                        return true;
8188	                });
8189	        },
8190	
8191	        stop: function( clearQueue, gotoEnd ) {
8192	                if ( clearQueue ) {
8193	                        this.queue([]);
8194	                }
8195	
8196	                this.each(function() {
8197	                        var timers = jQuery.timers,
8198	                                i = timers.length;
8199	                        // clear marker counters if we know they won't be
8200	                        if ( !gotoEnd ) {
8201	                                jQuery._unmark( true, this );
8202	                        }
8203	                        while ( i-- ) {
8204	                                if ( timers[i].elem === this ) {
8205	                                        if (gotoEnd) {
8206	                                                // force the next step to be the last
8207	                                                timers[i](true);
8208	                                        }
8209	
8210	                                        timers.splice(i, 1);
8211	                                }
8212	                        }
8213	                });
8214	
8215	                // start the next in the queue if the last step wasn't forced
8216	                if ( !gotoEnd ) {
8217	                        this.dequeue();
8218	                }
8219	
8220	                return this;
8221	        }
8222	
8223	});
8224	
8225	// Animations created synchronously will run synchronously
8226	function createFxNow() {
8227	        setTimeout( clearFxNow, 0 );
8228	        return ( fxNow = jQuery.now() );
8229	}
8230	
8231	function clearFxNow() {
8232	        fxNow = undefined;
8233	}
8234	
8235	// Generate parameters to create a standard animation
8236	function genFx( type, num ) {
8237	        var obj = {};
8238	
8239	        jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
8240	                obj[ this ] = type;
8241	        });
8242	
8243	        return obj;
8244	}
8245	
8246	// Generate shortcuts for custom animations
8247	jQuery.each({
8248	        slideDown: genFx("show", 1),
8249	        slideUp: genFx("hide", 1),
8250	        slideToggle: genFx("toggle", 1),
8251	        fadeIn: { opacity: "show" },
8252	        fadeOut: { opacity: "hide" },
8253	        fadeToggle: { opacity: "toggle" }
8254	}, function( name, props ) {
8255	        jQuery.fn[ name ] = function( speed, easing, callback ) {
8256	                return this.animate( props, speed, easing, callback );
8257	        };
8258	});
8259	
8260	jQuery.extend({
8261	        speed: function( speed, easing, fn ) {
8262	                var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
8263	                        complete: fn || !fn && easing ||
8264	                                jQuery.isFunction( speed ) && speed,
8265	                        duration: speed,
8266	                        easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
8267	                };
8268	
8269	                opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
8270	                        opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
8271	
8272	                // Queueing
8273	                opt.old = opt.complete;
8274	                opt.complete = function( noUnmark ) {
8275	                        if ( opt.queue !== false ) {
8276	                                jQuery.dequeue( this );
8277	                        } else if ( noUnmark !== false ) {
8278	                                jQuery._unmark( this );
8279	                        }
8280	
8281	                        if ( jQuery.isFunction( opt.old ) ) {
8282	                                opt.old.call( this );
8283	                        }
8284	                };
8285	
8286	                return opt;
8287	        },
8288	
8289	        easing: {
8290	                linear: function( p, n, firstNum, diff ) {
8291	                        return firstNum + diff * p;
8292	                },
8293	                swing: function( p, n, firstNum, diff ) {
8294	                        return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
8295	                }
8296	        },
8297	
8298	        timers: [],
8299	
8300	        fx: function( elem, options, prop ) {
8301	                this.options = options;
8302	                this.elem = elem;
8303	                this.prop = prop;
8304	
8305	                options.orig = options.orig || {};
8306	        }
8307	
8308	});
8309	
8310	jQuery.fx.prototype = {
8311	        // Simple function for setting a style value
8312	        update: function() {
8313	                if ( this.options.step ) {
8314	                        this.options.step.call( this.elem, this.now, this );
8315	                }
8316	
8317	                (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
8318	        },
8319	
8320	        // Get the current size
8321	        cur: function() {
8322	                if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
8323	                        return this.elem[ this.prop ];
8324	                }
8325	
8326	                var parsed,
8327	                        r = jQuery.css( this.elem, this.prop );
8328	                // Empty strings, null, undefined and "auto" are converted to 0,
8329	                // complex values such as "rotate(1rad)" are returned as is,
8330	                // simple values such as "10px" are parsed to Float.
8331	                return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
8332	        },
8333	
8334	        // Start an animation from one number to another
8335	        custom: function( from, to, unit ) {
8336	                var self = this,
8337	                        fx = jQuery.fx,
8338	                        raf;
8339	
8340	                this.startTime = fxNow || createFxNow();
8341	                this.start = from;
8342	                this.end = to;
8343	                this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
8344	                this.now = this.start;
8345	                this.pos = this.state = 0;
8346	
8347	                function t( gotoEnd ) {
8348	                        return self.step(gotoEnd);
8349	                }
8350	
8351	                t.elem = this.elem;
8352	
8353	                if ( t() && jQuery.timers.push(t) && !timerId ) {
8354	                        // Use requestAnimationFrame instead of setInterval if available
8355	                        if ( requestAnimationFrame ) {
8356	                                timerId = 1;
8357	                                raf = function() {
8358	                                        // When timerId gets set to null at any point, this stops
8359	                                        if ( timerId ) {
8360	                                                requestAnimationFrame( raf );
8361	                                                fx.tick();
8362	                                        }
8363	                                };
8364	                                requestAnimationFrame( raf );
8365	                        } else {
8366	                                timerId = setInterval( fx.tick, fx.interval );
8367	                        }
8368	                }
8369	        },
8370	
8371	        // Simple 'show' function
8372	        show: function() {
8373	                // Remember where we started, so that we can go back to it later
8374	                this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
8375	                this.options.show = true;
8376	
8377	                // Begin the animation
8378	                // Make sure that we start at a small width/height to avoid any
8379	                // flash of content
8380	                this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
8381	
8382	                // Start by showing the element
8383	                jQuery( this.elem ).show();
8384	        },
8385	
8386	        // Simple 'hide' function
8387	        hide: function() {
8388	                // Remember where we started, so that we can go back to it later
8389	                this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
8390	                this.options.hide = true;
8391	
8392	                // Begin the animation
8393	                this.custom(this.cur(), 0);
8394	        },
8395	
8396	        // Each step of an animation
8397	        step: function( gotoEnd ) {
8398	                var t = fxNow || createFxNow(),
8399	                        done = true,
8400	                        elem = this.elem,
8401	                        options = this.options,
8402	                        i, n;
8403	
8404	                if ( gotoEnd || t >= options.duration + this.startTime ) {
8405	                        this.now = this.end;
8406	                        this.pos = this.state = 1;
8407	                        this.update();
8408	
8409	                        options.animatedProperties[ this.prop ] = true;
8410	
8411	                        for ( i in options.animatedProperties ) {
8412	                                if ( options.animatedProperties[i] !== true ) {
8413	                                        done = false;
8414	                                }
8415	                        }
8416	
8417	                        if ( done ) {
8418	                                // Reset the overflow
8419	                                if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
8420	
8421	                                        jQuery.each( [ "", "X", "Y" ], function (index, value) {
8422	                                                elem.style[ "overflow" + value ] = options.overflow[index];
8423	                                        });
8424	                                }
8425	
8426	                                // Hide the element if the "hide" operation was done
8427	                                if ( options.hide ) {
8428	                                        jQuery(elem).hide();
8429	                                }
8430	
8431	                                // Reset the properties, if the item has been hidden or shown
8432	                                if ( options.hide || options.show ) {
8433	                                        for ( var p in options.animatedProperties ) {
8434	                                                jQuery.style( elem, p, options.orig[p] );
8435	                                        }
8436	                                }
8437	
8438	                                // Execute the complete function
8439	                                options.complete.call( elem );
8440	                        }
8441	
8442	                        return false;
8443	
8444	                } else {
8445	                        // classical easing cannot be used with an Infinity duration
8446	                        if ( options.duration == Infinity ) {
8447	                                this.now = t;
8448	                        } else {
8449	                                n = t - this.startTime;
8450	                                this.state = n / options.duration;
8451	
8452	                                // Perform the easing function, defaults to swing
8453	                                this.pos = jQuery.easing[ options.animatedProperties[ this.prop ] ]( this.state, n, 0, 1, options.duration );
8454	                                this.now = this.start + ((this.end - this.start) * this.pos);
8455	                        }
8456	                        // Perform the next step of the animation
8457	                        this.update();
8458	                }
8459	
8460	                return true;
8461	        }
8462	};
8463	
8464	jQuery.extend( jQuery.fx, {
8465	        tick: function() {
8466	                for ( var timers = jQuery.timers, i = 0 ; i < timers.length ; ++i ) {
8467	                        if ( !timers[i]() ) {
8468	                                timers.splice(i--, 1);
8469	                        }
8470	                }
8471	
8472	                if ( !timers.length ) {
8473	                        jQuery.fx.stop();
8474	                }
8475	        },
8476	
8477	        interval: 13,
8478	
8479	        stop: function() {
8480	                clearInterval( timerId );
8481	                timerId = null;
8482	        },
8483	
8484	        speeds: {
8485	                slow: 600,
8486	                fast: 200,
8487	                // Default speed
8488	                _default: 400
8489	        },
8490	
8491	        step: {
8492	                opacity: function( fx ) {
8493	                        jQuery.style( fx.elem, "opacity", fx.now );
8494	                },
8495	
8496	                _default: function( fx ) {
8497	                        if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
8498	                                fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
8499	                        } else {
8500	                                fx.elem[ fx.prop ] = fx.now;
8501	                        }
8502	                }
8503	        }
8504	});
8505	
8506	if ( jQuery.expr && jQuery.expr.filters ) {
8507	        jQuery.expr.filters.animated = function( elem ) {
8508	                return jQuery.grep(jQuery.timers, function( fn ) {
8509	                        return elem === fn.elem;
8510	                }).length;
8511	        };
8512	}
8513	
8514	// Try to restore the default display value of an element
8515	function defaultDisplay( nodeName ) {
8516	
8517	        if ( !elemdisplay[ nodeName ] ) {
8518	
8519	                var elem = jQuery( "<" + nodeName + ">" ).appendTo( "body" ),
8520	                        display = elem.css( "display" );
8521	
8522	                elem.remove();
8523	
8524	                // If the simple way fails,
8525	                // get element's real default display by attaching it to a temp iframe
8526	                if ( display === "none" || display === "" ) {
8527	                        // No iframe to use yet, so create it
8528	                        if ( !iframe ) {
8529	                                iframe = document.createElement( "iframe" );
8530	                                iframe.frameBorder = iframe.width = iframe.height = 0;
8531	                        }
8532	
8533	                        document.body.appendChild( iframe );
8534	
8535	                        // Create a cacheable copy of the iframe document on first call.
8536	                        // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake html
8537	                        // document to it, Webkit & Firefox won't allow reusing the iframe document
8538	                        if ( !iframeDoc || !iframe.createElement ) {
8539	                                iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
8540	                                iframeDoc.write( "<!doctype><html><body></body></html>" );
8541	                        }
8542	
8543	                        elem = iframeDoc.createElement( nodeName );
8544	
8545	                        iframeDoc.body.appendChild( elem );
8546	
8547	                        display = jQuery.css( elem, "display" );
8548	
8549	                        document.body.removeChild( iframe );
8550	                }
8551	
8552	                // Store the correct default display
8553	                elemdisplay[ nodeName ] = display;
8554	        }
8555	
8556	        return elemdisplay[ nodeName ];
8557	}
8558	
8559	
8560	
8561	
8562	var rtable = /^t(?:able|d|h)$/i,
8563	        rroot = /^(?:body|html)$/i;
8564	
8565	if ( "getBoundingClientRect" in document.documentElement ) {
8566	        jQuery.fn.offset = function( options ) {
8567	                var elem = this[0], box;
8568	
8569	                if ( options ) {
8570	                        return this.each(function( i ) {
8571	                                jQuery.offset.setOffset( this, options, i );
8572	                        });
8573	                }
8574	
8575	                if ( !elem || !elem.ownerDocument ) {
8576	                        return null;
8577	                }
8578	
8579	                if ( elem === elem.ownerDocument.body ) {
8580	                        return jQuery.offset.bodyOffset( elem );
8581	                }
8582	
8583	                try {
8584	                        box = elem.getBoundingClientRect();
8585	                } catch(e) {}
8586	
8587	                var doc = elem.ownerDocument,
8588	                        docElem = doc.documentElement;
8589	
8590	                // Make sure we're not dealing with a disconnected DOM node
8591	                if ( !box || !jQuery.contains( docElem, elem ) ) {
8592	                        return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
8593	                }
8594	
8595	                var body = doc.body,
8596	                        win = getWindow(doc),
8597	                        clientTop  = docElem.clientTop  || body.clientTop  || 0,
8598	                        clientLeft = docElem.clientLeft || body.clientLeft || 0,
8599	                        scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
8600	                        scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
8601	                        top  = box.top  + scrollTop  - clientTop,
8602	                        left = box.left + scrollLeft - clientLeft;
8603	
8604	                return { top: top, left: left };
8605	        };
8606	
8607	} else {
8608	        jQuery.fn.offset = function( options ) {
8609	                var elem = this[0];
8610	
8611	                if ( options ) {
8612	                        return this.each(function( i ) {
8613	                                jQuery.offset.setOffset( this, options, i );
8614	                        });
8615	                }
8616	
8617	                if ( !elem || !elem.ownerDocument ) {
8618	                        return null;
8619	                }
8620	
8621	                if ( elem === elem.ownerDocument.body ) {
8622	                        return jQuery.offset.bodyOffset( elem );
8623	                }
8624	
8625	                jQuery.offset.initialize();
8626	
8627	                var computedStyle,
8628	                        offsetParent = elem.offsetParent,
8629	                        prevOffsetParent = elem,
8630	                        doc = elem.ownerDocument,
8631	                        docElem = doc.documentElement,
8632	                        body = doc.body,
8633	                        defaultView = doc.defaultView,
8634	                        prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
8635	                        top = elem.offsetTop,
8636	                        left = elem.offsetLeft;
8637	
8638	                while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
8639	                        if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
8640	                                break;
8641	                        }
8642	
8643	                        computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
8644	                        top  -= elem.scrollTop;
8645	                        left -= elem.scrollLeft;
8646	
8647	                        if ( elem === offsetParent ) {
8648	                                top  += elem.offsetTop;
8649	                                left += elem.offsetLeft;
8650	
8651	                                if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
8652	                                        top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
8653	                                        left += parseFloat( computedStyle.borderLeftWidth ) || 0;
8654	                                }
8655	
8656	                                prevOffsetParent = offsetParent;
8657	                                offsetParent = elem.offsetParent;
8658	                        }
8659	
8660	                        if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
8661	                                top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
8662	                                left += parseFloat( computedStyle.borderLeftWidth ) || 0;
8663	                        }
8664	
8665	                        prevComputedStyle = computedStyle;
8666	                }
8667	
8668	                if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
8669	                        top  += body.offsetTop;
8670	                        left += body.offsetLeft;
8671	                }
8672	
8673	                if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
8674	                        top  += Math.max( docElem.scrollTop, body.scrollTop );
8675	                        left += Math.max( docElem.scrollLeft, body.scrollLeft );
8676	                }
8677	
8678	                return { top: top, left: left };
8679	        };
8680	}
8681	
8682	jQuery.offset = {
8683	        initialize: function() {
8684	                var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
8685	                        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>";
8686	
8687	                jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
8688	
8689	                container.innerHTML = html;
8690	                body.insertBefore( container, body.firstChild );
8691	                innerDiv = container.firstChild;
8692	                checkDiv = innerDiv.firstChild;
8693	                td = innerDiv.nextSibling.firstChild.firstChild;
8694	
8695	                this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
8696	                this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
8697	
8698	                checkDiv.style.position = "fixed";
8699	                checkDiv.style.top = "20px";
8700	
8701	                // safari subtracts parent border width here which is 5px
8702	                this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
8703	                checkDiv.style.position = checkDiv.style.top = "";
8704	
8705	                innerDiv.style.overflow = "hidden";
8706	                innerDiv.style.position = "relative";
8707	
8708	                this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
8709	
8710	                this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
8711	
8712	                body.removeChild( container );
8713	                jQuery.offset.initialize = jQuery.noop;
8714	        },
8715	
8716	        bodyOffset: function( body ) {
8717	                var top = body.offsetTop,
8718	                        left = body.offsetLeft;
8719	
8720	                jQuery.offset.initialize();
8721	
8722	                if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
8723	                        top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
8724	                        left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
8725	                }
8726	
8727	                return { top: top, left: left };
8728	        },
8729	
8730	        setOffset: function( elem, options, i ) {
8731	                var position = jQuery.css( elem, "position" );
8732	
8733	                // set position first, in-case top/left are set even on static elem
8734	                if ( position === "static" ) {
8735	                        elem.style.position = "relative";
8736	                }
8737	
8738	                var curElem = jQuery( elem ),
8739	                        curOffset = curElem.offset(),
8740	                        curCSSTop = jQuery.css( elem, "top" ),
8741	                        curCSSLeft = jQuery.css( elem, "left" ),
8742	                        calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
8743	                        props = {}, curPosition = {}, curTop, curLeft;
8744	
8745	                // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
8746	                if ( calculatePosition ) {
8747	                        curPosition = curElem.position();
8748	                        curTop = curPosition.top;
8749	                        curLeft = curPosition.left;
8750	                } else {
8751	                        curTop = parseFloat( curCSSTop ) || 0;
8752	                        curLeft = parseFloat( curCSSLeft ) || 0;
8753	                }
8754	
8755	                if ( jQuery.isFunction( options ) ) {
8756	                        options = options.call( elem, i, curOffset );
8757	                }
8758	
8759	                if (options.top != null) {
8760	                        props.top = (options.top - curOffset.top) + curTop;
8761	                }
8762	                if (options.left != null) {
8763	                        props.left = (options.left - curOffset.left) + curLeft;
8764	                }
8765	
8766	                if ( "using" in options ) {
8767	                        options.using.call( elem, props );
8768	                } else {
8769	                        curElem.css( props );
8770	                }
8771	        }
8772	};
8773	
8774	
8775	jQuery.fn.extend({
8776	        position: function() {
8777	                if ( !this[0] ) {
8778	                        return null;
8779	                }
8780	
8781	                var elem = this[0],
8782	
8783	                // Get *real* offsetParent
8784	                offsetParent = this.offsetParent(),
8785	
8786	                // Get correct offsets
8787	                offset       = this.offset(),
8788	                parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
8789	
8790	                // Subtract element margins
8791	                // note: when an element has margin: auto the offsetLeft and marginLeft
8792	                // are the same in Safari causing offset.left to incorrectly be 0
8793	                offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
8794	                offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
8795	
8796	                // Add offsetParent borders
8797	                parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
8798	                parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
8799	
8800	                // Subtract the two offsets
8801	                return {
8802	                        top:  offset.top  - parentOffset.top,
8803	                        left: offset.left - parentOffset.left
8804	                };
8805	        },
8806	
8807	        offsetParent: function() {
8808	                return this.map(function() {
8809	                        var offsetParent = this.offsetParent || document.body;
8810	                        while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
8811	                                offsetParent = offsetParent.offsetParent;
8812	                        }
8813	                        return offsetParent;
8814	                });
8815	        }
8816	});
8817	
8818	
8819	// Create scrollLeft and scrollTop methods
8820	jQuery.each( ["Left", "Top"], function( i, name ) {
8821	        var method = "scroll" + name;
8822	
8823	        jQuery.fn[ method ] = function( val ) {
8824	                var elem, win;
8825	
8826	                if ( val === undefined ) {
8827	                        elem = this[ 0 ];
8828	
8829	                        if ( !elem ) {
8830	                                return null;
8831	                        }
8832	
8833	                        win = getWindow( elem );
8834	
8835	                        // Return the scroll offset
8836	                        return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
8837	                                jQuery.support.boxModel && win.document.documentElement[ method ] ||
8838	                                        win.document.body[ method ] :
8839	                                elem[ method ];
8840	                }
8841	
8842	                // Set the scroll offset
8843	                return this.each(function() {
8844	                        win = getWindow( this );
8845	
8846	                        if ( win ) {
8847	                                win.scrollTo(
8848	                                        !i ? val : jQuery( win ).scrollLeft(),
8849	                                         i ? val : jQuery( win ).scrollTop()
8850	                                );
8851	
8852	                        } else {
8853	                                this[ method ] = val;
8854	                        }
8855	                });
8856	        };
8857	});
8858	
8859	function getWindow( elem ) {
8860	        return jQuery.isWindow( elem ) ?
8861	                elem :
8862	                elem.nodeType === 9 ?
8863	                        elem.defaultView || elem.parentWindow :
8864	                        false;
8865	}
8866	
8867	
8868	
8869	
8870	// Create innerHeight, innerWidth, outerHeight and outerWidth methods
8871	jQuery.each([ "Height", "Width" ], function( i, name ) {
8872	
8873	        var type = name.toLowerCase();
8874	
8875	        // innerHeight and innerWidth
8876	        jQuery.fn["inner" + name] = function() {
8877	                return this[0] ?
8878	                        parseFloat( jQuery.css( this[0], type, "padding" ) ) :
8879	                        null;
8880	        };
8881	
8882	        // outerHeight and outerWidth
8883	        jQuery.fn["outer" + name] = function( margin ) {
8884	                return this[0] ?
8885	                        parseFloat( jQuery.css( this[0], type, margin ? "margin" : "border" ) ) :
8886	                        null;
8887	        };
8888	
8889	        jQuery.fn[ type ] = function( size ) {
8890	                // Get window width or height
8891	                var elem = this[0];
8892	                if ( !elem ) {
8893	                        return size == null ? null : this;
8894	                }
8895	
8896	                if ( jQuery.isFunction( size ) ) {
8897	                        return this.each(function( i ) {
8898	                                var self = jQuery( this );
8899	                                self[ type ]( size.call( this, i, self[ type ]() ) );
8900	                        });
8901	                }
8902	
8903	                if ( jQuery.isWindow( elem ) ) {
8904	                        // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
8905	                        // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
8906	                        var docElemProp = elem.document.documentElement[ "client" + name ];
8907	                        return elem.document.compatMode === "CSS1Compat" && docElemProp ||
8908	                                elem.document.body[ "client" + name ] || docElemProp;
8909	
8910	                // Get document width or height
8911	                } else if ( elem.nodeType === 9 ) {
8912	                        // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
8913	                        return Math.max(
8914	                                elem.documentElement["client" + name],
8915	                                elem.body["scroll" + name], elem.documentElement["scroll" + name],
8916	                                elem.body["offset" + name], elem.documentElement["offset" + name]
8917	                        );
8918	
8919	                // Get or set width or height on the element
8920	                } else if ( size === undefined ) {
8921	                        var orig = jQuery.css( elem, type ),
8922	                                ret = parseFloat( orig );
8923	
8924	                        return jQuery.isNaN( ret ) ? orig : ret;
8925	
8926	                // Set the width or height on the element (default to pixels if value is unitless)
8927	                } else {
8928	                        return this.css( type, typeof size === "string" ? size : size + "px" );
8929	                }
8930	        };
8931	
8932	});
8933	
8934	
8935	window.jQuery = window.$ = jQuery;
8936	})(window);
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容