Project

General

Profile

Statistics
| Branch: | Revision:

colonymech / docs / www / colonyscout / internal / js / jquery.js @ f59acf11

History | View | Annotate | Download (176 KB)

1
/*!
2
 * jQuery JavaScript Library v1.4.3
3
 * http://jquery.com/
4
 *
5
 * Copyright 2010, John Resig
6
 * Dual licensed under the MIT or GPL Version 2 licenses.
7
 * http://jquery.org/license
8
 *
9
 * Includes Sizzle.js
10
 * http://sizzlejs.com/
11
 * Copyright 2010, The Dojo Foundation
12
 * Released under the MIT, BSD, and GPL Licenses.
13
 *
14
 * Date: Thu Oct 14 23:10:06 2010 -0400
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 );
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
        // Is it a simple selector
42
        isSimple = /^.[^:#\[\.,]*$/,
43

    
44
        // Check if a string has a non-whitespace character in it
45
        rnotwhite = /\S/,
46
        rwhite = /\s/,
47

    
48
        // Used for trimming whitespace
49
        trimLeft = /^\s+/,
50
        trimRight = /\s+$/,
51

    
52
        // Check for non-word characters
53
        rnonword = /\W/,
54

    
55
        // Check for digits
56
        rdigit = /\d/,
57

    
58
        // Match a standalone tag
59
        rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
60

    
61
        // JSON RegExp
62
        rvalidchars = /^[\],:{}\s]*$/,
63
        rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
64
        rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
65
        rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
66

    
67
        // Useragent RegExp
68
        rwebkit = /(webkit)[ \/]([\w.]+)/,
69
        ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
70
        rmsie = /(msie) ([\w.]+)/,
71
        rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
72

    
73
        // Keep a UserAgent string for use with jQuery.browser
74
        userAgent = navigator.userAgent,
75

    
76
        // For matching the engine and version of the browser
77
        browserMatch,
78
        
79
        // Has the ready events already been bound?
80
        readyBound = false,
81
        
82
        // The functions to execute on DOM ready
83
        readyList = [],
84

    
85
        // The ready event handler
86
        DOMContentLoaded,
87

    
88
        // Save a reference to some core methods
89
        toString = Object.prototype.toString,
90
        hasOwn = Object.prototype.hasOwnProperty,
91
        push = Array.prototype.push,
92
        slice = Array.prototype.slice,
93
        trim = String.prototype.trim,
94
        indexOf = Array.prototype.indexOf,
95
        
96
        // [[Class]] -> type pairs
97
        class2type = {};
98

    
99
jQuery.fn = jQuery.prototype = {
100
        init: function( selector, context ) {
101
                var match, elem, ret, doc;
102

    
103
                // Handle $(""), $(null), or $(undefined)
104
                if ( !selector ) {
105
                        return this;
106
                }
107

    
108
                // Handle $(DOMElement)
109
                if ( selector.nodeType ) {
110
                        this.context = this[0] = selector;
111
                        this.length = 1;
112
                        return this;
113
                }
114
                
115
                // The body element only exists once, optimize finding it
116
                if ( selector === "body" && !context && document.body ) {
117
                        this.context = document;
118
                        this[0] = document.body;
119
                        this.selector = "body";
120
                        this.length = 1;
121
                        return this;
122
                }
123

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

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

    
132
                                // HANDLE: $(html) -> $(array)
133
                                if ( match[1] ) {
134
                                        doc = (context ? context.ownerDocument || context : document);
135

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

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

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

    
149
                                        } else {
150
                                                ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
151
                                                selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
152
                                        }
153
                                        
154
                                        return jQuery.merge( this, selector );
155
                                        
156
                                // HANDLE: $("#id")
157
                                } else {
158
                                        elem = document.getElementById( match[2] );
159

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

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

    
174
                                        this.context = document;
175
                                        this.selector = selector;
176
                                        return this;
177
                                }
178

    
179
                        // HANDLE: $("TAG")
180
                        } else if ( !context && !rnonword.test( selector ) ) {
181
                                this.selector = selector;
182
                                this.context = document;
183
                                selector = document.getElementsByTagName( selector );
184
                                return jQuery.merge( this, selector );
185

    
186
                        // HANDLE: $(expr, $(...))
187
                        } else if ( !context || context.jquery ) {
188
                                return (context || rootjQuery).find( selector );
189

    
190
                        // HANDLE: $(expr, context)
191
                        // (which is just equivalent to: $(context).find(expr)
192
                        } else {
193
                                return jQuery( context ).find( selector );
194
                        }
195

    
196
                // HANDLE: $(function)
197
                // Shortcut for document ready
198
                } else if ( jQuery.isFunction( selector ) ) {
199
                        return rootjQuery.ready( selector );
200
                }
201

    
202
                if (selector.selector !== undefined) {
203
                        this.selector = selector.selector;
204
                        this.context = selector.context;
205
                }
206

    
207
                return jQuery.makeArray( selector, this );
208
        },
209

    
210
        // Start with an empty selector
211
        selector: "",
212

    
213
        // The current version of jQuery being used
214
        jquery: "1.4.3",
215

    
216
        // The default length of a jQuery object is 0
217
        length: 0,
218

    
219
        // The number of elements contained in the matched element set
220
        size: function() {
221
                return this.length;
222
        },
223

    
224
        toArray: function() {
225
                return slice.call( this, 0 );
226
        },
227

    
228
        // Get the Nth element in the matched element set OR
229
        // Get the whole matched element set as a clean array
230
        get: function( num ) {
231
                return num == null ?
232

    
233
                        // Return a 'clean' array
234
                        this.toArray() :
235

    
236
                        // Return just the object
237
                        ( num < 0 ? this.slice(num)[ 0 ] : this[ num ] );
238
        },
239

    
240
        // Take an array of elements and push it onto the stack
241
        // (returning the new matched element set)
242
        pushStack: function( elems, name, selector ) {
243
                // Build a new jQuery matched element set
244
                var ret = jQuery();
245

    
246
                if ( jQuery.isArray( elems ) ) {
247
                        push.apply( ret, elems );
248
                
249
                } else {
250
                        jQuery.merge( ret, elems );
251
                }
252

    
253
                // Add the old object onto the stack (as a reference)
254
                ret.prevObject = this;
255

    
256
                ret.context = this.context;
257

    
258
                if ( name === "find" ) {
259
                        ret.selector = this.selector + (this.selector ? " " : "") + selector;
260
                } else if ( name ) {
261
                        ret.selector = this.selector + "." + name + "(" + selector + ")";
262
                }
263

    
264
                // Return the newly-formed element set
265
                return ret;
266
        },
267

    
268
        // Execute a callback for every element in the matched set.
269
        // (You can seed the arguments with an array of args, but this is
270
        // only used internally.)
271
        each: function( callback, args ) {
272
                return jQuery.each( this, callback, args );
273
        },
274
        
275
        ready: function( fn ) {
276
                // Attach the listeners
277
                jQuery.bindReady();
278

    
279
                // If the DOM is already ready
280
                if ( jQuery.isReady ) {
281
                        // Execute the function immediately
282
                        fn.call( document, jQuery );
283

    
284
                // Otherwise, remember the function for later
285
                } else if ( readyList ) {
286
                        // Add the function to the wait list
287
                        readyList.push( fn );
288
                }
289

    
290
                return this;
291
        },
292
        
293
        eq: function( i ) {
294
                return i === -1 ?
295
                        this.slice( i ) :
296
                        this.slice( i, +i + 1 );
297
        },
298

    
299
        first: function() {
300
                return this.eq( 0 );
301
        },
302

    
303
        last: function() {
304
                return this.eq( -1 );
305
        },
306

    
307
        slice: function() {
308
                return this.pushStack( slice.apply( this, arguments ),
309
                        "slice", slice.call(arguments).join(",") );
310
        },
311

    
312
        map: function( callback ) {
313
                return this.pushStack( jQuery.map(this, function( elem, i ) {
314
                        return callback.call( elem, i, elem );
315
                }));
316
        },
317
        
318
        end: function() {
319
                return this.prevObject || jQuery(null);
320
        },
321

    
322
        // For internal use only.
323
        // Behaves like an Array's method, not like a jQuery method.
324
        push: push,
325
        sort: [].sort,
326
        splice: [].splice
327
};
328

    
329
// Give the init function the jQuery prototype for later instantiation
330
jQuery.fn.init.prototype = jQuery.fn;
331

    
332
jQuery.extend = jQuery.fn.extend = function() {
333
        // copy reference to target object
334
        var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy, copyIsArray;
335

    
336
        // Handle a deep copy situation
337
        if ( typeof target === "boolean" ) {
338
                deep = target;
339
                target = arguments[1] || {};
340
                // skip the boolean and the target
341
                i = 2;
342
        }
343

    
344
        // Handle case when target is a string or something (possible in deep copy)
345
        if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
346
                target = {};
347
        }
348

    
349
        // extend jQuery itself if only one argument is passed
350
        if ( length === i ) {
351
                target = this;
352
                --i;
353
        }
354

    
355
        for ( ; i < length; i++ ) {
356
                // Only deal with non-null/undefined values
357
                if ( (options = arguments[ i ]) != null ) {
358
                        // Extend the base object
359
                        for ( name in options ) {
360
                                src = target[ name ];
361
                                copy = options[ name ];
362

    
363
                                // Prevent never-ending loop
364
                                if ( target === copy ) {
365
                                        continue;
366
                                }
367

    
368
                                // Recurse if we're merging plain objects or arrays
369
                                if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
370
                                        if ( copyIsArray ) {
371
                                                copyIsArray = false;
372
                                                clone = src && jQuery.isArray(src) ? src : [];
373

    
374
                                        } else {
375
                                                clone = src && jQuery.isPlainObject(src) ? src : {};
376
                                        }
377

    
378
                                        // Never move original objects, clone them
379
                                        target[ name ] = jQuery.extend( deep, clone, copy );
380

    
381
                                // Don't bring in undefined values
382
                                } else if ( copy !== undefined ) {
383
                                        target[ name ] = copy;
384
                                }
385
                        }
386
                }
387
        }
388

    
389
        // Return the modified object
390
        return target;
391
};
392

    
393
jQuery.extend({
394
        noConflict: function( deep ) {
395
                window.$ = _$;
396

    
397
                if ( deep ) {
398
                        window.jQuery = _jQuery;
399
                }
400

    
401
                return jQuery;
402
        },
403
        
404
        // Is the DOM ready to be used? Set to true once it occurs.
405
        isReady: false,
406

    
407
        // A counter to track how many items to wait for before
408
        // the ready event fires. See #6781
409
        readyWait: 1,
410
        
411
        // Handle when the DOM is ready
412
        ready: function( wait ) {
413
                // A third-party is pushing the ready event forwards
414
                if ( wait === true ) {
415
                        jQuery.readyWait--;
416
                }
417

    
418
                // Make sure that the DOM is not already loaded
419
                if ( !jQuery.readyWait || (wait !== true && !jQuery.isReady) ) {
420
                        // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
421
                        if ( !document.body ) {
422
                                return setTimeout( jQuery.ready, 1 );
423
                        }
424

    
425
                        // Remember that the DOM is ready
426
                        jQuery.isReady = true;
427

    
428
                        // If a normal DOM Ready event fired, decrement, and wait if need be
429
                        if ( wait !== true && --jQuery.readyWait > 0 ) {
430
                                return;
431
                        }
432

    
433
                        // If there are functions bound, to execute
434
                        if ( readyList ) {
435
                                // Execute all of them
436
                                var fn, i = 0;
437
                                while ( (fn = readyList[ i++ ]) ) {
438
                                        fn.call( document, jQuery );
439
                                }
440

    
441
                                // Reset the list of functions
442
                                readyList = null;
443
                        }
444

    
445
                        // Trigger any bound ready events
446
                        if ( jQuery.fn.triggerHandler ) {
447
                                jQuery( document ).triggerHandler( "ready" );
448
                        }
449
                }
450
        },
451
        
452
        bindReady: function() {
453
                if ( readyBound ) {
454
                        return;
455
                }
456

    
457
                readyBound = true;
458

    
459
                // Catch cases where $(document).ready() is called after the
460
                // browser event has already occurred.
461
                if ( document.readyState === "complete" ) {
462
                        // Handle it asynchronously to allow scripts the opportunity to delay ready
463
                        return setTimeout( jQuery.ready, 1 );
464
                }
465

    
466
                // Mozilla, Opera and webkit nightlies currently support this event
467
                if ( document.addEventListener ) {
468
                        // Use the handy event callback
469
                        document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
470
                        
471
                        // A fallback to window.onload, that will always work
472
                        window.addEventListener( "load", jQuery.ready, false );
473

    
474
                // If IE event model is used
475
                } else if ( document.attachEvent ) {
476
                        // ensure firing before onload,
477
                        // maybe late but safe also for iframes
478
                        document.attachEvent("onreadystatechange", DOMContentLoaded);
479
                        
480
                        // A fallback to window.onload, that will always work
481
                        window.attachEvent( "onload", jQuery.ready );
482

    
483
                        // If IE and not a frame
484
                        // continually check to see if the document is ready
485
                        var toplevel = false;
486

    
487
                        try {
488
                                toplevel = window.frameElement == null;
489
                        } catch(e) {}
490

    
491
                        if ( document.documentElement.doScroll && toplevel ) {
492
                                doScrollCheck();
493
                        }
494
                }
495
        },
496

    
497
        // See test/unit/core.js for details concerning isFunction.
498
        // Since version 1.3, DOM methods and functions like alert
499
        // aren't supported. They return false on IE (#2968).
500
        isFunction: function( obj ) {
501
                return jQuery.type(obj) === "function";
502
        },
503

    
504
        isArray: Array.isArray || function( obj ) {
505
                return jQuery.type(obj) === "array";
506
        },
507

    
508
        // A crude way of determining if an object is a window
509
        isWindow: function( obj ) {
510
                return obj && typeof obj === "object" && "setInterval" in obj;
511
        },
512

    
513
        isNaN: function( obj ) {
514
                return obj == null || !rdigit.test( obj ) || isNaN( obj );
515
        },
516

    
517
        type: function( obj ) {
518
                return obj == null ?
519
                        String( obj ) :
520
                        class2type[ toString.call(obj) ] || "object";
521
        },
522

    
523
        isPlainObject: function( obj ) {
524
                // Must be an Object.
525
                // Because of IE, we also have to check the presence of the constructor property.
526
                // Make sure that DOM nodes and window objects don't pass through, as well
527
                if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
528
                        return false;
529
                }
530
                
531
                // Not own constructor property must be Object
532
                if ( obj.constructor &&
533
                        !hasOwn.call(obj, "constructor") &&
534
                        !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
535
                        return false;
536
                }
537
                
538
                // Own properties are enumerated firstly, so to speed up,
539
                // if last one is own, then all properties are own.
540
        
541
                var key;
542
                for ( key in obj ) {}
543
                
544
                return key === undefined || hasOwn.call( obj, key );
545
        },
546

    
547
        isEmptyObject: function( obj ) {
548
                for ( var name in obj ) {
549
                        return false;
550
                }
551
                return true;
552
        },
553
        
554
        error: function( msg ) {
555
                throw msg;
556
        },
557
        
558
        parseJSON: function( data ) {
559
                if ( typeof data !== "string" || !data ) {
560
                        return null;
561
                }
562

    
563
                // Make sure leading/trailing whitespace is removed (IE can't handle it)
564
                data = jQuery.trim( data );
565
                
566
                // Make sure the incoming data is actual JSON
567
                // Logic borrowed from http://json.org/json2.js
568
                if ( rvalidchars.test(data.replace(rvalidescape, "@")
569
                        .replace(rvalidtokens, "]")
570
                        .replace(rvalidbraces, "")) ) {
571

    
572
                        // Try to use the native JSON parser first
573
                        return window.JSON && window.JSON.parse ?
574
                                window.JSON.parse( data ) :
575
                                (new Function("return " + data))();
576

    
577
                } else {
578
                        jQuery.error( "Invalid JSON: " + data );
579
                }
580
        },
581

    
582
        noop: function() {},
583

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

    
592
                        script.type = "text/javascript";
593

    
594
                        if ( jQuery.support.scriptEval ) {
595
                                script.appendChild( document.createTextNode( data ) );
596
                        } else {
597
                                script.text = data;
598
                        }
599

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

    
607
        nodeName: function( elem, name ) {
608
                return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
609
        },
610

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

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

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

    
646
                return object;
647
        },
648

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

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

    
664
        // results is for internal usage only
665
        makeArray: function( array, results ) {
666
                var ret = results || [];
667

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

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

    
682
                return ret;
683
        },
684

    
685
        inArray: function( elem, array ) {
686
                if ( array.indexOf ) {
687
                        return array.indexOf( elem );
688
                }
689

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

    
696
                return -1;
697
        },
698

    
699
        merge: function( first, second ) {
700
                var i = first.length, j = 0;
701

    
702
                if ( typeof second.length === "number" ) {
703
                        for ( var l = second.length; j < l; j++ ) {
704
                                first[ i++ ] = second[ j ];
705
                        }
706
                
707
                } else {
708
                        while ( second[j] !== undefined ) {
709
                                first[ i++ ] = second[ j++ ];
710
                        }
711
                }
712

    
713
                first.length = i;
714

    
715
                return first;
716
        },
717

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

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

    
731
                return ret;
732
        },
733

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

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

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

    
748
                return ret.concat.apply( [], ret );
749
        },
750

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

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

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

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

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

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

    
782
        // Mutifunctional method to get and set values to a collection
783
        // The value/s can be optionally by executed if its a function
784
        access: function( elems, key, value, exec, fn, pass ) {
785
                var length = elems.length;
786
        
787
                // Setting many attributes
788
                if ( typeof key === "object" ) {
789
                        for ( var k in key ) {
790
                                jQuery.access( elems, k, key[k], exec, fn, value );
791
                        }
792
                        return elems;
793
                }
794
        
795
                // Setting one attribute
796
                if ( value !== undefined ) {
797
                        // Optionally, function values get executed if exec is true
798
                        exec = !pass && exec && jQuery.isFunction(value);
799
                
800
                        for ( var i = 0; i < length; i++ ) {
801
                                fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
802
                        }
803
                
804
                        return elems;
805
                }
806
        
807
                // Getting an attribute
808
                return length ? fn( elems[0], key ) : undefined;
809
        },
810

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

    
815
        // Use of jQuery.browser is frowned upon.
816
        // More details: http://docs.jquery.com/Utilities/jQuery.browser
817
        uaMatch: function( ua ) {
818
                ua = ua.toLowerCase();
819

    
820
                var match = rwebkit.exec( ua ) ||
821
                        ropera.exec( ua ) ||
822
                        rmsie.exec( ua ) ||
823
                        ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
824
                        [];
825

    
826
                return { browser: match[1] || "", version: match[2] || "0" };
827
        },
828

    
829
        browser: {}
830
});
831

    
832
// Populate the class2type map
833
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
834
        class2type[ "[object " + name + "]" ] = name.toLowerCase();
835
});
836

    
837
browserMatch = jQuery.uaMatch( userAgent );
838
if ( browserMatch.browser ) {
839
        jQuery.browser[ browserMatch.browser ] = true;
840
        jQuery.browser.version = browserMatch.version;
841
}
842

    
843
// Deprecated, use jQuery.browser.webkit instead
844
if ( jQuery.browser.webkit ) {
845
        jQuery.browser.safari = true;
846
}
847

    
848
if ( indexOf ) {
849
        jQuery.inArray = function( elem, array ) {
850
                return indexOf.call( array, elem );
851
        };
852
}
853

    
854
// Verify that \s matches non-breaking spaces
855
// (IE fails on this test)
856
if ( !rwhite.test( "\xA0" ) ) {
857
        trimLeft = /^[\s\xA0]+/;
858
        trimRight = /[\s\xA0]+$/;
859
}
860

    
861
// All jQuery objects should point back to these
862
rootjQuery = jQuery(document);
863

    
864
// Cleanup functions for the document ready method
865
if ( document.addEventListener ) {
866
        DOMContentLoaded = function() {
867
                document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
868
                jQuery.ready();
869
        };
870

    
871
} else if ( document.attachEvent ) {
872
        DOMContentLoaded = function() {
873
                // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
874
                if ( document.readyState === "complete" ) {
875
                        document.detachEvent( "onreadystatechange", DOMContentLoaded );
876
                        jQuery.ready();
877
                }
878
        };
879
}
880

    
881
// The DOM ready check for Internet Explorer
882
function doScrollCheck() {
883
        if ( jQuery.isReady ) {
884
                return;
885
        }
886

    
887
        try {
888
                // If IE is used, use the trick by Diego Perini
889
                // http://javascript.nwbox.com/IEContentLoaded/
890
                document.documentElement.doScroll("left");
891
        } catch(e) {
892
                setTimeout( doScrollCheck, 1 );
893
                return;
894
        }
895

    
896
        // and execute any waiting functions
897
        jQuery.ready();
898
}
899

    
900
// Expose jQuery to the global object
901
return (window.jQuery = window.$ = jQuery);
902

    
903
})();
904

    
905

    
906
(function() {
907

    
908
        jQuery.support = {};
909

    
910
        var root = document.documentElement,
911
                script = document.createElement("script"),
912
                div = document.createElement("div"),
913
                id = "script" + jQuery.now();
914

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

    
918
        var all = div.getElementsByTagName("*"),
919
                a = div.getElementsByTagName("a")[0],
920
                select = document.createElement("select"),
921
                opt = select.appendChild( document.createElement("option") );
922

    
923
        // Can't get basic test support
924
        if ( !all || !all.length || !a ) {
925
                return;
926
        }
927

    
928
        jQuery.support = {
929
                // IE strips leading whitespace when .innerHTML is used
930
                leadingWhitespace: div.firstChild.nodeType === 3,
931

    
932
                // Make sure that tbody elements aren't automatically inserted
933
                // IE will insert them into empty tables
934
                tbody: !div.getElementsByTagName("tbody").length,
935

    
936
                // Make sure that link elements get serialized correctly by innerHTML
937
                // This requires a wrapper element in IE
938
                htmlSerialize: !!div.getElementsByTagName("link").length,
939

    
940
                // Get the style information from getAttribute
941
                // (IE uses .cssText insted)
942
                style: /red/.test( a.getAttribute("style") ),
943

    
944
                // Make sure that URLs aren't manipulated
945
                // (IE normalizes it by default)
946
                hrefNormalized: a.getAttribute("href") === "/a",
947

    
948
                // Make sure that element opacity exists
949
                // (IE uses filter instead)
950
                // Use a regex to work around a WebKit issue. See #5145
951
                opacity: /^0.55$/.test( a.style.opacity ),
952

    
953
                // Verify style float existence
954
                // (IE uses styleFloat instead of cssFloat)
955
                cssFloat: !!a.style.cssFloat,
956

    
957
                // Make sure that if no value is specified for a checkbox
958
                // that it defaults to "on".
959
                // (WebKit defaults to "" instead)
960
                checkOn: div.getElementsByTagName("input")[0].value === "on",
961

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

    
966
                // Will be defined later
967
                optDisabled: false,
968
                checkClone: false,
969
                scriptEval: false,
970
                noCloneEvent: true,
971
                boxModel: null,
972
                inlineBlockNeedsLayout: false,
973
                shrinkWrapBlocks: false,
974
                reliableHiddenOffsets: true
975
        };
976

    
977
        // Make sure that the options inside disabled selects aren't marked as disabled
978
        // (WebKit marks them as diabled)
979
        select.disabled = true;
980
        jQuery.support.optDisabled = !opt.disabled;
981

    
982
        script.type = "text/javascript";
983
        try {
984
                script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
985
        } catch(e) {}
986

    
987
        root.insertBefore( script, root.firstChild );
988

    
989
        // Make sure that the execution of code works by injecting a script
990
        // tag with appendChild/createTextNode
991
        // (IE doesn't support this, fails, and uses .text instead)
992
        if ( window[ id ] ) {
993
                jQuery.support.scriptEval = true;
994
                delete window[ id ];
995
        }
996

    
997
        root.removeChild( script );
998

    
999
        if ( div.attachEvent && div.fireEvent ) {
1000
                div.attachEvent("onclick", function click() {
1001
                        // Cloning a node shouldn't copy over any
1002
                        // bound event handlers (IE does this)
1003
                        jQuery.support.noCloneEvent = false;
1004
                        div.detachEvent("onclick", click);
1005
                });
1006
                div.cloneNode(true).fireEvent("onclick");
1007
        }
1008

    
1009
        div = document.createElement("div");
1010
        div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
1011

    
1012
        var fragment = document.createDocumentFragment();
1013
        fragment.appendChild( div.firstChild );
1014

    
1015
        // WebKit doesn't clone checked state correctly in fragments
1016
        jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
1017

    
1018
        // Figure out if the W3C box model works as expected
1019
        // document.body must exist before we can do this
1020
        jQuery(function() {
1021
                var div = document.createElement("div");
1022
                div.style.width = div.style.paddingLeft = "1px";
1023

    
1024
                document.body.appendChild( div );
1025
                jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
1026

    
1027
                if ( "zoom" in div.style ) {
1028
                        // Check if natively block-level elements act like inline-block
1029
                        // elements when setting their display to 'inline' and giving
1030
                        // them layout
1031
                        // (IE < 8 does this)
1032
                        div.style.display = "inline";
1033
                        div.style.zoom = 1;
1034
                        jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2;
1035

    
1036
                        // Check if elements with layout shrink-wrap their children
1037
                        // (IE 6 does this)
1038
                        div.style.display = "";
1039
                        div.innerHTML = "<div style='width:4px;'></div>";
1040
                        jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2;
1041
                }
1042

    
1043
                div.innerHTML = "<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";
1044
                var tds = div.getElementsByTagName("td");
1045

    
1046
                // Check if table cells still have offsetWidth/Height when they are set
1047
                // to display:none and there are still other visible table cells in a
1048
                // table row; if so, offsetWidth/Height are not reliable for use when
1049
                // determining if an element has been hidden directly using
1050
                // display:none (it is still safe to use offsets if a parent element is
1051
                // hidden; don safety goggles and see bug #4512 for more information).
1052
                // (only IE 8 fails this test)
1053
                jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0;
1054

    
1055
                tds[0].style.display = "";
1056
                tds[1].style.display = "none";
1057

    
1058
                // Check if empty table cells still have offsetWidth/Height
1059
                // (IE < 8 fail this test)
1060
                jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0;
1061
                div.innerHTML = "";
1062

    
1063
                document.body.removeChild( div ).style.display = "none";
1064
                div = tds = null;
1065
        });
1066

    
1067
        // Technique from Juriy Zaytsev
1068
        // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
1069
        var eventSupported = function( eventName ) {
1070
                var el = document.createElement("div");
1071
                eventName = "on" + eventName;
1072

    
1073
                var isSupported = (eventName in el);
1074
                if ( !isSupported ) {
1075
                        el.setAttribute(eventName, "return;");
1076
                        isSupported = typeof el[eventName] === "function";
1077
                }
1078
                el = null;
1079

    
1080
                return isSupported;
1081
        };
1082

    
1083
        jQuery.support.submitBubbles = eventSupported("submit");
1084
        jQuery.support.changeBubbles = eventSupported("change");
1085

    
1086
        // release memory in IE
1087
        root = script = div = all = a = null;
1088
})();
1089

    
1090
jQuery.props = {
1091
        "for": "htmlFor",
1092
        "class": "className",
1093
        readonly: "readOnly",
1094
        maxlength: "maxLength",
1095
        cellspacing: "cellSpacing",
1096
        rowspan: "rowSpan",
1097
        colspan: "colSpan",
1098
        tabindex: "tabIndex",
1099
        usemap: "useMap",
1100
        frameborder: "frameBorder"
1101
};
1102

    
1103

    
1104

    
1105

    
1106
var windowData = {},
1107
        rbrace = /^(?:\{.*\}|\[.*\])$/;
1108

    
1109
jQuery.extend({
1110
        cache: {},
1111

    
1112
        // Please use with caution
1113
        uuid: 0,
1114

    
1115
        // Unique for each copy of jQuery on the page        
1116
        expando: "jQuery" + jQuery.now(),
1117

    
1118
        // The following elements throw uncatchable exceptions if you
1119
        // attempt to add expando properties to them.
1120
        noData: {
1121
                "embed": true,
1122
                // Ban all objects except for Flash (which handle expandos)
1123
                "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
1124
                "applet": true
1125
        },
1126

    
1127
        data: function( elem, name, data ) {
1128
                if ( !jQuery.acceptData( elem ) ) {
1129
                        return;
1130
                }
1131

    
1132
                elem = elem == window ?
1133
                        windowData :
1134
                        elem;
1135

    
1136
                var isNode = elem.nodeType,
1137
                        id = isNode ? elem[ jQuery.expando ] : null,
1138
                        cache = jQuery.cache, thisCache;
1139

    
1140
                if ( isNode && !id && typeof name === "string" && data === undefined ) {
1141
                        return;
1142
                }
1143

    
1144
                // Get the data from the object directly
1145
                if ( !isNode ) {
1146
                        cache = elem;
1147

    
1148
                // Compute a unique ID for the element
1149
                } else if ( !id ) {
1150
                        elem[ jQuery.expando ] = id = ++jQuery.uuid;
1151
                }
1152

    
1153
                // Avoid generating a new cache unless none exists and we
1154
                // want to manipulate it.
1155
                if ( typeof name === "object" ) {
1156
                        if ( isNode ) {
1157
                                cache[ id ] = jQuery.extend(cache[ id ], name);
1158

    
1159
                        } else {
1160
                                jQuery.extend( cache, name );
1161
                        }
1162

    
1163
                } else if ( isNode && !cache[ id ] ) {
1164
                        cache[ id ] = {};
1165
                }
1166

    
1167
                thisCache = isNode ? cache[ id ] : cache;
1168

    
1169
                // Prevent overriding the named cache with undefined values
1170
                if ( data !== undefined ) {
1171
                        thisCache[ name ] = data;
1172
                }
1173

    
1174
                return typeof name === "string" ? thisCache[ name ] : thisCache;
1175
        },
1176

    
1177
        removeData: function( elem, name ) {
1178
                if ( !jQuery.acceptData( elem ) ) {
1179
                        return;
1180
                }
1181

    
1182
                elem = elem == window ?
1183
                        windowData :
1184
                        elem;
1185

    
1186
                var isNode = elem.nodeType,
1187
                        id = isNode ? elem[ jQuery.expando ] : elem,
1188
                        cache = jQuery.cache,
1189
                        thisCache = isNode ? cache[ id ] : id;
1190

    
1191
                // If we want to remove a specific section of the element's data
1192
                if ( name ) {
1193
                        if ( thisCache ) {
1194
                                // Remove the section of cache data
1195
                                delete thisCache[ name ];
1196

    
1197
                                // If we've removed all the data, remove the element's cache
1198
                                if ( isNode && jQuery.isEmptyObject(thisCache) ) {
1199
                                        jQuery.removeData( elem );
1200
                                }
1201
                        }
1202

    
1203
                // Otherwise, we want to remove all of the element's data
1204
                } else {
1205
                        if ( isNode && jQuery.support.deleteExpando ) {
1206
                                delete elem[ jQuery.expando ];
1207

    
1208
                        } else if ( elem.removeAttribute ) {
1209
                                elem.removeAttribute( jQuery.expando );
1210

    
1211
                        // Completely remove the data cache
1212
                        } else if ( isNode ) {
1213
                                delete cache[ id ];
1214

    
1215
                        // Remove all fields from the object
1216
                        } else {
1217
                                for ( var n in elem ) {
1218
                                        delete elem[ n ];
1219
                                }
1220
                        }
1221
                }
1222
        },
1223

    
1224
        // A method for determining if a DOM node can handle the data expando
1225
        acceptData: function( elem ) {
1226
                if ( elem.nodeName ) {
1227
                        var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
1228

    
1229
                        if ( match ) {
1230
                                return !(match === true || elem.getAttribute("classid") !== match);
1231
                        }
1232
                }
1233

    
1234
                return true;
1235
        }
1236
});
1237

    
1238
jQuery.fn.extend({
1239
        data: function( key, value ) {
1240
                if ( typeof key === "undefined" ) {
1241
                        return this.length ? jQuery.data( this[0] ) : null;
1242

    
1243
                } else if ( typeof key === "object" ) {
1244
                        return this.each(function() {
1245
                                jQuery.data( this, key );
1246
                        });
1247
                }
1248

    
1249
                var parts = key.split(".");
1250
                parts[1] = parts[1] ? "." + parts[1] : "";
1251

    
1252
                if ( value === undefined ) {
1253
                        var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1254

    
1255
                        // Try to fetch any internally stored data first
1256
                        if ( data === undefined && this.length ) {
1257
                                data = jQuery.data( this[0], key );
1258

    
1259
                                // If nothing was found internally, try to fetch any
1260
                                // data from the HTML5 data-* attribute
1261
                                if ( data === undefined && this[0].nodeType === 1 ) {
1262
                                        data = this[0].getAttribute( "data-" + key );
1263

    
1264
                                        if ( typeof data === "string" ) {
1265
                                                try {
1266
                                                        data = data === "true" ? true :
1267
                                                                data === "false" ? false :
1268
                                                                data === "null" ? null :
1269
                                                                !jQuery.isNaN( data ) ? parseFloat( data ) :
1270
                                                                rbrace.test( data ) ? jQuery.parseJSON( data ) :
1271
                                                                data;
1272
                                                } catch( e ) {}
1273

    
1274
                                        } else {
1275
                                                data = undefined;
1276
                                        }
1277
                                }
1278
                        }
1279

    
1280
                        return data === undefined && parts[1] ?
1281
                                this.data( parts[0] ) :
1282
                                data;
1283

    
1284
                } else {
1285
                        return this.each(function() {
1286
                                var $this = jQuery( this ), args = [ parts[0], value ];
1287

    
1288
                                $this.triggerHandler( "setData" + parts[1] + "!", args );
1289
                                jQuery.data( this, key, value );
1290
                                $this.triggerHandler( "changeData" + parts[1] + "!", args );
1291
                        });
1292
                }
1293
        },
1294

    
1295
        removeData: function( key ) {
1296
                return this.each(function() {
1297
                        jQuery.removeData( this, key );
1298
                });
1299
        }
1300
});
1301

    
1302

    
1303

    
1304

    
1305
jQuery.extend({
1306
        queue: function( elem, type, data ) {
1307
                if ( !elem ) {
1308
                        return;
1309
                }
1310

    
1311
                type = (type || "fx") + "queue";
1312
                var q = jQuery.data( elem, type );
1313

    
1314
                // Speed up dequeue by getting out quickly if this is just a lookup
1315
                if ( !data ) {
1316
                        return q || [];
1317
                }
1318

    
1319
                if ( !q || jQuery.isArray(data) ) {
1320
                        q = jQuery.data( elem, type, jQuery.makeArray(data) );
1321

    
1322
                } else {
1323
                        q.push( data );
1324
                }
1325

    
1326
                return q;
1327
        },
1328

    
1329
        dequeue: function( elem, type ) {
1330
                type = type || "fx";
1331

    
1332
                var queue = jQuery.queue( elem, type ), fn = queue.shift();
1333

    
1334
                // If the fx queue is dequeued, always remove the progress sentinel
1335
                if ( fn === "inprogress" ) {
1336
                        fn = queue.shift();
1337
                }
1338

    
1339
                if ( fn ) {
1340
                        // Add a progress sentinel to prevent the fx queue from being
1341
                        // automatically dequeued
1342
                        if ( type === "fx" ) {
1343
                                queue.unshift("inprogress");
1344
                        }
1345

    
1346
                        fn.call(elem, function() {
1347
                                jQuery.dequeue(elem, type);
1348
                        });
1349
                }
1350
        }
1351
});
1352

    
1353
jQuery.fn.extend({
1354
        queue: function( type, data ) {
1355
                if ( typeof type !== "string" ) {
1356
                        data = type;
1357
                        type = "fx";
1358
                }
1359

    
1360
                if ( data === undefined ) {
1361
                        return jQuery.queue( this[0], type );
1362
                }
1363
                return this.each(function( i ) {
1364
                        var queue = jQuery.queue( this, type, data );
1365

    
1366
                        if ( type === "fx" && queue[0] !== "inprogress" ) {
1367
                                jQuery.dequeue( this, type );
1368
                        }
1369
                });
1370
        },
1371
        dequeue: function( type ) {
1372
                return this.each(function() {
1373
                        jQuery.dequeue( this, type );
1374
                });
1375
        },
1376

    
1377
        // Based off of the plugin by Clint Helfers, with permission.
1378
        // http://blindsignals.com/index.php/2009/07/jquery-delay/
1379
        delay: function( time, type ) {
1380
                time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
1381
                type = type || "fx";
1382

    
1383
                return this.queue( type, function() {
1384
                        var elem = this;
1385
                        setTimeout(function() {
1386
                                jQuery.dequeue( elem, type );
1387
                        }, time );
1388
                });
1389
        },
1390

    
1391
        clearQueue: function( type ) {
1392
                return this.queue( type || "fx", [] );
1393
        }
1394
});
1395

    
1396

    
1397

    
1398

    
1399
var rclass = /[\n\t]/g,
1400
        rspaces = /\s+/,
1401
        rreturn = /\r/g,
1402
        rspecialurl = /^(?:href|src|style)$/,
1403
        rtype = /^(?:button|input)$/i,
1404
        rfocusable = /^(?:button|input|object|select|textarea)$/i,
1405
        rclickable = /^a(?:rea)?$/i,
1406
        rradiocheck = /^(?:radio|checkbox)$/i;
1407

    
1408
jQuery.fn.extend({
1409
        attr: function( name, value ) {
1410
                return jQuery.access( this, name, value, true, jQuery.attr );
1411
        },
1412

    
1413
        removeAttr: function( name, fn ) {
1414
                return this.each(function(){
1415
                        jQuery.attr( this, name, "" );
1416
                        if ( this.nodeType === 1 ) {
1417
                                this.removeAttribute( name );
1418
                        }
1419
                });
1420
        },
1421

    
1422
        addClass: function( value ) {
1423
                if ( jQuery.isFunction(value) ) {
1424
                        return this.each(function(i) {
1425
                                var self = jQuery(this);
1426
                                self.addClass( value.call(this, i, self.attr("class")) );
1427
                        });
1428
                }
1429

    
1430
                if ( value && typeof value === "string" ) {
1431
                        var classNames = (value || "").split( rspaces );
1432

    
1433
                        for ( var i = 0, l = this.length; i < l; i++ ) {
1434
                                var elem = this[i];
1435

    
1436
                                if ( elem.nodeType === 1 ) {
1437
                                        if ( !elem.className ) {
1438
                                                elem.className = value;
1439

    
1440
                                        } else {
1441
                                                var className = " " + elem.className + " ", setClass = elem.className;
1442
                                                for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
1443
                                                        if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
1444
                                                                setClass += " " + classNames[c];
1445
                                                        }
1446
                                                }
1447
                                                elem.className = jQuery.trim( setClass );
1448
                                        }
1449
                                }
1450
                        }
1451
                }
1452

    
1453
                return this;
1454
        },
1455

    
1456
        removeClass: function( value ) {
1457
                if ( jQuery.isFunction(value) ) {
1458
                        return this.each(function(i) {
1459
                                var self = jQuery(this);
1460
                                self.removeClass( value.call(this, i, self.attr("class")) );
1461
                        });
1462
                }
1463

    
1464
                if ( (value && typeof value === "string") || value === undefined ) {
1465
                        var classNames = (value || "").split( rspaces );
1466

    
1467
                        for ( var i = 0, l = this.length; i < l; i++ ) {
1468
                                var elem = this[i];
1469

    
1470
                                if ( elem.nodeType === 1 && elem.className ) {
1471
                                        if ( value ) {
1472
                                                var className = (" " + elem.className + " ").replace(rclass, " ");
1473
                                                for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
1474
                                                        className = className.replace(" " + classNames[c] + " ", " ");
1475
                                                }
1476
                                                elem.className = jQuery.trim( className );
1477

    
1478
                                        } else {
1479
                                                elem.className = "";
1480
                                        }
1481
                                }
1482
                        }
1483
                }
1484

    
1485
                return this;
1486
        },
1487

    
1488
        toggleClass: function( value, stateVal ) {
1489
                var type = typeof value, isBool = typeof stateVal === "boolean";
1490

    
1491
                if ( jQuery.isFunction( value ) ) {
1492
                        return this.each(function(i) {
1493
                                var self = jQuery(this);
1494
                                self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
1495
                        });
1496
                }
1497

    
1498
                return this.each(function() {
1499
                        if ( type === "string" ) {
1500
                                // toggle individual class names
1501
                                var className, i = 0, self = jQuery(this),
1502
                                        state = stateVal,
1503
                                        classNames = value.split( rspaces );
1504

    
1505
                                while ( (className = classNames[ i++ ]) ) {
1506
                                        // check each className given, space seperated list
1507
                                        state = isBool ? state : !self.hasClass( className );
1508
                                        self[ state ? "addClass" : "removeClass" ]( className );
1509
                                }
1510

    
1511
                        } else if ( type === "undefined" || type === "boolean" ) {
1512
                                if ( this.className ) {
1513
                                        // store className if set
1514
                                        jQuery.data( this, "__className__", this.className );
1515
                                }
1516

    
1517
                                // toggle whole className
1518
                                this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || "";
1519
                        }
1520
                });
1521
        },
1522

    
1523
        hasClass: function( selector ) {
1524
                var className = " " + selector + " ";
1525
                for ( var i = 0, l = this.length; i < l; i++ ) {
1526
                        if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
1527
                                return true;
1528
                        }
1529
                }
1530

    
1531
                return false;
1532
        },
1533

    
1534
        val: function( value ) {
1535
                if ( !arguments.length ) {
1536
                        var elem = this[0];
1537

    
1538
                        if ( elem ) {
1539
                                if ( jQuery.nodeName( elem, "option" ) ) {
1540
                                        // attributes.value is undefined in Blackberry 4.7 but
1541
                                        // uses .value. See #6932
1542
                                        var val = elem.attributes.value;
1543
                                        return !val || val.specified ? elem.value : elem.text;
1544
                                }
1545

    
1546
                                // We need to handle select boxes special
1547
                                if ( jQuery.nodeName( elem, "select" ) ) {
1548
                                        var index = elem.selectedIndex,
1549
                                                values = [],
1550
                                                options = elem.options,
1551
                                                one = elem.type === "select-one";
1552

    
1553
                                        // Nothing was selected
1554
                                        if ( index < 0 ) {
1555
                                                return null;
1556
                                        }
1557

    
1558
                                        // Loop through all the selected options
1559
                                        for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
1560
                                                var option = options[ i ];
1561

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

    
1566
                                                        // Get the specific value for the option
1567
                                                        value = jQuery(option).val();
1568

    
1569
                                                        // We don't need an array for one selects
1570
                                                        if ( one ) {
1571
                                                                return value;
1572
                                                        }
1573

    
1574
                                                        // Multi-Selects return an array
1575
                                                        values.push( value );
1576
                                                }
1577
                                        }
1578

    
1579
                                        return values;
1580
                                }
1581

    
1582
                                // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
1583
                                if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
1584
                                        return elem.getAttribute("value") === null ? "on" : elem.value;
1585
                                }
1586
                                
1587

    
1588
                                // Everything else, we just grab the value
1589
                                return (elem.value || "").replace(rreturn, "");
1590

    
1591
                        }
1592

    
1593
                        return undefined;
1594
                }
1595

    
1596
                var isFunction = jQuery.isFunction(value);
1597

    
1598
                return this.each(function(i) {
1599
                        var self = jQuery(this), val = value;
1600

    
1601
                        if ( this.nodeType !== 1 ) {
1602
                                return;
1603
                        }
1604

    
1605
                        if ( isFunction ) {
1606
                                val = value.call(this, i, self.val());
1607
                        }
1608

    
1609
                        // Treat null/undefined as ""; convert numbers to string
1610
                        if ( val == null ) {
1611
                                val = "";
1612
                        } else if ( typeof val === "number" ) {
1613
                                val += "";
1614
                        } else if ( jQuery.isArray(val) ) {
1615
                                val = jQuery.map(val, function (value) {
1616
                                        return value == null ? "" : value + "";
1617
                                });
1618
                        }
1619

    
1620
                        if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
1621
                                this.checked = jQuery.inArray( self.val(), val ) >= 0;
1622

    
1623
                        } else if ( jQuery.nodeName( this, "select" ) ) {
1624
                                var values = jQuery.makeArray(val);
1625

    
1626
                                jQuery( "option", this ).each(function() {
1627
                                        this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
1628
                                });
1629

    
1630
                                if ( !values.length ) {
1631
                                        this.selectedIndex = -1;
1632
                                }
1633

    
1634
                        } else {
1635
                                this.value = val;
1636
                        }
1637
                });
1638
        }
1639
});
1640

    
1641
jQuery.extend({
1642
        attrFn: {
1643
                val: true,
1644
                css: true,
1645
                html: true,
1646
                text: true,
1647
                data: true,
1648
                width: true,
1649
                height: true,
1650
                offset: true
1651
        },
1652
                
1653
        attr: function( elem, name, value, pass ) {
1654
                // don't set attributes on text and comment nodes
1655
                if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
1656
                        return undefined;
1657
                }
1658

    
1659
                if ( pass && name in jQuery.attrFn ) {
1660
                        return jQuery(elem)[name](value);
1661
                }
1662

    
1663
                var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
1664
                        // Whether we are setting (or getting)
1665
                        set = value !== undefined;
1666

    
1667
                // Try to normalize/fix the name
1668
                name = notxml && jQuery.props[ name ] || name;
1669

    
1670
                // Only do all the following if this is a node (faster for style)
1671
                if ( elem.nodeType === 1 ) {
1672
                        // These attributes require special treatment
1673
                        var special = rspecialurl.test( name );
1674

    
1675
                        // Safari mis-reports the default selected property of an option
1676
                        // Accessing the parent's selectedIndex property fixes it
1677
                        if ( name === "selected" && !jQuery.support.optSelected ) {
1678
                                var parent = elem.parentNode;
1679
                                if ( parent ) {
1680
                                        parent.selectedIndex;
1681
        
1682
                                        // Make sure that it also works with optgroups, see #5701
1683
                                        if ( parent.parentNode ) {
1684
                                                parent.parentNode.selectedIndex;
1685
                                        }
1686
                                }
1687
                        }
1688

    
1689
                        // If applicable, access the attribute via the DOM 0 way
1690
                        // 'in' checks fail in Blackberry 4.7 #6931
1691
                        if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) {
1692
                                if ( set ) {
1693
                                        // We can't allow the type property to be changed (since it causes problems in IE)
1694
                                        if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
1695
                                                jQuery.error( "type property can't be changed" );
1696
                                        }
1697

    
1698
                                        if ( value === null ) {
1699
                                                if ( elem.nodeType === 1 ) {
1700
                                                        elem.removeAttribute( name );
1701
                                                }
1702

    
1703
                                        } else {
1704
                                                elem[ name ] = value;
1705
                                        }
1706
                                }
1707

    
1708
                                // browsers index elements by id/name on forms, give priority to attributes.
1709
                                if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
1710
                                        return elem.getAttributeNode( name ).nodeValue;
1711
                                }
1712

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

    
1718
                                        return attributeNode && attributeNode.specified ?
1719
                                                attributeNode.value :
1720
                                                rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
1721
                                                        0 :
1722
                                                        undefined;
1723
                                }
1724

    
1725
                                return elem[ name ];
1726
                        }
1727

    
1728
                        if ( !jQuery.support.style && notxml && name === "style" ) {
1729
                                if ( set ) {
1730
                                        elem.style.cssText = "" + value;
1731
                                }
1732

    
1733
                                return elem.style.cssText;
1734
                        }
1735

    
1736
                        if ( set ) {
1737
                                // convert the value to a string (all browsers do this but IE) see #1070
1738
                                elem.setAttribute( name, "" + value );
1739
                        }
1740

    
1741
                        // Ensure that missing attributes return undefined
1742
                        // Blackberry 4.7 returns "" from getAttribute #6938
1743
                        if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) {
1744
                                return undefined;
1745
                        }
1746

    
1747
                        var attr = !jQuery.support.hrefNormalized && notxml && special ?
1748
                                        // Some attributes require a special call on IE
1749
                                        elem.getAttribute( name, 2 ) :
1750
                                        elem.getAttribute( name );
1751

    
1752
                        // Non-existent attributes return null, we normalize to undefined
1753
                        return attr === null ? undefined : attr;
1754
                }
1755
        }
1756
});
1757

    
1758

    
1759

    
1760

    
1761
var rnamespaces = /\.(.*)$/,
1762
        rformElems = /^(?:textarea|input|select)$/i,
1763
        rperiod = /\./g,
1764
        rspace = / /g,
1765
        rescape = /[^\w\s.|`]/g,
1766
        fcleanup = function( nm ) {
1767
                return nm.replace(rescape, "\\$&");
1768
        },
1769
        focusCounts = { focusin: 0, focusout: 0 };
1770

    
1771
/*
1772
 * A number of helper functions used for managing events.
1773
 * Many of the ideas behind this code originated from
1774
 * Dean Edwards' addEvent library.
1775
 */
