Statistics
| Revision:

root / hci / trunk / eneraptor-web-app / web-app / js / flot / jquery.js @ 11

History | View | Annotate | Download (118 KB)

1
/*!
2
 * jQuery JavaScript Library v1.3.2
3
 * http://jquery.com/
4
 *
5
 * Copyright (c) 2009 John Resig
6
 * Dual licensed under the MIT and GPL licenses.
7
 * http://docs.jquery.com/License
8
 *
9
 * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
10
 * Revision: 6246
11
 */
12
(function(){
13

    
14
var 
15
        // Will speed up references to window, and allows munging its name.
16
        window = this,
17
        // Will speed up references to undefined, and allows munging its name.
18
        undefined,
19
        // Map over jQuery in case of overwrite
20
        _jQuery = window.jQuery,
21
        // Map over the $ in case of overwrite
22
        _$ = window.$,
23

    
24
        jQuery = window.jQuery = window.$ = function( selector, context ) {
25
                // The jQuery object is actually just the init constructor 'enhanced'
26
                return new jQuery.fn.init( selector, context );
27
        },
28

    
29
        // A simple way to check for HTML strings or ID strings
30
        // (both of which we optimize for)
31
        quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,
32
        // Is it a simple selector
33
        isSimple = /^.[^:#\[\.,]*$/;
34

    
35
jQuery.fn = jQuery.prototype = {
36
        init: function( selector, context ) {
37
                // Make sure that a selection was provided
38
                selector = selector || document;
39

    
40
                // Handle $(DOMElement)
41
                if ( selector.nodeType ) {
42
                        this[0] = selector;
43
                        this.length = 1;
44
                        this.context = selector;
45
                        return this;
46
                }
47
                // Handle HTML strings
48
                if ( typeof selector === "string" ) {
49
                        // Are we dealing with HTML string or an ID?
50
                        var match = quickExpr.exec( selector );
51

    
52
                        // Verify a match, and that no context was specified for #id
53
                        if ( match && (match[1] || !context) ) {
54

    
55
                                // HANDLE: $(html) -> $(array)
56
                                if ( match[1] )
57
                                        selector = jQuery.clean( [ match[1] ], context );
58

    
59
                                // HANDLE: $("#id")
60
                                else {
61
                                        var elem = document.getElementById( match[3] );
62

    
63
                                        // Handle the case where IE and Opera return items
64
                                        // by name instead of ID
65
                                        if ( elem && elem.id != match[3] )
66
                                                return jQuery().find( selector );
67

    
68
                                        // Otherwise, we inject the element directly into the jQuery object
69
                                        var ret = jQuery( elem || [] );
70
                                        ret.context = document;
71
                                        ret.selector = selector;
72
                                        return ret;
73
                                }
74

    
75
                        // HANDLE: $(expr, [context])
76
                        // (which is just equivalent to: $(content).find(expr)
77
                        } else
78
                                return jQuery( context ).find( selector );
79

    
80
                // HANDLE: $(function)
81
                // Shortcut for document ready
82
                } else if ( jQuery.isFunction( selector ) )
83
                        return jQuery( document ).ready( selector );
84

    
85
                // Make sure that old selector state is passed along
86
                if ( selector.selector && selector.context ) {
87
                        this.selector = selector.selector;
88
                        this.context = selector.context;
89
                }
90

    
91
                return this.setArray(jQuery.isArray( selector ) ?
92
                        selector :
93
                        jQuery.makeArray(selector));
94
        },
95

    
96
        // Start with an empty selector
97
        selector: "",
98

    
99
        // The current version of jQuery being used
100
        jquery: "1.3.2",
101

    
102
        // The number of elements contained in the matched element set
103
        size: function() {
104
                return this.length;
105
        },
106

    
107
        // Get the Nth element in the matched element set OR
108
        // Get the whole matched element set as a clean array
109
        get: function( num ) {
110
                return num === undefined ?
111

    
112
                        // Return a 'clean' array
113
                        Array.prototype.slice.call( this ) :
114

    
115
                        // Return just the object
116
                        this[ num ];
117
        },
118

    
119
        // Take an array of elements and push it onto the stack
120
        // (returning the new matched element set)
121
        pushStack: function( elems, name, selector ) {
122
                // Build a new jQuery matched element set
123
                var ret = jQuery( elems );
124

    
125
                // Add the old object onto the stack (as a reference)
126
                ret.prevObject = this;
127

    
128
                ret.context = this.context;
129

    
130
                if ( name === "find" )
131
                        ret.selector = this.selector + (this.selector ? " " : "") + selector;
132
                else if ( name )
133
                        ret.selector = this.selector + "." + name + "(" + selector + ")";
134

    
135
                // Return the newly-formed element set
136
                return ret;
137
        },
138

    
139
        // Force the current matched set of elements to become
140
        // the specified array of elements (destroying the stack in the process)
141
        // You should use pushStack() in order to do this, but maintain the stack
142
        setArray: function( elems ) {
143
                // Resetting the length to 0, then using the native Array push
144
                // is a super-fast way to populate an object with array-like properties
145
                this.length = 0;
146
                Array.prototype.push.apply( this, elems );
147

    
148
                return this;
149
        },
150

    
151
        // Execute a callback for every element in the matched set.
152
        // (You can seed the arguments with an array of args, but this is
153
        // only used internally.)
154
        each: function( callback, args ) {
155
                return jQuery.each( this, callback, args );
156
        },
157

    
158
        // Determine the position of an element within
159
        // the matched set of elements
160
        index: function( elem ) {
161
                // Locate the position of the desired element
162
                return jQuery.inArray(
163
                        // If it receives a jQuery object, the first element is used
164
                        elem && elem.jquery ? elem[0] : elem
165
                , this );
166
        },
167

    
168
        attr: function( name, value, type ) {
169
                var options = name;
170

    
171
                // Look for the case where we're accessing a style value
172
                if ( typeof name === "string" )
173
                        if ( value === undefined )
174
                                return this[0] && jQuery[ type || "attr" ]( this[0], name );
175

    
176
                        else {
177
                                options = {};
178
                                options[ name ] = value;
179
                        }
180

    
181
                // Check to see if we're setting style values
182
                return this.each(function(i){
183
                        // Set all the styles
184
                        for ( name in options )
185
                                jQuery.attr(
186
                                        type ?
187
                                                this.style :
188
                                                this,
189
                                        name, jQuery.prop( this, options[ name ], type, i, name )
190
                                );
191
                });
192
        },
193

    
194
        css: function( key, value ) {
195
                // ignore negative width and height values
196
                if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
197
                        value = undefined;
198
                return this.attr( key, value, "curCSS" );
199
        },
200

    
201
        text: function( text ) {
202
                if ( typeof text !== "object" && text != null )
203
                        return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
204

    
205
                var ret = "";
206

    
207
                jQuery.each( text || this, function(){
208
                        jQuery.each( this.childNodes, function(){
209
                                if ( this.nodeType != 8 )
210
                                        ret += this.nodeType != 1 ?
211
                                                this.nodeValue :
212
                                                jQuery.fn.text( [ this ] );
213
                        });
214
                });
215

    
216
                return ret;
217
        },
218

    
219
        wrapAll: function( html ) {
220
                if ( this[0] ) {
221
                        // The elements to wrap the target around
222
                        var wrap = jQuery( html, this[0].ownerDocument ).clone();
223

    
224
                        if ( this[0].parentNode )
225
                                wrap.insertBefore( this[0] );
226

    
227
                        wrap.map(function(){
228
                                var elem = this;
229

    
230
                                while ( elem.firstChild )
231
                                        elem = elem.firstChild;
232

    
233
                                return elem;
234
                        }).append(this);
235
                }
236

    
237
                return this;
238
        },
239

    
240
        wrapInner: function( html ) {
241
                return this.each(function(){
242
                        jQuery( this ).contents().wrapAll( html );
243
                });
244
        },
245

    
246
        wrap: function( html ) {
247
                return this.each(function(){
248
                        jQuery( this ).wrapAll( html );
249
                });
250
        },
251

    
252
        append: function() {
253
                return this.domManip(arguments, true, function(elem){
254
                        if (this.nodeType == 1)
255
                                this.appendChild( elem );
256
                });
257
        },
258

    
259
        prepend: function() {
260
                return this.domManip(arguments, true, function(elem){
261
                        if (this.nodeType == 1)
262
                                this.insertBefore( elem, this.firstChild );
263
                });
264
        },
265

    
266
        before: function() {
267
                return this.domManip(arguments, false, function(elem){
268
                        this.parentNode.insertBefore( elem, this );
269
                });
270
        },
271

    
272
        after: function() {
273
                return this.domManip(arguments, false, function(elem){
274
                        this.parentNode.insertBefore( elem, this.nextSibling );
275
                });
276
        },
277

    
278
        end: function() {
279
                return this.prevObject || jQuery( [] );
280
        },
281

    
282
        // For internal use only.
283
        // Behaves like an Array's method, not like a jQuery method.
284
        push: [].push,
285
        sort: [].sort,
286
        splice: [].splice,
287

    
288
        find: function( selector ) {
289
                if ( this.length === 1 ) {
290
                        var ret = this.pushStack( [], "find", selector );
291
                        ret.length = 0;
292
                        jQuery.find( selector, this[0], ret );
293
                        return ret;
294
                } else {
295
                        return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){
296
                                return jQuery.find( selector, elem );
297
                        })), "find", selector );
298
                }
299
        },
300

    
301
        clone: function( events ) {
302
                // Do the clone
303
                var ret = this.map(function(){
304
                        if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
305
                                // IE copies events bound via attachEvent when
306
                                // using cloneNode. Calling detachEvent on the
307
                                // clone will also remove the events from the orignal
308
                                // In order to get around this, we use innerHTML.
309
                                // Unfortunately, this means some modifications to
310
                                // attributes in IE that are actually only stored
311
                                // as properties will not be copied (such as the
312
                                // the name attribute on an input).
313
                                var html = this.outerHTML;
314
                                if ( !html ) {
315
                                        var div = this.ownerDocument.createElement("div");
316
                                        div.appendChild( this.cloneNode(true) );
317
                                        html = div.innerHTML;
318
                                }
319

    
320
                                return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0];
321
                        } else
322
                                return this.cloneNode(true);
323
                });
324

    
325
                // Copy the events from the original to the clone
326
                if ( events === true ) {
327
                        var orig = this.find("*").andSelf(), i = 0;
328

    
329
                        ret.find("*").andSelf().each(function(){
330
                                if ( this.nodeName !== orig[i].nodeName )
331
                                        return;
332

    
333
                                var events = jQuery.data( orig[i], "events" );
334

    
335
                                for ( var type in events ) {
336
                                        for ( var handler in events[ type ] ) {
337
                                                jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
338
                                        }
339
                                }
340

    
341
                                i++;
342
                        });
343
                }
344

    
345
                // Return the cloned set
346
                return ret;
347
        },
348

    
349
        filter: function( selector ) {
350
                return this.pushStack(
351
                        jQuery.isFunction( selector ) &&
352
                        jQuery.grep(this, function(elem, i){
353
                                return selector.call( elem, i );
354
                        }) ||
355

    
356
                        jQuery.multiFilter( selector, jQuery.grep(this, function(elem){
357
                                return elem.nodeType === 1;
358
                        }) ), "filter", selector );
359
        },
360

    
361
        closest: function( selector ) {
362
                var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null,
363
                        closer = 0;
364

    
365
                return this.map(function(){
366
                        var cur = this;
367
                        while ( cur && cur.ownerDocument ) {
368
                                if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) {
369
                                        jQuery.data(cur, "closest", closer);
370
                                        return cur;
371
                                }
372
                                cur = cur.parentNode;
373
                                closer++;
374
                        }
375
                });
376
        },
377

    
378
        not: function( selector ) {
379
                if ( typeof selector === "string" )
380
                        // test special case where just one selector is passed in
381
                        if ( isSimple.test( selector ) )
382
                                return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector );
383
                        else
384
                                selector = jQuery.multiFilter( selector, this );
385

    
386
                var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
387
                return this.filter(function() {
388
                        return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
389
                });
390
        },
391

    
392
        add: function( selector ) {
393
                return this.pushStack( jQuery.unique( jQuery.merge(
394
                        this.get(),
395
                        typeof selector === "string" ?
396
                                jQuery( selector ) :
397
                                jQuery.makeArray( selector )
398
                )));
399
        },
400

    
401
        is: function( selector ) {
402
                return !!selector && jQuery.multiFilter( selector, this ).length > 0;
403
        },
404

    
405
        hasClass: function( selector ) {
406
                return !!selector && this.is( "." + selector );
407
        },
408

    
409
        val: function( value ) {
410
                if ( value === undefined ) {                        
411
                        var elem = this[0];
412

    
413
                        if ( elem ) {
414
                                if( jQuery.nodeName( elem, 'option' ) )
415
                                        return (elem.attributes.value || {}).specified ? elem.value : elem.text;
416
                                
417
                                // We need to handle select boxes special
418
                                if ( jQuery.nodeName( elem, "select" ) ) {
419
                                        var index = elem.selectedIndex,
420
                                                values = [],
421
                                                options = elem.options,
422
                                                one = elem.type == "select-one";
423

    
424
                                        // Nothing was selected
425
                                        if ( index < 0 )
426
                                                return null;
427

    
428
                                        // Loop through all the selected options
429
                                        for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
430
                                                var option = options[ i ];
431

    
432
                                                if ( option.selected ) {
433
                                                        // Get the specifc value for the option
434
                                                        value = jQuery(option).val();
435

    
436
                                                        // We don't need an array for one selects
437
                                                        if ( one )
438
                                                                return value;
439

    
440
                                                        // Multi-Selects return an array
441
                                                        values.push( value );
442
                                                }
443
                                        }
444

    
445
                                        return values;                                
446
                                }
447

    
448
                                // Everything else, we just grab the value
449
                                return (elem.value || "").replace(/\r/g, "");
450

    
451
                        }
452

    
453
                        return undefined;
454
                }
455

    
456
                if ( typeof value === "number" )
457
                        value += '';
458

    
459
                return this.each(function(){
460
                        if ( this.nodeType != 1 )
461
                                return;
462

    
463
                        if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) )
464
                                this.checked = (jQuery.inArray(this.value, value) >= 0 ||
465
                                        jQuery.inArray(this.name, value) >= 0);
466

    
467
                        else if ( jQuery.nodeName( this, "select" ) ) {
468
                                var values = jQuery.makeArray(value);
469

    
470
                                jQuery( "option", this ).each(function(){
471
                                        this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
472
                                                jQuery.inArray( this.text, values ) >= 0);
473
                                });
474

    
475
                                if ( !values.length )
476
                                        this.selectedIndex = -1;
477

    
478
                        } else
479
                                this.value = value;
480
                });
481
        },
482

    
483
        html: function( value ) {
484
                return value === undefined ?
485
                        (this[0] ?
486
                                this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") :
487
                                null) :
488
                        this.empty().append( value );
489
        },
490

    
491
        replaceWith: function( value ) {
492
                return this.after( value ).remove();
493
        },
494

    
495
        eq: function( i ) {
496
                return this.slice( i, +i + 1 );
497
        },
498

    
499
        slice: function() {
500
                return this.pushStack( Array.prototype.slice.apply( this, arguments ),
501
                        "slice", Array.prototype.slice.call(arguments).join(",") );
502
        },
503

    
504
        map: function( callback ) {
505
                return this.pushStack( jQuery.map(this, function(elem, i){
506
                        return callback.call( elem, i, elem );
507
                }));
508
        },
509

    
510
        andSelf: function() {
511
                return this.add( this.prevObject );
512
        },
513

    
514
        domManip: function( args, table, callback ) {
515
                if ( this[0] ) {
516
                        var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(),
517
                                scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ),
518
                                first = fragment.firstChild;
519

    
520
                        if ( first )
521
                                for ( var i = 0, l = this.length; i < l; i++ )
522
                                        callback.call( root(this[i], first), this.length > 1 || i > 0 ?
523
                                                        fragment.cloneNode(true) : fragment );
524
                
525
                        if ( scripts )
526
                                jQuery.each( scripts, evalScript );
527
                }
528

    
529
                return this;
530
                
531
                function root( elem, cur ) {
532
                        return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ?
533
                                (elem.getElementsByTagName("tbody")[0] ||
534
                                elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
535
                                elem;
536
                }
537
        }
538
};
539

    
540
// Give the init function the jQuery prototype for later instantiation
541
jQuery.fn.init.prototype = jQuery.fn;
542

    
543
function evalScript( i, elem ) {
544
        if ( elem.src )
545
                jQuery.ajax({
546
                        url: elem.src,
547
                        async: false,
548
                        dataType: "script"
549
                });
550

    
551
        else
552
                jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
553

    
554
        if ( elem.parentNode )
555
                elem.parentNode.removeChild( elem );
556
}
557

    
558
function now(){
559
        return +new Date;
560
}
561

    
562
jQuery.extend = jQuery.fn.extend = function() {
563
        // copy reference to target object
564
        var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
565

    
566
        // Handle a deep copy situation
567
        if ( typeof target === "boolean" ) {
568
                deep = target;
569
                target = arguments[1] || {};
570
                // skip the boolean and the target
571
                i = 2;
572
        }
573

    
574
        // Handle case when target is a string or something (possible in deep copy)
575
        if ( typeof target !== "object" && !jQuery.isFunction(target) )
576
                target = {};
577

    
578
        // extend jQuery itself if only one argument is passed
579
        if ( length == i ) {
580
                target = this;
581
                --i;
582
        }
583

    
584
        for ( ; i < length; i++ )
585
                // Only deal with non-null/undefined values
586
                if ( (options = arguments[ i ]) != null )
587
                        // Extend the base object
588
                        for ( var name in options ) {
589
                                var src = target[ name ], copy = options[ name ];
590

    
591
                                // Prevent never-ending loop
592
                                if ( target === copy )
593
                                        continue;
594

    
595
                                // Recurse if we're merging object values
596
                                if ( deep && copy && typeof copy === "object" && !copy.nodeType )
597
                                        target[ name ] = jQuery.extend( deep, 
598
                                                // Never move original objects, clone them
599
                                                src || ( copy.length != null ? [ ] : { } )
600
                                        , copy );
601

    
602
                                // Don't bring in undefined values
603
                                else if ( copy !== undefined )
604
                                        target[ name ] = copy;
605

    
606
                        }
607

    
608
        // Return the modified object
609
        return target;
610
};
611

    
612
// exclude the following css properties to add px
613
var        exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
614
        // cache defaultView
