Хранилища Subversion ant

Редакция

Редакция 19 | К новейшей редакции | Только различия | Не учитывать пробелы | Содержимое файла | Авторство | Последнее изменение | Открыть журнал | RSS

Редакция 19 Редакция 109
1
/*!
1
/*!
2
 * jQuery JavaScript Library v1.3.2
2
 * jQuery JavaScript Library v1.3.3pre
3
 * http://jquery.com/
3
 * http://jquery.com/
4
 *
4
 *
5
 * Copyright (c) 2009 John Resig
5
 * Copyright (c) 2009 John Resig
6
 * Dual licensed under the MIT and GPL licenses.
6
 * Dual licensed under the MIT and GPL licenses.
7
 * http://docs.jquery.com/License
7
 * http://docs.jquery.com/License
8
 *
8
 *
9
 * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
9
 * Date: 2009-03-28 00:20:57 +0600 (Сбт, 28 Мар 2009)
10
 * Revision: 6246
10
 * Revision: 6301
11
 */
11
 */
12
(function(){
12
(function(){
13
13
14
var
14
var
15
        // Will speed up references to window, and allows munging its name.
15
        // Will speed up references to window, and allows munging its name.
16
        window = this,
16
        window = this,
17
        // Will speed up references to undefined, and allows munging its name.
17
        // Will speed up references to undefined, and allows munging its name.
18
        undefined,
18
        undefined,
19
        // Map over jQuery in case of overwrite
19
        // Map over jQuery in case of overwrite
20
        _jQuery = window.jQuery,
20
        _jQuery = window.jQuery,
21
        // Map over the $ in case of overwrite
21
        // Map over the $ in case of overwrite
22
        _$ = window.$,
22
        _$ = window.$,
23
23
24
        jQuery = window.jQuery = window.$ = function( selector, context ) {
24
        jQuery = window.jQuery = window.$ = function( selector, context ) {
25
                // The jQuery object is actually just the init constructor 'enhanced'
25
                // The jQuery object is actually just the init constructor 'enhanced'
-
 
26
                return selector === undefined ?
-
 
27
                        rootjQuery :
26
                return new jQuery.fn.init( selector, context );
28
                        new jQuery.fn.init( selector, context );
27
        },
29
        },
28
30
29
        // A simple way to check for HTML strings or ID strings
31
        // A simple way to check for HTML strings or ID strings
30
        // (both of which we optimize for)
32
        // (both of which we optimize for)
31
        quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,
33
        quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,
32
        // Is it a simple selector
34
        // Is it a simple selector
33
        isSimple = /^.[^:#\[\.,]*$/;
35
        isSimple = /^.[^:#\[\.,]*$/;
34
36
35
jQuery.fn = jQuery.prototype = {
37
jQuery.fn = jQuery.prototype = {
36
        init: function( selector, context ) {
38
        init: function( selector, context ) {
37
                // Make sure that a selection was provided
39
                // Handle $("") or $(null)
38
                selector = selector || document;
40
                if ( !selector ) {
-
 
41
                        this.length = 0;
-
 
42
                        return this;
-
 
43
                }
39
44
40
                // Handle $(DOMElement)
45
                // Handle $(DOMElement)
41
                if ( selector.nodeType ) {
46
                if ( selector.nodeType ) {
42
                        this[0] = selector;
47
                        this[0] = selector;
43
                        this.length = 1;
48
                        this.length = 1;
44
                        this.context = selector;
49
                        this.context = selector;
45
                        return this;
50
                        return this;
46
                }
51
                }
-
 
52
47
                // Handle HTML strings
53
                // Handle HTML strings
48
                if ( typeof selector === "string" ) {
54
                if ( typeof selector === "string" ) {
49
                        // Are we dealing with HTML string or an ID?
55
                        // Are we dealing with HTML string or an ID?
50
                        var match = quickExpr.exec( selector );
56
                        var match = quickExpr.exec( selector );
51
57
52
                        // Verify a match, and that no context was specified for #id
58
                        // Verify a match, and that no context was specified for #id
53
                        if ( match && (match[1] || !context) ) {
59
                        if ( match && (match[1] || !context) ) {
54
60
55
                                // HANDLE: $(html) -> $(array)
61
                                // HANDLE: $(html) -> $(array)
56
                                if ( match[1] )
62
                                if ( match[1] ) {
57
                                        selector = jQuery.clean( [ match[1] ], context );
63
                                        selector = jQuery.clean( [ match[1] ], context );
58
64
59
                                // HANDLE: $("#id")
65
                                // HANDLE: $("#id")
60
                                else {
66
                                } else {
61
                                        var elem = document.getElementById( match[3] );
67
                                        var elem = document.getElementById( match[3] );
62
68
63
                                        // Handle the case where IE and Opera return items
69
                                        // Handle the case where IE and Opera return items
64
                                        // by name instead of ID
70
                                        // by name instead of ID
65
                                        if ( elem && elem.id != match[3] )
71
                                        if ( elem && elem.id != match[3] ) {
66
                                                return jQuery().find( selector );
72
                                                return rootjQuery.find( selector );
-
 
73
                                        }
67
74
68
                                        // Otherwise, we inject the element directly into the jQuery object
75
                                        // Otherwise, we inject the element directly into the jQuery object
69
                                        var ret = jQuery( elem || [] );
76
                                        var ret = jQuery( elem || null );
70
                                        ret.context = document;
77
                                        ret.context = document;
71
                                        ret.selector = selector;
78
                                        ret.selector = selector;
72
                                        return ret;
79
                                        return ret;
73
                                }
80
                                }
74
81
-
 
82
                        // HANDLE: $(expr, $(...))
-
 
83
                        } else if ( !context || context.jquery ) {
-
 
84
                                return (context || rootjQuery).find( selector );
-
 
85
75
                        // HANDLE: $(expr, [context])
86
                        // HANDLE: $(expr, context)
76
                        // (which is just equivalent to: $(content).find(expr)
87
                        // (which is just equivalent to: $(context).find(expr)
77
                        } else
88
                        } else {
78
                                return jQuery( context ).find( selector );
89
                                return jQuery( context ).find( selector );
-
 
90
                        }
79
91
80
                // HANDLE: $(function)
92
                // HANDLE: $(function)
81
                // Shortcut for document ready
93
                // Shortcut for document ready
82
                } else if ( jQuery.isFunction( selector ) )
94
                } else if ( jQuery.isFunction( selector ) ) {
83
                        return jQuery( document ).ready( selector );
95
                        return rootjQuery.ready( selector );
-
 
96
                }
84
97
85
                // Make sure that old selector state is passed along
98
                // Make sure that old selector state is passed along
86
                if ( selector.selector && selector.context ) {
99
                if ( selector.selector && selector.context ) {
87
                        this.selector = selector.selector;
100
                        this.selector = selector.selector;
88
                        this.context = selector.context;
101
                        this.context = selector.context;
89
                }
102
                }
90
103
91
                return this.setArray(jQuery.isArray( selector ) ?
104
                return this.setArray(jQuery.isArray( selector ) ?
92
                        selector :
105
                        selector :
93
                        jQuery.makeArray(selector));
106
                        jQuery.makeArray(selector));
94
        },
107
        },
95
108
96
        // Start with an empty selector
109
        // Start with an empty selector
97
        selector: "",
110
        selector: "",
98
111
99
        // The current version of jQuery being used
112
        // The current version of jQuery being used
100
        jquery: "1.3.2",
113
        jquery: "1.3.3pre",
101
114
102
        // The number of elements contained in the matched element set
115
        // The number of elements contained in the matched element set
103
        size: function() {
116
        size: function() {
104
                return this.length;
117
                return this.length;
105
        },
118
        },
106
119
107
        // Get the Nth element in the matched element set OR
120
        // Get the Nth element in the matched element set OR
108
        // Get the whole matched element set as a clean array
121
        // Get the whole matched element set as a clean array
109
        get: function( num ) {
122
        get: function( num ) {
110
                return num === undefined ?
123
                return num === undefined ?
111
124
112
                        // Return a 'clean' array
125
                        // Return a 'clean' array
113
                        Array.prototype.slice.call( this ) :
126
                        Array.prototype.slice.call( this ) :
114
127
115
                        // Return just the object
128
                        // Return just the object
116
                        this[ num ];
129
                        this[ num ];
117
        },
130
        },
118
131
119
        // Take an array of elements and push it onto the stack
132
        // Take an array of elements and push it onto the stack
120
        // (returning the new matched element set)
133
        // (returning the new matched element set)
121
        pushStack: function( elems, name, selector ) {
134
        pushStack: function( elems, name, selector ) {
122
                // Build a new jQuery matched element set
135
                // Build a new jQuery matched element set
123
                var ret = jQuery( elems );
136
                var ret = jQuery( elems || null );
124
137
125
                // Add the old object onto the stack (as a reference)
138
                // Add the old object onto the stack (as a reference)
126
                ret.prevObject = this;
139
                ret.prevObject = this;
127
140
128
                ret.context = this.context;
141
                ret.context = this.context;
129
142
130
                if ( name === "find" )
143
                if ( name === "find" )
131
                        ret.selector = this.selector + (this.selector ? " " : "") + selector;
144
                        ret.selector = this.selector + (this.selector ? " " : "") + selector;
132
                else if ( name )
145
                else if ( name )
133
                        ret.selector = this.selector + "." + name + "(" + selector + ")";
146
                        ret.selector = this.selector + "." + name + "(" + selector + ")";
134
147
135
                // Return the newly-formed element set
148
                // Return the newly-formed element set
136
                return ret;
149
                return ret;
137
        },
150
        },
138
151
139
        // Force the current matched set of elements to become
152
        // Force the current matched set of elements to become
140
        // the specified array of elements (destroying the stack in the process)
153
        // the specified array of elements (destroying the stack in the process)
141
        // You should use pushStack() in order to do this, but maintain the stack
154
        // You should use pushStack() in order to do this, but maintain the stack
142
        setArray: function( elems ) {
155
        setArray: function( elems ) {
143
                // Resetting the length to 0, then using the native Array push
156
                // Resetting the length to 0, then using the native Array push
144
                // is a super-fast way to populate an object with array-like properties
157
                // is a super-fast way to populate an object with array-like properties
145
                this.length = 0;
158
                this.length = 0;
146
                Array.prototype.push.apply( this, elems );
159
                Array.prototype.push.apply( this, elems );
147
160
148
                return this;
161
                return this;
149
        },
162
        },
150
163
151
        // Execute a callback for every element in the matched set.
164
        // Execute a callback for every element in the matched set.
152
        // (You can seed the arguments with an array of args, but this is
165
        // (You can seed the arguments with an array of args, but this is
153
        // only used internally.)
166
        // only used internally.)
154
        each: function( callback, args ) {
167
        each: function( callback, args ) {
155
                return jQuery.each( this, callback, args );
168
                return jQuery.each( this, callback, args );
156
        },
169
        },
157
170
158
        // Determine the position of an element within
171
        // Determine the position of an element within
159
        // the matched set of elements
172
        // the matched set of elements
160
        index: function( elem ) {
173
        index: function( elem ) {
161
                // Locate the position of the desired element
174
                // Locate the position of the desired element
162
                return jQuery.inArray(
175
                return jQuery.inArray(
163
                        // If it receives a jQuery object, the first element is used
176
                        // If it receives a jQuery object, the first element is used
164
                        elem && elem.jquery ? elem[0] : elem
177
                        elem && elem.jquery ? elem[0] : elem
165
                , this );
178
                , this );
166
        },
179
        },
167
180
168
        attr: function( name, value, type ) {
181
        is: function( selector ) {
169
                var options = name;
182
                return !!selector && jQuery.multiFilter( selector, this ).length > 0;
-
 
183
        },
170
184
-
 
185
        // For internal use only.
171
                // Look for the case where we're accessing a style value
186
        // Behaves like an Array's method, not like a jQuery method.
172
                if ( typeof name === "string" )
187
        push: [].push,
173
                        if ( value === undefined )
188
        sort: [].sort,
174
                                return this[0] && jQuery[ type || "attr" ]( this[0], name );
189
        splice: [].splice
-
 
190
};
175
191
176
                        else {
-
 
177
                                options = {};
192
// Give the init function the jQuery prototype for later instantiation
178
                                options[ name ] = value;
193
jQuery.fn.init.prototype = jQuery.fn;
179
                        }
-
 
180
194
181
                // Check to see if we're setting style values
-
 
182
                return this.each(function(i){
195
function evalScript( i, elem ) {
183
                        // Set all the styles
-
 
184
                        for ( name in options )
196
        if ( elem.src )
185
                                jQuery.attr(
197
                jQuery.ajax({
186
                                        type ?
198
                        url: elem.src,
187
                                                this.style :
199
                        async: false,
188
                                                this,
200
                        dataType: "script"
189
                                        name, jQuery.prop( this, options[ name ], type, i, name )
-
 
190
                                );
-
 
191
                });
201
                });
192
        },
-
 
193
202
194
        css: function( key, value ) {
-
 
195
                // ignore negative width and height values
-
 
196
                if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
-
 
197
                        value = undefined;
203
        else
198
                return this.attr( key, value, "curCSS" );
204
                jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
199
        },
-
 
200
205
201
        text: function( text ) {
206
        if ( elem.parentNode )
202
                if ( typeof text !== "object" && text != null )
207
                elem.parentNode.removeChild( elem );
203
                        return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
-
 
-
 
208
}
204
209
-
 
210
function now(){
205
                var ret = "";
211
        return +new Date;
-
 
212
}
206
213
207
                jQuery.each( text || this, function(){
214
jQuery.extend = jQuery.fn.extend = function() {
208
                        jQuery.each( this.childNodes, function(){
-
 
209
                                if ( this.nodeType != 8 )
215
        // copy reference to target object
210
                                        ret += this.nodeType != 1 ?
216
        var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
211
                                                this.nodeValue :
-
 
212
                                                jQuery.fn.text( [ this ] );
-
 
213
                        });
-
 
214
                });
-
 
215
217
-
 
218
        // Handle a deep copy situation
-
 
219
        if ( typeof target === "boolean" ) {
216
                return ret;
220
                deep = target;
-
 
221
                target = arguments[1] || {};
-
 
222
                // skip the boolean and the target
-
 
223
                i = 2;
217
        },
224
        }
218
225
219
        wrapAll: function( html ) {
-
 
220
                if ( this[0] ) {
-
 
221
                        // The elements to wrap the target around
226
        // Handle case when target is a string or something (possible in deep copy)
222
                        var wrap = jQuery( html, this[0].ownerDocument ).clone();
227
        if ( typeof target !== "object" && !jQuery.isFunction(target) )
-
 
228
                target = {};
223
229
-
 
230
        // extend jQuery itself if only one argument is passed
224
                        if ( this[0].parentNode )
231
        if ( length == i ) {
225
                                wrap.insertBefore( this[0] );
232
                target = this;
-
 
233
                --i;
-
 
234
        }
226
235
227
                        wrap.map(function(){
236
        for ( ; i < length; i++ )
-
 
237
                // Only deal with non-null/undefined values
-
 
238
                if ( (options = arguments[ i ]) != null )
-
 
239
                        // Extend the base object
228
                                var elem = this;
240
                        for ( var name in options ) {
-
 
241
                                var src = target[ name ], copy = options[ name ];
229
242
230
                                while ( elem.firstChild )
243
                                // Prevent never-ending loop
231
                                        elem = elem.firstChild;
244
                                if ( target === copy )
-
 
245
                                        continue;
232
246
233
                                return elem;
247
                                // Recurse if we're merging object values
-
 
248
                                if ( deep && copy && typeof copy === "object" && !copy.nodeType )
234
                        }).append(this);
249
                                        target[ name ] = jQuery.extend( deep,
-
 
250
                                                // Never move original objects, clone them
-
 
251
                                                src || ( copy.length != null ? [ ] : { } )
235
                }
252
                                        , copy );
236
253
-
 
254
                                // Don't bring in undefined values
-
 
255
                                else if ( copy !== undefined )
237
                return this;
256
                                        target[ name ] = copy;
238
        },
-
 
239
257
240
        wrapInner: function( html ) {
-
 
241
                return this.each(function(){
-
 
242
                        jQuery( this ).contents().wrapAll( html );
-
 
243
                });
258
                        }
244
        },
-
 
245
259
246
        wrap: function( html ) {
260
        // Return the modified object
247
                return this.each(function(){
261
        return target;
248
                        jQuery( this ).wrapAll( html );
-
 
249
                });
-
 
250
        },
262
};
251
263
252
        append: function() {
-
 
253
                return this.domManip(arguments, true, function(elem){
264
var toString = Object.prototype.toString;
254
                        if (this.nodeType == 1)
-
 
255
                                this.appendChild( elem );
-
 
256
                });
-
 
257
        },
-
 
258
265
259
        prepend: function() {
266
jQuery.extend({
260
                return this.domManip(arguments, true, function(elem){
267
        noConflict: function( deep ) {
-
 
268
                window.$ = _$;
-
 
269
261
                        if (this.nodeType == 1)
270
                if ( deep )
262
                                this.insertBefore( elem, this.firstChild );
271
                        window.jQuery = _jQuery;
-
 
272
263
                });
273
                return jQuery;
264
        },
274
        },
265
275
266
        before: function() {
276
        // See test/unit/core.js for details concerning isFunction.
267
                return this.domManip(arguments, false, function(elem){
277
        // Since version 1.3, DOM methods and functions like alert
268
                        this.parentNode.insertBefore( elem, this );
278
        // aren't supported. They return false on IE (#2968).
269
                });
279
        isFunction: function( obj ) {
-
 
280
                return toString.call(obj) === "[object Function]";
270
        },
281
        },
271
282
272
        after: function() {
283
        isArray: function( obj ) {
273
                return this.domManip(arguments, false, function(elem){
284
                return toString.call(obj) === "[object Array]";
274
                        this.parentNode.insertBefore( elem, this.nextSibling );
-
 
275
                });
-
 
276
        },
285
        },
277
286
-
 
287
        // check if an element is in a (or is an) XML document
278
        end: function() {
288
        isXMLDoc: function( elem ) {
279
                return this.prevObject || jQuery( [] );
289
                return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
-
 
290
                        !!elem.ownerDocument && elem.ownerDocument.documentElement.nodeName !== "HTML";
280
        },
291
        },
281
292
282
        // For internal use only.
293
        // Evalulates a script in a global context
283
        // Behaves like an Array's method, not like a jQuery method.
294
        globalEval: function( data ) {
284
        push: [].push,
295
                if ( data && /\S/.test(data) ) {
285
        sort: [].sort,
296
                        // Inspired by code by Andrea Giammarchi
-
 
297
                        // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
-
 
298
                        var head = document.getElementsByTagName("head")[0] || document.documentElement,
286
        splice: [].splice,
299
                                script = document.createElement("script");
287
300
288
        find: function( selector ) {
301
                        script.type = "text/javascript";
289
                if ( this.length === 1 ) {
302
                        if ( jQuery.support.scriptEval )
290
                        var ret = this.pushStack( [], "find", selector );
303
                                script.appendChild( document.createTextNode( data ) );
291
                        ret.length = 0;
304
                        else
292
                        jQuery.find( selector, this[0], ret );
-
 
293
                        return ret;
305
                                script.text = data;
294
                } else {
306
295
                        return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){
307
                        // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
-
 
308
                        // This arises when a base node is used (#2709).
296
                                return jQuery.find( selector, elem );
309
                        head.insertBefore( script, head.firstChild );
297
                        })), "find", selector );
310
                        head.removeChild( script );
298
                }
311
                }
299
        },
312
        },
300
313
301
        clone: function( events ) {
314
        nodeName: function( elem, name ) {
302
                // Do the clone
-
 
303
                var ret = this.map(function(){
-
 
304
                        if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
-
 
305
                                // IE copies events bound via attachEvent when
-
 
306
                                // using cloneNode. Calling detachEvent on the
-
 
307
                                // clone will also remove the events from the orignal
315
                return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
308
                                // In order to get around this, we use innerHTML.
-
 
309
                                // Unfortunately, this means some modifications to
-
 
-
 
316
        },
-
 
317
310
                                // attributes in IE that are actually only stored
318
        // args is for internal usage only
311
                                // as properties will not be copied (such as the
319
        each: function( object, callback, args ) {
312
                                // the name attribute on an input).
-
 
313
                                var html = this.outerHTML;
320
                var name, i = 0, length = object.length;
314
                                if ( !html ) {
-
 
315
                                        var div = this.ownerDocument.createElement("div");
-
 
316
                                        div.appendChild( this.cloneNode(true) );
-
 
317
                                        html = div.innerHTML;
-
 
318
                                }
-
 
319
321
-
 
322
                if ( args ) {
-
 
323
                        if ( length === undefined ) {
-
 
324
                                for ( name in object )
320
                                return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0];
325
                                        if ( callback.apply( object[ name ], args ) === false )
-
 
326
                                                break;
321
                        } else
327
                        } else
322
                                return this.cloneNode(true);
328
                                for ( ; i < length; )
-
 
329
                                        if ( callback.apply( object[ i++ ], args ) === false )
323
                });
330
                                                break;
324
331
325
                // Copy the events from the original to the clone
332
                // A special, fast, case for the most common use of each
-
 
333
                } else {
326
                if ( events === true ) {
334
                        if ( length === undefined ) {
-
 
335
                                for ( name in object )
-
 
336
                                        if ( callback.call( object[ name ], name, object[ name ] ) === false )
-
 
337
                                                break;
-
 
338
                        } else
327
                        var orig = this.find("*").andSelf(), i = 0;
339
                                for ( var value = object[0];
-
 
340
                                        i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
-
 
341
                }
328
342
329
                        ret.find("*").andSelf().each(function(){
-
 
330
                                if ( this.nodeName !== orig[i].nodeName )
-
 
331
                                        return;
343
                return object;
-
 
344
        },
332
345
-
 
346
        trim: function( text ) {
333
                                var events = jQuery.data( orig[i], "events" );
347
                return (text || "").replace( /^\s+|\s+$/g, "" );
-
 
348
        },
334
349
335
                                for ( var type in events ) {
350
        makeArray: function( array ) {
336
                                        for ( var handler in events[ type ] ) {
-
 
337
                                                jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
-
 
338
                                        }
351
                var ret = [];
339
                                }
-
 
340
352
-
 
353
                if( array != null ){
-
 
354
                        var i = array.length;
-
 
355
                        // The window, strings (and functions) also have 'length'
-
 
356
                        if( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval )
341
                                i++;
357
                                ret[0] = array;
342
                        });
358
                        else
-
 
359
                                while( i )
-
 
360
                                        ret[--i] = array[i];
343
                }
361
                }
344
362
345
                // Return the cloned set
-
 
346
                return ret;
363
                return ret;
347
        },
364
        },
348
365
349
        filter: function( selector ) {
366
        inArray: function( elem, array ) {
350
                return this.pushStack(
-
 
351
                        jQuery.isFunction( selector ) &&
-
 
352
                        jQuery.grep(this, function(elem, i){
-
 
353
                                return selector.call( elem, i );
-
 
354
                        }) ||
-
 
355
-
 
356
                        jQuery.multiFilter( selector, jQuery.grep(this, function(elem){
367
                for ( var i = 0, length = array.length; i < length; i++ )
357
                                return elem.nodeType === 1;
-
 
358
                        }) ), "filter", selector );
-
 
359
        },
-
 
360
-
 
361
        closest: function( selector ) {
-
 
362
                var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null,
-
 
363
                        closer = 0;
-
 
364
-
 
365
                return this.map(function(){
-
 
366
                        var cur = this;
-
 
367
                        while ( cur && cur.ownerDocument ) {
368
                // Use === because on IE, window == document
368
                                if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) {
-
 
369
                                        jQuery.data(cur, "closest", closer);
369
                        if ( array[ i ] === elem )
370
                                        return cur;
370
                                return i;
371
                                }
-
 
372
                                cur = cur.parentNode;
-
 
373
                                closer++;
-
 
374
                        }
-
 
375
                });
-
 
376
        },
-
 
377
-
 
378
        not: function( selector ) {
-
 
379
                if ( typeof selector === "string" )
-
 
380
                        // test special case where just one selector is passed in
-
 
381
                        if ( isSimple.test( selector ) )
-
 
382
                                return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector );
-
 
383
                        else
-
 
384
                                selector = jQuery.multiFilter( selector, this );
-
 
385
371
386
                var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
-
 
387
                return this.filter(function() {
-
 
388
                        return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
-
 
389
                });
372
                return -1;
390
        },
373
        },
391
374
392
        add: function( selector ) {
375
        merge: function( first, second ) {
393
                return this.pushStack( jQuery.unique( jQuery.merge(
376
                // We have to loop this way because IE & Opera overwrite the length
394
                        this.get(),
377
                // expando of getElementsByTagName
395
                        typeof selector === "string" ?
378
                var i = 0, elem, pos = first.length;
-
 
379
                // Also, we need to make sure that the correct elements are being returned
-
 
380
                // (IE returns comment nodes in a '*' query)
396
                                jQuery( selector ) :
381
                if ( !jQuery.support.getAll ) {
-
 
382
                        while ( (elem = second[ i++ ]) != null )
397
                                jQuery.makeArray( selector )
383
                                if ( elem.nodeType != 8 )
398
                )));
384
                                        first[ pos++ ] = elem;
399
        },
-
 
400
385
401
        is: function( selector ) {
386
                } else
402
                return !!selector && jQuery.multiFilter( selector, this ).length > 0;
387
                        while ( (elem = second[ i++ ]) != null )
403
        },
388
                                first[ pos++ ] = elem;
404
389
405
        hasClass: function( selector ) {
390
                return first;
406
                return !!selector && this.is( "." + selector );
-
 
407
        },
391
        },
408
392
409
        val: function( value ) {
393
        unique: function( array ) {
410
                if ( value === undefined ) {                   
-
 
411
                        var elem = this[0];
-
 
412
-
 
413
                        if ( elem ) {
-
 
414
                                if( jQuery.nodeName( elem, 'option' ) )
-
 
415
                                        return (elem.attributes.value || {}).specified ? elem.value : elem.text;
-
 
416
                               
-
 
417
                                // We need to handle select boxes special
-
 
418
                                if ( jQuery.nodeName( elem, "select" ) ) {
-
 
419
                                        var index = elem.selectedIndex,
-
 
420
                                                values = [],
-
 
421
                                                options = elem.options,
-
 
422
                                                one = elem.type == "select-one";
-
 
423
-
 
424
                                        // Nothing was selected
-
 
425
                                        if ( index < 0 )
-
 
426
                                                return null;
-
 
427
-
 
428
                                        // Loop through all the selected options
-
 
429
                                        for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
-
 
430
                                                var option = options[ i ];
394
                var ret = [], done = {};
431
-
 
432
                                                if ( option.selected ) {
-
 
433
                                                        // Get the specifc value for the option
-
 
434
                                                        value = jQuery(option).val();
-
 
435
395
436
                                                        // We don't need an array for one selects
-
 
437
                                                        if ( one )
-
 
438
                                                                return value;
396
                try {
439
397
440
                                                        // Multi-Selects return an array
398
                        for ( var i = 0, length = array.length; i < length; i++ ) {
441
                                                        values.push( value );
399
                                var id = jQuery.data( array[ i ] );
442
                                                }
-
 
443
                                        }
-
 
444
400
-
 
401
                                if ( !done[ id ] ) {
445
                                        return values;                         
402
                                        done[ id ] = true;
-
 
403
                                        ret.push( array[ i ] );
446
                                }
404
                                }
447
-
 
448
                                // Everything else, we just grab the value
-
 
449
                                return (elem.value || "").replace(/\r/g, "");
-
 
450
-
 
451
                        }
405
                        }
452
406
-
 
407
                } catch( e ) {
453
                        return undefined;
408
                        ret = array;
454
                }
409
                }
455
410
456
                if ( typeof value === "number" )
-
 
457
                        value += '';
-
 
458
-
 
459
                return this.each(function(){
-
 
460
                        if ( this.nodeType != 1 )
-
 
461
                                return;
411
                return ret;
462
-
 
463
                        if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) )
-
 
464
                                this.checked = (jQuery.inArray(this.value, value) >= 0 ||
-
 
465
                                        jQuery.inArray(this.name, value) >= 0);
-
 
466
-
 
467
                        else if ( jQuery.nodeName( this, "select" ) ) {
-
 
468
                                var values = jQuery.makeArray(value);
-
 
469
-
 
470
                                jQuery( "option", this ).each(function(){
-
 
471
                                        this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
-
 
472
                                                jQuery.inArray( this.text, values ) >= 0);
-
 
473
                                });
-
 
474
-
 
475
                                if ( !values.length )
-
 
476
                                        this.selectedIndex = -1;
-
 
477
-
 
478
                        } else
-
 
479
                                this.value = value;
-
 
480
                });
-
 
481
        },
-
 
482
-
 
483
        html: function( value ) {
-
 
484
                return value === undefined ?
-
 
485
                        (this[0] ?
-
 
486
                                this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") :
-
 
487
                                null) :
-
 
488
                        this.empty().append( value );
-
 
489
        },
-
 
490
-
 
491
        replaceWith: function( value ) {
-
 
492
                return this.after( value ).remove();
-
 
493
        },
412
        },
494
413
495
        eq: function( i ) {
414
        grep: function( elems, callback, inv ) {
496
                return this.slice( i, +i + 1 );
415
                var ret = [];
497
        },
-
 
498
416
-
 
417
                // Go through the array, only saving the items
499
        slice: function() {
418
                // that pass the validator function
500
                return this.pushStack( Array.prototype.slice.apply( this, arguments ),
419
                for ( var i = 0, length = elems.length; i < length; i++ )
501
                        "slice", Array.prototype.slice.call(arguments).join(",") );
420
                        if ( !inv != !callback( elems[ i ], i ) )
502
        },
421
                                ret.push( elems[ i ] );
503
422
504
        map: function( callback ) {
-
 
505
                return this.pushStack( jQuery.map(this, function(elem, i){
-
 
506
                        return callback.call( elem, i, elem );
-
 
507
                }));
423
                return ret;
508
        },
424
        },
509
425
510
        andSelf: function() {
426
        map: function( elems, callback ) {
511
                return this.add( this.prevObject );
427
                var ret = [];
512
        },
-
 
513
428
514
        domManip: function( args, table, callback ) {
429
                // Go through the array, translating each of the items to their
515
                if ( this[0] ) {
430
                // new value (or values).
516
                        var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(),
-
 
517
                                scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ),
431
                for ( var i = 0, length = elems.length; i < length; i++ ) {
518
                                first = fragment.firstChild;
432
                        var value = callback( elems[ i ], i );
519
433
520
                        if ( first )
434
                        if ( value != null )
521
                                for ( var i = 0, l = this.length; i < l; i++ )
-
 
522
                                        callback.call( root(this[i], first), this.length > 1 || i > 0 ?
-
 
523
                                                        fragment.cloneNode(true) : fragment );
435
                                ret[ ret.length ] = value;
524
               
-
 
525
                        if ( scripts )
-
 
526
                                jQuery.each( scripts, evalScript );
-
 
527
                }
436
                }
528
437
529
                return this;
-
 
530
               
-
 
531
                function root( elem, cur ) {
438
                return ret.concat.apply( [], ret );
532
                        return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ?
-
 
533
                                (elem.getElementsByTagName("tbody")[0] ||
-
 
534
                                elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
-
 
535
                                elem;
-
 
536
                }
-
 
537
        }
439
        }
538
};
440
});
539
-
 
540
// Give the init function the jQuery prototype for later instantiation
-
 
541
jQuery.fn.init.prototype = jQuery.fn;
-
 
542
-
 
543
function evalScript( i, elem ) {
-
 
544
        if ( elem.src )
-
 
545
                jQuery.ajax({
-
 
546
                        url: elem.src,
-
 
547
                        async: false,
-
 
548
                        dataType: "script"
-
 
549
                });
-
 
550
-
 
551
        else
-
 
552
                jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
-
 
553
-
 
554
        if ( elem.parentNode )
-
 
555
                elem.parentNode.removeChild( elem );
-
 
556
}
-
 
557
-
 
558
function now(){
-
 
559
        return +new Date;
-
 
560
}
-
 
561
-
 
562
jQuery.extend = jQuery.fn.extend = function() {
-
 
563
        // copy reference to target object
-
 
564
        var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
-
 
565
441
566
        // Handle a deep copy situation
442
// All jQuery objects should point back to these
567
        if ( typeof target === "boolean" ) {
-
 
568
                deep = target;
-
 
569
                target = arguments[1] || {};
443
var rootjQuery = jQuery(document);
570
                // skip the boolean and the target
-
 
571
                i = 2;
-
 
572
        }
-
 
573
444
574
        // Handle case when target is a string or something (possible in deep copy)
445
// Use of jQuery.browser is deprecated.
575
        if ( typeof target !== "object" && !jQuery.isFunction(target) )
446
// It's included for backwards compatibility and plugins,
576
                target = {};
447
// although they should work to migrate away.
577
448
578
        // extend jQuery itself if only one argument is passed
449
var userAgent = navigator.userAgent.toLowerCase();
579
        if ( length == i ) {
-
 
580
                target = this;
-
 
581
                --i;
-
 
582
        }
-
 
583
450
-
 
451
// Figure out what browser is being used
-
 
452
jQuery.browser = {
-
 
453
        version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
-
 
454
        safari: /webkit/.test( userAgent ),
-
 
455
        opera: /opera/.test( userAgent ),
-
 
456
        msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
-
 
457
        mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
-
 
458
};var expando = "jQuery" + now(), uuid = 0, windowData = {};
-
 
459
-
 
460
jQuery.extend({
-
 
461
        cache: {},
-
 
462
-
 
463
        data: function( elem, name, data ) {
-
 
464
                elem = elem == window ?
-
 
465
                        windowData :
-
 
466
                        elem;
-
 
467
-
 
468
                var id = elem[ expando ];
-
 
469
-
 
470
                // Compute a unique ID for the element
-
 
471
                if ( !id )
-
 
472
                        id = elem[ expando ] = ++uuid;
-
 
473
-
 
474
                // Only generate the data cache if we're
-
 
475
                // trying to access or manipulate it
584
        for ( ; i < length; i++ )
476
                if ( name && !jQuery.cache[ id ] )
-
 
477
                        jQuery.cache[ id ] = {};
-
 
478
585
                // Only deal with non-null/undefined values
479
                // Prevent overriding the named cache with undefined values
586
                if ( (options = arguments[ i ]) != null )
480
                if ( data !== undefined )
-
 
481
                        jQuery.cache[ id ][ name ] = data;
-
 
482
-
 
483
                // Return the named cache data, or the ID for the element
-
 
484
                return name ?
-
 
485
                        jQuery.cache[ id ][ name ] :
-
 
486
                        id;
-
 
487
        },
-
 
488
-
 
489
        removeData: function( elem, name ) {
-
 
490
                elem = elem == window ?
-
 
491
                        windowData :
-
 
492
                        elem;
-
 
493
-
 
494
                var id = elem[ expando ];
-
 
495
-
 
496
                // If we want to remove a specific section of the element's data
-
 
497
                if ( name ) {
-
 
498
                        if ( jQuery.cache[ id ] ) {
-
 
499
                                // Remove the section of cache data
-
 
500
                                delete jQuery.cache[ id ][ name ];
-
 
501
-
 
502
                                // If we've removed all the data, remove the element's cache
-
 
503
                                name = "";
-
 
504
-
 
505
                                for ( name in jQuery.cache[ id ] )
-
 
506
                                        break;
-
 
507
-
 
508
                                if ( !name )
-
 
509
                                        jQuery.removeData( elem );
-
 
510
                        }
-
 
511
-
 
512
                // Otherwise, we want to remove all of the element's data
-
 
513
                } else {
587
                        // Extend the base object
514
                        // Clean up the element expando
-
 
515
                        try {
-
 
516
                                delete elem[ expando ];
-
 
517
                        } catch(e){
-
 
518
                                // IE has trouble directly removing the expando
-
 
519
                                // but it's ok with using removeAttribute
-
 
520
                                if ( elem.removeAttribute )
-
 
521
                                        elem.removeAttribute( expando );
-
 
522
                        }
-
 
523
-
 
524
                        // Completely remove the data cache
-
 
525
                        delete jQuery.cache[ id ];
-
 
526
                }
-
 
527
        },
-
 
528
        queue: function( elem, type, data ) {
-
 
529
                if ( elem ){
-
 
530
-
 
531
                        type = (type || "fx") + "queue";
-
 
532
-
 
533
                        var q = jQuery.data( elem, type );
-
 
534
-
 
535
                        if ( !q || jQuery.isArray(data) )
-
 
536
                                q = jQuery.data( elem, type, jQuery.makeArray(data) );
-
 
537
                        else if( data )
-
 
538
                                q.push( data );
-
 
539
-
 
540
                }
-
 
541
                return q;
-
 
542
        },
-
 
543
-
 
544
        dequeue: function( elem, type ){
-
 
545
                var queue = jQuery.queue( elem, type ),
-
 
546
                        fn = queue.shift();
-
 
547
-
 
548
                if( !type || type === "fx" )
-
 
549
                        fn = queue[0];
-
 
550
-
 
551
                if( fn !== undefined )
-
 
552
                        fn.call(elem);
-
 
553
        }
-
 
554
});
-
 
555
-
 
556
jQuery.fn.extend({
-
 
557
        data: function( key, value ){
-
 
558
                var parts = key.split(".");
-
 
559
                parts[1] = parts[1] ? "." + parts[1] : "";
-
 
560
588
                        for ( var name in options ) {
561
                if ( value === undefined ) {
-
 
562
                        var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
-
 
563
-
 
564
                        if ( data === undefined && this.length )
-
 
565
                                data = jQuery.data( this[0], key );
-
 
566
-
 
567
                        return data === undefined && parts[1] ?
-
 
568
                                this.data( parts[0] ) :
-
 
569
                                data;
-
 
570
                } else
-
 
571
                        return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
-
 
572
                                jQuery.data( this, key, value );
-
 
573
                        });
-
 
574
        },
-
 
575
-
 
576
        removeData: function( key ){
-
 
577
                return this.each(function(){
-
 
578
                        jQuery.removeData( this, key );
-
 
579
                });
-
 
580
        },
-
 
581
        queue: function(type, data){
-
 
582
                if ( typeof type !== "string" ) {
-
 
583
                        data = type;
-
 
584
                        type = "fx";
-
 
585
                }
-
 
586
-
 
587
                if ( data === undefined )
-
 
588
                        return jQuery.queue( this[0], type );
-
 
589
-
 
590
                return this.each(function(){
589
                                var src = target[ name ], copy = options[ name ];
591
                        var queue = jQuery.queue( this, type, data );
-
 
592
-
 
593
                         if( type == "fx" && queue.length == 1 )
-
 
594
                                queue[0].call(this);
-
 
595
                });
-
 
596
        },
-
 
597
        dequeue: function(type){
-
 
598
                return this.each(function(){
-
 
599
                        jQuery.dequeue( this, type );
-
 
600
                });
-
 
601
        }
-
 
602
});/*!
-
 
603
 * Sizzle CSS Selector Engine - v1.0
-
 
604
 *  Copyright 2009, The Dojo Foundation
-
 
605
 *  Released under the MIT, BSD, and GPL Licenses.
-
 
606
 *  More information: http://sizzlejs.com/
-
 
607
 */