1776
jQuery.event = {
1777

    
1778
        // Bind an event to an element
1779
        // Original by Dean Edwards
1780
        add: function( elem, types, handler, data ) {
1781
                if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
1782
                        return;
1783
                }
1784

    
1785
                // For whatever reason, IE has trouble passing the window object
1786
                // around, causing it to be cloned in the process
1787
                if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) {
1788
                        elem = window;
1789
                }
1790

    
1791
                if ( handler === false ) {
1792
                        handler = returnFalse;
1793
                }
1794

    
1795
                var handleObjIn, handleObj;
1796

    
1797
                if ( handler.handler ) {
1798
                        handleObjIn = handler;
1799
                        handler = handleObjIn.handler;
1800
                }
1801

    
1802
                // Make sure that the function being executed has a unique ID
1803
                if ( !handler.guid ) {
1804
                        handler.guid = jQuery.guid++;
1805
                }
1806

    
1807
                // Init the element's event structure
1808
                var elemData = jQuery.data( elem );
1809

    
1810
                // If no elemData is found then we must be trying to bind to one of the
1811
                // banned noData elements
1812
                if ( !elemData ) {
1813
                        return;
1814
                }
1815

    
1816
                // Use a key less likely to result in collisions for plain JS objects.
1817
                // Fixes bug #7150.
1818
                var eventKey = elem.nodeType ? "events" : "__events__",
1819
                        events = elemData[ eventKey ],
1820
                        eventHandle = elemData.handle;
1821
                        
1822
                if ( typeof events === "function" ) {
1823
                        // On plain objects events is a fn that holds the the data
1824
                        // which prevents this data from being JSON serialized
1825
                        // the function does not need to be called, it just contains the data
1826
                        eventHandle = events.handle;
1827
                        events = events.events;
1828

    
1829
                } else if ( !events ) {
1830
                        if ( !elem.nodeType ) {
1831
                                // On plain objects, create a fn that acts as the holder
1832
                                // of the values to avoid JSON serialization of event data
1833
                                elemData[ eventKey ] = elemData = function(){};
1834
                        }
1835

    
1836
                        elemData.events = events = {};
1837
                }
1838

    
1839
                if ( !eventHandle ) {
1840
                        elemData.handle = eventHandle = function() {
1841
                                // Handle the second event of a trigger and when
1842
                                // an event is called after a page has unloaded
1843
                                return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
1844
                                        jQuery.event.handle.apply( eventHandle.elem, arguments ) :
1845
                                        undefined;
1846
                        };
1847
                }
1848

    
1849
                // Add elem as a property of the handle function
1850
                // This is to prevent a memory leak with non-native events in IE.
1851
                eventHandle.elem = elem;
1852

    
1853
                // Handle multiple events separated by a space
1854
                // jQuery(...).bind("mouseover mouseout", fn);
1855
                types = types.split(" ");
1856

    
1857
                var type, i = 0, namespaces;
1858

    
1859
                while ( (type = types[ i++ ]) ) {
1860
                        handleObj = handleObjIn ?
1861
                                jQuery.extend({}, handleObjIn) :
1862
                                { handler: handler, data: data };
1863

    
1864
                        // Namespaced event handlers
1865
                        if ( type.indexOf(".") > -1 ) {
1866
                                namespaces = type.split(".");
1867
                                type = namespaces.shift();
1868
                                handleObj.namespace = namespaces.slice(0).sort().join(".");
1869

    
1870
                        } else {
1871
                                namespaces = [];
1872
                                handleObj.namespace = "";
1873
                        }
1874

    
1875
                        handleObj.type = type;
1876
                        if ( !handleObj.guid ) {
1877
                                handleObj.guid = handler.guid;
1878
                        }
1879

    
1880
                        // Get the current list of functions bound to this event
1881
                        var handlers = events[ type ],
1882
                                special = jQuery.event.special[ type ] || {};
1883

    
1884
                        // Init the event handler queue
1885
                        if ( !handlers ) {
1886
                                handlers = events[ type ] = [];
1887

    
1888
                                // Check for a special event handler
1889
                                // Only use addEventListener/attachEvent if the special
1890
                                // events handler returns false
1891
                                if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
1892
                                        // Bind the global event handler to the element
1893
                                        if ( elem.addEventListener ) {
1894
                                                elem.addEventListener( type, eventHandle, false );
1895

    
1896
                                        } else if ( elem.attachEvent ) {
1897
                                                elem.attachEvent( "on" + type, eventHandle );
1898
                                        }
1899
                                }
1900
                        }
1901
                        
1902
                        if ( special.add ) { 
1903
                                special.add.call( elem, handleObj ); 
1904

    
1905
                                if ( !handleObj.handler.guid ) {
1906
                                        handleObj.handler.guid = handler.guid;
1907
                                }
1908
                        }
1909

    
1910
                        // Add the function to the element's handler list
1911
                        handlers.push( handleObj );
1912

    
1913
                        // Keep track of which events have been used, for global triggering
1914
                        jQuery.event.global[ type ] = true;
1915
                }
1916

    
1917
                // Nullify elem to prevent memory leaks in IE
1918
                elem = null;
