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

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

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

Por favor, inicie sesión para enviar un comentario

    Sin comentarios