-
 
608
(function(){
590
609
-
 
610
var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,
591
                                // Prevent never-ending loop
611
        done = 0,
592
                                if ( target === copy )
612
        toString = Object.prototype.toString;
593
                                        continue;
-
 
594
613
595
                                // Recurse if we're merging object values
-
 
596
                                if ( deep && copy && typeof copy === "object" && !copy.nodeType )
614
var Sizzle = function(selector, context, results, seed) {
597
                                        target[ name ] = jQuery.extend( deep,
615
        results = results || [];
598
                                                // Never move original objects, clone them
-
 
599
                                                src || ( copy.length != null ? [ ] : { } )
616
        var origContext = context = context || document;
600
                                        , copy );
-
 
601
617
602
                                // Don't bring in undefined values
-
 
603
                                else if ( copy !== undefined )
618
        if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
604
                                        target[ name ] = copy;
619
                return [];
-
 
620
        }
605
621
-
 
622
        if ( !selector || typeof selector !== "string" ) {
-
 
623
                return results;
606
                        }
624
        }
607
625
608
        // Return the modified object
626
        var parts = [], m, set, checkSet, check, mode, extra, prune = true, contextXML = isXML(context);
609
        return target;
-
 
610
};
-
 
611
627
612
// exclude the following css properties to add px
628
        // Reset the position of the chunker regexp (start from head)
613
var     exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
-
 
614
        // cache defaultView
629
        chunker.lastIndex = 0;
615
        defaultView = document.defaultView || {},
-
 
616
        toString = Object.prototype.toString;
-
 
617
630
618
jQuery.extend({
-
 
619
        noConflict: function( deep ) {
631
        while ( (m = chunker.exec(selector)) !== null ) {
620
                window.$ = _$;
632
                parts.push( m[1] );
621
633
622
                if ( deep )
634
                if ( m[2] ) {
623
                        window.jQuery = _jQuery;
635
                        extra = RegExp.rightContext;
-
 
636
                        break;
-
 
637
                }
-
 
638
        }
624
639
-
 
640
        if ( parts.length > 1 && origPOS.exec( selector ) ) {
-
 
641
                if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
-
 
642
                        set = posProcess( parts[0] + parts[1], context );
625
                return jQuery;
643
                } else {
-
 
644
                        set = Expr.relative[ parts[0] ] ?
626
        },
645
                                [ context ] :
-
 
646
                                Sizzle( parts.shift(), context );
627
647
628
        // See test/unit/core.js for details concerning isFunction.
-
 
629
        // Since version 1.3, DOM methods and functions like alert
-
 
630
        // aren't supported. They return false on IE (#2968).
-
 
631
        isFunction: function( obj ) {
648
                        while ( parts.length ) {
632
                return toString.call(obj) === "[object Function]";
649
                                selector = parts.shift();
633
        },
-
 
634
650
635
        isArray: function( obj ) {
651
                                if ( Expr.relative[ selector ] )
636
                return toString.call(obj) === "[object Array]";
652
                                        selector += parts.shift();
637
        },
-
 
638
653
-
 
654
                                set = posProcess( selector, set );
-
 
655
                        }
-
 
656
                }
-
 
657
        } else {
639
        // check if an element is in a (or is an) XML document
658
                // Take a shortcut and set the context if the root selector is an ID
640
        isXMLDoc: function( elem ) {
659
                // (but not if it'll be faster if the inner selector is an ID)
641
                return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
660
                if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
-
 
661
                                Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
642
                        !!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument );
662
                        var ret = Sizzle.find( parts.shift(), context, contextXML );
-
 
663
                        context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
643
        },
664
                }
-
 
665
-
 
666
                if ( context ) {
-
 
667
                        var ret = seed ?
-
 
668
                                { expr: parts.pop(), set: makeArray(seed) } :
-
 
669
                                Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
-
 
670
                        set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
644
671
645
        // Evalulates a script in a global context
-
 
646
        globalEval: function( data ) {
672
                        if ( parts.length > 0 ) {
647
                if ( data && /\S/.test(data) ) {
673
                                checkSet = makeArray(set);
648
                        // Inspired by code by Andrea Giammarchi
674
                        } else {
649
                        // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
-
 
650
                        var head = document.getElementsByTagName("head")[0] || document.documentElement,
-
 
651
                                script = document.createElement("script");
675
                                prune = false;
-
 
676
                        }
652
677
653
                        script.type = "text/javascript";
-
 
654
                        if ( jQuery.support.scriptEval )
678
                        while ( parts.length ) {
655
                                script.appendChild( document.createTextNode( data ) );
-
 
656
                        else
-
 
657
                                script.text = data;
679
                                var cur = parts.pop(), pop = cur;
658
680
659
                        // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
681
                                if ( !Expr.relative[ cur ] ) {
660
                        // This arises when a base node is used (#2709).
682
                                        cur = "";
661
                        head.insertBefore( script, head.firstChild );
683
                                } else {
662
                        head.removeChild( script );
684
                                        pop = parts.pop();
663
                }
685
                                }
664
        },
-
 
665
686
666
        nodeName: function( elem, name ) {
687
                                if ( pop == null ) {
667
                return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
688
                                        pop = context;
668
        },
689
                                }
669
690
670
        // args is for internal usage only
-
 
671
        each: function( object, callback, args ) {
-
 
672
                var name, i = 0, length = object.length;
-
 
673
-
 
674
                if ( args ) {
-
 
675
                        if ( length === undefined ) {
-
 
676
                                for ( name in object )
-
 
677
                                        if ( callback.apply( object[ name ], args ) === false )
691
                                Expr.relative[ cur ]( checkSet, pop, contextXML );
678
                                                break;
-
 
679
                        } else
692
                        }
680
                                for ( ; i < length; )
-
 
681
                                        if ( callback.apply( object[ i++ ], args ) === false )
-
 
682
                                                break;
-
 
683
-
 
684
                // A special, fast, case for the most common use of each
-
 
685
                } else {
693
                } else {
686
                        if ( length === undefined ) {
-
 
687
                                for ( name in object )
-
 
688
                                        if ( callback.call( object[ name ], name, object[ name ] ) === false )
-
 
689
                                                break;
-
 
690
                        } else
-
 
691
                                for ( var value = object[0];
694
                        checkSet = parts = [];
692
                                        i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
-
 
693
                }
695
                }
-
 
696
        }
694
697
695
                return object;
-
 
696
        },
-
 
697
-
 
698
        prop: function( elem, value, type, i, name ) {
-
 
699
                // Handle executable functions
-
 
700
                if ( jQuery.isFunction( value ) )
698
        if ( !checkSet ) {
701
                        value = value.call( elem, i );
-
 
702
-
 
703
                // Handle passing in a number to a CSS property
-
 
704
                return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ?
-
 
705
                        value + "px" :
699
                checkSet = set;
706
                        value;
-
 
707
        },
700
        }
708
-
 
709
        className: {
-
 
710
                // internal only, use addClass("class")
-
 
711
                add: function( elem, classNames ) {
-
 
712
                        jQuery.each((classNames || "").split(/\s+/), function(i, className){
-
 
713
                                if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
-
 
714
                                        elem.className += (elem.className ? " " : "") + className;
-
 
715
                        });
-
 
716
                },
-
 
717
-
 
718
                // internal only, use removeClass("class")
-
 
719
                remove: function( elem, classNames ) {
-
 
720
                        if (elem.nodeType == 1)
-
 
721
                                elem.className = classNames !== undefined ?
-
 
722
                                        jQuery.grep(elem.className.split(/\s+/), function(className){
-
 
723
                                                return !jQuery.className.has( classNames, className );
-
 
724
                                        }).join(" ") :
-
 
725
                                        "";
-
 
726
                },
-
 
727
701
728
                // internal only, use hasClass("class")
-
 
729
                has: function( elem, className ) {
702
        if ( !checkSet ) {
730
                        return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
703
                throw "Syntax error, unrecognized expression: " + (cur || selector);
731
                }
704
        }
732
        },
-
 
733
705
734
        // A method for quickly swapping in/out CSS properties to get correct calculations
706
        if ( toString.call(checkSet) === "[object Array]" ) {
-
 
707
                if ( !prune ) {
735
        swap: function( elem, options, callback ) {
708
                        results.push.apply( results, checkSet );
736
                var old = {};
709
                } else if ( context && context.nodeType === 1 ) {
737
                // Remember the old values, and insert the new ones
710
                        for ( var i = 0; checkSet[i] != null; i++ ) {
-
 
711
                                if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
-
 
712
                                        results.push( set[i] );
-
 
713
                                }
-
 
714
                        }
-
 
715
                } else {
738
                for ( var name in options ) {
716
                        for ( var i = 0; checkSet[i] != null; i++ ) {
739
                        old[ name ] = elem.style[ name ];
717
                                if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
740
                        elem.style[ name ] = options[ name ];
718
                                        results.push( set[i] );
-
 
719
                                }
-
 
720
                        }
741
                }
721
                }
-
 
722
        } else {
-
 
723
                makeArray( checkSet, results );
-
 
724
        }
742
725
743
                callback.call( elem );
-
 
744
-
 
745
                // Revert the old values
726
        if ( extra ) {
746
                for ( var name in options )
727
                Sizzle( extra, origContext, results, seed );
747
                        elem.style[ name ] = old[ name ];
728
                Sizzle.uniqueSort( results );
748
        },
729
        }
749
-
 
750
        css: function( elem, name, force, extra ) {
-
 
751
                if ( name == "width" || name == "height" ) {
-
 
752
                        var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
-
 
753
-
 
754
                        function getWH() {
-
 
755
                                val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
-
 
756
730
757
                                if ( extra === "border" )
731
        return results;
758
                                        return;
732
};
759
733
760
                                jQuery.each( which, function() {
734
Sizzle.uniqueSort = function(results){
761
                                        if ( !extra )
735
        if ( sortOrder ) {
-
 
736
                hasDuplicate = false;
762
                                                val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
737
                results.sort(sortOrder);
-
 
738
763
                                        if ( extra === "margin" )
739
                if ( hasDuplicate ) {
764
                                                val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
740
                        for ( var i = 1; i < results.length; i++ ) {
765
                                        else
741
                                if ( results[i] === results[i-1] ) {
766
                                                val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
742
                                        results.splice(i--, 1);
767
                                });
743
                                }
768
                        }
744
                        }
-
 
745
                }
-
 
746
        }
-
 
747
};
769
748
770
                        if ( elem.offsetWidth !== 0 )
749
Sizzle.matches = function(expr, set){
771
                                getWH();
750
        return Sizzle(expr, null, null, set);
772
                        else
751
};
773
                                jQuery.swap( elem, props, getWH );
-
 
774
752
775
                        return Math.max(0, Math.round(val));
753
Sizzle.find = function(expr, context, isXML){
776
                }
754
        var set, match;
777
755
-
 
756
        if ( !expr ) {
778
                return jQuery.curCSS( elem, name, force );
757
                return [];
779
        },
758
        }
780
759
781
        curCSS: function( elem, name, force ) {
760
        for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
782
                var ret, style = elem.style;
761
                var type = Expr.order[i], match;
783
762
784
                // We need to handle opacity special in IE
-
 
785
                if ( name == "opacity" && !jQuery.support.opacity ) {
763
                if ( (match = Expr.match[ type ].exec( expr )) ) {
786
                        ret = jQuery.attr( style, "opacity" );
764
                        var left = RegExp.leftContext;
787
765
-
 
766
                        if ( left.substr( left.length - 1 ) !== "\\" ) {
-
 
767
                                match[1] = (match[1] || "").replace(/\\/g, "");
-
 
768
                                set = Expr.find[ type ]( match, context, isXML );
788
                        return ret == "" ?
769
                                if ( set != null ) {
-
 
770
                                        expr = expr.replace( Expr.match[ type ], "" );
789
                                "1" :
771
                                        break;
790
                                ret;
772
                                }
-
 
773
                        }
791
                }
774
                }
-
 
775
        }
792
776
793
                // Make sure we're using the right name for getting the float value
-
 
794
                if ( name.match( /float/i ) )
777
        if ( !set ) {
795
                        name = styleFloat;
778
                set = context.getElementsByTagName("*");
796
779
        }
797
                if ( !force && style && style[ name ] )
-
 
798
                        ret = style[ name ];
-
 
799
780
800
                else if ( defaultView.getComputedStyle ) {
781
        return {set: set, expr: expr};
-
 
782
};
801
783
802
                        // Only "float" is needed here
784
Sizzle.filter = function(expr, set, inplace, not){
803
                        if ( name.match( /float/i ) )
785
        var old = expr, result = [], curLoop = set, match, anyFound,
804
                                name = "float";
786
                isXMLFilter = set && set[0] && isXML(set[0]);
805
787
-
 
788
        while ( expr && set.length ) {
-
 
789
                for ( var type in Expr.filter ) {
-
 
790
                        if ( (match = Expr.match[ type ].exec( expr )) != null ) {
806
                        name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
791
                                var filter = Expr.filter[ type ], found, item;
-
 
792
                                anyFound = false;
807
793
808
                        var computedStyle = defaultView.getComputedStyle( elem, null );
794
                                if ( curLoop == result ) {
-
 
795
                                        result = [];
-
 
796
                                }
809
797
810
                        if ( computedStyle )
798
                                if ( Expr.preFilter[ type ] ) {
811
                                ret = computedStyle.getPropertyValue( name );
799
                                        match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
812
800
-
 
801
                                        if ( !match ) {
813
                        // We should always get a number back from opacity
802
                                                anyFound = found = true;
814
                        if ( name == "opacity" && ret == "" )
803
                                        } else if ( match === true ) {
815
                                ret = "1";
804
                                                continue;
-
 
805
                                        }
-
 
806
                                }
816
807
817
                } else if ( elem.currentStyle ) {
808
                                if ( match ) {
818
                        var camelCase = name.replace(/\-(\w)/g, function(all, letter){
809
                                        for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
-
 
810
                                                if ( item ) {
819
                                return letter.toUpperCase();
811
                                                        found = filter( item, match, i, curLoop );
820
                        });
812
                                                        var pass = not ^ !!found;
821
813
822
                        ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
814
                                                        if ( inplace && found != null ) {
-
 
815
                                                                if ( pass ) {
-
 
816
                                                                        anyFound = true;
-
 
817
                                                                } else {
-
 
818
                                                                        curLoop[i] = false;
-
 
819
                                                                }
-
 
820
                                                        } else if ( pass ) {
-
 
821
                                                                result.push( item );
-
 
822
                                                                anyFound = true;
-
 
823
                                                        }
-
 
824
                                                }
-
 
825
                                        }
-
 
826
                                }
823
827
824
                        // From the awesome hack by Dean Edwards
828
                                if ( found !== undefined ) {
-
 
829
                                        if ( !inplace ) {
825
                        // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
830
                                                curLoop = result;
-
 
831
                                        }
826
832
827
                        // If we're not dealing with a regular pixel number
-
 
828
                        // but a number that has a weird ending, we need to convert it to pixels
-
 
829
                        if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
-
 
830
                                // Remember the original values
-
 
831
                                var left = style.left, rsLeft = elem.runtimeStyle.left;
833
                                        expr = expr.replace( Expr.match[ type ], "" );
832
834
833
                                // Put in the new values to get a computed value out
835
                                        if ( !anyFound ) {
834
                                elem.runtimeStyle.left = elem.currentStyle.left;
-
 
835
                                style.left = ret || 0;
836
                                                return [];
836
                                ret = style.pixelLeft + "px";
837
                                        }
837
838
838
                                // Revert the changed values
839
                                        break;
839
                                style.left = left;
840
                                }
840
                                elem.runtimeStyle.left = rsLeft;
-
 
841
                        }
841
                        }
842
                }
842
                }
843
843
844
                return ret;
844
                // Improper expression
845
        },
-
 
846
-
 
847
        clean: function( elems, context, fragment ) {
-
 
848
                context = context || document;
845
                if ( expr == old ) {
849
-
 
850
                // !context.createElement fails in IE with an error but returns typeof 'object'
-
 
851
                if ( typeof context.createElement === "undefined" )
846
                        if ( anyFound == null ) {
852
                        context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
-
 
853
-
 
854
                // If a single string is passed in and it's a single tag
847
                                throw "Syntax error, unrecognized expression: " + expr;
855
                // just do a createElement and skip the rest
-
 
856
                if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) {
-
 
857
                        var match = /^<(\w+)\s*\/?>$/.exec(elems[0]);
-
 
858
                        if ( match )
848
                        } else {
859
                                return [ context.createElement( match[1] ) ];
849
                                break;
-
 
850
                        }
860
                }
851
                }
861
852
862
                var ret = [], scripts = [], div = context.createElement("div");
853
                old = expr;
-
 
854
        }
863
855
864
                jQuery.each(elems, function(i, elem){
-
 
865
                        if ( typeof elem === "number" )
-
 
866
                                elem += '';
-
 
867
-
 
868
                        if ( !elem )
-
 
869
                                return;
856
        return curLoop;
870
-
 
871
                        // Convert html string into DOM nodes
-
 
872
                        if ( typeof elem === "string" ) {
-
 
873
                                // Fix "XHTML"-style tags in all browsers
-
 
874
                                elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
-
 
875
                                        return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
-
 
876
                                                all :
-
 
877
                                                front + "></" + tag + ">";
-
 
878
                                });
-
 
879
-
 
880
                                // Trim whitespace, otherwise indexOf won't work as expected
-
 
881
                                var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase();
-
 
882
-
 
883
                                var wrap =
-
 
884
                                        // option or optgroup
-
 
885
                                        !tags.indexOf("<opt") &&
-
 
886
                                        [ 1, "<select multiple='multiple'>", "</select>" ] ||
-
 
887
-
 
888
                                        !tags.indexOf("<leg") &&
-
 
889
                                        [ 1, "<fieldset>", "</fieldset>" ] ||
-
 
890
-
 
891
                                        tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
-
 
892
                                        [ 1, "<table>", "</table>" ] ||
-
 
893
-
 
894
                                        !tags.indexOf("<tr") &&
-
 
895
                                        [ 2, "<table><tbody>", "</tbody></table>" ] ||
-
 
896
857
};
897
                                        // <thead> matched above
-
 
898
                                        (!tags.indexOf("<td") || !tags.indexOf("<th")) &&
-
 
899
                                        [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
-
 
900
858
901
                                        !tags.indexOf("<col") &&
859
var Expr = Sizzle.selectors = {
-
 
860
        order: [ "ID", "NAME", "TAG" ],
-
 
861
        match: {
-
 
862
                ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
-
 
863
                CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
-
 
864
                NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,
-
 
865
                ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
-
 
866
                TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,
902
                                        [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
867
                CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
-
 
868
                POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
-
 
869
                PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
-
 
870
        },
-
 
871
        attrMap: {
-
 
872
                "class": "className",
-
 
873
                "for": "htmlFor"
-
 
874
        },
-
 
875
        attrHandle: {
-
 
876
                href: function(elem){
-
 
877
                        return elem.getAttribute("href");
-
 
878
                }
-
 
879
        },
-
 
880
        relative: {
-
 
881
                "+": function(checkSet, part, isXML){
-
 
882
                        var isPartStr = typeof part === "string",
-
 
883
                                isTag = isPartStr && !/\W/.test(part),
-
 
884
                                isPartStrNotTag = isPartStr && !isTag;
903
885
904
                                        // IE can't serialize <link> and <script> tags normally
886
                        if ( isTag && !isXML ) {
905
                                        !jQuery.support.htmlSerialize &&
887
                                part = part.toUpperCase();
906
                                        [ 1, "div<div>", "</div>" ] ||
888
                        }
907
889
-
 
890
                        for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
908
                                        [ 0, "", "" ];
891
                                if ( (elem = checkSet[i]) ) {
-
 
892
                                        while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
909
893
910
                                // Go to html and back, then peel off extra wrappers
894
                                        checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ?
-
 
895
                                                elem || false :
911
                                div.innerHTML = wrap[1] + elem + wrap[2];
896
                                                elem === part;
-
 
897
                                }
-
 
898
                        }
912
899
913
                                // Move to the right depth
900
                        if ( isPartStrNotTag ) {
914
                                while ( wrap[0]-- )
901
                                Sizzle.filter( part, checkSet, true );
-
 
902
                        }
-
 
903
                },
-
 
904
                ">": function(checkSet, part, isXML){
915
                                        div = div.lastChild;
905
                        var isPartStr = typeof part === "string";
916
906
917
                                // Remove IE's autoinserted <tbody> from table fragments
907
                        if ( isPartStr && !/\W/.test(part) ) {
918
                                if ( !jQuery.support.tbody ) {
908
                                part = isXML ? part : part.toUpperCase();
919
909
920
                                        // String was a <table>, *may* have spurious <tbody>
910
                                for ( var i = 0, l = checkSet.length; i < l; i++ ) {
-
 
911
                                        var elem = checkSet[i];
-
 
912
                                        if ( elem ) {
921
                                        var hasBody = /<tbody/i.test(elem),
913
                                                var parent = elem.parentNode;
922
                                                tbody = !tags.indexOf("<table") && !hasBody ?
914
                                                checkSet[i] = parent.nodeName === part ? parent : false;
-
 
915
                                        }
-
 
916
                                }
-
 
917
                        } else {
923
                                                        div.firstChild && div.firstChild.childNodes :
918
                                for ( var i = 0, l = checkSet.length; i < l; i++ ) {
-
 
919
                                        var elem = checkSet[i];
-
 
920
                                        if ( elem ) {
-
 
921
                                                checkSet[i] = isPartStr ?
-
 
922
                                                        elem.parentNode :
-
 
923
                                                        elem.parentNode === part;
-
 
924
                                        }
-
 
925
                                }
924
926
925
                                                // String was a bare <thead> or <tfoot>
927
                                if ( isPartStr ) {
926
                                                wrap[1] == "<table>" && !hasBody ?
928
                                        Sizzle.filter( part, checkSet, true );
927
                                                        div.childNodes :
929
                                }
928
                                                        [];
930
                        }
-
 
931
                },
-
 
932
                "": function(checkSet, part, isXML){
-
 
933
                        var doneName = done++, checkFn = dirCheck;
929
934
930
                                        for ( var j = tbody.length - 1; j >= 0 ; --j )
935
                        if ( !part.match(/\W/) ) {
931
                                                if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
936
                                var nodeCheck = part = isXML ? part : part.toUpperCase();
932
                                                        tbody[ j ].parentNode.removeChild( tbody[ j ] );
937
                                checkFn = dirNodeCheck;
-
 
938
                        }
933
939
-
 
940
                        checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
934
                                        }
941
                },
-
 
942
                "~": function(checkSet, part, isXML){
-
 
943
                        var doneName = done++, checkFn = dirCheck;
935
944
936
                                // IE completely kills leading whitespace when innerHTML is used
945
                        if ( typeof part === "string" && !part.match(/\W/) ) {
937
                                if ( !jQuery.support.leadingWhitespace && /^\s/.test( elem ) )
946
                                var nodeCheck = part = isXML ? part : part.toUpperCase();
938
                                        div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
-
 
939
                               
-
 
940
                                elem = jQuery.makeArray( div.childNodes );
947
                                checkFn = dirNodeCheck;
941
                        }
948
                        }
942
949
943
                        if ( elem.nodeType )
950
                        checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
944
                                ret.push( elem );
951
                }
-
 
952
        },
945
                        else
953
        find: {
-
 
954
                ID: function(match, context, isXML){
-
 
955
                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
946
                                ret = jQuery.merge( ret, elem );
956
                                var m = context.getElementById(match[1]);
-
 
957
                                return m ? [m] : [];
947
958
                        }
948
                });
959
                },
-
 
960
                NAME: function(match, context, isXML){
-
 
961
                        if ( typeof context.getElementsByName !== "undefined" ) {
-
 
962
                                var ret = [], results = context.getElementsByName(match[1]);
949
963
950
                if ( fragment ) {
-
 
951
                        for ( var i = 0; ret[i]; i++ ) {
964
                                for ( var i = 0, l = results.length; i < l; i++ ) {
952
                                if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
965
                                        if ( results[i].getAttribute("name") === match[1] ) {
953
                                        scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
966
                                                ret.push( results[i] );
954
                                } else {
967
                                        }
955
                                        if ( ret[i].nodeType === 1 )
-
 
956
                                                ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
-
 
957
                                        fragment.appendChild( ret[i] );
-
 
958
                                }
968
                                }
-
 
969
-
 
970
                                return ret.length === 0 ? null : ret;
959
                        }
971
                        }
960
                       
972
                },
961
                        return scripts;
973
                TAG: function(match, context){
-
 
974
                        return context.getElementsByTagName(match[1]);
962
                }
975
                }
963
-
 
964
                return ret;
-
 
965
        },
976
        },
-
 
977
        preFilter: {
-
 
978
                CLASS: function(match, curLoop, inplace, result, not, isXML){
-
 
979
                        match = " " + match[1].replace(/\\/g, "") + " ";
966
980
967
        attr: function( elem, name, value ) {
981
                        if ( isXML ) {
968
                // don't set attributes on text and comment nodes
-
 
969
                if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
-
 
970
                        return undefined;
982
                                return match;
-
 
983
                        }
971
984
-
 
985
                        for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
-
 
986
                                if ( elem ) {
-
 
987
                                        if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) {
-
 
988
                                                if ( !inplace )
972
                var notxml = !jQuery.isXMLDoc( elem ),
989
                                                        result.push( elem );
973
                        // Whether we are setting (or getting)
990
                                        } else if ( inplace ) {
974
                        set = value !== undefined;
991
                                                curLoop[i] = false;
-
 
992
                                        }
-
 
993
                                }
-
 
994
                        }
975
995
-
 
996
                        return false;
-
 
997
                },
-
 
998
                ID: function(match){
976
                // Try to normalize/fix the name
999
                        return match[1].replace(/\\/g, "");
-
 
1000
                },
-
 
1001
                TAG: function(match, curLoop){
977
                name = notxml && jQuery.props[ name ] || name;
1002
                        for ( var i = 0; curLoop[i] === false; i++ ){}
-
 
1003
                        return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
-
 
1004
                },
-
 
1005
                CHILD: function(match){
-
 
1006
                        if ( match[1] == "nth" ) {
-
 
1007
                                // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
-
 
1008
                                var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
-
 
1009
                                        match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
-
 
1010
                                        !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
978
1011
979
                // Only do all the following if this is a node (faster for style)
1012
                                // calculate the numbers (first)n+(last) including if they are negative
980
                // IE elem.getAttribute passes even for style
1013
                                match[2] = (test[1] + (test[2] || 1)) - 0;
981
                if ( elem.tagName ) {
1014
                                match[3] = test[3] - 0;
-
 
1015
                        }
982
1016
983
                        // These attributes require special treatment
1017
                        // TODO: Move to normal caching system
984
                        var special = /href|src|style/.test( name );
1018
                        match[0] = done++;
985
1019
986
                        // Safari mis-reports the default selected property of a hidden option
1020
                        return match;
-
 
1021
                },
987
                        // Accessing the parent's selectedIndex property fixes it
1022
                ATTR: function(match, curLoop, inplace, result, not, isXML){
988
                        if ( name == "selected" && elem.parentNode )
1023
                        var name = match[1].replace(/\\/g, "");
989
                                elem.parentNode.selectedIndex;
-
 
990
1024
991
                        // If applicable, access the attribute via the DOM 0 way
1025
                        if ( !isXML && Expr.attrMap[name] ) {
992
                        if ( name in elem && notxml && !special ) {
1026
                                match[1] = Expr.attrMap[name];
993
                                if ( set ){
1027
                        }
994
                                        // We can't allow the type property to be changed (since it causes problems in IE)
-
 
995
                                        if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
-
 
996
                                                throw "type property can't be changed";
-
 
997
1028
998
                                        elem[ name ] = value;
1029
                        if ( match[2] === "~=" ) {
-
 
1030
                                match[4] = " " + match[4] + " ";
999
                                }
1031
                        }
1000
1032
1001
                                // browsers index elements by id/name on forms, give priority to attributes.
-
 
1002
                                if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
-
 
1003
                                        return elem.getAttributeNode( name ).nodeValue;
1033
                        return match;
1004
1034
                },
1005
                                // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
1035
                PSEUDO: function(match, curLoop, inplace, result, not){
1006
                                // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-
 
1007
                                if ( name == "tabIndex" ) {
1036
                        if ( match[1] === "not" ) {
-
 
1037
                                // If we're dealing with a complex expression, or a simple one
1008
                                        var attributeNode = elem.getAttributeNode( "tabIndex" );
1038
                                if ( match[3].match(chunker).length > 1 || /^\w/.test(match[3]) ) {
1009
                                        return attributeNode && attributeNode.specified
1039
                                        match[3] = Sizzle(match[3], null, null, curLoop);
1010
                                                ? attributeNode.value
1040
                                } else {
1011
                                                : elem.nodeName.match(/(button|input|object|select|textarea)/i)
1041
                                        var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
1012
                                                        ? 0
1042
                                        if ( !inplace ) {
1013
                                                        : elem.nodeName.match(/^(a|area)$/i) && elem.href
1043
                                                result.push.apply( result, ret );
1014
                                                                ? 0
1044
                                        }
1015
                                                                : undefined;
1045
                                        return false;
1016
                                }
1046
                                }
1017
-
 
1018
                                return elem[ name ];
-
 
1019
                        }
-
 
1020
-
 
1021
                        if ( !jQuery.support.style && notxml &&  name == "style" )
-
 
1022
                                return jQuery.attr( elem.style, "cssText", value );
-
 
1023
-
 
1024
                        if ( set )
-
 
1025
                                // convert the value to a string (all browsers do this but IE) see #1070
1047
                        } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
1026
                                elem.setAttribute( name, "" + value );
-
 
1027
-
 
1028
                        var attr = !jQuery.support.hrefNormalized && notxml && special
-
 
1029
                                        // Some attributes require a special call on IE
-
 
1030
                                        ? elem.getAttribute( name, 2 )
-
 
1031
                                        : elem.getAttribute( name );
-
 
1032
-
 
1033
                        // Non-existent attributes return null, we normalize to undefined
-
 
1034
                        return attr === null ? undefined : attr;
-
 
1035
                }
-
 
1036
-
 
1037
                // elem is actually elem.style ... set the style
-
 
1038
-
 
1039
                // IE uses filters for opacity
-
 
1040
                if ( !jQuery.support.opacity && name == "opacity" ) {
-
 
1041
                        if ( set ) {
-
 
1042
                                // IE has trouble with opacity if it does not have layout
-
 
1043
                                // Force it by setting the zoom level
-
 
1044
                                elem.zoom = 1;
1048
                                return true;
1045
-
 
1046
                                // Set the alpha filter to set the opacity
-
 
1047
                                elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +
-
 
1048
                                        (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
-
 
1049
                        }
1049
                        }
1050
1050
-
 
1051
                        return match;
-
 
1052
                },
1051
                        return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
1053
                POS: function(match){
1052
                                (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
1054
                        match.unshift( true );
1053
                                "";
1055
                        return match;
1054
                }
1056
                }
1055
-
 
1056
                name = name.replace(/-([a-z])/ig, function(all, letter){
-
 
1057
                        return letter.toUpperCase();
-
 
1058
                });
-
 
1059
-
 
1060
                if ( set )
-
 
1061
                        elem[ name ] = value;
-
 
1062
-
 
1063
                return elem[ name ];
-
 
1064
        },
-
 
1065
-
 
1066
        trim: function( text ) {
-
 
1067
                return (text || "").replace( /^\s+|\s+$/g, "" );
-
 
1068
        },
1057
        },
-
 
1058
        filters: {
-
 
1059
                enabled: function(elem){
-
 
1060
                        return elem.disabled === false && elem.type !== "hidden";
-
 
1061
                },
-
 
1062
                disabled: function(elem){
-
 
1063
                        return elem.disabled === true;
1069
1064
                },
1070
        makeArray: function( array ) {
1065
                checked: function(elem){
-
 
1066
                        return elem.checked === true;
-
 
1067
                },
-
 
1068
                selected: function(elem){
-
 
1069
                        // Accessing this property makes selected-by-default
-
 
1070
                        // options in Safari work properly
-
 
1071
                        elem.parentNode.selectedIndex;
-
 
1072
                        return elem.selected === true;
-
 
1073
                },
1071
                var ret = [];
1074
                parent: function(elem){
-
 
1075
                        return !!elem.firstChild;
1072
1076
                },
1073
                if( array != null ){
1077
                empty: function(elem){
1074
                        var i = array.length;
1078
                        return !elem.firstChild;
-
 
1079
                },
-
 
1080
                has: function(elem, i, match){
1075
                        // The window, strings (and functions) also have 'length'
1081
                        return !!Sizzle( match[3], elem ).length;
-
 
1082
                },
-
 
1083
                header: function(elem){
1076
                        if( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval )
1084
                        return /h\d/i.test( elem.nodeName );
-
 
1085
                },
-
 
1086
                text: function(elem){
1077
                                ret[0] = array;
1087
                        return "text" === elem.type;
-
 
1088
                },
-
 
1089
                radio: function(elem){
-
 
1090
                        return "radio" === elem.type;
-
 
1091
                },
-
 
1092
                checkbox: function(elem){
-
 
1093
                        return "checkbox" === elem.type;
1078
                        else
1094
                },
1079
                                while( i )
1095
                file: function(elem){
1080
                                        ret[--i] = array[i];
1096
                        return "file" === elem.type;
-
 
1097
                },
-
 
1098
                password: function(elem){
-
 
1099
                        return "password" === elem.type;
-
 
1100
                },
-
 
1101
                submit: function(elem){
-
 
1102
                        return "submit" === elem.type;
-
 
1103
                },
-
 
1104
                image: function(elem){
-
 
1105
                        return "image" === elem.type;
-
 
1106
                },
-
 
1107
                reset: function(elem){
-
 
1108
                        return "reset" === elem.type;
-
 
1109
                },
-
 
1110
                button: function(elem){
-
 
1111
                        return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
-
 
1112
                },
-
 
1113
                input: function(elem){
-
 
1114
                        return /input|select|textarea|button/i.test(elem.nodeName);
1081
                }
1115
                }
1082
-
 
1083
                return ret;
-
 
1084
        },
1116
        },
-
 
1117
        setFilters: {
-
 
1118
                first: function(elem, i){
-
 
1119
                        return i === 0;
1085
1120
                },
1086
        inArray: function( elem, array ) {
1121
                last: function(elem, i, match, array){
1087
                for ( var i = 0, length = array.length; i < length; i++ )
1122
                        return i === array.length - 1;
-
 
1123
                },
1088
                // Use === because on IE, window == document
1124
                even: function(elem, i){
1089
                        if ( array[ i ] === elem )
1125
                        return i % 2 === 0;
-
 
1126
                },
-
 
1127
                odd: function(elem, i){
1090
                                return i;
1128
                        return i % 2 === 1;
-
 
1129
                },
-
 
1130
                lt: function(elem, i, match){
-
 
1131
                        return i < match[3] - 0;
1091
1132
                },
-
 
1133
                gt: function(elem, i, match){
1092
                return -1;
1134
                        return i > match[3] - 0;
-
 
1135
                },
-
 
1136
                nth: function(elem, i, match){
-
 
1137
                        return match[3] - 0 == i;
-
 
1138
                },
-
 
1139
                eq: function(elem, i, match){
-
 
1140
                        return match[3] - 0 == i;
-
 
1141
                }
1093
        },
1142
        },
-
 