1919
        },
1920

    
1921
        global: {},
1922

    
1923
        // Detach an event or set of events from an element
1924
        remove: function( elem, types, handler, pos ) {
1925
                // don't do events on text and comment nodes
1926
                if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
1927
                        return;
1928
                }
1929

    
1930
                if ( handler === false ) {
1931
                        handler = returnFalse;
1932
                }
1933

    
1934
                var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
1935
                        eventKey = elem.nodeType ? "events" : "__events__",
1936
                        elemData = jQuery.data( elem ),
1937
                        events = elemData && elemData[ eventKey ];
1938

    
1939
                if ( !elemData || !events ) {
1940
                        return;
1941
                }
1942
                
1943
                if ( typeof events === "function" ) {
1944
                        elemData = events;
1945
                        events = events.events;
1946
                }
1947

    
1948
                // types is actually an event object here
1949
                if ( types && types.type ) {
1950
                        handler = types.handler;
1951
                        types = types.type;
1952
                }
1953

    
1954
                // Unbind all events for the element
1955
                if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
1956
                        types = types || "";
1957

    
1958
                        for ( type in events ) {
1959
                                jQuery.event.remove( elem, type + types );
1960
                        }
1961

    
1962
                        return;
1963
                }
1964

    
1965
                // Handle multiple events separated by a space
1966
                // jQuery(...).unbind("mouseover mouseout", fn);
1967
                types = types.split(" ");
1968

    
1969
                while ( (type = types[ i++ ]) ) {
1970
                        origType = type;
1971
                        handleObj = null;
1972
                        all = type.indexOf(".") < 0;
1973
                        namespaces = [];
1974

    
1975
                        if ( !all ) {
1976
                                // Namespaced event handlers
1977
                                namespaces = type.split(".");
1978
                                type = namespaces.shift();
1979

    
1980
                                namespace = new RegExp("(^|\\.)" + 
1981
                                        jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
1982
                        }
1983

    
1984
                        eventType = events[ type ];
1985

    
1986
                        if ( !eventType ) {
1987
                                continue;
1988
                        }
1989

    
1990
                        if ( !handler ) {
1991
                                for ( j = 0; j < eventType.length; j++ ) {
1992
                                        handleObj = eventType[ j ];
1993

    
1994
                                        if ( all || namespace.test( handleObj.namespace ) ) {
1995
                                                jQuery.event.remove( elem, origType, handleObj.handler, j );
1996
                                                eventType.splice( j--, 1 );
1997
                                        }
1998
                                }
1999

    
2000
                                continue;
2001
                        }
2002

    
2003
                        special = jQuery.event.special[ type ] || {};
2004

    
2005
                        for ( j = pos || 0; j < eventType.length; j++ ) {
2006
                                handleObj = eventType[ j ];
2007

    
2008
                                if ( handler.guid === handleObj.guid ) {
2009
                                        // remove the given handler for the given type
2010
                                        if ( all || namespace.test( handleObj.namespace ) ) {
2011
                                                if ( pos == null ) {
2012
                                                        eventType.splice( j--, 1 );
2013
                                                }
2014

    
2015
                                                if ( special.remove ) {
2016
                                                        special.remove.call( elem, handleObj );
2017
                                                }
2018
                                        }
2019

    
2020
                                        if ( pos != null ) {
2021
                                                break;
2022
                                        }
2023
                                }
2024
                        }
2025

    
2026
                        // remove generic event handler if no more handlers exist
2027
                        if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
2028
                                if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
2029
                                        jQuery.removeEvent( elem, type, elemData.handle );
2030
                                }
2031

    
2032
                                ret = null;
2033
                                delete events[ type ];
2034
                        }
2035
                }
2036

    
2037
                // Remove the expando if it's no longer used
2038
                if ( jQuery.isEmptyObject( events ) ) {
2039
                        var handle = elemData.handle;
2040
                        if ( handle ) {
2041
                                handle.elem = null;
2042
                        }
2043

    
2044
                        delete elemData.events;
2045
                        delete elemData.handle;
2046

    
2047
                        if ( typeof elemData === "function" ) {
2048
                                jQuery.removeData( elem, eventKey );
2049

    
2050
                        } else if ( jQuery.isEmptyObject( elemData ) ) {
2051
                                jQuery.removeData( elem );
2052
                        }
2053
                }
2054
        },
2055

    
2056
        // bubbling is internal
2057
        trigger: function( event, data, elem /*, bubbling */ ) {
2058
                // Event object or event type
2059
                var type = event.type || event,
2060
                        bubbling = arguments[3];
2061

    
2062
                if ( !bubbling ) {
2063
                        event = typeof event === "object" ?
2064
                                // jQuery.Event object
2065
                                event[ jQuery.expando ] ? event :
2066
                                // Object literal
2067
                                jQuery.extend( jQuery.Event(type), event ) :
2068
                                // Just the event type (string)
2069
                                jQuery.Event(type);
2070

    
2071
                        if ( type.indexOf("!") >= 0 ) {
2072
                                event.type = type = type.slice(0, -1);
2073
                                event.exclusive = true;
2074
                        }
2075

    
2076
                        // Handle a global trigger
2077
                        if ( !elem ) {
2078
                                // Don't bubble custom events when global (to avoid too much overhead)
2079
                                event.stopPropagation();
2080

    
2081
                                // Only trigger if we've ever bound an event for it
2082
                                if ( jQuery.event.global[ type ] ) {
2083
                                        jQuery.each( jQuery.cache, function() {
2084
                                                if ( this.events && this.events[type] ) {
2085
                                                        jQuery.event.trigger( event, data, this.handle.elem );
2086
                                                }
2087
                                        });
2088
                                }
2089
                        }
2090

    
2091
                        // Handle triggering a single element
2092

    
2093
                        // don't do events on text and comment nodes
2094
                        if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
2095
                                return undefined;
2096
                        }
2097

    
2098
                        // Clean up in case it is reused
2099
                        event.result = undefined;
2100
                        event.target = elem;
2101

    
2102
                        // Clone the incoming data, if any
2103
                        data = jQuery.makeArray( data );
2104
                        data.unshift( event );
2105
                }
2106

    
2107
                event.currentTarget = elem;
2108

    
2109
                // Trigger the event, it is assumed that "handle" is a function
2110
                var handle = elem.nodeType ?
2111
                        jQuery.data( elem, "handle" ) :
2112
                        (jQuery.data( elem, "__events__" ) || {}).handle;
2113

    
2114
                if ( handle ) {
2115
                        handle.apply( elem, data );
2116
                }
2117

    
2118
                var parent = elem.parentNode || elem.ownerDocument;
2119

    
2120
                // Trigger an inline bound script
2121
                try {
2122
                        if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
2123
                                if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {
2124
                                        event.result = false;
2125
                                        event.preventDefault();
2126
                                }
2127
                        }
2128

    
2129
                // prevent IE from throwing an error for some elements with some event types, see #3533
2130
                } catch (inlineError) {}
2131

    
2132
                if ( !event.isPropagationStopped() && parent ) {
2133
                        jQuery.event.trigger( event, data, parent, true );
2134

    
2135
                } else if ( !event.isDefaultPrevented() ) {
2136
                        var target = event.target, old, targetType = type.replace(rnamespaces, ""),
2137
                                isClick = jQuery.nodeName(target, "a") && targetType === "click",
2138
                                special = jQuery.event.special[ targetType ] || {};
2139

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

    
2143
                                try {
2144
                                        if ( target[ targetType ] ) {
2145
                                                // Make sure that we don't accidentally re-trigger the onFOO events
2146
                                                old = target[ "on" + targetType ];
2147

    
2148
                                                if ( old ) {
2149
                                                        target[ "on" + targetType ] = null;
2150
                                                }
2151

    
2152
                                                jQuery.event.triggered = true;
2153
                                                target[ targetType ]();
2154
                                        }
2155

    
2156
                                // prevent IE from throwing an error for some elements with some event types, see #3533
2157
                                } catch (triggerError) {}
2158

    
2159
                                if ( old ) {
2160
                                        target[ "on" + targetType ] = old;
2161
                                }
2162

    
2163
                                jQuery.event.triggered = false;
2164
                        }
2165
                }
2166
        },
2167

    
2168
        handle: function( event ) {
2169
                var all, handlers, namespaces, namespace_sort = [], namespace_re, events, args = jQuery.makeArray( arguments );
2170

    
2171
                event = args[0] = jQuery.event.fix( event || window.event );
2172
                event.currentTarget = this;
2173

    
2174
                // Namespaced event handlers
2175
                all = event.type.indexOf(".") < 0 && !event.exclusive;
2176

    
2177
                if ( !all ) {
2178
                        namespaces = event.type.split(".");
2179
                        event.type = namespaces.shift();
2180
                        namespace_sort = namespaces.slice(0).sort();
2181
                        namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)");
2182
                }
2183

    
2184
                event.namespace = event.namespace || namespace_sort.join(".");
2185

    
2186
                events = jQuery.data(this, this.nodeType ? "events" : "__events__");
2187

    
2188
                if ( typeof events === "function" ) {
2189
                        events = events.events;
2190
                }
2191

    
2192
                handlers = (events || {})[ event.type ];
2193

    
2194
                if ( events && handlers ) {
2195
                        // Clone the handlers to prevent manipulation
2196
                        handlers = handlers.slice(0);
2197

    
2198
                        for ( var j = 0, l = handlers.length; j < l; j++ ) {
2199
                                var handleObj = handlers[ j ];
2200

    
2201
                                // Filter the functions by class
2202
                                if ( all || namespace_re.test( handleObj.namespace ) ) {
2203
                                        // Pass in a reference to the handler function itself
2204
                                        // So that we can later remove it
2205
                                        event.handler = handleObj.handler;
2206
                                        event.data = handleObj.data;
2207
                                        event.handleObj = handleObj;
2208
        
2209
                                        var ret = handleObj.handler.apply( this, args );
2210

    
2211
                                        if ( ret !== undefined ) {
2212
                                                event.result = ret;
2213
                                                if ( ret === false ) {
2214
                                                        event.preventDefault();
2215
                                                        event.stopPropagation();
2216
                                                }
2217
                                        }
2218

    
2219
                                        if ( event.isImmediatePropagationStopped() ) {
2220
                                                break;
2221
                                        }
2222
                                }
2223
                        }
2224
                }
2225

    
2226
                return event.result;
2227
        },
2228

    
2229
        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(" "),
2230

    
2231
        fix: function( event ) {
2232
                if ( event[ jQuery.expando ] ) {
2233
                        return event;
2234
                }
2235

    
2236
                // store a copy of the original event object
2237
                // and "clone" to set read-only properties
2238
                var originalEvent = event;
2239
                event = jQuery.Event( originalEvent );
2240

    
2241
                for ( var i = this.props.length, prop; i; ) {
2242
                        prop = this.props[ --i ];
2243
                        event[ prop ] = originalEvent[ prop ];
2244
                }
2245

    
2246
                // Fix target property, if necessary
2247
                if ( !event.target ) {
2248
                        event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
2249
                }
2250

    
2251
                // check if target is a textnode (safari)
2252
                if ( event.target.nodeType === 3 ) {
2253
                        event.target = event.target.parentNode;
2254
                }
2255

    
2256
                // Add relatedTarget, if necessary
2257
                if ( !event.relatedTarget && event.fromElement ) {
2258
                        event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
2259
                }
2260

    
2261
                // Calculate pageX/Y if missing and clientX/Y available
2262
                if ( event.pageX == null && event.clientX != null ) {
2263
                        var doc = document.documentElement, body = document.body;
2264
                        event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
2265
                        event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
2266
                }
2267

    
2268
                // Add which for key events
2269
                if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
2270
                        event.which = event.charCode != null ? event.charCode : event.keyCode;
2271
                }
2272

    
2273
                // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
2274
                if ( !event.metaKey && event.ctrlKey ) {
2275
                        event.metaKey = event.ctrlKey;
2276
                }
2277

    
2278
                // Add which for click: 1 === left; 2 === middle; 3 === right
2279
                // Note: button is not normalized, so don't use it
2280
                if ( !event.which && event.button !== undefined ) {
2281
                        event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
2282
                }
2283

    
2284
                return event;
2285
        },
2286

    
2287
        // Deprecated, use jQuery.guid instead
2288
        guid: 1E8,
2289

    
2290
        // Deprecated, use jQuery.proxy instead
2291
        proxy: jQuery.proxy,
2292

    
2293
        special: {
2294
                ready: {
2295
                        // Make sure the ready event is setup
2296
                        setup: jQuery.bindReady,
2297
                        teardown: jQuery.noop
2298
                },
2299

    
2300
                live: {
2301
                        add: function( handleObj ) {
2302
                                jQuery.event.add( this,
2303
                                        liveConvert( handleObj.origType, handleObj.selector ),
2304
                                        jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); 
2305
                        },
2306

    
2307
                        remove: function( handleObj ) {
2308
                                jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
2309
                        }
2310
                },
2311

    
2312
                beforeunload: {
2313
                        setup: function( data, namespaces, eventHandle ) {
2314
                                // We only want to do this special case on windows
2315
                                if ( jQuery.isWindow( this ) ) {
2316
                                        this.onbeforeunload = eventHandle;
2317
                                }
2318
                        },
2319

    
2320
                        teardown: function( namespaces, eventHandle ) {
2321
                                if ( this.onbeforeunload === eventHandle ) {
2322
                                        this.onbeforeunload = null;
2323
                                }
2324
                        }
2325
                }
2326
        }
2327
};
2328

    
2329
jQuery.removeEvent = document.removeEventListener ?
2330
        function( elem, type, handle ) {
2331
                if ( elem.removeEventListener ) {
2332
                        elem.removeEventListener( type, handle, false );
2333
                }
2334
        } : 
2335
        function( elem, type, handle ) {
2336
                if ( elem.detachEvent ) {
2337
                        elem.detachEvent( "on" + type, handle );
2338
                }
2339
        };
2340

    
2341
jQuery.Event = function( src ) {
2342
        // Allow instantiation without the 'new' keyword
2343
        if ( !this.preventDefault ) {
2344
                return new jQuery.Event( src );
2345
        }
2346

    
2347
        // Event object
2348
        if ( src && src.type ) {
2349
                this.originalEvent = src;
2350
                this.type = src.type;
2351
        // Event type
2352
        } else {
2353
                this.type = src;
2354
        }
2355

    
2356
        // timeStamp is buggy for some events on Firefox(#3843)
2357
        // So we won't rely on the native value
2358
        this.timeStamp = jQuery.now();
2359

    
2360
        // Mark it as fixed
2361
        this[ jQuery.expando ] = true;
2362
};
2363

    
2364
function returnFalse() {
2365
        return false;
2366
}
2367
function returnTrue() {
2368
        return true;
2369
}
2370

    
2371
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
2372
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
2373
jQuery.Event.prototype = {
2374
        preventDefault: function() {
2375
                this.isDefaultPrevented = returnTrue;
2376

    
2377
                var e = this.originalEvent;
2378
                if ( !e ) {
2379
                        return;
2380
                }
2381
                
2382
                // if preventDefault exists run it on the original event
2383
                if ( e.preventDefault ) {
2384
                        e.preventDefault();
2385

    
2386
                // otherwise set the returnValue property of the original event to false (IE)
2387
                } else {
2388
                        e.returnValue = false;
2389
                }
2390
        },
2391
        stopPropagation: function() {
2392
                this.isPropagationStopped = returnTrue;
2393

    
2394
                var e = this.originalEvent;
2395
                if ( !e ) {
2396
                        return;
2397
                }
2398
                // if stopPropagation exists run it on the original event
2399
                if ( e.stopPropagation ) {
2400
                        e.stopPropagation();
2401
                }
2402
                // otherwise set the cancelBubble property of the original event to true (IE)
2403
                e.cancelBubble = true;
2404
        },
2405
        stopImmediatePropagation: function() {
2406
                this.isImmediatePropagationStopped = returnTrue;
2407
                this.stopPropagation();
2408
        },
2409
        isDefaultPrevented: returnFalse,
2410
        isPropagationStopped: returnFalse,
2411
        isImmediatePropagationStopped: returnFalse
2412
};
2413

    
2414
// Checks if an event happened on an element within another element
2415
// Used in jQuery.event.special.mouseenter and mouseleave handlers
2416
var withinElement = function( event ) {
2417
        // Check if mouse(over|out) are still within the same parent element
2418
        var parent = event.relatedTarget;
2419

    
2420
        // Firefox sometimes assigns relatedTarget a XUL element
2421
        // which we cannot access the parentNode property of
2422
        try {
2423
                // Traverse up the tree
2424
                while ( parent && parent !== this ) {
2425
                        parent = parent.parentNode;
2426
                }
2427

    
2428
                if ( parent !== this ) {
2429
                        // set the correct event type
2430
                        event.type = event.data;
2431

    
2432
                        // handle event if we actually just moused on to a non sub-element
2433
                        jQuery.event.handle.apply( this, arguments );
2434
                }
2435

    
2436
        // assuming we've left the element since we most likely mousedover a xul element
2437
        } catch(e) { }
2438
},
2439

    
2440
// In case of event delegation, we only need to rename the event.type,
2441
// liveHandler will take care of the rest.
2442
delegate = function( event ) {
2443
        event.type = event.data;
2444
        jQuery.event.handle.apply( this, arguments );
2445
};
2446

    
2447
// Create mouseenter and mouseleave events
2448
jQuery.each({
2449
        mouseenter: "mouseover",
2450
        mouseleave: "mouseout"
2451
}, function( orig, fix ) {
2452
        jQuery.event.special[ orig ] = {
2453
                setup: function( data ) {
2454
                        jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
2455
                },
2456
                teardown: function( data ) {
2457
                        jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
2458
                }
2459
        };
2460
});
2461

    
2462
// submit delegation
2463
if ( !jQuery.support.submitBubbles ) {
2464

    
2465
        jQuery.event.special.submit = {
2466
                setup: function( data, namespaces ) {
2467
                        if ( this.nodeName.toLowerCase() !== "form" ) {
2468
                                jQuery.event.add(this, "click.specialSubmit", function( e ) {
2469
                                        var elem = e.target, type = elem.type;
2470

    
2471
                                        if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
2472
                                                e.liveFired = undefined;
2473
                                                return trigger( "submit", this, arguments );
2474
                                        }
2475
                                });
2476
         
2477
                                jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
2478
                                        var elem = e.target, type = elem.type;
2479

    
2480
                                        if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
2481
                                                e.liveFired = undefined;
2482
                                                return trigger( "submit", this, arguments );
2483
                                        }
2484
                                });
2485

    
2486
                        } else {
2487
                                return false;
2488
                        }
2489
                },
2490

    
2491
                teardown: function( namespaces ) {
2492
                        jQuery.event.remove( this, ".specialSubmit" );
2493
                }
2494
        };
2495

    
2496
}
2497

    
2498
// change delegation, happens here so we have bind.
2499
if ( !jQuery.support.changeBubbles ) {
2500

    
2501
        var changeFilters,
2502

    
2503
        getVal = function( elem ) {
2504
                var type = elem.type, val = elem.value;
2505

    
2506
                if ( type === "radio" || type === "checkbox" ) {
2507
                        val = elem.checked;
2508

    
2509
                } else if ( type === "select-multiple" ) {
2510
                        val = elem.selectedIndex > -1 ?
2511
                                jQuery.map( elem.options, function( elem ) {
2512
                                        return elem.selected;
2513
                                }).join("-") :
2514
                                "";
2515

    
2516
                } else if ( elem.nodeName.toLowerCase() === "select" ) {
2517
                        val = elem.selectedIndex;
2518
                }
2519

    
2520
                return val;
2521
        },
2522

    
2523
        testChange = function testChange( e ) {
2524
                var elem = e.target, data, val;
2525

    
2526
                if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
2527
                        return;
2528
                }
2529

    
2530
                data = jQuery.data( elem, "_change_data" );
2531
                val = getVal(elem);
2532

    
2533
                // the current data will be also retrieved by beforeactivate
2534
                if ( e.type !== "focusout" || elem.type !== "radio" ) {
2535
                        jQuery.data( elem, "_change_data", val );
2536
                }
2537
                
2538
                if ( data === undefined || val === data ) {
2539
                        return;
2540
                }
2541

    
2542
                if ( data != null || val ) {
2543
                        e.type = "change";
2544
                        e.liveFired = undefined;
2545
                        return jQuery.event.trigger( e, arguments[1], elem );
2546
                }
2547
        };
2548

    
2549
        jQuery.event.special.change = {
2550
                filters: {
2551
                        focusout: testChange, 
2552

    
2553
                        beforedeactivate: testChange,
2554

    
2555
                        click: function( e ) {
2556
                                var elem = e.target, type = elem.type;
2557

    
2558
                                if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
2559
                                        return testChange.call( this, e );
2560
                                }
2561
                        },
2562

    
2563
                        // Change has to be called before submit
2564
                        // Keydown will be called before keypress, which is used in submit-event delegation
2565
                        keydown: function( e ) {
2566
                                var elem = e.target, type = elem.type;
2567

    
2568
                                if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
2569
                                        (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
2570
                                        type === "select-multiple" ) {
2571
                                        return testChange.call( this, e );
2572
                                }
2573
                        },
2574

    
2575
                        // Beforeactivate happens also before the previous element is blurred
2576
                        // with this event you can't trigger a change event, but you can store
2577
                        // information
2578
                        beforeactivate: function( e ) {
2579
                                var elem = e.target;
2580
                                jQuery.data( elem, "_change_data", getVal(elem) );
2581
                        }
2582
                },
2583

    
2584
                setup: function( data, namespaces ) {
2585
                        if ( this.type === "file" ) {
2586
                                return false;
2587
                        }
2588

    
2589
                        for ( var type in changeFilters ) {
2590
                                jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
2591
                        }
2592

    
2593
                        return rformElems.test( this.nodeName );
2594
                },
2595

    
2596
                teardown: function( namespaces ) {
2597
                        jQuery.event.remove( this, ".specialChange" );
2598

    
2599
                        return rformElems.test( this.nodeName );
2600
                }
2601
        };
2602

    
2603
        changeFilters = jQuery.event.special.change.filters;
2604

    
2605
        // Handle when the input is .focus()'d
2606
        changeFilters.focus = changeFilters.beforeactivate;
2607
}
2608

    
2609
function trigger( type, elem, args ) {
2610
        args[0].type = type;
2611
        return jQuery.event.handle.apply( elem, args );
2612
}
2613

    
2614
// Create "bubbling" focus and blur events
2615
if ( document.addEventListener ) {
2616
        jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
2617
                jQuery.event.special[ fix ] = {
2618
                        setup: function() {
2619
                                if ( focusCounts[fix]++ === 0 ) {
2620
                                        document.addEventListener( orig, handler, true );
2621
                                }
2622
                        }, 
2623
                        teardown: function() { 
2624
                                if ( --focusCounts[fix] === 0 ) {
2625
                                        document.removeEventListener( orig, handler, true );
2626
                                }
2627
                        }
2628
                };
2629

    
2630
                function handler( e ) { 
2631
                        e = jQuery.event.fix( e );
2632
                        e.type = fix;
2633
                        return jQuery.event.trigger( e, null, e.target );
2634
                }
2635
        });
2636
}
2637

    
2638
jQuery.each(["bind", "one"], function( i, name ) {
2639
        jQuery.fn[ name ] = function( type, data, fn ) {
2640
                // Handle object literals
2641
                if ( typeof type === "object" ) {
2642
                        for ( var key in type ) {
2643
                                this[ name ](key, data, type[key], fn);
2644
                        }
2645
                        return this;
2646
                }
2647
                
2648
                if ( jQuery.isFunction( data ) || data === false ) {
2649
                        fn = data;
2650
                        data = undefined;
2651
                }
2652

    
2653
                var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
2654
                        jQuery( this ).unbind( event, handler );
2655
                        return fn.apply( this, arguments );
2656
                }) : fn;
2657

    
2658
                if ( type === "unload" && name !== "one" ) {
2659
                        this.one( type, data, fn );
2660

    
2661
                } else {
2662
                        for ( var i = 0, l = this.length; i < l; i++ ) {
2663
                                jQuery.event.add( this[i], type, handler, data );
2664
                        }
2665
                }
2666

    
2667
                return this;
2668
        };
2669
});
2670

    
2671
jQuery.fn.extend({
2672
        unbind: function( type, fn ) {
2673
                // Handle object literals
2674
                if ( typeof type === "object" && !type.preventDefault ) {
2675
                        for ( var key in type ) {
2676
                                this.unbind(key, type[key]);
2677
                        }
2678

    
2679
                } else {
2680
                        for ( var i = 0, l = this.length; i < l; i++ ) {
2681
                                jQuery.event.remove( this[i], type, fn );
2682
                        }
2683
                }
2684

    
2685
                return this;
2686
        },
2687
        
2688
        delegate: function( selector, types, data, fn ) {
2689
                return this.live( types, data, fn, selector );
2690
        },
2691
        
2692
        undelegate: function( selector, types, fn ) {
2693
                if ( arguments.length === 0 ) {
2694
                                return this.unbind( "live" );
2695
                
2696
                } else {
2697
                        return this.die( types, null, fn, selector );
2698
                }
2699
        },
2700
        
2701
        trigger: function( type, data ) {
2702
                return this.each(function() {
2703
                        jQuery.event.trigger( type, data, this );
2704
                });
2705
        },
2706

    
2707
        triggerHandler: function( type, data ) {
2708
                if ( this[0] ) {
2709
                        var event = jQuery.Event( type );
2710
                        event.preventDefault();
2711
                        event.stopPropagation();
2712
                        jQuery.event.trigger( event, data, this[0] );
2713
                        return event.result;
2714
                }
2715
        },
2716

    
2717
        toggle: function( fn ) {
2718
                // Save reference to arguments for access in closure
2719
                var args = arguments, i = 1;
2720

    
2721
                // link all the functions, so any of them can unbind this click handler
2722
                while ( i < args.length ) {
2723
                        jQuery.proxy( fn, args[ i++ ] );
2724
                }
2725

    
2726
                return this.click( jQuery.proxy( fn, function( event ) {
2727
                        // Figure out which function to execute
2728
                        var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
2729
                        jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
2730

    
2731
                        // Make sure that clicks stop
2732
                        event.preventDefault();
2733

    
2734
                        // and execute the function
2735
                        return args[ lastToggle ].apply( this, arguments ) || false;
2736
                }));
2737
        },
2738

    
2739
        hover: function( fnOver, fnOut ) {
2740
                return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
2741
        }
2742
});
2743

    
2744
var liveMap = {
2745
        focus: "focusin",
2746
        blur: "focusout",
2747
        mouseenter: "mouseover",
2748
        mouseleave: "mouseout"
2749
};
2750

    
2751
jQuery.each(["live", "die"], function( i, name ) {
2752
        jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
2753
                var type, i = 0, match, namespaces, preType,
2754
                        selector = origSelector || this.selector,
2755
                        context = origSelector ? this : jQuery( this.context );
2756
                
2757
                if ( typeof types === "object" && !types.preventDefault ) {
2758
                        for ( var key in types ) {
2759
                                context[ name ]( key, data, types[key], selector );
2760
                        }
2761
                        
2762
                        return this;
2763
                }
2764

    
2765
                if ( jQuery.isFunction( data ) ) {
2766
                        fn = data;
2767
                        data = undefined;
2768
                }
2769

    
2770
                types = (types || "").split(" ");
2771

    
2772
                while ( (type = types[ i++ ]) != null ) {
2773
                        match = rnamespaces.exec( type );
2774
                        namespaces = "";
2775

    
2776
                        if ( match )  {
2777
                                namespaces = match[0];
2778
                                type = type.replace( rnamespaces, "" );
2779
                        }
2780

    
2781
                        if ( type === "hover" ) {
2782
                                types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
2783
                                continue;
2784
                        }
2785

    
2786
                        preType = type;
2787

    
2788
                        if ( type === "focus" || type === "blur" ) {
2789
                                types.push( liveMap[ type ] + namespaces );
2790
                                type = type + namespaces;
2791

    
2792
                        } else {
2793
                                type = (liveMap[ type ] || type) + namespaces;
2794
                        }
2795

    
2796
                        if ( name === "live" ) {
2797
                                // bind live handler
2798
                                for ( var j = 0, l = context.length; j < l; j++ ) {
2799
                                        jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
2800
                                                { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
2801
                                }
2802

    
2803
                        } else {
2804
                                // unbind live handler
2805
                                context.unbind( "live." + liveConvert( type, selector ), fn );
2806
                        }
2807
                }
2808
                
2809
                return this;
2810
        };
2811
});
2812

    
2813
function liveHandler( event ) {
2814
        var stop, maxLevel, elems = [], selectors = [],
2815
                related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
2816
                events = jQuery.data( this, this.nodeType ? "events" : "__events__" );
2817

    
2818
        if ( typeof events === "function" ) {
2819
                events = events.events;
2820
        }
2821

    
2822
        // Make sure we avoid non-left-click bubbling in Firefox (#3861)
2823
        if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) {
2824
                return;
2825
        }
