~ubuntu-branches/debian/sid/varnish/sid

« back to all changes in this revision

Viewing changes to doc/sphinx/=build/html/_static/jquery.js

  • Committer: Package Import Robot
  • Author(s): Stig Sandbeck Mathisen
  • Date: 2011-10-29 15:23:24 UTC
  • mfrom: (0.1.15)
  • Revision ID: package-import@ubuntu.com-20111029152324-tdtlsurrv22ysknj
Tags: 3.0.2-1
* New upstream release
* Build from upstream tarball instead of git tag
* debian/watch: more specific regular expression

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*!
 
2
 * jQuery JavaScript Library v1.6.4
 
3
 * http://jquery.com/
 
4
 *
 
5
 * Copyright 2011, John Resig
 
6
 * Dual licensed under the MIT or GPL Version 2 licenses.
 
7
 * http://jquery.org/license
 
8
 *
 
9
 * Includes Sizzle.js
 
10
 * http://sizzlejs.com/
 
11
 * Copyright 2011, The Dojo Foundation
 
12
 * Released under the MIT, BSD, and GPL Licenses.
 
13
 *
 
14
 * Date: Mon Sep 12 18:54:48 2011 -0400
 
15
 */
 
16
(function( window, undefined ) {
 
17
 
 
18
// Use the correct document accordingly with window argument (sandbox)
 
19
var document = window.document,
 
20
        navigator = window.navigator,
 
21
        location = window.location;
 
22
var jQuery = (function() {
 
23
 
 
24
// Define a local copy of jQuery
 
25
var jQuery = function( selector, context ) {
 
26
                // The jQuery object is actually just the init constructor 'enhanced'
 
27
                return new jQuery.fn.init( selector, context, rootjQuery );
 
28
        },
 
29
 
 
30
        // Map over jQuery in case of overwrite
 
31
        _jQuery = window.jQuery,
 
32
 
 
33
        // Map over the $ in case of overwrite
 
34
        _$ = window.$,
 
35
 
 
36
        // A central reference to the root jQuery(document)
 
37
        rootjQuery,
 
38
 
 
39
        // A simple way to check for HTML strings or ID strings
 
40
        // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
 
41
        quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
 
42
 
 
43
        // Check if a string has a non-whitespace character in it
 
44
        rnotwhite = /\S/,
 
45
 
 
46
        // Used for trimming whitespace
 
47
        trimLeft = /^\s+/,
 
48
        trimRight = /\s+$/,
 
49
 
 
50
        // Check for digits
 
51
        rdigit = /\d/,
 
52
 
 
53
        // Match a standalone tag
 
54
        rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
 
55
 
 
56
        // JSON RegExp
 
57
        rvalidchars = /^[\],:{}\s]*$/,
 
58
        rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
 
59
        rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
 
60
        rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
 
61
 
 
62
        // Useragent RegExp
 
63
        rwebkit = /(webkit)[ \/]([\w.]+)/,
 
64
        ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
 
65
        rmsie = /(msie) ([\w.]+)/,
 
66
        rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
 
67
 
 
68
        // Matches dashed string for camelizing
 
69
        rdashAlpha = /-([a-z]|[0-9])/ig,
 
70
        rmsPrefix = /^-ms-/,
 
71
 
 
72
        // Used by jQuery.camelCase as callback to replace()
 
73
        fcamelCase = function( all, letter ) {
 
74
                return ( letter + "" ).toUpperCase();
 
75
        },
 
76
 
 
77
        // Keep a UserAgent string for use with jQuery.browser
 
78
        userAgent = navigator.userAgent,
 
79
 
 
80
        // For matching the engine and version of the browser
 
81
        browserMatch,
 
82
 
 
83
        // The deferred used on DOM ready
 
84
        readyList,
 
85
 
 
86
        // The ready event handler
 
87
        DOMContentLoaded,
 
88
 
 
89
        // Save a reference to some core methods
 
90
        toString = Object.prototype.toString,
 
91
        hasOwn = Object.prototype.hasOwnProperty,
 
92
        push = Array.prototype.push,
 
93
        slice = Array.prototype.slice,
 
94
        trim = String.prototype.trim,
 
95
        indexOf = Array.prototype.indexOf,
 
96
 
 
97
        // [[Class]] -> type pairs
 
98
        class2type = {};
 
99
 
 
100
jQuery.fn = jQuery.prototype = {
 
101
        constructor: jQuery,
 
102
        init: function( selector, context, rootjQuery ) {
 
103
                var match, elem, ret, doc;
 
104
 
 
105
                // Handle $(""), $(null), or $(undefined)
 
106
                if ( !selector ) {
 
107
                        return this;
 
108
                }
 
109
 
 
110
                // Handle $(DOMElement)
 
111
                if ( selector.nodeType ) {
 
112
                        this.context = this[0] = selector;
 
113
                        this.length = 1;
 
114
                        return this;
 
115
                }
 
116
 
 
117
                // The body element only exists once, optimize finding it
 
118
                if ( selector === "body" && !context && document.body ) {
 
119
                        this.context = document;
 
120
                        this[0] = document.body;
 
121
                        this.selector = selector;
 
122
                        this.length = 1;
 
123
                        return this;
 
124
                }
 
125
 
 
126
                // Handle HTML strings
 
127
                if ( typeof selector === "string" ) {
 
128
                        // Are we dealing with HTML string or an ID?
 
129
                        if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
 
130
                                // Assume that strings that start and end with <> are HTML and skip the regex check
 
131
                                match = [ null, selector, null ];
 
132
 
 
133
                        } else {
 
134
                                match = quickExpr.exec( selector );
 
135
                        }
 
136
 
 
137
                        // Verify a match, and that no context was specified for #id
 
138
                        if ( match && (match[1] || !context) ) {
 
139
 
 
140
                                // HANDLE: $(html) -> $(array)
 
141
                                if ( match[1] ) {
 
142
                                        context = context instanceof jQuery ? context[0] : context;
 
143
                                        doc = (context ? context.ownerDocument || context : document);
 
144
 
 
145
                                        // If a single string is passed in and it's a single tag
 
146
                                        // just do a createElement and skip the rest
 
147
                                        ret = rsingleTag.exec( selector );
 
148
 
 
149
                                        if ( ret ) {
 
150
                                                if ( jQuery.isPlainObject( context ) ) {
 
151
                                                        selector = [ document.createElement( ret[1] ) ];
 
152
                                                        jQuery.fn.attr.call( selector, context, true );
 
153
 
 
154
                                                } else {
 
155
                                                        selector = [ doc.createElement( ret[1] ) ];
 
156
                                                }
 
157
 
 
158
                                        } else {
 
159
                                                ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
 
160
                                                selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
 
161
                                        }
 
162
 
 
163
                                        return jQuery.merge( this, selector );
 
164
 
 
165
                                // HANDLE: $("#id")
 
166
                                } else {
 
167
                                        elem = document.getElementById( match[2] );
 
168
 
 
169
                                        // Check parentNode to catch when Blackberry 4.6 returns
 
170
                                        // nodes that are no longer in the document #6963
 
171
                                        if ( elem && elem.parentNode ) {
 
172
                                                // Handle the case where IE and Opera return items
 
173
                                                // by name instead of ID
 
174
                                                if ( elem.id !== match[2] ) {
 
175
                                                        return rootjQuery.find( selector );
 
176
                                                }
 
177
 
 
178
                                                // Otherwise, we inject the element directly into the jQuery object
 
179
                                                this.length = 1;
 
180
                                                this[0] = elem;
 
181
                                        }
 
182
 
 
183
                                        this.context = document;
 
184
                                        this.selector = selector;
 
185
                                        return this;
 
186
                                }
 
187
 
 
188
                        // HANDLE: $(expr, $(...))
 
189
                        } else if ( !context || context.jquery ) {
 
190
                                return (context || rootjQuery).find( selector );
 
191
 
 
192
                        // HANDLE: $(expr, context)
 
193
                        // (which is just equivalent to: $(context).find(expr)
 
194
                        } else {
 
195
                                return this.constructor( context ).find( selector );
 
196
                        }
 
197
 
 
198
                // HANDLE: $(function)
 
199
                // Shortcut for document ready
 
200
                } else if ( jQuery.isFunction( selector ) ) {
 
201
                        return rootjQuery.ready( selector );
 
202
                }
 
203
 
 
204
                if (selector.selector !== undefined) {
 
205
                        this.selector = selector.selector;
 
206
                        this.context = selector.context;
 
207
                }
 
208
 
 
209
                return jQuery.makeArray( selector, this );
 
210
        },
 
211
 
 
212
        // Start with an empty selector
 
213
        selector: "",
 
214
 
 
215
        // The current version of jQuery being used
 
216
        jquery: "1.6.4",
 
217
 
 
218
        // The default length of a jQuery object is 0
 
219
        length: 0,
 
220
 
 
221
        // The number of elements contained in the matched element set
 
222
        size: function() {
 
223
                return this.length;
 
224
        },
 
225
 
 
226
        toArray: function() {
 
227
                return slice.call( this, 0 );
 
228
        },
 
229
 
 
230
        // Get the Nth element in the matched element set OR
 
231
        // Get the whole matched element set as a clean array
 
232
        get: function( num ) {
 
233
                return num == null ?
 
234
 
 
235
                        // Return a 'clean' array
 
236
                        this.toArray() :
 
237
 
 
238
                        // Return just the object
 
239
                        ( num < 0 ? this[ this.length + num ] : this[ num ] );
 
240
        },
 
241
 
 
242
        // Take an array of elements and push it onto the stack
 
243
        // (returning the new matched element set)
 
244
        pushStack: function( elems, name, selector ) {
 
245
                // Build a new jQuery matched element set
 
246
                var ret = this.constructor();
 
247
 
 
248
                if ( jQuery.isArray( elems ) ) {
 
249
                        push.apply( ret, elems );
 
250
 
 
251
                } else {
 
252
                        jQuery.merge( ret, elems );
 
253
                }
 
254
 
 
255
                // Add the old object onto the stack (as a reference)
 
256
                ret.prevObject = this;
 
257
 
 
258
                ret.context = this.context;
 
259
 
 
260
                if ( name === "find" ) {
 
261
                        ret.selector = this.selector + (this.selector ? " " : "") + selector;
 
262
                } else if ( name ) {
 
263
                        ret.selector = this.selector + "." + name + "(" + selector + ")";
 
264
                }
 
265
 
 
266
                // Return the newly-formed element set
 
267
                return ret;
 
268
        },
 
269
 
 
270
        // Execute a callback for every element in the matched set.
 
271
        // (You can seed the arguments with an array of args, but this is
 
272
        // only used internally.)
 
273
        each: function( callback, args ) {
 
274
                return jQuery.each( this, callback, args );
 
275
        },
 
276
 
 
277
        ready: function( fn ) {
 
278
                // Attach the listeners
 
279
                jQuery.bindReady();
 
280
 
 
281
                // Add the callback
 
282
                readyList.done( fn );
 
283
 
 
284
                return this;
 
285
        },
 
286
 
 
287
        eq: function( i ) {
 
288
                return i === -1 ?
 
289
                        this.slice( i ) :
 
290
                        this.slice( i, +i + 1 );
 
291
        },
 
292
 
 
293
        first: function() {
 
294
                return this.eq( 0 );
 
295
        },
 
296
 
 
297
        last: function() {
 
298
                return this.eq( -1 );
 
299
        },
 
300
 
 
301
        slice: function() {
 
302
                return this.pushStack( slice.apply( this, arguments ),
 
303
                        "slice", slice.call(arguments).join(",") );
 
304
        },
 
305
 
 
306
        map: function( callback ) {
 
307
                return this.pushStack( jQuery.map(this, function( elem, i ) {
 
308
                        return callback.call( elem, i, elem );
 
309
                }));
 
310
        },
 
311
 
 
312
        end: function() {
 
313
                return this.prevObject || this.constructor(null);
 
314
        },
 
315
 
 
316
        // For internal use only.
 
317
        // Behaves like an Array's method, not like a jQuery method.
 
318
        push: push,
 
319
        sort: [].sort,
 
320
        splice: [].splice
 
321
};
 
322
 
 
323
// Give the init function the jQuery prototype for later instantiation
 
324
jQuery.fn.init.prototype = jQuery.fn;
 
325
 
 
326
jQuery.extend = jQuery.fn.extend = function() {
 
327
        var options, name, src, copy, copyIsArray, clone,
 
328
                target = arguments[0] || {},
 
329
                i = 1,
 
330
                length = arguments.length,
 
331
                deep = false;
 
332
 
 
333
        // Handle a deep copy situation
 
334
        if ( typeof target === "boolean" ) {
 
335
                deep = target;
 
336
                target = arguments[1] || {};
 
337
                // skip the boolean and the target
 
338
                i = 2;
 
339
        }
 
340
 
 
341
        // Handle case when target is a string or something (possible in deep copy)
 
342
        if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
 
343
                target = {};
 
344
        }
 
345
 
 
346
        // extend jQuery itself if only one argument is passed
 
347
        if ( length === i ) {
 
348
                target = this;
 
349
                --i;
 
350
        }
 
351
 
 
352
        for ( ; i < length; i++ ) {
 
353
                // Only deal with non-null/undefined values
 
354
                if ( (options = arguments[ i ]) != null ) {
 
355
                        // Extend the base object
 
356
                        for ( name in options ) {
 
357
                                src = target[ name ];
 
358
                                copy = options[ name ];
 
359
 
 
360
                                // Prevent never-ending loop
 
361
                                if ( target === copy ) {
 
362
                                        continue;
 
363
                                }
 
364
 
 
365
                                // Recurse if we're merging plain objects or arrays
 
366
                                if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
 
367
                                        if ( copyIsArray ) {
 
368
                                                copyIsArray = false;
 
369
                                                clone = src && jQuery.isArray(src) ? src : [];
 
370
 
 
371
                                        } else {
 
372
                                                clone = src && jQuery.isPlainObject(src) ? src : {};
 
373
                                        }
 
374
 
 
375
                                        // Never move original objects, clone them
 
376
                                        target[ name ] = jQuery.extend( deep, clone, copy );
 
377
 
 
378
                                // Don't bring in undefined values
 
379
                                } else if ( copy !== undefined ) {
 
380
                                        target[ name ] = copy;
 
381
                                }
 
382
                        }
 
383
                }
 
384
        }
 
385
 
 
386
        // Return the modified object
 
387
        return target;
 
388
};
 
389
 
 
390
jQuery.extend({
 
391
        noConflict: function( deep ) {
 
392
                if ( window.$ === jQuery ) {
 
393
                        window.$ = _$;
 
394
                }
 
395
 
 
396
                if ( deep && window.jQuery === jQuery ) {
 
397
                        window.jQuery = _jQuery;
 
398
                }
 
399
 
 
400
                return jQuery;
 
401
        },
 
402
 
 
403
        // Is the DOM ready to be used? Set to true once it occurs.
 
404
        isReady: false,
 
405
 
 
406
        // A counter to track how many items to wait for before
 
407
        // the ready event fires. See #6781
 
408
        readyWait: 1,
 
409
 
 
410
        // Hold (or release) the ready event
 
411
        holdReady: function( hold ) {
 
412
                if ( hold ) {
 
413
                        jQuery.readyWait++;
 
414
                } else {
 
415
                        jQuery.ready( true );
 
416
                }
 
417
        },
 
418
 
 
419
        // Handle when the DOM is ready
 
420
        ready: function( wait ) {
 
421
                // Either a released hold or an DOMready/load event and not yet ready
 
422
                if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
 
423
                        // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
 
424
                        if ( !document.body ) {
 
425
                                return setTimeout( jQuery.ready, 1 );
 
426
                        }
 
427
 
 
428
                        // Remember that the DOM is ready
 
429
                        jQuery.isReady = true;
 
430
 
 
431
                        // If a normal DOM Ready event fired, decrement, and wait if need be
 
432
                        if ( wait !== true && --jQuery.readyWait > 0 ) {
 
433
                                return;
 
434
                        }
 
435
 
 
436
                        // If there are functions bound, to execute
 
437
                        readyList.resolveWith( document, [ jQuery ] );
 
438
 
 
439
                        // Trigger any bound ready events
 
440
                        if ( jQuery.fn.trigger ) {
 
441
                                jQuery( document ).trigger( "ready" ).unbind( "ready" );
 
442
                        }
 
443
                }
 
444
        },
 
445
 
 
446
        bindReady: function() {
 
447
                if ( readyList ) {
 
448
                        return;
 
449
                }
 
450
 
 
451
                readyList = jQuery._Deferred();
 
452
 
 
453
                // Catch cases where $(document).ready() is called after the
 
454
                // browser event has already occurred.
 
455
                if ( document.readyState === "complete" ) {
 
456
                        // Handle it asynchronously to allow scripts the opportunity to delay ready
 
457
                        return setTimeout( jQuery.ready, 1 );
 
458
                }
 
459
 
 
460
                // Mozilla, Opera and webkit nightlies currently support this event
 
461
                if ( document.addEventListener ) {
 
462
                        // Use the handy event callback
 
463
                        document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
 
464
 
 
465
                        // A fallback to window.onload, that will always work
 
466
                        window.addEventListener( "load", jQuery.ready, false );
 
467
 
 
468
                // If IE event model is used
 
469
                } else if ( document.attachEvent ) {
 
470
                        // ensure firing before onload,
 
471
                        // maybe late but safe also for iframes
 
472
                        document.attachEvent( "onreadystatechange", DOMContentLoaded );
 
473
 
 
474
                        // A fallback to window.onload, that will always work
 
475
                        window.attachEvent( "onload", jQuery.ready );
 
476
 
 
477
                        // If IE and not a frame
 
478
                        // continually check to see if the document is ready
 
479
                        var toplevel = false;
 
480
 
 
481
                        try {
 
482
                                toplevel = window.frameElement == null;
 
483
                        } catch(e) {}
 
484
 
 
485
                        if ( document.documentElement.doScroll && toplevel ) {
 
486
                                doScrollCheck();
 
487
                        }
 
488
                }
 
489
        },
 
490
 
 
491
        // See test/unit/core.js for details concerning isFunction.
 
492
        // Since version 1.3, DOM methods and functions like alert
 
493
        // aren't supported. They return false on IE (#2968).
 
494
        isFunction: function( obj ) {
 
495
                return jQuery.type(obj) === "function";
 
496
        },
 
497
 
 
498
        isArray: Array.isArray || function( obj ) {
 
499
                return jQuery.type(obj) === "array";
 
500
        },
 
501
 
 
502
        // A crude way of determining if an object is a window
 
503
        isWindow: function( obj ) {
 
504
                return obj && typeof obj === "object" && "setInterval" in obj;
 
505
        },
 
506
 
 
507
        isNaN: function( obj ) {
 
508
                return obj == null || !rdigit.test( obj ) || isNaN( obj );
 
509
        },
 
510
 
 
511
        type: function( obj ) {
 
512
                return obj == null ?
 
513
                        String( obj ) :
 
514
                        class2type[ toString.call(obj) ] || "object";
 
515
        },
 
516
 
 
517
        isPlainObject: function( obj ) {
 
518
                // Must be an Object.
 
519
                // Because of IE, we also have to check the presence of the constructor property.
 
520
                // Make sure that DOM nodes and window objects don't pass through, as well
 
521
                if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
 
522
                        return false;
 
523
                }
 
524
 
 
525
                try {
 
526
                        // Not own constructor property must be Object
 
527
                        if ( obj.constructor &&
 
528
                                !hasOwn.call(obj, "constructor") &&
 
529
                                !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
 
530
                                return false;
 
531
                        }
 
532
                } catch ( e ) {
 
533
                        // IE8,9 Will throw exceptions on certain host objects #9897
 
534
                        return false;
 
535
                }
 
536
 
 
537
                // Own properties are enumerated firstly, so to speed up,
 
538
                // if last one is own, then all properties are own.
 
539
 
 
540
                var key;
 
541
                for ( key in obj ) {}
 
542
 
 
543
                return key === undefined || hasOwn.call( obj, key );
 
544
        },
 
545
 
 
546
        isEmptyObject: function( obj ) {
 
547
                for ( var name in obj ) {
 
548
                        return false;
 
549
                }
 
550
                return true;
 
551
        },
 
552
 
 
553
        error: function( msg ) {
 
554
                throw msg;
 
555
        },
 
556
 
 
557
        parseJSON: function( data ) {
 
558
                if ( typeof data !== "string" || !data ) {
 
559
                        return null;
 
560
                }
 
561
 
 
562
                // Make sure leading/trailing whitespace is removed (IE can't handle it)
 
563
                data = jQuery.trim( data );
 
564
 
 
565
                // Attempt to parse using the native JSON parser first
 
566
                if ( window.JSON && window.JSON.parse ) {
 
567
                        return window.JSON.parse( data );
 
568
                }
 
569
 
 
570
                // Make sure the incoming data is actual JSON
 
571
                // Logic borrowed from http://json.org/json2.js
 
572
                if ( rvalidchars.test( data.replace( rvalidescape, "@" )
 
573
                        .replace( rvalidtokens, "]" )
 
574
                        .replace( rvalidbraces, "")) ) {
 
575
 
 
576
                        return (new Function( "return " + data ))();
 
577
 
 
578
                }
 
579
                jQuery.error( "Invalid JSON: " + data );
 
580
        },
 
581
 
 
582
        // Cross-browser xml parsing
 
583
        parseXML: function( data ) {
 
584
                var xml, tmp;
 
585
                try {
 
586
                        if ( window.DOMParser ) { // Standard
 
587
                                tmp = new DOMParser();
 
588
                                xml = tmp.parseFromString( data , "text/xml" );
 
589
                        } else { // IE
 
590
                                xml = new ActiveXObject( "Microsoft.XMLDOM" );
 
591
                                xml.async = "false";
 
592
                                xml.loadXML( data );
 
593
                        }
 
594
                } catch( e ) {
 
595
                        xml = undefined;
 
596
                }
 
597
                if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
 
598
                        jQuery.error( "Invalid XML: " + data );
 
599
                }
 
600
                return xml;
 
601
        },
 
602
 
 
603
        noop: function() {},
 
604
 
 
605
        // Evaluates a script in a global context
 
606
        // Workarounds based on findings by Jim Driscoll
 
607
        // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
 
608
        globalEval: function( data ) {
 
609
                if ( data && rnotwhite.test( data ) ) {
 
610
                        // We use execScript on Internet Explorer
 
611
                        // We use an anonymous function so that context is window
 
612
                        // rather than jQuery in Firefox
 
613
                        ( window.execScript || function( data ) {
 
614
                                window[ "eval" ].call( window, data );
 
615
                        } )( data );
 
616
                }
 
617
        },
 
618
 
 
619
        // Convert dashed to camelCase; used by the css and data modules
 
620
        // Microsoft forgot to hump their vendor prefix (#9572)
 
621
        camelCase: function( string ) {
 
622
                return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
 
623
        },
 
624
 
 
625
        nodeName: function( elem, name ) {
 
626
                return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
 
627
        },
 
628
 
 
629
        // args is for internal usage only
 
630
        each: function( object, callback, args ) {
 
631
                var name, i = 0,
 
632
                        length = object.length,
 
633
                        isObj = length === undefined || jQuery.isFunction( object );
 
634
 
 
635
                if ( args ) {
 
636
                        if ( isObj ) {
 
637
                                for ( name in object ) {
 
638
                                        if ( callback.apply( object[ name ], args ) === false ) {
 
639
                                                break;
 
640
                                        }
 
641
                                }
 
642
                        } else {
 
643
                                for ( ; i < length; ) {
 
644
                                        if ( callback.apply( object[ i++ ], args ) === false ) {
 
645
                                                break;
 
646
                                        }
 
647
                                }
 
648
                        }
 
649
 
 
650
                // A special, fast, case for the most common use of each
 
651
                } else {
 
652
                        if ( isObj ) {
 
653
                                for ( name in object ) {
 
654
                                        if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
 
655
                                                break;
 
656
                                        }
 
657
                                }
 
658
                        } else {
 
659
                                for ( ; i < length; ) {
 
660
                                        if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
 
661
                                                break;
 
662
                                        }
 
663
                                }
 
664
                        }
 
665
                }
 
666
 
 
667
                return object;
 
668
        },
 
669
 
 
670
        // Use native String.trim function wherever possible
 
671
        trim: trim ?
 
672
                function( text ) {
 
673
                        return text == null ?
 
674
                                "" :
 
675
                                trim.call( text );
 
676
                } :
 
677
 
 
678
                // Otherwise use our own trimming functionality
 
679
                function( text ) {
 
680
                        return text == null ?
 
681
                                "" :
 
682
                                text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
 
683
                },
 
684
 
 
685
        // results is for internal usage only
 
686
        makeArray: function( array, results ) {
 
687
                var ret = results || [];
 
688
 
 
689
                if ( array != null ) {
 
690
                        // The window, strings (and functions) also have 'length'
 
691
                        // The extra typeof function check is to prevent crashes
 
692
                        // in Safari 2 (See: #3039)
 
693
                        // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
 
694
                        var type = jQuery.type( array );
 
695
 
 
696
                        if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
 
697
                                push.call( ret, array );
 
698
                        } else {
 
699
                                jQuery.merge( ret, array );
 
700
                        }
 
701
                }
 
702
 
 
703
                return ret;
 
704
        },
 
705
 
 
706
        inArray: function( elem, array ) {
 
707
                if ( !array ) {
 
708
                        return -1;
 
709
                }
 
710
 
 
711
                if ( indexOf ) {
 
712
                        return indexOf.call( array, elem );
 
713
                }
 
714
 
 
715
                for ( var i = 0, length = array.length; i < length; i++ ) {
 
716
                        if ( array[ i ] === elem ) {
 
717
                                return i;
 
718
                        }
 
719
                }
 
720
 
 
721
                return -1;
 
722
        },
 
723
 
 
724
        merge: function( first, second ) {
 
725
                var i = first.length,
 
726
                        j = 0;
 
727
 
 
728
                if ( typeof second.length === "number" ) {
 
729
                        for ( var l = second.length; j < l; j++ ) {
 
730
                                first[ i++ ] = second[ j ];
 
731
                        }
 
732
 
 
733
                } else {
 
734
                        while ( second[j] !== undefined ) {
 
735
                                first[ i++ ] = second[ j++ ];
 
736
                        }
 
737
                }
 
738
 
 
739
                first.length = i;
 
740
 
 
741
                return first;
 
742
        },
 
743
 
 
744
        grep: function( elems, callback, inv ) {
 
745
                var ret = [], retVal;
 
746
                inv = !!inv;
 
747
 
 
748
                // Go through the array, only saving the items
 
749
                // that pass the validator function
 
750
                for ( var i = 0, length = elems.length; i < length; i++ ) {
 
751
                        retVal = !!callback( elems[ i ], i );
 
752
                        if ( inv !== retVal ) {
 
753
                                ret.push( elems[ i ] );
 
754
                        }
 
755
                }
 
756
 
 
757
                return ret;
 
758
        },
 
759
 
 
760
        // arg is for internal usage only
 
761
        map: function( elems, callback, arg ) {
 
762
                var value, key, ret = [],
 
763
                        i = 0,
 
764
                        length = elems.length,
 
765
                        // jquery objects are treated as arrays
 
766
                        isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
 
767
 
 
768
                // Go through the array, translating each of the items to their
 
769
                if ( isArray ) {
 
770
                        for ( ; i < length; i++ ) {
 
771
                                value = callback( elems[ i ], i, arg );
 
772
 
 
773
                                if ( value != null ) {
 
774
                                        ret[ ret.length ] = value;
 
775
                                }
 
776
                        }
 
777
 
 
778
                // Go through every key on the object,
 
779
                } else {
 
780
                        for ( key in elems ) {
 
781
                                value = callback( elems[ key ], key, arg );
 
782
 
 
783
                                if ( value != null ) {
 
784
                                        ret[ ret.length ] = value;
 
785
                                }
 
786
                        }
 
787
                }
 
788
 
 
789
                // Flatten any nested arrays
 
790
                return ret.concat.apply( [], ret );
 
791
        },
 
792
 
 
793
        // A global GUID counter for objects
 
794
        guid: 1,
 
795
 
 
796
        // Bind a function to a context, optionally partially applying any
 
797
        // arguments.
 
798
        proxy: function( fn, context ) {
 
799
                if ( typeof context === "string" ) {
 
800
                        var tmp = fn[ context ];
 
801
                        context = fn;
 
802
                        fn = tmp;
 
803
                }
 
804
 
 
805
                // Quick check to determine if target is callable, in the spec
 
806
                // this throws a TypeError, but we will just return undefined.
 
807
                if ( !jQuery.isFunction( fn ) ) {
 
808
                        return undefined;
 
809
                }
 
810
 
 
811
                // Simulated bind
 
812
                var args = slice.call( arguments, 2 ),
 
813
                        proxy = function() {
 
814
                                return fn.apply( context, args.concat( slice.call( arguments ) ) );
 
815
                        };
 
816
 
 
817
                // Set the guid of unique handler to the same of original handler, so it can be removed
 
818
                proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
 
819
 
 
820
                return proxy;
 
821
        },
 
822
 
 
823
        // Mutifunctional method to get and set values to a collection
 
824
        // The value/s can optionally be executed if it's a function
 
825
        access: function( elems, key, value, exec, fn, pass ) {
 
826
                var length = elems.length;
 
827
 
 
828
                // Setting many attributes
 
829
                if ( typeof key === "object" ) {
 
830
                        for ( var k in key ) {
 
831
                                jQuery.access( elems, k, key[k], exec, fn, value );
 
832
                        }
 
833
                        return elems;
 
834
                }
 
835
 
 
836
                // Setting one attribute
 
837
                if ( value !== undefined ) {
 
838
                        // Optionally, function values get executed if exec is true
 
839
                        exec = !pass && exec && jQuery.isFunction(value);
 
840
 
 
841
                        for ( var i = 0; i < length; i++ ) {
 
842
                                fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
 
843
                        }
 
844
 
 
845
                        return elems;
 
846
                }
 
847
 
 
848
                // Getting an attribute
 
849
                return length ? fn( elems[0], key ) : undefined;
 
850
        },
 
851
 
 
852
        now: function() {
 
853
                return (new Date()).getTime();
 
854
        },
 
855
 
 
856
        // Use of jQuery.browser is frowned upon.
 
857
        // More details: http://docs.jquery.com/Utilities/jQuery.browser
 
858
        uaMatch: function( ua ) {
 
859
                ua = ua.toLowerCase();
 
860
 
 
861
                var match = rwebkit.exec( ua ) ||
 
862
                        ropera.exec( ua ) ||
 
863
                        rmsie.exec( ua ) ||
 
864
                        ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
 
865
                        [];
 
866
 
 
867
                return { browser: match[1] || "", version: match[2] || "0" };
 
868
        },
 
869
 
 
870
        sub: function() {
 
871
                function jQuerySub( selector, context ) {
 
872
                        return new jQuerySub.fn.init( selector, context );
 
873
                }
 
874
                jQuery.extend( true, jQuerySub, this );
 
875
                jQuerySub.superclass = this;
 
876
                jQuerySub.fn = jQuerySub.prototype = this();
 
877
                jQuerySub.fn.constructor = jQuerySub;
 
878
                jQuerySub.sub = this.sub;
 
879
                jQuerySub.fn.init = function init( selector, context ) {
 
880
                        if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
 
881
                                context = jQuerySub( context );
 
882
                        }
 
883
 
 
884
                        return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
 
885
                };
 
886
                jQuerySub.fn.init.prototype = jQuerySub.fn;
 
887
                var rootjQuerySub = jQuerySub(document);
 
888
                return jQuerySub;
 
889
        },
 
890
 
 
891
        browser: {}
 
892
});
 
893
 
 
894
// Populate the class2type map
 
895
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
 
896
        class2type[ "[object " + name + "]" ] = name.toLowerCase();
 
897
});
 
898
 
 
899
browserMatch = jQuery.uaMatch( userAgent );
 
900
if ( browserMatch.browser ) {
 
901
        jQuery.browser[ browserMatch.browser ] = true;
 
902
        jQuery.browser.version = browserMatch.version;
 
903
}
 
904
 
 
905
// Deprecated, use jQuery.browser.webkit instead
 
906
if ( jQuery.browser.webkit ) {
 
907
        jQuery.browser.safari = true;
 
908
}
 
909
 
 
910
// IE doesn't match non-breaking spaces with \s
 
911
if ( rnotwhite.test( "\xA0" ) ) {
 
912
        trimLeft = /^[\s\xA0]+/;
 
913
        trimRight = /[\s\xA0]+$/;
 
914
}
 
915
 
 
916
// All jQuery objects should point back to these
 
917
rootjQuery = jQuery(document);
 
918
 
 
919
// Cleanup functions for the document ready method
 
920
if ( document.addEventListener ) {
 
921
        DOMContentLoaded = function() {
 
922
                document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
 
923
                jQuery.ready();
 
924
        };
 
925
 
 
926
} else if ( document.attachEvent ) {
 
927
        DOMContentLoaded = function() {
 
928
                // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
 
929
                if ( document.readyState === "complete" ) {
 
930
                        document.detachEvent( "onreadystatechange", DOMContentLoaded );
 
931
                        jQuery.ready();
 
932
                }
 
933
        };
 
934
}
 
935
 
 
936
// The DOM ready check for Internet Explorer
 
937
function doScrollCheck() {
 
938
        if ( jQuery.isReady ) {
 
939
                return;
 
940
        }
 
941
 
 
942
        try {
 
943
                // If IE is used, use the trick by Diego Perini
 
944
                // http://javascript.nwbox.com/IEContentLoaded/
 
945
                document.documentElement.doScroll("left");
 
946
        } catch(e) {
 
947
                setTimeout( doScrollCheck, 1 );
 
948
                return;
 
949
        }
 
950
 
 
951
        // and execute any waiting functions
 
952
        jQuery.ready();
 
953
}
 
954
 
 
955
return jQuery;
 
956
 
 
957
})();
 
958
 
 
959
 
 
960
var // Promise methods
 
961
        promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ),
 
962
        // Static reference to slice
 
963
        sliceDeferred = [].slice;
 
964
 
 
965
jQuery.extend({
 
966
        // Create a simple deferred (one callbacks list)
 
967
        _Deferred: function() {
 
968
                var // callbacks list
 
969
                        callbacks = [],
 
970
                        // stored [ context , args ]
 
971
                        fired,
 
972
                        // to avoid firing when already doing so
 
973
                        firing,
 
974
                        // flag to know if the deferred has been cancelled
 
975
                        cancelled,
 
976
                        // the deferred itself
 
977
                        deferred  = {
 
978
 
 
979
                                // done( f1, f2, ...)
 
980
                                done: function() {
 
981
                                        if ( !cancelled ) {
 
982
                                                var args = arguments,
 
983
                                                        i,
 
984
                                                        length,
 
985
                                                        elem,
 
986
                                                        type,
 
987
                                                        _fired;
 
988
                                                if ( fired ) {
 
989
                                                        _fired = fired;
 
990
                                                        fired = 0;
 
991
                                                }
 
992
                                                for ( i = 0, length = args.length; i < length; i++ ) {
 
993
                                                        elem = args[ i ];
 
994
                                                        type = jQuery.type( elem );
 
995
                                                        if ( type === "array" ) {
 
996
                                                                deferred.done.apply( deferred, elem );
 
997
                                                        } else if ( type === "function" ) {
 
998
                                                                callbacks.push( elem );
 
999
                                                        }
 
1000
                                                }
 
1001
                                                if ( _fired ) {
 
1002
                                                        deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
 
1003
                                                }
 
1004
                                        }
 
1005
                                        return this;
 
1006
                                },
 
1007
 
 
1008
                                // resolve with given context and args
 
1009
                                resolveWith: function( context, args ) {
 
1010
                                        if ( !cancelled && !fired && !firing ) {
 
1011
                                                // make sure args are available (#8421)
 
1012
                                                args = args || [];
 
1013
                                                firing = 1;
 
1014
                                                try {
 
1015
                                                        while( callbacks[ 0 ] ) {
 
1016
                                                                callbacks.shift().apply( context, args );
 
1017
                                                        }
 
1018
                                                }
 
1019
                                                finally {
 
1020
                                                        fired = [ context, args ];
 
1021
                                                        firing = 0;
 
1022
                                                }
 
1023
                                        }
 
1024
                                        return this;
 
1025
                                },
 
1026
 
 
1027
                                // resolve with this as context and given arguments
 
1028
                                resolve: function() {
 
1029
                                        deferred.resolveWith( this, arguments );
 
1030
                                        return this;
 
1031
                                },
 
1032
 
 
1033
                                // Has this deferred been resolved?
 
1034
                                isResolved: function() {
 
1035
                                        return !!( firing || fired );
 
1036
                                },
 
1037
 
 
1038
                                // Cancel
 
1039
                                cancel: function() {
 
1040
                                        cancelled = 1;
 
1041
                                        callbacks = [];
 
1042
                                        return this;
 
1043
                                }
 
1044
                        };
 
1045
 
 
1046
                return deferred;
 
1047
        },
 
1048
 
 
1049
        // Full fledged deferred (two callbacks list)
 
1050
        Deferred: function( func ) {
 
1051
                var deferred = jQuery._Deferred(),
 
1052
                        failDeferred = jQuery._Deferred(),
 
1053
                        promise;
 
1054
                // Add errorDeferred methods, then and promise
 
1055
                jQuery.extend( deferred, {
 
1056
                        then: function( doneCallbacks, failCallbacks ) {
 
1057
                                deferred.done( doneCallbacks ).fail( failCallbacks );
 
1058
                                return this;
 
1059
                        },
 
1060
                        always: function() {
 
1061
                                return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments );
 
1062
                        },
 
1063
                        fail: failDeferred.done,
 
1064
                        rejectWith: failDeferred.resolveWith,
 
1065
                        reject: failDeferred.resolve,
 
1066
                        isRejected: failDeferred.isResolved,
 
1067
                        pipe: function( fnDone, fnFail ) {
 
1068
                                return jQuery.Deferred(function( newDefer ) {
 
1069
                                        jQuery.each( {
 
1070
                                                done: [ fnDone, "resolve" ],
 
1071
                                                fail: [ fnFail, "reject" ]
 
1072
                                        }, function( handler, data ) {
 
1073
                                                var fn = data[ 0 ],
 
1074
                                                        action = data[ 1 ],
 
1075
                                                        returned;
 
1076
                                                if ( jQuery.isFunction( fn ) ) {
 
1077
                                                        deferred[ handler ](function() {
 
1078
                                                                returned = fn.apply( this, arguments );
 
1079
                                                                if ( returned && jQuery.isFunction( returned.promise ) ) {
 
1080
                                                                        returned.promise().then( newDefer.resolve, newDefer.reject );
 
1081
                                                                } else {
 
1082
                                                                        newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
 
1083
                                                                }
 
1084
                                                        });
 
1085
                                                } else {
 
1086
                                                        deferred[ handler ]( newDefer[ action ] );
 
1087
                                                }
 
1088
                                        });
 
1089
                                }).promise();
 
1090
                        },
 
1091
                        // Get a promise for this deferred
 
1092
                        // If obj is provided, the promise aspect is added to the object
 
1093
                        promise: function( obj ) {
 
1094
                                if ( obj == null ) {
 
1095
                                        if ( promise ) {
 
1096
                                                return promise;
 
1097
                                        }
 
1098
                                        promise = obj = {};
 
1099
                                }
 
1100
                                var i = promiseMethods.length;
 
1101
                                while( i-- ) {
 
1102
                                        obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
 
1103
                                }
 
1104
                                return obj;
 
1105
                        }
 
1106
                });
 
1107
                // Make sure only one callback list will be used
 
1108
                deferred.done( failDeferred.cancel ).fail( deferred.cancel );
 
1109
                // Unexpose cancel
 
1110
                delete deferred.cancel;
 
1111
                // Call given func if any
 
1112
                if ( func ) {
 
1113
                        func.call( deferred, deferred );
 
1114
                }
 
1115
                return deferred;
 
1116
        },
 
1117
 
 
1118
        // Deferred helper
 
1119
        when: function( firstParam ) {
 
1120
                var args = arguments,
 
1121
                        i = 0,
 
1122
                        length = args.length,
 
1123
                        count = length,
 
1124
                        deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
 
1125
                                firstParam :
 
1126
                                jQuery.Deferred();
 
1127
                function resolveFunc( i ) {
 
1128
                        return function( value ) {
 
1129
                                args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
 
1130
                                if ( !( --count ) ) {
 
1131
                                        // Strange bug in FF4:
 
1132
                                        // Values changed onto the arguments object sometimes end up as undefined values
 
1133
                                        // outside the $.when method. Cloning the object into a fresh array solves the issue
 
1134
                                        deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) );
 
1135
                                }
 
1136
                        };
 
1137
                }
 
1138
                if ( length > 1 ) {
 
1139
                        for( ; i < length; i++ ) {
 
1140
                                if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) {
 
1141
                                        args[ i ].promise().then( resolveFunc(i), deferred.reject );
 
1142
                                } else {
 
1143
                                        --count;
 
1144
                                }
 
1145
                        }
 
1146
                        if ( !count ) {
 
1147
                                deferred.resolveWith( deferred, args );
 
1148
                        }
 
1149
                } else if ( deferred !== firstParam ) {
 
1150
                        deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
 
1151
                }
 
1152
                return deferred.promise();
 
1153
        }
 
1154
});
 
1155
 
 
1156
 
 
1157
 
 
1158
jQuery.support = (function() {
 
1159
 
 
1160
        var div = document.createElement( "div" ),
 
1161
                documentElement = document.documentElement,
 
1162
                all,
 
1163
                a,
 
1164
                select,
 
1165
                opt,
 
1166
                input,
 
1167
                marginDiv,
 
1168
                support,
 
1169
                fragment,
 
1170
                body,
 
1171
                testElementParent,
 
1172
                testElement,
 
1173
                testElementStyle,
 
1174
                tds,
 
1175
                events,
 
1176
                eventName,
 
1177
                i,
 
1178
                isSupported;
 
1179
 
 
1180
        // Preliminary tests
 
1181
        div.setAttribute("className", "t");
 
1182
        div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
 
1183
 
 
1184
 
 
1185
        all = div.getElementsByTagName( "*" );
 
1186
        a = div.getElementsByTagName( "a" )[ 0 ];
 
1187
 
 
1188
        // Can't get basic test support
 
1189
        if ( !all || !all.length || !a ) {
 
1190
                return {};
 
1191
        }
 
1192
 
 
1193
        // First batch of supports tests
 
1194
        select = document.createElement( "select" );
 
1195
        opt = select.appendChild( document.createElement("option") );
 
1196
        input = div.getElementsByTagName( "input" )[ 0 ];
 
1197
 
 
1198
        support = {
 
1199
                // IE strips leading whitespace when .innerHTML is used
 
1200
                leadingWhitespace: ( div.firstChild.nodeType === 3 ),
 
1201
 
 
1202
                // Make sure that tbody elements aren't automatically inserted
 
1203
                // IE will insert them into empty tables
 
1204
                tbody: !div.getElementsByTagName( "tbody" ).length,
 
1205
 
 
1206
                // Make sure that link elements get serialized correctly by innerHTML
 
1207
                // This requires a wrapper element in IE
 
1208
                htmlSerialize: !!div.getElementsByTagName( "link" ).length,
 
1209
 
 
1210
                // Get the style information from getAttribute
 
1211
                // (IE uses .cssText instead)
 
1212
                style: /top/.test( a.getAttribute("style") ),
 
1213
 
 
1214
                // Make sure that URLs aren't manipulated
 
1215
                // (IE normalizes it by default)
 
1216
                hrefNormalized: ( a.getAttribute( "href" ) === "/a" ),
 
1217
 
 
1218
                // Make sure that element opacity exists
 
1219
                // (IE uses filter instead)
 
1220
                // Use a regex to work around a WebKit issue. See #5145
 
1221
                opacity: /^0.55$/.test( a.style.opacity ),
 
1222
 
 
1223
                // Verify style float existence
 
1224
                // (IE uses styleFloat instead of cssFloat)
 
1225
                cssFloat: !!a.style.cssFloat,
 
1226
 
 
1227
                // Make sure that if no value is specified for a checkbox
 
1228
                // that it defaults to "on".
 
1229
                // (WebKit defaults to "" instead)
 
1230
                checkOn: ( input.value === "on" ),
 
1231
 
 
1232
                // Make sure that a selected-by-default option has a working selected property.
 
1233
                // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
 
1234
                optSelected: opt.selected,
 
1235
 
 
1236
                // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
 
1237
                getSetAttribute: div.className !== "t",
 
1238
 
 
1239
                // Will be defined later
 
1240
                submitBubbles: true,
 
1241
                changeBubbles: true,
 
1242
                focusinBubbles: false,
 
1243
                deleteExpando: true,
 
1244
                noCloneEvent: true,
 
1245
                inlineBlockNeedsLayout: false,
 
1246
                shrinkWrapBlocks: false,
 
1247
                reliableMarginRight: true
 
1248
        };
 
1249
 
 
1250
        // Make sure checked status is properly cloned
 
1251
        input.checked = true;
 
1252
        support.noCloneChecked = input.cloneNode( true ).checked;
 
1253
 
 
1254
        // Make sure that the options inside disabled selects aren't marked as disabled
 
1255
        // (WebKit marks them as disabled)
 
1256
        select.disabled = true;
 
1257
        support.optDisabled = !opt.disabled;
 
1258
 
 
1259
        // Test to see if it's possible to delete an expando from an element
 
1260
        // Fails in Internet Explorer
 
1261
        try {
 
1262
                delete div.test;
 
1263
        } catch( e ) {
 
1264
                support.deleteExpando = false;
 
1265
        }
 
1266
 
 
1267
        if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
 
1268
                div.attachEvent( "onclick", function() {
 
1269
                        // Cloning a node shouldn't copy over any
 
1270
                        // bound event handlers (IE does this)
 
1271
                        support.noCloneEvent = false;
 
1272
                });
 
1273
                div.cloneNode( true ).fireEvent( "onclick" );
 
1274
        }
 
1275
 
 
1276
        // Check if a radio maintains it's value
 
1277
        // after being appended to the DOM
 
1278
        input = document.createElement("input");
 
1279
        input.value = "t";
 
1280
        input.setAttribute("type", "radio");
 
1281
        support.radioValue = input.value === "t";
 
1282
 
 
1283
        input.setAttribute("checked", "checked");
 
1284
        div.appendChild( input );
 
1285
        fragment = document.createDocumentFragment();
 
1286
        fragment.appendChild( div.firstChild );
 
1287
 
 
1288
        // WebKit doesn't clone checked state correctly in fragments
 
1289
        support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
 
1290
 
 
1291
        div.innerHTML = "";
 
1292
 
 
1293
        // Figure out if the W3C box model works as expected
 
1294
        div.style.width = div.style.paddingLeft = "1px";
 
1295
 
 
1296
        body = document.getElementsByTagName( "body" )[ 0 ];
 
1297
        // We use our own, invisible, body unless the body is already present
 
1298
        // in which case we use a div (#9239)
 
1299
        testElement = document.createElement( body ? "div" : "body" );
 
1300
        testElementStyle = {
 
1301
                visibility: "hidden",
 
1302
                width: 0,
 
1303
                height: 0,
 
1304
                border: 0,
 
1305
                margin: 0,
 
1306
                background: "none"
 
1307
        };
 
1308
        if ( body ) {
 
1309
                jQuery.extend( testElementStyle, {
 
1310
                        position: "absolute",
 
1311
                        left: "-1000px",
 
1312
                        top: "-1000px"
 
1313
                });
 
1314
        }
 
1315
        for ( i in testElementStyle ) {
 
1316
                testElement.style[ i ] = testElementStyle[ i ];
 
1317
        }
 
1318
        testElement.appendChild( div );
 
1319
        testElementParent = body || documentElement;
 
1320
        testElementParent.insertBefore( testElement, testElementParent.firstChild );
 
1321
 
 
1322
        // Check if a disconnected checkbox will retain its checked
 
1323
        // value of true after appended to the DOM (IE6/7)
 
1324
        support.appendChecked = input.checked;
 
1325
 
 
1326
        support.boxModel = div.offsetWidth === 2;
 
1327
 
 
1328
        if ( "zoom" in div.style ) {
 
1329
                // Check if natively block-level elements act like inline-block
 
1330
                // elements when setting their display to 'inline' and giving
 
1331
                // them layout
 
1332
                // (IE < 8 does this)
 
1333
                div.style.display = "inline";
 
1334
                div.style.zoom = 1;
 
1335
                support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
 
1336
 
 
1337
                // Check if elements with layout shrink-wrap their children
 
1338
                // (IE 6 does this)
 
1339
                div.style.display = "";
 
1340
                div.innerHTML = "<div style='width:4px;'></div>";
 
1341
                support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
 
1342
        }
 
1343
 
 
1344
        div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
 
1345
        tds = div.getElementsByTagName( "td" );
 
1346
 
 
1347
        // Check if table cells still have offsetWidth/Height when they are set
 
1348
        // to display:none and there are still other visible table cells in a
 
1349
        // table row; if so, offsetWidth/Height are not reliable for use when
 
1350
        // determining if an element has been hidden directly using
 
1351
        // display:none (it is still safe to use offsets if a parent element is
 
1352
        // hidden; don safety goggles and see bug #4512 for more information).
 
1353
        // (only IE 8 fails this test)
 
1354
        isSupported = ( tds[ 0 ].offsetHeight === 0 );
 
1355
 
 
1356
        tds[ 0 ].style.display = "";
 
1357
        tds[ 1 ].style.display = "none";
 
1358
 
 
1359
        // Check if empty table cells still have offsetWidth/Height
 
1360
        // (IE < 8 fail this test)
 
1361
        support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
 
1362
        div.innerHTML = "";
 
1363
 
 
1364
        // Check if div with explicit width and no margin-right incorrectly
 
1365
        // gets computed margin-right based on width of container. For more
 
1366
        // info see bug #3333
 
1367
        // Fails in WebKit before Feb 2011 nightlies
 
1368
        // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
 
1369
        if ( document.defaultView && document.defaultView.getComputedStyle ) {
 
1370
                marginDiv = document.createElement( "div" );
 
1371
                marginDiv.style.width = "0";
 
1372
                marginDiv.style.marginRight = "0";
 
1373
                div.appendChild( marginDiv );
 
1374
                support.reliableMarginRight =
 
1375
                        ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
 
1376
        }
 
1377
 
 
1378
        // Remove the body element we added
 
1379
        testElement.innerHTML = "";
 
1380
        testElementParent.removeChild( testElement );
 
1381
 
 
1382
        // Technique from Juriy Zaytsev
 
1383
        // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
 
1384
        // We only care about the case where non-standard event systems
 
1385
        // are used, namely in IE. Short-circuiting here helps us to
 
1386
        // avoid an eval call (in setAttribute) which can cause CSP
 
1387
        // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
 
1388
        if ( div.attachEvent ) {
 
1389
                for( i in {
 
1390
                        submit: 1,
 
1391
                        change: 1,
 
1392
                        focusin: 1
 
1393
                } ) {
 
1394
                        eventName = "on" + i;
 
1395
                        isSupported = ( eventName in div );
 
1396
                        if ( !isSupported ) {
 
1397
                                div.setAttribute( eventName, "return;" );
 
1398
                                isSupported = ( typeof div[ eventName ] === "function" );
 
1399
                        }
 
1400
                        support[ i + "Bubbles" ] = isSupported;
 
1401
                }
 
1402
        }
 
1403
 
 
1404
        // Null connected elements to avoid leaks in IE
 
1405
        testElement = fragment = select = opt = body = marginDiv = div = input = null;
 
1406
 
 
1407
        return support;
 
1408
})();
 
1409
 
 
1410
// Keep track of boxModel
 
1411
jQuery.boxModel = jQuery.support.boxModel;
 
1412
 
 
1413
 
 
1414
 
 
1415
 
 
1416
var rbrace = /^(?:\{.*\}|\[.*\])$/,
 
1417
        rmultiDash = /([A-Z])/g;
 
1418
 
 
1419
jQuery.extend({
 
1420
        cache: {},
 
1421
 
 
1422
        // Please use with caution
 
1423
        uuid: 0,
 
1424
 
 
1425
        // Unique for each copy of jQuery on the page
 
1426
        // Non-digits removed to match rinlinejQuery
 
1427
        expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
 
1428
 
 
1429
        // The following elements throw uncatchable exceptions if you
 
1430
        // attempt to add expando properties to them.
 
1431
        noData: {
 
1432
                "embed": true,
 
1433
                // Ban all objects except for Flash (which handle expandos)
 
1434
                "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
 
1435
                "applet": true
 
1436
        },
 
1437
 
 
1438
        hasData: function( elem ) {
 
1439
                elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
 
1440
 
 
1441
                return !!elem && !isEmptyDataObject( elem );
 
1442
        },
 
1443
 
 
1444
        data: function( elem, name, data, pvt /* Internal Use Only */ ) {
 
1445
                if ( !jQuery.acceptData( elem ) ) {
 
1446
                        return;
 
1447
                }
 
1448
 
 
1449
                var thisCache, ret,
 
1450
                        internalKey = jQuery.expando,
 
1451
                        getByName = typeof name === "string",
 
1452
 
 
1453
                        // We have to handle DOM nodes and JS objects differently because IE6-7
 
1454
                        // can't GC object references properly across the DOM-JS boundary
 
1455
                        isNode = elem.nodeType,
 
1456
 
 
1457
                        // Only DOM nodes need the global jQuery cache; JS object data is
 
1458
                        // attached directly to the object so GC can occur automatically
 
1459
                        cache = isNode ? jQuery.cache : elem,
 
1460
 
 
1461
                        // Only defining an ID for JS objects if its cache already exists allows
 
1462
                        // the code to shortcut on the same path as a DOM node with no cache
 
1463
                        id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
 
1464
 
 
1465
                // Avoid doing any more work than we need to when trying to get data on an
 
1466
                // object that has no data at all
 
1467
                if ( (!id || (pvt && id && (cache[ id ] && !cache[ id ][ internalKey ]))) && getByName && data === undefined ) {
 
1468
                        return;
 
1469
                }
 
1470
 
 
1471
                if ( !id ) {
 
1472
                        // Only DOM nodes need a new unique ID for each element since their data
 
1473
                        // ends up in the global cache
 
1474
                        if ( isNode ) {
 
1475
                                elem[ jQuery.expando ] = id = ++jQuery.uuid;
 
1476
                        } else {
 
1477
                                id = jQuery.expando;
 
1478
                        }
 
1479
                }
 
1480
 
 
1481
                if ( !cache[ id ] ) {
 
1482
                        cache[ id ] = {};
 
1483
 
 
1484
                        // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
 
1485
                        // metadata on plain JS objects when the object is serialized using
 
1486
                        // JSON.stringify
 
1487
                        if ( !isNode ) {
 
1488
                                cache[ id ].toJSON = jQuery.noop;
 
1489
                        }
 
1490
                }
 
1491
 
 
1492
                // An object can be passed to jQuery.data instead of a key/value pair; this gets
 
1493
                // shallow copied over onto the existing cache
 
1494
                if ( typeof name === "object" || typeof name === "function" ) {
 
1495
                        if ( pvt ) {
 
1496
                                cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
 
1497
                        } else {
 
1498
                                cache[ id ] = jQuery.extend(cache[ id ], name);
 
1499
                        }
 
1500
                }
 
1501
 
 
1502
                thisCache = cache[ id ];
 
1503
 
 
1504
                // Internal jQuery data is stored in a separate object inside the object's data
 
1505
                // cache in order to avoid key collisions between internal data and user-defined
 
1506
                // data
 
1507
                if ( pvt ) {
 
1508
                        if ( !thisCache[ internalKey ] ) {
 
1509
                                thisCache[ internalKey ] = {};
 
1510
                        }
 
1511
 
 
1512
                        thisCache = thisCache[ internalKey ];
 
1513
                }
 
1514
 
 
1515
                if ( data !== undefined ) {
 
1516
                        thisCache[ jQuery.camelCase( name ) ] = data;
 
1517
                }
 
1518
 
 
1519
                // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
 
1520
                // not attempt to inspect the internal events object using jQuery.data, as this
 
1521
                // internal data object is undocumented and subject to change.
 
1522
                if ( name === "events" && !thisCache[name] ) {
 
1523
                        return thisCache[ internalKey ] && thisCache[ internalKey ].events;
 
1524
                }
 
1525
 
 
1526
                // Check for both converted-to-camel and non-converted data property names
 
1527
                // If a data property was specified
 
1528
                if ( getByName ) {
 
1529
 
 
1530
                        // First Try to find as-is property data
 
1531
                        ret = thisCache[ name ];
 
1532
 
 
1533
                        // Test for null|undefined property data
 
1534
                        if ( ret == null ) {
 
1535
 
 
1536
                                // Try to find the camelCased property
 
1537
                                ret = thisCache[ jQuery.camelCase( name ) ];
 
1538
                        }
 
1539
                } else {
 
1540
                        ret = thisCache;
 
1541
                }
 
1542
 
 
1543
                return ret;
 
1544
        },
 
1545
 
 
1546
        removeData: function( elem, name, pvt /* Internal Use Only */ ) {
 
1547
                if ( !jQuery.acceptData( elem ) ) {
 
1548
                        return;
 
1549
                }
 
1550
 
 
1551
                var thisCache,
 
1552
 
 
1553
                        // Reference to internal data cache key
 
1554
                        internalKey = jQuery.expando,
 
1555
 
 
1556
                        isNode = elem.nodeType,
 
1557
 
 
1558
                        // See jQuery.data for more information
 
1559
                        cache = isNode ? jQuery.cache : elem,
 
1560
 
 
1561
                        // See jQuery.data for more information
 
1562
                        id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
 
1563
 
 
1564
                // If there is already no cache entry for this object, there is no
 
1565
                // purpose in continuing
 
1566
                if ( !cache[ id ] ) {
 
1567
                        return;
 
1568
                }
 
1569
 
 
1570
                if ( name ) {
 
1571
 
 
1572
                        thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
 
1573
 
 
1574
                        if ( thisCache ) {
 
1575
 
 
1576
                                // Support interoperable removal of hyphenated or camelcased keys
 
1577
                                if ( !thisCache[ name ] ) {
 
1578
                                        name = jQuery.camelCase( name );
 
1579
                                }
 
1580
 
 
1581
                                delete thisCache[ name ];
 
1582
 
 
1583
                                // If there is no data left in the cache, we want to continue
 
1584
                                // and let the cache object itself get destroyed
 
1585
                                if ( !isEmptyDataObject(thisCache) ) {
 
1586
                                        return;
 
1587
                                }
 
1588
                        }
 
1589
                }
 
1590
 
 
1591
                // See jQuery.data for more information
 
1592
                if ( pvt ) {
 
1593
                        delete cache[ id ][ internalKey ];
 
1594
 
 
1595
                        // Don't destroy the parent cache unless the internal data object
 
1596
                        // had been the only thing left in it
 
1597
                        if ( !isEmptyDataObject(cache[ id ]) ) {
 
1598
                                return;
 
1599
                        }
 
1600
                }
 
1601
 
 
1602
                var internalCache = cache[ id ][ internalKey ];
 
1603
 
 
1604
                // Browsers that fail expando deletion also refuse to delete expandos on
 
1605
                // the window, but it will allow it on all other JS objects; other browsers
 
1606
                // don't care
 
1607
                // Ensure that `cache` is not a window object #10080
 
1608
                if ( jQuery.support.deleteExpando || !cache.setInterval ) {
 
1609
                        delete cache[ id ];
 
1610
                } else {
 
1611
                        cache[ id ] = null;
 
1612
                }
 
1613
 
 
1614
                // We destroyed the entire user cache at once because it's faster than
 
1615
                // iterating through each key, but we need to continue to persist internal
 
1616
                // data if it existed
 
1617
                if ( internalCache ) {
 
1618
                        cache[ id ] = {};
 
1619
                        // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
 
1620
                        // metadata on plain JS objects when the object is serialized using
 
1621
                        // JSON.stringify
 
1622
                        if ( !isNode ) {
 
1623
                                cache[ id ].toJSON = jQuery.noop;
 
1624
                        }
 
1625
 
 
1626
                        cache[ id ][ internalKey ] = internalCache;
 
1627
 
 
1628
                // Otherwise, we need to eliminate the expando on the node to avoid
 
1629
                // false lookups in the cache for entries that no longer exist
 
1630
                } else if ( isNode ) {
 
1631
                        // IE does not allow us to delete expando properties from nodes,
 
1632
                        // nor does it have a removeAttribute function on Document nodes;
 
1633
                        // we must handle all of these cases
 
1634
                        if ( jQuery.support.deleteExpando ) {
 
1635
                                delete elem[ jQuery.expando ];
 
1636
                        } else if ( elem.removeAttribute ) {
 
1637
                                elem.removeAttribute( jQuery.expando );
 
1638
                        } else {
 
1639
                                elem[ jQuery.expando ] = null;
 
1640
                        }
 
1641
                }
 
1642
        },
 
1643
 
 
1644
        // For internal use only.
 
1645
        _data: function( elem, name, data ) {
 
1646
                return jQuery.data( elem, name, data, true );
 
1647
        },
 
1648
 
 
1649
        // A method for determining if a DOM node can handle the data expando
 
1650
        acceptData: function( elem ) {
 
1651
                if ( elem.nodeName ) {
 
1652
                        var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
 
1653
 
 
1654
                        if ( match ) {
 
1655
                                return !(match === true || elem.getAttribute("classid") !== match);
 
1656
                        }
 
1657
                }
 
1658
 
 
1659
                return true;
 
1660
        }
 
1661
});
 
1662
 
 
1663
jQuery.fn.extend({
 
1664
        data: function( key, value ) {
 
1665
                var data = null;
 
1666
 
 
1667
                if ( typeof key === "undefined" ) {
 
1668
                        if ( this.length ) {
 
1669
                                data = jQuery.data( this[0] );
 
1670
 
 
1671
                                if ( this[0].nodeType === 1 ) {
 
1672
                            var attr = this[0].attributes, name;
 
1673
                                        for ( var i = 0, l = attr.length; i < l; i++ ) {
 
1674
                                                name = attr[i].name;
 
1675
 
 
1676
                                                if ( name.indexOf( "data-" ) === 0 ) {
 
1677
                                                        name = jQuery.camelCase( name.substring(5) );
 
1678
 
 
1679
                                                        dataAttr( this[0], name, data[ name ] );
 
1680
                                                }
 
1681
                                        }
 
1682
                                }
 
1683
                        }
 
1684
 
 
1685
                        return data;
 
1686
 
 
1687
                } else if ( typeof key === "object" ) {
 
1688
                        return this.each(function() {
 
1689
                                jQuery.data( this, key );
 
1690
                        });
 
1691
                }
 
1692
 
 
1693
                var parts = key.split(".");
 
1694
                parts[1] = parts[1] ? "." + parts[1] : "";
 
1695
 
 
1696
                if ( value === undefined ) {
 
1697
                        data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
 
1698
 
 
1699
                        // Try to fetch any internally stored data first
 
1700
                        if ( data === undefined && this.length ) {
 
1701
                                data = jQuery.data( this[0], key );
 
1702
                                data = dataAttr( this[0], key, data );
 
1703
                        }
 
1704
 
 
1705
                        return data === undefined && parts[1] ?
 
1706
                                this.data( parts[0] ) :
 
1707
                                data;
 
1708
 
 
1709
                } else {
 
1710
                        return this.each(function() {
 
1711
                                var $this = jQuery( this ),
 
1712
                                        args = [ parts[0], value ];
 
1713
 
 
1714
                                $this.triggerHandler( "setData" + parts[1] + "!", args );
 
1715
                                jQuery.data( this, key, value );
 
1716
                                $this.triggerHandler( "changeData" + parts[1] + "!", args );
 
1717
                        });
 
1718
                }
 
1719
        },
 
1720
 
 
1721
        removeData: function( key ) {
 
1722
                return this.each(function() {
 
1723
                        jQuery.removeData( this, key );
 
1724
                });
 
1725
        }
 
1726
});
 
1727
 
 
1728
function dataAttr( elem, key, data ) {
 
1729
        // If nothing was found internally, try to fetch any
 
1730
        // data from the HTML5 data-* attribute
 
1731
        if ( data === undefined && elem.nodeType === 1 ) {
 
1732
 
 
1733
                var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
 
1734
 
 
1735
                data = elem.getAttribute( name );
 
1736
 
 
1737
                if ( typeof data === "string" ) {
 
1738
                        try {
 
1739
                                data = data === "true" ? true :
 
1740
                                data === "false" ? false :
 
1741
                                data === "null" ? null :
 
1742
                                !jQuery.isNaN( data ) ? parseFloat( data ) :
 
1743
                                        rbrace.test( data ) ? jQuery.parseJSON( data ) :
 
1744
                                        data;
 
1745
                        } catch( e ) {}
 
1746
 
 
1747
                        // Make sure we set the data so it isn't changed later
 
1748
                        jQuery.data( elem, key, data );
 
1749
 
 
1750
                } else {
 
1751
                        data = undefined;
 
1752
                }
 
1753
        }
 
1754
 
 
1755
        return data;
 
1756
}
 
1757
 
 
1758
// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
 
1759
// property to be considered empty objects; this property always exists in
 
1760
// order to make sure JSON.stringify does not expose internal metadata
 
1761
function isEmptyDataObject( obj ) {
 
1762
        for ( var name in obj ) {
 
1763
                if ( name !== "toJSON" ) {
 
1764
                        return false;
 
1765
                }
 
1766
        }
 
1767
 
 
1768
        return true;
 
1769
}
 
1770
 
 
1771
 
 
1772
 
 
1773
 
 
1774
function handleQueueMarkDefer( elem, type, src ) {
 
1775
        var deferDataKey = type + "defer",
 
1776
                queueDataKey = type + "queue",
 
1777
                markDataKey = type + "mark",
 
1778
                defer = jQuery.data( elem, deferDataKey, undefined, true );
 
1779
        if ( defer &&
 
1780
                ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) &&
 
1781
                ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) {
 
1782
                // Give room for hard-coded callbacks to fire first
 
1783
                // and eventually mark/queue something else on the element
 
1784
                setTimeout( function() {
 
1785
                        if ( !jQuery.data( elem, queueDataKey, undefined, true ) &&
 
1786
                                !jQuery.data( elem, markDataKey, undefined, true ) ) {
 
1787
                                jQuery.removeData( elem, deferDataKey, true );
 
1788
                                defer.resolve();
 
1789
                        }
 
1790
                }, 0 );
 
1791
        }
 
1792
}
 
1793
 
 
1794
jQuery.extend({
 
1795
 
 
1796
        _mark: function( elem, type ) {
 
1797
                if ( elem ) {
 
1798
                        type = (type || "fx") + "mark";
 
1799
                        jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true );
 
1800
                }
 
1801
        },
 
1802
 
 
1803
        _unmark: function( force, elem, type ) {
 
1804
                if ( force !== true ) {
 
1805
                        type = elem;
 
1806
                        elem = force;
 
1807
                        force = false;
 
1808
                }
 
1809
                if ( elem ) {
 
1810
                        type = type || "fx";
 
1811
                        var key = type + "mark",
 
1812
                                count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 );
 
1813
                        if ( count ) {
 
1814
                                jQuery.data( elem, key, count, true );
 
1815
                        } else {
 
1816
                                jQuery.removeData( elem, key, true );
 
1817
                                handleQueueMarkDefer( elem, type, "mark" );
 
1818
                        }
 
1819
                }
 
1820
        },
 
1821
 
 
1822
        queue: function( elem, type, data ) {
 
1823
                if ( elem ) {
 
1824
                        type = (type || "fx") + "queue";
 
1825
                        var q = jQuery.data( elem, type, undefined, true );
 
1826
                        // Speed up dequeue by getting out quickly if this is just a lookup
 
1827
                        if ( data ) {
 
1828
                                if ( !q || jQuery.isArray(data) ) {
 
1829
                                        q = jQuery.data( elem, type, jQuery.makeArray(data), true );
 
1830
                                } else {
 
1831
                                        q.push( data );
 
1832
                                }
 
1833
                        }
 
1834
                        return q || [];
 
1835
                }
 
1836
        },
 
1837
 
 
1838
        dequeue: function( elem, type ) {
 
1839
                type = type || "fx";
 
1840
 
 
1841
                var queue = jQuery.queue( elem, type ),
 
1842
                        fn = queue.shift(),
 
1843
                        defer;
 
1844
 
 
1845
                // If the fx queue is dequeued, always remove the progress sentinel
 
1846
                if ( fn === "inprogress" ) {
 
1847
                        fn = queue.shift();
 
1848
                }
 
1849
 
 
1850
                if ( fn ) {
 
1851
                        // Add a progress sentinel to prevent the fx queue from being
 
1852
                        // automatically dequeued
 
1853
                        if ( type === "fx" ) {
 
1854
                                queue.unshift("inprogress");
 
1855
                        }
 
1856
 
 
1857
                        fn.call(elem, function() {
 
1858
                                jQuery.dequeue(elem, type);
 
1859
                        });
 
1860
                }
 
1861
 
 
1862
                if ( !queue.length ) {
 
1863
                        jQuery.removeData( elem, type + "queue", true );
 
1864
                        handleQueueMarkDefer( elem, type, "queue" );
 
1865
                }
 
1866
        }
 
1867
});
 
1868
 
 
1869
jQuery.fn.extend({
 
1870
        queue: function( type, data ) {
 
1871
                if ( typeof type !== "string" ) {
 
1872
                        data = type;
 
1873
                        type = "fx";
 
1874
                }
 
1875
 
 
1876
                if ( data === undefined ) {
 
1877
                        return jQuery.queue( this[0], type );
 
1878
                }
 
1879
                return this.each(function() {
 
1880
                        var queue = jQuery.queue( this, type, data );
 
1881
 
 
1882
                        if ( type === "fx" && queue[0] !== "inprogress" ) {
 
1883
                                jQuery.dequeue( this, type );
 
1884
                        }
 
1885
                });
 
1886
        },
 
1887
        dequeue: function( type ) {
 
1888
                return this.each(function() {
 
1889
                        jQuery.dequeue( this, type );
 
1890
                });
 
1891
        },
 
1892
        // Based off of the plugin by Clint Helfers, with permission.
 
1893
        // http://blindsignals.com/index.php/2009/07/jquery-delay/
 
1894
        delay: function( time, type ) {
 
1895
                time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
 
1896
                type = type || "fx";
 
1897
 
 
1898
                return this.queue( type, function() {
 
1899
                        var elem = this;
 
1900
                        setTimeout(function() {
 
1901
                                jQuery.dequeue( elem, type );
 
1902
                        }, time );
 
1903
                });
 
1904
        },
 
1905
        clearQueue: function( type ) {
 
1906
                return this.queue( type || "fx", [] );
 
1907
        },
 
1908
        // Get a promise resolved when queues of a certain type
 
1909
        // are emptied (fx is the type by default)
 
1910
        promise: function( type, object ) {
 
1911
                if ( typeof type !== "string" ) {
 
1912
                        object = type;
 
1913
                        type = undefined;
 
1914
                }
 
1915
                type = type || "fx";
 
1916
                var defer = jQuery.Deferred(),
 
1917
                        elements = this,
 
1918
                        i = elements.length,
 
1919
                        count = 1,
 
1920
                        deferDataKey = type + "defer",
 
1921
                        queueDataKey = type + "queue",
 
1922
                        markDataKey = type + "mark",
 
1923
                        tmp;
 
1924
                function resolve() {
 
1925
                        if ( !( --count ) ) {
 
1926
                                defer.resolveWith( elements, [ elements ] );
 
1927
                        }
 
1928
                }
 
1929
                while( i-- ) {
 
1930
                        if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
 
1931
                                        ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
 
1932
                                                jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
 
1933
                                        jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) {
 
1934
                                count++;
 
1935
                                tmp.done( resolve );
 
1936
                        }
 
1937
                }
 
1938
                resolve();
 
1939
                return defer.promise();
 
1940
        }
 
1941
});
 
1942
 
 
1943
 
 
1944
 
 
1945
 
 
1946
var rclass = /[\n\t\r]/g,
 
1947
        rspace = /\s+/,
 
1948
        rreturn = /\r/g,
 
1949
        rtype = /^(?:button|input)$/i,
 
1950
        rfocusable = /^(?:button|input|object|select|textarea)$/i,
 
1951
        rclickable = /^a(?:rea)?$/i,
 
1952
        rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
 
1953
        nodeHook, boolHook;
 
1954
 
 
1955
jQuery.fn.extend({
 
1956
        attr: function( name, value ) {
 
1957
                return jQuery.access( this, name, value, true, jQuery.attr );
 
1958
        },
 
1959
 
 
1960
        removeAttr: function( name ) {
 
1961
                return this.each(function() {
 
1962
                        jQuery.removeAttr( this, name );
 
1963
                });
 
1964
        },
 
1965
        
 
1966
        prop: function( name, value ) {
 
1967
                return jQuery.access( this, name, value, true, jQuery.prop );
 
1968
        },
 
1969
        
 
1970
        removeProp: function( name ) {
 
1971
                name = jQuery.propFix[ name ] || name;
 
1972
                return this.each(function() {
 
1973
                        // try/catch handles cases where IE balks (such as removing a property on window)
 
1974
                        try {
 
1975
                                this[ name ] = undefined;
 
1976
                                delete this[ name ];
 
1977
                        } catch( e ) {}
 
1978
                });
 
1979
        },
 
1980
 
 
1981
        addClass: function( value ) {
 
1982
                var classNames, i, l, elem,
 
1983
                        setClass, c, cl;
 
1984
 
 
1985
                if ( jQuery.isFunction( value ) ) {
 
1986
                        return this.each(function( j ) {
 
1987
                                jQuery( this ).addClass( value.call(this, j, this.className) );
 
1988
                        });
 
1989
                }
 
1990
 
 
1991
                if ( value && typeof value === "string" ) {
 
1992
                        classNames = value.split( rspace );
 
1993
 
 
1994
                        for ( i = 0, l = this.length; i < l; i++ ) {
 
1995
                                elem = this[ i ];
 
1996
 
 
1997
                                if ( elem.nodeType === 1 ) {
 
1998
                                        if ( !elem.className && classNames.length === 1 ) {
 
1999
                                                elem.className = value;
 
2000
 
 
2001
                                        } else {
 
2002
                                                setClass = " " + elem.className + " ";
 
2003
 
 
2004
                                                for ( c = 0, cl = classNames.length; c < cl; c++ ) {
 
2005
                                                        if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
 
2006
                                                                setClass += classNames[ c ] + " ";
 
2007
                                                        }
 
2008
                                                }
 
2009
                                                elem.className = jQuery.trim( setClass );
 
2010
                                        }
 
2011
                                }
 
2012
                        }
 
2013
                }
 
2014
 
 
2015
                return this;
 
2016
        },
 
2017
 
 
2018
        removeClass: function( value ) {
 
2019
                var classNames, i, l, elem, className, c, cl;
 
2020
 
 
2021
                if ( jQuery.isFunction( value ) ) {
 
2022
                        return this.each(function( j ) {
 
2023
                                jQuery( this ).removeClass( value.call(this, j, this.className) );
 
2024
                        });
 
2025
                }
 
2026
 
 
2027
                if ( (value && typeof value === "string") || value === undefined ) {
 
2028
                        classNames = (value || "").split( rspace );
 
2029
 
 
2030
                        for ( i = 0, l = this.length; i < l; i++ ) {
 
2031
                                elem = this[ i ];
 
2032
 
 
2033
                                if ( elem.nodeType === 1 && elem.className ) {
 
2034
                                        if ( value ) {
 
2035
                                                className = (" " + elem.className + " ").replace( rclass, " " );
 
2036
                                                for ( c = 0, cl = classNames.length; c < cl; c++ ) {
 
2037
                                                        className = className.replace(" " + classNames[ c ] + " ", " ");
 
2038
                                                }
 
2039
                                                elem.className = jQuery.trim( className );
 
2040
 
 
2041
                                        } else {
 
2042
                                                elem.className = "";
 
2043
                                        }
 
2044
                                }
 
2045
                        }
 
2046
                }
 
2047
 
 
2048
                return this;
 
2049
        },
 
2050
 
 
2051
        toggleClass: function( value, stateVal ) {
 
2052
                var type = typeof value,
 
2053
                        isBool = typeof stateVal === "boolean";
 
2054
 
 
2055
                if ( jQuery.isFunction( value ) ) {
 
2056
                        return this.each(function( i ) {
 
2057
                                jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
 
2058
                        });
 
2059
                }
 
2060
 
 
2061
                return this.each(function() {
 
2062
                        if ( type === "string" ) {
 
2063
                                // toggle individual class names
 
2064
                                var className,
 
2065
                                        i = 0,
 
2066
                                        self = jQuery( this ),
 
2067
                                        state = stateVal,
 
2068
                                        classNames = value.split( rspace );
 
2069
 
 
2070
                                while ( (className = classNames[ i++ ]) ) {
 
2071
                                        // check each className given, space seperated list
 
2072
                                        state = isBool ? state : !self.hasClass( className );
 
2073
                                        self[ state ? "addClass" : "removeClass" ]( className );
 
2074
                                }
 
2075
 
 
2076
                        } else if ( type === "undefined" || type === "boolean" ) {
 
2077
                                if ( this.className ) {
 
2078
                                        // store className if set
 
2079
                                        jQuery._data( this, "__className__", this.className );
 
2080
                                }
 
2081
 
 
2082
                                // toggle whole className
 
2083
                                this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
 
2084
                        }
 
2085
                });
 
2086
        },
 
2087
 
 
2088
        hasClass: function( selector ) {
 
2089
                var className = " " + selector + " ";
 
2090
                for ( var i = 0, l = this.length; i < l; i++ ) {
 
2091
                        if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
 
2092
                                return true;
 
2093
                        }
 
2094
                }
 
2095
 
 
2096
                return false;
 
2097
        },
 
2098
 
 
2099
        val: function( value ) {
 
2100
                var hooks, ret,
 
2101
                        elem = this[0];
 
2102
                
 
2103
                if ( !arguments.length ) {
 
2104
                        if ( elem ) {
 
2105
                                hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
 
2106
 
 
2107
                                if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
 
2108
                                        return ret;
 
2109
                                }
 
2110
 
 
2111
                                ret = elem.value;
 
2112
 
 
2113
                                return typeof ret === "string" ? 
 
2114
                                        // handle most common string cases
 
2115
                                        ret.replace(rreturn, "") : 
 
2116
                                        // handle cases where value is null/undef or number
 
2117
                                        ret == null ? "" : ret;
 
2118
                        }
 
2119
 
 
2120
                        return undefined;
 
2121
                }
 
2122
 
 
2123
                var isFunction = jQuery.isFunction( value );
 
2124
 
 
2125
                return this.each(function( i ) {
 
2126
                        var self = jQuery(this), val;
 
2127
 
 
2128
                        if ( this.nodeType !== 1 ) {
 
2129
                                return;
 
2130
                        }
 
2131
 
 
2132
                        if ( isFunction ) {
 
2133
                                val = value.call( this, i, self.val() );
 
2134
                        } else {
 
2135
                                val = value;
 
2136
                        }
 
2137
 
 
2138
                        // Treat null/undefined as ""; convert numbers to string
 
2139
                        if ( val == null ) {
 
2140
                                val = "";
 
2141
                        } else if ( typeof val === "number" ) {
 
2142
                                val += "";
 
2143
                        } else if ( jQuery.isArray( val ) ) {
 
2144
                                val = jQuery.map(val, function ( value ) {
 
2145
                                        return value == null ? "" : value + "";
 
2146
                                });
 
2147
                        }
 
2148
 
 
2149
                        hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
 
2150
 
 
2151
                        // If set returns undefined, fall back to normal setting
 
2152
                        if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
 
2153
                                this.value = val;
 
2154
                        }
 
2155
                });
 
2156
        }
 
2157
});
 
2158
 
 
2159
jQuery.extend({
 
2160
        valHooks: {
 
2161
                option: {
 
2162
                        get: function( elem ) {
 
2163
                                // attributes.value is undefined in Blackberry 4.7 but
 
2164
                                // uses .value. See #6932
 
2165
                                var val = elem.attributes.value;
 
2166
                                return !val || val.specified ? elem.value : elem.text;
 
2167
                        }
 
2168
                },
 
2169
                select: {
 
2170
                        get: function( elem ) {
 
2171
                                var value,
 
2172
                                        index = elem.selectedIndex,
 
2173
                                        values = [],
 
2174
                                        options = elem.options,
 
2175
                                        one = elem.type === "select-one";
 
2176
 
 
2177
                                // Nothing was selected
 
2178
                                if ( index < 0 ) {
 
2179
                                        return null;
 
2180
                                }
 
2181
 
 
2182
                                // Loop through all the selected options
 
2183
                                for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
 
2184
                                        var option = options[ i ];
 
2185
 
 
2186
                                        // Don't return options that are disabled or in a disabled optgroup
 
2187
                                        if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
 
2188
                                                        (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
 
2189
 
 
2190
                                                // Get the specific value for the option
 
2191
                                                value = jQuery( option ).val();
 
2192
 
 
2193
                                                // We don't need an array for one selects
 
2194
                                                if ( one ) {
 
2195
                                                        return value;
 
2196
                                                }
 
2197
 
 
2198
                                                // Multi-Selects return an array
 
2199
                                                values.push( value );
 
2200
                                        }
 
2201
                                }
 
2202
 
 
2203
                                // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
 
2204
                                if ( one && !values.length && options.length ) {
 
2205
                                        return jQuery( options[ index ] ).val();
 
2206
                                }
 
2207
 
 
2208
                                return values;
 
2209
                        },
 
2210
 
 
2211
                        set: function( elem, value ) {
 
2212
                                var values = jQuery.makeArray( value );
 
2213
 
 
2214
                                jQuery(elem).find("option").each(function() {
 
2215
                                        this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
 
2216
                                });
 
2217
 
 
2218
                                if ( !values.length ) {
 
2219
                                        elem.selectedIndex = -1;
 
2220
                                }
 
2221
                                return values;
 
2222
                        }
 
2223
                }
 
2224
        },
 
2225
 
 
2226
        attrFn: {
 
2227
                val: true,
 
2228
                css: true,
 
2229
                html: true,
 
2230
                text: true,
 
2231
                data: true,
 
2232
                width: true,
 
2233
                height: true,
 
2234
                offset: true
 
2235
        },
 
2236
        
 
2237
        attrFix: {
 
2238
                // Always normalize to ensure hook usage
 
2239
                tabindex: "tabIndex"
 
2240
        },
 
2241
        
 
2242
        attr: function( elem, name, value, pass ) {
 
2243
                var nType = elem.nodeType;
 
2244
                
 
2245
                // don't get/set attributes on text, comment and attribute nodes
 
2246
                if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
 
2247
                        return undefined;
 
2248
                }
 
2249
 
 
2250
                if ( pass && name in jQuery.attrFn ) {
 
2251
                        return jQuery( elem )[ name ]( value );
 
2252
                }
 
2253
 
 
2254
                // Fallback to prop when attributes are not supported
 
2255
                if ( !("getAttribute" in elem) ) {
 
2256
                        return jQuery.prop( elem, name, value );
 
2257
                }
 
2258
 
 
2259
                var ret, hooks,
 
2260
                        notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
 
2261
 
 
2262
                // Normalize the name if needed
 
2263
                if ( notxml ) {
 
2264
                        name = jQuery.attrFix[ name ] || name;
 
2265
 
 
2266
                        hooks = jQuery.attrHooks[ name ];
 
2267
 
 
2268
                        if ( !hooks ) {
 
2269
                                // Use boolHook for boolean attributes
 
2270
                                if ( rboolean.test( name ) ) {
 
2271
                                        hooks = boolHook;
 
2272
 
 
2273
                                // Use nodeHook if available( IE6/7 )
 
2274
                                } else if ( nodeHook ) {
 
2275
                                        hooks = nodeHook;
 
2276
                                }
 
2277
                        }
 
2278
                }
 
2279
 
 
2280
                if ( value !== undefined ) {
 
2281
 
 
2282
                        if ( value === null ) {
 
2283
                                jQuery.removeAttr( elem, name );
 
2284
                                return undefined;
 
2285
 
 
2286
                        } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
 
2287
                                return ret;
 
2288
 
 
2289
                        } else {
 
2290
                                elem.setAttribute( name, "" + value );
 
2291
                                return value;
 
2292
                        }
 
2293
 
 
2294
                } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
 
2295
                        return ret;
 
2296
 
 
2297
                } else {
 
2298
 
 
2299
                        ret = elem.getAttribute( name );
 
2300
 
 
2301
                        // Non-existent attributes return null, we normalize to undefined
 
2302
                        return ret === null ?
 
2303
                                undefined :
 
2304
                                ret;
 
2305
                }
 
2306
        },
 
2307
 
 
2308
        removeAttr: function( elem, name ) {
 
2309
                var propName;
 
2310
                if ( elem.nodeType === 1 ) {
 
2311
                        name = jQuery.attrFix[ name ] || name;
 
2312
 
 
2313
                        jQuery.attr( elem, name, "" );
 
2314
                        elem.removeAttribute( name );
 
2315
 
 
2316
                        // Set corresponding property to false for boolean attributes
 
2317
                        if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) {
 
2318
                                elem[ propName ] = false;
 
2319
                        }
 
2320
                }
 
2321
        },
 
2322
 
 
2323
        attrHooks: {
 
2324
                type: {
 
2325
                        set: function( elem, value ) {
 
2326
                                // We can't allow the type property to be changed (since it causes problems in IE)
 
2327
                                if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
 
2328
                                        jQuery.error( "type property can't be changed" );
 
2329
                                } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
 
2330
                                        // Setting the type on a radio button after the value resets the value in IE6-9
 
2331
                                        // Reset value to it's default in case type is set after value
 
2332
                                        // This is for element creation
 
2333
                                        var val = elem.value;
 
2334
                                        elem.setAttribute( "type", value );
 
2335
                                        if ( val ) {
 
2336
                                                elem.value = val;
 
2337
                                        }
 
2338
                                        return value;
 
2339
                                }
 
2340
                        }
 
2341
                },
 
2342
                // Use the value property for back compat
 
2343
                // Use the nodeHook for button elements in IE6/7 (#1954)
 
2344
                value: {
 
2345
                        get: function( elem, name ) {
 
2346
                                if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
 
2347
                                        return nodeHook.get( elem, name );
 
2348
                                }
 
2349
                                return name in elem ?
 
2350
                                        elem.value :
 
2351
                                        null;
 
2352
                        },
 
2353
                        set: function( elem, value, name ) {
 
2354
                                if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
 
2355
                                        return nodeHook.set( elem, value, name );
 
2356
                                }
 
2357
                                // Does not return so that setAttribute is also used
 
2358
                                elem.value = value;
 
2359
                        }
 
2360
                }
 
2361
        },
 
2362
 
 
2363
        propFix: {
 
2364
                tabindex: "tabIndex",
 
2365
                readonly: "readOnly",
 
2366
                "for": "htmlFor",
 
2367
                "class": "className",
 
2368
                maxlength: "maxLength",
 
2369
                cellspacing: "cellSpacing",
 
2370
                cellpadding: "cellPadding",
 
2371
                rowspan: "rowSpan",
 
2372
                colspan: "colSpan",
 
2373
                usemap: "useMap",
 
2374
                frameborder: "frameBorder",
 
2375
                contenteditable: "contentEditable"
 
2376
        },
 
2377
        
 
2378
        prop: function( elem, name, value ) {
 
2379
                var nType = elem.nodeType;
 
2380
 
 
2381
                // don't get/set properties on text, comment and attribute nodes
 
2382
                if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
 
2383
                        return undefined;
 
2384
                }
 
2385
 
 
2386
                var ret, hooks,
 
2387
                        notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
 
2388
 
 
2389
                if ( notxml ) {
 
2390
                        // Fix name and attach hooks
 
2391
                        name = jQuery.propFix[ name ] || name;
 
2392
                        hooks = jQuery.propHooks[ name ];
 
2393
                }
 
2394
 
 
2395
                if ( value !== undefined ) {
 
2396
                        if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
 
2397
                                return ret;
 
2398
 
 
2399
                        } else {
 
2400
                                return (elem[ name ] = value);
 
2401
                        }
 
2402
 
 
2403
                } else {
 
2404
                        if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
 
2405
                                return ret;
 
2406
 
 
2407
                        } else {
 
2408
                                return elem[ name ];
 
2409
                        }
 
2410
                }
 
2411
        },
 
2412
        
 
2413
        propHooks: {
 
2414
                tabIndex: {
 
2415
                        get: function( elem ) {
 
2416
                                // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
 
2417
                                // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
 
2418
                                var attributeNode = elem.getAttributeNode("tabindex");
 
2419
 
 
2420
                                return attributeNode && attributeNode.specified ?
 
2421
                                        parseInt( attributeNode.value, 10 ) :
 
2422
                                        rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
 
2423
                                                0 :
 
2424
                                                undefined;
 
2425
                        }
 
2426
                }
 
2427
        }
 
2428
});
 
2429
 
 
2430
// Add the tabindex propHook to attrHooks for back-compat
 
2431
jQuery.attrHooks.tabIndex = jQuery.propHooks.tabIndex;
 
2432
 
 
2433
// Hook for boolean attributes
 
2434
boolHook = {
 
2435
        get: function( elem, name ) {
 
2436
                // Align boolean attributes with corresponding properties
 
2437
                // Fall back to attribute presence where some booleans are not supported
 
2438
                var attrNode;
 
2439
                return jQuery.prop( elem, name ) === true || ( attrNode = elem.getAttributeNode( name ) ) && attrNode.nodeValue !== false ?
 
2440
                        name.toLowerCase() :
 
2441
                        undefined;
 
2442
        },
 
2443
        set: function( elem, value, name ) {
 
2444
                var propName;
 
2445
                if ( value === false ) {
 
2446
                        // Remove boolean attributes when set to false
 
2447
                        jQuery.removeAttr( elem, name );
 
2448
                } else {
 
2449
                        // value is true since we know at this point it's type boolean and not false
 
2450
                        // Set boolean attributes to the same name and set the DOM property
 
2451
                        propName = jQuery.propFix[ name ] || name;
 
2452
                        if ( propName in elem ) {
 
2453
                                // Only set the IDL specifically if it already exists on the element
 
2454
                                elem[ propName ] = true;
 
2455
                        }
 
2456
 
 
2457
                        elem.setAttribute( name, name.toLowerCase() );
 
2458
                }
 
2459
                return name;
 
2460
        }
 
2461
};
 
2462
 
 
2463
// IE6/7 do not support getting/setting some attributes with get/setAttribute
 
2464
if ( !jQuery.support.getSetAttribute ) {
 
2465
        
 
2466
        // Use this for any attribute in IE6/7
 
2467
        // This fixes almost every IE6/7 issue
 
2468
        nodeHook = jQuery.valHooks.button = {
 
2469
                get: function( elem, name ) {
 
2470
                        var ret;
 
2471
                        ret = elem.getAttributeNode( name );
 
2472
                        // Return undefined if nodeValue is empty string
 
2473
                        return ret && ret.nodeValue !== "" ?
 
2474
                                ret.nodeValue :
 
2475
                                undefined;
 
2476
                },
 
2477
                set: function( elem, value, name ) {
 
2478
                        // Set the existing or create a new attribute node
 
2479
                        var ret = elem.getAttributeNode( name );
 
2480
                        if ( !ret ) {
 
2481
                                ret = document.createAttribute( name );
 
2482
                                elem.setAttributeNode( ret );
 
2483
                        }
 
2484
                        return (ret.nodeValue = value + "");
 
2485
                }
 
2486
        };
 
2487
 
 
2488
        // Set width and height to auto instead of 0 on empty string( Bug #8150 )
 
2489
        // This is for removals
 
2490
        jQuery.each([ "width", "height" ], function( i, name ) {
 
2491
                jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
 
2492
                        set: function( elem, value ) {
 
2493
                                if ( value === "" ) {
 
2494
                                        elem.setAttribute( name, "auto" );
 
2495
                                        return value;
 
2496
                                }
 
2497
                        }
 
2498
                });
 
2499
        });
 
2500
}
 
2501
 
 
2502
 
 
2503
// Some attributes require a special call on IE
 
2504
if ( !jQuery.support.hrefNormalized ) {
 
2505
        jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
 
2506
                jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
 
2507
                        get: function( elem ) {
 
2508
                                var ret = elem.getAttribute( name, 2 );
 
2509
                                return ret === null ? undefined : ret;
 
2510
                        }
 
2511
                });
 
2512
        });
 
2513
}
 
2514
 
 
2515
if ( !jQuery.support.style ) {
 
2516
        jQuery.attrHooks.style = {
 
2517
                get: function( elem ) {
 
2518
                        // Return undefined in the case of empty string
 
2519
                        // Normalize to lowercase since IE uppercases css property names
 
2520
                        return elem.style.cssText.toLowerCase() || undefined;
 
2521
                },
 
2522
                set: function( elem, value ) {
 
2523
                        return (elem.style.cssText = "" + value);
 
2524
                }
 
2525
        };
 
2526
}
 
2527
 
 
2528
// Safari mis-reports the default selected property of an option
 
2529
// Accessing the parent's selectedIndex property fixes it
 
2530
if ( !jQuery.support.optSelected ) {
 
2531
        jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
 
2532
                get: function( elem ) {
 
2533
                        var parent = elem.parentNode;
 
2534
 
 
2535
                        if ( parent ) {
 
2536
                                parent.selectedIndex;
 
2537
 
 
2538
                                // Make sure that it also works with optgroups, see #5701
 
2539
                                if ( parent.parentNode ) {
 
2540
                                        parent.parentNode.selectedIndex;
 
2541
                                }
 
2542
                        }
 
2543
                        return null;
 
2544
                }
 
2545
        });
 
2546
}
 
2547
 
 
2548
// Radios and checkboxes getter/setter
 
2549
if ( !jQuery.support.checkOn ) {
 
2550
        jQuery.each([ "radio", "checkbox" ], function() {
 
2551
                jQuery.valHooks[ this ] = {
 
2552
                        get: function( elem ) {
 
2553
                                // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
 
2554
                                return elem.getAttribute("value") === null ? "on" : elem.value;
 
2555
                        }
 
2556
                };
 
2557
        });
 
2558
}
 
2559
jQuery.each([ "radio", "checkbox" ], function() {
 
2560
        jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
 
2561
                set: function( elem, value ) {
 
2562
                        if ( jQuery.isArray( value ) ) {
 
2563
                                return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0);
 
2564
                        }
 
2565
                }
 
2566
        });
 
2567
});
 
2568
 
 
2569
 
 
2570
 
 
2571
 
 
2572
var rnamespaces = /\.(.*)$/,
 
2573
        rformElems = /^(?:textarea|input|select)$/i,
 
2574
        rperiod = /\./g,
 
2575
        rspaces = / /g,
 
2576
        rescape = /[^\w\s.|`]/g,
 
2577
        fcleanup = function( nm ) {
 
2578
                return nm.replace(rescape, "\\$&");
 
2579
        };
 
2580
 
 
2581
/*
 
2582
 * A number of helper functions used for managing events.
 
2583
 * Many of the ideas behind this code originated from
 
2584
 * Dean Edwards' addEvent library.
 
2585
 */
 
2586
jQuery.event = {
 
2587
 
 
2588
        // Bind an event to an element
 
2589
        // Original by Dean Edwards
 
2590
        add: function( elem, types, handler, data ) {
 
2591
                if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
 
2592
                        return;
 
2593
                }
 
2594
 
 
2595
                if ( handler === false ) {
 
2596
                        handler = returnFalse;
 
2597
                } else if ( !handler ) {
 
2598
                        // Fixes bug #7229. Fix recommended by jdalton
 
2599
                        return;
 
2600
                }
 
2601
 
 
2602
                var handleObjIn, handleObj;
 
2603
 
 
2604
                if ( handler.handler ) {
 
2605
                        handleObjIn = handler;
 
2606
                        handler = handleObjIn.handler;
 
2607
                }
 
2608
 
 
2609
                // Make sure that the function being executed has a unique ID
 
2610
                if ( !handler.guid ) {
 
2611
                        handler.guid = jQuery.guid++;
 
2612
                }
 
2613
 
 
2614
                // Init the element's event structure
 
2615
                var elemData = jQuery._data( elem );
 
2616
 
 
2617
                // If no elemData is found then we must be trying to bind to one of the
 
2618
                // banned noData elements
 
2619
                if ( !elemData ) {
 
2620
                        return;
 
2621
                }
 
2622
 
 
2623
                var events = elemData.events,
 
2624
                        eventHandle = elemData.handle;
 
2625
 
 
2626
                if ( !events ) {
 
2627
                        elemData.events = events = {};
 
2628
                }
 
2629
 
 
2630
                if ( !eventHandle ) {
 
2631
                        elemData.handle = eventHandle = function( e ) {
 
2632
                                // Discard the second event of a jQuery.event.trigger() and
 
2633
                                // when an event is called after a page has unloaded
 
2634
                                return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
 
2635
                                        jQuery.event.handle.apply( eventHandle.elem, arguments ) :
 
2636
                                        undefined;
 
2637
                        };
 
2638
                }
 
2639
 
 
2640
                // Add elem as a property of the handle function
 
2641
                // This is to prevent a memory leak with non-native events in IE.
 
2642
                eventHandle.elem = elem;
 
2643
 
 
2644
                // Handle multiple events separated by a space
 
2645
                // jQuery(...).bind("mouseover mouseout", fn);
 
2646
                types = types.split(" ");
 
2647
 
 
2648
                var type, i = 0, namespaces;
 
2649
 
 
2650
                while ( (type = types[ i++ ]) ) {
 
2651
                        handleObj = handleObjIn ?
 
2652
                                jQuery.extend({}, handleObjIn) :
 
2653
                                { handler: handler, data: data };
 
2654
 
 
2655
                        // Namespaced event handlers
 
2656
                        if ( type.indexOf(".") > -1 ) {
 
2657
                                namespaces = type.split(".");
 
2658
                                type = namespaces.shift();
 
2659
                                handleObj.namespace = namespaces.slice(0).sort().join(".");
 
2660
 
 
2661
                        } else {
 
2662
                                namespaces = [];
 
2663
                                handleObj.namespace = "";
 
2664
                        }
 
2665
 
 
2666
                        handleObj.type = type;
 
2667
                        if ( !handleObj.guid ) {
 
2668
                                handleObj.guid = handler.guid;
 
2669
                        }
 
2670
 
 
2671
                        // Get the current list of functions bound to this event
 
2672
                        var handlers = events[ type ],
 
2673
                                special = jQuery.event.special[ type ] || {};
 
2674
 
 
2675
                        // Init the event handler queue
 
2676
                        if ( !handlers ) {
 
2677
                                handlers = events[ type ] = [];
 
2678
 
 
2679
                                // Check for a special event handler
 
2680
                                // Only use addEventListener/attachEvent if the special
 
2681
                                // events handler returns false
 
2682
                                if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
 
2683
                                        // Bind the global event handler to the element
 
2684
                                        if ( elem.addEventListener ) {
 
2685
                                                elem.addEventListener( type, eventHandle, false );
 
2686
 
 
2687
                                        } else if ( elem.attachEvent ) {
 
2688
                                                elem.attachEvent( "on" + type, eventHandle );
 
2689
                                        }
 
2690
                                }
 
2691
                        }
 
2692
 
 
2693
                        if ( special.add ) {
 
2694
                                special.add.call( elem, handleObj );
 
2695
 
 
2696
                                if ( !handleObj.handler.guid ) {
 
2697
                                        handleObj.handler.guid = handler.guid;
 
2698
                                }
 
2699
                        }
 
2700
 
 
2701
                        // Add the function to the element's handler list
 
2702
                        handlers.push( handleObj );
 
2703
 
 
2704
                        // Keep track of which events have been used, for event optimization
 
2705
                        jQuery.event.global[ type ] = true;
 
2706
                }
 
2707
 
 
2708
                // Nullify elem to prevent memory leaks in IE
 
2709
                elem = null;
 
2710
        },
 
2711
 
 
2712
        global: {},
 
2713
 
 
2714
        // Detach an event or set of events from an element
 
2715
        remove: function( elem, types, handler, pos ) {
 
2716
                // don't do events on text and comment nodes
 
2717
                if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
 
2718
                        return;
 
2719
                }
 
2720
 
 
2721
                if ( handler === false ) {
 
2722
                        handler = returnFalse;
 
2723
                }
 
2724
 
 
2725
                var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
 
2726
                        elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
 
2727
                        events = elemData && elemData.events;
 
2728
 
 
2729
                if ( !elemData || !events ) {
 
2730
                        return;
 
2731
                }
 
2732
 
 
2733
                // types is actually an event object here
 
2734
                if ( types && types.type ) {
 
2735
                        handler = types.handler;
 
2736
                        types = types.type;
 
2737
                }
 
2738
 
 
2739
                // Unbind all events for the element
 
2740
                if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
 
2741
                        types = types || "";
 
2742
 
 
2743
                        for ( type in events ) {
 
2744
                                jQuery.event.remove( elem, type + types );
 
2745
                        }
 
2746
 
 
2747
                        return;
 
2748
                }
 
2749
 
 
2750
                // Handle multiple events separated by a space
 
2751
                // jQuery(...).unbind("mouseover mouseout", fn);
 
2752
                types = types.split(" ");
 
2753
 
 
2754
                while ( (type = types[ i++ ]) ) {
 
2755
                        origType = type;
 
2756
                        handleObj = null;
 
2757
                        all = type.indexOf(".") < 0;
 
2758
                        namespaces = [];
 
2759
 
 
2760
                        if ( !all ) {
 
2761
                                // Namespaced event handlers
 
2762
                                namespaces = type.split(".");
 
2763
                                type = namespaces.shift();
 
2764
 
 
2765
                                namespace = new RegExp("(^|\\.)" +
 
2766
                                        jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
 
2767
                        }
 
2768
 
 
2769
                        eventType = events[ type ];
 
2770
 
 
2771
                        if ( !eventType ) {
 
2772
                                continue;
 
2773
                        }
 
2774
 
 
2775
                        if ( !handler ) {
 
2776
                                for ( j = 0; j < eventType.length; j++ ) {
 
2777
                                        handleObj = eventType[ j ];
 
2778
 
 
2779
                                        if ( all || namespace.test( handleObj.namespace ) ) {
 
2780
                                                jQuery.event.remove( elem, origType, handleObj.handler, j );
 
2781
                                                eventType.splice( j--, 1 );
 
2782
                                        }
 
2783
                                }
 
2784
 
 
2785
                                continue;
 
2786
                        }
 
2787
 
 
2788
                        special = jQuery.event.special[ type ] || {};
 
2789
 
 
2790
                        for ( j = pos || 0; j < eventType.length; j++ ) {
 
2791
                                handleObj = eventType[ j ];
 
2792
 
 
2793
                                if ( handler.guid === handleObj.guid ) {
 
2794
                                        // remove the given handler for the given type
 
2795
                                        if ( all || namespace.test( handleObj.namespace ) ) {
 
2796
                                                if ( pos == null ) {
 
2797
                                                        eventType.splice( j--, 1 );
 
2798
                                                }
 
2799
 
 
2800
                                                if ( special.remove ) {
 
2801
                                                        special.remove.call( elem, handleObj );
 
2802
                                                }
 
2803
                                        }
 
2804
 
 
2805
                                        if ( pos != null ) {
 
2806
                                                break;
 
2807
                                        }
 
2808
                                }
 
2809
                        }
 
2810
 
 
2811
                        // remove generic event handler if no more handlers exist
 
2812
                        if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
 
2813
                                if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
 
2814
                                        jQuery.removeEvent( elem, type, elemData.handle );
 
2815
                                }
 
2816
 
 
2817
                                ret = null;
 
2818
                                delete events[ type ];
 
2819
                        }
 
2820
                }
 
2821
 
 
2822
                // Remove the expando if it's no longer used
 
2823
                if ( jQuery.isEmptyObject( events ) ) {
 
2824
                        var handle = elemData.handle;
 
2825
                        if ( handle ) {
 
2826
                                handle.elem = null;
 
2827
                        }
 
2828
 
 
2829
                        delete elemData.events;
 
2830
                        delete elemData.handle;
 
2831
 
 
2832
                        if ( jQuery.isEmptyObject( elemData ) ) {
 
2833
                                jQuery.removeData( elem, undefined, true );
 
2834
                        }
 
2835
                }
 
2836
        },
 
2837
        
 
2838
        // Events that are safe to short-circuit if no handlers are attached.
 
2839
        // Native DOM events should not be added, they may have inline handlers.
 
2840
        customEvent: {
 
2841
                "getData": true,
 
2842
                "setData": true,
 
2843
                "changeData": true
 
2844
        },
 
2845
 
 
2846
        trigger: function( event, data, elem, onlyHandlers ) {
 
2847
                // Event object or event type
 
2848
                var type = event.type || event,
 
2849
                        namespaces = [],
 
2850
                        exclusive;
 
2851
 
 
2852
                if ( type.indexOf("!") >= 0 ) {
 
2853
                        // Exclusive events trigger only for the exact event (no namespaces)
 
2854
                        type = type.slice(0, -1);
 
2855
                        exclusive = true;
 
2856
                }
 
2857
 
 
2858
                if ( type.indexOf(".") >= 0 ) {
 
2859
                        // Namespaced trigger; create a regexp to match event type in handle()
 
2860
                        namespaces = type.split(".");
 
2861
                        type = namespaces.shift();
 
2862
                        namespaces.sort();
 
2863
                }
 
2864
 
 
2865
                if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
 
2866
                        // No jQuery handlers for this event type, and it can't have inline handlers
 
2867
                        return;
 
2868
                }
 
2869
 
 
2870
                // Caller can pass in an Event, Object, or just an event type string
 
2871
                event = typeof event === "object" ?
 
2872
                        // jQuery.Event object
 
2873
                        event[ jQuery.expando ] ? event :
 
2874
                        // Object literal
 
2875
                        new jQuery.Event( type, event ) :
 
2876
                        // Just the event type (string)
 
2877
                        new jQuery.Event( type );
 
2878
 
 
2879
                event.type = type;
 
2880
                event.exclusive = exclusive;
 
2881
                event.namespace = namespaces.join(".");
 
2882
                event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)");
 
2883
                
 
2884
                // triggerHandler() and global events don't bubble or run the default action
 
2885
                if ( onlyHandlers || !elem ) {
 
2886
                        event.preventDefault();
 
2887
                        event.stopPropagation();
 
2888
                }
 
2889
 
 
2890
                // Handle a global trigger
 
2891
                if ( !elem ) {
 
2892
                        // TODO: Stop taunting the data cache; remove global events and always attach to document
 
2893
                        jQuery.each( jQuery.cache, function() {
 
2894
                                // internalKey variable is just used to make it easier to find
 
2895
                                // and potentially change this stuff later; currently it just
 
2896
                                // points to jQuery.expando
 
2897
                                var internalKey = jQuery.expando,
 
2898
                                        internalCache = this[ internalKey ];
 
2899
                                if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
 
2900
                                        jQuery.event.trigger( event, data, internalCache.handle.elem );
 
2901
                                }
 
2902
                        });
 
2903
                        return;
 
2904
                }
 
2905
 
 
2906
                // Don't do events on text and comment nodes
 
2907
                if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
 
2908
                        return;
 
2909
                }
 
2910
 
 
2911
                // Clean up the event in case it is being reused
 
2912
                event.result = undefined;
 
2913
                event.target = elem;
 
2914
 
 
2915
                // Clone any incoming data and prepend the event, creating the handler arg list
 
2916
                data = data != null ? jQuery.makeArray( data ) : [];
 
2917
                data.unshift( event );
 
2918
 
 
2919
                var cur = elem,
 
2920
                        // IE doesn't like method names with a colon (#3533, #8272)
 
2921
                        ontype = type.indexOf(":") < 0 ? "on" + type : "";
 
2922
 
 
2923
                // Fire event on the current element, then bubble up the DOM tree
 
2924
                do {
 
2925
                        var handle = jQuery._data( cur, "handle" );
 
2926
 
 
2927
                        event.currentTarget = cur;
 
2928
                        if ( handle ) {
 
2929
                                handle.apply( cur, data );
 
2930
                        }
 
2931
 
 
2932
                        // Trigger an inline bound script
 
2933
                        if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) {
 
2934
                                event.result = false;
 
2935
                                event.preventDefault();
 
2936
                        }
 
2937
 
 
2938
                        // Bubble up to document, then to window
 
2939
                        cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window;
 
2940
                } while ( cur && !event.isPropagationStopped() );
 
2941
 
 
2942
                // If nobody prevented the default action, do it now
 
2943
                if ( !event.isDefaultPrevented() ) {
 
2944
                        var old,
 
2945
                                special = jQuery.event.special[ type ] || {};
 
2946
 
 
2947
                        if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) &&
 
2948
                                !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
 
2949
 
 
2950
                                // Call a native DOM method on the target with the same name name as the event.
 
2951
                                // Can't use an .isFunction)() check here because IE6/7 fails that test.
 
2952
                                // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch.
 
2953
                                try {
 
2954
                                        if ( ontype && elem[ type ] ) {
 
2955
                                                // Don't re-trigger an onFOO event when we call its FOO() method
 
2956
                                                old = elem[ ontype ];
 
2957
 
 
2958
                                                if ( old ) {
 
2959
                                                        elem[ ontype ] = null;
 
2960
                                                }
 
2961
 
 
2962
                                                jQuery.event.triggered = type;
 
2963
                                                elem[ type ]();
 
2964
                                        }
 
2965
                                } catch ( ieError ) {}
 
2966
 
 
2967
                                if ( old ) {
 
2968
                                        elem[ ontype ] = old;
 
2969
                                }
 
2970
 
 
2971
                                jQuery.event.triggered = undefined;
 
2972
                        }
 
2973
                }
 
2974
                
 
2975
                return event.result;
 
2976
        },
 
2977
 
 
2978
        handle: function( event ) {
 
2979
                event = jQuery.event.fix( event || window.event );
 
2980
                // Snapshot the handlers list since a called handler may add/remove events.
 
2981
                var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0),
 
2982
                        run_all = !event.exclusive && !event.namespace,
 
2983
                        args = Array.prototype.slice.call( arguments, 0 );
 
2984
 
 
2985
                // Use the fix-ed Event rather than the (read-only) native event
 
2986
                args[0] = event;
 
2987
                event.currentTarget = this;
 
2988
 
 
2989
                for ( var j = 0, l = handlers.length; j < l; j++ ) {
 
2990
                        var handleObj = handlers[ j ];
 
2991
 
 
2992
                        // Triggered event must 1) be non-exclusive and have no namespace, or
 
2993
                        // 2) have namespace(s) a subset or equal to those in the bound event.
 
2994
                        if ( run_all || event.namespace_re.test( handleObj.namespace ) ) {
 
2995
                                // Pass in a reference to the handler function itself
 
2996
                                // So that we can later remove it
 
2997
                                event.handler = handleObj.handler;
 
2998
                                event.data = handleObj.data;
 
2999
                                event.handleObj = handleObj;
 
3000
 
 
3001
                                var ret = handleObj.handler.apply( this, args );
 
3002
 
 
3003
                                if ( ret !== undefined ) {
 
3004
                                        event.result = ret;
 
3005
                                        if ( ret === false ) {
 
3006
                                                event.preventDefault();
 
3007
                                                event.stopPropagation();
 
3008
                                        }
 
3009
                                }
 
3010
 
 
3011
                                if ( event.isImmediatePropagationStopped() ) {
 
3012
                                        break;
 
3013
                                }
 
3014
                        }
 
3015
                }
 
3016
                return event.result;
 
3017
        },
 
3018
 
 
3019
        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(" "),
 
3020
 
 
3021
        fix: function( event ) {
 
3022
                if ( event[ jQuery.expando ] ) {
 
3023
                        return event;
 
3024
                }
 
3025
 
 
3026
                // store a copy of the original event object
 
3027
                // and "clone" to set read-only properties
 
3028
                var originalEvent = event;
 
3029
                event = jQuery.Event( originalEvent );
 
3030
 
 
3031
                for ( var i = this.props.length, prop; i; ) {
 
3032
                        prop = this.props[ --i ];
 
3033
                        event[ prop ] = originalEvent[ prop ];
 
3034
                }
 
3035
 
 
3036
                // Fix target property, if necessary
 
3037
                if ( !event.target ) {
 
3038
                        // Fixes #1925 where srcElement might not be defined either
 
3039
                        event.target = event.srcElement || document;
 
3040
                }
 
3041
 
 
3042
                // check if target is a textnode (safari)
 
3043
                if ( event.target.nodeType === 3 ) {
 
3044
                        event.target = event.target.parentNode;
 
3045
                }
 
3046
 
 
3047
                // Add relatedTarget, if necessary
 
3048
                if ( !event.relatedTarget && event.fromElement ) {
 
3049
                        event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
 
3050
                }
 
3051
 
 
3052
                // Calculate pageX/Y if missing and clientX/Y available
 
3053
                if ( event.pageX == null && event.clientX != null ) {
 
3054
                        var eventDocument = event.target.ownerDocument || document,
 
3055
                                doc = eventDocument.documentElement,
 
3056
                                body = eventDocument.body;
 
3057
 
 
3058
                        event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
 
3059
                        event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
 
3060
                }
 
3061
 
 
3062
                // Add which for key events
 
3063
                if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
 
3064
                        event.which = event.charCode != null ? event.charCode : event.keyCode;
 
3065
                }
 
3066
 
 
3067
                // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
 
3068
                if ( !event.metaKey && event.ctrlKey ) {
 
3069
                        event.metaKey = event.ctrlKey;
 
3070
                }
 
3071
 
 
3072
                // Add which for click: 1 === left; 2 === middle; 3 === right
 
3073
                // Note: button is not normalized, so don't use it
 
3074
                if ( !event.which && event.button !== undefined ) {
 
3075
                        event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
 
3076
                }
 
3077
 
 
3078
                return event;
 
3079
        },
 
3080
 
 
3081
        // Deprecated, use jQuery.guid instead
 
3082
        guid: 1E8,
 
3083
 
 
3084
        // Deprecated, use jQuery.proxy instead
 
3085
        proxy: jQuery.proxy,
 
3086
 
 
3087
        special: {
 
3088
                ready: {
 
3089
                        // Make sure the ready event is setup
 
3090
                        setup: jQuery.bindReady,
 
3091
                        teardown: jQuery.noop
 
3092
                },
 
3093
 
 
3094
                live: {
 
3095
                        add: function( handleObj ) {
 
3096
                                jQuery.event.add( this,
 
3097
                                        liveConvert( handleObj.origType, handleObj.selector ),
 
3098
                                        jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
 
3099
                        },
 
3100
 
 
3101
                        remove: function( handleObj ) {
 
3102
                                jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
 
3103
                        }
 
3104
                },
 
3105
 
 
3106
                beforeunload: {
 
3107
                        setup: function( data, namespaces, eventHandle ) {
 
3108
                                // We only want to do this special case on windows
 
3109
                                if ( jQuery.isWindow( this ) ) {
 
3110
                                        this.onbeforeunload = eventHandle;
 
3111
                                }
 
3112
                        },
 
3113
 
 
3114
                        teardown: function( namespaces, eventHandle ) {
 
3115
                                if ( this.onbeforeunload === eventHandle ) {
 
3116
                                        this.onbeforeunload = null;
 
3117
                                }
 
3118
                        }
 
3119
                }
 
3120
        }
 
3121
};
 
3122
 
 
3123
jQuery.removeEvent = document.removeEventListener ?
 
3124
        function( elem, type, handle ) {
 
3125
                if ( elem.removeEventListener ) {
 
3126
                        elem.removeEventListener( type, handle, false );
 
3127
                }
 
3128
        } :
 
3129
        function( elem, type, handle ) {
 
3130
                if ( elem.detachEvent ) {
 
3131
                        elem.detachEvent( "on" + type, handle );
 
3132
                }
 
3133
        };
 
3134
 
 
3135
jQuery.Event = function( src, props ) {
 
3136
        // Allow instantiation without the 'new' keyword
 
3137
        if ( !this.preventDefault ) {
 
3138
                return new jQuery.Event( src, props );
 
3139
        }
 
3140
 
 
3141
        // Event object
 
3142
        if ( src && src.type ) {
 
3143
                this.originalEvent = src;
 
3144
                this.type = src.type;
 
3145
 
 
3146
                // Events bubbling up the document may have been marked as prevented
 
3147
                // by a handler lower down the tree; reflect the correct value.
 
3148
                this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
 
3149
                        src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
 
3150
 
 
3151
        // Event type
 
3152
        } else {
 
3153
                this.type = src;
 
3154
        }
 
3155
 
 
3156
        // Put explicitly provided properties onto the event object
 
3157
        if ( props ) {
 
3158
                jQuery.extend( this, props );
 
3159
        }
 
3160
 
 
3161
        // timeStamp is buggy for some events on Firefox(#3843)
 
3162
        // So we won't rely on the native value
 
3163
        this.timeStamp = jQuery.now();
 
3164
 
 
3165
        // Mark it as fixed
 
3166
        this[ jQuery.expando ] = true;
 
3167
};
 
3168
 
 
3169
function returnFalse() {
 
3170
        return false;
 
3171
}
 
3172
function returnTrue() {
 
3173
        return true;
 
3174
}
 
3175
 
 
3176
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
 
3177
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
 
3178
jQuery.Event.prototype = {
 
3179
        preventDefault: function() {
 
3180
                this.isDefaultPrevented = returnTrue;
 
3181
 
 
3182
                var e = this.originalEvent;
 
3183
                if ( !e ) {
 
3184
                        return;
 
3185
                }
 
3186
 
 
3187
                // if preventDefault exists run it on the original event
 
3188
                if ( e.preventDefault ) {
 
3189
                        e.preventDefault();
 
3190
 
 
3191
                // otherwise set the returnValue property of the original event to false (IE)
 
3192
                } else {
 
3193
                        e.returnValue = false;
 
3194
                }
 
3195
        },
 
3196
        stopPropagation: function() {
 
3197
                this.isPropagationStopped = returnTrue;
 
3198
 
 
3199
                var e = this.originalEvent;
 
3200
                if ( !e ) {
 
3201
                        return;
 
3202
                }
 
3203
                // if stopPropagation exists run it on the original event
 
3204
                if ( e.stopPropagation ) {
 
3205
                        e.stopPropagation();
 
3206
                }
 
3207
                // otherwise set the cancelBubble property of the original event to true (IE)
 
3208
                e.cancelBubble = true;
 
3209
        },
 
3210
        stopImmediatePropagation: function() {
 
3211
                this.isImmediatePropagationStopped = returnTrue;
 
3212
                this.stopPropagation();
 
3213
        },
 
3214
        isDefaultPrevented: returnFalse,
 
3215
        isPropagationStopped: returnFalse,
 
3216
        isImmediatePropagationStopped: returnFalse
 
3217
};
 
3218
 
 
3219
// Checks if an event happened on an element within another element
 
3220
// Used in jQuery.event.special.mouseenter and mouseleave handlers
 
3221
var withinElement = function( event ) {
 
3222
 
 
3223
        // Check if mouse(over|out) are still within the same parent element
 
3224
        var related = event.relatedTarget,
 
3225
                inside = false,
 
3226
                eventType = event.type;
 
3227
 
 
3228
        event.type = event.data;
 
3229
 
 
3230
        if ( related !== this ) {
 
3231
 
 
3232
                if ( related ) {
 
3233
                        inside = jQuery.contains( this, related );
 
3234
                }
 
3235
 
 
3236
                if ( !inside ) {
 
3237
 
 
3238
                        jQuery.event.handle.apply( this, arguments );
 
3239
 
 
3240
                        event.type = eventType;
 
3241
                }
 
3242
        }
 
3243
},
 
3244
 
 
3245
// In case of event delegation, we only need to rename the event.type,
 
3246
// liveHandler will take care of the rest.
 
3247
delegate = function( event ) {
 
3248
        event.type = event.data;
 
3249
        jQuery.event.handle.apply( this, arguments );
 
3250
};
 
3251
 
 
3252
// Create mouseenter and mouseleave events
 
3253
jQuery.each({
 
3254
        mouseenter: "mouseover",
 
3255
        mouseleave: "mouseout"
 
3256
}, function( orig, fix ) {
 
3257
        jQuery.event.special[ orig ] = {
 
3258
                setup: function( data ) {
 
3259
                        jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
 
3260
                },
 
3261
                teardown: function( data ) {
 
3262
                        jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
 
3263
                }
 
3264
        };
 
3265
});
 
3266
 
 
3267
// submit delegation
 
3268
if ( !jQuery.support.submitBubbles ) {
 
3269
 
 
3270
        jQuery.event.special.submit = {
 
3271
                setup: function( data, namespaces ) {
 
3272
                        if ( !jQuery.nodeName( this, "form" ) ) {
 
3273
                                jQuery.event.add(this, "click.specialSubmit", function( e ) {
 
3274
                                        // Avoid triggering error on non-existent type attribute in IE VML (#7071)
 
3275
                                        var elem = e.target,
 
3276
                                                type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : "";
 
3277
 
 
3278
                                        if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
 
3279
                                                trigger( "submit", this, arguments );
 
3280
                                        }
 
3281
                                });
 
3282
 
 
3283
                                jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
 
3284
                                        var elem = e.target,
 
3285
                                                type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : "";
 
3286
 
 
3287
                                        if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
 
3288
                                                trigger( "submit", this, arguments );
 
3289
                                        }
 
3290
                                });
 
3291
 
 
3292
                        } else {
 
3293
                                return false;
 
3294
                        }
 
3295
                },
 
3296
 
 
3297
                teardown: function( namespaces ) {
 
3298
                        jQuery.event.remove( this, ".specialSubmit" );
 
3299
                }
 
3300
        };
 
3301
 
 
3302
}
 
3303
 
 
3304
// change delegation, happens here so we have bind.
 
3305
if ( !jQuery.support.changeBubbles ) {
 
3306
 
 
3307
        var changeFilters,
 
3308
 
 
3309
        getVal = function( elem ) {
 
3310
                var type = jQuery.nodeName( elem, "input" ) ? elem.type : "",
 
3311
                        val = elem.value;
 
3312
 
 
3313
                if ( type === "radio" || type === "checkbox" ) {
 
3314
                        val = elem.checked;
 
3315
 
 
3316
                } else if ( type === "select-multiple" ) {
 
3317
                        val = elem.selectedIndex > -1 ?
 
3318
                                jQuery.map( elem.options, function( elem ) {
 
3319
                                        return elem.selected;
 
3320
                                }).join("-") :
 
3321
                                "";
 
3322
 
 
3323
                } else if ( jQuery.nodeName( elem, "select" ) ) {
 
3324
                        val = elem.selectedIndex;
 
3325
                }
 
3326
 
 
3327
                return val;
 
3328
        },
 
3329
 
 
3330
        testChange = function testChange( e ) {
 
3331
                var elem = e.target, data, val;
 
3332
 
 
3333
                if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
 
3334
                        return;
 
3335
                }
 
3336
 
 
3337
                data = jQuery._data( elem, "_change_data" );
 
3338
                val = getVal(elem);
 
3339
 
 
3340
                // the current data will be also retrieved by beforeactivate
 
3341
                if ( e.type !== "focusout" || elem.type !== "radio" ) {
 
3342
                        jQuery._data( elem, "_change_data", val );
 
3343
                }
 
3344
 
 
3345
                if ( data === undefined || val === data ) {
 
3346
                        return;
 
3347
                }
 
3348
 
 
3349
                if ( data != null || val ) {
 
3350
                        e.type = "change";
 
3351
                        e.liveFired = undefined;
 
3352
                        jQuery.event.trigger( e, arguments[1], elem );
 
3353
                }
 
3354
        };
 
3355
 
 
3356
        jQuery.event.special.change = {
 
3357
                filters: {
 
3358
                        focusout: testChange,
 
3359
 
 
3360
                        beforedeactivate: testChange,
 
3361
 
 
3362
                        click: function( e ) {
 
3363
                                var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
 
3364
 
 
3365
                                if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) {
 
3366
                                        testChange.call( this, e );
 
3367
                                }
 
3368
                        },
 
3369
 
 
3370
                        // Change has to be called before submit
 
3371
                        // Keydown will be called before keypress, which is used in submit-event delegation
 
3372
                        keydown: function( e ) {
 
3373
                                var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
 
3374
 
 
3375
                                if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) ||
 
3376
                                        (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
 
3377
                                        type === "select-multiple" ) {
 
3378
                                        testChange.call( this, e );
 
3379
                                }
 
3380
                        },
 
3381
 
 
3382
                        // Beforeactivate happens also before the previous element is blurred
 
3383
                        // with this event you can't trigger a change event, but you can store
 
3384
                        // information
 
3385
                        beforeactivate: function( e ) {
 
3386
                                var elem = e.target;
 
3387
                                jQuery._data( elem, "_change_data", getVal(elem) );
 
3388
                        }
 
3389
                },
 
3390
 
 
3391
                setup: function( data, namespaces ) {
 
3392
                        if ( this.type === "file" ) {
 
3393
                                return false;
 
3394
                        }
 
3395
 
 
3396
                        for ( var type in changeFilters ) {
 
3397
                                jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
 
3398
                        }
 
3399
 
 
3400
                        return rformElems.test( this.nodeName );
 
3401
                },
 
3402
 
 
3403
                teardown: function( namespaces ) {
 
3404
                        jQuery.event.remove( this, ".specialChange" );
 
3405
 
 
3406
                        return rformElems.test( this.nodeName );
 
3407
                }
 
3408
        };
 
3409
 
 
3410
        changeFilters = jQuery.event.special.change.filters;
 
3411
 
 
3412
        // Handle when the input is .focus()'d
 
3413
        changeFilters.focus = changeFilters.beforeactivate;
 
3414
}
 
3415
 
 
3416
function trigger( type, elem, args ) {
 
3417
        // Piggyback on a donor event to simulate a different one.
 
3418
        // Fake originalEvent to avoid donor's stopPropagation, but if the
 
3419
        // simulated event prevents default then we do the same on the donor.
 
3420
        // Don't pass args or remember liveFired; they apply to the donor event.
 
3421
        var event = jQuery.extend( {}, args[ 0 ] );
 
3422
        event.type = type;
 
3423
        event.originalEvent = {};
 
3424
        event.liveFired = undefined;
 
3425
        jQuery.event.handle.call( elem, event );
 
3426
        if ( event.isDefaultPrevented() ) {
 
3427
                args[ 0 ].preventDefault();
 
3428
        }
 
3429
}
 
3430
 
 
3431
// Create "bubbling" focus and blur events
 
3432
if ( !jQuery.support.focusinBubbles ) {
 
3433
        jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
 
3434
 
 
3435
                // Attach a single capturing handler while someone wants focusin/focusout
 
3436
                var attaches = 0;
 
3437
 
 
3438
                jQuery.event.special[ fix ] = {
 
3439
                        setup: function() {
 
3440
                                if ( attaches++ === 0 ) {
 
3441
                                        document.addEventListener( orig, handler, true );
 
3442
                                }
 
3443
                        },
 
3444
                        teardown: function() {
 
3445
                                if ( --attaches === 0 ) {
 
3446
                                        document.removeEventListener( orig, handler, true );
 
3447
                                }
 
3448
                        }
 
3449
                };
 
3450
 
 
3451
                function handler( donor ) {
 
3452
                        // Donor event is always a native one; fix it and switch its type.
 
3453
                        // Let focusin/out handler cancel the donor focus/blur event.
 
3454
                        var e = jQuery.event.fix( donor );
 
3455
                        e.type = fix;
 
3456
                        e.originalEvent = {};
 
3457
                        jQuery.event.trigger( e, null, e.target );
 
3458
                        if ( e.isDefaultPrevented() ) {
 
3459
                                donor.preventDefault();
 
3460
                        }
 
3461
                }
 
3462
        });
 
3463
}
 
3464
 
 
3465
jQuery.each(["bind", "one"], function( i, name ) {
 
3466
        jQuery.fn[ name ] = function( type, data, fn ) {
 
3467
                var handler;
 
3468
 
 
3469
                // Handle object literals
 
3470
                if ( typeof type === "object" ) {
 
3471
                        for ( var key in type ) {
 
3472
                                this[ name ](key, data, type[key], fn);
 
3473
                        }
 
3474
                        return this;
 
3475
                }
 
3476
 
 
3477
                if ( arguments.length === 2 || data === false ) {
 
3478
                        fn = data;
 
3479
                        data = undefined;
 
3480
                }
 
3481
 
 
3482
                if ( name === "one" ) {
 
3483
                        handler = function( event ) {
 
3484
                                jQuery( this ).unbind( event, handler );
 
3485
                                return fn.apply( this, arguments );
 
3486
                        };
 
3487
                        handler.guid = fn.guid || jQuery.guid++;
 
3488
                } else {
 
3489
                        handler = fn;
 
3490
                }
 
3491
 
 
3492
                if ( type === "unload" && name !== "one" ) {
 
3493
                        this.one( type, data, fn );
 
3494
 
 
3495
                } else {
 
3496
                        for ( var i = 0, l = this.length; i < l; i++ ) {
 
3497
                                jQuery.event.add( this[i], type, handler, data );
 
3498
                        }
 
3499
                }
 
3500
 
 
3501
                return this;
 
3502
        };
 
3503
});
 
3504
 
 
3505
jQuery.fn.extend({
 
3506
        unbind: function( type, fn ) {
 
3507
                // Handle object literals
 
3508
                if ( typeof type === "object" && !type.preventDefault ) {
 
3509
                        for ( var key in type ) {
 
3510
                                this.unbind(key, type[key]);
 
3511
                        }
 
3512
 
 
3513
                } else {
 
3514
                        for ( var i = 0, l = this.length; i < l; i++ ) {
 
3515
                                jQuery.event.remove( this[i], type, fn );
 
3516
                        }
 
3517
                }
 
3518
 
 
3519
                return this;
 
3520
        },
 
3521
 
 
3522
        delegate: function( selector, types, data, fn ) {
 
3523
                return this.live( types, data, fn, selector );
 
3524
        },
 
3525
 
 
3526
        undelegate: function( selector, types, fn ) {
 
3527
                if ( arguments.length === 0 ) {
 
3528
                        return this.unbind( "live" );
 
3529
 
 
3530
                } else {
 
3531
                        return this.die( types, null, fn, selector );
 
3532
                }
 
3533
        },
 
3534
 
 
3535
        trigger: function( type, data ) {
 
3536
                return this.each(function() {
 
3537
                        jQuery.event.trigger( type, data, this );
 
3538
                });
 
3539
        },
 
3540
 
 
3541
        triggerHandler: function( type, data ) {
 
3542
                if ( this[0] ) {
 
3543
                        return jQuery.event.trigger( type, data, this[0], true );
 
3544
                }
 
3545
        },
 
3546
 
 
3547
        toggle: function( fn ) {
 
3548
                // Save reference to arguments for access in closure
 
3549
                var args = arguments,
 
3550
                        guid = fn.guid || jQuery.guid++,
 
3551
                        i = 0,
 
3552
                        toggler = function( event ) {
 
3553
                                // Figure out which function to execute
 
3554
                                var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
 
3555
                                jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
 
3556
 
 
3557
                                // Make sure that clicks stop
 
3558
                                event.preventDefault();
 
3559
 
 
3560
                                // and execute the function
 
3561
                                return args[ lastToggle ].apply( this, arguments ) || false;
 
3562
                        };
 
3563
 
 
3564
                // link all the functions, so any of them can unbind this click handler
 
3565
                toggler.guid = guid;
 
3566
                while ( i < args.length ) {
 
3567
                        args[ i++ ].guid = guid;
 
3568
                }
 
3569
 
 
3570
                return this.click( toggler );
 
3571
        },
 
3572
 
 
3573
        hover: function( fnOver, fnOut ) {
 
3574
                return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
 
3575
        }
 
3576
});
 
3577
 
 
3578
var liveMap = {
 
3579
        focus: "focusin",
 
3580
        blur: "focusout",
 
3581
        mouseenter: "mouseover",
 
3582
        mouseleave: "mouseout"
 
3583
};
 
3584
 
 
3585
jQuery.each(["live", "die"], function( i, name ) {
 
3586
        jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
 
3587
                var type, i = 0, match, namespaces, preType,
 
3588
                        selector = origSelector || this.selector,
 
3589
                        context = origSelector ? this : jQuery( this.context );
 
3590
 
 
3591
                if ( typeof types === "object" && !types.preventDefault ) {
 
3592
                        for ( var key in types ) {
 
3593
                                context[ name ]( key, data, types[key], selector );
 
3594
                        }
 
3595
 
 
3596
                        return this;
 
3597
                }
 
3598
 
 
3599
                if ( name === "die" && !types &&
 
3600
                                        origSelector && origSelector.charAt(0) === "." ) {
 
3601
 
 
3602
                        context.unbind( origSelector );
 
3603
 
 
3604
                        return this;
 
3605
                }
 
3606
 
 
3607
                if ( data === false || jQuery.isFunction( data ) ) {
 
3608
                        fn = data || returnFalse;
 
3609
                        data = undefined;
 
3610
                }
 
3611
 
 
3612
                types = (types || "").split(" ");
 
3613
 
 
3614
                while ( (type = types[ i++ ]) != null ) {
 
3615
                        match = rnamespaces.exec( type );
 
3616
                        namespaces = "";
 
3617
 
 
3618
                        if ( match )  {
 
3619
                                namespaces = match[0];
 
3620
                                type = type.replace( rnamespaces, "" );
 
3621
                        }
 
3622
 
 
3623
                        if ( type === "hover" ) {
 
3624
                                types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
 
3625
                                continue;
 
3626
                        }
 
3627
 
 
3628
                        preType = type;
 
3629
 
 
3630
                        if ( liveMap[ type ] ) {
 
3631
                                types.push( liveMap[ type ] + namespaces );
 
3632
                                type = type + namespaces;
 
3633
 
 
3634
                        } else {
 
3635
                                type = (liveMap[ type ] || type) + namespaces;
 
3636
                        }
 
3637
 
 
3638
                        if ( name === "live" ) {
 
3639
                                // bind live handler
 
3640
                                for ( var j = 0, l = context.length; j < l; j++ ) {
 
3641
                                        jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
 
3642
                                                { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
 
3643
                                }
 
3644
 
 
3645
                        } else {
 
3646
                                // unbind live handler
 
3647
                                context.unbind( "live." + liveConvert( type, selector ), fn );
 
3648
                        }
 
3649
                }
 
3650
 
 
3651
                return this;
 
3652
        };
 
3653
});
 
3654
 
 
3655
function liveHandler( event ) {
 
3656
        var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
 
3657
                elems = [],
 
3658
                selectors = [],
 
3659
                events = jQuery._data( this, "events" );
 
3660
 
 
3661
        // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
 
3662
        if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
 
3663
                return;
 
3664
        }
 
3665
 
 
3666
        if ( event.namespace ) {
 
3667
                namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
 
3668
        }
 
3669
 
 
3670
        event.liveFired = this;
 
3671
 
 
3672
        var live = events.live.slice(0);
 
3673
 
 
3674
        for ( j = 0; j < live.length; j++ ) {
 
3675
                handleObj = live[j];
 
3676
 
 
3677
                if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
 
3678
                        selectors.push( handleObj.selector );
 
3679
 
 
3680
                } else {
 
3681
                        live.splice( j--, 1 );
 
3682
                }
 
3683
        }
 
3684
 
 
3685
        match = jQuery( event.target ).closest( selectors, event.currentTarget );
 
3686
 
 
3687
        for ( i = 0, l = match.length; i < l; i++ ) {
 
3688
                close = match[i];
 
3689
 
 
3690
                for ( j = 0; j < live.length; j++ ) {
 
3691
                        handleObj = live[j];
 
3692
 
 
3693
                        if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {
 
3694
                                elem = close.elem;
 
3695
                                related = null;
 
3696
 
 
3697
                                // Those two events require additional checking
 
3698
                                if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
 
3699
                                        event.type = handleObj.preType;
 
3700
                                        related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
 
3701
 
 
3702
                                        // Make sure not to accidentally match a child element with the same selector
 
3703
                                        if ( related && jQuery.contains( elem, related ) ) {
 
3704
                                                related = elem;
 
3705
                                        }
 
3706
                                }
 
3707
 
 
3708
                                if ( !related || related !== elem ) {
 
3709
                                        elems.push({ elem: elem, handleObj: handleObj, level: close.level });
 
3710
                                }
 
3711
                        }
 
3712
                }
 
3713
        }
 
3714
 
 
3715
        for ( i = 0, l = elems.length; i < l; i++ ) {
 
3716
                match = elems[i];
 
3717
 
 
3718
                if ( maxLevel && match.level > maxLevel ) {
 
3719
                        break;
 
3720
                }
 
3721
 
 
3722
                event.currentTarget = match.elem;
 
3723
                event.data = match.handleObj.data;
 
3724
                event.handleObj = match.handleObj;
 
3725
 
 
3726
                ret = match.handleObj.origHandler.apply( match.elem, arguments );
 
3727
 
 
3728
                if ( ret === false || event.isPropagationStopped() ) {
 
3729
                        maxLevel = match.level;
 
3730
 
 
3731
                        if ( ret === false ) {
 
3732
                                stop = false;
 
3733
                        }
 
3734
                        if ( event.isImmediatePropagationStopped() ) {
 
3735
                                break;
 
3736
                        }
 
3737
                }
 
3738
        }
 
3739
 
 
3740
        return stop;
 
3741
}
 
3742
 
 
3743
function liveConvert( type, selector ) {
 
3744
        return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&");
 
3745
}
 
3746
 
 
3747
jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
 
3748
        "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
 
3749
        "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
 
3750
 
 
3751
        // Handle event binding
 
3752
        jQuery.fn[ name ] = function( data, fn ) {
 
3753
                if ( fn == null ) {
 
3754
                        fn = data;
 
3755
                        data = null;
 
3756
                }
 
3757
 
 
3758
                return arguments.length > 0 ?
 
3759
                        this.bind( name, data, fn ) :
 
3760
                        this.trigger( name );
 
3761
        };
 
3762
 
 
3763
        if ( jQuery.attrFn ) {
 
3764
                jQuery.attrFn[ name ] = true;
 
3765
        }
 
3766
});
 
3767
 
 
3768
 
 
3769
 
 
3770
/*!
 
3771
 * Sizzle CSS Selector Engine
 
3772
 *  Copyright 2011, The Dojo Foundation
 
3773
 *  Released under the MIT, BSD, and GPL Licenses.
 
3774
 *  More information: http://sizzlejs.com/
 
3775
 */
 
3776
(function(){
 
3777
 
 
3778
var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
 
3779
        done = 0,
 
3780
        toString = Object.prototype.toString,
 
3781
        hasDuplicate = false,
 
3782
        baseHasDuplicate = true,
 
3783
        rBackslash = /\\/g,
 
3784
        rNonWord = /\W/;
 
3785
 
 
3786
// Here we check if the JavaScript engine is using some sort of
 
3787
// optimization where it does not always call our comparision
 
3788
// function. If that is the case, discard the hasDuplicate value.
 
3789
//   Thus far that includes Google Chrome.
 
3790
[0, 0].sort(function() {
 
3791
        baseHasDuplicate = false;
 
3792
        return 0;
 
3793
});
 
3794
 
 
3795
var Sizzle = function( selector, context, results, seed ) {
 
3796
        results = results || [];
 
3797
        context = context || document;
 
3798
 
 
3799
        var origContext = context;
 
3800
 
 
3801
        if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
 
3802
                return [];
 
3803
        }
 
3804
        
 
3805
        if ( !selector || typeof selector !== "string" ) {
 
3806
                return results;
 
3807
        }
 
3808
 
 
3809
        var m, set, checkSet, extra, ret, cur, pop, i,
 
3810
                prune = true,
 
3811
                contextXML = Sizzle.isXML( context ),
 
3812
                parts = [],
 
3813
                soFar = selector;
 
3814
        
 
3815
        // Reset the position of the chunker regexp (start from head)
 
3816
        do {
 
3817
                chunker.exec( "" );
 
3818
                m = chunker.exec( soFar );
 
3819
 
 
3820
                if ( m ) {
 
3821
                        soFar = m[3];
 
3822
                
 
3823
                        parts.push( m[1] );
 
3824
                
 
3825
                        if ( m[2] ) {
 
3826
                                extra = m[3];
 
3827
                                break;
 
3828
                        }
 
3829
                }
 
3830
        } while ( m );
 
3831
 
 
3832
        if ( parts.length > 1 && origPOS.exec( selector ) ) {
 
3833
 
 
3834
                if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
 
3835
                        set = posProcess( parts[0] + parts[1], context );
 
3836
 
 
3837
                } else {
 
3838
                        set = Expr.relative[ parts[0] ] ?
 
3839
                                [ context ] :
 
3840
                                Sizzle( parts.shift(), context );
 
3841
 
 
3842
                        while ( parts.length ) {
 
3843
                                selector = parts.shift();
 
3844
 
 
3845
                                if ( Expr.relative[ selector ] ) {
 
3846
                                        selector += parts.shift();
 
3847
                                }
 
3848
                                
 
3849
                                set = posProcess( selector, set );
 
3850
                        }
 
3851
                }
 
3852
 
 
3853
        } else {
 
3854
                // Take a shortcut and set the context if the root selector is an ID
 
3855
                // (but not if it'll be faster if the inner selector is an ID)
 
3856
                if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
 
3857
                                Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
 
3858
 
 
3859
                        ret = Sizzle.find( parts.shift(), context, contextXML );
 
3860
                        context = ret.expr ?
 
3861
                                Sizzle.filter( ret.expr, ret.set )[0] :
 
3862
                                ret.set[0];
 
3863
                }
 
3864
 
 
3865
                if ( context ) {
 
3866
                        ret = seed ?
 
3867
                                { expr: parts.pop(), set: makeArray(seed) } :
 
3868
                                Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
 
3869
 
 
3870
                        set = ret.expr ?
 
3871
                                Sizzle.filter( ret.expr, ret.set ) :
 
3872
                                ret.set;
 
3873
 
 
3874
                        if ( parts.length > 0 ) {
 
3875
                                checkSet = makeArray( set );
 
3876
 
 
3877
                        } else {
 
3878
                                prune = false;
 
3879
                        }
 
3880
 
 
3881
                        while ( parts.length ) {
 
3882
                                cur = parts.pop();
 
3883
                                pop = cur;
 
3884
 
 
3885
                                if ( !Expr.relative[ cur ] ) {
 
3886
                                        cur = "";
 
3887
                                } else {
 
3888
                                        pop = parts.pop();
 
3889
                                }
 
3890
 
 
3891
                                if ( pop == null ) {
 
3892
                                        pop = context;
 
3893
                                }
 
3894
 
 
3895
                                Expr.relative[ cur ]( checkSet, pop, contextXML );
 
3896
                        }
 
3897
 
 
3898
                } else {
 
3899
                        checkSet = parts = [];
 
3900
                }
 
3901
        }
 
3902
 
 
3903
        if ( !checkSet ) {
 
3904
                checkSet = set;
 
3905
        }
 
3906
 
 
3907
        if ( !checkSet ) {
 
3908
                Sizzle.error( cur || selector );
 
3909
        }
 
3910
 
 
3911
        if ( toString.call(checkSet) === "[object Array]" ) {
 
3912
                if ( !prune ) {
 
3913
                        results.push.apply( results, checkSet );
 
3914
 
 
3915
                } else if ( context && context.nodeType === 1 ) {
 
3916
                        for ( i = 0; checkSet[i] != null; i++ ) {
 
3917
                                if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
 
3918
                                        results.push( set[i] );
 
3919
                                }
 
3920
                        }
 
3921
 
 
3922
                } else {
 
3923
                        for ( i = 0; checkSet[i] != null; i++ ) {
 
3924
                                if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
 
3925
                                        results.push( set[i] );
 
3926
                                }
 
3927
                        }
 
3928
                }
 
3929
 
 
3930
        } else {
 
3931
                makeArray( checkSet, results );
 
3932
        }
 
3933
 
 
3934
        if ( extra ) {
 
3935
                Sizzle( extra, origContext, results, seed );
 
3936
                Sizzle.uniqueSort( results );
 
3937
        }
 
3938
 
 
3939
        return results;
 
3940
};
 
3941
 
 
3942
Sizzle.uniqueSort = function( results ) {
 
3943
        if ( sortOrder ) {
 
3944
                hasDuplicate = baseHasDuplicate;
 
3945
                results.sort( sortOrder );
 
3946
 
 
3947
                if ( hasDuplicate ) {
 
3948
                        for ( var i = 1; i < results.length; i++ ) {
 
3949
                                if ( results[i] === results[ i - 1 ] ) {
 
3950
                                        results.splice( i--, 1 );
 
3951
                                }
 
3952
                        }
 
3953
                }
 
3954
        }
 
3955
 
 
3956
        return results;
 
3957
};
 
3958
 
 
3959
Sizzle.matches = function( expr, set ) {
 
3960
        return Sizzle( expr, null, null, set );
 
3961
};
 
3962
 
 
3963
Sizzle.matchesSelector = function( node, expr ) {
 
3964
        return Sizzle( expr, null, null, [node] ).length > 0;
 
3965
};
 
3966
 
 
3967
Sizzle.find = function( expr, context, isXML ) {
 
3968
        var set;
 
3969
 
 
3970
        if ( !expr ) {
 
3971
                return [];
 
3972
        }
 
3973
 
 
3974
        for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
 
3975
                var match,
 
3976
                        type = Expr.order[i];
 
3977
                
 
3978
                if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
 
3979
                        var left = match[1];
 
3980
                        match.splice( 1, 1 );
 
3981
 
 
3982
                        if ( left.substr( left.length - 1 ) !== "\\" ) {
 
3983
                                match[1] = (match[1] || "").replace( rBackslash, "" );
 
3984
                                set = Expr.find[ type ]( match, context, isXML );
 
3985
 
 
3986
                                if ( set != null ) {
 
3987
                                        expr = expr.replace( Expr.match[ type ], "" );
 
3988
                                        break;
 
3989
                                }
 
3990
                        }
 
3991
                }
 
3992
        }
 
3993
 
 
3994
        if ( !set ) {
 
3995
                set = typeof context.getElementsByTagName !== "undefined" ?
 
3996
                        context.getElementsByTagName( "*" ) :
 
3997
                        [];
 
3998
        }
 
3999
 
 
4000
        return { set: set, expr: expr };
 
4001
};
 
4002
 
 
4003
Sizzle.filter = function( expr, set, inplace, not ) {
 
4004
        var match, anyFound,
 
4005
                old = expr,
 
4006
                result = [],
 
4007
                curLoop = set,
 
4008
                isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
 
4009
 
 
4010
        while ( expr && set.length ) {
 
4011
                for ( var type in Expr.filter ) {
 
4012
                        if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
 
4013
                                var found, item,
 
4014
                                        filter = Expr.filter[ type ],
 
4015
                                        left = match[1];
 
4016
 
 
4017
                                anyFound = false;
 
4018
 
 
4019
                                match.splice(1,1);
 
4020
 
 
4021
                                if ( left.substr( left.length - 1 ) === "\\" ) {
 
4022
                                        continue;
 
4023
                                }
 
4024
 
 
4025
                                if ( curLoop === result ) {
 
4026
                                        result = [];
 
4027
                                }
 
4028
 
 
4029
                                if ( Expr.preFilter[ type ] ) {
 
4030
                                        match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
 
4031
 
 
4032
                                        if ( !match ) {
 
4033
                                                anyFound = found = true;
 
4034
 
 
4035
                                        } else if ( match === true ) {
 
4036
                                                continue;
 
4037
                                        }
 
4038
                                }
 
4039
 
 
4040
                                if ( match ) {
 
4041
                                        for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
 
4042
                                                if ( item ) {
 
4043
                                                        found = filter( item, match, i, curLoop );
 
4044
                                                        var pass = not ^ !!found;
 
4045
 
 
4046
                                                        if ( inplace && found != null ) {
 
4047
                                                                if ( pass ) {
 
4048
                                                                        anyFound = true;
 
4049
 
 
4050
                                                                } else {
 
4051
                                                                        curLoop[i] = false;
 
4052
                                                                }
 
4053
 
 
4054
                                                        } else if ( pass ) {
 
4055
                                                                result.push( item );
 
4056
                                                                anyFound = true;
 
4057
                                                        }
 
4058
                                                }
 
4059
                                        }
 
4060
                                }
 
4061
 
 
4062
                                if ( found !== undefined ) {
 
4063
                                        if ( !inplace ) {
 
4064
                                                curLoop = result;
 
4065
                                        }
 
4066
 
 
4067
                                        expr = expr.replace( Expr.match[ type ], "" );
 
4068
 
 
4069
                                        if ( !anyFound ) {
 
4070
                                                return [];
 
4071
                                        }
 
4072
 
 
4073
                                        break;
 
4074
                                }
 
4075
                        }
 
4076
                }
 
4077
 
 
4078
                // Improper expression
 
4079
                if ( expr === old ) {
 
4080
                        if ( anyFound == null ) {
 
4081
                                Sizzle.error( expr );
 
4082
 
 
4083
                        } else {
 
4084
                                break;
 
4085
                        }
 
4086
                }
 
4087
 
 
4088
                old = expr;
 
4089
        }
 
4090
 
 
4091
        return curLoop;
 
4092
};
 
4093
 
 
4094
Sizzle.error = function( msg ) {
 
4095
        throw "Syntax error, unrecognized expression: " + msg;
 
4096
};
 
4097
 
 
4098
var Expr = Sizzle.selectors = {
 
4099
        order: [ "ID", "NAME", "TAG" ],
 
4100
 
 
4101
        match: {
 
4102
                ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
 
4103
                CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
 
4104
                NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
 
4105
                ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
 
4106
                TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
 
4107
                CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
 
4108
                POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
 
4109
                PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
 
4110
        },
 
4111
 
 
4112
        leftMatch: {},
 
4113
 
 
4114
        attrMap: {
 
4115
                "class": "className",
 
4116
                "for": "htmlFor"
 
4117
        },
 
4118
 
 
4119
        attrHandle: {
 
4120
                href: function( elem ) {
 
4121
                        return elem.getAttribute( "href" );
 
4122
                },
 
4123
                type: function( elem ) {
 
4124
                        return elem.getAttribute( "type" );
 
4125
                }
 
4126
        },
 
4127
 
 
4128
        relative: {
 
4129
                "+": function(checkSet, part){
 
4130
                        var isPartStr = typeof part === "string",
 
4131
                                isTag = isPartStr && !rNonWord.test( part ),
 
4132
                                isPartStrNotTag = isPartStr && !isTag;
 
4133
 
 
4134
                        if ( isTag ) {
 
4135
                                part = part.toLowerCase();
 
4136
                        }
 
4137
 
 
4138
                        for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
 
4139
                                if ( (elem = checkSet[i]) ) {
 
4140
                                        while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
 
4141
 
 
4142
                                        checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
 
4143
                                                elem || false :
 
4144
                                                elem === part;
 
4145
                                }
 
4146
                        }
 
4147
 
 
4148
                        if ( isPartStrNotTag ) {
 
4149
                                Sizzle.filter( part, checkSet, true );
 
4150
                        }
 
4151
                },
 
4152
 
 
4153
                ">": function( checkSet, part ) {
 
4154
                        var elem,
 
4155
                                isPartStr = typeof part === "string",
 
4156
                                i = 0,
 
4157
                                l = checkSet.length;
 
4158
 
 
4159
                        if ( isPartStr && !rNonWord.test( part ) ) {
 
4160
                                part = part.toLowerCase();
 
4161
 
 
4162
                                for ( ; i < l; i++ ) {
 
4163
                                        elem = checkSet[i];
 
4164
 
 
4165
                                        if ( elem ) {
 
4166
                                                var parent = elem.parentNode;
 
4167
                                                checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
 
4168
                                        }
 
4169
                                }
 
4170
 
 
4171
                        } else {
 
4172
                                for ( ; i < l; i++ ) {
 
4173
                                        elem = checkSet[i];
 
4174
 
 
4175
                                        if ( elem ) {
 
4176
                                                checkSet[i] = isPartStr ?
 
4177
                                                        elem.parentNode :
 
4178
                                                        elem.parentNode === part;
 
4179
                                        }
 
4180
                                }
 
4181
 
 
4182
                                if ( isPartStr ) {
 
4183
                                        Sizzle.filter( part, checkSet, true );
 
4184
                                }
 
4185
                        }
 
4186
                },
 
4187
 
 
4188
                "": function(checkSet, part, isXML){
 
4189
                        var nodeCheck,
 
4190
                                doneName = done++,
 
4191
                                checkFn = dirCheck;
 
4192
 
 
4193
                        if ( typeof part === "string" && !rNonWord.test( part ) ) {
 
4194
                                part = part.toLowerCase();
 
4195
                                nodeCheck = part;
 
4196
                                checkFn = dirNodeCheck;
 
4197
                        }
 
4198
 
 
4199
                        checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
 
4200
                },
 
4201
 
 
4202
                "~": function( checkSet, part, isXML ) {
 
4203
                        var nodeCheck,
 
4204
                                doneName = done++,
 
4205
                                checkFn = dirCheck;
 
4206
 
 
4207
                        if ( typeof part === "string" && !rNonWord.test( part ) ) {
 
4208
                                part = part.toLowerCase();
 
4209
                                nodeCheck = part;
 
4210
                                checkFn = dirNodeCheck;
 
4211
                        }
 
4212
 
 
4213
                        checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
 
4214
                }
 
4215
        },
 
4216
 
 
4217
        find: {
 
4218
                ID: function( match, context, isXML ) {
 
4219
                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
 
4220
                                var m = context.getElementById(match[1]);
 
4221
                                // Check parentNode to catch when Blackberry 4.6 returns
 
4222
                                // nodes that are no longer in the document #6963
 
4223
                                return m && m.parentNode ? [m] : [];
 
4224
                        }
 
4225
                },
 
4226
 
 
4227
                NAME: function( match, context ) {
 
4228
                        if ( typeof context.getElementsByName !== "undefined" ) {
 
4229
                                var ret = [],
 
4230
                                        results = context.getElementsByName( match[1] );
 
4231
 
 
4232
                                for ( var i = 0, l = results.length; i < l; i++ ) {
 
4233
                                        if ( results[i].getAttribute("name") === match[1] ) {
 
4234
                                                ret.push( results[i] );
 
4235
                                        }
 
4236
                                }
 
4237
 
 
4238
                                return ret.length === 0 ? null : ret;
 
4239
                        }
 
4240
                },
 
4241
 
 
4242
                TAG: function( match, context ) {
 
4243
                        if ( typeof context.getElementsByTagName !== "undefined" ) {
 
4244
                                return context.getElementsByTagName( match[1] );
 
4245
                        }
 
4246
                }
 
4247
        },
 
4248
        preFilter: {
 
4249
                CLASS: function( match, curLoop, inplace, result, not, isXML ) {
 
4250
                        match = " " + match[1].replace( rBackslash, "" ) + " ";
 
4251
 
 
4252
                        if ( isXML ) {
 
4253
                                return match;
 
4254
                        }
 
4255
 
 
4256
                        for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
 
4257
                                if ( elem ) {
 
4258
                                        if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
 
4259
                                                if ( !inplace ) {
 
4260
                                                        result.push( elem );
 
4261
                                                }
 
4262
 
 
4263
                                        } else if ( inplace ) {
 
4264
                                                curLoop[i] = false;
 
4265
                                        }
 
4266
                                }
 
4267
                        }
 
4268
 
 
4269
                        return false;
 
4270
                },
 
4271
 
 
4272
                ID: function( match ) {
 
4273
                        return match[1].replace( rBackslash, "" );
 
4274
                },
 
4275
 
 
4276
                TAG: function( match, curLoop ) {
 
4277
                        return match[1].replace( rBackslash, "" ).toLowerCase();
 
4278
                },
 
4279
 
 
4280
                CHILD: function( match ) {
 
4281
                        if ( match[1] === "nth" ) {
 
4282
                                if ( !match[2] ) {
 
4283
                                        Sizzle.error( match[0] );
 
4284
                                }
 
4285
 
 
4286
                                match[2] = match[2].replace(/^\+|\s*/g, '');
 
4287
 
 
4288
                                // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
 
4289
                                var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
 
4290
                                        match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
 
4291
                                        !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
 
4292
 
 
4293
                                // calculate the numbers (first)n+(last) including if they are negative
 
4294
                                match[2] = (test[1] + (test[2] || 1)) - 0;
 
4295
                                match[3] = test[3] - 0;
 
4296
                        }
 
4297
                        else if ( match[2] ) {
 
4298
                                Sizzle.error( match[0] );
 
4299
                        }
 
4300
 
 
4301
                        // TODO: Move to normal caching system
 
4302
                        match[0] = done++;
 
4303
 
 
4304
                        return match;
 
4305
                },
 
4306
 
 
4307
                ATTR: function( match, curLoop, inplace, result, not, isXML ) {
 
4308
                        var name = match[1] = match[1].replace( rBackslash, "" );
 
4309
                        
 
4310
                        if ( !isXML && Expr.attrMap[name] ) {
 
4311
                                match[1] = Expr.attrMap[name];
 
4312
                        }
 
4313
 
 
4314
                        // Handle if an un-quoted value was used
 
4315
                        match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
 
4316
 
 
4317
                        if ( match[2] === "~=" ) {
 
4318
                                match[4] = " " + match[4] + " ";
 
4319
                        }
 
4320
 
 
4321
                        return match;
 
4322
                },
 
4323
 
 
4324
                PSEUDO: function( match, curLoop, inplace, result, not ) {
 
4325
                        if ( match[1] === "not" ) {
 
4326
                                // If we're dealing with a complex expression, or a simple one
 
4327
                                if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
 
4328
                                        match[3] = Sizzle(match[3], null, null, curLoop);
 
4329
 
 
4330
                                } else {
 
4331
                                        var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
 
4332
 
 
4333
                                        if ( !inplace ) {
 
4334
                                                result.push.apply( result, ret );
 
4335
                                        }
 
4336
 
 
4337
                                        return false;
 
4338
                                }
 
4339
 
 
4340
                        } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
 
4341
                                return true;
 
4342
                        }
 
4343
                        
 
4344
                        return match;
 
4345
                },
 
4346
 
 
4347
                POS: function( match ) {
 
4348
                        match.unshift( true );
 
4349
 
 
4350
                        return match;
 
4351
                }
 
4352
        },
 
4353
        
 
4354
        filters: {
 
4355
                enabled: function( elem ) {
 
4356
                        return elem.disabled === false && elem.type !== "hidden";
 
4357
                },
 
4358
 
 
4359
                disabled: function( elem ) {
 
4360
                        return elem.disabled === true;
 
4361
                },
 
4362
 
 
4363
                checked: function( elem ) {
 
4364
                        return elem.checked === true;
 
4365
                },
 
4366
                
 
4367
                selected: function( elem ) {
 
4368
                        // Accessing this property makes selected-by-default
 
4369
                        // options in Safari work properly
 
4370
                        if ( elem.parentNode ) {
 
4371
                                elem.parentNode.selectedIndex;
 
4372
                        }
 
4373
                        
 
4374
                        return elem.selected === true;
 
4375
                },
 
4376
 
 
4377
                parent: function( elem ) {
 
4378
                        return !!elem.firstChild;
 
4379
                },
 
4380
 
 
4381
                empty: function( elem ) {
 
4382
                        return !elem.firstChild;
 
4383
                },
 
4384
 
 
4385
                has: function( elem, i, match ) {
 
4386
                        return !!Sizzle( match[3], elem ).length;
 
4387
                },
 
4388
 
 
4389
                header: function( elem ) {
 
4390
                        return (/h\d/i).test( elem.nodeName );
 
4391
                },
 
4392
 
 
4393
                text: function( elem ) {
 
4394
                        var attr = elem.getAttribute( "type" ), type = elem.type;
 
4395
                        // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 
 
4396
                        // use getAttribute instead to test this case
 
4397
                        return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
 
4398
                },
 
4399
 
 
4400
                radio: function( elem ) {
 
4401
                        return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
 
4402
                },
 
4403
 
 
4404
                checkbox: function( elem ) {
 
4405
                        return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
 
4406
                },
 
4407
 
 
4408
                file: function( elem ) {
 
4409
                        return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
 
4410
                },
 
4411
 
 
4412
                password: function( elem ) {
 
4413
                        return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
 
4414
                },
 
4415
 
 
4416
                submit: function( elem ) {
 
4417
                        var name = elem.nodeName.toLowerCase();
 
4418
                        return (name === "input" || name === "button") && "submit" === elem.type;
 
4419
                },
 
4420
 
 
4421
                image: function( elem ) {
 
4422
                        return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
 
4423
                },
 
4424
 
 
4425
                reset: function( elem ) {
 
4426
                        var name = elem.nodeName.toLowerCase();
 
4427
                        return (name === "input" || name === "button") && "reset" === elem.type;
 
4428
                },
 
4429
 
 
4430
                button: function( elem ) {
 
4431
                        var name = elem.nodeName.toLowerCase();
 
4432
                        return name === "input" && "button" === elem.type || name === "button";
 
4433
                },
 
4434
 
 
4435
                input: function( elem ) {
 
4436
                        return (/input|select|textarea|button/i).test( elem.nodeName );
 
4437
                },
 
4438
 
 
4439
                focus: function( elem ) {
 
4440
                        return elem === elem.ownerDocument.activeElement;
 
4441
                }
 
4442
        },
 
4443
        setFilters: {
 
4444
                first: function( elem, i ) {
 
4445
                        return i === 0;
 
4446
                },
 
4447
 
 
4448
                last: function( elem, i, match, array ) {
 
4449
                        return i === array.length - 1;
 
4450
                },
 
4451
 
 
4452
                even: function( elem, i ) {
 
4453
                        return i % 2 === 0;
 
4454
                },
 
4455
 
 
4456
                odd: function( elem, i ) {
 
4457
                        return i % 2 === 1;
 
4458
                },
 
4459
 
 
4460
                lt: function( elem, i, match ) {
 
4461
                        return i < match[3] - 0;
 
4462
                },
 
4463
 
 
4464
                gt: function( elem, i, match ) {
 
4465
                        return i > match[3] - 0;
 
4466
                },
 
4467
 
 
4468
                nth: function( elem, i, match ) {
 
4469
                        return match[3] - 0 === i;
 
4470
                },
 
4471
 
 
4472
                eq: function( elem, i, match ) {
 
4473
                        return match[3] - 0 === i;
 
4474
                }
 
4475
        },
 
4476
        filter: {
 
4477
                PSEUDO: function( elem, match, i, array ) {
 
4478
                        var name = match[1],
 
4479
                                filter = Expr.filters[ name ];
 
4480
 
 
4481
                        if ( filter ) {
 
4482
                                return filter( elem, i, match, array );
 
4483
 
 
4484
                        } else if ( name === "contains" ) {
 
4485
                                return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
 
4486
 
 
4487
                        } else if ( name === "not" ) {
 
4488
                                var not = match[3];
 
4489
 
 
4490
                                for ( var j = 0, l = not.length; j < l; j++ ) {
 
4491
                                        if ( not[j] === elem ) {
 
4492
                                                return false;
 
4493
                                        }
 
4494
                                }
 
4495
 
 
4496
                                return true;
 
4497
 
 
4498
                        } else {
 
4499
                                Sizzle.error( name );
 
4500
                        }
 
4501
                },
 
4502
 
 
4503
                CHILD: function( elem, match ) {
 
4504
                        var type = match[1],
 
4505
                                node = elem;
 
4506
 
 
4507
                        switch ( type ) {
 
4508
                                case "only":
 
4509
                                case "first":
 
4510
                                        while ( (node = node.previousSibling) )  {
 
4511
                                                if ( node.nodeType === 1 ) { 
 
4512
                                                        return false; 
 
4513
                                                }
 
4514
                                        }
 
4515
 
 
4516
                                        if ( type === "first" ) { 
 
4517
                                                return true; 
 
4518
                                        }
 
4519
 
 
4520
                                        node = elem;
 
4521
 
 
4522
                                case "last":
 
4523
                                        while ( (node = node.nextSibling) )      {
 
4524
                                                if ( node.nodeType === 1 ) { 
 
4525
                                                        return false; 
 
4526
                                                }
 
4527
                                        }
 
4528
 
 
4529
                                        return true;
 
4530
 
 
4531
                                case "nth":
 
4532
                                        var first = match[2],
 
4533
                                                last = match[3];
 
4534
 
 
4535
                                        if ( first === 1 && last === 0 ) {
 
4536
                                                return true;
 
4537
                                        }
 
4538
                                        
 
4539
                                        var doneName = match[0],
 
4540
                                                parent = elem.parentNode;
 
4541
        
 
4542
                                        if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
 
4543
                                                var count = 0;
 
4544
                                                
 
4545
                                                for ( node = parent.firstChild; node; node = node.nextSibling ) {
 
4546
                                                        if ( node.nodeType === 1 ) {
 
4547
                                                                node.nodeIndex = ++count;
 
4548
                                                        }
 
4549
                                                } 
 
4550
 
 
4551
                                                parent.sizcache = doneName;
 
4552
                                        }
 
4553
                                        
 
4554
                                        var diff = elem.nodeIndex - last;
 
4555
 
 
4556
                                        if ( first === 0 ) {
 
4557
                                                return diff === 0;
 
4558
 
 
4559
                                        } else {
 
4560
                                                return ( diff % first === 0 && diff / first >= 0 );
 
4561
                                        }
 
4562
                        }
 
4563
                },
 
4564
 
 
4565
                ID: function( elem, match ) {
 
4566
                        return elem.nodeType === 1 && elem.getAttribute("id") === match;
 
4567
                },
 
4568
 
 
4569
                TAG: function( elem, match ) {
 
4570
                        return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
 
4571
                },
 
4572
                
 
4573
                CLASS: function( elem, match ) {
 
4574
                        return (" " + (elem.className || elem.getAttribute("class")) + " ")
 
4575
                                .indexOf( match ) > -1;
 
4576
                },
 
4577
 
 
4578
                ATTR: function( elem, match ) {
 
4579
                        var name = match[1],
 
4580
                                result = Expr.attrHandle[ name ] ?
 
4581
                                        Expr.attrHandle[ name ]( elem ) :
 
4582
                                        elem[ name ] != null ?
 
4583
                                                elem[ name ] :
 
4584
                                                elem.getAttribute( name ),
 
4585
                                value = result + "",
 
4586
                                type = match[2],
 
4587
                                check = match[4];
 
4588
 
 
4589
                        return result == null ?
 
4590
                                type === "!=" :
 
4591
                                type === "=" ?
 
4592
                                value === check :
 
4593
                                type === "*=" ?
 
4594
                                value.indexOf(check) >= 0 :
 
4595
                                type === "~=" ?
 
4596
                                (" " + value + " ").indexOf(check) >= 0 :
 
4597
                                !check ?
 
4598
                                value && result !== false :
 
4599
                                type === "!=" ?
 
4600
                                value !== check :
 
4601
                                type === "^=" ?
 
4602
                                value.indexOf(check) === 0 :
 
4603
                                type === "$=" ?
 
4604
                                value.substr(value.length - check.length) === check :
 
4605
                                type === "|=" ?
 
4606
                                value === check || value.substr(0, check.length + 1) === check + "-" :
 
4607
                                false;
 
4608
                },
 
4609
 
 
4610
                POS: function( elem, match, i, array ) {
 
4611
                        var name = match[2],
 
4612
                                filter = Expr.setFilters[ name ];
 
4613
 
 
4614
                        if ( filter ) {
 
4615
                                return filter( elem, i, match, array );
 
4616
                        }
 
4617
                }
 
4618
        }
 
4619
};
 
4620
 
 
4621
var origPOS = Expr.match.POS,
 
4622
        fescape = function(all, num){
 
4623
                return "\\" + (num - 0 + 1);
 
4624
        };
 
4625
 
 
4626
for ( var type in Expr.match ) {
 
4627
        Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
 
4628
        Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
 
4629
}
 
4630
 
 
4631
var makeArray = function( array, results ) {
 
4632
        array = Array.prototype.slice.call( array, 0 );
 
4633
 
 
4634
        if ( results ) {
 
4635
                results.push.apply( results, array );
 
4636
                return results;
 
4637
        }
 
4638
        
 
4639
        return array;
 
4640
};
 
4641
 
 
4642
// Perform a simple check to determine if the browser is capable of
 
4643
// converting a NodeList to an array using builtin methods.
 
4644
// Also verifies that the returned array holds DOM nodes
 
4645
// (which is not the case in the Blackberry browser)
 
4646
try {
 
4647
        Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
 
4648
 
 
4649
// Provide a fallback method if it does not work
 
4650
} catch( e ) {
 
4651
        makeArray = function( array, results ) {
 
4652
                var i = 0,
 
4653
                        ret = results || [];
 
4654
 
 
4655
                if ( toString.call(array) === "[object Array]" ) {
 
4656
                        Array.prototype.push.apply( ret, array );
 
4657
 
 
4658
                } else {
 
4659
                        if ( typeof array.length === "number" ) {
 
4660
                                for ( var l = array.length; i < l; i++ ) {
 
4661
                                        ret.push( array[i] );
 
4662
                                }
 
4663
 
 
4664
                        } else {
 
4665
                                for ( ; array[i]; i++ ) {
 
4666
                                        ret.push( array[i] );
 
4667
                                }
 
4668
                        }
 
4669
                }
 
4670
 
 
4671
                return ret;
 
4672
        };
 
4673
}
 
4674
 
 
4675
var sortOrder, siblingCheck;
 
4676
 
 
4677
if ( document.documentElement.compareDocumentPosition ) {
 
4678
        sortOrder = function( a, b ) {
 
4679
                if ( a === b ) {
 
4680
                        hasDuplicate = true;
 
4681
                        return 0;
 
4682
                }
 
4683
 
 
4684
                if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
 
4685
                        return a.compareDocumentPosition ? -1 : 1;
 
4686
                }
 
4687
 
 
4688
                return a.compareDocumentPosition(b) & 4 ? -1 : 1;
 
4689
        };
 
4690
 
 
4691
} else {
 
4692
        sortOrder = function( a, b ) {
 
4693
                // The nodes are identical, we can exit early
 
4694
                if ( a === b ) {
 
4695
                        hasDuplicate = true;
 
4696
                        return 0;
 
4697
 
 
4698
                // Fallback to using sourceIndex (in IE) if it's available on both nodes
 
4699
                } else if ( a.sourceIndex && b.sourceIndex ) {
 
4700
                        return a.sourceIndex - b.sourceIndex;
 
4701
                }
 
4702
 
 
4703
                var al, bl,
 
4704
                        ap = [],
 
4705
                        bp = [],
 
4706
                        aup = a.parentNode,
 
4707
                        bup = b.parentNode,
 
4708
                        cur = aup;
 
4709
 
 
4710
                // If the nodes are siblings (or identical) we can do a quick check
 
4711
                if ( aup === bup ) {
 
4712
                        return siblingCheck( a, b );
 
4713
 
 
4714
                // If no parents were found then the nodes are disconnected
 
4715
                } else if ( !aup ) {
 
4716
                        return -1;
 
4717
 
 
4718
                } else if ( !bup ) {
 
4719
                        return 1;
 
4720
                }
 
4721
 
 
4722
                // Otherwise they're somewhere else in the tree so we need
 
4723
                // to build up a full list of the parentNodes for comparison
 
4724
                while ( cur ) {
 
4725
                        ap.unshift( cur );
 
4726
                        cur = cur.parentNode;
 
4727
                }
 
4728
 
 
4729
                cur = bup;
 
4730
 
 
4731
                while ( cur ) {
 
4732
                        bp.unshift( cur );
 
4733
                        cur = cur.parentNode;
 
4734
                }
 
4735
 
 
4736
                al = ap.length;
 
4737
                bl = bp.length;
 
4738
 
 
4739
                // Start walking down the tree looking for a discrepancy
 
4740
                for ( var i = 0; i < al && i < bl; i++ ) {
 
4741
                        if ( ap[i] !== bp[i] ) {
 
4742
                                return siblingCheck( ap[i], bp[i] );
 
4743
                        }
 
4744
                }
 
4745
 
 
4746
                // We ended someplace up the tree so do a sibling check
 
4747
                return i === al ?
 
4748
                        siblingCheck( a, bp[i], -1 ) :
 
4749
                        siblingCheck( ap[i], b, 1 );
 
4750
        };
 
4751
 
 
4752
        siblingCheck = function( a, b, ret ) {
 
4753
                if ( a === b ) {
 
4754
                        return ret;
 
4755
                }
 
4756
 
 
4757
                var cur = a.nextSibling;
 
4758
 
 
4759
                while ( cur ) {
 
4760
                        if ( cur === b ) {
 
4761
                                return -1;
 
4762
                        }
 
4763
 
 
4764
                        cur = cur.nextSibling;
 
4765
                }
 
4766
 
 
4767
                return 1;
 
4768
        };
 
4769
}
 
4770
 
 
4771
// Utility function for retreiving the text value of an array of DOM nodes
 
4772
Sizzle.getText = function( elems ) {
 
4773
        var ret = "", elem;
 
4774
 
 
4775
        for ( var i = 0; elems[i]; i++ ) {
 
4776
                elem = elems[i];
 
4777
 
 
4778
                // Get the text from text nodes and CDATA nodes
 
4779
                if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
 
4780
                        ret += elem.nodeValue;
 
4781
 
 
4782
                // Traverse everything else, except comment nodes
 
4783
                } else if ( elem.nodeType !== 8 ) {
 
4784
                        ret += Sizzle.getText( elem.childNodes );
 
4785
                }
 
4786
        }
 
4787
 
 
4788
        return ret;
 
4789
};
 
4790
 
 
4791
// Check to see if the browser returns elements by name when
 
4792
// querying by getElementById (and provide a workaround)
 
4793
(function(){
 
4794
        // We're going to inject a fake input element with a specified name
 
4795
        var form = document.createElement("div"),
 
4796
                id = "script" + (new Date()).getTime(),
 
4797
                root = document.documentElement;
 
4798
 
 
4799
        form.innerHTML = "<a name='" + id + "'/>";
 
4800
 
 
4801
        // Inject it into the root element, check its status, and remove it quickly
 
4802
        root.insertBefore( form, root.firstChild );
 
4803
 
 
4804
        // The workaround has to do additional checks after a getElementById
 
4805
        // Which slows things down for other browsers (hence the branching)
 
4806
        if ( document.getElementById( id ) ) {
 
4807
                Expr.find.ID = function( match, context, isXML ) {
 
4808
                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
 
4809
                                var m = context.getElementById(match[1]);
 
4810
 
 
4811
                                return m ?
 
4812
                                        m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
 
4813
                                                [m] :
 
4814
                                                undefined :
 
4815
                                        [];
 
4816
                        }
 
4817
                };
 
4818
 
 
4819
                Expr.filter.ID = function( elem, match ) {
 
4820
                        var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
 
4821
 
 
4822
                        return elem.nodeType === 1 && node && node.nodeValue === match;
 
4823
                };
 
4824
        }
 
4825
 
 
4826
        root.removeChild( form );
 
4827
 
 
4828
        // release memory in IE
 
4829
        root = form = null;
 
4830
})();
 
4831
 
 
4832
(function(){
 
4833
        // Check to see if the browser returns only elements
 
4834
        // when doing getElementsByTagName("*")
 
4835
 
 
4836
        // Create a fake element
 
4837
        var div = document.createElement("div");
 
4838
        div.appendChild( document.createComment("") );
 
4839
 
 
4840
        // Make sure no comments are found
 
4841
        if ( div.getElementsByTagName("*").length > 0 ) {
 
4842
                Expr.find.TAG = function( match, context ) {
 
4843
                        var results = context.getElementsByTagName( match[1] );
 
4844
 
 
4845
                        // Filter out possible comments
 
4846
                        if ( match[1] === "*" ) {
 
4847
                                var tmp = [];
 
4848
 
 
4849
                                for ( var i = 0; results[i]; i++ ) {
 
4850
                                        if ( results[i].nodeType === 1 ) {
 
4851
                                                tmp.push( results[i] );
 
4852
                                        }
 
4853
                                }
 
4854
 
 
4855
                                results = tmp;
 
4856
                        }
 
4857
 
 
4858
                        return results;
 
4859
                };
 
4860
        }
 
4861
 
 
4862
        // Check to see if an attribute returns normalized href attributes
 
4863
        div.innerHTML = "<a href='#'></a>";
 
4864
 
 
4865
        if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
 
4866
                        div.firstChild.getAttribute("href") !== "#" ) {
 
4867
 
 
4868
                Expr.attrHandle.href = function( elem ) {
 
4869
                        return elem.getAttribute( "href", 2 );
 
4870
                };
 
4871
        }
 
4872
 
 
4873
        // release memory in IE
 
4874
        div = null;
 
4875
})();
 
4876
 
 
4877
if ( document.querySelectorAll ) {
 
4878
        (function(){
 
4879
                var oldSizzle = Sizzle,
 
4880
                        div = document.createElement("div"),
 
4881
                        id = "__sizzle__";
 
4882
 
 
4883
                div.innerHTML = "<p class='TEST'></p>";
 
4884
 
 
4885
                // Safari can't handle uppercase or unicode characters when
 
4886
                // in quirks mode.
 
4887
                if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
 
4888
                        return;
 
4889
                }
 
4890
        
 
4891
                Sizzle = function( query, context, extra, seed ) {
 
4892
                        context = context || document;
 
4893
 
 
4894
                        // Only use querySelectorAll on non-XML documents
 
4895
                        // (ID selectors don't work in non-HTML documents)
 
4896
                        if ( !seed && !Sizzle.isXML(context) ) {
 
4897
                                // See if we find a selector to speed up
 
4898
                                var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
 
4899
                                
 
4900
                                if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
 
4901
                                        // Speed-up: Sizzle("TAG")
 
4902
                                        if ( match[1] ) {
 
4903
                                                return makeArray( context.getElementsByTagName( query ), extra );
 
4904
                                        
 
4905
                                        // Speed-up: Sizzle(".CLASS")
 
4906
                                        } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
 
4907
                                                return makeArray( context.getElementsByClassName( match[2] ), extra );
 
4908
                                        }
 
4909
                                }
 
4910
                                
 
4911
                                if ( context.nodeType === 9 ) {
 
4912
                                        // Speed-up: Sizzle("body")
 
4913
                                        // The body element only exists once, optimize finding it
 
4914
                                        if ( query === "body" && context.body ) {
 
4915
                                                return makeArray( [ context.body ], extra );
 
4916
                                                
 
4917
                                        // Speed-up: Sizzle("#ID")
 
4918
                                        } else if ( match && match[3] ) {
 
4919
                                                var elem = context.getElementById( match[3] );
 
4920
 
 
4921
                                                // Check parentNode to catch when Blackberry 4.6 returns
 
4922
                                                // nodes that are no longer in the document #6963
 
4923
                                                if ( elem && elem.parentNode ) {
 
4924
                                                        // Handle the case where IE and Opera return items
 
4925
                                                        // by name instead of ID
 
4926
                                                        if ( elem.id === match[3] ) {
 
4927
                                                                return makeArray( [ elem ], extra );
 
4928
                                                        }
 
4929
                                                        
 
4930
                                                } else {
 
4931
                                                        return makeArray( [], extra );
 
4932
                                                }
 
4933
                                        }
 
4934
                                        
 
4935
                                        try {
 
4936
                                                return makeArray( context.querySelectorAll(query), extra );
 
4937
                                        } catch(qsaError) {}
 
4938
 
 
4939
                                // qSA works strangely on Element-rooted queries
 
4940
                                // We can work around this by specifying an extra ID on the root
 
4941
                                // and working up from there (Thanks to Andrew Dupont for the technique)
 
4942
                                // IE 8 doesn't work on object elements
 
4943
                                } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
 
4944
                                        var oldContext = context,
 
4945
                                                old = context.getAttribute( "id" ),
 
4946
                                                nid = old || id,
 
4947
                                                hasParent = context.parentNode,
 
4948
                                                relativeHierarchySelector = /^\s*[+~]/.test( query );
 
4949
 
 
4950
                                        if ( !old ) {
 
4951
                                                context.setAttribute( "id", nid );
 
4952
                                        } else {
 
4953
                                                nid = nid.replace( /'/g, "\\$&" );
 
4954
                                        }
 
4955
                                        if ( relativeHierarchySelector && hasParent ) {
 
4956
                                                context = context.parentNode;
 
4957
                                        }
 
4958
 
 
4959
                                        try {
 
4960
                                                if ( !relativeHierarchySelector || hasParent ) {
 
4961
                                                        return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
 
4962
                                                }
 
4963
 
 
4964
                                        } catch(pseudoError) {
 
4965
                                        } finally {
 
4966
                                                if ( !old ) {
 
4967
                                                        oldContext.removeAttribute( "id" );
 
4968
                                                }
 
4969
                                        }
 
4970
                                }
 
4971
                        }
 
4972
                
 
4973
                        return oldSizzle(query, context, extra, seed);
 
4974
                };
 
4975
 
 
4976
                for ( var prop in oldSizzle ) {
 
4977
                        Sizzle[ prop ] = oldSizzle[ prop ];
 
4978
                }
 
4979
 
 
4980
                // release memory in IE
 
4981
                div = null;
 
4982
        })();
 
4983
}
 
4984
 
 
4985
(function(){
 
4986
        var html = document.documentElement,
 
4987
                matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
 
4988
 
 
4989
        if ( matches ) {
 
4990
                // Check to see if it's possible to do matchesSelector
 
4991
                // on a disconnected node (IE 9 fails this)
 
4992
                var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
 
4993
                        pseudoWorks = false;
 
4994
 
 
4995
                try {
 
4996
                        // This should fail with an exception
 
4997
                        // Gecko does not error, returns false instead
 
4998
                        matches.call( document.documentElement, "[test!='']:sizzle" );
 
4999
        
 
5000
                } catch( pseudoError ) {
 
5001
                        pseudoWorks = true;
 
5002
                }
 
5003
 
 
5004
                Sizzle.matchesSelector = function( node, expr ) {
 
5005
                        // Make sure that attribute selectors are quoted
 
5006
                        expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
 
5007
 
 
5008
                        if ( !Sizzle.isXML( node ) ) {
 
5009
                                try { 
 
5010
                                        if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
 
5011
                                                var ret = matches.call( node, expr );
 
5012
 
 
5013
                                                // IE 9's matchesSelector returns false on disconnected nodes
 
5014
                                                if ( ret || !disconnectedMatch ||
 
5015
                                                                // As well, disconnected nodes are said to be in a document
 
5016
                                                                // fragment in IE 9, so check for that
 
5017
                                                                node.document && node.document.nodeType !== 11 ) {
 
5018
                                                        return ret;
 
5019
                                                }
 
5020
                                        }
 
5021
                                } catch(e) {}
 
5022
                        }
 
5023
 
 
5024
                        return Sizzle(expr, null, null, [node]).length > 0;
 
5025
                };
 
5026
        }
 
5027
})();
 
5028
 
 
5029
(function(){
 
5030
        var div = document.createElement("div");
 
5031
 
 
5032
        div.innerHTML = "<div class='test e'></div><div class='test'></div>";
 
5033
 
 
5034
        // Opera can't find a second classname (in 9.6)
 
5035
        // Also, make sure that getElementsByClassName actually exists
 
5036
        if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
 
5037
                return;
 
5038
        }
 
5039
 
 
5040
        // Safari caches class attributes, doesn't catch changes (in 3.2)
 
5041
        div.lastChild.className = "e";
 
5042
 
 
5043
        if ( div.getElementsByClassName("e").length === 1 ) {
 
5044
                return;
 
5045
        }
 
5046
        
 
5047
        Expr.order.splice(1, 0, "CLASS");
 
5048
        Expr.find.CLASS = function( match, context, isXML ) {
 
5049
                if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
 
5050
                        return context.getElementsByClassName(match[1]);
 
5051
                }
 
5052
        };
 
5053
 
 
5054
        // release memory in IE
 
5055
        div = null;
 
5056
})();
 
5057
 
 
5058
function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
 
5059
        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
 
5060
                var elem = checkSet[i];
 
5061
 
 
5062
                if ( elem ) {
 
5063
                        var match = false;
 
5064
 
 
5065
                        elem = elem[dir];
 
5066
 
 
5067
                        while ( elem ) {
 
5068
                                if ( elem.sizcache === doneName ) {
 
5069
                                        match = checkSet[elem.sizset];
 
5070
                                        break;
 
5071
                                }
 
5072
 
 
5073
                                if ( elem.nodeType === 1 && !isXML ){
 
5074
                                        elem.sizcache = doneName;
 
5075
                                        elem.sizset = i;
 
5076
                                }
 
5077
 
 
5078
                                if ( elem.nodeName.toLowerCase() === cur ) {
 
5079
                                        match = elem;
 
5080
                                        break;
 
5081
                                }
 
5082
 
 
5083
                                elem = elem[dir];
 
5084
                        }
 
5085
 
 
5086
                        checkSet[i] = match;
 
5087
                }
 
5088
        }
 
5089
}
 
5090
 
 
5091
function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
 
5092
        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
 
5093
                var elem = checkSet[i];
 
5094
 
 
5095
                if ( elem ) {
 
5096
                        var match = false;
 
5097
                        
 
5098
                        elem = elem[dir];
 
5099
 
 
5100
                        while ( elem ) {
 
5101
                                if ( elem.sizcache === doneName ) {
 
5102
                                        match = checkSet[elem.sizset];
 
5103
                                        break;
 
5104
                                }
 
5105
 
 
5106
                                if ( elem.nodeType === 1 ) {
 
5107
                                        if ( !isXML ) {
 
5108
                                                elem.sizcache = doneName;
 
5109
                                                elem.sizset = i;
 
5110
                                        }
 
5111
 
 
5112
                                        if ( typeof cur !== "string" ) {
 
5113
                                                if ( elem === cur ) {
 
5114
                                                        match = true;
 
5115
                                                        break;
 
5116
                                                }
 
5117
 
 
5118
                                        } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
 
5119
                                                match = elem;
 
5120
                                                break;
 
5121
                                        }
 
5122
                                }
 
5123
 
 
5124
                                elem = elem[dir];
 
5125
                        }
 
5126
 
 
5127
                        checkSet[i] = match;
 
5128
                }
 
5129
        }
 
5130
}
 
5131
 
 
5132
if ( document.documentElement.contains ) {
 
5133
        Sizzle.contains = function( a, b ) {
 
5134
                return a !== b && (a.contains ? a.contains(b) : true);
 
5135
        };
 
5136
 
 
5137
} else if ( document.documentElement.compareDocumentPosition ) {
 
5138
        Sizzle.contains = function( a, b ) {
 
5139
                return !!(a.compareDocumentPosition(b) & 16);
 
5140
        };
 
5141
 
 
5142
} else {
 
5143
        Sizzle.contains = function() {
 
5144
                return false;
 
5145
        };
 
5146
}
 
5147
 
 
5148
Sizzle.isXML = function( elem ) {
 
5149
        // documentElement is verified for cases where it doesn't yet exist
 
5150
        // (such as loading iframes in IE - #4833) 
 
5151
        var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
 
5152
 
 
5153
        return documentElement ? documentElement.nodeName !== "HTML" : false;
 
5154
};
 
5155
 
 
5156
var posProcess = function( selector, context ) {
 
5157
        var match,
 
5158
                tmpSet = [],
 
5159
                later = "",
 
5160
                root = context.nodeType ? [context] : context;
 
5161
 
 
5162
        // Position selectors must be done after the filter
 
5163
        // And so must :not(positional) so we move all PSEUDOs to the end
 
5164
        while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
 
5165
                later += match[0];
 
5166
                selector = selector.replace( Expr.match.PSEUDO, "" );
 
5167
        }
 
5168
 
 
5169
        selector = Expr.relative[selector] ? selector + "*" : selector;
 
5170
 
 
5171
        for ( var i = 0, l = root.length; i < l; i++ ) {
 
5172
                Sizzle( selector, root[i], tmpSet );
 
5173
        }
 
5174
 
 
5175
        return Sizzle.filter( later, tmpSet );
 
5176
};
 
5177
 
 
5178
// EXPOSE
 
5179
jQuery.find = Sizzle;
 
5180
jQuery.expr = Sizzle.selectors;
 
5181
jQuery.expr[":"] = jQuery.expr.filters;
 
5182
jQuery.unique = Sizzle.uniqueSort;
 
5183
jQuery.text = Sizzle.getText;
 
5184
jQuery.isXMLDoc = Sizzle.isXML;
 
5185
jQuery.contains = Sizzle.contains;
 
5186
 
 
5187
 
 
5188
})();
 
5189
 
 
5190
 
 
5191
var runtil = /Until$/,
 
5192
        rparentsprev = /^(?:parents|prevUntil|prevAll)/,
 
5193
        // Note: This RegExp should be improved, or likely pulled from Sizzle
 
5194
        rmultiselector = /,/,
 
5195
        isSimple = /^.[^:#\[\.,]*$/,
 
5196
        slice = Array.prototype.slice,
 
5197
        POS = jQuery.expr.match.POS,
 
5198
        // methods guaranteed to produce a unique set when starting from a unique set
 
5199
        guaranteedUnique = {
 
5200
                children: true,
 
5201
                contents: true,
 
5202
                next: true,
 
5203
                prev: true
 
5204
        };
 
5205
 
 
5206
jQuery.fn.extend({
 
5207
        find: function( selector ) {
 
5208
                var self = this,
 
5209
                        i, l;
 
5210
 
 
5211
                if ( typeof selector !== "string" ) {
 
5212
                        return jQuery( selector ).filter(function() {
 
5213
                                for ( i = 0, l = self.length; i < l; i++ ) {
 
5214
                                        if ( jQuery.contains( self[ i ], this ) ) {
 
5215
                                                return true;
 
5216
                                        }
 
5217
                                }
 
5218
                        });
 
5219
                }
 
5220
 
 
5221
                var ret = this.pushStack( "", "find", selector ),
 
5222
                        length, n, r;
 
5223
 
 
5224
                for ( i = 0, l = this.length; i < l; i++ ) {
 
5225
                        length = ret.length;
 
5226
                        jQuery.find( selector, this[i], ret );
 
5227
 
 
5228
                        if ( i > 0 ) {
 
5229
                                // Make sure that the results are unique
 
5230
                                for ( n = length; n < ret.length; n++ ) {
 
5231
                                        for ( r = 0; r < length; r++ ) {
 
5232
                                                if ( ret[r] === ret[n] ) {
 
5233
                                                        ret.splice(n--, 1);
 
5234
                                                        break;
 
5235
                                                }
 
5236
                                        }
 
5237
                                }
 
5238
                        }
 
5239
                }
 
5240
 
 
5241
                return ret;
 
5242
        },
 
5243
 
 
5244
        has: function( target ) {
 
5245
                var targets = jQuery( target );
 
5246
                return this.filter(function() {
 
5247
                        for ( var i = 0, l = targets.length; i < l; i++ ) {
 
5248
                                if ( jQuery.contains( this, targets[i] ) ) {
 
5249
                                        return true;
 
5250
                                }
 
5251
                        }
 
5252
                });
 
5253
        },
 
5254
 
 
5255
        not: function( selector ) {
 
5256
                return this.pushStack( winnow(this, selector, false), "not", selector);
 
5257
        },
 
5258
 
 
5259
        filter: function( selector ) {
 
5260
                return this.pushStack( winnow(this, selector, true), "filter", selector );
 
5261
        },
 
5262
 
 
5263
        is: function( selector ) {
 
5264
                return !!selector && ( typeof selector === "string" ?
 
5265
                        jQuery.filter( selector, this ).length > 0 :
 
5266
                        this.filter( selector ).length > 0 );
 
5267
        },
 
5268
 
 
5269
        closest: function( selectors, context ) {
 
5270
                var ret = [], i, l, cur = this[0];
 
5271
                
 
5272
                // Array
 
5273
                if ( jQuery.isArray( selectors ) ) {
 
5274
                        var match, selector,
 
5275
                                matches = {},
 
5276
                                level = 1;
 
5277
 
 
5278
                        if ( cur && selectors.length ) {
 
5279
                                for ( i = 0, l = selectors.length; i < l; i++ ) {
 
5280
                                        selector = selectors[i];
 
5281
 
 
5282
                                        if ( !matches[ selector ] ) {
 
5283
                                                matches[ selector ] = POS.test( selector ) ?
 
5284
                                                        jQuery( selector, context || this.context ) :
 
5285
                                                        selector;
 
5286
                                        }
 
5287
                                }
 
5288
 
 
5289
                                while ( cur && cur.ownerDocument && cur !== context ) {
 
5290
                                        for ( selector in matches ) {
 
5291
                                                match = matches[ selector ];
 
5292
 
 
5293
                                                if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) {
 
5294
                                                        ret.push({ selector: selector, elem: cur, level: level });
 
5295
                                                }
 
5296
                                        }
 
5297
 
 
5298
                                        cur = cur.parentNode;
 
5299
                                        level++;
 
5300
                                }
 
5301
                        }
 
5302
 
 
5303
                        return ret;
 
5304
                }
 
5305
 
 
5306
                // String
 
5307
                var pos = POS.test( selectors ) || typeof selectors !== "string" ?
 
5308
                                jQuery( selectors, context || this.context ) :
 
5309
                                0;
 
5310
 
 
5311
                for ( i = 0, l = this.length; i < l; i++ ) {
 
5312
                        cur = this[i];
 
5313
 
 
5314
                        while ( cur ) {
 
5315
                                if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
 
5316
                                        ret.push( cur );
 
5317
                                        break;
 
5318
 
 
5319
                                } else {
 
5320
                                        cur = cur.parentNode;
 
5321
                                        if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
 
5322
                                                break;
 
5323
                                        }
 
5324
                                }
 
5325
                        }
 
5326
                }
 
5327
 
 
5328
                ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
 
5329
 
 
5330
                return this.pushStack( ret, "closest", selectors );
 
5331
        },
 
5332
 
 
5333
        // Determine the position of an element within
 
5334
        // the matched set of elements
 
5335
        index: function( elem ) {
 
5336
 
 
5337
                // No argument, return index in parent
 
5338
                if ( !elem ) {
 
5339
                        return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
 
5340
                }
 
5341
 
 
5342
                // index in selector
 
5343
                if ( typeof elem === "string" ) {
 
5344
                        return jQuery.inArray( this[0], jQuery( elem ) );
 
5345
                }
 
5346
 
 
5347
                // Locate the position of the desired element
 
5348
                return jQuery.inArray(
 
5349
                        // If it receives a jQuery object, the first element is used
 
5350
                        elem.jquery ? elem[0] : elem, this );
 
5351
        },
 
5352
 
 
5353
        add: function( selector, context ) {
 
5354
                var set = typeof selector === "string" ?
 
5355
                                jQuery( selector, context ) :
 
5356
                                jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
 
5357
                        all = jQuery.merge( this.get(), set );
 
5358
 
 
5359
                return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
 
5360
                        all :
 
5361
                        jQuery.unique( all ) );
 
5362
        },
 
5363
 
 
5364
        andSelf: function() {
 
5365
                return this.add( this.prevObject );
 
5366
        }
 
5367
});
 
5368
 
 
5369
// A painfully simple check to see if an element is disconnected
 
5370
// from a document (should be improved, where feasible).
 
5371
function isDisconnected( node ) {
 
5372
        return !node || !node.parentNode || node.parentNode.nodeType === 11;
 
5373
}
 
5374
 
 
5375
jQuery.each({
 
5376
        parent: function( elem ) {
 
5377
                var parent = elem.parentNode;
 
5378
                return parent && parent.nodeType !== 11 ? parent : null;
 
5379
        },
 
5380
        parents: function( elem ) {
 
5381
                return jQuery.dir( elem, "parentNode" );
 
5382
        },
 
5383
        parentsUntil: function( elem, i, until ) {
 
5384
                return jQuery.dir( elem, "parentNode", until );
 
5385
        },
 
5386
        next: function( elem ) {
 
5387
                return jQuery.nth( elem, 2, "nextSibling" );
 
5388
        },
 
5389
        prev: function( elem ) {
 
5390
                return jQuery.nth( elem, 2, "previousSibling" );
 
5391
        },
 
5392
        nextAll: function( elem ) {
 
5393
                return jQuery.dir( elem, "nextSibling" );
 
5394
        },
 
5395
        prevAll: function( elem ) {
 
5396
                return jQuery.dir( elem, "previousSibling" );
 
5397
        },
 
5398
        nextUntil: function( elem, i, until ) {
 
5399
                return jQuery.dir( elem, "nextSibling", until );
 
5400
        },
 
5401
        prevUntil: function( elem, i, until ) {
 
5402
                return jQuery.dir( elem, "previousSibling", until );
 
5403
        },
 
5404
        siblings: function( elem ) {
 
5405
                return jQuery.sibling( elem.parentNode.firstChild, elem );
 
5406
        },
 
5407
        children: function( elem ) {
 
5408
                return jQuery.sibling( elem.firstChild );
 
5409
        },
 
5410
        contents: function( elem ) {
 
5411
                return jQuery.nodeName( elem, "iframe" ) ?
 
5412
                        elem.contentDocument || elem.contentWindow.document :
 
5413
                        jQuery.makeArray( elem.childNodes );
 
5414
        }
 
5415
}, function( name, fn ) {
 
5416
        jQuery.fn[ name ] = function( until, selector ) {
 
5417
                var ret = jQuery.map( this, fn, until ),
 
5418
                        // The variable 'args' was introduced in
 
5419
                        // https://github.com/jquery/jquery/commit/52a0238
 
5420
                        // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
 
5421
                        // http://code.google.com/p/v8/issues/detail?id=1050
 
5422
                        args = slice.call(arguments);
 
5423
 
 
5424
                if ( !runtil.test( name ) ) {
 
5425
                        selector = until;
 
5426
                }
 
5427
 
 
5428
                if ( selector && typeof selector === "string" ) {
 
5429
                        ret = jQuery.filter( selector, ret );
 
5430
                }
 
5431
 
 
5432
                ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
 
5433
 
 
5434
                if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
 
5435
                        ret = ret.reverse();
 
5436
                }
 
5437
 
 
5438
                return this.pushStack( ret, name, args.join(",") );
 
5439
        };
 
5440
});
 
5441
 
 
5442
jQuery.extend({
 
5443
        filter: function( expr, elems, not ) {
 
5444
                if ( not ) {
 
5445
                        expr = ":not(" + expr + ")";
 
5446
                }
 
5447
 
 
5448
                return elems.length === 1 ?
 
5449
                        jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
 
5450
                        jQuery.find.matches(expr, elems);
 
5451
        },
 
5452
 
 
5453
        dir: function( elem, dir, until ) {
 
5454
                var matched = [],
 
5455
                        cur = elem[ dir ];
 
5456
 
 
5457
                while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
 
5458
                        if ( cur.nodeType === 1 ) {
 
5459
                                matched.push( cur );
 
5460
                        }
 
5461
                        cur = cur[dir];
 
5462
                }
 
5463
                return matched;
 
5464
        },
 
5465
 
 
5466
        nth: function( cur, result, dir, elem ) {
 
5467
                result = result || 1;
 
5468
                var num = 0;
 
5469
 
 
5470
                for ( ; cur; cur = cur[dir] ) {
 
5471
                        if ( cur.nodeType === 1 && ++num === result ) {
 
5472
                                break;
 
5473
                        }
 
5474
                }
 
5475
 
 
5476
                return cur;
 
5477
        },
 
5478
 
 
5479
        sibling: function( n, elem ) {
 
5480
                var r = [];
 
5481
 
 
5482
                for ( ; n; n = n.nextSibling ) {
 
5483
                        if ( n.nodeType === 1 && n !== elem ) {
 
5484
                                r.push( n );
 
5485
                        }
 
5486
                }
 
5487
 
 
5488
                return r;
 
5489
        }
 
5490
});
 
5491
 
 
5492
// Implement the identical functionality for filter and not
 
5493
function winnow( elements, qualifier, keep ) {
 
5494
 
 
5495
        // Can't pass null or undefined to indexOf in Firefox 4
 
5496
        // Set to 0 to skip string check
 
5497
        qualifier = qualifier || 0;
 
5498
 
 
5499
        if ( jQuery.isFunction( qualifier ) ) {
 
5500
                return jQuery.grep(elements, function( elem, i ) {
 
5501
                        var retVal = !!qualifier.call( elem, i, elem );
 
5502
                        return retVal === keep;
 
5503
                });
 
5504
 
 
5505
        } else if ( qualifier.nodeType ) {
 
5506
                return jQuery.grep(elements, function( elem, i ) {
 
5507
                        return (elem === qualifier) === keep;
 
5508
                });
 
5509
 
 
5510
        } else if ( typeof qualifier === "string" ) {
 
5511
                var filtered = jQuery.grep(elements, function( elem ) {
 
5512
                        return elem.nodeType === 1;
 
5513
                });
 
5514
 
 
5515
                if ( isSimple.test( qualifier ) ) {
 
5516
                        return jQuery.filter(qualifier, filtered, !keep);
 
5517
                } else {
 
5518
                        qualifier = jQuery.filter( qualifier, filtered );
 
5519
                }
 
5520
        }
 
5521
 
 
5522
        return jQuery.grep(elements, function( elem, i ) {
 
5523
                return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
 
5524
        });
 
5525
}
 
5526
 
 
5527
 
 
5528
 
 
5529
 
 
5530
var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
 
5531
        rleadingWhitespace = /^\s+/,
 
5532
        rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
 
5533
        rtagName = /<([\w:]+)/,
 
5534
        rtbody = /<tbody/i,
 
5535
        rhtml = /<|&#?\w+;/,
 
5536
        rnocache = /<(?:script|object|embed|option|style)/i,
 
5537
        // checked="checked" or checked
 
5538
        rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
 
5539
        rscriptType = /\/(java|ecma)script/i,
 
5540
        rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
 
5541
        wrapMap = {
 
5542
                option: [ 1, "<select multiple='multiple'>", "</select>" ],
 
5543
                legend: [ 1, "<fieldset>", "</fieldset>" ],
 
5544
                thead: [ 1, "<table>", "</table>" ],
 
5545
                tr: [ 2, "<table><tbody>", "</tbody></table>" ],
 
5546
                td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
 
5547
                col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
 
5548
                area: [ 1, "<map>", "</map>" ],
 
5549
                _default: [ 0, "", "" ]
 
5550
        };
 
5551
 
 
5552
wrapMap.optgroup = wrapMap.option;
 
5553
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
 
5554
wrapMap.th = wrapMap.td;
 
5555
 
 
5556
// IE can't serialize <link> and <script> tags normally
 
5557
if ( !jQuery.support.htmlSerialize ) {
 
5558
        wrapMap._default = [ 1, "div<div>", "</div>" ];
 
5559
}
 
5560
 
 
5561
jQuery.fn.extend({
 
5562
        text: function( text ) {
 
5563
                if ( jQuery.isFunction(text) ) {
 
5564
                        return this.each(function(i) {
 
5565
                                var self = jQuery( this );
 
5566
 
 
5567
                                self.text( text.call(this, i, self.text()) );
 
5568
                        });
 
5569
                }
 
5570
 
 
5571
                if ( typeof text !== "object" && text !== undefined ) {
 
5572
                        return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
 
5573
                }
 
5574
 
 
5575
                return jQuery.text( this );
 
5576
        },
 
5577
 
 
5578
        wrapAll: function( html ) {
 
5579
                if ( jQuery.isFunction( html ) ) {
 
5580
                        return this.each(function(i) {
 
5581
                                jQuery(this).wrapAll( html.call(this, i) );
 
5582
                        });
 
5583
                }
 
5584
 
 
5585
                if ( this[0] ) {
 
5586
                        // The elements to wrap the target around
 
5587
                        var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
 
5588
 
 
5589
                        if ( this[0].parentNode ) {
 
5590
                                wrap.insertBefore( this[0] );
 
5591
                        }
 
5592
 
 
5593
                        wrap.map(function() {
 
5594
                                var elem = this;
 
5595
 
 
5596
                                while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
 
5597
                                        elem = elem.firstChild;
 
5598
                                }
 
5599
 
 
5600
                                return elem;
 
5601
                        }).append( this );
 
5602
                }
 
5603
 
 
5604
                return this;
 
5605
        },
 
5606
 
 
5607
        wrapInner: function( html ) {
 
5608
                if ( jQuery.isFunction( html ) ) {
 
5609
                        return this.each(function(i) {
 
5610
                                jQuery(this).wrapInner( html.call(this, i) );
 
5611
                        });
 
5612
                }
 
5613
 
 
5614
                return this.each(function() {
 
5615
                        var self = jQuery( this ),
 
5616
                                contents = self.contents();
 
5617
 
 
5618
                        if ( contents.length ) {
 
5619
                                contents.wrapAll( html );
 
5620
 
 
5621
                        } else {
 
5622
                                self.append( html );
 
5623
                        }
 
5624
                });
 
5625
        },
 
5626
 
 
5627
        wrap: function( html ) {
 
5628
                return this.each(function() {
 
5629
                        jQuery( this ).wrapAll( html );
 
5630
                });
 
5631
        },
 
5632
 
 
5633
        unwrap: function() {
 
5634
                return this.parent().each(function() {
 
5635
                        if ( !jQuery.nodeName( this, "body" ) ) {
 
5636
                                jQuery( this ).replaceWith( this.childNodes );
 
5637
                        }
 
5638
                }).end();
 
5639
        },
 
5640
 
 
5641
        append: function() {
 
5642
                return this.domManip(arguments, true, function( elem ) {
 
5643
                        if ( this.nodeType === 1 ) {
 
5644
                                this.appendChild( elem );
 
5645
                        }
 
5646
                });
 
5647
        },
 
5648
 
 
5649
        prepend: function() {
 
5650
                return this.domManip(arguments, true, function( elem ) {
 
5651
                        if ( this.nodeType === 1 ) {
 
5652
                                this.insertBefore( elem, this.firstChild );
 
5653
                        }
 
5654
                });
 
5655
        },
 
5656
 
 
5657
        before: function() {
 
5658
                if ( this[0] && this[0].parentNode ) {
 
5659
                        return this.domManip(arguments, false, function( elem ) {
 
5660
                                this.parentNode.insertBefore( elem, this );
 
5661
                        });
 
5662
                } else if ( arguments.length ) {
 
5663
                        var set = jQuery(arguments[0]);
 
5664
                        set.push.apply( set, this.toArray() );
 
5665
                        return this.pushStack( set, "before", arguments );
 
5666
                }
 
5667
        },
 
5668
 
 
5669
        after: function() {
 
5670
                if ( this[0] && this[0].parentNode ) {
 
5671
                        return this.domManip(arguments, false, function( elem ) {
 
5672
                                this.parentNode.insertBefore( elem, this.nextSibling );
 
5673
                        });
 
5674
                } else if ( arguments.length ) {
 
5675
                        var set = this.pushStack( this, "after", arguments );
 
5676
                        set.push.apply( set, jQuery(arguments[0]).toArray() );
 
5677
                        return set;
 
5678
                }
 
5679
        },
 
5680
 
 
5681
        // keepData is for internal use only--do not document
 
5682
        remove: function( selector, keepData ) {
 
5683
                for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
 
5684
                        if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
 
5685
                                if ( !keepData && elem.nodeType === 1 ) {
 
5686
                                        jQuery.cleanData( elem.getElementsByTagName("*") );
 
5687
                                        jQuery.cleanData( [ elem ] );
 
5688
                                }
 
5689
 
 
5690
                                if ( elem.parentNode ) {
 
5691
                                        elem.parentNode.removeChild( elem );
 
5692
                                }
 
5693
                        }
 
5694
                }
 
5695
 
 
5696
                return this;
 
5697
        },
 
5698
 
 
5699
        empty: function() {
 
5700
                for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
 
5701
                        // Remove element nodes and prevent memory leaks
 
5702
                        if ( elem.nodeType === 1 ) {
 
5703
                                jQuery.cleanData( elem.getElementsByTagName("*") );
 
5704
                        }
 
5705
 
 
5706
                        // Remove any remaining nodes
 
5707
                        while ( elem.firstChild ) {
 
5708
                                elem.removeChild( elem.firstChild );
 
5709
                        }
 
5710
                }
 
5711
 
 
5712
                return this;
 
5713
        },
 
5714
 
 
5715
        clone: function( dataAndEvents, deepDataAndEvents ) {
 
5716
                dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
 
5717
                deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
 
5718
 
 
5719
                return this.map( function () {
 
5720
                        return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
 
5721
                });
 
5722
        },
 
5723
 
 
5724
        html: function( value ) {
 
5725
                if ( value === undefined ) {
 
5726
                        return this[0] && this[0].nodeType === 1 ?
 
5727
                                this[0].innerHTML.replace(rinlinejQuery, "") :
 
5728
                                null;
 
5729
 
 
5730
                // See if we can take a shortcut and just use innerHTML
 
5731
                } else if ( typeof value === "string" && !rnocache.test( value ) &&
 
5732
                        (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
 
5733
                        !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
 
5734
 
 
5735
                        value = value.replace(rxhtmlTag, "<$1></$2>");
 
5736
 
 
5737
                        try {
 
5738
                                for ( var i = 0, l = this.length; i < l; i++ ) {
 
5739
                                        // Remove element nodes and prevent memory leaks
 
5740
                                        if ( this[i].nodeType === 1 ) {
 
5741
                                                jQuery.cleanData( this[i].getElementsByTagName("*") );
 
5742
                                                this[i].innerHTML = value;
 
5743
                                        }
 
5744
                                }
 
5745
 
 
5746
                        // If using innerHTML throws an exception, use the fallback method
 
5747
                        } catch(e) {
 
5748
                                this.empty().append( value );
 
5749
                        }
 
5750
 
 
5751
                } else if ( jQuery.isFunction( value ) ) {
 
5752
                        this.each(function(i){
 
5753
                                var self = jQuery( this );
 
5754
 
 
5755
                                self.html( value.call(this, i, self.html()) );
 
5756
                        });
 
5757
 
 
5758
                } else {
 
5759
                        this.empty().append( value );
 
5760
                }
 
5761
 
 
5762
                return this;
 
5763
        },
 
5764
 
 
5765
        replaceWith: function( value ) {
 
5766
                if ( this[0] && this[0].parentNode ) {
 
5767
                        // Make sure that the elements are removed from the DOM before they are inserted
 
5768
                        // this can help fix replacing a parent with child elements
 
5769
                        if ( jQuery.isFunction( value ) ) {
 
5770
                                return this.each(function(i) {
 
5771
                                        var self = jQuery(this), old = self.html();
 
5772
                                        self.replaceWith( value.call( this, i, old ) );
 
5773
                                });
 
5774
                        }
 
5775
 
 
5776
                        if ( typeof value !== "string" ) {
 
5777
                                value = jQuery( value ).detach();
 
5778
                        }
 
5779
 
 
5780
                        return this.each(function() {
 
5781
                                var next = this.nextSibling,
 
5782
                                        parent = this.parentNode;
 
5783
 
 
5784
                                jQuery( this ).remove();
 
5785
 
 
5786
                                if ( next ) {
 
5787
                                        jQuery(next).before( value );
 
5788
                                } else {
 
5789
                                        jQuery(parent).append( value );
 
5790
                                }
 
5791
                        });
 
5792
                } else {
 
5793
                        return this.length ?
 
5794
                                this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
 
5795
                                this;
 
5796
                }
 
5797
        },
 
5798
 
 
5799
        detach: function( selector ) {
 
5800
                return this.remove( selector, true );
 
5801
        },
 
5802
 
 
5803
        domManip: function( args, table, callback ) {
 
5804
                var results, first, fragment, parent,
 
5805
                        value = args[0],
 
5806
                        scripts = [];
 
5807
 
 
5808
                // We can't cloneNode fragments that contain checked, in WebKit
 
5809
                if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
 
5810
                        return this.each(function() {
 
5811
                                jQuery(this).domManip( args, table, callback, true );
 
5812
                        });
 
5813
                }
 
5814
 
 
5815
                if ( jQuery.isFunction(value) ) {
 
5816
                        return this.each(function(i) {
 
5817
                                var self = jQuery(this);
 
5818
                                args[0] = value.call(this, i, table ? self.html() : undefined);
 
5819
                                self.domManip( args, table, callback );
 
5820
                        });
 
5821
                }
 
5822
 
 
5823
                if ( this[0] ) {
 
5824
                        parent = value && value.parentNode;
 
5825
 
 
5826
                        // If we're in a fragment, just use that instead of building a new one
 
5827
                        if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
 
5828
                                results = { fragment: parent };
 
5829
 
 
5830
                        } else {
 
5831
                                results = jQuery.buildFragment( args, this, scripts );
 
5832
                        }
 
5833
 
 
5834
                        fragment = results.fragment;
 
5835
 
 
5836
                        if ( fragment.childNodes.length === 1 ) {
 
5837
                                first = fragment = fragment.firstChild;
 
5838
                        } else {
 
5839
                                first = fragment.firstChild;
 
5840
                        }
 
5841
 
 
5842
                        if ( first ) {
 
5843
                                table = table && jQuery.nodeName( first, "tr" );
 
5844
 
 
5845
                                for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
 
5846
                                        callback.call(
 
5847
                                                table ?
 
5848
                                                        root(this[i], first) :
 
5849
                                                        this[i],
 
5850
                                                // Make sure that we do not leak memory by inadvertently discarding
 
5851
                                                // the original fragment (which might have attached data) instead of
 
5852
                                                // using it; in addition, use the original fragment object for the last
 
5853
                                                // item instead of first because it can end up being emptied incorrectly
 
5854
                                                // in certain situations (Bug #8070).
 
5855
                                                // Fragments from the fragment cache must always be cloned and never used
 
5856
                                                // in place.
 
5857
                                                results.cacheable || (l > 1 && i < lastIndex) ?
 
5858
                                                        jQuery.clone( fragment, true, true ) :
 
5859
                                                        fragment
 
5860
                                        );
 
5861
                                }
 
5862
                        }
 
5863
 
 
5864
                        if ( scripts.length ) {
 
5865
                                jQuery.each( scripts, evalScript );
 
5866
                        }
 
5867
                }
 
5868
 
 
5869
                return this;
 
5870
        }
 
5871
});
 
5872
 
 
5873
function root( elem, cur ) {
 
5874
        return jQuery.nodeName(elem, "table") ?
 
5875
                (elem.getElementsByTagName("tbody")[0] ||
 
5876
                elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
 
5877
                elem;
 
5878
}
 
5879
 
 
5880
function cloneCopyEvent( src, dest ) {
 
5881
 
 
5882
        if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
 
5883
                return;
 
5884
        }
 
5885
 
 
5886
        var internalKey = jQuery.expando,
 
5887
                oldData = jQuery.data( src ),
 
5888
                curData = jQuery.data( dest, oldData );
 
5889
 
 
5890
        // Switch to use the internal data object, if it exists, for the next
 
5891
        // stage of data copying
 
5892
        if ( (oldData = oldData[ internalKey ]) ) {
 
5893
                var events = oldData.events;
 
5894
                                curData = curData[ internalKey ] = jQuery.extend({}, oldData);
 
5895
 
 
5896
                if ( events ) {
 
5897
                        delete curData.handle;
 
5898
                        curData.events = {};
 
5899
 
 
5900
                        for ( var type in events ) {
 
5901
                                for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
 
5902
                                        jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
 
5903
                                }
 
5904
                        }
 
5905
                }
 
5906
        }
 
5907
}
 
5908
 
 
5909
function cloneFixAttributes( src, dest ) {
 
5910
        var nodeName;
 
5911
 
 
5912
        // We do not need to do anything for non-Elements
 
5913
        if ( dest.nodeType !== 1 ) {
 
5914
                return;
 
5915
        }
 
5916
 
 
5917
        // clearAttributes removes the attributes, which we don't want,
 
5918
        // but also removes the attachEvent events, which we *do* want
 
5919
        if ( dest.clearAttributes ) {
 
5920
                dest.clearAttributes();
 
5921
        }
 
5922
 
 
5923
        // mergeAttributes, in contrast, only merges back on the
 
5924
        // original attributes, not the events
 
5925
        if ( dest.mergeAttributes ) {
 
5926
                dest.mergeAttributes( src );
 
5927
        }
 
5928
 
 
5929
        nodeName = dest.nodeName.toLowerCase();
 
5930
 
 
5931
        // IE6-8 fail to clone children inside object elements that use
 
5932
        // the proprietary classid attribute value (rather than the type
 
5933
        // attribute) to identify the type of content to display
 
5934
        if ( nodeName === "object" ) {
 
5935
                dest.outerHTML = src.outerHTML;
 
5936
 
 
5937
        } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
 
5938
                // IE6-8 fails to persist the checked state of a cloned checkbox
 
5939
                // or radio button. Worse, IE6-7 fail to give the cloned element
 
5940
                // a checked appearance if the defaultChecked value isn't also set
 
5941
                if ( src.checked ) {
 
5942
                        dest.defaultChecked = dest.checked = src.checked;
 
5943
                }
 
5944
 
 
5945
                // IE6-7 get confused and end up setting the value of a cloned
 
5946
                // checkbox/radio button to an empty string instead of "on"
 
5947
                if ( dest.value !== src.value ) {
 
5948
                        dest.value = src.value;
 
5949
                }
 
5950
 
 
5951
        // IE6-8 fails to return the selected option to the default selected
 
5952
        // state when cloning options
 
5953
        } else if ( nodeName === "option" ) {
 
5954
                dest.selected = src.defaultSelected;
 
5955
 
 
5956
        // IE6-8 fails to set the defaultValue to the correct value when
 
5957
        // cloning other types of input fields
 
5958
        } else if ( nodeName === "input" || nodeName === "textarea" ) {
 
5959
                dest.defaultValue = src.defaultValue;
 
5960
        }
 
5961
 
 
5962
        // Event data gets referenced instead of copied if the expando
 
5963
        // gets copied too
 
5964
        dest.removeAttribute( jQuery.expando );
 
5965
}
 
5966
 
 
5967
jQuery.buildFragment = function( args, nodes, scripts ) {
 
5968
        var fragment, cacheable, cacheresults, doc;
 
5969
 
 
5970
  // nodes may contain either an explicit document object,
 
5971
  // a jQuery collection or context object.
 
5972
  // If nodes[0] contains a valid object to assign to doc
 
5973
  if ( nodes && nodes[0] ) {
 
5974
    doc = nodes[0].ownerDocument || nodes[0];
 
5975
  }
 
5976
 
 
5977
  // Ensure that an attr object doesn't incorrectly stand in as a document object
 
5978
        // Chrome and Firefox seem to allow this to occur and will throw exception
 
5979
        // Fixes #8950
 
5980
        if ( !doc.createDocumentFragment ) {
 
5981
                doc = document;
 
5982
        }
 
5983
 
 
5984
        // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
 
5985
        // Cloning options loses the selected state, so don't cache them
 
5986
        // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
 
5987
        // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
 
5988
        if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
 
5989
                args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
 
5990
 
 
5991
                cacheable = true;
 
5992
 
 
5993
                cacheresults = jQuery.fragments[ args[0] ];
 
5994
                if ( cacheresults && cacheresults !== 1 ) {
 
5995
                        fragment = cacheresults;
 
5996
                }
 
5997
        }
 
5998
 
 
5999
        if ( !fragment ) {
 
6000
                fragment = doc.createDocumentFragment();
 
6001
                jQuery.clean( args, doc, fragment, scripts );
 
6002
        }
 
6003
 
 
6004
        if ( cacheable ) {
 
6005
                jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
 
6006
        }
 
6007
 
 
6008
        return { fragment: fragment, cacheable: cacheable };
 
6009
};
 
6010
 
 
6011
jQuery.fragments = {};
 
6012
 
 
6013
jQuery.each({
 
6014
        appendTo: "append",
 
6015
        prependTo: "prepend",
 
6016
        insertBefore: "before",
 
6017
        insertAfter: "after",
 
6018
        replaceAll: "replaceWith"
 
6019
}, function( name, original ) {
 
6020
        jQuery.fn[ name ] = function( selector ) {
 
6021
                var ret = [],
 
6022
                        insert = jQuery( selector ),
 
6023
                        parent = this.length === 1 && this[0].parentNode;
 
6024
 
 
6025
                if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
 
6026
                        insert[ original ]( this[0] );
 
6027
                        return this;
 
6028
 
 
6029
                } else {
 
6030
                        for ( var i = 0, l = insert.length; i < l; i++ ) {
 
6031
                                var elems = (i > 0 ? this.clone(true) : this).get();
 
6032
                                jQuery( insert[i] )[ original ]( elems );
 
6033
                                ret = ret.concat( elems );
 
6034
                        }
 
6035
 
 
6036
                        return this.pushStack( ret, name, insert.selector );
 
6037
                }
 
6038
        };
 
6039
});
 
6040
 
 
6041
function getAll( elem ) {
 
6042
        if ( "getElementsByTagName" in elem ) {
 
6043
                return elem.getElementsByTagName( "*" );
 
6044
 
 
6045
        } else if ( "querySelectorAll" in elem ) {
 
6046
                return elem.querySelectorAll( "*" );
 
6047
 
 
6048
        } else {
 
6049
                return [];
 
6050
        }
 
6051
}
 
6052
 
 
6053
// Used in clean, fixes the defaultChecked property
 
6054
function fixDefaultChecked( elem ) {
 
6055
        if ( elem.type === "checkbox" || elem.type === "radio" ) {
 
6056
                elem.defaultChecked = elem.checked;
 
6057
        }
 
6058
}
 
6059
// Finds all inputs and passes them to fixDefaultChecked
 
6060
function findInputs( elem ) {
 
6061
        if ( jQuery.nodeName( elem, "input" ) ) {
 
6062
                fixDefaultChecked( elem );
 
6063
        } else if ( "getElementsByTagName" in elem ) {
 
6064
                jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
 
6065
        }
 
6066
}
 
6067
 
 
6068
jQuery.extend({
 
6069
        clone: function( elem, dataAndEvents, deepDataAndEvents ) {
 
6070
                var clone = elem.cloneNode(true),
 
6071
                                srcElements,
 
6072
                                destElements,
 
6073
                                i;
 
6074
 
 
6075
                if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
 
6076
                                (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
 
6077
                        // IE copies events bound via attachEvent when using cloneNode.
 
6078
                        // Calling detachEvent on the clone will also remove the events
 
6079
                        // from the original. In order to get around this, we use some
 
6080
                        // proprietary methods to clear the events. Thanks to MooTools
 
6081
                        // guys for this hotness.
 
6082
 
 
6083
                        cloneFixAttributes( elem, clone );
 
6084
 
 
6085
                        // Using Sizzle here is crazy slow, so we use getElementsByTagName
 
6086
                        // instead
 
6087
                        srcElements = getAll( elem );
 
6088
                        destElements = getAll( clone );
 
6089
 
 
6090
                        // Weird iteration because IE will replace the length property
 
6091
                        // with an element if you are cloning the body and one of the
 
6092
                        // elements on the page has a name or id of "length"
 
6093
                        for ( i = 0; srcElements[i]; ++i ) {
 
6094
                                // Ensure that the destination node is not null; Fixes #9587
 
6095
                                if ( destElements[i] ) {
 
6096
                                        cloneFixAttributes( srcElements[i], destElements[i] );
 
6097
                                }
 
6098
                        }
 
6099
                }
 
6100
 
 
6101
                // Copy the events from the original to the clone
 
6102
                if ( dataAndEvents ) {
 
6103
                        cloneCopyEvent( elem, clone );
 
6104
 
 
6105
                        if ( deepDataAndEvents ) {
 
6106
                                srcElements = getAll( elem );
 
6107
                                destElements = getAll( clone );
 
6108
 
 
6109
                                for ( i = 0; srcElements[i]; ++i ) {
 
6110
                                        cloneCopyEvent( srcElements[i], destElements[i] );
 
6111
                                }
 
6112
                        }
 
6113
                }
 
6114
 
 
6115
                srcElements = destElements = null;
 
6116
 
 
6117
                // Return the cloned set
 
6118
                return clone;
 
6119
        },
 
6120
 
 
6121
        clean: function( elems, context, fragment, scripts ) {
 
6122
                var checkScriptType;
 
6123
 
 
6124
                context = context || document;
 
6125
 
 
6126
                // !context.createElement fails in IE with an error but returns typeof 'object'
 
6127
                if ( typeof context.createElement === "undefined" ) {
 
6128
                        context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
 
6129
                }
 
6130
 
 
6131
                var ret = [], j;
 
6132
 
 
6133
                for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
 
6134
                        if ( typeof elem === "number" ) {
 
6135
                                elem += "";
 
6136
                        }
 
6137
 
 
6138
                        if ( !elem ) {
 
6139
                                continue;
 
6140
                        }
 
6141
 
 
6142
                        // Convert html string into DOM nodes
 
6143
                        if ( typeof elem === "string" ) {
 
6144
                                if ( !rhtml.test( elem ) ) {
 
6145
                                        elem = context.createTextNode( elem );
 
6146
                                } else {
 
6147
                                        // Fix "XHTML"-style tags in all browsers
 
6148
                                        elem = elem.replace(rxhtmlTag, "<$1></$2>");
 
6149
 
 
6150
                                        // Trim whitespace, otherwise indexOf won't work as expected
 
6151
                                        var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
 
6152
                                                wrap = wrapMap[ tag ] || wrapMap._default,
 
6153
                                                depth = wrap[0],
 
6154
                                                div = context.createElement("div");
 
6155
 
 
6156
                                        // Go to html and back, then peel off extra wrappers
 
6157
                                        div.innerHTML = wrap[1] + elem + wrap[2];
 
6158
 
 
6159
                                        // Move to the right depth
 
6160
                                        while ( depth-- ) {
 
6161
                                                div = div.lastChild;
 
6162
                                        }
 
6163
 
 
6164
                                        // Remove IE's autoinserted <tbody> from table fragments
 
6165
                                        if ( !jQuery.support.tbody ) {
 
6166
 
 
6167
                                                // String was a <table>, *may* have spurious <tbody>
 
6168
                                                var hasBody = rtbody.test(elem),
 
6169
                                                        tbody = tag === "table" && !hasBody ?
 
6170
                                                                div.firstChild && div.firstChild.childNodes :
 
6171
 
 
6172
                                                                // String was a bare <thead> or <tfoot>
 
6173
                                                                wrap[1] === "<table>" && !hasBody ?
 
6174
                                                                        div.childNodes :
 
6175
                                                                        [];
 
6176
 
 
6177
                                                for ( j = tbody.length - 1; j >= 0 ; --j ) {
 
6178
                                                        if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
 
6179
                                                                tbody[ j ].parentNode.removeChild( tbody[ j ] );
 
6180
                                                        }
 
6181
                                                }
 
6182
                                        }
 
6183
 
 
6184
                                        // IE completely kills leading whitespace when innerHTML is used
 
6185
                                        if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
 
6186
                                                div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
 
6187
                                        }
 
6188
 
 
6189
                                        elem = div.childNodes;
 
6190
                                }
 
6191
                        }
 
6192
 
 
6193
                        // Resets defaultChecked for any radios and checkboxes
 
6194
                        // about to be appended to the DOM in IE 6/7 (#8060)
 
6195
                        var len;
 
6196
                        if ( !jQuery.support.appendChecked ) {
 
6197
                                if ( elem[0] && typeof (len = elem.length) === "number" ) {
 
6198
                                        for ( j = 0; j < len; j++ ) {
 
6199
                                                findInputs( elem[j] );
 
6200
                                        }
 
6201
                                } else {
 
6202
                                        findInputs( elem );
 
6203
                                }
 
6204
                        }
 
6205
 
 
6206
                        if ( elem.nodeType ) {
 
6207
                                ret.push( elem );
 
6208
                        } else {
 
6209
                                ret = jQuery.merge( ret, elem );
 
6210
                        }
 
6211
                }
 
6212
 
 
6213
                if ( fragment ) {
 
6214
                        checkScriptType = function( elem ) {
 
6215
                                return !elem.type || rscriptType.test( elem.type );
 
6216
                        };
 
6217
                        for ( i = 0; ret[i]; i++ ) {
 
6218
                                if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
 
6219
                                        scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
 
6220
 
 
6221
                                } else {
 
6222
                                        if ( ret[i].nodeType === 1 ) {
 
6223
                                                var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
 
6224
 
 
6225
                                                ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
 
6226
                                        }
 
6227
                                        fragment.appendChild( ret[i] );
 
6228
                                }
 
6229
                        }
 
6230
                }
 
6231
 
 
6232
                return ret;
 
6233
        },
 
6234
 
 
6235
        cleanData: function( elems ) {
 
6236
                var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
 
6237
                        deleteExpando = jQuery.support.deleteExpando;
 
6238
 
 
6239
                for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
 
6240
                        if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
 
6241
                                continue;
 
6242
                        }
 
6243
 
 
6244
                        id = elem[ jQuery.expando ];
 
6245
 
 
6246
                        if ( id ) {
 
6247
                                data = cache[ id ] && cache[ id ][ internalKey ];
 
6248
 
 
6249
                                if ( data && data.events ) {
 
6250
                                        for ( var type in data.events ) {
 
6251
                                                if ( special[ type ] ) {
 
6252
                                                        jQuery.event.remove( elem, type );
 
6253
 
 
6254
                                                // This is a shortcut to avoid jQuery.event.remove's overhead
 
6255
                                                } else {
 
6256
                                                        jQuery.removeEvent( elem, type, data.handle );
 
6257
                                                }
 
6258
                                        }
 
6259
 
 
6260
                                        // Null the DOM reference to avoid IE6/7/8 leak (#7054)
 
6261
                                        if ( data.handle ) {
 
6262
                                                data.handle.elem = null;
 
6263
                                        }
 
6264
                                }
 
6265
 
 
6266
                                if ( deleteExpando ) {
 
6267
                                        delete elem[ jQuery.expando ];
 
6268
 
 
6269
                                } else if ( elem.removeAttribute ) {
 
6270
                                        elem.removeAttribute( jQuery.expando );
 
6271
                                }
 
6272
 
 
6273
                                delete cache[ id ];
 
6274
                        }
 
6275
                }
 
6276
        }
 
6277
});
 
6278
 
 
6279
function evalScript( i, elem ) {
 
6280
        if ( elem.src ) {
 
6281
                jQuery.ajax({
 
6282
                        url: elem.src,
 
6283
                        async: false,
 
6284
                        dataType: "script"
 
6285
                });
 
6286
        } else {
 
6287
                jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
 
6288
        }
 
6289
 
 
6290
        if ( elem.parentNode ) {
 
6291
                elem.parentNode.removeChild( elem );
 
6292
        }
 
6293
}
 
6294
 
 
6295
 
 
6296
 
 
6297
 
 
6298
var ralpha = /alpha\([^)]*\)/i,
 
6299
        ropacity = /opacity=([^)]*)/,
 
6300
        // fixed for IE9, see #8346
 
6301
        rupper = /([A-Z]|^ms)/g,
 
6302
        rnumpx = /^-?\d+(?:px)?$/i,
 
6303
        rnum = /^-?\d/,
 
6304
        rrelNum = /^([\-+])=([\-+.\de]+)/,
 
6305
 
 
6306
        cssShow = { position: "absolute", visibility: "hidden", display: "block" },
 
6307
        cssWidth = [ "Left", "Right" ],
 
6308
        cssHeight = [ "Top", "Bottom" ],
 
6309
        curCSS,
 
6310
 
 
6311
        getComputedStyle,
 
6312
        currentStyle;
 
6313
 
 
6314
jQuery.fn.css = function( name, value ) {
 
6315
        // Setting 'undefined' is a no-op
 
6316
        if ( arguments.length === 2 && value === undefined ) {
 
6317
                return this;
 
6318
        }
 
6319
 
 
6320
        return jQuery.access( this, name, value, true, function( elem, name, value ) {
 
6321
                return value !== undefined ?
 
6322
                        jQuery.style( elem, name, value ) :
 
6323
                        jQuery.css( elem, name );
 
6324
        });
 
6325
};
 
6326
 
 
6327
jQuery.extend({
 
6328
        // Add in style property hooks for overriding the default
 
6329
        // behavior of getting and setting a style property
 
6330
        cssHooks: {
 
6331
                opacity: {
 
6332
                        get: function( elem, computed ) {
 
6333
                                if ( computed ) {
 
6334
                                        // We should always get a number back from opacity
 
6335
                                        var ret = curCSS( elem, "opacity", "opacity" );
 
6336
                                        return ret === "" ? "1" : ret;
 
6337
 
 
6338
                                } else {
 
6339
                                        return elem.style.opacity;
 
6340
                                }
 
6341
                        }
 
6342
                }
 
6343
        },
 
6344
 
 
6345
        // Exclude the following css properties to add px
 
6346
        cssNumber: {
 
6347
                "fillOpacity": true,
 
6348
                "fontWeight": true,
 
6349
                "lineHeight": true,
 
6350
                "opacity": true,
 
6351
                "orphans": true,
 
6352
                "widows": true,
 
6353
                "zIndex": true,
 
6354
                "zoom": true
 
6355
        },
 
6356
 
 
6357
        // Add in properties whose names you wish to fix before
 
6358
        // setting or getting the value
 
6359
        cssProps: {
 
6360
                // normalize float css property
 
6361
                "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
 
6362
        },
 
6363
 
 
6364
        // Get and set the style property on a DOM Node
 
6365
        style: function( elem, name, value, extra ) {
 
6366
                // Don't set styles on text and comment nodes
 
6367
                if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
 
6368
                        return;
 
6369
                }
 
6370
 
 
6371
                // Make sure that we're working with the right name
 
6372
                var ret, type, origName = jQuery.camelCase( name ),
 
6373
                        style = elem.style, hooks = jQuery.cssHooks[ origName ];
 
6374
 
 
6375
                name = jQuery.cssProps[ origName ] || origName;
 
6376
 
 
6377
                // Check if we're setting a value
 
6378
                if ( value !== undefined ) {
 
6379
                        type = typeof value;
 
6380
 
 
6381
                        // convert relative number strings (+= or -=) to relative numbers. #7345
 
6382
                        if ( type === "string" && (ret = rrelNum.exec( value )) ) {
 
6383
                                value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
 
6384
                                // Fixes bug #9237
 
6385
                                type = "number";
 
6386
                        }
 
6387
 
 
6388
                        // Make sure that NaN and null values aren't set. See: #7116
 
6389
                        if ( value == null || type === "number" && isNaN( value ) ) {
 
6390
                                return;
 
6391
                        }
 
6392
 
 
6393
                        // If a number was passed in, add 'px' to the (except for certain CSS properties)
 
6394
                        if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
 
6395
                                value += "px";
 
6396
                        }
 
6397
 
 
6398
                        // If a hook was provided, use that value, otherwise just set the specified value
 
6399
                        if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
 
6400
                                // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
 
6401
                                // Fixes bug #5509
 
6402
                                try {
 
6403
                                        style[ name ] = value;
 
6404
                                } catch(e) {}
 
6405
                        }
 
6406
 
 
6407
                } else {
 
6408
                        // If a hook was provided get the non-computed value from there
 
6409
                        if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
 
6410
                                return ret;
 
6411
                        }
 
6412
 
 
6413
                        // Otherwise just get the value from the style object
 
6414
                        return style[ name ];
 
6415
                }
 
6416
        },
 
6417
 
 
6418
        css: function( elem, name, extra ) {
 
6419
                var ret, hooks;
 
6420
 
 
6421
                // Make sure that we're working with the right name
 
6422
                name = jQuery.camelCase( name );
 
6423
                hooks = jQuery.cssHooks[ name ];
 
6424
                name = jQuery.cssProps[ name ] || name;
 
6425
 
 
6426
                // cssFloat needs a special treatment
 
6427
                if ( name === "cssFloat" ) {
 
6428
                        name = "float";
 
6429
                }
 
6430
 
 
6431
                // If a hook was provided get the computed value from there
 
6432
                if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
 
6433
                        return ret;
 
6434
 
 
6435
                // Otherwise, if a way to get the computed value exists, use that
 
6436
                } else if ( curCSS ) {
 
6437
                        return curCSS( elem, name );
 
6438
                }
 
6439
        },
 
6440
 
 
6441
        // A method for quickly swapping in/out CSS properties to get correct calculations
 
6442
        swap: function( elem, options, callback ) {
 
6443
                var old = {};
 
6444
 
 
6445
                // Remember the old values, and insert the new ones
 
6446
                for ( var name in options ) {
 
6447
                        old[ name ] = elem.style[ name ];
 
6448
                        elem.style[ name ] = options[ name ];
 
6449
                }
 
6450
 
 
6451
                callback.call( elem );
 
6452
 
 
6453
                // Revert the old values
 
6454
                for ( name in options ) {
 
6455
                        elem.style[ name ] = old[ name ];
 
6456
                }
 
6457
        }
 
6458
});
 
6459
 
 
6460
// DEPRECATED, Use jQuery.css() instead
 
6461
jQuery.curCSS = jQuery.css;
 
6462
 
 
6463
jQuery.each(["height", "width"], function( i, name ) {
 
6464
        jQuery.cssHooks[ name ] = {
 
6465
                get: function( elem, computed, extra ) {
 
6466
                        var val;
 
6467
 
 
6468
                        if ( computed ) {
 
6469
                                if ( elem.offsetWidth !== 0 ) {
 
6470
                                        return getWH( elem, name, extra );
 
6471
                                } else {
 
6472
                                        jQuery.swap( elem, cssShow, function() {
 
6473
                                                val = getWH( elem, name, extra );
 
6474
                                        });
 
6475
                                }
 
6476
 
 
6477
                                return val;
 
6478
                        }
 
6479
                },
 
6480
 
 
6481
                set: function( elem, value ) {
 
6482
                        if ( rnumpx.test( value ) ) {
 
6483
                                // ignore negative width and height values #1599
 
6484
                                value = parseFloat( value );
 
6485
 
 
6486
                                if ( value >= 0 ) {
 
6487
                                        return value + "px";
 
6488
                                }
 
6489
 
 
6490
                        } else {
 
6491
                                return value;
 
6492
                        }
 
6493
                }
 
6494
        };
 
6495
});
 
6496
 
 
6497
if ( !jQuery.support.opacity ) {
 
6498
        jQuery.cssHooks.opacity = {
 
6499
                get: function( elem, computed ) {
 
6500
                        // IE uses filters for opacity
 
6501
                        return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
 
6502
                                ( parseFloat( RegExp.$1 ) / 100 ) + "" :
 
6503
                                computed ? "1" : "";
 
6504
                },
 
6505
 
 
6506
                set: function( elem, value ) {
 
6507
                        var style = elem.style,
 
6508
                                currentStyle = elem.currentStyle,
 
6509
                                opacity = jQuery.isNaN( value ) ? "" : "alpha(opacity=" + value * 100 + ")",
 
6510
                                filter = currentStyle && currentStyle.filter || style.filter || "";
 
6511
 
 
6512
                        // IE has trouble with opacity if it does not have layout
 
6513
                        // Force it by setting the zoom level
 
6514
                        style.zoom = 1;
 
6515
 
 
6516
                        // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
 
6517
                        if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
 
6518
 
 
6519
                                // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
 
6520
                                // if "filter:" is present at all, clearType is disabled, we want to avoid this
 
6521
                                // style.removeAttribute is IE Only, but so apparently is this code path...
 
6522
                                style.removeAttribute( "filter" );
 
6523
 
 
6524
                                // if there there is no filter style applied in a css rule, we are done
 
6525
                                if ( currentStyle && !currentStyle.filter ) {
 
6526
                                        return;
 
6527
                                }
 
6528
                        }
 
6529
 
 
6530
                        // otherwise, set new filter values
 
6531
                        style.filter = ralpha.test( filter ) ?
 
6532
                                filter.replace( ralpha, opacity ) :
 
6533
                                filter + " " + opacity;
 
6534
                }
 
6535
        };
 
6536
}
 
6537
 
 
6538
jQuery(function() {
 
6539
        // This hook cannot be added until DOM ready because the support test
 
6540
        // for it is not run until after DOM ready
 
6541
        if ( !jQuery.support.reliableMarginRight ) {
 
6542
                jQuery.cssHooks.marginRight = {
 
6543
                        get: function( elem, computed ) {
 
6544
                                // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
 
6545
                                // Work around by temporarily setting element display to inline-block
 
6546
                                var ret;
 
6547
                                jQuery.swap( elem, { "display": "inline-block" }, function() {
 
6548
                                        if ( computed ) {
 
6549
                                                ret = curCSS( elem, "margin-right", "marginRight" );
 
6550
                                        } else {
 
6551
                                                ret = elem.style.marginRight;
 
6552
                                        }
 
6553
                                });
 
6554
                                return ret;
 
6555
                        }
 
6556
                };
 
6557
        }
 
6558
});
 
6559
 
 
6560
if ( document.defaultView && document.defaultView.getComputedStyle ) {
 
6561
        getComputedStyle = function( elem, name ) {
 
6562
                var ret, defaultView, computedStyle;
 
6563
 
 
6564
                name = name.replace( rupper, "-$1" ).toLowerCase();
 
6565
 
 
6566
                if ( !(defaultView = elem.ownerDocument.defaultView) ) {
 
6567
                        return undefined;
 
6568
                }
 
6569
 
 
6570
                if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
 
6571
                        ret = computedStyle.getPropertyValue( name );
 
6572
                        if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
 
6573
                                ret = jQuery.style( elem, name );
 
6574
                        }
 
6575
                }
 
6576
 
 
6577
                return ret;
 
6578
        };
 
6579
}
 
6580
 
 
6581
if ( document.documentElement.currentStyle ) {
 
6582
        currentStyle = function( elem, name ) {
 
6583
                var left,
 
6584
                        ret = elem.currentStyle && elem.currentStyle[ name ],
 
6585
                        rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
 
6586
                        style = elem.style;
 
6587
 
 
6588
                // From the awesome hack by Dean Edwards
 
6589
                // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
 
6590
 
 
6591
                // If we're not dealing with a regular pixel number
 
6592
                // but a number that has a weird ending, we need to convert it to pixels
 
6593
                if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
 
6594
                        // Remember the original values
 
6595
                        left = style.left;
 
6596
 
 
6597
                        // Put in the new values to get a computed value out
 
6598
                        if ( rsLeft ) {
 
6599
                                elem.runtimeStyle.left = elem.currentStyle.left;
 
6600
                        }
 
6601
                        style.left = name === "fontSize" ? "1em" : (ret || 0);
 
6602
                        ret = style.pixelLeft + "px";
 
6603
 
 
6604
                        // Revert the changed values
 
6605
                        style.left = left;
 
6606
                        if ( rsLeft ) {
 
6607
                                elem.runtimeStyle.left = rsLeft;
 
6608
                        }
 
6609
                }
 
6610
 
 
6611
                return ret === "" ? "auto" : ret;
 
6612
        };
 
6613
}
 
6614
 
 
6615
curCSS = getComputedStyle || currentStyle;
 
6616
 
 
6617
function getWH( elem, name, extra ) {
 
6618
 
 
6619
        // Start with offset property
 
6620
        var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
 
6621
                which = name === "width" ? cssWidth : cssHeight;
 
6622
 
 
6623
        if ( val > 0 ) {
 
6624
                if ( extra !== "border" ) {
 
6625
                        jQuery.each( which, function() {
 
6626
                                if ( !extra ) {
 
6627
                                        val -= parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
 
6628
                                }
 
6629
                                if ( extra === "margin" ) {
 
6630
                                        val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
 
6631
                                } else {
 
6632
                                        val -= parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
 
6633
                                }
 
6634
                        });
 
6635
                }
 
6636
 
 
6637
                return val + "px";
 
6638
        }
 
6639
 
 
6640
        // Fall back to computed then uncomputed css if necessary
 
6641
        val = curCSS( elem, name, name );
 
6642
        if ( val < 0 || val == null ) {
 
6643
                val = elem.style[ name ] || 0;
 
6644
        }
 
6645
        // Normalize "", auto, and prepare for extra
 
6646
        val = parseFloat( val ) || 0;
 
6647
 
 
6648
        // Add padding, border, margin
 
6649
        if ( extra ) {
 
6650
                jQuery.each( which, function() {
 
6651
                        val += parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
 
6652
                        if ( extra !== "padding" ) {
 
6653
                                val += parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
 
6654
                        }
 
6655
                        if ( extra === "margin" ) {
 
6656
                                val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
 
6657
                        }
 
6658
                });
 
6659
        }
 
6660
 
 
6661
        return val + "px";
 
6662
}
 
6663
 
 
6664
if ( jQuery.expr && jQuery.expr.filters ) {
 
6665
        jQuery.expr.filters.hidden = function( elem ) {
 
6666
                var width = elem.offsetWidth,
 
6667
                        height = elem.offsetHeight;
 
6668
 
 
6669
                return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
 
6670
        };
 
6671
 
 
6672
        jQuery.expr.filters.visible = function( elem ) {
 
6673
                return !jQuery.expr.filters.hidden( elem );
 
6674
        };
 
6675
}
 
6676
 
 
6677
 
 
6678
 
 
6679
 
 
6680
var r20 = /%20/g,
 
6681
        rbracket = /\[\]$/,
 
6682
        rCRLF = /\r?\n/g,
 
6683
        rhash = /#.*$/,
 
6684
        rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
 
6685
        rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
 
6686
        // #7653, #8125, #8152: local protocol detection
 
6687
        rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
 
6688
        rnoContent = /^(?:GET|HEAD)$/,
 
6689
        rprotocol = /^\/\//,
 
6690
        rquery = /\?/,
 
6691
        rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
 
6692
        rselectTextarea = /^(?:select|textarea)/i,
 
6693
        rspacesAjax = /\s+/,
 
6694
        rts = /([?&])_=[^&]*/,
 
6695
        rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
 
6696
 
 
6697
        // Keep a copy of the old load method
 
6698
        _load = jQuery.fn.load,
 
6699
 
 
6700
        /* Prefilters
 
6701
         * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
 
6702
         * 2) These are called:
 
6703
         *    - BEFORE asking for a transport
 
6704
         *    - AFTER param serialization (s.data is a string if s.processData is true)
 
6705
         * 3) key is the dataType
 
6706
         * 4) the catchall symbol "*" can be used
 
6707
         * 5) execution will start with transport dataType and THEN continue down to "*" if needed
 
6708
         */
 
6709
        prefilters = {},
 
6710
 
 
6711
        /* Transports bindings
 
6712
         * 1) key is the dataType
 
6713
         * 2) the catchall symbol "*" can be used
 
6714
         * 3) selection will start with transport dataType and THEN go to "*" if needed
 
6715
         */
 
6716
        transports = {},
 
6717
 
 
6718
        // Document location
 
6719
        ajaxLocation,
 
6720
 
 
6721
        // Document location segments
 
6722
        ajaxLocParts,
 
6723
        
 
6724
        // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
 
6725
        allTypes = ["*/"] + ["*"];
 
6726
 
 
6727
// #8138, IE may throw an exception when accessing
 
6728
// a field from window.location if document.domain has been set
 
6729
try {
 
6730
        ajaxLocation = location.href;
 
6731
} catch( e ) {
 
6732
        // Use the href attribute of an A element
 
6733
        // since IE will modify it given document.location
 
6734
        ajaxLocation = document.createElement( "a" );
 
6735
        ajaxLocation.href = "";
 
6736
        ajaxLocation = ajaxLocation.href;
 
6737
}
 
6738
 
 
6739
// Segment location into parts
 
6740
ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
 
6741
 
 
6742
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
 
6743
function addToPrefiltersOrTransports( structure ) {
 
6744
 
 
6745
        // dataTypeExpression is optional and defaults to "*"
 
6746
        return function( dataTypeExpression, func ) {
 
6747
 
 
6748
                if ( typeof dataTypeExpression !== "string" ) {
 
6749
                        func = dataTypeExpression;
 
6750
                        dataTypeExpression = "*";
 
6751
                }
 
6752
 
 
6753
                if ( jQuery.isFunction( func ) ) {
 
6754
                        var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
 
6755
                                i = 0,
 
6756
                                length = dataTypes.length,
 
6757
                                dataType,
 
6758
                                list,
 
6759
                                placeBefore;
 
6760
 
 
6761
                        // For each dataType in the dataTypeExpression
 
6762
                        for(; i < length; i++ ) {
 
6763
                                dataType = dataTypes[ i ];
 
6764
                                // We control if we're asked to add before
 
6765
                                // any existing element
 
6766
                                placeBefore = /^\+/.test( dataType );
 
6767
                                if ( placeBefore ) {
 
6768
                                        dataType = dataType.substr( 1 ) || "*";
 
6769
                                }
 
6770
                                list = structure[ dataType ] = structure[ dataType ] || [];
 
6771
                                // then we add to the structure accordingly
 
6772
                                list[ placeBefore ? "unshift" : "push" ]( func );
 
6773
                        }
 
6774
                }
 
6775
        };
 
6776
}
 
6777
 
 
6778
// Base inspection function for prefilters and transports
 
6779
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
 
6780
                dataType /* internal */, inspected /* internal */ ) {
 
6781
 
 
6782
        dataType = dataType || options.dataTypes[ 0 ];
 
6783
        inspected = inspected || {};
 
6784
 
 
6785
        inspected[ dataType ] = true;
 
6786
 
 
6787
        var list = structure[ dataType ],
 
6788
                i = 0,
 
6789
                length = list ? list.length : 0,
 
6790
                executeOnly = ( structure === prefilters ),
 
6791
                selection;
 
6792
 
 
6793
        for(; i < length && ( executeOnly || !selection ); i++ ) {
 
6794
                selection = list[ i ]( options, originalOptions, jqXHR );
 
6795
                // If we got redirected to another dataType
 
6796
                // we try there if executing only and not done already
 
6797
                if ( typeof selection === "string" ) {
 
6798
                        if ( !executeOnly || inspected[ selection ] ) {
 
6799
                                selection = undefined;
 
6800
                        } else {
 
6801
                                options.dataTypes.unshift( selection );
 
6802
                                selection = inspectPrefiltersOrTransports(
 
6803
                                                structure, options, originalOptions, jqXHR, selection, inspected );
 
6804
                        }
 
6805
                }
 
6806
        }
 
6807
        // If we're only executing or nothing was selected
 
6808
        // we try the catchall dataType if not done already
 
6809
        if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
 
6810
                selection = inspectPrefiltersOrTransports(
 
6811
                                structure, options, originalOptions, jqXHR, "*", inspected );
 
6812
        }
 
6813
        // unnecessary when only executing (prefilters)
 
6814
        // but it'll be ignored by the caller in that case
 
6815
        return selection;
 
6816
}
 
6817
 
 
6818
// A special extend for ajax options
 
6819
// that takes "flat" options (not to be deep extended)
 
6820
// Fixes #9887
 
6821
function ajaxExtend( target, src ) {
 
6822
        var key, deep,
 
6823
                flatOptions = jQuery.ajaxSettings.flatOptions || {};
 
6824
        for( key in src ) {
 
6825
                if ( src[ key ] !== undefined ) {
 
6826
                        ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
 
6827
                }
 
6828
        }
 
6829
        if ( deep ) {
 
6830
                jQuery.extend( true, target, deep );
 
6831
        }
 
6832
}
 
6833
 
 
6834
jQuery.fn.extend({
 
6835
        load: function( url, params, callback ) {
 
6836
                if ( typeof url !== "string" && _load ) {
 
6837
                        return _load.apply( this, arguments );
 
6838
 
 
6839
                // Don't do a request if no elements are being requested
 
6840
                } else if ( !this.length ) {
 
6841
                        return this;
 
6842
                }
 
6843
 
 
6844
                var off = url.indexOf( " " );
 
6845
                if ( off >= 0 ) {
 
6846
                        var selector = url.slice( off, url.length );
 
6847
                        url = url.slice( 0, off );
 
6848
                }
 
6849
 
 
6850
                // Default to a GET request
 
6851
                var type = "GET";
 
6852
 
 
6853
                // If the second parameter was provided
 
6854
                if ( params ) {
 
6855
                        // If it's a function
 
6856
                        if ( jQuery.isFunction( params ) ) {
 
6857
                                // We assume that it's the callback
 
6858
                                callback = params;
 
6859
                                params = undefined;
 
6860
 
 
6861
                        // Otherwise, build a param string
 
6862
                        } else if ( typeof params === "object" ) {
 
6863
                                params = jQuery.param( params, jQuery.ajaxSettings.traditional );
 
6864
                                type = "POST";
 
6865
                        }
 
6866
                }
 
6867
 
 
6868
                var self = this;
 
6869
 
 
6870
                // Request the remote document
 
6871
                jQuery.ajax({
 
6872
                        url: url,
 
6873
                        type: type,
 
6874
                        dataType: "html",
 
6875
                        data: params,
 
6876
                        // Complete callback (responseText is used internally)
 
6877
                        complete: function( jqXHR, status, responseText ) {
 
6878
                                // Store the response as specified by the jqXHR object
 
6879
                                responseText = jqXHR.responseText;
 
6880
                                // If successful, inject the HTML into all the matched elements
 
6881
                                if ( jqXHR.isResolved() ) {
 
6882
                                        // #4825: Get the actual response in case
 
6883
                                        // a dataFilter is present in ajaxSettings
 
6884
                                        jqXHR.done(function( r ) {
 
6885
                                                responseText = r;
 
6886
                                        });
 
6887
                                        // See if a selector was specified
 
6888
                                        self.html( selector ?
 
6889
                                                // Create a dummy div to hold the results
 
6890
                                                jQuery("<div>")
 
6891
                                                        // inject the contents of the document in, removing the scripts
 
6892
                                                        // to avoid any 'Permission Denied' errors in IE
 
6893
                                                        .append(responseText.replace(rscript, ""))
 
6894
 
 
6895
                                                        // Locate the specified elements
 
6896
                                                        .find(selector) :
 
6897
 
 
6898
                                                // If not, just inject the full result
 
6899
                                                responseText );
 
6900
                                }
 
6901
 
 
6902
                                if ( callback ) {
 
6903
                                        self.each( callback, [ responseText, status, jqXHR ] );
 
6904
                                }
 
6905
                        }
 
6906
                });
 
6907
 
 
6908
                return this;
 
6909
        },
 
6910
 
 
6911
        serialize: function() {
 
6912
                return jQuery.param( this.serializeArray() );
 
6913
        },
 
6914
 
 
6915
        serializeArray: function() {
 
6916
                return this.map(function(){
 
6917
                        return this.elements ? jQuery.makeArray( this.elements ) : this;
 
6918
                })
 
6919
                .filter(function(){
 
6920
                        return this.name && !this.disabled &&
 
6921
                                ( this.checked || rselectTextarea.test( this.nodeName ) ||
 
6922
                                        rinput.test( this.type ) );
 
6923
                })
 
6924
                .map(function( i, elem ){
 
6925
                        var val = jQuery( this ).val();
 
6926
 
 
6927
                        return val == null ?
 
6928
                                null :
 
6929
                                jQuery.isArray( val ) ?
 
6930
                                        jQuery.map( val, function( val, i ){
 
6931
                                                return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
 
6932
                                        }) :
 
6933
                                        { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
 
6934
                }).get();
 
6935
        }
 
6936
});
 
6937
 
 
6938
// Attach a bunch of functions for handling common AJAX events
 
6939
jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
 
6940
        jQuery.fn[ o ] = function( f ){
 
6941
                return this.bind( o, f );
 
6942
        };
 
6943
});
 
6944
 
 
6945
jQuery.each( [ "get", "post" ], function( i, method ) {
 
6946
        jQuery[ method ] = function( url, data, callback, type ) {
 
6947
                // shift arguments if data argument was omitted
 
6948
                if ( jQuery.isFunction( data ) ) {
 
6949
                        type = type || callback;
 
6950
                        callback = data;
 
6951
                        data = undefined;
 
6952
                }
 
6953
 
 
6954
                return jQuery.ajax({
 
6955
                        type: method,
 
6956
                        url: url,
 
6957
                        data: data,
 
6958
                        success: callback,
 
6959
                        dataType: type
 
6960
                });
 
6961
        };
 
6962
});
 
6963
 
 
6964
jQuery.extend({
 
6965
 
 
6966
        getScript: function( url, callback ) {
 
6967
                return jQuery.get( url, undefined, callback, "script" );
 
6968
        },
 
6969
 
 
6970
        getJSON: function( url, data, callback ) {
 
6971
                return jQuery.get( url, data, callback, "json" );
 
6972
        },
 
6973
 
 
6974
        // Creates a full fledged settings object into target
 
6975
        // with both ajaxSettings and settings fields.
 
6976
        // If target is omitted, writes into ajaxSettings.
 
6977
        ajaxSetup: function( target, settings ) {
 
6978
                if ( settings ) {
 
6979
                        // Building a settings object
 
6980
                        ajaxExtend( target, jQuery.ajaxSettings );
 
6981
                } else {
 
6982
                        // Extending ajaxSettings
 
6983
                        settings = target;
 
6984
                        target = jQuery.ajaxSettings;
 
6985
                }
 
6986
                ajaxExtend( target, settings );
 
6987
                return target;
 
6988
        },
 
6989
 
 
6990
        ajaxSettings: {
 
6991
                url: ajaxLocation,
 
6992
                isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
 
6993
                global: true,
 
6994
                type: "GET",
 
6995
                contentType: "application/x-www-form-urlencoded",
 
6996
                processData: true,
 
6997
                async: true,
 
6998
                /*
 
6999
                timeout: 0,
 
7000
                data: null,
 
7001
                dataType: null,
 
7002
                username: null,
 
7003
                password: null,
 
7004
                cache: null,
 
7005
                traditional: false,
 
7006
                headers: {},
 
7007
                */
 
7008
 
 
7009
                accepts: {
 
7010
                        xml: "application/xml, text/xml",
 
7011
                        html: "text/html",
 
7012
                        text: "text/plain",
 
7013
                        json: "application/json, text/javascript",
 
7014
                        "*": allTypes
 
7015
                },
 
7016
 
 
7017
                contents: {
 
7018
                        xml: /xml/,
 
7019
                        html: /html/,
 
7020
                        json: /json/
 
7021
                },
 
7022
 
 
7023
                responseFields: {
 
7024
                        xml: "responseXML",
 
7025
                        text: "responseText"
 
7026
                },
 
7027
 
 
7028
                // List of data converters
 
7029
                // 1) key format is "source_type destination_type" (a single space in-between)
 
7030
                // 2) the catchall symbol "*" can be used for source_type
 
7031
                converters: {
 
7032
 
 
7033
                        // Convert anything to text
 
7034
                        "* text": window.String,
 
7035
 
 
7036
                        // Text to html (true = no transformation)
 
7037
                        "text html": true,
 
7038
 
 
7039
                        // Evaluate text as a json expression
 
7040
                        "text json": jQuery.parseJSON,
 
7041
 
 
7042
                        // Parse text as xml
 
7043
                        "text xml": jQuery.parseXML
 
7044
                },
 
7045
 
 
7046
                // For options that shouldn't be deep extended:
 
7047
                // you can add your own custom options here if
 
7048
                // and when you create one that shouldn't be
 
7049
                // deep extended (see ajaxExtend)
 
7050
                flatOptions: {
 
7051
                        context: true,
 
7052
                        url: true
 
7053
                }
 
7054
        },
 
7055
 
 
7056
        ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
 
7057
        ajaxTransport: addToPrefiltersOrTransports( transports ),
 
7058
 
 
7059
        // Main method
 
7060
        ajax: function( url, options ) {
 
7061
 
 
7062
                // If url is an object, simulate pre-1.5 signature
 
7063
                if ( typeof url === "object" ) {
 
7064
                        options = url;
 
7065
                        url = undefined;
 
7066
                }
 
7067
 
 
7068
                // Force options to be an object
 
7069
                options = options || {};
 
7070
 
 
7071
                var // Create the final options object
 
7072
                        s = jQuery.ajaxSetup( {}, options ),
 
7073
                        // Callbacks context
 
7074
                        callbackContext = s.context || s,
 
7075
                        // Context for global events
 
7076
                        // It's the callbackContext if one was provided in the options
 
7077
                        // and if it's a DOM node or a jQuery collection
 
7078
                        globalEventContext = callbackContext !== s &&
 
7079
                                ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
 
7080
                                                jQuery( callbackContext ) : jQuery.event,
 
7081
                        // Deferreds
 
7082
                        deferred = jQuery.Deferred(),
 
7083
                        completeDeferred = jQuery._Deferred(),
 
7084
                        // Status-dependent callbacks
 
7085
                        statusCode = s.statusCode || {},
 
7086
                        // ifModified key
 
7087
                        ifModifiedKey,
 
7088
                        // Headers (they are sent all at once)
 
7089
                        requestHeaders = {},
 
7090
                        requestHeadersNames = {},
 
7091
                        // Response headers
 
7092
                        responseHeadersString,
 
7093
                        responseHeaders,
 
7094
                        // transport
 
7095
                        transport,
 
7096
                        // timeout handle
 
7097
                        timeoutTimer,
 
7098
                        // Cross-domain detection vars
 
7099
                        parts,
 
7100
                        // The jqXHR state
 
7101
                        state = 0,
 
7102
                        // To know if global events are to be dispatched
 
7103
                        fireGlobals,
 
7104
                        // Loop variable
 
7105
                        i,
 
7106
                        // Fake xhr
 
7107
                        jqXHR = {
 
7108
 
 
7109
                                readyState: 0,
 
7110
 
 
7111
                                // Caches the header
 
7112
                                setRequestHeader: function( name, value ) {
 
7113
                                        if ( !state ) {
 
7114
                                                var lname = name.toLowerCase();
 
7115
                                                name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
 
7116
                                                requestHeaders[ name ] = value;
 
7117
                                        }
 
7118
                                        return this;
 
7119
                                },
 
7120
 
 
7121
                                // Raw string
 
7122
                                getAllResponseHeaders: function() {
 
7123
                                        return state === 2 ? responseHeadersString : null;
 
7124
                                },
 
7125
 
 
7126
                                // Builds headers hashtable if needed
 
7127
                                getResponseHeader: function( key ) {
 
7128
                                        var match;
 
7129
                                        if ( state === 2 ) {
 
7130
                                                if ( !responseHeaders ) {
 
7131
                                                        responseHeaders = {};
 
7132
                                                        while( ( match = rheaders.exec( responseHeadersString ) ) ) {
 
7133
                                                                responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
 
7134
                                                        }
 
7135
                                                }
 
7136
                                                match = responseHeaders[ key.toLowerCase() ];
 
7137
                                        }
 
7138
                                        return match === undefined ? null : match;
 
7139
                                },
 
7140
 
 
7141
                                // Overrides response content-type header
 
7142
                                overrideMimeType: function( type ) {
 
7143
                                        if ( !state ) {
 
7144
                                                s.mimeType = type;
 
7145
                                        }
 
7146
                                        return this;
 
7147
                                },
 
7148
 
 
7149
                                // Cancel the request
 
7150
                                abort: function( statusText ) {
 
7151
                                        statusText = statusText || "abort";
 
7152
                                        if ( transport ) {
 
7153
                                                transport.abort( statusText );
 
7154
                                        }
 
7155
                                        done( 0, statusText );
 
7156
                                        return this;
 
7157
                                }
 
7158
                        };
 
7159
 
 
7160
                // Callback for when everything is done
 
7161
                // It is defined here because jslint complains if it is declared
 
7162
                // at the end of the function (which would be more logical and readable)
 
7163
                function done( status, nativeStatusText, responses, headers ) {
 
7164
 
 
7165
                        // Called once
 
7166
                        if ( state === 2 ) {
 
7167
                                return;
 
7168
                        }
 
7169
 
 
7170
                        // State is "done" now
 
7171
                        state = 2;
 
7172
 
 
7173
                        // Clear timeout if it exists
 
7174
                        if ( timeoutTimer ) {
 
7175
                                clearTimeout( timeoutTimer );
 
7176
                        }
 
7177
 
 
7178
                        // Dereference transport for early garbage collection
 
7179
                        // (no matter how long the jqXHR object will be used)
 
7180
                        transport = undefined;
 
7181
 
 
7182
                        // Cache response headers
 
7183
                        responseHeadersString = headers || "";
 
7184
 
 
7185
                        // Set readyState
 
7186
                        jqXHR.readyState = status > 0 ? 4 : 0;
 
7187
 
 
7188
                        var isSuccess,
 
7189
                                success,
 
7190
                                error,
 
7191
                                statusText = nativeStatusText,
 
7192
                                response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
 
7193
                                lastModified,
 
7194
                                etag;
 
7195
 
 
7196
                        // If successful, handle type chaining
 
7197
                        if ( status >= 200 && status < 300 || status === 304 ) {
 
7198
 
 
7199
                                // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
 
7200
                                if ( s.ifModified ) {
 
7201
 
 
7202
                                        if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
 
7203
                                                jQuery.lastModified[ ifModifiedKey ] = lastModified;
 
7204
                                        }
 
7205
                                        if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
 
7206
                                                jQuery.etag[ ifModifiedKey ] = etag;
 
7207
                                        }
 
7208
                                }
 
7209
 
 
7210
                                // If not modified
 
7211
                                if ( status === 304 ) {
 
7212
 
 
7213
                                        statusText = "notmodified";
 
7214
                                        isSuccess = true;
 
7215
 
 
7216
                                // If we have data
 
7217
                                } else {
 
7218
 
 
7219
                                        try {
 
7220
                                                success = ajaxConvert( s, response );
 
7221
                                                statusText = "success";
 
7222
                                                isSuccess = true;
 
7223
                                        } catch(e) {
 
7224
                                                // We have a parsererror
 
7225
                                                statusText = "parsererror";
 
7226
                                                error = e;
 
7227
                                        }
 
7228
                                }
 
7229
                        } else {
 
7230
                                // We extract error from statusText
 
7231
                                // then normalize statusText and status for non-aborts
 
7232
                                error = statusText;
 
7233
                                if( !statusText || status ) {
 
7234
                                        statusText = "error";
 
7235
                                        if ( status < 0 ) {
 
7236
                                                status = 0;
 
7237
                                        }
 
7238
                                }
 
7239
                        }
 
7240
 
 
7241
                        // Set data for the fake xhr object
 
7242
                        jqXHR.status = status;
 
7243
                        jqXHR.statusText = "" + ( nativeStatusText || statusText );
 
7244
 
 
7245
                        // Success/Error
 
7246
                        if ( isSuccess ) {
 
7247
                                deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
 
7248
                        } else {
 
7249
                                deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
 
7250
                        }
 
7251
 
 
7252
                        // Status-dependent callbacks
 
7253
                        jqXHR.statusCode( statusCode );
 
7254
                        statusCode = undefined;
 
7255
 
 
7256
                        if ( fireGlobals ) {
 
7257
                                globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
 
7258
                                                [ jqXHR, s, isSuccess ? success : error ] );
 
7259
                        }
 
7260
 
 
7261
                        // Complete
 
7262
                        completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
 
7263
 
 
7264
                        if ( fireGlobals ) {
 
7265
                                globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
 
7266
                                // Handle the global AJAX counter
 
7267
                                if ( !( --jQuery.active ) ) {
 
7268
                                        jQuery.event.trigger( "ajaxStop" );
 
7269
                                }
 
7270
                        }
 
7271
                }
 
7272
 
 
7273
                // Attach deferreds
 
7274
                deferred.promise( jqXHR );
 
7275
                jqXHR.success = jqXHR.done;
 
7276
                jqXHR.error = jqXHR.fail;
 
7277
                jqXHR.complete = completeDeferred.done;
 
7278
 
 
7279
                // Status-dependent callbacks
 
7280
                jqXHR.statusCode = function( map ) {
 
7281
                        if ( map ) {
 
7282
                                var tmp;
 
7283
                                if ( state < 2 ) {
 
7284
                                        for( tmp in map ) {
 
7285
                                                statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
 
7286
                                        }
 
7287
                                } else {
 
7288
                                        tmp = map[ jqXHR.status ];
 
7289
                                        jqXHR.then( tmp, tmp );
 
7290
                                }
 
7291
                        }
 
7292
                        return this;
 
7293
                };
 
7294
 
 
7295
                // Remove hash character (#7531: and string promotion)
 
7296
                // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
 
7297
                // We also use the url parameter if available
 
7298
                s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
 
7299
 
 
7300
                // Extract dataTypes list
 
7301
                s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
 
7302
 
 
7303
                // Determine if a cross-domain request is in order
 
7304
                if ( s.crossDomain == null ) {
 
7305
                        parts = rurl.exec( s.url.toLowerCase() );
 
7306
                        s.crossDomain = !!( parts &&
 
7307
                                ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
 
7308
                                        ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
 
7309
                                                ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
 
7310
                        );
 
7311
                }
 
7312
 
 
7313
                // Convert data if not already a string
 
7314
                if ( s.data && s.processData && typeof s.data !== "string" ) {
 
7315
                        s.data = jQuery.param( s.data, s.traditional );
 
7316
                }
 
7317
 
 
7318
                // Apply prefilters
 
7319
                inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
 
7320
 
 
7321
                // If request was aborted inside a prefiler, stop there
 
7322
                if ( state === 2 ) {
 
7323
                        return false;
 
7324
                }
 
7325
 
 
7326
                // We can fire global events as of now if asked to
 
7327
                fireGlobals = s.global;
 
7328
 
 
7329
                // Uppercase the type
 
7330
                s.type = s.type.toUpperCase();
 
7331
 
 
7332
                // Determine if request has content
 
7333
                s.hasContent = !rnoContent.test( s.type );
 
7334
 
 
7335
                // Watch for a new set of requests
 
7336
                if ( fireGlobals && jQuery.active++ === 0 ) {
 
7337
                        jQuery.event.trigger( "ajaxStart" );
 
7338
                }
 
7339
 
 
7340
                // More options handling for requests with no content
 
7341
                if ( !s.hasContent ) {
 
7342
 
 
7343
                        // If data is available, append data to url
 
7344
                        if ( s.data ) {
 
7345
                                s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
 
7346
                                // #9682: remove data so that it's not used in an eventual retry
 
7347
                                delete s.data;
 
7348
                        }
 
7349
 
 
7350
                        // Get ifModifiedKey before adding the anti-cache parameter
 
7351
                        ifModifiedKey = s.url;
 
7352
 
 
7353
                        // Add anti-cache in url if needed
 
7354
                        if ( s.cache === false ) {
 
7355
 
 
7356
                                var ts = jQuery.now(),
 
7357
                                        // try replacing _= if it is there
 
7358
                                        ret = s.url.replace( rts, "$1_=" + ts );
 
7359
 
 
7360
                                // if nothing was replaced, add timestamp to the end
 
7361
                                s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
 
7362
                        }
 
7363
                }
 
7364
 
 
7365
                // Set the correct header, if data is being sent
 
7366
                if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
 
7367
                        jqXHR.setRequestHeader( "Content-Type", s.contentType );
 
7368
                }
 
7369
 
 
7370
                // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
 
7371
                if ( s.ifModified ) {
 
7372
                        ifModifiedKey = ifModifiedKey || s.url;
 
7373
                        if ( jQuery.lastModified[ ifModifiedKey ] ) {
 
7374
                                jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
 
7375
                        }
 
7376
                        if ( jQuery.etag[ ifModifiedKey ] ) {
 
7377
                                jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
 
7378
                        }
 
7379
                }
 
7380
 
 
7381
                // Set the Accepts header for the server, depending on the dataType
 
7382
                jqXHR.setRequestHeader(
 
7383
                        "Accept",
 
7384
                        s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
 
7385
                                s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
 
7386
                                s.accepts[ "*" ]
 
7387
                );
 
7388
 
 
7389
                // Check for headers option
 
7390
                for ( i in s.headers ) {
 
7391
                        jqXHR.setRequestHeader( i, s.headers[ i ] );
 
7392
                }
 
7393
 
 
7394
                // Allow custom headers/mimetypes and early abort
 
7395
                if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
 
7396
                                // Abort if not done already
 
7397
                                jqXHR.abort();
 
7398
                                return false;
 
7399
 
 
7400
                }
 
7401
 
 
7402
                // Install callbacks on deferreds
 
7403
                for ( i in { success: 1, error: 1, complete: 1 } ) {
 
7404
                        jqXHR[ i ]( s[ i ] );
 
7405
                }
 
7406
 
 
7407
                // Get transport
 
7408
                transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
 
7409
 
 
7410
                // If no transport, we auto-abort
 
7411
                if ( !transport ) {
 
7412
                        done( -1, "No Transport" );
 
7413
                } else {
 
7414
                        jqXHR.readyState = 1;
 
7415
                        // Send global event
 
7416
                        if ( fireGlobals ) {
 
7417
                                globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
 
7418
                        }
 
7419
                        // Timeout
 
7420
                        if ( s.async && s.timeout > 0 ) {
 
7421
                                timeoutTimer = setTimeout( function(){
 
7422
                                        jqXHR.abort( "timeout" );
 
7423
                                }, s.timeout );
 
7424
                        }
 
7425
 
 
7426
                        try {
 
7427
                                state = 1;
 
7428
                                transport.send( requestHeaders, done );
 
7429
                        } catch (e) {
 
7430
                                // Propagate exception as error if not done
 
7431
                                if ( state < 2 ) {
 
7432
                                        done( -1, e );
 
7433
                                // Simply rethrow otherwise
 
7434
                                } else {
 
7435
                                        jQuery.error( e );
 
7436
                                }
 
7437
                        }
 
7438
                }
 
7439
 
 
7440
                return jqXHR;
 
7441
        },
 
7442
 
 
7443
        // Serialize an array of form elements or a set of
 
7444
        // key/values into a query string
 
7445
        param: function( a, traditional ) {
 
7446
                var s = [],
 
7447
                        add = function( key, value ) {
 
7448
                                // If value is a function, invoke it and return its value
 
7449
                                value = jQuery.isFunction( value ) ? value() : value;
 
7450
                                s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
 
7451
                        };
 
7452
 
 
7453
                // Set traditional to true for jQuery <= 1.3.2 behavior.
 
7454
                if ( traditional === undefined ) {
 
7455
                        traditional = jQuery.ajaxSettings.traditional;
 
7456
                }
 
7457
 
 
7458
                // If an array was passed in, assume that it is an array of form elements.
 
7459
                if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
 
7460
                        // Serialize the form elements
 
7461
                        jQuery.each( a, function() {
 
7462
                                add( this.name, this.value );
 
7463
                        });
 
7464
 
 
7465
                } else {
 
7466
                        // If traditional, encode the "old" way (the way 1.3.2 or older
 
7467
                        // did it), otherwise encode params recursively.
 
7468
                        for ( var prefix in a ) {
 
7469
                                buildParams( prefix, a[ prefix ], traditional, add );
 
7470
                        }
 
7471
                }
 
7472
 
 
7473
                // Return the resulting serialization
 
7474
                return s.join( "&" ).replace( r20, "+" );
 
7475
        }
 
7476
});
 
7477
 
 
7478
function buildParams( prefix, obj, traditional, add ) {
 
7479
        if ( jQuery.isArray( obj ) ) {
 
7480
                // Serialize array item.
 
7481
                jQuery.each( obj, function( i, v ) {
 
7482
                        if ( traditional || rbracket.test( prefix ) ) {
 
7483
                                // Treat each array item as a scalar.
 
7484
                                add( prefix, v );
 
7485
 
 
7486
                        } else {
 
7487
                                // If array item is non-scalar (array or object), encode its
 
7488
                                // numeric index to resolve deserialization ambiguity issues.
 
7489
                                // Note that rack (as of 1.0.0) can't currently deserialize
 
7490
                                // nested arrays properly, and attempting to do so may cause
 
7491
                                // a server error. Possible fixes are to modify rack's
 
7492
                                // deserialization algorithm or to provide an option or flag
 
7493
                                // to force array serialization to be shallow.
 
7494
                                buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
 
7495
                        }
 
7496
                });
 
7497
 
 
7498
        } else if ( !traditional && obj != null && typeof obj === "object" ) {
 
7499
                // Serialize object item.
 
7500
                for ( var name in obj ) {
 
7501
                        buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
 
7502
                }
 
7503
 
 
7504
        } else {
 
7505
                // Serialize scalar item.
 
7506
                add( prefix, obj );
 
7507
        }
 
7508
}
 
7509
 
 
7510
// This is still on the jQuery object... for now
 
7511
// Want to move this to jQuery.ajax some day
 
7512
jQuery.extend({
 
7513
 
 
7514
        // Counter for holding the number of active queries
 
7515
        active: 0,
 
7516
 
 
7517
        // Last-Modified header cache for next request
 
7518
        lastModified: {},
 
7519
        etag: {}
 
7520
 
 
7521
});
 
7522
 
 
7523
/* Handles responses to an ajax request:
 
7524
 * - sets all responseXXX fields accordingly
 
7525
 * - finds the right dataType (mediates between content-type and expected dataType)
 
7526
 * - returns the corresponding response
 
7527
 */
 
7528
function ajaxHandleResponses( s, jqXHR, responses ) {
 
7529
 
 
7530
        var contents = s.contents,
 
7531
                dataTypes = s.dataTypes,
 
7532
                responseFields = s.responseFields,
 
7533
                ct,
 
7534
                type,
 
7535
                finalDataType,
 
7536
                firstDataType;
 
7537
 
 
7538
        // Fill responseXXX fields
 
7539
        for( type in responseFields ) {
 
7540
                if ( type in responses ) {
 
7541
                        jqXHR[ responseFields[type] ] = responses[ type ];
 
7542
                }
 
7543
        }
 
7544
 
 
7545
        // Remove auto dataType and get content-type in the process
 
7546
        while( dataTypes[ 0 ] === "*" ) {
 
7547
                dataTypes.shift();
 
7548
                if ( ct === undefined ) {
 
7549
                        ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
 
7550
                }
 
7551
        }
 
7552
 
 
7553
        // Check if we're dealing with a known content-type
 
7554
        if ( ct ) {
 
7555
                for ( type in contents ) {
 
7556
                        if ( contents[ type ] && contents[ type ].test( ct ) ) {
 
7557
                                dataTypes.unshift( type );
 
7558
                                break;
 
7559
                        }
 
7560
                }
 
7561
        }
 
7562
 
 
7563
        // Check to see if we have a response for the expected dataType
 
7564
        if ( dataTypes[ 0 ] in responses ) {
 
7565
                finalDataType = dataTypes[ 0 ];
 
7566
        } else {
 
7567
                // Try convertible dataTypes
 
7568
                for ( type in responses ) {
 
7569
                        if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
 
7570
                                finalDataType = type;
 
7571
                                break;
 
7572
                        }
 
7573
                        if ( !firstDataType ) {
 
7574
                                firstDataType = type;
 
7575
                        }
 
7576
                }
 
7577
                // Or just use first one
 
7578
                finalDataType = finalDataType || firstDataType;
 
7579
        }
 
7580
 
 
7581
        // If we found a dataType
 
7582
        // We add the dataType to the list if needed
 
7583
        // and return the corresponding response
 
7584
        if ( finalDataType ) {
 
7585
                if ( finalDataType !== dataTypes[ 0 ] ) {
 
7586
                        dataTypes.unshift( finalDataType );
 
7587
                }
 
7588
                return responses[ finalDataType ];
 
7589
        }
 
7590
}
 
7591
 
 
7592
// Chain conversions given the request and the original response
 
7593
function ajaxConvert( s, response ) {
 
7594
 
 
7595
        // Apply the dataFilter if provided
 
7596
        if ( s.dataFilter ) {
 
7597
                response = s.dataFilter( response, s.dataType );
 
7598
        }
 
7599
 
 
7600
        var dataTypes = s.dataTypes,
 
7601
                converters = {},
 
7602
                i,
 
7603
                key,
 
7604
                length = dataTypes.length,
 
7605
                tmp,
 
7606
                // Current and previous dataTypes
 
7607
                current = dataTypes[ 0 ],
 
7608
                prev,
 
7609
                // Conversion expression
 
7610
                conversion,
 
7611
                // Conversion function
 
7612
                conv,
 
7613
                // Conversion functions (transitive conversion)
 
7614
                conv1,
 
7615
                conv2;
 
7616
 
 
7617
        // For each dataType in the chain
 
7618
        for( i = 1; i < length; i++ ) {
 
7619
 
 
7620
                // Create converters map
 
7621
                // with lowercased keys
 
7622
                if ( i === 1 ) {
 
7623
                        for( key in s.converters ) {
 
7624
                                if( typeof key === "string" ) {
 
7625
                                        converters[ key.toLowerCase() ] = s.converters[ key ];
 
7626
                                }
 
7627
                        }
 
7628
                }
 
7629
 
 
7630
                // Get the dataTypes
 
7631
                prev = current;
 
7632
                current = dataTypes[ i ];
 
7633
 
 
7634
                // If current is auto dataType, update it to prev
 
7635
                if( current === "*" ) {
 
7636
                        current = prev;
 
7637
                // If no auto and dataTypes are actually different
 
7638
                } else if ( prev !== "*" && prev !== current ) {
 
7639
 
 
7640
                        // Get the converter
 
7641
                        conversion = prev + " " + current;
 
7642
                        conv = converters[ conversion ] || converters[ "* " + current ];
 
7643
 
 
7644
                        // If there is no direct converter, search transitively
 
7645
                        if ( !conv ) {
 
7646
                                conv2 = undefined;
 
7647
                                for( conv1 in converters ) {
 
7648
                                        tmp = conv1.split( " " );
 
7649
                                        if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
 
7650
                                                conv2 = converters[ tmp[1] + " " + current ];
 
7651
                                                if ( conv2 ) {
 
7652
                                                        conv1 = converters[ conv1 ];
 
7653
                                                        if ( conv1 === true ) {
 
7654
                                                                conv = conv2;
 
7655
                                                        } else if ( conv2 === true ) {
 
7656
                                                                conv = conv1;
 
7657
                                                        }
 
7658
                                                        break;
 
7659
                                                }
 
7660
                                        }
 
7661
                                }
 
7662
                        }
 
7663
                        // If we found no converter, dispatch an error
 
7664
                        if ( !( conv || conv2 ) ) {
 
7665
                                jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
 
7666
                        }
 
7667
                        // If found converter is not an equivalence
 
7668
                        if ( conv !== true ) {
 
7669
                                // Convert with 1 or 2 converters accordingly
 
7670
                                response = conv ? conv( response ) : conv2( conv1(response) );
 
7671
                        }
 
7672
                }
 
7673
        }
 
7674
        return response;
 
7675
}
 
7676
 
 
7677
 
 
7678
 
 
7679
 
 
7680
var jsc = jQuery.now(),
 
7681
        jsre = /(\=)\?(&|$)|\?\?/i;
 
7682
 
 
7683
// Default jsonp settings
 
7684
jQuery.ajaxSetup({
 
7685
        jsonp: "callback",
 
7686
        jsonpCallback: function() {
 
7687
                return jQuery.expando + "_" + ( jsc++ );
 
7688
        }
 
7689
});
 
7690
 
 
7691
// Detect, normalize options and install callbacks for jsonp requests
 
7692
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
 
7693
 
 
7694
        var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
 
7695
                ( typeof s.data === "string" );
 
7696
 
 
7697
        if ( s.dataTypes[ 0 ] === "jsonp" ||
 
7698
                s.jsonp !== false && ( jsre.test( s.url ) ||
 
7699
                                inspectData && jsre.test( s.data ) ) ) {
 
7700
 
 
7701
                var responseContainer,
 
7702
                        jsonpCallback = s.jsonpCallback =
 
7703
                                jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
 
7704
                        previous = window[ jsonpCallback ],
 
7705
                        url = s.url,
 
7706
                        data = s.data,
 
7707
                        replace = "$1" + jsonpCallback + "$2";
 
7708
 
 
7709
                if ( s.jsonp !== false ) {
 
7710
                        url = url.replace( jsre, replace );
 
7711
                        if ( s.url === url ) {
 
7712
                                if ( inspectData ) {
 
7713
                                        data = data.replace( jsre, replace );
 
7714
                                }
 
7715
                                if ( s.data === data ) {
 
7716
                                        // Add callback manually
 
7717
                                        url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
 
7718
                                }
 
7719
                        }
 
7720
                }
 
7721
 
 
7722
                s.url = url;
 
7723
                s.data = data;
 
7724
 
 
7725
                // Install callback
 
7726
                window[ jsonpCallback ] = function( response ) {
 
7727
                        responseContainer = [ response ];
 
7728
                };
 
7729
 
 
7730
                // Clean-up function
 
7731
                jqXHR.always(function() {
 
7732
                        // Set callback back to previous value
 
7733
                        window[ jsonpCallback ] = previous;
 
7734
                        // Call if it was a function and we have a response
 
7735
                        if ( responseContainer && jQuery.isFunction( previous ) ) {
 
7736
                                window[ jsonpCallback ]( responseContainer[ 0 ] );
 
7737
                        }
 
7738
                });
 
7739
 
 
7740
                // Use data converter to retrieve json after script execution
 
7741
                s.converters["script json"] = function() {
 
7742
                        if ( !responseContainer ) {
 
7743
                                jQuery.error( jsonpCallback + " was not called" );
 
7744
                        }
 
7745
                        return responseContainer[ 0 ];
 
7746
                };
 
7747
 
 
7748
                // force json dataType
 
7749
                s.dataTypes[ 0 ] = "json";
 
7750
 
 
7751
                // Delegate to script
 
7752
                return "script";
 
7753
        }
 
7754
});
 
7755
 
 
7756
 
 
7757
 
 
7758
 
 
7759
// Install script dataType
 
7760
jQuery.ajaxSetup({
 
7761
        accepts: {
 
7762
                script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
 
7763
        },
 
7764
        contents: {
 
7765
                script: /javascript|ecmascript/
 
7766
        },
 
7767
        converters: {
 
7768
                "text script": function( text ) {
 
7769
                        jQuery.globalEval( text );
 
7770
                        return text;
 
7771
                }
 
7772
        }
 
7773
});
 
7774
 
 
7775
// Handle cache's special case and global
 
7776
jQuery.ajaxPrefilter( "script", function( s ) {
 
7777
        if ( s.cache === undefined ) {
 
7778
                s.cache = false;
 
7779
        }
 
7780
        if ( s.crossDomain ) {
 
7781
                s.type = "GET";
 
7782
                s.global = false;
 
7783
        }
 
7784
});
 
7785
 
 
7786
// Bind script tag hack transport
 
7787
jQuery.ajaxTransport( "script", function(s) {
 
7788
 
 
7789
        // This transport only deals with cross domain requests
 
7790
        if ( s.crossDomain ) {
 
7791
 
 
7792
                var script,
 
7793
                        head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
 
7794
 
 
7795
                return {
 
7796
 
 
7797
                        send: function( _, callback ) {
 
7798
 
 
7799
                                script = document.createElement( "script" );
 
7800
 
 
7801
                                script.async = "async";
 
7802
 
 
7803
                                if ( s.scriptCharset ) {
 
7804
                                        script.charset = s.scriptCharset;
 
7805
                                }
 
7806
 
 
7807
                                script.src = s.url;
 
7808
 
 
7809
                                // Attach handlers for all browsers
 
7810
                                script.onload = script.onreadystatechange = function( _, isAbort ) {
 
7811
 
 
7812
                                        if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
 
7813
 
 
7814
                                                // Handle memory leak in IE
 
7815
                                                script.onload = script.onreadystatechange = null;
 
7816
 
 
7817
                                                // Remove the script
 
7818
                                                if ( head && script.parentNode ) {
 
7819
                                                        head.removeChild( script );
 
7820
                                                }
 
7821
 
 
7822
                                                // Dereference the script
 
7823
                                                script = undefined;
 
7824
 
 
7825
                                                // Callback if not abort
 
7826
                                                if ( !isAbort ) {
 
7827
                                                        callback( 200, "success" );
 
7828
                                                }
 
7829
                                        }
 
7830
                                };
 
7831
                                // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
 
7832
                                // This arises when a base node is used (#2709 and #4378).
 
7833
                                head.insertBefore( script, head.firstChild );
 
7834
                        },
 
7835
 
 
7836
                        abort: function() {
 
7837
                                if ( script ) {
 
7838
                                        script.onload( 0, 1 );
 
7839
                                }
 
7840
                        }
 
7841
                };
 
7842
        }
 
7843
});
 
7844
 
 
7845
 
 
7846
 
 
7847
 
 
7848
var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
 
7849
        xhrOnUnloadAbort = window.ActiveXObject ? function() {
 
7850
                // Abort all pending requests
 
7851
                for ( var key in xhrCallbacks ) {
 
7852
                        xhrCallbacks[ key ]( 0, 1 );
 
7853
                }
 
7854
        } : false,
 
7855
        xhrId = 0,
 
7856
        xhrCallbacks;
 
7857
 
 
7858
// Functions to create xhrs
 
7859
function createStandardXHR() {
 
7860
        try {
 
7861
                return new window.XMLHttpRequest();
 
7862
        } catch( e ) {}
 
7863
}
 
7864
 
 
7865
function createActiveXHR() {
 
7866
        try {
 
7867
                return new window.ActiveXObject( "Microsoft.XMLHTTP" );
 
7868
        } catch( e ) {}
 
7869
}
 
7870
 
 
7871
// Create the request object
 
7872
// (This is still attached to ajaxSettings for backward compatibility)
 
7873
jQuery.ajaxSettings.xhr = window.ActiveXObject ?
 
7874
        /* Microsoft failed to properly
 
7875
         * implement the XMLHttpRequest in IE7 (can't request local files),
 
7876
         * so we use the ActiveXObject when it is available
 
7877
         * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
 
7878
         * we need a fallback.
 
7879
         */
 
7880
        function() {
 
7881
                return !this.isLocal && createStandardXHR() || createActiveXHR();
 
7882
        } :
 
7883
        // For all other browsers, use the standard XMLHttpRequest object
 
7884
        createStandardXHR;
 
7885
 
 
7886
// Determine support properties
 
7887
(function( xhr ) {
 
7888
        jQuery.extend( jQuery.support, {
 
7889
                ajax: !!xhr,
 
7890
                cors: !!xhr && ( "withCredentials" in xhr )
 
7891
        });
 
7892
})( jQuery.ajaxSettings.xhr() );
 
7893
 
 
7894
// Create transport if the browser can provide an xhr
 
7895
if ( jQuery.support.ajax ) {
 
7896
 
 
7897
        jQuery.ajaxTransport(function( s ) {
 
7898
                // Cross domain only allowed if supported through XMLHttpRequest
 
7899
                if ( !s.crossDomain || jQuery.support.cors ) {
 
7900
 
 
7901
                        var callback;
 
7902
 
 
7903
                        return {
 
7904
                                send: function( headers, complete ) {
 
7905
 
 
7906
                                        // Get a new xhr
 
7907
                                        var xhr = s.xhr(),
 
7908
                                                handle,
 
7909
                                                i;
 
7910
 
 
7911
                                        // Open the socket
 
7912
                                        // Passing null username, generates a login popup on Opera (#2865)
 
7913
                                        if ( s.username ) {
 
7914
                                                xhr.open( s.type, s.url, s.async, s.username, s.password );
 
7915
                                        } else {
 
7916
                                                xhr.open( s.type, s.url, s.async );
 
7917
                                        }
 
7918
 
 
7919
                                        // Apply custom fields if provided
 
7920
                                        if ( s.xhrFields ) {
 
7921
                                                for ( i in s.xhrFields ) {
 
7922
                                                        xhr[ i ] = s.xhrFields[ i ];
 
7923
                                                }
 
7924
                                        }
 
7925
 
 
7926
                                        // Override mime type if needed
 
7927
                                        if ( s.mimeType && xhr.overrideMimeType ) {
 
7928
                                                xhr.overrideMimeType( s.mimeType );
 
7929
                                        }
 
7930
 
 
7931
                                        // X-Requested-With header
 
7932
                                        // For cross-domain requests, seeing as conditions for a preflight are
 
7933
                                        // akin to a jigsaw puzzle, we simply never set it to be sure.
 
7934
                                        // (it can always be set on a per-request basis or even using ajaxSetup)
 
7935
                                        // For same-domain requests, won't change header if already provided.
 
7936
                                        if ( !s.crossDomain && !headers["X-Requested-With"] ) {
 
7937
                                                headers[ "X-Requested-With" ] = "XMLHttpRequest";
 
7938
                                        }
 
7939
 
 
7940
                                        // Need an extra try/catch for cross domain requests in Firefox 3
 
7941
                                        try {
 
7942
                                                for ( i in headers ) {
 
7943
                                                        xhr.setRequestHeader( i, headers[ i ] );
 
7944
                                                }
 
7945
                                        } catch( _ ) {}
 
7946
 
 
7947
                                        // Do send the request
 
7948
                                        // This may raise an exception which is actually
 
7949
                                        // handled in jQuery.ajax (so no try/catch here)
 
7950
                                        xhr.send( ( s.hasContent && s.data ) || null );
 
7951
 
 
7952
                                        // Listener
 
7953
                                        callback = function( _, isAbort ) {
 
7954
 
 
7955
                                                var status,
 
7956
                                                        statusText,
 
7957
                                                        responseHeaders,
 
7958
                                                        responses,
 
7959
                                                        xml;
 
7960
 
 
7961
                                                // Firefox throws exceptions when accessing properties
 
7962
                                                // of an xhr when a network error occured
 
7963
                                                // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
 
7964
                                                try {
 
7965
 
 
7966
                                                        // Was never called and is aborted or complete
 
7967
                                                        if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
 
7968
 
 
7969
                                                                // Only called once
 
7970
                                                                callback = undefined;
 
7971
 
 
7972
                                                                // Do not keep as active anymore
 
7973
                                                                if ( handle ) {
 
7974
                                                                        xhr.onreadystatechange = jQuery.noop;
 
7975
                                                                        if ( xhrOnUnloadAbort ) {
 
7976
                                                                                delete xhrCallbacks[ handle ];
 
7977
                                                                        }
 
7978
                                                                }
 
7979
 
 
7980
                                                                // If it's an abort
 
7981
                                                                if ( isAbort ) {
 
7982
                                                                        // Abort it manually if needed
 
7983
                                                                        if ( xhr.readyState !== 4 ) {
 
7984
                                                                                xhr.abort();
 
7985
                                                                        }
 
7986
                                                                } else {
 
7987
                                                                        status = xhr.status;
 
7988
                                                                        responseHeaders = xhr.getAllResponseHeaders();
 
7989
                                                                        responses = {};
 
7990
                                                                        xml = xhr.responseXML;
 
7991
 
 
7992
                                                                        // Construct response list
 
7993
                                                                        if ( xml && xml.documentElement /* #4958 */ ) {
 
7994
                                                                                responses.xml = xml;
 
7995
                                                                        }
 
7996
                                                                        responses.text = xhr.responseText;
 
7997
 
 
7998
                                                                        // Firefox throws an exception when accessing
 
7999
                                                                        // statusText for faulty cross-domain requests
 
8000
                                                                        try {
 
8001
                                                                                statusText = xhr.statusText;
 
8002
                                                                        } catch( e ) {
 
8003
                                                                                // We normalize with Webkit giving an empty statusText
 
8004
                                                                                statusText = "";
 
8005
                                                                        }
 
8006
 
 
8007
                                                                        // Filter status for non standard behaviors
 
8008
 
 
8009
                                                                        // If the request is local and we have data: assume a success
 
8010
                                                                        // (success with no data won't get notified, that's the best we
 
8011
                                                                        // can do given current implementations)
 
8012
                                                                        if ( !status && s.isLocal && !s.crossDomain ) {
 
8013
                                                                                status = responses.text ? 200 : 404;
 
8014
                                                                        // IE - #1450: sometimes returns 1223 when it should be 204
 
8015
                                                                        } else if ( status === 1223 ) {
 
8016
                                                                                status = 204;
 
8017
                                                                        }
 
8018
                                                                }
 
8019
                                                        }
 
8020
                                                } catch( firefoxAccessException ) {
 
8021
                                                        if ( !isAbort ) {
 
8022
                                                                complete( -1, firefoxAccessException );
 
8023
                                                        }
 
8024
                                                }
 
8025
 
 
8026
                                                // Call complete if needed
 
8027
                                                if ( responses ) {
 
8028
                                                        complete( status, statusText, responses, responseHeaders );
 
8029
                                                }
 
8030
                                        };
 
8031
 
 
8032
                                        // if we're in sync mode or it's in cache
 
8033
                                        // and has been retrieved directly (IE6 & IE7)
 
8034
                                        // we need to manually fire the callback
 
8035
                                        if ( !s.async || xhr.readyState === 4 ) {
 
8036
                                                callback();
 
8037
                                        } else {
 
8038
                                                handle = ++xhrId;
 
8039
                                                if ( xhrOnUnloadAbort ) {
 
8040
                                                        // Create the active xhrs callbacks list if needed
 
8041
                                                        // and attach the unload handler
 
8042
                                                        if ( !xhrCallbacks ) {
 
8043
                                                                xhrCallbacks = {};
 
8044
                                                                jQuery( window ).unload( xhrOnUnloadAbort );
 
8045
                                                        }
 
8046
                                                        // Add to list of active xhrs callbacks
 
8047
                                                        xhrCallbacks[ handle ] = callback;
 
8048
                                                }
 
8049
                                                xhr.onreadystatechange = callback;
 
8050
                                        }
 
8051
                                },
 
8052
 
 
8053
                                abort: function() {
 
8054
                                        if ( callback ) {
 
8055
                                                callback(0,1);
 
8056
                                        }
 
8057
                                }
 
8058
                        };
 
8059
                }
 
8060
        });
 
8061
}
 
8062
 
 
8063
 
 
8064
 
 
8065
 
 
8066
var elemdisplay = {},
 
8067
        iframe, iframeDoc,
 
8068
        rfxtypes = /^(?:toggle|show|hide)$/,
 
8069
        rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
 
8070
        timerId,
 
8071
        fxAttrs = [
 
8072
                // height animations
 
8073
                [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
 
8074
                // width animations
 
8075
                [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
 
8076
                // opacity animations
 
8077
                [ "opacity" ]
 
8078
        ],
 
8079
        fxNow;
 
8080
 
 
8081
jQuery.fn.extend({
 
8082
        show: function( speed, easing, callback ) {
 
8083
                var elem, display;
 
8084
 
 
8085
                if ( speed || speed === 0 ) {
 
8086
                        return this.animate( genFx("show", 3), speed, easing, callback);
 
8087
 
 
8088
                } else {
 
8089
                        for ( var i = 0, j = this.length; i < j; i++ ) {
 
8090
                                elem = this[i];
 
8091
 
 
8092
                                if ( elem.style ) {
 
8093
                                        display = elem.style.display;
 
8094
 
 
8095
                                        // Reset the inline display of this element to learn if it is
 
8096
                                        // being hidden by cascaded rules or not
 
8097
                                        if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
 
8098
                                                display = elem.style.display = "";
 
8099
                                        }
 
8100
 
 
8101
                                        // Set elements which have been overridden with display: none
 
8102
                                        // in a stylesheet to whatever the default browser style is
 
8103
                                        // for such an element
 
8104
                                        if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
 
8105
                                                jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
 
8106
                                        }
 
8107
                                }
 
8108
                        }
 
8109
 
 
8110
                        // Set the display of most of the elements in a second loop
 
8111
                        // to avoid the constant reflow
 
8112
                        for ( i = 0; i < j; i++ ) {
 
8113
                                elem = this[i];
 
8114
 
 
8115
                                if ( elem.style ) {
 
8116
                                        display = elem.style.display;
 
8117
 
 
8118
                                        if ( display === "" || display === "none" ) {
 
8119
                                                elem.style.display = jQuery._data(elem, "olddisplay") || "";
 
8120
                                        }
 
8121
                                }
 
8122
                        }
 
8123
 
 
8124
                        return this;
 
8125
                }
 
8126
        },
 
8127
 
 
8128
        hide: function( speed, easing, callback ) {
 
8129
                if ( speed || speed === 0 ) {
 
8130
                        return this.animate( genFx("hide", 3), speed, easing, callback);
 
8131
 
 
8132
                } else {
 
8133
                        for ( var i = 0, j = this.length; i < j; i++ ) {
 
8134
                                if ( this[i].style ) {
 
8135
                                        var display = jQuery.css( this[i], "display" );
 
8136
 
 
8137
                                        if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
 
8138
                                                jQuery._data( this[i], "olddisplay", display );
 
8139
                                        }
 
8140
                                }
 
8141
                        }
 
8142
 
 
8143
                        // Set the display of the elements in a second loop
 
8144
                        // to avoid the constant reflow
 
8145
                        for ( i = 0; i < j; i++ ) {
 
8146
                                if ( this[i].style ) {
 
8147
                                        this[i].style.display = "none";
 
8148
                                }
 
8149
                        }
 
8150
 
 
8151
                        return this;
 
8152
                }
 
8153
        },
 
8154
 
 
8155
        // Save the old toggle function
 
8156
        _toggle: jQuery.fn.toggle,
 
8157
 
 
8158
        toggle: function( fn, fn2, callback ) {
 
8159
                var bool = typeof fn === "boolean";
 
8160
 
 
8161
                if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
 
8162
                        this._toggle.apply( this, arguments );
 
8163
 
 
8164
                } else if ( fn == null || bool ) {
 
8165
                        this.each(function() {
 
8166
                                var state = bool ? fn : jQuery(this).is(":hidden");
 
8167
                                jQuery(this)[ state ? "show" : "hide" ]();
 
8168
                        });
 
8169
 
 
8170
                } else {
 
8171
                        this.animate(genFx("toggle", 3), fn, fn2, callback);
 
8172
                }
 
8173
 
 
8174
                return this;
 
8175
        },
 
8176
 
 
8177
        fadeTo: function( speed, to, easing, callback ) {
 
8178
                return this.filter(":hidden").css("opacity", 0).show().end()
 
8179
                                        .animate({opacity: to}, speed, easing, callback);
 
8180
        },
 
8181
 
 
8182
        animate: function( prop, speed, easing, callback ) {
 
8183
                var optall = jQuery.speed(speed, easing, callback);
 
8184
 
 
8185
                if ( jQuery.isEmptyObject( prop ) ) {
 
8186
                        return this.each( optall.complete, [ false ] );
 
8187
                }
 
8188
 
 
8189
                // Do not change referenced properties as per-property easing will be lost
 
8190
                prop = jQuery.extend( {}, prop );
 
8191
 
 
8192
                return this[ optall.queue === false ? "each" : "queue" ](function() {
 
8193
                        // XXX 'this' does not always have a nodeName when running the
 
8194
                        // test suite
 
8195
 
 
8196
                        if ( optall.queue === false ) {
 
8197
                                jQuery._mark( this );
 
8198
                        }
 
8199
 
 
8200
                        var opt = jQuery.extend( {}, optall ),
 
8201
                                isElement = this.nodeType === 1,
 
8202
                                hidden = isElement && jQuery(this).is(":hidden"),
 
8203
                                name, val, p,
 
8204
                                display, e,
 
8205
                                parts, start, end, unit;
 
8206
 
 
8207
                        // will store per property easing and be used to determine when an animation is complete
 
8208
                        opt.animatedProperties = {};
 
8209
 
 
8210
                        for ( p in prop ) {
 
8211
 
 
8212
                                // property name normalization
 
8213
                                name = jQuery.camelCase( p );
 
8214
                                if ( p !== name ) {
 
8215
                                        prop[ name ] = prop[ p ];
 
8216
                                        delete prop[ p ];
 
8217
                                }
 
8218
 
 
8219
                                val = prop[ name ];
 
8220
 
 
8221
                                // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
 
8222
                                if ( jQuery.isArray( val ) ) {
 
8223
                                        opt.animatedProperties[ name ] = val[ 1 ];
 
8224
                                        val = prop[ name ] = val[ 0 ];
 
8225
                                } else {
 
8226
                                        opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
 
8227
                                }
 
8228
 
 
8229
                                if ( val === "hide" && hidden || val === "show" && !hidden ) {
 
8230
                                        return opt.complete.call( this );
 
8231
                                }
 
8232
 
 
8233
                                if ( isElement && ( name === "height" || name === "width" ) ) {
 
8234
                                        // Make sure that nothing sneaks out
 
8235
                                        // Record all 3 overflow attributes because IE does not
 
8236
                                        // change the overflow attribute when overflowX and
 
8237
                                        // overflowY are set to the same value
 
8238
                                        opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
 
8239
 
 
8240
                                        // Set display property to inline-block for height/width
 
8241
                                        // animations on inline elements that are having width/height
 
8242
                                        // animated
 
8243
                                        if ( jQuery.css( this, "display" ) === "inline" &&
 
8244
                                                        jQuery.css( this, "float" ) === "none" ) {
 
8245
                                                if ( !jQuery.support.inlineBlockNeedsLayout ) {
 
8246
                                                        this.style.display = "inline-block";
 
8247
 
 
8248
                                                } else {
 
8249
                                                        display = defaultDisplay( this.nodeName );
 
8250
 
 
8251
                                                        // inline-level elements accept inline-block;
 
8252
                                                        // block-level elements need to be inline with layout
 
8253
                                                        if ( display === "inline" ) {
 
8254
                                                                this.style.display = "inline-block";
 
8255
 
 
8256
                                                        } else {
 
8257
                                                                this.style.display = "inline";
 
8258
                                                                this.style.zoom = 1;
 
8259
                                                        }
 
8260
                                                }
 
8261
                                        }
 
8262
                                }
 
8263
                        }
 
8264
 
 
8265
                        if ( opt.overflow != null ) {
 
8266
                                this.style.overflow = "hidden";
 
8267
                        }
 
8268
 
 
8269
                        for ( p in prop ) {
 
8270
                                e = new jQuery.fx( this, opt, p );
 
8271
                                val = prop[ p ];
 
8272
 
 
8273
                                if ( rfxtypes.test(val) ) {
 
8274
                                        e[ val === "toggle" ? hidden ? "show" : "hide" : val ]();
 
8275
 
 
8276
                                } else {
 
8277
                                        parts = rfxnum.exec( val );
 
8278
                                        start = e.cur();
 
8279
 
 
8280
                                        if ( parts ) {
 
8281
                                                end = parseFloat( parts[2] );
 
8282
                                                unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
 
8283
 
 
8284
                                                // We need to compute starting value
 
8285
                                                if ( unit !== "px" ) {
 
8286
                                                        jQuery.style( this, p, (end || 1) + unit);
 
8287
                                                        start = ((end || 1) / e.cur()) * start;
 
8288
                                                        jQuery.style( this, p, start + unit);
 
8289
                                                }
 
8290
 
 
8291
                                                // If a +=/-= token was provided, we're doing a relative animation
 
8292
                                                if ( parts[1] ) {
 
8293
                                                        end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
 
8294
                                                }
 
8295
 
 
8296
                                                e.custom( start, end, unit );
 
8297
 
 
8298
                                        } else {
 
8299
                                                e.custom( start, val, "" );
 
8300
                                        }
 
8301
                                }
 
8302
                        }
 
8303
 
 
8304
                        // For JS strict compliance
 
8305
                        return true;
 
8306
                });
 
8307
        },
 
8308
 
 
8309
        stop: function( clearQueue, gotoEnd ) {
 
8310
                if ( clearQueue ) {
 
8311
                        this.queue([]);
 
8312
                }
 
8313
 
 
8314
                this.each(function() {
 
8315
                        var timers = jQuery.timers,
 
8316
                                i = timers.length;
 
8317
                        // clear marker counters if we know they won't be
 
8318
                        if ( !gotoEnd ) {
 
8319
                                jQuery._unmark( true, this );
 
8320
                        }
 
8321
                        while ( i-- ) {
 
8322
                                if ( timers[i].elem === this ) {
 
8323
                                        if (gotoEnd) {
 
8324
                                                // force the next step to be the last
 
8325
                                                timers[i](true);
 
8326
                                        }
 
8327
 
 
8328
                                        timers.splice(i, 1);
 
8329
                                }
 
8330
                        }
 
8331
                });
 
8332
 
 
8333
                // start the next in the queue if the last step wasn't forced
 
8334
                if ( !gotoEnd ) {
 
8335
                        this.dequeue();
 
8336
                }
 
8337
 
 
8338
                return this;
 
8339
        }
 
8340
 
 
8341
});
 
8342
 
 
8343
// Animations created synchronously will run synchronously
 
8344
function createFxNow() {
 
8345
        setTimeout( clearFxNow, 0 );
 
8346
        return ( fxNow = jQuery.now() );
 
8347
}
 
8348
 
 
8349
function clearFxNow() {
 
8350
        fxNow = undefined;
 
8351
}
 
8352
 
 
8353
// Generate parameters to create a standard animation
 
8354
function genFx( type, num ) {
 
8355
        var obj = {};
 
8356
 
 
8357
        jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
 
8358
                obj[ this ] = type;
 
8359
        });
 
8360
 
 
8361
        return obj;
 
8362
}
 
8363
 
 
8364
// Generate shortcuts for custom animations
 
8365
jQuery.each({
 
8366
        slideDown: genFx("show", 1),
 
8367
        slideUp: genFx("hide", 1),
 
8368
        slideToggle: genFx("toggle", 1),
 
8369
        fadeIn: { opacity: "show" },
 
8370
        fadeOut: { opacity: "hide" },
 
8371
        fadeToggle: { opacity: "toggle" }
 
8372
}, function( name, props ) {
 
8373
        jQuery.fn[ name ] = function( speed, easing, callback ) {
 
8374
                return this.animate( props, speed, easing, callback );
 
8375
        };
 
8376
});
 
8377
 
 
8378
jQuery.extend({
 
8379
        speed: function( speed, easing, fn ) {
 
8380
                var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
 
8381
                        complete: fn || !fn && easing ||
 
8382
                                jQuery.isFunction( speed ) && speed,
 
8383
                        duration: speed,
 
8384
                        easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
 
8385
                };
 
8386
 
 
8387
                opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
 
8388
                        opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
 
8389
 
 
8390
                // Queueing
 
8391
                opt.old = opt.complete;
 
8392
                opt.complete = function( noUnmark ) {
 
8393
                        if ( jQuery.isFunction( opt.old ) ) {
 
8394
                                opt.old.call( this );
 
8395
                        }
 
8396
 
 
8397
                        if ( opt.queue !== false ) {
 
8398
                                jQuery.dequeue( this );
 
8399
                        } else if ( noUnmark !== false ) {
 
8400
                                jQuery._unmark( this );
 
8401
                        }
 
8402
                };
 
8403
 
 
8404
                return opt;
 
8405
        },
 
8406
 
 
8407
        easing: {
 
8408
                linear: function( p, n, firstNum, diff ) {
 
8409
                        return firstNum + diff * p;
 
8410
                },
 
8411
                swing: function( p, n, firstNum, diff ) {
 
8412
                        return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
 
8413
                }
 
8414
        },
 
8415
 
 
8416
        timers: [],
 
8417
 
 
8418
        fx: function( elem, options, prop ) {
 
8419
                this.options = options;
 
8420
                this.elem = elem;
 
8421
                this.prop = prop;
 
8422
 
 
8423
                options.orig = options.orig || {};
 
8424
        }
 
8425
 
 
8426
});
 
8427
 
 
8428
jQuery.fx.prototype = {
 
8429
        // Simple function for setting a style value
 
8430
        update: function() {
 
8431
                if ( this.options.step ) {
 
8432
                        this.options.step.call( this.elem, this.now, this );
 
8433
                }
 
8434
 
 
8435
                (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
 
8436
        },
 
8437
 
 
8438
        // Get the current size
 
8439
        cur: function() {
 
8440
                if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
 
8441
                        return this.elem[ this.prop ];
 
8442
                }
 
8443
 
 
8444
                var parsed,
 
8445
                        r = jQuery.css( this.elem, this.prop );
 
8446
                // Empty strings, null, undefined and "auto" are converted to 0,
 
8447
                // complex values such as "rotate(1rad)" are returned as is,
 
8448
                // simple values such as "10px" are parsed to Float.
 
8449
                return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
 
8450
        },
 
8451
 
 
8452
        // Start an animation from one number to another
 
8453
        custom: function( from, to, unit ) {
 
8454
                var self = this,
 
8455
                        fx = jQuery.fx;
 
8456
 
 
8457
                this.startTime = fxNow || createFxNow();
 
8458
                this.start = from;
 
8459
                this.end = to;
 
8460
                this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
 
8461
                this.now = this.start;
 
8462
                this.pos = this.state = 0;
 
8463
 
 
8464
                function t( gotoEnd ) {
 
8465
                        return self.step(gotoEnd);
 
8466
                }
 
8467
 
 
8468
                t.elem = this.elem;
 
8469
 
 
8470
                if ( t() && jQuery.timers.push(t) && !timerId ) {
 
8471
                        timerId = setInterval( fx.tick, fx.interval );
 
8472
                }
 
8473
        },
 
8474
 
 
8475
        // Simple 'show' function
 
8476
        show: function() {
 
8477
                // Remember where we started, so that we can go back to it later
 
8478
                this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
 
8479
                this.options.show = true;
 
8480
 
 
8481
                // Begin the animation
 
8482
                // Make sure that we start at a small width/height to avoid any
 
8483
                // flash of content
 
8484
                this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
 
8485
 
 
8486
                // Start by showing the element
 
8487
                jQuery( this.elem ).show();
 
8488
        },
 
8489
 
 
8490
        // Simple 'hide' function
 
8491
        hide: function() {
 
8492
                // Remember where we started, so that we can go back to it later
 
8493
                this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
 
8494
                this.options.hide = true;
 
8495
 
 
8496
                // Begin the animation
 
8497
                this.custom(this.cur(), 0);
 
8498
        },
 
8499
 
 
8500
        // Each step of an animation
 
8501
        step: function( gotoEnd ) {
 
8502
                var t = fxNow || createFxNow(),
 
8503
                        done = true,
 
8504
                        elem = this.elem,
 
8505
                        options = this.options,
 
8506
                        i, n;
 
8507
 
 
8508
                if ( gotoEnd || t >= options.duration + this.startTime ) {
 
8509
                        this.now = this.end;
 
8510
                        this.pos = this.state = 1;
 
8511
                        this.update();
 
8512
 
 
8513
                        options.animatedProperties[ this.prop ] = true;
 
8514
 
 
8515
                        for ( i in options.animatedProperties ) {
 
8516
                                if ( options.animatedProperties[i] !== true ) {
 
8517
                                        done = false;
 
8518
                                }
 
8519
                        }
 
8520
 
 
8521
                        if ( done ) {
 
8522
                                // Reset the overflow
 
8523
                                if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
 
8524
 
 
8525
                                        jQuery.each( [ "", "X", "Y" ], function (index, value) {
 
8526
                                                elem.style[ "overflow" + value ] = options.overflow[index];
 
8527
                                        });
 
8528
                                }
 
8529
 
 
8530
                                // Hide the element if the "hide" operation was done
 
8531
                                if ( options.hide ) {
 
8532
                                        jQuery(elem).hide();
 
8533
                                }
 
8534
 
 
8535
                                // Reset the properties, if the item has been hidden or shown
 
8536
                                if ( options.hide || options.show ) {
 
8537
                                        for ( var p in options.animatedProperties ) {
 
8538
                                                jQuery.style( elem, p, options.orig[p] );
 
8539
                                        }
 
8540
                                }
 
8541
 
 
8542
                                // Execute the complete function
 
8543
                                options.complete.call( elem );
 
8544
                        }
 
8545
 
 
8546
                        return false;
 
8547
 
 
8548
                } else {
 
8549
                        // classical easing cannot be used with an Infinity duration
 
8550
                        if ( options.duration == Infinity ) {
 
8551
                                this.now = t;
 
8552
                        } else {
 
8553
                                n = t - this.startTime;
 
8554
                                this.state = n / options.duration;
 
8555
 
 
8556
                                // Perform the easing function, defaults to swing
 
8557
                                this.pos = jQuery.easing[ options.animatedProperties[ this.prop ] ]( this.state, n, 0, 1, options.duration );
 
8558
                                this.now = this.start + ((this.end - this.start) * this.pos);
 
8559
                        }
 
8560
                        // Perform the next step of the animation
 
8561
                        this.update();
 
8562
                }
 
8563
 
 
8564
                return true;
 
8565
        }
 
8566
};
 
8567
 
 
8568
jQuery.extend( jQuery.fx, {
 
8569
        tick: function() {
 
8570
                for ( var timers = jQuery.timers, i = 0 ; i < timers.length ; ++i ) {
 
8571
                        if ( !timers[i]() ) {
 
8572
                                timers.splice(i--, 1);
 
8573
                        }
 
8574
                }
 
8575
 
 
8576
                if ( !timers.length ) {
 
8577
                        jQuery.fx.stop();
 
8578
                }
 
8579
        },
 
8580
 
 
8581
        interval: 13,
 
8582
 
 
8583
        stop: function() {
 
8584
                clearInterval( timerId );
 
8585
                timerId = null;
 
8586
        },
 
8587
 
 
8588
        speeds: {
 
8589
                slow: 600,
 
8590
                fast: 200,
 
8591
                // Default speed
 
8592
                _default: 400
 
8593
        },
 
8594
 
 
8595
        step: {
 
8596
                opacity: function( fx ) {
 
8597
                        jQuery.style( fx.elem, "opacity", fx.now );
 
8598
                },
 
8599
 
 
8600
                _default: function( fx ) {
 
8601
                        if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
 
8602
                                fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
 
8603
                        } else {
 
8604
                                fx.elem[ fx.prop ] = fx.now;
 
8605
                        }
 
8606
                }
 
8607
        }
 
8608
});
 
8609
 
 
8610
if ( jQuery.expr && jQuery.expr.filters ) {
 
8611
        jQuery.expr.filters.animated = function( elem ) {
 
8612
                return jQuery.grep(jQuery.timers, function( fn ) {
 
8613
                        return elem === fn.elem;
 
8614
                }).length;
 
8615
        };
 
8616
}
 
8617
 
 
8618
// Try to restore the default display value of an element
 
8619
function defaultDisplay( nodeName ) {
 
8620
 
 
8621
        if ( !elemdisplay[ nodeName ] ) {
 
8622
 
 
8623
                var body = document.body,
 
8624
                        elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
 
8625
                        display = elem.css( "display" );
 
8626
 
 
8627
                elem.remove();
 
8628
 
 
8629
                // If the simple way fails,
 
8630
                // get element's real default display by attaching it to a temp iframe
 
8631
                if ( display === "none" || display === "" ) {
 
8632
                        // No iframe to use yet, so create it
 
8633
                        if ( !iframe ) {
 
8634
                                iframe = document.createElement( "iframe" );
 
8635
                                iframe.frameBorder = iframe.width = iframe.height = 0;
 
8636
                        }
 
8637
 
 
8638
                        body.appendChild( iframe );
 
8639
 
 
8640
                        // Create a cacheable copy of the iframe document on first call.
 
8641
                        // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
 
8642
                        // document to it; WebKit & Firefox won't allow reusing the iframe document.
 
8643
                        if ( !iframeDoc || !iframe.createElement ) {
 
8644
                                iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
 
8645
                                iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
 
8646
                                iframeDoc.close();
 
8647
                        }
 
8648
 
 
8649
                        elem = iframeDoc.createElement( nodeName );
 
8650
 
 
8651
                        iframeDoc.body.appendChild( elem );
 
8652
 
 
8653
                        display = jQuery.css( elem, "display" );
 
8654
 
 
8655
                        body.removeChild( iframe );
 
8656
                }
 
8657
 
 
8658
                // Store the correct default display
 
8659
                elemdisplay[ nodeName ] = display;
 
8660
        }
 
8661
 
 
8662
        return elemdisplay[ nodeName ];
 
8663
}
 
8664
 
 
8665
 
 
8666
 
 
8667
 
 
8668
var rtable = /^t(?:able|d|h)$/i,
 
8669
        rroot = /^(?:body|html)$/i;
 
8670
 
 
8671
if ( "getBoundingClientRect" in document.documentElement ) {
 
8672
        jQuery.fn.offset = function( options ) {
 
8673
                var elem = this[0], box;
 
8674
 
 
8675
                if ( options ) {
 
8676
                        return this.each(function( i ) {
 
8677
                                jQuery.offset.setOffset( this, options, i );
 
8678
                        });
 
8679
                }
 
8680
 
 
8681
                if ( !elem || !elem.ownerDocument ) {
 
8682
                        return null;
 
8683
                }
 
8684
 
 
8685
                if ( elem === elem.ownerDocument.body ) {
 
8686
                        return jQuery.offset.bodyOffset( elem );
 
8687
                }
 
8688
 
 
8689
                try {
 
8690
                        box = elem.getBoundingClientRect();
 
8691
                } catch(e) {}
 
8692
 
 
8693
                var doc = elem.ownerDocument,
 
8694
                        docElem = doc.documentElement;
 
8695
 
 
8696
                // Make sure we're not dealing with a disconnected DOM node
 
8697
                if ( !box || !jQuery.contains( docElem, elem ) ) {
 
8698
                        return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
 
8699
                }
 
8700
 
 
8701
                var body = doc.body,
 
8702
                        win = getWindow(doc),
 
8703
                        clientTop  = docElem.clientTop  || body.clientTop  || 0,
 
8704
                        clientLeft = docElem.clientLeft || body.clientLeft || 0,
 
8705
                        scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
 
8706
                        scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
 
8707
                        top  = box.top  + scrollTop  - clientTop,
 
8708
                        left = box.left + scrollLeft - clientLeft;
 
8709
 
 
8710
                return { top: top, left: left };
 
8711
        };
 
8712
 
 
8713
} else {
 
8714
        jQuery.fn.offset = function( options ) {
 
8715
                var elem = this[0];
 
8716
 
 
8717
                if ( options ) {
 
8718
                        return this.each(function( i ) {
 
8719
                                jQuery.offset.setOffset( this, options, i );
 
8720
                        });
 
8721
                }
 
8722
 
 
8723
                if ( !elem || !elem.ownerDocument ) {
 
8724
                        return null;
 
8725
                }
 
8726
 
 
8727
                if ( elem === elem.ownerDocument.body ) {
 
8728
                        return jQuery.offset.bodyOffset( elem );
 
8729
                }
 
8730
 
 
8731
                jQuery.offset.initialize();
 
8732
 
 
8733
                var computedStyle,
 
8734
                        offsetParent = elem.offsetParent,
 
8735
                        prevOffsetParent = elem,
 
8736
                        doc = elem.ownerDocument,
 
8737
                        docElem = doc.documentElement,
 
8738
                        body = doc.body,
 
8739
                        defaultView = doc.defaultView,
 
8740
                        prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
 
8741
                        top = elem.offsetTop,
 
8742
                        left = elem.offsetLeft;
 
8743
 
 
8744
                while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
 
8745
                        if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
 
8746
                                break;
 
8747
                        }
 
8748
 
 
8749
                        computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
 
8750
                        top  -= elem.scrollTop;
 
8751
                        left -= elem.scrollLeft;
 
8752
 
 
8753
                        if ( elem === offsetParent ) {
 
8754
                                top  += elem.offsetTop;
 
8755
                                left += elem.offsetLeft;
 
8756
 
 
8757
                                if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
 
8758
                                        top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
 
8759
                                        left += parseFloat( computedStyle.borderLeftWidth ) || 0;
 
8760
                                }
 
8761
 
 
8762
                                prevOffsetParent = offsetParent;
 
8763
                                offsetParent = elem.offsetParent;
 
8764
                        }
 
8765
 
 
8766
                        if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
 
8767
                                top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
 
8768
                                left += parseFloat( computedStyle.borderLeftWidth ) || 0;
 
8769
                        }
 
8770
 
 
8771
                        prevComputedStyle = computedStyle;
 
8772
                }
 
8773
 
 
8774
                if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
 
8775
                        top  += body.offsetTop;
 
8776
                        left += body.offsetLeft;
 
8777
                }
 
8778
 
 
8779
                if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
 
8780
                        top  += Math.max( docElem.scrollTop, body.scrollTop );
 
8781
                        left += Math.max( docElem.scrollLeft, body.scrollLeft );
 
8782
                }
 
8783
 
 
8784
                return { top: top, left: left };
 
8785
        };
 
8786
}
 
8787
 
 
8788
jQuery.offset = {
 
8789
        initialize: function() {
 
8790
                var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
 
8791
                        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>";
 
8792
 
 
8793
                jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
 
8794
 
 
8795
                container.innerHTML = html;
 
8796
                body.insertBefore( container, body.firstChild );
 
8797
                innerDiv = container.firstChild;
 
8798
                checkDiv = innerDiv.firstChild;
 
8799
                td = innerDiv.nextSibling.firstChild.firstChild;
 
8800
 
 
8801
                this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
 
8802
                this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
 
8803
 
 
8804
                checkDiv.style.position = "fixed";
 
8805
                checkDiv.style.top = "20px";
 
8806
 
 
8807
                // safari subtracts parent border width here which is 5px
 
8808
                this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
 
8809
                checkDiv.style.position = checkDiv.style.top = "";
 
8810
 
 
8811
                innerDiv.style.overflow = "hidden";
 
8812
                innerDiv.style.position = "relative";
 
8813
 
 
8814
                this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
 
8815
 
 
8816
                this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
 
8817
 
 
8818
                body.removeChild( container );
 
8819
                jQuery.offset.initialize = jQuery.noop;
 
8820
        },
 
8821
 
 
8822
        bodyOffset: function( body ) {
 
8823
                var top = body.offsetTop,
 
8824
                        left = body.offsetLeft;
 
8825
 
 
8826
                jQuery.offset.initialize();
 
8827
 
 
8828
                if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
 
8829
                        top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
 
8830
                        left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
 
8831
                }
 
8832
 
 
8833
                return { top: top, left: left };
 
8834
        },
 
8835
 
 
8836
        setOffset: function( elem, options, i ) {
 
8837
                var position = jQuery.css( elem, "position" );
 
8838
 
 
8839
                // set position first, in-case top/left are set even on static elem
 
8840
                if ( position === "static" ) {
 
8841
                        elem.style.position = "relative";
 
8842
                }
 
8843
 
 
8844
                var curElem = jQuery( elem ),
 
8845
                        curOffset = curElem.offset(),
 
8846
                        curCSSTop = jQuery.css( elem, "top" ),
 
8847
                        curCSSLeft = jQuery.css( elem, "left" ),
 
8848
                        calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
 
8849
                        props = {}, curPosition = {}, curTop, curLeft;
 
8850
 
 
8851
                // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
 
8852
                if ( calculatePosition ) {
 
8853
                        curPosition = curElem.position();
 
8854
                        curTop = curPosition.top;
 
8855
                        curLeft = curPosition.left;
 
8856
                } else {
 
8857
                        curTop = parseFloat( curCSSTop ) || 0;
 
8858
                        curLeft = parseFloat( curCSSLeft ) || 0;
 
8859
                }
 
8860
 
 
8861
                if ( jQuery.isFunction( options ) ) {
 
8862
                        options = options.call( elem, i, curOffset );
 
8863
                }
 
8864
 
 
8865
                if (options.top != null) {
 
8866
                        props.top = (options.top - curOffset.top) + curTop;
 
8867
                }
 
8868
                if (options.left != null) {
 
8869
                        props.left = (options.left - curOffset.left) + curLeft;
 
8870
                }
 
8871
 
 
8872
                if ( "using" in options ) {
 
8873
                        options.using.call( elem, props );
 
8874
                } else {
 
8875
                        curElem.css( props );
 
8876
                }
 
8877
        }
 
8878
};
 
8879
 
 
8880
 
 
8881
jQuery.fn.extend({
 
8882
        position: function() {
 
8883
                if ( !this[0] ) {
 
8884
                        return null;
 
8885
                }
 
8886
 
 
8887
                var elem = this[0],
 
8888
 
 
8889
                // Get *real* offsetParent
 
8890
                offsetParent = this.offsetParent(),
 
8891
 
 
8892
                // Get correct offsets
 
8893
                offset       = this.offset(),
 
8894
                parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
 
8895
 
 
8896
                // Subtract element margins
 
8897
                // note: when an element has margin: auto the offsetLeft and marginLeft
 
8898
                // are the same in Safari causing offset.left to incorrectly be 0
 
8899
                offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
 
8900
                offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
 
8901
 
 
8902
                // Add offsetParent borders
 
8903
                parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
 
8904
                parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
 
8905
 
 
8906
                // Subtract the two offsets
 
8907
                return {
 
8908
                        top:  offset.top  - parentOffset.top,
 
8909
                        left: offset.left - parentOffset.left
 
8910
                };
 
8911
        },
 
8912
 
 
8913
        offsetParent: function() {
 
8914
                return this.map(function() {
 
8915
                        var offsetParent = this.offsetParent || document.body;
 
8916
                        while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
 
8917
                                offsetParent = offsetParent.offsetParent;
 
8918
                        }
 
8919
                        return offsetParent;
 
8920
                });
 
8921
        }
 
8922
});
 
8923
 
 
8924
 
 
8925
// Create scrollLeft and scrollTop methods
 
8926
jQuery.each( ["Left", "Top"], function( i, name ) {
 
8927
        var method = "scroll" + name;
 
8928
 
 
8929
        jQuery.fn[ method ] = function( val ) {
 
8930
                var elem, win;
 
8931
 
 
8932
                if ( val === undefined ) {
 
8933
                        elem = this[ 0 ];
 
8934
 
 
8935
                        if ( !elem ) {
 
8936
                                return null;
 
8937
                        }
 
8938
 
 
8939
                        win = getWindow( elem );
 
8940
 
 
8941
                        // Return the scroll offset
 
8942
                        return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
 
8943
                                jQuery.support.boxModel && win.document.documentElement[ method ] ||
 
8944
                                        win.document.body[ method ] :
 
8945
                                elem[ method ];
 
8946
                }
 
8947
 
 
8948
                // Set the scroll offset
 
8949
                return this.each(function() {
 
8950
                        win = getWindow( this );
 
8951
 
 
8952
                        if ( win ) {
 
8953
                                win.scrollTo(
 
8954
                                        !i ? val : jQuery( win ).scrollLeft(),
 
8955
                                         i ? val : jQuery( win ).scrollTop()
 
8956
                                );
 
8957
 
 
8958
                        } else {
 
8959
                                this[ method ] = val;
 
8960
                        }
 
8961
                });
 
8962
        };
 
8963
});
 
8964
 
 
8965
function getWindow( elem ) {
 
8966
        return jQuery.isWindow( elem ) ?
 
8967
                elem :
 
8968
                elem.nodeType === 9 ?
 
8969
                        elem.defaultView || elem.parentWindow :
 
8970
                        false;
 
8971
}
 
8972
 
 
8973
 
 
8974
 
 
8975
 
 
8976
// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
 
8977
jQuery.each([ "Height", "Width" ], function( i, name ) {
 
8978
 
 
8979
        var type = name.toLowerCase();
 
8980
 
 
8981
        // innerHeight and innerWidth
 
8982
        jQuery.fn[ "inner" + name ] = function() {
 
8983
                var elem = this[0];
 
8984
                return elem && elem.style ?
 
8985
                        parseFloat( jQuery.css( elem, type, "padding" ) ) :
 
8986
                        null;
 
8987
        };
 
8988
 
 
8989
        // outerHeight and outerWidth
 
8990
        jQuery.fn[ "outer" + name ] = function( margin ) {
 
8991
                var elem = this[0];
 
8992
                return elem && elem.style ?
 
8993
                        parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
 
8994
                        null;
 
8995
        };
 
8996
 
 
8997
        jQuery.fn[ type ] = function( size ) {
 
8998
                // Get window width or height
 
8999
                var elem = this[0];
 
9000
                if ( !elem ) {
 
9001
                        return size == null ? null : this;
 
9002
                }
 
9003
 
 
9004
                if ( jQuery.isFunction( size ) ) {
 
9005
                        return this.each(function( i ) {
 
9006
                                var self = jQuery( this );
 
9007
                                self[ type ]( size.call( this, i, self[ type ]() ) );
 
9008
                        });
 
9009
                }
 
9010
 
 
9011
                if ( jQuery.isWindow( elem ) ) {
 
9012
                        // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
 
9013
                        // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
 
9014
                        var docElemProp = elem.document.documentElement[ "client" + name ],
 
9015
                                body = elem.document.body;
 
9016
                        return elem.document.compatMode === "CSS1Compat" && docElemProp ||
 
9017
                                body && body[ "client" + name ] || docElemProp;
 
9018
 
 
9019
                // Get document width or height
 
9020
                } else if ( elem.nodeType === 9 ) {
 
9021
                        // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
 
9022
                        return Math.max(
 
9023
                                elem.documentElement["client" + name],
 
9024
                                elem.body["scroll" + name], elem.documentElement["scroll" + name],
 
9025
                                elem.body["offset" + name], elem.documentElement["offset" + name]
 
9026
                        );
 
9027
 
 
9028
                // Get or set width or height on the element
 
9029
                } else if ( size === undefined ) {
 
9030
                        var orig = jQuery.css( elem, type ),
 
9031
                                ret = parseFloat( orig );
 
9032
 
 
9033
                        return jQuery.isNaN( ret ) ? orig : ret;
 
9034
 
 
9035
                // Set the width or height on the element (default to pixels if value is unitless)
 
9036
                } else {
 
9037
                        return this.css( type, typeof size === "string" ? size : size + "px" );
 
9038
                }
 
9039
        };
 
9040
 
 
9041
});
 
9042
 
 
9043
 
 
9044
// Expose jQuery to the global object
 
9045
window.jQuery = window.$ = jQuery;
 
9046
})(window);