615
        defaultView = document.defaultView || {},
616
        toString = Object.prototype.toString;
617

    
618
jQuery.extend({
619
        noConflict: function( deep ) {
620
                window.$ = _$;
621

    
622
                if ( deep )
623
                        window.jQuery = _jQuery;
624

    
625
                return jQuery;
626
        },
627

    
628
        // See test/unit/core.js for details concerning isFunction.
629
        // Since version 1.3, DOM methods and functions like alert
630
        // aren't supported. They return false on IE (#2968).
631
        isFunction: function( obj ) {
632
                return toString.call(obj) === "[object Function]";
633
        },
634

    
635
        isArray: function( obj ) {
636
                return toString.call(obj) === "[object Array]";
637
        },
638

    
639
        // check if an element is in a (or is an) XML document
640
        isXMLDoc: function( elem ) {
641
                return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
642
                        !!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument );
643
        },
644

    
645
        // Evalulates a script in a global context
646
        globalEval: function( data ) {
647
                if ( data && /\S/.test(data) ) {
648
                        // Inspired by code by Andrea Giammarchi
649
                        // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
650
                        var head = document.getElementsByTagName("head")[0] || document.documentElement,
651
                                script = document.createElement("script");
652

    
653
                        script.type = "text/javascript";
654
                        if ( jQuery.support.scriptEval )
655
                                script.appendChild( document.createTextNode( data ) );
656
                        else
657
                                script.text = data;
658

    
659
                        // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
660
                        // This arises when a base node is used (#2709).
661
                        head.insertBefore( script, head.firstChild );
662
                        head.removeChild( script );
663
                }
664
        },
665

    
666
        nodeName: function( elem, name ) {
667
                return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
668
        },
669

    
670
        // args is for internal usage only
671
        each: function( object, callback, args ) {
672
                var name, i = 0, length = object.length;
673

    
674
                if ( args ) {
675
                        if ( length === undefined ) {
676
                                for ( name in object )
677
                                        if ( callback.apply( object[ name ], args ) === false )
678
                                                break;
679
                        } else
680
                                for ( ; i < length; )
681
                                        if ( callback.apply( object[ i++ ], args ) === false )
682
                                                break;
683

    
684
                // A special, fast, case for the most common use of each
685
                } else {
686
                        if ( length === undefined ) {
687
                                for ( name in object )
688
                                        if ( callback.call( object[ name ], name, object[ name ] ) === false )
689
                                                break;
690
                        } else
691
                                for ( var value = object[0];
692
                                        i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
693
                }
694

    
695
                return object;
696
        },
697

    
698
        prop: function( elem, value, type, i, name ) {
699
                // Handle executable functions
700
                if ( jQuery.isFunction( value ) )
701
                        value = value.call( elem, i );
702

    
703
                // Handle passing in a number to a CSS property
704
                return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ?
705
                        value + "px" :
706
                        value;
707
        },
708

    
709
        className: {
710
                // internal only, use addClass("class")
711
                add: function( elem, classNames ) {
712
                        jQuery.each((classNames || "").split(/\s+/), function(i, className){
713
                                if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
714
                                        elem.className += (elem.className ? " " : "") + className;
715
                        });
716
                },
717

    
718
                // internal only, use removeClass("class")
719
                remove: function( elem, classNames ) {
720
                        if (elem.nodeType == 1)
721
                                elem.className = classNames !== undefined ?
722
                                        jQuery.grep(elem.className.split(/\s+/), function(className){
723
                                                return !jQuery.className.has( classNames, className );
724
                                        }).join(" ") :
725
                                        "";
726
                },
727

    
728
                // internal only, use hasClass("class")
729
                has: function( elem, className ) {
730
                        return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
731
                }
732
        },
733

    
734
        // A method for quickly swapping in/out CSS properties to get correct calculations
735
        swap: function( elem, options, callback ) {
736
                var old = {};
737
                // Remember the old values, and insert the new ones
738
                for ( var name in options ) {
739
                        old[ name ] = elem.style[ name ];
740
                        elem.style[ name ] = options[ name ];
741
                }
742

    
743
                callback.call( elem );
744

    
745
                // Revert the old values
746
                for ( var name in options )
747
                        elem.style[ name ] = old[ name ];
748
        },
749

    
750
        css: function( elem, name, force, extra ) {
751
                if ( name == "width" || name == "height" ) {
752
                        var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
753

    
754
                        function getWH() {
755
                                val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
756

    
757
                                if ( extra === "border" )
758
                                        return;
759

    
760
                                jQuery.each( which, function() {
761
                                        if ( !extra )
762
                                                val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
763
                                        if ( extra === "margin" )
764
                                                val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
765
                                        else
766
                                                val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
767
                                });
768
                        }
769

    
770
                        if ( elem.offsetWidth !== 0 )
771
                                getWH();
772
                        else
773
                                jQuery.swap( elem, props, getWH );
774

    
775
                        return Math.max(0, Math.round(val));
776
                }
777

    
778
                return jQuery.curCSS( elem, name, force );
779
        },
780

    
781
        curCSS: function( elem, name, force ) {
782
                var ret, style = elem.style;
783

    
784
                // We need to handle opacity special in IE
785
                if ( name == "opacity" && !jQuery.support.opacity ) {
786
                        ret = jQuery.attr( style, "opacity" );
787

    
788
                        return ret == "" ?
789
                                "1" :
790
                                ret;
791
                }
792

    
793
                // Make sure we're using the right name for getting the float value
794
                if ( name.match( /float/i ) )
795
                        name = styleFloat;
796

    
797
                if ( !force && style && style[ name ] )
798
                        ret = style[ name ];
799

    
800
                else if ( defaultView.getComputedStyle ) {
801

    
802
                        // Only "float" is needed here
803
                        if ( name.match( /float/i ) )
804
                                name = "float";
805

    
806
                        name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
807

    
808
                        var computedStyle = defaultView.getComputedStyle( elem, null );
809

    
810
                        if ( computedStyle )
811
                                ret = computedStyle.getPropertyValue( name );
812

    
813
                        // We should always get a number back from opacity
814
                        if ( name == "opacity" && ret == "" )
815
                                ret = "1";
816

    
817
                } else if ( elem.currentStyle ) {
818
                        var camelCase = name.replace(/\-(\w)/g, function(all, letter){
819
                                return letter.toUpperCase();
820
                        });
821

    
822
                        ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
823

    
824
                        // From the awesome hack by Dean Edwards
825
                        // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
826

    
827
                        // If we're not dealing with a regular pixel number
828
                        // but a number that has a weird ending, we need to convert it to pixels
829
                        if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
830
                                // Remember the original values
831
                                var left = style.left, rsLeft = elem.runtimeStyle.left;
832

    
833
                                // Put in the new values to get a computed value out
834
                                elem.runtimeStyle.left = elem.currentStyle.left;
835
                                style.left = ret || 0;
836
                                ret = style.pixelLeft + "px";
837

    
838
                                // Revert the changed values
839
                                style.left = left;
840
                                elem.runtimeStyle.left = rsLeft;
841
                        }
842
                }
843

    
844
                return ret;
845
        },
846

    
847
        clean: function( elems, context, fragment ) {
848
                context = context || document;
849

    
850
                // !context.createElement fails in IE with an error but returns typeof 'object'
851
                if ( typeof context.createElement === "undefined" )
852
                        context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
853

    
854
                // If a single string is passed in and it's a single tag
855
                // just do a createElement and skip the rest
856
                if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) {
857
                        var match = /^<(\w+)\s*\/?>$/.exec(elems[0]);
858
                        if ( match )
859
                                return [ context.createElement( match[1] ) ];
860
                }
861

    
862
                var ret = [], scripts = [], div = context.createElement("div");
863

    
864
                jQuery.each(elems, function(i, elem){
865
                        if ( typeof elem === "number" )
866
                                elem += '';
867

    
868
                        if ( !elem )
869
                                return;
870

    
871
                        // Convert html string into DOM nodes
872
                        if ( typeof elem === "string" ) {
873
                                // Fix "XHTML"-style tags in all browsers
874
                                elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
875
                                        return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
876
                                                all :
877
                                                front + "></" + tag + ">";
878
                                });
879

    
880
                                // Trim whitespace, otherwise indexOf won't work as expected
881
                                var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase();
882

    
883
                                var wrap =
884
                                        // option or optgroup
885
                                        !tags.indexOf("<opt") &&
886
                                        [ 1, "<select multiple='multiple'>", "</select>" ] ||
887

    
888
                                        !tags.indexOf("<leg") &&
889
                                        [ 1, "<fieldset>", "</fieldset>" ] ||
890

    
891
                                        tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
892
                                        [ 1, "<table>", "</table>" ] ||
893

    
894
                                        !tags.indexOf("<tr") &&
895
                                        [ 2, "<table><tbody>", "</tbody></table>" ] ||
896

    
897
                                         // <thead> matched above
898
                                        (!tags.indexOf("<td") || !tags.indexOf("<th")) &&
899
                                        [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
900

    
901
                                        !tags.indexOf("<col") &&
902
                                        [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
903

    
904
                                        // IE can't serialize <link> and <script> tags normally
905
                                        !jQuery.support.htmlSerialize &&
906
                                        [ 1, "div<div>", "</div>" ] ||
907

    
908
                                        [ 0, "", "" ];
909

    
910
                                // Go to html and back, then peel off extra wrappers
911
                                div.innerHTML = wrap[1] + elem + wrap[2];
912

    
913
                                // Move to the right depth
914
                                while ( wrap[0]-- )
915
                                        div = div.lastChild;
916

    
917
                                // Remove IE's autoinserted <tbody> from table fragments
918
                                if ( !jQuery.support.tbody ) {
919

    
920
                                        // String was a <table>, *may* have spurious <tbody>
921
                                        var hasBody = /<tbody/i.test(elem),
922
                                                tbody = !tags.indexOf("<table") && !hasBody ?
923
                                                        div.firstChild && div.firstChild.childNodes :
924

    
925
                                                // String was a bare <thead> or <tfoot>
926
                                                wrap[1] == "<table>" && !hasBody ?
927
                                                        div.childNodes :
928
                                                        [];
929

    
930
                                        for ( var j = tbody.length - 1; j >= 0 ; --j )
931
                                                if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
932
                                                        tbody[ j ].parentNode.removeChild( tbody[ j ] );
933

    
934
                                        }
935

    
936
                                // IE completely kills leading whitespace when innerHTML is used
937
                                if ( !jQuery.support.leadingWhitespace && /^\s/.test( elem ) )
938
                                        div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
939
                                
940
                                elem = jQuery.makeArray( div.childNodes );
941
                        }
942

    
943
                        if ( elem.nodeType )
944
                                ret.push( elem );
945
                        else
946
                                ret = jQuery.merge( ret, elem );
947

    
948
                });
949

    
950
                if ( fragment ) {
951
                        for ( var i = 0; ret[i]; i++ ) {
952
                                if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
953
                                        scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
954
                                } else {
955
                                        if ( ret[i].nodeType === 1 )
956
                                                ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
957
                                        fragment.appendChild( ret[i] );
958
                                }
959
                        }
960
                        
961
                        return scripts;
962
                }
963

    
964
                return ret;
965
        },
966

    
967
        attr: function( elem, name, value ) {
968
                // don't set attributes on text and comment nodes
969
                if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
970
                        return undefined;
971

    
972
                var notxml = !jQuery.isXMLDoc( elem ),
973
                        // Whether we are setting (or getting)
974
                        set = value !== undefined;
975

    
976
                // Try to normalize/fix the name
977
                name = notxml && jQuery.props[ name ] || name;
978

    
979
                // Only do all the following if this is a node (faster for style)
980
                // IE elem.getAttribute passes even for style
981
                if ( elem.tagName ) {
982

    
983
                        // These attributes require special treatment
984
                        var special = /href|src|style/.test( name );
985

    
986
                        // Safari mis-reports the default selected property of a hidden option
987
                        // Accessing the parent's selectedIndex property fixes it
988
                        if ( name == "selected" && elem.parentNode )
989
                                elem.parentNode.selectedIndex;
990

    
991
                        // If applicable, access the attribute via the DOM 0 way
992
                        if ( name in elem && notxml && !special ) {
993
                                if ( set ){
994
                                        // We can't allow the type property to be changed (since it causes problems in IE)
995
                                        if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
996
                                                throw "type property can't be changed";
997

    
998
                                        elem[ name ] = value;
999
                                }
1000

    
1001
                                // browsers index elements by id/name on forms, give priority to attributes.
1002
                                if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
1003
                                        return elem.getAttributeNode( name ).nodeValue;
1004

    
1005
                                // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
1006
                                // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
1007
                                if ( name == "tabIndex" ) {
1008
                                        var attributeNode = elem.getAttributeNode( "tabIndex" );
1009
                                        return attributeNode && attributeNode.specified
1010
                                                ? attributeNode.value
1011
                                                : elem.nodeName.match(/(button|input|object|select|textarea)/i)
1012
                                                        ? 0
1013
                                                        : elem.nodeName.match(/^(a|area)$/i) && elem.href
1014
                                                                ? 0
1015
                                                                : undefined;
1016
                                }
1017

    
1018
                                return elem[ name ];
1019
                        }
1020

    
1021
                        if ( !jQuery.support.style && notxml &&  name == "style" )
1022
                                return jQuery.attr( elem.style, "cssText", value );
1023

    
1024
                        if ( set )
1025
                                // convert the value to a string (all browsers do this but IE) see #1070
1026
                                elem.setAttribute( name, "" + value );
1027

    
1028
                        var attr = !jQuery.support.hrefNormalized && notxml && special
1029
                                        // Some attributes require a special call on IE
1030
                                        ? elem.getAttribute( name, 2 )
1031
                                        : elem.getAttribute( name );
1032

    
1033
                        // Non-existent attributes return null, we normalize to undefined
1034
                        return attr === null ? undefined : attr;
1035
                }
1036

    
1037
                // elem is actually elem.style ... set the style
1038

    
1039
                // IE uses filters for opacity
1040
                if ( !jQuery.support.opacity && name == "opacity" ) {
1041
                        if ( set ) {
1042
                                // IE has trouble with opacity if it does not have layout
1043
                                // Force it by setting the zoom level
1044
                                elem.zoom = 1;
1045

    
1046
                                // Set the alpha filter to set the opacity
1047
                                elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +
1048
                                        (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
1049
                        }
1050

    
1051
                        return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
1052
                                (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
1053
                                "";
1054
                }
1055

    
1056
                name = name.replace(/-([a-z])/ig, function(all, letter){
1057
                        return letter.toUpperCase();
1058
                });
1059

    
1060
                if ( set )
1061
                        elem[ name ] = value;
1062

    
1063
                return elem[ name ];
1064
        },
1065

    
1066
        trim: function( text ) {
1067
                return (text || "").replace( /^\s+|\s+$/g, "" );
1068
        },
1069

    
1070
        makeArray: function( array ) {
1071
                var ret = [];
1072

    
1073
                if( array != null ){
1074
                        var i = array.length;
1075
                        // The window, strings (and functions) also have 'length'
1076
                        if( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval )
1077
                                ret[0] = array;
1078
                        else
1079
                                while( i )
1080
                                        ret[--i] = array[i];
1081
                }
1082

    
1083
                return ret;
1084
        },
1085

    
1086
        inArray: function( elem, array ) {
1087
                for ( var i = 0, length = array.length; i < length; i++ )
1088
                // Use === because on IE, window == document
1089
                        if ( array[ i ] === elem )
1090
                                return i;
1091

    
1092
                return -1;
1093
        },
1094

    
1095
        merge: function( first, second ) {
1096
                // We have to loop this way because IE & Opera overwrite the length
1097
                // expando of getElementsByTagName
1098
                var i = 0, elem, pos = first.length;
1099
                // Also, we need to make sure that the correct elements are being returned
1100
                // (IE returns comment nodes in a '*' query)
1101
                if ( !jQuery.support.getAll ) {
1102
                        while ( (elem = second[ i++ ]) != null )
1103
                                if ( elem.nodeType != 8 )
1104
                                        first[ pos++ ] = elem;
1105

    
1106
                } else
1107
                        while ( (elem = second[ i++ ]) != null )
1108
                                first[ pos++ ] = elem;
1109

    
1110
                return first;
1111
        },
1112

    
1113
        unique: function( array ) {
1114
                var ret = [], done = {};
1115

    
1116
                try {
1117

    
1118
                        for ( var i = 0, length = array.length; i < length; i++ ) {
1119
                                var id = jQuery.data( array[ i ] );
1120

    
1121
                                if ( !done[ id ] ) {
1122
                                        done[ id ] = true;
1123
                                        ret.push( array[ i ] );
1124
                                }
1125
                        }
1126

    
1127
                } catch( e ) {
1128
                        ret = array;
1129
                }
1130

    
1131
                return ret;
1132
        },
1133

    
1134
        grep: function( elems, callback, inv ) {
1135
                var ret = [];
1136

    
1137
                // Go through the array, only saving the items
1138
                // that pass the validator function
1139
                for ( var i = 0, length = elems.length; i < length; i++ )
1140
                        if ( !inv != !callback( elems[ i ], i ) )
1141
                                ret.push( elems[ i ] );
1142

    
1143
                return ret;
1144
        },
1145

    
1146
        map: function( elems, callback ) {
1147
                var ret = [];
1148

    
1149
                // Go through the array, translating each of the items to their
1150
                // new value (or values).
1151
                for ( var i = 0, length = elems.length; i < length; i++ ) {
1152
                        var value = callback( elems[ i ], i );
1153

    
1154
                        if ( value != null )
1155
                                ret[ ret.length ] = value;
1156
                }
1157

    
1158
                return ret.concat.apply( [], ret );
1159
        }
1160
});
1161

    
1162
// Use of jQuery.browser is deprecated.
1163
// It's included for backwards compatibility and plugins,
1164
// although they should work to migrate away.
1165

    
1166
var userAgent = navigator.userAgent.toLowerCase();
1167

    
1168
// Figure out what browser is being used
1169
jQuery.browser = {
1170
        version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
1171
        safari: /webkit/.test( userAgent ),
1172
        opera: /opera/.test( userAgent ),
1173
        msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
1174
        mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
1175
};
1176

    
1177
jQuery.each({
1178
        parent: function(elem){return elem.parentNode;},
1179
        parents: function(elem){return jQuery.dir(elem,"parentNode");},
1180
        next: function(elem){return jQuery.nth(elem,2,"nextSibling");},
1181
        prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},
1182
        nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},
