~ubuntu-branches/ubuntu/quantal/python-django/quantal-security

« back to all changes in this revision

Viewing changes to django/contrib/admin/media/js/jquery.js

  • Committer: Bazaar Package Importer
  • Author(s): Chris Lamb
  • Date: 2010-05-21 07:52:55 UTC
  • mfrom: (1.3.6 upstream)
  • mto: This revision was merged to the branch mainline in revision 28.
  • Revision ID: james.westby@ubuntu.com-20100521075255-ii78v1dyfmyu3uzx
Tags: upstream-1.2
ImportĀ upstreamĀ versionĀ 1.2

Show diffs side-by-side

added added

removed removed

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