1143
        filter: {
-
 
1144
                PSEUDO: function(elem, match, i, array){
-
 
1145
                        var name = match[1], filter = Expr.filters[ name ];
1094
1146
1095
        merge: function( first, second ) {
1147
                        if ( filter ) {
1096
                // We have to loop this way because IE & Opera overwrite the length
-
 
1097
                // expando of getElementsByTagName
-
 
1098
                var i = 0, elem, pos = first.length;
-
 
1099
                // Also, we need to make sure that the correct elements are being returned
-
 
1100
                // (IE returns comment nodes in a '*' query)
1148
                                return filter( elem, i, match, array );
1101
                if ( !jQuery.support.getAll ) {
1149
                        } else if ( name === "contains" ) {
1102
                        while ( (elem = second[ i++ ]) != null )
1150
                                return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
1103
                                if ( elem.nodeType != 8 )
1151
                        } else if ( name === "not" ) {
1104
                                        first[ pos++ ] = elem;
1152
                                var not = match[3];
1105
1153
1106
                } else
-
 
1107
                        while ( (elem = second[ i++ ]) != null )
1154
                                for ( var i = 0, l = not.length; i < l; i++ ) {
1108
                                first[ pos++ ] = elem;
1155
                                        if ( not[i] === elem ) {
-
 
1156
                                                return false;
-
 
1157
                                        }
-
 
1158
                                }
1109
1159
1110
                return first;
1160
                                return true;
-
 
1161
                        }
1111
        },
1162
                },
-
 
1163
                CHILD: function(elem, match){
-
 
1164
                        var type = match[1], node = elem;
-
 
1165
                        switch (type) {
-
 
1166
                                case 'only':
-
 
1167
                                case 'first':
-
 
1168
                                        while (node = node.previousSibling)  {
-
 
1169
                                                if ( node.nodeType === 1 ) return false;
-
 
1170
                                        }
-
 
1171
                                        if ( type == 'first') return true;
-
 
1172
                                        node = elem;
-
 
1173
                                case 'last':
-
 
1174
                                        while (node = node.nextSibling)  {
-
 
1175
                                                if ( node.nodeType === 1 ) return false;
-
 
1176
                                        }
-
 
1177
                                        return true;
-
 
1178
                                case 'nth':
-
 
1179
                                        var first = match[2], last = match[3];
1112
1180
1113
        unique: function( array ) {
1181
                                        if ( first == 1 && last == 0 ) {
1114
                var ret = [], done = {};
1182
                                                return true;
-
 
1183
                                        }
1115
1184
1116
                try {
1185
                                        var doneName = match[0],
-
 
1186
                                                parent = elem.parentNode;
1117
1187
-
 
1188
                                        if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
-
 
1189
                                                var count = 0;
1118
                        for ( var i = 0, length = array.length; i < length; i++ ) {
1190
                                                for ( node = parent.firstChild; node; node = node.nextSibling ) {
1119
                                var id = jQuery.data( array[ i ] );
1191
                                                        if ( node.nodeType === 1 ) {
-
 
1192
                                                                node.nodeIndex = ++count;
-
 
1193
                                                        }
-
 
1194
                                                }
-
 
1195
                                                parent.sizcache = doneName;
-
 
1196
                                        }
1120
1197
-
 
1198
                                        var diff = elem.nodeIndex - last;
1121
                                if ( !done[ id ] ) {
1199
                                        if ( first == 0 ) {
1122
                                        done[ id ] = true;
1200
                                                return diff == 0;
-
 
1201
                                        } else {
1123
                                        ret.push( array[ i ] );
1202
                                                return ( diff % first == 0 && diff / first >= 0 );
1124
                                }
1203
                                        }
1125
                        }
1204
                        }
-
 
1205
                },
-
 
1206
                ID: function(elem, match){
-
 
1207
                        return elem.nodeType === 1 && elem.getAttribute("id") === match;
-
 
1208
                },
-
 
1209
                TAG: function(elem, match){
-
 
1210
                        return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
-
 
1211
                },
-
 
1212
                CLASS: function(elem, match){
-
 
1213
                        return (" " + (elem.className || elem.getAttribute("class")) + " ")
-
 
1214
                                .indexOf( match ) > -1;
-
 
1215
                },
-
 
1216
                ATTR: function(elem, match){
-
 
1217
                        var name = match[1],
-
 
1218
                                result = Expr.attrHandle[ name ] ?
-
 
1219
                                        Expr.attrHandle[ name ]( elem ) :
-
 
1220
                                        elem[ name ] != null ?
-
 
1221
                                                elem[ name ] :
-
 
1222
                                                elem.getAttribute( name ),
-
 
1223
                                value = result + "",
-
 
1224
                                type = match[2],
-
 
1225
                                check = match[4];
1126
1226
-
 
1227
                        return result == null ?
-
 
1228
                                type === "!=" :
-
 
1229
                                type === "=" ?
-
 
1230
                                value === check :
-
 
1231
                                type === "*=" ?
-
 
1232
                                value.indexOf(check) >= 0 :
-
 
1233
                                type === "~=" ?
-
 
1234
                                (" " + value + " ").indexOf(check) >= 0 :
1127
                } catch( e ) {
1235
                                !check ?
-
 
1236
                                value && result !== false :
-
 
1237
                                type === "!=" ?
-
 
1238
                                value != check :
-
 
1239
                                type === "^=" ?
-
 
1240
                                value.indexOf(check) === 0 :
1128
                        ret = array;
1241
                                type === "$=" ?
-
 
1242
                                value.substr(value.length - check.length) === check :
-
 
1243
                                type === "|=" ?
-
 
1244
                                value === check || value.substr(0, check.length + 1) === check + "-" :
-
 
1245
                                false;
-
 
1246
                },
-
 
1247
                POS: function(elem, match, i, array){
-
 
1248
                        var name = match[2], filter = Expr.setFilters[ name ];
-
 
1249
-
 
1250
                        if ( filter ) {
-
 
1251
                                return filter( elem, i, match, array );
-
 
1252
                        }
1129
                }
1253
                }
-
 
1254
        }
-
 
1255
};
1130
1256
1131
                return ret;
1257
var origPOS = Expr.match.POS;
1132
        },
-
 
1133
1258
1134
        grep: function( elems, callback, inv ) {
1259
for ( var type in Expr.match ) {
-
 
1260
        Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
1135
                var ret = [];
1261
}
1136
1262
1137
                // Go through the array, only saving the items
1263
var makeArray = function(array, results) {
1138
                // that pass the validator function
1264
        array = Array.prototype.slice.call( array );
1139
                for ( var i = 0, length = elems.length; i < length; i++ )
-
 
1140
                        if ( !inv != !callback( elems[ i ], i ) )
-
 
1141
                                ret.push( elems[ i ] );
-
 
1142
1265
-
 
1266
        if ( results ) {
-
 
1267
                results.push.apply( results, array );
1143
                return ret;
1268
                return results;
1144
        },
1269
        }
1145
1270
1146
        map: function( elems, callback ) {
-
 
1147
                var ret = [];
1271
        return array;
-
 
1272
};
1148
1273
1149
                // Go through the array, translating each of the items to their
1274
// Perform a simple check to determine if the browser is capable of
1150
                // new value (or values).
-
 
1151
                for ( var i = 0, length = elems.length; i < length; i++ ) {
1275
// converting a NodeList to an array using builtin methods.
-
 
1276
try {
1152
                        var value = callback( elems[ i ], i );
1277
        Array.prototype.slice.call( document.documentElement.childNodes );
1153
1278
-
 
1279
// Provide a fallback method if it does not work
-
 
1280
} catch(e){
-
 
1281
        makeArray = function(array, results) {
-
 
1282
                var ret = results || [];
-
 
1283
-
 
1284
                if ( toString.call(array) === "[object Array]" ) {
-
 
1285
                        Array.prototype.push.apply( ret, array );
-
 
1286
                } else {
-
 
1287
                        if ( typeof array.length === "number" ) {
-
 
1288
                                for ( var i = 0, l = array.length; i < l; i++ ) {
1154
                        if ( value != null )
1289
                                        ret.push( array[i] );
-
 
1290
                                }
-
 
1291
                        } else {
-
 
1292
                                for ( var i = 0; array[i]; i++ ) {
1155
                                ret[ ret.length ] = value;
1293
                                        ret.push( array[i] );
-
 
1294
                                }
-
 
1295
                        }
1156
                }
1296
                }
1157
1297
1158
                return ret.concat.apply( [], ret );
1298
                return ret;
1159
        }
1299
        };
1160
});
1300
}
1161
1301
1162
// Use of jQuery.browser is deprecated.
1302
var sortOrder;
1163
// It's included for backwards compatibility and plugins,
-
 
1164
// although they should work to migrate away.
-
 
1165
1303
-
 
1304
if ( document.documentElement.compareDocumentPosition ) {
-
 
1305
        sortOrder = function( a, b ) {
-
 
1306
                var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
-
 
1307
                if ( ret === 0 ) {
-
 
1308
                        hasDuplicate = true;
-
 
1309
                }
-
 
1310
                return ret;
-
 
1311
        };
-
 
1312
} else if ( "sourceIndex" in document.documentElement ) {
-
 
1313
        sortOrder = function( a, b ) {
1166
var userAgent = navigator.userAgent.toLowerCase();
1314
                var ret = a.sourceIndex - b.sourceIndex;
-
 
1315
                if ( ret === 0 ) {
-
 
1316
                        hasDuplicate = true;
-
 
1317
                }
-
 
1318
                return ret;
-
 
1319
        };
-
 
1320
} else if ( document.createRange ) {
-
 
1321
        sortOrder = function( a, b ) {
-
 
1322
                var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
-
 
1323
                aRange.selectNode(a);
-
 
1324
                aRange.collapse(true);
-
 
1325
                bRange.selectNode(b);
-
 
1326
                bRange.collapse(true);
-
 
1327
                var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
-
 
1328
                if ( ret === 0 ) {
-
 
1329
                        hasDuplicate = true;
-
 
1330
                }
-
 
1331
                return ret;
-
 
1332
        };
-
 
1333
}
1167
1334
1168
// Figure out what browser is being used
1335
// Check to see if the browser returns elements by name when
-
 
1336
// querying by getElementById (and provide a workaround)
1169
jQuery.browser = {
1337
(function(){
1170
        version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
1338
        // We're going to inject a fake input element with a specified name
1171
        safari: /webkit/.test( userAgent ),
1339
        var form = document.createElement("div"),
1172
        opera: /opera/.test( userAgent ),
1340
                id = "script" + (new Date).getTime();
1173
        msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
1341
        form.innerHTML = "<a name='" + id + "'/>";
1174
        mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
-
 
1175
};
-
 
1176
1342
1177
jQuery.each({
-
 
1178
        parent: function(elem){return elem.parentNode;},
-
 
1179
        parents: function(elem){return jQuery.dir(elem,"parentNode");},
-
 
1180
        next: function(elem){return jQuery.nth(elem,2,"nextSibling");},
-
 
1181
        prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},
-
 
1182
        nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},
-
 
1183
        prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},
-
 
1184
        siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
-
 
1185
        children: function(elem){return jQuery.sibling(elem.firstChild);},
1343
        // Inject it into the root element, check its status, and remove it quickly
1186
        contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
-
 
1187
}, function(name, fn){
-
 
1188
        jQuery.fn[ name ] = function( selector ) {
1344
        var root = document.documentElement;
1189
                var ret = jQuery.map( this, fn );
1345
        root.insertBefore( form, root.firstChild );
1190
1346
-
 
1347
        // The workaround has to do additional checks after a getElementById
-
 
1348
        // Which slows things down for other browsers (hence the branching)
1191
                if ( selector && typeof selector == "string" )
1349
        if ( !!document.getElementById( id ) ) {
-
 
1350
                Expr.find.ID = function(match, context, isXML){
-
 
1351
                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
1192
                        ret = jQuery.multiFilter( selector, ret );
1352
                                var m = context.getElementById(match[1]);
-
 
1353
                                return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
-
 
1354
                        }
-
 
1355
                };
1193
1356
-
 
1357
                Expr.filter.ID = function(elem, match){
-
 
1358
                        var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
1194
                return this.pushStack( jQuery.unique( ret ), name, selector );
1359
                        return elem.nodeType === 1 && node && node.nodeValue === match;
1195
        };
1360
                };
1196
});
1361
        }
1197
1362
1198
jQuery.each({
-
 
1199
        appendTo: "append",
-
 
1200
        prependTo: "prepend",
-
 
1201
        insertBefore: "before",
1363
        root.removeChild( form );
1202
        insertAfter: "after",
-
 
1203
        replaceAll: "replaceWith"
-
 
1204
}, function(name, original){
1364
})();
1205
        jQuery.fn[ name ] = function( selector ) {
-
 
1206
                var ret = [], insert = jQuery( selector );
-
 
1207
1365
1208
                for ( var i = 0, l = insert.length; i < l; i++ ) {
1366
(function(){
1209
                        var elems = (i > 0 ? this.clone(true) : this).get();
1367
        // Check to see if the browser returns only elements
1210
                        jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
-
 
1211
                        ret = ret.concat( elems );
1368
        // when doing getElementsByTagName("*")
1212
                }
-
 
1213
1369
-
 
1370
        // Create a fake element
1214
                return this.pushStack( ret, name, selector );
1371
        var div = document.createElement("div");
1215
        };
-
 
1216
});
-
 
-
 
1372
        div.appendChild( document.createComment("") );
1217
1373
1218
jQuery.each({
-
 
1219
        removeAttr: function( name ) {
1374
        // Make sure no comments are found
1220
                jQuery.attr( this, name, "" );
1375
        if ( div.getElementsByTagName("*").length > 0 ) {
1221
                if (this.nodeType == 1)
1376
                Expr.find.TAG = function(match, context){
1222
                        this.removeAttribute( name );
1377
                        var results = context.getElementsByTagName(match[1]);
1223
        },
-
 
1224
1378
1225
        addClass: function( classNames ) {
1379
                        // Filter out possible comments
1226
                jQuery.className.add( this, classNames );
1380
                        if ( match[1] === "*" ) {
1227
        },
1381
                                var tmp = [];
1228
1382
1229
        removeClass: function( classNames ) {
1383
                                for ( var i = 0; results[i]; i++ ) {
-
 
1384
                                        if ( results[i].nodeType === 1 ) {
1230
                jQuery.className.remove( this, classNames );
1385
                                                tmp.push( results[i] );
-
 
1386
                                        }
1231
        },
1387
                                }
1232
1388
1233
        toggleClass: function( classNames, state ) {
-
 
1234
                if( typeof state !== "boolean" )
1389
                                results = tmp;
1235
                        state = !jQuery.className.has( this, classNames );
-
 
1236
                jQuery.className[ state ? "add" : "remove" ]( this, classNames );
-
 
1237
        },
1390
                        }
1238
1391
1239
        remove: function( selector ) {
-
 
1240
                if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
-
 
1241
                        // Prevent memory leaks
-
 
1242
                        jQuery( "*", this ).add([this]).each(function(){
-
 
1243
                                jQuery.event.remove(this);
-
 
1244
                                jQuery.removeData(this);
1392
                        return results;
1245
                        });
-
 
1246
                        if (this.parentNode)
-
 
1247
                                this.parentNode.removeChild( this );
-
 
1248
                }
1393
                };
1249
        },
1394
        }
1250
1395
1251
        empty: function() {
-
 
1252
                // Remove element nodes and prevent memory leaks
1396
        // Check to see if an attribute returns normalized href attributes
1253
                jQuery(this).children().remove();
1397
        div.innerHTML = "<a href='#'></a>";
1254
-
 
-
 
1398
        if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
1255
                // Remove any remaining nodes
1399
                        div.firstChild.getAttribute("href") !== "#" ) {
1256
                while ( this.firstChild )
1400
                Expr.attrHandle.href = function(elem){
1257
                        this.removeChild( this.firstChild );
1401
                        return elem.getAttribute("href", 2);
-
 
1402
                };
1258
        }
1403
        }
1259
}, function(name, fn){
-
 
1260
        jQuery.fn[ name ] = function(){
-
 
1261
                return this.each( fn, arguments );
-
 
1262
        };
-
 
1263
});
-
 
1264
-
 
1265
// Helper function used by the dimensions and offset modules
-
 
1266
function num(elem, prop) {
-
 
1267
        return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
-
 
1268
}
-
 
1269
var expando = "jQuery" + now(), uuid = 0, windowData = {};
-
 
1270
-
 
1271
jQuery.extend({
-
 
1272
        cache: {},
-
 
1273
-
 
1274
        data: function( elem, name, data ) {
-
 
1275
                elem = elem == window ?
-
 
1276
                        windowData :
-
 
1277
                        elem;
-
 
1278
-
 
1279
                var id = elem[ expando ];
-
 
1280
-
 
1281
                // Compute a unique ID for the element
-
 
1282
                if ( !id )
-
 
1283
                        id = elem[ expando ] = ++uuid;
-
 
1284
-
 
1285
                // Only generate the data cache if we're
-
 
1286
                // trying to access or manipulate it
-
 
1287
                if ( name && !jQuery.cache[ id ] )
-
 
1288
                        jQuery.cache[ id ] = {};
-
 
1289
-
 
1290
                // Prevent overriding the named cache with undefined values
-
 
1291
                if ( data !== undefined )
-
 
1292
                        jQuery.cache[ id ][ name ] = data;
-
 
1293
-
 
1294
                // Return the named cache data, or the ID for the element
-
 
1295
                return name ?
-
 
1296
                        jQuery.cache[ id ][ name ] :
-
 
1297
                        id;
-
 
1298
        },
-
 
1299
-
 
1300
        removeData: function( elem, name ) {
-
 
1301
                elem = elem == window ?
-
 
1302
                        windowData :
-
 
1303
                        elem;
-
 
1304
-
 
1305
                var id = elem[ expando ];
-
 
1306
-
 
1307
                // If we want to remove a specific section of the element's data
-
 
1308
                if ( name ) {
-
 
1309
                        if ( jQuery.cache[ id ] ) {
-
 
1310
                                // Remove the section of cache data
-
 
1311
                                delete jQuery.cache[ id ][ name ];
-
 
1312
-
 
1313
                                // If we've removed all the data, remove the element's cache
-
 
1314
                                name = "";
-
 
1315
-
 
1316
                                for ( name in jQuery.cache[ id ] )
-
 
1317
                                        break;
-
 
1318
-
 
1319
                                if ( !name )
-
 
1320
                                        jQuery.removeData( elem );
-
 
1321
                        }
-
 
1322
-
 
1323
                // Otherwise, we want to remove all of the element's data
-
 
1324
                } else {
-
 
1325
                        // Clean up the element expando
-
 
1326
                        try {
-
 
1327
                                delete elem[ expando ];
-
 
1328
                        } catch(e){
-
 
1329
                                // IE has trouble directly removing the expando
-
 
1330
                                // but it's ok with using removeAttribute
-
 
1331
                                if ( elem.removeAttribute )
-
 
1332
                                        elem.removeAttribute( expando );
-
 
1333
                        }
-
 
1334
-
 
1335
                        // Completely remove the data cache
-
 
1336
                        delete jQuery.cache[ id ];
-
 
1337
                }
-
 
1338
        },
-
 
1339
        queue: function( elem, type, data ) {
-
 
1340
                if ( elem ){
-
 
1341
       
-
 
1342
                        type = (type || "fx") + "queue";
-
 
1343
       
-
 
1344
                        var q = jQuery.data( elem, type );
-
 
1345
       
-
 
1346
                        if ( !q || jQuery.isArray(data) )
-
 
1347
                                q = jQuery.data( elem, type, jQuery.makeArray(data) );
-
 
1348
                        else if( data )
-
 
1349
                                q.push( data );
-
 
1350
       
-
 
1351
                }
-
 
1352
                return q;
-
 
1353
        },
-
 
1354
-
 
1355
        dequeue: function( elem, type ){
-
 
1356
                var queue = jQuery.queue( elem, type ),
-
 
1357
                        fn = queue.shift();
-
 
1358
               
-
 
1359
                if( !type || type === "fx" )
-
 
1360
                        fn = queue[0];
-
 
1361
                       
-
 
1362
                if( fn !== undefined )
-
 
1363
                        fn.call(elem);
-
 
1364
        }
-
 
1365
});
1404
})();
1366
-
 
1367
jQuery.fn.extend({
-
 
1368
        data: function( key, value ){
-
 
1369
                var parts = key.split(".");
-
 
1370
                parts[1] = parts[1] ? "." + parts[1] : "";
-
 
1371
-
 
1372
                if ( value === undefined ) {
-
 
1373
                        var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
-
 
1374
-
 
1375
                        if ( data === undefined && this.length )
-
 
1376
                                data = jQuery.data( this[0], key );
-
 
1377
-
 
1378
                        return data === undefined && parts[1] ?
-
 
1379
                                this.data( parts[0] ) :
-
 
1380
                                data;
-
 
1381
                } else
-
 
1382
                        return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
-
 
1383
                                jQuery.data( this, key, value );
-
 
1384
                        });
-
 
1385
        },
-
 
1386
-
 
1387
        removeData: function( key ){
-
 
1388
                return this.each(function(){
-
 
1389
                        jQuery.removeData( this, key );
-
 
1390
                });
-
 
1391
        },
-
 
1392
        queue: function(type, data){
-
 
1393
                if ( typeof type !== "string" ) {
-
 
1394
                        data = type;
-
 
1395
                        type = "fx";
-
 
1396
                }
-
 
1397
-
 
1398
                if ( data === undefined )
-
 
1399
                        return jQuery.queue( this[0], type );
-
 
1400
-
 
1401
                return this.each(function(){
-
 
1402
                        var queue = jQuery.queue( this, type, data );
-
 
1403
                       
-
 
1404
                         if( type == "fx" && queue.length == 1 )
-
 
1405
                                queue[0].call(this);
-
 
1406
                });
-
 
1407
        },
-
 
1408
        dequeue: function(type){
-
 
1409
                return this.each(function(){
-
 
1410
                        jQuery.dequeue( this, type );
-
 
1411
                });
-
 
1412
        }
-
 
1413
});/*!
-
 
1414
 * Sizzle CSS Selector Engine - v0.9.3
-
 
1415
 *  Copyright 2009, The Dojo Foundation
-
 
1416
 *  Released under the MIT, BSD, and GPL Licenses.
-
 
1417
 *  More information: http://sizzlejs.com/
-
 
1418
 */
-
 
1419
(function(){
-
 
1420
-
 
1421
var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,
-
 
1422
        done = 0,
-
 
1423
        toString = Object.prototype.toString;
-
 
1424
1405
1425
var Sizzle = function(selector, context, results, seed) {
1406
if ( document.querySelectorAll ) (function(){
1426
        results = results || [];
1407
        var oldSizzle = Sizzle, div = document.createElement("div");
1427
        context = context || document;
1408
        div.innerHTML = "<p class='TEST'></p>";
1428
1409
1429
        if ( context.nodeType !== 1 && context.nodeType !== 9 )
1410
        // Safari can't handle uppercase or unicode characters when
1430
                return [];
1411
        // in quirks mode.
1431
       
-
 
1432
        if ( !selector || typeof selector !== "string" ) {
1412
        if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
1433
                return results;
1413
                return;
1434
        }
1414
        }
1435
1415
1436
        var parts = [], m, set, checkSet, check, mode, extra, prune = true;
-
 
1437
       
-
 
1438
        // Reset the position of the chunker regexp (start from head)
1416
        Sizzle = function(query, context, extra, seed){
1439
        chunker.lastIndex = 0;
1417
                context = context || document;
1440
       
1418
1441
        while ( (m = chunker.exec(selector)) !== null ) {
1419
                // Only use querySelectorAll on non-XML documents
1442
                parts.push( m[1] );
1420
                // (ID selectors don't work in non-HTML documents)
1443
               
-
 
-
 
1421
                if ( !seed && context.nodeType === 9 && !isXML(context) ) {
1444
                if ( m[2] ) {
1422
                        try {
1445
                        extra = RegExp.rightContext;
1423
                                return makeArray( context.querySelectorAll(query), extra );
1446
                        break;
1424
                        } catch(e){}
1447
                }
1425
                }
-
 
1426
-
 
1427
                return oldSizzle(query, context, extra, seed);
-
 
1428
        };
-
 
1429
-
 
1430
        for ( var prop in oldSizzle ) {
-
 
1431
                Sizzle[ prop ] = oldSizzle[ prop ];
1448
        }
1432
        }
-
 
1433
})();
1449
1434
1450
        if ( parts.length > 1 && origPOS.exec( selector ) ) {
1435
if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){
1451
                if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
1436
        var div = document.createElement("div");
1452
                        set = posProcess( parts[0] + parts[1], context );
1437
        div.innerHTML = "<div class='test e'></div><div class='test'></div>";
1453
                } else {
-
 
1454
                        set = Expr.relative[ parts[0] ] ?
-
 
1455
                                [ context ] :
-
 
1456
                                Sizzle( parts.shift(), context );
-
 
1457
1438
-
 
1439
        // Opera can't find a second classname (in 9.6)
1458
                        while ( parts.length ) {
1440
        if ( div.getElementsByClassName("e").length === 0 )
1459
                                selector = parts.shift();
1441
                return;
1460
1442
1461
                                if ( Expr.relative[ selector ] )
1443
        // Safari caches class attributes, doesn't catch changes (in 3.2)
1462
                                        selector += parts.shift();
1444
        div.lastChild.className = "e";
1463
1445
1464
                                set = posProcess( selector, set );
1446
        if ( div.getElementsByClassName("e").length === 1 )
1465
                        }
-
 
1466
                }
-
 
1467
        } else {
1447
                return;
1468
                var ret = seed ?
-
 
1469
                        { expr: parts.pop(), set: makeArray(seed) } :
-
 
1470
                        Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context, isXML(context) );
-
 
1471
                set = Sizzle.filter( ret.expr, ret.set );
-
 
1472
1448
1473
                if ( parts.length > 0 ) {
1449
        Expr.order.splice(1, 0, "CLASS");
1474
                        checkSet = makeArray(set);
1450
        Expr.find.CLASS = function(match, context, isXML) {
1475
                } else {
1451
                if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
1476
                        prune = false;
1452
                        return context.getElementsByClassName(match[1]);
1477
                }
1453
                }
-
 
1454
        };
-
 
1455
})();
1478
1456
1479
                while ( parts.length ) {
1457
function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
1480
                        var cur = parts.pop(), pop = cur;
1458
        var sibDir = dir == "previousSibling" && !isXML;
1481
-
 
1482
                        if ( !Expr.relative[ cur ] ) {
1459
        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
1483
                                cur = "";
1460
                var elem = checkSet[i];
1484
                        } else {
1461
                if ( elem ) {
-
 
1462
                        if ( sibDir && elem.nodeType === 1 ){
-
 
1463
                                elem.sizcache = doneName;
1485
                                pop = parts.pop();
1464
                                elem.sizset = i;
1486
                        }
1465
                        }
-
 
1466
                        elem = elem[dir];
-
 
1467
                        var match = false;
1487
1468
1488
                        if ( pop == null ) {
1469
                        while ( elem ) {
-
 
1470
                                if ( elem.sizcache === doneName ) {
-
 
1471
                                        match = checkSet[elem.sizset];
1489
                                pop = context;
1472
                                        break;
1490
                        }
1473
                                }
1491
1474
1492
                        Expr.relative[ cur ]( checkSet, pop, isXML(context) );
1475
                                if ( elem.nodeType === 1 && !isXML ){
-
 
1476
                                        elem.sizcache = doneName;
1493
                }
1477
                                        elem.sizset = i;
1494
        }
1478
                                }
1495
1479
1496
        if ( !checkSet ) {
1480
                                if ( elem.nodeName === cur ) {
1497
                checkSet = set;
1481
                                        match = elem;
-
 
1482
                                        break;
1498
        }
1483
                                }
1499
1484
1500
        if ( !checkSet ) {
1485
                                elem = elem[dir];
-
 
1486
                        }
-
 
1487
1501
                throw "Syntax error, unrecognized expression: " + (cur || selector);
1488
                        checkSet[i] = match;
-
 
1489
                }
1502
        }
1490
        }
-
 
1491
}
1503
1492
1504
        if ( toString.call(checkSet) === "[object Array]" ) {
1493
function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
1505
                if ( !prune ) {
1494
        var sibDir = dir == "previousSibling" && !isXML;
1506
                        results.push.apply( results, checkSet );
1495
        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
1507
                } else if ( context.nodeType === 1 ) {
1496
                var elem = checkSet[i];
1508
                        for ( var i = 0; checkSet[i] != null; i++ ) {
1497
                if ( elem ) {
1509
                                if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
1498
                        if ( sibDir && elem.nodeType === 1 ) {
1510
                                        results.push( set[i] );
1499
                                elem.sizcache = doneName;
1511
                                }
1500
                                elem.sizset = i;
1512
                        }
1501
                        }
-
 
1502
                        elem = elem[dir];
-
 
1503
                        var match = false;
-
 
1504
1513
                } else {
1505
                        while ( elem ) {
1514
                        for ( var i = 0; checkSet[i] != null; i++ ) {
1506
                                if ( elem.sizcache === doneName ) {
1515
                                if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
1507
                                        match = checkSet[elem.sizset];
1516
                                        results.push( set[i] );
1508
                                        break;
1517
                                }
1509
                                }
1518
                        }
-
 
1519
                }
-
 
1520
        } else {
-
 
1521
                makeArray( checkSet, results );
-
 
1522
        }
-
 
1523
1510
-
 
1511
                                if ( elem.nodeType === 1 ) {
1524
        if ( extra ) {
1512
                                        if ( !isXML ) {
-
 
1513
                                                elem.sizcache = doneName;
-
 
1514
                                                elem.sizset = i;
-
 
1515
                                        }
1525
                Sizzle( extra, context, results, seed );
1516
                                        if ( typeof cur !== "string" ) {
-
 
1517
                                                if ( elem === cur ) {
-
 
1518
                                                        match = true;
-
 
1519
                                                        break;
-
 
1520
                                                }
1526
1521
1527
                if ( sortOrder ) {
-
 
1528
                        hasDuplicate = false;
-
 
1529
                        results.sort(sortOrder);
-
 
1530
-
 
1531
                        if ( hasDuplicate ) {
-
 
1532
                                for ( var i = 1; i < results.length; i++ ) {
1522
                                        } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
1533
                                        if ( results[i] === results[i-1] ) {
1523
                                                match = elem;
1534
                                                results.splice(i--, 1);
1524
                                                break;
1535
                                        }
1525
                                        }
1536
                                }
1526
                                }
-
 
1527
-
 
1528
                                elem = elem[dir];
1537
                        }
1529
                        }
-
 
1530
-
 
1531
                        checkSet[i] = match;
1538
                }
1532
                }
1539
        }
1533
        }
-
 
1534
}
1540
1535
-
 
1536
var contains = document.compareDocumentPosition ?  function(a, b){
1541
        return results;
1537
        return a.compareDocumentPosition(b) & 16;
-
 
1538
} : function(a, b){
-
 
1539
        return a !== b && (a.contains ? a.contains(b) : true);
1542
};
1540
};
1543
1541
1544
Sizzle.matches = function(expr, set){
1542
var isXML = function(elem){
1545
        return Sizzle(expr, null, null, set);
1543
        return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
-
 
1544
                !!elem.ownerDocument && elem.ownerDocument.documentElement.nodeName !== "HTML";
1546
};
1545
};
1547
1546
1548
Sizzle.find = function(expr, context, isXML){
1547
var posProcess = function(selector, context){
1549
        var set, match;
1548
        var tmpSet = [], later = "", match,
-
 
1549
                root = context.nodeType ? [context] : context;
1550
1550
-
 
1551
        // Position selectors must be done after the filter
-
 
1552
        // And so must :not(positional) so we move all PSEUDOs to the end
1551
        if ( !expr ) {
1553
        while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
1552
                return [];
1554
                later += match[0];
-
 
1555
                selector = selector.replace( Expr.match.PSEUDO, "" );
1553
        }
1556
        }
1554
1557
1555
        for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
-
 
1556
                var type = Expr.order[i], match;
-
 
1557
               
-
 
1558
                if ( (match = Expr.match[ type ].exec( expr )) ) {
-
 
1559
                        var left = RegExp.leftContext;
-
 
1560
-
 
1561
                        if ( left.substr( left.length - 1 ) !== "\\" ) {
-
 
1562
                                match[1] = (match[1] || "").replace(/\\/g, "");
-
 
1563
                                set = Expr.find[ type ]( match, context, isXML );
-
 
1564
                                if ( set != null ) {
-
 
1565
                                        expr = expr.replace( Expr.match[ type ], "" );
1558
        selector = Expr.relative[selector] ? selector + "*" : selector;
1566
                                        break;
-
 
1567
                                }
-
 
1568
                        }
-
 
1569
                }
-
 
1570
        }
-
 
1571
1559
1572
        if ( !set ) {
1560
        for ( var i = 0, l = root.length; i < l; i++ ) {
1573
                set = context.getElementsByTagName("*");
1561
                Sizzle( selector, root[i], tmpSet );
1574
        }
1562
        }
1575
1563
1576
        return {set: set, expr: expr};
1564
        return Sizzle.filter( later, tmpSet );
1577
};
1565
};
1578
1566
1579
Sizzle.filter = function(expr, set, inplace, not){
-
 
1580
        var old = expr, result = [], curLoop = set, match, anyFound,
-
 
1581
                isXMLFilter = set && set[0] && isXML(set[0]);
-
 
1582
1567
// EXPOSE
1583
        while ( expr && set.length ) {
1568
jQuery.find = Sizzle;
1584
                for ( var type in Expr.filter ) {
1569
jQuery.expr = Sizzle.selectors;
1585
                        if ( (match = Expr.match[ type ].exec( expr )) != null ) {
-
 
1586
                                var filter = Expr.filter[ type ], found, item;
1570
jQuery.expr[":"] = jQuery.expr.filters;
1587
                                anyFound = false;
-
 
1588
1571
1589
                                if ( curLoop == result ) {
1572
Sizzle.selectors.filters.hidden = function(elem){
1590
                                        result = [];
1573
        return elem.offsetWidth === 0 && elem.offsetHeight === 0;
1591
                                }
1574
};
1592
1575
1593
                                if ( Expr.preFilter[ type ] ) {
1576
Sizzle.selectors.filters.visible = function(elem){
1594
                                        match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
1577
        return elem.offsetWidth > 0 || elem.offsetHeight > 0;
-
 
1578
};
1595
1579
1596
                                        if ( !match ) {
1580
Sizzle.selectors.filters.animated = function(elem){
1597
                                                anyFound = found = true;
1581
        return jQuery.grep(jQuery.timers, function(fn){
1598
                                        } else if ( match === true ) {
1582
                return elem === fn.elem;
1599
                                                continue;
1583
        }).length;
1600
                                        }
-
 
1601
                                }
1584
};
1602
1585
1603
                                if ( match ) {
-
 
1604
                                        for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
1586
jQuery.filter = jQuery.multiFilter = function( expr, elems, not ) {
1605
                                                if ( item ) {
1587
        if ( not ) {
1606
                                                        found = filter( item, match, i, curLoop );
-
 
1607
                                                        var pass = not ^ !!found;
1588
                expr = ":not(" + expr + ")";
-
 
1589
        }
1608
1590
1609
                                                        if ( inplace && found != null ) {
-
 
1610
                                                                if ( pass ) {
-
 
1611
                                                                        anyFound = true;
-
 
1612
                                                                } else {
-
 
1613
                                                                        curLoop[i] = false;
-
 
1614
                                                                }
-
 
1615
                                                        } else if ( pass ) {
-
 
1616
                                                                result.push( item );
1591
        return Sizzle.matches(expr, elems);
1617
                                                                anyFound = true;
-
 
1618
                                                        }
-
 
1619
                                                }
-
 
1620
                                        }
-
 
1621
                                }
1592
};
1622
1593
-
 
1594
jQuery.dir = function( elem, dir ){
-
 
1595
        var matched = [], cur = elem[dir];
1623
                                if ( found !== undefined ) {
1596
        while ( cur && cur != document ) {
1624
                                        if ( !inplace ) {
1597
                if ( cur.nodeType == 1 )
1625
                                                curLoop = result;
1598
                        matched.push( cur );
-
 
1599
                cur = cur[dir];
1626
                                        }
1600
        }
-
 
1601
        return matched;
-
 
1602
};
1627
1603
1628
                                        expr = expr.replace( Expr.match[ type ], "" );
1604
jQuery.nth = function(cur, result, dir, elem){
-
 
1605
        result = result || 1;
-
 
1606
        var num = 0;
1629
1607
1630
                                        if ( !anyFound ) {
1608
        for ( ; cur; cur = cur[dir] )
1631
                                                return [];
1609
                if ( cur.nodeType == 1 && ++num == result )
1632
                                        }
1610
                        break;
1633
1611
1634
                                        break;
1612
        return cur;
1635
                                }
-
 
1636
                        }
-
 
1637
                }
1613
};
1638
1614
1639
                // Improper expression
-
 
1640
                if ( expr == old ) {
-
 
1641
                        if ( anyFound == null ) {
1615
jQuery.sibling = function(n, elem){
1642
                                throw "Syntax error, unrecognized expression: " + expr;
-
 
1643
                        } else {
-
 
1644
                                break;
1616
        var r = [];
1645
                        }
-
 
1646
                }
-
 
1647
1617
-
 
1618
        for ( ; n; n = n.nextSibling ) {
-
 
1619
                if ( n.nodeType == 1 && n != elem )
1648
                old = expr;
1620
                        r.push( n );
1649
        }
1621
        }
1650
1622
1651
        return curLoop;
1623
        return r;
1652
};
1624
};
1653
1625
1654
var Expr = Sizzle.selectors = {
-
 
1655
        order: [ "ID", "NAME", "TAG" ],
-
 
1656
        match: {
-
 
1657
                ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
-
 
1658
                CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
-
 
1659
                NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,
-
 
1660
                ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
-
 
1661
                TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,
-
 
1662
                CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
-
 
1663
                POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
-
 
1664
                PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
-
 
1665
        },
-
 
1666
        attrMap: {
-
 
1667
                "class": "className",
-
 
1668
                "for": "htmlFor"
-
 
1669
        },
-
 
1670
        attrHandle: {
-
 
1671
                href: function(elem){
-
 
1672
                        return elem.getAttribute("href");
-
 
1673
                }
-
 
1674
        },
-
 
1675
        relative: {
1626
return;
1676
                "+": function(checkSet, part, isXML){
-
 
1677
                        var isPartStr = typeof part === "string",
-
 
1678
                                isTag = isPartStr && !/\W/.test(part),
-
 
1679
                                isPartStrNotTag = isPartStr && !isTag;
-
 
1680
1627
1681
                        if ( isTag && !isXML ) {
1628
window.Sizzle = Sizzle;
1682
                                part = part.toUpperCase();
-
 
1683
                        }
-
 
1684
1629
-
 
1630
})();
1685
                        for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
1631
jQuery.fn.extend({
1686
                                if ( (elem = checkSet[i]) ) {
1632
        find: function( selector ) {
1687
                                        while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
1633
                var ret = this.pushStack( "", "find", selector ), length = 0;
1688
1634
-
 
1635
                for ( var i = 0, l = this.length; i < l; i++ ) {
-
 
1636
                        length = ret.length;
-
 
1637
                        jQuery.find( selector, this[i], ret );
-
 
1638
-
 
1639
                        if ( i > 0 ) {
-
 
1640
                                // Make sure that the results are unique
1689
                                        checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ?
1641
                                for ( var n = length; n < ret.length; n++ ) {
-
 
1642
                                        for ( var r = 0; r < length; r++ ) {
-
 
1643
                                                if ( ret[r] === ret[n] ) {
1690
                                                elem || false :
1644
                                                        ret.splice(n--, 1);
1691
                                                elem === part;
1645
                                                        break;
-
 
1646
                                                }
-
 
1647
                                        }
1692
                                }
1648
                                }
1693
                        }
1649
                        }
-
 
1650
                }
1694
1651
1695
                        if ( isPartStrNotTag ) {
1652
                return ret;
1696
                                Sizzle.filter( part, checkSet, true );
-
 
1697
                        }
-
 
1698
                },
1653
        },
1699
                ">": function(checkSet, part, isXML){
-
 
1700
                        var isPartStr = typeof part === "string";
-
 
1701
1654
-
 
1655
        filter: function( selector ) {
-
 
1656
                return this.pushStack(
-
 
1657
                        jQuery.isFunction( selector ) &&
1702
                        if ( isPartStr && !/\W/.test(part) ) {
1658
                        jQuery.grep(this, function(elem, i){
1703
                                part = isXML ? part : part.toUpperCase();
1659
                                return selector.call( elem, i );
-
 
1660
                        }) ||
1704
1661
1705
                                for ( var i = 0, l = checkSet.length; i < l; i++ ) {
1662
                        jQuery.multiFilter( selector, jQuery.grep(this, function(elem){
1706
                                        var elem = checkSet[i];
1663
                                return elem.nodeType === 1;
1707
                                        if ( elem ) {
-
 
1708
                                                var parent = elem.parentNode;
-
 
1709
                                                checkSet[i] = parent.nodeName === part ? parent : false;
-
 
1710
                                        }
-
 
1711
                                }
-
 
1712
                        } else {
-
 
1713
                                for ( var i = 0, l = checkSet.length; i < l; i++ ) {
-
 
1714
                                        var elem = checkSet[i];
1664
                        }) ), "filter", selector );
1715
                                        if ( elem ) {
-
 
1716
                                                checkSet[i] = isPartStr ?
-
 
1717
                                                        elem.parentNode :
-
 
1718
                                                        elem.parentNode === part;
-
 
1719
                                        }
-
 
1720
                                }
1665
        },
1721
1666
-
 
1667
        closest: function( selector ) {
-
 
1668
                var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null,
-
 
1669
                        closer = 0;
-
 
1670
1722
                                if ( isPartStr ) {
1671
                return this.map(function(){
-
 
1672
                        var cur = this;
-
 
1673
                        while ( cur && cur.ownerDocument ) {
-
 
1674
                                if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) {
1723
                                        Sizzle.filter( part, checkSet, true );
1675
                                        jQuery.data(cur, "closest", closer);
-
 
1676
                                        return cur;
1724
                                }
1677
                                }
-
 
1678
                                cur = cur.parentNode;
-
 
1679
                                closer++;
1725
                        }
1680
                        }
-
 
1681
                });
1726
                },
1682
        },