1183
        prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},
1184
        siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
1185
        children: function(elem){return jQuery.sibling(elem.firstChild);},
1186
        contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
1187
}, function(name, fn){
1188
        jQuery.fn[ name ] = function( selector ) {
1189
                var ret = jQuery.map( this, fn );
1190

    
1191
                if ( selector && typeof selector == "string" )
1192
                        ret = jQuery.multiFilter( selector, ret );
1193

    
1194
                return this.pushStack( jQuery.unique( ret ), name, selector );
1195
        };
1196
});
1197

    
1198
jQuery.each({
1199
        appendTo: "append",
1200
        prependTo: "prepend",
1201
        insertBefore: "before",
1202
        insertAfter: "after",
1203
        replaceAll: "replaceWith"
1204
}, function(name, original){
1205
        jQuery.fn[ name ] = function( selector ) {
1206
                var ret = [], insert = jQuery( selector );
1207

    
1208
                for ( var i = 0, l = insert.length; i < l; i++ ) {
1209
                        var elems = (i > 0 ? this.clone(true) : this).get();
1210
                        jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
1211
                        ret = ret.concat( elems );
1212
                }
1213

    
1214
                return this.pushStack( ret, name, selector );
1215
        };
1216
});
1217

    
1218
jQuery.each({
1219
        removeAttr: function( name ) {
1220
                jQuery.attr( this, name, "" );
1221
                if (this.nodeType == 1)
1222
                        this.removeAttribute( name );
1223
        },
1224

    
1225
        addClass: function( classNames ) {
1226
                jQuery.className.add( this, classNames );
1227
        },
1228

    
1229
        removeClass: function( classNames ) {
1230
                jQuery.className.remove( this, classNames );
1231
        },
1232

    
1233
        toggleClass: function( classNames, state ) {
1234
                if( typeof state !== "boolean" )
1235
                        state = !jQuery.className.has( this, classNames );
1236
                jQuery.className[ state ? "add" : "remove" ]( this, classNames );
1237
        },
1238

    
1239
        remove: function( selector ) {
1240
                if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
1241
                        // Prevent memory leaks
1242
                        jQuery( "*", this ).add([this]).each(function(){
1243
                                jQuery.event.remove(this);
1244
                                jQuery.removeData(this);
1245
                        });
1246
                        if (this.parentNode)
1247
                                this.parentNode.removeChild( this );
1248
                }
1249
        },
1250

    
1251
        empty: function() {
1252
                // Remove element nodes and prevent memory leaks
1253
                jQuery(this).children().remove();
1254

    
1255
                // Remove any remaining nodes
1256
                while ( this.firstChild )
1257
                        this.removeChild( this.firstChild );
1258
        }
1259
}, function(name, fn){
1260
        jQuery.fn[ name ] = function(){
1261
                return this.each( fn, arguments );
1262
        };
1263
});
1264

    
1265
// Helper function used by the dimensions and offset modules
1266
function num(elem, prop) {
1267
        return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
1268
}
1269
var expando = "jQuery" + now(), uuid = 0, windowData = {};
1270

    
1271
jQuery.extend({
1272
        cache: {},
1273

    
1274
        data: function( elem, name, data ) {
1275
                elem = elem == window ?
1276
                        windowData :
1277
                        elem;
1278

    
1279
                var id = elem[ expando ];
1280

    
1281
                // Compute a unique ID for the element
1282
                if ( !id )
1283
                        id = elem[ expando ] = ++uuid;
1284

    
1285
                // Only generate the data cache if we're
1286
                // trying to access or manipulate it
1287
                if ( name && !jQuery.cache[ id ] )
1288
                        jQuery.cache[ id ] = {};
1289

    
1290
                // Prevent overriding the named cache with undefined values
1291
                if ( data !== undefined )
1292
                        jQuery.cache[ id ][ name ] = data;
1293

    
1294
                // Return the named cache data, or the ID for the element
1295
                return name ?
1296
                        jQuery.cache[ id ][ name ] :
1297
                        id;
1298
        },
1299

    
1300
        removeData: function( elem, name ) {
1301
                elem = elem == window ?
1302
                        windowData :
1303
                        elem;
1304

    
1305
                var id = elem[ expando ];
1306

    
1307
                // If we want to remove a specific section of the element's data
1308
                if ( name ) {
1309
                        if ( jQuery.cache[ id ] ) {
1310
                                // Remove the section of cache data
1311
                                delete jQuery.cache[ id ][ name ];
1312

    
1313
                                // If we've removed all the data, remove the element's cache
1314
                                name = "";
1315

    
1316
                                for ( name in jQuery.cache[ id ] )
1317
                                        break;
1318

    
1319
                                if ( !name )
1320
                                        jQuery.removeData( elem );
1321
                        }
1322

    
1323
                // Otherwise, we want to remove all of the element's data
1324
                } else {
1325
                        // Clean up the element expando
1326
                        try {
1327
                                delete elem[ expando ];
1328
                        } catch(e){
1329
                                // IE has trouble directly removing the expando
1330
                                // but it's ok with using removeAttribute
1331
                                if ( elem.removeAttribute )
1332
                                        elem.removeAttribute( expando );
1333
                        }
1334

    
1335
                        // Completely remove the data cache
1336
                        delete jQuery.cache[ id ];
1337
                }
1338
        },
1339
        queue: function( elem, type, data ) {
1340
                if ( elem ){
1341
        
1342
                        type = (type || "fx") + "queue";
1343
        
1344
                        var q = jQuery.data( elem, type );
1345
        
1346
                        if ( !q || jQuery.isArray(data) )
1347
                                q = jQuery.data( elem, type, jQuery.makeArray(data) );
1348
                        else if( data )
1349
                                q.push( data );
1350
        
1351
                }
1352
                return q;
1353
        },
1354

    
1355
        dequeue: function( elem, type ){
1356
                var queue = jQuery.queue( elem, type ),
1357
                        fn = queue.shift();
1358
                
1359
                if( !type || type === "fx" )
1360
                        fn = queue[0];
1361
                        
1362
                if( fn !== undefined )
1363
                        fn.call(elem);
1364
        }
1365
});
1366

    
1367
jQuery.fn.extend({
1368
        data: function( key, value ){
1369
                var parts = key.split(".");
1370
                parts[1] = parts[1] ? "." + parts[1] : "";
1371

    
1372
                if ( value === undefined ) {
1373
                        var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1374

    
1375
                        if ( data === undefined && this.length )
1376
                                data = jQuery.data( this[0], key );
1377

    
1378
                        return data === undefined && parts[1] ?
1379
                                this.data( parts[0] ) :
1380
                                data;
1381
                } else
1382
                        return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
1383
                                jQuery.data( this, key, value );
1384
                        });
1385
        },
1386

    
1387
        removeData: function( key ){
1388
                return this.each(function(){
1389
                        jQuery.removeData( this, key );
1390
                });
1391
        },
1392
        queue: function(type, data){
1393
                if ( typeof type !== "string" ) {
1394
                        data = type;
1395
                        type = "fx";
1396
                }
1397

    
1398
                if ( data === undefined )
1399
                        return jQuery.queue( this[0], type );
1400

    
1401
                return this.each(function(){
1402
                        var queue = jQuery.queue( this, type, data );
1403
                        
1404
                         if( type == "fx" && queue.length == 1 )
1405
                                queue[0].call(this);
1406
                });
1407
        },
1408
        dequeue: function(type){
1409
                return this.each(function(){
1410
                        jQuery.dequeue( this, type );
1411
                });
1412
        }
1413
});/*!
1414
 * Sizzle CSS Selector Engine - v0.9.3
1415
 *  Copyright 2009, The Dojo Foundation
1416
 *  Released under the MIT, BSD, and GPL Licenses.
1417
 *  More information: http://sizzlejs.com/
1418
 */
1419
(function(){
1420

    
1421
var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,
1422
        done = 0,
1423
        toString = Object.prototype.toString;
1424

    
1425
var Sizzle = function(selector, context, results, seed) {
1426
        results = results || [];
1427
        context = context || document;
1428

    
1429
        if ( context.nodeType !== 1 && context.nodeType !== 9 )
1430
                return [];
1431
        
1432
        if ( !selector || typeof selector !== "string" ) {
1433
                return results;
1434
        }
1435

    
1436
        var parts = [], m, set, checkSet, check, mode, extra, prune = true;
1437
        
1438
        // Reset the position of the chunker regexp (start from head)
1439
        chunker.lastIndex = 0;
1440
        
1441
        while ( (m = chunker.exec(selector)) !== null ) {
1442
                parts.push( m[1] );
1443
                
1444
                if ( m[2] ) {
1445
                        extra = RegExp.rightContext;
1446
                        break;
1447
                }
1448
        }
1449

    
1450
        if ( parts.length > 1 && origPOS.exec( selector ) ) {
1451
                if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
1452
                        set = posProcess( parts[0] + parts[1], context );
1453
                } else {
1454
                        set = Expr.relative[ parts[0] ] ?
1455
                                [ context ] :
1456
                                Sizzle( parts.shift(), context );
1457

    
1458
                        while ( parts.length ) {
1459
                                selector = parts.shift();
1460

    
1461
                                if ( Expr.relative[ selector ] )
1462
                                        selector += parts.shift();
1463

    
1464
                                set = posProcess( selector, set );
1465
                        }
1466
                }
1467
        } else {
1468
                var ret = seed ?
1469
                        { expr: parts.pop(), set: makeArray(seed) } :
1470
                        Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context, isXML(context) );
1471
                set = Sizzle.filter( ret.expr, ret.set );
1472

    
1473
                if ( parts.length > 0 ) {
1474
                        checkSet = makeArray(set);
1475
                } else {
1476
                        prune = false;
1477
                }
1478

    
1479
                while ( parts.length ) {
1480
                        var cur = parts.pop(), pop = cur;
1481

    
1482
                        if ( !Expr.relative[ cur ] ) {
1483
                                cur = "";
1484
                        } else {
1485
                                pop = parts.pop();
1486
                        }
1487

    
1488
                        if ( pop == null ) {
1489
                                pop = context;
1490
                        }
1491

    
1492
                        Expr.relative[ cur ]( checkSet, pop, isXML(context) );
1493
                }
1494
        }
1495

    
1496
        if ( !checkSet ) {
1497
                checkSet = set;
1498
        }
1499

    
1500
        if ( !checkSet ) {
1501
                throw "Syntax error, unrecognized expression: " + (cur || selector);
1502
        }
1503

    
1504
        if ( toString.call(checkSet) === "[object Array]" ) {
1505
                if ( !prune ) {
1506
                        results.push.apply( results, checkSet );
1507
                } else if ( context.nodeType === 1 ) {
1508
                        for ( var i = 0; checkSet[i] != null; i++ ) {
1509
                                if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
1510
                                        results.push( set[i] );
1511
                                }
1512
                        }
1513
                } else {
1514
                        for ( var i = 0; checkSet[i] != null; i++ ) {
1515
                                if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
1516
                                        results.push( set[i] );
1517
                                }
1518
                        }
1519
                }
1520
        } else {
1521
                makeArray( checkSet, results );
1522
        }
1523

    
1524
        if ( extra ) {
1525
                Sizzle( extra, context, results, seed );
1526

    
1527
                if ( sortOrder ) {
1528
                        hasDuplicate = false;
1529
                        results.sort(sortOrder);
1530

    
1531
                        if ( hasDuplicate ) {
1532
                                for ( var i = 1; i < results.length; i++ ) {
1533
                                        if ( results[i] === results[i-1] ) {
1534
                                                results.splice(i--, 1);
1535
                                        }
1536
                                }
1537
                        }
1538
                }
1539
        }
1540

    
1541
        return results;
1542
};
1543

    
1544
Sizzle.matches = function(expr, set){
1545
        return Sizzle(expr, null, null, set);
1546
};
1547

    
1548
Sizzle.find = function(expr, context, isXML){
1549
        var set, match;
1550

    
1551
        if ( !expr ) {
1552
                return [];
1553
        }
1554

    
1555
        for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
1556
                var type = Expr.order[i], match;
1557
                
1558
                if ( (match = Expr.match[ type ].exec( expr )) ) {
1559
                        var left = RegExp.leftContext;
1560

    
1561
                        if ( left.substr( left.length - 1 ) !== "\\" ) {
1562
                                match[1] = (match[1] || "").replace(/\\/g, "");
1563
                                set = Expr.find[ type ]( match, context, isXML );
1564
                                if ( set != null ) {
1565
                                        expr = expr.replace( Expr.match[ type ], "" );
1566
                                        break;
1567
                                }
1568
                        }
1569
                }
1570
        }
1571

    
1572
        if ( !set ) {
1573
                set = context.getElementsByTagName("*");
1574
        }
1575

    
1576
        return {set: set, expr: expr};
1577
};
1578

    
1579
Sizzle.filter = function(expr, set, inplace, not){
1580
        var old = expr, result = [], curLoop = set, match, anyFound,
1581
                isXMLFilter = set && set[0] && isXML(set[0]);
1582

    
1583
        while ( expr && set.length ) {
1584
                for ( var type in Expr.filter ) {
1585
                        if ( (match = Expr.match[ type ].exec( expr )) != null ) {
1586
                                var filter = Expr.filter[ type ], found, item;
1587
                                anyFound = false;
1588

    
1589
                                if ( curLoop == result ) {
1590
                                        result = [];
1591
                                }
1592

    
1593
                                if ( Expr.preFilter[ type ] ) {
1594
                                        match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
1595

    
1596
                                        if ( !match ) {
1597
                                                anyFound = found = true;
1598
                                        } else if ( match === true ) {
1599
                                                continue;
1600
                                        }
1601
                                }
1602

    
1603
                                if ( match ) {
1604
                                        for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
1605
                                                if ( item ) {
1606
                                                        found = filter( item, match, i, curLoop );
1607
                                                        var pass = not ^ !!found;
1608

    
1609
                                                        if ( inplace && found != null ) {
1610
                                                                if ( pass ) {
1611
                                                                        anyFound = true;
1612
                                                                } else {
1613
                                                                        curLoop[i] = false;
1614
                                                                }
1615
                                                        } else if ( pass ) {
1616
                                                                result.push( item );
1617
                                                                anyFound = true;
1618
                                                        }
1619
                                                }
1620
                                        }
1621
                                }
1622

    
1623
                                if ( found !== undefined ) {
1624
                                        if ( !inplace ) {
1625
                                                curLoop = result;
1626
                                        }
1627

    
1628
                                        expr = expr.replace( Expr.match[ type ], "" );
1629

    
1630
                                        if ( !anyFound ) {
1631
                                                return [];
1632
                                        }
1633

    
1634
                                        break;
1635
                                }
1636
                        }
1637
                }
1638

    
1639
                // Improper expression
1640
                if ( expr == old ) {
1641
                        if ( anyFound == null ) {
1642
                                throw "Syntax error, unrecognized expression: " + expr;
1643
                        } else {
1644
                                break;
1645
                        }
1646
                }
1647

    
1648
                old = expr;
1649
        }
1650

    
1651
        return curLoop;
1652
};
1653

    
1654
var Expr = Sizzle.selectors = {
1655
        order: [ "ID", "NAME", "TAG" ],
1656
        match: {
1657
                ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
1658
                CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
1659
                NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,
1660
                ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
1661
                TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,
1662
                CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
1663
                POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
1664
                PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
1665
        },
1666
        attrMap: {
1667
                "class": "className",
1668
                "for": "htmlFor"
1669
        },
1670
        attrHandle: {
1671
                href: function(elem){
1672
                        return elem.getAttribute("href");
1673
                }
1674
        },
1675
        relative: {
1676
                "+": function(checkSet, part, isXML){
1677
                        var isPartStr = typeof part === "string",
1678
                                isTag = isPartStr && !/\W/.test(part),
1679
                                isPartStrNotTag = isPartStr && !isTag;
1680

    
1681
                        if ( isTag && !isXML ) {
1682
                                part = part.toUpperCase();
1683
                        }
1684

    
1685
                        for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
1686
                                if ( (elem = checkSet[i]) ) {
1687
                                        while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
1688

    
1689
                                        checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ?
1690
                                                elem || false :
1691
                                                elem === part;
1692
                                }
1693
                        }
1694

    
1695
                        if ( isPartStrNotTag ) {
1696
                                Sizzle.filter( part, checkSet, true );
1697
                        }
1698
                },
1699
                ">": function(checkSet, part, isXML){
1700
                        var isPartStr = typeof part === "string";
1701

    
1702
                        if ( isPartStr && !/\W/.test(part) ) {
1703
                                part = isXML ? part : part.toUpperCase();
1704

    
1705
                                for ( var i = 0, l = checkSet.length; i < l; i++ ) {
1706
                                        var elem = checkSet[i];
1707
                                        if ( elem ) {
1708
                                                var parent = elem.parentNode;
1709
                                                checkSet[i] = parent.nodeName === part ? parent : false;
1710
                                        }
1711
                                }
1712
                        } else {
1713
                                for ( var i = 0, l = checkSet.length; i < l; i++ ) {
1714
                                        var elem = checkSet[i];
1715
                                        if ( elem ) {
1716
                                                checkSet[i] = isPartStr ?
1717
                                                        elem.parentNode :
1718
                                                        elem.parentNode === part;
1719
                                        }
1720
                                }
1721

    
1722
                                if ( isPartStr ) {
1723
                                        Sizzle.filter( part, checkSet, true );
1724
                                }
1725
                        }
1726
                },
1727
                "": function(checkSet, part, isXML){
1728
                        var doneName = done++, checkFn = dirCheck;
1729

    
1730
                        if ( !part.match(/\W/) ) {
1731
                                var nodeCheck = part = isXML ? part : part.toUpperCase();
1732
                                checkFn = dirNodeCheck;
1733
                        }
1734

    
1735
                        checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
1736
                },
1737
                "~": function(checkSet, part, isXML){
1738
                        var doneName = done++, checkFn = dirCheck;
1739

    
1740
                        if ( typeof part === "string" && !part.match(/\W/) ) {
1741
                                var nodeCheck = part = isXML ? part : part.toUpperCase();
1742
                                checkFn = dirNodeCheck;
1743
                        }
1744

    
1745
                        checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
1746
                }
1747
        },