2826

    
2827
        if ( event.namespace ) {
2828
                namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
2829
        }
2830

    
2831
        event.liveFired = this;
2832

    
2833
        var live = events.live.slice(0);
2834

    
2835
        for ( j = 0; j < live.length; j++ ) {
2836
                handleObj = live[j];
2837

    
2838
                if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
2839
                        selectors.push( handleObj.selector );
2840

    
2841
                } else {
2842
                        live.splice( j--, 1 );
2843
                }
2844
        }
2845

    
2846
        match = jQuery( event.target ).closest( selectors, event.currentTarget );
2847

    
2848
        for ( i = 0, l = match.length; i < l; i++ ) {
2849
                close = match[i];
2850

    
2851
                for ( j = 0; j < live.length; j++ ) {
2852
                        handleObj = live[j];
2853

    
2854
                        if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) ) {
2855
                                elem = close.elem;
2856
                                related = null;
2857

    
2858
                                // Those two events require additional checking
2859
                                if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
2860
                                        event.type = handleObj.preType;
2861
                                        related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
2862
                                }
2863

    
2864
                                if ( !related || related !== elem ) {
2865
                                        elems.push({ elem: elem, handleObj: handleObj, level: close.level });
2866
                                }
2867
                        }
2868
                }
2869
        }
2870

    
2871
        for ( i = 0, l = elems.length; i < l; i++ ) {
2872
                match = elems[i];
2873

    
2874
                if ( maxLevel && match.level > maxLevel ) {
2875
                        break;
2876
                }
2877

    
2878
                event.currentTarget = match.elem;
2879
                event.data = match.handleObj.data;
2880
                event.handleObj = match.handleObj;
2881

    
2882
                ret = match.handleObj.origHandler.apply( match.elem, arguments );
2883

    
2884
                if ( ret === false || event.isPropagationStopped() ) {
2885
                        maxLevel = match.level;
2886

    
2887
                        if ( ret === false ) {
2888
                                stop = false;
2889
                        }
2890
                }
2891
        }
2892

    
2893
        return stop;
2894
}
2895

    
2896
function liveConvert( type, selector ) {
2897
        return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspace, "&");
2898
}
2899

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

    
2904
        // Handle event binding
2905
        jQuery.fn[ name ] = function( data, fn ) {
2906
                if ( fn == null ) {
2907
                        fn = data;
2908
                        data = null;
2909
                }
2910

    
2911
                return arguments.length > 0 ?
2912
                        this.bind( name, data, fn ) :
2913
                        this.trigger( name );
2914
        };
2915

    
2916
        if ( jQuery.attrFn ) {
2917
                jQuery.attrFn[ name ] = true;
2918
        }
2919
});
2920

    
2921
// Prevent memory leaks in IE
2922
// Window isn't included so as not to unbind existing unload events
2923
// More info:
2924
//  - http://isaacschlueter.com/2006/10/msie-memory-leaks/
2925
if ( window.attachEvent && !window.addEventListener ) {
2926
        jQuery(window).bind("unload", function() {
2927
                for ( var id in jQuery.cache ) {
2928
                        if ( jQuery.cache[ id ].handle ) {
2929
                                // Try/Catch is to handle iframes being unloaded, see #4280
2930
                                try {
2931
                                        jQuery.event.remove( jQuery.cache[ id ].handle.elem );
2932
                                } catch(e) {}
2933
                        }
2934
                }
2935
        });
2936
}
2937

    
2938

    
2939
/*!
2940
 * Sizzle CSS Selector Engine - v1.0
2941
 *  Copyright 2009, The Dojo Foundation
2942
 *  Released under the MIT, BSD, and GPL Licenses.
2943
 *  More information: http://sizzlejs.com/
2944
 */
2945
(function(){
2946

    
2947
var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
2948
        done = 0,
2949
        toString = Object.prototype.toString,
2950
        hasDuplicate = false,
2951
        baseHasDuplicate = true;
2952

    
2953
// Here we check if the JavaScript engine is using some sort of
2954
// optimization where it does not always call our comparision
2955
// function. If that is the case, discard the hasDuplicate value.
2956
//   Thus far that includes Google Chrome.
2957
[0, 0].sort(function(){
2958
        baseHasDuplicate = false;
2959
        return 0;
2960
});
2961

    
2962
var Sizzle = function(selector, context, results, seed) {
2963
        results = results || [];
2964
        context = context || document;
2965

    
2966
        var origContext = context;
2967

    
2968
        if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
2969
                return [];
2970
        }
2971
        
2972
        if ( !selector || typeof selector !== "string" ) {
2973
                return results;
2974
        }
2975

    
2976
        var parts = [], m, set, checkSet, extra, prune = true, contextXML = Sizzle.isXML(context),
2977
                soFar = selector, ret, cur, pop, i;
2978
        
2979
        // Reset the position of the chunker regexp (start from head)
2980
        do {
2981
                chunker.exec("");
2982
                m = chunker.exec(soFar);
2983

    
2984
                if ( m ) {
2985
                        soFar = m[3];
2986
                
2987
                        parts.push( m[1] );
2988
                
2989
                        if ( m[2] ) {
2990
                                extra = m[3];
2991
                                break;
2992
                        }
2993
                }
2994
        } while ( m );
2995

    
2996
        if ( parts.length > 1 && origPOS.exec( selector ) ) {
2997
                if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
2998
                        set = posProcess( parts[0] + parts[1], context );
2999
                } else {
3000
                        set = Expr.relative[ parts[0] ] ?
3001
                                [ context ] :
3002
                                Sizzle( parts.shift(), context );
3003

    
3004
                        while ( parts.length ) {
3005
                                selector = parts.shift();
3006

    
3007
                                if ( Expr.relative[ selector ] ) {
3008
                                        selector += parts.shift();
3009
                                }
3010
                                
3011
                                set = posProcess( selector, set );
3012
                        }
3013
                }
3014
        } else {
3015
                // Take a shortcut and set the context if the root selector is an ID
3016
                // (but not if it'll be faster if the inner selector is an ID)
3017
                if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
3018
                                Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
3019
                        ret = Sizzle.find( parts.shift(), context, contextXML );
3020
                        context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
3021
                }
3022

    
3023
                if ( context ) {
3024
                        ret = seed ?
3025
                                { expr: parts.pop(), set: makeArray(seed) } :
3026
                                Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
3027
                        set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
3028

    
3029
                        if ( parts.length > 0 ) {
3030
                                checkSet = makeArray(set);
3031
                        } else {
3032
                                prune = false;
3033
                        }
3034

    
3035
                        while ( parts.length ) {
3036
                                cur = parts.pop();
3037
                                pop = cur;
3038

    
3039
                                if ( !Expr.relative[ cur ] ) {
3040
                                        cur = "";
3041
                                } else {
3042
                                        pop = parts.pop();
3043
                                }
3044

    
3045
                                if ( pop == null ) {
3046
                                        pop = context;
3047
                                }
3048

    
3049
                                Expr.relative[ cur ]( checkSet, pop, contextXML );
3050
                        }
3051
                } else {
3052
                        checkSet = parts = [];
3053
                }
3054
        }
3055

    
3056
        if ( !checkSet ) {
3057
                checkSet = set;
3058
        }
3059

    
3060
        if ( !checkSet ) {
3061
                Sizzle.error( cur || selector );
3062
        }
3063

    
3064
        if ( toString.call(checkSet) === "[object Array]" ) {
3065
                if ( !prune ) {
3066
                        results.push.apply( results, checkSet );
3067
                } else if ( context && context.nodeType === 1 ) {
3068
                        for ( i = 0; checkSet[i] != null; i++ ) {
3069
                                if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
3070
                                        results.push( set[i] );
3071
                                }
3072
                        }
3073
                } else {
3074
                        for ( i = 0; checkSet[i] != null; i++ ) {
3075
                                if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
3076
                                        results.push( set[i] );
3077
                                }
3078
                        }
3079
                }
3080
        } else {
3081
                makeArray( checkSet, results );
3082
        }
3083

    
3084
        if ( extra ) {
3085
                Sizzle( extra, origContext, results, seed );
3086
                Sizzle.uniqueSort( results );
3087
        }
3088

    
3089
        return results;
3090
};
3091

    
3092
Sizzle.uniqueSort = function(results){
3093
        if ( sortOrder ) {
3094
                hasDuplicate = baseHasDuplicate;
3095
                results.sort(sortOrder);
3096

    
3097
                if ( hasDuplicate ) {
3098
                        for ( var i = 1; i < results.length; i++ ) {
3099
                                if ( results[i] === results[i-1] ) {
3100
                                        results.splice(i--, 1);
3101
                                }
3102
                        }
3103
                }
3104
        }
3105

    
3106
        return results;
3107
};
3108

    
3109
Sizzle.matches = function(expr, set){
3110
        return Sizzle(expr, null, null, set);
3111
};
3112

    
3113
Sizzle.matchesSelector = function(node, expr){
3114
        return Sizzle(expr, null, null, [node]).length > 0;
3115
};
3116

    
3117
Sizzle.find = function(expr, context, isXML){
3118
        var set;
3119

    
3120
        if ( !expr ) {
3121
                return [];
3122
        }
3123

    
3124
        for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
3125
                var type = Expr.order[i], match;
3126
                
3127
                if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
3128
                        var left = match[1];
3129
                        match.splice(1,1);
3130

    
3131
                        if ( left.substr( left.length - 1 ) !== "\\" ) {
3132
                                match[1] = (match[1] || "").replace(/\\/g, "");
3133
                                set = Expr.find[ type ]( match, context, isXML );
3134
                                if ( set != null ) {
3135
                                        expr = expr.replace( Expr.match[ type ], "" );
3136
                                        break;
3137
                                }
3138
                        }
3139
                }
3140
        }
3141

    
3142
        if ( !set ) {
3143
                set = context.getElementsByTagName("*");
3144
        }
3145

    
3146
        return {set: set, expr: expr};
3147
};
3148

    
3149
Sizzle.filter = function(expr, set, inplace, not){
3150
        var old = expr, result = [], curLoop = set, match, anyFound,
3151
                isXMLFilter = set && set[0] && Sizzle.isXML(set[0]);
3152

    
3153
        while ( expr && set.length ) {
3154
                for ( var type in Expr.filter ) {
3155
                        if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
3156
                                var filter = Expr.filter[ type ], found, item, left = match[1];
3157
                                anyFound = false;
3158

    
3159
                                match.splice(1,1);
3160

    
3161
                                if ( left.substr( left.length - 1 ) === "\\" ) {
3162
                                        continue;
3163
                                }
3164

    
3165
                                if ( curLoop === result ) {
3166
                                        result = [];
3167
                                }
3168

    
3169
                                if ( Expr.preFilter[ type ] ) {
3170
                                        match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
3171

    
3172
                                        if ( !match ) {
3173
                                                anyFound = found = true;
3174
                                        } else if ( match === true ) {
3175
                                                continue;
3176
                                        }
3177
                                }
3178

    
3179
                                if ( match ) {
3180
                                        for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
3181
                                                if ( item ) {
3182
                                                        found = filter( item, match, i, curLoop );
3183
                                                        var pass = not ^ !!found;
3184

    
3185
                                                        if ( inplace && found != null ) {
3186
                                                                if ( pass ) {
3187
                                                                        anyFound = true;
3188
                                                                } else {
3189
                                                                        curLoop[i] = false;
3190
                                                                }
3191
                                                        } else if ( pass ) {
3192
                                                                result.push( item );
3193
                                                                anyFound = true;
3194
                                                        }
3195
                                                }
3196
                                        }
3197
                                }
3198

    
3199
                                if ( found !== undefined ) {
3200
                                        if ( !inplace ) {
3201
                                                curLoop = result;
3202
                                        }
3203

    
3204
                                        expr = expr.replace( Expr.match[ type ], "" );
3205

    
3206
                                        if ( !anyFound ) {
3207
                                                return [];
3208
                                        }
3209

    
3210
                                        break;
3211
                                }
3212
                        }
3213
                }
3214

    
3215
                // Improper expression
3216
                if ( expr === old ) {
3217
                        if ( anyFound == null ) {
3218
                                Sizzle.error( expr );
3219
                        } else {
3220
                                break;
3221
                        }
3222
                }
3223

    
3224
                old = expr;
3225
        }
3226

    
3227
        return curLoop;
3228
};
3229

    
3230
Sizzle.error = function( msg ) {
3231
        throw "Syntax error, unrecognized expression: " + msg;
3232
};
3233

    
3234
var Expr = Sizzle.selectors = {
3235
        order: [ "ID", "NAME", "TAG" ],
3236
        match: {
3237
                ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
3238
                CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
3239
                NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
3240
                ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
3241
                TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
3242
                CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
3243
                POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
3244
                PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
3245
        },
3246
        leftMatch: {},
3247
        attrMap: {
3248
                "class": "className",
3249
                "for": "htmlFor"
3250
        },
3251
        attrHandle: {
3252
                href: function(elem){
3253
                        return elem.getAttribute("href");
3254
                }
3255
        },
3256
        relative: {
3257
                "+": function(checkSet, part){
3258
                        var isPartStr = typeof part === "string",
3259
                                isTag = isPartStr && !/\W/.test(part),
3260
                                isPartStrNotTag = isPartStr && !isTag;
3261

    
3262
                        if ( isTag ) {
3263
                                part = part.toLowerCase();
3264
                        }
3265

    
3266
                        for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
3267
                                if ( (elem = checkSet[i]) ) {
3268
                                        while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
3269

    
3270
                                        checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
3271
                                                elem || false :
3272
                                                elem === part;
3273
                                }
3274
                        }
3275

    
3276
                        if ( isPartStrNotTag ) {
3277
                                Sizzle.filter( part, checkSet, true );
3278
                        }
3279
                },
3280
                ">": function(checkSet, part){
3281
                        var isPartStr = typeof part === "string",
3282
                                elem, i = 0, l = checkSet.length;
3283

    
3284
                        if ( isPartStr && !/\W/.test(part) ) {
3285
                                part = part.toLowerCase();
3286

    
3287
                                for ( ; i < l; i++ ) {
3288
                                        elem = checkSet[i];
3289
                                        if ( elem ) {
3290
                                                var parent = elem.parentNode;
3291
                                                checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
3292
                                        }
3293
                                }
3294
                        } else {
3295
                                for ( ; i < l; i++ ) {
3296
                                        elem = checkSet[i];
3297
                                        if ( elem ) {
3298
                                                checkSet[i] = isPartStr ?
3299
                                                        elem.parentNode :
3300
                                                        elem.parentNode === part;
3301
                                        }
3302
                                }
3303

    
3304
                                if ( isPartStr ) {
3305
                                        Sizzle.filter( part, checkSet, true );
3306
                                }
3307
                        }
3308
                },
3309
                "": function(checkSet, part, isXML){
3310
                        var doneName = done++, checkFn = dirCheck, nodeCheck;
3311

    
3312
                        if ( typeof part === "string" && !/\W/.test(part) ) {
3313
                                part = part.toLowerCase();
3314
                                nodeCheck = part;
3315
                                checkFn = dirNodeCheck;
3316
                        }
3317

    
3318
                        checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
3319
                },
3320
                "~": function(checkSet, part, isXML){
3321
                        var doneName = done++, checkFn = dirCheck, nodeCheck;
3322

    
3323
                        if ( typeof part === "string" && !/\W/.test(part) ) {
3324
                                part = part.toLowerCase();
3325
                                nodeCheck = part;
3326
                                checkFn = dirNodeCheck;
3327
                        }
3328

    
3329
                        checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
3330
                }
3331
        },
3332
        find: {
3333
                ID: function(match, context, isXML){
3334
                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
3335
                                var m = context.getElementById(match[1]);
3336
                                // Check parentNode to catch when Blackberry 4.6 returns
3337
                                // nodes that are no longer in the document #6963
3338
                                return m && m.parentNode ? [m] : [];
3339
                        }
3340
                },
3341
                NAME: function(match, context){
3342
                        if ( typeof context.getElementsByName !== "undefined" ) {
3343
                                var ret = [], results = context.getElementsByName(match[1]);
3344

    
3345
                                for ( var i = 0, l = results.length; i < l; i++ ) {
3346
                                        if ( results[i].getAttribute("name") === match[1] ) {
3347
                                                ret.push( results[i] );
3348
                                        }
3349
                                }
3350

    
3351
                                return ret.length === 0 ? null : ret;
3352
                        }
3353
                },
3354
                TAG: function(match, context){
3355
                        return context.getElementsByTagName(match[1]);
3356
                }
3357
        },
3358
        preFilter: {
3359
                CLASS: function(match, curLoop, inplace, result, not, isXML){
3360
                        match = " " + match[1].replace(/\\/g, "") + " ";
3361

    
3362
                        if ( isXML ) {
3363
                                return match;
3364
                        }
3365

    
3366
                        for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
3367
                                if ( elem ) {
3368
                                        if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) {
3369
                                                if ( !inplace ) {
3370
                                                        result.push( elem );
3371
                                                }
3372
                                        } else if ( inplace ) {
3373
                                                curLoop[i] = false;
3374
                                        }
3375
                                }
3376
                        }
3377

    
3378
                        return false;
3379
                },
3380
                ID: function(match){
3381
                        return match[1].replace(/\\/g, "");
3382
                },
3383
                TAG: function(match, curLoop){
3384
                        return match[1].toLowerCase();
3385
                },
3386
                CHILD: function(match){
3387
                        if ( match[1] === "nth" ) {
3388
                                // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
3389
                                var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
3390
                                        match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
3391
                                        !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
3392

    
3393
                                // calculate the numbers (first)n+(last) including if they are negative
3394
                                match[2] = (test[1] + (test[2] || 1)) - 0;
3395
                                match[3] = test[3] - 0;
3396
                        }
3397

    
3398
                        // TODO: Move to normal caching system
3399
                        match[0] = done++;
3400

    
3401
                        return match;
3402
                },
3403
                ATTR: function(match, curLoop, inplace, result, not, isXML){
3404
                        var name = match[1].replace(/\\/g, "");
3405
                        
3406
                        if ( !isXML && Expr.attrMap[name] ) {
3407
                                match[1] = Expr.attrMap[name];
3408
                        }
3409

    
3410
                        if ( match[2] === "~=" ) {
3411
                                match[4] = " " + match[4] + " ";
3412
                        }
3413

    
3414
                        return match;
3415
                },
3416
                PSEUDO: function(match, curLoop, inplace, result, not){
3417
                        if ( match[1] === "not" ) {
3418
                                // If we're dealing with a complex expression, or a simple one
3419
                                if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
3420
                                        match[3] = Sizzle(match[3], null, null, curLoop);
3421
                                } else {
3422
                                        var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
3423
                                        if ( !inplace ) {
3424
                                                result.push.apply( result, ret );
3425
                                        }
3426
                                        return false;
3427
                                }
3428
                        } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
3429
                                return true;
3430
                        }
3431
                        
3432
                        return match;
3433
                },
3434
                POS: function(match){
3435
                        match.unshift( true );
3436
                        return match;
3437
                }
3438
        },
3439
        filters: {
3440
                enabled: function(elem){
3441
                        return elem.disabled === false && elem.type !== "hidden";
3442
                },
3443
                disabled: function(elem){
3444
                        return elem.disabled === true;
3445
                },
3446
                checked: function(elem){
3447
                        return elem.checked === true;
3448
                },
3449
                selected: function(elem){
3450
                        // Accessing this property makes selected-by-default
3451
                        // options in Safari work properly
3452
                        elem.parentNode.selectedIndex;
3453
                        return elem.selected === true;
3454
                },
3455
                parent: function(elem){
3456
                        return !!elem.firstChild;
3457
                },
3458
                empty: function(elem){
3459
                        return !elem.firstChild;
3460
                },
3461
                has: function(elem, i, match){
3462
                        return !!Sizzle( match[3], elem ).length;
3463
                },
3464
                header: function(elem){
3465
                        return (/h\d/i).test( elem.nodeName );
3466
                },
3467
                text: function(elem){
3468
                        return "text" === elem.type;
3469
                },
3470
                radio: function(elem){
3471
                        return "radio" === elem.type;
3472
                },
3473
                checkbox: function(elem){
3474
                        return "checkbox" === elem.type;
3475
                },
3476
                file: function(elem){
3477
                        return "file" === elem.type;
3478
                },
3479
                password: function(elem){
3480
                        return "password" === elem.type;
3481
                },
3482
                submit: function(elem){
3483
                        return "submit" === elem.type;
3484
                },
3485
                image: function(elem){
3486
                        return "image" === elem.type;
3487
                },
3488
                reset: function(elem){
3489
                        return "reset" === elem.type;
3490
                },
3491
                button: function(elem){
3492
                        return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
3493
                },
3494
                input: function(elem){
3495
                        return (/input|select|textarea|button/i).test(elem.nodeName);
3496
                }
3497
        },
3498
        setFilters: {
3499
                first: function(elem, i){
3500
                        return i === 0;
3501
                },
3502
                last: function(elem, i, match, array){
3503
                        return i === array.length - 1;
3504
                },
3505
                even: function(elem, i){
3506
                        return i % 2 === 0;
3507
                },
3508
                odd: function(elem, i){
3509
                        return i % 2 === 1;
3510
                },
3511
                lt: function(elem, i, match){
3512
                        return i < match[3] - 0;
3513
                },
3514
                gt: function(elem, i, match){
3515
                        return i > match[3] - 0;
3516
                },
3517
                nth: function(elem, i, match){
3518
                        return match[3] - 0 === i;
3519
                },
3520
                eq: function(elem, i, match){
3521
                        return match[3] - 0 === i;
3522
                }
3523
        },
3524
        filter: {
3525
                PSEUDO: function(elem, match, i, array){
3526
                        var name = match[1], filter = Expr.filters[ name ];
3527

    
3528
                        if ( filter ) {
3529
                                return filter( elem, i, match, array );
3530
                        } else if ( name === "contains" ) {
3531
                                return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
3532
                        } else if ( name === "not" ) {
3533
                                var not = match[3];
3534

    
3535
                                for ( var j = 0, l = not.length; j < l; j++ ) {
3536
                                        if ( not[j] === elem ) {
3537
                                                return false;
3538
                                        }
3539
                                }
3540

    
3541
                                return true;
3542
                        } else {
3543
                                Sizzle.error( "Syntax error, unrecognized expression: " + name );
3544
                        }
3545
                },
3546
                CHILD: function(elem, match){
3547
                        var type = match[1], node = elem;
3548
                        switch (type) {
3549
                                case 'only':
3550
                                case 'first':
3551
                                        while ( (node = node.previousSibling) )         {
3552
                                                if ( node.nodeType === 1 ) { 
3553
                                                        return false; 
3554
                                                }
3555
                                        }
3556
                                        if ( type === "first" ) { 
3557
                                                return true; 
3558
                                        }
3559
                                        node = elem;
3560
                                case 'last':
3561
                                        while ( (node = node.nextSibling) )         {
3562
                                                if ( node.nodeType === 1 ) { 
3563
                                                        return false; 
3564
                                                }
3565
                                        }
3566
                                        return true;
3567
                                case 'nth':
3568
                                        var first = match[2], last = match[3];
3569

    
3570
                                        if ( first === 1 && last === 0 ) {
3571
                                                return true;
3572
                                        }
3573
                                        
3574
                                        var doneName = match[0],
3575
                                                parent = elem.parentNode;
3576
        
3577
                                        if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
3578
                                                var count = 0;
3579
                                                for ( node = parent.firstChild; node; node = node.nextSibling ) {
3580
                                                        if ( node.nodeType === 1 ) {
3581
                                                                node.nodeIndex = ++count;
3582
                                                        }
3583
                                                } 
3584
                                                parent.sizcache = doneName;
3585
                                        }
3586
                                        
3587
                                        var diff = elem.nodeIndex - last;
3588
                                        if ( first === 0 ) {
3589
                                                return diff === 0;
3590
                                        } else {
3591
                                                return ( diff % first === 0 && diff / first >= 0 );
3592
                                        }
3593
                        }
3594
                },
3595
                ID: function(elem, match){
3596
                        return elem.nodeType === 1 && elem.getAttribute("id") === match;
3597
                },
3598
                TAG: function(elem, match){
3599
                        return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
3600
                },
3601
                CLASS: function(elem, match){
3602
                        return (" " + (elem.className || elem.getAttribute("class")) + " ")
3603
                                .indexOf( match ) > -1;
3604
                },
3605
                ATTR: function(elem, match){
3606
                        var name = match[1],
3607
                                result = Expr.attrHandle[ name ] ?
3608
                                        Expr.attrHandle[ name ]( elem ) :
3609
                                        elem[ name ] != null ?
3610
                                                elem[ name ] :
3611
                                                elem.getAttribute( name ),
3612
                                value = result + "",
3613
                                type = match[2],
3614
                                check = match[4];
3615

    
3616
                        return result == null ?
3617
                                type === "!=" :
3618
                                type === "=" ?
3619
                                value === check :
3620
                                type === "*=" ?
3621
                                value.indexOf(check) >= 0 :
3622
                                type === "~=" ?
3623
                                (" " + value + " ").indexOf(check) >= 0 :
3624
                                !check ?
3625
                                value && result !== false :
3626
                                type === "!=" ?
3627
                                value !== check :
3628
                                type === "^=" ?
3629
                                value.indexOf(check) === 0 :
3630
                                type === "$=" ?
3631
                                value.substr(value.length - check.length) === check :
3632
                                type === "|=" ?
3633
                                value === check || value.substr(0, check.length + 1) === check + "-" :
3634
                                false;
3635
                },