1727
                "": function(checkSet, part, isXML){
-
 
1728
                        var doneName = done++, checkFn = dirCheck;
-
 
1729
1683
1730
                        if ( !part.match(/\W/) ) {
1684
        not: function( selector ) {
-
 
1685
                if ( typeof selector === "string" )
1731
                                var nodeCheck = part = isXML ? part : part.toUpperCase();
1686
                        // test special case where just one selector is passed in
1732
                                checkFn = dirNodeCheck;
1687
                        if ( isSimple.test( selector ) )
-
 
1688
                                return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector );
1733
                        }
1689
                        else
-
 
1690
                                selector = jQuery.multiFilter( selector, this );
1734
1691
-
 
1692
                var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
-
 
1693
                return this.filter(function() {
1735
                        checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
1694
                        return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
-
 
1695
                });
1736
                },
1696
        },
1737
                "~": function(checkSet, part, isXML){
-
 
1738
                        var doneName = done++, checkFn = dirCheck;
-
 
1739
1697
-
 
1698
        add: function( selector ) {
1740
                        if ( typeof part === "string" && !part.match(/\W/) ) {
1699
                return this.pushStack( jQuery.unique( jQuery.merge(
-
 
1700
                        this.get(),
1741
                                var nodeCheck = part = isXML ? part : part.toUpperCase();
1701
                        typeof selector === "string" ?
-
 
1702
                                jQuery( selector ) :
1742
                                checkFn = dirNodeCheck;
1703
                                jQuery.makeArray( selector )
-
 
1704
                )));
1743
                        }
1705
        },
1744
1706
-
 
1707
        eq: function( i ) {
1745
                        checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
1708
                return this.slice( i, +i + 1 );
1746
                }
-
 
1747
        },
1709
        },
-
 
1710
-
 
1711
        slice: function() {
-
 
1712
                return this.pushStack( Array.prototype.slice.apply( this, arguments ),
-
 
1713
                        "slice", Array.prototype.slice.call(arguments).join(",") );
-
 
1714
        },
-
 
1715
-
 
1716
        map: function( callback ) {
-
 
1717
                return this.pushStack( jQuery.map(this, function(elem, i){
-
 
1718
                        return callback.call( elem, i, elem );
1748
        find: {
1719
                }));
-
 
1720
        },
-
 
1721
-
 
1722
        andSelf: function() {
-
 
1723
                return this.add( this.prevObject );
-
 
1724
        },
-
 
1725
-
 
1726
        end: function() {
-
 
1727
                return this.prevObject || jQuery(null);
-
 
1728
        }
-
 
1729
});
-
 
1730
-
 
1731
jQuery.each({
-
 
1732
        parent: function(elem){return elem.parentNode;},
-
 
1733
        parents: function(elem){return jQuery.dir(elem,"parentNode");},
-
 
1734
        next: function(elem){return jQuery.nth(elem,2,"nextSibling");},
-
 
1735
        prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},
-
 
1736
        nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},
-
 
1737
        prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},
-
 
1738
        siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
-
 
1739
        children: function(elem){return jQuery.sibling(elem.firstChild);},
-
 
1740
        contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
-
 
1741
}, function(name, fn){
-
 
1742
        jQuery.fn[ name ] = function( selector ) {
-
 
1743
                var ret = jQuery.map( this, fn );
-
 
1744
-
 
1745
                if ( selector && typeof selector == "string" )
-
 
1746
                        ret = jQuery.multiFilter( selector, ret );
-
 
1747
-
 
1748
                return this.pushStack( jQuery.unique( ret ), name, selector );
-
 
1749
        };
-
 
1750
});jQuery.fn.extend({
1749
                ID: function(match, context, isXML){
1751
        attr: function( name, value ) {
-
 
1752
                var options = name, isFunction = jQuery.isFunction( value );
-
 
1753
1750
                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
1754
                if ( typeof name === "string" ) {
1751
                                var m = context.getElementById(match[1]);
1755
                        // Are we setting the attribute?
-
 
1756
                        if ( value === undefined ) {
1752
                                return m ? [m] : [];
1757
                                return this.length ?
-
 
1758
                                        jQuery.attr( this[0], name ) :
-
 
1759
                                        null;
-
 
1760
-
 
1761
                        // Convert name, value params to options hash format
-
 
1762
                        } else {
-
 
1763
                                options = {};
-
 
1764
                                options[ name ] = value;
1753
                        }
1765
                        }
1754
                },
1766
                }
1755
                NAME: function(match, context, isXML){
-
 
1756
                        if ( typeof context.getElementsByName !== "undefined" ) {
-
 
1757
                                var ret = [], results = context.getElementsByName(match[1]);
-
 
1758
1767
-
 
1768
                // For each element...
1759
                                for ( var i = 0, l = results.length; i < l; i++ ) {
1769
                for ( var i = 0, l = this.length; i < l; i++ ) {
-
 
1770
                        var elem = this[i];
-
 
1771
-
 
1772
                        // Set all the attributes
1760
                                        if ( results[i].getAttribute("name") === match[1] ) {
1773
                        for ( var prop in options ) {
1761
                                                ret.push( results[i] );
1774
                                value = options[prop];
-
 
1775
1762
                                        }
1776
                                if ( isFunction ) {
-
 
1777
                                        value = value.call( elem, i );
1763
                                }
1778
                                }
1764
1779
1765
                                return ret.length === 0 ? null : ret;
1780
                                jQuery.attr( elem, prop, value );
1766
                        }
1781
                        }
1767
                },
-
 
1768
                TAG: function(match, context){
-
 
1769
                        return context.getElementsByTagName(match[1]);
-
 
1770
                }
1782
                }
-
 
1783
-
 
1784
                return this;
1771
        },
1785
        },
1772
        preFilter: {
-
 
1773
                CLASS: function(match, curLoop, inplace, result, not, isXML){
-
 
1774
                        match = " " + match[1].replace(/\\/g, "") + " ";
-
 
1775
1786
1776
                        if ( isXML ) {
1787
        hasClass: function( selector ) {
1777
                                return match;
1788
                return !!selector && this.is( "." + selector );
1778
                        }
1789
        },
1779
1790
1780
                        for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
-
 
1781
                                if ( elem ) {
1791
        val: function( value ) {
1782
                                        if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) {
-
 
1783
                                                if ( !inplace )
-
 
1784
                                                        result.push( elem );
-
 
1785
                                        } else if ( inplace ) {
1792
                if ( value === undefined ) {
1786
                                                curLoop[i] = false;
1793
                        var elem = this[0];
1787
                                        }
-
 
1788
                                }
-
 
1789
                        }
-
 
1790
1794
1791
                        return false;
1795
                        if ( elem ) {
1792
                },
-
 
1793
                ID: function(match){
-
 
1794
                        return match[1].replace(/\\/g, "");
1796
                                if( jQuery.nodeName( elem, 'option' ) )
1795
                },
-
 
1796
                TAG: function(match, curLoop){
-
 
1797
                        for ( var i = 0; curLoop[i] === false; i++ ){}
-
 
1798
                        return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
1797
                                        return (elem.attributes.value || {}).specified ? elem.value : elem.text;
1799
                },
-
 
1800
                CHILD: function(match){
-
 
1801
                        if ( match[1] == "nth" ) {
-
 
1802
                                // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
-
 
1803
                                var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
-
 
1804
                                        match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
-
 
1805
                                        !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
-
 
1806
1798
1807
                                // calculate the numbers (first)n+(last) including if they are negative
1799
                                // We need to handle select boxes special
1808
                                match[2] = (test[1] + (test[2] || 1)) - 0;
1800
                                if ( jQuery.nodeName( elem, "select" ) ) {
1809
                                match[3] = test[3] - 0;
1801
                                        var index = elem.selectedIndex,
1810
                        }
1802
                                                values = [],
-
 
1803
                                                options = elem.options,
-
 
1804
                                                one = elem.type == "select-one";
1811
1805
1812
                        // TODO: Move to normal caching system
1806
                                        // Nothing was selected
-
 
1807
                                        if ( index < 0 )
1813
                        match[0] = done++;
1808
                                                return null;
1814
1809
1815
                        return match;
-
 
1816
                },
-
 
1817
                ATTR: function(match, curLoop, inplace, result, not, isXML){
-
 
1818
                        var name = match[1].replace(/\\/g, "");
1810
                                        // Loop through all the selected options
1819
                       
-
 
1820
                        if ( !isXML && Expr.attrMap[name] ) {
1811
                                        for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
1821
                                match[1] = Expr.attrMap[name];
1812
                                                var option = options[ i ];
1822
                        }
-
 
1823
1813
1824
                        if ( match[2] === "~=" ) {
1814
                                                if ( option.selected ) {
-
 
1815
                                                        // Get the specifc value for the option
1825
                                match[4] = " " + match[4] + " ";
1816
                                                        value = jQuery(option).val();
1826
                        }
-
 
1827
1817
-
 
1818
                                                        // We don't need an array for one selects
-
 
1819
                                                        if ( one )
1828
                        return match;
1820
                                                                return value;
1829
                },
1821
1830
                PSEUDO: function(match, curLoop, inplace, result, not){
1822
                                                        // Multi-Selects return an array
1831
                        if ( match[1] === "not" ) {
1823
                                                        values.push( value );
1832
                                // If we're dealing with a complex expression, or a simple one
-
 
1833
                                if ( match[3].match(chunker).length > 1 || /^\w/.test(match[3]) ) {
-
 
1834
                                        match[3] = Sizzle(match[3], null, null, curLoop);
-
 
1835
                                } else {
1824
                                                }
1836
                                        var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
-
 
1837
                                        if ( !inplace ) {
-
 
1838
                                                result.push.apply( result, ret );
-
 
1839
                                        }
1825
                                        }
-
 
1826
1840
                                        return false;
1827
                                        return values;
1841
                                }
1828
                                }
-
 
1829
1842
                        } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
1830
                                // Everything else, we just grab the value
1843
                                return true;
1831
                                return (elem.value || "").replace(/\r/g, "");
-
 
1832
1844
                        }
1833
                        }
1845
                       
1834
1846
                        return match;
-
 
1847
                },
-
 
1848
                POS: function(match){
-
 
1849
                        match.unshift( true );
-
 
1850
                        return match;
1835
                        return undefined;
1851
                }
-
 
1852
        },
-
 
1853
        filters: {
-
 
1854
                enabled: function(elem){
-
 
1855
                        return elem.disabled === false && elem.type !== "hidden";
-
 
1856
                },
-
 
1857
                disabled: function(elem){
-
 
1858
                        return elem.disabled === true;
-
 
1859
                },
-
 
1860
                checked: function(elem){
-
 
1861
                        return elem.checked === true;
-
 
1862
                },
-
 
1863
                selected: function(elem){
-
 
1864
                        // Accessing this property makes selected-by-default
-
 
1865
                        // options in Safari work properly
-
 
1866
                        elem.parentNode.selectedIndex;
-
 
1867
                        return elem.selected === true;
-
 
1868
                },
-
 
1869
                parent: function(elem){
-
 
1870
                        return !!elem.firstChild;
-
 
1871
                },
-
 
1872
                empty: function(elem){
-
 
1873
                        return !elem.firstChild;
-
 
1874
                },
-
 
1875
                has: function(elem, i, match){
-
 
1876
                        return !!Sizzle( match[3], elem ).length;
-
 
1877
                },
-
 
1878
                header: function(elem){
-
 
1879
                        return /h\d/i.test( elem.nodeName );
-
 
1880
                },
-
 
1881
                text: function(elem){
-
 
1882
                        return "text" === elem.type;
-
 
1883
                },
-
 
1884
                radio: function(elem){
-
 
1885
                        return "radio" === elem.type;
-
 
1886
                },
-
 
1887
                checkbox: function(elem){
-
 
1888
                        return "checkbox" === elem.type;
-
 
1889
                },
-
 
1890
                file: function(elem){
-
 
1891
                        return "file" === elem.type;
-
 
1892
                },
-
 
1893
                password: function(elem){
-
 
1894
                        return "password" === elem.type;
-
 
1895
                },
-
 
1896
                submit: function(elem){
-
 
1897
                        return "submit" === elem.type;
-
 
1898
                },
-
 
1899
                image: function(elem){
-
 
1900
                        return "image" === elem.type;
-
 
1901
                },
-
 
1902
                reset: function(elem){
-
 
1903
                        return "reset" === elem.type;
-
 
1904
                },
-
 
1905
                button: function(elem){
-
 
1906
                        return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
-
 
1907
                },
-
 
1908
                input: function(elem){
-
 
1909
                        return /input|select|textarea|button/i.test(elem.nodeName);
-
 
1910
                }
1836
                }
-
 
1837
-
 
1838
                if ( typeof value === "number" )
-
 
1839
                        value += '';
-
 
1840
-
 
1841
                return this.each(function(){
-
 
1842
                        if ( this.nodeType != 1 )
-
 
1843
                                return;
-
 
1844
-
 
1845
                        if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) )
-
 
1846
                                this.checked = (jQuery.inArray(this.value, value) >= 0 ||
-
 
1847
                                        jQuery.inArray(this.name, value) >= 0);
-
 
1848
-
 
1849
                        else if ( jQuery.nodeName( this, "select" ) ) {
-
 
1850
                                var values = jQuery.makeArray(value);
-
 
1851
-
 
1852
                                jQuery( "option", this ).each(function(){
-
 
1853
                                        this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
-
 
1854
                                                jQuery.inArray( this.text, values ) >= 0);
-
 
1855
                                });
-
 
1856
-
 
1857
                                if ( !values.length )
-
 
1858
                                        this.selectedIndex = -1;
-
 
1859
-
 
1860
                        } else
-
 
1861
                                this.value = value;
-
 
1862
                });
-
 
1863
        }
-
 
1864
});
-
 
1865
-
 
1866
jQuery.each({
-
 
1867
        removeAttr: function( name ) {
-
 
1868
                jQuery.attr( this, name, "" );
-
 
1869
                if (this.nodeType == 1)
-
 
1870
                        this.removeAttribute( name );
1911
        },
1871
        },
1912
        setFilters: {
1872
1913
                first: function(elem, i){
1873
        addClass: function( classNames ) {
1914
                        return i === 0;
1874
                jQuery.className.add( this, classNames );
1915
                },
1875
        },
-
 
1876
1916
                last: function(elem, i, match, array){
1877
        removeClass: function( classNames ) {
1917
                        return i === array.length - 1;
1878
                jQuery.className.remove( this, classNames );
1918
                },
1879
        },
-
 
1880
1919
                even: function(elem, i){
1881
        toggleClass: function( classNames, state ) {
1920
                        return i % 2 === 0;
1882
                if( typeof state !== "boolean" )
-
 
1883
                        state = !jQuery.className.has( this, classNames );
-
 
1884
                jQuery.className[ state ? "add" : "remove" ]( this, classNames );
1921
                },
1885
        }
1922
                odd: function(elem, i){
1886
}, function(name, fn){
-
 
1887
        jQuery.fn[ name ] = function(){
1923
                        return i % 2 === 1;
1888
                return this.each( fn, arguments );
1924
                },
1889
        };
-
 
1890
});
-
 
1891
-
 
1892
jQuery.extend({
1925
                lt: function(elem, i, match){
1893
        className: {
1926
                        return i < match[3] - 0;
1894
                // internal only, use addClass("class")
1927
                },
-
 
1928
                gt: function(elem, i, match){
1895
                add: function( elem, classNames ) {
-
 
1896
                        jQuery.each((classNames || "").split(/\s+/), function(i, className){
-
 
1897
                                if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
1929
                        return i > match[3] - 0;
1898
                                        elem.className += (elem.className ? " " : "") + className;
-
 
1899
                        });
1930
                },
1900
                },
-
 
1901
-
 
1902
                // internal only, use removeClass("class")
1931
                nth: function(elem, i, match){
1903
                remove: function( elem, classNames ) {
1932
                        return match[3] - 0 == i;
1904
                        if (elem.nodeType == 1)
-
 
1905
                                elem.className = classNames !== undefined ?
-
 
1906
                                        jQuery.grep(elem.className.split(/\s+/), function(className){
-
 
1907
                                                return !jQuery.className.has( classNames, className );
-
 
1908
                                        }).join(" ") :
-
 
1909
                                        "";
1933
                },
1910
                },
-
 
1911
-
 
1912
                // internal only, use hasClass("class")
1934
                eq: function(elem, i, match){
1913
                has: function( elem, className ) {
1935
                        return match[3] - 0 == i;
1914
                        return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
1936
                }
1915
                }
1937
        },
1916
        },
1938
        filter: {
-
 
1939
                PSEUDO: function(elem, match, i, array){
-
 
1940
                        var name = match[1], filter = Expr.filters[ name ];
-
 
1941
1917
1942
                        if ( filter ) {
-
 
1943
                                return filter( elem, i, match, array );
1918
        attr: function( elem, name, value ) {
1944
                        } else if ( name === "contains" ) {
1919
                // don't set attributes on text and comment nodes
1945
                                return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
1920
                if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
1946
                        } else if ( name === "not" ) {
-
 
1947
                                var not = match[3];
1921
                        return undefined;
1948
1922
-
 
1923
                var notxml = !elem.tagName || !jQuery.isXMLDoc( elem ),
1949
                                for ( var i = 0, l = not.length; i < l; i++ ) {
1924
                        // Whether we are setting (or getting)
-
 
1925
                        set = value !== undefined;
-
 
1926
-
 
1927
                // Try to normalize/fix the name
-
 
1928
                name = notxml && jQuery.props[ name ] || name;
-
 
1929
-
 
1930
                // Only do all the following if this is a node (faster for style)
1950
                                        if ( not[i] === elem ) {
1931
                if ( elem.tagName ) {
-
 
1932
-
 
1933
                        // These attributes require special treatment
-
 
1934
                        var special = /href|src|style/.test( name );
-
 
1935
-
 
1936
                        // Safari mis-reports the default selected property of a hidden option
-
 
1937
                        // Accessing the parent's selectedIndex property fixes it
-
 
1938
                        if ( name == "selected" && elem.parentNode )
1951
                                                return false;
1939
                                elem.parentNode.selectedIndex;
-
 
1940
-
 
1941
                        // If applicable, access the attribute via the DOM 0 way
-
 
1942
                        if ( name in elem && notxml && !special ) {
1952
                                        }
1943
                                if ( set ){
-
 
1944
                                        // We can't allow the type property to be changed (since it causes problems in IE)
-
 
1945
                                        if ( name == "type" && elem.nodeName.match(/(button|input)/i) && elem.parentNode )
-
 
1946
                                                throw "type property can't be changed";
-
 
1947
-
 
1948
                                        elem[ name ] = value;
1953
                                }
1949
                                }
1954
1950
-
 
1951
                                // browsers index elements by id/name on forms, give priority to attributes.
-
 
1952
                                if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
-
 
1953
                                        return elem.getAttributeNode( name ).nodeValue;
-
 
1954
-
 
1955
                                // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
-
 
1956
                                // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-
 
1957
                                if ( name == "tabIndex" ) {
-
 
1958
                                        var attributeNode = elem.getAttributeNode( "tabIndex" );
-
 
1959
                                        return attributeNode && attributeNode.specified
-
 
1960
                                                ? attributeNode.value
-
 
1961
                                                : elem.nodeName.match(/(button|input|object|select|textarea)/i)
-
 
1962
                                                        ? 0
-
 
1963
                                                        : elem.nodeName.match(/^(a|area)$/i) && elem.href
-
 
1964
                                                                ? 0
-
 
1965
                                                                : undefined;
-
 
1966
                                }
-
 
1967
1955
                                return true;
1968
                                return elem[ name ];
1956
                        }
1969
                        }
1957
                },
-
 
1958
                CHILD: function(elem, match){
-
 
1959
                        var type = match[1], node = elem;
-
 
1960
                        switch (type) {
-
 
1961
                                case 'only':
-
 
1962
                                case 'first':
-
 
1963
                                        while (node = node.previousSibling)  {
-
 
1964
                                                if ( node.nodeType === 1 ) return false;
-
 
1965
                                        }
-
 
1966
                                        if ( type == 'first') return true;
-
 
1967
                                        node = elem;
-
 
1968
                                case 'last':
-
 
1969
                                        while (node = node.nextSibling)  {
-
 
1970
                                                if ( node.nodeType === 1 ) return false;
-
 
1971
                                        }
-
 
1972
                                        return true;
-
 
1973
                                case 'nth':
-
 
1974
                                        var first = match[2], last = match[3];
-
 
1975
1970
1976
                                        if ( first == 1 && last == 0 ) {
-
 
1977
                                                return true;
-
 
1978
                                        }
-
 
1979
                                       
-
 
1980
                                        var doneName = match[0],
-
 
1981
                                                parent = elem.parentNode;
-
 
1982
       
-
 
1983
                                        if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
1971
                        if ( !jQuery.support.style && notxml && name == "style" ) {
1984
                                                var count = 0;
1972
                                if ( set )
1985
                                                for ( node = parent.firstChild; node; node = node.nextSibling ) {
-
 
1986
                                                        if ( node.nodeType === 1 ) {
-
 
1987
                                                                node.nodeIndex = ++count;
-
 
1988
                                                        }
-
 
1989
                                                }
-
 
1990
                                                parent.sizcache = doneName;
1973
                                        elem.style.cssText = "" + value;
1991
                                        }
-
 
1992
                                       
1974
1993
                                        var diff = elem.nodeIndex - last;
1975
                                return elem.style.cssText;
1994
                                        if ( first == 0 ) {
-
 
1995
                                                return diff == 0;
-
 
1996
                                        } else {
-
 
1997
                                                return ( diff % first == 0 && diff / first >= 0 );
-
 
1998
                                        }
-
 
1999
                        }
1976
                        }
2000
                },
-
 
2001
                ID: function(elem, match){
-
 
2002
                        return elem.nodeType === 1 && elem.getAttribute("id") === match;
-
 
2003
                },
-
 
2004
                TAG: function(elem, match){
-
 
2005
                        return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
-
 
2006
                },
-
 
2007
                CLASS: function(elem, match){
-
 
2008
                        return (" " + (elem.className || elem.getAttribute("class")) + " ")
-
 
2009
                                .indexOf( match ) > -1;
-
 
2010
                },
-
 
2011
                ATTR: function(elem, match){
-
 
2012
                        var name = match[1],
-
 
2013
                                result = Expr.attrHandle[ name ] ?
-
 
2014
                                        Expr.attrHandle[ name ]( elem ) :
-
 
2015
                                        elem[ name ] != null ?
-
 
2016
                                                elem[ name ] :
-
 
2017
                                                elem.getAttribute( name ),
-
 
2018
                                value = result + "",
-
 
2019
                                type = match[2],
-
 
2020
                                check = match[4];
-
 
2021
1977
2022
                        return result == null ?
-
 
2023
                                type === "!=" :
-
 
2024
                                type === "=" ?
1978
                        if ( set )
2025
                                value === check :
-
 
2026
                                type === "*=" ?
-
 
2027
                                value.indexOf(check) >= 0 :
-
 
2028
                                type === "~=" ?
-
 
2029
                                (" " + value + " ").indexOf(check) >= 0 :
1979
                                // convert the value to a string (all browsers do this but IE) see #1070
2030
                                !check ?
-
 
2031
                                value && result !== false :
1980
                                elem.setAttribute( name, "" + value );
2032
                                type === "!=" ?
-
 
2033
                                value != check :
-
 
2034
                                type === "^=" ?
-
 
2035
                                value.indexOf(check) === 0 :
-
 
2036
                                type === "$=" ?
-
 
-
 
1981
2037
                                value.substr(value.length - check.length) === check :
1982
                        var attr = !jQuery.support.hrefNormalized && notxml && special
2038
                                type === "|=" ?
-
 
2039
                                value === check || value.substr(0, check.length + 1) === check + "-" :
1983
                                        // Some attributes require a special call on IE
2040
                                false;
-
 
2041
                },
-
 
2042
                POS: function(elem, match, i, array){
1984
                                        ? elem.getAttribute( name, 2 )
2043
                        var name = match[2], filter = Expr.setFilters[ name ];
1985
                                        : elem.getAttribute( name );
2044
1986
2045
                        if ( filter ) {
1987
                        // Non-existent attributes return null, we normalize to undefined
2046
                                return filter( elem, i, match, array );
1988
                        return attr === null ? undefined : attr;
2047
                        }
-
 
2048
                }
1989
                }
-
 
1990
-
 
1991
                // elem is actually elem.style ... set the style
-
 
1992
                // Using attr for specific style information is now deprecated. Use style insead.
-
 
1993
                return jQuery.style(elem, name, value);
2049
        }
1994
        }
2050
};
1995
});jQuery.fn.extend({
-
 
1996
        text: function( text ) {
-
 
1997
                if ( typeof text !== "object" && text != null )
-
 
1998
                        return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
2051
1999
2052
var origPOS = Expr.match.POS;
2000
                var ret = "";
2053
2001
2054
for ( var type in Expr.match ) {
2002
                jQuery.each( text || this, function(){
2055
        Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
2003
                        jQuery.each( this.childNodes, function(){
-
 
2004
                                if ( this.nodeType != 8 )
-
 
2005
                                        ret += this.nodeType != 1 ?
-
 
2006
                                                this.nodeValue :
-
 
2007
                                                jQuery.fn.text( [ this ] );
-
 
2008
                        });
2056
}
2009
                });
2057
2010
2058
var makeArray = function(array, results) {
2011
                return ret;
2059
        array = Array.prototype.slice.call( array );
-
 
-
 
2012
        },
2060
2013
-
 
2014
        wrapAll: function( html ) {
2061
        if ( results ) {
2015
                if ( this[0] ) {
2062
                results.push.apply( results, array );
2016
                        // The elements to wrap the target around
2063
                return results;
2017
                        var wrap = jQuery( html, this[0].ownerDocument ).clone();
2064
        }
-
 
2065
       
-
 
2066
        return array;
-
 
2067
};
-
 
2068
2018
2069
// Perform a simple check to determine if the browser is capable of
-
 
2070
// converting a NodeList to an array using builtin methods.
2019
                        if ( this[0].parentNode )
2071
try {
-
 
2072
        Array.prototype.slice.call( document.documentElement.childNodes );
2020
                                wrap.insertBefore( this[0] );
2073
2021
2074
// Provide a fallback method if it does not work
-
 
2075
} catch(e){
-
 
2076
        makeArray = function(array, results) {
2022
                        wrap.map(function(){
2077
                var ret = results || [];
2023
                                var elem = this;
2078
2024
2079
                if ( toString.call(array) === "[object Array]" ) {
-
 
2080
                        Array.prototype.push.apply( ret, array );
-
 
2081
                } else {
-
 
2082
                        if ( typeof array.length === "number" ) {
2025
                                while ( elem.firstChild )
2083
                                for ( var i = 0, l = array.length; i < l; i++ ) {
-
 
2084
                                        ret.push( array[i] );
2026
                                        elem = elem.firstChild;
2085
                                }
2027
2086
                        } else {
2028
                                return elem;
2087
                                for ( var i = 0; array[i]; i++ ) {
-
 
2088
                                        ret.push( array[i] );
2029
                        }).append(this);
2089
                                }
-
 
2090
                        }
-
 
2091
                }
2030
                }
2092
2031
2093
                return ret;
2032
                return this;
2094
        };
2033
        },
2095
}
-
 
2096
2034
2097
var sortOrder;
2035
        wrapInner: function( html ) {
-
 
2036
                return this.each(function(){
-
 
2037
                        jQuery( this ).contents().wrapAll( html );
-
 
2038
                });
-
 
2039
        },
2098
2040
2099
if ( document.documentElement.compareDocumentPosition ) {
-
 
2100
        sortOrder = function( a, b ) {
2041
        wrap: function( html ) {
2101
                var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
-
 
2102
                if ( ret === 0 ) {
-
 
2103
                        hasDuplicate = true;
-
 
2104
                }
-
 
2105
                return ret;
-
 
2106
        };
-
 
2107
} else if ( "sourceIndex" in document.documentElement ) {
-
 
2108
        sortOrder = function( a, b ) {
2042
                return this.each(function(){
2109
                var ret = a.sourceIndex - b.sourceIndex;
-
 
2110
                if ( ret === 0 ) {
-
 
2111
                        hasDuplicate = true;
-
 
2112
                }
-
 
2113
                return ret;
-
 
2114
        };
-
 
2115
} else if ( document.createRange ) {
-
 
2116
        sortOrder = function( a, b ) {
2043
                        jQuery( this ).wrapAll( html );
2117
                var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
-
 
2118
                aRange.selectNode(a);
-
 
2119
                aRange.collapse(true);
-
 
2120
                bRange.selectNode(b);
-
 
2121
                bRange.collapse(true);
-
 
2122
                var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
-
 
2123
                if ( ret === 0 ) {
-
 
2124
                        hasDuplicate = true;
-
 
2125
                }
2044
                });
2126
                return ret;
-
 
2127
        };
2045
        },
2128
}
-
 
2129
2046
2130
// Check to see if the browser returns elements by name when
-
 
2131
// querying by getElementById (and provide a workaround)
-
 
2132
(function(){
2047
        append: function() {
2133
        // We're going to inject a fake input element with a specified name
2048
                return this.domManip(arguments, true, function(elem){
2134
        var form = document.createElement("form"),
2049
                        if (this.nodeType == 1)
2135
                id = "script" + (new Date).getTime();
2050
                                this.appendChild( elem );
2136
        form.innerHTML = "<input name='" + id + "'/>";
-
 
-
 
2051
                });
-
 
2052
        },
2137
2053
-
 
2054
        prepend: function() {
2138
        // Inject it into the root element, check its status, and remove it quickly
2055
                return this.domManip(arguments, true, function(elem){
2139
        var root = document.documentElement;
2056
                        if (this.nodeType == 1)
2140
        root.insertBefore( form, root.firstChild );
2057
                                this.insertBefore( elem, this.firstChild );
-
 
2058
                });
-
 
2059
        },
2141
2060
2142
        // The workaround has to do additional checks after a getElementById
-
 
2143
        // Which slows things down for other browsers (hence the branching)
-
 
2144
        if ( !!document.getElementById( id ) ) {
2061
        before: function() {
2145
                Expr.find.ID = function(match, context, isXML){
2062
                return this.domManip(arguments, false, function(elem){
2146
                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
-
 
2147
                                var m = context.getElementById(match[1]);
2063
                        this.parentNode.insertBefore( elem, this );
2148
                                return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
-
 
2149
                        }
2064
                });
2150
                };
2065
        },
2151
2066
2152
                Expr.filter.ID = function(elem, match){
2067
        after: function() {
2153
                        var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
2068
                return this.domManip(arguments, false, function(elem){
2154
                        return elem.nodeType === 1 && node && node.nodeValue === match;
2069
                        this.parentNode.insertBefore( elem, this.nextSibling );
2155
                };
2070
                });
2156
        }
2071
        },
2157
2072
2158
        root.removeChild( form );
2073
        clone: function( events ) {
-
 
2074
                // Do the clone
-
 
2075
                var ret = this.map(function(){
-
 
2076
                        if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
-
 
2077
                                // IE copies events bound via attachEvent when
-
 
2078
                                // using cloneNode. Calling detachEvent on the
-
 
2079
                                // clone will also remove the events from the orignal
-
 
2080
                                // In order to get around this, we use innerHTML.
-
 
2081
                                // Unfortunately, this means some modifications to
-
 
2082
                                // attributes in IE that are actually only stored
-
 
2083
                                // as properties will not be copied (such as the
-
 
2084
                                // the name attribute on an input).
-
 
2085
                                var html = this.outerHTML, ownerDocument = this.ownerDocument;
-
 
2086
                                if ( !html ) {
-
 
2087
                                        var div = ownerDocument.createElement("div");
-
 
2088
                                        div.appendChild( this.cloneNode(true) );
-
 
2089
                                        html = div.innerHTML;
2159
})();
2090
                                }
2160
2091
-
 
2092
                                return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")], ownerDocument)[0];
2161
(function(){
2093
                        } else
2162
        // Check to see if the browser returns only elements
-
 
2163
        // when doing getElementsByTagName("*")
2094
                                return this.cloneNode(true);
-
 
2095
                });
2164
2096
2165
        // Create a fake element
2097
                // Copy the events from the original to the clone
2166
        var div = document.createElement("div");
2098
                if ( events === true ) {
2167
        div.appendChild( document.createComment("") );
2099
                        var orig = this.find("*").andSelf(), i = 0;
2168
2100
2169
        // Make sure no comments are found
2101
                        ret.find("*").andSelf().each(function(){
2170
        if ( div.getElementsByTagName("*").length > 0 ) {
2102
                                if ( this.nodeName !== orig[i].nodeName )
2171
                Expr.find.TAG = function(match, context){
2103
                                        return;
2172
                        var results = context.getElementsByTagName(match[1]);
-
 
2173
2104
2174
                        // Filter out possible comments
2105
                                var events = jQuery.data( orig[i], "events" );
2175
                        if ( match[1] === "*" ) {
-
 
2176
                                var tmp = [];
-
 
2177
2106
2178
                                for ( var i = 0; results[i]; i++ ) {
2107
                                for ( var type in events ) {
2179
                                        if ( results[i].nodeType === 1 ) {
2108
                                        for ( var handler in events[ type ] ) {
2180
                                                tmp.push( results[i] );
2109
                                                jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
2181
                                        }
2110
                                        }
2182
                                }
2111
                                }
2183
2112
2184
                                results = tmp;
-
 
2185
                        }
2113
                                i++;
2186
-
 
2187
                        return results;
-
 
2188
                };
2114
                        });
2189
        }
2115
                }
2190
2116
2191
        // Check to see if an attribute returns normalized href attributes
-
 
2192
        div.innerHTML = "<a href='#'></a>";
-
 
2193
        if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
-
 
2194
                        div.firstChild.getAttribute("href") !== "#" ) {
-
 
2195
                Expr.attrHandle.href = function(elem){
2117
                // Return the cloned set
2196
                        return elem.getAttribute("href", 2);
-
 
2197
                };
2118
                return ret;
2198
        }
2119
        },
2199
})();
-
 
2200
2120
-
 
2121
        html: function( value ) {
2201
if ( document.querySelectorAll ) (function(){
2122
                return value === undefined ?
-
 
2123
                        (this[0] ?
2202
        var oldSizzle = Sizzle, div = document.createElement("div");
2124
                                this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") :
-
 
2125
                                null) :
2203
        div.innerHTML = "<p class='TEST'></p>";
2126
                        this.empty().append( value );
-
 
2127
        },
2204
2128
2205
        // Safari can't handle uppercase or unicode characters when
2129
        replaceWith: function( value ) {
2206
        // in quirks mode.
2130
                return this.after( value ).remove();
2207
        if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
-
 
2208
                return;
-
 
2209
        }
2131
        },
2210
       
-
 
2211
        Sizzle = function(query, context, extra, seed){
-
 
2212
                context = context || document;
-
 
2213
2132
2214
                // Only use querySelectorAll on non-XML documents
2133
        domManip: function( args, table, callback ) {
2215
                // (ID selectors don't work in non-HTML documents)
2134
                if ( this[0] ) {
2216
                if ( !seed && context.nodeType === 9 && !isXML(context) ) {
2135
                        var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(),
2217
                        try {
-
 
2218
                                return makeArray( context.querySelectorAll(query), extra );
2136
                                scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ),
2219
                        } catch(e){}
-
 
2220
                }
-
 
2221
               
-
 
2222
                return oldSizzle(query, context, extra, seed);
2137
                                first = fragment.firstChild;
2223
        };
-
 
2224
2138
2225
        Sizzle.find = oldSizzle.find;
2139
                        if ( first )
2226
        Sizzle.filter = oldSizzle.filter;
2140
                                for ( var i = 0, l = this.length; i < l; i++ )
2227
        Sizzle.selectors = oldSizzle.selectors;
2141
                                        callback.call( root(this[i], first), this.length > 1 || i > 0 ?
2228
        Sizzle.matches = oldSizzle.matches;
2142
                                                        fragment.cloneNode(true) : fragment );
2229
})();
-
 
2230
2143
2231
if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){
-
 
2232
        var div = document.createElement("div");
2144
                        if ( scripts )
2233
        div.innerHTML = "<div class='test e'></div><div class='test'></div>";
2145
                                jQuery.each( scripts, evalScript );
-
 
2146
                }
2234
2147
2235
        // Opera can't find a second classname (in 9.6)
-
 
2236
        if ( div.getElementsByClassName("e").length === 0 )
-
 
2237
                return;
2148
                return this;
