Tag: jQuery升级

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

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

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