3636
                POS: function(elem, match, i, array){
3637
                        var name = match[2], filter = Expr.setFilters[ name ];
3638

    
3639
                        if ( filter ) {
3640
                                return filter( elem, i, match, array );
3641
                        }
3642
                }
3643
        }
3644
};
3645

    
3646
var origPOS = Expr.match.POS,
3647
        fescape = function(all, num){
3648
                return "\\" + (num - 0 + 1);
3649
        };
3650

    
3651
for ( var type in Expr.match ) {
3652
        Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
3653
        Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
3654
}
3655

    
3656
var makeArray = function(array, results) {
3657
        array = Array.prototype.slice.call( array, 0 );
3658

    
3659
        if ( results ) {
3660
                results.push.apply( results, array );
3661
                return results;
3662
        }
3663
        
3664
        return array;
3665
};
3666

    
3667
// Perform a simple check to determine if the browser is capable of
3668
// converting a NodeList to an array using builtin methods.
3669
// Also verifies that the returned array holds DOM nodes
3670
// (which is not the case in the Blackberry browser)
3671
try {
3672
        Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
3673

    
3674
// Provide a fallback method if it does not work
3675
} catch(e){
3676
        makeArray = function(array, results) {
3677
                var ret = results || [], i = 0;
3678

    
3679
                if ( toString.call(array) === "[object Array]" ) {
3680
                        Array.prototype.push.apply( ret, array );
3681
                } else {
3682
                        if ( typeof array.length === "number" ) {
3683
                                for ( var l = array.length; i < l; i++ ) {
3684
                                        ret.push( array[i] );
3685
                                }
3686
                        } else {
3687
                                for ( ; array[i]; i++ ) {
3688
                                        ret.push( array[i] );
3689
                                }
3690
                        }
3691
                }
3692

    
3693
                return ret;
3694
        };
3695
}
3696

    
3697
var sortOrder, siblingCheck;
3698

    
3699
if ( document.documentElement.compareDocumentPosition ) {
3700
        sortOrder = function( a, b ) {
3701
                if ( a === b ) {
3702
                        hasDuplicate = true;
3703
                        return 0;
3704
                }
3705

    
3706
                if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
3707
                        return a.compareDocumentPosition ? -1 : 1;
3708
                }
3709

    
3710
                return a.compareDocumentPosition(b) & 4 ? -1 : 1;
3711
        };
3712
} else {
3713
        sortOrder = function( a, b ) {
3714
                var ap = [], bp = [], aup = a.parentNode, bup = b.parentNode,
3715
                        cur = aup, al, bl;
3716

    
3717
                // The nodes are identical, we can exit early
3718
                if ( a === b ) {
3719
                        hasDuplicate = true;
3720
                        return 0;
3721

    
3722
                // If the nodes are siblings (or identical) we can do a quick check
3723
                } else if ( aup === bup ) {
3724
                        return siblingCheck( a, b );
3725

    
3726
                // If no parents were found then the nodes are disconnected
3727
                } else if ( !aup ) {
3728
                        return -1;
3729

    
3730
                } else if ( !bup ) {
3731
                        return 1;
3732
                }
3733

    
3734
                // Otherwise they're somewhere else in the tree so we need
3735
                // to build up a full list of the parentNodes for comparison
3736
                while ( cur ) {
3737
                        ap.unshift( cur );
3738
                        cur = cur.parentNode;
3739
                }
3740

    
3741
                cur = bup;
3742

    
3743
                while ( cur ) {
3744
                        bp.unshift( cur );
3745
                        cur = cur.parentNode;
3746
                }
3747

    
3748
                al = ap.length;
3749
                bl = bp.length;
3750

    
3751
                // Start walking down the tree looking for a discrepancy
3752
                for ( var i = 0; i < al && i < bl; i++ ) {
3753
                        if ( ap[i] !== bp[i] ) {
3754
                                return siblingCheck( ap[i], bp[i] );
3755
                        }
3756
                }
3757

    
3758
                // We ended someplace up the tree so do a sibling check
3759
                return i === al ?
3760
                        siblingCheck( a, bp[i], -1 ) :
3761
                        siblingCheck( ap[i], b, 1 );
3762
        };
3763

    
3764
        siblingCheck = function( a, b, ret ) {
3765
                if ( a === b ) {
3766
                        return ret;
3767
                }
3768

    
3769
                var cur = a.nextSibling;
3770

    
3771
                while ( cur ) {
3772
                        if ( cur === b ) {
3773
                                return -1;
3774
                        }
3775

    
3776
                        cur = cur.nextSibling;
3777
                }
3778

    
3779
                return 1;
3780
        };
3781
}
3782

    
3783
// Utility function for retreiving the text value of an array of DOM nodes
3784
Sizzle.getText = function( elems ) {
3785
        var ret = "", elem;
3786

    
3787
        for ( var i = 0; elems[i]; i++ ) {
3788
                elem = elems[i];
3789

    
3790
                // Get the text from text nodes and CDATA nodes
3791
                if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
3792
                        ret += elem.nodeValue;
3793

    
3794
                // Traverse everything else, except comment nodes
3795
                } else if ( elem.nodeType !== 8 ) {
3796
                        ret += Sizzle.getText( elem.childNodes );
3797
                }
3798
        }
3799

    
3800
        return ret;
3801
};
3802

    
3803
// Check to see if the browser returns elements by name when
3804
// querying by getElementById (and provide a workaround)
3805
(function(){
3806
        // We're going to inject a fake input element with a specified name
3807
        var form = document.createElement("div"),
3808
                id = "script" + (new Date()).getTime();
3809
        form.innerHTML = "<a name='" + id + "'/>";
3810

    
3811
        // Inject it into the root element, check its status, and remove it quickly
3812
        var root = document.documentElement;
3813
        root.insertBefore( form, root.firstChild );
3814

    
3815
        // The workaround has to do additional checks after a getElementById
3816
        // Which slows things down for other browsers (hence the branching)
3817
        if ( document.getElementById( id ) ) {
3818
                Expr.find.ID = function(match, context, isXML){
3819
                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
3820
                                var m = context.getElementById(match[1]);
3821
                                return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
3822
                        }
3823
                };
3824

    
3825
                Expr.filter.ID = function(elem, match){
3826
                        var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
3827
                        return elem.nodeType === 1 && node && node.nodeValue === match;
3828
                };
3829
        }
3830

    
3831
        root.removeChild( form );
3832
        root = form = null; // release memory in IE
3833
})();
3834

    
3835
(function(){
3836
        // Check to see if the browser returns only elements
3837
        // when doing getElementsByTagName("*")
3838

    
3839
        // Create a fake element
3840
        var div = document.createElement("div");
3841
        div.appendChild( document.createComment("") );
3842

    
3843
        // Make sure no comments are found
3844
        if ( div.getElementsByTagName("*").length > 0 ) {
3845
                Expr.find.TAG = function(match, context){
3846
                        var results = context.getElementsByTagName(match[1]);
3847

    
3848
                        // Filter out possible comments
3849
                        if ( match[1] === "*" ) {
3850
                                var tmp = [];
3851

    
3852
                                for ( var i = 0; results[i]; i++ ) {
3853
                                        if ( results[i].nodeType === 1 ) {
3854
                                                tmp.push( results[i] );
3855
                                        }
3856
                                }
3857

    
3858
                                results = tmp;
3859
                        }
3860

    
3861
                        return results;
3862
                };
3863
        }
3864

    
3865
        // Check to see if an attribute returns normalized href attributes
3866
        div.innerHTML = "<a href='#'></a>";
3867
        if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
3868
                        div.firstChild.getAttribute("href") !== "#" ) {
3869
                Expr.attrHandle.href = function(elem){
3870
                        return elem.getAttribute("href", 2);
3871
                };
3872
        }
3873

    
3874
        div = null; // release memory in IE
3875
})();
3876

    
3877
if ( document.querySelectorAll ) {
3878
        (function(){
3879
                var oldSizzle = Sizzle, div = document.createElement("div");
3880
                div.innerHTML = "<p class='TEST'></p>";
3881

    
3882
                // Safari can't handle uppercase or unicode characters when
3883
                // in quirks mode.
3884
                if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
3885
                        return;
3886
                }
3887
        
3888
                Sizzle = function(query, context, extra, seed){
3889
                        context = context || document;
3890

    
3891
                        // Only use querySelectorAll on non-XML documents
3892
                        // (ID selectors don't work in non-HTML documents)
3893
                        if ( !seed && !Sizzle.isXML(context) ) {
3894
                                if ( context.nodeType === 9 ) {
3895
                                        try {
3896
                                                return makeArray( context.querySelectorAll(query), extra );
3897
                                        } catch(qsaError) {}
3898

    
3899
                                // qSA works strangely on Element-rooted queries
3900
                                // We can work around this by specifying an extra ID on the root
3901
                                // and working up from there (Thanks to Andrew Dupont for the technique)
3902
                                // IE 8 doesn't work on object elements
3903
                                } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
3904
                                        var old = context.id, id = context.id = "__sizzle__";
3905

    
3906
                                        try {
3907
                                                return makeArray( context.querySelectorAll( "#" + id + " " + query ), extra );
3908

    
3909
                                        } catch(pseudoError) {
3910
                                        } finally {
3911
                                                if ( old ) {
3912
                                                        context.id = old;
3913

    
3914
                                                } else {
3915
                                                        context.removeAttribute( "id" );
3916
                                                }
3917
                                        }
3918
                                }
3919
                        }
3920
                
3921
                        return oldSizzle(query, context, extra, seed);
3922
                };
3923

    
3924
                for ( var prop in oldSizzle ) {
3925
                        Sizzle[ prop ] = oldSizzle[ prop ];
3926
                }
3927

    
3928
                div = null; // release memory in IE
3929
        })();
3930
}
3931

    
3932
(function(){
3933
        var html = document.documentElement,
3934
                matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector,
3935
                pseudoWorks = false;
3936

    
3937
        try {
3938
                // This should fail with an exception
3939
                // Gecko does not error, returns false instead
3940
                matches.call( document.documentElement, ":sizzle" );
3941
        
3942
        } catch( pseudoError ) {
3943
                pseudoWorks = true;
3944
        }
3945

    
3946
        if ( matches ) {
3947
                Sizzle.matchesSelector = function( node, expr ) {
3948
                                try { 
3949
                                        if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) ) {
3950
                                                return matches.call( node, expr );
3951
                                        }
3952
                                } catch(e) {}
3953

    
3954
                                return Sizzle(expr, null, null, [node]).length > 0;
3955
                };
3956
        }
3957
})();
3958

    
3959
(function(){
3960
        var div = document.createElement("div");
3961

    
3962
        div.innerHTML = "<div class='test e'></div><div class='test'></div>";
3963

    
3964
        // Opera can't find a second classname (in 9.6)
3965
        // Also, make sure that getElementsByClassName actually exists
3966
        if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
3967
                return;
3968
        }
3969

    
3970
        // Safari caches class attributes, doesn't catch changes (in 3.2)
3971
        div.lastChild.className = "e";
3972

    
3973
        if ( div.getElementsByClassName("e").length === 1 ) {
3974
                return;
3975
        }
3976
        
3977
        Expr.order.splice(1, 0, "CLASS");
3978
        Expr.find.CLASS = function(match, context, isXML) {
3979
                if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
3980
                        return context.getElementsByClassName(match[1]);
3981
                }
3982
        };
3983

    
3984
        div = null; // release memory in IE
3985
})();
3986

    
3987
function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
3988
        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
3989
                var elem = checkSet[i];
3990
                if ( elem ) {
3991
                        elem = elem[dir];
3992
                        var match = false;
3993

    
3994
                        while ( elem ) {
3995
                                if ( elem.sizcache === doneName ) {
3996
                                        match = checkSet[elem.sizset];
3997
                                        break;
3998
                                }
3999

    
4000
                                if ( elem.nodeType === 1 && !isXML ){
4001
                                        elem.sizcache = doneName;
4002
                                        elem.sizset = i;
4003
                                }
4004

    
4005
                                if ( elem.nodeName.toLowerCase() === cur ) {
4006
                                        match = elem;
4007
                                        break;
4008
                                }
4009

    
4010
                                elem = elem[dir];
4011
                        }
4012

    
4013
                        checkSet[i] = match;
4014
                }
4015
        }
4016
}
4017

    
4018
function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
4019
        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
4020
                var elem = checkSet[i];
4021
                if ( elem ) {
4022
                        elem = elem[dir];
4023
                        var match = false;
4024

    
4025
                        while ( elem ) {
4026
                                if ( elem.sizcache === doneName ) {
4027
                                        match = checkSet[elem.sizset];
4028
                                        break;
4029
                                }
4030

    
4031
                                if ( elem.nodeType === 1 ) {
4032
                                        if ( !isXML ) {
4033
                                                elem.sizcache = doneName;
4034
                                                elem.sizset = i;
4035
                                        }
4036
                                        if ( typeof cur !== "string" ) {
4037
                                                if ( elem === cur ) {
4038
                                                        match = true;
4039
                                                        break;
4040
                                                }
4041

    
4042
                                        } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
4043
                                                match = elem;
4044
                                                break;
4045
                                        }
4046
                                }
4047

    
4048
                                elem = elem[dir];
4049
                        }
4050

    
4051
                        checkSet[i] = match;
4052
                }
4053
        }
4054
}
4055

    
4056
Sizzle.contains = document.documentElement.contains ? function(a, b){
4057
        return a !== b && (a.contains ? a.contains(b) : true);
4058
} : function(a, b){
4059
        return !!(a.compareDocumentPosition(b) & 16);
4060
};
4061

    
4062
Sizzle.isXML = function(elem){
4063
        // documentElement is verified for cases where it doesn't yet exist
4064
        // (such as loading iframes in IE - #4833) 
4065
        var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
4066
        return documentElement ? documentElement.nodeName !== "HTML" : false;
4067
};
4068

    
4069
var posProcess = function(selector, context){
4070
        var tmpSet = [], later = "", match,
4071
                root = context.nodeType ? [context] : context;
4072

    
4073
        // Position selectors must be done after the filter
4074
        // And so must :not(positional) so we move all PSEUDOs to the end
4075
        while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
4076
                later += match[0];
4077
                selector = selector.replace( Expr.match.PSEUDO, "" );
4078
        }
4079

    
4080
        selector = Expr.relative[selector] ? selector + "*" : selector;
4081

    
4082
        for ( var i = 0, l = root.length; i < l; i++ ) {
4083
                Sizzle( selector, root[i], tmpSet );
4084
        }
4085

    
4086
        return Sizzle.filter( later, tmpSet );
4087
};
4088

    
4089
// EXPOSE
4090
jQuery.find = Sizzle;
4091
jQuery.expr = Sizzle.selectors;
4092
jQuery.expr[":"] = jQuery.expr.filters;
4093
jQuery.unique = Sizzle.uniqueSort;
4094
jQuery.text = Sizzle.getText;
4095
jQuery.isXMLDoc = Sizzle.isXML;
4096
jQuery.contains = Sizzle.contains;
4097

    
4098

    
4099
})();
4100

    
4101

    
4102
var runtil = /Until$/,
4103
        rparentsprev = /^(?:parents|prevUntil|prevAll)/,
4104
        // Note: This RegExp should be improved, or likely pulled from Sizzle
4105
        rmultiselector = /,/,
4106
        isSimple = /^.[^:#\[\.,]*$/,
4107
        slice = Array.prototype.slice,
4108
        POS = jQuery.expr.match.POS;
4109

    
4110
jQuery.fn.extend({
4111
        find: function( selector ) {
4112
                var ret = this.pushStack( "", "find", selector ), length = 0;
4113

    
4114
                for ( var i = 0, l = this.length; i < l; i++ ) {
4115
                        length = ret.length;
4116
                        jQuery.find( selector, this[i], ret );
4117

    
4118
                        if ( i > 0 ) {
4119
                                // Make sure that the results are unique
4120
                                for ( var n = length; n < ret.length; n++ ) {
4121
                                        for ( var r = 0; r < length; r++ ) {
4122
                                                if ( ret[r] === ret[n] ) {
4123
                                                        ret.splice(n--, 1);
4124
                                                        break;
4125
                                                }
4126
                                        }
4127
                                }
4128
                        }
4129
                }
4130

    
4131
                return ret;
4132
        },
4133

    
4134
        has: function( target ) {
4135
                var targets = jQuery( target );
4136
                return this.filter(function() {
4137
                        for ( var i = 0, l = targets.length; i < l; i++ ) {
4138
                                if ( jQuery.contains( this, targets[i] ) ) {
4139
                                        return true;
4140
                                }
4141
                        }
4142
                });
4143
        },
4144

    
4145
        not: function( selector ) {
4146
                return this.pushStack( winnow(this, selector, false), "not", selector);
4147
        },
4148

    
4149
        filter: function( selector ) {
4150
                return this.pushStack( winnow(this, selector, true), "filter", selector );
4151
        },
4152
        
4153
        is: function( selector ) {
4154
                return !!selector && jQuery.filter( selector, this ).length > 0;
4155
        },
4156

    
4157
        closest: function( selectors, context ) {
4158
                var ret = [], i, l, cur = this[0];
4159

    
4160
                if ( jQuery.isArray( selectors ) ) {
4161
                        var match, matches = {}, selector, level = 1;
4162

    
4163
                        if ( cur && selectors.length ) {
4164
                                for ( i = 0, l = selectors.length; i < l; i++ ) {
4165
                                        selector = selectors[i];
4166

    
4167
                                        if ( !matches[selector] ) {
4168
                                                matches[selector] = jQuery.expr.match.POS.test( selector ) ? 
4169
                                                        jQuery( selector, context || this.context ) :
4170
                                                        selector;
4171
                                        }
4172
                                }
4173

    
4174
                                while ( cur && cur.ownerDocument && cur !== context ) {
4175
                                        for ( selector in matches ) {
4176
                                                match = matches[selector];
4177

    
4178
                                                if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
4179
                                                        ret.push({ selector: selector, elem: cur, level: level });
4180
                                                }
4181
                                        }
4182

    
4183
                                        cur = cur.parentNode;
4184
                                        level++;
4185
                                }
4186
                        }
4187

    
4188
                        return ret;
4189
                }
4190

    
4191
                var pos = POS.test( selectors ) ? 
4192
                        jQuery( selectors, context || this.context ) : null;
4193

    
4194
                for ( i = 0, l = this.length; i < l; i++ ) {
4195
                        cur = this[i];
4196

    
4197
                        while ( cur ) {
4198
                                if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
4199
                                        ret.push( cur );
4200
                                        break;
4201

    
4202
                                } else {
4203
                                        cur = cur.parentNode;
4204
                                        if ( !cur || !cur.ownerDocument || cur === context ) {
4205
                                                break;
4206
                                        }
4207
                                }
4208
                        }
4209
                }
4210

    
4211
                ret = ret.length > 1 ? jQuery.unique(ret) : ret;
4212
                
4213
                return this.pushStack( ret, "closest", selectors );
4214
        },
4215
        
4216
        // Determine the position of an element within
4217
        // the matched set of elements
4218
        index: function( elem ) {
4219
                if ( !elem || typeof elem === "string" ) {
4220
                        return jQuery.inArray( this[0],
4221
                                // If it receives a string, the selector is used
4222
                                // If it receives nothing, the siblings are used
4223
                                elem ? jQuery( elem ) : this.parent().children() );
4224
                }
4225
                // Locate the position of the desired element
4226
                return jQuery.inArray(
4227
                        // If it receives a jQuery object, the first element is used
4228
                        elem.jquery ? elem[0] : elem, this );
4229
        },
4230

    
4231
        add: function( selector, context ) {
4232
                var set = typeof selector === "string" ?
4233
                                jQuery( selector, context || this.context ) :
4234
                                jQuery.makeArray( selector ),
4235
                        all = jQuery.merge( this.get(), set );
4236

    
4237
                return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
4238
                        all :
4239
                        jQuery.unique( all ) );
4240
        },
4241

    
4242
        andSelf: function() {
4243
                return this.add( this.prevObject );
4244
        }
4245
});
4246

    
4247
// A painfully simple check to see if an element is disconnected
4248
// from a document (should be improved, where feasible).
4249
function isDisconnected( node ) {
4250
        return !node || !node.parentNode || node.parentNode.nodeType === 11;
4251
}
4252

    
4253
jQuery.each({
4254
        parent: function( elem ) {
4255
                var parent = elem.parentNode;
4256
                return parent && parent.nodeType !== 11 ? parent : null;
4257
        },
4258
        parents: function( elem ) {
4259
                return jQuery.dir( elem, "parentNode" );
4260
        },
4261
        parentsUntil: function( elem, i, until ) {
4262
                return jQuery.dir( elem, "parentNode", until );
4263
        },
4264
        next: function( elem ) {
4265
                return jQuery.nth( elem, 2, "nextSibling" );
4266
        },
4267
        prev: function( elem ) {
4268
                return jQuery.nth( elem, 2, "previousSibling" );
4269
        },
4270
        nextAll: function( elem ) {
4271
                return jQuery.dir( elem, "nextSibling" );
4272
        },
4273
        prevAll: function( elem ) {
4274
                return jQuery.dir( elem, "previousSibling" );
4275
        },
4276
        nextUntil: function( elem, i, until ) {
4277
                return jQuery.dir( elem, "nextSibling", until );
4278
        },
4279
        prevUntil: function( elem, i, until ) {
4280
                return jQuery.dir( elem, "previousSibling", until );
4281
        },
4282
        siblings: function( elem ) {
4283
                return jQuery.sibling( elem.parentNode.firstChild, elem );
4284
        },
4285
        children: function( elem ) {
4286
                return jQuery.sibling( elem.firstChild );
4287
        },
4288
        contents: function( elem ) {
4289
                return jQuery.nodeName( elem, "iframe" ) ?
4290
                        elem.contentDocument || elem.contentWindow.document :
4291
                        jQuery.makeArray( elem.childNodes );
4292
        }
4293
}, function( name, fn ) {
4294
        jQuery.fn[ name ] = function( until, selector ) {
4295
                var ret = jQuery.map( this, fn, until );
4296
                
4297
                if ( !runtil.test( name ) ) {
4298
                        selector = until;
4299
                }
4300

    
4301
                if ( selector && typeof selector === "string" ) {
4302
                        ret = jQuery.filter( selector, ret );
4303
                }
4304

    
4305
                ret = this.length > 1 ? jQuery.unique( ret ) : ret;
4306

    
4307
                if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
4308
                        ret = ret.reverse();
4309
                }
4310

    
4311
                return this.pushStack( ret, name, slice.call(arguments).join(",") );
4312
        };
4313
});
4314

    
4315
jQuery.extend({
4316
        filter: function( expr, elems, not ) {
4317
                if ( not ) {
4318
                        expr = ":not(" + expr + ")";
4319
                }
4320

    
4321
                return elems.length === 1 ?
4322
                        jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
4323
                        jQuery.find.matches(expr, elems);
4324
        },
4325
        
4326
        dir: function( elem, dir, until ) {
4327
                var matched = [], cur = elem[dir];
4328
                while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
4329
                        if ( cur.nodeType === 1 ) {
4330
                                matched.push( cur );
4331
                        }
4332
                        cur = cur[dir];
4333
                }
4334
                return matched;
4335
        },
4336

    
4337
        nth: function( cur, result, dir, elem ) {
4338
                result = result || 1;
4339
                var num = 0;
4340

    
4341
                for ( ; cur; cur = cur[dir] ) {
4342
                        if ( cur.nodeType === 1 && ++num === result ) {
4343
                                break;
4344
                        }
4345
                }
4346

    
4347
                return cur;
4348
        },
4349

    
4350
        sibling: function( n, elem ) {
4351
                var r = [];
4352

    
4353
                for ( ; n; n = n.nextSibling ) {
4354
                        if ( n.nodeType === 1 && n !== elem ) {
4355
                                r.push( n );
4356
                        }
4357
                }
4358

    
4359
                return r;
4360
        }
4361
});
4362

    
4363
// Implement the identical functionality for filter and not
4364
function winnow( elements, qualifier, keep ) {
4365
        if ( jQuery.isFunction( qualifier ) ) {
4366
                return jQuery.grep(elements, function( elem, i ) {
4367
                        var retVal = !!qualifier.call( elem, i, elem );
4368
                        return retVal === keep;
4369
                });
4370

    
4371
        } else if ( qualifier.nodeType ) {
4372
                return jQuery.grep(elements, function( elem, i ) {
4373
                        return (elem === qualifier) === keep;
4374
                });
4375

    
4376
        } else if ( typeof qualifier === "string" ) {
4377
                var filtered = jQuery.grep(elements, function( elem ) {
4378
                        return elem.nodeType === 1;
4379
                });
4380

    
4381
                if ( isSimple.test( qualifier ) ) {
4382
                        return jQuery.filter(qualifier, filtered, !keep);
4383
                } else {
4384
                        qualifier = jQuery.filter( qualifier, filtered );
4385
                }
4386
        }
4387

    
4388
        return jQuery.grep(elements, function( elem, i ) {
4389
                return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
4390
        });
4391
}
4392

    
4393

    
4394

    
4395

    
4396
var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
4397
        rleadingWhitespace = /^\s+/,
4398
        rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
4399
        rtagName = /<([\w:]+)/,
4400
        rtbody = /<tbody/i,
4401
        rhtml = /<|&#?\w+;/,
4402
        rnocache = /<(?:script|object|embed|option|style)/i,
4403
        rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,  // checked="checked" or checked (html5)