2238
2149
-
 
2150
                function root( elem, cur ) {
2239
        // Safari caches class attributes, doesn't catch changes (in 3.2)
2151
                        return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ?
2240
        div.lastChild.className = "e";
2152
                                (elem.getElementsByTagName("tbody")[0] ||
-
 
2153
                                elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
-
 
2154
                                elem;
-
 
2155
                }
-
 
2156
        }
-
 
2157
});
2241
2158
-
 
2159
jQuery.each({
-
 
2160
        appendTo: "append",
-
 
2161
        prependTo: "prepend",
2242
        if ( div.getElementsByClassName("e").length === 1 )
2162
        insertBefore: "before",
2243
                return;
2163
        insertAfter: "after",
-
 
2164
        replaceAll: "replaceWith"
-
 
2165
}, function(name, original){
-
 
2166
        jQuery.fn[ name ] = function( selector ) {
-
 
2167
                var ret = [], insert = jQuery( selector );
2244
2168
2245
        Expr.order.splice(1, 0, "CLASS");
2169
                for ( var i = 0, l = insert.length; i < l; i++ ) {
2246
        Expr.find.CLASS = function(match, context, isXML) {
2170
                        var elems = (i > 0 ? this.clone(true) : this).get();
2247
                if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
2171
                        jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
2248
                        return context.getElementsByClassName(match[1]);
2172
                        ret = ret.concat( elems );
2249
                }
2173
                }
-
 
2174
-
 
2175
                return this.pushStack( ret, name, selector );
2250
        };
2176
        };
2251
})();
2177
});
2252
2178
2253
function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
2179
jQuery.each({
2254
        var sibDir = dir == "previousSibling" && !isXML;
2180
        remove: function( selector ) {
2255
        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2181
                if ( !selector || jQuery.multiFilter( selector, [ this ] ).length ) {
2256
                var elem = checkSet[i];
-
 
2257
                if ( elem ) {
-
 
2258
                        if ( sibDir && elem.nodeType === 1 ){
2182
                        if ( this.nodeType === 1 ) {
2259
                                elem.sizcache = doneName;
2183
                                cleanData( this.getElementsByTagName("*") );
2260
                                elem.sizset = i;
2184
                                cleanData( [this] );
2261
                        }
2185
                        }
2262
                        elem = elem[dir];
-
 
2263
                        var match = false;
-
 
2264
-
 
2265
                        while ( elem ) {
-
 
2266
                                if ( elem.sizcache === doneName ) {
-
 
2267
                                        match = checkSet[elem.sizset];
-
 
2268
                                        break;
-
 
2269
                                }
-
 
2270
-
 
2271
                                if ( elem.nodeType === 1 && !isXML ){
-
 
2272
                                        elem.sizcache = doneName;
-
 
2273
                                        elem.sizset = i;
-
 
2274
                                }
-
 
2275
-
 
2276
                                if ( elem.nodeName === cur ) {
-
 
2277
                                        match = elem;
-
 
2278
                                        break;
-
 
2279
                                }
-
 
2280
2186
2281
                                elem = elem[dir];
2187
                        if ( this.parentNode ) {
-
 
2188
                                this.parentNode.removeChild( this );
2282
                        }
2189
                        }
-
 
2190
                }
-
 
2191
        },
2283
2192
-
 
2193
        empty: function() {
-
 
2194
                // Remove element nodes and prevent memory leaks
-
 
2195
                if ( this.nodeType === 1 ) {
-
 
2196
                        cleanData( this.getElementsByTagName("*") );
-
 
2197
                }
-
 
2198
-
 
2199
                // Remove any remaining nodes
2284
                        checkSet[i] = match;
2200
                while ( this.firstChild ) {
-
 
2201
                        this.removeChild( this.firstChild );
2285
                }
2202
                }
2286
        }
2203
        }
-
 
2204
}, function(name, fn){
-
 
2205
        jQuery.fn[ name ] = function(){
-
 
2206
                return this.each( fn, arguments );
2287
}
2207
        };
-
 
2208
});
2288
2209
2289
function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
-
 
2290
        var sibDir = dir == "previousSibling" && !isXML;
-
 
2291
        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
-
 
2292
                var elem = checkSet[i];
-
 
2293
                if ( elem ) {
2210
jQuery.extend({
2294
                        if ( sibDir && elem.nodeType === 1 ) {
2211
        clean: function( elems, context, fragment ) {
2295
                                elem.sizcache = doneName;
2212
                context = context || document;
2296
                                elem.sizset = i;
-
 
2297
                        }
-
 
2298
                        elem = elem[dir];
-
 
2299
                        var match = false;
-
 
2300
2213
2301
                        while ( elem ) {
2214
                // !context.createElement fails in IE with an error but returns typeof 'object'
2302
                                if ( elem.sizcache === doneName ) {
2215
                if ( typeof context.createElement === "undefined" )
2303
                                        match = checkSet[elem.sizset];
2216
                        context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
2304
                                        break;
-
 
2305
                                }
-
 
2306
2217
2307
                                if ( elem.nodeType === 1 ) {
2218
                // If a single string is passed in and it's a single tag
2308
                                        if ( !isXML ) {
-
 
2309
                                                elem.sizcache = doneName;
2219
                // just do a createElement and skip the rest
2310
                                                elem.sizset = i;
-
 
2311
                                        }
-
 
2312
                                        if ( typeof cur !== "string" ) {
2220
                if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) {
2313
                                                if ( elem === cur ) {
2221
                        var match = /^<(\w+)\s*\/?>$/.exec(elems[0]);
2314
                                                        match = true;
2222
                        if ( match )
2315
                                                        break;
2223
                                return [ context.createElement( match[1] ) ];
2316
                                                }
2224
                }
2317
2225
2318
                                        } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
2226
                var ret = [], scripts = [], div = context.createElement("div");
2319
                                                match = elem;
-
 
2320
                                                break;
-
 
2321
                                        }
-
 
2322
                                }
-
 
2323
2227
-
 
2228
                jQuery.each(elems, function(i, elem){
2324
                                elem = elem[dir];
2229
                        if ( typeof elem === "number" )
2325
                        }
2230
                                elem += '';
2326
2231
2327
                        checkSet[i] = match;
2232
                        if ( !elem )
2328
                }
2233
                                return;
2329
        }
-
 
2330
}
-
 
2331
2234
2332
var contains = document.compareDocumentPosition ?  function(a, b){
2235
                        // Convert html string into DOM nodes
2333
        return a.compareDocumentPosition(b) & 16;
2236
                        if ( typeof elem === "string" ) {
2334
} : function(a, b){
2237
                                // Fix "XHTML"-style tags in all browsers
-
 
2238
                                elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
2335
        return a !== b && (a.contains ? a.contains(b) : true);
2239
                                        return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
-
 
2240
                                                all :
-
 
2241
                                                front + "></" + tag + ">";
2336
};
2242
                                });
2337
2243
2338
var isXML = function(elem){
-
 
2339
        return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
2244
                                // Trim whitespace, otherwise indexOf won't work as expected
2340
                !!elem.ownerDocument && isXML( elem.ownerDocument );
2245
                                var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase();
2341
};
-
 
2342
2246
-
 
2247
                                var wrap =
2343
var posProcess = function(selector, context){
2248
                                        // option or optgroup
2344
        var tmpSet = [], later = "", match,
2249
                                        !tags.indexOf("<opt") &&
2345
                root = context.nodeType ? [context] : context;
2250
                                        [ 1, "<select multiple='multiple'>", "</select>" ] ||
2346
2251
2347
        // Position selectors must be done after the filter
-
 
2348
        // And so must :not(positional) so we move all PSEUDOs to the end
-
 
2349
        while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
-
 
2350
                later += match[0];
2252
                                        !tags.indexOf("<leg") &&
2351
                selector = selector.replace( Expr.match.PSEUDO, "" );
2253
                                        [ 1, "<fieldset>", "</fieldset>" ] ||
2352
        }
-
 
2353
2254
2354
        selector = Expr.relative[selector] ? selector + "*" : selector;
2255
                                        tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
-
 
2256
                                        [ 1, "<table>", "</table>" ] ||
2355
2257
2356
        for ( var i = 0, l = root.length; i < l; i++ ) {
2258
                                        !tags.indexOf("<tr") &&
2357
                Sizzle( selector, root[i], tmpSet );
2259
                                        [ 2, "<table><tbody>", "</tbody></table>" ] ||
2358
        }
-
 
2359
2260
2360
        return Sizzle.filter( later, tmpSet );
2261
                                        // <thead> matched above
2361
};
-
 
-
 
2262
                                        (!tags.indexOf("<td") || !tags.indexOf("<th")) &&
-
 
2263
                                        [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
2362
2264
2363
// EXPOSE
-
 
2364
jQuery.find = Sizzle;
2265
                                        !tags.indexOf("<col") &&
2365
jQuery.filter = Sizzle.filter;
-
 
2366
jQuery.expr = Sizzle.selectors;
-
 
2367
jQuery.expr[":"] = jQuery.expr.filters;
2266
                                        [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
2368
2267
2369
Sizzle.selectors.filters.hidden = function(elem){
2268
                                        // IE can't serialize <link> and <script> tags normally
2370
        return elem.offsetWidth === 0 || elem.offsetHeight === 0;
2269
                                        !jQuery.support.htmlSerialize &&
2371
};
-
 
-
 
2270
                                        [ 1, "div<div>", "</div>" ] ||
2372
2271
2373
Sizzle.selectors.filters.visible = function(elem){
-
 
2374
        return elem.offsetWidth > 0 || elem.offsetHeight > 0;
2272
                                        [ 0, "", "" ];
2375
};
-
 
2376
2273
2377
Sizzle.selectors.filters.animated = function(elem){
2274
                                // Go to html and back, then peel off extra wrappers
2378
        return jQuery.grep(jQuery.timers, function(fn){
2275
                                div.innerHTML = wrap[1] + elem + wrap[2];
2379
                return elem === fn.elem;
-
 
2380
        }).length;
-
 
2381
};
-
 
2382
2276
2383
jQuery.multiFilter = function( expr, elems, not ) {
2277
                                // Move to the right depth
2384
        if ( not ) {
2278
                                while ( wrap[0]-- )
2385
                expr = ":not(" + expr + ")";
2279
                                        div = div.lastChild;
2386
        }
-
 
2387
2280
-
 
2281
                                // Remove IE's autoinserted <tbody> from table fragments
2388
        return Sizzle.matches(expr, elems);
2282
                                if ( !jQuery.support.tbody ) {
2389
};
-
 
2390
2283
2391
jQuery.dir = function( elem, dir ){
2284
                                        // String was a <table>, *may* have spurious <tbody>
2392
        var matched = [], cur = elem[dir];
2285
                                        var hasBody = /<tbody/i.test(elem),
2393
        while ( cur && cur != document ) {
2286
                                                tbody = !tags.indexOf("<table") && !hasBody ?
2394
                if ( cur.nodeType == 1 )
2287
                                                        div.firstChild && div.firstChild.childNodes :
2395
                        matched.push( cur );
-
 
2396
                cur = cur[dir];
-
 
2397
        }
-
 
2398
        return matched;
-
 
2399
};
-
 
2400
2288
2401
jQuery.nth = function(cur, result, dir, elem){
2289
                                                // String was a bare <thead> or <tfoot>
-
 
2290
                                                wrap[1] == "<table>" && !hasBody ?
2402
        result = result || 1;
2291
                                                        div.childNodes :
2403
        var num = 0;
2292
                                                        [];
-
 
2293
-
 
2294
                                        for ( var j = tbody.length - 1; j >= 0 ; --j )
-
 
2295
                                                if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
-
 
2296
                                                        tbody[ j ].parentNode.removeChild( tbody[ j ] );
-
 
2297
-
 
2298
                                        }
2404
2299
2405
        for ( ; cur; cur = cur[dir] )
2300
                                // IE completely kills leading whitespace when innerHTML is used
2406
                if ( cur.nodeType == 1 && ++num == result )
2301
                                if ( !jQuery.support.leadingWhitespace && /^\s/.test( elem ) )
2407
                        break;
-
 
-
 
2302
                                        div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
2408
2303
2409
        return cur;
2304
                                elem = jQuery.makeArray( div.childNodes );
2410
};
2305
                        }
2411
2306
2412
jQuery.sibling = function(n, elem){
2307
                        if ( elem.nodeType )
2413
        var r = [];
2308
                                ret.push( elem );
-
 
2309
                        else
-
 
2310
                                ret = jQuery.merge( ret, elem );
2414
2311
2415
        for ( ; n; n = n.nextSibling ) {
-
 
2416
                if ( n.nodeType == 1 && n != elem )
-
 
2417
                        r.push( n );
-
 
2418
        }
2312
                });
2419
2313
-
 
2314
                if ( fragment ) {
-
 
2315
                        for ( var i = 0; ret[i]; i++ ) {
-
 
2316
                                if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
-
 
2317
                                        scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
2420
        return r;
2318
                                } else {
-
 
2319
                                        if ( ret[i].nodeType === 1 )
-
 
2320
                                                ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
-
 
2321
                                        fragment.appendChild( ret[i] );
-
 
2322
                                }
2421
};
2323
                        }
2422
2324
2423
return;
2325
                        return scripts;
-
 
2326
                }
2424
2327
2425
window.Sizzle = Sizzle;
2328
                return ret;
-
 
2329
        }
-
 
2330
});
2426
2331
-
 
2332
function cleanData( elems ) {
-
 
2333
        for ( var i = 0, l = elems.length; i < l; i++ ) {
-
 
2334
                var id = elems[i][expando];
-
 
2335
                if ( id ) {
-
 
2336
                        delete jQuery.cache[ id ];
-
 
2337
                }
-
 
2338
        }
2427
})();
2339
}
2428
/*
2340
/*
2429
 * A number of helper functions used for managing events.
2341
 * A number of helper functions used for managing events.
2430
 * Many of the ideas behind this code originated from
2342
 * Many of the ideas behind this code originated from
2431
 * Dean Edwards' addEvent library.
2343
 * Dean Edwards' addEvent library.
2432
 */
2344
 */
2433
jQuery.event = {
2345
jQuery.event = {
2434
2346
2435
        // Bind an event to an element
2347
        // Bind an event to an element
2436
        // Original by Dean Edwards
2348
        // Original by Dean Edwards
2437
        add: function(elem, types, handler, data) {
2349
        add: function(elem, types, handler, data) {
2438
                if ( elem.nodeType == 3 || elem.nodeType == 8 )
2350
                if ( elem.nodeType == 3 || elem.nodeType == 8 )
2439
                        return;
2351
                        return;
2440
2352
2441
                // For whatever reason, IE has trouble passing the window object
2353
                // For whatever reason, IE has trouble passing the window object
2442
                // around, causing it to be cloned in the process
2354
                // around, causing it to be cloned in the process
2443
                if ( elem.setInterval && elem != window )
2355
                if ( elem.setInterval && elem != window )
2444
                        elem = window;
2356
                        elem = window;
2445
2357
2446
                // Make sure that the function being executed has a unique ID
2358
                // Make sure that the function being executed has a unique ID
2447
                if ( !handler.guid )
2359
                if ( !handler.guid )
2448
                        handler.guid = this.guid++;
2360
                        handler.guid = this.guid++;
2449
2361
2450
                // if data is passed, bind to handler
2362
                // if data is passed, bind to handler
2451
                if ( data !== undefined ) {
2363
                if ( data !== undefined ) {
2452
                        // Create temporary function pointer to original handler
2364
                        // Create temporary function pointer to original handler
2453
                        var fn = handler;
2365
                        var fn = handler;
2454
2366
2455
                        // Create unique handler function, wrapped around original handler
2367
                        // Create unique handler function, wrapped around original handler
2456
                        handler = this.proxy( fn );
2368
                        handler = this.proxy( fn );
2457
2369
2458
                        // Store data in unique handler
2370
                        // Store data in unique handler
2459
                        handler.data = data;
2371
                        handler.data = data;
2460
                }
2372
                }
2461
2373
2462
                // Init the element's event structure
2374
                // Init the element's event structure
2463
                var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
2375
                var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
2464
                        handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
2376
                        handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
2465
                                // Handle the second event of a trigger and when
2377
                                // Handle the second event of a trigger and when
2466
                                // an event is called after a page has unloaded
2378
                                // an event is called after a page has unloaded
2467
                                return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
2379
                                return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
2468
                                        jQuery.event.handle.apply(arguments.callee.elem, arguments) :
2380
                                        jQuery.event.handle.apply(arguments.callee.elem, arguments) :
2469
                                        undefined;
2381
                                        undefined;
2470
                        });
2382
                        });
2471
                // Add elem as a property of the handle function
2383
                // Add elem as a property of the handle function
2472
                // This is to prevent a memory leak with non-native
2384
                // This is to prevent a memory leak with non-native
2473
                // event in IE.
2385
                // event in IE.
2474
                handle.elem = elem;
2386
                handle.elem = elem;
2475
2387
2476
                // Handle multiple events separated by a space
2388
                // Handle multiple events separated by a space
2477
                // jQuery(...).bind("mouseover mouseout", fn);
2389
                // jQuery(...).bind("mouseover mouseout", fn);
2478
                jQuery.each(types.split(/\s+/), function(index, type) {
2390
                jQuery.each(types.split(/\s+/), function(index, type) {
2479
                        // Namespaced event handlers
2391
                        // Namespaced event handlers
2480
                        var namespaces = type.split(".");
2392
                        var namespaces = type.split(".");
2481
                        type = namespaces.shift();
2393
                        type = namespaces.shift();
2482
                        handler.type = namespaces.slice().sort().join(".");
2394
                        handler.type = namespaces.slice().sort().join(".");
2483
2395
2484
                        // Get the current list of functions bound to this event
2396
                        // Get the current list of functions bound to this event
2485
                        var handlers = events[type];
2397
                        var handlers = events[type];
2486
                       
2398
2487
                        if ( jQuery.event.specialAll[type] )
2399
                        if ( jQuery.event.specialAll[type] )
2488
                                jQuery.event.specialAll[type].setup.call(elem, data, namespaces);
2400
                                jQuery.event.specialAll[type].setup.call(elem, data, namespaces);
2489
2401
2490
                        // Init the event handler queue
2402
                        // Init the event handler queue
2491
                        if (!handlers) {
2403
                        if (!handlers) {
2492
                                handlers = events[type] = {};
2404
                                handlers = events[type] = {};
2493
2405
2494
                                // Check for a special event handler
2406
                                // Check for a special event handler
2495
                                // Only use addEventListener/attachEvent if the special
2407
                                // Only use addEventListener/attachEvent if the special
2496
                                // events handler returns false
2408
                                // events handler returns false
2497
                                if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) {
2409
                                if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) {
2498
                                        // Bind the global event handler to the element
2410
                                        // Bind the global event handler to the element
2499
                                        if (elem.addEventListener)
2411
                                        if (elem.addEventListener)
2500
                                                elem.addEventListener(type, handle, false);
2412
                                                elem.addEventListener(type, handle, false);
2501
                                        else if (elem.attachEvent)
2413
                                        else if (elem.attachEvent)
2502
                                                elem.attachEvent("on" + type, handle);
2414
                                                elem.attachEvent("on" + type, handle);
2503
                                }
2415
                                }
2504
                        }
2416
                        }
2505
2417
2506
                        // Add the function to the element's handler list
2418
                        // Add the function to the element's handler list
2507
                        handlers[handler.guid] = handler;
2419
                        handlers[handler.guid] = handler;
2508
2420
2509
                        // Keep track of which events have been used, for global triggering
2421
                        // Keep track of which events have been used, for global triggering
2510
                        jQuery.event.global[type] = true;
2422
                        jQuery.event.global[type] = true;
2511
                });
2423
                });
2512
2424
2513
                // Nullify elem to prevent memory leaks in IE
2425
                // Nullify elem to prevent memory leaks in IE
2514
                elem = null;
2426
                elem = null;
2515
        },
2427
        },
2516
2428
2517
        guid: 1,
2429
        guid: 1,
2518
        global: {},
2430
        global: {},
2519
2431
2520
        // Detach an event or set of events from an element
2432
        // Detach an event or set of events from an element
2521
        remove: function(elem, types, handler) {
2433
        remove: function(elem, types, handler) {
2522
                // don't do events on text and comment nodes
2434
                // don't do events on text and comment nodes
2523
                if ( elem.nodeType == 3 || elem.nodeType == 8 )
2435
                if ( elem.nodeType == 3 || elem.nodeType == 8 )
2524
                        return;
2436
                        return;
2525
2437
2526
                var events = jQuery.data(elem, "events"), ret, index;
2438
                var events = jQuery.data(elem, "events"), ret, index;
2527
2439
2528
                if ( events ) {
2440
                if ( events ) {
2529
                        // Unbind all events for the element
2441
                        // Unbind all events for the element
2530
                        if ( types === undefined || (typeof types === "string" && types.charAt(0) == ".") )
2442
                        if ( types === undefined || (typeof types === "string" && types.charAt(0) == ".") )
2531
                                for ( var type in events )
2443
                                for ( var type in events )
2532
                                        this.remove( elem, type + (types || "") );
2444
                                        this.remove( elem, type + (types || "") );
2533
                        else {
2445
                        else {
2534
                                // types is actually an event object here
2446
                                // types is actually an event object here
2535
                                if ( types.type ) {
2447
                                if ( types.type ) {
2536
                                        handler = types.handler;
2448
                                        handler = types.handler;
2537
                                        types = types.type;
2449
                                        types = types.type;
2538
                                }
2450
                                }
2539
2451
2540
                                // Handle multiple events seperated by a space
2452
                                // Handle multiple events seperated by a space
2541
                                // jQuery(...).unbind("mouseover mouseout", fn);
2453
                                // jQuery(...).unbind("mouseover mouseout", fn);
2542
                                jQuery.each(types.split(/\s+/), function(index, type){
2454
                                jQuery.each(types.split(/\s+/), function(index, type){
2543
                                        // Namespaced event handlers
2455
                                        // Namespaced event handlers
2544
                                        var namespaces = type.split(".");
2456
                                        var namespaces = type.split(".");
2545
                                        type = namespaces.shift();
2457
                                        type = namespaces.shift();
2546
                                        var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
2458
                                        var namespace = new RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
2547
2459
2548
                                        if ( events[type] ) {
2460
                                        if ( events[type] ) {
2549
                                                // remove the given handler for the given type
2461
                                                // remove the given handler for the given type
2550
                                                if ( handler )
2462
                                                if ( handler )
2551
                                                        delete events[type][handler.guid];
2463
                                                        delete events[type][handler.guid];
2552
2464
2553
                                                // remove all handlers for the given type
2465
                                                // remove all handlers for the given type
2554
                                                else
2466
                                                else
2555
                                                        for ( var handle in events[type] )
2467
                                                        for ( var handle in events[type] )
2556
                                                                // Handle the removal of namespaced events
2468
                                                                // Handle the removal of namespaced events
2557
                                                                if ( namespace.test(events[type][handle].type) )
2469
                                                                if ( namespace.test(events[type][handle].type) )
2558
                                                                        delete events[type][handle];
2470
                                                                        delete events[type][handle];
2559
                                                                       
2471
2560
                                                if ( jQuery.event.specialAll[type] )
2472
                                                if ( jQuery.event.specialAll[type] )
2561
                                                        jQuery.event.specialAll[type].teardown.call(elem, namespaces);
2473
                                                        jQuery.event.specialAll[type].teardown.call(elem, namespaces);
2562
2474
2563
                                                // remove generic event handler if no more handlers exist
2475
                                                // remove generic event handler if no more handlers exist
2564
                                                for ( ret in events[type] ) break;
2476
                                                for ( ret in events[type] ) break;
2565
                                                if ( !ret ) {
2477
                                                if ( !ret ) {
2566
                                                        if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem, namespaces) === false ) {
2478
                                                        if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem, namespaces) === false ) {
2567
                                                                if (elem.removeEventListener)
2479
                                                                if (elem.removeEventListener)
2568
                                                                        elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
2480
                                                                        elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
2569
                                                                else if (elem.detachEvent)
2481
                                                                else if (elem.detachEvent)
2570
                                                                        elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
2482
                                                                        elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
2571
                                                        }
2483
                                                        }
2572
                                                        ret = null;
2484
                                                        ret = null;
2573
                                                        delete events[type];
2485
                                                        delete events[type];
2574
                                                }
2486
                                                }
2575
                                        }
2487
                                        }
2576
                                });
2488
                                });
2577
                        }
2489
                        }
2578
2490
2579
                        // Remove the expando if it's no longer used
2491
                        // Remove the expando if it's no longer used
2580
                        for ( ret in events ) break;
2492
                        for ( ret in events ) break;
2581
                        if ( !ret ) {
2493
                        if ( !ret ) {
2582
                                var handle = jQuery.data( elem, "handle" );
2494
                                var handle = jQuery.data( elem, "handle" );
2583
                                if ( handle ) handle.elem = null;
2495
                                if ( handle ) handle.elem = null;
2584
                                jQuery.removeData( elem, "events" );
2496
                                jQuery.removeData( elem, "events" );
2585
                                jQuery.removeData( elem, "handle" );
2497
                                jQuery.removeData( elem, "handle" );
2586
                        }
2498
                        }
2587
                }
2499
                }
2588
        },
2500
        },
2589
2501
2590
        // bubbling is internal
2502
        // bubbling is internal
2591
        trigger: function( event, data, elem, bubbling ) {
2503
        trigger: function( event, data, elem, bubbling ) {
2592
                // Event object or event type
2504
                // Event object or event type
2593
                var type = event.type || event;
2505
                var type = event.type || event;
2594
2506
2595
                if( !bubbling ){
2507
                if( !bubbling ){
2596
                        event = typeof event === "object" ?
2508
                        event = typeof event === "object" ?
2597
                                // jQuery.Event object
2509
                                // jQuery.Event object
2598
                                event[expando] ? event :
2510
                                event[expando] ? event :
2599
                                // Object literal
2511
                                // Object literal
2600
                                jQuery.extend( jQuery.Event(type), event ) :
2512
                                jQuery.extend( jQuery.Event(type), event ) :
2601
                                // Just the event type (string)
2513
                                // Just the event type (string)
2602
                                jQuery.Event(type);
2514
                                jQuery.Event(type);
2603
2515
2604
                        if ( type.indexOf("!") >= 0 ) {
2516
                        if ( type.indexOf("!") >= 0 ) {
2605
                                event.type = type = type.slice(0, -1);
2517
                                event.type = type = type.slice(0, -1);
2606
                                event.exclusive = true;
2518
                                event.exclusive = true;
2607
                        }
2519
                        }
2608
2520
2609
                        // Handle a global trigger
2521
                        // Handle a global trigger
2610
                        if ( !elem ) {
2522
                        if ( !elem ) {
2611
                                // Don't bubble custom events when global (to avoid too much overhead)
2523
                                // Don't bubble custom events when global (to avoid too much overhead)
2612
                                event.stopPropagation();
2524
                                event.stopPropagation();
2613
                                // Only trigger if we've ever bound an event for it
2525
                                // Only trigger if we've ever bound an event for it
2614
                                if ( this.global[type] )
2526
                                if ( this.global[type] )
2615
                                        jQuery.each( jQuery.cache, function(){
2527
                                        jQuery.each( jQuery.cache, function(){
2616
                                                if ( this.events && this.events[type] )
2528
                                                if ( this.events && this.events[type] )
2617
                                                        jQuery.event.trigger( event, data, this.handle.elem );
2529
                                                        jQuery.event.trigger( event, data, this.handle.elem );
2618
                                        });
2530
                                        });
2619
                        }
2531
                        }
2620
2532
2621
                        // Handle triggering a single element
2533
                        // Handle triggering a single element
2622
2534
2623
                        // don't do events on text and comment nodes
2535
                        // don't do events on text and comment nodes
2624
                        if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 )
2536
                        if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 )
2625
                                return undefined;
2537
                                return undefined;
2626
                       
2538
2627
                        // Clean up in case it is reused
2539
                        // Clean up in case it is reused
2628
                        event.result = undefined;
2540
                        event.result = undefined;
2629
                        event.target = elem;
2541
                        event.target = elem;
2630
                       
2542
2631
                        // Clone the incoming data, if any
2543
                        // Clone the incoming data, if any
2632
                        data = jQuery.makeArray(data);
2544
                        data = jQuery.makeArray(data);
2633
                        data.unshift( event );
2545
                        data.unshift( event );
2634
                }
2546
                }
2635
2547
2636
                event.currentTarget = elem;
2548
                event.currentTarget = elem;
2637
2549
2638
                // Trigger the event, it is assumed that "handle" is a function
2550
                // Trigger the event, it is assumed that "handle" is a function
2639
                var handle = jQuery.data(elem, "handle");
2551
                var handle = jQuery.data(elem, "handle");
2640
                if ( handle )
2552
                if ( handle )
2641
                        handle.apply( elem, data );
2553
                        handle.apply( elem, data );
2642
2554
2643
                // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
2555
                // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
2644
                if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
2556
                if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
2645
                        event.result = false;
2557
                        event.result = false;
2646
2558
2647
                // Trigger the native events (except for clicks on links)
2559
                // Trigger the native events (except for clicks on links)
2648
                if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
2560
                if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
2649
                        this.triggered = true;
2561
                        this.triggered = true;
2650
                        try {
2562
                        try {
2651
                                elem[ type ]();
2563
                                elem[ type ]();
2652
                        // prevent IE from throwing an error for some hidden elements
2564
                        // prevent IE from throwing an error for some hidden elements
2653
                        } catch (e) {}
2565
                        } catch (e) {}
2654
                }
2566
                }
2655
2567
2656
                this.triggered = false;
2568
                this.triggered = false;
2657
2569
2658
                if ( !event.isPropagationStopped() ) {
2570
                if ( !event.isPropagationStopped() ) {
2659
                        var parent = elem.parentNode || elem.ownerDocument;
2571
                        var parent = elem.parentNode || elem.ownerDocument;
2660
                        if ( parent )
2572
                        if ( parent )
2661
                                jQuery.event.trigger(event, data, parent, true);
2573
                                jQuery.event.trigger(event, data, parent, true);
2662
                }
2574
                }
2663
        },
2575
        },
2664
2576
2665
        handle: function(event) {
2577
        handle: function(event) {
2666
                // returned undefined or false
2578
                // returned undefined or false
2667
                var all, handlers;
2579
                var all, handlers;
2668
2580
2669
                event = arguments[0] = jQuery.event.fix( event || window.event );
2581
                event = arguments[0] = jQuery.event.fix( event || window.event );
2670
                event.currentTarget = this;
2582
                event.currentTarget = this;
2671
               
2583
2672
                // Namespaced event handlers
2584
                // Namespaced event handlers
2673
                var namespaces = event.type.split(".");
2585
                var namespaces = event.type.split(".");
2674
                event.type = namespaces.shift();
2586
                event.type = namespaces.shift();
2675
2587
2676
                // Cache this now, all = true means, any handler
2588
                // Cache this now, all = true means, any handler
2677
                all = !namespaces.length && !event.exclusive;
2589
                all = !namespaces.length && !event.exclusive;
2678
               
2590
2679
                var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
2591
                var namespace = new RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
2680
2592
2681
                handlers = ( jQuery.data(this, "events") || {} )[event.type];
2593
                handlers = ( jQuery.data(this, "events") || {} )[event.type];
2682
2594
2683
                for ( var j in handlers ) {
2595
                for ( var j in handlers ) {
2684
                        var handler = handlers[j];
2596
                        var handler = handlers[j];
2685
2597
2686
                        // Filter the functions by class
2598
                        // Filter the functions by class
2687
                        if ( all || namespace.test(handler.type) ) {
2599
                        if ( all || namespace.test(handler.type) ) {
2688
                                // Pass in a reference to the handler function itself
2600
                                // Pass in a reference to the handler function itself
2689
                                // So that we can later remove it
2601
                                // So that we can later remove it
2690
                                event.handler = handler;
2602
                                event.handler = handler;
2691
                                event.data = handler.data;
2603
                                event.data = handler.data;
2692
2604
2693
                                var ret = handler.apply(this, arguments);
2605
                                var ret = handler.apply(this, arguments);
2694
2606
2695
                                if( ret !== undefined ){
2607
                                if( ret !== undefined ){
2696
                                        event.result = ret;
2608
                                        event.result = ret;
2697
                                        if ( ret === false ) {
2609
                                        if ( ret === false ) {
2698
                                                event.preventDefault();
2610
                                                event.preventDefault();
2699
                                                event.stopPropagation();
2611
                                                event.stopPropagation();
2700
                                        }
2612
                                        }
2701
                                }
2613
                                }
2702
2614
2703
                                if( event.isImmediatePropagationStopped() )
2615
                                if( event.isImmediatePropagationStopped() )
2704
                                        break;
2616
                                        break;
2705
2617
2706
                        }
2618
                        }
2707
                }
2619
                }
2708
        },
2620
        },
2709
2621
2710
        props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
2622
        props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
2711
2623
2712
        fix: function(event) {
2624
        fix: function(event) {
2713
                if ( event[expando] )
2625
                if ( event[expando] )
2714
                        return event;
2626
                        return event;
2715
2627
2716
                // store a copy of the original event object
2628
                // store a copy of the original event object
2717
                // and "clone" to set read-only properties
2629
                // and "clone" to set read-only properties
2718
                var originalEvent = event;
2630
                var originalEvent = event;
2719
                event = jQuery.Event( originalEvent );
2631
                event = jQuery.Event( originalEvent );
2720
2632
2721
                for ( var i = this.props.length, prop; i; ){
2633
                for ( var i = this.props.length, prop; i; ){
2722
                        prop = this.props[ --i ];
2634
                        prop = this.props[ --i ];
2723
                        event[ prop ] = originalEvent[ prop ];
2635
                        event[ prop ] = originalEvent[ prop ];
2724
                }
2636
                }
2725
2637
2726
                // Fix target property, if necessary
2638
                // Fix target property, if necessary
2727
                if ( !event.target )
2639
                if ( !event.target )
2728
                        event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
2640
                        event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
2729
2641
2730
                // check if target is a textnode (safari)
2642
                // check if target is a textnode (safari)
2731
                if ( event.target.nodeType == 3 )
2643
                if ( event.target.nodeType == 3 )
2732
                        event.target = event.target.parentNode;
2644
                        event.target = event.target.parentNode;
2733
2645
2734
                // Add relatedTarget, if necessary
2646
                // Add relatedTarget, if necessary
2735
                if ( !event.relatedTarget && event.fromElement )
2647
                if ( !event.relatedTarget && event.fromElement )
2736
                        event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
2648
                        event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
2737
2649
2738
                // Calculate pageX/Y if missing and clientX/Y available
2650
                // Calculate pageX/Y if missing and clientX/Y available
2739
                if ( event.pageX == null && event.clientX != null ) {
2651
                if ( event.pageX == null && event.clientX != null ) {
2740
                        var doc = document.documentElement, body = document.body;
2652
                        var doc = document.documentElement, body = document.body;
2741
                        event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
2653
                        event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
2742
                        event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
2654
                        event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
2743
                }
2655
                }
2744
2656
2745
                // Add which for key events
2657
                // Add which for key events
2746
                if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
2658
                if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
2747
                        event.which = event.charCode || event.keyCode;
2659
                        event.which = event.charCode || event.keyCode;
2748
2660
2749
                // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
2661
                // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
2750
                if ( !event.metaKey && event.ctrlKey )
2662
                if ( !event.metaKey && event.ctrlKey )
2751
                        event.metaKey = event.ctrlKey;
2663
                        event.metaKey = event.ctrlKey;
2752
2664
2753
                // Add which for click: 1 == left; 2 == middle; 3 == right
2665
                // Add which for click: 1 == left; 2 == middle; 3 == right
2754
                // Note: button is not normalized, so don't use it
2666
                // Note: button is not normalized, so don't use it
2755
                if ( !event.which && event.button )
2667
                if ( !event.which && event.button )
2756
                        event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
2668
                        event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
2757
2669
2758
                return event;
2670
                return event;
2759
        },
2671
        },
2760
2672
2761
        proxy: function( fn, proxy ){
2673
        proxy: function( fn, proxy ){
2762
                proxy = proxy || function(){ return fn.apply(this, arguments); };
2674
                proxy = proxy || function(){ return fn.apply(this, arguments); };
2763
                // Set the guid of unique handler to the same of original handler, so it can be removed
2675
                // Set the guid of unique handler to the same of original handler, so it can be removed
2764
                proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
2676
                proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
2765
                // So proxy can be declared as an argument
2677
                // So proxy can be declared as an argument
2766
                return proxy;
2678
                return proxy;
2767
        },
2679
        },
2768
2680
2769
        special: {
2681
        special: {
2770
                ready: {
2682
                ready: {
2771
                        // Make sure the ready event is setup
2683
                        // Make sure the ready event is setup
2772
                        setup: bindReady,
2684
                        setup: bindReady,
2773
                        teardown: function() {}
2685
                        teardown: function() {}
2774
                }
2686
                }
2775
        },
2687
        },
2776
       
2688
2777
        specialAll: {
2689
        specialAll: {
2778
                live: {
2690
                live: {
2779
                        setup: function( selector, namespaces ){
2691
                        setup: function( selector, namespaces ){
2780
                                jQuery.event.add( this, namespaces[0], liveHandler );
2692
                                jQuery.event.add( this, namespaces[0], liveHandler );
2781
                        },
2693
                        },
2782
                        teardown:  function( namespaces ){
2694
                        teardown:  function( namespaces ){
2783
                                if ( namespaces.length ) {
2695
                                if ( namespaces.length ) {
2784
                                        var remove = 0, name = RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)");
2696
                                        var remove = 0, name = new RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)");
2785
                                       
2697
2786
                                        jQuery.each( (jQuery.data(this, "events").live || {}), function(){
2698
                                        jQuery.each( (jQuery.data(this, "events").live || {}), function(){
2787
                                                if ( name.test(this.type) )
2699
                                                if ( name.test(this.type) )
2788
                                                        remove++;
2700
                                                        remove++;
2789
                                        });
2701
                                        });
2790
                                       
2702
2791
                                        if ( remove < 1 )
2703
                                        if ( remove < 1 )
2792
                                                jQuery.event.remove( this, namespaces[0], liveHandler );
2704
                                                jQuery.event.remove( this, namespaces[0], liveHandler );
2793
                                }
2705
                                }
2794
                        }
2706
                        }
2795
                }
2707
                }
2796
        }
2708
        }