1748
        find: {
1749
                ID: function(match, context, isXML){
1750
                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
1751
                                var m = context.getElementById(match[1]);
1752
                                return m ? [m] : [];
1753
                        }
1754
                },
1755
                NAME: function(match, context, isXML){
1756
                        if ( typeof context.getElementsByName !== "undefined" ) {
1757
                                var ret = [], results = context.getElementsByName(match[1]);
1758

    
1759
                                for ( var i = 0, l = results.length; i < l; i++ ) {
1760
                                        if ( results[i].getAttribute("name") === match[1] ) {
1761
                                                ret.push( results[i] );
1762
                                        }
1763
                                }
1764

    
1765
                                return ret.length === 0 ? null : ret;
1766
                        }
1767
                },
1768
                TAG: function(match, context){
1769
                        return context.getElementsByTagName(match[1]);
1770
                }
1771
        },
1772
        preFilter: {
1773
                CLASS: function(match, curLoop, inplace, result, not, isXML){
1774
                        match = " " + match[1].replace(/\\/g, "") + " ";
1775

    
1776
                        if ( isXML ) {
1777
                                return match;
1778
                        }
1779

    
1780
                        for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
1781
                                if ( elem ) {
1782
                                        if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) {
1783
                                                if ( !inplace )
1784
                                                        result.push( elem );
1785
                                        } else if ( inplace ) {
1786
                                                curLoop[i] = false;
1787
                                        }
1788
                                }
1789
                        }
1790

    
1791
                        return false;
1792
                },
1793
                ID: function(match){
1794
                        return match[1].replace(/\\/g, "");
1795
                },
1796
                TAG: function(match, curLoop){
1797
                        for ( var i = 0; curLoop[i] === false; i++ ){}
1798
                        return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
1799
                },
1800
                CHILD: function(match){
1801
                        if ( match[1] == "nth" ) {
1802
                                // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
1803
                                var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
1804
                                        match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
1805
                                        !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
1806

    
1807
                                // calculate the numbers (first)n+(last) including if they are negative
1808
                                match[2] = (test[1] + (test[2] || 1)) - 0;
1809
                                match[3] = test[3] - 0;
1810
                        }
1811

    
1812
                        // TODO: Move to normal caching system
1813
                        match[0] = done++;
1814

    
1815
                        return match;
1816
                },
1817
                ATTR: function(match, curLoop, inplace, result, not, isXML){
1818
                        var name = match[1].replace(/\\/g, "");
1819
                        
1820
                        if ( !isXML && Expr.attrMap[name] ) {
1821
                                match[1] = Expr.attrMap[name];
1822
                        }
1823

    
1824
                        if ( match[2] === "~=" ) {
1825
                                match[4] = " " + match[4] + " ";
1826
                        }
1827

    
1828
                        return match;
1829
                },
1830
                PSEUDO: function(match, curLoop, inplace, result, not){
1831
                        if ( match[1] === "not" ) {
1832
                                // If we're dealing with a complex expression, or a simple one
1833
                                if ( match[3].match(chunker).length > 1 || /^\w/.test(match[3]) ) {
1834
                                        match[3] = Sizzle(match[3], null, null, curLoop);
1835
                                } else {
1836
                                        var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
1837
                                        if ( !inplace ) {
1838
                                                result.push.apply( result, ret );
1839
                                        }
1840
                                        return false;
1841
                                }
1842
                        } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
1843
                                return true;
1844
                        }
1845
                        
1846
                        return match;
1847
                },
1848
                POS: function(match){
1849
                        match.unshift( true );
1850
                        return match;
1851
                }
1852
        },
1853
        filters: {
1854
                enabled: function(elem){
1855
                        return elem.disabled === false && elem.type !== "hidden";
1856
                },
1857
                disabled: function(elem){
1858
                        return elem.disabled === true;
1859
                },
1860
                checked: function(elem){
1861
                        return elem.checked === true;
1862
                },
1863
                selected: function(elem){
1864
                        // Accessing this property makes selected-by-default
1865
                        // options in Safari work properly
1866
                        elem.parentNode.selectedIndex;
1867
                        return elem.selected === true;
1868
                },
1869
                parent: function(elem){
1870
                        return !!elem.firstChild;
1871
                },
1872
                empty: function(elem){
1873
                        return !elem.firstChild;
1874
                },
1875
                has: function(elem, i, match){
1876
                        return !!Sizzle( match[3], elem ).length;
1877
                },
1878
                header: function(elem){
1879
                        return /h\d/i.test( elem.nodeName );
1880
                },
1881
                text: function(elem){
1882
                        return "text" === elem.type;
1883
                },
1884
                radio: function(elem){
1885
                        return "radio" === elem.type;
1886
                },
1887
                checkbox: function(elem){
1888
                        return "checkbox" === elem.type;
1889
                },
1890
                file: function(elem){
1891
                        return "file" === elem.type;
1892
                },
1893
                password: function(elem){
1894
                        return "password" === elem.type;
1895
                },
1896
                submit: function(elem){
1897
                        return "submit" === elem.type;
1898
                },
1899
                image: function(elem){
1900
                        return "image" === elem.type;
1901
                },
1902
                reset: function(elem){
1903
                        return "reset" === elem.type;
1904
                },
1905
                button: function(elem){
1906
                        return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
1907
                },
1908
                input: function(elem){
1909
                        return /input|select|textarea|button/i.test(elem.nodeName);
1910
                }
1911
        },
1912
        setFilters: {
1913
                first: function(elem, i){
1914
                        return i === 0;
1915
                },
1916
                last: function(elem, i, match, array){
1917
                        return i === array.length - 1;
1918
                },
1919
                even: function(elem, i){
1920
                        return i % 2 === 0;
1921
                },
1922
                odd: function(elem, i){
1923
                        return i % 2 === 1;
1924
                },
1925
                lt: function(elem, i, match){
1926
                        return i < match[3] - 0;
1927
                },
1928
                gt: function(elem, i, match){
1929
                        return i > match[3] - 0;
1930
                },
1931
                nth: function(elem, i, match){
1932
                        return match[3] - 0 == i;
1933
                },
1934
                eq: function(elem, i, match){
1935
                        return match[3] - 0 == i;
1936
                }
1937
        },
1938
        filter: {
1939
                PSEUDO: function(elem, match, i, array){
1940
                        var name = match[1], filter = Expr.filters[ name ];
1941

    
1942
                        if ( filter ) {
1943
                                return filter( elem, i, match, array );
1944
                        } else if ( name === "contains" ) {
1945
                                return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
1946
                        } else if ( name === "not" ) {
1947
                                var not = match[3];
1948

    
1949
                                for ( var i = 0, l = not.length; i < l; i++ ) {
1950
                                        if ( not[i] === elem ) {
1951
                                                return false;
1952
                                        }
1953
                                }
1954

    
1955
                                return true;
1956
                        }
1957
                },
1958
                CHILD: function(elem, match){
1959
                        var type = match[1], node = elem;
1960
                        switch (type) {
1961
                                case 'only':
1962
                                case 'first':
1963
                                        while (node = node.previousSibling)  {
1964
                                                if ( node.nodeType === 1 ) return false;
1965
                                        }
1966
                                        if ( type == 'first') return true;
1967
                                        node = elem;
1968
                                case 'last':
1969
                                        while (node = node.nextSibling)  {
1970
                                                if ( node.nodeType === 1 ) return false;
1971
                                        }
1972
                                        return true;
1973
                                case 'nth':
1974
                                        var first = match[2], last = match[3];
1975

    
1976
                                        if ( first == 1 && last == 0 ) {
1977
                                                return true;
1978
                                        }
1979
                                        
1980
                                        var doneName = match[0],
1981
                                                parent = elem.parentNode;
1982
        
1983
                                        if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
1984
                                                var count = 0;
1985
                                                for ( node = parent.firstChild; node; node = node.nextSibling ) {
1986
                                                        if ( node.nodeType === 1 ) {
1987
                                                                node.nodeIndex = ++count;
1988
                                                        }
1989
                                                } 
1990
                                                parent.sizcache = doneName;
1991
                                        }
1992
                                        
1993
                                        var diff = elem.nodeIndex - last;
1994
                                        if ( first == 0 ) {
1995
                                                return diff == 0;
1996
                                        } else {
1997
                                                return ( diff % first == 0 && diff / first >= 0 );
1998
                                        }
1999
                        }
2000
                },
2001
                ID: function(elem, match){
2002
                        return elem.nodeType === 1 && elem.getAttribute("id") === match;
2003
                },
2004
                TAG: function(elem, match){
2005
                        return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
2006
                },
2007
                CLASS: function(elem, match){
2008
                        return (" " + (elem.className || elem.getAttribute("class")) + " ")
2009
                                .indexOf( match ) > -1;
2010
                },
2011
                ATTR: function(elem, match){
2012
                        var name = match[1],
2013
                                result = Expr.attrHandle[ name ] ?
2014
                                        Expr.attrHandle[ name ]( elem ) :
2015
                                        elem[ name ] != null ?
2016
                                                elem[ name ] :
2017
                                                elem.getAttribute( name ),
2018
                                value = result + "",
2019
                                type = match[2],
2020
                                check = match[4];
2021

    
2022
                        return result == null ?
2023
                                type === "!=" :
2024
                                type === "=" ?
2025
                                value === check :
2026
                                type === "*=" ?
2027
                                value.indexOf(check) >= 0 :
2028
                                type === "~=" ?
2029
                                (" " + value + " ").indexOf(check) >= 0 :
2030
                                !check ?
2031
                                value && result !== false :
2032
                                type === "!=" ?
2033
                                value != check :
2034
                                type === "^=" ?
2035
                                value.indexOf(check) === 0 :
2036
                                type === "$=" ?
2037
                                value.substr(value.length - check.length) === check :
2038
                                type === "|=" ?
2039
                                value === check || value.substr(0, check.length + 1) === check + "-" :
2040
                                false;
2041
                },
2042
                POS: function(elem, match, i, array){
2043
                        var name = match[2], filter = Expr.setFilters[ name ];
2044

    
2045
                        if ( filter ) {
2046
                                return filter( elem, i, match, array );
2047
                        }
2048
                }
2049
        }
2050
};
2051

    
2052
var origPOS = Expr.match.POS;
2053

    
2054
for ( var type in Expr.match ) {
2055
        Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
2056
}
2057

    
2058
var makeArray = function(array, results) {
2059
        array = Array.prototype.slice.call( array );
2060

    
2061
        if ( results ) {
2062
                results.push.apply( results, array );
2063
                return results;
2064
        }
2065
        
2066
        return array;
2067
};
2068

    
2069
// Perform a simple check to determine if the browser is capable of
2070
// converting a NodeList to an array using builtin methods.
2071
try {
2072
        Array.prototype.slice.call( document.documentElement.childNodes );
2073

    
2074
// Provide a fallback method if it does not work
2075
} catch(e){
2076
        makeArray = function(array, results) {
2077
                var ret = results || [];
2078

    
2079
                if ( toString.call(array) === "[object Array]" ) {
2080
                        Array.prototype.push.apply( ret, array );
2081
                } else {
2082
                        if ( typeof array.length === "number" ) {
2083
                                for ( var i = 0, l = array.length; i < l; i++ ) {
2084
                                        ret.push( array[i] );
2085
                                }
2086
                        } else {
2087
                                for ( var i = 0; array[i]; i++ ) {
2088
                                        ret.push( array[i] );
2089
                                }
2090
                        }
2091
                }
2092

    
2093
                return ret;
2094
        };
2095
}
2096

    
2097
var sortOrder;
2098

    
2099
if ( document.documentElement.compareDocumentPosition ) {
2100
        sortOrder = function( a, b ) {
2101
                var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
2102
                if ( ret === 0 ) {
2103
                        hasDuplicate = true;
2104
                }
2105
                return ret;
2106
        };
2107
} else if ( "sourceIndex" in document.documentElement ) {
2108
        sortOrder = function( a, b ) {
2109
                var ret = a.sourceIndex - b.sourceIndex;
2110
                if ( ret === 0 ) {
2111
                        hasDuplicate = true;
2112
                }
2113
                return ret;
2114
        };
2115
} else if ( document.createRange ) {
2116
        sortOrder = function( a, b ) {
2117
                var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
2118
                aRange.selectNode(a);
2119
                aRange.collapse(true);
2120
                bRange.selectNode(b);
2121
                bRange.collapse(true);
2122
                var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
2123
                if ( ret === 0 ) {
2124
                        hasDuplicate = true;
2125
                }
2126
                return ret;
2127
        };
2128
}
2129

    
2130
// Check to see if the browser returns elements by name when
2131
// querying by getElementById (and provide a workaround)
2132
(function(){
2133
        // We're going to inject a fake input element with a specified name
2134
        var form = document.createElement("form"),
2135
                id = "script" + (new Date).getTime();
2136
        form.innerHTML = "<input name='" + id + "'/>";
2137

    
2138
        // Inject it into the root element, check its status, and remove it quickly
2139
        var root = document.documentElement;
2140
        root.insertBefore( form, root.firstChild );
2141

    
2142
        // The workaround has to do additional checks after a getElementById
2143
        // Which slows things down for other browsers (hence the branching)
2144
        if ( !!document.getElementById( id ) ) {
2145
                Expr.find.ID = function(match, context, isXML){
2146
                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
2147
                                var m = context.getElementById(match[1]);
2148
                                return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
2149
                        }
2150
                };
2151

    
2152
                Expr.filter.ID = function(elem, match){
2153
                        var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
2154
                        return elem.nodeType === 1 && node && node.nodeValue === match;
2155
                };
2156
        }
2157

    
2158
        root.removeChild( form );
2159
})();
2160

    
2161
(function(){
2162
        // Check to see if the browser returns only elements
2163
        // when doing getElementsByTagName("*")
2164

    
2165
        // Create a fake element
2166
        var div = document.createElement("div");
2167
        div.appendChild( document.createComment("") );
2168

    
2169
        // Make sure no comments are found
2170
        if ( div.getElementsByTagName("*").length > 0 ) {
2171
                Expr.find.TAG = function(match, context){
2172
                        var results = context.getElementsByTagName(match[1]);
2173

    
2174
                        // Filter out possible comments
2175
                        if ( match[1] === "*" ) {
2176
                                var tmp = [];
2177

    
2178
                                for ( var i = 0; results[i]; i++ ) {
2179
                                        if ( results[i].nodeType === 1 ) {
2180
                                                tmp.push( results[i] );
2181
                                        }
2182
                                }
2183

    
2184
                                results = tmp;
2185
                        }
2186

    
2187
                        return results;
2188
                };
2189
        }
2190

    
2191
        // Check to see if an attribute returns normalized href attributes
2192
        div.innerHTML = "<a href='#'></a>";
2193
        if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
2194
                        div.firstChild.getAttribute("href") !== "#" ) {
2195
                Expr.attrHandle.href = function(elem){
2196
                        return elem.getAttribute("href", 2);
2197
                };
2198
        }
2199
})();
2200

    
2201
if ( document.querySelectorAll ) (function(){
2202
        var oldSizzle = Sizzle, div = document.createElement("div");
2203
        div.innerHTML = "<p class='TEST'></p>";
2204

    
2205
        // Safari can't handle uppercase or unicode characters when
2206
        // in quirks mode.
2207
        if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
2208
                return;
2209
        }
2210
        
2211
        Sizzle = function(query, context, extra, seed){
2212
                context = context || document;
2213

    
2214
                // Only use querySelectorAll on non-XML documents
2215
                // (ID selectors don't work in non-HTML documents)
2216
                if ( !seed && context.nodeType === 9 && !isXML(context) ) {
2217
                        try {
2218
                                return makeArray( context.querySelectorAll(query), extra );
2219
                        } catch(e){}
2220
                }
2221
                
2222
                return oldSizzle(query, context, extra, seed);
2223
        };
2224

    
2225
        Sizzle.find = oldSizzle.find;
2226
        Sizzle.filter = oldSizzle.filter;
2227
        Sizzle.selectors = oldSizzle.selectors;
2228
        Sizzle.matches = oldSizzle.matches;
2229
})();
2230

    
2231
if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){
2232
        var div = document.createElement("div");
2233
        div.innerHTML = "<div class='test e'></div><div class='test'></div>";
2234

    
2235
        // Opera can't find a second classname (in 9.6)
2236
        if ( div.getElementsByClassName("e").length === 0 )
2237
                return;
2238

    
2239
        // Safari caches class attributes, doesn't catch changes (in 3.2)
2240
        div.lastChild.className = "e";
2241

    
2242
        if ( div.getElementsByClassName("e").length === 1 )
2243
                return;
2244

    
2245
        Expr.order.splice(1, 0, "CLASS");
2246
        Expr.find.CLASS = function(match, context, isXML) {
2247
                if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
2248
                        return context.getElementsByClassName(match[1]);
2249
                }
2250
        };
2251
})();
2252

    
2253
function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
2254
        var sibDir = dir == "previousSibling" && !isXML;
2255
        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2256
                var elem = checkSet[i];
2257
                if ( elem ) {
2258
                        if ( sibDir && elem.nodeType === 1 ){
2259
                                elem.sizcache = doneName;
2260
                                elem.sizset = i;
2261
                        }
2262
                        elem = elem[dir];
2263
                        var match = false;
2264

    
2265
                        while ( elem ) {
2266
                                if ( elem.sizcache === doneName ) {
2267
                                        match = checkSet[elem.sizset];
2268
                                        break;
2269
                                }
2270

    
2271
                                if ( elem.nodeType === 1 && !isXML ){
2272
                                        elem.sizcache = doneName;
2273
                                        elem.sizset = i;
2274
                                }
2275

    
2276
                                if ( elem.nodeName === cur ) {
2277
                                        match = elem;
2278
                                        break;
2279
                                }
2280

    
2281
                                elem = elem[dir];
2282
                        }
2283

    
2284
                        checkSet[i] = match;
2285
                }
