Projet

Général

Profil

Paste
Télécharger (212 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / jquery_update / replace / jquery / 1.5 / jquery.js @ 2c8c2b87

1
/*!
2
 * jQuery JavaScript Library v1.5.1
3
 * http://jquery.com/
4
 *
5
 * Copyright 2011, John Resig
6
 * Dual licensed under the MIT or GPL Version 2 licenses.
7
 * http://jquery.org/license
8
 *
9
 * Includes Sizzle.js
10
 * http://sizzlejs.com/
11
 * Copyright 2011, The Dojo Foundation
12
 * Released under the MIT, BSD, and GPL Licenses.
13
 *
14
 * Date: Wed Feb 23 13:55:29 2011 -0500
15
 */
16
(function( window, undefined ) {
17

    
18
// Use the correct document accordingly with window argument (sandbox)
19
var document = window.document;
20
var jQuery = (function() {
21

    
22
// Define a local copy of jQuery
23
var jQuery = function( selector, context ) {
24
                // The jQuery object is actually just the init constructor 'enhanced'
25
                return new jQuery.fn.init( selector, context, rootjQuery );
26
        },
27

    
28
        // Map over jQuery in case of overwrite
29
        _jQuery = window.jQuery,
30

    
31
        // Map over the $ in case of overwrite
32
        _$ = window.$,
33

    
34
        // A central reference to the root jQuery(document)
35
        rootjQuery,
36

    
37
        // A simple way to check for HTML strings or ID strings
38
        // (both of which we optimize for)
39
        quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,
40

    
41
        // Check if a string has a non-whitespace character in it
42
        rnotwhite = /\S/,
43

    
44
        // Used for trimming whitespace
45
        trimLeft = /^\s+/,
46
        trimRight = /\s+$/,
47

    
48
        // Check for digits
49
        rdigit = /\d/,
50

    
51
        // Match a standalone tag
52
        rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
53

    
54
        // JSON RegExp
55
        rvalidchars = /^[\],:{}\s]*$/,
56
        rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
57
        rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
58
        rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
59

    
60
        // Useragent RegExp
61
        rwebkit = /(webkit)[ \/]([\w.]+)/,
62
        ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
63
        rmsie = /(msie) ([\w.]+)/,
64
        rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
65

    
66
        // Keep a UserAgent string for use with jQuery.browser
67
        userAgent = navigator.userAgent,
68

    
69
        // For matching the engine and version of the browser
70
        browserMatch,
71

    
72
        // Has the ready events already been bound?
73
        readyBound = false,
74

    
75
        // The deferred used on DOM ready
76
        readyList,
77

    
78
        // Promise methods
79
        promiseMethods = "then done fail isResolved isRejected promise".split( " " ),
80

    
81
        // The ready event handler
82
        DOMContentLoaded,
83

    
84
        // Save a reference to some core methods
85
        toString = Object.prototype.toString,
86
        hasOwn = Object.prototype.hasOwnProperty,
87
        push = Array.prototype.push,
88
        slice = Array.prototype.slice,
89
        trim = String.prototype.trim,
90
        indexOf = Array.prototype.indexOf,
91

    
92
        // [[Class]] -> type pairs
93
        class2type = {};
94

    
95
jQuery.fn = jQuery.prototype = {
96
        constructor: jQuery,
97
        init: function( selector, context, rootjQuery ) {
98
                var match, elem, ret, doc;
99

    
100
                // Handle $(""), $(null), or $(undefined)
101
                if ( !selector ) {
102
                        return this;
103
                }
104

    
105
                // Handle $(DOMElement)
106
                if ( selector.nodeType ) {
107
                        this.context = this[0] = selector;
108
                        this.length = 1;
109
                        return this;
110
                }
111

    
112
                // The body element only exists once, optimize finding it
113
                if ( selector === "body" && !context && document.body ) {
114
                        this.context = document;
115
                        this[0] = document.body;
116
                        this.selector = "body";
117
                        this.length = 1;
118
                        return this;
119
                }
120

    
121
                // Handle HTML strings
122
                if ( typeof selector === "string" ) {
123
                        // Are we dealing with HTML string or an ID?
124
                        match = quickExpr.exec( selector );
125

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

    
129
                                // HANDLE: $(html) -> $(array)
130
                                if ( match[1] ) {
131
                                        context = context instanceof jQuery ? context[0] : context;
132
                                        doc = (context ? context.ownerDocument || context : document);
133

    
134
                                        // If a single string is passed in and it's a single tag
135
                                        // just do a createElement and skip the rest
136
                                        ret = rsingleTag.exec( selector );
137

    
138
                                        if ( ret ) {
139
                                                if ( jQuery.isPlainObject( context ) ) {
140
                                                        selector = [ document.createElement( ret[1] ) ];
141
                                                        jQuery.fn.attr.call( selector, context, true );
142

    
143
                                                } else {
144
                                                        selector = [ doc.createElement( ret[1] ) ];
145
                                                }
146

    
147
                                        } else {
148
                                                ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
149
                                                selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
150
                                        }
151

    
152
                                        return jQuery.merge( this, selector );
153

    
154
                                // HANDLE: $("#id")
155
                                } else {
156
                                        elem = document.getElementById( match[2] );
157

    
158
                                        // Check parentNode to catch when Blackberry 4.6 returns
159
                                        // nodes that are no longer in the document #6963
160
                                        if ( elem && elem.parentNode ) {
161
                                                // Handle the case where IE and Opera return items
162
                                                // by name instead of ID
163
                                                if ( elem.id !== match[2] ) {
164
                                                        return rootjQuery.find( selector );
165
                                                }
166

    
167
                                                // Otherwise, we inject the element directly into the jQuery object
168
                                                this.length = 1;
169
                                                this[0] = elem;
170
                                        }
171

    
172
                                        this.context = document;
173
                                        this.selector = selector;
174
                                        return this;
175
                                }
176

    
177
                        // HANDLE: $(expr, $(...))
178
                        } else if ( !context || context.jquery ) {
179
                                return (context || rootjQuery).find( selector );
180

    
181
                        // HANDLE: $(expr, context)
182
                        // (which is just equivalent to: $(context).find(expr)
183
                        } else {
184
                                return this.constructor( context ).find( selector );
185
                        }
186

    
187
                // HANDLE: $(function)
188
                // Shortcut for document ready
189
                } else if ( jQuery.isFunction( selector ) ) {
190
                        return rootjQuery.ready( selector );
191
                }
192

    
193
                if (selector.selector !== undefined) {
194
                        this.selector = selector.selector;
195
                        this.context = selector.context;
196
                }
197

    
198
                return jQuery.makeArray( selector, this );
199
        },
200

    
201
        // Start with an empty selector
202
        selector: "",
203

    
204
        // The current version of jQuery being used
205
        jquery: "1.5.1",
206

    
207
        // The default length of a jQuery object is 0
208
        length: 0,
209

    
210
        // The number of elements contained in the matched element set
211
        size: function() {
212
                return this.length;
213
        },
214

    
215
        toArray: function() {
216
                return slice.call( this, 0 );
217
        },
218

    
219
        // Get the Nth element in the matched element set OR
220
        // Get the whole matched element set as a clean array
221
        get: function( num ) {
222
                return num == null ?
223

    
224
                        // Return a 'clean' array
225
                        this.toArray() :
226

    
227
                        // Return just the object
228
                        ( num < 0 ? this[ this.length + num ] : this[ num ] );
229
        },
230

    
231
        // Take an array of elements and push it onto the stack
232
        // (returning the new matched element set)
233
        pushStack: function( elems, name, selector ) {
234
                // Build a new jQuery matched element set
235
                var ret = this.constructor();
236

    
237
                if ( jQuery.isArray( elems ) ) {
238
                        push.apply( ret, elems );
239

    
240
                } else {
241
                        jQuery.merge( ret, elems );
242
                }
243

    
244
                // Add the old object onto the stack (as a reference)
245
                ret.prevObject = this;
246

    
247
                ret.context = this.context;
248

    
249
                if ( name === "find" ) {
250
                        ret.selector = this.selector + (this.selector ? " " : "") + selector;
251
                } else if ( name ) {
252
                        ret.selector = this.selector + "." + name + "(" + selector + ")";
253
                }
254

    
255
                // Return the newly-formed element set
256
                return ret;
257
        },
258

    
259
        // Execute a callback for every element in the matched set.
260
        // (You can seed the arguments with an array of args, but this is
261
        // only used internally.)
262
        each: function( callback, args ) {
263
                return jQuery.each( this, callback, args );
264
        },
265

    
266
        ready: function( fn ) {
267
                // Attach the listeners
268
                jQuery.bindReady();
269

    
270
                // Add the callback
271
                readyList.done( fn );
272

    
273
                return this;
274
        },
275

    
276
        eq: function( i ) {
277
                return i === -1 ?
278
                        this.slice( i ) :
279
                        this.slice( i, +i + 1 );
280
        },
281

    
282
        first: function() {
283
                return this.eq( 0 );
284
        },
285

    
286
        last: function() {
287
                return this.eq( -1 );
288
        },
289

    
290
        slice: function() {
291
                return this.pushStack( slice.apply( this, arguments ),
292
                        "slice", slice.call(arguments).join(",") );
293
        },
294

    
295
        map: function( callback ) {
296
                return this.pushStack( jQuery.map(this, function( elem, i ) {
297
                        return callback.call( elem, i, elem );
298
                }));
299
        },
300

    
301
        end: function() {
302
                return this.prevObject || this.constructor(null);
303
        },
304

    
305
        // For internal use only.
306
        // Behaves like an Array's method, not like a jQuery method.
307
        push: push,
308
        sort: [].sort,
309
        splice: [].splice
310
};
311

    
312
// Give the init function the jQuery prototype for later instantiation
313
jQuery.fn.init.prototype = jQuery.fn;
314

    
315
jQuery.extend = jQuery.fn.extend = function() {
316
        var options, name, src, copy, copyIsArray, clone,
317
                target = arguments[0] || {},
318
                i = 1,
319
                length = arguments.length,
320
                deep = false;
321

    
322
        // Handle a deep copy situation
323
        if ( typeof target === "boolean" ) {
324
                deep = target;
325
                target = arguments[1] || {};
326
                // skip the boolean and the target
327
                i = 2;
328
        }
329

    
330
        // Handle case when target is a string or something (possible in deep copy)
331
        if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
332
                target = {};
333
        }
334

    
335
        // extend jQuery itself if only one argument is passed
336
        if ( length === i ) {
337
                target = this;
338
                --i;
339
        }
340

    
341
        for ( ; i < length; i++ ) {
342
                // Only deal with non-null/undefined values
343
                if ( (options = arguments[ i ]) != null ) {
344
                        // Extend the base object
345
                        for ( name in options ) {
346
                                src = target[ name ];
347
                                copy = options[ name ];
348

    
349
                                // Prevent never-ending loop
350
                                if ( target === copy ) {
351
                                        continue;
352
                                }
353

    
354
                                // Recurse if we're merging plain objects or arrays
355
                                if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
356
                                        if ( copyIsArray ) {
357
                                                copyIsArray = false;
358
                                                clone = src && jQuery.isArray(src) ? src : [];
359

    
360
                                        } else {
361
                                                clone = src && jQuery.isPlainObject(src) ? src : {};
362
                                        }
363

    
364
                                        // Never move original objects, clone them
365
                                        target[ name ] = jQuery.extend( deep, clone, copy );
366

    
367
                                // Don't bring in undefined values
368
                                } else if ( copy !== undefined ) {
369
                                        target[ name ] = copy;
370
                                }
371
                        }
372
                }
373
        }
374

    
375
        // Return the modified object
376
        return target;
377
};
378

    
379
jQuery.extend({
380
        noConflict: function( deep ) {
381
                window.$ = _$;
382

    
383
                if ( deep ) {
384
                        window.jQuery = _jQuery;
385
                }
386

    
387
                return jQuery;
388
        },
389

    
390
        // Is the DOM ready to be used? Set to true once it occurs.
391
        isReady: false,
392

    
393
        // A counter to track how many items to wait for before
394
        // the ready event fires. See #6781
395
        readyWait: 1,
396

    
397
        // Handle when the DOM is ready
398
        ready: function( wait ) {
399
                // A third-party is pushing the ready event forwards
400
                if ( wait === true ) {
401
                        jQuery.readyWait--;
402
                }
403

    
404
                // Make sure that the DOM is not already loaded
405
                if ( !jQuery.readyWait || (wait !== true && !jQuery.isReady) ) {
406
                        // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
407
                        if ( !document.body ) {
408
                                return setTimeout( jQuery.ready, 1 );
409
                        }
410

    
411
                        // Remember that the DOM is ready
412
                        jQuery.isReady = true;
413

    
414
                        // If a normal DOM Ready event fired, decrement, and wait if need be
415
                        if ( wait !== true && --jQuery.readyWait > 0 ) {
416
                                return;
417
                        }
418

    
419
                        // If there are functions bound, to execute
420
                        readyList.resolveWith( document, [ jQuery ] );
421

    
422
                        // Trigger any bound ready events
423
                        if ( jQuery.fn.trigger ) {
424
                                jQuery( document ).trigger( "ready" ).unbind( "ready" );
425
                        }
426
                }
427
        },
428

    
429
        bindReady: function() {
430
                if ( readyBound ) {
431
                        return;
432
                }
433

    
434
                readyBound = true;
435

    
436
                // Catch cases where $(document).ready() is called after the
437
                // browser event has already occurred.
438
                if ( document.readyState === "complete" ) {
439
                        // Handle it asynchronously to allow scripts the opportunity to delay ready
440
                        return setTimeout( jQuery.ready, 1 );
441
                }
442

    
443
                // Mozilla, Opera and webkit nightlies currently support this event
444
                if ( document.addEventListener ) {
445
                        // Use the handy event callback
446
                        document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
447

    
448
                        // A fallback to window.onload, that will always work
449
                        window.addEventListener( "load", jQuery.ready, false );
450

    
451
                // If IE event model is used
452
                } else if ( document.attachEvent ) {
453
                        // ensure firing before onload,
454
                        // maybe late but safe also for iframes
455
                        document.attachEvent("onreadystatechange", DOMContentLoaded);
456

    
457
                        // A fallback to window.onload, that will always work
458
                        window.attachEvent( "onload", jQuery.ready );
459

    
460
                        // If IE and not a frame
461
                        // continually check to see if the document is ready
462
                        var toplevel = false;
463

    
464
                        try {
465
                                toplevel = window.frameElement == null;
466
                        } catch(e) {}
467

    
468
                        if ( document.documentElement.doScroll && toplevel ) {
469
                                doScrollCheck();
470
                        }
471
                }
472
        },
473

    
474
        // See test/unit/core.js for details concerning isFunction.
475
        // Since version 1.3, DOM methods and functions like alert
476
        // aren't supported. They return false on IE (#2968).
477
        isFunction: function( obj ) {
478
                return jQuery.type(obj) === "function";
479
        },
480

    
481
        isArray: Array.isArray || function( obj ) {
482
                return jQuery.type(obj) === "array";
483
        },
484

    
485
        // A crude way of determining if an object is a window
486
        isWindow: function( obj ) {
487
                return obj && typeof obj === "object" && "setInterval" in obj;
488
        },
489

    
490
        isNaN: function( obj ) {
491
                return obj == null || !rdigit.test( obj ) || isNaN( obj );
492
        },
493

    
494
        type: function( obj ) {
495
                return obj == null ?
496
                        String( obj ) :
497
                        class2type[ toString.call(obj) ] || "object";
498
        },
499

    
500
        isPlainObject: function( obj ) {
501
                // Must be an Object.
502
                // Because of IE, we also have to check the presence of the constructor property.
503
                // Make sure that DOM nodes and window objects don't pass through, as well
504
                if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
505
                        return false;
506
                }
507

    
508
                // Not own constructor property must be Object
509
                if ( obj.constructor &&
510
                        !hasOwn.call(obj, "constructor") &&
511
                        !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
512
                        return false;
513
                }
514

    
515
                // Own properties are enumerated firstly, so to speed up,
516
                // if last one is own, then all properties are own.
517

    
518
                var key;
519
                for ( key in obj ) {}
520

    
521
                return key === undefined || hasOwn.call( obj, key );
522
        },
523

    
524
        isEmptyObject: function( obj ) {
525
                for ( var name in obj ) {
526
                        return false;
527
                }
528
                return true;
529
        },
530

    
531
        error: function( msg ) {
532
                throw msg;
533
        },
534

    
535
        parseJSON: function( data ) {
536
                if ( typeof data !== "string" || !data ) {
537
                        return null;
538
                }
539

    
540
                // Make sure leading/trailing whitespace is removed (IE can't handle it)
541
                data = jQuery.trim( data );
542

    
543
                // Make sure the incoming data is actual JSON
544
                // Logic borrowed from http://json.org/json2.js
545
                if ( rvalidchars.test(data.replace(rvalidescape, "@")
546
                        .replace(rvalidtokens, "]")
547
                        .replace(rvalidbraces, "")) ) {
548

    
549
                        // Try to use the native JSON parser first
550
                        return window.JSON && window.JSON.parse ?
551
                                window.JSON.parse( data ) :
552
                                (new Function("return " + data))();
553

    
554
                } else {
555
                        jQuery.error( "Invalid JSON: " + data );
556
                }
557
        },
558

    
559
        // Cross-browser xml parsing
560
        // (xml & tmp used internally)
561
        parseXML: function( data , xml , tmp ) {
562

    
563
                if ( window.DOMParser ) { // Standard
564
                        tmp = new DOMParser();
565
                        xml = tmp.parseFromString( data , "text/xml" );
566
                } else { // IE
567
                        xml = new ActiveXObject( "Microsoft.XMLDOM" );
568
                        xml.async = "false";
569
                        xml.loadXML( data );
570
                }
571

    
572
                tmp = xml.documentElement;
573

    
574
                if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) {
575
                        jQuery.error( "Invalid XML: " + data );
576
                }
577

    
578
                return xml;
579
        },
580

    
581
        noop: function() {},
582

    
583
        // Evalulates a script in a global context
584
        globalEval: function( data ) {
585
                if ( data && rnotwhite.test(data) ) {
586
                        // Inspired by code by Andrea Giammarchi
587
                        // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
588
                        var head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement,
589
                                script = document.createElement( "script" );
590

    
591
                        if ( jQuery.support.scriptEval() ) {
592
                                script.appendChild( document.createTextNode( data ) );
593
                        } else {
594
                                script.text = data;
595
                        }
596

    
597
                        // Use insertBefore instead of appendChild to circumvent an IE6 bug.
598
                        // This arises when a base node is used (#2709).
599
                        head.insertBefore( script, head.firstChild );
600
                        head.removeChild( script );
601
                }
602
        },
603

    
604
        nodeName: function( elem, name ) {
605
                return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
606
        },
607

    
608
        // args is for internal usage only
609
        each: function( object, callback, args ) {
610
                var name, i = 0,
611
                        length = object.length,
612
                        isObj = length === undefined || jQuery.isFunction(object);
613

    
614
                if ( args ) {
615
                        if ( isObj ) {
616
                                for ( name in object ) {
617
                                        if ( callback.apply( object[ name ], args ) === false ) {
618
                                                break;
619
                                        }
620
                                }
621
                        } else {
622
                                for ( ; i < length; ) {
623
                                        if ( callback.apply( object[ i++ ], args ) === false ) {
624
                                                break;
625
                                        }
626
                                }
627
                        }
628

    
629
                // A special, fast, case for the most common use of each
630
                } else {
631
                        if ( isObj ) {
632
                                for ( name in object ) {
633
                                        if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
634
                                                break;
635
                                        }
636
                                }
637
                        } else {
638
                                for ( var value = object[0];
639
                                        i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
640
                        }
641
                }
642

    
643
                return object;
644
        },
645

    
646
        // Use native String.trim function wherever possible
647
        trim: trim ?
648
                function( text ) {
649
                        return text == null ?
650
                                "" :
651
                                trim.call( text );
652
                } :
653

    
654
                // Otherwise use our own trimming functionality
655
                function( text ) {
656
                        return text == null ?
657
                                "" :
658
                                text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
659
                },
660

    
661
        // results is for internal usage only
662
        makeArray: function( array, results ) {
663
                var ret = results || [];
664

    
665
                if ( array != null ) {
666
                        // The window, strings (and functions) also have 'length'
667
                        // The extra typeof function check is to prevent crashes
668
                        // in Safari 2 (See: #3039)
669
                        // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
670
                        var type = jQuery.type(array);
671

    
672
                        if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
673
                                push.call( ret, array );
674
                        } else {
675
                                jQuery.merge( ret, array );
676
                        }
677
                }
678

    
679
                return ret;
680
        },
681

    
682
        inArray: function( elem, array ) {
683
                if ( array.indexOf ) {
684
                        return array.indexOf( elem );
685
                }
686

    
687
                for ( var i = 0, length = array.length; i < length; i++ ) {
688
                        if ( array[ i ] === elem ) {
689
                                return i;
690
                        }
691
                }
692

    
693
                return -1;
694
        },
695

    
696
        merge: function( first, second ) {
697
                var i = first.length,
698
                        j = 0;
699

    
700
                if ( typeof second.length === "number" ) {
701
                        for ( var l = second.length; j < l; j++ ) {
702
                                first[ i++ ] = second[ j ];
703
                        }
704

    
705
                } else {
706
                        while ( second[j] !== undefined ) {
707
                                first[ i++ ] = second[ j++ ];
708
                        }
709
                }
710

    
711
                first.length = i;
712

    
713
                return first;
714
        },
715

    
716
        grep: function( elems, callback, inv ) {
717
                var ret = [], retVal;
718
                inv = !!inv;
719

    
720
                // Go through the array, only saving the items
721
                // that pass the validator function
722
                for ( var i = 0, length = elems.length; i < length; i++ ) {
723
                        retVal = !!callback( elems[ i ], i );
724
                        if ( inv !== retVal ) {
725
                                ret.push( elems[ i ] );
726
                        }
727
                }
728

    
729
                return ret;
730
        },
731

    
732
        // arg is for internal usage only
733
        map: function( elems, callback, arg ) {
734
                var ret = [], value;
735

    
736
                // Go through the array, translating each of the items to their
737
                // new value (or values).
738
                for ( var i = 0, length = elems.length; i < length; i++ ) {
739
                        value = callback( elems[ i ], i, arg );
740

    
741
                        if ( value != null ) {
742
                                ret[ ret.length ] = value;
743
                        }
744
                }
745

    
746
                // Flatten any nested arrays
747
                return ret.concat.apply( [], ret );
748
        },
749

    
750
        // A global GUID counter for objects
751
        guid: 1,
752

    
753
        proxy: function( fn, proxy, thisObject ) {
754
                if ( arguments.length === 2 ) {
755
                        if ( typeof proxy === "string" ) {
756
                                thisObject = fn;
757
                                fn = thisObject[ proxy ];
758
                                proxy = undefined;
759

    
760
                        } else if ( proxy && !jQuery.isFunction( proxy ) ) {
761
                                thisObject = proxy;
762
                                proxy = undefined;
763
                        }
764
                }
765

    
766
                if ( !proxy && fn ) {
767
                        proxy = function() {
768
                                return fn.apply( thisObject || this, arguments );
769
                        };
770
                }
771

    
772
                // Set the guid of unique handler to the same of original handler, so it can be removed
773
                if ( fn ) {
774
                        proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
775
                }
776

    
777
                // So proxy can be declared as an argument
778
                return proxy;
779
        },
780

    
781
        // Mutifunctional method to get and set values to a collection
782
        // The value/s can be optionally by executed if its a function
783
        access: function( elems, key, value, exec, fn, pass ) {
784
                var length = elems.length;
785

    
786
                // Setting many attributes
787
                if ( typeof key === "object" ) {
788
                        for ( var k in key ) {
789
                                jQuery.access( elems, k, key[k], exec, fn, value );
790
                        }
791
                        return elems;
792
                }
793

    
794
                // Setting one attribute
795
                if ( value !== undefined ) {
796
                        // Optionally, function values get executed if exec is true
797
                        exec = !pass && exec && jQuery.isFunction(value);
798

    
799
                        for ( var i = 0; i < length; i++ ) {
800
                                fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
801
                        }
802

    
803
                        return elems;
804
                }
805

    
806
                // Getting an attribute
807
                return length ? fn( elems[0], key ) : undefined;
808
        },
809

    
810
        now: function() {
811
                return (new Date()).getTime();
812
        },
813

    
814
        // Create a simple deferred (one callbacks list)
815
        _Deferred: function() {
816
                var // callbacks list
817
                        callbacks = [],
818
                        // stored [ context , args ]
819
                        fired,
820
                        // to avoid firing when already doing so
821
                        firing,
822
                        // flag to know if the deferred has been cancelled
823
                        cancelled,
824
                        // the deferred itself
825
                        deferred  = {
826

    
827
                                // done( f1, f2, ...)
828
                                done: function() {
829
                                        if ( !cancelled ) {
830
                                                var args = arguments,
831
                                                        i,
832
                                                        length,
833
                                                        elem,
834
                                                        type,
835
                                                        _fired;
836
                                                if ( fired ) {
837
                                                        _fired = fired;
838
                                                        fired = 0;
839
                                                }
840
                                                for ( i = 0, length = args.length; i < length; i++ ) {
841
                                                        elem = args[ i ];
842
                                                        type = jQuery.type( elem );
843
                                                        if ( type === "array" ) {
844
                                                                deferred.done.apply( deferred, elem );
845
                                                        } else if ( type === "function" ) {
846
                                                                callbacks.push( elem );
847
                                                        }
848
                                                }
849
                                                if ( _fired ) {
850
                                                        deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
851
                                                }
852
                                        }
853
                                        return this;
854
                                },
855

    
856
                                // resolve with given context and args
857
                                resolveWith: function( context, args ) {
858
                                        if ( !cancelled && !fired && !firing ) {
859
                                                firing = 1;
860
                                                try {
861
                                                        while( callbacks[ 0 ] ) {
862
                                                                callbacks.shift().apply( context, args );
863
                                                        }
864
                                                }
865
                                                // We have to add a catch block for
866
                                                // IE prior to 8 or else the finally
867
                                                // block will never get executed
868
                                                catch (e) {
869
                                                        throw e;
870
                                                }
871
                                                finally {
872
                                                        fired = [ context, args ];
873
                                                        firing = 0;
874
                                                }
875
                                        }
876
                                        return this;
877
                                },
878

    
879
                                // resolve with this as context and given arguments
880
                                resolve: function() {
881
                                        deferred.resolveWith( jQuery.isFunction( this.promise ) ? this.promise() : this, arguments );
882
                                        return this;
883
                                },
884

    
885
                                // Has this deferred been resolved?
886
                                isResolved: function() {
887
                                        return !!( firing || fired );
888
                                },
889

    
890
                                // Cancel
891
                                cancel: function() {
892
                                        cancelled = 1;
893
                                        callbacks = [];
894
                                        return this;
895
                                }
896
                        };
897

    
898
                return deferred;
899
        },
900

    
901
        // Full fledged deferred (two callbacks list)
902
        Deferred: function( func ) {
903
                var deferred = jQuery._Deferred(),
904
                        failDeferred = jQuery._Deferred(),
905
                        promise;
906
                // Add errorDeferred methods, then and promise
907
                jQuery.extend( deferred, {
908
                        then: function( doneCallbacks, failCallbacks ) {
909
                                deferred.done( doneCallbacks ).fail( failCallbacks );
910
                                return this;
911
                        },
912
                        fail: failDeferred.done,
913
                        rejectWith: failDeferred.resolveWith,
914
                        reject: failDeferred.resolve,
915
                        isRejected: failDeferred.isResolved,
916
                        // Get a promise for this deferred
917
                        // If obj is provided, the promise aspect is added to the object
918
                        promise: function( obj ) {
919
                                if ( obj == null ) {
920
                                        if ( promise ) {
921
                                                return promise;
922
                                        }
923
                                        promise = obj = {};
924
                                }
925
                                var i = promiseMethods.length;
926
                                while( i-- ) {
927
                                        obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
928
                                }
929
                                return obj;
930
                        }
931
                } );
932
                // Make sure only one callback list will be used
933
                deferred.done( failDeferred.cancel ).fail( deferred.cancel );
934
                // Unexpose cancel
935
                delete deferred.cancel;
936
                // Call given func if any
937
                if ( func ) {
938
                        func.call( deferred, deferred );
939
                }
940
                return deferred;
941
        },
942

    
943
        // Deferred helper
944
        when: function( object ) {
945
                var lastIndex = arguments.length,
946
                        deferred = lastIndex <= 1 && object && jQuery.isFunction( object.promise ) ?
947
                                object :
948
                                jQuery.Deferred(),
949
                        promise = deferred.promise();
950

    
951
                if ( lastIndex > 1 ) {
952
                        var array = slice.call( arguments, 0 ),
953
                                count = lastIndex,
954
                                iCallback = function( index ) {
955
                                        return function( value ) {
956
                                                array[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value;
957
                                                if ( !( --count ) ) {
958
                                                        deferred.resolveWith( promise, array );
959
                                                }
960
                                        };
961
                                };
962
                        while( ( lastIndex-- ) ) {
963
                                object = array[ lastIndex ];
964
                                if ( object && jQuery.isFunction( object.promise ) ) {
965
                                        object.promise().then( iCallback(lastIndex), deferred.reject );
966
                                } else {
967
                                        --count;
968
                                }
969
                        }
970
                        if ( !count ) {
971
                                deferred.resolveWith( promise, array );
972
                        }
973
                } else if ( deferred !== object ) {
974
                        deferred.resolve( object );
975
                }
976
                return promise;
977
        },
978

    
979
        // Use of jQuery.browser is frowned upon.
980
        // More details: http://docs.jquery.com/Utilities/jQuery.browser
981
        uaMatch: function( ua ) {
982
                ua = ua.toLowerCase();
983

    
984
                var match = rwebkit.exec( ua ) ||
985
                        ropera.exec( ua ) ||
986
                        rmsie.exec( ua ) ||
987
                        ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
988
                        [];
989

    
990
                return { browser: match[1] || "", version: match[2] || "0" };
991
        },
992

    
993
        sub: function() {
994
                function jQuerySubclass( selector, context ) {
995
                        return new jQuerySubclass.fn.init( selector, context );
996
                }
997
                jQuery.extend( true, jQuerySubclass, this );
998
                jQuerySubclass.superclass = this;
999
                jQuerySubclass.fn = jQuerySubclass.prototype = this();
1000
                jQuerySubclass.fn.constructor = jQuerySubclass;
1001
                jQuerySubclass.subclass = this.subclass;
1002
                jQuerySubclass.fn.init = function init( selector, context ) {
1003
                        if ( context && context instanceof jQuery && !(context instanceof jQuerySubclass) ) {
1004
                                context = jQuerySubclass(context);
1005
                        }
1006

    
1007
                        return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass );
1008
                };
1009
                jQuerySubclass.fn.init.prototype = jQuerySubclass.fn;
1010
                var rootjQuerySubclass = jQuerySubclass(document);
1011
                return jQuerySubclass;
1012
        },
1013

    
1014
        browser: {}
1015
});
1016

    
1017
// Create readyList deferred
1018
readyList = jQuery._Deferred();
1019

    
1020
// Populate the class2type map
1021
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
1022
        class2type[ "[object " + name + "]" ] = name.toLowerCase();