2797
};
2709
};
2798
2710
2799
jQuery.Event = function( src ){
2711
jQuery.Event = function( src ){
2800
        // Allow instantiation without the 'new' keyword
2712
        // Allow instantiation without the 'new' keyword
2801
        if( !this.preventDefault )
2713
        if( !this.preventDefault )
2802
                return new jQuery.Event(src);
2714
                return new jQuery.Event(src);
2803
       
2715
2804
        // Event object
2716
        // Event object
2805
        if( src && src.type ){
2717
        if( src && src.type ){
2806
                this.originalEvent = src;
2718
                this.originalEvent = src;
2807
                this.type = src.type;
2719
                this.type = src.type;
2808
        // Event type
2720
        // Event type
2809
        }else
2721
        }else
2810
                this.type = src;
2722
                this.type = src;
2811
2723
2812
        // timeStamp is buggy for some events on Firefox(#3843)
2724
        // timeStamp is buggy for some events on Firefox(#3843)
2813
        // So we won't rely on the native value
2725
        // So we won't rely on the native value
2814
        this.timeStamp = now();
2726
        this.timeStamp = now();
2815
       
2727
2816
        // Mark it as fixed
2728
        // Mark it as fixed
2817
        this[expando] = true;
2729
        this[expando] = true;
2818
};
2730
};
2819
2731
2820
function returnFalse(){
2732
function returnFalse(){
2821
        return false;
2733
        return false;
2822
}
2734
}
2823
function returnTrue(){
2735
function returnTrue(){
2824
        return true;
2736
        return true;
2825
}
2737
}
2826
2738
2827
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
2739
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
2828
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
2740
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
2829
jQuery.Event.prototype = {
2741
jQuery.Event.prototype = {
2830
        preventDefault: function() {
2742
        preventDefault: function() {
2831
                this.isDefaultPrevented = returnTrue;
2743
                this.isDefaultPrevented = returnTrue;
2832
2744
2833
                var e = this.originalEvent;
2745
                var e = this.originalEvent;
2834
                if( !e )
2746
                if( !e )
2835
                        return;
2747
                        return;
2836
                // if preventDefault exists run it on the original event
2748
                // if preventDefault exists run it on the original event
2837
                if (e.preventDefault)
2749
                if (e.preventDefault)
2838
                        e.preventDefault();
2750
                        e.preventDefault();
2839
                // otherwise set the returnValue property of the original event to false (IE)
2751
                // otherwise set the returnValue property of the original event to false (IE)
2840
                e.returnValue = false;
2752
                e.returnValue = false;
2841
        },
2753
        },
2842
        stopPropagation: function() {
2754
        stopPropagation: function() {
2843
                this.isPropagationStopped = returnTrue;
2755
                this.isPropagationStopped = returnTrue;
2844
2756
2845
                var e = this.originalEvent;
2757
                var e = this.originalEvent;
2846
                if( !e )
2758
                if( !e )
2847
                        return;
2759
                        return;
2848
                // if stopPropagation exists run it on the original event
2760
                // if stopPropagation exists run it on the original event
2849
                if (e.stopPropagation)
2761
                if (e.stopPropagation)
2850
                        e.stopPropagation();
2762
                        e.stopPropagation();
2851
                // otherwise set the cancelBubble property of the original event to true (IE)
2763
                // otherwise set the cancelBubble property of the original event to true (IE)
2852
                e.cancelBubble = true;
2764
                e.cancelBubble = true;
2853
        },
2765
        },
2854
        stopImmediatePropagation:function(){
2766
        stopImmediatePropagation:function(){
2855
                this.isImmediatePropagationStopped = returnTrue;
2767
                this.isImmediatePropagationStopped = returnTrue;
2856
                this.stopPropagation();
2768
                this.stopPropagation();
2857
        },
2769
        },
2858
        isDefaultPrevented: returnFalse,
2770
        isDefaultPrevented: returnFalse,
2859
        isPropagationStopped: returnFalse,
2771
        isPropagationStopped: returnFalse,
2860
        isImmediatePropagationStopped: returnFalse
2772
        isImmediatePropagationStopped: returnFalse
2861
};
2773
};
2862
// Checks if an event happened on an element within another element
2774
// Checks if an event happened on an element within another element
2863
// Used in jQuery.event.special.mouseenter and mouseleave handlers
2775
// Used in jQuery.event.special.mouseenter and mouseleave handlers
2864
var withinElement = function(event) {
2776
var withinElement = function(event) {
2865
        // Check if mouse(over|out) are still within the same parent element
2777
        // Check if mouse(over|out) are still within the same parent element
2866
        var parent = event.relatedTarget;
2778
        var parent = event.relatedTarget;
2867
        // Traverse up the tree
2779
        // Traverse up the tree
2868
        while ( parent && parent != this )
2780
        while ( parent && parent != this )
2869
                try { parent = parent.parentNode; }
2781
                try { parent = parent.parentNode; }
2870
                catch(e) { parent = this; }
2782
                catch(e) { parent = this; }
2871
       
2783
2872
        if( parent != this ){
2784
        if( parent != this ){
2873
                // set the correct event type
2785
                // set the correct event type
2874
                event.type = event.data;
2786
                event.type = event.data;
2875
                // handle event if we actually just moused on to a non sub-element
2787
                // handle event if we actually just moused on to a non sub-element
2876
                jQuery.event.handle.apply( this, arguments );
2788
                jQuery.event.handle.apply( this, arguments );
2877
        }
2789
        }
2878
};
2790
};
2879
       
2791
2880
jQuery.each({
2792
jQuery.each({
2881
        mouseover: 'mouseenter',
2793
        mouseover: 'mouseenter',
2882
        mouseout: 'mouseleave'
2794
        mouseout: 'mouseleave'
2883
}, function( orig, fix ){
2795
}, function( orig, fix ){
2884
        jQuery.event.special[ fix ] = {
2796
        jQuery.event.special[ fix ] = {
2885
                setup: function(){
2797
                setup: function(){
2886
                        jQuery.event.add( this, orig, withinElement, fix );
2798
                        jQuery.event.add( this, orig, withinElement, fix );
2887
                },
2799
                },
2888
                teardown: function(){
2800
                teardown: function(){
2889
                        jQuery.event.remove( this, orig, withinElement );
2801
                        jQuery.event.remove( this, orig, withinElement );
2890
                }
2802
                }
2891
        };                         
2803
        };
2892
});
2804
});
2893
2805
2894
jQuery.fn.extend({
2806
jQuery.fn.extend({
2895
        bind: function( type, data, fn ) {
2807
        bind: function( type, data, fn ) {
2896
                return type == "unload" ? this.one(type, data, fn) : this.each(function(){
2808
                return type == "unload" ? this.one(type, data, fn) : this.each(function(){
2897
                        jQuery.event.add( this, type, fn || data, fn && data );
2809
                        jQuery.event.add( this, type, fn || data, fn && data );
2898
                });
2810
                });
2899
        },
2811
        },
2900
2812
2901
        one: function( type, data, fn ) {
2813
        one: function( type, data, fn ) {
2902
                var one = jQuery.event.proxy( fn || data, function(event) {
2814
                var one = jQuery.event.proxy( fn || data, function(event) {
2903
                        jQuery(this).unbind(event, one);
2815
                        jQuery(this).unbind(event, one);
2904
                        return (fn || data).apply( this, arguments );
2816
                        return (fn || data).apply( this, arguments );
2905
                });
2817
                });
2906
                return this.each(function(){
2818
                return this.each(function(){
2907
                        jQuery.event.add( this, type, one, fn && data);
2819
                        jQuery.event.add( this, type, one, fn && data);
2908
                });
2820
                });
2909
        },
2821
        },
2910
2822
2911
        unbind: function( type, fn ) {
2823
        unbind: function( type, fn ) {
2912
                return this.each(function(){
2824
                return this.each(function(){
2913
                        jQuery.event.remove( this, type, fn );
2825
                        jQuery.event.remove( this, type, fn );
2914
                });
2826
                });
2915
        },
2827
        },
2916
2828
2917
        trigger: function( type, data ) {
2829
        trigger: function( type, data ) {
2918
                return this.each(function(){
2830
                return this.each(function(){
2919
                        jQuery.event.trigger( type, data, this );
2831
                        jQuery.event.trigger( type, data, this );
2920
                });
2832
                });
2921
        },
2833
        },
2922
2834
2923
        triggerHandler: function( type, data ) {
2835
        triggerHandler: function( type, data ) {
2924
                if( this[0] ){
2836
                if( this[0] ){
2925
                        var event = jQuery.Event(type);
2837
                        var event = jQuery.Event(type);
2926
                        event.preventDefault();
2838
                        event.preventDefault();
2927
                        event.stopPropagation();
2839
                        event.stopPropagation();
2928
                        jQuery.event.trigger( event, data, this[0] );
2840
                        jQuery.event.trigger( event, data, this[0] );
2929
                        return event.result;
2841
                        return event.result;
2930
                }              
2842
                }
2931
        },
2843
        },
2932
2844
2933
        toggle: function( fn ) {
2845
        toggle: function( fn ) {
2934
                // Save reference to arguments for access in closure
2846
                // Save reference to arguments for access in closure
2935
                var args = arguments, i = 1;
2847
                var args = arguments, i = 1;
2936
2848
2937
                // link all the functions, so any of them can unbind this click handler
2849
                // link all the functions, so any of them can unbind this click handler
2938
                while( i < args.length )
2850
                while( i < args.length )
2939
                        jQuery.event.proxy( fn, args[i++] );
2851
                        jQuery.event.proxy( fn, args[i++] );
2940
2852
2941
                return this.click( jQuery.event.proxy( fn, function(event) {
2853
                return this.click( jQuery.event.proxy( fn, function(event) {
2942
                        // Figure out which function to execute
2854
                        // Figure out which function to execute
2943
                        this.lastToggle = ( this.lastToggle || 0 ) % i;
2855
                        this.lastToggle = ( this.lastToggle || 0 ) % i;
2944
2856
2945
                        // Make sure that clicks stop
2857
                        // Make sure that clicks stop
2946
                        event.preventDefault();
2858
                        event.preventDefault();
2947
2859
2948
                        // and execute the function
2860
                        // and execute the function
2949
                        return args[ this.lastToggle++ ].apply( this, arguments ) || false;
2861
                        return args[ this.lastToggle++ ].apply( this, arguments ) || false;
2950
                }));
2862
                }));
2951
        },
2863
        },
2952
2864
2953
        hover: function(fnOver, fnOut) {
2865
        hover: function(fnOver, fnOut) {
2954
                return this.mouseenter(fnOver).mouseleave(fnOut);
2866
                return this.mouseenter(fnOver).mouseleave(fnOut);
2955
        },
2867
        },
2956
2868
2957
        ready: function(fn) {
2869
        ready: function(fn) {
2958
                // Attach the listeners
2870
                // Attach the listeners
2959
                bindReady();
2871
                bindReady();
2960
2872
2961
                // If the DOM is already ready
2873
                // If the DOM is already ready
2962
                if ( jQuery.isReady )
2874
                if ( jQuery.isReady )
2963
                        // Execute the function immediately
2875
                        // Execute the function immediately
2964
                        fn.call( document, jQuery );
2876
                        fn.call( document, jQuery );
2965
2877
2966
                // Otherwise, remember the function for later
2878
                // Otherwise, remember the function for later
2967
                else
2879
                else
2968
                        // Add the function to the wait list
2880
                        // Add the function to the wait list
2969
                        jQuery.readyList.push( fn );
2881
                        jQuery.readyList.push( fn );
2970
2882
2971
                return this;
2883
                return this;
2972
        },
2884
        },
2973
       
2885
2974
        live: function( type, fn ){
2886
        live: function( type, fn ){
2975
                var proxy = jQuery.event.proxy( fn );
2887
                var proxy = jQuery.event.proxy( fn );
2976
                proxy.guid += this.selector + type;
2888
                proxy.guid += this.selector + type;
2977
2889
2978
                jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy );
2890
                jQuery( this.context ).bind( liveConvert(type, this.selector), this.selector, proxy );
2979
2891
2980
                return this;
2892
                return this;
2981
        },
2893
        },
2982
       
2894
2983
        die: function( type, fn ){
2895
        die: function( type, fn ){
2984
                jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null );
2896
                jQuery( this.context ).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null );
2985
                return this;
2897
                return this;
2986
        }
2898
        }
2987
});
2899
});
2988
2900
2989
function liveHandler( event ){
2901
function liveHandler( event ){
2990
        var check = RegExp("(^|\\.)" + event.type + "(\\.|$)"),
2902
        var check = new RegExp("(^|\\.)" + event.type + "(\\.|$)"),
2991
                stop = true,
2903
                stop = true,
2992
                elems = [];
2904
                elems = [];
2993
2905
2994
        jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){
2906
        jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){
2995
                if ( check.test(fn.type) ) {
2907
                if ( check.test(fn.type) ) {
2996
                        var elem = jQuery(event.target).closest(fn.data)[0];
2908
                        var elem = jQuery(event.target).closest(fn.data)[0];
2997
                        if ( elem )
2909
                        if ( elem )
2998
                                elems.push({ elem: elem, fn: fn });
2910
                                elems.push({ elem: elem, fn: fn });
2999
                }
2911
                }
3000
        });
2912
        });
3001
2913
3002
        elems.sort(function(a,b) {
2914
        elems.sort(function(a,b) {
3003
                return jQuery.data(a.elem, "closest") - jQuery.data(b.elem, "closest");
2915
                return jQuery.data(a.elem, "closest") - jQuery.data(b.elem, "closest");
3004
        });
2916
        });
3005
       
2917
3006
        jQuery.each(elems, function(){
2918
        jQuery.each(elems, function(){
-
 
2919
                event.currentTarget = this.elem;
3007
                if ( this.fn.call(this.elem, event, this.fn.data) === false )
2920
                if ( this.fn.call(this.elem, event, this.fn.data) === false )
3008
                        return (stop = false);
2921
                        return (stop = false);
3009
        });
2922
        });
3010
2923
3011
        return stop;
2924
        return stop;
3012
}
2925
}
3013
2926
3014
function liveConvert(type, selector){
2927
function liveConvert(type, selector){
3015
        return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "|")].join(".");
2928
        return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "|")].join(".");
3016
}
2929
}
3017
2930
3018
jQuery.extend({
2931
jQuery.extend({
3019
        isReady: false,
2932
        isReady: false,
3020
        readyList: [],
2933
        readyList: [],
3021
        // Handle when the DOM is ready
2934
        // Handle when the DOM is ready
3022
        ready: function() {
2935
        ready: function() {
3023
                // Make sure that the DOM is not already loaded
2936
                // Make sure that the DOM is not already loaded
3024
                if ( !jQuery.isReady ) {
2937
                if ( !jQuery.isReady ) {
3025
                        // Remember that the DOM is ready
2938
                        // Remember that the DOM is ready
3026
                        jQuery.isReady = true;
2939
                        jQuery.isReady = true;
3027
2940
3028
                        // If there are functions bound, to execute
2941
                        // If there are functions bound, to execute
3029
                        if ( jQuery.readyList ) {
2942
                        if ( jQuery.readyList ) {
3030
                                // Execute all of them
2943
                                // Execute all of them
3031
                                jQuery.each( jQuery.readyList, function(){
2944
                                jQuery.each( jQuery.readyList, function(){
3032
                                        this.call( document, jQuery );
2945
                                        this.call( document, jQuery );
3033
                                });
2946
                                });
3034
2947
3035
                                // Reset the list of functions
2948
                                // Reset the list of functions
3036
                                jQuery.readyList = null;
2949
                                jQuery.readyList = null;
3037
                        }
2950
                        }
3038
2951
3039
                        // Trigger any bound ready events
2952
                        // Trigger any bound ready events
3040
                        jQuery(document).triggerHandler("ready");
2953
                        jQuery(document).triggerHandler("ready");
3041
                }
2954
                }
3042
        }
2955
        }
3043
});
2956
});
3044
2957
3045
var readyBound = false;
2958
var readyBound = false;
3046
2959
3047
function bindReady(){
2960
function bindReady(){
3048
        if ( readyBound ) return;
2961
        if ( readyBound ) return;
3049
        readyBound = true;
2962
        readyBound = true;
3050
2963
3051
        // Mozilla, Opera and webkit nightlies currently support this event
2964
        // Mozilla, Opera and webkit nightlies currently support this event
3052
        if ( document.addEventListener ) {
2965
        if ( document.addEventListener ) {
3053
                // Use the handy event callback
2966
                // Use the handy event callback
3054
                document.addEventListener( "DOMContentLoaded", function(){
2967
                document.addEventListener( "DOMContentLoaded", function(){
3055
                        document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
2968
                        document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
3056
                        jQuery.ready();
2969
                        jQuery.ready();
3057
                }, false );
2970
                }, false );
3058
2971
3059
        // If IE event model is used
2972
        // If IE event model is used
3060
        } else if ( document.attachEvent ) {
2973
        } else if ( document.attachEvent ) {
3061
                // ensure firing before onload,
2974
                // ensure firing before onload,
3062
                // maybe late but safe also for iframes
2975
                // maybe late but safe also for iframes
3063
                document.attachEvent("onreadystatechange", function(){
2976
                document.attachEvent("onreadystatechange", function(){
3064
                        if ( document.readyState === "complete" ) {
2977
                        if ( document.readyState === "complete" ) {
3065
                                document.detachEvent( "onreadystatechange", arguments.callee );
2978
                                document.detachEvent( "onreadystatechange", arguments.callee );
3066
                                jQuery.ready();
2979
                                jQuery.ready();
3067
                        }
2980
                        }
3068
                });
2981
                });
3069
2982
3070
                // If IE and not an iframe
2983
                // If IE and not an iframe
3071
                // continually check to see if the document is ready
2984
                // continually check to see if the document is ready
3072
                if ( document.documentElement.doScroll && window == window.top ) (function(){
2985
                if ( document.documentElement.doScroll && window == window.top ) (function(){
3073
                        if ( jQuery.isReady ) return;
2986
                        if ( jQuery.isReady ) return;
3074
2987
3075
                        try {
2988
                        try {
3076
                                // If IE is used, use the trick by Diego Perini
2989
                                // If IE is used, use the trick by Diego Perini
3077
                                // http://javascript.nwbox.com/IEContentLoaded/
2990
                                // http://javascript.nwbox.com/IEContentLoaded/
3078
                                document.documentElement.doScroll("left");
2991
                                document.documentElement.doScroll("left");
3079
                        } catch( error ) {
2992
                        } catch( error ) {
3080
                                setTimeout( arguments.callee, 0 );
2993
                                setTimeout( arguments.callee, 0 );
3081
                                return;
2994
                                return;
3082
                        }
2995
                        }
3083
2996
3084
                        // and execute any waiting functions
2997
                        // and execute any waiting functions
3085
                        jQuery.ready();
2998
                        jQuery.ready();
3086
                })();
2999
                })();
3087
        }
3000
        }
3088
3001
3089
        // A fallback to window.onload, that will always work
3002
        // A fallback to window.onload, that will always work
3090
        jQuery.event.add( window, "load", jQuery.ready );
3003
        jQuery.event.add( window, "load", jQuery.ready );
3091
}
3004
}
3092
3005
3093
jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
3006
jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
3094
        "mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," +
3007
        "mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," +
3095
        "change,select,submit,keydown,keypress,keyup,error").split(","), function(i, name){
3008
        "change,select,submit,keydown,keypress,keyup,error").split(","), function(i, name){
3096
3009
3097
        // Handle event binding
3010
        // Handle event binding
3098
        jQuery.fn[name] = function(fn){
3011
        jQuery.fn[name] = function(fn){
3099
                return fn ? this.bind(name, fn) : this.trigger(name);
3012
                return fn ? this.bind(name, fn) : this.trigger(name);
3100
        };
3013
        };
3101
});
3014
});
3102
3015
3103
// Prevent memory leaks in IE
3016
// Prevent memory leaks in IE
3104
// And prevent errors on refresh with events like mouseover in other browsers
3017
// And prevent errors on refresh with events like mouseover in other browsers
3105
// Window isn't included so as not to unbind existing unload events
3018
// Window isn't included so as not to unbind existing unload events
-
 
3019
// More info:
-
 
3020
//  - http://isaacschlueter.com/2006/10/msie-memory-leaks/
-
 
3021
//  - https://bugzilla.mozilla.org/show_bug.cgi?id=252542
3106
jQuery( window ).bind( 'unload', function(){
3022
jQuery( window ).bind( 'unload', function(){
3107
        for ( var id in jQuery.cache )
3023
        for ( var id in jQuery.cache )
3108
                // Skip the window
3024
                // Skip the window
3109
                if ( id != 1 && jQuery.cache[ id ].handle )
3025
                if ( id != 1 && jQuery.cache[ id ].handle )
3110
                        jQuery.event.remove( jQuery.cache[ id ].handle.elem );
3026
                        jQuery.event.remove( jQuery.cache[ id ].handle.elem );
3111
});
3027
});
3112
(function(){
3028
(function(){
3113
3029
3114
        jQuery.support = {};
3030
        jQuery.support = {};
3115
3031
3116
        var root = document.documentElement,
3032
        var root = document.documentElement,
3117
                script = document.createElement("script"),
3033
                script = document.createElement("script"),
3118
                div = document.createElement("div"),
3034
                div = document.createElement("div"),
3119
                id = "script" + (new Date).getTime();
3035
                id = "script" + (new Date).getTime();
3120
3036
3121
        div.style.display = "none";
3037
        div.style.display = "none";
3122
        div.innerHTML = '   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';
3038
        div.innerHTML = '   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select>';
3123
3039
3124
        var all = div.getElementsByTagName("*"),
3040
        var all = div.getElementsByTagName("*"),
3125
                a = div.getElementsByTagName("a")[0];
3041
                a = div.getElementsByTagName("a")[0];
3126
3042
3127
        // Can't get basic test support
3043
        // Can't get basic test support
3128
        if ( !all || !all.length || !a ) {
3044
        if ( !all || !all.length || !a ) {
3129
                return;
3045
                return;
3130
        }
3046
        }
3131
3047
3132
        jQuery.support = {
3048
        jQuery.support = {
3133
                // IE strips leading whitespace when .innerHTML is used
3049
                // IE strips leading whitespace when .innerHTML is used
3134
                leadingWhitespace: div.firstChild.nodeType == 3,
3050
                leadingWhitespace: div.firstChild.nodeType == 3,
3135
               
3051
3136
                // Make sure that tbody elements aren't automatically inserted
3052
                // Make sure that tbody elements aren't automatically inserted
3137
                // IE will insert them into empty tables
3053
                // IE will insert them into empty tables
3138
                tbody: !div.getElementsByTagName("tbody").length,
3054
                tbody: !div.getElementsByTagName("tbody").length,
3139
               
3055
3140
                // Make sure that you can get all elements in an <object> element
-
 
3141
                // IE 7 always returns no results
-
 
3142
                objectAll: !!div.getElementsByTagName("object")[0]
-
 
3143
                        .getElementsByTagName("*").length,
-
 
3144
               
-
 
3145
                // Make sure that link elements get serialized correctly by innerHTML
3056
                // Make sure that link elements get serialized correctly by innerHTML
3146
                // This requires a wrapper element in IE
3057
                // This requires a wrapper element in IE
3147
                htmlSerialize: !!div.getElementsByTagName("link").length,
3058
                htmlSerialize: !!div.getElementsByTagName("link").length,
3148
               
3059
3149
                // Get the style information from getAttribute
3060
                // Get the style information from getAttribute
3150
                // (IE uses .cssText insted)
3061
                // (IE uses .cssText insted)
3151
                style: /red/.test( a.getAttribute("style") ),
3062
                style: /red/.test( a.getAttribute("style") ),
3152
               
3063
3153
                // Make sure that URLs aren't manipulated
3064
                // Make sure that URLs aren't manipulated
3154
                // (IE normalizes it by default)
3065
                // (IE normalizes it by default)
3155
                hrefNormalized: a.getAttribute("href") === "/a",
3066
                hrefNormalized: a.getAttribute("href") === "/a",
3156
               
3067
3157
                // Make sure that element opacity exists
3068
                // Make sure that element opacity exists
3158
                // (IE uses filter instead)
3069
                // (IE uses filter instead)
3159
                opacity: a.style.opacity === "0.5",
3070
                opacity: a.style.opacity === "0.5",
3160
               
3071
3161
                // Verify style float existence
3072
                // Verify style float existence
3162
                // (IE uses styleFloat instead of cssFloat)
3073
                // (IE uses styleFloat instead of cssFloat)
3163
                cssFloat: !!a.style.cssFloat,
3074
                cssFloat: !!a.style.cssFloat,
3164
3075
3165
                // Will be defined later
3076
                // Will be defined later
3166
                scriptEval: false,
3077
                scriptEval: false,
3167
                noCloneEvent: true,
3078
                noCloneEvent: true,
3168
                boxModel: null
3079
                boxModel: null
3169
        };
3080
        };
3170
       
3081
3171
        script.type = "text/javascript";
3082
        script.type = "text/javascript";
3172
        try {
3083
        try {
3173
                script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
3084
                script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
3174
        } catch(e){}
3085
        } catch(e){}
3175
3086
3176
        root.insertBefore( script, root.firstChild );
3087
        root.insertBefore( script, root.firstChild );
3177
       
3088
3178
        // Make sure that the execution of code works by injecting a script
3089
        // Make sure that the execution of code works by injecting a script
3179
        // tag with appendChild/createTextNode
3090
        // tag with appendChild/createTextNode
3180
        // (IE doesn't support this, fails, and uses .text instead)
3091
        // (IE doesn't support this, fails, and uses .text instead)
3181
        if ( window[ id ] ) {
3092
        if ( window[ id ] ) {
3182
                jQuery.support.scriptEval = true;
3093
                jQuery.support.scriptEval = true;
3183
                delete window[ id ];
3094
                delete window[ id ];
3184
        }
3095
        }
3185
3096
3186
        root.removeChild( script );
3097
        root.removeChild( script );
3187
3098
3188
        if ( div.attachEvent && div.fireEvent ) {
3099
        if ( div.attachEvent && div.fireEvent ) {
3189
                div.attachEvent("onclick", function(){
3100
                div.attachEvent("onclick", function click(){
3190
                        // Cloning a node shouldn't copy over any
3101
                        // Cloning a node shouldn't copy over any
3191
                        // bound event handlers (IE does this)
3102
                        // bound event handlers (IE does this)
3192
                        jQuery.support.noCloneEvent = false;
3103
                        jQuery.support.noCloneEvent = false;
3193
                        div.detachEvent("onclick", arguments.callee);
3104
                        div.detachEvent("onclick", click);
3194
                });
3105
                });
3195
                div.cloneNode(true).fireEvent("onclick");
3106
                div.cloneNode(true).fireEvent("onclick");
3196
        }
3107
        }
3197
3108
3198
        // Figure out if the W3C box model works as expected
3109
        // Figure out if the W3C box model works as expected
3199
        // document.body must exist before we can do this
3110
        // document.body must exist before we can do this
3200
        jQuery(function(){
3111
        jQuery(function(){
3201
                var div = document.createElement("div");
3112
                var div = document.createElement("div");
3202
                div.style.width = div.style.paddingLeft = "1px";
3113
                div.style.width = div.style.paddingLeft = "1px";
3203
3114
3204
                document.body.appendChild( div );
3115
                document.body.appendChild( div );
3205
                jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
3116
                jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
3206
                document.body.removeChild( div ).style.display = 'none';
3117
                document.body.removeChild( div ).style.display = 'none';
3207
        });
3118
        });
3208
})();
3119
})();
3209
3120
3210
var styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat";
-
 
3211
-
 
3212
jQuery.props = {
3121
jQuery.props = {
3213
        "for": "htmlFor",
3122
        "for": "htmlFor",
3214
        "class": "className",
3123
        "class": "className",
3215
        "float": styleFloat,
-
 
3216
        cssFloat: styleFloat,
-
 
3217
        styleFloat: styleFloat,
-
 
3218
        readonly: "readOnly",
3124
        readonly: "readOnly",
3219
        maxlength: "maxLength",
3125
        maxlength: "maxLength",
3220
        cellspacing: "cellSpacing",
3126
        cellspacing: "cellSpacing",
3221
        rowspan: "rowSpan",
3127
        rowspan: "rowSpan",
3222
        tabindex: "tabIndex"
3128
        tabindex: "tabIndex"
3223
};
3129
};
-
 
3130
// exclude the following css properties to add px
-
 
3131
var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
-
 
3132
        // cache defaultView
-
 
3133
        defaultView = document.defaultView || {},
-
 
3134
        // normalize float css property
-
 
3135
        styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat";
-
 
3136
-
 
3137
jQuery.fn.css = function( name, value ) {
-
 
3138
        var options = name, isFunction = jQuery.isFunction( value );
-
 
3139
-
 
3140
        // ignore negative width and height values
-
 
3141
        if ( (name == 'width' || name == 'height') && parseFloat(value) < 0 )
-
 
3142
                value = undefined;
-
 
3143
-
 
3144
        if ( typeof name === "string" ) {
-
 
3145
                // Are we setting the style?
-
 
3146
                if ( value === undefined ) {
-
 
3147
                        return this.length ?
-
 
3148
                                jQuery.css( this[0], name ) :
-
 
3149
                                null;
-
 
3150
-
 
3151
                // Convert name, value params to options hash format
-
 
3152
                } else {
-
 
3153
                        options = {};
-
 
3154
                        options[ name ] = value;
-
 
3155
                }
-
 
3156
        }
-
 
3157
-
 
3158
        // For each element...
-
 
3159
        for ( var i = 0, l = this.length; i < l; i++ ) {
-
 
3160
                var elem = this[i];
-
 
3161
-
 
3162
                // Set all the styles
-
 
3163
                for ( var prop in options ) {
-
 
3164
                        value = options[prop];
-
 
3165
-
 
3166
                        if ( isFunction ) {
-
 
3167
                                value = value.call( elem, i );
-
 
3168
                        }
-
 
3169
-
 
3170
                        if ( typeof value === "number" && !exclude.test(prop) ) {
-
 
3171
                                value = value + "px";
-
 
3172
                        }
-
 
3173
-
 
3174
                        jQuery.style( elem, prop, value );
-
 
3175
                }
-
 
3176
        }
-
 
3177
-
 
3178
        return this;
-
 
3179
};
-
 
3180
-
 
