Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagecell
Path: blob/master/static/colorpicker/js/jquery.js
447 views
1
/*!
2
* jQuery JavaScript Library v1.3.2
3
* http://jquery.com/
4
*
5
* Copyright (c) 2009 John Resig
6
* Dual licensed under the MIT and GPL licenses.
7
* http://docs.jquery.com/License
8
*
9
* Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
10
* Revision: 6246
11
*/
12
(function(){
13
14
var
15
// Will speed up references to window, and allows munging its name.
16
window = this,
17
// Will speed up references to undefined, and allows munging its name.
18
undefined,
19
// Map over jQuery in case of overwrite
20
_jQuery = window.jQuery,
21
// Map over the $ in case of overwrite
22
_$ = window.$,
23
24
jQuery = window.jQuery = window.$ = function( selector, context ) {
25
// The jQuery object is actually just the init constructor 'enhanced'
26
return new jQuery.fn.init( selector, context );
27
},
28
29
// A simple way to check for HTML strings or ID strings
30
// (both of which we optimize for)
31
quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,
32
// Is it a simple selector
33
isSimple = /^.[^:#\[\.,]*$/;
34
35
jQuery.fn = jQuery.prototype = {
36
init: function( selector, context ) {
37
// Make sure that a selection was provided
38
selector = selector || document;
39
40
// Handle $(DOMElement)
41
if ( selector.nodeType ) {
42
this[0] = selector;
43
this.length = 1;
44
this.context = selector;
45
return this;
46
}
47
// Handle HTML strings
48
if ( typeof selector === "string" ) {
49
// Are we dealing with HTML string or an ID?
50
var match = quickExpr.exec( selector );
51
52
// Verify a match, and that no context was specified for #id
53
if ( match && (match[1] || !context) ) {
54
55
// HANDLE: $(html) -> $(array)
56
if ( match[1] )
57
selector = jQuery.clean( [ match[1] ], context );
58
59
// HANDLE: $("#id")
60
else {
61
var elem = document.getElementById( match[3] );
62
63
// Handle the case where IE and Opera return items
64
// by name instead of ID
65
if ( elem && elem.id != match[3] )
66
return jQuery().find( selector );
67
68
// Otherwise, we inject the element directly into the jQuery object
69
var ret = jQuery( elem || [] );
70
ret.context = document;
71
ret.selector = selector;
72
return ret;
73
}
74
75
// HANDLE: $(expr, [context])
76
// (which is just equivalent to: $(content).find(expr)
77
} else
78
return jQuery( context ).find( selector );
79
80
// HANDLE: $(function)
81
// Shortcut for document ready
82
} else if ( jQuery.isFunction( selector ) )
83
return jQuery( document ).ready( selector );
84
85
// Make sure that old selector state is passed along
86
if ( selector.selector && selector.context ) {
87
this.selector = selector.selector;
88
this.context = selector.context;
89
}
90
91
return this.setArray(jQuery.isArray( selector ) ?
92
selector :
93
jQuery.makeArray(selector));
94
},
95
96
// Start with an empty selector
97
selector: "",
98
99
// The current version of jQuery being used
100
jquery: "1.3.2",
101
102
// The number of elements contained in the matched element set
103
size: function() {
104
return this.length;
105
},
106
107
// Get the Nth element in the matched element set OR
108
// Get the whole matched element set as a clean array
109
get: function( num ) {
110
return num === undefined ?
111
112
// Return a 'clean' array
113
Array.prototype.slice.call( this ) :
114
115
// Return just the object
116
this[ num ];
117
},
118
119
// Take an array of elements and push it onto the stack
120
// (returning the new matched element set)
121
pushStack: function( elems, name, selector ) {
122
// Build a new jQuery matched element set
123
var ret = jQuery( elems );
124
125
// Add the old object onto the stack (as a reference)
126
ret.prevObject = this;
127
128
ret.context = this.context;
129
130
if ( name === "find" )
131
ret.selector = this.selector + (this.selector ? " " : "") + selector;
132
else if ( name )
133
ret.selector = this.selector + "." + name + "(" + selector + ")";
134
135
// Return the newly-formed element set
136
return ret;
137
},
138
139
// Force the current matched set of elements to become
140
// the specified array of elements (destroying the stack in the process)
141
// You should use pushStack() in order to do this, but maintain the stack
142
setArray: function( elems ) {
143
// Resetting the length to 0, then using the native Array push
144
// is a super-fast way to populate an object with array-like properties
145
this.length = 0;
146
Array.prototype.push.apply( this, elems );
147
148
return this;
149
},
150
151
// Execute a callback for every element in the matched set.
152
// (You can seed the arguments with an array of args, but this is
153
// only used internally.)
154
each: function( callback, args ) {
155
return jQuery.each( this, callback, args );
156
},
157
158
// Determine the position of an element within
159
// the matched set of elements
160
index: function( elem ) {
161
// Locate the position of the desired element
162
return jQuery.inArray(
163
// If it receives a jQuery object, the first element is used
164
elem && elem.jquery ? elem[0] : elem
165
, this );
166
},
167
168
attr: function( name, value, type ) {
169
var options = name;
170
171
// Look for the case where we're accessing a style value
172
if ( typeof name === "string" )
173
if ( value === undefined )
174
return this[0] && jQuery[ type || "attr" ]( this[0], name );
175
176
else {
177
options = {};
178
options[ name ] = value;
179
}
180
181
// Check to see if we're setting style values
182
return this.each(function(i){
183
// Set all the styles
184
for ( name in options )
185
jQuery.attr(
186
type ?
187
this.style :
188
this,
189
name, jQuery.prop( this, options[ name ], type, i, name )
190
);
191
});
192
},
193
194
css: function( key, value ) {
195
// ignore negative width and height values
196
if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
197
value = undefined;
198
return this.attr( key, value, "curCSS" );
199
},
200
201
text: function( text ) {
202
if ( typeof text !== "object" && text != null )
203
return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
204
205
var ret = "";
206
207
jQuery.each( text || this, function(){
208
jQuery.each( this.childNodes, function(){
209
if ( this.nodeType != 8 )
210
ret += this.nodeType != 1 ?
211
this.nodeValue :
212
jQuery.fn.text( [ this ] );
213
});
214
});
215
216
return ret;
217
},
218
219
wrapAll: function( html ) {
220
if ( this[0] ) {
221
// The elements to wrap the target around
222
var wrap = jQuery( html, this[0].ownerDocument ).clone();
223
224
if ( this[0].parentNode )
225
wrap.insertBefore( this[0] );
226
227
wrap.map(function(){
228
var elem = this;
229
230
while ( elem.firstChild )
231
elem = elem.firstChild;
232
233
return elem;
234
}).append(this);
235
}
236
237
return this;
238
},
239
240
wrapInner: function( html ) {
241
return this.each(function(){
242
jQuery( this ).contents().wrapAll( html );
243
});
244
},
245
246
wrap: function( html ) {
247
return this.each(function(){
248
jQuery( this ).wrapAll( html );
249
});
250
},
251
252
append: function() {
253
return this.domManip(arguments, true, function(elem){
254
if (this.nodeType == 1)
255
this.appendChild( elem );
256
});
257
},
258
259
prepend: function() {
260
return this.domManip(arguments, true, function(elem){
261
if (this.nodeType == 1)
262
this.insertBefore( elem, this.firstChild );
263
});
264
},
265
266
before: function() {
267
return this.domManip(arguments, false, function(elem){
268
this.parentNode.insertBefore( elem, this );
269
});
270
},
271
272
after: function() {
273
return this.domManip(arguments, false, function(elem){
274
this.parentNode.insertBefore( elem, this.nextSibling );
275
});
276
},
277
278
end: function() {
279
return this.prevObject || jQuery( [] );
280
},
281
282
// For internal use only.
283
// Behaves like an Array's method, not like a jQuery method.
284
push: [].push,
285
sort: [].sort,
286
splice: [].splice,
287
288
find: function( selector ) {
289
if ( this.length === 1 ) {
290
var ret = this.pushStack( [], "find", selector );
291
ret.length = 0;
292
jQuery.find( selector, this[0], ret );
293
return ret;
294
} else {
295
return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){
296
return jQuery.find( selector, elem );
297
})), "find", selector );
298
}
299
},
300
301
clone: function( events ) {
302
// Do the clone
303
var ret = this.map(function(){
304
if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
305
// IE copies events bound via attachEvent when
306
// using cloneNode. Calling detachEvent on the
307
// clone will also remove the events from the orignal
308
// In order to get around this, we use innerHTML.
309
// Unfortunately, this means some modifications to
310
// attributes in IE that are actually only stored
311
// as properties will not be copied (such as the
312
// the name attribute on an input).
313
var html = this.outerHTML;
314
if ( !html ) {
315
var div = this.ownerDocument.createElement("div");
316
div.appendChild( this.cloneNode(true) );
317
html = div.innerHTML;
318
}
319
320
return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0];
321
} else
322
return this.cloneNode(true);
323
});
324
325
// Copy the events from the original to the clone
326
if ( events === true ) {
327
var orig = this.find("*").andSelf(), i = 0;
328
329
ret.find("*").andSelf().each(function(){
330
if ( this.nodeName !== orig[i].nodeName )
331
return;
332
333
var events = jQuery.data( orig[i], "events" );
334
335
for ( var type in events ) {
336
for ( var handler in events[ type ] ) {
337
jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
338
}
339
}
340
341
i++;
342
});
343
}
344
345
// Return the cloned set
346
return ret;
347
},
348
349
filter: function( selector ) {
350
return this.pushStack(
351
jQuery.isFunction( selector ) &&
352
jQuery.grep(this, function(elem, i){
353
return selector.call( elem, i );
354
}) ||
355
356
jQuery.multiFilter( selector, jQuery.grep(this, function(elem){
357
return elem.nodeType === 1;
358
}) ), "filter", selector );
359
},
360
361
closest: function( selector ) {
362
var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null,
363
closer = 0;
364
365
return this.map(function(){
366
var cur = this;
367
while ( cur && cur.ownerDocument ) {
368
if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) {
369
jQuery.data(cur, "closest", closer);
370
return cur;
371
}
372
cur = cur.parentNode;
373
closer++;
374
}
375
});
376
},
377
378
not: function( selector ) {
379
if ( typeof selector === "string" )
380
// test special case where just one selector is passed in
381
if ( isSimple.test( selector ) )
382
return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector );
383
else
384
selector = jQuery.multiFilter( selector, this );
385
386
var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
387
return this.filter(function() {
388
return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
389
});
390
},
391
392
add: function( selector ) {
393
return this.pushStack( jQuery.unique( jQuery.merge(
394
this.get(),
395
typeof selector === "string" ?
396
jQuery( selector ) :
397
jQuery.makeArray( selector )
398
)));
399
},
400
401
is: function( selector ) {
402
return !!selector && jQuery.multiFilter( selector, this ).length > 0;
403
},
404
405
hasClass: function( selector ) {
406
return !!selector && this.is( "." + selector );
407
},
408
409
val: function( value ) {
410
if ( value === undefined ) {
411
var elem = this[0];
412
413
if ( elem ) {
414
if( jQuery.nodeName( elem, 'option' ) )
415
return (elem.attributes.value || {}).specified ? elem.value : elem.text;
416
417
// We need to handle select boxes special
418
if ( jQuery.nodeName( elem, "select" ) ) {
419
var index = elem.selectedIndex,
420
values = [],
421
options = elem.options,
422
one = elem.type == "select-one";
423
424
// Nothing was selected
425
if ( index < 0 )
426
return null;
427
428
// Loop through all the selected options
429
for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
430
var option = options[ i ];
431
432
if ( option.selected ) {
433
// Get the specifc value for the option
434
value = jQuery(option).val();
435
436
// We don't need an array for one selects
437
if ( one )
438
return value;
439
440
// Multi-Selects return an array
441
values.push( value );
442
}
443
}
444
445
return values;
446
}
447
448
// Everything else, we just grab the value
449
return (elem.value || "").replace(/\r/g, "");
450
451
}
452
453
return undefined;
454
}
455
456
if ( typeof value === "number" )
457
value += '';
458
459
return this.each(function(){
460
if ( this.nodeType != 1 )
461
return;
462
463
if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) )
464
this.checked = (jQuery.inArray(this.value, value) >= 0 ||
465
jQuery.inArray(this.name, value) >= 0);
466
467
else if ( jQuery.nodeName( this, "select" ) ) {
468
var values = jQuery.makeArray(value);
469
470
jQuery( "option", this ).each(function(){
471
this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
472
jQuery.inArray( this.text, values ) >= 0);
473
});
474
475
if ( !values.length )
476
this.selectedIndex = -1;
477
478
} else
479
this.value = value;
480
});
481
},
482
483
html: function( value ) {
484
return value === undefined ?
485
(this[0] ?
486
this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") :
487
null) :
488
this.empty().append( value );
489
},
490
491
replaceWith: function( value ) {
492
return this.after( value ).remove();
493
},
494
495
eq: function( i ) {
496
return this.slice( i, +i + 1 );
497
},
498
499
slice: function() {
500
return this.pushStack( Array.prototype.slice.apply( this, arguments ),
501
"slice", Array.prototype.slice.call(arguments).join(",") );
502
},
503
504
map: function( callback ) {
505
return this.pushStack( jQuery.map(this, function(elem, i){
506
return callback.call( elem, i, elem );
507
}));
508
},
509
510
andSelf: function() {
511
return this.add( this.prevObject );
512
},
513
514
domManip: function( args, table, callback ) {
515
if ( this[0] ) {
516
var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(),
517
scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ),
518
first = fragment.firstChild;
519
520
if ( first )
521
for ( var i = 0, l = this.length; i < l; i++ )
522
callback.call( root(this[i], first), this.length > 1 || i > 0 ?
523
fragment.cloneNode(true) : fragment );
524
525
if ( scripts )
526
jQuery.each( scripts, evalScript );
527
}
528
529
return this;
530
531
function root( elem, cur ) {
532
return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ?
533
(elem.getElementsByTagName("tbody")[0] ||
534
elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
535
elem;
536
}
537
}
538
};
539
540
// Give the init function the jQuery prototype for later instantiation
541
jQuery.fn.init.prototype = jQuery.fn;
542
543
function evalScript( i, elem ) {
544
if ( elem.src )
545
jQuery.ajax({
546
url: elem.src,
547
async: false,
548
dataType: "script"
549
});
550
551
else
552
jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
553
554
if ( elem.parentNode )
555
elem.parentNode.removeChild( elem );
556
}
557
558
function now(){
559
return +new Date;
560
}
561
562
jQuery.extend = jQuery.fn.extend = function() {
563
// copy reference to target object
564
var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
565
566
// Handle a deep copy situation
567
if ( typeof target === "boolean" ) {
568
deep = target;
569
target = arguments[1] || {};
570
// skip the boolean and the target
571
i = 2;
572
}
573
574
// Handle case when target is a string or something (possible in deep copy)
575
if ( typeof target !== "object" && !jQuery.isFunction(target) )
576
target = {};
577
578
// extend jQuery itself if only one argument is passed
579
if ( length == i ) {
580
target = this;
581
--i;
582
}
583
584
for ( ; i < length; i++ )
585
// Only deal with non-null/undefined values
586
if ( (options = arguments[ i ]) != null )
587
// Extend the base object
588
for ( var name in options ) {
589
var src = target[ name ], copy = options[ name ];
590
591
// Prevent never-ending loop
592
if ( target === copy )
593
continue;
594
595
// Recurse if we're merging object values
596
if ( deep && copy && typeof copy === "object" && !copy.nodeType )
597
target[ name ] = jQuery.extend( deep,
598
// Never move original objects, clone them
599
src || ( copy.length != null ? [ ] : { } )
600
, copy );
601
602
// Don't bring in undefined values
603
else if ( copy !== undefined )
604
target[ name ] = copy;
605
606
}
607
608
// Return the modified object
609
return target;
610
};
611
612
// exclude the following css properties to add px
613
var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
614
// cache defaultView
615
defaultView = document.defaultView || {},
616
toString = Object.prototype.toString;
617
618
jQuery.extend({
619
noConflict: function( deep ) {
620
window.$ = _$;
621
622
if ( deep )
623
window.jQuery = _jQuery;
624
625
return jQuery;
626
},
627
628
// See test/unit/core.js for details concerning isFunction.
629
// Since version 1.3, DOM methods and functions like alert
630
// aren't supported. They return false on IE (#2968).
631
isFunction: function( obj ) {
632
return toString.call(obj) === "[object Function]";
633
},
634
635
isArray: function( obj ) {
636
return toString.call(obj) === "[object Array]";
637
},
638
639
// check if an element is in a (or is an) XML document
640
isXMLDoc: function( elem ) {
641
return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
642
!!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument );
643
},
644
645
// Evalulates a script in a global context
646
globalEval: function( data ) {
647
if ( data && /\S/.test(data) ) {
648
// Inspired by code by Andrea Giammarchi
649
// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
650
var head = document.getElementsByTagName("head")[0] || document.documentElement,
651
script = document.createElement("script");
652
653
script.type = "text/javascript";
654
if ( jQuery.support.scriptEval )
655
script.appendChild( document.createTextNode( data ) );
656
else
657
script.text = data;
658
659
// Use insertBefore instead of appendChild to circumvent an IE6 bug.
660
// This arises when a base node is used (#2709).
661
head.insertBefore( script, head.firstChild );
662
head.removeChild( script );
663
}
664
},
665
666
nodeName: function( elem, name ) {
667
return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
668
},
669
670
// args is for internal usage only
671
each: function( object, callback, args ) {
672
var name, i = 0, length = object.length;
673
674
if ( args ) {
675
if ( length === undefined ) {
676
for ( name in object )
677
if ( callback.apply( object[ name ], args ) === false )
678
break;
679
} else
680
for ( ; i < length; )
681
if ( callback.apply( object[ i++ ], args ) === false )
682
break;
683
684
// A special, fast, case for the most common use of each
685
} else {
686
if ( length === undefined ) {
687
for ( name in object )
688
if ( callback.call( object[ name ], name, object[ name ] ) === false )
689
break;
690
} else
691
for ( var value = object[0];
692
i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
693
}
694
695
return object;
696
},
697
698
prop: function( elem, value, type, i, name ) {
699
// Handle executable functions
700
if ( jQuery.isFunction( value ) )
701
value = value.call( elem, i );
702
703
// Handle passing in a number to a CSS property
704
return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ?
705
value + "px" :
706
value;
707
},
708
709
className: {
710
// internal only, use addClass("class")
711
add: function( elem, classNames ) {
712
jQuery.each((classNames || "").split(/\s+/), function(i, className){
713
if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
714
elem.className += (elem.className ? " " : "") + className;
715
});
716
},
717
718
// internal only, use removeClass("class")
719
remove: function( elem, classNames ) {
720
if (elem.nodeType == 1)
721
elem.className = classNames !== undefined ?
722
jQuery.grep(elem.className.split(/\s+/), function(className){
723
return !jQuery.className.has( classNames, className );
724
}).join(" ") :
725
"";
726
},
727
728
// internal only, use hasClass("class")
729
has: function( elem, className ) {
730
return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
731
}
732
},
733
734
// A method for quickly swapping in/out CSS properties to get correct calculations
735
swap: function( elem, options, callback ) {
736
var old = {};
737
// Remember the old values, and insert the new ones
738
for ( var name in options ) {
739
old[ name ] = elem.style[ name ];
740
elem.style[ name ] = options[ name ];
741
}
742
743
callback.call( elem );
744
745
// Revert the old values
746
for ( var name in options )
747
elem.style[ name ] = old[ name ];
748
},
749
750
css: function( elem, name, force, extra ) {
751
if ( name == "width" || name == "height" ) {
752
var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
753
754
function getWH() {
755
val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
756
757
if ( extra === "border" )
758
return;
759
760
jQuery.each( which, function() {
761
if ( !extra )
762
val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
763
if ( extra === "margin" )
764
val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
765
else
766
val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
767
});
768
}
769
770
if ( elem.offsetWidth !== 0 )
771
getWH();
772
else
773
jQuery.swap( elem, props, getWH );
774
775
return Math.max(0, Math.round(val));
776
}
777
778
return jQuery.curCSS( elem, name, force );
779
},
780
781
curCSS: function( elem, name, force ) {
782
var ret, style = elem.style;
783
784
// We need to handle opacity special in IE
785
if ( name == "opacity" && !jQuery.support.opacity ) {
786
ret = jQuery.attr( style, "opacity" );
787
788
return ret == "" ?
789
"1" :
790
ret;
791
}
792
793
// Make sure we're using the right name for getting the float value
794
if ( name.match( /float/i ) )
795
name = styleFloat;
796
797
if ( !force && style && style[ name ] )
798
ret = style[ name ];
799
800
else if ( defaultView.getComputedStyle ) {
801
802
// Only "float" is needed here
803
if ( name.match( /float/i ) )
804
name = "float";
805
806
name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
807
808
var computedStyle = defaultView.getComputedStyle( elem, null );
809
810
if ( computedStyle )
811
ret = computedStyle.getPropertyValue( name );
812
813
// We should always get a number back from opacity
814
if ( name == "opacity" && ret == "" )
815
ret = "1";
816
817
} else if ( elem.currentStyle ) {
818
var camelCase = name.replace(/\-(\w)/g, function(all, letter){
819
return letter.toUpperCase();
820
});
821
822
ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
823
824
// From the awesome hack by Dean Edwards
825
// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
826
827
// If we're not dealing with a regular pixel number
828
// but a number that has a weird ending, we need to convert it to pixels
829
if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
830
// Remember the original values
831
var left = style.left, rsLeft = elem.runtimeStyle.left;
832
833
// Put in the new values to get a computed value out
834
elem.runtimeStyle.left = elem.currentStyle.left;
835
style.left = ret || 0;
836
ret = style.pixelLeft + "px";
837
838
// Revert the changed values
839
style.left = left;
840
elem.runtimeStyle.left = rsLeft;
841
}
842
}
843
844
return ret;
845
},
846
847
clean: function( elems, context, fragment ) {
848
context = context || document;
849
850
// !context.createElement fails in IE with an error but returns typeof 'object'
851
if ( typeof context.createElement === "undefined" )
852
context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
853
854
// If a single string is passed in and it's a single tag
855
// just do a createElement and skip the rest
856
if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) {
857
var match = /^<(\w+)\s*\/?>$/.exec(elems[0]);
858
if ( match )
859
return [ context.createElement( match[1] ) ];
860
}
861
862
var ret = [], scripts = [], div = context.createElement("div");
863
864
jQuery.each(elems, function(i, elem){
865
if ( typeof elem === "number" )
866
elem += '';
867
868
if ( !elem )
869
return;
870
871
// Convert html string into DOM nodes
872
if ( typeof elem === "string" ) {
873
// Fix "XHTML"-style tags in all browsers
874
elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
875
return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
876
all :
877
front + "></" + tag + ">";
878
});
879
880
// Trim whitespace, otherwise indexOf won't work as expected
881
var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase();
882
883
var wrap =
884
// option or optgroup
885
!tags.indexOf("<opt") &&
886
[ 1, "<select multiple='multiple'>", "</select>" ] ||
887
888
!tags.indexOf("<leg") &&
889
[ 1, "<fieldset>", "</fieldset>" ] ||
890
891
tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
892
[ 1, "<table>", "</table>" ] ||
893
894
!tags.indexOf("<tr") &&
895
[ 2, "<table><tbody>", "</tbody></table>" ] ||
896
897
// <thead> matched above
898
(!tags.indexOf("<td") || !tags.indexOf("<th")) &&
899
[ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
900
901
!tags.indexOf("<col") &&
902
[ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
903
904
// IE can't serialize <link> and <script> tags normally
905
!jQuery.support.htmlSerialize &&
906
[ 1, "div<div>", "</div>" ] ||
907
908
[ 0, "", "" ];
909
910
// Go to html and back, then peel off extra wrappers
911
div.innerHTML = wrap[1] + elem + wrap[2];
912
913
// Move to the right depth
914
while ( wrap[0]-- )
915
div = div.lastChild;
916
917
// Remove IE's autoinserted <tbody> from table fragments
918
if ( !jQuery.support.tbody ) {
919
920
// String was a <table>, *may* have spurious <tbody>
921
var hasBody = /<tbody/i.test(elem),
922
tbody = !tags.indexOf("<table") && !hasBody ?
923
div.firstChild && div.firstChild.childNodes :
924
925
// String was a bare <thead> or <tfoot>
926
wrap[1] == "<table>" && !hasBody ?
927
div.childNodes :
928
[];
929
930
for ( var j = tbody.length - 1; j >= 0 ; --j )
931
if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
932
tbody[ j ].parentNode.removeChild( tbody[ j ] );
933
934
}
935
936
// IE completely kills leading whitespace when innerHTML is used
937
if ( !jQuery.support.leadingWhitespace && /^\s/.test( elem ) )
938
div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
939
940
elem = jQuery.makeArray( div.childNodes );
941
}
942
943
if ( elem.nodeType )
944
ret.push( elem );
945
else
946
ret = jQuery.merge( ret, elem );
947
948
});
949
950
if ( fragment ) {
951
for ( var i = 0; ret[i]; i++ ) {
952
if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
953
scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
954
} else {
955
if ( ret[i].nodeType === 1 )
956
ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
957
fragment.appendChild( ret[i] );
958
}
959
}
960
961
return scripts;
962
}
963
964
return ret;
965
},
966
967
attr: function( elem, name, value ) {
968
// don't set attributes on text and comment nodes
969
if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
970
return undefined;
971
972
var notxml = !jQuery.isXMLDoc( elem ),
973
// Whether we are setting (or getting)
974
set = value !== undefined;
975
976
// Try to normalize/fix the name
977
name = notxml && jQuery.props[ name ] || name;
978
979
// Only do all the following if this is a node (faster for style)
980
// IE elem.getAttribute passes even for style
981
if ( elem.tagName ) {
982
983
// These attributes require special treatment
984
var special = /href|src|style/.test( name );
985
986
// Safari mis-reports the default selected property of a hidden option
987
// Accessing the parent's selectedIndex property fixes it
988
if ( name == "selected" && elem.parentNode )
989
elem.parentNode.selectedIndex;
990
991
// If applicable, access the attribute via the DOM 0 way
992
if ( name in elem && notxml && !special ) {
993
if ( set ){
994
// We can't allow the type property to be changed (since it causes problems in IE)
995
if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
996
throw "type property can't be changed";
997
998
elem[ name ] = value;
999
}
1000
1001
// browsers index elements by id/name on forms, give priority to attributes.
1002
if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
1003
return elem.getAttributeNode( name ).nodeValue;
1004
1005
// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
1006
// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
1007
if ( name == "tabIndex" ) {
1008
var attributeNode = elem.getAttributeNode( "tabIndex" );
1009
return attributeNode && attributeNode.specified
1010
? attributeNode.value
1011
: elem.nodeName.match(/(button|input|object|select|textarea)/i)
1012
? 0
1013
: elem.nodeName.match(/^(a|area)$/i) && elem.href
1014
? 0
1015
: undefined;
1016
}
1017
1018
return elem[ name ];
1019
}
1020
1021
if ( !jQuery.support.style && notxml && name == "style" )
1022
return jQuery.attr( elem.style, "cssText", value );
1023
1024
if ( set )
1025
// convert the value to a string (all browsers do this but IE) see #1070
1026
elem.setAttribute( name, "" + value );
1027
1028
var attr = !jQuery.support.hrefNormalized && notxml && special
1029
// Some attributes require a special call on IE
1030
? elem.getAttribute( name, 2 )
1031
: elem.getAttribute( name );
1032
1033
// Non-existent attributes return null, we normalize to undefined
1034
return attr === null ? undefined : attr;
1035
}
1036
1037
// elem is actually elem.style ... set the style
1038
1039
// IE uses filters for opacity
1040
if ( !jQuery.support.opacity && name == "opacity" ) {
1041
if ( set ) {
1042
// IE has trouble with opacity if it does not have layout
1043
// Force it by setting the zoom level
1044
elem.zoom = 1;
1045
1046
// Set the alpha filter to set the opacity
1047
elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +
1048
(parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
1049
}
1050
1051
return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
1052
(parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
1053
"";
1054
}
1055
1056
name = name.replace(/-([a-z])/ig, function(all, letter){
1057
return letter.toUpperCase();
1058
});
1059
1060
if ( set )
1061
elem[ name ] = value;
1062
1063
return elem[ name ];
1064
},
1065
1066
trim: function( text ) {
1067
return (text || "").replace( /^\s+|\s+$/g, "" );
1068
},
1069
1070
makeArray: function( array ) {
1071
var ret = [];
1072
1073
if( array != null ){
1074
var i = array.length;
1075
// The window, strings (and functions) also have 'length'
1076
if( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval )
1077
ret[0] = array;
1078
else
1079
while( i )
1080
ret[--i] = array[i];
1081
}
1082
1083
return ret;
1084
},
1085
1086
inArray: function( elem, array ) {
1087
for ( var i = 0, length = array.length; i < length; i++ )
1088
// Use === because on IE, window == document
1089
if ( array[ i ] === elem )
1090
return i;
1091
1092
return -1;
1093
},
1094
1095
merge: function( first, second ) {
1096
// We have to loop this way because IE & Opera overwrite the length
1097
// expando of getElementsByTagName
1098
var i = 0, elem, pos = first.length;
1099
// Also, we need to make sure that the correct elements are being returned
1100
// (IE returns comment nodes in a '*' query)
1101
if ( !jQuery.support.getAll ) {
1102
while ( (elem = second[ i++ ]) != null )
1103
if ( elem.nodeType != 8 )
1104
first[ pos++ ] = elem;
1105
1106
} else
1107
while ( (elem = second[ i++ ]) != null )
1108
first[ pos++ ] = elem;
1109
1110
return first;
1111
},
1112
1113
unique: function( array ) {
1114
var ret = [], done = {};
1115
1116
try {
1117
1118
for ( var i = 0, length = array.length; i < length; i++ ) {
1119
var id = jQuery.data( array[ i ] );
1120
1121
if ( !done[ id ] ) {
1122
done[ id ] = true;
1123
ret.push( array[ i ] );
1124
}
1125
}
1126
1127
} catch( e ) {
1128
ret = array;
1129
}
1130
1131
return ret;
1132
},
1133
1134
grep: function( elems, callback, inv ) {
1135
var ret = [];
1136
1137
// Go through the array, only saving the items
1138
// that pass the validator function
1139
for ( var i = 0, length = elems.length; i < length; i++ )
1140
if ( !inv != !callback( elems[ i ], i ) )
1141
ret.push( elems[ i ] );
1142
1143
return ret;
1144
},
1145
1146
map: function( elems, callback ) {
1147
var ret = [];
1148
1149
// Go through the array, translating each of the items to their
1150
// new value (or values).
1151
for ( var i = 0, length = elems.length; i < length; i++ ) {
1152
var value = callback( elems[ i ], i );
1153
1154
if ( value != null )
1155
ret[ ret.length ] = value;
1156
}
1157
1158
return ret.concat.apply( [], ret );
1159
}
1160
});
1161
1162
// Use of jQuery.browser is deprecated.
1163
// It's included for backwards compatibility and plugins,
1164
// although they should work to migrate away.
1165
1166
var userAgent = navigator.userAgent.toLowerCase();
1167
1168
// Figure out what browser is being used
1169
jQuery.browser = {
1170
version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
1171
safari: /webkit/.test( userAgent ),
1172
opera: /opera/.test( userAgent ),
1173
msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
1174
mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
1175
};
1176
1177
jQuery.each({
1178
parent: function(elem){return elem.parentNode;},
1179
parents: function(elem){return jQuery.dir(elem,"parentNode");},
1180
next: function(elem){return jQuery.nth(elem,2,"nextSibling");},
1181
prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},
1182
nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},
1183
prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},
1184
siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
1185
children: function(elem){return jQuery.sibling(elem.firstChild);},
1186
contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
1187
}, function(name, fn){
1188
jQuery.fn[ name ] = function( selector ) {
1189
var ret = jQuery.map( this, fn );
1190
1191
if ( selector && typeof selector == "string" )
1192
ret = jQuery.multiFilter( selector, ret );
1193
1194
return this.pushStack( jQuery.unique( ret ), name, selector );
1195
};
1196
});
1197
1198
jQuery.each({
1199
appendTo: "append",
1200
prependTo: "prepend",
1201
insertBefore: "before",
1202
insertAfter: "after",
1203
replaceAll: "replaceWith"
1204
}, function(name, original){
1205
jQuery.fn[ name ] = function( selector ) {
1206
var ret = [], insert = jQuery( selector );
1207
1208
for ( var i = 0, l = insert.length; i < l; i++ ) {
1209
var elems = (i > 0 ? this.clone(true) : this).get();
1210
jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
1211
ret = ret.concat( elems );
1212
}
1213
1214
return this.pushStack( ret, name, selector );
1215
};
1216
});
1217
1218
jQuery.each({
1219
removeAttr: function( name ) {
1220
jQuery.attr( this, name, "" );
1221
if (this.nodeType == 1)
1222
this.removeAttribute( name );
1223
},
1224
1225
addClass: function( classNames ) {
1226
jQuery.className.add( this, classNames );
1227
},
1228
1229
removeClass: function( classNames ) {
1230
jQuery.className.remove( this, classNames );
1231
},
1232
1233
toggleClass: function( classNames, state ) {
1234
if( typeof state !== "boolean" )
1235
state = !jQuery.className.has( this, classNames );
1236
jQuery.className[ state ? "add" : "remove" ]( this, classNames );
1237
},
1238
1239
remove: function( selector ) {
1240
if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
1241
// Prevent memory leaks
1242
jQuery( "*", this ).add([this]).each(function(){
1243
jQuery.event.remove(this);
1244
jQuery.removeData(this);
1245
});
1246
if (this.parentNode)
1247
this.parentNode.removeChild( this );
1248
}
1249
},
1250
1251
empty: function() {
1252
// Remove element nodes and prevent memory leaks
1253
jQuery(this).children().remove();
1254
1255
// Remove any remaining nodes
1256
while ( this.firstChild )
1257
this.removeChild( this.firstChild );
1258
}
1259
}, function(name, fn){
1260
jQuery.fn[ name ] = function(){
1261
return this.each( fn, arguments );
1262
};
1263
});
1264
1265
// Helper function used by the dimensions and offset modules
1266
function num(elem, prop) {
1267
return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
1268
}
1269
var expando = "jQuery" + now(), uuid = 0, windowData = {};
1270
1271
jQuery.extend({
1272
cache: {},
1273
1274
data: function( elem, name, data ) {
1275
elem = elem == window ?
1276
windowData :
1277
elem;
1278
1279
var id = elem[ expando ];
1280
1281
// Compute a unique ID for the element
1282
if ( !id )
1283
id = elem[ expando ] = ++uuid;
1284
1285
// Only generate the data cache if we're
1286
// trying to access or manipulate it
1287
if ( name && !jQuery.cache[ id ] )
1288
jQuery.cache[ id ] = {};
1289
1290
// Prevent overriding the named cache with undefined values
1291
if ( data !== undefined )
1292
jQuery.cache[ id ][ name ] = data;
1293
1294
// Return the named cache data, or the ID for the element
1295
return name ?
1296
jQuery.cache[ id ][ name ] :
1297
id;
1298
},
1299
1300
removeData: function( elem, name ) {
1301
elem = elem == window ?
1302
windowData :
1303
elem;
1304
1305
var id = elem[ expando ];
1306
1307
// If we want to remove a specific section of the element's data
1308
if ( name ) {
1309
if ( jQuery.cache[ id ] ) {
1310
// Remove the section of cache data
1311
delete jQuery.cache[ id ][ name ];
1312
1313
// If we've removed all the data, remove the element's cache
1314
name = "";
1315
1316
for ( name in jQuery.cache[ id ] )
1317
break;
1318
1319
if ( !name )
1320
jQuery.removeData( elem );
1321
}
1322
1323
// Otherwise, we want to remove all of the element's data
1324
} else {
1325
// Clean up the element expando
1326
try {
1327
delete elem[ expando ];
1328
} catch(e){
1329
// IE has trouble directly removing the expando
1330
// but it's ok with using removeAttribute
1331
if ( elem.removeAttribute )
1332
elem.removeAttribute( expando );
1333
}
1334
1335
// Completely remove the data cache
1336
delete jQuery.cache[ id ];
1337
}
1338
},
1339
queue: function( elem, type, data ) {
1340
if ( elem ){
1341
1342
type = (type || "fx") + "queue";
1343
1344
var q = jQuery.data( elem, type );
1345
1346
if ( !q || jQuery.isArray(data) )
1347
q = jQuery.data( elem, type, jQuery.makeArray(data) );
1348
else if( data )
1349
q.push( data );
1350
1351
}
1352
return q;
1353
},
1354
1355
dequeue: function( elem, type ){
1356
var queue = jQuery.queue( elem, type ),
1357
fn = queue.shift();
1358
1359
if( !type || type === "fx" )
1360
fn = queue[0];
1361
1362
if( fn !== undefined )
1363
fn.call(elem);
1364
}
1365
});
1366
1367
jQuery.fn.extend({
1368
data: function( key, value ){
1369
var parts = key.split(".");
1370
parts[1] = parts[1] ? "." + parts[1] : "";
1371
1372
if ( value === undefined ) {
1373
var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1374
1375
if ( data === undefined && this.length )
1376
data = jQuery.data( this[0], key );
1377
1378
return data === undefined && parts[1] ?
1379
this.data( parts[0] ) :
1380
data;
1381
} else
1382
return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
1383
jQuery.data( this, key, value );
1384
});
1385
},
1386
1387
removeData: function( key ){
1388
return this.each(function(){
1389
jQuery.removeData( this, key );
1390
});
1391
},
1392
queue: function(type, data){
1393
if ( typeof type !== "string" ) {
1394
data = type;
1395
type = "fx";
1396
}
1397
1398
if ( data === undefined )
1399
return jQuery.queue( this[0], type );
1400
1401
return this.each(function(){
1402
var queue = jQuery.queue( this, type, data );
1403
1404
if( type == "fx" && queue.length == 1 )
1405
queue[0].call(this);
1406
});
1407
},
1408
dequeue: function(type){
1409
return this.each(function(){
1410
jQuery.dequeue( this, type );
1411
});
1412
}
1413
});/*!
1414
* Sizzle CSS Selector Engine - v0.9.3
1415
* Copyright 2009, The Dojo Foundation
1416
* Released under the MIT, BSD, and GPL Licenses.
1417
* More information: http://sizzlejs.com/
1418
*/
1419
(function(){
1420
1421
var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,
1422
done = 0,
1423
toString = Object.prototype.toString;
1424
1425
var Sizzle = function(selector, context, results, seed) {
1426
results = results || [];
1427
context = context || document;
1428
1429
if ( context.nodeType !== 1 && context.nodeType !== 9 )
1430
return [];
1431
1432
if ( !selector || typeof selector !== "string" ) {
1433
return results;
1434
}
1435
1436
var parts = [], m, set, checkSet, check, mode, extra, prune = true;
1437
1438
// Reset the position of the chunker regexp (start from head)
1439
chunker.lastIndex = 0;
1440
1441
while ( (m = chunker.exec(selector)) !== null ) {
1442
parts.push( m[1] );
1443
1444
if ( m[2] ) {
1445
extra = RegExp.rightContext;
1446
break;
1447
}
1448
}
1449
1450
if ( parts.length > 1 && origPOS.exec( selector ) ) {
1451
if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
1452
set = posProcess( parts[0] + parts[1], context );
1453
} else {
1454
set = Expr.relative[ parts[0] ] ?
1455
[ context ] :
1456
Sizzle( parts.shift(), context );
1457
1458
while ( parts.length ) {
1459
selector = parts.shift();
1460
1461
if ( Expr.relative[ selector ] )
1462
selector += parts.shift();
1463
1464
set = posProcess( selector, set );
1465
}
1466
}
1467
} else {
1468
var ret = seed ?
1469
{ expr: parts.pop(), set: makeArray(seed) } :
1470
Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context, isXML(context) );
1471
set = Sizzle.filter( ret.expr, ret.set );
1472
1473
if ( parts.length > 0 ) {
1474
checkSet = makeArray(set);
1475
} else {
1476
prune = false;
1477
}
1478
1479
while ( parts.length ) {
1480
var cur = parts.pop(), pop = cur;
1481
1482
if ( !Expr.relative[ cur ] ) {
1483
cur = "";
1484
} else {
1485
pop = parts.pop();
1486
}
1487
1488
if ( pop == null ) {
1489
pop = context;
1490
}
1491
1492
Expr.relative[ cur ]( checkSet, pop, isXML(context) );
1493
}
1494
}
1495
1496
if ( !checkSet ) {
1497
checkSet = set;
1498
}
1499
1500
if ( !checkSet ) {
1501
throw "Syntax error, unrecognized expression: " + (cur || selector);
1502
}
1503
1504
if ( toString.call(checkSet) === "[object Array]" ) {
1505
if ( !prune ) {
1506
results.push.apply( results, checkSet );
1507
} else if ( context.nodeType === 1 ) {
1508
for ( var i = 0; checkSet[i] != null; i++ ) {
1509
if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
1510
results.push( set[i] );
1511
}
1512
}
1513
} else {
1514
for ( var i = 0; checkSet[i] != null; i++ ) {
1515
if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
1516
results.push( set[i] );
1517
}
1518
}
1519
}
1520
} else {
1521
makeArray( checkSet, results );
1522
}
1523
1524
if ( extra ) {
1525
Sizzle( extra, context, results, seed );
1526
1527
if ( sortOrder ) {
1528
hasDuplicate = false;
1529
results.sort(sortOrder);
1530
1531
if ( hasDuplicate ) {
1532
for ( var i = 1; i < results.length; i++ ) {
1533
if ( results[i] === results[i-1] ) {
1534
results.splice(i--, 1);
1535
}
1536
}
1537
}
1538
}
1539
}
1540
1541
return results;
1542
};
1543
1544
Sizzle.matches = function(expr, set){
1545
return Sizzle(expr, null, null, set);
1546
};
1547
1548
Sizzle.find = function(expr, context, isXML){
1549
var set, match;
1550
1551
if ( !expr ) {
1552
return [];
1553
}
1554
1555
for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
1556
var type = Expr.order[i], match;
1557
1558
if ( (match = Expr.match[ type ].exec( expr )) ) {
1559
var left = RegExp.leftContext;
1560
1561
if ( left.substr( left.length - 1 ) !== "\\" ) {
1562
match[1] = (match[1] || "").replace(/\\/g, "");
1563
set = Expr.find[ type ]( match, context, isXML );
1564
if ( set != null ) {
1565
expr = expr.replace( Expr.match[ type ], "" );
1566
break;
1567
}
1568
}
1569
}
1570
}
1571
1572
if ( !set ) {
1573
set = context.getElementsByTagName("*");
1574
}
1575
1576
return {set: set, expr: expr};
1577
};
1578
1579
Sizzle.filter = function(expr, set, inplace, not){
1580
var old = expr, result = [], curLoop = set, match, anyFound,
1581
isXMLFilter = set && set[0] && isXML(set[0]);
1582
1583
while ( expr && set.length ) {
1584
for ( var type in Expr.filter ) {
1585
if ( (match = Expr.match[ type ].exec( expr )) != null ) {
1586
var filter = Expr.filter[ type ], found, item;
1587
anyFound = false;
1588
1589
if ( curLoop == result ) {
1590
result = [];
1591
}
1592
1593
if ( Expr.preFilter[ type ] ) {
1594
match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
1595
1596
if ( !match ) {
1597
anyFound = found = true;
1598
} else if ( match === true ) {
1599
continue;
1600
}
1601
}
1602
1603
if ( match ) {
1604
for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
1605
if ( item ) {
1606
found = filter( item, match, i, curLoop );
1607
var pass = not ^ !!found;
1608
1609
if ( inplace && found != null ) {
1610
if ( pass ) {
1611
anyFound = true;
1612
} else {
1613
curLoop[i] = false;
1614
}
1615
} else if ( pass ) {
1616
result.push( item );
1617
anyFound = true;
1618
}
1619
}
1620
}
1621
}
1622
1623
if ( found !== undefined ) {
1624
if ( !inplace ) {
1625
curLoop = result;
1626
}
1627
1628
expr = expr.replace( Expr.match[ type ], "" );
1629
1630
if ( !anyFound ) {
1631
return [];
1632
}
1633
1634
break;
1635
}
1636
}
1637
}
1638
1639
// Improper expression
1640
if ( expr == old ) {
1641
if ( anyFound == null ) {
1642
throw "Syntax error, unrecognized expression: " + expr;
1643
} else {
1644
break;
1645
}
1646
}
1647
1648
old = expr;
1649
}
1650
1651
return curLoop;
1652
};
1653
1654
var Expr = Sizzle.selectors = {
1655
order: [ "ID", "NAME", "TAG" ],
1656
match: {
1657
ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
1658
CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
1659
NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,
1660
ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
1661
TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,
1662
CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
1663
POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
1664
PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
1665
},
1666
attrMap: {
1667
"class": "className",
1668
"for": "htmlFor"
1669
},
1670
attrHandle: {
1671
href: function(elem){
1672
return elem.getAttribute("href");
1673
}
1674
},
1675
relative: {
1676
"+": function(checkSet, part, isXML){
1677
var isPartStr = typeof part === "string",
1678
isTag = isPartStr && !/\W/.test(part),
1679
isPartStrNotTag = isPartStr && !isTag;
1680
1681
if ( isTag && !isXML ) {
1682
part = part.toUpperCase();
1683
}
1684
1685
for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
1686
if ( (elem = checkSet[i]) ) {
1687
while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
1688
1689
checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ?
1690
elem || false :
1691
elem === part;
1692
}
1693
}
1694
1695
if ( isPartStrNotTag ) {
1696
Sizzle.filter( part, checkSet, true );
1697
}
1698
},
1699
">": function(checkSet, part, isXML){
1700
var isPartStr = typeof part === "string";
1701
1702
if ( isPartStr && !/\W/.test(part) ) {
1703
part = isXML ? part : part.toUpperCase();
1704
1705
for ( var i = 0, l = checkSet.length; i < l; i++ ) {
1706
var elem = checkSet[i];
1707
if ( elem ) {
1708
var parent = elem.parentNode;
1709
checkSet[i] = parent.nodeName === part ? parent : false;
1710
}
1711
}
1712
} else {
1713
for ( var i = 0, l = checkSet.length; i < l; i++ ) {
1714
var elem = checkSet[i];
1715
if ( elem ) {
1716
checkSet[i] = isPartStr ?
1717
elem.parentNode :
1718
elem.parentNode === part;
1719
}
1720
}
1721
1722
if ( isPartStr ) {
1723
Sizzle.filter( part, checkSet, true );
1724
}
1725
}
1726
},
1727
"": function(checkSet, part, isXML){
1728
var doneName = done++, checkFn = dirCheck;
1729
1730
if ( !part.match(/\W/) ) {
1731
var nodeCheck = part = isXML ? part : part.toUpperCase();
1732
checkFn = dirNodeCheck;
1733
}
1734
1735
checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
1736
},
1737
"~": function(checkSet, part, isXML){
1738
var doneName = done++, checkFn = dirCheck;
1739
1740
if ( typeof part === "string" && !part.match(/\W/) ) {
1741
var nodeCheck = part = isXML ? part : part.toUpperCase();
1742
checkFn = dirNodeCheck;
1743
}
1744
1745
checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
1746
}
1747
},
1748
find: {
1749
ID: function(match, context, isXML){
1750
if ( typeof context.getElementById !== "undefined" && !isXML ) {
1751
var m = context.getElementById(match[1]);
1752
return m ? [m] : [];
1753
}
1754
},
1755
NAME: function(match, context, isXML){
1756
if ( typeof context.getElementsByName !== "undefined" ) {
1757
var ret = [], results = context.getElementsByName(match[1]);
1758
1759
for ( var i = 0, l = results.length; i < l; i++ ) {
1760
if ( results[i].getAttribute("name") === match[1] ) {
1761
ret.push( results[i] );
1762
}
1763
}
1764
1765
return ret.length === 0 ? null : ret;
1766
}
1767
},
1768
TAG: function(match, context){
1769
return context.getElementsByTagName(match[1]);
1770
}
1771
},
1772
preFilter: {
1773
CLASS: function(match, curLoop, inplace, result, not, isXML){
1774
match = " " + match[1].replace(/\\/g, "") + " ";
1775
1776
if ( isXML ) {
1777
return match;
1778
}
1779
1780
for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
1781
if ( elem ) {
1782
if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) {
1783
if ( !inplace )
1784
result.push( elem );
1785
} else if ( inplace ) {
1786
curLoop[i] = false;
1787
}
1788
}
1789
}
1790
1791
return false;
1792
},
1793
ID: function(match){
1794
return match[1].replace(/\\/g, "");
1795
},
1796
TAG: function(match, curLoop){
1797
for ( var i = 0; curLoop[i] === false; i++ ){}
1798
return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
1799
},
1800
CHILD: function(match){
1801
if ( match[1] == "nth" ) {
1802
// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
1803
var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
1804
match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
1805
!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
1806
1807
// calculate the numbers (first)n+(last) including if they are negative
1808
match[2] = (test[1] + (test[2] || 1)) - 0;
1809
match[3] = test[3] - 0;
1810
}
1811
1812
// TODO: Move to normal caching system
1813
match[0] = done++;
1814
1815
return match;
1816
},
1817
ATTR: function(match, curLoop, inplace, result, not, isXML){
1818
var name = match[1].replace(/\\/g, "");
1819
1820
if ( !isXML && Expr.attrMap[name] ) {
1821
match[1] = Expr.attrMap[name];
1822
}
1823
1824
if ( match[2] === "~=" ) {
1825
match[4] = " " + match[4] + " ";
1826
}
1827
1828
return match;
1829
},
1830
PSEUDO: function(match, curLoop, inplace, result, not){
1831
if ( match[1] === "not" ) {
1832
// If we're dealing with a complex expression, or a simple one
1833
if ( match[3].match(chunker).length > 1 || /^\w/.test(match[3]) ) {
1834
match[3] = Sizzle(match[3], null, null, curLoop);
1835
} else {
1836
var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
1837
if ( !inplace ) {
1838
result.push.apply( result, ret );
1839
}
1840
return false;
1841
}
1842
} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
1843
return true;
1844
}
1845
1846
return match;
1847
},
1848
POS: function(match){
1849
match.unshift( true );
1850
return match;
1851
}
1852
},
1853
filters: {
1854
enabled: function(elem){
1855
return elem.disabled === false && elem.type !== "hidden";
1856
},
1857
disabled: function(elem){
1858
return elem.disabled === true;
1859
},
1860
checked: function(elem){
1861
return elem.checked === true;
1862
},
1863
selected: function(elem){
1864
// Accessing this property makes selected-by-default
1865
// options in Safari work properly
1866
elem.parentNode.selectedIndex;
1867
return elem.selected === true;
1868
},
1869
parent: function(elem){
1870
return !!elem.firstChild;
1871
},
1872
empty: function(elem){
1873
return !elem.firstChild;
1874
},
1875
has: function(elem, i, match){
1876
return !!Sizzle( match[3], elem ).length;
1877
},
1878
header: function(elem){
1879
return /h\d/i.test( elem.nodeName );
1880
},
1881
text: function(elem){
1882
return "text" === elem.type;
1883
},
1884
radio: function(elem){
1885
return "radio" === elem.type;
1886
},
1887
checkbox: function(elem){
1888
return "checkbox" === elem.type;
1889
},
1890
file: function(elem){
1891
return "file" === elem.type;
1892
},
1893
password: function(elem){
1894
return "password" === elem.type;
1895
},
1896
submit: function(elem){
1897
return "submit" === elem.type;
1898
},
1899
image: function(elem){
1900
return "image" === elem.type;
1901
},
1902
reset: function(elem){
1903
return "reset" === elem.type;
1904
},
1905
button: function(elem){
1906
return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
1907
},
1908
input: function(elem){
1909
return /input|select|textarea|button/i.test(elem.nodeName);
1910
}
1911
},
1912
setFilters: {
1913
first: function(elem, i){
1914
return i === 0;
1915
},
1916
last: function(elem, i, match, array){
1917
return i === array.length - 1;
1918
},
1919
even: function(elem, i){
1920
return i % 2 === 0;
1921
},
1922
odd: function(elem, i){
1923
return i % 2 === 1;
1924
},
1925
lt: function(elem, i, match){
1926
return i < match[3] - 0;
1927
},
1928
gt: function(elem, i, match){
1929
return i > match[3] - 0;
1930
},
1931
nth: function(elem, i, match){
1932
return match[3] - 0 == i;
1933
},
1934
eq: function(elem, i, match){
1935
return match[3] - 0 == i;
1936
}
1937
},
1938
filter: {
1939
PSEUDO: function(elem, match, i, array){
1940
var name = match[1], filter = Expr.filters[ name ];
1941
1942
if ( filter ) {
1943
return filter( elem, i, match, array );
1944
} else if ( name === "contains" ) {
1945
return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
1946
} else if ( name === "not" ) {
1947
var not = match[3];
1948
1949
for ( var i = 0, l = not.length; i < l; i++ ) {
1950
if ( not[i] === elem ) {
1951
return false;
1952
}
1953
}
1954
1955
return true;
1956
}
1957
},
1958
CHILD: function(elem, match){
1959
var type = match[1], node = elem;
1960
switch (type) {
1961
case 'only':
1962
case 'first':
1963
while (node = node.previousSibling) {
1964
if ( node.nodeType === 1 ) return false;
1965
}
1966
if ( type == 'first') return true;
1967
node = elem;
1968
case 'last':
1969
while (node = node.nextSibling) {
1970
if ( node.nodeType === 1 ) return false;
1971
}
1972
return true;
1973
case 'nth':
1974
var first = match[2], last = match[3];
1975
1976
if ( first == 1 && last == 0 ) {
1977
return true;
1978
}
1979
1980
var doneName = match[0],
1981
parent = elem.parentNode;
1982
1983
if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
1984
var count = 0;
1985
for ( node = parent.firstChild; node; node = node.nextSibling ) {
1986
if ( node.nodeType === 1 ) {
1987
node.nodeIndex = ++count;
1988
}
1989
}
1990
parent.sizcache = doneName;
1991
}
1992
1993
var diff = elem.nodeIndex - last;
1994
if ( first == 0 ) {
1995
return diff == 0;
1996
} else {
1997
return ( diff % first == 0 && diff / first >= 0 );
1998
}
1999
}
2000
},
2001
ID: function(elem, match){
2002
return elem.nodeType === 1 && elem.getAttribute("id") === match;
2003
},
2004
TAG: function(elem, match){
2005
return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
2006
},
2007
CLASS: function(elem, match){
2008
return (" " + (elem.className || elem.getAttribute("class")) + " ")
2009
.indexOf( match ) > -1;
2010
},
2011
ATTR: function(elem, match){
2012
var name = match[1],
2013
result = Expr.attrHandle[ name ] ?
2014
Expr.attrHandle[ name ]( elem ) :
2015
elem[ name ] != null ?
2016
elem[ name ] :
2017
elem.getAttribute( name ),
2018
value = result + "",
2019
type = match[2],
2020
check = match[4];
2021
2022
return result == null ?
2023
type === "!=" :
2024
type === "=" ?
2025
value === check :
2026
type === "*=" ?
2027
value.indexOf(check) >= 0 :
2028
type === "~=" ?
2029
(" " + value + " ").indexOf(check) >= 0 :
2030
!check ?
2031
value && result !== false :
2032
type === "!=" ?
2033
value != check :
2034
type === "^=" ?
2035
value.indexOf(check) === 0 :
2036
type === "$=" ?
2037
value.substr(value.length - check.length) === check :
2038
type === "|=" ?
2039
value === check || value.substr(0, check.length + 1) === check + "-" :
2040
false;
2041
},
2042
POS: function(elem, match, i, array){
2043
var name = match[2], filter = Expr.setFilters[ name ];
2044
2045
if ( filter ) {
2046
return filter( elem, i, match, array );
2047
}
2048
}
2049
}
2050
};
2051
2052
var origPOS = Expr.match.POS;
2053
2054
for ( var type in Expr.match ) {
2055
Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
2056
}
2057
2058
var makeArray = function(array, results) {
2059
array = Array.prototype.slice.call( array );
2060
2061
if ( results ) {
2062
results.push.apply( results, array );
2063
return results;
2064
}
2065
2066
return array;
2067
};
2068
2069
// Perform a simple check to determine if the browser is capable of
2070
// converting a NodeList to an array using builtin methods.
2071
try {
2072
Array.prototype.slice.call( document.documentElement.childNodes );
2073
2074
// Provide a fallback method if it does not work
2075
} catch(e){
2076
makeArray = function(array, results) {
2077
var ret = results || [];
2078
2079
if ( toString.call(array) === "[object Array]" ) {
2080
Array.prototype.push.apply( ret, array );
2081
} else {
2082
if ( typeof array.length === "number" ) {
2083
for ( var i = 0, l = array.length; i < l; i++ ) {
2084
ret.push( array[i] );
2085
}
2086
} else {
2087
for ( var i = 0; array[i]; i++ ) {
2088
ret.push( array[i] );
2089
}
2090
}
2091
}
2092
2093
return ret;
2094
};
2095
}
2096
2097
var sortOrder;
2098
2099
if ( document.documentElement.compareDocumentPosition ) {
2100
sortOrder = function( a, b ) {
2101
var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
2102
if ( ret === 0 ) {
2103
hasDuplicate = true;
2104
}
2105
return ret;
2106
};
2107
} else if ( "sourceIndex" in document.documentElement ) {
2108
sortOrder = function( a, b ) {
2109
var ret = a.sourceIndex - b.sourceIndex;
2110
if ( ret === 0 ) {
2111
hasDuplicate = true;
2112
}
2113
return ret;
2114
};
2115
} else if ( document.createRange ) {
2116
sortOrder = function( a, b ) {
2117
var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
2118
aRange.selectNode(a);
2119
aRange.collapse(true);
2120
bRange.selectNode(b);
2121
bRange.collapse(true);
2122
var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
2123
if ( ret === 0 ) {
2124
hasDuplicate = true;
2125
}
2126
return ret;
2127
};
2128
}
2129
2130
// Check to see if the browser returns elements by name when
2131
// querying by getElementById (and provide a workaround)
2132
(function(){
2133
// We're going to inject a fake input element with a specified name
2134
var form = document.createElement("form"),
2135
id = "script" + (new Date).getTime();
2136
form.innerHTML = "<input name='" + id + "'/>";
2137
2138
// Inject it into the root element, check its status, and remove it quickly
2139
var root = document.documentElement;
2140
root.insertBefore( form, root.firstChild );
2141
2142
// The workaround has to do additional checks after a getElementById
2143
// Which slows things down for other browsers (hence the branching)
2144
if ( !!document.getElementById( id ) ) {
2145
Expr.find.ID = function(match, context, isXML){
2146
if ( typeof context.getElementById !== "undefined" && !isXML ) {
2147
var m = context.getElementById(match[1]);
2148
return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
2149
}
2150
};
2151
2152
Expr.filter.ID = function(elem, match){
2153
var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
2154
return elem.nodeType === 1 && node && node.nodeValue === match;
2155
};
2156
}
2157
2158
root.removeChild( form );
2159
})();
2160
2161
(function(){
2162
// Check to see if the browser returns only elements
2163
// when doing getElementsByTagName("*")
2164
2165
// Create a fake element
2166
var div = document.createElement("div");
2167
div.appendChild( document.createComment("") );
2168
2169
// Make sure no comments are found
2170
if ( div.getElementsByTagName("*").length > 0 ) {
2171
Expr.find.TAG = function(match, context){
2172
var results = context.getElementsByTagName(match[1]);
2173
2174
// Filter out possible comments
2175
if ( match[1] === "*" ) {
2176
var tmp = [];
2177
2178
for ( var i = 0; results[i]; i++ ) {
2179
if ( results[i].nodeType === 1 ) {
2180
tmp.push( results[i] );
2181
}
2182
}
2183
2184
results = tmp;
2185
}
2186
2187
return results;
2188
};
2189
}
2190
2191
// Check to see if an attribute returns normalized href attributes
2192
div.innerHTML = "<a href='#'></a>";
2193
if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
2194
div.firstChild.getAttribute("href") !== "#" ) {
2195
Expr.attrHandle.href = function(elem){
2196
return elem.getAttribute("href", 2);
2197
};
2198
}
2199
})();
2200
2201
if ( document.querySelectorAll ) (function(){
2202
var oldSizzle = Sizzle, div = document.createElement("div");
2203
div.innerHTML = "<p class='TEST'></p>";
2204
2205
// Safari can't handle uppercase or unicode characters when
2206
// in quirks mode.
2207
if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
2208
return;
2209
}
2210
2211
Sizzle = function(query, context, extra, seed){
2212
context = context || document;
2213
2214
// Only use querySelectorAll on non-XML documents
2215
// (ID selectors don't work in non-HTML documents)
2216
if ( !seed && context.nodeType === 9 && !isXML(context) ) {
2217
try {
2218
return makeArray( context.querySelectorAll(query), extra );
2219
} catch(e){}
2220
}
2221
2222
return oldSizzle(query, context, extra, seed);
2223
};
2224
2225
Sizzle.find = oldSizzle.find;
2226
Sizzle.filter = oldSizzle.filter;
2227
Sizzle.selectors = oldSizzle.selectors;
2228
Sizzle.matches = oldSizzle.matches;
2229
})();
2230
2231
if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){
2232
var div = document.createElement("div");
2233
div.innerHTML = "<div class='test e'></div><div class='test'></div>";
2234
2235
// Opera can't find a second classname (in 9.6)
2236
if ( div.getElementsByClassName("e").length === 0 )
2237
return;
2238
2239
// Safari caches class attributes, doesn't catch changes (in 3.2)
2240
div.lastChild.className = "e";
2241
2242
if ( div.getElementsByClassName("e").length === 1 )
2243
return;
2244
2245
Expr.order.splice(1, 0, "CLASS");
2246
Expr.find.CLASS = function(match, context, isXML) {
2247
if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
2248
return context.getElementsByClassName(match[1]);
2249
}
2250
};
2251
})();
2252
2253
function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
2254
var sibDir = dir == "previousSibling" && !isXML;
2255
for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2256
var elem = checkSet[i];
2257
if ( elem ) {
2258
if ( sibDir && elem.nodeType === 1 ){
2259
elem.sizcache = doneName;
2260
elem.sizset = i;
2261
}
2262
elem = elem[dir];
2263
var match = false;
2264
2265
while ( elem ) {
2266
if ( elem.sizcache === doneName ) {
2267
match = checkSet[elem.sizset];
2268
break;
2269
}
2270
2271
if ( elem.nodeType === 1 && !isXML ){
2272
elem.sizcache = doneName;
2273
elem.sizset = i;
2274
}
2275
2276
if ( elem.nodeName === cur ) {
2277
match = elem;
2278
break;
2279
}
2280
2281
elem = elem[dir];
2282
}
2283
2284
checkSet[i] = match;
2285
}
2286
}
2287
}
2288
2289
function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
2290
var sibDir = dir == "previousSibling" && !isXML;
2291
for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2292
var elem = checkSet[i];
2293
if ( elem ) {
2294
if ( sibDir && elem.nodeType === 1 ) {
2295
elem.sizcache = doneName;
2296
elem.sizset = i;
2297
}
2298
elem = elem[dir];
2299
var match = false;
2300
2301
while ( elem ) {
2302
if ( elem.sizcache === doneName ) {
2303
match = checkSet[elem.sizset];
2304
break;
2305
}
2306
2307
if ( elem.nodeType === 1 ) {
2308
if ( !isXML ) {
2309
elem.sizcache = doneName;
2310
elem.sizset = i;
2311
}
2312
if ( typeof cur !== "string" ) {
2313
if ( elem === cur ) {
2314
match = true;
2315
break;
2316
}
2317
2318
} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
2319
match = elem;
2320
break;
2321
}
2322
}
2323
2324
elem = elem[dir];
2325
}
2326
2327
checkSet[i] = match;
2328
}
2329
}
2330
}
2331
2332
var contains = document.compareDocumentPosition ? function(a, b){
2333
return a.compareDocumentPosition(b) & 16;
2334
} : function(a, b){
2335
return a !== b && (a.contains ? a.contains(b) : true);
2336
};
2337
2338
var isXML = function(elem){
2339
return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
2340
!!elem.ownerDocument && isXML( elem.ownerDocument );
2341
};
2342
2343
var posProcess = function(selector, context){
2344
var tmpSet = [], later = "", match,
2345
root = context.nodeType ? [context] : context;
2346
2347
// Position selectors must be done after the filter
2348
// And so must :not(positional) so we move all PSEUDOs to the end
2349
while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
2350
later += match[0];
2351
selector = selector.replace( Expr.match.PSEUDO, "" );
2352
}
2353
2354
selector = Expr.relative[selector] ? selector + "*" : selector;
2355
2356
for ( var i = 0, l = root.length; i < l; i++ ) {
2357
Sizzle( selector, root[i], tmpSet );
2358
}
2359
2360
return Sizzle.filter( later, tmpSet );
2361
};
2362
2363
// EXPOSE
2364
jQuery.find = Sizzle;
2365
jQuery.filter = Sizzle.filter;
2366
jQuery.expr = Sizzle.selectors;
2367
jQuery.expr[":"] = jQuery.expr.filters;
2368
2369
Sizzle.selectors.filters.hidden = function(elem){
2370
return elem.offsetWidth === 0 || elem.offsetHeight === 0;
2371
};
2372
2373
Sizzle.selectors.filters.visible = function(elem){
2374
return elem.offsetWidth > 0 || elem.offsetHeight > 0;
2375
};
2376
2377
Sizzle.selectors.filters.animated = function(elem){
2378
return jQuery.grep(jQuery.timers, function(fn){
2379
return elem === fn.elem;
2380
}).length;
2381
};
2382
2383
jQuery.multiFilter = function( expr, elems, not ) {
2384
if ( not ) {
2385
expr = ":not(" + expr + ")";
2386
}
2387
2388
return Sizzle.matches(expr, elems);
2389
};
2390
2391
jQuery.dir = function( elem, dir ){
2392
var matched = [], cur = elem[dir];
2393
while ( cur && cur != document ) {
2394
if ( cur.nodeType == 1 )
2395
matched.push( cur );
2396
cur = cur[dir];
2397
}
2398
return matched;
2399
};
2400
2401
jQuery.nth = function(cur, result, dir, elem){
2402
result = result || 1;
2403
var num = 0;
2404
2405
for ( ; cur; cur = cur[dir] )
2406
if ( cur.nodeType == 1 && ++num == result )
2407
break;
2408
2409
return cur;
2410
};
2411
2412
jQuery.sibling = function(n, elem){
2413
var r = [];
2414
2415
for ( ; n; n = n.nextSibling ) {
2416
if ( n.nodeType == 1 && n != elem )
2417
r.push( n );
2418
}
2419
2420
return r;
2421
};
2422
2423
return;
2424
2425
window.Sizzle = Sizzle;
2426
2427
})();
2428
/*
2429
* A number of helper functions used for managing events.
2430
* Many of the ideas behind this code originated from
2431
* Dean Edwards' addEvent library.
2432
*/
2433
jQuery.event = {
2434
2435
// Bind an event to an element
2436
// Original by Dean Edwards
2437
add: function(elem, types, handler, data) {
2438
if ( elem.nodeType == 3 || elem.nodeType == 8 )
2439
return;
2440
2441
// For whatever reason, IE has trouble passing the window object
2442
// around, causing it to be cloned in the process
2443
if ( elem.setInterval && elem != window )
2444
elem = window;
2445
2446
// Make sure that the function being executed has a unique ID
2447
if ( !handler.guid )
2448
handler.guid = this.guid++;
2449
2450
// if data is passed, bind to handler
2451
if ( data !== undefined ) {
2452
// Create temporary function pointer to original handler
2453
var fn = handler;
2454
2455
// Create unique handler function, wrapped around original handler
2456
handler = this.proxy( fn );
2457
2458
// Store data in unique handler
2459
handler.data = data;
2460
}
2461
2462
// Init the element's event structure
2463
var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
2464
handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
2465
// Handle the second event of a trigger and when
2466
// an event is called after a page has unloaded
2467
return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
2468
jQuery.event.handle.apply(arguments.callee.elem, arguments) :
2469
undefined;
2470
});
2471
// Add elem as a property of the handle function
2472
// This is to prevent a memory leak with non-native
2473
// event in IE.
2474
handle.elem = elem;
2475
2476
// Handle multiple events separated by a space
2477
// jQuery(...).bind("mouseover mouseout", fn);
2478
jQuery.each(types.split(/\s+/), function(index, type) {
2479
// Namespaced event handlers
2480
var namespaces = type.split(".");
2481
type = namespaces.shift();
2482
handler.type = namespaces.slice().sort().join(".");
2483
2484
// Get the current list of functions bound to this event
2485
var handlers = events[type];
2486
2487
if ( jQuery.event.specialAll[type] )
2488
jQuery.event.specialAll[type].setup.call(elem, data, namespaces);
2489
2490
// Init the event handler queue
2491
if (!handlers) {
2492
handlers = events[type] = {};
2493
2494
// Check for a special event handler
2495
// Only use addEventListener/attachEvent if the special
2496
// events handler returns false
2497
if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) {
2498
// Bind the global event handler to the element
2499
if (elem.addEventListener)
2500
elem.addEventListener(type, handle, false);
2501
else if (elem.attachEvent)
2502
elem.attachEvent("on" + type, handle);
2503
}
2504
}
2505
2506
// Add the function to the element's handler list
2507
handlers[handler.guid] = handler;
2508
2509
// Keep track of which events have been used, for global triggering
2510
jQuery.event.global[type] = true;
2511
});
2512
2513
// Nullify elem to prevent memory leaks in IE
2514
elem = null;
2515
},
2516
2517
guid: 1,
2518
global: {},
2519
2520
// Detach an event or set of events from an element
2521
remove: function(elem, types, handler) {
2522
// don't do events on text and comment nodes
2523
if ( elem.nodeType == 3 || elem.nodeType == 8 )
2524
return;
2525
2526
var events = jQuery.data(elem, "events"), ret, index;
2527
2528
if ( events ) {
2529
// Unbind all events for the element
2530
if ( types === undefined || (typeof types === "string" && types.charAt(0) == ".") )
2531
for ( var type in events )
2532
this.remove( elem, type + (types || "") );
2533
else {
2534
// types is actually an event object here
2535
if ( types.type ) {
2536
handler = types.handler;
2537
types = types.type;
2538
}
2539
2540
// Handle multiple events seperated by a space
2541
// jQuery(...).unbind("mouseover mouseout", fn);
2542
jQuery.each(types.split(/\s+/), function(index, type){
2543
// Namespaced event handlers
2544
var namespaces = type.split(".");
2545
type = namespaces.shift();
2546
var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
2547
2548
if ( events[type] ) {
2549
// remove the given handler for the given type
2550
if ( handler )
2551
delete events[type][handler.guid];
2552
2553
// remove all handlers for the given type
2554
else
2555
for ( var handle in events[type] )
2556
// Handle the removal of namespaced events
2557
if ( namespace.test(events[type][handle].type) )
2558
delete events[type][handle];
2559
2560
if ( jQuery.event.specialAll[type] )
2561
jQuery.event.specialAll[type].teardown.call(elem, namespaces);
2562
2563
// remove generic event handler if no more handlers exist
2564
for ( ret in events[type] ) break;
2565
if ( !ret ) {
2566
if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem, namespaces) === false ) {
2567
if (elem.removeEventListener)
2568
elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
2569
else if (elem.detachEvent)
2570
elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
2571
}
2572
ret = null;
2573
delete events[type];
2574
}
2575
}
2576
});
2577
}
2578
2579
// Remove the expando if it's no longer used
2580
for ( ret in events ) break;
2581
if ( !ret ) {
2582
var handle = jQuery.data( elem, "handle" );
2583
if ( handle ) handle.elem = null;
2584
jQuery.removeData( elem, "events" );
2585
jQuery.removeData( elem, "handle" );
2586
}
2587
}
2588
},
2589
2590
// bubbling is internal
2591
trigger: function( event, data, elem, bubbling ) {
2592
// Event object or event type
2593
var type = event.type || event;
2594
2595
if( !bubbling ){
2596
event = typeof event === "object" ?
2597
// jQuery.Event object
2598
event[expando] ? event :
2599
// Object literal
2600
jQuery.extend( jQuery.Event(type), event ) :
2601
// Just the event type (string)
2602
jQuery.Event(type);
2603
2604
if ( type.indexOf("!") >= 0 ) {
2605
event.type = type = type.slice(0, -1);
2606
event.exclusive = true;
2607
}
2608
2609
// Handle a global trigger
2610
if ( !elem ) {
2611
// Don't bubble custom events when global (to avoid too much overhead)
2612
event.stopPropagation();
2613
// Only trigger if we've ever bound an event for it
2614
if ( this.global[type] )
2615
jQuery.each( jQuery.cache, function(){
2616
if ( this.events && this.events[type] )
2617
jQuery.event.trigger( event, data, this.handle.elem );
2618
});
2619
}
2620
2621
// Handle triggering a single element
2622
2623
// don't do events on text and comment nodes
2624
if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 )
2625
return undefined;
2626
2627
// Clean up in case it is reused
2628
event.result = undefined;
2629
event.target = elem;
2630
2631
// Clone the incoming data, if any
2632
data = jQuery.makeArray(data);
2633
data.unshift( event );
2634
}
2635
2636
event.currentTarget = elem;
2637
2638
// Trigger the event, it is assumed that "handle" is a function
2639
var handle = jQuery.data(elem, "handle");
2640
if ( handle )
2641
handle.apply( elem, data );
2642
2643
// Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
2644
if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
2645
event.result = false;
2646
2647
// Trigger the native events (except for clicks on links)
2648
if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
2649
this.triggered = true;
2650
try {
2651
elem[ type ]();
2652
// prevent IE from throwing an error for some hidden elements
2653
} catch (e) {}
2654
}
2655
2656
this.triggered = false;
2657
2658
if ( !event.isPropagationStopped() ) {
2659
var parent = elem.parentNode || elem.ownerDocument;
2660
if ( parent )
2661
jQuery.event.trigger(event, data, parent, true);
2662
}
2663
},
2664
2665
handle: function(event) {
2666
// returned undefined or false
2667
var all, handlers;
2668
2669
event = arguments[0] = jQuery.event.fix( event || window.event );
2670
event.currentTarget = this;
2671
2672
// Namespaced event handlers
2673
var namespaces = event.type.split(".");
2674
event.type = namespaces.shift();
2675
2676
// Cache this now, all = true means, any handler
2677
all = !namespaces.length && !event.exclusive;
2678
2679
var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
2680
2681
handlers = ( jQuery.data(this, "events") || {} )[event.type];
2682
2683
for ( var j in handlers ) {
2684
var handler = handlers[j];
2685
2686
// Filter the functions by class
2687
if ( all || namespace.test(handler.type) ) {
2688
// Pass in a reference to the handler function itself
2689
// So that we can later remove it
2690
event.handler = handler;
2691
event.data = handler.data;
2692
2693
var ret = handler.apply(this, arguments);
2694
2695
if( ret !== undefined ){
2696
event.result = ret;
2697
if ( ret === false ) {
2698
event.preventDefault();
2699
event.stopPropagation();
2700
}
2701
}
2702
2703
if( event.isImmediatePropagationStopped() )
2704
break;
2705
2706
}
2707
}
2708
},
2709
2710
props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
2711
2712
fix: function(event) {
2713
if ( event[expando] )
2714
return event;
2715
2716
// store a copy of the original event object
2717
// and "clone" to set read-only properties
2718
var originalEvent = event;
2719
event = jQuery.Event( originalEvent );
2720
2721
for ( var i = this.props.length, prop; i; ){
2722
prop = this.props[ --i ];
2723
event[ prop ] = originalEvent[ prop ];
2724
}
2725
2726
// Fix target property, if necessary
2727
if ( !event.target )
2728
event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
2729
2730
// check if target is a textnode (safari)
2731
if ( event.target.nodeType == 3 )
2732
event.target = event.target.parentNode;
2733
2734
// Add relatedTarget, if necessary
2735
if ( !event.relatedTarget && event.fromElement )
2736
event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
2737
2738
// Calculate pageX/Y if missing and clientX/Y available
2739
if ( event.pageX == null && event.clientX != null ) {
2740
var doc = document.documentElement, body = document.body;
2741
event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
2742
event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
2743
}
2744
2745
// Add which for key events
2746
if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
2747
event.which = event.charCode || event.keyCode;
2748
2749
// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
2750
if ( !event.metaKey && event.ctrlKey )
2751
event.metaKey = event.ctrlKey;
2752
2753
// Add which for click: 1 == left; 2 == middle; 3 == right
2754
// Note: button is not normalized, so don't use it
2755
if ( !event.which && event.button )
2756
event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
2757
2758
return event;
2759
},
2760
2761
proxy: function( fn, proxy ){
2762
proxy = proxy || function(){ return fn.apply(this, arguments); };
2763
// Set the guid of unique handler to the same of original handler, so it can be removed
2764
proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
2765
// So proxy can be declared as an argument
2766
return proxy;
2767
},
2768
2769
special: {
2770
ready: {
2771
// Make sure the ready event is setup
2772
setup: bindReady,
2773
teardown: function() {}
2774
}
2775
},
2776
2777
specialAll: {
2778
live: {
2779
setup: function( selector, namespaces ){
2780
jQuery.event.add( this, namespaces[0], liveHandler );
2781
},
2782
teardown: function( namespaces ){
2783
if ( namespaces.length ) {
2784
var remove = 0, name = RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)");
2785
2786
jQuery.each( (jQuery.data(this, "events").live || {}), function(){
2787
if ( name.test(this.type) )
2788
remove++;
2789
});
2790
2791
if ( remove < 1 )
2792
jQuery.event.remove( this, namespaces[0], liveHandler );
2793
}
2794
}
2795
}
2796
}
2797
};
2798
2799
jQuery.Event = function( src ){
2800
// Allow instantiation without the 'new' keyword
2801
if( !this.preventDefault )
2802
return new jQuery.Event(src);
2803
2804
// Event object
2805
if( src && src.type ){
2806
this.originalEvent = src;
2807
this.type = src.type;
2808
// Event type
2809
}else
2810
this.type = src;
2811
2812
// timeStamp is buggy for some events on Firefox(#3843)
2813
// So we won't rely on the native value
2814
this.timeStamp = now();
2815
2816
// Mark it as fixed
2817
this[expando] = true;
2818
};
2819
2820
function returnFalse(){
2821
return false;
2822
}
2823
function returnTrue(){
2824
return true;
2825
}
2826
2827
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
2828
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
2829
jQuery.Event.prototype = {
2830
preventDefault: function() {
2831
this.isDefaultPrevented = returnTrue;
2832
2833
var e = this.originalEvent;
2834
if( !e )
2835
return;
2836
// if preventDefault exists run it on the original event
2837
if (e.preventDefault)
2838
e.preventDefault();
2839
// otherwise set the returnValue property of the original event to false (IE)
2840
e.returnValue = false;
2841
},
2842
stopPropagation: function() {
2843
this.isPropagationStopped = returnTrue;
2844
2845
var e = this.originalEvent;
2846
if( !e )
2847
return;
2848
// if stopPropagation exists run it on the original event
2849
if (e.stopPropagation)
2850
e.stopPropagation();
2851
// otherwise set the cancelBubble property of the original event to true (IE)
2852
e.cancelBubble = true;
2853
},
2854
stopImmediatePropagation:function(){
2855
this.isImmediatePropagationStopped = returnTrue;
2856
this.stopPropagation();
2857
},
2858
isDefaultPrevented: returnFalse,
2859
isPropagationStopped: returnFalse,
2860
isImmediatePropagationStopped: returnFalse
2861
};
2862
// Checks if an event happened on an element within another element
2863
// Used in jQuery.event.special.mouseenter and mouseleave handlers
2864
var withinElement = function(event) {
2865
// Check if mouse(over|out) are still within the same parent element
2866
var parent = event.relatedTarget;
2867
// Traverse up the tree
2868
while ( parent && parent != this )
2869
try { parent = parent.parentNode; }
2870
catch(e) { parent = this; }
2871
2872
if( parent != this ){
2873
// set the correct event type
2874
event.type = event.data;
2875
// handle event if we actually just moused on to a non sub-element
2876
jQuery.event.handle.apply( this, arguments );
2877
}
2878
};
2879
2880
jQuery.each({
2881
mouseover: 'mouseenter',
2882
mouseout: 'mouseleave'
2883
}, function( orig, fix ){
2884
jQuery.event.special[ fix ] = {
2885
setup: function(){
2886
jQuery.event.add( this, orig, withinElement, fix );
2887
},
2888
teardown: function(){
2889
jQuery.event.remove( this, orig, withinElement );
2890
}
2891
};
2892
});
2893
2894
jQuery.fn.extend({
2895
bind: function( type, data, fn ) {
2896
return type == "unload" ? this.one(type, data, fn) : this.each(function(){
2897
jQuery.event.add( this, type, fn || data, fn && data );
2898
});
2899
},
2900
2901
one: function( type, data, fn ) {
2902
var one = jQuery.event.proxy( fn || data, function(event) {
2903
jQuery(this).unbind(event, one);
2904
return (fn || data).apply( this, arguments );
2905
});
2906
return this.each(function(){
2907
jQuery.event.add( this, type, one, fn && data);
2908
});
2909
},
2910
2911
unbind: function( type, fn ) {
2912
return this.each(function(){
2913
jQuery.event.remove( this, type, fn );
2914
});
2915
},
2916
2917
trigger: function( type, data ) {
2918
return this.each(function(){
2919
jQuery.event.trigger( type, data, this );
2920
});
2921
},
2922
2923
triggerHandler: function( type, data ) {
2924
if( this[0] ){
2925
var event = jQuery.Event(type);
2926
event.preventDefault();
2927
event.stopPropagation();
2928
jQuery.event.trigger( event, data, this[0] );
2929
return event.result;
2930
}
2931
},
2932
2933
toggle: function( fn ) {
2934
// Save reference to arguments for access in closure
2935
var args = arguments, i = 1;
2936
2937
// link all the functions, so any of them can unbind this click handler
2938
while( i < args.length )
2939
jQuery.event.proxy( fn, args[i++] );
2940
2941
return this.click( jQuery.event.proxy( fn, function(event) {
2942
// Figure out which function to execute
2943
this.lastToggle = ( this.lastToggle || 0 ) % i;
2944
2945
// Make sure that clicks stop
2946
event.preventDefault();
2947
2948
// and execute the function
2949
return args[ this.lastToggle++ ].apply( this, arguments ) || false;
2950
}));
2951
},
2952
2953
hover: function(fnOver, fnOut) {
2954
return this.mouseenter(fnOver).mouseleave(fnOut);
2955
},
2956
2957
ready: function(fn) {
2958
// Attach the listeners
2959
bindReady();
2960
2961
// If the DOM is already ready
2962
if ( jQuery.isReady )
2963
// Execute the function immediately
2964
fn.call( document, jQuery );
2965
2966
// Otherwise, remember the function for later
2967
else
2968
// Add the function to the wait list
2969
jQuery.readyList.push( fn );
2970
2971
return this;
2972
},
2973
2974
live: function( type, fn ){
2975
var proxy = jQuery.event.proxy( fn );
2976
proxy.guid += this.selector + type;
2977
2978
jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy );
2979
2980
return this;
2981
},
2982
2983
die: function( type, fn ){
2984
jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null );
2985
return this;
2986
}
2987
});
2988
2989
function liveHandler( event ){
2990
var check = RegExp("(^|\\.)" + event.type + "(\\.|$)"),
2991
stop = true,
2992
elems = [];
2993
2994
jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){
2995
if ( check.test(fn.type) ) {
2996
var elem = jQuery(event.target).closest(fn.data)[0];
2997
if ( elem )
2998
elems.push({ elem: elem, fn: fn });
2999
}
3000
});
3001
3002
elems.sort(function(a,b) {
3003
return jQuery.data(a.elem, "closest") - jQuery.data(b.elem, "closest");
3004
});
3005
3006
jQuery.each(elems, function(){
3007
if ( this.fn.call(this.elem, event, this.fn.data) === false )
3008
return (stop = false);
3009
});
3010
3011
return stop;
3012
}
3013
3014
function liveConvert(type, selector){
3015
return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "|")].join(".");
3016
}
3017
3018
jQuery.extend({
3019
isReady: false,
3020
readyList: [],
3021
// Handle when the DOM is ready
3022
ready: function() {
3023
// Make sure that the DOM is not already loaded
3024
if ( !jQuery.isReady ) {
3025
// Remember that the DOM is ready
3026
jQuery.isReady = true;
3027
3028
// If there are functions bound, to execute
3029
if ( jQuery.readyList ) {
3030
// Execute all of them
3031
jQuery.each( jQuery.readyList, function(){
3032
this.call( document, jQuery );
3033
});
3034
3035
// Reset the list of functions
3036
jQuery.readyList = null;
3037
}
3038
3039
// Trigger any bound ready events
3040
jQuery(document).triggerHandler("ready");
3041
}
3042
}
3043
});
3044
3045
var readyBound = false;
3046
3047
function bindReady(){
3048
if ( readyBound ) return;
3049
readyBound = true;
3050
3051
// Mozilla, Opera and webkit nightlies currently support this event
3052
if ( document.addEventListener ) {
3053
// Use the handy event callback
3054
document.addEventListener( "DOMContentLoaded", function(){
3055
document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
3056
jQuery.ready();
3057
}, false );
3058
3059
// If IE event model is used
3060
} else if ( document.attachEvent ) {
3061
// ensure firing before onload,
3062
// maybe late but safe also for iframes
3063
document.attachEvent("onreadystatechange", function(){
3064
if ( document.readyState === "complete" ) {
3065
document.detachEvent( "onreadystatechange", arguments.callee );
3066
jQuery.ready();
3067
}
3068
});
3069
3070
// If IE and not an iframe
3071
// continually check to see if the document is ready
3072
if ( document.documentElement.doScroll && window == window.top ) (function(){
3073
if ( jQuery.isReady ) return;
3074
3075
try {
3076
// If IE is used, use the trick by Diego Perini
3077
// http://javascript.nwbox.com/IEContentLoaded/
3078
document.documentElement.doScroll("left");
3079
} catch( error ) {
3080
setTimeout( arguments.callee, 0 );
3081
return;
3082
}
3083
3084
// and execute any waiting functions
3085
jQuery.ready();
3086
})();
3087
}
3088
3089
// A fallback to window.onload, that will always work
3090
jQuery.event.add( window, "load", jQuery.ready );
3091
}
3092
3093
jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
3094
"mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," +
3095
"change,select,submit,keydown,keypress,keyup,error").split(","), function(i, name){
3096
3097
// Handle event binding
3098
jQuery.fn[name] = function(fn){
3099
return fn ? this.bind(name, fn) : this.trigger(name);
3100
};
3101
});
3102
3103
// Prevent memory leaks in IE
3104
// And prevent errors on refresh with events like mouseover in other browsers
3105
// Window isn't included so as not to unbind existing unload events
3106
jQuery( window ).bind( 'unload', function(){
3107
for ( var id in jQuery.cache )
3108
// Skip the window
3109
if ( id != 1 && jQuery.cache[ id ].handle )
3110
jQuery.event.remove( jQuery.cache[ id ].handle.elem );
3111
});
3112
(function(){
3113
3114
jQuery.support = {};
3115
3116
var root = document.documentElement,
3117
script = document.createElement("script"),
3118
div = document.createElement("div"),
3119
id = "script" + (new Date).getTime();
3120
3121
div.style.display = "none";
3122
div.innerHTML = ' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';
3123
3124
var all = div.getElementsByTagName("*"),
3125
a = div.getElementsByTagName("a")[0];
3126
3127
// Can't get basic test support
3128
if ( !all || !all.length || !a ) {
3129
return;
3130
}
3131
3132
jQuery.support = {
3133
// IE strips leading whitespace when .innerHTML is used
3134
leadingWhitespace: div.firstChild.nodeType == 3,
3135
3136
// Make sure that tbody elements aren't automatically inserted
3137
// IE will insert them into empty tables
3138
tbody: !div.getElementsByTagName("tbody").length,
3139
3140
// Make sure that you can get all elements in an <object> element
3141
// IE 7 always returns no results
3142
objectAll: !!div.getElementsByTagName("object")[0]
3143
.getElementsByTagName("*").length,
3144
3145
// Make sure that link elements get serialized correctly by innerHTML
3146
// This requires a wrapper element in IE
3147
htmlSerialize: !!div.getElementsByTagName("link").length,
3148
3149
// Get the style information from getAttribute
3150
// (IE uses .cssText insted)
3151
style: /red/.test( a.getAttribute("style") ),
3152
3153
// Make sure that URLs aren't manipulated
3154
// (IE normalizes it by default)
3155
hrefNormalized: a.getAttribute("href") === "/a",
3156
3157
// Make sure that element opacity exists
3158
// (IE uses filter instead)
3159
opacity: a.style.opacity === "0.5",
3160
3161
// Verify style float existence
3162
// (IE uses styleFloat instead of cssFloat)
3163
cssFloat: !!a.style.cssFloat,
3164
3165
// Will be defined later
3166
scriptEval: false,
3167
noCloneEvent: true,
3168
boxModel: null
3169
};
3170
3171
script.type = "text/javascript";
3172
try {
3173
script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
3174
} catch(e){}
3175
3176
root.insertBefore( script, root.firstChild );
3177
3178
// Make sure that the execution of code works by injecting a script
3179
// tag with appendChild/createTextNode
3180
// (IE doesn't support this, fails, and uses .text instead)
3181
if ( window[ id ] ) {
3182
jQuery.support.scriptEval = true;
3183
delete window[ id ];
3184
}
3185
3186
root.removeChild( script );
3187
3188
if ( div.attachEvent && div.fireEvent ) {
3189
div.attachEvent("onclick", function(){
3190
// Cloning a node shouldn't copy over any
3191
// bound event handlers (IE does this)
3192
jQuery.support.noCloneEvent = false;
3193
div.detachEvent("onclick", arguments.callee);
3194
});
3195
div.cloneNode(true).fireEvent("onclick");
3196
}
3197
3198
// Figure out if the W3C box model works as expected
3199
// document.body must exist before we can do this
3200
jQuery(function(){
3201
var div = document.createElement("div");
3202
div.style.width = div.style.paddingLeft = "1px";
3203
3204
document.body.appendChild( div );
3205
jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
3206
document.body.removeChild( div ).style.display = 'none';
3207
});
3208
})();
3209
3210
var styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat";
3211
3212
jQuery.props = {
3213
"for": "htmlFor",
3214
"class": "className",
3215
"float": styleFloat,
3216
cssFloat: styleFloat,
3217
styleFloat: styleFloat,
3218
readonly: "readOnly",
3219
maxlength: "maxLength",
3220
cellspacing: "cellSpacing",
3221
rowspan: "rowSpan",
3222
tabindex: "tabIndex"
3223
};
3224
jQuery.fn.extend({
3225
// Keep a copy of the old load
3226
_load: jQuery.fn.load,
3227
3228
load: function( url, params, callback ) {
3229
if ( typeof url !== "string" )
3230
return this._load( url );
3231
3232
var off = url.indexOf(" ");
3233
if ( off >= 0 ) {
3234
var selector = url.slice(off, url.length);
3235
url = url.slice(0, off);
3236
}
3237
3238
// Default to a GET request
3239
var type = "GET";
3240
3241
// If the second parameter was provided
3242
if ( params )
3243
// If it's a function
3244
if ( jQuery.isFunction( params ) ) {
3245
// We assume that it's the callback
3246
callback = params;
3247
params = null;
3248
3249
// Otherwise, build a param string
3250
} else if( typeof params === "object" ) {
3251
params = jQuery.param( params );
3252
type = "POST";
3253
}
3254
3255
var self = this;
3256
3257
// Request the remote document
3258
jQuery.ajax({
3259
url: url,
3260
type: type,
3261
dataType: "html",
3262
data: params,
3263
complete: function(res, status){
3264
// If successful, inject the HTML into all the matched elements
3265
if ( status == "success" || status == "notmodified" )
3266
// See if a selector was specified
3267
self.html( selector ?
3268
// Create a dummy div to hold the results
3269
jQuery("<div/>")
3270
// inject the contents of the document in, removing the scripts
3271
// to avoid any 'Permission Denied' errors in IE
3272
.append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
3273
3274
// Locate the specified elements
3275
.find(selector) :
3276
3277
// If not, just inject the full result
3278
res.responseText );
3279
3280
if( callback )
3281
self.each( callback, [res.responseText, status, res] );
3282
}
3283
});
3284
return this;
3285
},
3286
3287
serialize: function() {
3288
return jQuery.param(this.serializeArray());
3289
},
3290
serializeArray: function() {
3291
return this.map(function(){
3292
return this.elements ? jQuery.makeArray(this.elements) : this;
3293
})
3294
.filter(function(){
3295
return this.name && !this.disabled &&
3296
(this.checked || /select|textarea/i.test(this.nodeName) ||
3297
/text|hidden|password|search/i.test(this.type));
3298
})
3299
.map(function(i, elem){
3300
var val = jQuery(this).val();
3301
return val == null ? null :
3302
jQuery.isArray(val) ?
3303
jQuery.map( val, function(val, i){
3304
return {name: elem.name, value: val};
3305
}) :
3306
{name: elem.name, value: val};
3307
}).get();
3308
}
3309
});
3310
3311
// Attach a bunch of functions for handling common AJAX events
3312
jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
3313
jQuery.fn[o] = function(f){
3314
return this.bind(o, f);
3315
};
3316
});
3317
3318
var jsc = now();
3319
3320
jQuery.extend({
3321
3322
get: function( url, data, callback, type ) {
3323
// shift arguments if data argument was ommited
3324
if ( jQuery.isFunction( data ) ) {
3325
callback = data;
3326
data = null;
3327
}
3328
3329
return jQuery.ajax({
3330
type: "GET",
3331
url: url,
3332
data: data,
3333
success: callback,
3334
dataType: type
3335
});
3336
},
3337
3338
getScript: function( url, callback ) {
3339
return jQuery.get(url, null, callback, "script");
3340
},
3341
3342
getJSON: function( url, data, callback ) {
3343
return jQuery.get(url, data, callback, "json");
3344
},
3345
3346
post: function( url, data, callback, type ) {
3347
if ( jQuery.isFunction( data ) ) {
3348
callback = data;
3349
data = {};
3350
}
3351
3352
return jQuery.ajax({
3353
type: "POST",
3354
url: url,
3355
data: data,
3356
success: callback,
3357
dataType: type
3358
});
3359
},
3360
3361
ajaxSetup: function( settings ) {
3362
jQuery.extend( jQuery.ajaxSettings, settings );
3363
},
3364
3365
ajaxSettings: {
3366
url: location.href,
3367
global: true,
3368
type: "GET",
3369
contentType: "application/x-www-form-urlencoded",
3370
processData: true,
3371
async: true,
3372
/*
3373
timeout: 0,
3374
data: null,
3375
username: null,
3376
password: null,
3377
*/
3378
// Create the request object; Microsoft failed to properly
3379
// implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
3380
// This function can be overriden by calling jQuery.ajaxSetup
3381
xhr:function(){
3382
return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
3383
},
3384
accepts: {
3385
xml: "application/xml, text/xml",
3386
html: "text/html",
3387
script: "text/javascript, application/javascript",
3388
json: "application/json, text/javascript",
3389
text: "text/plain",
3390
_default: "*/*"
3391
}
3392
},
3393
3394
// Last-Modified header cache for next request
3395
lastModified: {},
3396
3397
ajax: function( s ) {
3398
// Extend the settings, but re-extend 's' so that it can be
3399
// checked again later (in the test suite, specifically)
3400
s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
3401
3402
var jsonp, jsre = /=\?(&|$)/g, status, data,
3403
type = s.type.toUpperCase();
3404
3405
// convert data if not already a string
3406
if ( s.data && s.processData && typeof s.data !== "string" )
3407
s.data = jQuery.param(s.data);
3408
3409
// Handle JSONP Parameter Callbacks
3410
if ( s.dataType == "jsonp" ) {
3411
if ( type == "GET" ) {
3412
if ( !s.url.match(jsre) )
3413
s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
3414
} else if ( !s.data || !s.data.match(jsre) )
3415
s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
3416
s.dataType = "json";
3417
}
3418
3419
// Build temporary JSONP function
3420
if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
3421
jsonp = "jsonp" + jsc++;
3422
3423
// Replace the =? sequence both in the query string and the data
3424
if ( s.data )
3425
s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
3426
s.url = s.url.replace(jsre, "=" + jsonp + "$1");
3427
3428
// We need to make sure
3429
// that a JSONP style response is executed properly
3430
s.dataType = "script";
3431
3432
// Handle JSONP-style loading
3433
window[ jsonp ] = function(tmp){
3434
data = tmp;
3435
success();
3436
complete();
3437
// Garbage collect
3438
window[ jsonp ] = undefined;
3439
try{ delete window[ jsonp ]; } catch(e){}
3440
if ( head )
3441
head.removeChild( script );
3442
};
3443
}
3444
3445
if ( s.dataType == "script" && s.cache == null )
3446
s.cache = false;
3447
3448
if ( s.cache === false && type == "GET" ) {
3449
var ts = now();
3450
// try replacing _= if it is there
3451
var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
3452
// if nothing was replaced, add timestamp to the end
3453
s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
3454
}
3455
3456
// If data is available, append data to url for get requests
3457
if ( s.data && type == "GET" ) {
3458
s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
3459
3460
// IE likes to send both get and post data, prevent this
3461
s.data = null;
3462
}
3463
3464
// Watch for a new set of requests
3465
if ( s.global && ! jQuery.active++ )
3466
jQuery.event.trigger( "ajaxStart" );
3467
3468
// Matches an absolute URL, and saves the domain
3469
var parts = /^(\w+:)?\/\/([^\/?#]+)/.exec( s.url );
3470
3471
// If we're requesting a remote document
3472
// and trying to load JSON or Script with a GET
3473
if ( s.dataType == "script" && type == "GET" && parts
3474
&& ( parts[1] && parts[1] != location.protocol || parts[2] != location.host )){
3475
3476
var head = document.getElementsByTagName("head")[0];
3477
var script = document.createElement("script");
3478
script.src = s.url;
3479
if (s.scriptCharset)
3480
script.charset = s.scriptCharset;
3481
3482
// Handle Script loading
3483
if ( !jsonp ) {
3484
var done = false;
3485
3486
// Attach handlers for all browsers
3487
script.onload = script.onreadystatechange = function(){
3488
if ( !done && (!this.readyState ||
3489
this.readyState == "loaded" || this.readyState == "complete") ) {
3490
done = true;
3491
success();
3492
complete();
3493
3494
// Handle memory leak in IE
3495
script.onload = script.onreadystatechange = null;
3496
head.removeChild( script );
3497
}
3498
};
3499
}
3500
3501
head.appendChild(script);
3502
3503
// We handle everything using the script element injection
3504
return undefined;
3505
}
3506
3507
var requestDone = false;
3508
3509
// Create the request object
3510
var xhr = s.xhr();
3511
3512
// Open the socket
3513
// Passing null username, generates a login popup on Opera (#2865)
3514
if( s.username )
3515
xhr.open(type, s.url, s.async, s.username, s.password);
3516
else
3517
xhr.open(type, s.url, s.async);
3518
3519
// Need an extra try/catch for cross domain requests in Firefox 3
3520
try {
3521
// Set the correct header, if data is being sent
3522
if ( s.data )
3523
xhr.setRequestHeader("Content-Type", s.contentType);
3524
3525
// Set the If-Modified-Since header, if ifModified mode.
3526
if ( s.ifModified )
3527
xhr.setRequestHeader("If-Modified-Since",
3528
jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
3529
3530
// Set header so the called script knows that it's an XMLHttpRequest
3531
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
3532
3533
// Set the Accepts header for the server, depending on the dataType
3534
xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
3535
s.accepts[ s.dataType ] + ", */*" :
3536
s.accepts._default );
3537
} catch(e){}
3538
3539
// Allow custom headers/mimetypes and early abort
3540
if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
3541
// Handle the global AJAX counter
3542
if ( s.global && ! --jQuery.active )
3543
jQuery.event.trigger( "ajaxStop" );
3544
// close opended socket
3545
xhr.abort();
3546
return false;
3547
}
3548
3549
if ( s.global )
3550
jQuery.event.trigger("ajaxSend", [xhr, s]);
3551
3552
// Wait for a response to come back
3553
var onreadystatechange = function(isTimeout){
3554
// The request was aborted, clear the interval and decrement jQuery.active
3555
if (xhr.readyState == 0) {
3556
if (ival) {
3557
// clear poll interval
3558
clearInterval(ival);
3559
ival = null;
3560
// Handle the global AJAX counter
3561
if ( s.global && ! --jQuery.active )
3562
jQuery.event.trigger( "ajaxStop" );
3563
}
3564
// The transfer is complete and the data is available, or the request timed out
3565
} else if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
3566
requestDone = true;
3567
3568
// clear poll interval
3569
if (ival) {
3570
clearInterval(ival);
3571
ival = null;
3572
}
3573
3574
status = isTimeout == "timeout" ? "timeout" :
3575
!jQuery.httpSuccess( xhr ) ? "error" :
3576
s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? "notmodified" :
3577
"success";
3578
3579
if ( status == "success" ) {
3580
// Watch for, and catch, XML document parse errors
3581
try {
3582
// process the data (runs the xml through httpData regardless of callback)
3583
data = jQuery.httpData( xhr, s.dataType, s );
3584
} catch(e) {
3585
status = "parsererror";
3586
}
3587
}
3588
3589
// Make sure that the request was successful or notmodified
3590
if ( status == "success" ) {
3591
// Cache Last-Modified header, if ifModified mode.
3592
var modRes;
3593
try {
3594
modRes = xhr.getResponseHeader("Last-Modified");
3595
} catch(e) {} // swallow exception thrown by FF if header is not available
3596
3597
if ( s.ifModified && modRes )
3598
jQuery.lastModified[s.url] = modRes;
3599
3600
// JSONP handles its own success callback
3601
if ( !jsonp )
3602
success();
3603
} else
3604
jQuery.handleError(s, xhr, status);
3605
3606
// Fire the complete handlers
3607
complete();
3608
3609
if ( isTimeout )
3610
xhr.abort();
3611
3612
// Stop memory leaks
3613
if ( s.async )
3614
xhr = null;
3615
}
3616
};
3617
3618
if ( s.async ) {
3619
// don't attach the handler to the request, just poll it instead
3620
var ival = setInterval(onreadystatechange, 13);
3621
3622
// Timeout checker
3623
if ( s.timeout > 0 )
3624
setTimeout(function(){
3625
// Check to see if the request is still happening
3626
if ( xhr && !requestDone )
3627
onreadystatechange( "timeout" );
3628
}, s.timeout);
3629
}
3630
3631
// Send the data
3632
try {
3633
xhr.send(s.data);
3634
} catch(e) {
3635
jQuery.handleError(s, xhr, null, e);
3636
}
3637
3638
// firefox 1.5 doesn't fire statechange for sync requests
3639
if ( !s.async )
3640
onreadystatechange();
3641
3642
function success(){
3643
// If a local callback was specified, fire it and pass it the data
3644
if ( s.success )
3645
s.success( data, status );
3646
3647
// Fire the global callback
3648
if ( s.global )
3649
jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
3650
}
3651
3652
function complete(){
3653
// Process result
3654
if ( s.complete )
3655
s.complete(xhr, status);
3656
3657
// The request was completed
3658
if ( s.global )
3659
jQuery.event.trigger( "ajaxComplete", [xhr, s] );
3660
3661
// Handle the global AJAX counter
3662
if ( s.global && ! --jQuery.active )
3663
jQuery.event.trigger( "ajaxStop" );
3664
}
3665
3666
// return XMLHttpRequest to allow aborting the request etc.
3667
return xhr;
3668
},
3669
3670
handleError: function( s, xhr, status, e ) {
3671
// If a local callback was specified, fire it
3672
if ( s.error ) s.error( xhr, status, e );
3673
3674
// Fire the global callback
3675
if ( s.global )
3676
jQuery.event.trigger( "ajaxError", [xhr, s, e] );
3677
},
3678
3679
// Counter for holding the number of active queries
3680
active: 0,
3681
3682
// Determines if an XMLHttpRequest was successful or not
3683
httpSuccess: function( xhr ) {
3684
try {
3685
// IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
3686
return !xhr.status && location.protocol == "file:" ||
3687
( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223;
3688
} catch(e){}
3689
return false;
3690
},
3691
3692
// Determines if an XMLHttpRequest returns NotModified
3693
httpNotModified: function( xhr, url ) {
3694
try {
3695
var xhrRes = xhr.getResponseHeader("Last-Modified");
3696
3697
// Firefox always returns 200. check Last-Modified date
3698
return xhr.status == 304 || xhrRes == jQuery.lastModified[url];
3699
} catch(e){}
3700
return false;
3701
},
3702
3703
httpData: function( xhr, type, s ) {
3704
var ct = xhr.getResponseHeader("content-type"),
3705
xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
3706
data = xml ? xhr.responseXML : xhr.responseText;
3707
3708
if ( xml && data.documentElement.tagName == "parsererror" )
3709
throw "parsererror";
3710
3711
// Allow a pre-filtering function to sanitize the response
3712
// s != null is checked to keep backwards compatibility
3713
if( s && s.dataFilter )
3714
data = s.dataFilter( data, type );
3715
3716
// The filter can actually parse the response
3717
if( typeof data === "string" ){
3718
3719
// If the type is "script", eval it in global context
3720
if ( type == "script" )
3721
jQuery.globalEval( data );
3722
3723
// Get the JavaScript object, if JSON is used.
3724
if ( type == "json" )
3725
data = window["eval"]("(" + data + ")");
3726
}
3727
3728
return data;
3729
},
3730
3731
// Serialize an array of form elements or a set of
3732
// key/values into a query string
3733
param: function( a ) {
3734
var s = [ ];
3735
3736
function add( key, value ){
3737
s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
3738
};
3739
3740
// If an array was passed in, assume that it is an array
3741
// of form elements
3742
if ( jQuery.isArray(a) || a.jquery )
3743
// Serialize the form elements
3744
jQuery.each( a, function(){
3745
add( this.name, this.value );
3746
});
3747
3748
// Otherwise, assume that it's an object of key/value pairs
3749
else
3750
// Serialize the key/values
3751
for ( var j in a )
3752
// If the value is an array then the key names need to be repeated
3753
if ( jQuery.isArray(a[j]) )
3754
jQuery.each( a[j], function(){
3755
add( j, this );
3756
});
3757
else
3758
add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] );
3759
3760
// Return the resulting serialization
3761
return s.join("&").replace(/%20/g, "+");
3762
}
3763
3764
});
3765
var elemdisplay = {},
3766
timerId,
3767
fxAttrs = [
3768
// height animations
3769
[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
3770
// width animations
3771
[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
3772
// opacity animations
3773
[ "opacity" ]
3774
];
3775
3776
function genFx( type, num ){
3777
var obj = {};
3778
jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function(){
3779
obj[ this ] = type;
3780
});
3781
return obj;
3782
}
3783
3784
jQuery.fn.extend({
3785
show: function(speed,callback){
3786
if ( speed ) {
3787
return this.animate( genFx("show", 3), speed, callback);
3788
} else {
3789
for ( var i = 0, l = this.length; i < l; i++ ){
3790
var old = jQuery.data(this[i], "olddisplay");
3791
3792
this[i].style.display = old || "";
3793
3794
if ( jQuery.css(this[i], "display") === "none" ) {
3795
var tagName = this[i].tagName, display;
3796
3797
if ( elemdisplay[ tagName ] ) {
3798
display = elemdisplay[ tagName ];
3799
} else {
3800
var elem = jQuery("<" + tagName + " />").appendTo("body");
3801
3802
display = elem.css("display");
3803
if ( display === "none" )
3804
display = "block";
3805
3806
elem.remove();
3807
3808
elemdisplay[ tagName ] = display;
3809
}
3810
3811
jQuery.data(this[i], "olddisplay", display);
3812
}
3813
}
3814
3815
// Set the display of the elements in a second loop
3816
// to avoid the constant reflow
3817
for ( var i = 0, l = this.length; i < l; i++ ){
3818
this[i].style.display = jQuery.data(this[i], "olddisplay") || "";
3819
}
3820
3821
return this;
3822
}
3823
},
3824
3825
hide: function(speed,callback){
3826
if ( speed ) {
3827
return this.animate( genFx("hide", 3), speed, callback);
3828
} else {
3829
for ( var i = 0, l = this.length; i < l; i++ ){
3830
var old = jQuery.data(this[i], "olddisplay");
3831
if ( !old && old !== "none" )
3832
jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
3833
}
3834
3835
// Set the display of the elements in a second loop
3836
// to avoid the constant reflow
3837
for ( var i = 0, l = this.length; i < l; i++ ){
3838
this[i].style.display = "none";
3839
}
3840
3841
return this;
3842
}
3843
},
3844
3845
// Save the old toggle function
3846
_toggle: jQuery.fn.toggle,
3847
3848
toggle: function( fn, fn2 ){
3849
var bool = typeof fn === "boolean";
3850
3851
return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
3852
this._toggle.apply( this, arguments ) :
3853
fn == null || bool ?
3854
this.each(function(){
3855
var state = bool ? fn : jQuery(this).is(":hidden");
3856
jQuery(this)[ state ? "show" : "hide" ]();
3857
}) :
3858
this.animate(genFx("toggle", 3), fn, fn2);
3859
},
3860
3861
fadeTo: function(speed,to,callback){
3862
return this.animate({opacity: to}, speed, callback);
3863
},
3864
3865
animate: function( prop, speed, easing, callback ) {
3866
var optall = jQuery.speed(speed, easing, callback);
3867
3868
return this[ optall.queue === false ? "each" : "queue" ](function(){
3869
3870
var opt = jQuery.extend({}, optall), p,
3871
hidden = this.nodeType == 1 && jQuery(this).is(":hidden"),
3872
self = this;
3873
3874
for ( p in prop ) {
3875
if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
3876
return opt.complete.call(this);
3877
3878
if ( ( p == "height" || p == "width" ) && this.style ) {
3879
// Store display property
3880
opt.display = jQuery.css(this, "display");
3881
3882
// Make sure that nothing sneaks out
3883
opt.overflow = this.style.overflow;
3884
}
3885
}
3886
3887
if ( opt.overflow != null )
3888
this.style.overflow = "hidden";
3889
3890
opt.curAnim = jQuery.extend({}, prop);
3891
3892
jQuery.each( prop, function(name, val){
3893
var e = new jQuery.fx( self, opt, name );
3894
3895
if ( /toggle|show|hide/.test(val) )
3896
e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
3897
else {
3898
var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
3899
start = e.cur(true) || 0;
3900
3901
if ( parts ) {
3902
var end = parseFloat(parts[2]),
3903
unit = parts[3] || "px";
3904
3905
// We need to compute starting value
3906
if ( unit != "px" ) {
3907
self.style[ name ] = (end || 1) + unit;
3908
start = ((end || 1) / e.cur(true)) * start;
3909
self.style[ name ] = start + unit;
3910
}
3911
3912
// If a +=/-= token was provided, we're doing a relative animation
3913
if ( parts[1] )
3914
end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
3915
3916
e.custom( start, end, unit );
3917
} else
3918
e.custom( start, val, "" );
3919
}
3920
});
3921
3922
// For JS strict compliance
3923
return true;
3924
});
3925
},
3926
3927
stop: function(clearQueue, gotoEnd){
3928
var timers = jQuery.timers;
3929
3930
if (clearQueue)
3931
this.queue([]);
3932
3933
this.each(function(){
3934
// go in reverse order so anything added to the queue during the loop is ignored
3935
for ( var i = timers.length - 1; i >= 0; i-- )
3936
if ( timers[i].elem == this ) {
3937
if (gotoEnd)
3938
// force the next step to be the last
3939
timers[i](true);
3940
timers.splice(i, 1);
3941
}
3942
});
3943
3944
// start the next in the queue if the last step wasn't forced
3945
if (!gotoEnd)
3946
this.dequeue();
3947
3948
return this;
3949
}
3950
3951
});
3952
3953
// Generate shortcuts for custom animations
3954
jQuery.each({
3955
slideDown: genFx("show", 1),
3956
slideUp: genFx("hide", 1),
3957
slideToggle: genFx("toggle", 1),
3958
fadeIn: { opacity: "show" },
3959
fadeOut: { opacity: "hide" }
3960
}, function( name, props ){
3961
jQuery.fn[ name ] = function( speed, callback ){
3962
return this.animate( props, speed, callback );
3963
};
3964
});
3965
3966
jQuery.extend({
3967
3968
speed: function(speed, easing, fn) {
3969
var opt = typeof speed === "object" ? speed : {
3970
complete: fn || !fn && easing ||
3971
jQuery.isFunction( speed ) && speed,
3972
duration: speed,
3973
easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
3974
};
3975
3976
opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
3977
jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
3978
3979
// Queueing
3980
opt.old = opt.complete;
3981
opt.complete = function(){
3982
if ( opt.queue !== false )
3983
jQuery(this).dequeue();
3984
if ( jQuery.isFunction( opt.old ) )
3985
opt.old.call( this );
3986
};
3987
3988
return opt;
3989
},
3990
3991
easing: {
3992
linear: function( p, n, firstNum, diff ) {
3993
return firstNum + diff * p;
3994
},
3995
swing: function( p, n, firstNum, diff ) {
3996
return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
3997
}
3998
},
3999
4000
timers: [],
4001
4002
fx: function( elem, options, prop ){
4003
this.options = options;
4004
this.elem = elem;
4005
this.prop = prop;
4006
4007
if ( !options.orig )
4008
options.orig = {};
4009
}
4010
4011
});
4012
4013
jQuery.fx.prototype = {
4014
4015
// Simple function for setting a style value
4016
update: function(){
4017
if ( this.options.step )
4018
this.options.step.call( this.elem, this.now, this );
4019
4020
(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
4021
4022
// Set display property to block for height/width animations
4023
if ( ( this.prop == "height" || this.prop == "width" ) && this.elem.style )
4024
this.elem.style.display = "block";
4025
},
4026
4027
// Get the current size
4028
cur: function(force){
4029
if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) )
4030
return this.elem[ this.prop ];
4031
4032
var r = parseFloat(jQuery.css(this.elem, this.prop, force));
4033
return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
4034
},
4035
4036
// Start an animation from one number to another
4037
custom: function(from, to, unit){
4038
this.startTime = now();
4039
this.start = from;
4040
this.end = to;
4041
this.unit = unit || this.unit || "px";
4042
this.now = this.start;
4043
this.pos = this.state = 0;
4044
4045
var self = this;
4046
function t(gotoEnd){
4047
return self.step(gotoEnd);
4048
}
4049
4050
t.elem = this.elem;
4051
4052
if ( t() && jQuery.timers.push(t) && !timerId ) {
4053
timerId = setInterval(function(){
4054
var timers = jQuery.timers;
4055
4056
for ( var i = 0; i < timers.length; i++ )
4057
if ( !timers[i]() )
4058
timers.splice(i--, 1);
4059
4060
if ( !timers.length ) {
4061
clearInterval( timerId );
4062
timerId = undefined;
4063
}
4064
}, 13);
4065
}
4066
},
4067
4068
// Simple 'show' function
4069
show: function(){
4070
// Remember where we started, so that we can go back to it later
4071
this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
4072
this.options.show = true;
4073
4074
// Begin the animation
4075
// Make sure that we start at a small width/height to avoid any
4076
// flash of content
4077
this.custom(this.prop == "width" || this.prop == "height" ? 1 : 0, this.cur());
4078
4079
// Start by showing the element
4080
jQuery(this.elem).show();
4081
},
4082
4083
// Simple 'hide' function
4084
hide: function(){
4085
// Remember where we started, so that we can go back to it later
4086
this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
4087
this.options.hide = true;
4088
4089
// Begin the animation
4090
this.custom(this.cur(), 0);
4091
},
4092
4093
// Each step of an animation
4094
step: function(gotoEnd){
4095
var t = now();
4096
4097
if ( gotoEnd || t >= this.options.duration + this.startTime ) {
4098
this.now = this.end;
4099
this.pos = this.state = 1;
4100
this.update();
4101
4102
this.options.curAnim[ this.prop ] = true;
4103
4104
var done = true;
4105
for ( var i in this.options.curAnim )
4106
if ( this.options.curAnim[i] !== true )
4107
done = false;
4108
4109
if ( done ) {
4110
if ( this.options.display != null ) {
4111
// Reset the overflow
4112
this.elem.style.overflow = this.options.overflow;
4113
4114
// Reset the display
4115
this.elem.style.display = this.options.display;
4116
if ( jQuery.css(this.elem, "display") == "none" )
4117
this.elem.style.display = "block";
4118
}
4119
4120
// Hide the element if the "hide" operation was done
4121
if ( this.options.hide )
4122
jQuery(this.elem).hide();
4123
4124
// Reset the properties, if the item has been hidden or shown
4125
if ( this.options.hide || this.options.show )
4126
for ( var p in this.options.curAnim )
4127
jQuery.attr(this.elem.style, p, this.options.orig[p]);
4128
4129
// Execute the complete function
4130
this.options.complete.call( this.elem );
4131
}
4132
4133
return false;
4134
} else {
4135
var n = t - this.startTime;
4136
this.state = n / this.options.duration;
4137
4138
// Perform the easing function, defaults to swing
4139
this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
4140
this.now = this.start + ((this.end - this.start) * this.pos);
4141
4142
// Perform the next step of the animation
4143
this.update();
4144
}
4145
4146
return true;
4147
}
4148
4149
};
4150
4151
jQuery.extend( jQuery.fx, {
4152
speeds:{
4153
slow: 600,
4154
fast: 200,
4155
// Default speed
4156
_default: 400
4157
},
4158
step: {
4159
4160
opacity: function(fx){
4161
jQuery.attr(fx.elem.style, "opacity", fx.now);
4162
},
4163
4164
_default: function(fx){
4165
if ( fx.elem.style && fx.elem.style[ fx.prop ] != null )
4166
fx.elem.style[ fx.prop ] = fx.now + fx.unit;
4167
else
4168
fx.elem[ fx.prop ] = fx.now;
4169
}
4170
}
4171
});
4172
if ( document.documentElement["getBoundingClientRect"] )
4173
jQuery.fn.offset = function() {
4174
if ( !this[0] ) return { top: 0, left: 0 };
4175
if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
4176
var box = this[0].getBoundingClientRect(), doc = this[0].ownerDocument, body = doc.body, docElem = doc.documentElement,
4177
clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
4178
top = box.top + (self.pageYOffset || jQuery.boxModel && docElem.scrollTop || body.scrollTop ) - clientTop,
4179
left = box.left + (self.pageXOffset || jQuery.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
4180
return { top: top, left: left };
4181
};
4182
else
4183
jQuery.fn.offset = function() {
4184
if ( !this[0] ) return { top: 0, left: 0 };
4185
if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
4186
jQuery.offset.initialized || jQuery.offset.initialize();
4187
4188
var elem = this[0], offsetParent = elem.offsetParent, prevOffsetParent = elem,
4189
doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
4190
body = doc.body, defaultView = doc.defaultView,
4191
prevComputedStyle = defaultView.getComputedStyle(elem, null),
4192
top = elem.offsetTop, left = elem.offsetLeft;
4193
4194
while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
4195
computedStyle = defaultView.getComputedStyle(elem, null);
4196
top -= elem.scrollTop, left -= elem.scrollLeft;
4197
if ( elem === offsetParent ) {
4198
top += elem.offsetTop, left += elem.offsetLeft;
4199
if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.tagName)) )
4200
top += parseInt( computedStyle.borderTopWidth, 10) || 0,
4201
left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
4202
prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
4203
}
4204
if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" )
4205
top += parseInt( computedStyle.borderTopWidth, 10) || 0,
4206
left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
4207
prevComputedStyle = computedStyle;
4208
}
4209
4210
if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" )
4211
top += body.offsetTop,
4212
left += body.offsetLeft;
4213
4214
if ( prevComputedStyle.position === "fixed" )
4215
top += Math.max(docElem.scrollTop, body.scrollTop),
4216
left += Math.max(docElem.scrollLeft, body.scrollLeft);
4217
4218
return { top: top, left: left };
4219
};
4220
4221
jQuery.offset = {
4222
initialize: function() {
4223
if ( this.initialized ) return;
4224
var body = document.body, container = document.createElement('div'), innerDiv, checkDiv, table, td, rules, prop, bodyMarginTop = body.style.marginTop,
4225
html = '<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';
4226
4227
rules = { position: 'absolute', top: 0, left: 0, margin: 0, border: 0, width: '1px', height: '1px', visibility: 'hidden' };
4228
for ( prop in rules ) container.style[prop] = rules[prop];
4229
4230
container.innerHTML = html;
4231
body.insertBefore(container, body.firstChild);
4232
innerDiv = container.firstChild, checkDiv = innerDiv.firstChild, td = innerDiv.nextSibling.firstChild.firstChild;
4233
4234
this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
4235
this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
4236
4237
innerDiv.style.overflow = 'hidden', innerDiv.style.position = 'relative';
4238
this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
4239
4240
body.style.marginTop = '1px';
4241
this.doesNotIncludeMarginInBodyOffset = (body.offsetTop === 0);
4242
body.style.marginTop = bodyMarginTop;
4243
4244
body.removeChild(container);
4245
this.initialized = true;
4246
},
4247
4248
bodyOffset: function(body) {
4249
jQuery.offset.initialized || jQuery.offset.initialize();
4250
var top = body.offsetTop, left = body.offsetLeft;
4251
if ( jQuery.offset.doesNotIncludeMarginInBodyOffset )
4252
top += parseInt( jQuery.curCSS(body, 'marginTop', true), 10 ) || 0,
4253
left += parseInt( jQuery.curCSS(body, 'marginLeft', true), 10 ) || 0;
4254
return { top: top, left: left };
4255
}
4256
};
4257
4258
4259
jQuery.fn.extend({
4260
position: function() {
4261
var left = 0, top = 0, results;
4262
4263
if ( this[0] ) {
4264
// Get *real* offsetParent
4265
var offsetParent = this.offsetParent(),
4266
4267
// Get correct offsets
4268
offset = this.offset(),
4269
parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
4270
4271
// Subtract element margins
4272
// note: when an element has margin: auto the offsetLeft and marginLeft
4273
// are the same in Safari causing offset.left to incorrectly be 0
4274
offset.top -= num( this, 'marginTop' );
4275
offset.left -= num( this, 'marginLeft' );
4276
4277
// Add offsetParent borders
4278
parentOffset.top += num( offsetParent, 'borderTopWidth' );
4279
parentOffset.left += num( offsetParent, 'borderLeftWidth' );
4280
4281
// Subtract the two offsets
4282
results = {
4283
top: offset.top - parentOffset.top,
4284
left: offset.left - parentOffset.left
4285
};
4286
}
4287
4288
return results;
4289
},
4290
4291
offsetParent: function() {
4292
var offsetParent = this[0].offsetParent || document.body;
4293
while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
4294
offsetParent = offsetParent.offsetParent;
4295
return jQuery(offsetParent);
4296
}
4297
});
4298
4299
4300
// Create scrollLeft and scrollTop methods
4301
jQuery.each( ['Left', 'Top'], function(i, name) {
4302
var method = 'scroll' + name;
4303
4304
jQuery.fn[ method ] = function(val) {
4305
if (!this[0]) return null;
4306
4307
return val !== undefined ?
4308
4309
// Set the scroll offset
4310
this.each(function() {
4311
this == window || this == document ?
4312
window.scrollTo(
4313
!i ? val : jQuery(window).scrollLeft(),
4314
i ? val : jQuery(window).scrollTop()
4315
) :
4316
this[ method ] = val;
4317
}) :
4318
4319
// Return the scroll offset
4320
this[0] == window || this[0] == document ?
4321
self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
4322
jQuery.boxModel && document.documentElement[ method ] ||
4323
document.body[ method ] :
4324
this[0][ method ];
4325
};
4326
});
4327
// Create innerHeight, innerWidth, outerHeight and outerWidth methods
4328
jQuery.each([ "Height", "Width" ], function(i, name){
4329
4330
var tl = i ? "Left" : "Top", // top or left
4331
br = i ? "Right" : "Bottom", // bottom or right
4332
lower = name.toLowerCase();
4333
4334
// innerHeight and innerWidth
4335
jQuery.fn["inner" + name] = function(){
4336
return this[0] ?
4337
jQuery.css( this[0], lower, false, "padding" ) :
4338
null;
4339
};
4340
4341
// outerHeight and outerWidth
4342
jQuery.fn["outer" + name] = function(margin) {
4343
return this[0] ?
4344
jQuery.css( this[0], lower, false, margin ? "margin" : "border" ) :
4345
null;
4346
};
4347
4348
var type = name.toLowerCase();
4349
4350
jQuery.fn[ type ] = function( size ) {
4351
// Get window width or height
4352
return this[0] == window ?
4353
// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
4354
document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] ||
4355
document.body[ "client" + name ] :
4356
4357
// Get document width or height
4358
this[0] == document ?
4359
// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
4360
Math.max(
4361
document.documentElement["client" + name],
4362
document.body["scroll" + name], document.documentElement["scroll" + name],
4363
document.body["offset" + name], document.documentElement["offset" + name]
4364
) :
4365
4366
// Get or set width or height on the element
4367
size === undefined ?
4368
// Get width or height on the element
4369
(this.length ? jQuery.css( this[0], type ) : null) :
4370
4371
// Set the width or height on the element (default to pixels if value is unitless)
4372
this.css( type, typeof size === "string" ? size : size + "px" );
4373
};
4374
4375
});
4376
})();
4377
4378