4404
        raction = /\=([^="'>\s]+\/)>/g,
4405
        wrapMap = {
4406
                option: [ 1, "<select multiple='multiple'>", "</select>" ],
4407
                legend: [ 1, "<fieldset>", "</fieldset>" ],
4408
                thead: [ 1, "<table>", "</table>" ],
4409
                tr: [ 2, "<table><tbody>", "</tbody></table>" ],
4410
                td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
4411
                col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
4412
                area: [ 1, "<map>", "</map>" ],
4413
                _default: [ 0, "", "" ]
4414
        };
4415

    
4416
wrapMap.optgroup = wrapMap.option;
4417
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4418
wrapMap.th = wrapMap.td;
4419

    
4420
// IE can't serialize <link> and <script> tags normally
4421
if ( !jQuery.support.htmlSerialize ) {
4422
        wrapMap._default = [ 1, "div<div>", "</div>" ];
4423
}
4424

    
4425
jQuery.fn.extend({
4426
        text: function( text ) {
4427
                if ( jQuery.isFunction(text) ) {
4428
                        return this.each(function(i) {
4429
                                var self = jQuery(this);
4430
                                self.text( text.call(this, i, self.text()) );
4431
                        });
4432
                }
4433

    
4434
                if ( typeof text !== "object" && text !== undefined ) {
4435
                        return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
4436
                }
4437

    
4438
                return jQuery.text( this );
4439
        },
4440

    
4441
        wrapAll: function( html ) {
4442
                if ( jQuery.isFunction( html ) ) {
4443
                        return this.each(function(i) {
4444
                                jQuery(this).wrapAll( html.call(this, i) );
4445
                        });
4446
                }
4447

    
4448
                if ( this[0] ) {
4449
                        // The elements to wrap the target around
4450
                        var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
4451

    
4452
                        if ( this[0].parentNode ) {
4453
                                wrap.insertBefore( this[0] );
4454
                        }
4455

    
4456
                        wrap.map(function() {
4457
                                var elem = this;
4458

    
4459
                                while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
4460
                                        elem = elem.firstChild;
4461
                                }
4462

    
4463
                                return elem;
4464
                        }).append(this);
4465
                }
4466

    
4467
                return this;
4468
        },
4469

    
4470
        wrapInner: function( html ) {
4471
                if ( jQuery.isFunction( html ) ) {
4472
                        return this.each(function(i) {
4473
                                jQuery(this).wrapInner( html.call(this, i) );
4474
                        });
4475
                }
4476

    
4477
                return this.each(function() {
4478
                        var self = jQuery( this ), contents = self.contents();
4479

    
4480
                        if ( contents.length ) {
4481
                                contents.wrapAll( html );
4482

    
4483
                        } else {
4484
                                self.append( html );
4485
                        }
4486
                });
4487
        },
4488

    
4489
        wrap: function( html ) {
4490
                return this.each(function() {
4491
                        jQuery( this ).wrapAll( html );
4492
                });
4493
        },
4494

    
4495
        unwrap: function() {
4496
                return this.parent().each(function() {
4497
                        if ( !jQuery.nodeName( this, "body" ) ) {
4498
                                jQuery( this ).replaceWith( this.childNodes );
4499
                        }
4500
                }).end();
4501
        },
4502

    
4503
        append: function() {
4504
                return this.domManip(arguments, true, function( elem ) {
4505
                        if ( this.nodeType === 1 ) {
4506
                                this.appendChild( elem );
4507
                        }
4508
                });
4509
        },
4510

    
4511
        prepend: function() {
4512
                return this.domManip(arguments, true, function( elem ) {
4513
                        if ( this.nodeType === 1 ) {
4514
                                this.insertBefore( elem, this.firstChild );
4515
                        }
4516
                });
4517
        },
4518

    
4519
        before: function() {
4520
                if ( this[0] && this[0].parentNode ) {
4521
                        return this.domManip(arguments, false, function( elem ) {
4522
                                this.parentNode.insertBefore( elem, this );
4523
                        });
4524
                } else if ( arguments.length ) {
4525
                        var set = jQuery(arguments[0]);
4526
                        set.push.apply( set, this.toArray() );
4527
                        return this.pushStack( set, "before", arguments );
4528
                }
4529
        },
4530

    
4531
        after: function() {
4532
                if ( this[0] && this[0].parentNode ) {
4533
                        return this.domManip(arguments, false, function( elem ) {
4534
                                this.parentNode.insertBefore( elem, this.nextSibling );
4535
                        });
4536
                } else if ( arguments.length ) {
4537
                        var set = this.pushStack( this, "after", arguments );
4538
                        set.push.apply( set, jQuery(arguments[0]).toArray() );
4539
                        return set;
4540
                }
4541
        },
4542
        
4543
        // keepData is for internal use only--do not document
4544
        remove: function( selector, keepData ) {
4545
                for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
4546
                        if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
4547
                                if ( !keepData && elem.nodeType === 1 ) {
4548
                                        jQuery.cleanData( elem.getElementsByTagName("*") );
4549
                                        jQuery.cleanData( [ elem ] );
4550
                                }
4551

    
4552
                                if ( elem.parentNode ) {
4553
                                         elem.parentNode.removeChild( elem );
4554
                                }
4555
                        }
4556
                }
4557
                
4558
                return this;
4559
        },
4560

    
4561
        empty: function() {
4562
                for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
4563
                        // Remove element nodes and prevent memory leaks
4564
                        if ( elem.nodeType === 1 ) {
4565
                                jQuery.cleanData( elem.getElementsByTagName("*") );
4566
                        }
4567

    
4568
                        // Remove any remaining nodes
4569
                        while ( elem.firstChild ) {
4570
                                elem.removeChild( elem.firstChild );
4571
                        }
4572
                }
4573
                
4574
                return this;
4575
        },
4576

    
4577
        clone: function( events ) {
4578
                // Do the clone
4579
                var ret = this.map(function() {
4580
                        if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
4581
                                // IE copies events bound via attachEvent when
4582
                                // using cloneNode. Calling detachEvent on the
4583
                                // clone will also remove the events from the orignal
4584
                                // In order to get around this, we use innerHTML.
4585
                                // Unfortunately, this means some modifications to
4586
                                // attributes in IE that are actually only stored
4587
                                // as properties will not be copied (such as the
4588
                                // the name attribute on an input).
4589
                                var html = this.outerHTML, ownerDocument = this.ownerDocument;
4590
                                if ( !html ) {
4591
                                        var div = ownerDocument.createElement("div");
4592
                                        div.appendChild( this.cloneNode(true) );
4593
                                        html = div.innerHTML;
4594
                                }
4595

    
4596
                                return jQuery.clean([html.replace(rinlinejQuery, "")
4597
                                        // Handle the case in IE 8 where action=/test/> self-closes a tag
4598
                                        .replace(raction, '="$1">')
4599
                                        .replace(rleadingWhitespace, "")], ownerDocument)[0];
4600
                        } else {
4601
                                return this.cloneNode(true);
4602
                        }
4603
                });
4604

    
4605
                // Copy the events from the original to the clone
4606
                if ( events === true ) {
4607
                        cloneCopyEvent( this, ret );
4608
                        cloneCopyEvent( this.find("*"), ret.find("*") );
4609
                }
4610

    
4611
                // Return the cloned set
4612
                return ret;
4613
        },
4614

    
4615
        html: function( value ) {
4616
                if ( value === undefined ) {
4617
                        return this[0] && this[0].nodeType === 1 ?
4618
                                this[0].innerHTML.replace(rinlinejQuery, "") :
4619
                                null;
4620

    
4621
                // See if we can take a shortcut and just use innerHTML
4622
                } else if ( typeof value === "string" && !rnocache.test( value ) &&
4623
                        (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
4624
                        !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
4625

    
4626
                        value = value.replace(rxhtmlTag, "<$1></$2>");
4627

    
4628
                        try {
4629
                                for ( var i = 0, l = this.length; i < l; i++ ) {
4630
                                        // Remove element nodes and prevent memory leaks
4631
                                        if ( this[i].nodeType === 1 ) {
4632
                                                jQuery.cleanData( this[i].getElementsByTagName("*") );
4633
                                                this[i].innerHTML = value;
4634
                                        }
4635
                                }
4636

    
4637
                        // If using innerHTML throws an exception, use the fallback method
4638
                        } catch(e) {
4639
                                this.empty().append( value );
4640
                        }
4641

    
4642
                } else if ( jQuery.isFunction( value ) ) {
4643
                        this.each(function(i){
4644
                                var self = jQuery(this);
4645
                                self.html( value.call(this, i, self.html()) );
4646
                        });
4647

    
4648
                } else {
4649
                        this.empty().append( value );
4650
                }
4651

    
4652
                return this;
4653
        },
4654

    
4655
        replaceWith: function( value ) {
4656
                if ( this[0] && this[0].parentNode ) {
4657
                        // Make sure that the elements are removed from the DOM before they are inserted
4658
                        // this can help fix replacing a parent with child elements
4659
                        if ( jQuery.isFunction( value ) ) {
4660
                                return this.each(function(i) {
4661
                                        var self = jQuery(this), old = self.html();
4662
                                        self.replaceWith( value.call( this, i, old ) );
4663
                                });
4664
                        }
4665

    
4666
                        if ( typeof value !== "string" ) {
4667
                                value = jQuery(value).detach();
4668
                        }
4669

    
4670
                        return this.each(function() {
4671
                                var next = this.nextSibling, parent = this.parentNode;
4672

    
4673
                                jQuery(this).remove();
4674

    
4675
                                if ( next ) {
4676
                                        jQuery(next).before( value );
4677
                                } else {
4678
                                        jQuery(parent).append( value );
4679
                                }
4680
                        });
4681
                } else {
4682
                        return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
4683
                }
4684
        },
4685

    
4686
        detach: function( selector ) {
4687
                return this.remove( selector, true );
4688
        },
4689

    
4690
        domManip: function( args, table, callback ) {
4691
                var results, first, value = args[0], scripts = [], fragment, parent;
4692

    
4693
                // We can't cloneNode fragments that contain checked, in WebKit
4694
                if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
4695
                        return this.each(function() {
4696
                                jQuery(this).domManip( args, table, callback, true );
4697
                        });
4698
                }
4699

    
4700
                if ( jQuery.isFunction(value) ) {
4701
                        return this.each(function(i) {
4702
                                var self = jQuery(this);
4703
                                args[0] = value.call(this, i, table ? self.html() : undefined);
4704
                                self.domManip( args, table, callback );
4705
                        });
4706
                }
4707

    
4708
                if ( this[0] ) {
4709
                        parent = value && value.parentNode;
4710

    
4711
                        // If we're in a fragment, just use that instead of building a new one
4712
                        if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
4713
                                results = { fragment: parent };
4714

    
4715
                        } else {
4716
                                results = jQuery.buildFragment( args, this, scripts );
4717
                        }
4718
                        
4719
                        fragment = results.fragment;
4720
                        
4721
                        if ( fragment.childNodes.length === 1 ) {
4722
                                first = fragment = fragment.firstChild;
4723
                        } else {
4724
                                first = fragment.firstChild;
4725
                        }
4726

    
4727
                        if ( first ) {
4728
                                table = table && jQuery.nodeName( first, "tr" );
4729

    
4730
                                for ( var i = 0, l = this.length; i < l; i++ ) {
4731
                                        callback.call(
4732
                                                table ?
4733
                                                        root(this[i], first) :
4734
                                                        this[i],
4735
                                                i > 0 || results.cacheable || this.length > 1  ?
4736
                                                        fragment.cloneNode(true) :
4737
                                                        fragment
4738
                                        );
4739
                                }
4740
                        }
4741

    
4742
                        if ( scripts.length ) {
4743
                                jQuery.each( scripts, evalScript );
4744
                        }
4745
                }
4746

    
4747
                return this;
4748
        }
4749
});
4750

    
4751
function root( elem, cur ) {
4752
        return jQuery.nodeName(elem, "table") ?
4753
                (elem.getElementsByTagName("tbody")[0] ||
4754
                elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
4755
                elem;
4756
}
4757

    
4758
function cloneCopyEvent(orig, ret) {
4759
        var i = 0;
4760

    
4761
        ret.each(function() {
4762
                if ( this.nodeName !== (orig[i] && orig[i].nodeName) ) {
4763
                        return;
4764
                }
4765

    
4766
                var oldData = jQuery.data( orig[i++] ), curData = jQuery.data( this, oldData ), events = oldData && oldData.events;
4767

    
4768
                if ( events ) {
4769
                        delete curData.handle;
4770
                        curData.events = {};
4771

    
4772
                        for ( var type in events ) {
4773
                                for ( var handler in events[ type ] ) {
4774
                                        jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
4775
                                }
4776
                        }
4777
                }
4778
        });
4779
}
4780

    
4781
jQuery.buildFragment = function( args, nodes, scripts ) {
4782
        var fragment, cacheable, cacheresults,
4783
                doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
4784

    
4785
        // Only cache "small" (1/2 KB) strings that are associated with the main document
4786
        // Cloning options loses the selected state, so don't cache them
4787
        // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
4788
        // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
4789
        if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
4790
                !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
4791

    
4792
                cacheable = true;
4793
                cacheresults = jQuery.fragments[ args[0] ];
4794
                if ( cacheresults ) {
4795
                        if ( cacheresults !== 1 ) {
4796
                                fragment = cacheresults;
4797
                        }
4798
                }
4799
        }
4800

    
4801
        if ( !fragment ) {
4802
                fragment = doc.createDocumentFragment();
4803
                jQuery.clean( args, doc, fragment, scripts );
4804
        }
4805

    
4806
        if ( cacheable ) {
4807
                jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
4808
        }
4809

    
4810
        return { fragment: fragment, cacheable: cacheable };
4811
};
4812

    
4813
jQuery.fragments = {};
4814

    
4815
jQuery.each({
4816
        appendTo: "append",
4817
        prependTo: "prepend",
4818
        insertBefore: "before",
4819
        insertAfter: "after",
4820
        replaceAll: "replaceWith"
4821
}, function( name, original ) {
4822
        jQuery.fn[ name ] = function( selector ) {
4823
                var ret = [], insert = jQuery( selector ),
4824
                        parent = this.length === 1 && this[0].parentNode;
4825
                
4826
                if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
4827
                        insert[ original ]( this[0] );
4828
                        return this;
4829
                        
4830
                } else {
4831
                        for ( var i = 0, l = insert.length; i < l; i++ ) {
4832
                                var elems = (i > 0 ? this.clone(true) : this).get();
4833
                                jQuery( insert[i] )[ original ]( elems );
4834
                                ret = ret.concat( elems );
4835
                        }
4836
                
4837
                        return this.pushStack( ret, name, insert.selector );
4838
                }
4839
        };
4840
});
4841

    
4842
jQuery.extend({
4843
        clean: function( elems, context, fragment, scripts ) {
4844
                context = context || document;
4845

    
4846
                // !context.createElement fails in IE with an error but returns typeof 'object'
4847
                if ( typeof context.createElement === "undefined" ) {
4848
                        context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
4849
                }
4850

    
4851
                var ret = [];
4852

    
4853
                for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
4854
                        if ( typeof elem === "number" ) {
4855
                                elem += "";
4856
                        }
4857

    
4858
                        if ( !elem ) {
4859
                                continue;
4860
                        }
4861

    
4862
                        // Convert html string into DOM nodes
4863
                        if ( typeof elem === "string" && !rhtml.test( elem ) ) {
4864
                                elem = context.createTextNode( elem );
4865

    
4866
                        } else if ( typeof elem === "string" ) {
4867
                                // Fix "XHTML"-style tags in all browsers
4868
                                elem = elem.replace(rxhtmlTag, "<$1></$2>");
4869

    
4870
                                // Trim whitespace, otherwise indexOf won't work as expected
4871
                                var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
4872
                                        wrap = wrapMap[ tag ] || wrapMap._default,
4873
                                        depth = wrap[0],
4874
                                        div = context.createElement("div");
4875

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

    
4879
                                // Move to the right depth
4880
                                while ( depth-- ) {
4881
                                        div = div.lastChild;
4882
                                }
4883

    
4884
                                // Remove IE's autoinserted <tbody> from table fragments
4885
                                if ( !jQuery.support.tbody ) {
4886

    
4887
                                        // String was a <table>, *may* have spurious <tbody>
4888
                                        var hasBody = rtbody.test(elem),
4889
                                                tbody = tag === "table" && !hasBody ?
4890
                                                        div.firstChild && div.firstChild.childNodes :
4891

    
4892
                                                        // String was a bare <thead> or <tfoot>
4893
                                                        wrap[1] === "<table>" && !hasBody ?
4894
                                                                div.childNodes :
4895
                                                                [];
4896

    
4897
                                        for ( var j = tbody.length - 1; j >= 0 ; --j ) {
4898
                                                if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
4899
                                                        tbody[ j ].parentNode.removeChild( tbody[ j ] );
4900
                                                }
4901
                                        }
4902

    
4903
                                }
4904

    
4905
                                // IE completely kills leading whitespace when innerHTML is used
4906
                                if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
4907
                                        div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
4908
                                }
4909

    
4910
                                elem = div.childNodes;
4911
                        }
4912

    
4913
                        if ( elem.nodeType ) {
4914
                                ret.push( elem );
4915
                        } else {
4916
                                ret = jQuery.merge( ret, elem );
4917
                        }
4918
                }
4919

    
4920
                if ( fragment ) {
4921
                        for ( i = 0; ret[i]; i++ ) {
4922
                                if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
4923
                                        scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
4924
                                
4925
                                } else {
4926
                                        if ( ret[i].nodeType === 1 ) {
4927
                                                ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
4928
                                        }
4929
                                        fragment.appendChild( ret[i] );
4930
                                }
4931
                        }
4932
                }
4933

    
4934
                return ret;
4935
        },
4936
        
4937
        cleanData: function( elems ) {
4938
                var data, id, cache = jQuery.cache,
4939
                        special = jQuery.event.special,
4940
                        deleteExpando = jQuery.support.deleteExpando;
4941
                
4942
                for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
4943
                        if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
4944
                                continue;
4945
                        }
4946

    
4947
                        id = elem[ jQuery.expando ];
4948
                        
4949
                        if ( id ) {
4950
                                data = cache[ id ];
4951
                                
4952
                                if ( data && data.events ) {
4953
                                        for ( var type in data.events ) {
4954
                                                if ( special[ type ] ) {
4955
                                                        jQuery.event.remove( elem, type );
4956

    
4957
                                                } else {
4958
                                                        jQuery.removeEvent( elem, type, data.handle );
4959
                                                }
4960
                                        }
4961
                                }
4962
                                
4963
                                if ( deleteExpando ) {
4964
                                        delete elem[ jQuery.expando ];
4965

    
4966
                                } else if ( elem.removeAttribute ) {
4967
                                        elem.removeAttribute( jQuery.expando );
4968
                                }
4969
                                
4970
                                delete cache[ id ];
4971
                        }
4972
                }
4973
        }
4974
});
4975

    
4976
function evalScript( i, elem ) {
4977
        if ( elem.src ) {
4978
                jQuery.ajax({
4979
                        url: elem.src,
4980
                        async: false,
4981
                        dataType: "script"
4982
                });
4983
        } else {
4984
                jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
4985
        }
4986

    
4987
        if ( elem.parentNode ) {
4988
                elem.parentNode.removeChild( elem );
4989
        }
4990
}
4991

    
4992

    
4993

    
4994

    
4995
var ralpha = /alpha\([^)]*\)/i,
4996
        ropacity = /opacity=([^)]*)/,
4997
        rdashAlpha = /-([a-z])/ig,
4998
        rupper = /([A-Z])/g,
4999
        rnumpx = /^-?\d+(?:px)?$/i,
5000
        rnum = /^-?\d/,
5001

    
5002
        cssShow = { position: "absolute", visibility: "hidden", display: "block" },
5003
        cssWidth = [ "Left", "Right" ],
5004
        cssHeight = [ "Top", "Bottom" ],
5005
        curCSS,
5006

    
5007
        // cache check for defaultView.getComputedStyle
5008
        getComputedStyle = document.defaultView && document.defaultView.getComputedStyle,
5009

    
5010
        fcamelCase = function( all, letter ) {
5011
                return letter.toUpperCase();
5012
        };
5013

    
5014
jQuery.fn.css = function( name, value ) {
5015
        // Setting 'undefined' is a no-op
5016
        if ( arguments.length === 2 && value === undefined ) {
5017
                return this;
5018
        }
5019

    
5020
        return jQuery.access( this, name, value, true, function( elem, name, value ) {
5021
                return value !== undefined ?
5022
                        jQuery.style( elem, name, value ) :
5023
                        jQuery.css( elem, name );
5024
        });
5025
};
5026

    
5027
jQuery.extend({
5028
        // Add in style property hooks for overriding the default
5029
        // behavior of getting and setting a style property
5030
        cssHooks: {
5031
                opacity: {
5032
                        get: function( elem, computed ) {
5033
                                if ( computed ) {
5034
                                        // We should always get a number back from opacity
5035
                                        var ret = curCSS( elem, "opacity", "opacity" );
5036
                                        return ret === "" ? "1" : ret;
5037

    
5038
                                } else {
5039
                                        return elem.style.opacity;
5040
                                }
5041
                        }
5042
                }
5043
        },
5044

    
5045
        // Exclude the following css properties to add px
5046
        cssNumber: {
5047
                "zIndex": true,
5048
                "fontWeight": true,
5049
                "opacity": true,
5050
                "zoom": true,
5051
                "lineHeight": true
5052
        },
5053

    
5054
        // Add in properties whose names you wish to fix before
5055
        // setting or getting the value
5056
        cssProps: {
5057
                // normalize float css property
5058
                "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
5059
        },
5060

    
5061
        // Get and set the style property on a DOM Node
5062
        style: function( elem, name, value, extra ) {
5063
                // Don't set styles on text and comment nodes
5064
                if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
5065
                        return;
5066
                }
5067

    
5068
                // Make sure that we're working with the right name
5069
                var ret, origName = jQuery.camelCase( name ),
5070
                        style = elem.style, hooks = jQuery.cssHooks[ origName ];
5071

    
5072
                name = jQuery.cssProps[ origName ] || origName;
5073

    
5074
                // Check if we're setting a value
5075
                if ( value !== undefined ) {
5076
                        // Make sure that NaN and null values aren't set. See: #7116
5077
                        if ( typeof value === "number" && isNaN( value ) || value == null ) {
5078
                                return;
5079
                        }
5080

    
5081
                        // If a number was passed in, add 'px' to the (except for certain CSS properties)
5082
                        if ( typeof value === "number" && !jQuery.cssNumber[ origName ] ) {
5083
                                value += "px";
5084
                        }
5085

    
5086
                        // If a hook was provided, use that value, otherwise just set the specified value
5087
                        if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
5088
                                // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
5089
                                // Fixes bug #5509
5090
                                try {
5091
                                        style[ name ] = value;
5092
                                } catch(e) {}
5093
                        }
5094

    
5095
                } else {
5096
                        // If a hook was provided get the non-computed value from there
5097
                        if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
5098
                                return ret;
5099
                        }
5100

    
5101
                        // Otherwise just get the value from the style object
5102
                        return style[ name ];
5103
                }
5104
        },
5105

    
5106
        css: function( elem, name, extra ) {
5107
                // Make sure that we're working with the right name
5108
                var ret, origName = jQuery.camelCase( name ),
5109
                        hooks = jQuery.cssHooks[ origName ];
5110

    
5111
                name = jQuery.cssProps[ origName ] || origName;
5112

    
5113
                // If a hook was provided get the computed value from there
5114
                if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
5115
                        return ret;
5116

    
5117
                // Otherwise, if a way to get the computed value exists, use that
5118
                } else if ( curCSS ) {
5119
                        return curCSS( elem, name, origName );
5120
                }
5121
        },
5122

    
5123
        // A method for quickly swapping in/out CSS properties to get correct calculations
5124
        swap: function( elem, options, callback ) {
5125
                var old = {};
5126

    
5127
                // Remember the old values, and insert the new ones
5128
                for ( var name in options ) {
5129
                        old[ name ] = elem.style[ name ];
5130
                        elem.style[ name ] = options[ name ];
5131
                }
5132

    
5133
                callback.call( elem );
5134

    
5135
                // Revert the old values
5136
                for ( name in options ) {
5137
                        elem.style[ name ] = old[ name ];
5138
                }
5139
        },
5140

    
5141
        camelCase: function( string ) {
5142
                return string.replace( rdashAlpha, fcamelCase );
5143
        }
5144
});
5145

    
5146
// DEPRECATED, Use jQuery.css() instead
5147
jQuery.curCSS = jQuery.css;
5148

    
5149
jQuery.each(["height", "width"], function( i, name ) {
5150
        jQuery.cssHooks[ name ] = {
5151
                get: function( elem, computed, extra ) {
5152
                        var val;
5153

    
5154
                        if ( computed ) {
5155
                                if ( elem.offsetWidth !== 0 ) {
5156
                                        val = getWH( elem, name, extra );
5157

    
5158
                                } else {
5159
                                        jQuery.swap( elem, cssShow, function() {
5160
                                                val = getWH( elem, name, extra );
5161
                                        });
5162
                                }
5163

    
5164
                                return val + "px";
5165
                        }
5166
                },
5167

    
5168
                set: function( elem, value ) {
5169
                        if ( rnumpx.test( value ) ) {
5170
                                // ignore negative width and height values #1599
5171
                                value = parseFloat(value);
5172

    
5173
                                if ( value >= 0 ) {
5174
                                        return value + "px";
5175
                                }
5176

    
5177
                        } else {
5178
                                return value;
5179
                        }
5180
                }
5181
        };
5182
});
5183

    
5184
if ( !jQuery.support.opacity ) {
5185
        jQuery.cssHooks.opacity = {
5186
                get: function( elem, computed ) {
5187
                        // IE uses filters for opacity
5188
                        return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ?
5189
                                (parseFloat(RegExp.$1) / 100) + "" :
5190
                                computed ? "1" : "";
5191
                },
5192

    
5193
                set: function( elem, value ) {
5194
                        var style = elem.style;
5195

    
5196
                        // IE has trouble with opacity if it does not have layout
5197
                        // Force it by setting the zoom level
5198
                        style.zoom = 1;
5199

    
5200
                        // Set the alpha filter to set the opacity
5201
                        var opacity = jQuery.isNaN(value) ?
5202
                                "" :
5203
                                "alpha(opacity=" + value * 100 + ")",
5204
                                filter = style.filter || "";
5205

    
5206
                        style.filter = ralpha.test(filter) ?
5207
                                filter.replace(ralpha, opacity) :
5208
                                style.filter + ' ' + opacity;
5209
                }
5210
        };
5211
}
5212

    
5213
if ( getComputedStyle ) {
5214
        curCSS = function( elem, newName, name ) {
5215
                var ret, defaultView, computedStyle;
5216

    
5217
                name = name.replace( rupper, "-$1" ).toLowerCase();
5218

    
5219
                if ( !(defaultView = elem.ownerDocument.defaultView) ) {
5220
                        return undefined;
5221
                }
5222

    
5223
                if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
5224
                        ret = computedStyle.getPropertyValue( name );
5225
                        if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
5226
                                ret = jQuery.style( elem, name );
5227
                        }
5228
                }
5229

    
5230
                return ret;
5231
        };
5232

    
5233
} else if ( document.documentElement.currentStyle ) {
5234
        curCSS = function( elem, name ) {
5235
                var left, rsLeft, ret = elem.currentStyle && elem.currentStyle[ name ], style = elem.style;
5236

    
5237
                // From the awesome hack by Dean Edwards
5238
                // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
5239

    
5240
                // If we're not dealing with a regular pixel number
5241
                // but a number that has a weird ending, we need to convert it to pixels
5242
                if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
5243
                        // Remember the original values
5244
                        left = style.left;
5245
                        rsLeft = elem.runtimeStyle.left;
5246

    
5247
                        // Put in the new values to get a computed value out
5248
                        elem.runtimeStyle.left = elem.currentStyle.left;
5249
                        style.left = name === "fontSize" ? "1em" : (ret || 0);
5250
                        ret = style.pixelLeft + "px";
5251

    
5252
                        // Revert the changed values
5253
                        style.left = left;
5254
                        elem.runtimeStyle.left = rsLeft;
5255
                }
5256

    
5257
                return ret;
5258
        };