1023
});
1024

    
1025
browserMatch = jQuery.uaMatch( userAgent );
1026
if ( browserMatch.browser ) {
1027
        jQuery.browser[ browserMatch.browser ] = true;
1028
        jQuery.browser.version = browserMatch.version;
1029
}
1030

    
1031
// Deprecated, use jQuery.browser.webkit instead
1032
if ( jQuery.browser.webkit ) {
1033
        jQuery.browser.safari = true;
1034
}
1035

    
1036
if ( indexOf ) {
1037
        jQuery.inArray = function( elem, array ) {
1038
                return indexOf.call( array, elem );
1039
        };
1040
}
1041

    
1042
// IE doesn't match non-breaking spaces with \s
1043
if ( rnotwhite.test( "\xA0" ) ) {
1044
        trimLeft = /^[\s\xA0]+/;
1045
        trimRight = /[\s\xA0]+$/;
1046
}
1047

    
1048
// All jQuery objects should point back to these
1049
rootjQuery = jQuery(document);
1050

    
1051
// Cleanup functions for the document ready method
1052
if ( document.addEventListener ) {
1053
        DOMContentLoaded = function() {
1054
                document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
1055
                jQuery.ready();
1056
        };
1057

    
1058
} else if ( document.attachEvent ) {
1059
        DOMContentLoaded = function() {
1060
                // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
1061
                if ( document.readyState === "complete" ) {
1062
                        document.detachEvent( "onreadystatechange", DOMContentLoaded );
1063
                        jQuery.ready();
1064
                }
1065
        };
1066
}
1067

    
1068
// The DOM ready check for Internet Explorer
1069
function doScrollCheck() {
1070
        if ( jQuery.isReady ) {
1071
                return;
1072
        }
1073

    
1074
        try {
1075
                // If IE is used, use the trick by Diego Perini
1076
                // http://javascript.nwbox.com/IEContentLoaded/
1077
                document.documentElement.doScroll("left");
1078
        } catch(e) {
1079
                setTimeout( doScrollCheck, 1 );
1080
                return;
1081
        }
1082

    
1083
        // and execute any waiting functions
1084
        jQuery.ready();
1085
}
1086

    
1087
// Expose jQuery to the global object
1088
return jQuery;
1089

    
1090
})();
1091

    
1092

    
1093
(function() {
1094

    
1095
        jQuery.support = {};
1096

    
1097
        var div = document.createElement("div");
1098

    
1099
        div.style.display = "none";
1100
        div.innerHTML = "   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
1101

    
1102
        var all = div.getElementsByTagName("*"),
1103
                a = div.getElementsByTagName("a")[0],
1104
                select = document.createElement("select"),
1105
                opt = select.appendChild( document.createElement("option") ),
1106
                input = div.getElementsByTagName("input")[0];
1107

    
1108
        // Can't get basic test support
1109
        if ( !all || !all.length || !a ) {
1110
                return;
1111
        }
1112

    
1113
        jQuery.support = {
1114
                // IE strips leading whitespace when .innerHTML is used
1115
                leadingWhitespace: div.firstChild.nodeType === 3,
1116

    
1117
                // Make sure that tbody elements aren't automatically inserted
1118
                // IE will insert them into empty tables
1119
                tbody: !div.getElementsByTagName("tbody").length,
1120

    
1121
                // Make sure that link elements get serialized correctly by innerHTML
1122
                // This requires a wrapper element in IE
1123
                htmlSerialize: !!div.getElementsByTagName("link").length,
1124

    
1125
                // Get the style information from getAttribute
1126
                // (IE uses .cssText insted)
1127
                style: /red/.test( a.getAttribute("style") ),
1128

    
1129
                // Make sure that URLs aren't manipulated
1130
                // (IE normalizes it by default)
1131
                hrefNormalized: a.getAttribute("href") === "/a",
1132

    
1133
                // Make sure that element opacity exists
1134
                // (IE uses filter instead)
1135
                // Use a regex to work around a WebKit issue. See #5145
1136
                opacity: /^0.55$/.test( a.style.opacity ),
1137

    
1138
                // Verify style float existence
1139
                // (IE uses styleFloat instead of cssFloat)
1140
                cssFloat: !!a.style.cssFloat,
1141

    
1142
                // Make sure that if no value is specified for a checkbox
1143
                // that it defaults to "on".
1144
                // (WebKit defaults to "" instead)
1145
                checkOn: input.value === "on",
1146

    
1147
                // Make sure that a selected-by-default option has a working selected property.
1148
                // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
1149
                optSelected: opt.selected,
1150

    
1151
                // Will be defined later
1152
                deleteExpando: true,
1153
                optDisabled: false,
1154
                checkClone: false,
1155
                noCloneEvent: true,
1156
                noCloneChecked: true,
1157
                boxModel: null,
1158
                inlineBlockNeedsLayout: false,
1159
                shrinkWrapBlocks: false,
1160
                reliableHiddenOffsets: true
1161
        };
1162

    
1163
        input.checked = true;
1164
        jQuery.support.noCloneChecked = input.cloneNode( true ).checked;
1165

    
1166
        // Make sure that the options inside disabled selects aren't marked as disabled
1167
        // (WebKit marks them as diabled)
1168
        select.disabled = true;
1169
        jQuery.support.optDisabled = !opt.disabled;
1170

    
1171
        var _scriptEval = null;
1172
        jQuery.support.scriptEval = function() {
1173
                if ( _scriptEval === null ) {
1174
                        var root = document.documentElement,
1175
                                script = document.createElement("script"),
1176
                                id = "script" + jQuery.now();
1177

    
1178
                        try {
1179
                                script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
1180
                        } catch(e) {}
1181

    
1182
                        root.insertBefore( script, root.firstChild );
1183

    
1184
                        // Make sure that the execution of code works by injecting a script
1185
                        // tag with appendChild/createTextNode
1186
                        // (IE doesn't support this, fails, and uses .text instead)
1187
                        if ( window[ id ] ) {
1188
                                _scriptEval = true;
1189
                                delete window[ id ];
1190
                        } else {
1191
                                _scriptEval = false;
1192
                        }
1193

    
1194
                        root.removeChild( script );
1195
                        // release memory in IE
1196
                        root = script = id  = null;
1197
                }
1198

    
1199
                return _scriptEval;
1200
        };
1201

    
1202
        // Test to see if it's possible to delete an expando from an element
1203
        // Fails in Internet Explorer
1204
        try {
1205
                delete div.test;
1206

    
1207
        } catch(e) {
1208
                jQuery.support.deleteExpando = false;
1209
        }
1210

    
1211
        if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
1212
                div.attachEvent("onclick", function click() {
1213
                        // Cloning a node shouldn't copy over any
1214
                        // bound event handlers (IE does this)
1215
                        jQuery.support.noCloneEvent = false;
1216
                        div.detachEvent("onclick", click);
1217
                });
1218
                div.cloneNode(true).fireEvent("onclick");
1219
        }
1220

    
1221
        div = document.createElement("div");
1222
        div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
1223

    
1224
        var fragment = document.createDocumentFragment();
1225
        fragment.appendChild( div.firstChild );
1226

    
1227
        // WebKit doesn't clone checked state correctly in fragments
1228
        jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
1229

    
1230
        // Figure out if the W3C box model works as expected
1231
        // document.body must exist before we can do this
1232
        jQuery(function() {
1233
                var div = document.createElement("div"),
1234
                        body = document.getElementsByTagName("body")[0];
1235

    
1236
                // Frameset documents with no body should not run this code
1237
                if ( !body ) {
1238
                        return;
1239
                }
1240

    
1241
                div.style.width = div.style.paddingLeft = "1px";
1242
                body.appendChild( div );
1243
                jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
1244

    
1245
                if ( "zoom" in div.style ) {
1246
                        // Check if natively block-level elements act like inline-block
1247
                        // elements when setting their display to 'inline' and giving
1248
                        // them layout
1249
                        // (IE < 8 does this)
1250
                        div.style.display = "inline";
1251
                        div.style.zoom = 1;
1252
                        jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2;
1253

    
1254
                        // Check if elements with layout shrink-wrap their children
1255
                        // (IE 6 does this)
1256
                        div.style.display = "";
1257
                        div.innerHTML = "<div style='width:4px;'></div>";
1258
                        jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2;
1259
                }
1260

    
1261
                div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
1262
                var tds = div.getElementsByTagName("td");
1263

    
1264
                // Check if table cells still have offsetWidth/Height when they are set
1265
                // to display:none and there are still other visible table cells in a
1266
                // table row; if so, offsetWidth/Height are not reliable for use when
1267
                // determining if an element has been hidden directly using
1268
                // display:none (it is still safe to use offsets if a parent element is
1269
                // hidden; don safety goggles and see bug #4512 for more information).
1270
                // (only IE 8 fails this test)
1271
                jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0;
1272

    
1273
                tds[0].style.display = "";
1274
                tds[1].style.display = "none";
1275

    
1276
                // Check if empty table cells still have offsetWidth/Height
1277
                // (IE < 8 fail this test)
1278
                jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0;
1279
                div.innerHTML = "";
1280

    
1281
                body.removeChild( div ).style.display = "none";
1282
                div = tds = null;
1283
        });
1284

    
1285
        // Technique from Juriy Zaytsev
1286
        // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
1287
        var eventSupported = function( eventName ) {
1288
                var el = document.createElement("div");
1289
                eventName = "on" + eventName;
1290

    
1291
                // We only care about the case where non-standard event systems
1292
                // are used, namely in IE. Short-circuiting here helps us to
1293
                // avoid an eval call (in setAttribute) which can cause CSP
1294
                // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
1295
                if ( !el.attachEvent ) {
1296
                        return true;
1297
                }
1298

    
1299
                var isSupported = (eventName in el);
1300
                if ( !isSupported ) {
1301
                        el.setAttribute(eventName, "return;");
1302
                        isSupported = typeof el[eventName] === "function";
1303
                }
1304
                el = null;
1305

    
1306
                return isSupported;
1307
        };
1308

    
1309
        jQuery.support.submitBubbles = eventSupported("submit");
1310
        jQuery.support.changeBubbles = eventSupported("change");
1311

    
1312
        // release memory in IE
1313
        div = all = a = null;
1314
})();
1315

    
1316

    
1317

    
1318
var rbrace = /^(?:\{.*\}|\[.*\])$/;
1319

    
1320
jQuery.extend({
1321
        cache: {},
1322

    
1323
        // Please use with caution
1324
        uuid: 0,
1325

    
1326
        // Unique for each copy of jQuery on the page
1327
        // Non-digits removed to match rinlinejQuery
1328
        expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
1329

    
1330
        // The following elements throw uncatchable exceptions if you
1331
        // attempt to add expando properties to them.
1332
        noData: {
1333
                "embed": true,
1334
                // Ban all objects except for Flash (which handle expandos)
1335
                "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
1336
                "applet": true
1337
        },
1338

    
1339
        hasData: function( elem ) {
1340
                elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
1341

    
1342
                return !!elem && !isEmptyDataObject( elem );
1343
        },
1344

    
1345
        data: function( elem, name, data, pvt /* Internal Use Only */ ) {
1346
                if ( !jQuery.acceptData( elem ) ) {
1347
                        return;
1348
                }
1349

    
1350
                var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache,
1351

    
1352
                        // We have to handle DOM nodes and JS objects differently because IE6-7
1353
                        // can't GC object references properly across the DOM-JS boundary
1354
                        isNode = elem.nodeType,
1355

    
1356
                        // Only DOM nodes need the global jQuery cache; JS object data is
1357
                        // attached directly to the object so GC can occur automatically
1358
                        cache = isNode ? jQuery.cache : elem,
1359

    
1360
                        // Only defining an ID for JS objects if its cache already exists allows
1361
                        // the code to shortcut on the same path as a DOM node with no cache
1362
                        id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
1363

    
1364
                // Avoid doing any more work than we need to when trying to get data on an
1365
                // object that has no data at all
1366
                if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) {
1367
                        return;
1368
                }
1369

    
1370
                if ( !id ) {
1371
                        // Only DOM nodes need a new unique ID for each element since their data
1372
                        // ends up in the global cache
1373
                        if ( isNode ) {
1374
                                elem[ jQuery.expando ] = id = ++jQuery.uuid;
1375
                        } else {
1376
                                id = jQuery.expando;
1377
                        }
1378
                }
1379

    
1380
                if ( !cache[ id ] ) {
1381
                        cache[ id ] = {};
1382

    
1383
                        // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
1384
                        // metadata on plain JS objects when the object is serialized using
1385
                        // JSON.stringify
1386
                        if ( !isNode ) {
1387
                                cache[ id ].toJSON = jQuery.noop;
1388
                        }
1389
                }
1390

    
1391
                // An object can be passed to jQuery.data instead of a key/value pair; this gets
1392
                // shallow copied over onto the existing cache
1393
                if ( typeof name === "object" || typeof name === "function" ) {
1394
                        if ( pvt ) {
1395
                                cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
1396
                        } else {
1397
                                cache[ id ] = jQuery.extend(cache[ id ], name);
1398
                        }
1399
                }
1400

    
1401
                thisCache = cache[ id ];
1402

    
1403
                // Internal jQuery data is stored in a separate object inside the object's data
1404
                // cache in order to avoid key collisions between internal data and user-defined
1405
                // data
1406
                if ( pvt ) {
1407
                        if ( !thisCache[ internalKey ] ) {
1408
                                thisCache[ internalKey ] = {};
1409
                        }
1410

    
1411
                        thisCache = thisCache[ internalKey ];
1412
                }
1413

    
1414
                if ( data !== undefined ) {
1415
                        thisCache[ name ] = data;
1416
                }
1417

    
1418
                // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
1419
                // not attempt to inspect the internal events object using jQuery.data, as this
1420
                // internal data object is undocumented and subject to change.
1421
                if ( name === "events" && !thisCache[name] ) {
1422
                        return thisCache[ internalKey ] && thisCache[ internalKey ].events;
1423
                }
1424

    
1425
                return getByName ? thisCache[ name ] : thisCache;
1426
        },
1427

    
1428
        removeData: function( elem, name, pvt /* Internal Use Only */ ) {
1429
                if ( !jQuery.acceptData( elem ) ) {
1430
                        return;
1431
                }
1432

    
1433
                var internalKey = jQuery.expando, isNode = elem.nodeType,
1434

    
1435
                        // See jQuery.data for more information
1436
                        cache = isNode ? jQuery.cache : elem,
1437

    
1438
                        // See jQuery.data for more information
1439
                        id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
1440

    
1441
                // If there is already no cache entry for this object, there is no
1442
                // purpose in continuing
1443
                if ( !cache[ id ] ) {
1444
                        return;
1445
                }
1446

    
1447
                if ( name ) {
1448
                        var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
1449

    
1450
                        if ( thisCache ) {
1451
                                delete thisCache[ name ];
1452

    
1453
                                // If there is no data left in the cache, we want to continue
1454
                                // and let the cache object itself get destroyed
1455
                                if ( !isEmptyDataObject(thisCache) ) {
1456
                                        return;
1457
                                }
1458
                        }
1459
                }
1460

    
1461
                // See jQuery.data for more information
1462
                if ( pvt ) {
1463
                        delete cache[ id ][ internalKey ];
1464

    
1465
                        // Don't destroy the parent cache unless the internal data object
1466
                        // had been the only thing left in it
1467
                        if ( !isEmptyDataObject(cache[ id ]) ) {
1468
                                return;
1469
                        }
1470
                }
1471

    
1472
                var internalCache = cache[ id ][ internalKey ];
1473

    
1474
                // Browsers that fail expando deletion also refuse to delete expandos on
1475
                // the window, but it will allow it on all other JS objects; other browsers
1476
                // don't care
1477
                if ( jQuery.support.deleteExpando || cache != window ) {
1478
                        delete cache[ id ];
1479
                } else {
1480
                        cache[ id ] = null;
1481
                }
1482

    
1483
                // We destroyed the entire user cache at once because it's faster than
1484
                // iterating through each key, but we need to continue to persist internal
1485
                // data if it existed
1486
                if ( internalCache ) {
1487
                        cache[ id ] = {};
1488
                        // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
1489
                        // metadata on plain JS objects when the object is serialized using
1490
                        // JSON.stringify
1491
                        if ( !isNode ) {
1492
                                cache[ id ].toJSON = jQuery.noop;
1493
                        }
1494

    
1495
                        cache[ id ][ internalKey ] = internalCache;
1496

    
1497
                // Otherwise, we need to eliminate the expando on the node to avoid
1498
                // false lookups in the cache for entries that no longer exist
1499
                } else if ( isNode ) {
1500
                        // IE does not allow us to delete expando properties from nodes,
1501
                        // nor does it have a removeAttribute function on Document nodes;
1502
                        // we must handle all of these cases
1503
                        if ( jQuery.support.deleteExpando ) {
1504
                                delete elem[ jQuery.expando ];
1505
                        } else if ( elem.removeAttribute ) {
1506
                                elem.removeAttribute( jQuery.expando );
1507
                        } else {
1508
                                elem[ jQuery.expando ] = null;
1509
                        }
1510
                }
1511
        },
1512

    
1513
        // For internal use only.
1514
        _data: function( elem, name, data ) {
1515
                return jQuery.data( elem, name, data, true );
1516
        },
1517

    
1518
        // A method for determining if a DOM node can handle the data expando
1519
        acceptData: function( elem ) {
1520
                if ( elem.nodeName ) {
1521
                        var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
1522

    
1523
                        if ( match ) {
1524
                                return !(match === true || elem.getAttribute("classid") !== match);
1525
                        }
1526
                }
1527

    
1528
                return true;
1529
        }
1530
});
1531

    
1532
jQuery.fn.extend({
1533
        data: function( key, value ) {
1534
                var data = null;
1535

    
1536
                if ( typeof key === "undefined" ) {
1537
                        if ( this.length ) {
1538
                                data = jQuery.data( this[0] );
1539

    
1540
                                if ( this[0].nodeType === 1 ) {
1541
                                        var attr = this[0].attributes, name;
1542
                                        for ( var i = 0, l = attr.length; i < l; i++ ) {
1543
                                                name = attr[i].name;
1544

    
1545
                                                if ( name.indexOf( "data-" ) === 0 ) {
1546
                                                        name = name.substr( 5 );
1547
                                                        dataAttr( this[0], name, data[ name ] );
1548
                                                }
1549
                                        }
1550
                                }
1551
                        }
1552

    
1553
                        return data;
1554

    
1555
                } else if ( typeof key === "object" ) {
1556
                        return this.each(function() {
1557
                                jQuery.data( this, key );
1558
                        });
1559
                }
1560

    
1561
                var parts = key.split(".");
1562
                parts[1] = parts[1] ? "." + parts[1] : "";
1563

    
1564
                if ( value === undefined ) {
1565
                        data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1566

    
1567
                        // Try to fetch any internally stored data first
1568
                        if ( data === undefined && this.length ) {
1569
                                data = jQuery.data( this[0], key );
1570
                                data = dataAttr( this[0], key, data );
1571
                        }
1572

    
1573
                        return data === undefined && parts[1] ?
1574
                                this.data( parts[0] ) :
1575
                                data;
1576

    
1577
                } else {
1578
                        return this.each(function() {
1579
                                var $this = jQuery( this ),
1580
                                        args = [ parts[0], value ];
1581

    
1582
                                $this.triggerHandler( "setData" + parts[1] + "!", args );
1583
                                jQuery.data( this, key, value );
1584
                                $this.triggerHandler( "changeData" + parts[1] + "!", args );
1585
                        });
1586
                }
1587
        },
1588

    
1589
        removeData: function( key ) {
1590
                return this.each(function() {
1591
                        jQuery.removeData( this, key );
1592
                });
1593
        }
1594
});
1595

    
1596
function dataAttr( elem, key, data ) {
1597
        // If nothing was found internally, try to fetch any
1598
        // data from the HTML5 data-* attribute
1599
        if ( data === undefined && elem.nodeType === 1 ) {
1600
                data = elem.getAttribute( "data-" + key );
1601

    
1602
                if ( typeof data === "string" ) {
1603
                        try {
1604
                                data = data === "true" ? true :
1605
                                data === "false" ? false :
1606
                                data === "null" ? null :
1607
                                !jQuery.isNaN( data ) ? parseFloat( data ) :
1608
                                        rbrace.test( data ) ? jQuery.parseJSON( data ) :
1609
                                        data;
1610
                        } catch( e ) {}
1611

    
1612
                        // Make sure we set the data so it isn't changed later
1613
                        jQuery.data( elem, key, data );
1614

    
1615
                } else {
1616
                        data = undefined;
1617
                }
1618
        }
1619

    
1620
        return data;
1621
}
1622

    
1623
// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
1624
// property to be considered empty objects; this property always exists in
1625
// order to make sure JSON.stringify does not expose internal metadata
1626
function isEmptyDataObject( obj ) {
1627
        for ( var name in obj ) {
1628
                if ( name !== "toJSON" ) {
1629
                        return false;
1630
                }
1631
        }
1632

    
1633
        return true;
1634
}
1635

    
1636

    
1637

    
1638

    
1639
jQuery.extend({
1640
        queue: function( elem, type, data ) {
1641
                if ( !elem ) {
1642
                        return;
1643
                }
1644

    
1645
                type = (type || "fx") + "queue";
1646
                var q = jQuery._data( elem, type );
1647

    
1648
                // Speed up dequeue by getting out quickly if this is just a lookup
1649
                if ( !data ) {
1650
                        return q || [];
1651
                }
1652

    
1653
                if ( !q || jQuery.isArray(data) ) {
1654
                        q = jQuery._data( elem, type, jQuery.makeArray(data) );
1655

    
1656
                } else {
1657
                        q.push( data );
1658
                }
1659

    
1660
                return q;
1661
        },
1662

    
1663
        dequeue: function( elem, type ) {
1664
                type = type || "fx";
1665

    
1666
                var queue = jQuery.queue( elem, type ),
1667
                        fn = queue.shift();
1668

    
1669
                // If the fx queue is dequeued, always remove the progress sentinel
1670
                if ( fn === "inprogress" ) {
1671
                        fn = queue.shift();
1672
                }
1673

    
1674
                if ( fn ) {
1675
                        // Add a progress sentinel to prevent the fx queue from being
1676
                        // automatically dequeued
1677
                        if ( type === "fx" ) {
1678
                                queue.unshift("inprogress");
1679
                        }
1680

    
1681
                        fn.call(elem, function() {
1682
                                jQuery.dequeue(elem, type);
1683
                        });
1684
                }
1685

    
1686
                if ( !queue.length ) {
1687
                        jQuery.removeData( elem, type + "queue", true );
1688
                }
1689
        }
1690
});
1691

    
1692
jQuery.fn.extend({
1693
        queue: function( type, data ) {
1694
                if ( typeof type !== "string" ) {
1695
                        data = type;
1696
                        type = "fx";
1697
                }
1698

    
1699
                if ( data === undefined ) {
1700
                        return jQuery.queue( this[0], type );
1701
                }
1702
                return this.each(function( i ) {
1703
                        var queue = jQuery.queue( this, type, data );
1704

    
1705
                        if ( type === "fx" && queue[0] !== "inprogress" ) {
1706
                                jQuery.dequeue( this, type );
1707
                        }
1708
                });
1709
        },
1710
        dequeue: function( type ) {
1711
                return this.each(function() {
1712
                        jQuery.dequeue( this, type );
1713
                });
1714
        },
1715

    
1716
        // Based off of the plugin by Clint Helfers, with permission.
1717
        // http://blindsignals.com/index.php/2009/07/jquery-delay/
1718
        delay: function( time, type ) {
1719
                time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
1720
                type = type || "fx";
1721

    
1722
                return this.queue( type, function() {
1723
                        var elem = this;
1724
                        setTimeout(function() {
1725
                                jQuery.dequeue( elem, type );
1726
                        }, time );
1727
                });
1728
        },
1729

    
1730
        clearQueue: function( type ) {
1731
                return this.queue( type || "fx", [] );
1732
        }
1733
});
1734

    
1735

    
1736

    
1737

    
1738
var rclass = /[\n\t\r]/g,
1739
        rspaces = /\s+/,
1740
        rreturn = /\r/g,
1741
        rspecialurl = /^(?:href|src|style)$/,
1742
        rtype = /^(?:button|input)$/i,
1743
        rfocusable = /^(?:button|input|object|select|textarea)$/i,
1744
        rclickable = /^a(?:rea)?$/i,
1745
        rradiocheck = /^(?:radio|checkbox)$/i;
1746

    
1747
jQuery.props = {
1748
        "for": "htmlFor",
1749
        "class": "className",
1750
        readonly: "readOnly",
1751
        maxlength: "maxLength",
1752
        cellspacing: "cellSpacing",
1753
        rowspan: "rowSpan",
1754
        colspan: "colSpan",
1755
        tabindex: "tabIndex",
1756
        usemap: "useMap",
1757
        frameborder: "frameBorder"
1758
};
1759

    
1760
jQuery.fn.extend({
1761
        attr: function( name, value ) {
1762
                return jQuery.access( this, name, value, true, jQuery.attr );
1763
        },
1764

    
1765
        removeAttr: function( name, fn ) {
1766
                return this.each(function(){
1767
                        jQuery.attr( this, name, "" );
1768
                        if ( this.nodeType === 1 ) {
1769
                                this.removeAttribute( name );
1770
                        }
1771
                });
1772
        },
1773

    
1774
        addClass: function( value ) {
1775
                if ( jQuery.isFunction(value) ) {
1776
                        return this.each(function(i) {
1777
                                var self = jQuery(this);
1778
                                self.addClass( value.call(this, i, self.attr("class")) );
1779
                        });
1780
                }
1781

    
1782
                if ( value && typeof value === "string" ) {
1783
                        var classNames = (value || "").split( rspaces );
1784

    
1785
                        for ( var i = 0, l = this.length; i < l; i++ ) {
1786
                                var elem = this[i];
1787

    
1788
                                if ( elem.nodeType === 1 ) {
1789
                                        if ( !elem.className ) {
1790
                                                elem.className = value;
1791

    
1792
                                        } else {
1793
                                                var className = " " + elem.className + " ",
1794
                                                        setClass = elem.className;
1795

    
1796
                                                for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
1797
                                                        if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
1798
                                                                setClass += " " + classNames[c];
1799
                                                        }
1800
                                                }
1801
                                                elem.className = jQuery.trim( setClass );
1802
                                        }
1803
                                }
1804
                        }
1805
                }
1806

    
1807
                return this;
1808
        },
1809

    
1810
        removeClass: function( value ) {
1811
                if ( jQuery.isFunction(value) ) {
1812
                        return this.each(function(i) {
1813
                                var self = jQuery(this);
1814
                                self.removeClass( value.call(this, i, self.attr("class")) );
1815
                        });
1816
                }
1817

    
1818
                if ( (value && typeof value === "string") || value === undefined ) {
1819
                        var classNames = (value || "").split( rspaces );
1820

    
1821
                        for ( var i = 0, l = this.length; i < l; i++ ) {
1822
                                var elem = this[i];
1823

    
1824
                                if ( elem.nodeType === 1 && elem.className ) {
1825
                                        if ( value ) {
1826
                                                var className = (" " + elem.className + " ").replace(rclass, " ");
1827
                                                for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
1828
                                                        className = className.replace(" " + classNames[c] + " ", " ");
1829
                                                }
1830
                                                elem.className = jQuery.trim( className );
1831

    
1832
                                        } else {
1833
                                                elem.className = "";
1834
                                        }
1835
                                }
1836
                        }
1837
                }
1838

    
1839
                return this;
1840
        },
1841

    
1842
        toggleClass: function( value, stateVal ) {
1843
                var type = typeof value,
1844
                        isBool = typeof stateVal === "boolean";
1845

    
1846
                if ( jQuery.isFunction( value ) ) {
1847
                        return this.each(function(i) {
1848
                                var self = jQuery(this);
1849
                                self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
1850
                        });
1851
                }
1852

    
1853
                return this.each(function() {
1854
                        if ( type === "string" ) {
1855
                                // toggle individual class names
1856
                                var className,
1857
                                        i = 0,
1858
                                        self = jQuery( this ),
1859
                                        state = stateVal,
1860
                                        classNames = value.split( rspaces );
1861

    
1862
                                while ( (className = classNames[ i++ ]) ) {
1863
                                        // check each className given, space seperated list
1864
                                        state = isBool ? state : !self.hasClass( className );
1865
                                        self[ state ? "addClass" : "removeClass" ]( className );
1866
                                }
1867

    
1868
                        } else if ( type === "undefined" || type === "boolean" ) {
1869
                                if ( this.className ) {
1870
                                        // store className if set
1871
                                        jQuery._data( this, "__className__", this.className );
1872
                                }
1873

    
1874
                                // toggle whole className
1875
                                this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
1876
                        }
1877
                });
1878
        },
1879

    
1880
        hasClass: function( selector ) {
1881
                var className = " " + selector + " ";
1882
                for ( var i = 0, l = this.length; i < l; i++ ) {
1883
                        if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
1884
                                return true;
1885
                        }
1886
                }
1887

    
1888
                return false;
1889
        },
1890

    
1891
        val: function( value ) {
1892
                if ( !arguments.length ) {
1893
                        var elem = this[0];
1894

    
1895
                        if ( elem ) {
1896
                                if ( jQuery.nodeName( elem, "option" ) ) {
1897
                                        // attributes.value is undefined in Blackberry 4.7 but
1898
                                        // uses .value. See #6932
1899
                                        var val = elem.attributes.value;
1900
                                        return !val || val.specified ? elem.value : elem.text;
1901
                                }
1902

    
1903
                                // We need to handle select boxes special
1904
                                if ( jQuery.nodeName( elem, "select" ) ) {
1905
                                        var index = elem.selectedIndex,
1906
                                                values = [],
1907
                                                options = elem.options,
1908
                                                one = elem.type === "select-one";
1909

    
1910
                                        // Nothing was selected
1911
                                        if ( index < 0 ) {
1912
                                                return null;
1913
                                        }
1914

    
1915
                                        // Loop through all the selected options
1916
                                        for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
1917
                                                var option = options[ i ];
1918

    
1919
                                                // Don't return options that are disabled or in a disabled optgroup
1920
                                                if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
1921
                                                                (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
1922

    
1923
                                                        // Get the specific value for the option
1924
                                                        value = jQuery(option).val();
1925

    
1926
                                                        // We don't need an array for one selects
1927
                                                        if ( one ) {
1928
                                                                return value;
1929
                                                        }
1930

    
1931
                                                        // Multi-Selects return an array
1932
                                                        values.push( value );
1933
                                                }
1934
                                        }
1935

    
1936
                                        // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
1937
                                        if ( one && !values.length && options.length ) {
1938
                                                return jQuery( options[ index ] ).val();
1939
                                        }
1940

    
1941
                                        return values;
1942
                                }
1943

    
1944
                                // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
1945
                                if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
1946
                                        return elem.getAttribute("value") === null ? "on" : elem.value;
1947
                                }
1948

    
1949
                                // Everything else, we just grab the value
1950
                                return (elem.value || "").replace(rreturn, "");
1951

    
1952
                        }
1953

    
1954
                        return undefined;
1955
                }
1956

    
1957
                var isFunction = jQuery.isFunction(value);
1958

    
1959
                return this.each(function(i) {
1960
                        var self = jQuery(this), val = value;
1961

    
1962
                        if ( this.nodeType !== 1 ) {
1963
                                return;
1964
                        }
1965

    
1966
                        if ( isFunction ) {
1967
                                val = value.call(this, i, self.val());
1968
                        }
1969

    
1970
                        // Treat null/undefined as ""; convert numbers to string
1971
                        if ( val == null ) {
1972
                                val = "";
1973
                        } else if ( typeof val === "number" ) {
1974
                                val += "";
1975
                        } else if ( jQuery.isArray(val) ) {
1976
                                val = jQuery.map(val, function (value) {
1977
                                        return value == null ? "" : value + "";
1978
                                });
1979
                        }
1980

    
1981
                        if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
1982
                                this.checked = jQuery.inArray( self.val(), val ) >= 0;
1983

    
1984
                        } else if ( jQuery.nodeName( this, "select" ) ) {
1985
                                var values = jQuery.makeArray(val);
1986

    
1987
                                jQuery( "option", this ).each(function() {
1988
                                        this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
1989
                                });
1990

    
1991
                                if ( !values.length ) {
1992
                                        this.selectedIndex = -1;
1993
                                }
1994

    
1995
                        } else {
1996
                                this.value = val;
1997
                        }
1998
                });
1999
        }
2000
});
2001

    
2002
jQuery.extend({
2003
        attrFn: {
2004
                val: true,
2005
                css: true,
2006
                html: true,
2007
                text: true,
2008
                data: true,
2009
                width: true,
2010
                height: true,
2011
                offset: true
2012
        },
2013

    
2014
        attr: function( elem, name, value, pass ) {
2015
                // don't get/set attributes on text, comment and attribute nodes
2016
                if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || elem.nodeType === 2 ) {
2017
                        return undefined;
2018
                }
2019

    
2020
                if ( pass && name in jQuery.attrFn ) {
2021
                        return jQuery(elem)[name](value);
2022
                }
2023

    
2024
                var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
2025
                        // Whether we are setting (or getting)
2026
                        set = value !== undefined;
2027

    
2028
                // Try to normalize/fix the name
2029
                name = notxml && jQuery.props[ name ] || name;
2030

    
2031
                // Only do all the following if this is a node (faster for style)
2032
                if ( elem.nodeType === 1 ) {
2033
                        // These attributes require special treatment
2034
                        var special = rspecialurl.test( name );
2035

    
2036
                        // Safari mis-reports the default selected property of an option
2037
                        // Accessing the parent's selectedIndex property fixes it
2038
                        if ( name === "selected" && !jQuery.support.optSelected ) {
2039
                                var parent = elem.parentNode;
2040
                                if ( parent ) {
2041
                                        parent.selectedIndex;
2042

    
2043
                                        // Make sure that it also works with optgroups, see #5701
2044
                                        if ( parent.parentNode ) {
2045
                                                parent.parentNode.selectedIndex;
2046
                                        }
2047
                                }
2048
                        }
2049

    
2050
                        // If applicable, access the attribute via the DOM 0 way
2051
                        // 'in' checks fail in Blackberry 4.7 #6931
2052
                        if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) {
2053
                                if ( set ) {
2054
                                        // We can't allow the type property to be changed (since it causes problems in IE)
2055
                                        if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
2056
                                                jQuery.error( "type property can't be changed" );
2057
                                        }
2058

    
2059
                                        if ( value === null ) {
2060
                                                if ( elem.nodeType === 1 ) {
2061
                                                        elem.removeAttribute( name );
2062
                                                }
2063

    
2064
                                        } else {
2065
                                                elem[ name ] = value;
2066
                                        }
2067
                                }
2068

    
2069
                                // browsers index elements by id/name on forms, give priority to attributes.
2070
                                if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
2071
                                        return elem.getAttributeNode( name ).nodeValue;
2072
                                }
2073

    
2074
                                // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
2075
                                // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
2076
                                if ( name === "tabIndex" ) {
2077
                                        var attributeNode = elem.getAttributeNode( "tabIndex" );
2078

    
2079
                                        return attributeNode && attributeNode.specified ?
2080
                                                attributeNode.value :
2081
                                                rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
2082
                                                        0 :
2083
                                                        undefined;
2084
                                }
2085

    
2086
                                return elem[ name ];
2087
                        }
2088

    
2089
                        if ( !jQuery.support.style && notxml && name === "style" ) {
2090
                                if ( set ) {
2091
                                        elem.style.cssText = "" + value;
2092
                                }
2093

    
2094
                                return elem.style.cssText;
2095
                        }
2096

    
2097
                        if ( set ) {
2098
                                // convert the value to a string (all browsers do this but IE) see #1070
2099
                                elem.setAttribute( name, "" + value );
2100
                        }