3181
jQuery.extend({
-
 
3182
        style: function( elem, name, value ) {
-
 
3183
                // don't set styles on text and comment nodes
-
 
3184
                if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
-
 
3185
                        return undefined;
-
 
3186
-
 
3187
                var style = elem.style || elem, set = value !== undefined;
-
 
3188
-
 
3189
                // IE uses filters for opacity
-
 
3190
                if ( !jQuery.support.opacity && name == "opacity" ) {
-
 
3191
                        if ( set ) {
-
 
3192
                                // IE has trouble with opacity if it does not have layout
-
 
3193
                                // Force it by setting the zoom level
-
 
3194
                                style.zoom = 1;
-
 
3195
-
 
3196
                                // Set the alpha filter to set the opacity
-
 
3197
                                style.filter = (style.filter || "").replace( /alpha\([^)]*\)/, "" ) +
-
 
3198
                                        (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
-
 
3199
                        }
-
 
3200
-
 
3201
                        return style.filter && style.filter.indexOf("opacity=") >= 0 ?
-
 
3202
                                (parseFloat( style.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
-
 
3203
                                "";
-
 
3204
                }
-
 
3205
-
 
3206
                // Make sure we're using the right name for getting the float value
-
 
3207
                if ( /float/i.test( name ) )
-
 
3208
                        name = styleFloat;
-
 
3209
-
 
3210
                name = name.replace(/-([a-z])/ig, function(all, letter){
-
 
3211
                        return letter.toUpperCase();
-
 
3212
                });
-
 
3213
-
 
3214
                if ( set )
-
 
3215
                        style[ name ] = value;
-
 
3216
-
 
3217
                return style[ name ];
-
 
3218
        },
-
 
3219
-
 
3220
        css: function( elem, name, force, extra ) {
-
 
3221
                if ( name == "width" || name == "height" ) {
-
 
3222
                        var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
-
 
3223
-
 
3224
                        function getWH() {
-
 
3225
                                val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
-
 
3226
-
 
3227
                                if ( extra === "border" )
-
 
3228
                                        return;
-
 
3229
-
 
3230
                                jQuery.each( which, function() {
-
 
3231
                                        if ( !extra )
-
 
3232
                                                val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
-
 
3233
                                        if ( extra === "margin" )
-
 
3234
                                                val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
-
 
3235
                                        else
-
 
3236
                                                val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
-
 
3237
                                });
-
 
3238
                        }
-
 
3239
-
 
3240
                        if ( elem.offsetWidth !== 0 )
-
 
3241
                                getWH();
-
 
3242
                        else
-
 
3243
                                jQuery.swap( elem, props, getWH );
-
 
3244
-
 
3245
                        return Math.max(0, Math.round(val));
-
 
3246
                }
-
 
3247
-
 
3248
                return jQuery.curCSS( elem, name, force );
-
 
3249
        },
-
 
3250
-
 
3251
        curCSS: function( elem, name, force ) {
-
 
3252
                var ret, style = elem.style;
-
 
3253
-
 
3254
                // IE uses filters for opacity
-
 
3255
                if ( !jQuery.support.opacity && name == "opacity" ) {
-
 
3256
                        ret = style.filter && style.filter.indexOf("opacity=") >= 0 ?
-
 
3257
                                (parseFloat( style.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
-
 
3258
                                "";
-
 
3259
-
 
3260
                        return ret === "" ?
-
 
3261
                                "1" :
-
 
3262
                                ret;
-
 
3263
                }
-
 
3264
-
 
3265
                // Make sure we're using the right name for getting the float value
-
 
3266
                if ( /float/i.test( name ) )
-
 
3267
                        name = styleFloat;
-
 
3268
-
 
3269
                if ( !force && style && style[ name ] ) {
-
 
3270
                        ret = style[ name ];
-
 
3271
-
 
3272
                } else if ( defaultView.getComputedStyle ) {
-
 
3273
-
 
3274
                        // Only "float" is needed here
-
 
3275
                        if ( /float/i.test( name ) )
-
 
3276
                                name = "float";
-
 
3277
-
 
3278
                        name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
-
 
3279
-
 
3280
                        var computedStyle = defaultView.getComputedStyle( elem, null );
-
 
3281
-
 
3282
                        if ( computedStyle )
-
 
3283
                                ret = computedStyle.getPropertyValue( name );
-
 
3284
-
 
3285
                        // We should always get a number back from opacity
-
 
3286
                        if ( name == "opacity" && ret == "" )
-
 
3287
                                ret = "1";
-
 
3288
-
 
3289
                } else if ( elem.currentStyle ) {
-
 
3290
                        var camelCase = name.replace(/\-(\w)/g, function(all, letter){
-
 
3291
                                return letter.toUpperCase();
-
 
3292
                        });
-
 
3293
-
 
3294
                        ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
-
 
3295
-
 
3296
                        // From the awesome hack by Dean Edwards
-
 
3297
                        // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-
 
3298
-
 
3299
                        // If we're not dealing with a regular pixel number
-
 
3300
                        // but a number that has a weird ending, we need to convert it to pixels
-
 
3301
                        if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
-
 
3302
                                // Remember the original values
-
 
3303
                                var left = style.left, rsLeft = elem.runtimeStyle.left;
-
 
3304
-
 
3305
                                // Put in the new values to get a computed value out
-
 
3306
                                elem.runtimeStyle.left = elem.currentStyle.left;
-
 
3307
                                style.left = ret || 0;
-
 
3308
                                ret = style.pixelLeft + "px";
-
 
3309
-
 
3310
                                // Revert the changed values
-
 
3311
                                style.left = left;
-
 
3312
                                elem.runtimeStyle.left = rsLeft;
-
 
3313
                        }
-
 
3314
                }
-
 
3315
-
 
3316
                return ret;
-
 
3317
        },
-
 
3318
-
 
3319
        // A method for quickly swapping in/out CSS properties to get correct calculations
-
 
3320
        swap: function( elem, options, callback ) {
-
 
3321
                var old = {};
-
 
3322
                // Remember the old values, and insert the new ones
-
 
3323
                for ( var name in options ) {
-
 
3324
                        old[ name ] = elem.style[ name ];
-
 
3325
                        elem.style[ name ] = options[ name ];
-
 
3326
                }
-
 
3327
-
 
3328
                callback.call( elem );
-
 
3329
-
 
3330
                // Revert the old values
-
 
3331
                for ( var name in options )
-
 
3332
                        elem.style[ name ] = old[ name ];
-
 
3333
        }
3224
jQuery.fn.extend({
3334
});jQuery.fn.extend({
3225
        // Keep a copy of the old load
3335
        // Keep a copy of the old load
3226
        _load: jQuery.fn.load,
3336
        _load: jQuery.fn.load,
3227
3337
3228
        load: function( url, params, callback ) {
3338
        load: function( url, params, callback ) {
3229
                if ( typeof url !== "string" )
3339
                if ( typeof url !== "string" )
3230
                        return this._load( url );
3340
                        return this._load( url );
3231
3341
3232
                var off = url.indexOf(" ");
3342
                var off = url.indexOf(" ");
3233
                if ( off >= 0 ) {
3343
                if ( off >= 0 ) {
3234
                        var selector = url.slice(off, url.length);
3344
                        var selector = url.slice(off, url.length);
3235
                        url = url.slice(0, off);
3345
                        url = url.slice(0, off);
3236
                }
3346
                }
3237
3347
3238
                // Default to a GET request
3348
                // Default to a GET request
3239
                var type = "GET";
3349
                var type = "GET";
3240
3350
3241
                // If the second parameter was provided
3351
                // If the second parameter was provided
3242
                if ( params )
3352
                if ( params )
3243
                        // If it's a function
3353
                        // If it's a function
3244
                        if ( jQuery.isFunction( params ) ) {
3354
                        if ( jQuery.isFunction( params ) ) {
3245
                                // We assume that it's the callback
3355
                                // We assume that it's the callback
3246
                                callback = params;
3356
                                callback = params;
3247
                                params = null;
3357
                                params = null;
3248
3358
3249
                        // Otherwise, build a param string
3359
                        // Otherwise, build a param string
3250
                        } else if( typeof params === "object" ) {
3360
                        } else if( typeof params === "object" ) {
3251
                                params = jQuery.param( params );
3361
                                params = jQuery.param( params );
3252
                                type = "POST";
3362
                                type = "POST";
3253
                        }
3363
                        }
3254
3364
3255
                var self = this;
3365
                var self = this;
3256
3366
3257
                // Request the remote document
3367
                // Request the remote document
3258
                jQuery.ajax({
3368
                jQuery.ajax({
3259
                        url: url,
3369
                        url: url,
3260
                        type: type,
3370
                        type: type,
3261
                        dataType: "html",
3371
                        dataType: "html",
3262
                        data: params,
3372
                        data: params,
3263
                        complete: function(res, status){
3373
                        complete: function(res, status){
3264
                                // If successful, inject the HTML into all the matched elements
3374
                                // If successful, inject the HTML into all the matched elements
3265
                                if ( status == "success" || status == "notmodified" )
3375
                                if ( status == "success" || status == "notmodified" )
3266
                                        // See if a selector was specified
3376
                                        // See if a selector was specified
3267
                                        self.html( selector ?
3377
                                        self.html( selector ?
3268
                                                // Create a dummy div to hold the results
3378
                                                // Create a dummy div to hold the results
3269
                                                jQuery("<div/>")
3379
                                                jQuery("<div/>")
3270
                                                        // inject the contents of the document in, removing the scripts
3380
                                                        // inject the contents of the document in, removing the scripts
3271
                                                        // to avoid any 'Permission Denied' errors in IE
3381
                                                        // to avoid any 'Permission Denied' errors in IE
3272
                                                        .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
3382
                                                        .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
3273
3383
3274
                                                        // Locate the specified elements
3384
                                                        // Locate the specified elements
3275
                                                        .find(selector) :
3385
                                                        .find(selector) :
3276
3386
3277
                                                // If not, just inject the full result
3387
                                                // If not, just inject the full result
3278
                                                res.responseText );
3388
                                                res.responseText );
3279
3389
3280
                                if( callback )
3390
                                if( callback )
3281
                                        self.each( callback, [res.responseText, status, res] );
3391
                                        self.each( callback, [res.responseText, status, res] );
3282
                        }
3392
                        }
3283
                });
3393
                });
3284
                return this;
3394
                return this;
3285
        },
3395
        },
3286
3396
3287
        serialize: function() {
3397
        serialize: function() {
3288
                return jQuery.param(this.serializeArray());
3398
                return jQuery.param(this.serializeArray());
3289
        },
3399
        },
3290
        serializeArray: function() {
3400
        serializeArray: function() {
3291
                return this.map(function(){
3401
                return this.map(function(){
3292
                        return this.elements ? jQuery.makeArray(this.elements) : this;
3402
                        return this.elements ? jQuery.makeArray(this.elements) : this;
3293
                })
3403
                })
3294
                .filter(function(){
3404
                .filter(function(){
3295
                        return this.name && !this.disabled &&
3405
                        return this.name && !this.disabled &&
3296
                                (this.checked || /select|textarea/i.test(this.nodeName) ||
3406
                                (this.checked || /select|textarea/i.test(this.nodeName) ||
3297
                                        /text|hidden|password|search/i.test(this.type));
3407
                                        /text|hidden|password|search/i.test(this.type));
3298
                })
3408
                })
3299
                .map(function(i, elem){
3409
                .map(function(i, elem){
3300
                        var val = jQuery(this).val();
3410
                        var val = jQuery(this).val();
3301
                        return val == null ? null :
3411
                        return val == null ? null :
3302
                                jQuery.isArray(val) ?
3412
                                jQuery.isArray(val) ?
3303
                                        jQuery.map( val, function(val, i){
3413
                                        jQuery.map( val, function(val, i){
3304
                                                return {name: elem.name, value: val};
3414
                                                return {name: elem.name, value: val};
3305
                                        }) :
3415
                                        }) :
3306
                                        {name: elem.name, value: val};
3416
                                        {name: elem.name, value: val};
3307
                }).get();
3417
                }).get();
3308
        }
3418
        }
3309
});
3419
});
3310
3420
3311
// Attach a bunch of functions for handling common AJAX events
3421
// Attach a bunch of functions for handling common AJAX events
3312
jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
3422
jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
3313
        jQuery.fn[o] = function(f){
3423
        jQuery.fn[o] = function(f){
3314
                return this.bind(o, f);
3424
                return this.bind(o, f);
3315
        };
3425
        };
3316
});
3426
});
3317
3427
3318
var jsc = now();
3428
var jsc = now();
3319
3429
3320
jQuery.extend({
3430
jQuery.extend({
3321
 
3431
3322
        get: function( url, data, callback, type ) {
3432
        get: function( url, data, callback, type ) {
3323
                // shift arguments if data argument was ommited
3433
                // shift arguments if data argument was ommited
3324
                if ( jQuery.isFunction( data ) ) {
3434
                if ( jQuery.isFunction( data ) ) {
3325
                        callback = data;
3435
                        callback = data;
3326
                        data = null;
3436
                        data = null;
3327
                }
3437
                }
3328
3438
3329
                return jQuery.ajax({
3439
                return jQuery.ajax({
3330
                        type: "GET",
3440
                        type: "GET",
3331
                        url: url,
3441
                        url: url,
3332
                        data: data,
3442
                        data: data,
3333
                        success: callback,
3443
                        success: callback,
3334
                        dataType: type
3444
                        dataType: type
3335
                });
3445
                });
3336
        },
3446
        },
3337
3447
3338
        getScript: function( url, callback ) {
3448
        getScript: function( url, callback ) {
3339
                return jQuery.get(url, null, callback, "script");
3449
                return jQuery.get(url, null, callback, "script");
3340
        },
3450
        },
3341
3451
3342
        getJSON: function( url, data, callback ) {
3452
        getJSON: function( url, data, callback ) {
3343
                return jQuery.get(url, data, callback, "json");
3453
                return jQuery.get(url, data, callback, "json");
3344
        },
3454
        },
3345
3455
3346
        post: function( url, data, callback, type ) {
3456
        post: function( url, data, callback, type ) {
3347
                if ( jQuery.isFunction( data ) ) {
3457
                if ( jQuery.isFunction( data ) ) {
3348
                        callback = data;
3458
                        callback = data;
3349
                        data = {};
3459
                        data = {};
3350
                }
3460
                }
3351
3461
3352
                return jQuery.ajax({
3462
                return jQuery.ajax({
3353
                        type: "POST",
3463
                        type: "POST",
3354
                        url: url,
3464
                        url: url,
3355
                        data: data,
3465
                        data: data,
3356
                        success: callback,
3466
                        success: callback,
3357
                        dataType: type
3467
                        dataType: type
3358
                });
3468
                });
3359
        },
3469
        },
3360
3470
3361
        ajaxSetup: function( settings ) {
3471
        ajaxSetup: function( settings ) {
3362
                jQuery.extend( jQuery.ajaxSettings, settings );
3472
                jQuery.extend( jQuery.ajaxSettings, settings );
3363
        },
3473
        },
3364
3474
3365
        ajaxSettings: {
3475
        ajaxSettings: {
3366
                url: location.href,
3476
                url: location.href,
3367
                global: true,
3477
                global: true,
3368
                type: "GET",
3478
                type: "GET",
3369
                contentType: "application/x-www-form-urlencoded",
3479
                contentType: "application/x-www-form-urlencoded",
3370
                processData: true,
3480
                processData: true,
3371
                async: true,
3481
                async: true,
3372
                /*
3482
                /*
3373
                timeout: 0,
3483
                timeout: 0,
3374
                data: null,
3484
                data: null,
3375
                username: null,
3485
                username: null,
3376
                password: null,
3486
                password: null,
3377
                */
3487
                */
3378
                // Create the request object; Microsoft failed to properly
3488
                // Create the request object; Microsoft failed to properly
3379
                // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
3489
                // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
3380
                // This function can be overriden by calling jQuery.ajaxSetup
3490
                // This function can be overriden by calling jQuery.ajaxSetup
3381
                xhr:function(){
3491
                xhr:function(){
3382
                        return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
3492
                        return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
3383
                },
3493
                },
3384
                accepts: {
3494
                accepts: {
3385
                        xml: "application/xml, text/xml",
3495
                        xml: "application/xml, text/xml",
3386
                        html: "text/html",
3496
                        html: "text/html",
3387
                        script: "text/javascript, application/javascript",
3497
                        script: "text/javascript, application/javascript",
3388
                        json: "application/json, text/javascript",
3498
                        json: "application/json, text/javascript",
3389
                        text: "text/plain",
3499
                        text: "text/plain",
3390
                        _default: "*/*"
3500
                        _default: "*/*"
3391
                }
3501
                }
3392
        },
3502
        },
3393
3503
3394
        // Last-Modified header cache for next request
3504
        // Last-Modified header cache for next request
3395
        lastModified: {},
3505
        lastModified: {},
3396
3506
3397
        ajax: function( s ) {
3507
        ajax: function( s ) {
3398
                // Extend the settings, but re-extend 's' so that it can be
3508
                // Extend the settings, but re-extend 's' so that it can be
3399
                // checked again later (in the test suite, specifically)
3509
                // checked again later (in the test suite, specifically)
3400
                s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
3510
                s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
3401
3511
3402
                var jsonp, jsre = /=\?(&|$)/g, status, data,
3512
                var jsonp, jsre = /=\?(&|$)/g, status, data,
3403
                        type = s.type.toUpperCase();
3513
                        type = s.type.toUpperCase();
3404
3514
3405
                // convert data if not already a string
3515
                // convert data if not already a string
3406
                if ( s.data && s.processData && typeof s.data !== "string" )
3516
                if ( s.data && s.processData && typeof s.data !== "string" )
3407
                        s.data = jQuery.param(s.data);
3517
                        s.data = jQuery.param(s.data);
3408
3518
3409
                // Handle JSONP Parameter Callbacks
3519
                // Handle JSONP Parameter Callbacks
3410
                if ( s.dataType == "jsonp" ) {
3520
                if ( s.dataType == "jsonp" ) {
3411
                        if ( type == "GET" ) {
3521
                        if ( type == "GET" ) {
3412
                                if ( !s.url.match(jsre) )
3522
                                if ( !s.url.match(jsre) )
3413
                                        s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
3523
                                        s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
3414
                        } else if ( !s.data || !s.data.match(jsre) )
3524
                        } else if ( !s.data || !s.data.match(jsre) )
3415
                                s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
3525
                                s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
3416
                        s.dataType = "json";
3526
                        s.dataType = "json";
3417
                }
3527
                }
3418
3528
3419
                // Build temporary JSONP function
3529
                // Build temporary JSONP function
3420
                if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
3530
                if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
3421
                        jsonp = "jsonp" + jsc++;
3531
                        jsonp = "jsonp" + jsc++;
3422
3532
3423
                        // Replace the =? sequence both in the query string and the data
3533
                        // Replace the =? sequence both in the query string and the data
3424
                        if ( s.data )
3534
                        if ( s.data )
3425
                                s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
3535
                                s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
3426
                        s.url = s.url.replace(jsre, "=" + jsonp + "$1");
3536
                        s.url = s.url.replace(jsre, "=" + jsonp + "$1");
3427
3537
3428
                        // We need to make sure
3538
                        // We need to make sure
3429
                        // that a JSONP style response is executed properly
3539
                        // that a JSONP style response is executed properly
3430
                        s.dataType = "script";
3540
                        s.dataType = "script";
3431
3541
3432
                        // Handle JSONP-style loading
3542
                        // Handle JSONP-style loading
3433
                        window[ jsonp ] = function(tmp){
3543
                        window[ jsonp ] = function(tmp){
3434
                                data = tmp;
3544
                                data = tmp;
3435
                                success();
3545
                                success();
3436
                                complete();
3546
                                complete();
3437
                                // Garbage collect
3547
                                // Garbage collect
3438
                                window[ jsonp ] = undefined;
3548
                                window[ jsonp ] = undefined;
3439
                                try{ delete window[ jsonp ]; } catch(e){}
3549
                                try{ delete window[ jsonp ]; } catch(e){}
3440
                                if ( head )
3550
                                if ( head )
3441
                                        head.removeChild( script );
3551
                                        head.removeChild( script );
3442
                        };
3552
                        };
3443
                }
3553
                }
3444
3554
3445
                if ( s.dataType == "script" && s.cache == null )
3555
                if ( s.dataType == "script" && s.cache == null )
3446
                        s.cache = false;
3556
                        s.cache = false;
3447
3557
3448
                if ( s.cache === false && type == "GET" ) {
3558
                if ( s.cache === false && type == "GET" ) {
3449
                        var ts = now();
3559
                        var ts = now();
3450
                        // try replacing _= if it is there
3560
                        // try replacing _= if it is there
3451
                        var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
3561
                        var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
3452
                        // if nothing was replaced, add timestamp to the end
3562
                        // if nothing was replaced, add timestamp to the end
3453
                        s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
3563
                        s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
3454
                }
3564
                }
3455
3565
3456
                // If data is available, append data to url for get requests
3566
                // If data is available, append data to url for get requests
3457
                if ( s.data && type == "GET" ) {
3567
                if ( s.data && type == "GET" ) {
3458
                        s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
3568
                        s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
3459
3569
3460
                        // IE likes to send both get and post data, prevent this
3570
                        // IE likes to send both get and post data, prevent this
3461
                        s.data = null;
3571
                        s.data = null;
3462
                }
3572
                }
3463
3573
3464
                // Watch for a new set of requests
3574
                // Watch for a new set of requests
3465
                if ( s.global && ! jQuery.active++ )
3575
                if ( s.global && ! jQuery.active++ )
3466
                        jQuery.event.trigger( "ajaxStart" );
3576
                        jQuery.event.trigger( "ajaxStart" );
3467
3577
3468
                // Matches an absolute URL, and saves the domain
3578
                // Matches an absolute URL, and saves the domain
3469
                var parts = /^(\w+:)?\/\/([^\/?#]+)/.exec( s.url );
3579
                var parts = /^(\w+:)?\/\/([^\/?#]+)/.exec( s.url );
3470
3580
3471
                // If we're requesting a remote document
3581
                // If we're requesting a remote document
3472
                // and trying to load JSON or Script with a GET
3582
                // and trying to load JSON or Script with a GET
3473
                if ( s.dataType == "script" && type == "GET" && parts
3583
                if ( s.dataType == "script" && type == "GET" && parts
3474
                        && ( parts[1] && parts[1] != location.protocol || parts[2] != location.host )){
3584
                        && ( parts[1] && parts[1] != location.protocol || parts[2] != location.host )){
3475
3585
3476
                        var head = document.getElementsByTagName("head")[0];
3586
                        var head = document.getElementsByTagName("head")[0];
3477
                        var script = document.createElement("script");
3587
                        var script = document.createElement("script");
3478
                        script.src = s.url;
3588
                        script.src = s.url;
3479
                        if (s.scriptCharset)
3589
                        if (s.scriptCharset)
3480
                                script.charset = s.scriptCharset;
3590
                                script.charset = s.scriptCharset;
3481
3591
3482
                        // Handle Script loading
3592
                        // Handle Script loading
3483
                        if ( !jsonp ) {
3593
                        if ( !jsonp ) {
3484
                                var done = false;
3594
                                var done = false;
3485
3595
3486
                                // Attach handlers for all browsers
3596
                                // Attach handlers for all browsers
3487
                                script.onload = script.onreadystatechange = function(){
3597
                                script.onload = script.onreadystatechange = function(){
3488
                                        if ( !done && (!this.readyState ||
3598
                                        if ( !done && (!this.readyState ||
3489
                                                        this.readyState == "loaded" || this.readyState == "complete") ) {
3599
                                                        this.readyState == "loaded" || this.readyState == "complete") ) {
3490
                                                done = true;
3600
                                                done = true;
3491
                                                success();
3601
                                                success();
3492
                                                complete();
3602
                                                complete();
3493
3603
3494
                                                // Handle memory leak in IE
3604
                                                // Handle memory leak in IE
3495
                                                script.onload = script.onreadystatechange = null;
3605
                                                script.onload = script.onreadystatechange = null;
3496
                                                head.removeChild( script );
3606
                                                head.removeChild( script );
3497
                                        }
3607
                                        }
3498
                                };
3608
                                };
3499
                        }
3609
                        }
3500
3610
-
 
3611
                        // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
-
 
3612
                        // This arises when a base node is used (#2709 and #4378).
3501
                        head.appendChild(script);
3613
                        head.insertBefore( script, head.firstChild );
3502
3614
3503
                        // We handle everything using the script element injection
3615
                        // We handle everything using the script element injection
3504
                        return undefined;
3616
                        return undefined;
3505
                }
3617
                }
3506
3618
3507
                var requestDone = false;
3619
                var requestDone = false;
3508
3620
3509
                // Create the request object
3621
                // Create the request object
3510
                var xhr = s.xhr();
3622
                var xhr = s.xhr();
3511
3623
3512
                // Open the socket
3624
                // Open the socket
3513
                // Passing null username, generates a login popup on Opera (#2865)
3625
                // Passing null username, generates a login popup on Opera (#2865)
3514
                if( s.username )
3626
                if( s.username )
3515
                        xhr.open(type, s.url, s.async, s.username, s.password);
3627
                        xhr.open(type, s.url, s.async, s.username, s.password);
3516
                else
3628
                else
3517
                        xhr.open(type, s.url, s.async);
3629
                        xhr.open(type, s.url, s.async);
3518
3630
3519
                // Need an extra try/catch for cross domain requests in Firefox 3
3631
                // Need an extra try/catch for cross domain requests in Firefox 3
3520
                try {
3632
                try {
3521
                        // Set the correct header, if data is being sent
3633
                        // Set the correct header, if data is being sent
3522
                        if ( s.data )
3634
                        if ( s.data )
3523
                                xhr.setRequestHeader("Content-Type", s.contentType);
3635
                                xhr.setRequestHeader("Content-Type", s.contentType);
3524
3636
3525
                        // Set the If-Modified-Since header, if ifModified mode.
3637
                        // Set the If-Modified-Since header, if ifModified mode.
3526
                        if ( s.ifModified )
3638
                        if ( s.ifModified )
3527
                                xhr.setRequestHeader("If-Modified-Since",
3639
                                xhr.setRequestHeader("If-Modified-Since",
3528
                                        jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
3640
                                        jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
3529
3641
3530
                        // Set header so the called script knows that it's an XMLHttpRequest
3642
                        // Set header so the called script knows that it's an XMLHttpRequest
3531
                        xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
3643
                        xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
3532
3644
3533
                        // Set the Accepts header for the server, depending on the dataType
3645
                        // Set the Accepts header for the server, depending on the dataType
3534
                        xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
3646
                        xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
3535
                                s.accepts[ s.dataType ] + ", */*" :
3647
                                s.accepts[ s.dataType ] + ", */*" :
3536
                                s.accepts._default );
3648
                                s.accepts._default );
3537
                } catch(e){}
3649
                } catch(e){}
3538
3650
3539
                // Allow custom headers/mimetypes and early abort
3651
                // Allow custom headers/mimetypes and early abort
3540
                if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
3652
                if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
3541
                        // Handle the global AJAX counter
3653
                        // Handle the global AJAX counter
3542
                        if ( s.global && ! --jQuery.active )
3654
                        if ( s.global && ! --jQuery.active )
3543
                                jQuery.event.trigger( "ajaxStop" );
3655
                                jQuery.event.trigger( "ajaxStop" );
3544
                        // close opended socket
3656
                        // close opended socket
3545
                        xhr.abort();
3657
                        xhr.abort();
3546
                        return false;
3658
                        return false;
3547
                }
3659
                }
3548
3660
3549
                if ( s.global )
3661
                if ( s.global )
3550
                        jQuery.event.trigger("ajaxSend", [xhr, s]);
3662
                        jQuery.event.trigger("ajaxSend", [xhr, s]);
3551
3663
3552
                // Wait for a response to come back
3664
                // Wait for a response to come back
3553
                var onreadystatechange = function(isTimeout){
3665
                var onreadystatechange = function(isTimeout){
3554
                        // The request was aborted, clear the interval and decrement jQuery.active
3666
                        // The request was aborted, clear the interval and decrement jQuery.active
3555
                        if (xhr.readyState == 0) {
3667
                        if (xhr.readyState == 0) {
3556
                                if (ival) {
3668
                                if (ival) {
3557
                                        // clear poll interval
3669
                                        // clear poll interval
3558
                                        clearInterval(ival);
3670
                                        clearInterval(ival);
3559
                                        ival = null;
3671
                                        ival = null;
3560
                                        // Handle the global AJAX counter
3672
                                        // Handle the global AJAX counter
3561
                                        if ( s.global && ! --jQuery.active )
3673
                                        if ( s.global && ! --jQuery.active )
3562
                                                jQuery.event.trigger( "ajaxStop" );
3674
                                                jQuery.event.trigger( "ajaxStop" );
3563
                                }
3675
                                }
3564
                        // The transfer is complete and the data is available, or the request timed out
3676
                        // The transfer is complete and the data is available, or the request timed out
3565
                        } else if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
3677
                        } else if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
3566
                                requestDone = true;
3678
                                requestDone = true;
3567
3679
3568
                                // clear poll interval
3680
                                // clear poll interval
3569
                                if (ival) {
3681
                                if (ival) {
3570
                                        clearInterval(ival);
3682
                                        clearInterval(ival);
3571
                                        ival = null;
3683
                                        ival = null;
3572
                                }
3684
                                }
3573
3685
3574
                                status = isTimeout == "timeout" ? "timeout" :
3686
                                status = isTimeout == "timeout" ? "timeout" :
3575
                                        !jQuery.httpSuccess( xhr ) ? "error" :
3687
                                        !jQuery.httpSuccess( xhr ) ? "error" :
3576
                                        s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? "notmodified" :
3688
                                        s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? "notmodified" :
3577
                                        "success";
3689
                                        "success";
3578
3690
3579
                                if ( status == "success" ) {
3691
                                if ( status == "success" ) {
3580
                                        // Watch for, and catch, XML document parse errors
3692
                                        // Watch for, and catch, XML document parse errors
3581
                                        try {
3693
                                        try {
3582
                                                // process the data (runs the xml through httpData regardless of callback)
3694
                                                // process the data (runs the xml through httpData regardless of callback)
3583
                                                data = jQuery.httpData( xhr, s.dataType, s );
3695
                                                data = jQuery.httpData( xhr, s.dataType, s );
3584
                                        } catch(e) {
3696
                                        } catch(e) {
3585
                                                status = "parsererror";
3697
                                                status = "parsererror";
3586
                                        }
3698
                                        }
3587
                                }
3699
                                }
3588
3700
3589
                                // Make sure that the request was successful or notmodified
3701
                                // Make sure that the request was successful or notmodified
3590
                                if ( status == "success" ) {
3702
                                if ( status == "success" ) {
3591
                                        // Cache Last-Modified header, if ifModified mode.
3703
                                        // Cache Last-Modified header, if ifModified mode.
3592
                                        var modRes;
3704
                                        var modRes;
3593
                                        try {
3705
                                        try {
3594
                                                modRes = xhr.getResponseHeader("Last-Modified");
3706
                                                modRes = xhr.getResponseHeader("Last-Modified");
3595
                                        } catch(e) {} // swallow exception thrown by FF if header is not available
3707
                                        } catch(e) {} // swallow exception thrown by FF if header is not available
3596
3708
3597
                                        if ( s.ifModified && modRes )
3709
                                        if ( s.ifModified && modRes )
3598
                                                jQuery.lastModified[s.url] = modRes;
3710
                                                jQuery.lastModified[s.url] = modRes;
3599
3711
3600
                                        // JSONP handles its own success callback
3712
                                        // JSONP handles its own success callback
3601
                                        if ( !jsonp )
3713
                                        if ( !jsonp )
3602
                                                success();
3714
                                                success();
3603
                                } else
3715
                                } else
3604
                                        jQuery.handleError(s, xhr, status);
3716
                                        jQuery.handleError(s, xhr, status);
3605
3717
3606
                                // Fire the complete handlers
3718
                                // Fire the complete handlers
3607
                                complete();
3719
                                complete();
3608
3720
3609
                                if ( isTimeout )
3721
                                if ( isTimeout )
3610
                                        xhr.abort();
3722
                                        xhr.abort();
3611
3723
3612
                                // Stop memory leaks
3724
                                // Stop memory leaks
3613
                                if ( s.async )
3725
                                if ( s.async )
3614
                                        xhr = null;
3726
                                        xhr = null;
3615
                        }
3727
                        }
3616
                };
3728
                };
3617
3729
3618
                if ( s.async ) {
3730
                if ( s.async ) {
3619
                        // don't attach the handler to the request, just poll it instead
3731
                        // don't attach the handler to the request, just poll it instead
3620
                        var ival = setInterval(onreadystatechange, 13);
3732
                        var ival = setInterval(onreadystatechange, 13);
3621
3733
3622
                        // Timeout checker
3734
                        // Timeout checker
3623
                        if ( s.timeout > 0 )
3735
                        if ( s.timeout > 0 )
3624
                                setTimeout(function(){
3736
                                setTimeout(function(){
3625
                                        // Check to see if the request is still happening
3737
                                        // Check to see if the request is still happening
3626
                                        if ( xhr && !requestDone )
3738
                                        if ( xhr && !requestDone )
3627
                                                onreadystatechange( "timeout" );
3739
                                                onreadystatechange( "timeout" );
3628
                                }, s.timeout);
3740
                                }, s.timeout);
3629
                }
3741
                }
3630
3742
3631
                // Send the data
3743
                // Send the data
3632
                try {
3744
                try {
3633
                        xhr.send(s.data);
3745
                        xhr.send(s.data);
3634
                } catch(e) {
3746
                } catch(e) {
3635
                        jQuery.handleError(s, xhr, null, e);
3747
                        jQuery.handleError(s, xhr, null, e);
3636
                }
3748
                }
3637
3749
3638
                // firefox 1.5 doesn't fire statechange for sync requests
3750
                // firefox 1.5 doesn't fire statechange for sync requests
3639
                if ( !s.async )
3751
                if ( !s.async )
3640
                        onreadystatechange();
3752
                        onreadystatechange();
3641
3753
3642
                function success(){
3754
                function success(){
3643
                        // If a local callback was specified, fire it and pass it the data
3755
                        // If a local callback was specified, fire it and pass it the data
3644
                        if ( s.success )
3756
                        if ( s.success )
3645
                                s.success( data, status );
3757
                                s.success( data, status );
3646
3758
3647
                        // Fire the global callback
3759
                        // Fire the global callback
3648
                        if ( s.global )
3760
                        if ( s.global )
3649
                                jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
3761
                                jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
3650
                }
3762
                }
3651
3763
3652
                function complete(){
3764
                function complete(){
3653
                        // Process result
3765
                        // Process result
3654
                        if ( s.complete )
3766
                        if ( s.complete )
3655
                                s.complete(xhr, status);
3767
                                s.complete(xhr, status);
3656
3768
3657
                        // The request was completed
3769
                        // The request was completed
3658
                        if ( s.global )
3770
                        if ( s.global )
3659
                                jQuery.event.trigger( "ajaxComplete", [xhr, s] );
3771
                                jQuery.event.trigger( "ajaxComplete", [xhr, s] );
3660
3772
3661
                        // Handle the global AJAX counter
3773
                        // Handle the global AJAX counter
3662
                        if ( s.global && ! --jQuery.active )
3774
                        if ( s.global && ! --jQuery.active )
3663
                                jQuery.event.trigger( "ajaxStop" );
3775
                                jQuery.event.trigger( "ajaxStop" );
3664
                }
3776
                }
3665
3777
3666
                // return XMLHttpRequest to allow aborting the request etc.
3778
                // return XMLHttpRequest to allow aborting the request etc.
3667
                return xhr;
3779
                return xhr;
3668
        },
3780
        },
3669
3781
3670
        handleError: function( s, xhr, status, e ) {
3782
        handleError: function( s, xhr, status, e ) {
3671
                // If a local callback was specified, fire it
3783
                // If a local callback was specified, fire it
3672
                if ( s.error ) s.error( xhr, status, e );
3784
                if ( s.error ) s.error( xhr, status, e );
3673
3785
3674
                // Fire the global callback
3786
                // Fire the global callback
3675
                if ( s.global )
3787
                if ( s.global )
3676
                        jQuery.event.trigger( "ajaxError", [xhr, s, e] );
3788
                        jQuery.event.trigger( "ajaxError", [xhr, s, e] );
3677
        },
3789
        },
3678
3790
3679
        // Counter for holding the number of active queries
3791
        // Counter for holding the number of active queries
3680
        active: 0,
3792
        active: 0,
3681
3793
3682
        // Determines if an XMLHttpRequest was successful or not
3794
        // Determines if an XMLHttpRequest was successful or not
3683
        httpSuccess: function( xhr ) {
3795
        httpSuccess: function( xhr ) {
3684
                try {
3796
                try {
3685
                        // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
3797
                        // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
3686
                        return !xhr.status && location.protocol == "file:" ||
3798
                        return !xhr.status && location.protocol == "file:" ||
3687
                                ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223;
3799
                                ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223;
3688
                } catch(e){}
3800
                } catch(e){}
3689
                return false;
3801
                return false;
3690
        },
3802
        },
3691
3803
3692
        // Determines if an XMLHttpRequest returns NotModified
3804
        // Determines if an XMLHttpRequest returns NotModified
3693
        httpNotModified: function( xhr, url ) {
3805
        httpNotModified: function( xhr, url ) {
3694
                try {
3806
                try {
3695
                        var xhrRes = xhr.getResponseHeader("Last-Modified");
3807
                        var xhrRes = xhr.getResponseHeader("Last-Modified");
3696
3808
3697
                        // Firefox always returns 200. check Last-Modified date
3809
                        // Firefox always returns 200. check Last-Modified date
3698
                        return xhr.status == 304 || xhrRes == jQuery.lastModified[url];
3810
                        return xhr.status == 304 || xhrRes == jQuery.lastModified[url];
3699
                } catch(e){}
3811
                } catch(e){}
3700
                return false;
3812
                return false;
3701
        },
3813
        },
3702
3814
3703
        httpData: function( xhr, type, s ) {
3815
        httpData: function( xhr, type, s ) {
3704
                var ct = xhr.getResponseHeader("content-type"),
3816
                var ct = xhr.getResponseHeader("content-type"),
3705
                        xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
3817
                        xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
3706
                        data = xml ? xhr.responseXML : xhr.responseText;
3818
                        data = xml ? xhr.responseXML : xhr.responseText;
3707
3819
3708
                if ( xml && data.documentElement.tagName == "parsererror" )
3820
                if ( xml && data.documentElement.tagName == "parsererror" )
3709
                        throw "parsererror";
3821
                        throw "parsererror";
3710
                       
3822
3711
                // Allow a pre-filtering function to sanitize the response
3823
                // Allow a pre-filtering function to sanitize the response
3712
                // s != null is checked to keep backwards compatibility
3824
                // s != null is checked to keep backwards compatibility
3713
                if( s && s.dataFilter )
3825
                if( s && s.dataFilter )
3714
                        data = s.dataFilter( data, type );
3826
                        data = s.dataFilter( data, type );
3715
3827
3716
                // The filter can actually parse the response
3828
                // The filter can actually parse the response
3717
                if( typeof data === "string" ){
3829
                if( typeof data === "string" ){
3718
3830
3719
                        // If the type is "script", eval it in global context
3831
                        // If the type is "script", eval it in global context
3720
                        if ( type == "script" )
3832
                        if ( type == "script" )
3721
                                jQuery.globalEval( data );
3833
                                jQuery.globalEval( data );
3722
3834
3723
                        // Get the JavaScript object, if JSON is used.
3835
                        // Get the JavaScript object, if JSON is used.
3724
                        if ( type == "json" )
3836
                        if ( type == "json" )
3725
                                data = window["eval"]("(" + data + ")");
3837
                                data = window["eval"]("(" + data + ")");
3726
                }
3838
                }
3727
               
3839
3728
                return data;
3840
                return data;
3729
        },
3841
        },
3730
3842
3731
        // Serialize an array of form elements or a set of
3843
        // Serialize an array of form elements or a set of
3732
        // key/values into a query string
3844
        // key/values into a query string
3733
        param: function( a ) {
3845
        param: function( a ) {
3734
                var s = [ ];
3846
                var s = [ ];
3735
3847
3736
                function add( key, value ){
3848
                function add( key, value ){
3737
                        s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
3849
                        s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
3738
                };
3850
                };
3739
3851
3740
                // If an array was passed in, assume that it is an array
3852
                // If an array was passed in, assume that it is an array
3741
                // of form elements
3853
                // of form elements
3742
                if ( jQuery.isArray(a) || a.jquery )
3854
                if ( jQuery.isArray(a) || a.jquery )
3743
                        // Serialize the form elements
3855
                        // Serialize the form elements
3744
                        jQuery.each( a, function(){
3856
                        jQuery.each( a, function(){
3745
                                add( this.name, this.value );
3857
                                add( this.name, this.value );
3746
                        });
3858
                        });
3747
3859
3748
                // Otherwise, assume that it's an object of key/value pairs
3860
                // Otherwise, assume that it's an object of key/value pairs
3749
                else
3861
                else
3750
                        // Serialize the key/values
3862
                        // Serialize the key/values
3751
                        for ( var j in a )
3863
                        for ( var j in a )
3752
                                // If the value is an array then the key names need to be repeated
3864
                                // If the value is an array then the key names need to be repeated
3753
                                if ( jQuery.isArray(a[j]) )
3865
                                if ( jQuery.isArray(a[j]) )
3754
                                        jQuery.each( a[j], function(){
3866
                                        jQuery.each( a[j], function(){
3755
                                                add( j, this );
3867
                                                add( j, this );
3756
                                        });
3868
                                        });
3757
                                else
3869
                                else
3758
                                        add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] );
3870
                                        add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] );
3759
3871
3760
                // Return the resulting serialization
3872
                // Return the resulting serialization
3761
                return s.join("&").replace(/%20/g, "+");
3873
                return s.join("&").replace(/%20/g, "+");
3762
        }
3874
        }
3763
3875
3764
});
3876
});
3765
var elemdisplay = {},
3877
var elemdisplay = {},
3766
        timerId,
3878
        timerId,