2286
        }
2287
}
2288

    
2289
function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
2290
        var sibDir = dir == "previousSibling" && !isXML;
2291
        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2292
                var elem = checkSet[i];
2293
                if ( elem ) {
2294
                        if ( sibDir && elem.nodeType === 1 ) {
2295
                                elem.sizcache = doneName;
2296
                                elem.sizset = i;
2297
                        }
2298
                        elem = elem[dir];
2299
                        var match = false;
2300

    
2301
                        while ( elem ) {
2302
                                if ( elem.sizcache === doneName ) {
2303
                                        match = checkSet[elem.sizset];
2304
                                        break;
2305
                                }
2306

    
2307
                                if ( elem.nodeType === 1 ) {
2308
                                        if ( !isXML ) {
2309
                                                elem.sizcache = doneName;
2310
                                                elem.sizset = i;
2311
                                        }
2312
                                        if ( typeof cur !== "string" ) {
2313
                                                if ( elem === cur ) {
2314
                                                        match = true;
2315
                                                        break;
2316
                                                }
2317

    
2318
                                        } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
2319
                                                match = elem;
2320
                                                break;
2321
                                        }
2322
                                }
2323

    
2324
                                elem = elem[dir];
2325
                        }
2326

    
2327
                        checkSet[i] = match;
2328
                }
2329
        }
2330
}
2331

    
2332
var contains = document.compareDocumentPosition ?  function(a, b){
2333
        return a.compareDocumentPosition(b) & 16;
2334
} : function(a, b){
2335
        return a !== b && (a.contains ? a.contains(b) : true);
2336
};
2337

    
2338
var isXML = function(elem){
2339
        return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
2340
                !!elem.ownerDocument && isXML( elem.ownerDocument );
2341
};
2342

    
2343
var posProcess = function(selector, context){
2344
        var tmpSet = [], later = "", match,
2345
                root = context.nodeType ? [context] : context;
2346

    
2347
        // Position selectors must be done after the filter
2348
        // And so must :not(positional) so we move all PSEUDOs to the end
2349
        while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
2350
                later += match[0];
2351
                selector = selector.replace( Expr.match.PSEUDO, "" );
2352
        }
2353

    
2354
        selector = Expr.relative[selector] ? selector + "*" : selector;
2355

    
2356
        for ( var i = 0, l = root.length; i < l; i++ ) {
2357
                Sizzle( selector, root[i], tmpSet );
2358
        }
2359

    
2360
        return Sizzle.filter( later, tmpSet );
2361
};
2362

    
2363
// EXPOSE
2364
jQuery.find = Sizzle;
2365
jQuery.filter = Sizzle.filter;
2366
jQuery.expr = Sizzle.selectors;
2367
jQuery.expr[":"] = jQuery.expr.filters;
2368

    
2369
Sizzle.selectors.filters.hidden = function(elem){
2370
        return elem.offsetWidth === 0 || elem.offsetHeight === 0;
2371
};
2372

    
2373
Sizzle.selectors.filters.visible = function(elem){
2374
        return elem.offsetWidth > 0 || elem.offsetHeight > 0;
2375
};
2376

    
2377
Sizzle.selectors.filters.animated = function(elem){
2378
        return jQuery.grep(jQuery.timers, function(fn){
2379
                return elem === fn.elem;
2380
        }).length;
2381
};
2382

    
2383
jQuery.multiFilter = function( expr, elems, not ) {
2384
        if ( not ) {
2385
                expr = ":not(" + expr + ")";
2386
        }
2387

    
2388
        return Sizzle.matches(expr, elems);
2389
};
2390

    
2391
jQuery.dir = function( elem, dir ){
2392
        var matched = [], cur = elem[dir];
2393
        while ( cur && cur != document ) {
2394
                if ( cur.nodeType == 1 )
2395
                        matched.push( cur );
2396
                cur = cur[dir];
2397
        }
2398
        return matched;
2399
};
2400

    
2401
jQuery.nth = function(cur, result, dir, elem){
2402
        result = result || 1;
2403
        var num = 0;
2404

    
2405
        for ( ; cur; cur = cur[dir] )
2406
                if ( cur.nodeType == 1 && ++num == result )
2407
                        break;
2408

    
2409
        return cur;
2410
};
2411

    
2412
jQuery.sibling = function(n, elem){
2413
        var r = [];
2414

    
2415
        for ( ; n; n = n.nextSibling ) {
2416
                if ( n.nodeType == 1 && n != elem )
2417
                        r.push( n );
2418
        }
2419

    
2420
        return r;
2421
};
2422

    
2423
return;
2424

    
2425
window.Sizzle = Sizzle;
2426

    
2427
})();
2428
/*
2429
 * A number of helper functions used for managing events.
2430
 * Many of the ideas behind this code originated from
2431
 * Dean Edwards' addEvent library.
2432
 */
2433
jQuery.event = {
2434

    
2435
        // Bind an event to an element
2436
        // Original by Dean Edwards
2437
        add: function(elem, types, handler, data) {
2438
                if ( elem.nodeType == 3 || elem.nodeType == 8 )
2439
                        return;
2440

    
2441
                // For whatever reason, IE has trouble passing the window object
2442
                // around, causing it to be cloned in the process
2443
                if ( elem.setInterval && elem != window )
2444
                        elem = window;
2445

    
2446
                // Make sure that the function being executed has a unique ID
2447
                if ( !handler.guid )
2448
                        handler.guid = this.guid++;
2449

    
2450
                // if data is passed, bind to handler
2451
                if ( data !== undefined ) {
2452
                        // Create temporary function pointer to original handler
2453
                        var fn = handler;
2454

    
2455
                        // Create unique handler function, wrapped around original handler
2456
                        handler = this.proxy( fn );
2457

    
2458
                        // Store data in unique handler
2459
                        handler.data = data;
2460
                }
2461

    
2462
                // Init the element's event structure
2463
                var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
2464
                        handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
2465
                                // Handle the second event of a trigger and when
2466
                                // an event is called after a page has unloaded
2467
                                return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
2468
                                        jQuery.event.handle.apply(arguments.callee.elem, arguments) :
2469
                                        undefined;
2470
                        });
2471
                // Add elem as a property of the handle function
2472
                // This is to prevent a memory leak with non-native
2473
                // event in IE.
2474
                handle.elem = elem;
2475

    
2476
                // Handle multiple events separated by a space
2477
                // jQuery(...).bind("mouseover mouseout", fn);
2478
                jQuery.each(types.split(/\s+/), function(index, type) {
2479
                        // Namespaced event handlers
2480
                        var namespaces = type.split(".");
2481
                        type = namespaces.shift();
2482
                        handler.type = namespaces.slice().sort().join(".");
2483

    
2484
                        // Get the current list of functions bound to this event
2485
                        var handlers = events[type];
2486
                        
2487
                        if ( jQuery.event.specialAll[type] )
2488
                                jQuery.event.specialAll[type].setup.call(elem, data, namespaces);
2489

    
2490
                        // Init the event handler queue
2491
                        if (!handlers) {
2492
                                handlers = events[type] = {};
2493

    
2494
                                // Check for a special event handler
2495
                                // Only use addEventListener/attachEvent if the special
2496
                                // events handler returns false
2497
                                if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) {
2498
                                        // Bind the global event handler to the element
2499
                                        if (elem.addEventListener)
2500
                                                elem.addEventListener(type, handle, false);
2501
                                        else if (elem.attachEvent)
2502
                                                elem.attachEvent("on" + type, handle);
2503
                                }
2504
                        }
2505

    
2506
                        // Add the function to the element's handler list
2507
                        handlers[handler.guid] = handler;
2508

    
2509
                        // Keep track of which events have been used, for global triggering
2510
                        jQuery.event.global[type] = true;
2511
                });
2512

    
2513
                // Nullify elem to prevent memory leaks in IE
2514
                elem = null;
2515
        },
2516

    
2517
        guid: 1,
2518
        global: {},
2519

    
2520
        // Detach an event or set of events from an element
2521
        remove: function(elem, types, handler) {
2522
                // don't do events on text and comment nodes
2523
                if ( elem.nodeType == 3 || elem.nodeType == 8 )
2524
                        return;
2525

    
2526
                var events = jQuery.data(elem, "events"), ret, index;
2527

    
2528
                if ( events ) {
2529
                        // Unbind all events for the element
2530
                        if ( types === undefined || (typeof types === "string" && types.charAt(0) == ".") )
2531
                                for ( var type in events )
2532
                                        this.remove( elem, type + (types || "") );
2533
                        else {
2534
                                // types is actually an event object here
2535
                                if ( types.type ) {
2536
                                        handler = types.handler;
2537
                                        types = types.type;
2538
                                }
2539

    
2540
                                // Handle multiple events seperated by a space
2541
                                // jQuery(...).unbind("mouseover mouseout", fn);
2542
                                jQuery.each(types.split(/\s+/), function(index, type){
2543
                                        // Namespaced event handlers
2544
                                        var namespaces = type.split(".");
2545
                                        type = namespaces.shift();
2546
                                        var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
2547

    
2548
                                        if ( events[type] ) {
2549
                                                // remove the given handler for the given type
2550
                                                if ( handler )
2551
                                                        delete events[type][handler.guid];
2552

    
2553
                                                // remove all handlers for the given type
2554
                                                else
2555
                                                        for ( var handle in events[type] )
2556
                                                                // Handle the removal of namespaced events
2557
                                                                if ( namespace.test(events[type][handle].type) )
2558
                                                                        delete events[type][handle];
2559
                                                                        
2560
                                                if ( jQuery.event.specialAll[type] )
2561
                                                        jQuery.event.specialAll[type].teardown.call(elem, namespaces);
2562

    
2563
                                                // remove generic event handler if no more handlers exist
2564
                                                for ( ret in events[type] ) break;
2565
                                                if ( !ret ) {
2566
                                                        if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem, namespaces) === false ) {
2567
                                                                if (elem.removeEventListener)
2568
                                                                        elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
2569
                                                                else if (elem.detachEvent)
2570
                                                                        elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
2571
                                                        }
2572
                                                        ret = null;
2573
                                                        delete events[type];
2574
                                                }
2575
                                        }
2576
                                });
2577
                        }
2578

    
2579
                        // Remove the expando if it's no longer used
2580
                        for ( ret in events ) break;
2581
                        if ( !ret ) {
2582
                                var handle = jQuery.data( elem, "handle" );
2583
                                if ( handle ) handle.elem = null;
2584
                                jQuery.removeData( elem, "events" );
2585
                                jQuery.removeData( elem, "handle" );
2586
                        }
2587
                }
2588
        },
2589

    
2590
        // bubbling is internal
2591
        trigger: function( event, data, elem, bubbling ) {
2592
                // Event object or event type
2593
                var type = event.type || event;
2594

    
2595
                if( !bubbling ){
2596
                        event = typeof event === "object" ?
2597
                                // jQuery.Event object
2598
                                event[expando] ? event :
2599
                                // Object literal
2600
                                jQuery.extend( jQuery.Event(type), event ) :
2601
                                // Just the event type (string)
2602
                                jQuery.Event(type);
2603

    
2604
                        if ( type.indexOf("!") >= 0 ) {
2605
                                event.type = type = type.slice(0, -1);
2606
                                event.exclusive = true;
2607
                        }
2608

    
2609
                        // Handle a global trigger
2610
                        if ( !elem ) {
2611
                                // Don't bubble custom events when global (to avoid too much overhead)
2612
                                event.stopPropagation();
2613
                                // Only trigger if we've ever bound an event for it
2614
                                if ( this.global[type] )
2615
                                        jQuery.each( jQuery.cache, function(){
2616
                                                if ( this.events && this.events[type] )
2617
                                                        jQuery.event.trigger( event, data, this.handle.elem );
2618
                                        });
2619
                        }
2620

    
2621
                        // Handle triggering a single element
2622

    
2623
                        // don't do events on text and comment nodes
2624
                        if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 )
2625
                                return undefined;
2626
                        
2627
                        // Clean up in case it is reused
2628
                        event.result = undefined;
2629
                        event.target = elem;
2630
                        
2631
                        // Clone the incoming data, if any
2632
                        data = jQuery.makeArray(data);
2633
                        data.unshift( event );
2634
                }
2635

    
2636
                event.currentTarget = elem;
2637

    
2638
                // Trigger the event, it is assumed that "handle" is a function
2639
                var handle = jQuery.data(elem, "handle");
2640
                if ( handle )
2641
                        handle.apply( elem, data );
2642

    
2643
                // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
2644
                if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
2645
                        event.result = false;
2646

    
2647
                // Trigger the native events (except for clicks on links)
2648
                if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
2649
                        this.triggered = true;
2650
                        try {
2651
                                elem[ type ]();
2652
                        // prevent IE from throwing an error for some hidden elements
2653
                        } catch (e) {}
2654
                }
2655

    
2656
                this.triggered = false;
2657

    
2658
                if ( !event.isPropagationStopped() ) {
2659
                        var parent = elem.parentNode || elem.ownerDocument;
2660
                        if ( parent )
2661
                                jQuery.event.trigger(event, data, parent, true);
2662
                }
2663
        },
2664

    
2665
        handle: function(event) {
2666
                // returned undefined or false
2667
                var all, handlers;
2668

    
2669
                event = arguments[0] = jQuery.event.fix( event || window.event );
2670
                event.currentTarget = this;
2671
                
2672
                // Namespaced event handlers
2673
                var namespaces = event.type.split(".");
2674
                event.type = namespaces.shift();
2675

    
2676
                // Cache this now, all = true means, any handler
2677
                all = !namespaces.length && !event.exclusive;
2678
                
2679
                var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
2680

    
2681
                handlers = ( jQuery.data(this, "events") || {} )[event.type];
2682

    
2683
                for ( var j in handlers ) {
2684
                        var handler = handlers[j];
2685

    
2686
                        // Filter the functions by class
2687
                        if ( all || namespace.test(handler.type) ) {
2688
                                // Pass in a reference to the handler function itself
2689
                                // So that we can later remove it
2690
                                event.handler = handler;
2691
                                event.data = handler.data;
2692

    
2693
                                var ret = handler.apply(this, arguments);
2694

    
2695
                                if( ret !== undefined ){
2696
                                        event.result = ret;
2697
                                        if ( ret === false ) {
2698
                                                event.preventDefault();
2699
                                                event.stopPropagation();
2700
                                        }
2701
                                }
2702

    
2703
                                if( event.isImmediatePropagationStopped() )
2704
                                        break;
2705

    
2706
                        }
2707
                }
2708
        },
2709

    
2710
        props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
2711

    
2712
        fix: function(event) {
2713
                if ( event[expando] )
2714
                        return event;
2715

    
2716
                // store a copy of the original event object
2717
                // and "clone" to set read-only properties
2718
                var originalEvent = event;
2719
                event = jQuery.Event( originalEvent );
2720

    
2721
                for ( var i = this.props.length, prop; i; ){
2722
                        prop = this.props[ --i ];
2723
                        event[ prop ] = originalEvent[ prop ];
2724
                }
2725

    
2726
                // Fix target property, if necessary
2727
                if ( !event.target )
2728
                        event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
2729

    
2730
                // check if target is a textnode (safari)
2731
                if ( event.target.nodeType == 3 )
2732
                        event.target = event.target.parentNode;
2733

    
2734
                // Add relatedTarget, if necessary
2735
                if ( !event.relatedTarget && event.fromElement )
2736
                        event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
2737

    
2738
                // Calculate pageX/Y if missing and clientX/Y available
2739
                if ( event.pageX == null && event.clientX != null ) {
2740
                        var doc = document.documentElement, body = document.body;
2741
                        event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
2742
                        event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
2743
                }
2744

    
2745
                // Add which for key events
2746
                if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
2747
                        event.which = event.charCode || event.keyCode;
2748

    
2749
                // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
2750
                if ( !event.metaKey && event.ctrlKey )
2751
                        event.metaKey = event.ctrlKey;
2752

    
2753
                // Add which for click: 1 == left; 2 == middle; 3 == right
2754
                // Note: button is not normalized, so don't use it
2755
                if ( !event.which && event.button )
2756
                        event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
2757

    
2758
                return event;
2759
        },
2760

    
2761
        proxy: function( fn, proxy ){
2762
                proxy = proxy || function(){ return fn.apply(this, arguments); };
2763
                // Set the guid of unique handler to the same of original handler, so it can be removed
2764
                proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
2765
                // So proxy can be declared as an argument
2766
                return proxy;
2767
        },
2768

    
2769
        special: {
2770
                ready: {
2771
                        // Make sure the ready event is setup
2772
                        setup: bindReady,
2773
                        teardown: function() {}
2774
                }
2775
        },
2776
        
2777
        specialAll: {
2778
                live: {
2779
                        setup: function( selector, namespaces ){
2780
                                jQuery.event.add( this, namespaces[0], liveHandler );
2781
                        },
2782
                        teardown:  function( namespaces ){
2783
                                if ( namespaces.length ) {
2784
                                        var remove = 0, name = RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)");
2785
                                        
2786
                                        jQuery.each( (jQuery.data(this, "events").live || {}), function(){
2787
                                                if ( name.test(this.type) )
2788
                                                        remove++;
2789
                                        });
2790
                                        
2791
                                        if ( remove < 1 )
2792
                                                jQuery.event.remove( this, namespaces[0], liveHandler );
2793
                                }
2794
                        }
2795
                }
2796
        }