5259
}
5260

    
5261
function getWH( elem, name, extra ) {
5262
        var which = name === "width" ? cssWidth : cssHeight,
5263
                val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
5264

    
5265
        if ( extra === "border" ) {
5266
                return val;
5267
        }
5268

    
5269
        jQuery.each( which, function() {
5270
                if ( !extra ) {
5271
                        val -= parseFloat(jQuery.css( elem, "padding" + this )) || 0;
5272
                }
5273

    
5274
                if ( extra === "margin" ) {
5275
                        val += parseFloat(jQuery.css( elem, "margin" + this )) || 0;
5276

    
5277
                } else {
5278
                        val -= parseFloat(jQuery.css( elem, "border" + this + "Width" )) || 0;
5279
                }
5280
        });
5281

    
5282
        return val;
5283
}
5284

    
5285
if ( jQuery.expr && jQuery.expr.filters ) {
5286
        jQuery.expr.filters.hidden = function( elem ) {
5287
                var width = elem.offsetWidth, height = elem.offsetHeight;
5288

    
5289
                return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
5290
        };
5291

    
5292
        jQuery.expr.filters.visible = function( elem ) {
5293
                return !jQuery.expr.filters.hidden( elem );
5294
        };
5295
}
5296

    
5297

    
5298

    
5299

    
5300
var jsc = jQuery.now(),
5301
        rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
5302
        rselectTextarea = /^(?:select|textarea)/i,
5303
        rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
5304
        rnoContent = /^(?:GET|HEAD|DELETE)$/,
5305
        rbracket = /\[\]$/,
5306
        jsre = /\=\?(&|$)/,
5307
        rquery = /\?/,
5308
        rts = /([?&])_=[^&]*/,
5309
        rurl = /^(\w+:)?\/\/([^\/?#]+)/,
5310
        r20 = /%20/g,
5311
        rhash = /#.*$/,
5312

    
5313
        // Keep a copy of the old load method
5314
        _load = jQuery.fn.load;
5315

    
5316
jQuery.fn.extend({
5317
        load: function( url, params, callback ) {
5318
                if ( typeof url !== "string" && _load ) {
5319
                        return _load.apply( this, arguments );
5320

    
5321
                // Don't do a request if no elements are being requested
5322
                } else if ( !this.length ) {
5323
                        return this;
5324
                }
5325

    
5326
                var off = url.indexOf(" ");
5327
                if ( off >= 0 ) {
5328
                        var selector = url.slice(off, url.length);
5329
                        url = url.slice(0, off);
5330
                }
5331

    
5332
                // Default to a GET request
5333
                var type = "GET";
5334

    
5335
                // If the second parameter was provided
5336
                if ( params ) {
5337
                        // If it's a function
5338
                        if ( jQuery.isFunction( params ) ) {
5339
                                // We assume that it's the callback
5340
                                callback = params;
5341
                                params = null;
5342

    
5343
                        // Otherwise, build a param string
5344
                        } else if ( typeof params === "object" ) {
5345
                                params = jQuery.param( params, jQuery.ajaxSettings.traditional );
5346
                                type = "POST";
5347
                        }
5348
                }
5349

    
5350
                var self = this;
5351

    
5352
                // Request the remote document
5353
                jQuery.ajax({
5354
                        url: url,
5355
                        type: type,
5356
                        dataType: "html",
5357
                        data: params,
5358
                        complete: function( res, status ) {
5359
                                // If successful, inject the HTML into all the matched elements
5360
                                if ( status === "success" || status === "notmodified" ) {
5361
                                        // See if a selector was specified
5362
                                        self.html( selector ?
5363
                                                // Create a dummy div to hold the results
5364
                                                jQuery("<div>")
5365
                                                        // inject the contents of the document in, removing the scripts
5366
                                                        // to avoid any 'Permission Denied' errors in IE
5367
                                                        .append(res.responseText.replace(rscript, ""))
5368

    
5369
                                                        // Locate the specified elements
5370
                                                        .find(selector) :
5371

    
5372
                                                // If not, just inject the full result
5373
                                                res.responseText );
5374
                                }
5375

    
5376
                                if ( callback ) {
5377
                                        self.each( callback, [res.responseText, status, res] );
5378
                                }
5379
                        }
5380
                });
5381

    
5382
                return this;
5383
        },
5384

    
5385
        serialize: function() {
5386
                return jQuery.param(this.serializeArray());
5387
        },
5388

    
5389
        serializeArray: function() {
5390
                return this.map(function() {
5391
                        return this.elements ? jQuery.makeArray(this.elements) : this;
5392
                })
5393
                .filter(function() {
5394
                        return this.name && !this.disabled &&
5395
                                (this.checked || rselectTextarea.test(this.nodeName) ||
5396
                                        rinput.test(this.type));
5397
                })
5398
                .map(function( i, elem ) {
5399
                        var val = jQuery(this).val();
5400

    
5401
                        return val == null ?
5402
                                null :
5403
                                jQuery.isArray(val) ?
5404
                                        jQuery.map( val, function( val, i ) {
5405
                                                return { name: elem.name, value: val };
5406
                                        }) :
5407
                                        { name: elem.name, value: val };
5408
                }).get();
5409
        }
5410
});
5411

    
5412
// Attach a bunch of functions for handling common AJAX events
5413
jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function( i, o ) {
5414
        jQuery.fn[o] = function( f ) {
5415
                return this.bind(o, f);
5416
        };
5417
});
5418

    
5419
jQuery.extend({
5420
        get: function( url, data, callback, type ) {
5421
                // shift arguments if data argument was omited
5422
                if ( jQuery.isFunction( data ) ) {
5423
                        type = type || callback;
5424
                        callback = data;
5425
                        data = null;
5426
                }
5427

    
5428
                return jQuery.ajax({
5429
                        type: "GET",
5430
                        url: url,
5431
                        data: data,
5432
                        success: callback,
5433
                        dataType: type
5434
                });
5435
        },
5436

    
5437
        getScript: function( url, callback ) {
5438
                return jQuery.get(url, null, callback, "script");
5439
        },
5440

    
5441
        getJSON: function( url, data, callback ) {
5442
                return jQuery.get(url, data, callback, "json");
5443
        },
5444

    
5445
        post: function( url, data, callback, type ) {
5446
                // shift arguments if data argument was omited
5447
                if ( jQuery.isFunction( data ) ) {
5448
                        type = type || callback;
5449
                        callback = data;
5450
                        data = {};
5451
                }
5452

    
5453
                return jQuery.ajax({
5454
                        type: "POST",
5455
                        url: url,
5456
                        data: data,
5457
                        success: callback,
5458
                        dataType: type
5459
                });
5460
        },
5461

    
5462
        ajaxSetup: function( settings ) {
5463
                jQuery.extend( jQuery.ajaxSettings, settings );
5464
        },
5465

    
5466
        ajaxSettings: {
5467
                url: location.href,
5468
                global: true,
5469
                type: "GET",
5470
                contentType: "application/x-www-form-urlencoded",
5471
                processData: true,
5472
                async: true,
5473
                /*
5474
                timeout: 0,
5475
                data: null,
5476
                username: null,
5477
                password: null,
5478
                traditional: false,
5479
                */
5480
                // This function can be overriden by calling jQuery.ajaxSetup
5481
                xhr: function() {
5482
                        return new window.XMLHttpRequest();
5483
                },
5484
                accepts: {
5485
                        xml: "application/xml, text/xml",
5486
                        html: "text/html",
5487
                        script: "text/javascript, application/javascript",
5488
                        json: "application/json, text/javascript",
5489
                        text: "text/plain",
5490
                        _default: "*/*"
5491
                }
5492
        },
5493

    
5494
        ajax: function( origSettings ) {
5495
                var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings),
5496
                        jsonp, status, data, type = s.type.toUpperCase(), noContent = rnoContent.test(type);
5497

    
5498
                s.url = s.url.replace( rhash, "" );
5499

    
5500
                // Use original (not extended) context object if it was provided
5501
                s.context = origSettings && origSettings.context != null ? origSettings.context : s;
5502

    
5503
                // convert data if not already a string
5504
                if ( s.data && s.processData && typeof s.data !== "string" ) {
5505
                        s.data = jQuery.param( s.data, s.traditional );
5506
                }
5507

    
5508
                // Handle JSONP Parameter Callbacks
5509
                if ( s.dataType === "jsonp" ) {
5510
                        if ( type === "GET" ) {
5511
                                if ( !jsre.test( s.url ) ) {
5512
                                        s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?";
5513
                                }
5514
                        } else if ( !s.data || !jsre.test(s.data) ) {
5515
                                s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
5516
                        }
5517
                        s.dataType = "json";
5518
                }
5519

    
5520
                // Build temporary JSONP function
5521
                if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {
5522
                        jsonp = s.jsonpCallback || ("jsonp" + jsc++);
5523

    
5524
                        // Replace the =? sequence both in the query string and the data
5525
                        if ( s.data ) {
5526
                                s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
5527
                        }
5528

    
5529
                        s.url = s.url.replace(jsre, "=" + jsonp + "$1");
5530

    
5531
                        // We need to make sure
5532
                        // that a JSONP style response is executed properly
5533
                        s.dataType = "script";
5534

    
5535
                        // Handle JSONP-style loading
5536
                        var customJsonp = window[ jsonp ];
5537

    
5538
                        window[ jsonp ] = function( tmp ) {
5539
                                data = tmp;
5540
                                jQuery.handleSuccess( s, xhr, status, data );
5541
                                jQuery.handleComplete( s, xhr, status, data );
5542

    
5543
                                if ( jQuery.isFunction( customJsonp ) ) {
5544
                                        customJsonp( tmp );
5545

    
5546
                                } else {
5547
                                        // Garbage collect
5548
                                        window[ jsonp ] = undefined;
5549

    
5550
                                        try {
5551
                                                delete window[ jsonp ];
5552
                                        } catch( jsonpError ) {}
5553
                                }
5554
                                
5555
                                if ( head ) {
5556
                                        head.removeChild( script );
5557
                                }
5558
                        };
5559
                }
5560

    
5561
                if ( s.dataType === "script" && s.cache === null ) {
5562
                        s.cache = false;
5563
                }
5564

    
5565
                if ( s.cache === false && type === "GET" ) {
5566
                        var ts = jQuery.now();
5567

    
5568
                        // try replacing _= if it is there
5569
                        var ret = s.url.replace(rts, "$1_=" + ts);
5570

    
5571
                        // if nothing was replaced, add timestamp to the end
5572
                        s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
5573
                }
5574

    
5575
                // If data is available, append data to url for get requests
5576
                if ( s.data && type === "GET" ) {
5577
                        s.url += (rquery.test(s.url) ? "&" : "?") + s.data;
5578
                }
5579

    
5580
                // Watch for a new set of requests
5581
                if ( s.global && jQuery.active++ === 0 ) {
5582
                        jQuery.event.trigger( "ajaxStart" );
5583
                }
5584

    
5585
                // Matches an absolute URL, and saves the domain
5586
                var parts = rurl.exec( s.url ),
5587
                        remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
5588

    
5589
                // If we're requesting a remote document
5590
                // and trying to load JSON or Script with a GET
5591
                if ( s.dataType === "script" && type === "GET" && remote ) {
5592
                        var head = document.getElementsByTagName("head")[0] || document.documentElement;
5593
                        var script = document.createElement("script");
5594
                        if ( s.scriptCharset ) {
5595
                                script.charset = s.scriptCharset;
5596
                        }
5597
                        script.src = s.url;
5598

    
5599
                        // Handle Script loading
5600
                        if ( !jsonp ) {
5601
                                var done = false;
5602

    
5603
                                // Attach handlers for all browsers
5604
                                script.onload = script.onreadystatechange = function() {
5605
                                        if ( !done && (!this.readyState ||
5606
                                                        this.readyState === "loaded" || this.readyState === "complete") ) {
5607
                                                done = true;
5608
                                                jQuery.handleSuccess( s, xhr, status, data );
5609
                                                jQuery.handleComplete( s, xhr, status, data );
5610

    
5611
                                                // Handle memory leak in IE
5612
                                                script.onload = script.onreadystatechange = null;
5613
                                                if ( head && script.parentNode ) {
5614
                                                        head.removeChild( script );
5615
                                                }
5616
                                        }
5617
                                };
5618
                        }
5619

    
5620
                        // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
5621
                        // This arises when a base node is used (#2709 and #4378).
5622
                        head.insertBefore( script, head.firstChild );
5623

    
5624
                        // We handle everything using the script element injection
5625
                        return undefined;
5626
                }
5627

    
5628
                var requestDone = false;
5629

    
5630
                // Create the request object
5631
                var xhr = s.xhr();
5632

    
5633
                if ( !xhr ) {
5634
                        return;
5635
                }
5636

    
5637
                // Open the socket
5638
                // Passing null username, generates a login popup on Opera (#2865)
5639
                if ( s.username ) {
5640
                        xhr.open(type, s.url, s.async, s.username, s.password);
5641
                } else {
5642
                        xhr.open(type, s.url, s.async);
5643
                }
5644

    
5645
                // Need an extra try/catch for cross domain requests in Firefox 3
5646
                try {
5647
                        // Set content-type if data specified and content-body is valid for this type
5648
                        if ( (s.data != null && !noContent) || (origSettings && origSettings.contentType) ) {
5649
                                xhr.setRequestHeader("Content-Type", s.contentType);
5650
                        }
5651

    
5652
                        // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
5653
                        if ( s.ifModified ) {
5654
                                if ( jQuery.lastModified[s.url] ) {
5655
                                        xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]);
5656
                                }
5657

    
5658
                                if ( jQuery.etag[s.url] ) {
5659
                                        xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]);
5660
                                }
5661
                        }
5662

    
5663
                        // Set header so the called script knows that it's an XMLHttpRequest
5664
                        // Only send the header if it's not a remote XHR
5665
                        if ( !remote ) {
5666
                                xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
5667
                        }
5668

    
5669
                        // Set the Accepts header for the server, depending on the dataType
5670
                        xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
5671
                                s.accepts[ s.dataType ] + ", */*; q=0.01" :
5672
                                s.accepts._default );
5673
                } catch( headerError ) {}
5674

    
5675
                // Allow custom headers/mimetypes and early abort
5676
                if ( s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false ) {
5677
                        // Handle the global AJAX counter
5678
                        if ( s.global && jQuery.active-- === 1 ) {
5679
                                jQuery.event.trigger( "ajaxStop" );
5680
                        }
5681

    
5682
                        // close opended socket
5683
                        xhr.abort();
5684
                        return false;
5685
                }
5686

    
5687
                if ( s.global ) {
5688
                        jQuery.triggerGlobal( s, "ajaxSend", [xhr, s] );
5689
                }
5690

    
5691
                // Wait for a response to come back
5692
                var onreadystatechange = xhr.onreadystatechange = function( isTimeout ) {
5693
                        // The request was aborted
5694
                        if ( !xhr || xhr.readyState === 0 || isTimeout === "abort" ) {
5695
                                // Opera doesn't call onreadystatechange before this point
5696
                                // so we simulate the call
5697
                                if ( !requestDone ) {
5698
                                        jQuery.handleComplete( s, xhr, status, data );
5699
                                }
5700

    
5701
                                requestDone = true;
5702
                                if ( xhr ) {
5703
                                        xhr.onreadystatechange = jQuery.noop;
5704
                                }
5705

    
5706
                        // The transfer is complete and the data is available, or the request timed out
5707
                        } else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) {
5708
                                requestDone = true;
5709
                                xhr.onreadystatechange = jQuery.noop;
5710

    
5711
                                status = isTimeout === "timeout" ?
5712
                                        "timeout" :
5713
                                        !jQuery.httpSuccess( xhr ) ?
5714
                                                "error" :
5715
                                                s.ifModified && jQuery.httpNotModified( xhr, s.url ) ?
5716
                                                        "notmodified" :
5717
                                                        "success";
5718

    
5719
                                var errMsg;
5720

    
5721
                                if ( status === "success" ) {
5722
                                        // Watch for, and catch, XML document parse errors
5723
                                        try {
5724
                                                // process the data (runs the xml through httpData regardless of callback)
5725
                                                data = jQuery.httpData( xhr, s.dataType, s );
5726
                                        } catch( parserError ) {
5727
                                                status = "parsererror";
5728
                                                errMsg = parserError;
5729
                                        }
5730
                                }
5731

    
5732
                                // Make sure that the request was successful or notmodified
5733
                                if ( status === "success" || status === "notmodified" ) {
5734
                                        // JSONP handles its own success callback
5735
                                        if ( !jsonp ) {
5736
                                                jQuery.handleSuccess( s, xhr, status, data );
5737
                                        }
5738
                                } else {
5739
                                        jQuery.handleError( s, xhr, status, errMsg );
5740
                                }
5741

    
5742
                                // Fire the complete handlers
5743
                                if ( !jsonp ) {
5744
                                        jQuery.handleComplete( s, xhr, status, data );
5745
                                }
5746

    
5747
                                if ( isTimeout === "timeout" ) {
5748
                                        xhr.abort();
5749
                                }
5750

    
5751
                                // Stop memory leaks
5752
                                if ( s.async ) {
5753
                                        xhr = null;
5754
                                }
5755
                        }
5756
                };
5757

    
5758
                // Override the abort handler, if we can (IE 6 doesn't allow it, but that's OK)
5759
                // Opera doesn't fire onreadystatechange at all on abort
5760
                try {
5761
                        var oldAbort = xhr.abort;
5762
                        xhr.abort = function() {
5763
                                // xhr.abort in IE7 is not a native JS function
5764
                                // and does not have a call property
5765
                                if ( xhr && oldAbort.call ) {
5766
                                        oldAbort.call( xhr );
5767
                                }
5768

    
5769
                                onreadystatechange( "abort" );
5770
                        };
5771
                } catch( abortError ) {}
5772

    
5773
                // Timeout checker
5774
                if ( s.async && s.timeout > 0 ) {
5775
                        setTimeout(function() {
5776
                                // Check to see if the request is still happening
5777
                                if ( xhr && !requestDone ) {
5778
                                        onreadystatechange( "timeout" );
5779
                                }
5780
                        }, s.timeout);
5781
                }
5782

    
5783
                // Send the data
5784
                try {
5785
                        xhr.send( noContent || s.data == null ? null : s.data );
5786

    
5787
                } catch( sendError ) {
5788
                        jQuery.handleError( s, xhr, null, sendError );
5789

    
5790
                        // Fire the complete handlers
5791
                        jQuery.handleComplete( s, xhr, status, data );
5792
                }
5793

    
5794
                // firefox 1.5 doesn't fire statechange for sync requests
5795
                if ( !s.async ) {
5796
                        onreadystatechange();
5797
                }
5798

    
5799
                // return XMLHttpRequest to allow aborting the request etc.
5800
                return xhr;
5801
        },
5802

    
5803
        // Serialize an array of form elements or a set of
5804
        // key/values into a query string
5805
        param: function( a, traditional ) {
5806
                var s = [], add = function( key, value ) {
5807
                        // If value is a function, invoke it and return its value
5808
                        value = jQuery.isFunction(value) ? value() : value;
5809
                        s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
5810
                };
5811
                
5812
                // Set traditional to true for jQuery <= 1.3.2 behavior.
5813
                if ( traditional === undefined ) {
5814
                        traditional = jQuery.ajaxSettings.traditional;
5815
                }
5816
                
5817
                // If an array was passed in, assume that it is an array of form elements.
5818
                if ( jQuery.isArray(a) || a.jquery ) {
5819
                        // Serialize the form elements
5820
                        jQuery.each( a, function() {
5821
                                add( this.name, this.value );
5822
                        });
5823
                        
5824
                } else {
5825
                        // If traditional, encode the "old" way (the way 1.3.2 or older
5826
                        // did it), otherwise encode params recursively.
5827
                        for ( var prefix in a ) {
5828
                                buildParams( prefix, a[prefix], traditional, add );
5829
                        }
5830
                }
5831

    
5832
                // Return the resulting serialization
5833
                return s.join("&").replace(r20, "+");
5834
        }
5835
});
5836

    
5837
function buildParams( prefix, obj, traditional, add ) {
5838
        if ( jQuery.isArray(obj) && obj.length ) {
5839
                // Serialize array item.
5840
                jQuery.each( obj, function( i, v ) {
5841
                        if ( traditional || rbracket.test( prefix ) ) {
5842
                                // Treat each array item as a scalar.
5843
                                add( prefix, v );
5844

    
5845
                        } else {
5846
                                // If array item is non-scalar (array or object), encode its
5847
                                // numeric index to resolve deserialization ambiguity issues.
5848
                                // Note that rack (as of 1.0.0) can't currently deserialize
5849
                                // nested arrays properly, and attempting to do so may cause
5850
                                // a server error. Possible fixes are to modify rack's
5851
                                // deserialization algorithm or to provide an option or flag
5852
                                // to force array serialization to be shallow.
5853
                                buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
5854
                        }
5855
                });
5856
                        
5857
        } else if ( !traditional && obj != null && typeof obj === "object" ) {
5858
                if ( jQuery.isEmptyObject( obj ) ) {
5859
                        add( prefix, "" );
5860

    
5861
                // Serialize object item.
5862
                } else {
5863
                        jQuery.each( obj, function( k, v ) {
5864
                                buildParams( prefix + "[" + k + "]", v, traditional, add );
5865
                        });
5866
                }
5867
                                        
5868
        } else {
5869
                // Serialize scalar item.
5870
                add( prefix, obj );
5871
        }
5872
}
5873

    
5874
// This is still on the jQuery object... for now
5875
// Want to move this to jQuery.ajax some day
5876
jQuery.extend({
5877

    
5878
        // Counter for holding the number of active queries
5879
        active: 0,
5880

    
5881
        // Last-Modified header cache for next request
5882
        lastModified: {},
5883
        etag: {},
5884

    
5885
        handleError: function( s, xhr, status, e ) {
5886
                // If a local callback was specified, fire it
5887
                if ( s.error ) {
5888
                        s.error.call( s.context, xhr, status, e );
5889
                }
5890

    
5891
                // Fire the global callback
5892
                if ( s.global ) {
5893
                        jQuery.triggerGlobal( s, "ajaxError", [xhr, s, e] );
5894
                }
5895
        },
5896

    
5897
        handleSuccess: function( s, xhr, status, data ) {
5898
                // If a local callback was specified, fire it and pass it the data
5899
                if ( s.success ) {
5900
                        s.success.call( s.context, data, status, xhr );
5901
                }
5902

    
5903
                // Fire the global callback
5904
                if ( s.global ) {
5905
                        jQuery.triggerGlobal( s, "ajaxSuccess", [xhr, s] );
5906
                }
5907
        },
5908

    
5909
        handleComplete: function( s, xhr, status ) {
5910
                // Process result
5911
                if ( s.complete ) {
5912
                        s.complete.call( s.context, xhr, status );
5913
                }
5914

    
5915
                // The request was completed
5916
                if ( s.global ) {
5917
                        jQuery.triggerGlobal( s, "ajaxComplete", [xhr, s] );
5918
                }
5919

    
5920
                // Handle the global AJAX counter
5921
                if ( s.global && jQuery.active-- === 1 ) {
5922
                        jQuery.event.trigger( "ajaxStop" );
5923
                }
5924
        },
5925
                
5926
        triggerGlobal: function( s, type, args ) {
5927
                (s.context && s.context.url == null ? jQuery(s.context) : jQuery.event).trigger(type, args);
5928
        },
5929

    
5930
        // Determines if an XMLHttpRequest was successful or not
5931
        httpSuccess: function( xhr ) {
5932
                try {
5933
                        // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
5934
                        return !xhr.status && location.protocol === "file:" ||
5935
                                xhr.status >= 200 && xhr.status < 300 ||
5936
                                xhr.status === 304 || xhr.status === 1223;
5937
                } catch(e) {}
5938

    
5939
                return false;
5940
        },
5941

    
5942
        // Determines if an XMLHttpRequest returns NotModified
5943
        httpNotModified: function( xhr, url ) {
5944
                var lastModified = xhr.getResponseHeader("Last-Modified"),
5945
                        etag = xhr.getResponseHeader("Etag");
5946

    
5947
                if ( lastModified ) {
5948
                        jQuery.lastModified[url] = lastModified;
5949
                }
5950

    
5951
                if ( etag ) {
5952
                        jQuery.etag[url] = etag;
5953
                }
5954

    
5955
                return xhr.status === 304;
5956
        },
5957

    
5958
        httpData: function( xhr, type, s ) {
5959
                var ct = xhr.getResponseHeader("content-type") || "",
5960
                        xml = type === "xml" || !type && ct.indexOf("xml") >= 0,
5961
                        data = xml ? xhr.responseXML : xhr.responseText;
5962

    
5963
                if ( xml && data.documentElement.nodeName === "parsererror" ) {
5964
                        jQuery.error( "parsererror" );
5965
                }
5966

    
5967
                // Allow a pre-filtering function to sanitize the response
5968
                // s is checked to keep backwards compatibility
5969
                if ( s && s.dataFilter ) {
5970
                        data = s.dataFilter( data, type );
5971
                }
5972

    
5973
                // The filter can actually parse the response
5974
                if ( typeof data === "string" ) {
5975
                        // Get the JavaScript object, if JSON is used.
5976
                        if ( type === "json" || !type && ct.indexOf("json") >= 0 ) {
5977
                                data = jQuery.parseJSON( data );
5978

    
5979
                        // If the type is "script", eval it in global context
5980
                        } else if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) {
5981
                                jQuery.globalEval( data );
5982
                        }
5983
                }
5984

    
5985
                return data;
5986
        }
5987

    
5988
});
5989

    
5990
/*
5991
 * Create the request object; Microsoft failed to properly
5992
 * implement the XMLHttpRequest in IE7 (can't request local files),
5993
 * so we use the ActiveXObject when it is available
5994
 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
5995
 * we need a fallback.
5996
 */
5997
if ( window.ActiveXObject ) {
5998
        jQuery.ajaxSettings.xhr = function() {
5999
                if ( window.location.protocol !== "file:" ) {
6000
                        try {
6001
                                return new window.XMLHttpRequest();
6002
                        } catch(xhrError) {}
6003
                }
6004

    
6005
                try {
6006
                        return new window.ActiveXObject("Microsoft.XMLHTTP");
6007
                } catch(activeError) {}
6008
        };
6009
}
6010

    
6011
// Does this browser support XHR requests?
6012
jQuery.support.ajax = !!jQuery.ajaxSettings.xhr();
6013

    
6014

    
6015

    
6016

    
6017
var elemdisplay = {},
6018
        rfxtypes = /^(?:toggle|show|hide)$/,
6019
        rfxnum = /^([+\-]=)?([\d+.\-]+)(.*)$/,
6020
        timerId,