2101

    
2102
                        // Ensure that missing attributes return undefined
2103
                        // Blackberry 4.7 returns "" from getAttribute #6938
2104
                        if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) {
2105
                                return undefined;
2106
                        }
2107

    
2108
                        var attr = !jQuery.support.hrefNormalized && notxml && special ?
2109
                                        // Some attributes require a special call on IE
2110
                                        elem.getAttribute( name, 2 ) :
2111
                                        elem.getAttribute( name );
2112

    
2113
                        // Non-existent attributes return null, we normalize to undefined
2114
                        return attr === null ? undefined : attr;
2115
                }
2116
                // Handle everything which isn't a DOM element node
2117
                if ( set ) {
2118
                        elem[ name ] = value;
2119
                }
2120
                return elem[ name ];
2121
        }
2122
});
2123

    
2124

    
2125

    
2126

    
2127
var rnamespaces = /\.(.*)$/,
2128
        rformElems = /^(?:textarea|input|select)$/i,
2129
        rperiod = /\./g,
2130
        rspace = / /g,
2131
        rescape = /[^\w\s.|`]/g,
2132
        fcleanup = function( nm ) {
2133
                return nm.replace(rescape, "\\$&");
2134
        };
2135

    
2136
/*
2137
 * A number of helper functions used for managing events.
2138
 * Many of the ideas behind this code originated from
2139
 * Dean Edwards' addEvent library.
2140
 */
2141
jQuery.event = {
2142

    
2143
        // Bind an event to an element
2144
        // Original by Dean Edwards
2145
        add: function( elem, types, handler, data ) {
2146
                if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
2147
                        return;
2148
                }
2149

    
2150
                // TODO :: Use a try/catch until it's safe to pull this out (likely 1.6)
2151
                // Minor release fix for bug #8018
2152
                try {
2153
                        // For whatever reason, IE has trouble passing the window object
2154
                        // around, causing it to be cloned in the process
2155
                        if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) {
2156
                                elem = window;
2157
                        }
2158
                }
2159
                catch ( e ) {}
2160

    
2161
                if ( handler === false ) {
2162
                        handler = returnFalse;
2163
                } else if ( !handler ) {
2164
                        // Fixes bug #7229. Fix recommended by jdalton
2165
                        return;
2166
                }
2167

    
2168
                var handleObjIn, handleObj;
2169

    
2170
                if ( handler.handler ) {
2171
                        handleObjIn = handler;
2172
                        handler = handleObjIn.handler;
2173
                }
2174

    
2175
                // Make sure that the function being executed has a unique ID
2176
                if ( !handler.guid ) {
2177
                        handler.guid = jQuery.guid++;
2178
                }
2179

    
2180
                // Init the element's event structure
2181
                var elemData = jQuery._data( elem );
2182

    
2183
                // If no elemData is found then we must be trying to bind to one of the
2184
                // banned noData elements
2185
                if ( !elemData ) {
2186
                        return;
2187
                }
2188

    
2189
                var events = elemData.events,
2190
                        eventHandle = elemData.handle;
2191

    
2192
                if ( !events ) {
2193
                        elemData.events = events = {};
2194
                }
2195

    
2196
                if ( !eventHandle ) {
2197
                        elemData.handle = eventHandle = function() {
2198
                                // Handle the second event of a trigger and when
2199
                                // an event is called after a page has unloaded
2200
                                return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
2201
                                        jQuery.event.handle.apply( eventHandle.elem, arguments ) :
2202
                                        undefined;
2203
                        };
2204
                }
2205

    
2206
                // Add elem as a property of the handle function
2207
                // This is to prevent a memory leak with non-native events in IE.
2208
                eventHandle.elem = elem;
2209

    
2210
                // Handle multiple events separated by a space
2211
                // jQuery(...).bind("mouseover mouseout", fn);
2212
                types = types.split(" ");
2213

    
2214
                var type, i = 0, namespaces;
2215

    
2216
                while ( (type = types[ i++ ]) ) {
2217
                        handleObj = handleObjIn ?
2218
                                jQuery.extend({}, handleObjIn) :
2219
                                { handler: handler, data: data };
2220

    
2221
                        // Namespaced event handlers
2222
                        if ( type.indexOf(".") > -1 ) {
2223
                                namespaces = type.split(".");
2224
                                type = namespaces.shift();
2225
                                handleObj.namespace = namespaces.slice(0).sort().join(".");
2226

    
2227
                        } else {
2228
                                namespaces = [];
2229
                                handleObj.namespace = "";
2230
                        }
2231

    
2232
                        handleObj.type = type;
2233
                        if ( !handleObj.guid ) {
2234
                                handleObj.guid = handler.guid;
2235
                        }
2236

    
2237
                        // Get the current list of functions bound to this event
2238
                        var handlers = events[ type ],
2239
                                special = jQuery.event.special[ type ] || {};
2240

    
2241
                        // Init the event handler queue
2242
                        if ( !handlers ) {
2243
                                handlers = events[ type ] = [];
2244

    
2245
                                // Check for a special event handler
2246
                                // Only use addEventListener/attachEvent if the special
2247
                                // events handler returns false
2248
                                if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
2249
                                        // Bind the global event handler to the element
2250
                                        if ( elem.addEventListener ) {
2251
                                                elem.addEventListener( type, eventHandle, false );
2252

    
2253
                                        } else if ( elem.attachEvent ) {
2254
                                                elem.attachEvent( "on" + type, eventHandle );
2255
                                        }
2256
                                }
2257
                        }
2258

    
2259
                        if ( special.add ) {
2260
                                special.add.call( elem, handleObj );
2261

    
2262
                                if ( !handleObj.handler.guid ) {
2263
                                        handleObj.handler.guid = handler.guid;
2264
                                }
2265
                        }
2266

    
2267
                        // Add the function to the element's handler list
2268
                        handlers.push( handleObj );
2269

    
2270
                        // Keep track of which events have been used, for global triggering
2271
                        jQuery.event.global[ type ] = true;
2272
                }
2273

    
2274
                // Nullify elem to prevent memory leaks in IE
2275
                elem = null;
2276
        },
2277

    
2278
        global: {},
2279

    
2280
        // Detach an event or set of events from an element
2281
        remove: function( elem, types, handler, pos ) {
2282
                // don't do events on text and comment nodes
2283
                if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
2284
                        return;
2285
                }
2286

    
2287
                if ( handler === false ) {
2288
                        handler = returnFalse;
2289
                }
2290

    
2291
                var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
2292
                        elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
2293
                        events = elemData && elemData.events;
2294

    
2295
                if ( !elemData || !events ) {
2296
                        return;
2297
                }
2298

    
2299
                // types is actually an event object here
2300
                if ( types && types.type ) {
2301
                        handler = types.handler;
2302
                        types = types.type;
2303
                }
2304

    
2305
                // Unbind all events for the element
2306
                if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
2307
                        types = types || "";
2308

    
2309
                        for ( type in events ) {
2310
                                jQuery.event.remove( elem, type + types );
2311
                        }
2312

    
2313
                        return;
2314
                }
2315

    
2316
                // Handle multiple events separated by a space
2317
                // jQuery(...).unbind("mouseover mouseout", fn);
2318
                types = types.split(" ");
2319

    
2320
                while ( (type = types[ i++ ]) ) {
2321
                        origType = type;
2322
                        handleObj = null;
2323
                        all = type.indexOf(".") < 0;
2324
                        namespaces = [];
2325

    
2326
                        if ( !all ) {
2327
                                // Namespaced event handlers
2328
                                namespaces = type.split(".");
2329
                                type = namespaces.shift();
2330

    
2331
                                namespace = new RegExp("(^|\\.)" +
2332
                                        jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
2333
                        }
2334

    
2335
                        eventType = events[ type ];
2336

    
2337
                        if ( !eventType ) {
2338
                                continue;
2339
                        }
2340

    
2341
                        if ( !handler ) {
2342
                                for ( j = 0; j < eventType.length; j++ ) {
2343
                                        handleObj = eventType[ j ];
2344

    
2345
                                        if ( all || namespace.test( handleObj.namespace ) ) {
2346
                                                jQuery.event.remove( elem, origType, handleObj.handler, j );
2347
                                                eventType.splice( j--, 1 );
2348
                                        }
2349
                                }
2350

    
2351
                                continue;
2352
                        }
2353

    
2354
                        special = jQuery.event.special[ type ] || {};
2355

    
2356
                        for ( j = pos || 0; j < eventType.length; j++ ) {
2357
                                handleObj = eventType[ j ];
2358

    
2359
                                if ( handler.guid === handleObj.guid ) {
2360
                                        // remove the given handler for the given type
2361
                                        if ( all || namespace.test( handleObj.namespace ) ) {
2362
                                                if ( pos == null ) {
2363
                                                        eventType.splice( j--, 1 );
2364
                                                }
2365

    
2366
                                                if ( special.remove ) {
2367
                                                        special.remove.call( elem, handleObj );
2368
                                                }
2369
                                        }
2370

    
2371
                                        if ( pos != null ) {
2372
                                                break;
2373
                                        }
2374
                                }
2375
                        }
2376

    
2377
                        // remove generic event handler if no more handlers exist
2378
                        if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
2379
                                if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
2380
                                        jQuery.removeEvent( elem, type, elemData.handle );
2381
                                }
2382

    
2383
                                ret = null;
2384
                                delete events[ type ];
2385
                        }
2386
                }
2387

    
2388
                // Remove the expando if it's no longer used
2389
                if ( jQuery.isEmptyObject( events ) ) {
2390
                        var handle = elemData.handle;
2391
                        if ( handle ) {
2392
                                handle.elem = null;
2393
                        }
2394

    
2395
                        delete elemData.events;
2396
                        delete elemData.handle;
2397

    
2398
                        if ( jQuery.isEmptyObject( elemData ) ) {
2399
                                jQuery.removeData( elem, undefined, true );
2400
                        }
2401
                }
2402
        },
2403

    
2404
        // bubbling is internal
2405
        trigger: function( event, data, elem /*, bubbling */ ) {
2406
                // Event object or event type
2407
                var type = event.type || event,
2408
                        bubbling = arguments[3];
2409

    
2410
                if ( !bubbling ) {
2411
                        event = typeof event === "object" ?
2412
                                // jQuery.Event object
2413
                                event[ jQuery.expando ] ? event :
2414
                                // Object literal
2415
                                jQuery.extend( jQuery.Event(type), event ) :
2416
                                // Just the event type (string)
2417
                                jQuery.Event(type);
2418

    
2419
                        if ( type.indexOf("!") >= 0 ) {
2420
                                event.type = type = type.slice(0, -1);
2421
                                event.exclusive = true;
2422
                        }
2423

    
2424
                        // Handle a global trigger
2425
                        if ( !elem ) {
2426
                                // Don't bubble custom events when global (to avoid too much overhead)
2427
                                event.stopPropagation();
2428

    
2429
                                // Only trigger if we've ever bound an event for it
2430
                                if ( jQuery.event.global[ type ] ) {
2431
                                        // XXX This code smells terrible. event.js should not be directly
2432
                                        // inspecting the data cache
2433
                                        jQuery.each( jQuery.cache, function() {
2434
                                                // internalKey variable is just used to make it easier to find
2435
                                                // and potentially change this stuff later; currently it just
2436
                                                // points to jQuery.expando
2437
                                                var internalKey = jQuery.expando,
2438
                                                        internalCache = this[ internalKey ];
2439
                                                if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
2440
                                                        jQuery.event.trigger( event, data, internalCache.handle.elem );
2441
                                                }
2442
                                        });
2443
                                }
2444
                        }
2445

    
2446
                        // Handle triggering a single element
2447

    
2448
                        // don't do events on text and comment nodes
2449
                        if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
2450
                                return undefined;
2451
                        }
2452

    
2453
                        // Clean up in case it is reused
2454
                        event.result = undefined;
2455
                        event.target = elem;
2456

    
2457
                        // Clone the incoming data, if any
2458
                        data = jQuery.makeArray( data );
2459
                        data.unshift( event );
2460
                }
2461

    
2462
                event.currentTarget = elem;
2463

    
2464
                // Trigger the event, it is assumed that "handle" is a function
2465
                var handle = jQuery._data( elem, "handle" );
2466

    
2467
                if ( handle ) {
2468
                        handle.apply( elem, data );
2469
                }
2470

    
2471
                var parent = elem.parentNode || elem.ownerDocument;
2472

    
2473
                // Trigger an inline bound script
2474
                try {
2475
                        if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
2476
                                if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {
2477
                                        event.result = false;
2478
                                        event.preventDefault();
2479
                                }
2480
                        }
2481

    
2482
                // prevent IE from throwing an error for some elements with some event types, see #3533
2483
                } catch (inlineError) {}
2484

    
2485
                if ( !event.isPropagationStopped() && parent ) {
2486
                        jQuery.event.trigger( event, data, parent, true );
2487

    
2488
                } else if ( !event.isDefaultPrevented() ) {
2489
                        var old,
2490
                                target = event.target,
2491
                                targetType = type.replace( rnamespaces, "" ),
2492
                                isClick = jQuery.nodeName( target, "a" ) && targetType === "click",
2493
                                special = jQuery.event.special[ targetType ] || {};
2494

    
2495
                        if ( (!special._default || special._default.call( elem, event ) === false) &&
2496
                                !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
2497

    
2498
                                try {
2499
                                        if ( target[ targetType ] ) {
2500
                                                // Make sure that we don't accidentally re-trigger the onFOO events
2501
                                                old = target[ "on" + targetType ];
2502

    
2503
                                                if ( old ) {
2504
                                                        target[ "on" + targetType ] = null;
2505
                                                }
2506

    
2507
                                                jQuery.event.triggered = true;
2508
                                                target[ targetType ]();
2509
                                        }
2510

    
2511
                                // prevent IE from throwing an error for some elements with some event types, see #3533
2512
                                } catch (triggerError) {}
2513

    
2514
                                if ( old ) {
2515
                                        target[ "on" + targetType ] = old;
2516
                                }
2517

    
2518
                                jQuery.event.triggered = false;
2519
                        }
2520
                }
2521
        },
2522

    
2523
        handle: function( event ) {
2524
                var all, handlers, namespaces, namespace_re, events,
2525
                        namespace_sort = [],
2526
                        args = jQuery.makeArray( arguments );
2527

    
2528
                event = args[0] = jQuery.event.fix( event || window.event );
2529
                event.currentTarget = this;
2530

    
2531
                // Namespaced event handlers
2532
                all = event.type.indexOf(".") < 0 && !event.exclusive;
2533

    
2534
                if ( !all ) {
2535
                        namespaces = event.type.split(".");
2536
                        event.type = namespaces.shift();
2537
                        namespace_sort = namespaces.slice(0).sort();
2538
                        namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)");
2539
                }
2540

    
2541
                event.namespace = event.namespace || namespace_sort.join(".");
2542

    
2543
                events = jQuery._data(this, "events");
2544

    
2545
                handlers = (events || {})[ event.type ];
2546

    
2547
                if ( events && handlers ) {
2548
                        // Clone the handlers to prevent manipulation
2549
                        handlers = handlers.slice(0);
2550

    
2551
                        for ( var j = 0, l = handlers.length; j < l; j++ ) {
2552
                                var handleObj = handlers[ j ];
2553

    
2554
                                // Filter the functions by class
2555
                                if ( all || namespace_re.test( handleObj.namespace ) ) {
2556
                                        // Pass in a reference to the handler function itself
2557
                                        // So that we can later remove it
2558
                                        event.handler = handleObj.handler;
2559
                                        event.data = handleObj.data;
2560
                                        event.handleObj = handleObj;
2561

    
2562
                                        var ret = handleObj.handler.apply( this, args );
2563

    
2564
                                        if ( ret !== undefined ) {
2565
                                                event.result = ret;
2566
                                                if ( ret === false ) {
2567
                                                        event.preventDefault();
2568
                                                        event.stopPropagation();
2569
                                                }
2570
                                        }
2571

    
2572
                                        if ( event.isImmediatePropagationStopped() ) {
2573
                                                break;
2574
                                        }
2575
                                }
2576
                        }
2577
                }
2578

    
2579
                return event.result;
2580
        },
2581

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

    
2584
        fix: function( event ) {
2585
                if ( event[ jQuery.expando ] ) {
2586
                        return event;
2587
                }
2588

    
2589
                // store a copy of the original event object
2590
                // and "clone" to set read-only properties
2591
                var originalEvent = event;
2592
                event = jQuery.Event( originalEvent );
2593

    
2594
                for ( var i = this.props.length, prop; i; ) {
2595
                        prop = this.props[ --i ];
2596
                        event[ prop ] = originalEvent[ prop ];
2597
                }
2598

    
2599
                // Fix target property, if necessary
2600
                if ( !event.target ) {
2601
                        // Fixes #1925 where srcElement might not be defined either
2602
                        event.target = event.srcElement || document;
2603
                }
2604

    
2605
                // check if target is a textnode (safari)
2606
                if ( event.target.nodeType === 3 ) {
2607
                        event.target = event.target.parentNode;
2608
                }
2609

    
2610
                // Add relatedTarget, if necessary
2611
                if ( !event.relatedTarget && event.fromElement ) {
2612
                        event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
2613
                }
2614

    
2615
                // Calculate pageX/Y if missing and clientX/Y available
2616
                if ( event.pageX == null && event.clientX != null ) {
2617
                        var doc = document.documentElement,
2618
                                body = document.body;
2619

    
2620
                        event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
2621
                        event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
2622
                }
2623

    
2624
                // Add which for key events
2625
                if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
2626
                        event.which = event.charCode != null ? event.charCode : event.keyCode;
2627
                }
2628

    
2629
                // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
2630
                if ( !event.metaKey && event.ctrlKey ) {
2631
                        event.metaKey = event.ctrlKey;
2632
                }
2633

    
2634
                // Add which for click: 1 === left; 2 === middle; 3 === right
2635
                // Note: button is not normalized, so don't use it
2636
                if ( !event.which && event.button !== undefined ) {
2637
                        event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
2638
                }
2639

    
2640
                return event;
2641
        },
2642

    
2643
        // Deprecated, use jQuery.guid instead
2644
        guid: 1E8,
2645

    
2646
        // Deprecated, use jQuery.proxy instead
2647
        proxy: jQuery.proxy,
2648

    
2649
        special: {
2650
                ready: {
2651
                        // Make sure the ready event is setup
2652
                        setup: jQuery.bindReady,
2653
                        teardown: jQuery.noop
2654
                },
2655

    
2656
                live: {
2657
                        add: function( handleObj ) {
2658
                                jQuery.event.add( this,
2659
                                        liveConvert( handleObj.origType, handleObj.selector ),
2660
                                        jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
2661
                        },
2662

    
2663
                        remove: function( handleObj ) {
2664
                                jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
2665
                        }
2666
                },
2667

    
2668
                beforeunload: {
2669
                        setup: function( data, namespaces, eventHandle ) {
2670
                                // We only want to do this special case on windows
2671
                                if ( jQuery.isWindow( this ) ) {
2672
                                        this.onbeforeunload = eventHandle;
2673
                                }
2674
                        },
2675

    
2676
                        teardown: function( namespaces, eventHandle ) {
2677
                                if ( this.onbeforeunload === eventHandle ) {
2678
                                        this.onbeforeunload = null;
2679
                                }
2680
                        }
2681
                }
2682
        }
2683
};
2684

    
2685
jQuery.removeEvent = document.removeEventListener ?
2686
        function( elem, type, handle ) {
2687
                if ( elem.removeEventListener ) {
2688
                        elem.removeEventListener( type, handle, false );
2689
                }
2690
        } :
2691
        function( elem, type, handle ) {
2692
                if ( elem.detachEvent ) {
2693
                        elem.detachEvent( "on" + type, handle );
2694
                }
2695
        };
2696

    
2697
jQuery.Event = function( src ) {
2698
        // Allow instantiation without the 'new' keyword
2699
        if ( !this.preventDefault ) {
2700
                return new jQuery.Event( src );
2701
        }
2702

    
2703
        // Event object
2704
        if ( src && src.type ) {
2705
                this.originalEvent = src;
2706
                this.type = src.type;
2707

    
2708
                // Events bubbling up the document may have been marked as prevented
2709
                // by a handler lower down the tree; reflect the correct value.
2710
                this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
2711
                        src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
2712

    
2713
        // Event type
2714
        } else {
2715
                this.type = src;
2716
        }
2717

    
2718
        // timeStamp is buggy for some events on Firefox(#3843)
2719
        // So we won't rely on the native value
2720
        this.timeStamp = jQuery.now();
2721

    
2722
        // Mark it as fixed
2723
        this[ jQuery.expando ] = true;
2724
};
2725

    
2726
function returnFalse() {
2727
        return false;
2728
}
2729
function returnTrue() {
2730
        return true;
2731
}
2732

    
2733
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
2734
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
2735
jQuery.Event.prototype = {
2736
        preventDefault: function() {
2737
                this.isDefaultPrevented = returnTrue;
2738

    
2739
                var e = this.originalEvent;
2740
                if ( !e ) {
2741
                        return;
2742
                }
2743

    
2744
                // if preventDefault exists run it on the original event
2745
                if ( e.preventDefault ) {
2746
                        e.preventDefault();
2747

    
2748
                // otherwise set the returnValue property of the original event to false (IE)
2749
                } else {
2750
                        e.returnValue = false;
2751
                }
2752
        },
2753
        stopPropagation: function() {
2754
                this.isPropagationStopped = returnTrue;
2755

    
2756
                var e = this.originalEvent;
2757
                if ( !e ) {
2758
                        return;
2759
                }
2760
                // if stopPropagation exists run it on the original event
2761
                if ( e.stopPropagation ) {
2762
                        e.stopPropagation();
2763
                }
2764
                // otherwise set the cancelBubble property of the original event to true (IE)
2765
                e.cancelBubble = true;
2766
        },
2767
        stopImmediatePropagation: function() {
2768
                this.isImmediatePropagationStopped = returnTrue;
2769
                this.stopPropagation();
2770
        },
2771
        isDefaultPrevented: returnFalse,
2772
        isPropagationStopped: returnFalse,
2773
        isImmediatePropagationStopped: returnFalse
2774
};
2775

    
2776
// Checks if an event happened on an element within another element
2777
// Used in jQuery.event.special.mouseenter and mouseleave handlers
2778
var withinElement = function( event ) {
2779
        // Check if mouse(over|out) are still within the same parent element
2780
        var parent = event.relatedTarget;
2781

    
2782
        // Firefox sometimes assigns relatedTarget a XUL element
2783
        // which we cannot access the parentNode property of
2784
        try {
2785

    
2786
                // Chrome does something similar, the parentNode property
2787
                // can be accessed but is null.
2788
                if ( parent !== document && !parent.parentNode ) {
2789
                        return;
2790
                }
2791
                // Traverse up the tree
2792
                while ( parent && parent !== this ) {
2793
                        parent = parent.parentNode;
2794
                }
2795

    
2796
                if ( parent !== this ) {
2797
                        // set the correct event type
2798
                        event.type = event.data;
2799

    
2800
                        // handle event if we actually just moused on to a non sub-element
2801
                        jQuery.event.handle.apply( this, arguments );
2802
                }
2803

    
2804
        // assuming we've left the element since we most likely mousedover a xul element
2805
        } catch(e) { }
2806
},
2807

    
2808
// In case of event delegation, we only need to rename the event.type,
2809
// liveHandler will take care of the rest.
2810
delegate = function( event ) {
2811
        event.type = event.data;
2812
        jQuery.event.handle.apply( this, arguments );
2813
};
2814

    
2815
// Create mouseenter and mouseleave events
2816
jQuery.each({
2817
        mouseenter: "mouseover",
2818
        mouseleave: "mouseout"
2819
}, function( orig, fix ) {
2820
        jQuery.event.special[ orig ] = {
2821
                setup: function( data ) {
2822
                        jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
2823
                },
2824
                teardown: function( data ) {
2825
                        jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
2826
                }
2827
        };
2828
});
2829

    
2830
// submit delegation
2831
if ( !jQuery.support.submitBubbles ) {
2832

    
2833
        jQuery.event.special.submit = {
2834
                setup: function( data, namespaces ) {
2835
                        if ( this.nodeName && this.nodeName.toLowerCase() !== "form" ) {
2836
                                jQuery.event.add(this, "click.specialSubmit", function( e ) {
2837
                                        var elem = e.target,
2838
                                                type = elem.type;
2839

    
2840
                                        if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
2841
                                                trigger( "submit", this, arguments );
2842
                                        }
2843
                                });
2844

    
2845
                                jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
2846
                                        var elem = e.target,
2847
                                                type = elem.type;
2848

    
2849
                                        if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
2850
                                                trigger( "submit", this, arguments );
2851
                                        }
2852
                                });
2853

    
2854
                        } else {
2855
                                return false;
2856
                        }
2857
                },
2858

    
2859
                teardown: function( namespaces ) {
2860
                        jQuery.event.remove( this, ".specialSubmit" );
2861
                }
2862
        };
2863

    
2864
}
2865

    
2866
// change delegation, happens here so we have bind.
2867
if ( !jQuery.support.changeBubbles ) {
2868

    
2869
        var changeFilters,
2870

    
2871
        getVal = function( elem ) {
2872
                var type = elem.type, val = elem.value;
2873

    
2874
                if ( type === "radio" || type === "checkbox" ) {
2875
                        val = elem.checked;
2876

    
2877
                } else if ( type === "select-multiple" ) {
2878
                        val = elem.selectedIndex > -1 ?
2879
                                jQuery.map( elem.options, function( elem ) {
2880
                                        return elem.selected;
2881
                                }).join("-") :
2882
                                "";
2883

    
2884
                } else if ( elem.nodeName.toLowerCase() === "select" ) {
2885
                        val = elem.selectedIndex;
2886
                }
2887

    
2888
                return val;
2889
        },
2890

    
2891
        testChange = function testChange( e ) {
2892
                var elem = e.target, data, val;
2893

    
2894
                if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
2895
                        return;
2896
                }
2897

    
2898
                data = jQuery._data( elem, "_change_data" );
2899
                val = getVal(elem);
2900

    
2901
                // the current data will be also retrieved by beforeactivate
2902
                if ( e.type !== "focusout" || elem.type !== "radio" ) {
2903
                        jQuery._data( elem, "_change_data", val );
2904
                }
2905

    
2906
                if ( data === undefined || val === data ) {
2907
                        return;
2908
                }
2909

    
2910
                if ( data != null || val ) {
2911
                        e.type = "change";
2912
                        e.liveFired = undefined;
2913
                        jQuery.event.trigger( e, arguments[1], elem );
2914
                }
2915
        };
2916

    
2917
        jQuery.event.special.change = {
2918
                filters: {
2919
                        focusout: testChange,
2920

    
2921
                        beforedeactivate: testChange,
2922

    
2923
                        click: function( e ) {
2924
                                var elem = e.target, type = elem.type;
2925

    
2926
                                if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
2927
                                        testChange.call( this, e );
2928
                                }
2929
                        },
2930

    
2931
                        // Change has to be called before submit
2932
                        // Keydown will be called before keypress, which is used in submit-event delegation
2933
                        keydown: function( e ) {
2934
                                var elem = e.target, type = elem.type;
2935

    
2936
                                if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
2937
                                        (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
2938
                                        type === "select-multiple" ) {
2939
                                        testChange.call( this, e );
2940
                                }
2941
                        },
2942

    
2943
                        // Beforeactivate happens also before the previous element is blurred
2944
                        // with this event you can't trigger a change event, but you can store
2945
                        // information
2946
                        beforeactivate: function( e ) {
2947
                                var elem = e.target;
2948
                                jQuery._data( elem, "_change_data", getVal(elem) );
2949
                        }
2950
                },
2951

    
2952
                setup: function( data, namespaces ) {
2953
                        if ( this.type === "file" ) {
2954
                                return false;
2955
                        }
2956

    
2957
                        for ( var type in changeFilters ) {
2958
                                jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
2959
                        }
2960

    
2961
                        return rformElems.test( this.nodeName );
2962
                },
2963

    
2964
                teardown: function( namespaces ) {
2965
                        jQuery.event.remove( this, ".specialChange" );
2966

    
2967
                        return rformElems.test( this.nodeName );
2968
                }
2969
        };
2970

    
2971
        changeFilters = jQuery.event.special.change.filters;
2972

    
2973
        // Handle when the input is .focus()'d
2974
        changeFilters.focus = changeFilters.beforeactivate;
2975
}
2976

    
2977
function trigger( type, elem, args ) {
2978
        // Piggyback on a donor event to simulate a different one.
2979
        // Fake originalEvent to avoid donor's stopPropagation, but if the
2980
        // simulated event prevents default then we do the same on the donor.
2981
        // Don't pass args or remember liveFired; they apply to the donor event.
2982
        var event = jQuery.extend( {}, args[ 0 ] );
2983
        event.type = type;
2984
        event.originalEvent = {};
2985
        event.liveFired = undefined;
2986
        jQuery.event.handle.call( elem, event );
2987
        if ( event.isDefaultPrevented() ) {
2988
                args[ 0 ].preventDefault();
2989
        }
2990
}
2991

    
2992
// Create "bubbling" focus and blur events
2993
if ( document.addEventListener ) {
2994
        jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
2995
                jQuery.event.special[ fix ] = {
2996
                        setup: function() {
2997
                                this.addEventListener( orig, handler, true );
2998
                        },
2999
                        teardown: function() {
3000
                                this.removeEventListener( orig, handler, true );
3001
                        }
3002
                };
3003

    
3004
                function handler( e ) {
3005
                        e = jQuery.event.fix( e );
3006
                        e.type = fix;
3007
                        return jQuery.event.handle.call( this, e );
3008
                }
3009
        });
3010
}
3011

    
3012
jQuery.each(["bind", "one"], function( i, name ) {
3013
        jQuery.fn[ name ] = function( type, data, fn ) {
3014
                // Handle object literals
3015
                if ( typeof type === "object" ) {
3016
                        for ( var key in type ) {
3017
                                this[ name ](key, data, type[key], fn);
3018
                        }
3019
                        return this;
3020
                }
3021

    
3022
                if ( jQuery.isFunction( data ) || data === false ) {
3023
                        fn = data;
3024
                        data = undefined;
3025
                }
3026

    
3027
                var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
3028
                        jQuery( this ).unbind( event, handler );
3029
                        return fn.apply( this, arguments );
3030
                }) : fn;
3031

    
3032
                if ( type === "unload" && name !== "one" ) {
3033
                        this.one( type, data, fn );
3034

    
3035
                } else {
3036
                        for ( var i = 0, l = this.length; i < l; i++ ) {
3037
                                jQuery.event.add( this[i], type, handler, data );
3038
                        }
3039
                }
3040

    
3041
                return this;
3042
        };
3043
});
3044

    
3045
jQuery.fn.extend({
3046
        unbind: function( type, fn ) {
3047
                // Handle object literals
3048
                if ( typeof type === "object" && !type.preventDefault ) {
3049
                        for ( var key in type ) {
3050
                                this.unbind(key, type[key]);
3051
                        }
3052

    
3053
                } else {
3054
                        for ( var i = 0, l = this.length; i < l; i++ ) {
3055
                                jQuery.event.remove( this[i], type, fn );
3056
                        }
3057
                }
3058

    
3059
                return this;
3060
        },
3061

    
3062
        delegate: function( selector, types, data, fn ) {
3063
                return this.live( types, data, fn, selector );
3064
        },
3065

    
3066
        undelegate: function( selector, types, fn ) {
3067
                if ( arguments.length === 0 ) {
3068
                                return this.unbind( "live" );
3069

    
3070
                } else {
3071
                        return this.die( types, null, fn, selector );
3072
                }
3073
        },
3074

    
3075
        trigger: function( type, data ) {
3076
                return this.each(function() {
3077
                        jQuery.event.trigger( type, data, this );
3078
                });
3079
        },
3080

    
3081
        triggerHandler: function( type, data ) {
3082
                if ( this[0] ) {
3083
                        var event = jQuery.Event( type );
3084
                        event.preventDefault();
3085
                        event.stopPropagation();
3086
                        jQuery.event.trigger( event, data, this[0] );
3087
                        return event.result;
3088
                }
3089
        },
3090

    
3091
        toggle: function( fn ) {
3092
                // Save reference to arguments for access in closure
3093
                var args = arguments,
3094
                        i = 1;
3095

    
3096
                // link all the functions, so any of them can unbind this click handler
3097
                while ( i < args.length ) {
3098
                        jQuery.proxy( fn, args[ i++ ] );
3099
                }
3100

    
3101
                return this.click( jQuery.proxy( fn, function( event ) {
3102
                        // Figure out which function to execute
3103
                        var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
3104
                        jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
3105

    
3106
                        // Make sure that clicks stop
3107
                        event.preventDefault();
3108

    
3109
                        // and execute the function
3110
                        return args[ lastToggle ].apply( this, arguments ) || false;
3111
                }));
3112
        },
3113

    
3114
        hover: function( fnOver, fnOut ) {
3115
                return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
3116
        }
3117
});
3118

    
3119
var liveMap = {
3120
        focus: "focusin",
3121
        blur: "focusout",
3122
        mouseenter: "mouseover",
3123
        mouseleave: "mouseout"
3124
};
3125

    
3126
jQuery.each(["live", "die"], function( i, name ) {
3127
        jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
3128
                var type, i = 0, match, namespaces, preType,
3129
                        selector = origSelector || this.selector,
3130
                        context = origSelector ? this : jQuery( this.context );
3131

    
3132
                if ( typeof types === "object" && !types.preventDefault ) {
3133
                        for ( var key in types ) {
3134
                                context[ name ]( key, data, types[key], selector );
3135
                        }
3136

    
3137
                        return this;
3138
                }
3139

    
3140
                if ( jQuery.isFunction( data ) ) {
3141
                        fn = data;
3142
                        data = undefined;
3143
                }
3144

    
3145
                types = (types || "").split(" ");
3146

    
3147
                while ( (type = types[ i++ ]) != null ) {
3148
                        match = rnamespaces.exec( type );
3149
                        namespaces = "";
3150

    
3151
                        if ( match )  {
3152
                                namespaces = match[0];
3153
                                type = type.replace( rnamespaces, "" );
3154
                        }
3155

    
3156
                        if ( type === "hover" ) {
3157
                                types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
3158
                                continue;
3159
                        }
3160

    
3161
                        preType = type;
3162

    
3163
                        if ( type === "focus" || type === "blur" ) {
3164
                                types.push( liveMap[ type ] + namespaces );
3165
                                type = type + namespaces;
3166

    
3167
                        } else {
3168
                                type = (liveMap[ type ] || type) + namespaces;
3169
                        }
3170

    
3171
                        if ( name === "live" ) {
3172
                                // bind live handler
3173
                                for ( var j = 0, l = context.length; j < l; j++ ) {
3174
                                        jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
3175
                                                { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
3176
                                }
3177

    
3178
                        } else {
3179
                                // unbind live handler
3180
                                context.unbind( "live." + liveConvert( type, selector ), fn );
3181
                        }
3182
                }
3183

    
3184
                return this;
3185
        };
3186
});
3187

    
3188
function liveHandler( event ) {
3189
        var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
3190
                elems = [],
3191
                selectors = [],
3192
                events = jQuery._data( this, "events" );
3193

    
3194
        // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
3195
        if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
3196
                return;
3197
        }
3198

    
3199
        if ( event.namespace ) {
3200
                namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
3201
        }
3202

    
3203
        event.liveFired = this;
3204

    
3205
        var live = events.live.slice(0);
3206

    
3207
        for ( j = 0; j < live.length; j++ ) {
3208
                handleObj = live[j];
3209

    
3210
                if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
3211
                        selectors.push( handleObj.selector );
3212

    
3213
                } else {
3214
                        live.splice( j--, 1 );
3215
                }
3216
        }
3217

    
3218
        match = jQuery( event.target ).closest( selectors, event.currentTarget );
3219

    
3220
        for ( i = 0, l = match.length; i < l; i++ ) {
3221
                close = match[i];
3222

    
3223
                for ( j = 0; j < live.length; j++ ) {
3224
                        handleObj = live[j];
3225

    
3226
                        if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {
3227
                                elem = close.elem;
3228
                                related = null;
3229

    
3230
                                // Those two events require additional checking
3231
                                if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
3232
                                        event.type = handleObj.preType;
3233
                                        related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
3234
                                }
3235

    
3236
                                if ( !related || related !== elem ) {
3237
                                        elems.push({ elem: elem, handleObj: handleObj, level: close.level });
3238
                                }
3239
                        }
3240
                }
3241
        }
3242

    
3243
        for ( i = 0, l = elems.length; i < l; i++ ) {
3244
                match = elems[i];
3245

    
3246
                if ( maxLevel && match.level > maxLevel ) {
3247
                        break;
3248
                }
3249

    
3250
                event.currentTarget = match.elem;
3251
                event.data = match.handleObj.data;
3252
                event.handleObj = match.handleObj;
3253

    
3254
                ret = match.handleObj.origHandler.apply( match.elem, arguments );
3255

    
3256
                if ( ret === false || event.isPropagationStopped() ) {
3257
                        maxLevel = match.level;
3258

    
3259
                        if ( ret === false ) {
3260
                                stop = false;
3261
                        }
3262
                        if ( event.isImmediatePropagationStopped() ) {
3263
                                break;
3264
                        }
3265
                }
3266
        }
3267

    
3268
        return stop;
3269
}
3270

    
3271
function liveConvert( type, selector ) {
3272
        return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspace, "&");
3273
}
3274

    
3275
jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
3276
        "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
3277
        "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
3278

    
3279
        // Handle event binding
3280
        jQuery.fn[ name ] = function( data, fn ) {
3281
                if ( fn == null ) {
3282
                        fn = data;
3283
                        data = null;
3284
                }
3285

    
3286
                return arguments.length > 0 ?
3287
                        this.bind( name, data, fn ) :
3288
                        this.trigger( name );
3289
        };
3290

    
3291
        if ( jQuery.attrFn ) {
3292
                jQuery.attrFn[ name ] = true;
3293
        }
3294
});
3295

    
3296

    
3297
/*!
3298
 * Sizzle CSS Selector Engine
3299
 *  Copyright 2011, The Dojo Foundation
3300
 *  Released under the MIT, BSD, and GPL Licenses.
3301
 *  More information: http://sizzlejs.com/
3302
 */
3303
(function(){
3304

    
3305
var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
3306
        done = 0,
3307
        toString = Object.prototype.toString,
3308
        hasDuplicate = false,
3309
        baseHasDuplicate = true,
3310
        rBackslash = /\\/g,
3311
        rNonWord = /\W/;
3312

    
3313
// Here we check if the JavaScript engine is using some sort of
3314
// optimization where it does not always call our comparision
3315
// function. If that is the case, discard the hasDuplicate value.
3316
//   Thus far that includes Google Chrome.
3317
[0, 0].sort(function() {
3318
        baseHasDuplicate = false;
3319
        return 0;
3320
});
3321

    
3322
var Sizzle = function( selector, context, results, seed ) {
3323
        results = results || [];
3324
        context = context || document;
3325

    
3326
        var origContext = context;
3327

    
3328
        if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
3329
                return [];
3330
        }
3331
        
3332
        if ( !selector || typeof selector !== "string" ) {
3333
                return results;
3334
        }
3335

    
3336
        var m, set, checkSet, extra, ret, cur, pop, i,
3337
                prune = true,
3338
                contextXML = Sizzle.isXML( context ),
3339
                parts = [],
3340
                soFar = selector;
3341
        
3342
        // Reset the position of the chunker regexp (start from head)
3343
        do {
3344
                chunker.exec( "" );
3345
                m = chunker.exec( soFar );
3346

    
3347
                if ( m ) {
3348
                        soFar = m[3];
3349
                
3350
                        parts.push( m[1] );
3351
                
3352
                        if ( m[2] ) {
3353
                                extra = m[3];
3354
                                break;
3355
                        }
3356
                }
3357
        } while ( m );
3358

    
3359
        if ( parts.length > 1 && origPOS.exec( selector ) ) {
3360

    
3361
                if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
3362
                        set = posProcess( parts[0] + parts[1], context );
3363

    
3364
                } else {
3365
                        set = Expr.relative[ parts[0] ] ?
3366
                                [ context ] :
3367
                                Sizzle( parts.shift(), context );
3368

    
3369
                        while ( parts.length ) {
3370
                                selector = parts.shift();
3371

    
3372
                                if ( Expr.relative[ selector ] ) {
3373
                                        selector += parts.shift();
3374
                                }
3375
                                
3376
                                set = posProcess( selector, set );
3377
                        }
3378
                }
3379

    
3380
        } else {
3381
                // Take a shortcut and set the context if the root selector is an ID
3382
                // (but not if it'll be faster if the inner selector is an ID)
3383
                if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
3384
                                Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
3385

    
3386
                        ret = Sizzle.find( parts.shift(), context, contextXML );
3387
                        context = ret.expr ?
3388
                                Sizzle.filter( ret.expr, ret.set )[0] :
3389
                                ret.set[0];
3390
                }
3391

    
3392
                if ( context ) {
3393
                        ret = seed ?
3394
                                { expr: parts.pop(), set: makeArray(seed) } :
3395
                                Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
3396

    
3397
                        set = ret.expr ?
3398
                                Sizzle.filter( ret.expr, ret.set ) :
3399
                                ret.set;
3400

    
3401
                        if ( parts.length > 0 ) {
3402
                                checkSet = makeArray( set );
3403

    
3404
                        } else {
3405
                                prune = false;
3406
                        }
3407

    
3408
                        while ( parts.length ) {
3409
                                cur = parts.pop();
3410
                                pop = cur;
3411

    
3412
                                if ( !Expr.relative[ cur ] ) {
3413
                                        cur = "";
3414
                                } else {
3415
                                        pop = parts.pop();
3416
                                }
3417

    
3418
                                if ( pop == null ) {
3419
                                        pop = context;
3420
                                }
3421

    
3422
                                Expr.relative[ cur ]( checkSet, pop, contextXML );
3423
                        }
3424

    
3425
                } else {
3426
                        checkSet = parts = [];
3427
                }
3428
        }
3429

    
3430
        if ( !checkSet ) {
3431
                checkSet = set;
3432
        }
3433

    
3434
        if ( !checkSet ) {
3435
                Sizzle.error( cur || selector );
3436
        }
3437

    
3438
        if ( toString.call(checkSet) === "[object Array]" ) {
3439
                if ( !prune ) {
3440
                        results.push.apply( results, checkSet );
3441

    
3442
                } else if ( context && context.nodeType === 1 ) {
3443
                        for ( i = 0; checkSet[i] != null; i++ ) {
3444
                                if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
3445
                                        results.push( set[i] );
3446
                                }
3447
                        }
3448

    
3449
                } else {
3450
                        for ( i = 0; checkSet[i] != null; i++ ) {
3451
                                if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
3452
                                        results.push( set[i] );
3453
                                }
3454
                        }
3455
                }
3456

    
3457
        } else {
3458
                makeArray( checkSet, results );
3459
        }
3460

    
3461
        if ( extra ) {
3462
                Sizzle( extra, origContext, results, seed );
3463
                Sizzle.uniqueSort( results );
3464
        }
3465

    
3466
        return results;
3467
};
3468

    
3469
Sizzle.uniqueSort = function( results ) {
3470
        if ( sortOrder ) {
3471
                hasDuplicate = baseHasDuplicate;
3472
                results.sort( sortOrder );
3473

    
3474
                if ( hasDuplicate ) {
3475
                        for ( var i = 1; i < results.length; i++ ) {
3476
                                if ( results[i] === results[ i - 1 ] ) {
3477
                                        results.splice( i--, 1 );
3478
                                }
3479
                        }
3480
                }
3481
        }
3482

    
3483
        return results;
3484
};
3485

    
3486
Sizzle.matches = function( expr, set ) {
3487
        return Sizzle( expr, null, null, set );
3488
};
3489

    
3490
Sizzle.matchesSelector = function( node, expr ) {
3491
        return Sizzle( expr, null, null, [node] ).length > 0;
3492
};
3493

    
3494
Sizzle.find = function( expr, context, isXML ) {
3495
        var set;
3496

    
3497
        if ( !expr ) {
3498
                return [];
3499
        }
3500

    
3501
        for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
3502
                var match,
3503
                        type = Expr.order[i];
3504
                
3505
                if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
3506
                        var left = match[1];
3507
                        match.splice( 1, 1 );
3508

    
3509
                        if ( left.substr( left.length - 1 ) !== "\\" ) {
3510
                                match[1] = (match[1] || "").replace( rBackslash, "" );
3511
                                set = Expr.find[ type ]( match, context, isXML );
3512

    
3513
                                if ( set != null ) {
3514
                                        expr = expr.replace( Expr.match[ type ], "" );
3515
                                        break;
3516
                                }
3517
                        }
3518
                }
3519
        }
3520

    
3521
        if ( !set ) {
3522
                set = typeof context.getElementsByTagName !== "undefined" ?
3523
                        context.getElementsByTagName( "*" ) :
3524
                        [];
3525
        }
3526

    
3527
        return { set: set, expr: expr };
3528
};
3529

    
3530
Sizzle.filter = function( expr, set, inplace, not ) {
3531
        var match, anyFound,
3532
                old = expr,
3533
                result = [],
3534
                curLoop = set,
3535
                isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
3536

    
3537
        while ( expr && set.length ) {
3538
                for ( var type in Expr.filter ) {
3539
                        if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
3540
                                var found, item,
3541
                                        filter = Expr.filter[ type ],
3542
                                        left = match[1];
3543

    
3544
                                anyFound = false;
3545

    
3546
                                match.splice(1,1);
3547

    
3548
                                if ( left.substr( left.length - 1 ) === "\\" ) {
3549
                                        continue;
3550
                                }
3551

    
3552
                                if ( curLoop === result ) {
3553
                                        result = [];
3554
                                }
3555

    
3556
                                if ( Expr.preFilter[ type ] ) {
3557
                                        match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
3558

    
3559
                                        if ( !match ) {
3560
                                                anyFound = found = true;
3561

    
3562
                                        } else if ( match === true ) {
3563
                                                continue;
3564
                                        }
3565
                                }
3566

    
3567
                                if ( match ) {
3568
                                        for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
3569
                                                if ( item ) {
3570
                                                        found = filter( item, match, i, curLoop );
3571
                                                        var pass = not ^ !!found;
3572

    
3573
                                                        if ( inplace && found != null ) {
3574
                                                                if ( pass ) {
3575
                                                                        anyFound = true;
3576

    
3577
                                                                } else {
3578
                                                                        curLoop[i] = false;
3579
                                                                }
3580

    
3581
                                                        } else if ( pass ) {
3582
                                                                result.push( item );
3583
                                                                anyFound = true;
3584
                                                        }
3585
                                                }
3586
                                        }
3587
                                }
3588

    
3589
                                if ( found !== undefined ) {
3590
                                        if ( !inplace ) {
3591
                                                curLoop = result;
3592
                                        }
3593

    
3594
                                        expr = expr.replace( Expr.match[ type ], "" );
3595

    
3596
                                        if ( !anyFound ) {
3597
                                                return [];
3598
                                        }
3599

    
3600
                                        break;
3601
                                }
3602
                        }
3603
                }
3604

    
3605
                // Improper expression
3606
                if ( expr === old ) {
3607
                        if ( anyFound == null ) {
3608
                                Sizzle.error( expr );
3609

    
3610
                        } else {
3611
                                break;
3612
                        }
3613
                }
3614

    
3615
                old = expr;
3616
        }
3617

    
3618
        return curLoop;
3619
};
3620

    
3621
Sizzle.error = function( msg ) {
3622
        throw "Syntax error, unrecognized expression: " + msg;
3623
};
3624

    
3625
var Expr = Sizzle.selectors = {
3626
        order: [ "ID", "NAME", "TAG" ],
3627

    
3628
        match: {
3629
                ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
3630
                CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
3631
                NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
3632
                ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
3633
                TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
3634
                CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
3635
                POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
3636
                PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
3637
        },
3638

    
3639
        leftMatch: {},
3640

    
3641
        attrMap: {
3642
                "class": "className",
3643
                "for": "htmlFor"
3644
        },
3645

    
3646
        attrHandle: {
3647
                href: function( elem ) {
3648
                        return elem.getAttribute( "href" );
3649
                },
3650
                type: function( elem ) {
3651
                        return elem.getAttribute( "type" );
3652
                }
3653
        },
3654

    
3655
        relative: {
3656
                "+": function(checkSet, part){
3657
                        var isPartStr = typeof part === "string",
3658
                                isTag = isPartStr && !rNonWord.test( part ),
3659
                                isPartStrNotTag = isPartStr && !isTag;
3660

    
3661
                        if ( isTag ) {
3662
                                part = part.toLowerCase();
3663
                        }
3664

    
3665
                        for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
3666
                                if ( (elem = checkSet[i]) ) {
3667
                                        while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
3668

    
3669
                                        checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
3670
                                                elem || false :
3671
                                                elem === part;
3672
                                }
3673
                        }
3674

    
3675
                        if ( isPartStrNotTag ) {
3676
                                Sizzle.filter( part, checkSet, true );
3677
                        }
3678
                },
3679

    
3680
                ">": function( checkSet, part ) {
3681
                        var elem,
3682
                                isPartStr = typeof part === "string",
3683
                                i = 0,
3684
                                l = checkSet.length;
3685

    
3686
                        if ( isPartStr && !rNonWord.test( part ) ) {
3687
                                part = part.toLowerCase();
3688

    
3689
                                for ( ; i < l; i++ ) {
3690
                                        elem = checkSet[i];
3691

    
3692
                                        if ( elem ) {
3693
                                                var parent = elem.parentNode;
3694
                                                checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
3695
                                        }
3696
                                }
3697

    
3698
                        } else {
3699
                                for ( ; i < l; i++ ) {
3700
                                        elem = checkSet[i];
3701

    
3702
                                        if ( elem ) {
3703
                                                checkSet[i] = isPartStr ?
3704
                                                        elem.parentNode :
3705
                                                        elem.parentNode === part;
3706
                                        }
3707
                                }
3708

    
3709
                                if ( isPartStr ) {
3710
                                        Sizzle.filter( part, checkSet, true );
3711
                                }
3712
                        }
3713
                },
3714

    
3715
                "": function(checkSet, part, isXML){
3716
                        var nodeCheck,
3717
                                doneName = done++,
3718
                                checkFn = dirCheck;
3719

    
3720
                        if ( typeof part === "string" && !rNonWord.test( part ) ) {
3721
                                part = part.toLowerCase();
3722
                                nodeCheck = part;
3723
                                checkFn = dirNodeCheck;
3724
                        }
3725

    
3726
                        checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
3727
                },
3728

    
3729
                "~": function( checkSet, part, isXML ) {
3730
                        var nodeCheck,
3731
                                doneName = done++,
3732
                                checkFn = dirCheck;
3733

    
3734
                        if ( typeof part === "string" && !rNonWord.test( part ) ) {
3735
                                part = part.toLowerCase();
3736
                                nodeCheck = part;
3737
                                checkFn = dirNodeCheck;
3738
                        }
3739

    
3740
                        checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
3741
                }
3742
        },
3743

    
3744
        find: {
3745
                ID: function( match, context, isXML ) {
3746
                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
3747
                                var m = context.getElementById(match[1]);
3748
                                // Check parentNode to catch when Blackberry 4.6 returns
3749
                                // nodes that are no longer in the document #6963
3750
                                return m && m.parentNode ? [m] : [];
3751
                        }
3752
                },
3753

    
3754
                NAME: function( match, context ) {
3755
                        if ( typeof context.getElementsByName !== "undefined" ) {
3756
                                var ret = [],
3757
                                        results = context.getElementsByName( match[1] );
3758

    
3759
                                for ( var i = 0, l = results.length; i < l; i++ ) {
3760
                                        if ( results[i].getAttribute("name") === match[1] ) {
3761
                                                ret.push( results[i] );
3762
                                        }
3763
                                }
3764

    
3765
                                return ret.length === 0 ? null : ret;
3766
                        }
3767
                },
3768

    
3769
                TAG: function( match, context ) {
3770
                        if ( typeof context.getElementsByTagName !== "undefined" ) {
3771
                                return context.getElementsByTagName( match[1] );
3772
                        }
3773
                }
3774
        },
3775
        preFilter: {
3776
                CLASS: function( match, curLoop, inplace, result, not, isXML ) {
3777
                        match = " " + match[1].replace( rBackslash, "" ) + " ";
3778

    
3779
                        if ( isXML ) {
3780
                                return match;
3781
                        }
3782

    
3783
                        for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
3784
                                if ( elem ) {
3785
                                        if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
3786
                                                if ( !inplace ) {
3787
                                                        result.push( elem );
3788
                                                }
3789

    
3790
                                        } else if ( inplace ) {
3791
                                                curLoop[i] = false;
3792
                                        }
3793
                                }
3794
                        }
3795

    
3796
                        return false;
3797
                },
3798

    
3799
                ID: function( match ) {
3800
                        return match[1].replace( rBackslash, "" );
3801
                },
3802

    
3803
                TAG: function( match, curLoop ) {
3804
                        return match[1].replace( rBackslash, "" ).toLowerCase();
3805
                },
3806

    
3807
                CHILD: function( match ) {
3808
                        if ( match[1] === "nth" ) {
3809
                                if ( !match[2] ) {
3810
                                        Sizzle.error( match[0] );
3811
                                }
3812

    
3813
                                match[2] = match[2].replace(/^\+|\s*/g, '');
3814

    
3815
                                // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
3816
                                var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
3817
                                        match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
3818
                                        !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
3819

    
3820
                                // calculate the numbers (first)n+(last) including if they are negative
3821
                                match[2] = (test[1] + (test[2] || 1)) - 0;
3822
                                match[3] = test[3] - 0;
3823
                        }
3824
                        else if ( match[2] ) {
3825
                                Sizzle.error( match[0] );
3826
                        }
3827

    
3828
                        // TODO: Move to normal caching system
3829
                        match[0] = done++;
3830

    
3831
                        return match;
3832
                },
3833

    
3834
                ATTR: function( match, curLoop, inplace, result, not, isXML ) {
3835
                        var name = match[1] = match[1].replace( rBackslash, "" );
3836
                        
3837
                        if ( !isXML && Expr.attrMap[name] ) {
3838
                                match[1] = Expr.attrMap[name];
3839
                        }
3840

    
3841
                        // Handle if an un-quoted value was used
3842
                        match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
3843

    
3844
                        if ( match[2] === "~=" ) {
3845
                                match[4] = " " + match[4] + " ";
3846
                        }
3847

    
3848
                        return match;
3849
                },
3850

    
3851
                PSEUDO: function( match, curLoop, inplace, result, not ) {
3852
                        if ( match[1] === "not" ) {
3853
                                // If we're dealing with a complex expression, or a simple one
3854
                                if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
3855
                                        match[3] = Sizzle(match[3], null, null, curLoop);
3856

    
3857
                                } else {
3858
                                        var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
3859

    
3860
                                        if ( !inplace ) {
3861
                                                result.push.apply( result, ret );
3862
                                        }
3863

    
3864
                                        return false;
3865
                                }
3866

    
3867
                        } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
3868
                                return true;
3869
                        }
3870
                        
3871
                        return match;
3872
                },
3873

    
3874
                POS: function( match ) {
3875
                        match.unshift( true );
3876

    
3877
                        return match;
3878
                }
3879
        },
3880
        
3881
        filters: {
3882
                enabled: function( elem ) {
3883
                        return elem.disabled === false && elem.type !== "hidden";
3884
                },
3885

    
3886
                disabled: function( elem ) {
3887
                        return elem.disabled === true;
3888
                },
3889

    
3890
                checked: function( elem ) {
3891
                        return elem.checked === true;
3892
                },
3893
                
3894
                selected: function( elem ) {
3895
                        // Accessing this property makes selected-by-default
3896
                        // options in Safari work properly
3897
                        if ( elem.parentNode ) {
3898
                                elem.parentNode.selectedIndex;
3899
                        }
3900
                        
3901
                        return elem.selected === true;
3902
                },
3903

    
3904
                parent: function( elem ) {
3905
                        return !!elem.firstChild;
3906
                },
3907

    
3908
                empty: function( elem ) {
3909
                        return !elem.firstChild;
3910
                },
3911

    
3912
                has: function( elem, i, match ) {
3913
                        return !!Sizzle( match[3], elem ).length;
3914
                },
3915

    
3916
                header: function( elem ) {
3917
                        return (/h\d/i).test( elem.nodeName );
3918
                },
3919

    
3920
                text: function( elem ) {
3921
                        // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 
3922
                        // use getAttribute instead to test this case
3923
                        return "text" === elem.getAttribute( 'type' );
3924
                },
3925
                radio: function( elem ) {
3926
                        return "radio" === elem.type;
3927
                },
3928

    
3929
                checkbox: function( elem ) {
3930
                        return "checkbox" === elem.type;
3931
                },
3932

    
3933
                file: function( elem ) {
3934
                        return "file" === elem.type;
3935
                },
3936
                password: function( elem ) {
3937
                        return "password" === elem.type;
3938
                },
3939

    
3940
                submit: function( elem ) {
3941
                        return "submit" === elem.type;
3942
                },
3943

    
3944
                image: function( elem ) {
3945
                        return "image" === elem.type;
3946
                },
3947

    
3948
                reset: function( elem ) {
3949
                        return "reset" === elem.type;
3950
                },
3951

    
3952
                button: function( elem ) {
3953
                        return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
3954
                },
3955

    
3956
                input: function( elem ) {
3957
                        return (/input|select|textarea|button/i).test( elem.nodeName );
3958
                }
3959
        },
3960
        setFilters: {
3961
                first: function( elem, i ) {
3962
                        return i === 0;
3963
                },
3964

    
3965
                last: function( elem, i, match, array ) {
3966
                        return i === array.length - 1;
3967
                },
3968

    
3969
                even: function( elem, i ) {
3970
                        return i % 2 === 0;
3971
                },
3972

    
3973
                odd: function( elem, i ) {
3974
                        return i % 2 === 1;
3975
                },
3976

    
3977
                lt: function( elem, i, match ) {
3978
                        return i < match[3] - 0;
3979
                },
3980

    
3981
                gt: function( elem, i, match ) {
3982
                        return i > match[3] - 0;
3983
                },
3984

    
3985
                nth: function( elem, i, match ) {
3986
                        return match[3] - 0 === i;
3987
                },
3988

    
3989
                eq: function( elem, i, match ) {
3990
                        return match[3] - 0 === i;
3991
                }
3992
        },
3993
        filter: {
3994
                PSEUDO: function( elem, match, i, array ) {
3995
                        var name = match[1],
3996
                                filter = Expr.filters[ name ];
3997

    
3998
                        if ( filter ) {
3999
                                return filter( elem, i, match, array );
4000

    
4001
                        } else if ( name === "contains" ) {
4002
                                return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
4003

    
4004
                        } else if ( name === "not" ) {
4005
                                var not = match[3];
4006

    
4007
                                for ( var j = 0, l = not.length; j < l; j++ ) {
4008
                                        if ( not[j] === elem ) {
4009
                                                return false;
4010
                                        }
4011
                                }
4012

    
4013
                                return true;
4014

    
4015
                        } else {
4016
                                Sizzle.error( name );
4017
                        }
4018
                },
4019

    
4020
                CHILD: function( elem, match ) {
4021
                        var type = match[1],
4022
                                node = elem;
4023

    
4024
                        switch ( type ) {
4025
                                case "only":
4026
                                case "first":
4027
                                        while ( (node = node.previousSibling) )         {
4028
                                                if ( node.nodeType === 1 ) { 
4029
                                                        return false; 
4030
                                                }
4031
                                        }
4032

    
4033
                                        if ( type === "first" ) { 
4034
                                                return true; 
4035
                                        }
4036

    
4037
                                        node = elem;
4038

    
4039
                                case "last":
4040
                                        while ( (node = node.nextSibling) )         {
4041
                                                if ( node.nodeType === 1 ) { 
4042
                                                        return false; 
4043
                                                }
4044
                                        }
4045

    
4046
                                        return true;
4047

    
4048
                                case "nth":
4049
                                        var first = match[2],
4050
                                                last = match[3];
4051

    
4052
                                        if ( first === 1 && last === 0 ) {
4053
                                                return true;
4054
                                        }
4055
                                        
4056
                                        var doneName = match[0],
4057
                                                parent = elem.parentNode;
4058
        
4059
                                        if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
4060
                                                var count = 0;
4061
                                                
4062
                                                for ( node = parent.firstChild; node; node = node.nextSibling ) {
4063
                                                        if ( node.nodeType === 1 ) {
4064
                                                                node.nodeIndex = ++count;
4065
                                                        }
4066
                                                } 
4067

    
4068
                                                parent.sizcache = doneName;
4069
                                        }
4070
                                        
4071
                                        var diff = elem.nodeIndex - last;
4072

    
4073
                                        if ( first === 0 ) {
4074
                                                return diff === 0;
4075

    
4076
                                        } else {
4077
                                                return ( diff % first === 0 && diff / first >= 0 );
4078
                                        }
4079
                        }
4080
                },
4081

    
4082
                ID: function( elem, match ) {
4083
                        return elem.nodeType === 1 && elem.getAttribute("id") === match;
4084
                },
4085

    
4086
                TAG: function( elem, match ) {
4087
                        return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
4088
                },
4089
                
4090
                CLASS: function( elem, match ) {
4091
                        return (" " + (elem.className || elem.getAttribute("class")) + " ")
4092
                                .indexOf( match ) > -1;
4093
                },
4094

    
4095
                ATTR: function( elem, match ) {
4096
                        var name = match[1],
4097
                                result = Expr.attrHandle[ name ] ?
4098
                                        Expr.attrHandle[ name ]( elem ) :
4099
                                        elem[ name ] != null ?
4100
                                                elem[ name ] :
4101
                                                elem.getAttribute( name ),
4102
                                value = result + "",
4103
                                type = match[2],
4104
                                check = match[4];
4105

    
4106
                        return result == null ?
4107
                                type === "!=" :
4108
                                type === "=" ?
4109
                                value === check :
4110
                                type === "*=" ?
4111
                                value.indexOf(check) >= 0 :
4112
                                type === "~=" ?
4113
                                (" " + value + " ").indexOf(check) >= 0 :
4114
                                !check ?
4115
                                value && result !== false :
4116
                                type === "!=" ?
4117
                                value !== check :
4118
                                type === "^=" ?
4119
                                value.indexOf(check) === 0 :
4120
                                type === "$=" ?
4121
                                value.substr(value.length - check.length) === check :
4122
                                type === "|=" ?
4123
                                value === check || value.substr(0, check.length + 1) === check + "-" :
4124
                                false;
4125
                },
4126

    
4127
                POS: function( elem, match, i, array ) {
4128
                        var name = match[2],
4129
                                filter = Expr.setFilters[ name ];
4130

    
4131
                        if ( filter ) {
4132
                                return filter( elem, i, match, array );
4133
                        }
4134
                }
4135
        }
4136
};
4137

    
4138
var origPOS = Expr.match.POS,
4139
        fescape = function(all, num){
4140
                return "\\" + (num - 0 + 1);
4141
        };
4142

    
4143
for ( var type in Expr.match ) {
4144
        Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
4145
        Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
4146
}
4147

    
4148
var makeArray = function( array, results ) {
4149
        array = Array.prototype.slice.call( array, 0 );
4150

    
4151
        if ( results ) {
4152
                results.push.apply( results, array );
4153
                return results;
4154
        }
4155
        
4156
        return array;
4157
};
4158

    
4159
// Perform a simple check to determine if the browser is capable of
4160
// converting a NodeList to an array using builtin methods.
4161
// Also verifies that the returned array holds DOM nodes
4162
// (which is not the case in the Blackberry browser)
4163
try {
4164
        Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
4165

    
4166
// Provide a fallback method if it does not work
4167
} catch( e ) {
4168
        makeArray = function( array, results ) {
4169
                var i = 0,
4170
                        ret = results || [];
4171

    
4172
                if ( toString.call(array) === "[object Array]" ) {
4173
                        Array.prototype.push.apply( ret, array );
4174

    
4175
                } else {
4176
                        if ( typeof array.length === "number" ) {
4177
                                for ( var l = array.length; i < l; i++ ) {
4178
                                        ret.push( array[i] );
4179
                                }
4180

    
4181
                        } else {
4182
                                for ( ; array[i]; i++ ) {
4183
                                        ret.push( array[i] );
4184
                                }
4185
                        }
4186
                }
4187

    
4188
                return ret;
4189
        };
4190
}
4191

    
4192
var sortOrder, siblingCheck;
4193

    
4194
if ( document.documentElement.compareDocumentPosition ) {
4195
        sortOrder = function( a, b ) {
4196
                if ( a === b ) {
4197
                        hasDuplicate = true;
4198
                        return 0;
4199
                }
4200

    
4201
                if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
4202
                        return a.compareDocumentPosition ? -1 : 1;
4203
                }
4204

    
4205
                return a.compareDocumentPosition(b) & 4 ? -1 : 1;
4206
        };
4207

    
4208
} else {
4209
        sortOrder = function( a, b ) {
4210
                var al, bl,
4211
                        ap = [],
4212
                        bp = [],
4213
                        aup = a.parentNode,
4214
                        bup = b.parentNode,
4215
                        cur = aup;
4216

    
4217
                // The nodes are identical, we can exit early
4218
                if ( a === b ) {
4219
                        hasDuplicate = true;
4220
                        return 0;
4221

    
4222
                // If the nodes are siblings (or identical) we can do a quick check
4223
                } else if ( aup === bup ) {
4224
                        return siblingCheck( a, b );
4225

    
4226
                // If no parents were found then the nodes are disconnected
4227
                } else if ( !aup ) {
4228
                        return -1;
4229

    
4230
                } else if ( !bup ) {
4231
                        return 1;
4232
                }
4233

    
4234
                // Otherwise they're somewhere else in the tree so we need
4235
                // to build up a full list of the parentNodes for comparison
4236
                while ( cur ) {
4237
                        ap.unshift( cur );
4238
                        cur = cur.parentNode;
4239
                }
4240

    
4241
                cur = bup;
4242

    
4243
                while ( cur ) {
4244
                        bp.unshift( cur );
4245
                        cur = cur.parentNode;
4246
                }
4247

    
4248
                al = ap.length;
4249
                bl = bp.length;
4250

    
4251
                // Start walking down the tree looking for a discrepancy
4252
                for ( var i = 0; i < al && i < bl; i++ ) {
4253
                        if ( ap[i] !== bp[i] ) {
4254
                                return siblingCheck( ap[i], bp[i] );
4255
                        }
4256
                }
4257

    
4258
                // We ended someplace up the tree so do a sibling check
4259
                return i === al ?
4260
                        siblingCheck( a, bp[i], -1 ) :
4261
                        siblingCheck( ap[i], b, 1 );
4262
        };
4263

    
4264
        siblingCheck = function( a, b, ret ) {
4265
                if ( a === b ) {
4266
                        return ret;
4267
                }
4268

    
4269
                var cur = a.nextSibling;
4270

    
4271
                while ( cur ) {
4272
                        if ( cur === b ) {
4273
                                return -1;
4274
                        }
4275

    
4276
                        cur = cur.nextSibling;
4277
                }
4278

    
4279
                return 1;
4280
        };
4281
}
4282

    
4283
// Utility function for retreiving the text value of an array of DOM nodes
4284
Sizzle.getText = function( elems ) {
4285
        var ret = "", elem;
4286

    
4287
        for ( var i = 0; elems[i]; i++ ) {
4288
                elem = elems[i];
4289

    
4290
                // Get the text from text nodes and CDATA nodes
4291
                if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
4292
                        ret += elem.nodeValue;
4293

    
4294
                // Traverse everything else, except comment nodes
4295
                } else if ( elem.nodeType !== 8 ) {
4296
                        ret += Sizzle.getText( elem.childNodes );
4297
                }
4298
        }
4299

    
4300
        return ret;
4301
};
4302

    
4303
// Check to see if the browser returns elements by name when
4304
// querying by getElementById (and provide a workaround)
4305
(function(){
4306
        // We're going to inject a fake input element with a specified name
4307
        var form = document.createElement("div"),
4308
                id = "script" + (new Date()).getTime(),
4309
                root = document.documentElement;
4310

    
4311
        form.innerHTML = "<a name='" + id + "'/>";
4312

    
4313
        // Inject it into the root element, check its status, and remove it quickly
4314
        root.insertBefore( form, root.firstChild );
4315

    
4316
        // The workaround has to do additional checks after a getElementById
4317
        // Which slows things down for other browsers (hence the branching)
4318
        if ( document.getElementById( id ) ) {
4319
                Expr.find.ID = function( match, context, isXML ) {
4320
                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
4321
                                var m = context.getElementById(match[1]);
4322

    
4323
                                return m ?
4324
                                        m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
4325
                                                [m] :
4326
                                                undefined :
4327
                                        [];
4328
                        }
4329
                };
4330

    
4331
                Expr.filter.ID = function( elem, match ) {
4332
                        var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
4333

    
4334
                        return elem.nodeType === 1 && node && node.nodeValue === match;
4335
                };
4336
        }
4337

    
4338
        root.removeChild( form );
4339

    
4340
        // release memory in IE
4341
        root = form = null;
4342
})();
4343

    
4344
(function(){
4345
        // Check to see if the browser returns only elements
4346
        // when doing getElementsByTagName("*")
4347

    
4348
        // Create a fake element
4349
        var div = document.createElement("div");
4350
        div.appendChild( document.createComment("") );
4351

    
4352
        // Make sure no comments are found
4353
        if ( div.getElementsByTagName("*").length > 0 ) {
4354
                Expr.find.TAG = function( match, context ) {
4355
                        var results = context.getElementsByTagName( match[1] );
4356

    
4357
                        // Filter out possible comments
4358
                        if ( match[1] === "*" ) {
4359
                                var tmp = [];
4360

    
4361
                                for ( var i = 0; results[i]; i++ ) {
4362
                                        if ( results[i].nodeType === 1 ) {
4363
                                                tmp.push( results[i] );
4364
                                        }
4365
                                }
4366

    
4367
                                results = tmp;
4368
                        }
4369

    
4370
                        return results;
4371
                };
4372
        }
4373

    
4374
        // Check to see if an attribute returns normalized href attributes
4375
        div.innerHTML = "<a href='#'></a>";
4376

    
4377
        if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
4378
                        div.firstChild.getAttribute("href") !== "#" ) {
4379

    
4380
                Expr.attrHandle.href = function( elem ) {
4381
                        return elem.getAttribute( "href", 2 );
4382
                };
4383
        }
4384

    
4385
        // release memory in IE
4386
        div = null;
4387
})();
4388

    
4389
if ( document.querySelectorAll ) {
4390
        (function(){
4391
                var oldSizzle = Sizzle,
4392
                        div = document.createElement("div"),
4393
                        id = "__sizzle__";
4394

    
4395
                div.innerHTML = "<p class='TEST'></p>";
4396

    
4397
                // Safari can't handle uppercase or unicode characters when
4398
                // in quirks mode.
4399
                if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
4400
                        return;
4401
                }
4402
        
4403
                Sizzle = function( query, context, extra, seed ) {
4404
                        context = context || document;
4405

    
4406
                        // Only use querySelectorAll on non-XML documents
4407
                        // (ID selectors don't work in non-HTML documents)
4408
                        if ( !seed && !Sizzle.isXML(context) ) {
4409
                                // See if we find a selector to speed up
4410
                                var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
4411
                                
4412
                                if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
4413
                                        // Speed-up: Sizzle("TAG")
4414
                                        if ( match[1] ) {
4415
                                                return makeArray( context.getElementsByTagName( query ), extra );
4416
                                        
4417
                                        // Speed-up: Sizzle(".CLASS")
4418
                                        } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
4419
                                                return makeArray( context.getElementsByClassName( match[2] ), extra );
4420
                                        }
4421
                                }
4422
                                
4423
                                if ( context.nodeType === 9 ) {
4424
                                        // Speed-up: Sizzle("body")
4425
                                        // The body element only exists once, optimize finding it
4426
                                        if ( query === "body" && context.body ) {
4427
                                                return makeArray( [ context.body ], extra );
4428
                                                
4429
                                        // Speed-up: Sizzle("#ID")
4430
                                        } else if ( match && match[3] ) {
4431
                                                var elem = context.getElementById( match[3] );
4432

    
4433
                                                // Check parentNode to catch when Blackberry 4.6 returns
4434
                                                // nodes that are no longer in the document #6963
4435
                                                if ( elem && elem.parentNode ) {
4436
                                                        // Handle the case where IE and Opera return items
4437
                                                        // by name instead of ID
4438
                                                        if ( elem.id === match[3] ) {
4439
                                                                return makeArray( [ elem ], extra );
4440
                                                        }
4441
                                                        
4442
                                                } else {
4443
                                                        return makeArray( [], extra );
4444
                                                }
4445
                                        }
4446
                                        
4447
                                        try {
4448
                                                return makeArray( context.querySelectorAll(query), extra );
4449
                                        } catch(qsaError) {}
4450

    
4451
                                // qSA works strangely on Element-rooted queries
4452
                                // We can work around this by specifying an extra ID on the root
4453
                                // and working up from there (Thanks to Andrew Dupont for the technique)
4454
                                // IE 8 doesn't work on object elements
4455
                                } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
4456
                                        var oldContext = context,
4457
                                                old = context.getAttribute( "id" ),
4458
                                                nid = old || id,
4459
                                                hasParent = context.parentNode,
4460
                                                relativeHierarchySelector = /^\s*[+~]/.test( query );
4461

    
4462
                                        if ( !old ) {
4463
                                                context.setAttribute( "id", nid );
4464
                                        } else {
4465
                                                nid = nid.replace( /'/g, "\\$&" );
4466
                                        }
4467
                                        if ( relativeHierarchySelector && hasParent ) {
4468
                                                context = context.parentNode;
4469
                                        }
4470

    
4471
                                        try {
4472
                                                if ( !relativeHierarchySelector || hasParent ) {
4473
                                                        return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
4474
                                                }
4475

    
4476
                                        } catch(pseudoError) {
4477
                                        } finally {
4478
                                                if ( !old ) {
4479
                                                        oldContext.removeAttribute( "id" );
4480
                                                }
4481
                                        }
4482
                                }
4483
                        }
4484
                
4485
                        return oldSizzle(query, context, extra, seed);
4486
                };
4487

    
4488
                for ( var prop in oldSizzle ) {
4489
                        Sizzle[ prop ] = oldSizzle[ prop ];
4490
                }
4491

    
4492
                // release memory in IE
4493
                div = null;
4494
        })();
4495
}
4496

    
4497
(function(){
4498
        var html = document.documentElement,
4499
                matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector,
4500
                pseudoWorks = false;
4501

    
4502
        try {
4503
                // This should fail with an exception
4504
                // Gecko does not error, returns false instead
4505
                matches.call( document.documentElement, "[test!='']:sizzle" );
4506
        
4507
        } catch( pseudoError ) {
4508
                pseudoWorks = true;
4509
        }
4510

    
4511
        if ( matches ) {
4512
                Sizzle.matchesSelector = function( node, expr ) {
4513
                        // Make sure that attribute selectors are quoted
4514
                        expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
4515

    
4516
                        if ( !Sizzle.isXML( node ) ) {
4517
                                try { 
4518
                                        if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
4519
                                                return matches.call( node, expr );
4520
                                        }
4521
                                } catch(e) {}
4522
                        }
4523

    
4524
                        return Sizzle(expr, null, null, [node]).length > 0;
4525
                };
4526
        }
4527
})();
4528

    
4529
(function(){
4530
        var div = document.createElement("div");
4531

    
4532
        div.innerHTML = "<div class='test e'></div><div class='test'></div>";
4533

    
4534
        // Opera can't find a second classname (in 9.6)
4535
        // Also, make sure that getElementsByClassName actually exists
4536
        if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
4537
                return;
4538
        }
4539

    
4540
        // Safari caches class attributes, doesn't catch changes (in 3.2)
4541
        div.lastChild.className = "e";
4542

    
4543
        if ( div.getElementsByClassName("e").length === 1 ) {
4544
                return;
4545
        }
4546
        
4547
        Expr.order.splice(1, 0, "CLASS");
4548
        Expr.find.CLASS = function( match, context, isXML ) {
4549
                if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
4550
                        return context.getElementsByClassName(match[1]);
4551
                }
4552
        };
4553

    
4554
        // release memory in IE
4555
        div = null;
4556
})();
4557

    
4558
function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
4559
        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
4560
                var elem = checkSet[i];
4561

    
4562
                if ( elem ) {
4563
                        var match = false;
4564

    
4565
                        elem = elem[dir];
4566

    
4567
                        while ( elem ) {
4568
                                if ( elem.sizcache === doneName ) {
4569
                                        match = checkSet[elem.sizset];
4570
                                        break;
4571
                                }
4572

    
4573
                                if ( elem.nodeType === 1 && !isXML ){
4574
                                        elem.sizcache = doneName;
4575
                                        elem.sizset = i;
4576
                                }
4577

    
4578
                                if ( elem.nodeName.toLowerCase() === cur ) {
4579
                                        match = elem;
4580
                                        break;
4581
                                }
4582

    
4583
                                elem = elem[dir];
4584
                        }
4585

    
4586
                        checkSet[i] = match;
4587
                }
4588
        }
4589
}
4590

    
4591
function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
4592
        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
4593
                var elem = checkSet[i];
4594

    
4595
                if ( elem ) {
4596
                        var match = false;
4597
                        
4598
                        elem = elem[dir];
4599

    
4600
                        while ( elem ) {
4601
                                if ( elem.sizcache === doneName ) {
4602
                                        match = checkSet[elem.sizset];
4603
                                        break;
4604
                                }
4605

    
4606
                                if ( elem.nodeType === 1 ) {
4607
                                        if ( !isXML ) {
4608
                                                elem.sizcache = doneName;
4609
                                                elem.sizset = i;
4610
                                        }
4611

    
4612
                                        if ( typeof cur !== "string" ) {
4613
                                                if ( elem === cur ) {
4614
                                                        match = true;
4615
                                                        break;
4616
                                                }
4617

    
4618
                                        } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
4619
                                                match = elem;
4620
                                                break;
4621
                                        }
4622
                                }
4623

    
4624
                                elem = elem[dir];
4625
                        }
4626

    
4627
                        checkSet[i] = match;
4628
                }
4629
        }
4630
}
4631

    
4632
if ( document.documentElement.contains ) {
4633
        Sizzle.contains = function( a, b ) {
4634
                return a !== b && (a.contains ? a.contains(b) : true);
4635
        };
4636

    
4637
} else if ( document.documentElement.compareDocumentPosition ) {
4638
        Sizzle.contains = function( a, b ) {
4639
                return !!(a.compareDocumentPosition(b) & 16);
4640
        };
4641

    
4642
} else {
4643
        Sizzle.contains = function() {
4644
                return false;
4645
        };
4646
}
4647

    
4648
Sizzle.isXML = function( elem ) {
4649
        // documentElement is verified for cases where it doesn't yet exist
4650
        // (such as loading iframes in IE - #4833) 
4651
        var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
4652

    
4653
        return documentElement ? documentElement.nodeName !== "HTML" : false;
4654
};
4655

    
4656
var posProcess = function( selector, context ) {
4657
        var match,
4658
                tmpSet = [],
4659
                later = "",
4660
                root = context.nodeType ? [context] : context;
4661

    
4662
        // Position selectors must be done after the filter
4663
        // And so must :not(positional) so we move all PSEUDOs to the end
4664
        while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
4665
                later += match[0];
4666
                selector = selector.replace( Expr.match.PSEUDO, "" );
4667
        }
4668

    
4669
        selector = Expr.relative[selector] ? selector + "*" : selector;
4670

    
4671
        for ( var i = 0, l = root.length; i < l; i++ ) {
4672
                Sizzle( selector, root[i], tmpSet );
4673
        }
4674

    
4675
        return Sizzle.filter( later, tmpSet );
4676
};
4677

    
4678
// EXPOSE
4679
jQuery.find = Sizzle;
4680
jQuery.expr = Sizzle.selectors;
4681
jQuery.expr[":"] = jQuery.expr.filters;
4682
jQuery.unique = Sizzle.uniqueSort;
4683
jQuery.text = Sizzle.getText;
4684
jQuery.isXMLDoc = Sizzle.isXML;
4685
jQuery.contains = Sizzle.contains;
4686

    
4687

    
4688
})();
4689

    
4690

    
4691
var runtil = /Until$/,
4692
        rparentsprev = /^(?:parents|prevUntil|prevAll)/,
4693
        // Note: This RegExp should be improved, or likely pulled from Sizzle
4694
        rmultiselector = /,/,
4695
        isSimple = /^.[^:#\[\.,]*$/,
4696
        slice = Array.prototype.slice,
4697
        POS = jQuery.expr.match.POS,
4698
        // methods guaranteed to produce a unique set when starting from a unique set
4699
        guaranteedUnique = {
4700
                children: true,
4701
                contents: true,
4702
                next: true,
4703
                prev: true
4704
        };
4705

    
4706
jQuery.fn.extend({
4707
        find: function( selector ) {
4708
                var ret = this.pushStack( "", "find", selector ),
4709
                        length = 0;
4710

    
4711
                for ( var i = 0, l = this.length; i < l; i++ ) {
4712
                        length = ret.length;
4713
                        jQuery.find( selector, this[i], ret );
4714

    
4715
                        if ( i > 0 ) {
4716
                                // Make sure that the results are unique
4717
                                for ( var n = length; n < ret.length; n++ ) {
4718
                                        for ( var r = 0; r < length; r++ ) {
4719
                                                if ( ret[r] === ret[n] ) {
4720
                                                        ret.splice(n--, 1);
4721
                                                        break;
4722
                                                }
4723
                                        }
4724
                                }
4725
                        }
4726
                }
4727

    
4728
                return ret;
4729
        },
4730

    
4731
        has: function( target ) {
4732
                var targets = jQuery( target );
4733
                return this.filter(function() {
4734
                        for ( var i = 0, l = targets.length; i < l; i++ ) {
4735
                                if ( jQuery.contains( this, targets[i] ) ) {
4736
                                        return true;
4737
                                }
4738
                        }
4739
                });
4740
        },
4741

    
4742
        not: function( selector ) {
4743
                return this.pushStack( winnow(this, selector, false), "not", selector);
4744
        },
4745

    
4746
        filter: function( selector ) {
4747
                return this.pushStack( winnow(this, selector, true), "filter", selector );
4748
        },
4749

    
4750
        is: function( selector ) {
4751
                return !!selector && jQuery.filter( selector, this ).length > 0;
4752
        },
4753

    
4754
        closest: function( selectors, context ) {
4755
                var ret = [], i, l, cur = this[0];
4756

    
4757
                if ( jQuery.isArray( selectors ) ) {
4758
                        var match, selector,
4759
                                matches = {},
4760
                                level = 1;
4761

    
4762
                        if ( cur && selectors.length ) {
4763
                                for ( i = 0, l = selectors.length; i < l; i++ ) {
4764
                                        selector = selectors[i];
4765

    
4766
                                        if ( !matches[selector] ) {
4767
                                                matches[selector] = jQuery.expr.match.POS.test( selector ) ?
4768
                                                        jQuery( selector, context || this.context ) :
4769
                                                        selector;
4770
                                        }
4771
                                }
4772

    
4773
                                while ( cur && cur.ownerDocument && cur !== context ) {
4774
                                        for ( selector in matches ) {
4775
                                                match = matches[selector];
4776

    
4777
                                                if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
4778
                                                        ret.push({ selector: selector, elem: cur, level: level });
4779
                                                }
4780
                                        }
4781

    
4782
                                        cur = cur.parentNode;
4783
                                        level++;
4784
                                }
4785
                        }
4786

    
4787
                        return ret;
4788
                }
4789

    
4790
                var pos = POS.test( selectors ) ?
4791
                        jQuery( selectors, context || this.context ) : null;
4792

    
4793
                for ( i = 0, l = this.length; i < l; i++ ) {
4794
                        cur = this[i];
4795

    
4796
                        while ( cur ) {
4797
                                if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
4798
                                        ret.push( cur );
4799
                                        break;
4800

    
4801
                                } else {
4802
                                        cur = cur.parentNode;
4803
                                        if ( !cur || !cur.ownerDocument || cur === context ) {
4804
                                                break;
4805
                                        }
4806
                                }
4807
                        }
4808
                }
4809

    
4810
                ret = ret.length > 1 ? jQuery.unique(ret) : ret;
4811

    
4812
                return this.pushStack( ret, "closest", selectors );
4813
        },
4814

    
4815
        // Determine the position of an element within
4816
        // the matched set of elements
4817
        index: function( elem ) {
4818
                if ( !elem || typeof elem === "string" ) {
4819
                        return jQuery.inArray( this[0],
4820
                                // If it receives a string, the selector is used
4821
                                // If it receives nothing, the siblings are used
4822
                                elem ? jQuery( elem ) : this.parent().children() );
4823
                }
4824
                // Locate the position of the desired element
4825
                return jQuery.inArray(
4826
                        // If it receives a jQuery object, the first element is used
4827
                        elem.jquery ? elem[0] : elem, this );
4828
        },
4829

    
4830
        add: function( selector, context ) {
4831
                var set = typeof selector === "string" ?
4832
                                jQuery( selector, context ) :
4833
                                jQuery.makeArray( selector ),
4834
                        all = jQuery.merge( this.get(), set );
4835

    
4836
                return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
4837
                        all :
4838
                        jQuery.unique( all ) );
4839
        },
4840

    
4841
        andSelf: function() {
4842
                return this.add( this.prevObject );
4843
        }
4844
});
4845

    
4846
// A painfully simple check to see if an element is disconnected
4847
// from a document (should be improved, where feasible).
4848
function isDisconnected( node ) {
4849
        return !node || !node.parentNode || node.parentNode.nodeType === 11;
4850
}
4851

    
4852
jQuery.each({
4853
        parent: function( elem ) {
4854
                var parent = elem.parentNode;
4855
                return parent && parent.nodeType !== 11 ? parent : null;
4856
        },
4857
        parents: function( elem ) {
4858
                return jQuery.dir( elem, "parentNode" );
4859
        },
4860
        parentsUntil: function( elem, i, until ) {
4861
                return jQuery.dir( elem, "parentNode", until );
4862
        },
4863
        next: function( elem ) {
4864
                return jQuery.nth( elem, 2, "nextSibling" );
4865
        },
4866
        prev: function( elem ) {
4867
                return jQuery.nth( elem, 2, "previousSibling" );
4868
        },
4869
        nextAll: function( elem ) {
4870
                return jQuery.dir( elem, "nextSibling" );
4871
        },
4872
        prevAll: function( elem ) {
4873
                return jQuery.dir( elem, "previousSibling" );
4874
        },
4875
        nextUntil: function( elem, i, until ) {
4876
                return jQuery.dir( elem, "nextSibling", until );
4877
        },
4878
        prevUntil: function( elem, i, until ) {
4879
                return jQuery.dir( elem, "previousSibling", until );
4880
        },
4881
        siblings: function( elem ) {
4882
                return jQuery.sibling( elem.parentNode.firstChild, elem );
4883
        },
4884
        children: function( elem ) {
4885
                return jQuery.sibling( elem.firstChild );
4886
        },
4887
        contents: function( elem ) {
4888
                return jQuery.nodeName( elem, "iframe" ) ?
4889
                        elem.contentDocument || elem.contentWindow.document :
4890
                        jQuery.makeArray( elem.childNodes );
4891
        }
4892
}, function( name, fn ) {
4893
        jQuery.fn[ name ] = function( until, selector ) {
4894
                var ret = jQuery.map( this, fn, until ),
4895
                        // The variable 'args' was introduced in
4896
                        // https://github.com/jquery/jquery/commit/52a0238
4897
                        // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
4898
                        // http://code.google.com/p/v8/issues/detail?id=1050
4899
                        args = slice.call(arguments);
4900

    
4901
                if ( !runtil.test( name ) ) {
4902
                        selector = until;
4903
                }
4904

    
4905
                if ( selector && typeof selector === "string" ) {
4906
                        ret = jQuery.filter( selector, ret );
4907
                }
4908

    
4909
                ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
4910

    
4911
                if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
4912
                        ret = ret.reverse();
4913
                }
4914

    
4915
                return this.pushStack( ret, name, args.join(",") );
4916
        };
4917
});
4918

    
4919
jQuery.extend({
4920
        filter: function( expr, elems, not ) {
4921
                if ( not ) {
4922
                        expr = ":not(" + expr + ")";
4923
                }
4924

    
4925
                return elems.length === 1 ?
4926
                        jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
4927
                        jQuery.find.matches(expr, elems);
4928
        },
4929

    
4930
        dir: function( elem, dir, until ) {
4931
                var matched = [],
4932
                        cur = elem[ dir ];
4933

    
4934
                while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
4935
                        if ( cur.nodeType === 1 ) {
4936
                                matched.push( cur );
4937
                        }
4938
                        cur = cur[dir];
4939
                }
4940
                return matched;
4941
        },
4942

    
4943
        nth: function( cur, result, dir, elem ) {
4944
                result = result || 1;
4945
                var num = 0;
4946

    
4947
                for ( ; cur; cur = cur[dir] ) {
4948
                        if ( cur.nodeType === 1 && ++num === result ) {
4949
                                break;
4950
                        }
4951
                }
4952

    
4953
                return cur;
4954
        },
4955

    
4956
        sibling: function( n, elem ) {
4957
                var r = [];
4958

    
4959
                for ( ; n; n = n.nextSibling ) {
4960
                        if ( n.nodeType === 1 && n !== elem ) {
4961
                                r.push( n );
4962
                        }
4963
                }
4964

    
4965
                return r;
4966
        }
4967
});
4968

    
4969
// Implement the identical functionality for filter and not
4970
function winnow( elements, qualifier, keep ) {
4971
        if ( jQuery.isFunction( qualifier ) ) {
4972
                return jQuery.grep(elements, function( elem, i ) {
4973
                        var retVal = !!qualifier.call( elem, i, elem );
4974
                        return retVal === keep;
4975
                });
4976

    
4977
        } else if ( qualifier.nodeType ) {
4978
                return jQuery.grep(elements, function( elem, i ) {
4979
                        return (elem === qualifier) === keep;
4980
                });
4981

    
4982
        } else if ( typeof qualifier === "string" ) {
4983
                var filtered = jQuery.grep(elements, function( elem ) {
4984
                        return elem.nodeType === 1;
4985
                });
4986

    
4987
                if ( isSimple.test( qualifier ) ) {
4988
                        return jQuery.filter(qualifier, filtered, !keep);
4989
                } else {
4990
                        qualifier = jQuery.filter( qualifier, filtered );
4991
                }
4992
        }
4993

    
4994
        return jQuery.grep(elements, function( elem, i ) {
4995
                return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
4996
        });
4997
}
4998

    
4999

    
5000

    
5001

    
5002
var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
5003
        rleadingWhitespace = /^\s+/,
5004
        rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
5005
        rtagName = /<([\w:]+)/,
5006
        rtbody = /<tbody/i,
5007
        rhtml = /<|&#?\w+;/,
5008
        rnocache = /<(?:script|object|embed|option|style)/i,
5009
        // checked="checked" or checked
5010
        rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5011
        wrapMap = {
5012
                option: [ 1, "<select multiple='multiple'>", "</select>" ],
5013
                legend: [ 1, "<fieldset>", "</fieldset>" ],
5014
                thead: [ 1, "<table>", "</table>" ],
5015
                tr: [ 2, "<table><tbody>", "</tbody></table>" ],
5016
                td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
5017
                col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
5018
                area: [ 1, "<map>", "</map>" ],
5019
                _default: [ 0, "", "" ]
5020
        };
5021

    
5022
wrapMap.optgroup = wrapMap.option;
5023
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
5024
wrapMap.th = wrapMap.td;
5025

    
5026
// IE can't serialize <link> and <script> tags normally
5027
if ( !jQuery.support.htmlSerialize ) {
5028
        wrapMap._default = [ 1, "div<div>", "</div>" ];
5029
}
5030

    
5031
jQuery.fn.extend({
5032
        text: function( text ) {
5033
                if ( jQuery.isFunction(text) ) {
5034
                        return this.each(function(i) {
5035
                                var self = jQuery( this );
5036

    
5037
                                self.text( text.call(this, i, self.text()) );
5038
                        });
5039
                }
5040

    
5041
                if ( typeof text !== "object" && text !== undefined ) {
5042
                        return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
5043
                }
5044

    
5045
                return jQuery.text( this );
5046
        },
5047

    
5048
        wrapAll: function( html ) {
5049
                if ( jQuery.isFunction( html ) ) {
5050
                        return this.each(function(i) {
5051
                                jQuery(this).wrapAll( html.call(this, i) );
5052
                        });
5053
                }
5054

    
5055
                if ( this[0] ) {
5056
                        // The elements to wrap the target around
5057
                        var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
5058

    
5059
                        if ( this[0].parentNode ) {
5060
                                wrap.insertBefore( this[0] );
5061
                        }
5062

    
5063
                        wrap.map(function() {
5064
                                var elem = this;
5065

    
5066
                                while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
5067
                                        elem = elem.firstChild;
5068
                                }
5069

    
5070
                                return elem;
5071
                        }).append(this);
5072
                }
5073

    
5074
                return this;
5075
        },
5076

    
5077
        wrapInner: function( html ) {
5078
                if ( jQuery.isFunction( html ) ) {
5079
                        return this.each(function(i) {
5080
                                jQuery(this).wrapInner( html.call(this, i) );
5081
                        });
5082
                }
5083

    
5084
                return this.each(function() {
5085
                        var self = jQuery( this ),
5086
                                contents = self.contents();
5087

    
5088
                        if ( contents.length ) {
5089
                                contents.wrapAll( html );
5090

    
5091
                        } else {
5092
                                self.append( html );
5093
                        }
5094
                });
5095
        },
5096

    
5097
        wrap: function( html ) {
5098
                return this.each(function() {
5099
                        jQuery( this ).wrapAll( html );
5100
                });
5101
        },
5102

    
5103
        unwrap: function() {
5104
                return this.parent().each(function() {
5105
                        if ( !jQuery.nodeName( this, "body" ) ) {
5106
                                jQuery( this ).replaceWith( this.childNodes );
5107
                        }
5108
                }).end();
5109
        },
5110

    
5111
        append: function() {
5112
                return this.domManip(arguments, true, function( elem ) {
5113
                        if ( this.nodeType === 1 ) {
5114
                                this.appendChild( elem );
5115
                        }
5116
                });
5117
        },
5118

    
5119
        prepend: function() {
5120
                return this.domManip(arguments, true, function( elem ) {
5121
                        if ( this.nodeType === 1 ) {
5122
                                this.insertBefore( elem, this.firstChild );
5123
                        }
5124
                });
5125
        },
5126

    
5127
        before: function() {
5128
                if ( this[0] && this[0].parentNode ) {
5129
                        return this.domManip(arguments, false, function( elem ) {
5130
                                this.parentNode.insertBefore( elem, this );
5131
                        });
5132
                } else if ( arguments.length ) {
5133
                        var set = jQuery(arguments[0]);
5134
                        set.push.apply( set, this.toArray() );
5135
                        return this.pushStack( set, "before", arguments );
5136
                }
5137
        },
5138

    
5139
        after: function() {
5140
                if ( this[0] && this[0].parentNode ) {
5141
                        return this.domManip(arguments, false, function( elem ) {
5142
                                this.parentNode.insertBefore( elem, this.nextSibling );
5143
                        });
5144
                } else if ( arguments.length ) {
5145
                        var set = this.pushStack( this, "after", arguments );
5146
                        set.push.apply( set, jQuery(arguments[0]).toArray() );
5147
                        return set;
5148
                }
5149
        },
5150

    
5151
        // keepData is for internal use only--do not document
5152
        remove: function( selector, keepData ) {
5153
                for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
5154
                        if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
5155
                                if ( !keepData && elem.nodeType === 1 ) {
5156
                                        jQuery.cleanData( elem.getElementsByTagName("*") );
5157
                                        jQuery.cleanData( [ elem ] );
5158
                                }
5159

    
5160
                                if ( elem.parentNode ) {
5161
                                        elem.parentNode.removeChild( elem );
5162
                                }
5163
                        }
5164
                }
5165

    
5166
                return this;
5167
        },
5168

    
5169
        empty: function() {
5170
                for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
5171
                        // Remove element nodes and prevent memory leaks
5172
                        if ( elem.nodeType === 1 ) {
5173
                                jQuery.cleanData( elem.getElementsByTagName("*") );
5174
                        }
5175

    
5176
                        // Remove any remaining nodes
5177
                        while ( elem.firstChild ) {
5178
                                elem.removeChild( elem.firstChild );
5179
                        }
5180
                }
5181

    
5182
                return this;
5183
        },
5184

    
5185
        clone: function( dataAndEvents, deepDataAndEvents ) {
5186
                dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
5187
                deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
5188

    
5189
                return this.map( function () {
5190
                        return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
5191
                });
5192
        },
5193

    
5194
        html: function( value ) {
5195
                if ( value === undefined ) {
5196
                        return this[0] && this[0].nodeType === 1 ?
5197
                                this[0].innerHTML.replace(rinlinejQuery, "") :
5198
                                null;
5199

    
5200
                // See if we can take a shortcut and just use innerHTML
5201
                } else if ( typeof value === "string" && !rnocache.test( value ) &&
5202
                        (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
5203
                        !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
5204

    
5205
                        value = value.replace(rxhtmlTag, "<$1></$2>");
5206

    
5207
                        try {
5208
                                for ( var i = 0, l = this.length; i < l; i++ ) {
5209
                                        // Remove element nodes and prevent memory leaks
5210
                                        if ( this[i].nodeType === 1 ) {
5211
                                                jQuery.cleanData( this[i].getElementsByTagName("*") );
5212
                                                this[i].innerHTML = value;
5213
                                        }
5214
                                }
5215

    
5216
                        // If using innerHTML throws an exception, use the fallback method
5217
                        } catch(e) {
5218
                                this.empty().append( value );
5219
                        }
5220

    
5221
                } else if ( jQuery.isFunction( value ) ) {
5222
                        this.each(function(i){
5223
                                var self = jQuery( this );
5224

    
5225
                                self.html( value.call(this, i, self.html()) );
5226
                        });
5227

    
5228
                } else {
5229
                        this.empty().append( value );
5230
                }
5231

    
5232
                return this;
5233
        },
5234

    
5235
        replaceWith: function( value ) {
5236
                if ( this[0] && this[0].parentNode ) {
5237
                        // Make sure that the elements are removed from the DOM before they are inserted
5238
                        // this can help fix replacing a parent with child elements
5239
                        if ( jQuery.isFunction( value ) ) {
5240
                                return this.each(function(i) {
5241
                                        var self = jQuery(this), old = self.html();
5242
                                        self.replaceWith( value.call( this, i, old ) );
5243
                                });
5244
                        }
5245

    
5246
                        if ( typeof value !== "string" ) {
5247
                                value = jQuery( value ).detach();
5248
                        }
5249

    
5250
                        return this.each(function() {
5251
                                var next = this.nextSibling,
5252
                                        parent = this.parentNode;
5253

    
5254
                                jQuery( this ).remove();
5255

    
5256
                                if ( next ) {
5257
                                        jQuery(next).before( value );
5258
                                } else {
5259
                                        jQuery(parent).append( value );
5260
                                }
5261
                        });
5262
                } else {
5263
                        return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
5264
                }
5265
        },
5266

    
5267
        detach: function( selector ) {
5268
                return this.remove( selector, true );
5269
        },
5270

    
5271
        domManip: function( args, table, callback ) {
5272
                var results, first, fragment, parent,
5273
                        value = args[0],
5274
                        scripts = [];
5275

    
5276
                // We can't cloneNode fragments that contain checked, in WebKit
5277
                if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
5278
                        return this.each(function() {
5279
                                jQuery(this).domManip( args, table, callback, true );
5280
                        });
5281
                }
5282

    
5283
                if ( jQuery.isFunction(value) ) {
5284
                        return this.each(function(i) {
5285
                                var self = jQuery(this);
5286
                                args[0] = value.call(this, i, table ? self.html() : undefined);
5287
                                self.domManip( args, table, callback );
5288
                        });
5289
                }
5290

    
5291
                if ( this[0] ) {
5292
                        parent = value && value.parentNode;
5293

    
5294
                        // If we're in a fragment, just use that instead of building a new one
5295
                        if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
5296
                                results = { fragment: parent };
5297

    
5298
                        } else {
5299
                                results = jQuery.buildFragment( args, this, scripts );
5300
                        }
5301

    
5302
                        fragment = results.fragment;
5303

    
5304
                        if ( fragment.childNodes.length === 1 ) {
5305
                                first = fragment = fragment.firstChild;
5306
                        } else {
5307
                                first = fragment.firstChild;
5308
                        }
5309

    
5310
                        if ( first ) {
5311
                                table = table && jQuery.nodeName( first, "tr" );
5312

    
5313
                                for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
5314
                                        callback.call(
5315
                                                table ?
5316
                                                        root(this[i], first) :
5317
                                                        this[i],
5318
                                                // Make sure that we do not leak memory by inadvertently discarding
5319
                                                // the original fragment (which might have attached data) instead of
5320
                                                // using it; in addition, use the original fragment object for the last
5321
                                                // item instead of first because it can end up being emptied incorrectly
5322
                                                // in certain situations (Bug #8070).
5323
                                                // Fragments from the fragment cache must always be cloned and never used
5324
                                                // in place.
5325
                                                results.cacheable || (l > 1 && i < lastIndex) ?
5326
                                                        jQuery.clone( fragment, true, true ) :
5327
                                                        fragment
5328
                                        );
5329
                                }
5330
                        }
5331

    
5332
                        if ( scripts.length ) {
5333
                                jQuery.each( scripts, evalScript );
5334
                        }
5335
                }
5336

    
5337
                return this;
5338
        }
5339
});
5340

    
5341
function root( elem, cur ) {
5342
        return jQuery.nodeName(elem, "table") ?
5343
                (elem.getElementsByTagName("tbody")[0] ||
5344
                elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
5345
                elem;
5346
}
5347

    
5348
function cloneCopyEvent( src, dest ) {
5349

    
5350
        if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
5351
                return;
5352
        }
5353

    
5354
        var internalKey = jQuery.expando,
5355
                oldData = jQuery.data( src ),
5356
                curData = jQuery.data( dest, oldData );
5357

    
5358
        // Switch to use the internal data object, if it exists, for the next
5359
        // stage of data copying
5360
        if ( (oldData = oldData[ internalKey ]) ) {
5361
                var events = oldData.events;
5362
                                curData = curData[ internalKey ] = jQuery.extend({}, oldData);
5363

    
5364
                if ( events ) {
5365
                        delete curData.handle;
5366
                        curData.events = {};
5367

    
5368
                        for ( var type in events ) {
5369
                                for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
5370
                                        jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
5371
                                }
5372
                        }
5373
                }
5374
        }
5375
}
5376

    
5377
function cloneFixAttributes(src, dest) {
5378
        // We do not need to do anything for non-Elements
5379
        if ( dest.nodeType !== 1 ) {
5380
                return;
5381
        }
5382

    
5383
        var nodeName = dest.nodeName.toLowerCase();
5384

    
5385
        // clearAttributes removes the attributes, which we don't want,
5386
        // but also removes the attachEvent events, which we *do* want
5387
        dest.clearAttributes();
5388

    
5389
        // mergeAttributes, in contrast, only merges back on the
5390
        // original attributes, not the events
5391
        dest.mergeAttributes(src);
5392

    
5393
        // IE6-8 fail to clone children inside object elements that use
5394
        // the proprietary classid attribute value (rather than the type
5395
        // attribute) to identify the type of content to display
5396
        if ( nodeName === "object" ) {
5397
                dest.outerHTML = src.outerHTML;
5398

    
5399
        } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
5400
                // IE6-8 fails to persist the checked state of a cloned checkbox
5401
                // or radio button. Worse, IE6-7 fail to give the cloned element
5402
                // a checked appearance if the defaultChecked value isn't also set
5403
                if ( src.checked ) {
5404
                        dest.defaultChecked = dest.checked = src.checked;
5405
                }
5406

    
5407
                // IE6-7 get confused and end up setting the value of a cloned
5408
                // checkbox/radio button to an empty string instead of "on"
5409
                if ( dest.value !== src.value ) {
5410
                        dest.value = src.value;
5411
                }
5412

    
5413
        // IE6-8 fails to return the selected option to the default selected
5414
        // state when cloning options
5415
        } else if ( nodeName === "option" ) {
5416
                dest.selected = src.defaultSelected;
5417

    
5418
        // IE6-8 fails to set the defaultValue to the correct value when
5419
        // cloning other types of input fields
5420
        } else if ( nodeName === "input" || nodeName === "textarea" ) {
5421
                dest.defaultValue = src.defaultValue;
5422
        }
5423

    
5424
        // Event data gets referenced instead of copied if the expando
5425
        // gets copied too
5426
        dest.removeAttribute( jQuery.expando );
5427
}
5428

    
5429
jQuery.buildFragment = function( args, nodes, scripts ) {
5430
        var fragment, cacheable, cacheresults,
5431
                doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
5432

    
5433
        // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
5434
        // Cloning options loses the selected state, so don't cache them
5435
        // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
5436
        // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
5437
        if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
5438
                args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
5439

    
5440
                cacheable = true;
5441
                cacheresults = jQuery.fragments[ args[0] ];
5442
                if ( cacheresults ) {
5443
                        if ( cacheresults !== 1 ) {
5444
                                fragment = cacheresults;
5445
                        }
5446
                }
5447
        }
5448

    
5449
        if ( !fragment ) {
5450
                fragment = doc.createDocumentFragment();
5451
                jQuery.clean( args, doc, fragment, scripts );
5452
        }
5453

    
5454
        if ( cacheable ) {
5455
                jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
5456
        }
5457

    
5458
        return { fragment: fragment, cacheable: cacheable };
5459
};
5460

    
5461
jQuery.fragments = {};
5462

    
5463
jQuery.each({
5464
        appendTo: "append",
5465
        prependTo: "prepend",
5466
        insertBefore: "before",
5467
        insertAfter: "after",
5468
        replaceAll: "replaceWith"
5469
}, function( name, original ) {
5470
        jQuery.fn[ name ] = function( selector ) {
5471
                var ret = [],
5472
                        insert = jQuery( selector ),
5473
                        parent = this.length === 1 && this[0].parentNode;
5474

    
5475
                if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
5476
                        insert[ original ]( this[0] );
5477
                        return this;
5478

    
5479
                } else {
5480
                        for ( var i = 0, l = insert.length; i < l; i++ ) {
5481
                                var elems = (i > 0 ? this.clone(true) : this).get();
5482
                                jQuery( insert[i] )[ original ]( elems );
5483
                                ret = ret.concat( elems );
5484
                        }
5485

    
5486
                        return this.pushStack( ret, name, insert.selector );
5487
                }
5488
        };
5489
});
5490

    
5491
function getAll( elem ) {
5492
        if ( "getElementsByTagName" in elem ) {
5493
                return elem.getElementsByTagName( "*" );
5494
        
5495
        } else if ( "querySelectorAll" in elem ) {
5496
                return elem.querySelectorAll( "*" );
5497

    
5498
        } else {
5499
                return [];
5500
        }
5501
}
5502

    
5503
jQuery.extend({
5504
        clone: function( elem, dataAndEvents, deepDataAndEvents ) {
5505
                var clone = elem.cloneNode(true),
5506
                                srcElements,
5507
                                destElements,
5508
                                i;
5509

    
5510
                if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
5511
                                (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
5512
                        // IE copies events bound via attachEvent when using cloneNode.
5513
                        // Calling detachEvent on the clone will also remove the events
5514
                        // from the original. In order to get around this, we use some
5515
                        // proprietary methods to clear the events. Thanks to MooTools
5516
                        // guys for this hotness.
5517

    
5518
                        cloneFixAttributes( elem, clone );
5519

    
5520
                        // Using Sizzle here is crazy slow, so we use getElementsByTagName
5521
                        // instead
5522
                        srcElements = getAll( elem );
5523
                        destElements = getAll( clone );
5524

    
5525
                        // Weird iteration because IE will replace the length property
5526
                        // with an element if you are cloning the body and one of the
5527
                        // elements on the page has a name or id of "length"
5528
                        for ( i = 0; srcElements[i]; ++i ) {
5529
                                cloneFixAttributes( srcElements[i], destElements[i] );
5530
                        }
5531
                }
5532

    
5533
                // Copy the events from the original to the clone
5534
                if ( dataAndEvents ) {
5535
                        cloneCopyEvent( elem, clone );
5536

    
5537
                        if ( deepDataAndEvents ) {
5538
                                srcElements = getAll( elem );
5539
                                destElements = getAll( clone );
5540

    
5541
                                for ( i = 0; srcElements[i]; ++i ) {
5542
                                        cloneCopyEvent( srcElements[i], destElements[i] );
5543
                                }
5544
                        }
5545
                }
5546

    
5547
                // Return the cloned set
5548
                return clone;
5549
},
5550
        clean: function( elems, context, fragment, scripts ) {
5551
                context = context || document;
5552

    
5553
                // !context.createElement fails in IE with an error but returns typeof 'object'
5554
                if ( typeof context.createElement === "undefined" ) {
5555
                        context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
5556
                }
5557

    
5558
                var ret = [];
5559

    
5560
                for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
5561
                        if ( typeof elem === "number" ) {
5562
                                elem += "";
5563
                        }
5564

    
5565
                        if ( !elem ) {
5566
                                continue;
5567
                        }
5568

    
5569
                        // Convert html string into DOM nodes
5570
                        if ( typeof elem === "string" && !rhtml.test( elem ) ) {
5571
                                elem = context.createTextNode( elem );
5572

    
5573
                        } else if ( typeof elem === "string" ) {
5574
                                // Fix "XHTML"-style tags in all browsers
5575
                                elem = elem.replace(rxhtmlTag, "<$1></$2>");
5576

    
5577
                                // Trim whitespace, otherwise indexOf won't work as expected
5578
                                var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
5579
                                        wrap = wrapMap[ tag ] || wrapMap._default,
5580
                                        depth = wrap[0],
5581
                                        div = context.createElement("div");
5582

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

    
5586
                                // Move to the right depth
5587
                                while ( depth-- ) {
5588
                                        div = div.lastChild;
5589
                                }
5590

    
5591
                                // Remove IE's autoinserted <tbody> from table fragments
5592
                                if ( !jQuery.support.tbody ) {
5593

    
5594
                                        // String was a <table>, *may* have spurious <tbody>
5595
                                        var hasBody = rtbody.test(elem),
5596
                                                tbody = tag === "table" && !hasBody ?
5597
                                                        div.firstChild && div.firstChild.childNodes :
5598

    
5599
                                                        // String was a bare <thead> or <tfoot>
5600
                                                        wrap[1] === "<table>" && !hasBody ?
5601
                                                                div.childNodes :
5602
                                                                [];
5603

    
5604
                                        for ( var j = tbody.length - 1; j >= 0 ; --j ) {
5605
                                                if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
5606
                                                        tbody[ j ].parentNode.removeChild( tbody[ j ] );
5607
                                                }
5608
                                        }
5609

    
5610
                                }
5611

    
5612
                                // IE completely kills leading whitespace when innerHTML is used
5613
                                if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
5614
                                        div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
5615
                                }
5616

    
5617
                                elem = div.childNodes;
5618
                        }
5619

    
5620
                        if ( elem.nodeType ) {
5621
                                ret.push( elem );
5622
                        } else {
5623
                                ret = jQuery.merge( ret, elem );
5624
                        }
5625
                }
5626

    
5627
                if ( fragment ) {
5628
                        for ( i = 0; ret[i]; i++ ) {
5629
                                if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
5630
                                        scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
5631

    
5632
                                } else {
5633
                                        if ( ret[i].nodeType === 1 ) {
5634
                                                ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
5635
                                        }
5636
                                        fragment.appendChild( ret[i] );
5637
                                }
5638
                        }
5639
                }
5640

    
5641
                return ret;
5642
        },
5643

    
5644
        cleanData: function( elems ) {
5645
                var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
5646
                        deleteExpando = jQuery.support.deleteExpando;
5647

    
5648
                for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
5649
                        if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
5650
                                continue;
5651
                        }
5652

    
5653
                        id = elem[ jQuery.expando ];
5654

    
5655
                        if ( id ) {
5656
                                data = cache[ id ] && cache[ id ][ internalKey ];
5657

    
5658
                                if ( data && data.events ) {
5659
                                        for ( var type in data.events ) {
5660
                                                if ( special[ type ] ) {
5661
                                                        jQuery.event.remove( elem, type );
5662

    
5663
                                                // This is a shortcut to avoid jQuery.event.remove's overhead
5664
                                                } else {
5665
                                                        jQuery.removeEvent( elem, type, data.handle );
5666
                                                }
5667
                                        }
5668

    
5669
                                        // Null the DOM reference to avoid IE6/7/8 leak (#7054)
5670
                                        if ( data.handle ) {
5671
                                                data.handle.elem = null;
5672
                                        }
5673
                                }
5674

    
5675
                                if ( deleteExpando ) {
5676
                                        delete elem[ jQuery.expando ];
5677

    
5678
                                } else if ( elem.removeAttribute ) {
5679
                                        elem.removeAttribute( jQuery.expando );
5680
                                }
5681

    
5682
                                delete cache[ id ];
5683
                        }
5684
                }
5685
        }
5686
});
5687

    
5688
function evalScript( i, elem ) {
5689
        if ( elem.src ) {
5690
                jQuery.ajax({
5691
                        url: elem.src,
5692
                        async: false,
5693
                        dataType: "script"
5694
                });
5695
        } else {
5696
                jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
5697
        }
5698

    
5699
        if ( elem.parentNode ) {
5700
                elem.parentNode.removeChild( elem );
5701
        }
5702
}
5703

    
5704

    
5705

    
5706

    
5707
var ralpha = /alpha\([^)]*\)/i,
5708
        ropacity = /opacity=([^)]*)/,
5709
        rdashAlpha = /-([a-z])/ig,
5710
        rupper = /([A-Z])/g,
5711
        rnumpx = /^-?\d+(?:px)?$/i,
5712
        rnum = /^-?\d/,
5713

    
5714
        cssShow = { position: "absolute", visibility: "hidden", display: "block" },
5715
        cssWidth = [ "Left", "Right" ],
5716
        cssHeight = [ "Top", "Bottom" ],
5717
        curCSS,
5718

    
5719
        getComputedStyle,
5720
        currentStyle,
5721

    
5722
        fcamelCase = function( all, letter ) {
5723
                return letter.toUpperCase();
5724
        };
5725

    
5726
jQuery.fn.css = function( name, value ) {
5727
        // Setting 'undefined' is a no-op
5728
        if ( arguments.length === 2 && value === undefined ) {
5729
                return this;
5730
        }
5731

    
5732
        return jQuery.access( this, name, value, true, function( elem, name, value ) {
5733
                return value !== undefined ?
5734
                        jQuery.style( elem, name, value ) :
5735
                        jQuery.css( elem, name );
5736
        });
5737
};
5738

    
5739
jQuery.extend({
5740
        // Add in style property hooks for overriding the default
5741
        // behavior of getting and setting a style property
5742
        cssHooks: {
5743
                opacity: {
5744
                        get: function( elem, computed ) {
5745
                                if ( computed ) {
5746
                                        // We should always get a number back from opacity
5747
                                        var ret = curCSS( elem, "opacity", "opacity" );
5748
                                        return ret === "" ? "1" : ret;
5749

    
5750
                                } else {
5751
                                        return elem.style.opacity;
5752
                                }
5753
                        }
5754
                }
5755
        },
5756

    
5757
        // Exclude the following css properties to add px
5758
        cssNumber: {
5759
                "zIndex": true,
5760
                "fontWeight": true,
5761
                "opacity": true,
5762
                "zoom": true,
5763
                "lineHeight": true
5764
        },
5765

    
5766
        // Add in properties whose names you wish to fix before
5767
        // setting or getting the value
5768
        cssProps: {
5769
                // normalize float css property
5770
                "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
5771
        },
5772

    
5773
        // Get and set the style property on a DOM Node
5774
        style: function( elem, name, value, extra ) {
5775
                // Don't set styles on text and comment nodes
5776
                if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
5777
                        return;
5778
                }
5779

    
5780
                // Make sure that we're working with the right name
5781
                var ret, origName = jQuery.camelCase( name ),
5782
                        style = elem.style, hooks = jQuery.cssHooks[ origName ];
5783

    
5784
                name = jQuery.cssProps[ origName ] || origName;
5785

    
5786
                // Check if we're setting a value
5787
                if ( value !== undefined ) {
5788
                        // Make sure that NaN and null values aren't set. See: #7116
5789
                        if ( typeof value === "number" && isNaN( value ) || value == null ) {
5790
                                return;
5791
                        }
5792

    
5793
                        // If a number was passed in, add 'px' to the (except for certain CSS properties)
5794
                        if ( typeof value === "number" && !jQuery.cssNumber[ origName ] ) {
5795
                                value += "px";
5796
                        }
5797

    
5798
                        // If a hook was provided, use that value, otherwise just set the specified value
5799
                        if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
5800
                                // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
5801
                                // Fixes bug #5509
5802
                                try {
5803
                                        style[ name ] = value;
5804
                                } catch(e) {}
5805
                        }
5806

    
5807
                } else {
5808
                        // If a hook was provided get the non-computed value from there
5809
                        if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
5810
                                return ret;
5811
                        }
5812

    
5813
                        // Otherwise just get the value from the style object
5814
                        return style[ name ];
5815
                }
5816
        },
5817

    
5818
        css: function( elem, name, extra ) {
5819
                // Make sure that we're working with the right name
5820
                var ret, origName = jQuery.camelCase( name ),
5821
                        hooks = jQuery.cssHooks[ origName ];
5822

    
5823
                name = jQuery.cssProps[ origName ] || origName;
5824

    
5825
                // If a hook was provided get the computed value from there
5826
                if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
5827
                        return ret;
5828

    
5829
                // Otherwise, if a way to get the computed value exists, use that
5830
                } else if ( curCSS ) {
5831
                        return curCSS( elem, name, origName );
5832
                }
5833
        },
5834

    
5835
        // A method for quickly swapping in/out CSS properties to get correct calculations
5836
        swap: function( elem, options, callback ) {
5837
                var old = {};
5838

    
5839
                // Remember the old values, and insert the new ones
5840
                for ( var name in options ) {
5841
                        old[ name ] = elem.style[ name ];
5842
                        elem.style[ name ] = options[ name ];
5843
                }
5844

    
5845
                callback.call( elem );
5846

    
5847
                // Revert the old values
5848
                for ( name in options ) {
5849
                        elem.style[ name ] = old[ name ];
5850
                }
5851
        },
5852

    
5853
        camelCase: function( string ) {
5854
                return string.replace( rdashAlpha, fcamelCase );
5855
        }
5856
});
5857

    
5858
// DEPRECATED, Use jQuery.css() instead
5859
jQuery.curCSS = jQuery.css;
5860

    
5861
jQuery.each(["height", "width"], function( i, name ) {
5862
        jQuery.cssHooks[ name ] = {
5863
                get: function( elem, computed, extra ) {
5864
                        var val;
5865

    
5866
                        if ( computed ) {
5867
                                if ( elem.offsetWidth !== 0 ) {
5868
                                        val = getWH( elem, name, extra );
5869

    
5870
                                } else {
5871
                                        jQuery.swap( elem, cssShow, function() {
5872
                                                val = getWH( elem, name, extra );
5873
                                        });
5874
                                }
5875

    
5876
                                if ( val <= 0 ) {
5877
                                        val = curCSS( elem, name, name );
5878

    
5879
                                        if ( val === "0px" && currentStyle ) {
5880
                                                val = currentStyle( elem, name, name );
5881
                                        }
5882

    
5883
                                        if ( val != null ) {
5884
                                                // Should return "auto" instead of 0, use 0 for
5885
                                                // temporary backwards-compat
5886
                                                return val === "" || val === "auto" ? "0px" : val;
5887
                                        }
5888
                                }
5889

    
5890
                                if ( val < 0 || val == null ) {
5891
                                        val = elem.style[ name ];
5892

    
5893
                                        // Should return "auto" instead of 0, use 0 for
5894
                                        // temporary backwards-compat
5895
                                        return val === "" || val === "auto" ? "0px" : val;
5896
                                }
5897

    
5898
                                return typeof val === "string" ? val : val + "px";
5899
                        }
5900
                },
5901

    
5902
                set: function( elem, value ) {
5903
                        if ( rnumpx.test( value ) ) {
5904
                                // ignore negative width and height values #1599
5905
                                value = parseFloat(value);
5906

    
5907
                                if ( value >= 0 ) {
5908
                                        return value + "px";
5909
                                }
5910

    
5911
                        } else {
5912
                                return value;
5913
                        }
5914
                }
5915
        };
5916
});
5917

    
5918
if ( !jQuery.support.opacity ) {
5919
        jQuery.cssHooks.opacity = {
5920
                get: function( elem, computed ) {
5921
                        // IE uses filters for opacity
5922
                        return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ?
5923
                                (parseFloat(RegExp.$1) / 100) + "" :
5924
                                computed ? "1" : "";
5925
                },
5926

    
5927
                set: function( elem, value ) {
5928
                        var style = elem.style;
5929

    
5930
                        // IE has trouble with opacity if it does not have layout
5931
                        // Force it by setting the zoom level
5932
                        style.zoom = 1;
5933

    
5934
                        // Set the alpha filter to set the opacity
5935
                        var opacity = jQuery.isNaN(value) ?
5936
                                "" :
5937
                                "alpha(opacity=" + value * 100 + ")",
5938
                                filter = style.filter || "";
5939

    
5940
                        style.filter = ralpha.test(filter) ?
5941
                                filter.replace(ralpha, opacity) :
5942
                                style.filter + ' ' + opacity;
5943
                }
5944
        };
5945
}
5946

    
5947
if ( document.defaultView && document.defaultView.getComputedStyle ) {
5948
        getComputedStyle = function( elem, newName, name ) {
5949
                var ret, defaultView, computedStyle;
5950

    
5951
                name = name.replace( rupper, "-$1" ).toLowerCase();
5952

    
5953
                if ( !(defaultView = elem.ownerDocument.defaultView) ) {
5954
                        return undefined;
5955
                }
5956

    
5957
                if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
5958
                        ret = computedStyle.getPropertyValue( name );
5959
                        if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
5960
                                ret = jQuery.style( elem, name );
5961
                        }
5962
                }
5963

    
5964
                return ret;
5965
        };
5966
}
5967

    
5968
if ( document.documentElement.currentStyle ) {
5969
        currentStyle = function( elem, name ) {
5970
                var left,
5971
                        ret = elem.currentStyle && elem.currentStyle[ name ],
5972
                        rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
5973
                        style = elem.style;
5974

    
5975
                // From the awesome hack by Dean Edwards
5976
                // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
5977

    
5978
                // If we're not dealing with a regular pixel number
5979
                // but a number that has a weird ending, we need to convert it to pixels
5980
                if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
5981
                        // Remember the original values
5982
                        left = style.left;
5983

    
5984
                        // Put in the new values to get a computed value out
5985
                        if ( rsLeft ) {
5986
                                elem.runtimeStyle.left = elem.currentStyle.left;
5987
                        }
5988
                        style.left = name === "fontSize" ? "1em" : (ret || 0);
5989
                        ret = style.pixelLeft + "px";
5990

    
5991
                        // Revert the changed values
5992
                        style.left = left;
5993
                        if ( rsLeft ) {
5994
                                elem.runtimeStyle.left = rsLeft;
5995
                        }
5996
                }
5997

    
5998
                return ret === "" ? "auto" : ret;
5999
        };
6000
}
6001

    
6002
curCSS = getComputedStyle || currentStyle;
6003

    
6004
function getWH( elem, name, extra ) {
6005
        var which = name === "width" ? cssWidth : cssHeight,
6006
                val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
6007

    
6008
        if ( extra === "border" ) {
6009
                return val;
6010
        }
6011

    
6012
        jQuery.each( which, function() {
6013
                if ( !extra ) {
6014
                        val -= parseFloat(jQuery.css( elem, "padding" + this )) || 0;
6015
                }
6016

    
6017
                if ( extra === "margin" ) {
6018
                        val += parseFloat(jQuery.css( elem, "margin" + this )) || 0;
6019

    
6020
                } else {
6021
                        val -= parseFloat(jQuery.css( elem, "border" + this + "Width" )) || 0;
6022
                }
6023
        });
6024

    
6025
        return val;
6026
}
6027

    
6028
if ( jQuery.expr && jQuery.expr.filters ) {
6029
        jQuery.expr.filters.hidden = function( elem ) {
6030
                var width = elem.offsetWidth,
6031
                        height = elem.offsetHeight;
6032

    
6033
                return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
6034
        };
6035

    
6036
        jQuery.expr.filters.visible = function( elem ) {
6037
                return !jQuery.expr.filters.hidden( elem );
6038
        };
6039
}
6040

    
6041

    
6042

    
6043

    
6044
var r20 = /%20/g,
6045
        rbracket = /\[\]$/,
6046
        rCRLF = /\r?\n/g,
6047
        rhash = /#.*$/,
6048
        rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
6049
        rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
6050
        // #7653, #8125, #8152: local protocol detection
6051
        rlocalProtocol = /(?:^file|^widget|\-extension):$/,
6052
        rnoContent = /^(?:GET|HEAD)$/,
6053
        rprotocol = /^\/\//,
6054
        rquery = /\?/,
6055
        rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
6056
        rselectTextarea = /^(?:select|textarea)/i,
6057
        rspacesAjax = /\s+/,
6058
        rts = /([?&])_=[^&]*/,
6059
        rucHeaders = /(^|\-)([a-z])/g,
6060
        rucHeadersFunc = function( _, $1, $2 ) {
6061
                return $1 + $2.toUpperCase();
6062
        },
6063
        rurl = /^([\w\+\.\-]+:)\/\/([^\/?#:]*)(?::(\d+))?/,
6064

    
6065
        // Keep a copy of the old load method
6066
        _load = jQuery.fn.load,
6067

    
6068
        /* Prefilters
6069
         * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
6070
         * 2) These are called:
6071
         *    - BEFORE asking for a transport
6072
         *    - AFTER param serialization (s.data is a string if s.processData is true)
6073
         * 3) key is the dataType
6074
         * 4) the catchall symbol "*" can be used
6075
         * 5) execution will start with transport dataType and THEN continue down to "*" if needed
6076
         */
6077
        prefilters = {},
6078

    
6079
        /* Transports bindings
6080
         * 1) key is the dataType
6081
         * 2) the catchall symbol "*" can be used
6082
         * 3) selection will start with transport dataType and THEN go to "*" if needed
6083
         */
6084
        transports = {},
6085

    
6086
        // Document location
6087
        ajaxLocation,
6088

    
6089
        // Document location segments
6090
        ajaxLocParts;
6091

    
6092
// #8138, IE may throw an exception when accessing
6093
// a field from document.location if document.domain has been set
6094
try {
6095
        ajaxLocation = document.location.href;
6096
} catch( e ) {
6097
        // Use the href attribute of an A element
6098
        // since IE will modify it given document.location
6099
        ajaxLocation = document.createElement( "a" );
6100
        ajaxLocation.href = "";
6101
        ajaxLocation = ajaxLocation.href;
6102
}
6103

    
6104
// Segment location into parts
6105
ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() );
6106

    
6107
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
6108
function addToPrefiltersOrTransports( structure ) {
6109

    
6110
        // dataTypeExpression is optional and defaults to "*"
6111
        return function( dataTypeExpression, func ) {
6112

    
6113
                if ( typeof dataTypeExpression !== "string" ) {
6114
                        func = dataTypeExpression;
6115
                        dataTypeExpression = "*";
6116
                }
6117

    
6118
                if ( jQuery.isFunction( func ) ) {
6119
                        var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
6120
                                i = 0,
6121
                                length = dataTypes.length,
6122
                                dataType,
6123
                                list,
6124
                                placeBefore;
6125

    
6126
                        // For each dataType in the dataTypeExpression
6127
                        for(; i < length; i++ ) {
6128
                                dataType = dataTypes[ i ];
6129
                                // We control if we're asked to add before
6130
                                // any existing element
6131
                                placeBefore = /^\+/.test( dataType );
6132
                                if ( placeBefore ) {
6133
                                        dataType = dataType.substr( 1 ) || "*";
6134
                                }
6135
                                list = structure[ dataType ] = structure[ dataType ] || [];
6136
                                // then we add to the structure accordingly
6137
                                list[ placeBefore ? "unshift" : "push" ]( func );
6138
                        }
6139
                }
6140
        };
6141
}
6142

    
6143
//Base inspection function for prefilters and transports
6144
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
6145
                dataType /* internal */, inspected /* internal */ ) {
6146

    
6147
        dataType = dataType || options.dataTypes[ 0 ];
6148
        inspected = inspected || {};
6149

    
6150
        inspected[ dataType ] = true;
6151

    
6152
        var list = structure[ dataType ],
6153
                i = 0,
6154
                length = list ? list.length : 0,
6155
                executeOnly = ( structure === prefilters ),
6156
                selection;
6157

    
6158
        for(; i < length && ( executeOnly || !selection ); i++ ) {
6159
                selection = list[ i ]( options, originalOptions, jqXHR );
6160
                // If we got redirected to another dataType
6161
                // we try there if executing only and not done already
6162
                if ( typeof selection === "string" ) {
6163
                        if ( !executeOnly || inspected[ selection ] ) {
6164
                                selection = undefined;
6165
                        } else {
6166
                                options.dataTypes.unshift( selection );
6167
                                selection = inspectPrefiltersOrTransports(
6168
                                                structure, options, originalOptions, jqXHR, selection, inspected );
6169
                        }
6170
                }
6171
        }
6172
        // If we're only executing or nothing was selected
6173
        // we try the catchall dataType if not done already
6174
        if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
6175
                selection = inspectPrefiltersOrTransports(
6176
                                structure, options, originalOptions, jqXHR, "*", inspected );
6177
        }
6178
        // unnecessary when only executing (prefilters)
6179
        // but it'll be ignored by the caller in that case
6180
        return selection;
6181
}
6182

    
6183
jQuery.fn.extend({
6184
        load: function( url, params, callback ) {
6185
                if ( typeof url !== "string" && _load ) {
6186
                        return _load.apply( this, arguments );
6187

    
6188
                // Don't do a request if no elements are being requested
6189
                } else if ( !this.length ) {
6190
                        return this;
6191
                }
6192

    
6193
                var off = url.indexOf( " " );
6194
                if ( off >= 0 ) {
6195
                        var selector = url.slice( off, url.length );
6196
                        url = url.slice( 0, off );
6197
                }
6198

    
6199
                // Default to a GET request
6200
                var type = "GET";
6201

    
6202
                // If the second parameter was provided
6203
                if ( params ) {
6204
                        // If it's a function
6205
                        if ( jQuery.isFunction( params ) ) {
6206
                                // We assume that it's the callback
6207
                                callback = params;
6208
                                params = undefined;
6209

    
6210
                        // Otherwise, build a param string
6211
                        } else if ( typeof params === "object" ) {
6212
                                params = jQuery.param( params, jQuery.ajaxSettings.traditional );
6213
                                type = "POST";
6214
                        }
6215
                }
6216

    
6217
                var self = this;
6218

    
6219
                // Request the remote document
6220
                jQuery.ajax({
6221
                        url: url,
6222
                        type: type,
6223
                        dataType: "html",
6224
                        data: params,
6225
                        // Complete callback (responseText is used internally)
6226
                        complete: function( jqXHR, status, responseText ) {
6227
                                // Store the response as specified by the jqXHR object
6228
                                responseText = jqXHR.responseText;
6229
                                // If successful, inject the HTML into all the matched elements
6230
                                if ( jqXHR.isResolved() ) {
6231
                                        // #4825: Get the actual response in case
6232
                                        // a dataFilter is present in ajaxSettings
6233
                                        jqXHR.done(function( r ) {
6234
                                                responseText = r;
6235
                                        });
6236
                                        // See if a selector was specified
6237
                                        self.html( selector ?
6238
                                                // Create a dummy div to hold the results
6239
                                                jQuery("<div>")
6240
                                                        // inject the contents of the document in, removing the scripts
6241
                                                        // to avoid any 'Permission Denied' errors in IE
6242
                                                        .append(responseText.replace(rscript, ""))
6243

    
6244
                                                        // Locate the specified elements
6245
                                                        .find(selector) :
6246

    
6247
                                                // If not, just inject the full result
6248
                                                responseText );
6249
                                }
6250

    
6251
                                if ( callback ) {
6252
                                        self.each( callback, [ responseText, status, jqXHR ] );
6253
                                }
6254
                        }
6255
                });
6256

    
6257
                return this;
6258
        },
6259

    
6260
        serialize: function() {
6261
                return jQuery.param( this.serializeArray() );
6262
        },
6263

    
6264
        serializeArray: function() {
6265
                return this.map(function(){
6266
                        return this.elements ? jQuery.makeArray( this.elements ) : this;
6267
                })
6268
                .filter(function(){
6269
                        return this.name && !this.disabled &&
6270
                                ( this.checked || rselectTextarea.test( this.nodeName ) ||
6271
                                        rinput.test( this.type ) );
6272
                })
6273
                .map(function( i, elem ){
6274
                        var val = jQuery( this ).val();
6275

    
6276
                        return val == null ?
6277
                                null :
6278
                                jQuery.isArray( val ) ?
6279
                                        jQuery.map( val, function( val, i ){
6280
                                                return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
6281
                                        }) :
6282
                                        { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
6283
                }).get();
6284
        }
6285
});
6286

    
6287
// Attach a bunch of functions for handling common AJAX events
6288
jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
6289
        jQuery.fn[ o ] = function( f ){
6290
                return this.bind( o, f );
6291
        };
6292
} );
6293

    
6294
jQuery.each( [ "get", "post" ], function( i, method ) {
6295
        jQuery[ method ] = function( url, data, callback, type ) {
6296
                // shift arguments if data argument was omitted
6297
                if ( jQuery.isFunction( data ) ) {
6298
                        type = type || callback;
6299
                        callback = data;
6300
                        data = undefined;
6301
                }
6302

    
6303
                return jQuery.ajax({
6304
                        type: method,
6305
                        url: url,
6306
                        data: data,
6307
                        success: callback,
6308
                        dataType: type
6309
                });
6310
        };
6311
} );
6312

    
6313
jQuery.extend({
6314

    
6315
        getScript: function( url, callback ) {
6316
                return jQuery.get( url, undefined, callback, "script" );
6317
        },
6318

    
6319
        getJSON: function( url, data, callback ) {
6320
                return jQuery.get( url, data, callback, "json" );
6321
        },
6322

    
6323
        // Creates a full fledged settings object into target
6324
        // with both ajaxSettings and settings fields.
6325
        // If target is omitted, writes into ajaxSettings.
6326
        ajaxSetup: function ( target, settings ) {
6327
                if ( !settings ) {
6328
                        // Only one parameter, we extend ajaxSettings
6329
                        settings = target;
6330
                        target = jQuery.extend( true, jQuery.ajaxSettings, settings );
6331
                } else {
6332
                        // target was provided, we extend into it
6333
                        jQuery.extend( true, target, jQuery.ajaxSettings, settings );
6334
                }
6335
                // Flatten fields we don't want deep extended
6336
                for( var field in { context: 1, url: 1 } ) {
6337
                        if ( field in settings ) {
6338
                                target[ field ] = settings[ field ];
6339
                        } else if( field in jQuery.ajaxSettings ) {
6340
                                target[ field ] = jQuery.ajaxSettings[ field ];
6341
                        }
6342
                }
6343
                return target;
6344
        },
6345

    
6346
        ajaxSettings: {
6347
                url: ajaxLocation,
6348
                isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
6349
                global: true,
6350
                type: "GET",
6351
                contentType: "application/x-www-form-urlencoded",
6352
                processData: true,
6353
                async: true,
6354
                /*
6355
                timeout: 0,
6356
                data: null,
6357
                dataType: null,
6358
                username: null,
6359
                password: null,
6360
                cache: null,
6361
                traditional: false,
6362
                headers: {},
6363
                crossDomain: null,
6364
                */
6365

    
6366
                accepts: {
6367
                        xml: "application/xml, text/xml",
6368
                        html: "text/html",
6369
                        text: "text/plain",
6370
                        json: "application/json, text/javascript",
6371
                        "*": "*/*"
6372
                },
6373

    
6374
                contents: {
6375
                        xml: /xml/,
6376
                        html: /html/,
6377
                        json: /json/
6378
                },
6379

    
6380
                responseFields: {
6381
                        xml: "responseXML",
6382
                        text: "responseText"
6383
                },
6384

    
6385
                // List of data converters
6386
                // 1) key format is "source_type destination_type" (a single space in-between)
6387
                // 2) the catchall symbol "*" can be used for source_type
6388
                converters: {
6389

    
6390
                        // Convert anything to text
6391
                        "* text": window.String,
6392

    
6393
                        // Text to html (true = no transformation)
6394
                        "text html": true,
6395

    
6396
                        // Evaluate text as a json expression
6397
                        "text json": jQuery.parseJSON,
6398

    
6399
                        // Parse text as xml
6400
                        "text xml": jQuery.parseXML
6401
                }
6402
        },
6403

    
6404
        ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
6405
        ajaxTransport: addToPrefiltersOrTransports( transports ),
6406

    
6407
        // Main method
6408
        ajax: function( url, options ) {
6409

    
6410
                // If url is an object, simulate pre-1.5 signature
6411
                if ( typeof url === "object" ) {
6412
                        options = url;
6413
                        url = undefined;
6414
                }
6415

    
6416
                // Force options to be an object
6417
                options = options || {};
6418

    
6419
                var // Create the final options object
6420
                        s = jQuery.ajaxSetup( {}, options ),
6421
                        // Callbacks context
6422
                        callbackContext = s.context || s,
6423
                        // Context for global events
6424
                        // It's the callbackContext if one was provided in the options
6425
                        // and if it's a DOM node or a jQuery collection
6426
                        globalEventContext = callbackContext !== s &&
6427
                                ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
6428
                                                jQuery( callbackContext ) : jQuery.event,
6429
                        // Deferreds
6430
                        deferred = jQuery.Deferred(),
6431
                        completeDeferred = jQuery._Deferred(),
6432
                        // Status-dependent callbacks
6433
                        statusCode = s.statusCode || {},
6434
                        // ifModified key
6435
                        ifModifiedKey,
6436
                        // Headers (they are sent all at once)
6437
                        requestHeaders = {},
6438
                        // Response headers
6439
                        responseHeadersString,
6440
                        responseHeaders,
6441
                        // transport
6442
                        transport,
6443
                        // timeout handle
6444
                        timeoutTimer,
6445
                        // Cross-domain detection vars
6446
                        parts,
6447
                        // The jqXHR state
6448
                        state = 0,
6449
                        // To know if global events are to be dispatched
6450
                        fireGlobals,
6451
                        // Loop variable
6452
                        i,
6453
                        // Fake xhr
6454
                        jqXHR = {
6455

    
6456
                                readyState: 0,
6457

    
6458
                                // Caches the header
6459
                                setRequestHeader: function( name, value ) {
6460
                                        if ( !state ) {
6461
                                                requestHeaders[ name.toLowerCase().replace( rucHeaders, rucHeadersFunc ) ] = value;
6462
                                        }
6463
                                        return this;
6464
                                },
6465

    
6466
                                // Raw string
6467
                                getAllResponseHeaders: function() {
6468
                                        return state === 2 ? responseHeadersString : null;
6469
                                },
6470

    
6471
                                // Builds headers hashtable if needed
6472
                                getResponseHeader: function( key ) {
6473
                                        var match;
6474
                                        if ( state === 2 ) {
6475
                                                if ( !responseHeaders ) {
6476
                                                        responseHeaders = {};
6477
                                                        while( ( match = rheaders.exec( responseHeadersString ) ) ) {
6478
                                                                responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
6479
                                                        }
6480
                                                }
6481
                                                match = responseHeaders[ key.toLowerCase() ];
6482
                                        }
6483
                                        return match === undefined ? null : match;
6484
                                },
6485

    
6486
                                // Overrides response content-type header
6487
                                overrideMimeType: function( type ) {
6488
                                        if ( !state ) {
6489
                                                s.mimeType = type;
6490
                                        }
6491
                                        return this;
6492
                                },
6493

    
6494
                                // Cancel the request
6495
                                abort: function( statusText ) {
6496
                                        statusText = statusText || "abort";
6497
                                        if ( transport ) {
6498
                                                transport.abort( statusText );
6499
                                        }
6500
                                        done( 0, statusText );
6501
                                        return this;
6502
                                }
6503
                        };
6504

    
6505
                // Callback for when everything is done
6506
                // It is defined here because jslint complains if it is declared
6507
                // at the end of the function (which would be more logical and readable)
6508
                function done( status, statusText, responses, headers ) {
6509

    
6510
                        // Called once
6511
                        if ( state === 2 ) {
6512
                                return;
6513
                        }
6514

    
6515
                        // State is "done" now
6516
                        state = 2;
6517

    
6518
                        // Clear timeout if it exists
6519
                        if ( timeoutTimer ) {
6520
                                clearTimeout( timeoutTimer );
6521
                        }
6522

    
6523
                        // Dereference transport for early garbage collection
6524
                        // (no matter how long the jqXHR object will be used)
6525
                        transport = undefined;
6526

    
6527
                        // Cache response headers
6528
                        responseHeadersString = headers || "";
6529

    
6530
                        // Set readyState
6531
                        jqXHR.readyState = status ? 4 : 0;
6532

    
6533
                        var isSuccess,
6534
                                success,
6535
                                error,
6536
                                response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
6537
                                lastModified,
6538
                                etag;
6539

    
6540
                        // If successful, handle type chaining
6541
                        if ( status >= 200 && status < 300 || status === 304 ) {
6542

    
6543
                                // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
6544
                                if ( s.ifModified ) {
6545

    
6546
                                        if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
6547
                                                jQuery.lastModified[ ifModifiedKey ] = lastModified;
6548
                                        }
6549
                                        if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
6550
                                                jQuery.etag[ ifModifiedKey ] = etag;
6551
                                        }
6552
                                }
6553

    
6554
                                // If not modified
6555
                                if ( status === 304 ) {
6556

    
6557
                                        statusText = "notmodified";
6558
                                        isSuccess = true;
6559

    
6560
                                // If we have data
6561
                                } else {
6562

    
6563
                                        try {
6564
                                                success = ajaxConvert( s, response );
6565
                                                statusText = "success";
6566
                                                isSuccess = true;
6567
                                        } catch(e) {
6568
                                                // We have a parsererror
6569
                                                statusText = "parsererror";
6570
                                                error = e;
6571
                                        }
6572
                                }
6573
                        } else {
6574
                                // We extract error from statusText
6575
                                // then normalize statusText and status for non-aborts
6576
                                error = statusText;
6577
                                if( !statusText || status ) {
6578
                                        statusText = "error";
6579
                                        if ( status < 0 ) {
6580
                                                status = 0;
6581
                                        }
6582
                                }
6583
                        }
6584

    
6585
                        // Set data for the fake xhr object
6586
                        jqXHR.status = status;
6587
                        jqXHR.statusText = statusText;
6588

    
6589
                        // Success/Error
6590
                        if ( isSuccess ) {
6591
                                deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
6592
                        } else {
6593
                                deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
6594
                        }
6595

    
6596
                        // Status-dependent callbacks
6597
                        jqXHR.statusCode( statusCode );
6598
                        statusCode = undefined;
6599

    
6600
                        if ( fireGlobals ) {
6601
                                globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
6602
                                                [ jqXHR, s, isSuccess ? success : error ] );
6603
                        }
6604

    
6605
                        // Complete
6606
                        completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
6607

    
6608
                        if ( fireGlobals ) {
6609
                                globalEventContext.trigger( "ajaxComplete", [ jqXHR, s] );
6610
                                // Handle the global AJAX counter
6611
                                if ( !( --jQuery.active ) ) {
6612
                                        jQuery.event.trigger( "ajaxStop" );
6613
                                }
6614
                        }
6615
                }
6616

    
6617
                // Attach deferreds
6618
                deferred.promise( jqXHR );
6619
                jqXHR.success = jqXHR.done;
6620
                jqXHR.error = jqXHR.fail;
6621
                jqXHR.complete = completeDeferred.done;
6622

    
6623
                // Status-dependent callbacks
6624
                jqXHR.statusCode = function( map ) {
6625
                        if ( map ) {
6626
                                var tmp;
6627
                                if ( state < 2 ) {
6628
                                        for( tmp in map ) {
6629
                                                statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
6630
                                        }
6631
                                } else {
6632
                                        tmp = map[ jqXHR.status ];
6633
                                        jqXHR.then( tmp, tmp );
6634
                                }
6635
                        }
6636
                        return this;
6637
                };
6638

    
6639
                // Remove hash character (#7531: and string promotion)
6640
                // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
6641
                // We also use the url parameter if available
6642
                s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
6643

    
6644
                // Extract dataTypes list
6645
                s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
6646

    
6647
                // Determine if a cross-domain request is in order
6648
                if ( !s.crossDomain ) {
6649
                        parts = rurl.exec( s.url.toLowerCase() );
6650
                        s.crossDomain = !!( parts &&
6651
                                ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
6652
                                        ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
6653
                                                ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
6654
                        );
6655
                }
6656

    
6657
                // Convert data if not already a string
6658
                if ( s.data && s.processData && typeof s.data !== "string" ) {
6659
                        s.data = jQuery.param( s.data, s.traditional );
6660
                }
6661

    
6662
                // Apply prefilters
6663
                inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
6664

    
6665
                // If request was aborted inside a prefiler, stop there
6666
                if ( state === 2 ) {
6667
                        return false;
6668
                }
6669

    
6670
                // We can fire global events as of now if asked to
6671
                fireGlobals = s.global;
6672

    
6673
                // Uppercase the type
6674
                s.type = s.type.toUpperCase();
6675

    
6676
                // Determine if request has content
6677
                s.hasContent = !rnoContent.test( s.type );
6678

    
6679
                // Watch for a new set of requests
6680
                if ( fireGlobals && jQuery.active++ === 0 ) {
6681
                        jQuery.event.trigger( "ajaxStart" );
6682
                }
6683

    
6684
                // More options handling for requests with no content
6685
                if ( !s.hasContent ) {
6686

    
6687
                        // If data is available, append data to url
6688
                        if ( s.data ) {
6689
                                s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
6690
                        }
6691

    
6692
                        // Get ifModifiedKey before adding the anti-cache parameter
6693
                        ifModifiedKey = s.url;
6694

    
6695
                        // Add anti-cache in url if needed
6696
                        if ( s.cache === false ) {
6697

    
6698
                                var ts = jQuery.now(),
6699
                                        // try replacing _= if it is there
6700
                                        ret = s.url.replace( rts, "$1_=" + ts );
6701

    
6702
                                // if nothing was replaced, add timestamp to the end
6703
                                s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
6704
                        }
6705
                }
6706

    
6707
                // Set the correct header, if data is being sent
6708
                if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
6709
                        requestHeaders[ "Content-Type" ] = s.contentType;
6710
                }
6711

    
6712
                // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
6713
                if ( s.ifModified ) {
6714
                        ifModifiedKey = ifModifiedKey || s.url;
6715
                        if ( jQuery.lastModified[ ifModifiedKey ] ) {
6716
                                requestHeaders[ "If-Modified-Since" ] = jQuery.lastModified[ ifModifiedKey ];
6717
                        }
6718
                        if ( jQuery.etag[ ifModifiedKey ] ) {
6719
                                requestHeaders[ "If-None-Match" ] = jQuery.etag[ ifModifiedKey ];
6720
                        }
6721
                }
6722

    
6723
                // Set the Accepts header for the server, depending on the dataType
6724
                requestHeaders.Accept = s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
6725
                        s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", */*; q=0.01" : "" ) :
6726
                        s.accepts[ "*" ];
6727

    
6728
                // Check for headers option
6729
                for ( i in s.headers ) {
6730
                        jqXHR.setRequestHeader( i, s.headers[ i ] );
6731
                }
6732

    
6733
                // Allow custom headers/mimetypes and early abort
6734
                if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
6735
                                // Abort if not done already
6736
                                jqXHR.abort();
6737
                                return false;
6738

    
6739
                }
6740

    
6741
                // Install callbacks on deferreds
6742
                for ( i in { success: 1, error: 1, complete: 1 } ) {
6743
                        jqXHR[ i ]( s[ i ] );
6744
                }
6745

    
6746
                // Get transport
6747
                transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
6748

    
6749
                // If no transport, we auto-abort
6750
                if ( !transport ) {
6751
                        done( -1, "No Transport" );
6752
                } else {
6753
                        jqXHR.readyState = 1;
6754
                        // Send global event
6755
                        if ( fireGlobals ) {
6756
                                globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
6757
                        }
6758
                        // Timeout
6759
                        if ( s.async && s.timeout > 0 ) {
6760
                                timeoutTimer = setTimeout( function(){
6761
                                        jqXHR.abort( "timeout" );
6762
                                }, s.timeout );
6763
                        }
6764

    
6765
                        try {
6766
                                state = 1;
6767
                                transport.send( requestHeaders, done );
6768
                        } catch (e) {
6769
                                // Propagate exception as error if not done
6770
                                if ( status < 2 ) {
6771
                                        done( -1, e );
6772
                                // Simply rethrow otherwise
6773
                                } else {
6774
                                        jQuery.error( e );
6775
                                }
6776
                        }
6777
                }
6778

    
6779
                return jqXHR;
6780
        },
6781

    
6782
        // Serialize an array of form elements or a set of
6783
        // key/values into a query string
6784
        param: function( a, traditional ) {
6785
                var s = [],
6786
                        add = function( key, value ) {
6787
                                // If value is a function, invoke it and return its value
6788
                                value = jQuery.isFunction( value ) ? value() : value;
6789
                                s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
6790
                        };
6791

    
6792
                // Set traditional to true for jQuery <= 1.3.2 behavior.
6793
                if ( traditional === undefined ) {
6794
                        traditional = jQuery.ajaxSettings.traditional;
6795
                }
6796

    
6797
                // If an array was passed in, assume that it is an array of form elements.
6798
                if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
6799
                        // Serialize the form elements
6800
                        jQuery.each( a, function() {
6801
                                add( this.name, this.value );
6802
                        } );
6803

    
6804
                } else {
6805
                        // If traditional, encode the "old" way (the way 1.3.2 or older
6806
                        // did it), otherwise encode params recursively.
6807
                        for ( var prefix in a ) {
6808
                                buildParams( prefix, a[ prefix ], traditional, add );
6809
                        }
6810
                }
6811

    
6812
                // Return the resulting serialization
6813
                return s.join( "&" ).replace( r20, "+" );
6814
        }
6815
});
6816

    
6817
function buildParams( prefix, obj, traditional, add ) {
6818
        if ( jQuery.isArray( obj ) && obj.length ) {
6819
                // Serialize array item.
6820
                jQuery.each( obj, function( i, v ) {
6821
                        if ( traditional || rbracket.test( prefix ) ) {
6822
                                // Treat each array item as a scalar.
6823
                                add( prefix, v );
6824

    
6825
                        } else {
6826
                                // If array item is non-scalar (array or object), encode its
6827
                                // numeric index to resolve deserialization ambiguity issues.
6828
                                // Note that rack (as of 1.0.0) can't currently deserialize
6829
                                // nested arrays properly, and attempting to do so may cause
6830
                                // a server error. Possible fixes are to modify rack's
6831
                                // deserialization algorithm or to provide an option or flag
6832
                                // to force array serialization to be shallow.
6833
                                buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
6834
                        }
6835
                });
6836

    
6837
        } else if ( !traditional && obj != null && typeof obj === "object" ) {
6838
                // If we see an array here, it is empty and should be treated as an empty
6839
                // object
6840
                if ( jQuery.isArray( obj ) || jQuery.isEmptyObject( obj ) ) {
6841
                        add( prefix, "" );
6842

    
6843
                // Serialize object item.
6844
                } else {
6845
                        for ( var name in obj ) {
6846
                                buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
6847
                        }
6848
                }
6849

    
6850
        } else {
6851
                // Serialize scalar item.
6852
                add( prefix, obj );
6853
        }
6854
}
6855

    
6856
// This is still on the jQuery object... for now
6857
// Want to move this to jQuery.ajax some day
6858
jQuery.extend({
6859

    
6860
        // Counter for holding the number of active queries
6861
        active: 0,
6862

    
6863
        // Last-Modified header cache for next request
6864
        lastModified: {},
6865
        etag: {}
6866

    
6867
});
6868

    
6869
/* Handles responses to an ajax request:
6870
 * - sets all responseXXX fields accordingly
6871
 * - finds the right dataType (mediates between content-type and expected dataType)
6872
 * - returns the corresponding response
6873
 */
6874
function ajaxHandleResponses( s, jqXHR, responses ) {
6875

    
6876
        var contents = s.contents,
6877
                dataTypes = s.dataTypes,
6878
                responseFields = s.responseFields,
6879
                ct,
6880
                type,
6881
                finalDataType,
6882
                firstDataType;
6883

    
6884
        // Fill responseXXX fields
6885
        for( type in responseFields ) {
6886
                if ( type in responses ) {
6887
                        jqXHR[ responseFields[type] ] = responses[ type ];
6888
                }
6889
        }
6890

    
6891
        // Remove auto dataType and get content-type in the process
6892
        while( dataTypes[ 0 ] === "*" ) {
6893
                dataTypes.shift();
6894
                if ( ct === undefined ) {
6895
                        ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
6896
                }
6897
        }
6898

    
6899
        // Check if we're dealing with a known content-type
6900
        if ( ct ) {
6901
                for ( type in contents ) {
6902
                        if ( contents[ type ] && contents[ type ].test( ct ) ) {
6903
                                dataTypes.unshift( type );
6904
                                break;
6905
                        }
6906
                }
6907
        }
6908

    
6909
        // Check to see if we have a response for the expected dataType
6910
        if ( dataTypes[ 0 ] in responses ) {
6911
                finalDataType = dataTypes[ 0 ];
6912
        } else {
6913
                // Try convertible dataTypes
6914
                for ( type in responses ) {
6915
                        if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
6916
                                finalDataType = type;
6917
                                break;
6918
                        }
6919
                        if ( !firstDataType ) {
6920
                                firstDataType = type;
6921
                        }
6922
                }
6923
                // Or just use first one
6924
                finalDataType = finalDataType || firstDataType;
6925
        }
6926

    
6927
        // If we found a dataType
6928
        // We add the dataType to the list if needed
6929
        // and return the corresponding response
6930
        if ( finalDataType ) {
6931
                if ( finalDataType !== dataTypes[ 0 ] ) {
6932
                        dataTypes.unshift( finalDataType );
6933
                }
6934
                return responses[ finalDataType ];
6935
        }
6936
}
6937

    
6938
// Chain conversions given the request and the original response
6939
function ajaxConvert( s, response ) {
6940

    
6941
        // Apply the dataFilter if provided
6942
        if ( s.dataFilter ) {
6943
                response = s.dataFilter( response, s.dataType );
6944
        }
6945

    
6946
        var dataTypes = s.dataTypes,
6947
                converters = {},
6948
                i,
6949
                key,
6950
                length = dataTypes.length,
6951
                tmp,
6952
                // Current and previous dataTypes
6953
                current = dataTypes[ 0 ],
6954
                prev,
6955
                // Conversion expression
6956
                conversion,
6957
                // Conversion function
6958
                conv,
6959
                // Conversion functions (transitive conversion)
6960
                conv1,
6961
                conv2;
6962

    
6963
        // For each dataType in the chain
6964
        for( i = 1; i < length; i++ ) {
6965

    
6966
                // Create converters map
6967
                // with lowercased keys
6968
                if ( i === 1 ) {
6969
                        for( key in s.converters ) {
6970
                                if( typeof key === "string" ) {
6971
                                        converters[ key.toLowerCase() ] = s.converters[ key ];
6972
                                }
6973
                        }
6974
                }
6975

    
6976
                // Get the dataTypes
6977
                prev = current;
6978
                current = dataTypes[ i ];
6979

    
6980
                // If current is auto dataType, update it to prev
6981
                if( current === "*" ) {
6982
                        current = prev;
6983
                // If no auto and dataTypes are actually different
6984
                } else if ( prev !== "*" && prev !== current ) {
6985

    
6986
                        // Get the converter
6987
                        conversion = prev + " " + current;
6988
                        conv = converters[ conversion ] || converters[ "* " + current ];
6989

    
6990
                        // If there is no direct converter, search transitively
6991
                        if ( !conv ) {
6992
                                conv2 = undefined;
6993
                                for( conv1 in converters ) {
6994
                                        tmp = conv1.split( " " );
6995
                                        if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
6996
                                                conv2 = converters[ tmp[1] + " " + current ];
6997
                                                if ( conv2 ) {
6998
                                                        conv1 = converters[ conv1 ];
6999
                                                        if ( conv1 === true ) {
7000
                                                                conv = conv2;
7001
                                                        } else if ( conv2 === true ) {
7002
                                                                conv = conv1;
7003
                                                        }
7004
                                                        break;
7005
                                                }
7006
                                        }
7007
                                }
7008
                        }
7009
                        // If we found no converter, dispatch an error
7010
                        if ( !( conv || conv2 ) ) {
7011
                                jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
7012
                        }
7013
                        // If found converter is not an equivalence
7014
                        if ( conv !== true ) {
7015
                                // Convert with 1 or 2 converters accordingly
7016
                                response = conv ? conv( response ) : conv2( conv1(response) );
7017
                        }
7018
                }
7019
        }
7020
        return response;
7021
}
7022

    
7023

    
7024

    
7025

    
7026
var jsc = jQuery.now(),
7027
        jsre = /(\=)\?(&|$)|()\?\?()/i;
7028

    
7029
// Default jsonp settings
7030
jQuery.ajaxSetup({
7031
        jsonp: "callback",
7032
        jsonpCallback: function() {
7033
                return jQuery.expando + "_" + ( jsc++ );
7034
        }
7035
});
7036

    
7037
// Detect, normalize options and install callbacks for jsonp requests
7038
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
7039

    
7040
        var dataIsString = ( typeof s.data === "string" );
7041

    
7042
        if ( s.dataTypes[ 0 ] === "jsonp" ||
7043
                originalSettings.jsonpCallback ||
7044
                originalSettings.jsonp != null ||
7045
                s.jsonp !== false && ( jsre.test( s.url ) ||
7046
                                dataIsString && jsre.test( s.data ) ) ) {
7047

    
7048
                var responseContainer,
7049
                        jsonpCallback = s.jsonpCallback =
7050
                                jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
7051
                        previous = window[ jsonpCallback ],
7052
                        url = s.url,
7053
                        data = s.data,
7054
                        replace = "$1" + jsonpCallback + "$2",
7055
                        cleanUp = function() {
7056
                                // Set callback back to previous value
7057
                                window[ jsonpCallback ] = previous;
7058
                                // Call if it was a function and we have a response
7059
                                if ( responseContainer && jQuery.isFunction( previous ) ) {
7060
                                        window[ jsonpCallback ]( responseContainer[ 0 ] );
7061
                                }
7062
                        };
7063

    
7064
                if ( s.jsonp !== false ) {
7065
                        url = url.replace( jsre, replace );
7066
                        if ( s.url === url ) {
7067
                                if ( dataIsString ) {
7068
                                        data = data.replace( jsre, replace );
7069
                                }
7070
                                if ( s.data === data ) {
7071
                                        // Add callback manually
7072
                                        url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
7073
                                }
7074
                        }
7075
                }
7076

    
7077
                s.url = url;
7078
                s.data = data;
7079

    
7080
                // Install callback
7081
                window[ jsonpCallback ] = function( response ) {
7082
                        responseContainer = [ response ];
7083
                };
7084

    
7085
                // Install cleanUp function
7086
                jqXHR.then( cleanUp, cleanUp );
7087

    
7088
                // Use data converter to retrieve json after script execution
7089
                s.converters["script json"] = function() {
7090
                        if ( !responseContainer ) {
7091
                                jQuery.error( jsonpCallback + " was not called" );
7092
                        }
7093
                        return responseContainer[ 0 ];
7094
                };
7095

    
7096
                // force json dataType
7097
                s.dataTypes[ 0 ] = "json";
7098

    
7099
                // Delegate to script
7100
                return "script";
7101
        }
7102
} );
7103

    
7104

    
7105

    
7106

    
7107
// Install script dataType
7108
jQuery.ajaxSetup({
7109
        accepts: {
7110
                script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
7111
        },
7112
        contents: {
7113
                script: /javascript|ecmascript/
7114
        },
7115
        converters: {
7116
                "text script": function( text ) {
7117
                        jQuery.globalEval( text );
7118
                        return text;
7119
                }
7120
        }
7121
});
7122

    
7123
// Handle cache's special case and global
7124
jQuery.ajaxPrefilter( "script", function( s ) {
7125
        if ( s.cache === undefined ) {
7126
                s.cache = false;
7127
        }
7128
        if ( s.crossDomain ) {
7129
                s.type = "GET";
7130
                s.global = false;
7131
        }
7132
} );
7133

    
7134
// Bind script tag hack transport
7135
jQuery.ajaxTransport( "script", function(s) {
7136

    
7137
        // This transport only deals with cross domain requests
7138
        if ( s.crossDomain ) {
7139

    
7140
                var script,
7141
                        head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
7142

    
7143
                return {
7144

    
7145
                        send: function( _, callback ) {
7146

    
7147
                                script = document.createElement( "script" );
7148

    
7149
                                script.async = "async";
7150

    
7151
                                if ( s.scriptCharset ) {
7152
                                        script.charset = s.scriptCharset;
7153
                                }
7154

    
7155
                                script.src = s.url;
7156

    
7157
                                // Attach handlers for all browsers
7158
                                script.onload = script.onreadystatechange = function( _, isAbort ) {
7159

    
7160
                                        if ( !script.readyState || /loaded|complete/.test( script.readyState ) ) {
7161

    
7162
                                                // Handle memory leak in IE
7163
                                                script.onload = script.onreadystatechange = null;
7164

    
7165
                                                // Remove the script
7166
                                                if ( head && script.parentNode ) {
7167
                                                        head.removeChild( script );
7168
                                                }
7169

    
7170
                                                // Dereference the script
7171
                                                script = undefined;
7172

    
7173
                                                // Callback if not abort
7174
                                                if ( !isAbort ) {
7175
                                                        callback( 200, "success" );
7176
                                                }
7177
                                        }
7178
                                };
7179
                                // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
7180
                                // This arises when a base node is used (#2709 and #4378).
7181
                                head.insertBefore( script, head.firstChild );
7182
                        },
7183

    
7184
                        abort: function() {
7185
                                if ( script ) {
7186
                                        script.onload( 0, 1 );
7187
                                }
7188
                        }
7189
                };
7190
        }
7191
} );
7192

    
7193

    
7194

    
7195

    
7196
var // #5280: next active xhr id and list of active xhrs' callbacks
7197
        xhrId = jQuery.now(),
7198
        xhrCallbacks,
7199

    
7200
        // XHR used to determine supports properties
7201
        testXHR;
7202

    
7203
// #5280: Internet Explorer will keep connections alive if we don't abort on unload
7204
function xhrOnUnloadAbort() {
7205
        jQuery( window ).unload(function() {
7206
                // Abort all pending requests
7207
                for ( var key in xhrCallbacks ) {
7208
                        xhrCallbacks[ key ]( 0, 1 );
7209
                }
7210
        });
7211
}
7212

    
7213
// Functions to create xhrs
7214
function createStandardXHR() {
7215
        try {
7216
                return new window.XMLHttpRequest();
7217
        } catch( e ) {}
7218
}
7219

    
7220
function createActiveXHR() {
7221
        try {
7222
                return new window.ActiveXObject( "Microsoft.XMLHTTP" );
7223
        } catch( e ) {}
7224
}
7225

    
7226
// Create the request object
7227
// (This is still attached to ajaxSettings for backward compatibility)
7228
jQuery.ajaxSettings.xhr = window.ActiveXObject ?
7229
        /* Microsoft failed to properly
7230
         * implement the XMLHttpRequest in IE7 (can't request local files),
7231
         * so we use the ActiveXObject when it is available
7232
         * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
7233
         * we need a fallback.
7234
         */
7235
        function() {
7236
                return !this.isLocal && createStandardXHR() || createActiveXHR();
7237
        } :
7238
        // For all other browsers, use the standard XMLHttpRequest object
7239
        createStandardXHR;
7240

    
7241
// Test if we can create an xhr object
7242
testXHR = jQuery.ajaxSettings.xhr();
7243
jQuery.support.ajax = !!testXHR;
7244

    
7245
// Does this browser support crossDomain XHR requests
7246
jQuery.support.cors = testXHR && ( "withCredentials" in testXHR );
7247

    
7248
// No need for the temporary xhr anymore
7249
testXHR = undefined;
7250

    
7251
// Create transport if the browser can provide an xhr
7252
if ( jQuery.support.ajax ) {
7253

    
7254
        jQuery.ajaxTransport(function( s ) {
7255
                // Cross domain only allowed if supported through XMLHttpRequest
7256
                if ( !s.crossDomain || jQuery.support.cors ) {
7257

    
7258
                        var callback;
7259

    
7260
                        return {
7261
                                send: function( headers, complete ) {
7262

    
7263
                                        // Get a new xhr
7264
                                        var xhr = s.xhr(),
7265
                                                handle,
7266
                                                i;
7267

    
7268
                                        // Open the socket
7269
                                        // Passing null username, generates a login popup on Opera (#2865)
7270
                                        if ( s.username ) {
7271
                                                xhr.open( s.type, s.url, s.async, s.username, s.password );
7272
                                        } else {
7273
                                                xhr.open( s.type, s.url, s.async );
7274
                                        }
7275

    
7276
                                        // Apply custom fields if provided
7277
                                        if ( s.xhrFields ) {
7278
                                                for ( i in s.xhrFields ) {
7279
                                                        xhr[ i ] = s.xhrFields[ i ];
7280
                                                }
7281
                                        }
7282

    
7283
                                        // Override mime type if needed
7284
                                        if ( s.mimeType && xhr.overrideMimeType ) {
7285
                                                xhr.overrideMimeType( s.mimeType );
7286
                                        }
7287

    
7288
                                        // Requested-With header
7289
                                        // Not set for crossDomain requests with no content
7290
                                        // (see why at http://trac.dojotoolkit.org/ticket/9486)
7291
                                        // Won't change header if already provided
7292
                                        if ( !( s.crossDomain && !s.hasContent ) && !headers["X-Requested-With"] ) {
7293
                                                headers[ "X-Requested-With" ] = "XMLHttpRequest";
7294
                                        }
7295

    
7296
                                        // Need an extra try/catch for cross domain requests in Firefox 3
7297
                                        try {
7298
                                                for ( i in headers ) {
7299
                                                        xhr.setRequestHeader( i, headers[ i ] );
7300
                                                }
7301
                                        } catch( _ ) {}
7302

    
7303
                                        // Do send the request
7304
                                        // This may raise an exception which is actually
7305
                                        // handled in jQuery.ajax (so no try/catch here)
7306
                                        xhr.send( ( s.hasContent && s.data ) || null );
7307

    
7308
                                        // Listener
7309
                                        callback = function( _, isAbort ) {
7310

    
7311
                                                var status,
7312
                                                        statusText,
7313
                                                        responseHeaders,
7314
                                                        responses,
7315
                                                        xml;
7316

    
7317
                                                // Firefox throws exceptions when accessing properties
7318
                                                // of an xhr when a network error occured
7319
                                                // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
7320
                                                try {
7321

    
7322
                                                        // Was never called and is aborted or complete
7323
                                                        if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
7324

    
7325
                                                                // Only called once
7326
                                                                callback = undefined;
7327

    
7328
                                                                // Do not keep as active anymore
7329
                                                                if ( handle ) {
7330
                                                                        xhr.onreadystatechange = jQuery.noop;
7331
                                                                        delete xhrCallbacks[ handle ];
7332
                                                                }
7333

    
7334
                                                                // If it's an abort
7335
                                                                if ( isAbort ) {
7336
                                                                        // Abort it manually if needed
7337
                                                                        if ( xhr.readyState !== 4 ) {
7338
                                                                                xhr.abort();
7339
                                                                        }
7340
                                                                } else {
7341
                                                                        status = xhr.status;
7342
                                                                        responseHeaders = xhr.getAllResponseHeaders();
7343
                                                                        responses = {};
7344
                                                                        xml = xhr.responseXML;
7345

    
7346
                                                                        // Construct response list
7347
                                                                        if ( xml && xml.documentElement /* #4958 */ ) {
7348
                                                                                responses.xml = xml;
7349
                                                                        }
7350
                                                                        responses.text = xhr.responseText;
7351

    
7352
                                                                        // Firefox throws an exception when accessing
7353
                                                                        // statusText for faulty cross-domain requests
7354
                                                                        try {
7355
                                                                                statusText = xhr.statusText;
7356
                                                                        } catch( e ) {
7357
                                                                                // We normalize with Webkit giving an empty statusText
7358
                                                                                statusText = "";
7359
                                                                        }
7360

    
7361
                                                                        // Filter status for non standard behaviors
7362

    
7363
                                                                        // If the request is local and we have data: assume a success
7364
                                                                        // (success with no data won't get notified, that's the best we
7365
                                                                        // can do given current implementations)
7366
                                                                        if ( !status && s.isLocal && !s.crossDomain ) {
7367
                                                                                status = responses.text ? 200 : 404;
7368
                                                                        // IE - #1450: sometimes returns 1223 when it should be 204
7369
                                                                        } else if ( status === 1223 ) {
7370
                                                                                status = 204;
7371
                                                                        }
7372
                                                                }
7373
                                                        }
7374
                                                } catch( firefoxAccessException ) {
7375
                                                        if ( !isAbort ) {
7376
                                                                complete( -1, firefoxAccessException );
7377
                                                        }
7378
                                                }
7379

    
7380
                                                // Call complete if needed
7381
                                                if ( responses ) {
7382
                                                        complete( status, statusText, responses, responseHeaders );
7383
                                                }
7384
                                        };
7385

    
7386
                                        // if we're in sync mode or it's in cache
7387
                                        // and has been retrieved directly (IE6 & IE7)
7388
                                        // we need to manually fire the callback
7389
                                        if ( !s.async || xhr.readyState === 4 ) {
7390
                                                callback();
7391
                                        } else {
7392
                                                // Create the active xhrs callbacks list if needed
7393
                                                // and attach the unload handler
7394
                                                if ( !xhrCallbacks ) {
7395
                                                        xhrCallbacks = {};
7396
                                                        xhrOnUnloadAbort();
7397
                                                }
7398
                                                // Add to list of active xhrs callbacks
7399
                                                handle = xhrId++;
7400
                                                xhr.onreadystatechange = xhrCallbacks[ handle ] = callback;
7401
                                        }
7402
                                },
7403

    
7404
                                abort: function() {
7405
                                        if ( callback ) {
7406
                                                callback(0,1);
7407
                                        }
7408
                                }
7409
                        };
7410
                }
7411
        });
7412
}
7413

    
7414

    
7415

    
7416

    
7417
var elemdisplay = {},
7418
        rfxtypes = /^(?:toggle|show|hide)$/,
7419
        rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
7420
        timerId,
7421
        fxAttrs = [
7422
                // height animations
7423
                [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
7424
                // width animations
7425
                [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
7426
                // opacity animations
7427
                [ "opacity" ]
7428
        ];
7429

    
7430
jQuery.fn.extend({
7431
        show: function( speed, easing, callback ) {
7432
                var elem, display;
7433

    
7434
                if ( speed || speed === 0 ) {
7435
                        return this.animate( genFx("show", 3), speed, easing, callback);
7436

    
7437
                } else {
7438
                        for ( var i = 0, j = this.length; i < j; i++ ) {
7439
                                elem = this[i];
7440
                                display = elem.style.display;
7441

    
7442
                                // Reset the inline display of this element to learn if it is
7443
                                // being hidden by cascaded rules or not
7444
                                if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
7445
                                        display = elem.style.display = "";
7446
                                }
7447

    
7448
                                // Set elements which have been overridden with display: none
7449
                                // in a stylesheet to whatever the default browser style is
7450
                                // for such an element
7451
                                if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
7452
                                        jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
7453
                                }
7454
                        }
7455

    
7456
                        // Set the display of most of the elements in a second loop
7457
                        // to avoid the constant reflow
7458
                        for ( i = 0; i < j; i++ ) {
7459
                                elem = this[i];
7460
                                display = elem.style.display;
7461

    
7462
                                if ( display === "" || display === "none" ) {
7463
                                        elem.style.display = jQuery._data(elem, "olddisplay") || "";
7464
                                }
7465
                        }
7466

    
7467
                        return this;
7468
                }
7469
        },
7470

    
7471
        hide: function( speed, easing, callback ) {
7472
                if ( speed || speed === 0 ) {
7473
                        return this.animate( genFx("hide", 3), speed, easing, callback);
7474

    
7475
                } else {
7476
                        for ( var i = 0, j = this.length; i < j; i++ ) {
7477
                                var display = jQuery.css( this[i], "display" );
7478

    
7479
                                if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
7480
                                        jQuery._data( this[i], "olddisplay", display );
7481
                                }
7482
                        }
7483

    
7484
                        // Set the display of the elements in a second loop
7485
                        // to avoid the constant reflow
7486
                        for ( i = 0; i < j; i++ ) {
7487
                                this[i].style.display = "none";
7488
                        }
7489

    
7490
                        return this;
7491
                }
7492
        },
7493

    
7494
        // Save the old toggle function
7495
        _toggle: jQuery.fn.toggle,
7496

    
7497
        toggle: function( fn, fn2, callback ) {
7498
                var bool = typeof fn === "boolean";
7499

    
7500
                if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
7501
                        this._toggle.apply( this, arguments );
7502

    
7503
                } else if ( fn == null || bool ) {
7504
                        this.each(function() {
7505
                                var state = bool ? fn : jQuery(this).is(":hidden");
7506
                                jQuery(this)[ state ? "show" : "hide" ]();
7507
                        });
7508

    
7509
                } else {
7510
                        this.animate(genFx("toggle", 3), fn, fn2, callback);
7511
                }
7512

    
7513
                return this;
7514
        },
7515

    
7516
        fadeTo: function( speed, to, easing, callback ) {
7517
                return this.filter(":hidden").css("opacity", 0).show().end()
7518
                                        .animate({opacity: to}, speed, easing, callback);
7519
        },
7520

    
7521
        animate: function( prop, speed, easing, callback ) {
7522
                var optall = jQuery.speed(speed, easing, callback);
7523

    
7524
                if ( jQuery.isEmptyObject( prop ) ) {
7525
                        return this.each( optall.complete );
7526
                }
7527

    
7528
                return this[ optall.queue === false ? "each" : "queue" ](function() {
7529
                        // XXX 'this' does not always have a nodeName when running the
7530
                        // test suite
7531

    
7532
                        var opt = jQuery.extend({}, optall), p,
7533
                                isElement = this.nodeType === 1,
7534
                                hidden = isElement && jQuery(this).is(":hidden"),
7535
                                self = this;
7536

    
7537
                        for ( p in prop ) {
7538
                                var name = jQuery.camelCase( p );
7539

    
7540
                                if ( p !== name ) {
7541
                                        prop[ name ] = prop[ p ];
7542
                                        delete prop[ p ];
7543
                                        p = name;
7544
                                }
7545

    
7546
                                if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {
7547
                                        return opt.complete.call(this);
7548
                                }
7549

    
7550
                                if ( isElement && ( p === "height" || p === "width" ) ) {
7551
                                        // Make sure that nothing sneaks out
7552
                                        // Record all 3 overflow attributes because IE does not
7553
                                        // change the overflow attribute when overflowX and
7554
                                        // overflowY are set to the same value
7555
                                        opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
7556

    
7557
                                        // Set display property to inline-block for height/width
7558
                                        // animations on inline elements that are having width/height
7559
                                        // animated
7560
                                        if ( jQuery.css( this, "display" ) === "inline" &&
7561
                                                        jQuery.css( this, "float" ) === "none" ) {
7562
                                                if ( !jQuery.support.inlineBlockNeedsLayout ) {
7563
                                                        this.style.display = "inline-block";
7564

    
7565
                                                } else {
7566
                                                        var display = defaultDisplay(this.nodeName);
7567

    
7568
                                                        // inline-level elements accept inline-block;
7569
                                                        // block-level elements need to be inline with layout
7570
                                                        if ( display === "inline" ) {
7571
                                                                this.style.display = "inline-block";
7572

    
7573
                                                        } else {
7574
                                                                this.style.display = "inline";
7575
                                                                this.style.zoom = 1;
7576
                                                        }
7577
                                                }
7578
                                        }
7579
                                }
7580

    
7581
                                if ( jQuery.isArray( prop[p] ) ) {
7582
                                        // Create (if needed) and add to specialEasing
7583
                                        (opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
7584
                                        prop[p] = prop[p][0];
7585
                                }
7586
                        }
7587

    
7588
                        if ( opt.overflow != null ) {
7589
                                this.style.overflow = "hidden";
7590
                        }
7591

    
7592
                        opt.curAnim = jQuery.extend({}, prop);
7593

    
7594
                        jQuery.each( prop, function( name, val ) {
7595
                                var e = new jQuery.fx( self, opt, name );
7596

    
7597
                                if ( rfxtypes.test(val) ) {
7598
                                        e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );
7599

    
7600
                                } else {
7601
                                        var parts = rfxnum.exec(val),
7602
                                                start = e.cur();
7603

    
7604
                                        if ( parts ) {
7605
                                                var end = parseFloat( parts[2] ),
7606
                                                        unit = parts[3] || ( jQuery.cssNumber[ name ] ? "" : "px" );
7607

    
7608
                                                // We need to compute starting value
7609
                                                if ( unit !== "px" ) {
7610
                                                        jQuery.style( self, name, (end || 1) + unit);
7611
                                                        start = ((end || 1) / e.cur()) * start;
7612
                                                        jQuery.style( self, name, start + unit);
7613
                                                }
7614

    
7615
                                                // If a +=/-= token was provided, we're doing a relative animation
7616
                                                if ( parts[1] ) {
7617
                                                        end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
7618
                                                }
7619

    
7620
                                                e.custom( start, end, unit );
7621

    
7622
                                        } else {
7623
                                                e.custom( start, val, "" );
7624
                                        }
7625
                                }
7626
                        });
7627

    
7628
                        // For JS strict compliance
7629
                        return true;
7630
                });
7631
        },
7632

    
7633
        stop: function( clearQueue, gotoEnd ) {
7634
                var timers = jQuery.timers;
7635

    
7636
                if ( clearQueue ) {
7637
                        this.queue([]);
7638
                }
7639

    
7640
                this.each(function() {
7641
                        // go in reverse order so anything added to the queue during the loop is ignored
7642
                        for ( var i = timers.length - 1; i >= 0; i-- ) {
7643
                                if ( timers[i].elem === this ) {
7644
                                        if (gotoEnd) {
7645
                                                // force the next step to be the last
7646
                                                timers[i](true);
7647
                                        }
7648

    
7649
                                        timers.splice(i, 1);
7650
                                }
7651
                        }
7652
                });
7653

    
7654
                // start the next in the queue if the last step wasn't forced
7655
                if ( !gotoEnd ) {
7656
                        this.dequeue();
7657
                }
7658

    
7659
                return this;
7660
        }
7661

    
7662
});
7663

    
7664
function genFx( type, num ) {
7665
        var obj = {};
7666

    
7667
        jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
7668
                obj[ this ] = type;
7669
        });
7670

    
7671
        return obj;
7672
}
7673

    
7674
// Generate shortcuts for custom animations
7675
jQuery.each({
7676
        slideDown: genFx("show", 1),
7677
        slideUp: genFx("hide", 1),
7678
        slideToggle: genFx("toggle", 1),
7679
        fadeIn: { opacity: "show" },
7680
        fadeOut: { opacity: "hide" },
7681
        fadeToggle: { opacity: "toggle" }
7682
}, function( name, props ) {
7683
        jQuery.fn[ name ] = function( speed, easing, callback ) {
7684
                return this.animate( props, speed, easing, callback );
7685
        };
7686
});
7687

    
7688
jQuery.extend({
7689
        speed: function( speed, easing, fn ) {
7690
                var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
7691
                        complete: fn || !fn && easing ||
7692
                                jQuery.isFunction( speed ) && speed,
7693
                        duration: speed,
7694
                        easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
7695
                };
7696

    
7697
                opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
7698
                        opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
7699

    
7700
                // Queueing
7701
                opt.old = opt.complete;
7702
                opt.complete = function() {
7703
                        if ( opt.queue !== false ) {
7704
                                jQuery(this).dequeue();
7705
                        }
7706
                        if ( jQuery.isFunction( opt.old ) ) {
7707
                                opt.old.call( this );
7708
                        }
7709
                };
7710

    
7711
                return opt;
7712
        },
7713

    
7714
        easing: {
7715
                linear: function( p, n, firstNum, diff ) {
7716
                        return firstNum + diff * p;
7717
                },
7718
                swing: function( p, n, firstNum, diff ) {
7719
                        return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
7720
                }
7721
        },
7722

    
7723
        timers: [],
7724

    
7725
        fx: function( elem, options, prop ) {
7726
                this.options = options;
7727
                this.elem = elem;
7728
                this.prop = prop;
7729

    
7730
                if ( !options.orig ) {
7731
                        options.orig = {};
7732
                }
7733
        }
7734

    
7735
});
7736

    
7737
jQuery.fx.prototype = {
7738
        // Simple function for setting a style value
7739
        update: function() {
7740
                if ( this.options.step ) {
7741
                        this.options.step.call( this.elem, this.now, this );
7742
                }
7743

    
7744
                (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
7745
        },
7746

    
7747
        // Get the current size
7748
        cur: function() {
7749
                if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
7750
                        return this.elem[ this.prop ];
7751
                }
7752

    
7753
                var parsed,
7754
                        r = jQuery.css( this.elem, this.prop );
7755
                // Empty strings, null, undefined and "auto" are converted to 0,
7756
                // complex values such as "rotate(1rad)" are returned as is,
7757
                // simple values such as "10px" are parsed to Float.
7758
                return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
7759
        },
7760

    
7761
        // Start an animation from one number to another
7762
        custom: function( from, to, unit ) {
7763
                var self = this,
7764
                        fx = jQuery.fx;
7765

    
7766
                this.startTime = jQuery.now();
7767
                this.start = from;
7768
                this.end = to;
7769
                this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
7770
                this.now = this.start;
7771
                this.pos = this.state = 0;
7772

    
7773
                function t( gotoEnd ) {
7774
                        return self.step(gotoEnd);
7775
                }
7776

    
7777
                t.elem = this.elem;
7778

    
7779
                if ( t() && jQuery.timers.push(t) && !timerId ) {
7780
                        timerId = setInterval(fx.tick, fx.interval);
7781
                }
7782
        },
7783

    
7784
        // Simple 'show' function
7785
        show: function() {
7786
                // Remember where we started, so that we can go back to it later
7787
                this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
7788
                this.options.show = true;
7789

    
7790
                // Begin the animation
7791
                // Make sure that we start at a small width/height to avoid any
7792
                // flash of content
7793
                this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
7794

    
7795
                // Start by showing the element
7796
                jQuery( this.elem ).show();
7797
        },
7798

    
7799
        // Simple 'hide' function
7800
        hide: function() {
7801
                // Remember where we started, so that we can go back to it later
7802
                this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
7803
                this.options.hide = true;
7804

    
7805
                // Begin the animation
7806
                this.custom(this.cur(), 0);
7807
        },
7808

    
7809
        // Each step of an animation
7810
        step: function( gotoEnd ) {
7811
                var t = jQuery.now(), done = true;
7812

    
7813
                if ( gotoEnd || t >= this.options.duration + this.startTime ) {
7814
                        this.now = this.end;
7815
                        this.pos = this.state = 1;
7816
                        this.update();
7817

    
7818
                        this.options.curAnim[ this.prop ] = true;
7819

    
7820
                        for ( var i in this.options.curAnim ) {
7821
                                if ( this.options.curAnim[i] !== true ) {
7822
                                        done = false;
7823
                                }
7824
                        }
7825

    
7826
                        if ( done ) {
7827
                                // Reset the overflow
7828
                                if ( this.options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
7829
                                        var elem = this.elem,
7830
                                                options = this.options;
7831

    
7832
                                        jQuery.each( [ "", "X", "Y" ], function (index, value) {
7833
                                                elem.style[ "overflow" + value ] = options.overflow[index];
7834
                                        } );
7835
                                }
7836

    
7837
                                // Hide the element if the "hide" operation was done
7838
                                if ( this.options.hide ) {
7839
                                        jQuery(this.elem).hide();
7840
                                }
7841

    
7842
                                // Reset the properties, if the item has been hidden or shown
7843
                                if ( this.options.hide || this.options.show ) {
7844
                                        for ( var p in this.options.curAnim ) {
7845
                                                jQuery.style( this.elem, p, this.options.orig[p] );
7846
                                        }
7847
                                }
7848

    
7849
                                // Execute the complete function
7850
                                this.options.complete.call( this.elem );
7851
                        }
7852

    
7853
                        return false;
7854

    
7855
                } else {
7856
                        var n = t - this.startTime;
7857
                        this.state = n / this.options.duration;
7858

    
7859
                        // Perform the easing function, defaults to swing
7860
                        var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
7861
                        var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
7862
                        this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
7863
                        this.now = this.start + ((this.end - this.start) * this.pos);
7864

    
7865
                        // Perform the next step of the animation
7866
                        this.update();
7867
                }
7868

    
7869
                return true;
7870
        }
7871
};
7872

    
7873
jQuery.extend( jQuery.fx, {
7874
        tick: function() {
7875
                var timers = jQuery.timers;
7876

    
7877
                for ( var i = 0; i < timers.length; i++ ) {
7878
                        if ( !timers[i]() ) {
7879
                                timers.splice(i--, 1);
7880
                        }
7881
                }
7882

    
7883
                if ( !timers.length ) {
7884
                        jQuery.fx.stop();
7885
                }
7886
        },
7887

    
7888
        interval: 13,
7889

    
7890
        stop: function() {
7891
                clearInterval( timerId );
7892
                timerId = null;
7893
        },
7894

    
7895
        speeds: {
7896
                slow: 600,
7897
                fast: 200,
7898
                // Default speed
7899
                _default: 400
7900
        },
7901

    
7902
        step: {
7903
                opacity: function( fx ) {
7904
                        jQuery.style( fx.elem, "opacity", fx.now );
7905
                },
7906

    
7907
                _default: function( fx ) {
7908
                        if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
7909
                                fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
7910
                        } else {
7911
                                fx.elem[ fx.prop ] = fx.now;
7912
                        }
7913
                }
7914
        }
7915
});
7916

    
7917
if ( jQuery.expr && jQuery.expr.filters ) {
7918
        jQuery.expr.filters.animated = function( elem ) {
7919
                return jQuery.grep(jQuery.timers, function( fn ) {
7920
                        return elem === fn.elem;
7921
                }).length;
7922
        };
7923
}
7924

    
7925
function defaultDisplay( nodeName ) {
7926
        if ( !elemdisplay[ nodeName ] ) {
7927
                var elem = jQuery("<" + nodeName + ">").appendTo("body"),
7928
                        display = elem.css("display");
7929

    
7930
                elem.remove();
7931

    
7932
                if ( display === "none" || display === "" ) {
7933
                        display = "block";
7934
                }
7935

    
7936
                elemdisplay[ nodeName ] = display;
7937
        }
7938

    
7939
        return elemdisplay[ nodeName ];
7940
}
7941

    
7942

    
7943

    
7944

    
7945
var rtable = /^t(?:able|d|h)$/i,
7946
        rroot = /^(?:body|html)$/i;
7947

    
7948
if ( "getBoundingClientRect" in document.documentElement ) {
7949
        jQuery.fn.offset = function( options ) {
7950
                var elem = this[0], box;
7951

    
7952
                if ( options ) {
7953
                        return this.each(function( i ) {
7954
                                jQuery.offset.setOffset( this, options, i );
7955
                        });
7956
                }
7957

    
7958
                if ( !elem || !elem.ownerDocument ) {
7959
                        return null;
7960
                }
7961

    
7962
                if ( elem === elem.ownerDocument.body ) {
7963
                        return jQuery.offset.bodyOffset( elem );
7964
                }
7965

    
7966
                try {
7967
                        box = elem.getBoundingClientRect();
7968
                } catch(e) {}
7969

    
7970
                var doc = elem.ownerDocument,
7971
                        docElem = doc.documentElement;
7972

    
7973
                // Make sure we're not dealing with a disconnected DOM node
7974
                if ( !box || !jQuery.contains( docElem, elem ) ) {
7975
                        return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
7976
                }
7977

    
7978
                var body = doc.body,
7979
                        win = getWindow(doc),
7980
                        clientTop  = docElem.clientTop  || body.clientTop  || 0,
7981
                        clientLeft = docElem.clientLeft || body.clientLeft || 0,
7982
                        scrollTop  = (win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop ),
7983
                        scrollLeft = (win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft),
7984
                        top  = box.top  + scrollTop  - clientTop,
7985
                        left = box.left + scrollLeft - clientLeft;
7986

    
7987
                return { top: top, left: left };
7988
        };
7989

    
7990
} else {
7991
        jQuery.fn.offset = function( options ) {
7992
                var elem = this[0];
7993

    
7994
                if ( options ) {
7995
                        return this.each(function( i ) {
7996
                                jQuery.offset.setOffset( this, options, i );
7997
                        });
7998
                }
7999

    
8000
                if ( !elem || !elem.ownerDocument ) {
8001
                        return null;
8002
                }
8003

    
8004
                if ( elem === elem.ownerDocument.body ) {
8005
                        return jQuery.offset.bodyOffset( elem );
8006
                }
8007

    
8008
                jQuery.offset.initialize();
8009

    
8010
                var computedStyle,
8011
                        offsetParent = elem.offsetParent,
8012
                        prevOffsetParent = elem,
8013
                        doc = elem.ownerDocument,
8014
                        docElem = doc.documentElement,
8015
                        body = doc.body,
8016
                        defaultView = doc.defaultView,
8017
                        prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
8018
                        top = elem.offsetTop,
8019
                        left = elem.offsetLeft;
8020

    
8021
                while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
8022
                        if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
8023
                                break;
8024
                        }
8025

    
8026
                        computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
8027
                        top  -= elem.scrollTop;
8028
                        left -= elem.scrollLeft;
8029

    
8030
                        if ( elem === offsetParent ) {
8031
                                top  += elem.offsetTop;
8032
                                left += elem.offsetLeft;
8033

    
8034
                                if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
8035
                                        top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
8036
                                        left += parseFloat( computedStyle.borderLeftWidth ) || 0;
8037
                                }
8038

    
8039
                                prevOffsetParent = offsetParent;
8040
                                offsetParent = elem.offsetParent;
8041
                        }
8042

    
8043
                        if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
8044
                                top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
8045
                                left += parseFloat( computedStyle.borderLeftWidth ) || 0;
8046
                        }
8047

    
8048
                        prevComputedStyle = computedStyle;
8049
                }
8050

    
8051
                if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
8052
                        top  += body.offsetTop;
8053
                        left += body.offsetLeft;
8054
                }
8055

    
8056
                if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
8057
                        top  += Math.max( docElem.scrollTop, body.scrollTop );
8058
                        left += Math.max( docElem.scrollLeft, body.scrollLeft );
8059
                }
8060

    
8061
                return { top: top, left: left };
8062
        };
8063
}
8064

    
8065
jQuery.offset = {
8066
        initialize: function() {
8067
                var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
8068
                        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>";
8069

    
8070
                jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
8071

    
8072
                container.innerHTML = html;
8073
                body.insertBefore( container, body.firstChild );
8074
                innerDiv = container.firstChild;
8075
                checkDiv = innerDiv.firstChild;
8076
                td = innerDiv.nextSibling.firstChild.firstChild;
8077

    
8078
                this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
8079
                this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
8080

    
8081
                checkDiv.style.position = "fixed";
8082
                checkDiv.style.top = "20px";
8083

    
8084
                // safari subtracts parent border width here which is 5px
8085
                this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
8086
                checkDiv.style.position = checkDiv.style.top = "";
8087

    
8088
                innerDiv.style.overflow = "hidden";
8089
                innerDiv.style.position = "relative";
8090

    
8091
                this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
8092

    
8093
                this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
8094

    
8095
                body.removeChild( container );
8096
                body = container = innerDiv = checkDiv = table = td = null;
8097
                jQuery.offset.initialize = jQuery.noop;
8098
        },
8099

    
8100
        bodyOffset: function( body ) {
8101
                var top = body.offsetTop,
8102
                        left = body.offsetLeft;
8103

    
8104
                jQuery.offset.initialize();
8105

    
8106
                if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
8107
                        top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
8108
                        left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
8109
                }
8110

    
8111
                return { top: top, left: left };
8112
        },
8113

    
8114
        setOffset: function( elem, options, i ) {
8115
                var position = jQuery.css( elem, "position" );
8116

    
8117
                // set position first, in-case top/left are set even on static elem
8118
                if ( position === "static" ) {
8119
                        elem.style.position = "relative";
8120
                }
8121

    
8122
                var curElem = jQuery( elem ),
8123
                        curOffset = curElem.offset(),
8124
                        curCSSTop = jQuery.css( elem, "top" ),
8125
                        curCSSLeft = jQuery.css( elem, "left" ),
8126
                        calculatePosition = (position === "absolute" && jQuery.inArray('auto', [curCSSTop, curCSSLeft]) > -1),
8127
                        props = {}, curPosition = {}, curTop, curLeft;
8128

    
8129
                // need to be able to calculate position if either top or left is auto and position is absolute
8130
                if ( calculatePosition ) {
8131
                        curPosition = curElem.position();
8132
                }
8133

    
8134
                curTop  = calculatePosition ? curPosition.top  : parseInt( curCSSTop,  10 ) || 0;
8135
                curLeft = calculatePosition ? curPosition.left : parseInt( curCSSLeft, 10 ) || 0;
8136

    
8137
                if ( jQuery.isFunction( options ) ) {
8138
                        options = options.call( elem, i, curOffset );
8139
                }
8140

    
8141
                if (options.top != null) {
8142
                        props.top = (options.top - curOffset.top) + curTop;
8143
                }
8144
                if (options.left != null) {
8145
                        props.left = (options.left - curOffset.left) + curLeft;
8146
                }
8147

    
8148
                if ( "using" in options ) {
8149
                        options.using.call( elem, props );
8150
                } else {
8151
                        curElem.css( props );
8152
                }
8153
        }
8154
};
8155

    
8156

    
8157
jQuery.fn.extend({
8158
        position: function() {
8159
                if ( !this[0] ) {
8160
                        return null;
8161
                }
8162

    
8163
                var elem = this[0],
8164

    
8165
                // Get *real* offsetParent
8166
                offsetParent = this.offsetParent(),
8167

    
8168
                // Get correct offsets
8169
                offset       = this.offset(),
8170
                parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
8171

    
8172
                // Subtract element margins
8173
                // note: when an element has margin: auto the offsetLeft and marginLeft
8174
                // are the same in Safari causing offset.left to incorrectly be 0
8175
                offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
8176
                offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
8177

    
8178
                // Add offsetParent borders
8179
                parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
8180
                parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
8181

    
8182
                // Subtract the two offsets
8183
                return {
8184
                        top:  offset.top  - parentOffset.top,
8185
                        left: offset.left - parentOffset.left
8186
                };
8187
        },
8188

    
8189
        offsetParent: function() {
8190
                return this.map(function() {
8191
                        var offsetParent = this.offsetParent || document.body;
8192
                        while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
8193
                                offsetParent = offsetParent.offsetParent;
8194
                        }
8195
                        return offsetParent;
8196
                });
8197
        }
8198
});
8199

    
8200

    
8201
// Create scrollLeft and scrollTop methods
8202
jQuery.each( ["Left", "Top"], function( i, name ) {
8203
        var method = "scroll" + name;
8204

    
8205
        jQuery.fn[ method ] = function(val) {
8206
                var elem = this[0], win;
8207

    
8208
                if ( !elem ) {
8209
                        return null;
8210
                }
8211

    
8212
                if ( val !== undefined ) {
8213
                        // Set the scroll offset
8214
                        return this.each(function() {
8215
                                win = getWindow( this );
8216

    
8217
                                if ( win ) {
8218
                                        win.scrollTo(
8219
                                                !i ? val : jQuery(win).scrollLeft(),
8220
                                                i ? val : jQuery(win).scrollTop()
8221
                                        );
8222

    
8223
                                } else {
8224
                                        this[ method ] = val;
8225
                                }
8226
                        });
8227
                } else {
8228
                        win = getWindow( elem );
8229

    
8230
                        // Return the scroll offset
8231
                        return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
8232
                                jQuery.support.boxModel && win.document.documentElement[ method ] ||
8233
                                        win.document.body[ method ] :
8234
                                elem[ method ];
8235
                }
8236
        };
8237
});
8238

    
8239
function getWindow( elem ) {
8240
        return jQuery.isWindow( elem ) ?
8241
                elem :
8242
                elem.nodeType === 9 ?
8243
                        elem.defaultView || elem.parentWindow :
8244
                        false;
8245
}
8246

    
8247

    
8248

    
8249

    
8250
// Create innerHeight, innerWidth, outerHeight and outerWidth methods
8251
jQuery.each([ "Height", "Width" ], function( i, name ) {
8252

    
8253
        var type = name.toLowerCase();
8254

    
8255
        // innerHeight and innerWidth
8256
        jQuery.fn["inner" + name] = function() {
8257
                return this[0] ?
8258
                        parseFloat( jQuery.css( this[0], type, "padding" ) ) :
8259
                        null;
8260
        };
8261

    
8262
        // outerHeight and outerWidth
8263
        jQuery.fn["outer" + name] = function( margin ) {
8264
                return this[0] ?
8265
                        parseFloat( jQuery.css( this[0], type, margin ? "margin" : "border" ) ) :
8266
                        null;
8267
        };
8268

    
8269
        jQuery.fn[ type ] = function( size ) {
8270
                // Get window width or height
8271
                var elem = this[0];
8272
                if ( !elem ) {
8273
                        return size == null ? null : this;
8274
                }
8275

    
8276
                if ( jQuery.isFunction( size ) ) {
8277
                        return this.each(function( i ) {
8278
                                var self = jQuery( this );
8279
                                self[ type ]( size.call( this, i, self[ type ]() ) );
8280
                        });
8281
                }
8282

    
8283
                if ( jQuery.isWindow( elem ) ) {
8284
                        // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
8285
                        // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
8286
                        var docElemProp = elem.document.documentElement[ "client" + name ];
8287
                        return elem.document.compatMode === "CSS1Compat" && docElemProp ||
8288
                                elem.document.body[ "client" + name ] || docElemProp;
8289

    
8290
                // Get document width or height
8291
                } else if ( elem.nodeType === 9 ) {
8292
                        // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
8293
                        return Math.max(
8294
                                elem.documentElement["client" + name],
8295
                                elem.body["scroll" + name], elem.documentElement["scroll" + name],
8296
                                elem.body["offset" + name], elem.documentElement["offset" + name]
8297
                        );
8298

    
8299
                // Get or set width or height on the element
8300
                } else if ( size === undefined ) {
8301
                        var orig = jQuery.css( elem, type ),
8302
                                ret = parseFloat( orig );
8303

    
8304
                        return jQuery.isNaN( ret ) ? orig : ret;
8305

    
8306
                // Set the width or height on the element (default to pixels if value is unitless)
8307
                } else {
8308
                        return this.css( type, typeof size === "string" ? size : size + "px" );
8309
                }
8310
        };
8311

    
8312
});
8313

    
8314

    
8315
window.jQuery = window.$ = jQuery;
8316
})(window);