2797
};
2798

    
2799
jQuery.Event = function( src ){
2800
        // Allow instantiation without the 'new' keyword
2801
        if( !this.preventDefault )
2802
                return new jQuery.Event(src);
2803
        
2804
        // Event object
2805
        if( src && src.type ){
2806
                this.originalEvent = src;
2807
                this.type = src.type;
2808
        // Event type
2809
        }else
2810
                this.type = src;
2811

    
2812
        // timeStamp is buggy for some events on Firefox(#3843)
2813
        // So we won't rely on the native value
2814
        this.timeStamp = now();
2815
        
2816
        // Mark it as fixed
2817
        this[expando] = true;
2818
};
2819

    
2820
function returnFalse(){
2821
        return false;
2822
}
2823
function returnTrue(){
2824
        return true;
2825
}
2826

    
2827
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
2828
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
2829
jQuery.Event.prototype = {
2830
        preventDefault: function() {
2831
                this.isDefaultPrevented = returnTrue;
2832

    
2833
                var e = this.originalEvent;
2834
                if( !e )
2835
                        return;
2836
                // if preventDefault exists run it on the original event
2837
                if (e.preventDefault)
2838
                        e.preventDefault();
2839
                // otherwise set the returnValue property of the original event to false (IE)
2840
                e.returnValue = false;
2841
        },
2842
        stopPropagation: function() {
2843
                this.isPropagationStopped = returnTrue;
2844

    
2845
                var e = this.originalEvent;
2846
                if( !e )
2847
                        return;
2848
                // if stopPropagation exists run it on the original event
2849
                if (e.stopPropagation)
2850
                        e.stopPropagation();
2851
                // otherwise set the cancelBubble property of the original event to true (IE)
2852
                e.cancelBubble = true;
2853
        },
2854
        stopImmediatePropagation:function(){
2855
                this.isImmediatePropagationStopped = returnTrue;
2856
                this.stopPropagation();
2857
        },
2858
        isDefaultPrevented: returnFalse,
2859
        isPropagationStopped: returnFalse,
2860
        isImmediatePropagationStopped: returnFalse
2861
};
2862
// Checks if an event happened on an element within another element
2863
// Used in jQuery.event.special.mouseenter and mouseleave handlers
2864
var withinElement = function(event) {
2865
        // Check if mouse(over|out) are still within the same parent element
2866
        var parent = event.relatedTarget;
2867
        // Traverse up the tree
2868
        while ( parent && parent != this )
2869
                try { parent = parent.parentNode; }
2870
                catch(e) { parent = this; }
2871
        
2872
        if( parent != this ){
2873
                // set the correct event type
2874
                event.type = event.data;
2875
                // handle event if we actually just moused on to a non sub-element
2876
                jQuery.event.handle.apply( this, arguments );
2877
        }
2878
};
2879
        
2880
jQuery.each({ 
2881
        mouseover: 'mouseenter', 
2882
        mouseout: 'mouseleave'
2883
}, function( orig, fix ){
2884
        jQuery.event.special[ fix ] = {
2885
                setup: function(){
2886
                        jQuery.event.add( this, orig, withinElement, fix );
2887
                },
2888
                teardown: function(){
2889
                        jQuery.event.remove( this, orig, withinElement );
2890
                }
2891
        };                           
2892
});
2893

    
2894
jQuery.fn.extend({
2895
        bind: function( type, data, fn ) {
2896
                return type == "unload" ? this.one(type, data, fn) : this.each(function(){
2897
                        jQuery.event.add( this, type, fn || data, fn && data );
2898
                });
2899
        },
2900

    
2901
        one: function( type, data, fn ) {
2902
                var one = jQuery.event.proxy( fn || data, function(event) {
2903
                        jQuery(this).unbind(event, one);
2904
                        return (fn || data).apply( this, arguments );
2905
                });
2906
                return this.each(function(){
2907
                        jQuery.event.add( this, type, one, fn && data);
2908
                });
2909
        },
2910

    
2911
        unbind: function( type, fn ) {
2912
                return this.each(function(){
2913
                        jQuery.event.remove( this, type, fn );
2914
                });
2915
        },
2916

    
2917
        trigger: function( type, data ) {
2918
                return this.each(function(){
2919
                        jQuery.event.trigger( type, data, this );
2920
                });
2921
        },
2922

    
2923
        triggerHandler: function( type, data ) {
2924
                if( this[0] ){
2925
                        var event = jQuery.Event(type);
2926
                        event.preventDefault();
2927
                        event.stopPropagation();
2928
                        jQuery.event.trigger( event, data, this[0] );
2929
                        return event.result;
2930
                }                
2931
        },
2932

    
2933
        toggle: function( fn ) {
2934
                // Save reference to arguments for access in closure
2935
                var args = arguments, i = 1;
2936

    
2937
                // link all the functions, so any of them can unbind this click handler
2938
                while( i < args.length )
2939
                        jQuery.event.proxy( fn, args[i++] );
2940

    
2941
                return this.click( jQuery.event.proxy( fn, function(event) {
2942
                        // Figure out which function to execute
2943
                        this.lastToggle = ( this.lastToggle || 0 ) % i;
2944

    
2945
                        // Make sure that clicks stop
2946
                        event.preventDefault();
2947

    
2948
                        // and execute the function
2949
                        return args[ this.lastToggle++ ].apply( this, arguments ) || false;
2950
                }));
2951
        },
2952

    
2953
        hover: function(fnOver, fnOut) {
2954
                return this.mouseenter(fnOver).mouseleave(fnOut);
2955
        },
2956

    
2957
        ready: function(fn) {
2958
                // Attach the listeners
2959
                bindReady();
2960

    
2961
                // If the DOM is already ready
2962
                if ( jQuery.isReady )
2963
                        // Execute the function immediately
2964
                        fn.call( document, jQuery );
2965

    
2966
                // Otherwise, remember the function for later
2967
                else
2968
                        // Add the function to the wait list
2969
                        jQuery.readyList.push( fn );
2970

    
2971
                return this;
2972
        },
2973
        
2974
        live: function( type, fn ){
2975
                var proxy = jQuery.event.proxy( fn );
2976
                proxy.guid += this.selector + type;
2977

    
2978
                jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy );
2979

    
2980
                return this;
2981
        },
2982
        
2983
        die: function( type, fn ){
2984
                jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null );
2985
                return this;
2986
        }
2987
});
2988

    
2989
function liveHandler( event ){
2990
        var check = RegExp("(^|\\.)" + event.type + "(\\.|$)"),
2991
                stop = true,
2992
                elems = [];
2993

    
2994
        jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){
2995
                if ( check.test(fn.type) ) {
2996
                        var elem = jQuery(event.target).closest(fn.data)[0];
2997
                        if ( elem )
2998
                                elems.push({ elem: elem, fn: fn });
2999
                }
3000
        });
3001

    
3002
        elems.sort(function(a,b) {
3003
                return jQuery.data(a.elem, "closest") - jQuery.data(b.elem, "closest");
3004
        });
3005
        
3006
        jQuery.each(elems, function(){
3007
                if ( this.fn.call(this.elem, event, this.fn.data) === false )
3008
                        return (stop = false);
3009
        });
3010

    
3011
        return stop;
3012
}
3013

    
3014
function liveConvert(type, selector){
3015
        return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "|")].join(".");
3016
}
3017

    
3018
jQuery.extend({
3019
        isReady: false,
3020
        readyList: [],
3021
        // Handle when the DOM is ready
3022
        ready: function() {
3023
                // Make sure that the DOM is not already loaded
3024
                if ( !jQuery.isReady ) {
3025
                        // Remember that the DOM is ready
3026
                        jQuery.isReady = true;
3027

    
3028
                        // If there are functions bound, to execute
3029
                        if ( jQuery.readyList ) {
3030
                                // Execute all of them
3031
                                jQuery.each( jQuery.readyList, function(){
3032
                                        this.call( document, jQuery );
3033
                                });
3034

    
3035
                                // Reset the list of functions
3036
                                jQuery.readyList = null;
3037
                        }
3038

    
3039
                        // Trigger any bound ready events
3040
                        jQuery(document).triggerHandler("ready");
3041
                }
3042
        }
3043
});
3044

    
3045
var readyBound = false;
3046

    
3047
function bindReady(){
3048
        if ( readyBound ) return;
3049
        readyBound = true;
3050

    
3051
        // Mozilla, Opera and webkit nightlies currently support this event
3052
        if ( document.addEventListener ) {
3053
                // Use the handy event callback
3054
                document.addEventListener( "DOMContentLoaded", function(){
3055
                        document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
3056
                        jQuery.ready();
3057
                }, false );
3058

    
3059
        // If IE event model is used
3060
        } else if ( document.attachEvent ) {
3061
                // ensure firing before onload,
3062
                // maybe late but safe also for iframes
3063
                document.attachEvent("onreadystatechange", function(){
3064
                        if ( document.readyState === "complete" ) {
3065
                                document.detachEvent( "onreadystatechange", arguments.callee );
3066
                                jQuery.ready();
3067
                        }
3068
                });
3069

    
3070
                // If IE and not an iframe
3071
                // continually check to see if the document is ready
3072
                if ( document.documentElement.doScroll && window == window.top ) (function(){
3073
                        if ( jQuery.isReady ) return;
3074

    
3075
                        try {
3076
                                // If IE is used, use the trick by Diego Perini
3077
                                // http://javascript.nwbox.com/IEContentLoaded/
3078
                                document.documentElement.doScroll("left");
3079
                        } catch( error ) {
3080
                                setTimeout( arguments.callee, 0 );
3081
                                return;
3082
                        }
3083

    
3084
                        // and execute any waiting functions
3085
                        jQuery.ready();
3086
                })();
3087
        }
3088

    
3089
        // A fallback to window.onload, that will always work
3090
        jQuery.event.add( window, "load", jQuery.ready );
3091
}
3092

    
3093
jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
3094
        "mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," +
3095
        "change,select,submit,keydown,keypress,keyup,error").split(","), function(i, name){
3096

    
3097
        // Handle event binding
3098
        jQuery.fn[name] = function(fn){
3099
                return fn ? this.bind(name, fn) : this.trigger(name);
3100
        };
3101
});
3102

    
3103
// Prevent memory leaks in IE
3104
// And prevent errors on refresh with events like mouseover in other browsers
3105
// Window isn't included so as not to unbind existing unload events
3106
jQuery( window ).bind( 'unload', function(){ 
3107
        for ( var id in jQuery.cache )
3108
                // Skip the window
3109
                if ( id != 1 && jQuery.cache[ id ].handle )
3110
                        jQuery.event.remove( jQuery.cache[ id ].handle.elem );
3111
}); 
3112
(function(){
3113

    
3114
        jQuery.support = {};
3115

    
3116
        var root = document.documentElement,
3117
                script = document.createElement("script"),
3118
                div = document.createElement("div"),
3119
                id = "script" + (new Date).getTime();
3120

    
3121
        div.style.display = "none";
3122
        div.innerHTML = '   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';
3123

    
3124
        var all = div.getElementsByTagName("*"),
3125
                a = div.getElementsByTagName("a")[0];
3126

    
3127
        // Can't get basic test support
3128
        if ( !all || !all.length || !a ) {
3129
                return;
3130
        }
3131

    
3132
        jQuery.support = {
3133
                // IE strips leading whitespace when .innerHTML is used
3134
                leadingWhitespace: div.firstChild.nodeType == 3,
3135
                
3136
                // Make sure that tbody elements aren't automatically inserted
3137
                // IE will insert them into empty tables
3138
                tbody: !div.getElementsByTagName("tbody").length,
3139
                
3140
                // Make sure that you can get all elements in an <object> element
3141
                // IE 7 always returns no results
3142
                objectAll: !!div.getElementsByTagName("object")[0]
3143
                        .getElementsByTagName("*").length,
3144
                
3145
                // Make sure that link elements get serialized correctly by innerHTML
3146
                // This requires a wrapper element in IE
3147
                htmlSerialize: !!div.getElementsByTagName("link").length,
3148
                
3149
                // Get the style information from getAttribute
3150
                // (IE uses .cssText insted)
3151
                style: /red/.test( a.getAttribute("style") ),
3152
                
3153
                // Make sure that URLs aren't manipulated
3154
                // (IE normalizes it by default)
3155
                hrefNormalized: a.getAttribute("href") === "/a",
3156
                
3157
                // Make sure that element opacity exists
3158
                // (IE uses filter instead)
3159
                opacity: a.style.opacity === "0.5",
3160
                
3161
                // Verify style float existence
3162
                // (IE uses styleFloat instead of cssFloat)
3163
                cssFloat: !!a.style.cssFloat,
3164

    
3165
                // Will be defined later
3166
                scriptEval: false,
3167
                noCloneEvent: true,
3168
                boxModel: null
3169
        };
3170
        
3171
        script.type = "text/javascript";
3172
        try {
3173
                script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
3174
        } catch(e){}
3175

    
3176
        root.insertBefore( script, root.firstChild );
3177
        
3178
        // Make sure that the execution of code works by injecting a script
3179
        // tag with appendChild/createTextNode
3180
        // (IE doesn't support this, fails, and uses .text instead)
3181
        if ( window[ id ] ) {
3182
                jQuery.support.scriptEval = true;
3183
                delete window[ id ];
3184
        }
3185

    
3186
        root.removeChild( script );
3187

    
3188
        if ( div.attachEvent && div.fireEvent ) {
3189
                div.attachEvent("onclick", function(){
3190
                        // Cloning a node shouldn't copy over any
3191
                        // bound event handlers (IE does this)
3192
                        jQuery.support.noCloneEvent = false;
3193
                        div.detachEvent("onclick", arguments.callee);
3194
                });
3195
                div.cloneNode(true).fireEvent("onclick");
3196
        }
3197

    
3198
        // Figure out if the W3C box model works as expected
3199
        // document.body must exist before we can do this
3200
        jQuery(function(){
3201
                var div = document.createElement("div");
3202
                div.style.width = div.style.paddingLeft = "1px";
3203

    
3204
                document.body.appendChild( div );
3205
                jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
3206
                document.body.removeChild( div ).style.display = 'none';
3207
        });
3208
})();
3209

    
3210
var styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat";
3211

    
3212
jQuery.props = {
3213
        "for": "htmlFor",
3214
        "class": "className",
3215
        "float": styleFloat,
3216
        cssFloat: styleFloat,
3217
        styleFloat: styleFloat,
3218
        readonly: "readOnly",
3219
        maxlength: "maxLength",
3220
        cellspacing: "cellSpacing",
3221
        rowspan: "rowSpan",
3222
        tabindex: "tabIndex"
3223
};
3224
jQuery.fn.extend({
3225
        // Keep a copy of the old load
3226
        _load: jQuery.fn.load,
3227

    
3228
        load: function( url, params, callback ) {
3229
                if ( typeof url !== "string" )
3230
                        return this._load( url );
3231

    
3232
                var off = url.indexOf(" ");
3233
                if ( off >= 0 ) {
3234
                        var selector = url.slice(off, url.length);
3235
                        url = url.slice(0, off);
3236
                }
3237

    
3238
                // Default to a GET request
3239
                var type = "GET";
3240

    
3241
                // If the second parameter was provided
3242
                if ( params )
3243
                        // If it's a function
3244
                        if ( jQuery.isFunction( params ) ) {
3245
                                // We assume that it's the callback
3246
                                callback = params;
3247
                                params = null;
3248

    
3249
                        // Otherwise, build a param string
3250
                        } else if( typeof params === "object" ) {
3251
                                params = jQuery.param( params );
3252
                                type = "POST";
3253
                        }
3254

    
3255
                var self = this;
3256

    
3257
                // Request the remote document
3258
                jQuery.ajax({
3259
                        url: url,
3260
                        type: type,
3261
                        dataType: "html",
3262
                        data: params,
3263
                        complete: function(res, status){
3264
                                // If successful, inject the HTML into all the matched elements
3265
                                if ( status == "success" || status == "notmodified" )
3266
                                        // See if a selector was specified
3267
                                        self.html( selector ?
3268
                                                // Create a dummy div to hold the results
3269
                                                jQuery("<div/>")
3270
                                                        // inject the contents of the document in, removing the scripts
3271
                                                        // to avoid any 'Permission Denied' errors in IE
3272
                                                        .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
3273

    
3274
                                                        // Locate the specified elements
3275
                                                        .find(selector) :
3276

    
3277
                                                // If not, just inject the full result
3278
                                                res.responseText );
3279

    
3280
                                if( callback )
3281
                                        self.each( callback, [res.responseText, status, res] );
3282
                        }
3283
                });
3284
                return this;
3285
        },
3286

    
3287
        serialize: function() {
3288
                return jQuery.param(this.serializeArray());
3289
        },
3290
        serializeArray: function() {
3291
                return this.map(function(){
3292
                        return this.elements ? jQuery.makeArray(this.elements) : this;
3293
                })
3294
                .filter(function(){
3295
                        return this.name && !this.disabled &&
3296
                                (this.checked || /select|textarea/i.test(this.nodeName) ||
3297
                                        /text|hidden|password|search/i.test(this.type));
3298
                })
3299
                .map(function(i, elem){
3300
                        var val = jQuery(this).val();
3301
                        return val == null ? null :
3302
                                jQuery.isArray(val) ?
3303
                                        jQuery.map( val, function(val, i){
3304
                                                return {name: elem.name, value: val};
3305
                                        }) :
3306
                                        {name: elem.name, value: val};
3307
                }).get();
3308
        }
3309
});
3310

    
3311
// Attach a bunch of functions for handling common AJAX events
3312
jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
3313
        jQuery.fn[o] = function(f){
3314
                return this.bind(o, f);
3315
        };