6021
        fxAttrs = [
6022
                // height animations
6023
                [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
6024
                // width animations
6025
                [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
6026
                // opacity animations
6027
                [ "opacity" ]
6028
        ];
6029

    
6030
jQuery.fn.extend({
6031
        show: function( speed, easing, callback ) {
6032
                if ( speed || speed === 0 ) {
6033
                        return this.animate( genFx("show", 3), speed, easing, callback);
6034
                } else {
6035
                        for ( var i = 0, j = this.length; i < j; i++ ) {
6036
                                // Reset the inline display of this element to learn if it is
6037
                                // being hidden by cascaded rules or not
6038
                                if ( !jQuery.data(this[i], "olddisplay") && this[i].style.display === "none" ) {
6039
                                        this[i].style.display = "";
6040
                                }
6041

    
6042
                                // Set elements which have been overridden with display: none
6043
                                // in a stylesheet to whatever the default browser style is
6044
                                // for such an element
6045
                                if ( this[i].style.display === "" && jQuery.css( this[i], "display" ) === "none" ) {
6046
                                        jQuery.data(this[i], "olddisplay", defaultDisplay(this[i].nodeName));
6047
                                }
6048
                        }
6049

    
6050
                        // Set the display of most of the elements in a second loop
6051
                        // to avoid the constant reflow
6052
                        for ( i = 0; i < j; i++ ) {
6053
                                this[i].style.display = jQuery.data(this[i], "olddisplay") || "";
6054
                        }
6055

    
6056
                        return this;
6057
                }
6058
        },
6059

    
6060
        hide: function( speed, easing, callback ) {
6061
                if ( speed || speed === 0 ) {
6062
                        return this.animate( genFx("hide", 3), speed, easing, callback);
6063

    
6064
                } else {
6065
                        for ( var i = 0, j = this.length; i < j; i++ ) {
6066
                                var display = jQuery.css( this[i], "display" );
6067

    
6068
                                if ( display !== "none" ) {
6069
                                        jQuery.data( this[i], "olddisplay", display );
6070
                                }
6071
                        }
6072

    
6073
                        // Set the display of the elements in a second loop
6074
                        // to avoid the constant reflow
6075
                        for ( i = 0; i < j; i++ ) {
6076
                                this[i].style.display = "none";
6077
                        }
6078

    
6079
                        return this;
6080
                }
6081
        },
6082

    
6083
        // Save the old toggle function
6084
        _toggle: jQuery.fn.toggle,
6085

    
6086
        toggle: function( fn, fn2, callback ) {
6087
                var bool = typeof fn === "boolean";
6088

    
6089
                if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
6090
                        this._toggle.apply( this, arguments );
6091

    
6092
                } else if ( fn == null || bool ) {
6093
                        this.each(function() {
6094
                                var state = bool ? fn : jQuery(this).is(":hidden");
6095
                                jQuery(this)[ state ? "show" : "hide" ]();
6096
                        });
6097

    
6098
                } else {
6099
                        this.animate(genFx("toggle", 3), fn, fn2, callback);
6100
                }
6101

    
6102
                return this;
6103
        },
6104

    
6105
        fadeTo: function( speed, to, easing, callback ) {
6106
                return this.filter(":hidden").css("opacity", 0).show().end()
6107
                                        .animate({opacity: to}, speed, easing, callback);
6108
        },
6109

    
6110
        animate: function( prop, speed, easing, callback ) {
6111
                var optall = jQuery.speed(speed, easing, callback);
6112

    
6113
                if ( jQuery.isEmptyObject( prop ) ) {
6114
                        return this.each( optall.complete );
6115
                }
6116

    
6117
                return this[ optall.queue === false ? "each" : "queue" ](function() {
6118
                        // XXX ‘this’ does not always have a nodeName when running the
6119
                        // test suite
6120

    
6121
                        var opt = jQuery.extend({}, optall), p,
6122
                                isElement = this.nodeType === 1,
6123
                                hidden = isElement && jQuery(this).is(":hidden"),
6124
                                self = this;
6125

    
6126
                        for ( p in prop ) {
6127
                                var name = jQuery.camelCase( p );
6128

    
6129
                                if ( p !== name ) {
6130
                                        prop[ name ] = prop[ p ];
6131
                                        delete prop[ p ];
6132
                                        p = name;
6133
                                }
6134

    
6135
                                if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {
6136
                                        return opt.complete.call(this);
6137
                                }
6138

    
6139
                                if ( isElement && ( p === "height" || p === "width" ) ) {
6140
                                        // Make sure that nothing sneaks out
6141
                                        // Record all 3 overflow attributes because IE does not
6142
                                        // change the overflow attribute when overflowX and
6143
                                        // overflowY are set to the same value
6144
                                        opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
6145

    
6146
                                        // Set display property to inline-block for height/width
6147
                                        // animations on inline elements that are having width/height
6148
                                        // animated
6149
                                        if ( jQuery.css( this, "display" ) === "inline" &&
6150
                                                        jQuery.css( this, "float" ) === "none" ) {
6151
                                                if ( !jQuery.support.inlineBlockNeedsLayout ) {
6152
                                                        this.style.display = "inline-block";
6153

    
6154
                                                } else {
6155
                                                        var display = defaultDisplay(this.nodeName);
6156

    
6157
                                                        // inline-level elements accept inline-block;
6158
                                                        // block-level elements need to be inline with layout
6159
                                                        if ( display === "inline" ) {
6160
                                                                this.style.display = "inline-block";
6161

    
6162
                                                        } else {
6163
                                                                this.style.display = "inline";
6164
                                                                this.style.zoom = 1;
6165
                                                        }
6166
                                                }
6167
                                        }
6168
                                }
6169

    
6170
                                if ( jQuery.isArray( prop[p] ) ) {
6171
                                        // Create (if needed) and add to specialEasing
6172
                                        (opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
6173
                                        prop[p] = prop[p][0];
6174
                                }
6175
                        }
6176

    
6177
                        if ( opt.overflow != null ) {
6178
                                this.style.overflow = "hidden";
6179
                        }
6180

    
6181
                        opt.curAnim = jQuery.extend({}, prop);
6182

    
6183
                        jQuery.each( prop, function( name, val ) {
6184
                                var e = new jQuery.fx( self, opt, name );
6185

    
6186
                                if ( rfxtypes.test(val) ) {
6187
                                        e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );
6188

    
6189
                                } else {
6190
                                        var parts = rfxnum.exec(val),
6191
                                                start = e.cur(true) || 0;
6192

    
6193
                                        if ( parts ) {
6194
                                                var end = parseFloat( parts[2] ),
6195
                                                        unit = parts[3] || "px";
6196

    
6197
                                                // We need to compute starting value
6198
                                                if ( unit !== "px" ) {
6199
                                                        jQuery.style( self, name, (end || 1) + unit);
6200
                                                        start = ((end || 1) / e.cur(true)) * start;
6201
                                                        jQuery.style( self, name, start + unit);
6202
                                                }
6203

    
6204
                                                // If a +=/-= token was provided, we're doing a relative animation
6205
                                                if ( parts[1] ) {
6206
                                                        end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
6207
                                                }
6208

    
6209
                                                e.custom( start, end, unit );
6210

    
6211
                                        } else {
6212
                                                e.custom( start, val, "" );
6213
                                        }
6214
                                }
6215
                        });
6216

    
6217
                        // For JS strict compliance
6218
                        return true;
6219
                });
6220
        },
6221

    
6222
        stop: function( clearQueue, gotoEnd ) {
6223
                var timers = jQuery.timers;
6224

    
6225
                if ( clearQueue ) {
6226
                        this.queue([]);
6227
                }
6228

    
6229
                this.each(function() {
6230
                        // go in reverse order so anything added to the queue during the loop is ignored
6231
                        for ( var i = timers.length - 1; i >= 0; i-- ) {
6232
                                if ( timers[i].elem === this ) {
6233
                                        if (gotoEnd) {
6234
                                                // force the next step to be the last
6235
                                                timers[i](true);
6236
                                        }
6237

    
6238
                                        timers.splice(i, 1);
6239
                                }
6240
                        }
6241
                });
6242

    
6243
                // start the next in the queue if the last step wasn't forced
6244
                if ( !gotoEnd ) {
6245
                        this.dequeue();
6246
                }
6247

    
6248
                return this;
6249
        }
6250

    
6251
});
6252

    
6253
function genFx( type, num ) {
6254
        var obj = {};
6255

    
6256
        jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
6257
                obj[ this ] = type;
6258
        });
6259

    
6260
        return obj;
6261
}
6262

    
6263
// Generate shortcuts for custom animations
6264
jQuery.each({
6265
        slideDown: genFx("show", 1),
6266
        slideUp: genFx("hide", 1),
6267
        slideToggle: genFx("toggle", 1),
6268
        fadeIn: { opacity: "show" },
6269
        fadeOut: { opacity: "hide" }
6270
}, function( name, props ) {
6271
        jQuery.fn[ name ] = function( speed, easing, callback ) {
6272
                return this.animate( props, speed, easing, callback );
6273
        };
6274
});
6275

    
6276
jQuery.extend({
6277
        speed: function( speed, easing, fn ) {
6278
                var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
6279
                        complete: fn || !fn && easing ||
6280
                                jQuery.isFunction( speed ) && speed,
6281
                        duration: speed,
6282
                        easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
6283
                };
6284

    
6285
                opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
6286
                        opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
6287

    
6288
                // Queueing
6289
                opt.old = opt.complete;
6290
                opt.complete = function() {
6291
                        if ( opt.queue !== false ) {
6292
                                jQuery(this).dequeue();
6293
                        }
6294
                        if ( jQuery.isFunction( opt.old ) ) {
6295
                                opt.old.call( this );
6296
                        }
6297
                };
6298

    
6299
                return opt;
6300
        },
6301

    
6302
        easing: {
6303
                linear: function( p, n, firstNum, diff ) {
6304
                        return firstNum + diff * p;
6305
                },
6306
                swing: function( p, n, firstNum, diff ) {
6307
                        return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
6308
                }
6309
        },
6310

    
6311
        timers: [],
6312

    
6313
        fx: function( elem, options, prop ) {
6314
                this.options = options;
6315
                this.elem = elem;
6316
                this.prop = prop;
6317

    
6318
                if ( !options.orig ) {
6319
                        options.orig = {};
6320
                }
6321
        }
6322

    
6323
});
6324

    
6325
jQuery.fx.prototype = {
6326
        // Simple function for setting a style value
6327
        update: function() {
6328
                if ( this.options.step ) {
6329
                        this.options.step.call( this.elem, this.now, this );
6330
                }
6331

    
6332
                (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
6333
        },
6334

    
6335
        // Get the current size
6336
        cur: function() {
6337
                if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
6338
                        return this.elem[ this.prop ];
6339
                }
6340

    
6341
                var r = parseFloat( jQuery.css( this.elem, this.prop ) );
6342
                return r && r > -10000 ? r : 0;
6343
        },
6344

    
6345
        // Start an animation from one number to another
6346
        custom: function( from, to, unit ) {
6347
                this.startTime = jQuery.now();
6348
                this.start = from;
6349
                this.end = to;
6350
                this.unit = unit || this.unit || "px";
6351
                this.now = this.start;
6352
                this.pos = this.state = 0;
6353

    
6354
                var self = this, fx = jQuery.fx;
6355
                function t( gotoEnd ) {
6356
                        return self.step(gotoEnd);
6357
                }
6358

    
6359
                t.elem = this.elem;
6360

    
6361
                if ( t() && jQuery.timers.push(t) && !timerId ) {
6362
                        timerId = setInterval(fx.tick, fx.interval);
6363
                }
6364
        },
6365

    
6366
        // Simple 'show' function
6367
        show: function() {
6368
                // Remember where we started, so that we can go back to it later
6369
                this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
6370
                this.options.show = true;
6371

    
6372
                // Begin the animation
6373
                // Make sure that we start at a small width/height to avoid any
6374
                // flash of content
6375
                this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
6376

    
6377
                // Start by showing the element
6378
                jQuery( this.elem ).show();
6379
        },
6380

    
6381
        // Simple 'hide' function
6382
        hide: function() {
6383
                // Remember where we started, so that we can go back to it later
6384
                this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
6385
                this.options.hide = true;
6386

    
6387
                // Begin the animation
6388
                this.custom(this.cur(), 0);
6389
        },
6390

    
6391
        // Each step of an animation
6392
        step: function( gotoEnd ) {
6393
                var t = jQuery.now(), done = true;
6394

    
6395
                if ( gotoEnd || t >= this.options.duration + this.startTime ) {
6396
                        this.now = this.end;
6397
                        this.pos = this.state = 1;
6398
                        this.update();
6399

    
6400
                        this.options.curAnim[ this.prop ] = true;
6401

    
6402
                        for ( var i in this.options.curAnim ) {
6403
                                if ( this.options.curAnim[i] !== true ) {
6404
                                        done = false;
6405
                                }
6406
                        }
6407

    
6408
                        if ( done ) {
6409
                                // Reset the overflow
6410
                                if ( this.options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
6411
                                        var elem = this.elem, options = this.options;
6412
                                        jQuery.each( [ "", "X", "Y" ], function (index, value) {
6413
                                                elem.style[ "overflow" + value ] = options.overflow[index];
6414
                                        } );
6415
                                }
6416

    
6417
                                // Hide the element if the "hide" operation was done
6418
                                if ( this.options.hide ) {
6419
                                        jQuery(this.elem).hide();
6420
                                }
6421

    
6422
                                // Reset the properties, if the item has been hidden or shown
6423
                                if ( this.options.hide || this.options.show ) {
6424
                                        for ( var p in this.options.curAnim ) {
6425
                                                jQuery.style( this.elem, p, this.options.orig[p] );
6426
                                        }
6427
                                }
6428

    
6429
                                // Execute the complete function
6430
                                this.options.complete.call( this.elem );
6431
                        }
6432

    
6433
                        return false;
6434

    
6435
                } else {
6436
                        var n = t - this.startTime;
6437
                        this.state = n / this.options.duration;
6438

    
6439
                        // Perform the easing function, defaults to swing
6440
                        var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
6441
                        var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
6442
                        this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
6443
                        this.now = this.start + ((this.end - this.start) * this.pos);
6444

    
6445
                        // Perform the next step of the animation
6446
                        this.update();
6447
                }
6448

    
6449
                return true;
6450
        }
6451
};
6452

    
6453
jQuery.extend( jQuery.fx, {
6454
        tick: function() {
6455
                var timers = jQuery.timers;
6456

    
6457
                for ( var i = 0; i < timers.length; i++ ) {
6458
                        if ( !timers[i]() ) {
6459
                                timers.splice(i--, 1);
6460
                        }
6461
                }
6462

    
6463
                if ( !timers.length ) {
6464
                        jQuery.fx.stop();
6465
                }
6466
        },
6467

    
6468
        interval: 13,
6469

    
6470
        stop: function() {
6471
                clearInterval( timerId );
6472
                timerId = null;
6473
        },
6474

    
6475
        speeds: {
6476
                slow: 600,
6477
                fast: 200,
6478
                // Default speed
6479
                _default: 400
6480
        },
6481

    
6482
        step: {
6483
                opacity: function( fx ) {
6484
                        jQuery.style( fx.elem, "opacity", fx.now );
6485
                },
6486

    
6487
                _default: function( fx ) {
6488
                        if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
6489
                                fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
6490
                        } else {
6491
                                fx.elem[ fx.prop ] = fx.now;
6492
                        }
6493
                }
6494
        }
6495
});
6496

    
6497
if ( jQuery.expr && jQuery.expr.filters ) {
6498
        jQuery.expr.filters.animated = function( elem ) {
6499
                return jQuery.grep(jQuery.timers, function( fn ) {
6500
                        return elem === fn.elem;
6501
                }).length;
6502
        };
6503
}
6504

    
6505
function defaultDisplay( nodeName ) {
6506
        if ( !elemdisplay[ nodeName ] ) {
6507
                var elem = jQuery("<" + nodeName + ">").appendTo("body"),
6508
                        display = elem.css("display");
6509

    
6510
                elem.remove();
6511

    
6512
                if ( display === "none" || display === "" ) {
6513
                        display = "block";
6514
                }
6515

    
6516
                elemdisplay[ nodeName ] = display;
6517
        }
6518

    
6519
        return elemdisplay[ nodeName ];
6520
}
6521

    
6522

    
6523

    
6524

    
6525
var rtable = /^t(?:able|d|h)$/i,
6526
        rroot = /^(?:body|html)$/i;
6527

    
6528
if ( "getBoundingClientRect" in document.documentElement ) {
6529
        jQuery.fn.offset = function( options ) {
6530
                var elem = this[0], box;
6531

    
6532
                if ( options ) { 
6533
                        return this.each(function( i ) {
6534
                                jQuery.offset.setOffset( this, options, i );
6535
                        });
6536
                }
6537

    
6538
                if ( !elem || !elem.ownerDocument ) {
6539
                        return null;
6540
                }
6541

    
6542
                if ( elem === elem.ownerDocument.body ) {
6543
                        return jQuery.offset.bodyOffset( elem );
6544
                }
6545

    
6546
                try {
6547
                        box = elem.getBoundingClientRect();
6548
                } catch(e) {}
6549

    
6550
                var doc = elem.ownerDocument,
6551
                        docElem = doc.documentElement;
6552

    
6553
                // Make sure we're not dealing with a disconnected DOM node
6554
                if ( !box || !jQuery.contains( docElem, elem ) ) {
6555
                        return box || { top: 0, left: 0 };
6556
                }
6557

    
6558
                var body = doc.body,
6559
                        win = getWindow(doc),
6560
                        clientTop  = docElem.clientTop  || body.clientTop  || 0,
6561
                        clientLeft = docElem.clientLeft || body.clientLeft || 0,
6562
                        scrollTop  = (win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop ),
6563
                        scrollLeft = (win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft),
6564
                        top  = box.top  + scrollTop  - clientTop,
6565
                        left = box.left + scrollLeft - clientLeft;
6566

    
6567
                return { top: top, left: left };
6568
        };
6569

    
6570
} else {
6571
        jQuery.fn.offset = function( options ) {
6572
                var elem = this[0];
6573

    
6574
                if ( options ) { 
6575
                        return this.each(function( i ) {
6576
                                jQuery.offset.setOffset( this, options, i );
6577
                        });
6578
                }
6579

    
6580
                if ( !elem || !elem.ownerDocument ) {
6581
                        return null;
6582
                }
6583

    
6584
                if ( elem === elem.ownerDocument.body ) {
6585
                        return jQuery.offset.bodyOffset( elem );
6586
                }
6587

    
6588
                jQuery.offset.initialize();
6589

    
6590
                var offsetParent = elem.offsetParent, prevOffsetParent = elem,
6591
                        doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
6592
                        body = doc.body, defaultView = doc.defaultView,
6593
                        prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
6594
                        top = elem.offsetTop, left = elem.offsetLeft;
6595

    
6596
                while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
6597
                        if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
6598
                                break;
6599
                        }
6600

    
6601
                        computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
6602
                        top  -= elem.scrollTop;
6603
                        left -= elem.scrollLeft;
6604

    
6605
                        if ( elem === offsetParent ) {
6606
                                top  += elem.offsetTop;
6607
                                left += elem.offsetLeft;
6608

    
6609
                                if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
6610
                                        top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
6611
                                        left += parseFloat( computedStyle.borderLeftWidth ) || 0;
6612
                                }
6613

    
6614
                                prevOffsetParent = offsetParent;
6615
                                offsetParent = elem.offsetParent;
6616
                        }
6617

    
6618
                        if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
6619
                                top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
6620
                                left += parseFloat( computedStyle.borderLeftWidth ) || 0;
6621
                        }
6622

    
6623
                        prevComputedStyle = computedStyle;
6624
                }
6625

    
6626
                if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
6627
                        top  += body.offsetTop;
6628
                        left += body.offsetLeft;
6629
                }
6630

    
6631
                if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
6632
                        top  += Math.max( docElem.scrollTop, body.scrollTop );
6633
                        left += Math.max( docElem.scrollLeft, body.scrollLeft );
6634
                }
6635

    
6636
                return { top: top, left: left };
6637
        };
6638
}
6639

    
6640
jQuery.offset = {
6641
        initialize: function() {
6642
                var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
6643
                        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>";
6644

    
6645
                jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
6646

    
6647
                container.innerHTML = html;
6648
                body.insertBefore( container, body.firstChild );
6649
                innerDiv = container.firstChild;
6650
                checkDiv = innerDiv.firstChild;
6651
                td = innerDiv.nextSibling.firstChild.firstChild;
6652

    
6653
                this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
6654
                this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
6655

    
6656
                checkDiv.style.position = "fixed";
6657
                checkDiv.style.top = "20px";
6658

    
6659
                // safari subtracts parent border width here which is 5px
6660
                this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
6661
                checkDiv.style.position = checkDiv.style.top = "";
6662

    
6663
                innerDiv.style.overflow = "hidden";
6664
                innerDiv.style.position = "relative";
6665

    
6666
                this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
6667

    
6668
                this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
6669

    
6670
                body.removeChild( container );
6671
                body = container = innerDiv = checkDiv = table = td = null;
6672
                jQuery.offset.initialize = jQuery.noop;
6673
        },
6674

    
6675
        bodyOffset: function( body ) {
6676
                var top = body.offsetTop, left = body.offsetLeft;
6677

    
6678
                jQuery.offset.initialize();
6679

    
6680
                if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
6681
                        top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
6682
                        left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
6683
                }
6684

    
6685
                return { top: top, left: left };
6686
        },
6687
        
6688
        setOffset: function( elem, options, i ) {
6689
                var position = jQuery.css( elem, "position" );
6690

    
6691
                // set position first, in-case top/left are set even on static elem
6692
                if ( position === "static" ) {
6693
                        elem.style.position = "relative";
6694
                }
6695

    
6696
                var curElem = jQuery( elem ),
6697
                        curOffset = curElem.offset(),
6698
                        curCSSTop = jQuery.css( elem, "top" ),
6699
                        curCSSLeft = jQuery.css( elem, "left" ),
6700
                        calculatePosition = (position === "absolute" && jQuery.inArray('auto', [curCSSTop, curCSSLeft]) > -1),
6701
                        props = {}, curPosition = {}, curTop, curLeft;
6702

    
6703
                // need to be able to calculate position if either top or left is auto and position is absolute
6704
                if ( calculatePosition ) {
6705
                        curPosition = curElem.position();
6706
                }
6707

    
6708
                curTop  = calculatePosition ? curPosition.top  : parseInt( curCSSTop,  10 ) || 0;
6709
                curLeft = calculatePosition ? curPosition.left : parseInt( curCSSLeft, 10 ) || 0;
6710

    
6711
                if ( jQuery.isFunction( options ) ) {
6712
                        options = options.call( elem, i, curOffset );
6713
                }
6714

    
6715
                if (options.top != null) {
6716
                        props.top = (options.top - curOffset.top) + curTop;
6717
                }
6718
                if (options.left != null) {
6719
                        props.left = (options.left - curOffset.left) + curLeft;
6720
                }
6721
                
6722
                if ( "using" in options ) {
6723
                        options.using.call( elem, props );
6724
                } else {
6725
                        curElem.css( props );
6726
                }
6727
        }
6728
};
6729

    
6730

    
6731
jQuery.fn.extend({
6732
        position: function() {
6733
                if ( !this[0] ) {
6734
                        return null;
6735
                }
6736

    
6737
                var elem = this[0],
6738

    
6739
                // Get *real* offsetParent
6740
                offsetParent = this.offsetParent(),
6741

    
6742
                // Get correct offsets
6743
                offset       = this.offset(),
6744
                parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
6745

    
6746
                // Subtract element margins
6747
                // note: when an element has margin: auto the offsetLeft and marginLeft
6748
                // are the same in Safari causing offset.left to incorrectly be 0
6749
                offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
6750
                offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
6751

    
6752
                // Add offsetParent borders
6753
                parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
6754
                parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
6755

    
6756
                // Subtract the two offsets
6757
                return {
6758
                        top:  offset.top  - parentOffset.top,
6759
                        left: offset.left - parentOffset.left
6760
                };
6761
        },
6762

    
6763
        offsetParent: function() {
6764
                return this.map(function() {
6765
                        var offsetParent = this.offsetParent || document.body;
6766
                        while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
6767
                                offsetParent = offsetParent.offsetParent;
6768
                        }
6769
                        return offsetParent;
6770
                });
6771
        }
6772
});
6773

    
6774

    
6775
// Create scrollLeft and scrollTop methods
6776
jQuery.each( ["Left", "Top"], function( i, name ) {
6777
        var method = "scroll" + name;
6778

    
6779
        jQuery.fn[ method ] = function(val) {
6780
                var elem = this[0], win;
6781
                
6782
                if ( !elem ) {
6783
                        return null;
6784
                }
6785

    
6786
                if ( val !== undefined ) {
6787
                        // Set the scroll offset
6788
                        return this.each(function() {
6789
                                win = getWindow( this );
6790

    
6791
                                if ( win ) {
6792
                                        win.scrollTo(
6793
                                                !i ? val : jQuery(win).scrollLeft(),
6794
                                                 i ? val : jQuery(win).scrollTop()
6795
                                        );
6796

    
6797
                                } else {
6798
                                        this[ method ] = val;
6799
                                }
6800
                        });
6801
                } else {
6802
                        win = getWindow( elem );
6803

    
6804
                        // Return the scroll offset
6805
                        return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
6806
                                jQuery.support.boxModel && win.document.documentElement[ method ] ||
6807
                                        win.document.body[ method ] :
6808
                                elem[ method ];
6809
                }
6810
        };
6811
});
6812

    
6813
function getWindow( elem ) {
6814
        return jQuery.isWindow( elem ) ?
6815
                elem :
6816
                elem.nodeType === 9 ?
6817
                        elem.defaultView || elem.parentWindow :
6818
                        false;
6819
}
6820

    
6821

    
6822

    
6823

    
6824
// Create innerHeight, innerWidth, outerHeight and outerWidth methods
6825
jQuery.each([ "Height", "Width" ], function( i, name ) {
6826

    
6827
        var type = name.toLowerCase();
6828

    
6829
        // innerHeight and innerWidth
6830
        jQuery.fn["inner" + name] = function() {
6831
                return this[0] ?
6832
                        parseFloat( jQuery.css( this[0], type, "padding" ) ) :
6833
                        null;
6834
        };
6835

    
6836
        // outerHeight and outerWidth
6837
        jQuery.fn["outer" + name] = function( margin ) {
6838
                return this[0] ?
6839
                        parseFloat( jQuery.css( this[0], type, margin ? "margin" : "border" ) ) :
6840
                        null;
6841
        };
6842

    
6843
        jQuery.fn[ type ] = function( size ) {
6844
                // Get window width or height
6845
                var elem = this[0];
6846
                if ( !elem ) {
6847
                        return size == null ? null : this;
6848
                }
6849
                
6850
                if ( jQuery.isFunction( size ) ) {
6851
                        return this.each(function( i ) {
6852
                                var self = jQuery( this );
6853
                                self[ type ]( size.call( this, i, self[ type ]() ) );
6854
                        });
6855
                }
6856

    
6857
                return jQuery.isWindow( elem ) ?
6858
                        // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
6859
                        elem.document.compatMode === "CSS1Compat" && elem.document.documentElement[ "client" + name ] ||
6860
                        elem.document.body[ "client" + name ] :
6861

    
6862
                        // Get document width or height
6863
                        (elem.nodeType === 9) ? // is it a document
6864
                                // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
6865
                                Math.max(
6866
                                        elem.documentElement["client" + name],
6867
                                        elem.body["scroll" + name], elem.documentElement["scroll" + name],
6868
                                        elem.body["offset" + name], elem.documentElement["offset" + name]
6869
                                ) :
6870

    
6871
                                // Get or set width or height on the element
6872
                                size === undefined ?
6873
                                        // Get width or height on the element
6874
                                        parseFloat( jQuery.css( elem, type ) ) :
6875

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

    
6880
});
6881

    
6882

    
6883
})(window);