Хранилища Subversion ant

Редакция

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

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