3316
});
3317

    
3318
var jsc = now();
3319

    
3320
jQuery.extend({
3321
  
3322
        get: function( url, data, callback, type ) {
3323
                // shift arguments if data argument was ommited
3324
                if ( jQuery.isFunction( data ) ) {
3325
                        callback = data;
3326
                        data = null;
3327
                }
3328

    
3329
                return jQuery.ajax({
3330
                        type: "GET",
3331
                        url: url,
3332
                        data: data,
3333
                        success: callback,
3334
                        dataType: type
3335
                });
3336
        },
3337

    
3338
        getScript: function( url, callback ) {
3339
                return jQuery.get(url, null, callback, "script");
3340
        },
3341

    
3342
        getJSON: function( url, data, callback ) {
3343
                return jQuery.get(url, data, callback, "json");
3344
        },
3345

    
3346
        post: function( url, data, callback, type ) {
3347
                if ( jQuery.isFunction( data ) ) {
3348
                        callback = data;
3349
                        data = {};
3350
                }
3351

    
3352
                return jQuery.ajax({
3353
                        type: "POST",
3354
                        url: url,
3355
                        data: data,
3356
                        success: callback,
3357
                        dataType: type
3358
                });
3359
        },
3360

    
3361
        ajaxSetup: function( settings ) {
3362
                jQuery.extend( jQuery.ajaxSettings, settings );
3363
        },
3364

    
3365
        ajaxSettings: {
3366
                url: location.href,
3367
                global: true,
3368
                type: "GET",
3369
                contentType: "application/x-www-form-urlencoded",
3370
                processData: true,
3371
                async: true,
3372
                /*
3373
                timeout: 0,
3374
                data: null,
3375
                username: null,
3376
                password: null,
3377
                */
3378
                // Create the request object; Microsoft failed to properly
3379
                // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
3380
                // This function can be overriden by calling jQuery.ajaxSetup
3381
                xhr:function(){
3382
                        return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
3383
                },
3384
                accepts: {
3385
                        xml: "application/xml, text/xml",
3386
                        html: "text/html",
3387
                        script: "text/javascript, application/javascript",
3388
                        json: "application/json, text/javascript",
3389
                        text: "text/plain",
3390
                        _default: "*/*"
3391
                }
3392
        },
3393

    
3394
        // Last-Modified header cache for next request
3395
        lastModified: {},
3396

    
3397
        ajax: function( s ) {
3398
                // Extend the settings, but re-extend 's' so that it can be
3399
                // checked again later (in the test suite, specifically)
3400
                s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
3401

    
3402
                var jsonp, jsre = /=\?(&|$)/g, status, data,
3403
                        type = s.type.toUpperCase();
3404

    
3405
                // convert data if not already a string
3406
                if ( s.data && s.processData && typeof s.data !== "string" )
3407
                        s.data = jQuery.param(s.data);
3408

    
3409
                // Handle JSONP Parameter Callbacks
3410
                if ( s.dataType == "jsonp" ) {
3411
                        if ( type == "GET" ) {
3412
                                if ( !s.url.match(jsre) )
3413
                                        s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
3414
                        } else if ( !s.data || !s.data.match(jsre) )
3415
                                s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
3416
                        s.dataType = "json";
3417
                }
3418

    
3419
                // Build temporary JSONP function
3420
                if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
3421
                        jsonp = "jsonp" + jsc++;
3422

    
3423
                        // Replace the =? sequence both in the query string and the data
3424
                        if ( s.data )
3425
                                s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
3426
                        s.url = s.url.replace(jsre, "=" + jsonp + "$1");
3427

    
3428
                        // We need to make sure
3429
                        // that a JSONP style response is executed properly
3430
                        s.dataType = "script";
3431

    
3432
                        // Handle JSONP-style loading
3433
                        window[ jsonp ] = function(tmp){
3434
                                data = tmp;
3435
                                success();
3436
                                complete();
3437
                                // Garbage collect
3438
                                window[ jsonp ] = undefined;
3439
                                try{ delete window[ jsonp ]; } catch(e){}
3440
                                if ( head )
3441
                                        head.removeChild( script );
3442
                        };
3443
                }
3444

    
3445
                if ( s.dataType == "script" && s.cache == null )
3446
                        s.cache = false;
3447

    
3448
                if ( s.cache === false && type == "GET" ) {
3449
                        var ts = now();
3450
                        // try replacing _= if it is there
3451
                        var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
3452
                        // if nothing was replaced, add timestamp to the end
3453
                        s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
3454
                }
3455

    
3456
                // If data is available, append data to url for get requests
3457
                if ( s.data && type == "GET" ) {
3458
                        s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
3459

    
3460
                        // IE likes to send both get and post data, prevent this
3461
                        s.data = null;
3462
                }
3463

    
3464
                // Watch for a new set of requests
3465
                if ( s.global && ! jQuery.active++ )
3466
                        jQuery.event.trigger( "ajaxStart" );
3467

    
3468
                // Matches an absolute URL, and saves the domain
3469
                var parts = /^(\w+:)?\/\/([^\/?#]+)/.exec( s.url );
3470

    
3471
                // If we're requesting a remote document
3472
                // and trying to load JSON or Script with a GET
3473
                if ( s.dataType == "script" && type == "GET" && parts
3474
                        && ( parts[1] && parts[1] != location.protocol || parts[2] != location.host )){
3475

    
3476
                        var head = document.getElementsByTagName("head")[0];
3477
                        var script = document.createElement("script");
3478
                        script.src = s.url;
3479
                        if (s.scriptCharset)
3480
                                script.charset = s.scriptCharset;
3481

    
3482
                        // Handle Script loading
3483
                        if ( !jsonp ) {
3484
                                var done = false;
3485

    
3486
                                // Attach handlers for all browsers
3487
                                script.onload = script.onreadystatechange = function(){
3488
                                        if ( !done && (!this.readyState ||
3489
                                                        this.readyState == "loaded" || this.readyState == "complete") ) {
3490
                                                done = true;
3491
                                                success();
3492
                                                complete();
3493

    
3494
                                                // Handle memory leak in IE
3495
                                                script.onload = script.onreadystatechange = null;
3496
                                                head.removeChild( script );
3497
                                        }
3498
                                };
3499
                        }
3500

    
3501
                        head.appendChild(script);
3502

    
3503
                        // We handle everything using the script element injection
3504
                        return undefined;
3505
                }
3506

    
3507
                var requestDone = false;
3508

    
3509
                // Create the request object
3510
                var xhr = s.xhr();
3511

    
3512
                // Open the socket
3513
                // Passing null username, generates a login popup on Opera (#2865)
3514
                if( s.username )
3515
                        xhr.open(type, s.url, s.async, s.username, s.password);
3516
                else
3517
                        xhr.open(type, s.url, s.async);
3518

    
3519
                // Need an extra try/catch for cross domain requests in Firefox 3
3520
                try {
3521
                        // Set the correct header, if data is being sent
3522
                        if ( s.data )
3523
                                xhr.setRequestHeader("Content-Type", s.contentType);
3524

    
3525
                        // Set the If-Modified-Since header, if ifModified mode.
3526
                        if ( s.ifModified )
3527
                                xhr.setRequestHeader("If-Modified-Since",
3528
                                        jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
3529

    
3530
                        // Set header so the called script knows that it's an XMLHttpRequest
3531
                        xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
3532

    
3533
                        // Set the Accepts header for the server, depending on the dataType
3534
                        xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
3535
                                s.accepts[ s.dataType ] + ", */*" :
3536
                                s.accepts._default );
3537
                } catch(e){}
3538

    
3539
                // Allow custom headers/mimetypes and early abort
3540
                if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
3541
                        // Handle the global AJAX counter
3542
                        if ( s.global && ! --jQuery.active )
3543
                                jQuery.event.trigger( "ajaxStop" );
3544
                        // close opended socket
3545
                        xhr.abort();
3546
                        return false;
3547
                }
3548

    
3549
                if ( s.global )
3550
                        jQuery.event.trigger("ajaxSend", [xhr, s]);
3551

    
3552
                // Wait for a response to come back
3553
                var onreadystatechange = function(isTimeout){
3554
                        // The request was aborted, clear the interval and decrement jQuery.active
3555
                        if (xhr.readyState == 0) {
3556
                                if (ival) {
3557
                                        // clear poll interval
3558
                                        clearInterval(ival);
3559
                                        ival = null;
3560
                                        // Handle the global AJAX counter
3561
                                        if ( s.global && ! --jQuery.active )
3562
                                                jQuery.event.trigger( "ajaxStop" );
3563
                                }
3564
                        // The transfer is complete and the data is available, or the request timed out
3565
                        } else if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
3566
                                requestDone = true;
3567

    
3568
                                // clear poll interval
3569
                                if (ival) {
3570
                                        clearInterval(ival);
3571
                                        ival = null;
3572
                                }
3573

    
3574
                                status = isTimeout == "timeout" ? "timeout" :
3575
                                        !jQuery.httpSuccess( xhr ) ? "error" :
3576
                                        s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? "notmodified" :
3577
                                        "success";
3578

    
3579
                                if ( status == "success" ) {
3580
                                        // Watch for, and catch, XML document parse errors
3581
                                        try {
3582
                                                // process the data (runs the xml through httpData regardless of callback)
3583
                                                data = jQuery.httpData( xhr, s.dataType, s );
3584
                                        } catch(e) {
3585
                                                status = "parsererror";
3586
                                        }
3587
                                }
3588

    
3589
                                // Make sure that the request was successful or notmodified
3590
                                if ( status == "success" ) {
3591
                                        // Cache Last-Modified header, if ifModified mode.
3592
                                        var modRes;
3593
                                        try {
3594
                                                modRes = xhr.getResponseHeader("Last-Modified");
3595
                                        } catch(e) {} // swallow exception thrown by FF if header is not available
3596

    
3597
                                        if ( s.ifModified && modRes )
3598
                                                jQuery.lastModified[s.url] = modRes;
3599

    
3600
                                        // JSONP handles its own success callback
3601
                                        if ( !jsonp )
3602
                                                success();
3603
                                } else
3604
                                        jQuery.handleError(s, xhr, status);
3605

    
3606
                                // Fire the complete handlers
3607
                                complete();
3608

    
3609
                                if ( isTimeout )
3610
                                        xhr.abort();
3611

    
3612
                                // Stop memory leaks
3613
                                if ( s.async )
3614
                                        xhr = null;
3615
                        }
3616
                };
3617

    
3618
                if ( s.async ) {
3619
                        // don't attach the handler to the request, just poll it instead
3620
                        var ival = setInterval(onreadystatechange, 13);
3621

    
3622
                        // Timeout checker
3623
                        if ( s.timeout > 0 )
3624
                                setTimeout(function(){
3625
                                        // Check to see if the request is still happening
3626
                                        if ( xhr && !requestDone )
3627
                                                onreadystatechange( "timeout" );
3628
                                }, s.timeout);
3629
                }
3630

    
3631
                // Send the data
3632
                try {
3633
                        xhr.send(s.data);
3634
                } catch(e) {
3635
                        jQuery.handleError(s, xhr, null, e);
3636
                }
3637

    
3638
                // firefox 1.5 doesn't fire statechange for sync requests
3639
                if ( !s.async )
3640
                        onreadystatechange();
3641

    
3642
                function success(){
3643
                        // If a local callback was specified, fire it and pass it the data
3644
                        if ( s.success )
3645
                                s.success( data, status );
3646

    
3647
                        // Fire the global callback
3648
                        if ( s.global )
3649
                                jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
3650
                }
3651

    
3652
                function complete(){
3653
                        // Process result
3654
                        if ( s.complete )
3655
                                s.complete(xhr, status);
3656

    
3657
                        // The request was completed
3658
                        if ( s.global )
3659
                                jQuery.event.trigger( "ajaxComplete", [xhr, s] );
3660

    
3661
                        // Handle the global AJAX counter
3662
                        if ( s.global && ! --jQuery.active )
3663
                                jQuery.event.trigger( "ajaxStop" );
3664
                }
3665

    
3666
                // return XMLHttpRequest to allow aborting the request etc.
3667
                return xhr;
3668
        },
3669

    
3670
        handleError: function( s, xhr, status, e ) {
3671
                // If a local callback was specified, fire it
3672
                if ( s.error ) s.error( xhr, status, e );
3673

    
3674
                // Fire the global callback
3675
                if ( s.global )
3676
                        jQuery.event.trigger( "ajaxError", [xhr, s, e] );
3677
        },
3678

    
3679
        // Counter for holding the number of active queries
3680
        active: 0,
3681

    
3682
        // Determines if an XMLHttpRequest was successful or not
3683
        httpSuccess: function( xhr ) {
3684
                try {
3685
                        // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
3686
                        return !xhr.status && location.protocol == "file:" ||
3687
                                ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223;
3688
                } catch(e){}
3689
                return false;
3690
        },
3691

    
3692
        // Determines if an XMLHttpRequest returns NotModified
3693
        httpNotModified: function( xhr, url ) {
3694
                try {
3695
                        var xhrRes = xhr.getResponseHeader("Last-Modified");
3696

    
3697
                        // Firefox always returns 200. check Last-Modified date
3698
                        return xhr.status == 304 || xhrRes == jQuery.lastModified[url];
3699
                } catch(e){}
3700
                return false;
3701
        },
3702

    
3703
        httpData: function( xhr, type, s ) {
3704
                var ct = xhr.getResponseHeader("content-type"),
3705
                        xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
3706
                        data = xml ? xhr.responseXML : xhr.responseText;
3707

    
3708
                if ( xml && data.documentElement.tagName == "parsererror" )
3709
                        throw "parsererror";
3710
                        
3711
                // Allow a pre-filtering function to sanitize the response
3712
                // s != null is checked to keep backwards compatibility
3713
                if( s && s.dataFilter )
3714
                        data = s.dataFilter( data, type );
3715

    
3716
                // The filter can actually parse the response
3717
                if( typeof data === "string" ){
3718

    
3719
                        // If the type is "script", eval it in global context
3720
                        if ( type == "script" )
3721
                                jQuery.globalEval( data );
3722

    
3723
                        // Get the JavaScript object, if JSON is used.
3724
                        if ( type == "json" )
3725
                                data = window["eval"]("(" + data + ")");
3726
                }
3727
                
3728
                return data;
3729
        },
3730

    
3731
        // Serialize an array of form elements or a set of
3732
        // key/values into a query string
3733
        param: function( a ) {
3734
                var s = [ ];
3735

    
3736
                function add( key, value ){
3737
                        s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
3738
                };
3739

    
3740
                // If an array was passed in, assume that it is an array
3741
                // of form elements
3742
                if ( jQuery.isArray(a) || a.jquery )
3743
                        // Serialize the form elements
3744
                        jQuery.each( a, function(){
3745
                                add( this.name, this.value );
3746
                        });
3747

    
3748
                // Otherwise, assume that it's an object of key/value pairs
3749
                else
3750
                        // Serialize the key/values
3751
                        for ( var j in a )
3752
                                // If the value is an array then the key names need to be repeated
3753
                                if ( jQuery.isArray(a[j]) )
3754
                                        jQuery.each( a[j], function(){
3755
                                                add( j, this );
3756
                                        });
3757
                                else
3758
                                        add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] );
3759

    
3760
                // Return the resulting serialization
3761
                return s.join("&").replace(/%20/g, "+");
3762
        }
3763

    
3764
});
3765
var elemdisplay = {},
3766
        timerId,