3767
        fxAttrs = [
3879
        fxAttrs = [
3768
                // height animations
3880
                // height animations
3769
                [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
3881
                [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
3770
                // width animations
3882
                // width animations
3771
                [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
3883
                [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
3772
                // opacity animations
3884
                // opacity animations
3773
                [ "opacity" ]
3885
                [ "opacity" ]
3774
        ];
3886
        ];
3775
3887
3776
function genFx( type, num ){
3888
function genFx( type, num ){
3777
        var obj = {};
3889
        var obj = {};
3778
        jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function(){
3890
        jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function(){
3779
                obj[ this ] = type;
3891
                obj[ this ] = type;
3780
        });
3892
        });
3781
        return obj;
3893
        return obj;
3782
}
3894
}
3783
3895
3784
jQuery.fn.extend({
3896
jQuery.fn.extend({
3785
        show: function(speed,callback){
3897
        show: function(speed,callback){
3786
                if ( speed ) {
3898
                if ( speed ) {
3787
                        return this.animate( genFx("show", 3), speed, callback);
3899
                        return this.animate( genFx("show", 3), speed, callback);
3788
                } else {
3900
                } else {
3789
                        for ( var i = 0, l = this.length; i < l; i++ ){
3901
                        for ( var i = 0, l = this.length; i < l; i++ ){
3790
                                var old = jQuery.data(this[i], "olddisplay");
3902
                                var old = jQuery.data(this[i], "olddisplay");
3791
                               
3903
3792
                                this[i].style.display = old || "";
3904
                                this[i].style.display = old || "";
3793
                               
3905
3794
                                if ( jQuery.css(this[i], "display") === "none" ) {
3906
                                if ( jQuery.css(this[i], "display") === "none" ) {
3795
                                        var tagName = this[i].tagName, display;
3907
                                        var tagName = this[i].tagName, display;
3796
                                       
3908
3797
                                        if ( elemdisplay[ tagName ] ) {
3909
                                        if ( elemdisplay[ tagName ] ) {
3798
                                                display = elemdisplay[ tagName ];
3910
                                                display = elemdisplay[ tagName ];
3799
                                        } else {
3911
                                        } else {
3800
                                                var elem = jQuery("<" + tagName + " />").appendTo("body");
3912
                                                var elem = jQuery("<" + tagName + " />").appendTo("body");
3801
                                               
3913
3802
                                                display = elem.css("display");
3914
                                                display = elem.css("display");
3803
                                                if ( display === "none" )
3915
                                                if ( display === "none" )
3804
                                                        display = "block";
3916
                                                        display = "block";
3805
                                               
3917
3806
                                                elem.remove();
3918
                                                elem.remove();
3807
                                               
3919
3808
                                                elemdisplay[ tagName ] = display;
3920
                                                elemdisplay[ tagName ] = display;
3809
                                        }
3921
                                        }
3810
                                       
3922
3811
                                        jQuery.data(this[i], "olddisplay", display);
3923
                                        jQuery.data(this[i], "olddisplay", display);
3812
                                }
3924
                                }
3813
                        }
3925
                        }
3814
3926
3815
                        // Set the display of the elements in a second loop
3927
                        // Set the display of the elements in a second loop
3816
                        // to avoid the constant reflow
3928
                        // to avoid the constant reflow
3817
                        for ( var i = 0, l = this.length; i < l; i++ ){
3929
                        for ( var i = 0, l = this.length; i < l; i++ ){
3818
                                this[i].style.display = jQuery.data(this[i], "olddisplay") || "";
3930
                                this[i].style.display = jQuery.data(this[i], "olddisplay") || "";
3819
                        }
3931
                        }
3820
                       
3932
3821
                        return this;
3933
                        return this;
3822
                }
3934
                }
3823
        },
3935
        },
3824
3936
3825
        hide: function(speed,callback){
3937
        hide: function(speed,callback){
3826
                if ( speed ) {
3938
                if ( speed ) {
3827
                        return this.animate( genFx("hide", 3), speed, callback);
3939
                        return this.animate( genFx("hide", 3), speed, callback);
3828
                } else {
3940
                } else {
3829
                        for ( var i = 0, l = this.length; i < l; i++ ){
3941
                        for ( var i = 0, l = this.length; i < l; i++ ){
3830
                                var old = jQuery.data(this[i], "olddisplay");
3942
                                var old = jQuery.data(this[i], "olddisplay");
3831
                                if ( !old && old !== "none" )
3943
                                if ( !old && old !== "none" )
3832
                                        jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
3944
                                        jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
3833
                        }
3945
                        }
3834
3946
3835
                        // Set the display of the elements in a second loop
3947
                        // Set the display of the elements in a second loop
3836
                        // to avoid the constant reflow
3948
                        // to avoid the constant reflow
3837
                        for ( var i = 0, l = this.length; i < l; i++ ){
3949
                        for ( var i = 0, l = this.length; i < l; i++ ){
3838
                                this[i].style.display = "none";
3950
                                this[i].style.display = "none";
3839
                        }
3951
                        }
3840
3952
3841
                        return this;
3953
                        return this;
3842
                }
3954
                }
3843
        },
3955
        },
3844
3956
3845
        // Save the old toggle function
3957
        // Save the old toggle function
3846
        _toggle: jQuery.fn.toggle,
3958
        _toggle: jQuery.fn.toggle,
3847
3959
3848
        toggle: function( fn, fn2 ){
3960
        toggle: function( fn, fn2 ){
3849
                var bool = typeof fn === "boolean";
3961
                var bool = typeof fn === "boolean";
3850
3962
3851
                return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
3963
                return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
3852
                        this._toggle.apply( this, arguments ) :
3964
                        this._toggle.apply( this, arguments ) :
3853
                        fn == null || bool ?
3965
                        fn == null || bool ?
3854
                                this.each(function(){
3966
                                this.each(function(){
3855
                                        var state = bool ? fn : jQuery(this).is(":hidden");
3967
                                        var state = bool ? fn : jQuery(this).is(":hidden");
3856
                                        jQuery(this)[ state ? "show" : "hide" ]();
3968
                                        jQuery(this)[ state ? "show" : "hide" ]();
3857
                                }) :
3969
                                }) :
3858
                                this.animate(genFx("toggle", 3), fn, fn2);
3970
                                this.animate(genFx("toggle", 3), fn, fn2);
3859
        },
3971
        },
3860
3972
3861
        fadeTo: function(speed,to,callback){
3973
        fadeTo: function(speed,to,callback){
-
 
3974
                return this.filter(":hidden").css('opacity', 0).show().end()
3862
                return this.animate({opacity: to}, speed, callback);
3975
                                        .animate({opacity: to}, speed, callback);
3863
        },
3976
        },
3864
3977
3865
        animate: function( prop, speed, easing, callback ) {
3978
        animate: function( prop, speed, easing, callback ) {
3866
                var optall = jQuery.speed(speed, easing, callback);
3979
                var optall = jQuery.speed(speed, easing, callback);
3867
3980
3868
                return this[ optall.queue === false ? "each" : "queue" ](function(){
3981
                return this[ optall.queue === false ? "each" : "queue" ](function(){
3869
               
3982
3870
                        var opt = jQuery.extend({}, optall), p,
3983
                        var opt = jQuery.extend({}, optall), p,
3871
                                hidden = this.nodeType == 1 && jQuery(this).is(":hidden"),
3984
                                hidden = this.nodeType == 1 && jQuery(this).is(":hidden"),
3872
                                self = this;
3985
                                self = this;
3873
       
3986
3874
                        for ( p in prop ) {
3987
                        for ( p in prop ) {
3875
                                if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
3988
                                if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
3876
                                        return opt.complete.call(this);
3989
                                        return opt.complete.call(this);
3877
3990
3878
                                if ( ( p == "height" || p == "width" ) && this.style ) {
3991
                                if ( ( p == "height" || p == "width" ) && this.style ) {
3879
                                        // Store display property
3992
                                        // Store display property
3880
                                        opt.display = jQuery.css(this, "display");
3993
                                        opt.display = jQuery.css(this, "display");
3881
3994
3882
                                        // Make sure that nothing sneaks out
3995
                                        // Make sure that nothing sneaks out
3883
                                        opt.overflow = this.style.overflow;
3996
                                        opt.overflow = this.style.overflow;
3884
                                }
3997
                                }
3885
                        }
3998
                        }
3886
3999
3887
                        if ( opt.overflow != null )
4000
                        if ( opt.overflow != null )
3888
                                this.style.overflow = "hidden";
4001
                                this.style.overflow = "hidden";
3889
4002
3890
                        opt.curAnim = jQuery.extend({}, prop);
4003
                        opt.curAnim = jQuery.extend({}, prop);
3891
4004
3892
                        jQuery.each( prop, function(name, val){
4005
                        jQuery.each( prop, function(name, val){
3893
                                var e = new jQuery.fx( self, opt, name );
4006
                                var e = new jQuery.fx( self, opt, name );
3894
4007
3895
                                if ( /toggle|show|hide/.test(val) )
4008
                                if ( /toggle|show|hide/.test(val) )
3896
                                        e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
4009
                                        e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
3897
                                else {
4010
                                else {
3898
                                        var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
4011
                                        var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
3899
                                                start = e.cur(true) || 0;
4012
                                                start = e.cur(true) || 0;
3900
4013
3901
                                        if ( parts ) {
4014
                                        if ( parts ) {
3902
                                                var end = parseFloat(parts[2]),
4015
                                                var end = parseFloat(parts[2]),
3903
                                                        unit = parts[3] || "px";
4016
                                                        unit = parts[3] || "px";
3904
4017
3905
                                                // We need to compute starting value
4018
                                                // We need to compute starting value
3906
                                                if ( unit != "px" ) {
4019
                                                if ( unit != "px" ) {
3907
                                                        self.style[ name ] = (end || 1) + unit;
4020
                                                        self.style[ name ] = (end || 1) + unit;
3908
                                                        start = ((end || 1) / e.cur(true)) * start;
4021
                                                        start = ((end || 1) / e.cur(true)) * start;
3909
                                                        self.style[ name ] = start + unit;
4022
                                                        self.style[ name ] = start + unit;
3910
                                                }
4023
                                                }
3911
4024
3912
                                                // If a +=/-= token was provided, we're doing a relative animation
4025
                                                // If a +=/-= token was provided, we're doing a relative animation
3913
                                                if ( parts[1] )
4026
                                                if ( parts[1] )
3914
                                                        end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
4027
                                                        end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
3915
4028
3916
                                                e.custom( start, end, unit );
4029
                                                e.custom( start, end, unit );
3917
                                        } else
4030
                                        } else
3918
                                                e.custom( start, val, "" );
4031
                                                e.custom( start, val, "" );
3919
                                }
4032
                                }
3920
                        });
4033
                        });
3921
4034
3922
                        // For JS strict compliance
4035
                        // For JS strict compliance
3923
                        return true;
4036
                        return true;
3924
                });
4037
                });
3925
        },
4038
        },
3926
4039
3927
        stop: function(clearQueue, gotoEnd){
4040
        stop: function(clearQueue, gotoEnd){
3928
                var timers = jQuery.timers;
4041
                var timers = jQuery.timers;
3929
4042
3930
                if (clearQueue)
4043
                if (clearQueue)
3931
                        this.queue([]);
4044
                        this.queue([]);
3932
4045
3933
                this.each(function(){
4046
                this.each(function(){
3934
                        // go in reverse order so anything added to the queue during the loop is ignored
4047
                        // go in reverse order so anything added to the queue during the loop is ignored
3935
                        for ( var i = timers.length - 1; i >= 0; i-- )
4048
                        for ( var i = timers.length - 1; i >= 0; i-- )
3936
                                if ( timers[i].elem == this ) {
4049
                                if ( timers[i].elem == this ) {
3937
                                        if (gotoEnd)
4050
                                        if (gotoEnd)
3938
                                                // force the next step to be the last
4051
                                                // force the next step to be the last
3939
                                                timers[i](true);
4052
                                                timers[i](true);
3940
                                        timers.splice(i, 1);
4053
                                        timers.splice(i, 1);
3941
                                }
4054
                                }
3942
                });
4055
                });
3943
4056
3944
                // start the next in the queue if the last step wasn't forced
4057
                // start the next in the queue if the last step wasn't forced
3945
                if (!gotoEnd)
4058
                if (!gotoEnd)
3946
                        this.dequeue();
4059
                        this.dequeue();
3947
4060
3948
                return this;
4061
                return this;
3949
        }
4062
        }
3950
4063
3951
});
4064
});
3952
4065
3953
// Generate shortcuts for custom animations
4066
// Generate shortcuts for custom animations
3954
jQuery.each({
4067
jQuery.each({
3955
        slideDown: genFx("show", 1),
4068
        slideDown: genFx("show", 1),
3956
        slideUp: genFx("hide", 1),
4069
        slideUp: genFx("hide", 1),
3957
        slideToggle: genFx("toggle", 1),
4070
        slideToggle: genFx("toggle", 1),
3958
        fadeIn: { opacity: "show" },
4071
        fadeIn: { opacity: "show" },
3959
        fadeOut: { opacity: "hide" }
4072
        fadeOut: { opacity: "hide" }
3960
}, function( name, props ){
4073
}, function( name, props ){
3961
        jQuery.fn[ name ] = function( speed, callback ){
4074
        jQuery.fn[ name ] = function( speed, callback ){
3962
                return this.animate( props, speed, callback );
4075
                return this.animate( props, speed, callback );
3963
        };
4076
        };
3964
});
4077
});
3965
4078
3966
jQuery.extend({
4079
jQuery.extend({
3967
4080
3968
        speed: function(speed, easing, fn) {
4081
        speed: function(speed, easing, fn) {
3969
                var opt = typeof speed === "object" ? speed : {
4082
                var opt = typeof speed === "object" ? speed : {
3970
                        complete: fn || !fn && easing ||
4083
                        complete: fn || !fn && easing ||
3971
                                jQuery.isFunction( speed ) && speed,
4084
                                jQuery.isFunction( speed ) && speed,
3972
                        duration: speed,
4085
                        duration: speed,
3973
                        easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
4086
                        easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
3974
                };
4087
                };
3975
4088
3976
                opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
4089
                opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
3977
                        jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
4090
                        jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
3978
4091
3979
                // Queueing
4092
                // Queueing
3980
                opt.old = opt.complete;
4093
                opt.old = opt.complete;
3981
                opt.complete = function(){
4094
                opt.complete = function(){
3982
                        if ( opt.queue !== false )
4095
                        if ( opt.queue !== false )
3983
                                jQuery(this).dequeue();
4096
                                jQuery(this).dequeue();
3984
                        if ( jQuery.isFunction( opt.old ) )
4097
                        if ( jQuery.isFunction( opt.old ) )
3985
                                opt.old.call( this );
4098
                                opt.old.call( this );
3986
                };
4099
                };
3987
4100
3988
                return opt;
4101
                return opt;
3989
        },
4102
        },
3990
4103
3991
        easing: {
4104
        easing: {
3992
                linear: function( p, n, firstNum, diff ) {
4105
                linear: function( p, n, firstNum, diff ) {
3993
                        return firstNum + diff * p;
4106
                        return firstNum + diff * p;
3994
                },
4107
                },
3995
                swing: function( p, n, firstNum, diff ) {
4108
                swing: function( p, n, firstNum, diff ) {
3996
                        return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
4109
                        return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
3997
                }
4110
                }
3998
        },
4111
        },
3999
4112
4000
        timers: [],
4113
        timers: [],
4001
4114
4002
        fx: function( elem, options, prop ){
4115
        fx: function( elem, options, prop ){
4003
                this.options = options;
4116
                this.options = options;
4004
                this.elem = elem;
4117
                this.elem = elem;
4005
                this.prop = prop;
4118
                this.prop = prop;
4006
4119
4007
                if ( !options.orig )
4120
                if ( !options.orig )
4008
                        options.orig = {};
4121
                        options.orig = {};
4009
        }
4122
        }
4010
4123
4011
});
4124
});
4012
4125
4013
jQuery.fx.prototype = {
4126
jQuery.fx.prototype = {
4014
4127
4015
        // Simple function for setting a style value
4128
        // Simple function for setting a style value
4016
        update: function(){
4129
        update: function(){
4017
                if ( this.options.step )
4130
                if ( this.options.step )
4018
                        this.options.step.call( this.elem, this.now, this );
4131
                        this.options.step.call( this.elem, this.now, this );
4019
4132
4020
                (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
4133
                (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
4021
4134
4022
                // Set display property to block for height/width animations
4135
                // Set display property to block for height/width animations
4023
                if ( ( this.prop == "height" || this.prop == "width" ) && this.elem.style )
4136
                if ( ( this.prop == "height" || this.prop == "width" ) && this.elem.style )
4024
                        this.elem.style.display = "block";
4137
                        this.elem.style.display = "block";
4025
        },
4138
        },
4026
4139
4027
        // Get the current size
4140
        // Get the current size
4028
        cur: function(force){
4141
        cur: function(force){
4029
                if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) )
4142
                if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) )
4030
                        return this.elem[ this.prop ];
4143
                        return this.elem[ this.prop ];
4031
4144
4032
                var r = parseFloat(jQuery.css(this.elem, this.prop, force));
4145
                var r = parseFloat(jQuery.css(this.elem, this.prop, force));
4033
                return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
4146
                return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
4034
        },
4147
        },
4035
4148
4036
        // Start an animation from one number to another
4149
        // Start an animation from one number to another
4037
        custom: function(from, to, unit){
4150
        custom: function(from, to, unit){
4038
                this.startTime = now();
4151
                this.startTime = now();
4039
                this.start = from;
4152
                this.start = from;
4040
                this.end = to;
4153
                this.end = to;
4041
                this.unit = unit || this.unit || "px";
4154
                this.unit = unit || this.unit || "px";
4042
                this.now = this.start;
4155
                this.now = this.start;
4043
                this.pos = this.state = 0;
4156
                this.pos = this.state = 0;
4044
4157
4045
                var self = this;
4158
                var self = this;
4046
                function t(gotoEnd){
4159
                function t(gotoEnd){
4047
                        return self.step(gotoEnd);
4160
                        return self.step(gotoEnd);
4048
                }
4161
                }
4049
4162
4050
                t.elem = this.elem;
4163
                t.elem = this.elem;
4051
4164
4052
                if ( t() && jQuery.timers.push(t) && !timerId ) {
4165
                if ( t() && jQuery.timers.push(t) && !timerId ) {
4053
                        timerId = setInterval(function(){
4166
                        timerId = setInterval(function(){
4054
                                var timers = jQuery.timers;
4167
                                var timers = jQuery.timers;
4055
4168
4056
                                for ( var i = 0; i < timers.length; i++ )
4169
                                for ( var i = 0; i < timers.length; i++ )
4057
                                        if ( !timers[i]() )
4170
                                        if ( !timers[i]() )
4058
                                                timers.splice(i--, 1);
4171
                                                timers.splice(i--, 1);
4059
4172
4060
                                if ( !timers.length ) {
4173
                                if ( !timers.length ) {
4061
                                        clearInterval( timerId );
4174
                                        clearInterval( timerId );
4062
                                        timerId = undefined;
4175
                                        timerId = undefined;
4063
                                }
4176
                                }
4064
                        }, 13);
4177
                        }, 13);
4065
                }
4178
                }
4066
        },
4179
        },
4067
4180
4068
        // Simple 'show' function
4181
        // Simple 'show' function
4069
        show: function(){
4182
        show: function(){
4070
                // Remember where we started, so that we can go back to it later
4183
                // Remember where we started, so that we can go back to it later
4071
                this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
4184
                this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
4072
                this.options.show = true;
4185
                this.options.show = true;
4073
4186
4074
                // Begin the animation
4187
                // Begin the animation
4075
                // Make sure that we start at a small width/height to avoid any
4188
                // Make sure that we start at a small width/height to avoid any
4076
                // flash of content
4189
                // flash of content
4077
                this.custom(this.prop == "width" || this.prop == "height" ? 1 : 0, this.cur());
4190
                this.custom(this.prop == "width" || this.prop == "height" ? 1 : 0, this.cur());
4078
4191
4079
                // Start by showing the element
4192
                // Start by showing the element
4080
                jQuery(this.elem).show();
4193
                jQuery(this.elem).show();
4081
        },
4194
        },
4082
4195
4083
        // Simple 'hide' function
4196
        // Simple 'hide' function
4084
        hide: function(){
4197
        hide: function(){
4085
                // Remember where we started, so that we can go back to it later
4198
                // Remember where we started, so that we can go back to it later
4086
                this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
4199
                this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
4087
                this.options.hide = true;
4200
                this.options.hide = true;
4088
4201
4089
                // Begin the animation
4202
                // Begin the animation
4090
                this.custom(this.cur(), 0);
4203
                this.custom(this.cur(), 0);
4091
        },
4204
        },
4092
4205
4093
        // Each step of an animation
4206
        // Each step of an animation
4094
        step: function(gotoEnd){
4207
        step: function(gotoEnd){
4095
                var t = now();
4208
                var t = now();
4096
4209
4097
                if ( gotoEnd || t >= this.options.duration + this.startTime ) {
4210
                if ( gotoEnd || t >= this.options.duration + this.startTime ) {
4098
                        this.now = this.end;
4211
                        this.now = this.end;
4099
                        this.pos = this.state = 1;
4212
                        this.pos = this.state = 1;
4100
                        this.update();
4213
                        this.update();
4101
4214
4102
                        this.options.curAnim[ this.prop ] = true;
4215
                        this.options.curAnim[ this.prop ] = true;
4103
4216
4104
                        var done = true;
4217
                        var done = true;
4105
                        for ( var i in this.options.curAnim )
4218
                        for ( var i in this.options.curAnim )
4106
                                if ( this.options.curAnim[i] !== true )
4219
                                if ( this.options.curAnim[i] !== true )
4107
                                        done = false;
4220
                                        done = false;
4108
4221
4109
                        if ( done ) {
4222
                        if ( done ) {
4110
                                if ( this.options.display != null ) {
4223
                                if ( this.options.display != null ) {
4111
                                        // Reset the overflow
4224
                                        // Reset the overflow
4112
                                        this.elem.style.overflow = this.options.overflow;
4225
                                        this.elem.style.overflow = this.options.overflow;
4113
4226
4114
                                        // Reset the display
4227
                                        // Reset the display
4115
                                        this.elem.style.display = this.options.display;
4228
                                        this.elem.style.display = this.options.display;
4116
                                        if ( jQuery.css(this.elem, "display") == "none" )
4229
                                        if ( jQuery.css(this.elem, "display") == "none" )
4117
                                                this.elem.style.display = "block";
4230
                                                this.elem.style.display = "block";
4118
                                }
4231
                                }
4119
4232
4120
                                // Hide the element if the "hide" operation was done
4233
                                // Hide the element if the "hide" operation was done
4121
                                if ( this.options.hide )
4234
                                if ( this.options.hide )
4122
                                        jQuery(this.elem).hide();
4235
                                        jQuery(this.elem).hide();
4123
4236
4124
                                // Reset the properties, if the item has been hidden or shown
4237
                                // Reset the properties, if the item has been hidden or shown
4125
                                if ( this.options.hide || this.options.show )
4238
                                if ( this.options.hide || this.options.show )
4126
                                        for ( var p in this.options.curAnim )
4239
                                        for ( var p in this.options.curAnim )
4127
                                                jQuery.attr(this.elem.style, p, this.options.orig[p]);
4240
                                                jQuery.style(this.elem, p, this.options.orig[p]);
4128
                                       
4241
4129
                                // Execute the complete function
4242
                                // Execute the complete function
4130
                                this.options.complete.call( this.elem );
4243
                                this.options.complete.call( this.elem );
4131
                        }
4244
                        }
4132
4245
4133
                        return false;
4246
                        return false;
4134
                } else {
4247
                } else {
4135
                        var n = t - this.startTime;
4248
                        var n = t - this.startTime;
4136
                        this.state = n / this.options.duration;
4249
                        this.state = n / this.options.duration;
4137
4250
4138
                        // Perform the easing function, defaults to swing
4251
                        // Perform the easing function, defaults to swing
4139
                        this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
4252
                        this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
4140
                        this.now = this.start + ((this.end - this.start) * this.pos);
4253
                        this.now = this.start + ((this.end - this.start) * this.pos);
4141
4254
4142
                        // Perform the next step of the animation
4255
                        // Perform the next step of the animation
4143
                        this.update();
4256
                        this.update();
4144
                }
4257
                }
4145
4258
4146
                return true;
4259
                return true;
4147
        }
4260
        }
4148
4261
4149
};
4262
};
4150
4263
4151
jQuery.extend( jQuery.fx, {
4264
jQuery.extend( jQuery.fx, {
4152
        speeds:{
4265
        speeds:{
4153
                slow: 600,
4266
                slow: 600,
4154
                fast: 200,
4267
                fast: 200,
4155
                // Default speed
4268
                // Default speed
4156
                _default: 400
4269
                _default: 400
4157
        },
4270
        },
4158
        step: {
4271
        step: {
4159
4272
4160
                opacity: function(fx){
4273
                opacity: function(fx){
4161
                        jQuery.attr(fx.elem.style, "opacity", fx.now);
4274
                        jQuery.style(fx.elem, "opacity", fx.now);
4162
                },
4275
                },
4163
4276
4164
                _default: function(fx){
4277
                _default: function(fx){
4165
                        if ( fx.elem.style && fx.elem.style[ fx.prop ] != null )
4278
                        if ( fx.elem.style && fx.elem.style[ fx.prop ] != null )
4166
                                fx.elem.style[ fx.prop ] = fx.now + fx.unit;
4279
                                fx.elem.style[ fx.prop ] = fx.now + fx.unit;
4167
                        else
4280
                        else
4168
                                fx.elem[ fx.prop ] = fx.now;
4281
                                fx.elem[ fx.prop ] = fx.now;
4169
                }
4282
                }
4170
        }
4283
        }
4171
});
4284
});
4172
if ( document.documentElement["getBoundingClientRect"] )
4285
if ( "getBoundingClientRect" in document.documentElement )
4173
        jQuery.fn.offset = function() {
4286
        jQuery.fn.offset = function() {
-
 
4287
                var elem = this[0];
4174
                if ( !this[0] ) return { top: 0, left: 0 };
4288
                if ( !elem ) return null;
4175
                if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
4289
                if ( elem === elem.ownerDocument.body ) return jQuery.offset.bodyOffset( elem );
4176
                var box  = this[0].getBoundingClientRect(), doc = this[0].ownerDocument, body = doc.body, docElem = doc.documentElement,
4290
                var box = elem.getBoundingClientRect(), doc = elem.ownerDocument, body = doc.body, docElem = doc.documentElement,
4177
                        clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
4291
                        clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
4178
                        top  = box.top  + (self.pageYOffset || jQuery.boxModel && docElem.scrollTop  || body.scrollTop ) - clientTop,
4292
                        top  = box.top  + (self.pageYOffset || jQuery.boxModel && docElem.scrollTop  || body.scrollTop ) - clientTop,
4179
                        left = box.left + (self.pageXOffset || jQuery.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
4293
                        left = box.left + (self.pageXOffset || jQuery.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
4180
                return { top: top, left: left };
4294
                return { top: top, left: left };
4181
        };
4295
        };
4182
else
4296
else
4183
        jQuery.fn.offset = function() {
4297
        jQuery.fn.offset = function() {
-
 
4298
                var elem = this[0];
4184
                if ( !this[0] ) return { top: 0, left: 0 };
4299
                if ( !elem ) return null;
4185
                if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
4300
                if ( elem === elem.ownerDocument.body ) return jQuery.offset.bodyOffset( elem );
4186
                jQuery.offset.initialized || jQuery.offset.initialize();
4301
                jQuery.offset.initialize();
4187
4302
4188
                var elem = this[0], offsetParent = elem.offsetParent, prevOffsetParent = elem,
4303
                var offsetParent = elem.offsetParent, prevOffsetParent = elem,
4189
                        doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
4304
                        doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
4190
                        body = doc.body, defaultView = doc.defaultView,
4305
                        body = doc.body, defaultView = doc.defaultView,
4191
                        prevComputedStyle = defaultView.getComputedStyle(elem, null),
4306
                        prevComputedStyle = defaultView.getComputedStyle(elem, null),
4192
                        top = elem.offsetTop, left = elem.offsetLeft;
4307
                        top = elem.offsetTop, left = elem.offsetLeft;
4193
4308
4194
                while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
4309
                while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
-
 
4310
                        if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) break;
4195
                        computedStyle = defaultView.getComputedStyle(elem, null);
4311
                        computedStyle = defaultView.getComputedStyle(elem, null);
4196
                        top -= elem.scrollTop, left -= elem.scrollLeft;
4312
                        top -= elem.scrollTop, left -= elem.scrollLeft;
4197
                        if ( elem === offsetParent ) {
4313
                        if ( elem === offsetParent ) {
4198
                                top += elem.offsetTop, left += elem.offsetLeft;
4314
                                top += elem.offsetTop, left += elem.offsetLeft;
4199
                                if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.tagName)) )
4315
                                if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.tagName)) )
4200
                                        top  += parseInt( computedStyle.borderTopWidth,  10) || 0,
4316
                                        top  += parseFloat( computedStyle.borderTopWidth,  10) || 0,
4201
                                        left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
4317
                                        left += parseFloat( computedStyle.borderLeftWidth, 10) || 0;
4202
                                prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
4318
                                prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
4203
                        }
4319
                        }
4204
                        if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" )
4320
                        if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" )
4205
                                top  += parseInt( computedStyle.borderTopWidth,  10) || 0,
4321
                                top  += parseFloat( computedStyle.borderTopWidth,  10) || 0,
4206
                                left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
4322
                                left += parseFloat( computedStyle.borderLeftWidth, 10) || 0;
4207
                        prevComputedStyle = computedStyle;
4323
                        prevComputedStyle = computedStyle;
4208
                }
4324
                }
4209
4325
4210
                if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" )
4326
                if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" )
4211
                        top  += body.offsetTop,
4327
                        top  += body.offsetTop,
4212
                        left += body.offsetLeft;
4328
                        left += body.offsetLeft;
4213
4329
4214
                if ( prevComputedStyle.position === "fixed" )
4330
                if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" )
4215
                        top  += Math.max(docElem.scrollTop, body.scrollTop),
4331
                        top  += Math.max(docElem.scrollTop, body.scrollTop),
4216
                        left += Math.max(docElem.scrollLeft, body.scrollLeft);
4332
                        left += Math.max(docElem.scrollLeft, body.scrollLeft);
4217
4333
4218
                return { top: top, left: left };
4334
                return { top: top, left: left };
4219
        };
4335
        };
4220
4336
4221
jQuery.offset = {
4337
jQuery.offset = {
4222
        initialize: function() {
4338
        initialize: function() {
4223
                if ( this.initialized ) return;
-
 
4224
                var body = document.body, container = document.createElement('div'), innerDiv, checkDiv, table, td, rules, prop, bodyMarginTop = body.style.marginTop,
4339
                var body = document.body, container = document.createElement('div'), innerDiv, checkDiv, table, td, prop, bodyMarginTop = body.style.marginTop,
4225
                        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>';
4340
                        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>';
4226
4341
4227
                rules = { position: 'absolute', top: 0, left: 0, margin: 0, border: 0, width: '1px', height: '1px', visibility: 'hidden' };
4342
                jQuery.extend( container.style, { position: 'absolute', top: 0, left: 0, margin: 0, border: 0, width: '1px', height: '1px', visibility: 'hidden' } );
4228
                for ( prop in rules ) container.style[prop] = rules[prop];
-
 
4229
4343
4230
                container.innerHTML = html;
4344
                container.innerHTML = html;
4231
                body.insertBefore(container, body.firstChild);
4345
                body.insertBefore(container, body.firstChild);
4232
                innerDiv = container.firstChild, checkDiv = innerDiv.firstChild, td = innerDiv.nextSibling.firstChild.firstChild;
4346
                innerDiv = container.firstChild, checkDiv = innerDiv.firstChild, td = innerDiv.nextSibling.firstChild.firstChild;
4233
4347
4234
                this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
4348
                this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
4235
                this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
4349
                this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
4236
4350
-
 
4351
                checkDiv.style.position = 'fixed', checkDiv.style.top = '20px';
-
 
4352
                this.supportsFixedPosition = (checkDiv.offsetTop >= 15); // safari subtracts parent border width here which is 5px
-
 
4353
                checkDiv.style.position = '', checkDiv.style.top = '';
-
 
4354
4237
                innerDiv.style.overflow = 'hidden', innerDiv.style.position = 'relative';
4355
                innerDiv.style.overflow = 'hidden', innerDiv.style.position = 'relative';
4238
                this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
4356
                this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
4239
4357
4240
                body.style.marginTop = '1px';
4358
                body.style.marginTop = '1px';
4241
                this.doesNotIncludeMarginInBodyOffset = (body.offsetTop === 0);
4359
                this.doesNotIncludeMarginInBodyOffset = (body.offsetTop === 0);
4242
                body.style.marginTop = bodyMarginTop;
4360
                body.style.marginTop = bodyMarginTop;
4243
4361
4244
                body.removeChild(container);
4362
                body.removeChild(container);
4245
                this.initialized = true;
4363
                jQuery.offset.initialize = function(){};
4246
        },
4364
        },
4247
4365
4248
        bodyOffset: function(body) {
4366
        bodyOffset: function(body) {
4249
                jQuery.offset.initialized || jQuery.offset.initialize();
4367
                jQuery.offset.initialize();
4250
                var top = body.offsetTop, left = body.offsetLeft;
4368
                var top = body.offsetTop, left = body.offsetLeft;
4251
                if ( jQuery.offset.doesNotIncludeMarginInBodyOffset )
4369
                if ( jQuery.offset.doesNotIncludeMarginInBodyOffset )
4252
                        top  += parseInt( jQuery.curCSS(body, 'marginTop',  true), 10 ) || 0,
4370
                        top  += parseFloat( jQuery.curCSS(body, 'marginTop',  true), 10 ) || 0,
4253
                        left += parseInt( jQuery.curCSS(body, 'marginLeft', true), 10 ) || 0;
4371
                        left += parseFloat( jQuery.curCSS(body, 'marginLeft', true), 10 ) || 0;
4254
                return { top: top, left: left };
4372
                return { top: top, left: left };
4255
        }
4373
        }
4256
};
4374
};
4257
4375
4258
4376
4259
jQuery.fn.extend({
4377
jQuery.fn.extend({
4260
        position: function() {
4378
        position: function() {
4261
                var left = 0, top = 0, results;
4379
                if ( !this[0] ) return null;
4262
4380
4263
                if ( this[0] ) {
-
 
4264
                        // Get *real* offsetParent
-
 
4265
                        var offsetParent = this.offsetParent(),
4381
                var elem = this[0], left = 0, top = 0, results,
4266
4382
-
 
4383
                // Get *real* offsetParent
-
 
4384
                offsetParent = this.offsetParent(),
-
 
4385
4267
                        // Get correct offsets
4386
                // Get correct offsets
4268
                        offset       = this.offset(),
4387
                offset       = this.offset(),
4269
                        parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
4388
                parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
4270
4389
4271
                        // Subtract element margins
4390
                // Subtract element margins
4272
                        // note: when an element has margin: auto the offsetLeft and marginLeft 
4391
                // note: when an element has margin: auto the offsetLeft and marginLeft
4273
                        // are the same in Safari causing offset.left to incorrectly be 0
4392
                // are the same in Safari causing offset.left to incorrectly be 0
4274
                        offset.top  -= num( this, 'marginTop'  );
4393
                offset.top  -= parseFloat( jQuery.curCSS(elem, 'marginTop',  true), 10 ) || 0;
4275
                        offset.left -= num( this, 'marginLeft' );
4394
                offset.left -= parseFloat( jQuery.curCSS(elem, 'marginLeft', true), 10 ) || 0;
4276
4395
4277
                        // Add offsetParent borders
4396
                // Add offsetParent borders
4278
                        parentOffset.top  += num( offsetParent, 'borderTopWidth'  );
4397
                parentOffset.top  += parseFloat( jQuery.curCSS(offsetParent[0], 'borderTopWidth',  true), 10 ) || 0;
4279
                        parentOffset.left += num( offsetParent, 'borderLeftWidth' );
4398
                parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], 'borderLeftWidth', true), 10 ) || 0;
4280
4399
4281
                        // Subtract the two offsets
4400
                // Subtract the two offsets
4282
                        results = {
4401
                results = {
4283
                                top:  offset.top  - parentOffset.top,
4402
                        top:  offset.top  - parentOffset.top,
4284
                                left: offset.left - parentOffset.left
4403
                        left: offset.left - parentOffset.left
4285
                        };
4404
                };
4286
                }
-
 
4287
4405
4288
                return results;
4406
                return results;
4289
        },
4407
        },
4290
4408
4291
        offsetParent: function() {
4409
        offsetParent: function() {
4292
                var offsetParent = this[0].offsetParent || document.body;
4410
                var offsetParent = this[0].offsetParent || document.body;
4293
                while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
4411
                while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
4294
                        offsetParent = offsetParent.offsetParent;
4412
                        offsetParent = offsetParent.offsetParent;
4295
                return jQuery(offsetParent);
4413
                return jQuery(offsetParent);
4296
        }
4414
        }
4297
});
4415
});
4298
4416
4299
4417
4300
// Create scrollLeft and scrollTop methods
4418
// Create scrollLeft and scrollTop methods
4301
jQuery.each( ['Left', 'Top'], function(i, name) {
4419
jQuery.each( ['Left', 'Top'], function(i, name) {
4302
        var method = 'scroll' + name;
4420
        var method = 'scroll' + name;
4303
       
4421
4304
        jQuery.fn[ method ] = function(val) {
4422
        jQuery.fn[ method ] = function(val) {
4305
                if (!this[0]) return null;
4423
                if ( !this[0] ) return null;
4306
4424
4307
                return val !== undefined ?
4425
                return val !== undefined ?
4308
4426
4309
                        // Set the scroll offset
4427
                        // Set the scroll offset
4310
                        this.each(function() {
4428
                        this.each(function() {
4311
                                this == window || this == document ?
4429
                                this == window || this == document ?
4312
                                        window.scrollTo(
4430
                                        window.scrollTo(
4313
                                                !i ? val : jQuery(window).scrollLeft(),
4431
                                                !i ? val : jQuery(window).scrollLeft(),
4314
                                                 i ? val : jQuery(window).scrollTop()
4432
                                                 i ? val : jQuery(window).scrollTop()
4315
                                        ) :
4433
                                        ) :
4316
                                        this[ method ] = val;
4434
                                        this[ method ] = val;
4317
                        }) :
4435
                        }) :
4318
4436
4319
                        // Return the scroll offset
4437
                        // Return the scroll offset
4320
                        this[0] == window || this[0] == document ?
4438
                        this[0] == window || this[0] == document ?
4321
                                self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
4439
                                self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
4322
                                        jQuery.boxModel && document.documentElement[ method ] ||
4440
                                        jQuery.boxModel && document.documentElement[ method ] ||
4323
                                        document.body[ method ] :
4441
                                        document.body[ method ] :
4324
                                this[0][ method ];
4442
                                this[0][ method ];
4325
        };
4443
        };
4326
});
4444
});
4327
// Create innerHeight, innerWidth, outerHeight and outerWidth methods
4445
// Create innerHeight, innerWidth, outerHeight and outerWidth methods
4328
jQuery.each([ "Height", "Width" ], function(i, name){
4446
jQuery.each([ "Height", "Width" ], function(i, name){
4329
4447
4330
        var tl = i ? "Left"  : "Top",  // top or left
-
 
4331
                br = i ? "Right" : "Bottom", // bottom or right
-
 
4332
                lower = name.toLowerCase();
4448
        var type = name.toLowerCase();
4333
4449
4334
        // innerHeight and innerWidth
4450
        // innerHeight and innerWidth
4335
        jQuery.fn["inner" + name] = function(){
4451
        jQuery.fn["inner" + name] = function(){
4336
                return this[0] ?
4452
                return this[0] ?
4337
                        jQuery.css( this[0], lower, false, "padding" ) :
4453
                        jQuery.css( this[0], type, false, "padding" ) :
4338
                        null;
4454
                        null;
4339
        };
4455
        };
4340
4456
4341
        // outerHeight and outerWidth
4457
        // outerHeight and outerWidth
4342
        jQuery.fn["outer" + name] = function(margin) {
4458
        jQuery.fn["outer" + name] = function(margin) {
4343
                return this[0] ?
4459
                return this[0] ?
4344
                        jQuery.css( this[0], lower, false, margin ? "margin" : "border" ) :
4460
                        jQuery.css( this[0], type, false, margin ? "margin" : "border" ) :
4345
                        null;
4461
                        null;
4346
        };
4462
        };
4347
       
-
 
4348
        var type = name.toLowerCase();
-
 
4349
4463
4350
        jQuery.fn[ type ] = function( size ) {
4464
        jQuery.fn[ type ] = function( size ) {
4351
                // Get window width or height
4465
                // Get window width or height
4352
                return this[0] == window ?
4466
                return this[0] == window ?
4353
                        // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
4467
                        // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
4354
                        document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] ||
4468
                        document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] ||
4355
                        document.body[ "client" + name ] :
4469
                        document.body[ "client" + name ] :
4356
4470
4357
                        // Get document width or height
4471
                        // Get document width or height
4358
                        this[0] == document ?
4472
                        this[0] == document ?
4359
                                // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
4473
                                // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
4360
                                Math.max(
4474
                                Math.max(
4361
                                        document.documentElement["client" + name],
4475
                                        document.documentElement["client" + name],
4362
                                        document.body["scroll" + name], document.documentElement["scroll" + name],
4476
                                        document.body["scroll" + name], document.documentElement["scroll" + name],
4363
                                        document.body["offset" + name], document.documentElement["offset" + name]
4477
                                        document.body["offset" + name], document.documentElement["offset" + name]
4364
                                ) :
4478
                                ) :
4365
4479
4366
                                // Get or set width or height on the element
4480
                                // Get or set width or height on the element
4367
                                size === undefined ?
4481
                                size === undefined ?
4368
                                        // Get width or height on the element
4482
                                        // Get width or height on the element
4369
                                        (this.length ? jQuery.css( this[0], type ) : null) :
4483
                                        (this.length ? jQuery.css( this[0], type ) : null) :
4370
4484
4371
                                        // Set the width or height on the element (default to pixels if value is unitless)
4485
                                        // Set the width or height on the element (default to pixels if value is unitless)
4372
                                        this.css( type, typeof size === "string" ? size : size + "px" );
4486
                                        this.css( type, typeof size === "string" ? size : size + "px" );
4373
        };
4487
        };
4374
4488
4375
});
4489
});
4376
})();
4490
})();
4377
 
4491