Tag: jQuery详解

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

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

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