3767
        fxAttrs = [
3768
                // height animations
3769
                [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
3770
                // width animations
3771
                [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
3772
                // opacity animations
3773
                [ "opacity" ]
3774
        ];
3775

    
3776
function genFx( type, num ){
3777
        var obj = {};
3778
        jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function(){
3779
                obj[ this ] = type;
3780
        });
3781
        return obj;
3782
}
3783

    
3784
jQuery.fn.extend({
3785
        show: function(speed,callback){
3786
                if ( speed ) {
3787
                        return this.animate( genFx("show", 3), speed, callback);
3788
                } else {
3789
                        for ( var i = 0, l = this.length; i < l; i++ ){
3790
                                var old = jQuery.data(this[i], "olddisplay");
3791
                                
3792
                                this[i].style.display = old || "";
3793
                                
3794
                                if ( jQuery.css(this[i], "display") === "none" ) {
3795
                                        var tagName = this[i].tagName, display;
3796
                                        
3797
                                        if ( elemdisplay[ tagName ] ) {
3798
                                                display = elemdisplay[ tagName ];
3799
                                        } else {
3800
                                                var elem = jQuery("<" + tagName + " />").appendTo("body");
3801
                                                
3802
                                                display = elem.css("display");
3803
                                                if ( display === "none" )
3804
                                                        display = "block";
3805
                                                
3806
                                                elem.remove();
3807
                                                
3808
                                                elemdisplay[ tagName ] = display;
3809
                                        }
3810
                                        
3811
                                        jQuery.data(this[i], "olddisplay", display);
3812
                                }
3813
                        }
3814

    
3815
                        // Set the display of the elements in a second loop
3816
                        // to avoid the constant reflow
3817
                        for ( var i = 0, l = this.length; i < l; i++ ){
3818
                                this[i].style.display = jQuery.data(this[i], "olddisplay") || "";
3819
                        }
3820
                        
3821
                        return this;
3822
                }
3823
        },
3824

    
3825
        hide: function(speed,callback){
3826
                if ( speed ) {
3827
                        return this.animate( genFx("hide", 3), speed, callback);
3828
                } else {
3829
                        for ( var i = 0, l = this.length; i < l; i++ ){
3830
                                var old = jQuery.data(this[i], "olddisplay");
3831
                                if ( !old && old !== "none" )
3832
                                        jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
3833
                        }
3834

    
3835
                        // Set the display of the elements in a second loop
3836
                        // to avoid the constant reflow
3837
                        for ( var i = 0, l = this.length; i < l; i++ ){
3838
                                this[i].style.display = "none";
3839
                        }
3840

    
3841
                        return this;
3842
                }
3843
        },
3844

    
3845
        // Save the old toggle function
3846
        _toggle: jQuery.fn.toggle,
3847

    
3848
        toggle: function( fn, fn2 ){
3849
                var bool = typeof fn === "boolean";
3850

    
3851
                return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
3852
                        this._toggle.apply( this, arguments ) :
3853
                        fn == null || bool ?
3854
                                this.each(function(){
3855
                                        var state = bool ? fn : jQuery(this).is(":hidden");
3856
                                        jQuery(this)[ state ? "show" : "hide" ]();
3857
                                }) :
3858
                                this.animate(genFx("toggle", 3), fn, fn2);
3859
        },
3860

    
3861
        fadeTo: function(speed,to,callback){
3862
                return this.animate({opacity: to}, speed, callback);
3863
        },
3864

    
3865
        animate: function( prop, speed, easing, callback ) {
3866
                var optall = jQuery.speed(speed, easing, callback);
3867

    
3868
                return this[ optall.queue === false ? "each" : "queue" ](function(){
3869
                
3870
                        var opt = jQuery.extend({}, optall), p,
3871
                                hidden = this.nodeType == 1 && jQuery(this).is(":hidden"),
3872
                                self = this;
3873
        
3874
                        for ( p in prop ) {
3875
                                if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
3876
                                        return opt.complete.call(this);
3877

    
3878
                                if ( ( p == "height" || p == "width" ) && this.style ) {
3879
                                        // Store display property
3880
                                        opt.display = jQuery.css(this, "display");
3881

    
3882
                                        // Make sure that nothing sneaks out
3883
                                        opt.overflow = this.style.overflow;
3884
                                }
3885
                        }
3886

    
3887
                        if ( opt.overflow != null )
3888
                                this.style.overflow = "hidden";
3889

    
3890
                        opt.curAnim = jQuery.extend({}, prop);
3891

    
3892
                        jQuery.each( prop, function(name, val){
3893
                                var e = new jQuery.fx( self, opt, name );
3894

    
3895
                                if ( /toggle|show|hide/.test(val) )
3896
                                        e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
3897
                                else {
3898
                                        var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
3899
                                                start = e.cur(true) || 0;
3900

    
3901
                                        if ( parts ) {
3902
                                                var end = parseFloat(parts[2]),
3903
                                                        unit = parts[3] || "px";
3904

    
3905
                                                // We need to compute starting value
3906
                                                if ( unit != "px" ) {
3907
                                                        self.style[ name ] = (end || 1) + unit;
3908
                                                        start = ((end || 1) / e.cur(true)) * start;
3909
                                                        self.style[ name ] = start + unit;
3910
                                                }
3911

    
3912
                                                // If a +=/-= token was provided, we're doing a relative animation
3913
                                                if ( parts[1] )
3914
                                                        end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
3915

    
3916
                                                e.custom( start, end, unit );
3917
                                        } else
3918
                                                e.custom( start, val, "" );
3919
                                }
3920
                        });
3921

    
3922
                        // For JS strict compliance
3923
                        return true;
3924
                });
3925
        },
3926

    
3927
        stop: function(clearQueue, gotoEnd){
3928
                var timers = jQuery.timers;
3929

    
3930
                if (clearQueue)
3931
                        this.queue([]);
3932

    
3933
                this.each(function(){
3934
                        // go in reverse order so anything added to the queue during the loop is ignored
3935
                        for ( var i = timers.length - 1; i >= 0; i-- )
3936
                                if ( timers[i].elem == this ) {
3937
                                        if (gotoEnd)
3938
                                                // force the next step to be the last
3939
                                                timers[i](true);
3940
                                        timers.splice(i, 1);
3941
                                }
3942
                });
3943

    
3944
                // start the next in the queue if the last step wasn't forced
3945
                if (!gotoEnd)
3946
                        this.dequeue();
3947

    
3948
                return this;
3949
        }
3950

    
3951
});
3952

    
3953
// Generate shortcuts for custom animations
3954
jQuery.each({
3955
        slideDown: genFx("show", 1),
3956
        slideUp: genFx("hide", 1),
3957
        slideToggle: genFx("toggle", 1),
3958
        fadeIn: { opacity: "show" },
3959
        fadeOut: { opacity: "hide" }
3960
}, function( name, props ){
3961
        jQuery.fn[ name ] = function( speed, callback ){
3962
                return this.animate( props, speed, callback );
3963
        };
3964
});
3965

    
3966
jQuery.extend({
3967

    
3968
        speed: function(speed, easing, fn) {
3969
                var opt = typeof speed === "object" ? speed : {
3970
                        complete: fn || !fn && easing ||
3971
                                jQuery.isFunction( speed ) && speed,
3972
                        duration: speed,
3973
                        easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
3974
                };
3975

    
3976
                opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
3977
                        jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
3978

    
3979
                // Queueing
3980
                opt.old = opt.complete;
3981
                opt.complete = function(){
3982
                        if ( opt.queue !== false )
3983
                                jQuery(this).dequeue();
3984
                        if ( jQuery.isFunction( opt.old ) )
3985
                                opt.old.call( this );
3986
                };
3987

    
3988
                return opt;
3989
        },
3990

    
3991
        easing: {
3992
                linear: function( p, n, firstNum, diff ) {
3993
                        return firstNum + diff * p;
3994
                },
3995
                swing: function( p, n, firstNum, diff ) {
3996
                        return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
3997
                }
3998
        },
3999

    
4000
        timers: [],
4001

    
4002
        fx: function( elem, options, prop ){
4003
                this.options = options;
4004
                this.elem = elem;
4005
                this.prop = prop;
4006

    
4007
                if ( !options.orig )
4008
                        options.orig = {};
4009
        }
4010

    
4011
});
4012

    
4013
jQuery.fx.prototype = {
4014

    
4015
        // Simple function for setting a style value
4016
        update: function(){
4017
                if ( this.options.step )
4018
                        this.options.step.call( this.elem, this.now, this );
4019

    
4020
                (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
4021

    
4022
                // Set display property to block for height/width animations
4023
                if ( ( this.prop == "height" || this.prop == "width" ) && this.elem.style )
4024
                        this.elem.style.display = "block";
4025
        },
4026

    
4027
        // Get the current size
4028
        cur: function(force){
4029
                if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) )
4030
                        return this.elem[ this.prop ];
4031

    
4032
                var r = parseFloat(jQuery.css(this.elem, this.prop, force));
4033
                return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
4034
        },
4035

    
4036
        // Start an animation from one number to another
4037
        custom: function(from, to, unit){
4038
                this.startTime = now();
4039
                this.start = from;
4040
                this.end = to;
4041
                this.unit = unit || this.unit || "px";
4042
                this.now = this.start;
4043
                this.pos = this.state = 0;
4044

    
4045
                var self = this;
4046
                function t(gotoEnd){
4047
                        return self.step(gotoEnd);
4048
                }
4049

    
4050
                t.elem = this.elem;
4051

    
4052
                if ( t() && jQuery.timers.push(t) && !timerId ) {
4053
                        timerId = setInterval(function(){
4054
                                var timers = jQuery.timers;
4055

    
4056
                                for ( var i = 0; i < timers.length; i++ )
4057
                                        if ( !timers[i]() )
4058
                                                timers.splice(i--, 1);
4059

    
4060
                                if ( !timers.length ) {
4061
                                        clearInterval( timerId );
4062
                                        timerId = undefined;
4063
                                }
4064
                        }, 13);
4065
                }
4066
        },
4067

    
4068
        // Simple 'show' function
4069
        show: function(){
4070
                // Remember where we started, so that we can go back to it later
4071
                this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
4072
                this.options.show = true;
4073

    
4074
                // Begin the animation
4075
                // Make sure that we start at a small width/height to avoid any
4076
                // flash of content
4077
                this.custom(this.prop == "width" || this.prop == "height" ? 1 : 0, this.cur());
4078

    
4079
                // Start by showing the element
4080
                jQuery(this.elem).show();
4081
        },
4082

    
4083
        // Simple 'hide' function
4084
        hide: function(){
4085
                // Remember where we started, so that we can go back to it later
4086
                this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
4087
                this.options.hide = true;
4088

    
4089
                // Begin the animation
4090
                this.custom(this.cur(), 0);
4091
        },
4092

    
4093
        // Each step of an animation
4094
        step: function(gotoEnd){
4095
                var t = now();
4096

    
4097
                if ( gotoEnd || t >= this.options.duration + this.startTime ) {
4098
                        this.now = this.end;
4099
                        this.pos = this.state = 1;
4100
                        this.update();
4101

    
4102
                        this.options.curAnim[ this.prop ] = true;
4103

    
4104
                        var done = true;
4105
                        for ( var i in this.options.curAnim )
4106
                                if ( this.options.curAnim[i] !== true )
4107
                                        done = false;
4108

    
4109
                        if ( done ) {
4110
                                if ( this.options.display != null ) {
4111
                                        // Reset the overflow
4112
                                        this.elem.style.overflow = this.options.overflow;
4113

    
4114
                                        // Reset the display
4115
                                        this.elem.style.display = this.options.display;
4116
                                        if ( jQuery.css(this.elem, "display") == "none" )
4117
                                                this.elem.style.display = "block";
4118
                                }
4119

    
4120
                                // Hide the element if the "hide" operation was done
4121
                                if ( this.options.hide )
4122
                                        jQuery(this.elem).hide();
4123

    
4124
                                // Reset the properties, if the item has been hidden or shown
4125
                                if ( this.options.hide || this.options.show )
4126
                                        for ( var p in this.options.curAnim )
4127
                                                jQuery.attr(this.elem.style, p, this.options.orig[p]);
4128
                                        
4129
                                // Execute the complete function
4130
                                this.options.complete.call( this.elem );
4131
                        }
4132

    
4133
                        return false;
4134
                } else {
4135
                        var n = t - this.startTime;
4136
                        this.state = n / this.options.duration;
4137

    
4138
                        // Perform the easing function, defaults to swing
4139
                        this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
4140
                        this.now = this.start + ((this.end - this.start) * this.pos);
4141

    
4142
                        // Perform the next step of the animation
4143
                        this.update();
4144
                }
4145

    
4146
                return true;
4147
        }
4148

    
4149
};
4150

    
4151
jQuery.extend( jQuery.fx, {
4152
        speeds:{
4153
                slow: 600,
4154
                 fast: 200,
4155
                 // Default speed
4156
                 _default: 400
4157
        },
4158
        step: {
4159

    
4160
                opacity: function(fx){
4161
                        jQuery.attr(fx.elem.style, "opacity", fx.now);
4162
                },
4163

    
4164
                _default: function(fx){
4165
                        if ( fx.elem.style && fx.elem.style[ fx.prop ] != null )
4166
                                fx.elem.style[ fx.prop ] = fx.now + fx.unit;
4167
                        else
4168
                                fx.elem[ fx.prop ] = fx.now;
4169
                }
4170
        }
4171
});
4172
if ( document.documentElement["getBoundingClientRect"] )
4173
        jQuery.fn.offset = function() {
4174
                if ( !this[0] ) return { top: 0, left: 0 };
4175
                if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
4176
                var box  = this[0].getBoundingClientRect(), doc = this[0].ownerDocument, body = doc.body, docElem = doc.documentElement,
4177
                        clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
4178
                        top  = box.top  + (self.pageYOffset || jQuery.boxModel && docElem.scrollTop  || body.scrollTop ) - clientTop,
4179
                        left = box.left + (self.pageXOffset || jQuery.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
4180
                return { top: top, left: left };
4181
        };
4182
else 
4183
        jQuery.fn.offset = function() {
4184
                if ( !this[0] ) return { top: 0, left: 0 };
4185
                if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
4186
                jQuery.offset.initialized || jQuery.offset.initialize();
4187

    
4188
                var elem = this[0], offsetParent = elem.offsetParent, prevOffsetParent = elem,
4189
                        doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
4190
                        body = doc.body, defaultView = doc.defaultView,
4191
                        prevComputedStyle = defaultView.getComputedStyle(elem, null),
4192
                        top = elem.offsetTop, left = elem.offsetLeft;
4193

    
4194
                while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
4195
                        computedStyle = defaultView.getComputedStyle(elem, null);
4196
                        top -= elem.scrollTop, left -= elem.scrollLeft;
4197
                        if ( elem === offsetParent ) {
4198
                                top += elem.offsetTop, left += elem.offsetLeft;
4199
                                if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.tagName)) )
4200
                                        top  += parseInt( computedStyle.borderTopWidth,  10) || 0,
4201
                                        left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
4202
                                prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
4203
                        }
4204
                        if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" )
4205
                                top  += parseInt( computedStyle.borderTopWidth,  10) || 0,
4206
                                left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
4207
                        prevComputedStyle = computedStyle;
4208
                }
4209

    
4210
                if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" )
4211
                        top  += body.offsetTop,
4212
                        left += body.offsetLeft;
4213

    
4214
                if ( prevComputedStyle.position === "fixed" )
4215
                        top  += Math.max(docElem.scrollTop, body.scrollTop),
4216
                        left += Math.max(docElem.scrollLeft, body.scrollLeft);
4217

    
4218
                return { top: top, left: left };
4219
        };
4220

    
4221
jQuery.offset = {
4222
        initialize: function() {
4223
                if ( this.initialized ) return;
4224
                var body = document.body, container = document.createElement('div'), innerDiv, checkDiv, table, td, rules, prop, bodyMarginTop = body.style.marginTop,
4225
                        html = '<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';
4226

    
4227
                rules = { position: 'absolute', top: 0, left: 0, margin: 0, border: 0, width: '1px', height: '1px', visibility: 'hidden' };
4228
                for ( prop in rules ) container.style[prop] = rules[prop];
4229

    
4230
                container.innerHTML = html;
4231
                body.insertBefore(container, body.firstChild);
4232
                innerDiv = container.firstChild, checkDiv = innerDiv.firstChild, td = innerDiv.nextSibling.firstChild.firstChild;
4233

    
4234
                this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
4235
                this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
4236

    
4237
                innerDiv.style.overflow = 'hidden', innerDiv.style.position = 'relative';
4238
                this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
4239

    
4240
                body.style.marginTop = '1px';
4241
                this.doesNotIncludeMarginInBodyOffset = (body.offsetTop === 0);
4242
                body.style.marginTop = bodyMarginTop;
4243

    
4244
                body.removeChild(container);
4245
                this.initialized = true;
4246
        },
4247

    
4248
        bodyOffset: function(body) {
4249
                jQuery.offset.initialized || jQuery.offset.initialize();
4250
                var top = body.offsetTop, left = body.offsetLeft;
4251
                if ( jQuery.offset.doesNotIncludeMarginInBodyOffset )
4252
                        top  += parseInt( jQuery.curCSS(body, 'marginTop',  true), 10 ) || 0,
4253
                        left += parseInt( jQuery.curCSS(body, 'marginLeft', true), 10 ) || 0;
4254
                return { top: top, left: left };
4255
        }
4256
};
4257

    
4258

    
4259
jQuery.fn.extend({
4260
        position: function() {
4261
                var left = 0, top = 0, results;
4262

    
4263
                if ( this[0] ) {
4264
                        // Get *real* offsetParent
4265
                        var offsetParent = this.offsetParent(),
4266

    
4267
                        // Get correct offsets
4268
                        offset       = this.offset(),
4269
                        parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
4270

    
4271
                        // Subtract element margins
4272
                        // note: when an element has margin: auto the offsetLeft and marginLeft 
4273
                        // are the same in Safari causing offset.left to incorrectly be 0
4274
                        offset.top  -= num( this, 'marginTop'  );
4275
                        offset.left -= num( this, 'marginLeft' );
4276

    
4277
                        // Add offsetParent borders
4278
                        parentOffset.top  += num( offsetParent, 'borderTopWidth'  );
4279
                        parentOffset.left += num( offsetParent, 'borderLeftWidth' );
4280

    
4281
                        // Subtract the two offsets
4282
                        results = {
4283
                                top:  offset.top  - parentOffset.top,
4284
                                left: offset.left - parentOffset.left
4285
                        };
4286
                }
4287

    
4288
                return results;
4289
        },
4290

    
4291
        offsetParent: function() {
4292
                var offsetParent = this[0].offsetParent || document.body;
4293
                while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
4294
                        offsetParent = offsetParent.offsetParent;
4295
                return jQuery(offsetParent);
4296
        }
4297
});
4298

    
4299

    
4300
// Create scrollLeft and scrollTop methods
4301
jQuery.each( ['Left', 'Top'], function(i, name) {
4302
        var method = 'scroll' + name;
4303
        
4304
        jQuery.fn[ method ] = function(val) {
4305
                if (!this[0]) return null;
4306

    
4307
                return val !== undefined ?
4308

    
4309
                        // Set the scroll offset
4310
                        this.each(function() {
4311
                                this == window || this == document ?
4312
                                        window.scrollTo(
4313
                                                !i ? val : jQuery(window).scrollLeft(),
4314
                                                 i ? val : jQuery(window).scrollTop()
4315
                                        ) :
4316
                                        this[ method ] = val;
4317
                        }) :
4318

    
4319
                        // Return the scroll offset
4320
                        this[0] == window || this[0] == document ?
4321
                                self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
4322
                                        jQuery.boxModel && document.documentElement[ method ] ||
4323
                                        document.body[ method ] :
4324
                                this[0][ method ];
4325
        };
4326
});
4327
// Create innerHeight, innerWidth, outerHeight and outerWidth methods
4328
jQuery.each([ "Height", "Width" ], function(i, name){
4329

    
4330
        var tl = i ? "Left"  : "Top",  // top or left
4331
                br = i ? "Right" : "Bottom", // bottom or right
4332
                lower = name.toLowerCase();
4333

    
4334
        // innerHeight and innerWidth
4335
        jQuery.fn["inner" + name] = function(){
4336
                return this[0] ?
4337
                        jQuery.css( this[0], lower, false, "padding" ) :
4338
                        null;
4339
        };
4340

    
4341
        // outerHeight and outerWidth
4342
        jQuery.fn["outer" + name] = function(margin) {
4343
                return this[0] ?
4344
                        jQuery.css( this[0], lower, false, margin ? "margin" : "border" ) :
4345
                        null;
4346
        };
4347
        
4348
        var type = name.toLowerCase();
4349

    
4350
        jQuery.fn[ type ] = function( size ) {
4351
                // Get window width or height
4352
                return this[0] == window ?
4353
                        // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
4354
                        document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] ||
4355
                        document.body[ "client" + name ] :
4356

    
4357
                        // Get document width or height
4358
                        this[0] == document ?
4359
                                // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
4360
                                Math.max(
4361
                                        document.documentElement["client" + name],
4362
                                        document.body["scroll" + name], document.documentElement["scroll" + name],
4363
                                        document.body["offset" + name], document.documentElement["offset" + name]
4364
                                ) :
4365

    
4366
                                // Get or set width or height on the element
4367
                                size === undefined ?
4368
                                        // Get width or height on the element
4369
                                        (this.length ? jQuery.css( this[0], type ) : null) :
4370

    
4371
                                        // Set the width or height on the element (default to pixels if value is unitless)
4372
                                        this.css( type, typeof size === "string" ? size : size + "px" );
4373
        };
4374

    
4375
});
4376
})();