Хранилища Subversion ant

Редакция

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

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