OLD | NEW |
| (Empty) |
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 'enha
nced' | |
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] ], c
ontext ); | |
58 | |
59 // HANDLE: $("#id") | |
60 else { | |
61 var elem = document.getElementById( matc
h[3] ); | |
62 | |
63 // Handle the case where IE and Opera re
turn 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 dire
ctly 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 + "(" + select
or + ")"; | |
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 stac
k | |
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 pro
perties | |
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].ownerDoc
ument || 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, fu
nction(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(th
is) ) { | |
305 // IE copies events bound via attachEvent when | |
306 // using cloneNode. Calling detachEvent on the | |
307 // clone will also remove the events from the or
ignal | |
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 store
d | |
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.createEleme
nt("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, ev
ents[ 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(select
or) : 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 i
n | |
381 if ( isSimple.test( selector ) ) | |
382 return this.pushStack( jQuery.multiFilter( selec
tor, 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 || {}).spe
cified ? 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).v
al(); | |
435 | |
436 // We don't need an arra
y 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( thi
s.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.va
lue, values ) >= 0 || | |
472 jQuery.inArray( this.text, value
s ) >= 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+|nu
ll)"/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, argume
nts ), | |
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]).create
DocumentFragment(), | |
517 scripts = jQuery.clean( args, (this[0].ownerDocu
ment || 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), thi
s.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.createElemen
t("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.innerHT
ML || "" ); | |
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 co
py) | |
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.ownerDocum
ent ); | |
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-scop
e-evaluation-and-dom.html | |
650 var head = document.getElementsByTagName("head")[0] || d
ocument.documentElement, | |
651 script = document.createElement("script"); | |
652 | |
653 script.type = "text/javascript"; | |
654 if ( jQuery.support.scriptEval ) | |
655 script.appendChild( document.createTextNode( dat
a ) ); | |
656 else | |
657 script.text = data; | |
658 | |
659 // Use insertBefore instead of appendChild to circumven
t 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.toUp
perCase(); | |
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 ], arg
s ) === 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, v
alue ) !== 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( cl
assNames, className ); | |
724 }).join(" ") : | |
725 ""; | |
726 }, | |
727 | |
728 // internal only, use hasClass("class") | |
729 has: function( elem, className ) { | |
730 return elem && jQuery.inArray( className, (elem.classNam
e || elem).toString().split(/\s+/) ) > -1; | |
731 } | |
732 }, | |
733 | |
734 // A method for quickly swapping in/out CSS properties to get correct ca
lculations | |
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: "hi
dden", 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 va
lue | |
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, le
tter){ | |
819 return letter.toUpperCase(); | |
820 }); | |
821 | |
822 ret = elem.currentStyle[ name ] || elem.currentStyle[ ca
melCase ]; | |
823 | |
824 // From the awesome hack by Dean Edwards | |
825 // http://erik.eae.net/archives/2007/07/27/18.54.15/#com
ment-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 conv
ert 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.runtimeStyl
e.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] === "str
ing" ) { | |
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, functi
on(all, front, tag){ | |
875 return tag.match(/^(abbr|br|col|img|inpu
t|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|ca
p)/) && | |
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 wrap
pers | |
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 f
ragments | |
918 if ( !jQuery.support.tbody ) { | |
919 | |
920 // String was a <table>, *may* have spur
ious <tbody> | |
921 var hasBody = /<tbody/i.test(elem), | |
922 tbody = !tags.indexOf("<table")
&& !hasBody ? | |
923 div.firstChild && div.fi
rstChild.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.re
moveChild( tbody[ j ] ); | |
933 | |
934 } | |
935 | |
936 // IE completely kills leading whitespace when i
nnerHTML 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" ) && (!re
t[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 i
t | |
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 b
e changed (since it causes problems in IE) | |
995 if ( name == "type" && jQuery.nodeName(
elem, "input" ) && elem.parentNode ) | |
996 throw "type property can't be ch
anged"; | |
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.getA
ttributeNode(name) ) | |
1003 return elem.getAttributeNode( name ).nod
eValue; | |
1004 | |
1005 // elem.tabIndex doesn't always return the corre
ct value when it hasn't been explicitly set | |
1006 // http://fluidproject.org/blog/2008/01/09/getti
ng-setting-and-removing-tabindex-values-with-javascript/ | |
1007 if ( name == "tabIndex" ) { | |
1008 var attributeNode = elem.getAttributeNod
e( "tabIndex" ); | |
1009 return attributeNode && attributeNode.sp
ecified | |
1010 ? attributeNode.value | |
1011 : elem.nodeName.match(/(button|i
nput|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 d
o this but IE) see #1070 | |
1026 elem.setAttribute( name, "" + value ); | |
1027 | |
1028 var attr = !jQuery.support.hrefNormalized && notxml && s
pecial | |
1029 // Some attributes require a special cal
l 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 ha
ve 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( /alph
a\([^)]*\)/, "" ) + | |
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.isF
unction(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 len
gth | |
1097 // expando of getElementsByTagName | |
1098 var i = 0, elem, pos = first.length; | |
1099 // Also, we need to make sure that the correct elements are bein
g 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( use
rAgent ) | |
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.firstChil
d,elem);}, | |
1185 children: function(elem){return jQuery.sibling(elem.firstChild);}, | |
1186 contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.cont
entDocument||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 ele
ment'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(da
ta) ); | |
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 || select
or); | |
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 || che
ckSet[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, c
urLoop, 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, ma
tch, 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( ite
m ); | |
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.toUpp
erCase(); | |
1732 checkFn = dirNodeCheck; | |
1733 } | |
1734 | |
1735 checkFn("parentNode", part, doneName, checkSet, nodeChec
k, 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.toUpp
erCase(); | |
1742 checkFn = dirNodeCheck; | |
1743 } | |
1744 | |
1745 checkFn("previousSibling", part, doneName, checkSet, nod
eCheck, isXML); | |
1746 } | |
1747 }, | |
1748 find: { | |
1749 ID: function(match, context, isXML){ | |
1750 if ( typeof context.getElementById !== "undefined" && !i
sXML ) { | |
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.getElementsByNam
e(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 && (" " + ele
m.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] : matc
h[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) includi
ng 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, o
r 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], curLoo
p, 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.matc
h.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.toUpperCa
se() === "BUTTON"; | |
1907 }, | |
1908 input: function(elem){ | |
1909 return /input|select|textarea|button/i.test(elem.nodeNam
e); | |
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 ) retur
n false; | |
1965 } | |
1966 if ( type == 'first') return true; | |
1967 node = elem; | |
1968 case 'last': | |
1969 while (node = node.nextSibling) { | |
1970 if ( node.nodeType === 1 ) retur
n 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 !== done
Name || !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 && di
ff / 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.no
deName === match; | |
2006 }, | |
2007 CLASS: function(elem, match){ | |
2008 return (" " + (elem.className || elem.getAttribute("clas
s")) + " ") | |
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) === ch
eck : | |
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.ownerDocu
ment.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, bRang
e); | |
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 quic
kly | |
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" && !i
sXML ) { | |
2147 var m = context.getElementById(match[1]); | |
2148 return m ? m.id === match[1] || typeof m.getAttr
ibuteNode !== "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.getElementsByCl
assName ) (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" && !i
sXML ) { | |
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 origin
al 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, "e
vents", {}), | |
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.call
ee.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, d
ata, 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, hand
le, false); | |
2501 else if (elem.attachEvent) | |
2502 elem.attachEvent("on" + type, ha
ndle); | |
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("(^|\\.)" + names
paces.slice().sort().join(".*\\.") + "(\\.|$)"); | |
2547 | |
2548 if ( events[type] ) { | |
2549 // remove the given handler for
the given type | |
2550 if ( handler ) | |
2551 delete events[type][hand
ler.guid]; | |
2552 | |
2553 // remove all handlers for the g
iven type | |
2554 else | |
2555 for ( var handle in even
ts[type] ) | |
2556 // Handle the re
moval of namespaced events | |
2557 if ( namespace.t
est(events[type][handle].type) ) | |
2558 delete e
vents[type][handle]; | |
2559 | |
2560 if ( jQuery.event.specialAll[typ
e] ) | |
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] ) brea
k; | |
2565 if ( !ret ) { | |
2566 if ( !jQuery.event.speci
al[type] || jQuery.event.special[type].teardown.call(elem, namespaces) === false
) { | |
2567 if (elem.removeE
ventListener) | |
2568 elem.rem
oveEventListener(type, jQuery.data(elem, "handle"), false); | |
2569 else if (elem.de
tachEvent) | |
2570 elem.det
achEvent("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 av
oid 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( ev
ent, 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 == "cli
ck")) && 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 ele
ments | |
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().joi
n(".*\\.") + "(\\.|$)"); | |
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 i
tself | |
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 cl
ientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler k
eyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode related
Target screenX screenY shiftKey srcElement target toElement view wheelDelta whic
h".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 #1
925 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 || b
ody && 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 f
or 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 handle
r, 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], liveHandl
er ); | |
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, names
paces[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-eleme
nt | |
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(f
unction(){ | |
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.se
lector, 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, "clo
sest"); | |
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, "|")].j
oin("."); | |
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", argume
nts.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", argu
ments.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(","), functio
n(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><para
m/></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> elemen
t | |
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 inne
rHTML | |
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 m
atched elements | |
3265 if ( status == "success" || status == "notmodifi
ed" ) | |
3266 // See if a selector was specified | |
3267 self.html( selector ? | |
3268 // Create a dummy div to hold th
e results | |
3269 jQuery("<div/>") | |
3270 // inject the contents o
f the document in, removing the scripts | |
3271 // to avoid any 'Permiss
ion 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.no
deName) || | |
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".sp
lit(","), 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 ActiveXObj
ect when it is available | |
3380 // This function can be overriden by calling jQuery.ajaxSetup | |
3381 xhr:function(){ | |
3382 return window.ActiveXObject ? new ActiveXObject("Microso
ft.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.ajaxSe
ttings, 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 = func
tion(){ | |
3488 if ( !done && (!this.readyState || | |
3489 this.readyState == "load
ed" || this.readyState == "complete") ) { | |
3490 done = true; | |
3491 success(); | |
3492 complete(); | |
3493 | |
3494 // Handle memory leak in IE | |
3495 script.onload = script.onreadyst
atechange = null; | |
3496 head.removeChild( script ); | |
3497 } | |
3498 }; | |
3499 } | |
3500 | |
3501 head.appendChild(script); | |
3502 | |
3503 // We handle everything using the script element injecti
on | |
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 (#286
5) | |
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.contentTy
pe); | |
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 J
an 1970 00:00:00 GMT" ); | |
3529 | |
3530 // Set header so the called script knows that it's an XM
LHttpRequest | |
3531 xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest
"); | |
3532 | |
3533 // Set the Accepts header for the server, depending on t
he 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 decre
ment 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, o
r 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 pa
rse errors | |
3581 try { | |
3582 // process the data (runs the xm
l through httpData regardless of callback) | |
3583 data = jQuery.httpData( xhr, s.d
ataType, 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 ifModi
fied mode. | |
3592 var modRes; | |
3593 try { | |
3594 modRes = xhr.getResponseHeader("
Last-Modified"); | |
3595 } catch(e) {} // swallow exception throw
n by FF if header is not available | |
3596 | |
3597 if ( s.ifModified && modRes ) | |
3598 jQuery.lastModified[s.url] = mod
Res; | |
3599 | |
3600 // JSONP handles its own success callbac
k | |
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 i
t 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.lastModifie
d[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) + '=' + encodeUR
IComponent(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 n
eed 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", "paddingB
ottom" ], | |
3770 // width animations | |
3771 [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingR
ight" ], | |
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", displ
ay); | |
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], "ol
ddisplay") || ""; | |
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", jQuer
y.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" ](functio
n(){ | |
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.s
tyle ) { | |
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 v
alue | |
3906 if ( unit != "px" ) { | |
3907 self.style[ name ] = (en
d || 1) + unit; | |
3908 start = ((end || 1) / e.
cur(true)) * start; | |
3909 self.style[ name ] = sta
rt + 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 du
ring 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(eas
ing) && easing | |
3974 }; | |
3975 | |
3976 opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "numb
er" ? opt.duration : | |
3977 jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._defa
ult; | |
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 + firstNu
m; | |
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.e
lem.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.e
lem.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, thi
s.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, thi
s.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.d
isplay; | |
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 hi
dden 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.offs
et.bodyOffset( this[0] ); | |
4176 var box = this[0].getBoundingClientRect(), doc = this[0].ownerD
ocument, body = doc.body, docElem = doc.documentElement, | |
4177 clientTop = docElem.clientTop || body.clientTop || 0, cl
ientLeft = 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.offs
et.bodyOffset( this[0] ); | |
4186 jQuery.offset.initialized || jQuery.offset.initialize(); | |
4187 | |
4188 var elem = this[0], offsetParent = elem.offsetParent, prevOffset
Parent = elem, | |
4189 doc = elem.ownerDocument, computedStyle, docElem = doc.d
ocumentElement, | |
4190 body = doc.body, defaultView = doc.defaultView, | |
4191 prevComputedStyle = defaultView.getComputedStyle(elem, n
ull), | |
4192 top = elem.offsetTop, left = elem.offsetLeft; | |
4193 | |
4194 while ( (elem = elem.parentNode) && elem !== body && elem !== do
cElem ) { | |
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.borderTo
pWidth, 10) || 0, | |
4201 left += parseInt( computedStyle.borderLe
ftWidth, 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" || prevComputedSt
yle.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('di
v'), innerDiv, checkDiv, table, td, rules, prop, bodyMarginTop = body.style.marg
inTop, | |
4225 html = '<div style="position:absolute;top:0;left:0;margi
n:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><tab
le 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></tab
le>'; | |
4226 | |
4227 rules = { position: 'absolute', top: 0, left: 0, margin: 0, bord
er: 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 = 'r
elative'; | |
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].tagNa
me) ? { 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 incorre
ctly 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.tagNa
me) && 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).scroll
Left(), | |
4314 i ? val : jQuery(window).scroll
Top() | |
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.documentElem
ent[ 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 documen
t.body depending on Quirks vs Standards mode | |
4354 document.compatMode == "CSS1Compat" && document.document
Element[ "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/H
eight], 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 elemen
t (default to pixels if value is unitless) | |
4372 this.css( type, typeof size === "string"
? size : size + "px" ); | |
4373 }; | |
4374 | |
4375 }); | |
4376 })(); | |
OLD | NEW |