5
|
1 /*!
|
|
2 * jQuery JavaScript Library v1.4.3
|
|
3 * http://jquery.com/
|
|
4 *
|
|
5 * Copyright 2010, John Resig
|
|
6 * Dual licensed under the MIT or GPL Version 2 licenses.
|
|
7 * http://jquery.org/license
|
|
8 *
|
|
9 * Includes Sizzle.js
|
|
10 * http://sizzlejs.com/
|
|
11 * Copyright 2010, The Dojo Foundation
|
|
12 * Released under the MIT, BSD, and GPL Licenses.
|
|
13 *
|
|
14 * Date: Thu Oct 14 23:10:06 2010 -0400
|
|
15 */
|
|
16 (function( window, undefined ) {
|
|
17
|
|
18 // Use the correct document accordingly with window argument (sandbox)
|
|
19 var document = window.document;
|
|
20 var jQuery = (function() {
|
|
21
|
|
22 // Define a local copy of jQuery
|
|
23 var jQuery = function( selector, context ) {
|
|
24 // The jQuery object is actually just the init constructor 'enhanced'
|
|
25 return new jQuery.fn.init( selector, context );
|
|
26 },
|
|
27
|
|
28 // Map over jQuery in case of overwrite
|
|
29 _jQuery = window.jQuery,
|
|
30
|
|
31 // Map over the $ in case of overwrite
|
|
32 _$ = window.$,
|
|
33
|
|
34 // A central reference to the root jQuery(document)
|
|
35 rootjQuery,
|
|
36
|
|
37 // A simple way to check for HTML strings or ID strings
|
|
38 // (both of which we optimize for)
|
|
39 quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,
|
|
40
|
|
41 // Is it a simple selector
|
|
42 isSimple = /^.[^:#\[\.,]*$/,
|
|
43
|
|
44 // Check if a string has a non-whitespace character in it
|
|
45 rnotwhite = /\S/,
|
|
46 rwhite = /\s/,
|
|
47
|
|
48 // Used for trimming whitespace
|
|
49 trimLeft = /^\s+/,
|
|
50 trimRight = /\s+$/,
|
|
51
|
|
52 // Check for non-word characters
|
|
53 rnonword = /\W/,
|
|
54
|
|
55 // Check for digits
|
|
56 rdigit = /\d/,
|
|
57
|
|
58 // Match a standalone tag
|
|
59 rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
|
|
60
|
|
61 // JSON RegExp
|
|
62 rvalidchars = /^[\],:{}\s]*$/,
|
|
63 rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
|
|
64 rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
|
|
65 rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
|
|
66
|
|
67 // Useragent RegExp
|
|
68 rwebkit = /(webkit)[ \/]([\w.]+)/,
|
|
69 ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
|
|
70 rmsie = /(msie) ([\w.]+)/,
|
|
71 rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
|
|
72
|
|
73 // Keep a UserAgent string for use with jQuery.browser
|
|
74 userAgent = navigator.userAgent,
|
|
75
|
|
76 // For matching the engine and version of the browser
|
|
77 browserMatch,
|
|
78
|
|
79 // Has the ready events already been bound?
|
|
80 readyBound = false,
|
|
81
|
|
82 // The functions to execute on DOM ready
|
|
83 readyList = [],
|
|
84
|
|
85 // The ready event handler
|
|
86 DOMContentLoaded,
|
|
87
|
|
88 // Save a reference to some core methods
|
|
89 toString = Object.prototype.toString,
|
|
90 hasOwn = Object.prototype.hasOwnProperty,
|
|
91 push = Array.prototype.push,
|
|
92 slice = Array.prototype.slice,
|
|
93 trim = String.prototype.trim,
|
|
94 indexOf = Array.prototype.indexOf,
|
|
95
|
|
96 // [[Class]] -> type pairs
|
|
97 class2type = {};
|
|
98
|
|
99 jQuery.fn = jQuery.prototype = {
|
|
100 init: function( selector, context ) {
|
|
101 var match, elem, ret, doc;
|
|
102
|
|
103 // Handle $(""), $(null), or $(undefined)
|
|
104 if ( !selector ) {
|
|
105 return this;
|
|
106 }
|
|
107
|
|
108 // Handle $(DOMElement)
|
|
109 if ( selector.nodeType ) {
|
|
110 this.context = this[0] = selector;
|
|
111 this.length = 1;
|
|
112 return this;
|
|
113 }
|
|
114
|
|
115 // The body element only exists once, optimize finding it
|
|
116 if ( selector === "body" && !context && document.body ) {
|
|
117 this.context = document;
|
|
118 this[0] = document.body;
|
|
119 this.selector = "body";
|
|
120 this.length = 1;
|
|
121 return this;
|
|
122 }
|
|
123
|
|
124 // Handle HTML strings
|
|
125 if ( typeof selector === "string" ) {
|
|
126 // Are we dealing with HTML string or an ID?
|
|
127 match = quickExpr.exec( selector );
|
|
128
|
|
129 // Verify a match, and that no context was specified for #id
|
|
130 if ( match && (match[1] || !context) ) {
|
|
131
|
|
132 // HANDLE: $(html) -> $(array)
|
|
133 if ( match[1] ) {
|
|
134 doc = (context ? context.ownerDocument || context : document);
|
|
135
|
|
136 // If a single string is passed in and it's a single tag
|
|
137 // just do a createElement and skip the rest
|
|
138 ret = rsingleTag.exec( selector );
|
|
139
|
|
140 if ( ret ) {
|
|
141 if ( jQuery.isPlainObject( context ) ) {
|
|
142 selector = [ document.createElement( ret[1] ) ];
|
|
143 jQuery.fn.attr.call( selector, context, true );
|
|
144
|
|
145 } else {
|
|
146 selector = [ doc.createElement( ret[1] ) ];
|
|
147 }
|
|
148
|
|
149 } else {
|
|
150 ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
|
|
151 selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
|
|
152 }
|
|
153
|
|
154 return jQuery.merge( this, selector );
|
|
155
|
|
156 // HANDLE: $("#id")
|
|
157 } else {
|
|
158 elem = document.getElementById( match[2] );
|
|
159
|
|
160 // Check parentNode to catch when Blackberry 4.6 returns
|
|
161 // nodes that are no longer in the document #6963
|
|
162 if ( elem && elem.parentNode ) {
|
|
163 // Handle the case where IE and Opera return items
|
|
164 // by name instead of ID
|
|
165 if ( elem.id !== match[2] ) {
|
|
166 return rootjQuery.find( selector );
|
|
167 }
|
|
168
|
|
169 // Otherwise, we inject the element directly into the jQuery object
|
|
170 this.length = 1;
|
|
171 this[0] = elem;
|
|
172 }
|
|
173
|
|
174 this.context = document;
|
|
175 this.selector = selector;
|
|
176 return this;
|
|
177 }
|
|
178
|
|
179 // HANDLE: $("TAG")
|
|
180 } else if ( !context && !rnonword.test( selector ) ) {
|
|
181 this.selector = selector;
|
|
182 this.context = document;
|
|
183 selector = document.getElementsByTagName( selector );
|
|
184 return jQuery.merge( this, selector );
|
|
185
|
|
186 // HANDLE: $(expr, $(...))
|
|
187 } else if ( !context || context.jquery ) {
|
|
188 return (context || rootjQuery).find( selector );
|
|
189
|
|
190 // HANDLE: $(expr, context)
|
|
191 // (which is just equivalent to: $(context).find(expr)
|
|
192 } else {
|
|
193 return jQuery( context ).find( selector );
|
|
194 }
|
|
195
|
|
196 // HANDLE: $(function)
|
|
197 // Shortcut for document ready
|
|
198 } else if ( jQuery.isFunction( selector ) ) {
|
|
199 return rootjQuery.ready( selector );
|
|
200 }
|
|
201
|
|
202 if (selector.selector !== undefined) {
|
|
203 this.selector = selector.selector;
|
|
204 this.context = selector.context;
|
|
205 }
|
|
206
|
|
207 return jQuery.makeArray( selector, this );
|
|
208 },
|
|
209
|
|
210 // Start with an empty selector
|
|
211 selector: "",
|
|
212
|
|
213 // The current version of jQuery being used
|
|
214 jquery: "1.4.3",
|
|
215
|
|
216 // The default length of a jQuery object is 0
|
|
217 length: 0,
|
|
218
|
|
219 // The number of elements contained in the matched element set
|
|
220 size: function() {
|
|
221 return this.length;
|
|
222 },
|
|
223
|
|
224 toArray: function() {
|
|
225 return slice.call( this, 0 );
|
|
226 },
|
|
227
|
|
228 // Get the Nth element in the matched element set OR
|
|
229 // Get the whole matched element set as a clean array
|
|
230 get: function( num ) {
|
|
231 return num == null ?
|
|
232
|
|
233 // Return a 'clean' array
|
|
234 this.toArray() :
|
|
235
|
|
236 // Return just the object
|
|
237 ( num < 0 ? this.slice(num)[ 0 ] : this[ num ] );
|
|
238 },
|
|
239
|
|
240 // Take an array of elements and push it onto the stack
|
|
241 // (returning the new matched element set)
|
|
242 pushStack: function( elems, name, selector ) {
|
|
243 // Build a new jQuery matched element set
|
|
244 var ret = jQuery();
|
|
245
|
|
246 if ( jQuery.isArray( elems ) ) {
|
|
247 push.apply( ret, elems );
|
|
248
|
|
249 } else {
|
|
250 jQuery.merge( ret, elems );
|
|
251 }
|
|
252
|
|
253 // Add the old object onto the stack (as a reference)
|
|
254 ret.prevObject = this;
|
|
255
|
|
256 ret.context = this.context;
|
|
257
|
|
258 if ( name === "find" ) {
|
|
259 ret.selector = this.selector + (this.selector ? " " : "") + selector;
|
|
260 } else if ( name ) {
|
|
261 ret.selector = this.selector + "." + name + "(" + selector + ")";
|
|
262 }
|
|
263
|
|
264 // Return the newly-formed element set
|
|
265 return ret;
|
|
266 },
|
|
267
|
|
268 // Execute a callback for every element in the matched set.
|
|
269 // (You can seed the arguments with an array of args, but this is
|
|
270 // only used internally.)
|
|
271 each: function( callback, args ) {
|
|
272 return jQuery.each( this, callback, args );
|
|
273 },
|
|
274
|
|
275 ready: function( fn ) {
|
|
276 // Attach the listeners
|
|
277 jQuery.bindReady();
|
|
278
|
|
279 // If the DOM is already ready
|
|
280 if ( jQuery.isReady ) {
|
|
281 // Execute the function immediately
|
|
282 fn.call( document, jQuery );
|
|
283
|
|
284 // Otherwise, remember the function for later
|
|
285 } else if ( readyList ) {
|
|
286 // Add the function to the wait list
|
|
287 readyList.push( fn );
|
|
288 }
|
|
289
|
|
290 return this;
|
|
291 },
|
|
292
|
|
293 eq: function( i ) {
|
|
294 return i === -1 ?
|
|
295 this.slice( i ) :
|
|
296 this.slice( i, +i + 1 );
|
|
297 },
|
|
298
|
|
299 first: function() {
|
|
300 return this.eq( 0 );
|
|
301 },
|
|
302
|
|
303 last: function() {
|
|
304 return this.eq( -1 );
|
|
305 },
|
|
306
|
|
307 slice: function() {
|
|
308 return this.pushStack( slice.apply( this, arguments ),
|
|
309 "slice", slice.call(arguments).join(",") );
|
|
310 },
|
|
311
|
|
312 map: function( callback ) {
|
|
313 return this.pushStack( jQuery.map(this, function( elem, i ) {
|
|
314 return callback.call( elem, i, elem );
|
|
315 }));
|
|
316 },
|
|
317
|
|
318 end: function() {
|
|
319 return this.prevObject || jQuery(null);
|
|
320 },
|
|
321
|
|
322 // For internal use only.
|
|
323 // Behaves like an Array's method, not like a jQuery method.
|
|
324 push: push,
|
|
325 sort: [].sort,
|
|
326 splice: [].splice
|
|
327 };
|
|
328
|
|
329 // Give the init function the jQuery prototype for later instantiation
|
|
330 jQuery.fn.init.prototype = jQuery.fn;
|
|
331
|
|
332 jQuery.extend = jQuery.fn.extend = function() {
|
|
333 // copy reference to target object
|
|
334 var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy, copyIsArray;
|
|
335
|
|
336 // Handle a deep copy situation
|
|
337 if ( typeof target === "boolean" ) {
|
|
338 deep = target;
|
|
339 target = arguments[1] || {};
|
|
340 // skip the boolean and the target
|
|
341 i = 2;
|
|
342 }
|
|
343
|
|
344 // Handle case when target is a string or something (possible in deep copy)
|
|
345 if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
|
|
346 target = {};
|
|
347 }
|
|
348
|
|
349 // extend jQuery itself if only one argument is passed
|
|
350 if ( length === i ) {
|
|
351 target = this;
|
|
352 --i;
|
|
353 }
|
|
354
|
|
355 for ( ; i < length; i++ ) {
|
|
356 // Only deal with non-null/undefined values
|
|
357 if ( (options = arguments[ i ]) != null ) {
|
|
358 // Extend the base object
|
|
359 for ( name in options ) {
|
|
360 src = target[ name ];
|
|
361 copy = options[ name ];
|
|
362
|
|
363 // Prevent never-ending loop
|
|
364 if ( target === copy ) {
|
|
365 continue;
|
|
366 }
|
|
367
|
|
368 // Recurse if we're merging plain objects or arrays
|
|
369 if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
|
|
370 if ( copyIsArray ) {
|
|
371 copyIsArray = false;
|
|
372 clone = src && jQuery.isArray(src) ? src : [];
|
|
373
|
|
374 } else {
|
|
375 clone = src && jQuery.isPlainObject(src) ? src : {};
|
|
376 }
|
|
377
|
|
378 // Never move original objects, clone them
|
|
379 target[ name ] = jQuery.extend( deep, clone, copy );
|
|
380
|
|
381 // Don't bring in undefined values
|
|
382 } else if ( copy !== undefined ) {
|
|
383 target[ name ] = copy;
|
|
384 }
|
|
385 }
|
|
386 }
|
|
387 }
|
|
388
|
|
389 // Return the modified object
|
|
390 return target;
|
|
391 };
|
|
392
|
|
393 jQuery.extend({
|
|
394 noConflict: function( deep ) {
|
|
395 window.$ = _$;
|
|
396
|
|
397 if ( deep ) {
|
|
398 window.jQuery = _jQuery;
|
|
399 }
|
|
400
|
|
401 return jQuery;
|
|
402 },
|
|
403
|
|
404 // Is the DOM ready to be used? Set to true once it occurs.
|
|
405 isReady: false,
|
|
406
|
|
407 // A counter to track how many items to wait for before
|
|
408 // the ready event fires. See #6781
|
|
409 readyWait: 1,
|
|
410
|
|
411 // Handle when the DOM is ready
|
|
412 ready: function( wait ) {
|
|
413 // A third-party is pushing the ready event forwards
|
|
414 if ( wait === true ) {
|
|
415 jQuery.readyWait--;
|
|
416 }
|
|
417
|
|
418 // Make sure that the DOM is not already loaded
|
|
419 if ( !jQuery.readyWait || (wait !== true && !jQuery.isReady) ) {
|
|
420 // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
|
|
421 if ( !document.body ) {
|
|
422 return setTimeout( jQuery.ready, 1 );
|
|
423 }
|
|
424
|
|
425 // Remember that the DOM is ready
|
|
426 jQuery.isReady = true;
|
|
427
|
|
428 // If a normal DOM Ready event fired, decrement, and wait if need be
|
|
429 if ( wait !== true && --jQuery.readyWait > 0 ) {
|
|
430 return;
|
|
431 }
|
|
432
|
|
433 // If there are functions bound, to execute
|
|
434 if ( readyList ) {
|
|
435 // Execute all of them
|
|
436 var fn, i = 0;
|
|
437 while ( (fn = readyList[ i++ ]) ) {
|
|
438 fn.call( document, jQuery );
|
|
439 }
|
|
440
|
|
441 // Reset the list of functions
|
|
442 readyList = null;
|
|
443 }
|
|
444
|
|
445 // Trigger any bound ready events
|
|
446 if ( jQuery.fn.triggerHandler ) {
|
|
447 jQuery( document ).triggerHandler( "ready" );
|
|
448 }
|
|
449 }
|
|
450 },
|
|
451
|
|
452 bindReady: function() {
|
|
453 if ( readyBound ) {
|
|
454 return;
|
|
455 }
|
|
456
|
|
457 readyBound = true;
|
|
458
|
|
459 // Catch cases where $(document).ready() is called after the
|
|
460 // browser event has already occurred.
|
|
461 if ( document.readyState === "complete" ) {
|
|
462 // Handle it asynchronously to allow scripts the opportunity to delay ready
|
|
463 return setTimeout( jQuery.ready, 1 );
|
|
464 }
|
|
465
|
|
466 // Mozilla, Opera and webkit nightlies currently support this event
|
|
467 if ( document.addEventListener ) {
|
|
468 // Use the handy event callback
|
|
469 document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
|
|
470
|
|
471 // A fallback to window.onload, that will always work
|
|
472 window.addEventListener( "load", jQuery.ready, false );
|
|
473
|
|
474 // If IE event model is used
|
|
475 } else if ( document.attachEvent ) {
|
|
476 // ensure firing before onload,
|
|
477 // maybe late but safe also for iframes
|
|
478 document.attachEvent("onreadystatechange", DOMContentLoaded);
|
|
479
|
|
480 // A fallback to window.onload, that will always work
|
|
481 window.attachEvent( "onload", jQuery.ready );
|
|
482
|
|
483 // If IE and not a frame
|
|
484 // continually check to see if the document is ready
|
|
485 var toplevel = false;
|
|
486
|
|
487 try {
|
|
488 toplevel = window.frameElement == null;
|
|
489 } catch(e) {}
|
|
490
|
|
491 if ( document.documentElement.doScroll && toplevel ) {
|
|
492 doScrollCheck();
|
|
493 }
|
|
494 }
|
|
495 },
|
|
496
|
|
497 // See test/unit/core.js for details concerning isFunction.
|
|
498 // Since version 1.3, DOM methods and functions like alert
|
|
499 // aren't supported. They return false on IE (#2968).
|
|
500 isFunction: function( obj ) {
|
|
501 return jQuery.type(obj) === "function";
|
|
502 },
|
|
503
|
|
504 isArray: Array.isArray || function( obj ) {
|
|
505 return jQuery.type(obj) === "array";
|
|
506 },
|
|
507
|
|
508 // A crude way of determining if an object is a window
|
|
509 isWindow: function( obj ) {
|
|
510 return obj && typeof obj === "object" && "setInterval" in obj;
|
|
511 },
|
|
512
|
|
513 isNaN: function( obj ) {
|
|
514 return obj == null || !rdigit.test( obj ) || isNaN( obj );
|
|
515 },
|
|
516
|
|
517 type: function( obj ) {
|
|
518 return obj == null ?
|
|
519 String( obj ) :
|
|
520 class2type[ toString.call(obj) ] || "object";
|
|
521 },
|
|
522
|
|
523 isPlainObject: function( obj ) {
|
|
524 // Must be an Object.
|
|
525 // Because of IE, we also have to check the presence of the constructor property.
|
|
526 // Make sure that DOM nodes and window objects don't pass through, as well
|
|
527 if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
|
|
528 return false;
|
|
529 }
|
|
530
|
|
531 // Not own constructor property must be Object
|
|
532 if ( obj.constructor &&
|
|
533 !hasOwn.call(obj, "constructor") &&
|
|
534 !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
|
|
535 return false;
|
|
536 }
|
|
537
|
|
538 // Own properties are enumerated firstly, so to speed up,
|
|
539 // if last one is own, then all properties are own.
|
|
540
|
|
541 var key;
|
|
542 for ( key in obj ) {}
|
|
543
|
|
544 return key === undefined || hasOwn.call( obj, key );
|
|
545 },
|
|
546
|
|
547 isEmptyObject: function( obj ) {
|
|
548 for ( var name in obj ) {
|
|
549 return false;
|
|
550 }
|
|
551 return true;
|
|
552 },
|
|
553
|
|
554 error: function( msg ) {
|
|
555 throw msg;
|
|
556 },
|
|
557
|
|
558 parseJSON: function( data ) {
|
|
559 if ( typeof data !== "string" || !data ) {
|
|
560 return null;
|
|
561 }
|
|
562
|
|
563 // Make sure leading/trailing whitespace is removed (IE can't handle it)
|
|
564 data = jQuery.trim( data );
|
|
565
|
|
566 // Make sure the incoming data is actual JSON
|
|
567 // Logic borrowed from http://json.org/json2.js
|
|
568 if ( rvalidchars.test(data.replace(rvalidescape, "@")
|
|
569 .replace(rvalidtokens, "]")
|
|
570 .replace(rvalidbraces, "")) ) {
|
|
571
|
|
572 // Try to use the native JSON parser first
|
|
573 return window.JSON && window.JSON.parse ?
|
|
574 window.JSON.parse( data ) :
|
|
575 (new Function("return " + data))();
|
|
576
|
|
577 } else {
|
|
578 jQuery.error( "Invalid JSON: " + data );
|
|
579 }
|
|
580 },
|
|
581
|
|
582 noop: function() {},
|
|
583
|
|
584 // Evalulates a script in a global context
|
|
585 globalEval: function( data ) {
|
|
586 if ( data && rnotwhite.test(data) ) {
|
|
587 // Inspired by code by Andrea Giammarchi
|
|
588 // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
|
|
589 var head = document.getElementsByTagName("head")[0] || document.documentElement,
|
|
590 script = document.createElement("script");
|
|
591
|
|
592 script.type = "text/javascript";
|
|
593
|
|
594 if ( jQuery.support.scriptEval ) {
|
|
595 script.appendChild( document.createTextNode( data ) );
|
|
596 } else {
|
|
597 script.text = data;
|
|
598 }
|
|
599
|
|
600 // Use insertBefore instead of appendChild to circumvent an IE6 bug.
|
|
601 // This arises when a base node is used (#2709).
|
|
602 head.insertBefore( script, head.firstChild );
|
|
603 head.removeChild( script );
|
|
604 }
|
|
605 },
|
|
606
|
|
607 nodeName: function( elem, name ) {
|
|
608 return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
|
|
609 },
|
|
610
|
|
611 // args is for internal usage only
|
|
612 each: function( object, callback, args ) {
|
|
613 var name, i = 0,
|
|
614 length = object.length,
|
|
615 isObj = length === undefined || jQuery.isFunction(object);
|
|
616
|
|
617 if ( args ) {
|
|
618 if ( isObj ) {
|
|
619 for ( name in object ) {
|
|
620 if ( callback.apply( object[ name ], args ) === false ) {
|
|
621 break;
|
|
622 }
|
|
623 }
|
|
624 } else {
|
|
625 for ( ; i < length; ) {
|
|
626 if ( callback.apply( object[ i++ ], args ) === false ) {
|
|
627 break;
|
|
628 }
|
|
629 }
|
|
630 }
|
|
631
|
|
632 // A special, fast, case for the most common use of each
|
|
633 } else {
|
|
634 if ( isObj ) {
|
|
635 for ( name in object ) {
|
|
636 if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
|
|
637 break;
|
|
638 }
|
|
639 }
|
|
640 } else {
|
|
641 for ( var value = object[0];
|
|
642 i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
|
|
643 }
|
|
644 }
|
|
645
|
|
646 return object;
|
|
647 },
|
|
648
|
|
649 // Use native String.trim function wherever possible
|
|
650 trim: trim ?
|
|
651 function( text ) {
|
|
652 return text == null ?
|
|
653 "" :
|
|
654 trim.call( text );
|
|
655 } :
|
|
656
|
|
657 // Otherwise use our own trimming functionality
|
|
658 function( text ) {
|
|
659 return text == null ?
|
|
660 "" :
|
|
661 text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
|
|
662 },
|
|
663
|
|
664 // results is for internal usage only
|
|
665 makeArray: function( array, results ) {
|
|
666 var ret = results || [];
|
|
667
|
|
668 if ( array != null ) {
|
|
669 // The window, strings (and functions) also have 'length'
|
|
670 // The extra typeof function check is to prevent crashes
|
|
671 // in Safari 2 (See: #3039)
|
|
672 // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
|
|
673 var type = jQuery.type(array);
|
|
674
|
|
675 if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
|
|
676 push.call( ret, array );
|
|
677 } else {
|
|
678 jQuery.merge( ret, array );
|
|
679 }
|
|
680 }
|
|
681
|
|
682 return ret;
|
|
683 },
|
|
684
|
|
685 inArray: function( elem, array ) {
|
|
686 if ( array.indexOf ) {
|
|
687 return array.indexOf( elem );
|
|
688 }
|
|
689
|
|
690 for ( var i = 0, length = array.length; i < length; i++ ) {
|
|
691 if ( array[ i ] === elem ) {
|
|
692 return i;
|
|
693 }
|
|
694 }
|
|
695
|
|
696 return -1;
|
|
697 },
|
|
698
|
|
699 merge: function( first, second ) {
|
|
700 var i = first.length, j = 0;
|
|
701
|
|
702 if ( typeof second.length === "number" ) {
|
|
703 for ( var l = second.length; j < l; j++ ) {
|
|
704 first[ i++ ] = second[ j ];
|
|
705 }
|
|
706
|
|
707 } else {
|
|
708 while ( second[j] !== undefined ) {
|
|
709 first[ i++ ] = second[ j++ ];
|
|
710 }
|
|
711 }
|
|
712
|
|
713 first.length = i;
|
|
714
|
|
715 return first;
|
|
716 },
|
|
717
|
|
718 grep: function( elems, callback, inv ) {
|
|
719 var ret = [], retVal;
|
|
720 inv = !!inv;
|
|
721
|
|
722 // Go through the array, only saving the items
|
|
723 // that pass the validator function
|
|
724 for ( var i = 0, length = elems.length; i < length; i++ ) {
|
|
725 retVal = !!callback( elems[ i ], i );
|
|
726 if ( inv !== retVal ) {
|
|
727 ret.push( elems[ i ] );
|
|
728 }
|
|
729 }
|
|
730
|
|
731 return ret;
|
|
732 },
|
|
733
|
|
734 // arg is for internal usage only
|
|
735 map: function( elems, callback, arg ) {
|
|
736 var ret = [], value;
|
|
737
|
|
738 // Go through the array, translating each of the items to their
|
|
739 // new value (or values).
|
|
740 for ( var i = 0, length = elems.length; i < length; i++ ) {
|
|
741 value = callback( elems[ i ], i, arg );
|
|
742
|
|
743 if ( value != null ) {
|
|
744 ret[ ret.length ] = value;
|
|
745 }
|
|
746 }
|
|
747
|
|
748 return ret.concat.apply( [], ret );
|
|
749 },
|
|
750
|
|
751 // A global GUID counter for objects
|
|
752 guid: 1,
|
|
753
|
|
754 proxy: function( fn, proxy, thisObject ) {
|
|
755 if ( arguments.length === 2 ) {
|
|
756 if ( typeof proxy === "string" ) {
|
|
757 thisObject = fn;
|
|
758 fn = thisObject[ proxy ];
|
|
759 proxy = undefined;
|
|
760
|
|
761 } else if ( proxy && !jQuery.isFunction( proxy ) ) {
|
|
762 thisObject = proxy;
|
|
763 proxy = undefined;
|
|
764 }
|
|
765 }
|
|
766
|
|
767 if ( !proxy && fn ) {
|
|
768 proxy = function() {
|
|
769 return fn.apply( thisObject || this, arguments );
|
|
770 };
|
|
771 }
|
|
772
|
|
773 // Set the guid of unique handler to the same of original handler, so it can be removed
|
|
774 if ( fn ) {
|
|
775 proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
|
|
776 }
|
|
777
|
|
778 // So proxy can be declared as an argument
|
|
779 return proxy;
|
|
780 },
|
|
781
|
|
782 // Mutifunctional method to get and set values to a collection
|
|
783 // The value/s can be optionally by executed if its a function
|
|
784 access: function( elems, key, value, exec, fn, pass ) {
|
|
785 var length = elems.length;
|
|
786
|
|
787 // Setting many attributes
|
|
788 if ( typeof key === "object" ) {
|
|
789 for ( var k in key ) {
|
|
790 jQuery.access( elems, k, key[k], exec, fn, value );
|
|
791 }
|
|
792 return elems;
|
|
793 }
|
|
794
|
|
795 // Setting one attribute
|
|
796 if ( value !== undefined ) {
|
|
797 // Optionally, function values get executed if exec is true
|
|
798 exec = !pass && exec && jQuery.isFunction(value);
|
|
799
|
|
800 for ( var i = 0; i < length; i++ ) {
|
|
801 fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
|
|
802 }
|
|
803
|
|
804 return elems;
|
|
805 }
|
|
806
|
|
807 // Getting an attribute
|
|
808 return length ? fn( elems[0], key ) : undefined;
|
|
809 },
|
|
810
|
|
811 now: function() {
|
|
812 return (new Date()).getTime();
|
|
813 },
|
|
814
|
|
815 // Use of jQuery.browser is frowned upon.
|
|
816 // More details: http://docs.jquery.com/Utilities/jQuery.browser
|
|
817 uaMatch: function( ua ) {
|
|
818 ua = ua.toLowerCase();
|
|
819
|
|
820 var match = rwebkit.exec( ua ) ||
|
|
821 ropera.exec( ua ) ||
|
|
822 rmsie.exec( ua ) ||
|
|
823 ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
|
|
824 [];
|
|
825
|
|
826 return { browser: match[1] || "", version: match[2] || "0" };
|
|
827 },
|
|
828
|
|
829 browser: {}
|
|
830 });
|
|
831
|
|
832 // Populate the class2type map
|
|
833 jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
|
|
834 class2type[ "[object " + name + "]" ] = name.toLowerCase();
|
|
835 });
|
|
836
|
|
837 browserMatch = jQuery.uaMatch( userAgent );
|
|
838 if ( browserMatch.browser ) {
|
|
839 jQuery.browser[ browserMatch.browser ] = true;
|
|
840 jQuery.browser.version = browserMatch.version;
|
|
841 }
|
|
842
|
|
843 // Deprecated, use jQuery.browser.webkit instead
|
|
844 if ( jQuery.browser.webkit ) {
|
|
845 jQuery.browser.safari = true;
|
|
846 }
|
|
847
|
|
848 if ( indexOf ) {
|
|
849 jQuery.inArray = function( elem, array ) {
|
|
850 return indexOf.call( array, elem );
|
|
851 };
|
|
852 }
|
|
853
|
|
854 // Verify that \s matches non-breaking spaces
|
|
855 // (IE fails on this test)
|
|
856 if ( !rwhite.test( "\xA0" ) ) {
|
|
857 trimLeft = /^[\s\xA0]+/;
|
|
858 trimRight = /[\s\xA0]+$/;
|
|
859 }
|
|
860
|
|
861 // All jQuery objects should point back to these
|
|
862 rootjQuery = jQuery(document);
|
|
863
|
|
864 // Cleanup functions for the document ready method
|
|
865 if ( document.addEventListener ) {
|
|
866 DOMContentLoaded = function() {
|
|
867 document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
|
|
868 jQuery.ready();
|
|
869 };
|
|
870
|
|
871 } else if ( document.attachEvent ) {
|
|
872 DOMContentLoaded = function() {
|
|
873 // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
|
|
874 if ( document.readyState === "complete" ) {
|
|
875 document.detachEvent( "onreadystatechange", DOMContentLoaded );
|
|
876 jQuery.ready();
|
|
877 }
|
|
878 };
|
|
879 }
|
|
880
|
|
881 // The DOM ready check for Internet Explorer
|
|
882 function doScrollCheck() {
|
|
883 if ( jQuery.isReady ) {
|
|
884 return;
|
|
885 }
|
|
886
|
|
887 try {
|
|
888 // If IE is used, use the trick by Diego Perini
|
|
889 // http://javascript.nwbox.com/IEContentLoaded/
|
|
890 document.documentElement.doScroll("left");
|
|
891 } catch(e) {
|
|
892 setTimeout( doScrollCheck, 1 );
|
|
893 return;
|
|
894 }
|
|
895
|
|
896 // and execute any waiting functions
|
|
897 jQuery.ready();
|
|
898 }
|
|
899
|
|
900 // Expose jQuery to the global object
|
|
901 return (window.jQuery = window.$ = jQuery);
|
|
902
|
|
903 })();
|
|
904
|
|
905
|
|
906 (function() {
|
|
907
|
|
908 jQuery.support = {};
|
|
909
|
|
910 var root = document.documentElement,
|
|
911 script = document.createElement("script"),
|
|
912 div = document.createElement("div"),
|
|
913 id = "script" + jQuery.now();
|
|
914
|
|
915 div.style.display = "none";
|
|
916 div.innerHTML = " <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
|
|
917
|
|
918 var all = div.getElementsByTagName("*"),
|
|
919 a = div.getElementsByTagName("a")[0],
|
|
920 select = document.createElement("select"),
|
|
921 opt = select.appendChild( document.createElement("option") );
|
|
922
|
|
923 // Can't get basic test support
|
|
924 if ( !all || !all.length || !a ) {
|
|
925 return;
|
|
926 }
|
|
927
|
|
928 jQuery.support = {
|
|
929 // IE strips leading whitespace when .innerHTML is used
|
|
930 leadingWhitespace: div.firstChild.nodeType === 3,
|
|
931
|
|
932 // Make sure that tbody elements aren't automatically inserted
|
|
933 // IE will insert them into empty tables
|
|
934 tbody: !div.getElementsByTagName("tbody").length,
|
|
935
|
|
936 // Make sure that link elements get serialized correctly by innerHTML
|
|
937 // This requires a wrapper element in IE
|
|
938 htmlSerialize: !!div.getElementsByTagName("link").length,
|
|
939
|
|
940 // Get the style information from getAttribute
|
|
941 // (IE uses .cssText insted)
|
|
942 style: /red/.test( a.getAttribute("style") ),
|
|
943
|
|
944 // Make sure that URLs aren't manipulated
|
|
945 // (IE normalizes it by default)
|
|
946 hrefNormalized: a.getAttribute("href") === "/a",
|
|
947
|
|
948 // Make sure that element opacity exists
|
|
949 // (IE uses filter instead)
|
|
950 // Use a regex to work around a WebKit issue. See #5145
|
|
951 opacity: /^0.55$/.test( a.style.opacity ),
|
|
952
|
|
953 // Verify style float existence
|
|
954 // (IE uses styleFloat instead of cssFloat)
|
|
955 cssFloat: !!a.style.cssFloat,
|
|
956
|
|
957 // Make sure that if no value is specified for a checkbox
|
|
958 // that it defaults to "on".
|
|
959 // (WebKit defaults to "" instead)
|
|
960 checkOn: div.getElementsByTagName("input")[0].value === "on",
|
|
961
|
|
962 // Make sure that a selected-by-default option has a working selected property.
|
|
963 // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
|
|
964 optSelected: opt.selected,
|
|
965
|
|
966 // Will be defined later
|
|
967 optDisabled: false,
|
|
968 checkClone: false,
|
|
969 scriptEval: false,
|
|
970 noCloneEvent: true,
|
|
971 boxModel: null,
|
|
972 inlineBlockNeedsLayout: false,
|
|
973 shrinkWrapBlocks: false,
|
|
974 reliableHiddenOffsets: true
|
|
975 };
|
|
976
|
|
977 // Make sure that the options inside disabled selects aren't marked as disabled
|
|
978 // (WebKit marks them as diabled)
|
|
979 select.disabled = true;
|
|
980 jQuery.support.optDisabled = !opt.disabled;
|
|
981
|
|
982 script.type = "text/javascript";
|
|
983 try {
|
|
984 script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
|
|
985 } catch(e) {}
|
|
986
|
|
987 root.insertBefore( script, root.firstChild );
|
|
988
|
|
989 // Make sure that the execution of code works by injecting a script
|
|
990 // tag with appendChild/createTextNode
|
|
991 // (IE doesn't support this, fails, and uses .text instead)
|
|
992 if ( window[ id ] ) {
|
|
993 jQuery.support.scriptEval = true;
|
|
994 delete window[ id ];
|
|
995 }
|
|
996
|
|
997 root.removeChild( script );
|
|
998
|
|
999 if ( div.attachEvent && div.fireEvent ) {
|
|
1000 div.attachEvent("onclick", function click() {
|
|
1001 // Cloning a node shouldn't copy over any
|
|
1002 // bound event handlers (IE does this)
|
|
1003 jQuery.support.noCloneEvent = false;
|
|
1004 div.detachEvent("onclick", click);
|
|
1005 });
|
|
1006 div.cloneNode(true).fireEvent("onclick");
|
|
1007 }
|
|
1008
|
|
1009 div = document.createElement("div");
|
|
1010 div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
|
|
1011
|
|
1012 var fragment = document.createDocumentFragment();
|
|
1013 fragment.appendChild( div.firstChild );
|
|
1014
|
|
1015 // WebKit doesn't clone checked state correctly in fragments
|
|
1016 jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
|
|
1017
|
|
1018 // Figure out if the W3C box model works as expected
|
|
1019 // document.body must exist before we can do this
|
|
1020 jQuery(function() {
|
|
1021 var div = document.createElement("div");
|
|
1022 div.style.width = div.style.paddingLeft = "1px";
|
|
1023
|
|
1024 document.body.appendChild( div );
|
|
1025 jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
|
|
1026
|
|
1027 if ( "zoom" in div.style ) {
|
|
1028 // Check if natively block-level elements act like inline-block
|
|
1029 // elements when setting their display to 'inline' and giving
|
|
1030 // them layout
|
|
1031 // (IE < 8 does this)
|
|
1032 div.style.display = "inline";
|
|
1033 div.style.zoom = 1;
|
|
1034 jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2;
|
|
1035
|
|
1036 // Check if elements with layout shrink-wrap their children
|
|
1037 // (IE 6 does this)
|
|
1038 div.style.display = "";
|
|
1039 div.innerHTML = "<div style='width:4px;'></div>";
|
|
1040 jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2;
|
|
1041 }
|
|
1042
|
|
1043 div.innerHTML = "<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";
|
|
1044 var tds = div.getElementsByTagName("td");
|
|
1045
|
|
1046 // Check if table cells still have offsetWidth/Height when they are set
|
|
1047 // to display:none and there are still other visible table cells in a
|
|
1048 // table row; if so, offsetWidth/Height are not reliable for use when
|
|
1049 // determining if an element has been hidden directly using
|
|
1050 // display:none (it is still safe to use offsets if a parent element is
|
|
1051 // hidden; don safety goggles and see bug #4512 for more information).
|
|
1052 // (only IE 8 fails this test)
|
|
1053 jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0;
|
|
1054
|
|
1055 tds[0].style.display = "";
|
|
1056 tds[1].style.display = "none";
|
|
1057
|
|
1058 // Check if empty table cells still have offsetWidth/Height
|
|
1059 // (IE < 8 fail this test)
|
|
1060 jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0;
|
|
1061 div.innerHTML = "";
|
|
1062
|
|
1063 document.body.removeChild( div ).style.display = "none";
|
|
1064 div = tds = null;
|
|
1065 });
|
|
1066
|
|
1067 // Technique from Juriy Zaytsev
|
|
1068 // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
|
|
1069 var eventSupported = function( eventName ) {
|
|
1070 var el = document.createElement("div");
|
|
1071 eventName = "on" + eventName;
|
|
1072
|
|
1073 var isSupported = (eventName in el);
|
|
1074 if ( !isSupported ) {
|
|
1075 el.setAttribute(eventName, "return;");
|
|
1076 isSupported = typeof el[eventName] === "function";
|
|
1077 }
|
|
1078 el = null;
|
|
1079
|
|
1080 return isSupported;
|
|
1081 };
|
|
1082
|
|
1083 jQuery.support.submitBubbles = eventSupported("submit");
|
|
1084 jQuery.support.changeBubbles = eventSupported("change");
|
|
1085
|
|
1086 // release memory in IE
|
|
1087 root = script = div = all = a = null;
|
|
1088 })();
|
|
1089
|
|
1090 jQuery.props = {
|
|
1091 "for": "htmlFor",
|
|
1092 "class": "className",
|
|
1093 readonly: "readOnly",
|
|
1094 maxlength: "maxLength",
|
|
1095 cellspacing: "cellSpacing",
|
|
1096 rowspan: "rowSpan",
|
|
1097 colspan: "colSpan",
|
|
1098 tabindex: "tabIndex",
|
|
1099 usemap: "useMap",
|
|
1100 frameborder: "frameBorder"
|
|
1101 };
|
|
1102
|
|
1103
|
|
1104
|
|
1105
|
|
1106 var windowData = {},
|
|
1107 rbrace = /^(?:\{.*\}|\[.*\])$/;
|
|
1108
|
|
1109 jQuery.extend({
|
|
1110 cache: {},
|
|
1111
|
|
1112 // Please use with caution
|
|
1113 uuid: 0,
|
|
1114
|
|
1115 // Unique for each copy of jQuery on the page
|
|
1116 expando: "jQuery" + jQuery.now(),
|
|
1117
|
|
1118 // The following elements throw uncatchable exceptions if you
|
|
1119 // attempt to add expando properties to them.
|
|
1120 noData: {
|
|
1121 "embed": true,
|
|
1122 // Ban all objects except for Flash (which handle expandos)
|
|
1123 "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
|
|
1124 "applet": true
|
|
1125 },
|
|
1126
|
|
1127 data: function( elem, name, data ) {
|
|
1128 if ( !jQuery.acceptData( elem ) ) {
|
|
1129 return;
|
|
1130 }
|
|
1131
|
|
1132 elem = elem == window ?
|
|
1133 windowData :
|
|
1134 elem;
|
|
1135
|
|
1136 var isNode = elem.nodeType,
|
|
1137 id = isNode ? elem[ jQuery.expando ] : null,
|
|
1138 cache = jQuery.cache, thisCache;
|
|
1139
|
|
1140 if ( isNode && !id && typeof name === "string" && data === undefined ) {
|
|
1141 return;
|
|
1142 }
|
|
1143
|
|
1144 // Get the data from the object directly
|
|
1145 if ( !isNode ) {
|
|
1146 cache = elem;
|
|
1147
|
|
1148 // Compute a unique ID for the element
|
|
1149 } else if ( !id ) {
|
|
1150 elem[ jQuery.expando ] = id = ++jQuery.uuid;
|
|
1151 }
|
|
1152
|
|
1153 // Avoid generating a new cache unless none exists and we
|
|
1154 // want to manipulate it.
|
|
1155 if ( typeof name === "object" ) {
|
|
1156 if ( isNode ) {
|
|
1157 cache[ id ] = jQuery.extend(cache[ id ], name);
|
|
1158
|
|
1159 } else {
|
|
1160 jQuery.extend( cache, name );
|
|
1161 }
|
|
1162
|
|
1163 } else if ( isNode && !cache[ id ] ) {
|
|
1164 cache[ id ] = {};
|
|
1165 }
|
|
1166
|
|
1167 thisCache = isNode ? cache[ id ] : cache;
|
|
1168
|
|
1169 // Prevent overriding the named cache with undefined values
|
|
1170 if ( data !== undefined ) {
|
|
1171 thisCache[ name ] = data;
|
|
1172 }
|
|
1173
|
|
1174 return typeof name === "string" ? thisCache[ name ] : thisCache;
|
|
1175 },
|
|
1176
|
|
1177 removeData: function( elem, name ) {
|
|
1178 if ( !jQuery.acceptData( elem ) ) {
|
|
1179 return;
|
|
1180 }
|
|
1181
|
|
1182 elem = elem == window ?
|
|
1183 windowData :
|
|
1184 elem;
|
|
1185
|
|
1186 var isNode = elem.nodeType,
|
|
1187 id = isNode ? elem[ jQuery.expando ] : elem,
|
|
1188 cache = jQuery.cache,
|
|
1189 thisCache = isNode ? cache[ id ] : id;
|
|
1190
|
|
1191 // If we want to remove a specific section of the element's data
|
|
1192 if ( name ) {
|
|
1193 if ( thisCache ) {
|
|
1194 // Remove the section of cache data
|
|
1195 delete thisCache[ name ];
|
|
1196
|
|
1197 // If we've removed all the data, remove the element's cache
|
|
1198 if ( isNode && jQuery.isEmptyObject(thisCache) ) {
|
|
1199 jQuery.removeData( elem );
|
|
1200 }
|
|
1201 }
|
|
1202
|
|
1203 // Otherwise, we want to remove all of the element's data
|
|
1204 } else {
|
|
1205 if ( isNode && jQuery.support.deleteExpando ) {
|
|
1206 delete elem[ jQuery.expando ];
|
|
1207
|
|
1208 } else if ( elem.removeAttribute ) {
|
|
1209 elem.removeAttribute( jQuery.expando );
|
|
1210
|
|
1211 // Completely remove the data cache
|
|
1212 } else if ( isNode ) {
|
|
1213 delete cache[ id ];
|
|
1214
|
|
1215 // Remove all fields from the object
|
|
1216 } else {
|
|
1217 for ( var n in elem ) {
|
|
1218 delete elem[ n ];
|
|
1219 }
|
|
1220 }
|
|
1221 }
|
|
1222 },
|
|
1223
|
|
1224 // A method for determining if a DOM node can handle the data expando
|
|
1225 acceptData: function( elem ) {
|
|
1226 if ( elem.nodeName ) {
|
|
1227 var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
|
|
1228
|
|
1229 if ( match ) {
|
|
1230 return !(match === true || elem.getAttribute("classid") !== match);
|
|
1231 }
|
|
1232 }
|
|
1233
|
|
1234 return true;
|
|
1235 }
|
|
1236 });
|
|
1237
|
|
1238 jQuery.fn.extend({
|
|
1239 data: function( key, value ) {
|
|
1240 if ( typeof key === "undefined" ) {
|
|
1241 return this.length ? jQuery.data( this[0] ) : null;
|
|
1242
|
|
1243 } else if ( typeof key === "object" ) {
|
|
1244 return this.each(function() {
|
|
1245 jQuery.data( this, key );
|
|
1246 });
|
|
1247 }
|
|
1248
|
|
1249 var parts = key.split(".");
|
|
1250 parts[1] = parts[1] ? "." + parts[1] : "";
|
|
1251
|
|
1252 if ( value === undefined ) {
|
|
1253 var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
|
|
1254
|
|
1255 // Try to fetch any internally stored data first
|
|
1256 if ( data === undefined && this.length ) {
|
|
1257 data = jQuery.data( this[0], key );
|
|
1258
|
|
1259 // If nothing was found internally, try to fetch any
|
|
1260 // data from the HTML5 data-* attribute
|
|
1261 if ( data === undefined && this[0].nodeType === 1 ) {
|
|
1262 data = this[0].getAttribute( "data-" + key );
|
|
1263
|
|
1264 if ( typeof data === "string" ) {
|
|
1265 try {
|
|
1266 data = data === "true" ? true :
|
|
1267 data === "false" ? false :
|
|
1268 data === "null" ? null :
|
|
1269 !jQuery.isNaN( data ) ? parseFloat( data ) :
|
|
1270 rbrace.test( data ) ? jQuery.parseJSON( data ) :
|
|
1271 data;
|
|
1272 } catch( e ) {}
|
|
1273
|
|
1274 } else {
|
|
1275 data = undefined;
|
|
1276 }
|
|
1277 }
|
|
1278 }
|
|
1279
|
|
1280 return data === undefined && parts[1] ?
|
|
1281 this.data( parts[0] ) :
|
|
1282 data;
|
|
1283
|
|
1284 } else {
|
|
1285 return this.each(function() {
|
|
1286 var $this = jQuery( this ), args = [ parts[0], value ];
|
|
1287
|
|
1288 $this.triggerHandler( "setData" + parts[1] + "!", args );
|
|
1289 jQuery.data( this, key, value );
|
|
1290 $this.triggerHandler( "changeData" + parts[1] + "!", args );
|
|
1291 });
|
|
1292 }
|
|
1293 },
|
|
1294
|
|
1295 removeData: function( key ) {
|
|
1296 return this.each(function() {
|
|
1297 jQuery.removeData( this, key );
|
|
1298 });
|
|
1299 }
|
|
1300 });
|
|
1301
|
|
1302
|
|
1303
|
|
1304
|
|
1305 jQuery.extend({
|
|
1306 queue: function( elem, type, data ) {
|
|
1307 if ( !elem ) {
|
|
1308 return;
|
|
1309 }
|
|
1310
|
|
1311 type = (type || "fx") + "queue";
|
|
1312 var q = jQuery.data( elem, type );
|
|
1313
|
|
1314 // Speed up dequeue by getting out quickly if this is just a lookup
|
|
1315 if ( !data ) {
|
|
1316 return q || [];
|
|
1317 }
|
|
1318
|
|
1319 if ( !q || jQuery.isArray(data) ) {
|
|
1320 q = jQuery.data( elem, type, jQuery.makeArray(data) );
|
|
1321
|
|
1322 } else {
|
|
1323 q.push( data );
|
|
1324 }
|
|
1325
|
|
1326 return q;
|
|
1327 },
|
|
1328
|
|
1329 dequeue: function( elem, type ) {
|
|
1330 type = type || "fx";
|
|
1331
|
|
1332 var queue = jQuery.queue( elem, type ), fn = queue.shift();
|
|
1333
|
|
1334 // If the fx queue is dequeued, always remove the progress sentinel
|
|
1335 if ( fn === "inprogress" ) {
|
|
1336 fn = queue.shift();
|
|
1337 }
|
|
1338
|
|
1339 if ( fn ) {
|
|
1340 // Add a progress sentinel to prevent the fx queue from being
|
|
1341 // automatically dequeued
|
|
1342 if ( type === "fx" ) {
|
|
1343 queue.unshift("inprogress");
|
|
1344 }
|
|
1345
|
|
1346 fn.call(elem, function() {
|
|
1347 jQuery.dequeue(elem, type);
|
|
1348 });
|
|
1349 }
|
|
1350 }
|
|
1351 });
|
|
1352
|
|
1353 jQuery.fn.extend({
|
|
1354 queue: function( type, data ) {
|
|
1355 if ( typeof type !== "string" ) {
|
|
1356 data = type;
|
|
1357 type = "fx";
|
|
1358 }
|
|
1359
|
|
1360 if ( data === undefined ) {
|
|
1361 return jQuery.queue( this[0], type );
|
|
1362 }
|
|
1363 return this.each(function( i ) {
|
|
1364 var queue = jQuery.queue( this, type, data );
|
|
1365
|
|
1366 if ( type === "fx" && queue[0] !== "inprogress" ) {
|
|
1367 jQuery.dequeue( this, type );
|
|
1368 }
|
|
1369 });
|
|
1370 },
|
|
1371 dequeue: function( type ) {
|
|
1372 return this.each(function() {
|
|
1373 jQuery.dequeue( this, type );
|
|
1374 });
|
|
1375 },
|
|
1376
|
|
1377 // Based off of the plugin by Clint Helfers, with permission.
|
|
1378 // http://blindsignals.com/index.php/2009/07/jquery-delay/
|
|
1379 delay: function( time, type ) {
|
|
1380 time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
|
|
1381 type = type || "fx";
|
|
1382
|
|
1383 return this.queue( type, function() {
|
|
1384 var elem = this;
|
|
1385 setTimeout(function() {
|
|
1386 jQuery.dequeue( elem, type );
|
|
1387 }, time );
|
|
1388 });
|
|
1389 },
|
|
1390
|
|
1391 clearQueue: function( type ) {
|
|
1392 return this.queue( type || "fx", [] );
|
|
1393 }
|
|
1394 });
|
|
1395
|
|
1396
|
|
1397
|
|
1398
|
|
1399 var rclass = /[\n\t]/g,
|
|
1400 rspaces = /\s+/,
|
|
1401 rreturn = /\r/g,
|
|
1402 rspecialurl = /^(?:href|src|style)$/,
|
|
1403 rtype = /^(?:button|input)$/i,
|
|
1404 rfocusable = /^(?:button|input|object|select|textarea)$/i,
|
|
1405 rclickable = /^a(?:rea)?$/i,
|
|
1406 rradiocheck = /^(?:radio|checkbox)$/i;
|
|
1407
|
|
1408 jQuery.fn.extend({
|
|
1409 attr: function( name, value ) {
|
|
1410 return jQuery.access( this, name, value, true, jQuery.attr );
|
|
1411 },
|
|
1412
|
|
1413 removeAttr: function( name, fn ) {
|
|
1414 return this.each(function(){
|
|
1415 jQuery.attr( this, name, "" );
|
|
1416 if ( this.nodeType === 1 ) {
|
|
1417 this.removeAttribute( name );
|
|
1418 }
|
|
1419 });
|
|
1420 },
|
|
1421
|
|
1422 addClass: function( value ) {
|
|
1423 if ( jQuery.isFunction(value) ) {
|
|
1424 return this.each(function(i) {
|
|
1425 var self = jQuery(this);
|
|
1426 self.addClass( value.call(this, i, self.attr("class")) );
|
|
1427 });
|
|
1428 }
|
|
1429
|
|
1430 if ( value && typeof value === "string" ) {
|
|
1431 var classNames = (value || "").split( rspaces );
|
|
1432
|
|
1433 for ( var i = 0, l = this.length; i < l; i++ ) {
|
|
1434 var elem = this[i];
|
|
1435
|
|
1436 if ( elem.nodeType === 1 ) {
|
|
1437 if ( !elem.className ) {
|
|
1438 elem.className = value;
|
|
1439
|
|
1440 } else {
|
|
1441 var className = " " + elem.className + " ", setClass = elem.className;
|
|
1442 for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
|
|
1443 if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
|
|
1444 setClass += " " + classNames[c];
|
|
1445 }
|
|
1446 }
|
|
1447 elem.className = jQuery.trim( setClass );
|
|
1448 }
|
|
1449 }
|
|
1450 }
|
|
1451 }
|
|
1452
|
|
1453 return this;
|
|
1454 },
|
|
1455
|
|
1456 removeClass: function( value ) {
|
|
1457 if ( jQuery.isFunction(value) ) {
|
|
1458 return this.each(function(i) {
|
|
1459 var self = jQuery(this);
|
|
1460 self.removeClass( value.call(this, i, self.attr("class")) );
|
|
1461 });
|
|
1462 }
|
|
1463
|
|
1464 if ( (value && typeof value === "string") || value === undefined ) {
|
|
1465 var classNames = (value || "").split( rspaces );
|
|
1466
|
|
1467 for ( var i = 0, l = this.length; i < l; i++ ) {
|
|
1468 var elem = this[i];
|
|
1469
|
|
1470 if ( elem.nodeType === 1 && elem.className ) {
|
|
1471 if ( value ) {
|
|
1472 var className = (" " + elem.className + " ").replace(rclass, " ");
|
|
1473 for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
|
|
1474 className = className.replace(" " + classNames[c] + " ", " ");
|
|
1475 }
|
|
1476 elem.className = jQuery.trim( className );
|
|
1477
|
|
1478 } else {
|
|
1479 elem.className = "";
|
|
1480 }
|
|
1481 }
|
|
1482 }
|
|
1483 }
|
|
1484
|
|
1485 return this;
|
|
1486 },
|
|
1487
|
|
1488 toggleClass: function( value, stateVal ) {
|
|
1489 var type = typeof value, isBool = typeof stateVal === "boolean";
|
|
1490
|
|
1491 if ( jQuery.isFunction( value ) ) {
|
|
1492 return this.each(function(i) {
|
|
1493 var self = jQuery(this);
|
|
1494 self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
|
|
1495 });
|
|
1496 }
|
|
1497
|
|
1498 return this.each(function() {
|
|
1499 if ( type === "string" ) {
|
|
1500 // toggle individual class names
|
|
1501 var className, i = 0, self = jQuery(this),
|
|
1502 state = stateVal,
|
|
1503 classNames = value.split( rspaces );
|
|
1504
|
|
1505 while ( (className = classNames[ i++ ]) ) {
|
|
1506 // check each className given, space seperated list
|
|
1507 state = isBool ? state : !self.hasClass( className );
|
|
1508 self[ state ? "addClass" : "removeClass" ]( className );
|
|
1509 }
|
|
1510
|
|
1511 } else if ( type === "undefined" || type === "boolean" ) {
|
|
1512 if ( this.className ) {
|
|
1513 // store className if set
|
|
1514 jQuery.data( this, "__className__", this.className );
|
|
1515 }
|
|
1516
|
|
1517 // toggle whole className
|
|
1518 this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || "";
|
|
1519 }
|
|
1520 });
|
|
1521 },
|
|
1522
|
|
1523 hasClass: function( selector ) {
|
|
1524 var className = " " + selector + " ";
|
|
1525 for ( var i = 0, l = this.length; i < l; i++ ) {
|
|
1526 if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
|
|
1527 return true;
|
|
1528 }
|
|
1529 }
|
|
1530
|
|
1531 return false;
|
|
1532 },
|
|
1533
|
|
1534 val: function( value ) {
|
|
1535 if ( !arguments.length ) {
|
|
1536 var elem = this[0];
|
|
1537
|
|
1538 if ( elem ) {
|
|
1539 if ( jQuery.nodeName( elem, "option" ) ) {
|
|
1540 // attributes.value is undefined in Blackberry 4.7 but
|
|
1541 // uses .value. See #6932
|
|
1542 var val = elem.attributes.value;
|
|
1543 return !val || val.specified ? elem.value : elem.text;
|
|
1544 }
|
|
1545
|
|
1546 // We need to handle select boxes special
|
|
1547 if ( jQuery.nodeName( elem, "select" ) ) {
|
|
1548 var index = elem.selectedIndex,
|
|
1549 values = [],
|
|
1550 options = elem.options,
|
|
1551 one = elem.type === "select-one";
|
|
1552
|
|
1553 // Nothing was selected
|
|
1554 if ( index < 0 ) {
|
|
1555 return null;
|
|
1556 }
|
|
1557
|
|
1558 // Loop through all the selected options
|
|
1559 for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
|
|
1560 var option = options[ i ];
|
|
1561
|
|
1562 // Don't return options that are disabled or in a disabled optgroup
|
|
1563 if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
|
|
1564 (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
|
|
1565
|
|
1566 // Get the specific value for the option
|
|
1567 value = jQuery(option).val();
|
|
1568
|
|
1569 // We don't need an array for one selects
|
|
1570 if ( one ) {
|
|
1571 return value;
|
|
1572 }
|
|
1573
|
|
1574 // Multi-Selects return an array
|
|
1575 values.push( value );
|
|
1576 }
|
|
1577 }
|
|
1578
|
|
1579 return values;
|
|
1580 }
|
|
1581
|
|
1582 // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
|
|
1583 if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
|
|
1584 return elem.getAttribute("value") === null ? "on" : elem.value;
|
|
1585 }
|
|
1586
|
|
1587
|
|
1588 // Everything else, we just grab the value
|
|
1589 return (elem.value || "").replace(rreturn, "");
|
|
1590
|
|
1591 }
|
|
1592
|
|
1593 return undefined;
|
|
1594 }
|
|
1595
|
|
1596 var isFunction = jQuery.isFunction(value);
|
|
1597
|
|
1598 return this.each(function(i) {
|
|
1599 var self = jQuery(this), val = value;
|
|
1600
|
|
1601 if ( this.nodeType !== 1 ) {
|
|
1602 return;
|
|
1603 }
|
|
1604
|
|
1605 if ( isFunction ) {
|
|
1606 val = value.call(this, i, self.val());
|
|
1607 }
|
|
1608
|
|
1609 // Treat null/undefined as ""; convert numbers to string
|
|
1610 if ( val == null ) {
|
|
1611 val = "";
|
|
1612 } else if ( typeof val === "number" ) {
|
|
1613 val += "";
|
|
1614 } else if ( jQuery.isArray(val) ) {
|
|
1615 val = jQuery.map(val, function (value) {
|
|
1616 return value == null ? "" : value + "";
|
|
1617 });
|
|
1618 }
|
|
1619
|
|
1620 if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
|
|
1621 this.checked = jQuery.inArray( self.val(), val ) >= 0;
|
|
1622
|
|
1623 } else if ( jQuery.nodeName( this, "select" ) ) {
|
|
1624 var values = jQuery.makeArray(val);
|
|
1625
|
|
1626 jQuery( "option", this ).each(function() {
|
|
1627 this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
|
|
1628 });
|
|
1629
|
|
1630 if ( !values.length ) {
|
|
1631 this.selectedIndex = -1;
|
|
1632 }
|
|
1633
|
|
1634 } else {
|
|
1635 this.value = val;
|
|
1636 }
|
|
1637 });
|
|
1638 }
|
|
1639 });
|
|
1640
|
|
1641 jQuery.extend({
|
|
1642 attrFn: {
|
|
1643 val: true,
|
|
1644 css: true,
|
|
1645 html: true,
|
|
1646 text: true,
|
|
1647 data: true,
|
|
1648 width: true,
|
|
1649 height: true,
|
|
1650 offset: true
|
|
1651 },
|
|
1652
|
|
1653 attr: function( elem, name, value, pass ) {
|
|
1654 // don't set attributes on text and comment nodes
|
|
1655 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
|
|
1656 return undefined;
|
|
1657 }
|
|
1658
|
|
1659 if ( pass && name in jQuery.attrFn ) {
|
|
1660 return jQuery(elem)[name](value);
|
|
1661 }
|
|
1662
|
|
1663 var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
|
|
1664 // Whether we are setting (or getting)
|
|
1665 set = value !== undefined;
|
|
1666
|
|
1667 // Try to normalize/fix the name
|
|
1668 name = notxml && jQuery.props[ name ] || name;
|
|
1669
|
|
1670 // Only do all the following if this is a node (faster for style)
|
|
1671 if ( elem.nodeType === 1 ) {
|
|
1672 // These attributes require special treatment
|
|
1673 var special = rspecialurl.test( name );
|
|
1674
|
|
1675 // Safari mis-reports the default selected property of an option
|
|
1676 // Accessing the parent's selectedIndex property fixes it
|
|
1677 if ( name === "selected" && !jQuery.support.optSelected ) {
|
|
1678 var parent = elem.parentNode;
|
|
1679 if ( parent ) {
|
|
1680 parent.selectedIndex;
|
|
1681
|
|
1682 // Make sure that it also works with optgroups, see #5701
|
|
1683 if ( parent.parentNode ) {
|
|
1684 parent.parentNode.selectedIndex;
|
|
1685 }
|
|
1686 }
|
|
1687 }
|
|
1688
|
|
1689 // If applicable, access the attribute via the DOM 0 way
|
|
1690 // 'in' checks fail in Blackberry 4.7 #6931
|
|
1691 if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) {
|
|
1692 if ( set ) {
|
|
1693 // We can't allow the type property to be changed (since it causes problems in IE)
|
|
1694 if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
|
|
1695 jQuery.error( "type property can't be changed" );
|
|
1696 }
|
|
1697
|
|
1698 if ( value === null ) {
|
|
1699 if ( elem.nodeType === 1 ) {
|
|
1700 elem.removeAttribute( name );
|
|
1701 }
|
|
1702
|
|
1703 } else {
|
|
1704 elem[ name ] = value;
|
|
1705 }
|
|
1706 }
|
|
1707
|
|
1708 // browsers index elements by id/name on forms, give priority to attributes.
|
|
1709 if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
|
|
1710 return elem.getAttributeNode( name ).nodeValue;
|
|
1711 }
|
|
1712
|
|
1713 // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
|
|
1714 // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
|
|
1715 if ( name === "tabIndex" ) {
|
|
1716 var attributeNode = elem.getAttributeNode( "tabIndex" );
|
|
1717
|
|
1718 return attributeNode && attributeNode.specified ?
|
|
1719 attributeNode.value :
|
|
1720 rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
|
|
1721 0 :
|
|
1722 undefined;
|
|
1723 }
|
|
1724
|
|
1725 return elem[ name ];
|
|
1726 }
|
|
1727
|
|
1728 if ( !jQuery.support.style && notxml && name === "style" ) {
|
|
1729 if ( set ) {
|
|
1730 elem.style.cssText = "" + value;
|
|
1731 }
|
|
1732
|
|
1733 return elem.style.cssText;
|
|
1734 }
|
|
1735
|
|
1736 if ( set ) {
|
|
1737 // convert the value to a string (all browsers do this but IE) see #1070
|
|
1738 elem.setAttribute( name, "" + value );
|
|
1739 }
|
|
1740
|
|
1741 // Ensure that missing attributes return undefined
|
|
1742 // Blackberry 4.7 returns "" from getAttribute #6938
|
|
1743 if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) {
|
|
1744 return undefined;
|
|
1745 }
|
|
1746
|
|
1747 var attr = !jQuery.support.hrefNormalized && notxml && special ?
|
|
1748 // Some attributes require a special call on IE
|
|
1749 elem.getAttribute( name, 2 ) :
|
|
1750 elem.getAttribute( name );
|
|
1751
|
|
1752 // Non-existent attributes return null, we normalize to undefined
|
|
1753 return attr === null ? undefined : attr;
|
|
1754 }
|
|
1755 }
|
|
1756 });
|
|
1757
|
|
1758
|
|
1759
|
|
1760
|
|
1761 var rnamespaces = /\.(.*)$/,
|
|
1762 rformElems = /^(?:textarea|input|select)$/i,
|
|
1763 rperiod = /\./g,
|
|
1764 rspace = / /g,
|
|
1765 rescape = /[^\w\s.|`]/g,
|
|
1766 fcleanup = function( nm ) {
|
|
1767 return nm.replace(rescape, "\\$&");
|
|
1768 },
|
|
1769 focusCounts = { focusin: 0, focusout: 0 };
|
|
1770
|
|
1771 /*
|
|
1772 * A number of helper functions used for managing events.
|
|
1773 * Many of the ideas behind this code originated from
|
|
1774 * Dean Edwards' addEvent library.
|
|
1775 */
|
|
1776 jQuery.event = {
|
|
1777
|
|
1778 // Bind an event to an element
|
|
1779 // Original by Dean Edwards
|
|
1780 add: function( elem, types, handler, data ) {
|
|
1781 if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
|
|
1782 return;
|
|
1783 }
|
|
1784
|
|
1785 // For whatever reason, IE has trouble passing the window object
|
|
1786 // around, causing it to be cloned in the process
|
|
1787 if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) {
|
|
1788 elem = window;
|
|
1789 }
|
|
1790
|
|
1791 if ( handler === false ) {
|
|
1792 handler = returnFalse;
|
|
1793 }
|
|
1794
|
|
1795 var handleObjIn, handleObj;
|
|
1796
|
|
1797 if ( handler.handler ) {
|
|
1798 handleObjIn = handler;
|
|
1799 handler = handleObjIn.handler;
|
|
1800 }
|
|
1801
|
|
1802 // Make sure that the function being executed has a unique ID
|
|
1803 if ( !handler.guid ) {
|
|
1804 handler.guid = jQuery.guid++;
|
|
1805 }
|
|
1806
|
|
1807 // Init the element's event structure
|
|
1808 var elemData = jQuery.data( elem );
|
|
1809
|
|
1810 // If no elemData is found then we must be trying to bind to one of the
|
|
1811 // banned noData elements
|
|
1812 if ( !elemData ) {
|
|
1813 return;
|
|
1814 }
|
|
1815
|
|
1816 // Use a key less likely to result in collisions for plain JS objects.
|
|
1817 // Fixes bug #7150.
|
|
1818 var eventKey = elem.nodeType ? "events" : "__events__",
|
|
1819 events = elemData[ eventKey ],
|
|
1820 eventHandle = elemData.handle;
|
|
1821
|
|
1822 if ( typeof events === "function" ) {
|
|
1823 // On plain objects events is a fn that holds the the data
|
|
1824 // which prevents this data from being JSON serialized
|
|
1825 // the function does not need to be called, it just contains the data
|
|
1826 eventHandle = events.handle;
|
|
1827 events = events.events;
|
|
1828
|
|
1829 } else if ( !events ) {
|
|
1830 if ( !elem.nodeType ) {
|
|
1831 // On plain objects, create a fn that acts as the holder
|
|
1832 // of the values to avoid JSON serialization of event data
|
|
1833 elemData[ eventKey ] = elemData = function(){};
|
|
1834 }
|
|
1835
|
|
1836 elemData.events = events = {};
|
|
1837 }
|
|
1838
|
|
1839 if ( !eventHandle ) {
|
|
1840 elemData.handle = eventHandle = function() {
|
|
1841 // Handle the second event of a trigger and when
|
|
1842 // an event is called after a page has unloaded
|
|
1843 return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
|
|
1844 jQuery.event.handle.apply( eventHandle.elem, arguments ) :
|
|
1845 undefined;
|
|
1846 };
|
|
1847 }
|
|
1848
|
|
1849 // Add elem as a property of the handle function
|
|
1850 // This is to prevent a memory leak with non-native events in IE.
|
|
1851 eventHandle.elem = elem;
|
|
1852
|
|
1853 // Handle multiple events separated by a space
|
|
1854 // jQuery(...).bind("mouseover mouseout", fn);
|
|
1855 types = types.split(" ");
|
|
1856
|
|
1857 var type, i = 0, namespaces;
|
|
1858
|
|
1859 while ( (type = types[ i++ ]) ) {
|
|
1860 handleObj = handleObjIn ?
|
|
1861 jQuery.extend({}, handleObjIn) :
|
|
1862 { handler: handler, data: data };
|
|
1863
|
|
1864 // Namespaced event handlers
|
|
1865 if ( type.indexOf(".") > -1 ) {
|
|
1866 namespaces = type.split(".");
|
|
1867 type = namespaces.shift();
|
|
1868 handleObj.namespace = namespaces.slice(0).sort().join(".");
|
|
1869
|
|
1870 } else {
|
|
1871 namespaces = [];
|
|
1872 handleObj.namespace = "";
|
|
1873 }
|
|
1874
|
|
1875 handleObj.type = type;
|
|
1876 if ( !handleObj.guid ) {
|
|
1877 handleObj.guid = handler.guid;
|
|
1878 }
|
|
1879
|
|
1880 // Get the current list of functions bound to this event
|
|
1881 var handlers = events[ type ],
|
|
1882 special = jQuery.event.special[ type ] || {};
|
|
1883
|
|
1884 // Init the event handler queue
|
|
1885 if ( !handlers ) {
|
|
1886 handlers = events[ type ] = [];
|
|
1887
|
|
1888 // Check for a special event handler
|
|
1889 // Only use addEventListener/attachEvent if the special
|
|
1890 // events handler returns false
|
|
1891 if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
|
|
1892 // Bind the global event handler to the element
|
|
1893 if ( elem.addEventListener ) {
|
|
1894 elem.addEventListener( type, eventHandle, false );
|
|
1895
|
|
1896 } else if ( elem.attachEvent ) {
|
|
1897 elem.attachEvent( "on" + type, eventHandle );
|
|
1898 }
|
|
1899 }
|
|
1900 }
|
|
1901
|
|
1902 if ( special.add ) {
|
|
1903 special.add.call( elem, handleObj );
|
|
1904
|
|
1905 if ( !handleObj.handler.guid ) {
|
|
1906 handleObj.handler.guid = handler.guid;
|
|
1907 }
|
|
1908 }
|
|
1909
|
|
1910 // Add the function to the element's handler list
|
|
1911 handlers.push( handleObj );
|
|
1912
|
|
1913 // Keep track of which events have been used, for global triggering
|
|
1914 jQuery.event.global[ type ] = true;
|
|
1915 }
|
|
1916
|
|
1917 // Nullify elem to prevent memory leaks in IE
|
|
1918 elem = null;
|
|
1919 },
|
|
1920
|
|
1921 global: {},
|
|
1922
|
|
1923 // Detach an event or set of events from an element
|
|
1924 remove: function( elem, types, handler, pos ) {
|
|
1925 // don't do events on text and comment nodes
|
|
1926 if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
|
|
1927 return;
|
|
1928 }
|
|
1929
|
|
1930 if ( handler === false ) {
|
|
1931 handler = returnFalse;
|
|
1932 }
|
|
1933
|
|
1934 var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
|
|
1935 eventKey = elem.nodeType ? "events" : "__events__",
|
|
1936 elemData = jQuery.data( elem ),
|
|
1937 events = elemData && elemData[ eventKey ];
|
|
1938
|
|
1939 if ( !elemData || !events ) {
|
|
1940 return;
|
|
1941 }
|
|
1942
|
|
1943 if ( typeof events === "function" ) {
|
|
1944 elemData = events;
|
|
1945 events = events.events;
|
|
1946 }
|
|
1947
|
|
1948 // types is actually an event object here
|
|
1949 if ( types && types.type ) {
|
|
1950 handler = types.handler;
|
|
1951 types = types.type;
|
|
1952 }
|
|
1953
|
|
1954 // Unbind all events for the element
|
|
1955 if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
|
|
1956 types = types || "";
|
|
1957
|
|
1958 for ( type in events ) {
|
|
1959 jQuery.event.remove( elem, type + types );
|
|
1960 }
|
|
1961
|
|
1962 return;
|
|
1963 }
|
|
1964
|
|
1965 // Handle multiple events separated by a space
|
|
1966 // jQuery(...).unbind("mouseover mouseout", fn);
|
|
1967 types = types.split(" ");
|
|
1968
|
|
1969 while ( (type = types[ i++ ]) ) {
|
|
1970 origType = type;
|
|
1971 handleObj = null;
|
|
1972 all = type.indexOf(".") < 0;
|
|
1973 namespaces = [];
|
|
1974
|
|
1975 if ( !all ) {
|
|
1976 // Namespaced event handlers
|
|
1977 namespaces = type.split(".");
|
|
1978 type = namespaces.shift();
|
|
1979
|
|
1980 namespace = new RegExp("(^|\\.)" +
|
|
1981 jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
|
|
1982 }
|
|
1983
|
|
1984 eventType = events[ type ];
|
|
1985
|
|
1986 if ( !eventType ) {
|
|
1987 continue;
|
|
1988 }
|
|
1989
|
|
1990 if ( !handler ) {
|
|
1991 for ( j = 0; j < eventType.length; j++ ) {
|
|
1992 handleObj = eventType[ j ];
|
|
1993
|
|
1994 if ( all || namespace.test( handleObj.namespace ) ) {
|
|
1995 jQuery.event.remove( elem, origType, handleObj.handler, j );
|
|
1996 eventType.splice( j--, 1 );
|
|
1997 }
|
|
1998 }
|
|
1999
|
|
2000 continue;
|
|
2001 }
|
|
2002
|
|
2003 special = jQuery.event.special[ type ] || {};
|
|
2004
|
|
2005 for ( j = pos || 0; j < eventType.length; j++ ) {
|
|
2006 handleObj = eventType[ j ];
|
|
2007
|
|
2008 if ( handler.guid === handleObj.guid ) {
|
|
2009 // remove the given handler for the given type
|
|
2010 if ( all || namespace.test( handleObj.namespace ) ) {
|
|
2011 if ( pos == null ) {
|
|
2012 eventType.splice( j--, 1 );
|
|
2013 }
|
|
2014
|
|
2015 if ( special.remove ) {
|
|
2016 special.remove.call( elem, handleObj );
|
|
2017 }
|
|
2018 }
|
|
2019
|
|
2020 if ( pos != null ) {
|
|
2021 break;
|
|
2022 }
|
|
2023 }
|
|
2024 }
|
|
2025
|
|
2026 // remove generic event handler if no more handlers exist
|
|
2027 if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
|
|
2028 if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
|
|
2029 jQuery.removeEvent( elem, type, elemData.handle );
|
|
2030 }
|
|
2031
|
|
2032 ret = null;
|
|
2033 delete events[ type ];
|
|
2034 }
|
|
2035 }
|
|
2036
|
|
2037 // Remove the expando if it's no longer used
|
|
2038 if ( jQuery.isEmptyObject( events ) ) {
|
|
2039 var handle = elemData.handle;
|
|
2040 if ( handle ) {
|
|
2041 handle.elem = null;
|
|
2042 }
|
|
2043
|
|
2044 delete elemData.events;
|
|
2045 delete elemData.handle;
|
|
2046
|
|
2047 if ( typeof elemData === "function" ) {
|
|
2048 jQuery.removeData( elem, eventKey );
|
|
2049
|
|
2050 } else if ( jQuery.isEmptyObject( elemData ) ) {
|
|
2051 jQuery.removeData( elem );
|
|
2052 }
|
|
2053 }
|
|
2054 },
|
|
2055
|
|
2056 // bubbling is internal
|
|
2057 trigger: function( event, data, elem /*, bubbling */ ) {
|
|
2058 // Event object or event type
|
|
2059 var type = event.type || event,
|
|
2060 bubbling = arguments[3];
|
|
2061
|
|
2062 if ( !bubbling ) {
|
|
2063 event = typeof event === "object" ?
|
|
2064 // jQuery.Event object
|
|
2065 event[ jQuery.expando ] ? event :
|
|
2066 // Object literal
|
|
2067 jQuery.extend( jQuery.Event(type), event ) :
|
|
2068 // Just the event type (string)
|
|
2069 jQuery.Event(type);
|
|
2070
|
|
2071 if ( type.indexOf("!") >= 0 ) {
|
|
2072 event.type = type = type.slice(0, -1);
|
|
2073 event.exclusive = true;
|
|
2074 }
|
|
2075
|
|
2076 // Handle a global trigger
|
|
2077 if ( !elem ) {
|
|
2078 // Don't bubble custom events when global (to avoid too much overhead)
|
|
2079 event.stopPropagation();
|
|
2080
|
|
2081 // Only trigger if we've ever bound an event for it
|
|
2082 if ( jQuery.event.global[ type ] ) {
|
|
2083 jQuery.each( jQuery.cache, function() {
|
|
2084 if ( this.events && this.events[type] ) {
|
|
2085 jQuery.event.trigger( event, data, this.handle.elem );
|
|
2086 }
|
|
2087 });
|
|
2088 }
|
|
2089 }
|
|
2090
|
|
2091 // Handle triggering a single element
|
|
2092
|
|
2093 // don't do events on text and comment nodes
|
|
2094 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
|
|
2095 return undefined;
|
|
2096 }
|
|
2097
|
|
2098 // Clean up in case it is reused
|
|
2099 event.result = undefined;
|
|
2100 event.target = elem;
|
|
2101
|
|
2102 // Clone the incoming data, if any
|
|
2103 data = jQuery.makeArray( data );
|
|
2104 data.unshift( event );
|
|
2105 }
|
|
2106
|
|
2107 event.currentTarget = elem;
|
|
2108
|
|
2109 // Trigger the event, it is assumed that "handle" is a function
|
|
2110 var handle = elem.nodeType ?
|
|
2111 jQuery.data( elem, "handle" ) :
|
|
2112 (jQuery.data( elem, "__events__" ) || {}).handle;
|
|
2113
|
|
2114 if ( handle ) {
|
|
2115 handle.apply( elem, data );
|
|
2116 }
|
|
2117
|
|
2118 var parent = elem.parentNode || elem.ownerDocument;
|
|
2119
|
|
2120 // Trigger an inline bound script
|
|
2121 try {
|
|
2122 if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
|
|
2123 if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {
|
|
2124 event.result = false;
|
|
2125 event.preventDefault();
|
|
2126 }
|
|
2127 }
|
|
2128
|
|
2129 // prevent IE from throwing an error for some elements with some event types, see #3533
|
|
2130 } catch (inlineError) {}
|
|
2131
|
|
2132 if ( !event.isPropagationStopped() && parent ) {
|
|
2133 jQuery.event.trigger( event, data, parent, true );
|
|
2134
|
|
2135 } else if ( !event.isDefaultPrevented() ) {
|
|
2136 var target = event.target, old, targetType = type.replace(rnamespaces, ""),
|
|
2137 isClick = jQuery.nodeName(target, "a") && targetType === "click",
|
|
2138 special = jQuery.event.special[ targetType ] || {};
|
|
2139
|
|
2140 if ( (!special._default || special._default.call( elem, event ) === false) &&
|
|
2141 !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
|
|
2142
|
|
2143 try {
|
|
2144 if ( target[ targetType ] ) {
|
|
2145 // Make sure that we don't accidentally re-trigger the onFOO events
|
|
2146 old = target[ "on" + targetType ];
|
|
2147
|
|
2148 if ( old ) {
|
|
2149 target[ "on" + targetType ] = null;
|
|
2150 }
|
|
2151
|
|
2152 jQuery.event.triggered = true;
|
|
2153 target[ targetType ]();
|
|
2154 }
|
|
2155
|
|
2156 // prevent IE from throwing an error for some elements with some event types, see #3533
|
|
2157 } catch (triggerError) {}
|
|
2158
|
|
2159 if ( old ) {
|
|
2160 target[ "on" + targetType ] = old;
|
|
2161 }
|
|
2162
|
|
2163 jQuery.event.triggered = false;
|
|
2164 }
|
|
2165 }
|
|
2166 },
|
|
2167
|
|
2168 handle: function( event ) {
|
|
2169 var all, handlers, namespaces, namespace_sort = [], namespace_re, events, args = jQuery.makeArray( arguments );
|
|
2170
|
|
2171 event = args[0] = jQuery.event.fix( event || window.event );
|
|
2172 event.currentTarget = this;
|
|
2173
|
|
2174 // Namespaced event handlers
|
|
2175 all = event.type.indexOf(".") < 0 && !event.exclusive;
|
|
2176
|
|
2177 if ( !all ) {
|
|
2178 namespaces = event.type.split(".");
|
|
2179 event.type = namespaces.shift();
|
|
2180 namespace_sort = namespaces.slice(0).sort();
|
|
2181 namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)");
|
|
2182 }
|
|
2183
|
|
2184 event.namespace = event.namespace || namespace_sort.join(".");
|
|
2185
|
|
2186 events = jQuery.data(this, this.nodeType ? "events" : "__events__");
|
|
2187
|
|
2188 if ( typeof events === "function" ) {
|
|
2189 events = events.events;
|
|
2190 }
|
|
2191
|
|
2192 handlers = (events || {})[ event.type ];
|
|
2193
|
|
2194 if ( events && handlers ) {
|
|
2195 // Clone the handlers to prevent manipulation
|
|
2196 handlers = handlers.slice(0);
|
|
2197
|
|
2198 for ( var j = 0, l = handlers.length; j < l; j++ ) {
|
|
2199 var handleObj = handlers[ j ];
|
|
2200
|
|
2201 // Filter the functions by class
|
|
2202 if ( all || namespace_re.test( handleObj.namespace ) ) {
|
|
2203 // Pass in a reference to the handler function itself
|
|
2204 // So that we can later remove it
|
|
2205 event.handler = handleObj.handler;
|
|
2206 event.data = handleObj.data;
|
|
2207 event.handleObj = handleObj;
|
|
2208
|
|
2209 var ret = handleObj.handler.apply( this, args );
|
|
2210
|
|
2211 if ( ret !== undefined ) {
|
|
2212 event.result = ret;
|
|
2213 if ( ret === false ) {
|
|
2214 event.preventDefault();
|
|
2215 event.stopPropagation();
|
|
2216 }
|
|
2217 }
|
|
2218
|
|
2219 if ( event.isImmediatePropagationStopped() ) {
|
|
2220 break;
|
|
2221 }
|
|
2222 }
|
|
2223 }
|
|
2224 }
|
|
2225
|
|
2226 return event.result;
|
|
2227 },
|
|
2228
|
|
2229 props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
|
|
2230
|
|
2231 fix: function( event ) {
|
|
2232 if ( event[ jQuery.expando ] ) {
|
|
2233 return event;
|
|
2234 }
|
|
2235
|
|
2236 // store a copy of the original event object
|
|
2237 // and "clone" to set read-only properties
|
|
2238 var originalEvent = event;
|
|
2239 event = jQuery.Event( originalEvent );
|
|
2240
|
|
2241 for ( var i = this.props.length, prop; i; ) {
|
|
2242 prop = this.props[ --i ];
|
|
2243 event[ prop ] = originalEvent[ prop ];
|
|
2244 }
|
|
2245
|
|
2246 // Fix target property, if necessary
|
|
2247 if ( !event.target ) {
|
|
2248 event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
|
|
2249 }
|
|
2250
|
|
2251 // check if target is a textnode (safari)
|
|
2252 if ( event.target.nodeType === 3 ) {
|
|
2253 event.target = event.target.parentNode;
|
|
2254 }
|
|
2255
|
|
2256 // Add relatedTarget, if necessary
|
|
2257 if ( !event.relatedTarget && event.fromElement ) {
|
|
2258 event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
|
|
2259 }
|
|
2260
|
|
2261 // Calculate pageX/Y if missing and clientX/Y available
|
|
2262 if ( event.pageX == null && event.clientX != null ) {
|
|
2263 var doc = document.documentElement, body = document.body;
|
|
2264 event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
|
|
2265 event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
|
|
2266 }
|
|
2267
|
|
2268 // Add which for key events
|
|
2269 if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
|
|
2270 event.which = event.charCode != null ? event.charCode : event.keyCode;
|
|
2271 }
|
|
2272
|
|
2273 // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
|
|
2274 if ( !event.metaKey && event.ctrlKey ) {
|
|
2275 event.metaKey = event.ctrlKey;
|
|
2276 }
|
|
2277
|
|
2278 // Add which for click: 1 === left; 2 === middle; 3 === right
|
|
2279 // Note: button is not normalized, so don't use it
|
|
2280 if ( !event.which && event.button !== undefined ) {
|
|
2281 event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
|
|
2282 }
|
|
2283
|
|
2284 return event;
|
|
2285 },
|
|
2286
|
|
2287 // Deprecated, use jQuery.guid instead
|
|
2288 guid: 1E8,
|
|
2289
|
|
2290 // Deprecated, use jQuery.proxy instead
|
|
2291 proxy: jQuery.proxy,
|
|
2292
|
|
2293 special: {
|
|
2294 ready: {
|
|
2295 // Make sure the ready event is setup
|
|
2296 setup: jQuery.bindReady,
|
|
2297 teardown: jQuery.noop
|
|
2298 },
|
|
2299
|
|
2300 live: {
|
|
2301 add: function( handleObj ) {
|
|
2302 jQuery.event.add( this,
|
|
2303 liveConvert( handleObj.origType, handleObj.selector ),
|
|
2304 jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
|
|
2305 },
|
|
2306
|
|
2307 remove: function( handleObj ) {
|
|
2308 jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
|
|
2309 }
|
|
2310 },
|
|
2311
|
|
2312 beforeunload: {
|
|
2313 setup: function( data, namespaces, eventHandle ) {
|
|
2314 // We only want to do this special case on windows
|
|
2315 if ( jQuery.isWindow( this ) ) {
|
|
2316 this.onbeforeunload = eventHandle;
|
|
2317 }
|
|
2318 },
|
|
2319
|
|
2320 teardown: function( namespaces, eventHandle ) {
|
|
2321 if ( this.onbeforeunload === eventHandle ) {
|
|
2322 this.onbeforeunload = null;
|
|
2323 }
|
|
2324 }
|
|
2325 }
|
|
2326 }
|
|
2327 };
|
|
2328
|
|
2329 jQuery.removeEvent = document.removeEventListener ?
|
|
2330 function( elem, type, handle ) {
|
|
2331 if ( elem.removeEventListener ) {
|
|
2332 elem.removeEventListener( type, handle, false );
|
|
2333 }
|
|
2334 } :
|
|
2335 function( elem, type, handle ) {
|
|
2336 if ( elem.detachEvent ) {
|
|
2337 elem.detachEvent( "on" + type, handle );
|
|
2338 }
|
|
2339 };
|
|
2340
|
|
2341 jQuery.Event = function( src ) {
|
|
2342 // Allow instantiation without the 'new' keyword
|
|
2343 if ( !this.preventDefault ) {
|
|
2344 return new jQuery.Event( src );
|
|
2345 }
|
|
2346
|
|
2347 // Event object
|
|
2348 if ( src && src.type ) {
|
|
2349 this.originalEvent = src;
|
|
2350 this.type = src.type;
|
|
2351 // Event type
|
|
2352 } else {
|
|
2353 this.type = src;
|
|
2354 }
|
|
2355
|
|
2356 // timeStamp is buggy for some events on Firefox(#3843)
|
|
2357 // So we won't rely on the native value
|
|
2358 this.timeStamp = jQuery.now();
|
|
2359
|
|
2360 // Mark it as fixed
|
|
2361 this[ jQuery.expando ] = true;
|
|
2362 };
|
|
2363
|
|
2364 function returnFalse() {
|
|
2365 return false;
|
|
2366 }
|
|
2367 function returnTrue() {
|
|
2368 return true;
|
|
2369 }
|
|
2370
|
|
2371 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
|
|
2372 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
|
|
2373 jQuery.Event.prototype = {
|
|
2374 preventDefault: function() {
|
|
2375 this.isDefaultPrevented = returnTrue;
|
|
2376
|
|
2377 var e = this.originalEvent;
|
|
2378 if ( !e ) {
|
|
2379 return;
|
|
2380 }
|
|
2381
|
|
2382 // if preventDefault exists run it on the original event
|
|
2383 if ( e.preventDefault ) {
|
|
2384 e.preventDefault();
|
|
2385
|
|
2386 // otherwise set the returnValue property of the original event to false (IE)
|
|
2387 } else {
|
|
2388 e.returnValue = false;
|
|
2389 }
|
|
2390 },
|
|
2391 stopPropagation: function() {
|
|
2392 this.isPropagationStopped = returnTrue;
|
|
2393
|
|
2394 var e = this.originalEvent;
|
|
2395 if ( !e ) {
|
|
2396 return;
|
|
2397 }
|
|
2398 // if stopPropagation exists run it on the original event
|
|
2399 if ( e.stopPropagation ) {
|
|
2400 e.stopPropagation();
|
|
2401 }
|
|
2402 // otherwise set the cancelBubble property of the original event to true (IE)
|
|
2403 e.cancelBubble = true;
|
|
2404 },
|
|
2405 stopImmediatePropagation: function() {
|
|
2406 this.isImmediatePropagationStopped = returnTrue;
|
|
2407 this.stopPropagation();
|
|
2408 },
|
|
2409 isDefaultPrevented: returnFalse,
|
|
2410 isPropagationStopped: returnFalse,
|
|
2411 isImmediatePropagationStopped: returnFalse
|
|
2412 };
|
|
2413
|
|
2414 // Checks if an event happened on an element within another element
|
|
2415 // Used in jQuery.event.special.mouseenter and mouseleave handlers
|
|
2416 var withinElement = function( event ) {
|
|
2417 // Check if mouse(over|out) are still within the same parent element
|
|
2418 var parent = event.relatedTarget;
|
|
2419
|
|
2420 // Firefox sometimes assigns relatedTarget a XUL element
|
|
2421 // which we cannot access the parentNode property of
|
|
2422 try {
|
|
2423 // Traverse up the tree
|
|
2424 while ( parent && parent !== this ) {
|
|
2425 parent = parent.parentNode;
|
|
2426 }
|
|
2427
|
|
2428 if ( parent !== this ) {
|
|
2429 // set the correct event type
|
|
2430 event.type = event.data;
|
|
2431
|
|
2432 // handle event if we actually just moused on to a non sub-element
|
|
2433 jQuery.event.handle.apply( this, arguments );
|
|
2434 }
|
|
2435
|
|
2436 // assuming we've left the element since we most likely mousedover a xul element
|
|
2437 } catch(e) { }
|
|
2438 },
|
|
2439
|
|
2440 // In case of event delegation, we only need to rename the event.type,
|
|
2441 // liveHandler will take care of the rest.
|
|
2442 delegate = function( event ) {
|
|
2443 event.type = event.data;
|
|
2444 jQuery.event.handle.apply( this, arguments );
|
|
2445 };
|
|
2446
|
|
2447 // Create mouseenter and mouseleave events
|
|
2448 jQuery.each({
|
|
2449 mouseenter: "mouseover",
|
|
2450 mouseleave: "mouseout"
|
|
2451 }, function( orig, fix ) {
|
|
2452 jQuery.event.special[ orig ] = {
|
|
2453 setup: function( data ) {
|
|
2454 jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
|
|
2455 },
|
|
2456 teardown: function( data ) {
|
|
2457 jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
|
|
2458 }
|
|
2459 };
|
|
2460 });
|
|
2461
|
|
2462 // submit delegation
|
|
2463 if ( !jQuery.support.submitBubbles ) {
|
|
2464
|
|
2465 jQuery.event.special.submit = {
|
|
2466 setup: function( data, namespaces ) {
|
|
2467 if ( this.nodeName.toLowerCase() !== "form" ) {
|
|
2468 jQuery.event.add(this, "click.specialSubmit", function( e ) {
|
|
2469 var elem = e.target, type = elem.type;
|
|
2470
|
|
2471 if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
|
|
2472 e.liveFired = undefined;
|
|
2473 return trigger( "submit", this, arguments );
|
|
2474 }
|
|
2475 });
|
|
2476
|
|
2477 jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
|
|
2478 var elem = e.target, type = elem.type;
|
|
2479
|
|
2480 if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
|
|
2481 e.liveFired = undefined;
|
|
2482 return trigger( "submit", this, arguments );
|
|
2483 }
|
|
2484 });
|
|
2485
|
|
2486 } else {
|
|
2487 return false;
|
|
2488 }
|
|
2489 },
|
|
2490
|
|
2491 teardown: function( namespaces ) {
|
|
2492 jQuery.event.remove( this, ".specialSubmit" );
|
|
2493 }
|
|
2494 };
|
|
2495
|
|
2496 }
|
|
2497
|
|
2498 // change delegation, happens here so we have bind.
|
|
2499 if ( !jQuery.support.changeBubbles ) {
|
|
2500
|
|
2501 var changeFilters,
|
|
2502
|
|
2503 getVal = function( elem ) {
|
|
2504 var type = elem.type, val = elem.value;
|
|
2505
|
|
2506 if ( type === "radio" || type === "checkbox" ) {
|
|
2507 val = elem.checked;
|
|
2508
|
|
2509 } else if ( type === "select-multiple" ) {
|
|
2510 val = elem.selectedIndex > -1 ?
|
|
2511 jQuery.map( elem.options, function( elem ) {
|
|
2512 return elem.selected;
|
|
2513 }).join("-") :
|
|
2514 "";
|
|
2515
|
|
2516 } else if ( elem.nodeName.toLowerCase() === "select" ) {
|
|
2517 val = elem.selectedIndex;
|
|
2518 }
|
|
2519
|
|
2520 return val;
|
|
2521 },
|
|
2522
|
|
2523 testChange = function testChange( e ) {
|
|
2524 var elem = e.target, data, val;
|
|
2525
|
|
2526 if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
|
|
2527 return;
|
|
2528 }
|
|
2529
|
|
2530 data = jQuery.data( elem, "_change_data" );
|
|
2531 val = getVal(elem);
|
|
2532
|
|
2533 // the current data will be also retrieved by beforeactivate
|
|
2534 if ( e.type !== "focusout" || elem.type !== "radio" ) {
|
|
2535 jQuery.data( elem, "_change_data", val );
|
|
2536 }
|
|
2537
|
|
2538 if ( data === undefined || val === data ) {
|
|
2539 return;
|
|
2540 }
|
|
2541
|
|
2542 if ( data != null || val ) {
|
|
2543 e.type = "change";
|
|
2544 e.liveFired = undefined;
|
|
2545 return jQuery.event.trigger( e, arguments[1], elem );
|
|
2546 }
|
|
2547 };
|
|
2548
|
|
2549 jQuery.event.special.change = {
|
|
2550 filters: {
|
|
2551 focusout: testChange,
|
|
2552
|
|
2553 beforedeactivate: testChange,
|
|
2554
|
|
2555 click: function( e ) {
|
|
2556 var elem = e.target, type = elem.type;
|
|
2557
|
|
2558 if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
|
|
2559 return testChange.call( this, e );
|
|
2560 }
|
|
2561 },
|
|
2562
|
|
2563 // Change has to be called before submit
|
|
2564 // Keydown will be called before keypress, which is used in submit-event delegation
|
|
2565 keydown: function( e ) {
|
|
2566 var elem = e.target, type = elem.type;
|
|
2567
|
|
2568 if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
|
|
2569 (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
|
|
2570 type === "select-multiple" ) {
|
|
2571 return testChange.call( this, e );
|
|
2572 }
|
|
2573 },
|
|
2574
|
|
2575 // Beforeactivate happens also before the previous element is blurred
|
|
2576 // with this event you can't trigger a change event, but you can store
|
|
2577 // information
|
|
2578 beforeactivate: function( e ) {
|
|
2579 var elem = e.target;
|
|
2580 jQuery.data( elem, "_change_data", getVal(elem) );
|
|
2581 }
|
|
2582 },
|
|
2583
|
|
2584 setup: function( data, namespaces ) {
|
|
2585 if ( this.type === "file" ) {
|
|
2586 return false;
|
|
2587 }
|
|
2588
|
|
2589 for ( var type in changeFilters ) {
|
|
2590 jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
|
|
2591 }
|
|
2592
|
|
2593 return rformElems.test( this.nodeName );
|
|
2594 },
|
|
2595
|
|
2596 teardown: function( namespaces ) {
|
|
2597 jQuery.event.remove( this, ".specialChange" );
|
|
2598
|
|
2599 return rformElems.test( this.nodeName );
|
|
2600 }
|
|
2601 };
|
|
2602
|
|
2603 changeFilters = jQuery.event.special.change.filters;
|
|
2604
|
|
2605 // Handle when the input is .focus()'d
|
|
2606 changeFilters.focus = changeFilters.beforeactivate;
|
|
2607 }
|
|
2608
|
|
2609 function trigger( type, elem, args ) {
|
|
2610 args[0].type = type;
|
|
2611 return jQuery.event.handle.apply( elem, args );
|
|
2612 }
|
|
2613
|
|
2614 // Create "bubbling" focus and blur events
|
|
2615 if ( document.addEventListener ) {
|
|
2616 jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
|
|
2617 jQuery.event.special[ fix ] = {
|
|
2618 setup: function() {
|
|
2619 if ( focusCounts[fix]++ === 0 ) {
|
|
2620 document.addEventListener( orig, handler, true );
|
|
2621 }
|
|
2622 },
|
|
2623 teardown: function() {
|
|
2624 if ( --focusCounts[fix] === 0 ) {
|
|
2625 document.removeEventListener( orig, handler, true );
|
|
2626 }
|
|
2627 }
|
|
2628 };
|
|
2629
|
|
2630 function handler( e ) {
|
|
2631 e = jQuery.event.fix( e );
|
|
2632 e.type = fix;
|
|
2633 return jQuery.event.trigger( e, null, e.target );
|
|
2634 }
|
|
2635 });
|
|
2636 }
|
|
2637
|
|
2638 jQuery.each(["bind", "one"], function( i, name ) {
|
|
2639 jQuery.fn[ name ] = function( type, data, fn ) {
|
|
2640 // Handle object literals
|
|
2641 if ( typeof type === "object" ) {
|
|
2642 for ( var key in type ) {
|
|
2643 this[ name ](key, data, type[key], fn);
|
|
2644 }
|
|
2645 return this;
|
|
2646 }
|
|
2647
|
|
2648 if ( jQuery.isFunction( data ) || data === false ) {
|
|
2649 fn = data;
|
|
2650 data = undefined;
|
|
2651 }
|
|
2652
|
|
2653 var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
|
|
2654 jQuery( this ).unbind( event, handler );
|
|
2655 return fn.apply( this, arguments );
|
|
2656 }) : fn;
|
|
2657
|
|
2658 if ( type === "unload" && name !== "one" ) {
|
|
2659 this.one( type, data, fn );
|
|
2660
|
|
2661 } else {
|
|
2662 for ( var i = 0, l = this.length; i < l; i++ ) {
|
|
2663 jQuery.event.add( this[i], type, handler, data );
|
|
2664 }
|
|
2665 }
|
|
2666
|
|
2667 return this;
|
|
2668 };
|
|
2669 });
|
|
2670
|
|
2671 jQuery.fn.extend({
|
|
2672 unbind: function( type, fn ) {
|
|
2673 // Handle object literals
|
|
2674 if ( typeof type === "object" && !type.preventDefault ) {
|
|
2675 for ( var key in type ) {
|
|
2676 this.unbind(key, type[key]);
|
|
2677 }
|
|
2678
|
|
2679 } else {
|
|
2680 for ( var i = 0, l = this.length; i < l; i++ ) {
|
|
2681 jQuery.event.remove( this[i], type, fn );
|
|
2682 }
|
|
2683 }
|
|
2684
|
|
2685 return this;
|
|
2686 },
|
|
2687
|
|
2688 delegate: function( selector, types, data, fn ) {
|
|
2689 return this.live( types, data, fn, selector );
|
|
2690 },
|
|
2691
|
|
2692 undelegate: function( selector, types, fn ) {
|
|
2693 if ( arguments.length === 0 ) {
|
|
2694 return this.unbind( "live" );
|
|
2695
|
|
2696 } else {
|
|
2697 return this.die( types, null, fn, selector );
|
|
2698 }
|
|
2699 },
|
|
2700
|
|
2701 trigger: function( type, data ) {
|
|
2702 return this.each(function() {
|
|
2703 jQuery.event.trigger( type, data, this );
|
|
2704 });
|
|
2705 },
|
|
2706
|
|
2707 triggerHandler: function( type, data ) {
|
|
2708 if ( this[0] ) {
|
|
2709 var event = jQuery.Event( type );
|
|
2710 event.preventDefault();
|
|
2711 event.stopPropagation();
|
|
2712 jQuery.event.trigger( event, data, this[0] );
|
|
2713 return event.result;
|
|
2714 }
|
|
2715 },
|
|
2716
|
|
2717 toggle: function( fn ) {
|
|
2718 // Save reference to arguments for access in closure
|
|
2719 var args = arguments, i = 1;
|
|
2720
|
|
2721 // link all the functions, so any of them can unbind this click handler
|
|
2722 while ( i < args.length ) {
|
|
2723 jQuery.proxy( fn, args[ i++ ] );
|
|
2724 }
|
|
2725
|
|
2726 return this.click( jQuery.proxy( fn, function( event ) {
|
|
2727 // Figure out which function to execute
|
|
2728 var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
|
|
2729 jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
|
|
2730
|
|
2731 // Make sure that clicks stop
|
|
2732 event.preventDefault();
|
|
2733
|
|
2734 // and execute the function
|
|
2735 return args[ lastToggle ].apply( this, arguments ) || false;
|
|
2736 }));
|
|
2737 },
|
|
2738
|
|
2739 hover: function( fnOver, fnOut ) {
|
|
2740 return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
|
|
2741 }
|
|
2742 });
|
|
2743
|
|
2744 var liveMap = {
|
|
2745 focus: "focusin",
|
|
2746 blur: "focusout",
|
|
2747 mouseenter: "mouseover",
|
|
2748 mouseleave: "mouseout"
|
|
2749 };
|
|
2750
|
|
2751 jQuery.each(["live", "die"], function( i, name ) {
|
|
2752 jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
|
|
2753 var type, i = 0, match, namespaces, preType,
|
|
2754 selector = origSelector || this.selector,
|
|
2755 context = origSelector ? this : jQuery( this.context );
|
|
2756
|
|
2757 if ( typeof types === "object" && !types.preventDefault ) {
|
|
2758 for ( var key in types ) {
|
|
2759 context[ name ]( key, data, types[key], selector );
|
|
2760 }
|
|
2761
|
|
2762 return this;
|
|
2763 }
|
|
2764
|
|
2765 if ( jQuery.isFunction( data ) ) {
|
|
2766 fn = data;
|
|
2767 data = undefined;
|
|
2768 }
|
|
2769
|
|
2770 types = (types || "").split(" ");
|
|
2771
|
|
2772 while ( (type = types[ i++ ]) != null ) {
|
|
2773 match = rnamespaces.exec( type );
|
|
2774 namespaces = "";
|
|
2775
|
|
2776 if ( match ) {
|
|
2777 namespaces = match[0];
|
|
2778 type = type.replace( rnamespaces, "" );
|
|
2779 }
|
|
2780
|
|
2781 if ( type === "hover" ) {
|
|
2782 types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
|
|
2783 continue;
|
|
2784 }
|
|
2785
|
|
2786 preType = type;
|
|
2787
|
|
2788 if ( type === "focus" || type === "blur" ) {
|
|
2789 types.push( liveMap[ type ] + namespaces );
|
|
2790 type = type + namespaces;
|
|
2791
|
|
2792 } else {
|
|
2793 type = (liveMap[ type ] || type) + namespaces;
|
|
2794 }
|
|
2795
|
|
2796 if ( name === "live" ) {
|
|
2797 // bind live handler
|
|
2798 for ( var j = 0, l = context.length; j < l; j++ ) {
|
|
2799 jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
|
|
2800 { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
|
|
2801 }
|
|
2802
|
|
2803 } else {
|
|
2804 // unbind live handler
|
|
2805 context.unbind( "live." + liveConvert( type, selector ), fn );
|
|
2806 }
|
|
2807 }
|
|
2808
|
|
2809 return this;
|
|
2810 };
|
|
2811 });
|
|
2812
|
|
2813 function liveHandler( event ) {
|
|
2814 var stop, maxLevel, elems = [], selectors = [],
|
|
2815 related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
|
|
2816 events = jQuery.data( this, this.nodeType ? "events" : "__events__" );
|
|
2817
|
|
2818 if ( typeof events === "function" ) {
|
|
2819 events = events.events;
|
|
2820 }
|
|
2821
|
|
2822 // Make sure we avoid non-left-click bubbling in Firefox (#3861)
|
|
2823 if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) {
|
|
2824 return;
|
|
2825 }
|
|
2826
|
|
2827 if ( event.namespace ) {
|
|
2828 namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
|
|
2829 }
|
|
2830
|
|
2831 event.liveFired = this;
|
|
2832
|
|
2833 var live = events.live.slice(0);
|
|
2834
|
|
2835 for ( j = 0; j < live.length; j++ ) {
|
|
2836 handleObj = live[j];
|
|
2837
|
|
2838 if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
|
|
2839 selectors.push( handleObj.selector );
|
|
2840
|
|
2841 } else {
|
|
2842 live.splice( j--, 1 );
|
|
2843 }
|
|
2844 }
|
|
2845
|
|
2846 match = jQuery( event.target ).closest( selectors, event.currentTarget );
|
|
2847
|
|
2848 for ( i = 0, l = match.length; i < l; i++ ) {
|
|
2849 close = match[i];
|
|
2850
|
|
2851 for ( j = 0; j < live.length; j++ ) {
|
|
2852 handleObj = live[j];
|
|
2853
|
|
2854 if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) ) {
|
|
2855 elem = close.elem;
|
|
2856 related = null;
|
|
2857
|
|
2858 // Those two events require additional checking
|
|
2859 if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
|
|
2860 event.type = handleObj.preType;
|
|
2861 related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
|
|
2862 }
|
|
2863
|
|
2864 if ( !related || related !== elem ) {
|
|
2865 elems.push({ elem: elem, handleObj: handleObj, level: close.level });
|
|
2866 }
|
|
2867 }
|
|
2868 }
|
|
2869 }
|
|
2870
|
|
2871 for ( i = 0, l = elems.length; i < l; i++ ) {
|
|
2872 match = elems[i];
|
|
2873
|
|
2874 if ( maxLevel && match.level > maxLevel ) {
|
|
2875 break;
|
|
2876 }
|
|
2877
|
|
2878 event.currentTarget = match.elem;
|
|
2879 event.data = match.handleObj.data;
|
|
2880 event.handleObj = match.handleObj;
|
|
2881
|
|
2882 ret = match.handleObj.origHandler.apply( match.elem, arguments );
|
|
2883
|
|
2884 if ( ret === false || event.isPropagationStopped() ) {
|
|
2885 maxLevel = match.level;
|
|
2886
|
|
2887 if ( ret === false ) {
|
|
2888 stop = false;
|
|
2889 }
|
|
2890 }
|
|
2891 }
|
|
2892
|
|
2893 return stop;
|
|
2894 }
|
|
2895
|
|
2896 function liveConvert( type, selector ) {
|
|
2897 return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspace, "&");
|
|
2898 }
|
|
2899
|
|
2900 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
|
|
2901 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
|
|
2902 "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
|
|
2903
|
|
2904 // Handle event binding
|
|
2905 jQuery.fn[ name ] = function( data, fn ) {
|
|
2906 if ( fn == null ) {
|
|
2907 fn = data;
|
|
2908 data = null;
|
|
2909 }
|
|
2910
|
|
2911 return arguments.length > 0 ?
|
|
2912 this.bind( name, data, fn ) :
|
|
2913 this.trigger( name );
|
|
2914 };
|
|
2915
|
|
2916 if ( jQuery.attrFn ) {
|
|
2917 jQuery.attrFn[ name ] = true;
|
|
2918 }
|
|
2919 });
|
|
2920
|
|
2921 // Prevent memory leaks in IE
|
|
2922 // Window isn't included so as not to unbind existing unload events
|
|
2923 // More info:
|
|
2924 // - http://isaacschlueter.com/2006/10/msie-memory-leaks/
|
|
2925 if ( window.attachEvent && !window.addEventListener ) {
|
|
2926 jQuery(window).bind("unload", function() {
|
|
2927 for ( var id in jQuery.cache ) {
|
|
2928 if ( jQuery.cache[ id ].handle ) {
|
|
2929 // Try/Catch is to handle iframes being unloaded, see #4280
|
|
2930 try {
|
|
2931 jQuery.event.remove( jQuery.cache[ id ].handle.elem );
|
|
2932 } catch(e) {}
|
|
2933 }
|
|
2934 }
|
|
2935 });
|
|
2936 }
|
|
2937
|
|
2938
|
|
2939 /*!
|
|
2940 * Sizzle CSS Selector Engine - v1.0
|
|
2941 * Copyright 2009, The Dojo Foundation
|
|
2942 * Released under the MIT, BSD, and GPL Licenses.
|
|
2943 * More information: http://sizzlejs.com/
|
|
2944 */
|
|
2945 (function(){
|
|
2946
|
|
2947 var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
|
|
2948 done = 0,
|
|
2949 toString = Object.prototype.toString,
|
|
2950 hasDuplicate = false,
|
|
2951 baseHasDuplicate = true;
|
|
2952
|
|
2953 // Here we check if the JavaScript engine is using some sort of
|
|
2954 // optimization where it does not always call our comparision
|
|
2955 // function. If that is the case, discard the hasDuplicate value.
|
|
2956 // Thus far that includes Google Chrome.
|
|
2957 [0, 0].sort(function(){
|
|
2958 baseHasDuplicate = false;
|
|
2959 return 0;
|
|
2960 });
|
|
2961
|
|
2962 var Sizzle = function(selector, context, results, seed) {
|
|
2963 results = results || [];
|
|
2964 context = context || document;
|
|
2965
|
|
2966 var origContext = context;
|
|
2967
|
|
2968 if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
|
|
2969 return [];
|
|
2970 }
|
|
2971
|
|
2972 if ( !selector || typeof selector !== "string" ) {
|
|
2973 return results;
|
|
2974 }
|
|
2975
|
|
2976 var parts = [], m, set, checkSet, extra, prune = true, contextXML = Sizzle.isXML(context),
|
|
2977 soFar = selector, ret, cur, pop, i;
|
|
2978
|
|
2979 // Reset the position of the chunker regexp (start from head)
|
|
2980 do {
|
|
2981 chunker.exec("");
|
|
2982 m = chunker.exec(soFar);
|
|
2983
|
|
2984 if ( m ) {
|
|
2985 soFar = m[3];
|
|
2986
|
|
2987 parts.push( m[1] );
|
|
2988
|
|
2989 if ( m[2] ) {
|
|
2990 extra = m[3];
|
|
2991 break;
|
|
2992 }
|
|
2993 }
|
|
2994 } while ( m );
|
|
2995
|
|
2996 if ( parts.length > 1 && origPOS.exec( selector ) ) {
|
|
2997 if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
|
|
2998 set = posProcess( parts[0] + parts[1], context );
|
|
2999 } else {
|
|
3000 set = Expr.relative[ parts[0] ] ?
|
|
3001 [ context ] :
|
|
3002 Sizzle( parts.shift(), context );
|
|
3003
|
|
3004 while ( parts.length ) {
|
|
3005 selector = parts.shift();
|
|
3006
|
|
3007 if ( Expr.relative[ selector ] ) {
|
|
3008 selector += parts.shift();
|
|
3009 }
|
|
3010
|
|
3011 set = posProcess( selector, set );
|
|
3012 }
|
|
3013 }
|
|
3014 } else {
|
|
3015 // Take a shortcut and set the context if the root selector is an ID
|
|
3016 // (but not if it'll be faster if the inner selector is an ID)
|
|
3017 if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
|
|
3018 Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
|
|
3019 ret = Sizzle.find( parts.shift(), context, contextXML );
|
|
3020 context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
|
|
3021 }
|
|
3022
|
|
3023 if ( context ) {
|
|
3024 ret = seed ?
|
|
3025 { expr: parts.pop(), set: makeArray(seed) } :
|
|
3026 Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
|
|
3027 set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
|
|
3028
|
|
3029 if ( parts.length > 0 ) {
|
|
3030 checkSet = makeArray(set);
|
|
3031 } else {
|
|
3032 prune = false;
|
|
3033 }
|
|
3034
|
|
3035 while ( parts.length ) {
|
|
3036 cur = parts.pop();
|
|
3037 pop = cur;
|
|
3038
|
|
3039 if ( !Expr.relative[ cur ] ) {
|
|
3040 cur = "";
|
|
3041 } else {
|
|
3042 pop = parts.pop();
|
|
3043 }
|
|
3044
|
|
3045 if ( pop == null ) {
|
|
3046 pop = context;
|
|
3047 }
|
|
3048
|
|
3049 Expr.relative[ cur ]( checkSet, pop, contextXML );
|
|
3050 }
|
|
3051 } else {
|
|
3052 checkSet = parts = [];
|
|
3053 }
|
|
3054 }
|
|
3055
|
|
3056 if ( !checkSet ) {
|
|
3057 checkSet = set;
|
|
3058 }
|
|
3059
|
|
3060 if ( !checkSet ) {
|
|
3061 Sizzle.error( cur || selector );
|
|
3062 }
|
|
3063
|
|
3064 if ( toString.call(checkSet) === "[object Array]" ) {
|
|
3065 if ( !prune ) {
|
|
3066 results.push.apply( results, checkSet );
|
|
3067 } else if ( context && context.nodeType === 1 ) {
|
|
3068 for ( i = 0; checkSet[i] != null; i++ ) {
|
|
3069 if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
|
|
3070 results.push( set[i] );
|
|
3071 }
|
|
3072 }
|
|
3073 } else {
|
|
3074 for ( i = 0; checkSet[i] != null; i++ ) {
|
|
3075 if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
|
|
3076 results.push( set[i] );
|
|
3077 }
|
|
3078 }
|
|
3079 }
|
|
3080 } else {
|
|
3081 makeArray( checkSet, results );
|
|
3082 }
|
|
3083
|
|
3084 if ( extra ) {
|
|
3085 Sizzle( extra, origContext, results, seed );
|
|
3086 Sizzle.uniqueSort( results );
|
|
3087 }
|
|
3088
|
|
3089 return results;
|
|
3090 };
|
|
3091
|
|
3092 Sizzle.uniqueSort = function(results){
|
|
3093 if ( sortOrder ) {
|
|
3094 hasDuplicate = baseHasDuplicate;
|
|
3095 results.sort(sortOrder);
|
|
3096
|
|
3097 if ( hasDuplicate ) {
|
|
3098 for ( var i = 1; i < results.length; i++ ) {
|
|
3099 if ( results[i] === results[i-1] ) {
|
|
3100 results.splice(i--, 1);
|
|
3101 }
|
|
3102 }
|
|
3103 }
|
|
3104 }
|
|
3105
|
|
3106 return results;
|
|
3107 };
|
|
3108
|
|
3109 Sizzle.matches = function(expr, set){
|
|
3110 return Sizzle(expr, null, null, set);
|
|
3111 };
|
|
3112
|
|
3113 Sizzle.matchesSelector = function(node, expr){
|
|
3114 return Sizzle(expr, null, null, [node]).length > 0;
|
|
3115 };
|
|
3116
|
|
3117 Sizzle.find = function(expr, context, isXML){
|
|
3118 var set;
|
|
3119
|
|
3120 if ( !expr ) {
|
|
3121 return [];
|
|
3122 }
|
|
3123
|
|
3124 for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
|
|
3125 var type = Expr.order[i], match;
|
|
3126
|
|
3127 if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
|
|
3128 var left = match[1];
|
|
3129 match.splice(1,1);
|
|
3130
|
|
3131 if ( left.substr( left.length - 1 ) !== "\\" ) {
|
|
3132 match[1] = (match[1] || "").replace(/\\/g, "");
|
|
3133 set = Expr.find[ type ]( match, context, isXML );
|
|
3134 if ( set != null ) {
|
|
3135 expr = expr.replace( Expr.match[ type ], "" );
|
|
3136 break;
|
|
3137 }
|
|
3138 }
|
|
3139 }
|
|
3140 }
|
|
3141
|
|
3142 if ( !set ) {
|
|
3143 set = context.getElementsByTagName("*");
|
|
3144 }
|
|
3145
|
|
3146 return {set: set, expr: expr};
|
|
3147 };
|
|
3148
|
|
3149 Sizzle.filter = function(expr, set, inplace, not){
|
|
3150 var old = expr, result = [], curLoop = set, match, anyFound,
|
|
3151 isXMLFilter = set && set[0] && Sizzle.isXML(set[0]);
|
|
3152
|
|
3153 while ( expr && set.length ) {
|
|
3154 for ( var type in Expr.filter ) {
|
|
3155 if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
|
|
3156 var filter = Expr.filter[ type ], found, item, left = match[1];
|
|
3157 anyFound = false;
|
|
3158
|
|
3159 match.splice(1,1);
|
|
3160
|
|
3161 if ( left.substr( left.length - 1 ) === "\\" ) {
|
|
3162 continue;
|
|
3163 }
|
|
3164
|
|
3165 if ( curLoop === result ) {
|
|
3166 result = [];
|
|
3167 }
|
|
3168
|
|
3169 if ( Expr.preFilter[ type ] ) {
|
|
3170 match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
|
|
3171
|
|
3172 if ( !match ) {
|
|
3173 anyFound = found = true;
|
|
3174 } else if ( match === true ) {
|
|
3175 continue;
|
|
3176 }
|
|
3177 }
|
|
3178
|
|
3179 if ( match ) {
|
|
3180 for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
|
|
3181 if ( item ) {
|
|
3182 found = filter( item, match, i, curLoop );
|
|
3183 var pass = not ^ !!found;
|
|
3184
|
|
3185 if ( inplace && found != null ) {
|
|
3186 if ( pass ) {
|
|
3187 anyFound = true;
|
|
3188 } else {
|
|
3189 curLoop[i] = false;
|
|
3190 }
|
|
3191 } else if ( pass ) {
|
|
3192 result.push( item );
|
|
3193 anyFound = true;
|
|
3194 }
|
|
3195 }
|
|
3196 }
|
|
3197 }
|
|
3198
|
|
3199 if ( found !== undefined ) {
|
|
3200 if ( !inplace ) {
|
|
3201 curLoop = result;
|
|
3202 }
|
|
3203
|
|
3204 expr = expr.replace( Expr.match[ type ], "" );
|
|
3205
|
|
3206 if ( !anyFound ) {
|
|
3207 return [];
|
|
3208 }
|
|
3209
|
|
3210 break;
|
|
3211 }
|
|
3212 }
|
|
3213 }
|
|
3214
|
|
3215 // Improper expression
|
|
3216 if ( expr === old ) {
|
|
3217 if ( anyFound == null ) {
|
|
3218 Sizzle.error( expr );
|
|
3219 } else {
|
|
3220 break;
|
|
3221 }
|
|
3222 }
|
|
3223
|
|
3224 old = expr;
|
|
3225 }
|
|
3226
|
|
3227 return curLoop;
|
|
3228 };
|
|
3229
|
|
3230 Sizzle.error = function( msg ) {
|
|
3231 throw "Syntax error, unrecognized expression: " + msg;
|
|
3232 };
|
|
3233
|
|
3234 var Expr = Sizzle.selectors = {
|
|
3235 order: [ "ID", "NAME", "TAG" ],
|
|
3236 match: {
|
|
3237 ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
|
|
3238 CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
|
|
3239 NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
|
|
3240 ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
|
|
3241 TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
|
|
3242 CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
|
|
3243 POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
|
|
3244 PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
|
|
3245 },
|
|
3246 leftMatch: {},
|
|
3247 attrMap: {
|
|
3248 "class": "className",
|
|
3249 "for": "htmlFor"
|
|
3250 },
|
|
3251 attrHandle: {
|
|
3252 href: function(elem){
|
|
3253 return elem.getAttribute("href");
|
|
3254 }
|
|
3255 },
|
|
3256 relative: {
|
|
3257 "+": function(checkSet, part){
|
|
3258 var isPartStr = typeof part === "string",
|
|
3259 isTag = isPartStr && !/\W/.test(part),
|
|
3260 isPartStrNotTag = isPartStr && !isTag;
|
|
3261
|
|
3262 if ( isTag ) {
|
|
3263 part = part.toLowerCase();
|
|
3264 }
|
|
3265
|
|
3266 for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
|
|
3267 if ( (elem = checkSet[i]) ) {
|
|
3268 while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
|
|
3269
|
|
3270 checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
|
|
3271 elem || false :
|
|
3272 elem === part;
|
|
3273 }
|
|
3274 }
|
|
3275
|
|
3276 if ( isPartStrNotTag ) {
|
|
3277 Sizzle.filter( part, checkSet, true );
|
|
3278 }
|
|
3279 },
|
|
3280 ">": function(checkSet, part){
|
|
3281 var isPartStr = typeof part === "string",
|
|
3282 elem, i = 0, l = checkSet.length;
|
|
3283
|
|
3284 if ( isPartStr && !/\W/.test(part) ) {
|
|
3285 part = part.toLowerCase();
|
|
3286
|
|
3287 for ( ; i < l; i++ ) {
|
|
3288 elem = checkSet[i];
|
|
3289 if ( elem ) {
|
|
3290 var parent = elem.parentNode;
|
|
3291 checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
|
|
3292 }
|
|
3293 }
|
|
3294 } else {
|
|
3295 for ( ; i < l; i++ ) {
|
|
3296 elem = checkSet[i];
|
|
3297 if ( elem ) {
|
|
3298 checkSet[i] = isPartStr ?
|
|
3299 elem.parentNode :
|
|
3300 elem.parentNode === part;
|
|
3301 }
|
|
3302 }
|
|
3303
|
|
3304 if ( isPartStr ) {
|
|
3305 Sizzle.filter( part, checkSet, true );
|
|
3306 }
|
|
3307 }
|
|
3308 },
|
|
3309 "": function(checkSet, part, isXML){
|
|
3310 var doneName = done++, checkFn = dirCheck, nodeCheck;
|
|
3311
|
|
3312 if ( typeof part === "string" && !/\W/.test(part) ) {
|
|
3313 part = part.toLowerCase();
|
|
3314 nodeCheck = part;
|
|
3315 checkFn = dirNodeCheck;
|
|
3316 }
|
|
3317
|
|
3318 checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
|
|
3319 },
|
|
3320 "~": function(checkSet, part, isXML){
|
|
3321 var doneName = done++, checkFn = dirCheck, nodeCheck;
|
|
3322
|
|
3323 if ( typeof part === "string" && !/\W/.test(part) ) {
|
|
3324 part = part.toLowerCase();
|
|
3325 nodeCheck = part;
|
|
3326 checkFn = dirNodeCheck;
|
|
3327 }
|
|
3328
|
|
3329 checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
|
|
3330 }
|
|
3331 },
|
|
3332 find: {
|
|
3333 ID: function(match, context, isXML){
|
|
3334 if ( typeof context.getElementById !== "undefined" && !isXML ) {
|
|
3335 var m = context.getElementById(match[1]);
|
|
3336 // Check parentNode to catch when Blackberry 4.6 returns
|
|
3337 // nodes that are no longer in the document #6963
|
|
3338 return m && m.parentNode ? [m] : [];
|
|
3339 }
|
|
3340 },
|
|
3341 NAME: function(match, context){
|
|
3342 if ( typeof context.getElementsByName !== "undefined" ) {
|
|
3343 var ret = [], results = context.getElementsByName(match[1]);
|
|
3344
|
|
3345 for ( var i = 0, l = results.length; i < l; i++ ) {
|
|
3346 if ( results[i].getAttribute("name") === match[1] ) {
|
|
3347 ret.push( results[i] );
|
|
3348 }
|
|
3349 }
|
|
3350
|
|
3351 return ret.length === 0 ? null : ret;
|
|
3352 }
|
|
3353 },
|
|
3354 TAG: function(match, context){
|
|
3355 return context.getElementsByTagName(match[1]);
|
|
3356 }
|
|
3357 },
|
|
3358 preFilter: {
|
|
3359 CLASS: function(match, curLoop, inplace, result, not, isXML){
|
|
3360 match = " " + match[1].replace(/\\/g, "") + " ";
|
|
3361
|
|
3362 if ( isXML ) {
|
|
3363 return match;
|
|
3364 }
|
|
3365
|
|
3366 for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
|
|
3367 if ( elem ) {
|
|
3368 if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) {
|
|
3369 if ( !inplace ) {
|
|
3370 result.push( elem );
|
|
3371 }
|
|
3372 } else if ( inplace ) {
|
|
3373 curLoop[i] = false;
|
|
3374 }
|
|
3375 }
|
|
3376 }
|
|
3377
|
|
3378 return false;
|
|
3379 },
|
|
3380 ID: function(match){
|
|
3381 return match[1].replace(/\\/g, "");
|
|
3382 },
|
|
3383 TAG: function(match, curLoop){
|
|
3384 return match[1].toLowerCase();
|
|
3385 },
|
|
3386 CHILD: function(match){
|
|
3387 if ( match[1] === "nth" ) {
|
|
3388 // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
|
|
3389 var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
|
|
3390 match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
|
|
3391 !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
|
|
3392
|
|
3393 // calculate the numbers (first)n+(last) including if they are negative
|
|
3394 match[2] = (test[1] + (test[2] || 1)) - 0;
|
|
3395 match[3] = test[3] - 0;
|
|
3396 }
|
|
3397
|
|
3398 // TODO: Move to normal caching system
|
|
3399 match[0] = done++;
|
|
3400
|
|
3401 return match;
|
|
3402 },
|
|
3403 ATTR: function(match, curLoop, inplace, result, not, isXML){
|
|
3404 var name = match[1].replace(/\\/g, "");
|
|
3405
|
|
3406 if ( !isXML && Expr.attrMap[name] ) {
|
|
3407 match[1] = Expr.attrMap[name];
|
|
3408 }
|
|
3409
|
|
3410 if ( match[2] === "~=" ) {
|
|
3411 match[4] = " " + match[4] + " ";
|
|
3412 }
|
|
3413
|
|
3414 return match;
|
|
3415 },
|
|
3416 PSEUDO: function(match, curLoop, inplace, result, not){
|
|
3417 if ( match[1] === "not" ) {
|
|
3418 // If we're dealing with a complex expression, or a simple one
|
|
3419 if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
|
|
3420 match[3] = Sizzle(match[3], null, null, curLoop);
|
|
3421 } else {
|
|
3422 var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
|
|
3423 if ( !inplace ) {
|
|
3424 result.push.apply( result, ret );
|
|
3425 }
|
|
3426 return false;
|
|
3427 }
|
|
3428 } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
|
|
3429 return true;
|
|
3430 }
|
|
3431
|
|
3432 return match;
|
|
3433 },
|
|
3434 POS: function(match){
|
|
3435 match.unshift( true );
|
|
3436 return match;
|
|
3437 }
|
|
3438 },
|
|
3439 filters: {
|
|
3440 enabled: function(elem){
|
|
3441 return elem.disabled === false && elem.type !== "hidden";
|
|
3442 },
|
|
3443 disabled: function(elem){
|
|
3444 return elem.disabled === true;
|
|
3445 },
|
|
3446 checked: function(elem){
|
|
3447 return elem.checked === true;
|
|
3448 },
|
|
3449 selected: function(elem){
|
|
3450 // Accessing this property makes selected-by-default
|
|
3451 // options in Safari work properly
|
|
3452 elem.parentNode.selectedIndex;
|
|
3453 return elem.selected === true;
|
|
3454 },
|
|
3455 parent: function(elem){
|
|
3456 return !!elem.firstChild;
|
|
3457 },
|
|
3458 empty: function(elem){
|
|
3459 return !elem.firstChild;
|
|
3460 },
|
|
3461 has: function(elem, i, match){
|
|
3462 return !!Sizzle( match[3], elem ).length;
|
|
3463 },
|
|
3464 header: function(elem){
|
|
3465 return (/h\d/i).test( elem.nodeName );
|
|
3466 },
|
|
3467 text: function(elem){
|
|
3468 return "text" === elem.type;
|
|
3469 },
|
|
3470 radio: function(elem){
|
|
3471 return "radio" === elem.type;
|
|
3472 },
|
|
3473 checkbox: function(elem){
|
|
3474 return "checkbox" === elem.type;
|
|
3475 },
|
|
3476 file: function(elem){
|
|
3477 return "file" === elem.type;
|
|
3478 },
|
|
3479 password: function(elem){
|
|
3480 return "password" === elem.type;
|
|
3481 },
|
|
3482 submit: function(elem){
|
|
3483 return "submit" === elem.type;
|
|
3484 },
|
|
3485 image: function(elem){
|
|
3486 return "image" === elem.type;
|
|
3487 },
|
|
3488 reset: function(elem){
|
|
3489 return "reset" === elem.type;
|
|
3490 },
|
|
3491 button: function(elem){
|
|
3492 return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
|
|
3493 },
|
|
3494 input: function(elem){
|
|
3495 return (/input|select|textarea|button/i).test(elem.nodeName);
|
|
3496 }
|
|
3497 },
|
|
3498 setFilters: {
|
|
3499 first: function(elem, i){
|
|
3500 return i === 0;
|
|
3501 },
|
|
3502 last: function(elem, i, match, array){
|
|
3503 return i === array.length - 1;
|
|
3504 },
|
|
3505 even: function(elem, i){
|
|
3506 return i % 2 === 0;
|
|
3507 },
|
|
3508 odd: function(elem, i){
|
|
3509 return i % 2 === 1;
|
|
3510 },
|
|
3511 lt: function(elem, i, match){
|
|
3512 return i < match[3] - 0;
|
|
3513 },
|
|
3514 gt: function(elem, i, match){
|
|
3515 return i > match[3] - 0;
|
|
3516 },
|
|
3517 nth: function(elem, i, match){
|
|
3518 return match[3] - 0 === i;
|
|
3519 },
|
|
3520 eq: function(elem, i, match){
|
|
3521 return match[3] - 0 === i;
|
|
3522 }
|
|
3523 },
|
|
3524 filter: {
|
|
3525 PSEUDO: function(elem, match, i, array){
|
|
3526 var name = match[1], filter = Expr.filters[ name ];
|
|
3527
|
|
3528 if ( filter ) {
|
|
3529 return filter( elem, i, match, array );
|
|
3530 } else if ( name === "contains" ) {
|
|
3531 return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
|
|
3532 } else if ( name === "not" ) {
|
|
3533 var not = match[3];
|
|
3534
|
|
3535 for ( var j = 0, l = not.length; j < l; j++ ) {
|
|
3536 if ( not[j] === elem ) {
|
|
3537 return false;
|
|
3538 }
|
|
3539 }
|
|
3540
|
|
3541 return true;
|
|
3542 } else {
|
|
3543 Sizzle.error( "Syntax error, unrecognized expression: " + name );
|
|
3544 }
|
|
3545 },
|
|
3546 CHILD: function(elem, match){
|
|
3547 var type = match[1], node = elem;
|
|
3548 switch (type) {
|
|
3549 case 'only':
|
|
3550 case 'first':
|
|
3551 while ( (node = node.previousSibling) ) {
|
|
3552 if ( node.nodeType === 1 ) {
|
|
3553 return false;
|
|
3554 }
|
|
3555 }
|
|
3556 if ( type === "first" ) {
|
|
3557 return true;
|
|
3558 }
|
|
3559 node = elem;
|
|
3560 case 'last':
|
|
3561 while ( (node = node.nextSibling) ) {
|
|
3562 if ( node.nodeType === 1 ) {
|
|
3563 return false;
|
|
3564 }
|
|
3565 }
|
|
3566 return true;
|
|
3567 case 'nth':
|
|
3568 var first = match[2], last = match[3];
|
|
3569
|
|
3570 if ( first === 1 && last === 0 ) {
|
|
3571 return true;
|
|
3572 }
|
|
3573
|
|
3574 var doneName = match[0],
|
|
3575 parent = elem.parentNode;
|
|
3576
|
|
3577 if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
|
|
3578 var count = 0;
|
|
3579 for ( node = parent.firstChild; node; node = node.nextSibling ) {
|
|
3580 if ( node.nodeType === 1 ) {
|
|
3581 node.nodeIndex = ++count;
|
|
3582 }
|
|
3583 }
|
|
3584 parent.sizcache = doneName;
|
|
3585 }
|
|
3586
|
|
3587 var diff = elem.nodeIndex - last;
|
|
3588 if ( first === 0 ) {
|
|
3589 return diff === 0;
|
|
3590 } else {
|
|
3591 return ( diff % first === 0 && diff / first >= 0 );
|
|
3592 }
|
|
3593 }
|
|
3594 },
|
|
3595 ID: function(elem, match){
|
|
3596 return elem.nodeType === 1 && elem.getAttribute("id") === match;
|
|
3597 },
|
|
3598 TAG: function(elem, match){
|
|
3599 return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
|
|
3600 },
|
|
3601 CLASS: function(elem, match){
|
|
3602 return (" " + (elem.className || elem.getAttribute("class")) + " ")
|
|
3603 .indexOf( match ) > -1;
|
|
3604 },
|
|
3605 ATTR: function(elem, match){
|
|
3606 var name = match[1],
|
|
3607 result = Expr.attrHandle[ name ] ?
|
|
3608 Expr.attrHandle[ name ]( elem ) :
|
|
3609 elem[ name ] != null ?
|
|
3610 elem[ name ] :
|
|
3611 elem.getAttribute( name ),
|
|
3612 value = result + "",
|
|
3613 type = match[2],
|
|
3614 check = match[4];
|
|
3615
|
|
3616 return result == null ?
|
|
3617 type === "!=" :
|
|
3618 type === "=" ?
|
|
3619 value === check :
|
|
3620 type === "*=" ?
|
|
3621 value.indexOf(check) >= 0 :
|
|
3622 type === "~=" ?
|
|
3623 (" " + value + " ").indexOf(check) >= 0 :
|
|
3624 !check ?
|
|
3625 value && result !== false :
|
|
3626 type === "!=" ?
|
|
3627 value !== check :
|
|
3628 type === "^=" ?
|
|
3629 value.indexOf(check) === 0 :
|
|
3630 type === "$=" ?
|
|
3631 value.substr(value.length - check.length) === check :
|
|
3632 type === "|=" ?
|
|
3633 value === check || value.substr(0, check.length + 1) === check + "-" :
|
|
3634 false;
|
|
3635 },
|
|
3636 POS: function(elem, match, i, array){
|
|
3637 var name = match[2], filter = Expr.setFilters[ name ];
|
|
3638
|
|
3639 if ( filter ) {
|
|
3640 return filter( elem, i, match, array );
|
|
3641 }
|
|
3642 }
|
|
3643 }
|
|
3644 };
|
|
3645
|
|
3646 var origPOS = Expr.match.POS,
|
|
3647 fescape = function(all, num){
|
|
3648 return "\\" + (num - 0 + 1);
|
|
3649 };
|
|
3650
|
|
3651 for ( var type in Expr.match ) {
|
|
3652 Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
|
|
3653 Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
|
|
3654 }
|
|
3655
|
|
3656 var makeArray = function(array, results) {
|
|
3657 array = Array.prototype.slice.call( array, 0 );
|
|
3658
|
|
3659 if ( results ) {
|
|
3660 results.push.apply( results, array );
|
|
3661 return results;
|
|
3662 }
|
|
3663
|
|
3664 return array;
|
|
3665 };
|
|
3666
|
|
3667 // Perform a simple check to determine if the browser is capable of
|
|
3668 // converting a NodeList to an array using builtin methods.
|
|
3669 // Also verifies that the returned array holds DOM nodes
|
|
3670 // (which is not the case in the Blackberry browser)
|
|
3671 try {
|
|
3672 Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
|
|
3673
|
|
3674 // Provide a fallback method if it does not work
|
|
3675 } catch(e){
|
|
3676 makeArray = function(array, results) {
|
|
3677 var ret = results || [], i = 0;
|
|
3678
|
|
3679 if ( toString.call(array) === "[object Array]" ) {
|
|
3680 Array.prototype.push.apply( ret, array );
|
|
3681 } else {
|
|
3682 if ( typeof array.length === "number" ) {
|
|
3683 for ( var l = array.length; i < l; i++ ) {
|
|
3684 ret.push( array[i] );
|
|
3685 }
|
|
3686 } else {
|
|
3687 for ( ; array[i]; i++ ) {
|
|
3688 ret.push( array[i] );
|
|
3689 }
|
|
3690 }
|
|
3691 }
|
|
3692
|
|
3693 return ret;
|
|
3694 };
|
|
3695 }
|
|
3696
|
|
3697 var sortOrder, siblingCheck;
|
|
3698
|
|
3699 if ( document.documentElement.compareDocumentPosition ) {
|
|
3700 sortOrder = function( a, b ) {
|
|
3701 if ( a === b ) {
|
|
3702 hasDuplicate = true;
|
|
3703 return 0;
|
|
3704 }
|
|
3705
|
|
3706 if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
|
|
3707 return a.compareDocumentPosition ? -1 : 1;
|
|
3708 }
|
|
3709
|
|
3710 return a.compareDocumentPosition(b) & 4 ? -1 : 1;
|
|
3711 };
|
|
3712 } else {
|
|
3713 sortOrder = function( a, b ) {
|
|
3714 var ap = [], bp = [], aup = a.parentNode, bup = b.parentNode,
|
|
3715 cur = aup, al, bl;
|
|
3716
|
|
3717 // The nodes are identical, we can exit early
|
|
3718 if ( a === b ) {
|
|
3719 hasDuplicate = true;
|
|
3720 return 0;
|
|
3721
|
|
3722 // If the nodes are siblings (or identical) we can do a quick check
|
|
3723 } else if ( aup === bup ) {
|
|
3724 return siblingCheck( a, b );
|
|
3725
|
|
3726 // If no parents were found then the nodes are disconnected
|
|
3727 } else if ( !aup ) {
|
|
3728 return -1;
|
|
3729
|
|
3730 } else if ( !bup ) {
|
|
3731 return 1;
|
|
3732 }
|
|
3733
|
|
3734 // Otherwise they're somewhere else in the tree so we need
|
|
3735 // to build up a full list of the parentNodes for comparison
|
|
3736 while ( cur ) {
|
|
3737 ap.unshift( cur );
|
|
3738 cur = cur.parentNode;
|
|
3739 }
|
|
3740
|
|
3741 cur = bup;
|
|
3742
|
|
3743 while ( cur ) {
|
|
3744 bp.unshift( cur );
|
|
3745 cur = cur.parentNode;
|
|
3746 }
|
|
3747
|
|
3748 al = ap.length;
|
|
3749 bl = bp.length;
|
|
3750
|
|
3751 // Start walking down the tree looking for a discrepancy
|
|
3752 for ( var i = 0; i < al && i < bl; i++ ) {
|
|
3753 if ( ap[i] !== bp[i] ) {
|
|
3754 return siblingCheck( ap[i], bp[i] );
|
|
3755 }
|
|
3756 }
|
|
3757
|
|
3758 // We ended someplace up the tree so do a sibling check
|
|
3759 return i === al ?
|
|
3760 siblingCheck( a, bp[i], -1 ) :
|
|
3761 siblingCheck( ap[i], b, 1 );
|
|
3762 };
|
|
3763
|
|
3764 siblingCheck = function( a, b, ret ) {
|
|
3765 if ( a === b ) {
|
|
3766 return ret;
|
|
3767 }
|
|
3768
|
|
3769 var cur = a.nextSibling;
|
|
3770
|
|
3771 while ( cur ) {
|
|
3772 if ( cur === b ) {
|
|
3773 return -1;
|
|
3774 }
|
|
3775
|
|
3776 cur = cur.nextSibling;
|
|
3777 }
|
|
3778
|
|
3779 return 1;
|
|
3780 };
|
|
3781 }
|
|
3782
|
|
3783 // Utility function for retreiving the text value of an array of DOM nodes
|
|
3784 Sizzle.getText = function( elems ) {
|
|
3785 var ret = "", elem;
|
|
3786
|
|
3787 for ( var i = 0; elems[i]; i++ ) {
|
|
3788 elem = elems[i];
|
|
3789
|
|
3790 // Get the text from text nodes and CDATA nodes
|
|
3791 if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
|
|
3792 ret += elem.nodeValue;
|
|
3793
|
|
3794 // Traverse everything else, except comment nodes
|
|
3795 } else if ( elem.nodeType !== 8 ) {
|
|
3796 ret += Sizzle.getText( elem.childNodes );
|
|
3797 }
|
|
3798 }
|
|
3799
|
|
3800 return ret;
|
|
3801 };
|
|
3802
|
|
3803 // Check to see if the browser returns elements by name when
|
|
3804 // querying by getElementById (and provide a workaround)
|
|
3805 (function(){
|
|
3806 // We're going to inject a fake input element with a specified name
|
|
3807 var form = document.createElement("div"),
|
|
3808 id = "script" + (new Date()).getTime();
|
|
3809 form.innerHTML = "<a name='" + id + "'/>";
|
|
3810
|
|
3811 // Inject it into the root element, check its status, and remove it quickly
|
|
3812 var root = document.documentElement;
|
|
3813 root.insertBefore( form, root.firstChild );
|
|
3814
|
|
3815 // The workaround has to do additional checks after a getElementById
|
|
3816 // Which slows things down for other browsers (hence the branching)
|
|
3817 if ( document.getElementById( id ) ) {
|
|
3818 Expr.find.ID = function(match, context, isXML){
|
|
3819 if ( typeof context.getElementById !== "undefined" && !isXML ) {
|
|
3820 var m = context.getElementById(match[1]);
|
|
3821 return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
|
|
3822 }
|
|
3823 };
|
|
3824
|
|
3825 Expr.filter.ID = function(elem, match){
|
|
3826 var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
|
|
3827 return elem.nodeType === 1 && node && node.nodeValue === match;
|
|
3828 };
|
|
3829 }
|
|
3830
|
|
3831 root.removeChild( form );
|
|
3832 root = form = null; // release memory in IE
|
|
3833 })();
|
|
3834
|
|
3835 (function(){
|
|
3836 // Check to see if the browser returns only elements
|
|
3837 // when doing getElementsByTagName("*")
|
|
3838
|
|
3839 // Create a fake element
|
|
3840 var div = document.createElement("div");
|
|
3841 div.appendChild( document.createComment("") );
|
|
3842
|
|
3843 // Make sure no comments are found
|
|
3844 if ( div.getElementsByTagName("*").length > 0 ) {
|
|
3845 Expr.find.TAG = function(match, context){
|
|
3846 var results = context.getElementsByTagName(match[1]);
|
|
3847
|
|
3848 // Filter out possible comments
|
|
3849 if ( match[1] === "*" ) {
|
|
3850 var tmp = [];
|
|
3851
|
|
3852 for ( var i = 0; results[i]; i++ ) {
|
|
3853 if ( results[i].nodeType === 1 ) {
|
|
3854 tmp.push( results[i] );
|
|
3855 }
|
|
3856 }
|
|
3857
|
|
3858 results = tmp;
|
|
3859 }
|
|
3860
|
|
3861 return results;
|
|
3862 };
|
|
3863 }
|
|
3864
|
|
3865 // Check to see if an attribute returns normalized href attributes
|
|
3866 div.innerHTML = "<a href='#'></a>";
|
|
3867 if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
|
|
3868 div.firstChild.getAttribute("href") !== "#" ) {
|
|
3869 Expr.attrHandle.href = function(elem){
|
|
3870 return elem.getAttribute("href", 2);
|
|
3871 };
|
|
3872 }
|
|
3873
|
|
3874 div = null; // release memory in IE
|
|
3875 })();
|
|
3876
|
|
3877 if ( document.querySelectorAll ) {
|
|
3878 (function(){
|
|
3879 var oldSizzle = Sizzle, div = document.createElement("div");
|
|
3880 div.innerHTML = "<p class='TEST'></p>";
|
|
3881
|
|
3882 // Safari can't handle uppercase or unicode characters when
|
|
3883 // in quirks mode.
|
|
3884 if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
|
|
3885 return;
|
|
3886 }
|
|
3887
|
|
3888 Sizzle = function(query, context, extra, seed){
|
|
3889 context = context || document;
|
|
3890
|
|
3891 // Only use querySelectorAll on non-XML documents
|
|
3892 // (ID selectors don't work in non-HTML documents)
|
|
3893 if ( !seed && !Sizzle.isXML(context) ) {
|
|
3894 if ( context.nodeType === 9 ) {
|
|
3895 try {
|
|
3896 return makeArray( context.querySelectorAll(query), extra );
|
|
3897 } catch(qsaError) {}
|
|
3898
|
|
3899 // qSA works strangely on Element-rooted queries
|
|
3900 // We can work around this by specifying an extra ID on the root
|
|
3901 // and working up from there (Thanks to Andrew Dupont for the technique)
|
|
3902 // IE 8 doesn't work on object elements
|
|
3903 } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
|
|
3904 var old = context.id, id = context.id = "__sizzle__";
|
|
3905
|
|
3906 try {
|
|
3907 return makeArray( context.querySelectorAll( "#" + id + " " + query ), extra );
|
|
3908
|
|
3909 } catch(pseudoError) {
|
|
3910 } finally {
|
|
3911 if ( old ) {
|
|
3912 context.id = old;
|
|
3913
|
|
3914 } else {
|
|
3915 context.removeAttribute( "id" );
|
|
3916 }
|
|
3917 }
|
|
3918 }
|
|
3919 }
|
|
3920
|
|
3921 return oldSizzle(query, context, extra, seed);
|
|
3922 };
|
|
3923
|
|
3924 for ( var prop in oldSizzle ) {
|
|
3925 Sizzle[ prop ] = oldSizzle[ prop ];
|
|
3926 }
|
|
3927
|
|
3928 div = null; // release memory in IE
|
|
3929 })();
|
|
3930 }
|
|
3931
|
|
3932 (function(){
|
|
3933 var html = document.documentElement,
|
|
3934 matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector,
|
|
3935 pseudoWorks = false;
|
|
3936
|
|
3937 try {
|
|
3938 // This should fail with an exception
|
|
3939 // Gecko does not error, returns false instead
|
|
3940 matches.call( document.documentElement, ":sizzle" );
|
|
3941
|
|
3942 } catch( pseudoError ) {
|
|
3943 pseudoWorks = true;
|
|
3944 }
|
|
3945
|
|
3946 if ( matches ) {
|
|
3947 Sizzle.matchesSelector = function( node, expr ) {
|
|
3948 try {
|
|
3949 if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) ) {
|
|
3950 return matches.call( node, expr );
|
|
3951 }
|
|
3952 } catch(e) {}
|
|
3953
|
|
3954 return Sizzle(expr, null, null, [node]).length > 0;
|
|
3955 };
|
|
3956 }
|
|
3957 })();
|
|
3958
|
|
3959 (function(){
|
|
3960 var div = document.createElement("div");
|
|
3961
|
|
3962 div.innerHTML = "<div class='test e'></div><div class='test'></div>";
|
|
3963
|
|
3964 // Opera can't find a second classname (in 9.6)
|
|
3965 // Also, make sure that getElementsByClassName actually exists
|
|
3966 if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
|
|
3967 return;
|
|
3968 }
|
|
3969
|
|
3970 // Safari caches class attributes, doesn't catch changes (in 3.2)
|
|
3971 div.lastChild.className = "e";
|
|
3972
|
|
3973 if ( div.getElementsByClassName("e").length === 1 ) {
|
|
3974 return;
|
|
3975 }
|
|
3976
|
|
3977 Expr.order.splice(1, 0, "CLASS");
|
|
3978 Expr.find.CLASS = function(match, context, isXML) {
|
|
3979 if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
|
|
3980 return context.getElementsByClassName(match[1]);
|
|
3981 }
|
|
3982 };
|
|
3983
|
|
3984 div = null; // release memory in IE
|
|
3985 })();
|
|
3986
|
|
3987 function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
|
|
3988 for ( var i = 0, l = checkSet.length; i < l; i++ ) {
|
|
3989 var elem = checkSet[i];
|
|
3990 if ( elem ) {
|
|
3991 elem = elem[dir];
|
|
3992 var match = false;
|
|
3993
|
|
3994 while ( elem ) {
|
|
3995 if ( elem.sizcache === doneName ) {
|
|
3996 match = checkSet[elem.sizset];
|
|
3997 break;
|
|
3998 }
|
|
3999
|
|
4000 if ( elem.nodeType === 1 && !isXML ){
|
|
4001 elem.sizcache = doneName;
|
|
4002 elem.sizset = i;
|
|
4003 }
|
|
4004
|
|
4005 if ( elem.nodeName.toLowerCase() === cur ) {
|
|
4006 match = elem;
|
|
4007 break;
|
|
4008 }
|
|
4009
|
|
4010 elem = elem[dir];
|
|
4011 }
|
|
4012
|
|
4013 checkSet[i] = match;
|
|
4014 }
|
|
4015 }
|
|
4016 }
|
|
4017
|
|
4018 function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
|
|
4019 for ( var i = 0, l = checkSet.length; i < l; i++ ) {
|
|
4020 var elem = checkSet[i];
|
|
4021 if ( elem ) {
|
|
4022 elem = elem[dir];
|
|
4023 var match = false;
|
|
4024
|
|
4025 while ( elem ) {
|
|
4026 if ( elem.sizcache === doneName ) {
|
|
4027 match = checkSet[elem.sizset];
|
|
4028 break;
|
|
4029 }
|
|
4030
|
|
4031 if ( elem.nodeType === 1 ) {
|
|
4032 if ( !isXML ) {
|
|
4033 elem.sizcache = doneName;
|
|
4034 elem.sizset = i;
|
|
4035 }
|
|
4036 if ( typeof cur !== "string" ) {
|
|
4037 if ( elem === cur ) {
|
|
4038 match = true;
|
|
4039 break;
|
|
4040 }
|
|
4041
|
|
4042 } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
|
|
4043 match = elem;
|
|
4044 break;
|
|
4045 }
|
|
4046 }
|
|
4047
|
|
4048 elem = elem[dir];
|
|
4049 }
|
|
4050
|
|
4051 checkSet[i] = match;
|
|
4052 }
|
|
4053 }
|
|
4054 }
|
|
4055
|
|
4056 Sizzle.contains = document.documentElement.contains ? function(a, b){
|
|
4057 return a !== b && (a.contains ? a.contains(b) : true);
|
|
4058 } : function(a, b){
|
|
4059 return !!(a.compareDocumentPosition(b) & 16);
|
|
4060 };
|
|
4061
|
|
4062 Sizzle.isXML = function(elem){
|
|
4063 // documentElement is verified for cases where it doesn't yet exist
|
|
4064 // (such as loading iframes in IE - #4833)
|
|
4065 var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
|
|
4066 return documentElement ? documentElement.nodeName !== "HTML" : false;
|
|
4067 };
|
|
4068
|
|
4069 var posProcess = function(selector, context){
|
|
4070 var tmpSet = [], later = "", match,
|
|
4071 root = context.nodeType ? [context] : context;
|
|
4072
|
|
4073 // Position selectors must be done after the filter
|
|
4074 // And so must :not(positional) so we move all PSEUDOs to the end
|
|
4075 while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
|
|
4076 later += match[0];
|
|
4077 selector = selector.replace( Expr.match.PSEUDO, "" );
|
|
4078 }
|
|
4079
|
|
4080 selector = Expr.relative[selector] ? selector + "*" : selector;
|
|
4081
|
|
4082 for ( var i = 0, l = root.length; i < l; i++ ) {
|
|
4083 Sizzle( selector, root[i], tmpSet );
|
|
4084 }
|
|
4085
|
|
4086 return Sizzle.filter( later, tmpSet );
|
|
4087 };
|
|
4088
|
|
4089 // EXPOSE
|
|
4090 jQuery.find = Sizzle;
|
|
4091 jQuery.expr = Sizzle.selectors;
|
|
4092 jQuery.expr[":"] = jQuery.expr.filters;
|
|
4093 jQuery.unique = Sizzle.uniqueSort;
|
|
4094 jQuery.text = Sizzle.getText;
|
|
4095 jQuery.isXMLDoc = Sizzle.isXML;
|
|
4096 jQuery.contains = Sizzle.contains;
|
|
4097
|
|
4098
|
|
4099 })();
|
|
4100
|
|
4101
|
|
4102 var runtil = /Until$/,
|
|
4103 rparentsprev = /^(?:parents|prevUntil|prevAll)/,
|
|
4104 // Note: This RegExp should be improved, or likely pulled from Sizzle
|
|
4105 rmultiselector = /,/,
|
|
4106 isSimple = /^.[^:#\[\.,]*$/,
|
|
4107 slice = Array.prototype.slice,
|
|
4108 POS = jQuery.expr.match.POS;
|
|
4109
|
|
4110 jQuery.fn.extend({
|
|
4111 find: function( selector ) {
|
|
4112 var ret = this.pushStack( "", "find", selector ), length = 0;
|
|
4113
|
|
4114 for ( var i = 0, l = this.length; i < l; i++ ) {
|
|
4115 length = ret.length;
|
|
4116 jQuery.find( selector, this[i], ret );
|
|
4117
|
|
4118 if ( i > 0 ) {
|
|
4119 // Make sure that the results are unique
|
|
4120 for ( var n = length; n < ret.length; n++ ) {
|
|
4121 for ( var r = 0; r < length; r++ ) {
|
|
4122 if ( ret[r] === ret[n] ) {
|
|
4123 ret.splice(n--, 1);
|
|
4124 break;
|
|
4125 }
|
|
4126 }
|
|
4127 }
|
|
4128 }
|
|
4129 }
|
|
4130
|
|
4131 return ret;
|
|
4132 },
|
|
4133
|
|
4134 has: function( target ) {
|
|
4135 var targets = jQuery( target );
|
|
4136 return this.filter(function() {
|
|
4137 for ( var i = 0, l = targets.length; i < l; i++ ) {
|
|
4138 if ( jQuery.contains( this, targets[i] ) ) {
|
|
4139 return true;
|
|
4140 }
|
|
4141 }
|
|
4142 });
|
|
4143 },
|
|
4144
|
|
4145 not: function( selector ) {
|
|
4146 return this.pushStack( winnow(this, selector, false), "not", selector);
|
|
4147 },
|
|
4148
|
|
4149 filter: function( selector ) {
|
|
4150 return this.pushStack( winnow(this, selector, true), "filter", selector );
|
|
4151 },
|
|
4152
|
|
4153 is: function( selector ) {
|
|
4154 return !!selector && jQuery.filter( selector, this ).length > 0;
|
|
4155 },
|
|
4156
|
|
4157 closest: function( selectors, context ) {
|
|
4158 var ret = [], i, l, cur = this[0];
|
|
4159
|
|
4160 if ( jQuery.isArray( selectors ) ) {
|
|
4161 var match, matches = {}, selector, level = 1;
|
|
4162
|
|
4163 if ( cur && selectors.length ) {
|
|
4164 for ( i = 0, l = selectors.length; i < l; i++ ) {
|
|
4165 selector = selectors[i];
|
|
4166
|
|
4167 if ( !matches[selector] ) {
|
|
4168 matches[selector] = jQuery.expr.match.POS.test( selector ) ?
|
|
4169 jQuery( selector, context || this.context ) :
|
|
4170 selector;
|
|
4171 }
|
|
4172 }
|
|
4173
|
|
4174 while ( cur && cur.ownerDocument && cur !== context ) {
|
|
4175 for ( selector in matches ) {
|
|
4176 match = matches[selector];
|
|
4177
|
|
4178 if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
|
|
4179 ret.push({ selector: selector, elem: cur, level: level });
|
|
4180 }
|
|
4181 }
|
|
4182
|
|
4183 cur = cur.parentNode;
|
|
4184 level++;
|
|
4185 }
|
|
4186 }
|
|
4187
|
|
4188 return ret;
|
|
4189 }
|
|
4190
|
|
4191 var pos = POS.test( selectors ) ?
|
|
4192 jQuery( selectors, context || this.context ) : null;
|
|
4193
|
|
4194 for ( i = 0, l = this.length; i < l; i++ ) {
|
|
4195 cur = this[i];
|
|
4196
|
|
4197 while ( cur ) {
|
|
4198 if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
|
|
4199 ret.push( cur );
|
|
4200 break;
|
|
4201
|
|
4202 } else {
|
|
4203 cur = cur.parentNode;
|
|
4204 if ( !cur || !cur.ownerDocument || cur === context ) {
|
|
4205 break;
|
|
4206 }
|
|
4207 }
|
|
4208 }
|
|
4209 }
|
|
4210
|
|
4211 ret = ret.length > 1 ? jQuery.unique(ret) : ret;
|
|
4212
|
|
4213 return this.pushStack( ret, "closest", selectors );
|
|
4214 },
|
|
4215
|
|
4216 // Determine the position of an element within
|
|
4217 // the matched set of elements
|
|
4218 index: function( elem ) {
|
|
4219 if ( !elem || typeof elem === "string" ) {
|
|
4220 return jQuery.inArray( this[0],
|
|
4221 // If it receives a string, the selector is used
|
|
4222 // If it receives nothing, the siblings are used
|
|
4223 elem ? jQuery( elem ) : this.parent().children() );
|
|
4224 }
|
|
4225 // Locate the position of the desired element
|
|
4226 return jQuery.inArray(
|
|
4227 // If it receives a jQuery object, the first element is used
|
|
4228 elem.jquery ? elem[0] : elem, this );
|
|
4229 },
|
|
4230
|
|
4231 add: function( selector, context ) {
|
|
4232 var set = typeof selector === "string" ?
|
|
4233 jQuery( selector, context || this.context ) :
|
|
4234 jQuery.makeArray( selector ),
|
|
4235 all = jQuery.merge( this.get(), set );
|
|
4236
|
|
4237 return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
|
|
4238 all :
|
|
4239 jQuery.unique( all ) );
|
|
4240 },
|
|
4241
|
|
4242 andSelf: function() {
|
|
4243 return this.add( this.prevObject );
|
|
4244 }
|
|
4245 });
|
|
4246
|
|
4247 // A painfully simple check to see if an element is disconnected
|
|
4248 // from a document (should be improved, where feasible).
|
|
4249 function isDisconnected( node ) {
|
|
4250 return !node || !node.parentNode || node.parentNode.nodeType === 11;
|
|
4251 }
|
|
4252
|
|
4253 jQuery.each({
|
|
4254 parent: function( elem ) {
|
|
4255 var parent = elem.parentNode;
|
|
4256 return parent && parent.nodeType !== 11 ? parent : null;
|
|
4257 },
|
|
4258 parents: function( elem ) {
|
|
4259 return jQuery.dir( elem, "parentNode" );
|
|
4260 },
|
|
4261 parentsUntil: function( elem, i, until ) {
|
|
4262 return jQuery.dir( elem, "parentNode", until );
|
|
4263 },
|
|
4264 next: function( elem ) {
|
|
4265 return jQuery.nth( elem, 2, "nextSibling" );
|
|
4266 },
|
|
4267 prev: function( elem ) {
|
|
4268 return jQuery.nth( elem, 2, "previousSibling" );
|
|
4269 },
|
|
4270 nextAll: function( elem ) {
|
|
4271 return jQuery.dir( elem, "nextSibling" );
|
|
4272 },
|
|
4273 prevAll: function( elem ) {
|
|
4274 return jQuery.dir( elem, "previousSibling" );
|
|
4275 },
|
|
4276 nextUntil: function( elem, i, until ) {
|
|
4277 return jQuery.dir( elem, "nextSibling", until );
|
|
4278 },
|
|
4279 prevUntil: function( elem, i, until ) {
|
|
4280 return jQuery.dir( elem, "previousSibling", until );
|
|
4281 },
|
|
4282 siblings: function( elem ) {
|
|
4283 return jQuery.sibling( elem.parentNode.firstChild, elem );
|
|
4284 },
|
|
4285 children: function( elem ) {
|
|
4286 return jQuery.sibling( elem.firstChild );
|
|
4287 },
|
|
4288 contents: function( elem ) {
|
|
4289 return jQuery.nodeName( elem, "iframe" ) ?
|
|
4290 elem.contentDocument || elem.contentWindow.document :
|
|
4291 jQuery.makeArray( elem.childNodes );
|
|
4292 }
|
|
4293 }, function( name, fn ) {
|
|
4294 jQuery.fn[ name ] = function( until, selector ) {
|
|
4295 var ret = jQuery.map( this, fn, until );
|
|
4296
|
|
4297 if ( !runtil.test( name ) ) {
|
|
4298 selector = until;
|
|
4299 }
|
|
4300
|
|
4301 if ( selector && typeof selector === "string" ) {
|
|
4302 ret = jQuery.filter( selector, ret );
|
|
4303 }
|
|
4304
|
|
4305 ret = this.length > 1 ? jQuery.unique( ret ) : ret;
|
|
4306
|
|
4307 if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
|
|
4308 ret = ret.reverse();
|
|
4309 }
|
|
4310
|
|
4311 return this.pushStack( ret, name, slice.call(arguments).join(",") );
|
|
4312 };
|
|
4313 });
|
|
4314
|
|
4315 jQuery.extend({
|
|
4316 filter: function( expr, elems, not ) {
|
|
4317 if ( not ) {
|
|
4318 expr = ":not(" + expr + ")";
|
|
4319 }
|
|
4320
|
|
4321 return elems.length === 1 ?
|
|
4322 jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
|
|
4323 jQuery.find.matches(expr, elems);
|
|
4324 },
|
|
4325
|
|
4326 dir: function( elem, dir, until ) {
|
|
4327 var matched = [], cur = elem[dir];
|
|
4328 while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
|
|
4329 if ( cur.nodeType === 1 ) {
|
|
4330 matched.push( cur );
|
|
4331 }
|
|
4332 cur = cur[dir];
|
|
4333 }
|
|
4334 return matched;
|
|
4335 },
|
|
4336
|
|
4337 nth: function( cur, result, dir, elem ) {
|
|
4338 result = result || 1;
|
|
4339 var num = 0;
|
|
4340
|
|
4341 for ( ; cur; cur = cur[dir] ) {
|
|
4342 if ( cur.nodeType === 1 && ++num === result ) {
|
|
4343 break;
|
|
4344 }
|
|
4345 }
|
|
4346
|
|
4347 return cur;
|
|
4348 },
|
|
4349
|
|
4350 sibling: function( n, elem ) {
|
|
4351 var r = [];
|
|
4352
|
|
4353 for ( ; n; n = n.nextSibling ) {
|
|
4354 if ( n.nodeType === 1 && n !== elem ) {
|
|
4355 r.push( n );
|
|
4356 }
|
|
4357 }
|
|
4358
|
|
4359 return r;
|
|
4360 }
|
|
4361 });
|
|
4362
|
|
4363 // Implement the identical functionality for filter and not
|
|
4364 function winnow( elements, qualifier, keep ) {
|
|
4365 if ( jQuery.isFunction( qualifier ) ) {
|
|
4366 return jQuery.grep(elements, function( elem, i ) {
|
|
4367 var retVal = !!qualifier.call( elem, i, elem );
|
|
4368 return retVal === keep;
|
|
4369 });
|
|
4370
|
|
4371 } else if ( qualifier.nodeType ) {
|
|
4372 return jQuery.grep(elements, function( elem, i ) {
|
|
4373 return (elem === qualifier) === keep;
|
|
4374 });
|
|
4375
|
|
4376 } else if ( typeof qualifier === "string" ) {
|
|
4377 var filtered = jQuery.grep(elements, function( elem ) {
|
|
4378 return elem.nodeType === 1;
|
|
4379 });
|
|
4380
|
|
4381 if ( isSimple.test( qualifier ) ) {
|
|
4382 return jQuery.filter(qualifier, filtered, !keep);
|
|
4383 } else {
|
|
4384 qualifier = jQuery.filter( qualifier, filtered );
|
|
4385 }
|
|
4386 }
|
|
4387
|
|
4388 return jQuery.grep(elements, function( elem, i ) {
|
|
4389 return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
|
|
4390 });
|
|
4391 }
|
|
4392
|
|
4393
|
|
4394
|
|
4395
|
|
4396 var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
|
|
4397 rleadingWhitespace = /^\s+/,
|
|
4398 rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
|
|
4399 rtagName = /<([\w:]+)/,
|
|
4400 rtbody = /<tbody/i,
|
|
4401 rhtml = /<|&#?\w+;/,
|
|
4402 rnocache = /<(?:script|object|embed|option|style)/i,
|
|
4403 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, // checked="checked" or checked (html5)
|
|
4404 raction = /\=([^="'>\s]+\/)>/g,
|
|
4405 wrapMap = {
|
|
4406 option: [ 1, "<select multiple='multiple'>", "</select>" ],
|
|
4407 legend: [ 1, "<fieldset>", "</fieldset>" ],
|
|
4408 thead: [ 1, "<table>", "</table>" ],
|
|
4409 tr: [ 2, "<table><tbody>", "</tbody></table>" ],
|
|
4410 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
|
|
4411 col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
|
|
4412 area: [ 1, "<map>", "</map>" ],
|
|
4413 _default: [ 0, "", "" ]
|
|
4414 };
|
|
4415
|
|
4416 wrapMap.optgroup = wrapMap.option;
|
|
4417 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
|
|
4418 wrapMap.th = wrapMap.td;
|
|
4419
|
|
4420 // IE can't serialize <link> and <script> tags normally
|
|
4421 if ( !jQuery.support.htmlSerialize ) {
|
|
4422 wrapMap._default = [ 1, "div<div>", "</div>" ];
|
|
4423 }
|
|
4424
|
|
4425 jQuery.fn.extend({
|
|
4426 text: function( text ) {
|
|
4427 if ( jQuery.isFunction(text) ) {
|
|
4428 return this.each(function(i) {
|
|
4429 var self = jQuery(this);
|
|
4430 self.text( text.call(this, i, self.text()) );
|
|
4431 });
|
|
4432 }
|
|
4433
|
|
4434 if ( typeof text !== "object" && text !== undefined ) {
|
|
4435 return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
|
|
4436 }
|
|
4437
|
|
4438 return jQuery.text( this );
|
|
4439 },
|
|
4440
|
|
4441 wrapAll: function( html ) {
|
|
4442 if ( jQuery.isFunction( html ) ) {
|
|
4443 return this.each(function(i) {
|
|
4444 jQuery(this).wrapAll( html.call(this, i) );
|
|
4445 });
|
|
4446 }
|
|
4447
|
|
4448 if ( this[0] ) {
|
|
4449 // The elements to wrap the target around
|
|
4450 var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
|
|
4451
|
|
4452 if ( this[0].parentNode ) {
|
|
4453 wrap.insertBefore( this[0] );
|
|
4454 }
|
|
4455
|
|
4456 wrap.map(function() {
|
|
4457 var elem = this;
|
|
4458
|
|
4459 while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
|
|
4460 elem = elem.firstChild;
|
|
4461 }
|
|
4462
|
|
4463 return elem;
|
|
4464 }).append(this);
|
|
4465 }
|
|
4466
|
|
4467 return this;
|
|
4468 },
|
|
4469
|
|
4470 wrapInner: function( html ) {
|
|
4471 if ( jQuery.isFunction( html ) ) {
|
|
4472 return this.each(function(i) {
|
|
4473 jQuery(this).wrapInner( html.call(this, i) );
|
|
4474 });
|
|
4475 }
|
|
4476
|
|
4477 return this.each(function() {
|
|
4478 var self = jQuery( this ), contents = self.contents();
|
|
4479
|
|
4480 if ( contents.length ) {
|
|
4481 contents.wrapAll( html );
|
|
4482
|
|
4483 } else {
|
|
4484 self.append( html );
|
|
4485 }
|
|
4486 });
|
|
4487 },
|
|
4488
|
|
4489 wrap: function( html ) {
|
|
4490 return this.each(function() {
|
|
4491 jQuery( this ).wrapAll( html );
|
|
4492 });
|
|
4493 },
|
|
4494
|
|
4495 unwrap: function() {
|
|
4496 return this.parent().each(function() {
|
|
4497 if ( !jQuery.nodeName( this, "body" ) ) {
|
|
4498 jQuery( this ).replaceWith( this.childNodes );
|
|
4499 }
|
|
4500 }).end();
|
|
4501 },
|
|
4502
|
|
4503 append: function() {
|
|
4504 return this.domManip(arguments, true, function( elem ) {
|
|
4505 if ( this.nodeType === 1 ) {
|
|
4506 this.appendChild( elem );
|
|
4507 }
|
|
4508 });
|
|
4509 },
|
|
4510
|
|
4511 prepend: function() {
|
|
4512 return this.domManip(arguments, true, function( elem ) {
|
|
4513 if ( this.nodeType === 1 ) {
|
|
4514 this.insertBefore( elem, this.firstChild );
|
|
4515 }
|
|
4516 });
|
|
4517 },
|
|
4518
|
|
4519 before: function() {
|
|
4520 if ( this[0] && this[0].parentNode ) {
|
|
4521 return this.domManip(arguments, false, function( elem ) {
|
|
4522 this.parentNode.insertBefore( elem, this );
|
|
4523 });
|
|
4524 } else if ( arguments.length ) {
|
|
4525 var set = jQuery(arguments[0]);
|
|
4526 set.push.apply( set, this.toArray() );
|
|
4527 return this.pushStack( set, "before", arguments );
|
|
4528 }
|
|
4529 },
|
|
4530
|
|
4531 after: function() {
|
|
4532 if ( this[0] && this[0].parentNode ) {
|
|
4533 return this.domManip(arguments, false, function( elem ) {
|
|
4534 this.parentNode.insertBefore( elem, this.nextSibling );
|
|
4535 });
|
|
4536 } else if ( arguments.length ) {
|
|
4537 var set = this.pushStack( this, "after", arguments );
|
|
4538 set.push.apply( set, jQuery(arguments[0]).toArray() );
|
|
4539 return set;
|
|
4540 }
|
|
4541 },
|
|
4542
|
|
4543 // keepData is for internal use only--do not document
|
|
4544 remove: function( selector, keepData ) {
|
|
4545 for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
|
|
4546 if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
|
|
4547 if ( !keepData && elem.nodeType === 1 ) {
|
|
4548 jQuery.cleanData( elem.getElementsByTagName("*") );
|
|
4549 jQuery.cleanData( [ elem ] );
|
|
4550 }
|
|
4551
|
|
4552 if ( elem.parentNode ) {
|
|
4553 elem.parentNode.removeChild( elem );
|
|
4554 }
|
|
4555 }
|
|
4556 }
|
|
4557
|
|
4558 return this;
|
|
4559 },
|
|
4560
|
|
4561 empty: function() {
|
|
4562 for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
|
|
4563 // Remove element nodes and prevent memory leaks
|
|
4564 if ( elem.nodeType === 1 ) {
|
|
4565 jQuery.cleanData( elem.getElementsByTagName("*") );
|
|
4566 }
|
|
4567
|
|
4568 // Remove any remaining nodes
|
|
4569 while ( elem.firstChild ) {
|
|
4570 elem.removeChild( elem.firstChild );
|
|
4571 }
|
|
4572 }
|
|
4573
|
|
4574 return this;
|
|
4575 },
|
|
4576
|
|
4577 clone: function( events ) {
|
|
4578 // Do the clone
|
|
4579 var ret = this.map(function() {
|
|
4580 if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
|
|
4581 // IE copies events bound via attachEvent when
|
|
4582 // using cloneNode. Calling detachEvent on the
|
|
4583 // clone will also remove the events from the orignal
|
|
4584 // In order to get around this, we use innerHTML.
|
|
4585 // Unfortunately, this means some modifications to
|
|
4586 // attributes in IE that are actually only stored
|
|
4587 // as properties will not be copied (such as the
|
|
4588 // the name attribute on an input).
|
|
4589 var html = this.outerHTML, ownerDocument = this.ownerDocument;
|
|
4590 if ( !html ) {
|
|
4591 var div = ownerDocument.createElement("div");
|
|
4592 div.appendChild( this.cloneNode(true) );
|
|
4593 html = div.innerHTML;
|
|
4594 }
|
|
4595
|
|
4596 return jQuery.clean([html.replace(rinlinejQuery, "")
|
|
4597 // Handle the case in IE 8 where action=/test/> self-closes a tag
|
|
4598 .replace(raction, '="$1">')
|
|
4599 .replace(rleadingWhitespace, "")], ownerDocument)[0];
|
|
4600 } else {
|
|
4601 return this.cloneNode(true);
|
|
4602 }
|
|
4603 });
|
|
4604
|
|
4605 // Copy the events from the original to the clone
|
|
4606 if ( events === true ) {
|
|
4607 cloneCopyEvent( this, ret );
|
|
4608 cloneCopyEvent( this.find("*"), ret.find("*") );
|
|
4609 }
|
|
4610
|
|
4611 // Return the cloned set
|
|
4612 return ret;
|
|
4613 },
|
|
4614
|
|
4615 html: function( value ) {
|
|
4616 if ( value === undefined ) {
|
|
4617 return this[0] && this[0].nodeType === 1 ?
|
|
4618 this[0].innerHTML.replace(rinlinejQuery, "") :
|
|
4619 null;
|
|
4620
|
|
4621 // See if we can take a shortcut and just use innerHTML
|
|
4622 } else if ( typeof value === "string" && !rnocache.test( value ) &&
|
|
4623 (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
|
|
4624 !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
|
|
4625
|
|
4626 value = value.replace(rxhtmlTag, "<$1></$2>");
|
|
4627
|
|
4628 try {
|
|
4629 for ( var i = 0, l = this.length; i < l; i++ ) {
|
|
4630 // Remove element nodes and prevent memory leaks
|
|
4631 if ( this[i].nodeType === 1 ) {
|
|
4632 jQuery.cleanData( this[i].getElementsByTagName("*") );
|
|
4633 this[i].innerHTML = value;
|
|
4634 }
|
|
4635 }
|
|
4636
|
|
4637 // If using innerHTML throws an exception, use the fallback method
|
|
4638 } catch(e) {
|
|
4639 this.empty().append( value );
|
|
4640 }
|
|
4641
|
|
4642 } else if ( jQuery.isFunction( value ) ) {
|
|
4643 this.each(function(i){
|
|
4644 var self = jQuery(this);
|
|
4645 self.html( value.call(this, i, self.html()) );
|
|
4646 });
|
|
4647
|
|
4648 } else {
|
|
4649 this.empty().append( value );
|
|
4650 }
|
|
4651
|
|
4652 return this;
|
|
4653 },
|
|
4654
|
|
4655 replaceWith: function( value ) {
|
|
4656 if ( this[0] && this[0].parentNode ) {
|
|
4657 // Make sure that the elements are removed from the DOM before they are inserted
|
|
4658 // this can help fix replacing a parent with child elements
|
|
4659 if ( jQuery.isFunction( value ) ) {
|
|
4660 return this.each(function(i) {
|
|
4661 var self = jQuery(this), old = self.html();
|
|
4662 self.replaceWith( value.call( this, i, old ) );
|
|
4663 });
|
|
4664 }
|
|
4665
|
|
4666 if ( typeof value !== "string" ) {
|
|
4667 value = jQuery(value).detach();
|
|
4668 }
|
|
4669
|
|
4670 return this.each(function() {
|
|
4671 var next = this.nextSibling, parent = this.parentNode;
|
|
4672
|
|
4673 jQuery(this).remove();
|
|
4674
|
|
4675 if ( next ) {
|
|
4676 jQuery(next).before( value );
|
|
4677 } else {
|
|
4678 jQuery(parent).append( value );
|
|
4679 }
|
|
4680 });
|
|
4681 } else {
|
|
4682 return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
|
|
4683 }
|
|
4684 },
|
|
4685
|
|
4686 detach: function( selector ) {
|
|
4687 return this.remove( selector, true );
|
|
4688 },
|
|
4689
|
|
4690 domManip: function( args, table, callback ) {
|
|
4691 var results, first, value = args[0], scripts = [], fragment, parent;
|
|
4692
|
|
4693 // We can't cloneNode fragments that contain checked, in WebKit
|
|
4694 if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
|
|
4695 return this.each(function() {
|
|
4696 jQuery(this).domManip( args, table, callback, true );
|
|
4697 });
|
|
4698 }
|
|
4699
|
|
4700 if ( jQuery.isFunction(value) ) {
|
|
4701 return this.each(function(i) {
|
|
4702 var self = jQuery(this);
|
|
4703 args[0] = value.call(this, i, table ? self.html() : undefined);
|
|
4704 self.domManip( args, table, callback );
|
|
4705 });
|
|
4706 }
|
|
4707
|
|
4708 if ( this[0] ) {
|
|
4709 parent = value && value.parentNode;
|
|
4710
|
|
4711 // If we're in a fragment, just use that instead of building a new one
|
|
4712 if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
|
|
4713 results = { fragment: parent };
|
|
4714
|
|
4715 } else {
|
|
4716 results = jQuery.buildFragment( args, this, scripts );
|
|
4717 }
|
|
4718
|
|
4719 fragment = results.fragment;
|
|
4720
|
|
4721 if ( fragment.childNodes.length === 1 ) {
|
|
4722 first = fragment = fragment.firstChild;
|
|
4723 } else {
|
|
4724 first = fragment.firstChild;
|
|
4725 }
|
|
4726
|
|
4727 if ( first ) {
|
|
4728 table = table && jQuery.nodeName( first, "tr" );
|
|
4729
|
|
4730 for ( var i = 0, l = this.length; i < l; i++ ) {
|
|
4731 callback.call(
|
|
4732 table ?
|
|
4733 root(this[i], first) :
|
|
4734 this[i],
|
|
4735 i > 0 || results.cacheable || this.length > 1 ?
|
|
4736 fragment.cloneNode(true) :
|
|
4737 fragment
|
|
4738 );
|
|
4739 }
|
|
4740 }
|
|
4741
|
|
4742 if ( scripts.length ) {
|
|
4743 jQuery.each( scripts, evalScript );
|
|
4744 }
|
|
4745 }
|
|
4746
|
|
4747 return this;
|
|
4748 }
|
|
4749 });
|
|
4750
|
|
4751 function root( elem, cur ) {
|
|
4752 return jQuery.nodeName(elem, "table") ?
|
|
4753 (elem.getElementsByTagName("tbody")[0] ||
|
|
4754 elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
|
|
4755 elem;
|
|
4756 }
|
|
4757
|
|
4758 function cloneCopyEvent(orig, ret) {
|
|
4759 var i = 0;
|
|
4760
|
|
4761 ret.each(function() {
|
|
4762 if ( this.nodeName !== (orig[i] && orig[i].nodeName) ) {
|
|
4763 return;
|
|
4764 }
|
|
4765
|
|
4766 var oldData = jQuery.data( orig[i++] ), curData = jQuery.data( this, oldData ), events = oldData && oldData.events;
|
|
4767
|
|
4768 if ( events ) {
|
|
4769 delete curData.handle;
|
|
4770 curData.events = {};
|
|
4771
|
|
4772 for ( var type in events ) {
|
|
4773 for ( var handler in events[ type ] ) {
|
|
4774 jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
|
|
4775 }
|
|
4776 }
|
|
4777 }
|
|
4778 });
|
|
4779 }
|
|
4780
|
|
4781 jQuery.buildFragment = function( args, nodes, scripts ) {
|
|
4782 var fragment, cacheable, cacheresults,
|
|
4783 doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
|
|
4784
|
|
4785 // Only cache "small" (1/2 KB) strings that are associated with the main document
|
|
4786 // Cloning options loses the selected state, so don't cache them
|
|
4787 // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
|
|
4788 // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
|
|
4789 if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
|
|
4790 !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
|
|
4791
|
|
4792 cacheable = true;
|
|
4793 cacheresults = jQuery.fragments[ args[0] ];
|
|
4794 if ( cacheresults ) {
|
|
4795 if ( cacheresults !== 1 ) {
|
|
4796 fragment = cacheresults;
|
|
4797 }
|
|
4798 }
|
|
4799 }
|
|
4800
|
|
4801 if ( !fragment ) {
|
|
4802 fragment = doc.createDocumentFragment();
|
|
4803 jQuery.clean( args, doc, fragment, scripts );
|
|
4804 }
|
|
4805
|
|
4806 if ( cacheable ) {
|
|
4807 jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
|
|
4808 }
|
|
4809
|
|
4810 return { fragment: fragment, cacheable: cacheable };
|
|
4811 };
|
|
4812
|
|
4813 jQuery.fragments = {};
|
|
4814
|
|
4815 jQuery.each({
|
|
4816 appendTo: "append",
|
|
4817 prependTo: "prepend",
|
|
4818 insertBefore: "before",
|
|
4819 insertAfter: "after",
|
|
4820 replaceAll: "replaceWith"
|
|
4821 }, function( name, original ) {
|
|
4822 jQuery.fn[ name ] = function( selector ) {
|
|
4823 var ret = [], insert = jQuery( selector ),
|
|
4824 parent = this.length === 1 && this[0].parentNode;
|
|
4825
|
|
4826 if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
|
|
4827 insert[ original ]( this[0] );
|
|
4828 return this;
|
|
4829
|
|
4830 } else {
|
|
4831 for ( var i = 0, l = insert.length; i < l; i++ ) {
|
|
4832 var elems = (i > 0 ? this.clone(true) : this).get();
|
|
4833 jQuery( insert[i] )[ original ]( elems );
|
|
4834 ret = ret.concat( elems );
|
|
4835 }
|
|
4836
|
|
4837 return this.pushStack( ret, name, insert.selector );
|
|
4838 }
|
|
4839 };
|
|
4840 });
|
|
4841
|
|
4842 jQuery.extend({
|
|
4843 clean: function( elems, context, fragment, scripts ) {
|
|
4844 context = context || document;
|
|
4845
|
|
4846 // !context.createElement fails in IE with an error but returns typeof 'object'
|
|
4847 if ( typeof context.createElement === "undefined" ) {
|
|
4848 context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
|
|
4849 }
|
|
4850
|
|
4851 var ret = [];
|
|
4852
|
|
4853 for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
|
|
4854 if ( typeof elem === "number" ) {
|
|
4855 elem += "";
|
|
4856 }
|
|
4857
|
|
4858 if ( !elem ) {
|
|
4859 continue;
|
|
4860 }
|
|
4861
|
|
4862 // Convert html string into DOM nodes
|
|
4863 if ( typeof elem === "string" && !rhtml.test( elem ) ) {
|
|
4864 elem = context.createTextNode( elem );
|
|
4865
|
|
4866 } else if ( typeof elem === "string" ) {
|
|
4867 // Fix "XHTML"-style tags in all browsers
|
|
4868 elem = elem.replace(rxhtmlTag, "<$1></$2>");
|
|
4869
|
|
4870 // Trim whitespace, otherwise indexOf won't work as expected
|
|
4871 var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
|
|
4872 wrap = wrapMap[ tag ] || wrapMap._default,
|
|
4873 depth = wrap[0],
|
|
4874 div = context.createElement("div");
|
|
4875
|
|
4876 // Go to html and back, then peel off extra wrappers
|
|
4877 div.innerHTML = wrap[1] + elem + wrap[2];
|
|
4878
|
|
4879 // Move to the right depth
|
|
4880 while ( depth-- ) {
|
|
4881 div = div.lastChild;
|
|
4882 }
|
|
4883
|
|
4884 // Remove IE's autoinserted <tbody> from table fragments
|
|
4885 if ( !jQuery.support.tbody ) {
|
|
4886
|
|
4887 // String was a <table>, *may* have spurious <tbody>
|
|
4888 var hasBody = rtbody.test(elem),
|
|
4889 tbody = tag === "table" && !hasBody ?
|
|
4890 div.firstChild && div.firstChild.childNodes :
|
|
4891
|
|
4892 // String was a bare <thead> or <tfoot>
|
|
4893 wrap[1] === "<table>" && !hasBody ?
|
|
4894 div.childNodes :
|
|
4895 [];
|
|
4896
|
|
4897 for ( var j = tbody.length - 1; j >= 0 ; --j ) {
|
|
4898 if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
|
|
4899 tbody[ j ].parentNode.removeChild( tbody[ j ] );
|
|
4900 }
|
|
4901 }
|
|
4902
|
|
4903 }
|
|
4904
|
|
4905 // IE completely kills leading whitespace when innerHTML is used
|
|
4906 if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
|
|
4907 div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
|
|
4908 }
|
|
4909
|
|
4910 elem = div.childNodes;
|
|
4911 }
|
|
4912
|
|
4913 if ( elem.nodeType ) {
|
|
4914 ret.push( elem );
|
|
4915 } else {
|
|
4916 ret = jQuery.merge( ret, elem );
|
|
4917 }
|
|
4918 }
|
|
4919
|
|
4920 if ( fragment ) {
|
|
4921 for ( i = 0; ret[i]; i++ ) {
|
|
4922 if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
|
|
4923 scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
|
|
4924
|
|
4925 } else {
|
|
4926 if ( ret[i].nodeType === 1 ) {
|
|
4927 ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
|
|
4928 }
|
|
4929 fragment.appendChild( ret[i] );
|
|
4930 }
|
|
4931 }
|
|
4932 }
|
|
4933
|
|
4934 return ret;
|
|
4935 },
|
|
4936
|
|
4937 cleanData: function( elems ) {
|
|
4938 var data, id, cache = jQuery.cache,
|
|
4939 special = jQuery.event.special,
|
|
4940 deleteExpando = jQuery.support.deleteExpando;
|
|
4941
|
|
4942 for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
|
|
4943 if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
|
|
4944 continue;
|
|
4945 }
|
|
4946
|
|
4947 id = elem[ jQuery.expando ];
|
|
4948
|
|
4949 if ( id ) {
|
|
4950 data = cache[ id ];
|
|
4951
|
|
4952 if ( data && data.events ) {
|
|
4953 for ( var type in data.events ) {
|
|
4954 if ( special[ type ] ) {
|
|
4955 jQuery.event.remove( elem, type );
|
|
4956
|
|
4957 } else {
|
|
4958 jQuery.removeEvent( elem, type, data.handle );
|
|
4959 }
|
|
4960 }
|
|
4961 }
|
|
4962
|
|
4963 if ( deleteExpando ) {
|
|
4964 delete elem[ jQuery.expando ];
|
|
4965
|
|
4966 } else if ( elem.removeAttribute ) {
|
|
4967 elem.removeAttribute( jQuery.expando );
|
|
4968 }
|
|
4969
|
|
4970 delete cache[ id ];
|
|
4971 }
|
|
4972 }
|
|
4973 }
|
|
4974 });
|
|
4975
|
|
4976 function evalScript( i, elem ) {
|
|
4977 if ( elem.src ) {
|
|
4978 jQuery.ajax({
|
|
4979 url: elem.src,
|
|
4980 async: false,
|
|
4981 dataType: "script"
|
|
4982 });
|
|
4983 } else {
|
|
4984 jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
|
|
4985 }
|
|
4986
|
|
4987 if ( elem.parentNode ) {
|
|
4988 elem.parentNode.removeChild( elem );
|
|
4989 }
|
|
4990 }
|
|
4991
|
|
4992
|
|
4993
|
|
4994
|
|
4995 var ralpha = /alpha\([^)]*\)/i,
|
|
4996 ropacity = /opacity=([^)]*)/,
|
|
4997 rdashAlpha = /-([a-z])/ig,
|
|
4998 rupper = /([A-Z])/g,
|
|
4999 rnumpx = /^-?\d+(?:px)?$/i,
|
|
5000 rnum = /^-?\d/,
|
|
5001
|
|
5002 cssShow = { position: "absolute", visibility: "hidden", display: "block" },
|
|
5003 cssWidth = [ "Left", "Right" ],
|
|
5004 cssHeight = [ "Top", "Bottom" ],
|
|
5005 curCSS,
|
|
5006
|
|
5007 // cache check for defaultView.getComputedStyle
|
|
5008 getComputedStyle = document.defaultView && document.defaultView.getComputedStyle,
|
|
5009
|
|
5010 fcamelCase = function( all, letter ) {
|
|
5011 return letter.toUpperCase();
|
|
5012 };
|
|
5013
|
|
5014 jQuery.fn.css = function( name, value ) {
|
|
5015 // Setting 'undefined' is a no-op
|
|
5016 if ( arguments.length === 2 && value === undefined ) {
|
|
5017 return this;
|
|
5018 }
|
|
5019
|
|
5020 return jQuery.access( this, name, value, true, function( elem, name, value ) {
|
|
5021 return value !== undefined ?
|
|
5022 jQuery.style( elem, name, value ) :
|
|
5023 jQuery.css( elem, name );
|
|
5024 });
|
|
5025 };
|
|
5026
|
|
5027 jQuery.extend({
|
|
5028 // Add in style property hooks for overriding the default
|
|
5029 // behavior of getting and setting a style property
|
|
5030 cssHooks: {
|
|
5031 opacity: {
|
|
5032 get: function( elem, computed ) {
|
|
5033 if ( computed ) {
|
|
5034 // We should always get a number back from opacity
|
|
5035 var ret = curCSS( elem, "opacity", "opacity" );
|
|
5036 return ret === "" ? "1" : ret;
|
|
5037
|
|
5038 } else {
|
|
5039 return elem.style.opacity;
|
|
5040 }
|
|
5041 }
|
|
5042 }
|
|
5043 },
|
|
5044
|
|
5045 // Exclude the following css properties to add px
|
|
5046 cssNumber: {
|
|
5047 "zIndex": true,
|
|
5048 "fontWeight": true,
|
|
5049 "opacity": true,
|
|
5050 "zoom": true,
|
|
5051 "lineHeight": true
|
|
5052 },
|
|
5053
|
|
5054 // Add in properties whose names you wish to fix before
|
|
5055 // setting or getting the value
|
|
5056 cssProps: {
|
|
5057 // normalize float css property
|
|
5058 "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
|
|
5059 },
|
|
5060
|
|
5061 // Get and set the style property on a DOM Node
|
|
5062 style: function( elem, name, value, extra ) {
|
|
5063 // Don't set styles on text and comment nodes
|
|
5064 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
|
|
5065 return;
|
|
5066 }
|
|
5067
|
|
5068 // Make sure that we're working with the right name
|
|
5069 var ret, origName = jQuery.camelCase( name ),
|
|
5070 style = elem.style, hooks = jQuery.cssHooks[ origName ];
|
|
5071
|
|
5072 name = jQuery.cssProps[ origName ] || origName;
|
|
5073
|
|
5074 // Check if we're setting a value
|
|
5075 if ( value !== undefined ) {
|
|
5076 // Make sure that NaN and null values aren't set. See: #7116
|
|
5077 if ( typeof value === "number" && isNaN( value ) || value == null ) {
|
|
5078 return;
|
|
5079 }
|
|
5080
|
|
5081 // If a number was passed in, add 'px' to the (except for certain CSS properties)
|
|
5082 if ( typeof value === "number" && !jQuery.cssNumber[ origName ] ) {
|
|
5083 value += "px";
|
|
5084 }
|
|
5085
|
|
5086 // If a hook was provided, use that value, otherwise just set the specified value
|
|
5087 if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
|
|
5088 // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
|
|
5089 // Fixes bug #5509
|
|
5090 try {
|
|
5091 style[ name ] = value;
|
|
5092 } catch(e) {}
|
|
5093 }
|
|
5094
|
|
5095 } else {
|
|
5096 // If a hook was provided get the non-computed value from there
|
|
5097 if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
|
|
5098 return ret;
|
|
5099 }
|
|
5100
|
|
5101 // Otherwise just get the value from the style object
|
|
5102 return style[ name ];
|
|
5103 }
|
|
5104 },
|
|
5105
|
|
5106 css: function( elem, name, extra ) {
|
|
5107 // Make sure that we're working with the right name
|
|
5108 var ret, origName = jQuery.camelCase( name ),
|
|
5109 hooks = jQuery.cssHooks[ origName ];
|
|
5110
|
|
5111 name = jQuery.cssProps[ origName ] || origName;
|
|
5112
|
|
5113 // If a hook was provided get the computed value from there
|
|
5114 if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
|
|
5115 return ret;
|
|
5116
|
|
5117 // Otherwise, if a way to get the computed value exists, use that
|
|
5118 } else if ( curCSS ) {
|
|
5119 return curCSS( elem, name, origName );
|
|
5120 }
|
|
5121 },
|
|
5122
|
|
5123 // A method for quickly swapping in/out CSS properties to get correct calculations
|
|
5124 swap: function( elem, options, callback ) {
|
|
5125 var old = {};
|
|
5126
|
|
5127 // Remember the old values, and insert the new ones
|
|
5128 for ( var name in options ) {
|
|
5129 old[ name ] = elem.style[ name ];
|
|
5130 elem.style[ name ] = options[ name ];
|
|
5131 }
|
|
5132
|
|
5133 callback.call( elem );
|
|
5134
|
|
5135 // Revert the old values
|
|
5136 for ( name in options ) {
|
|
5137 elem.style[ name ] = old[ name ];
|
|
5138 }
|
|
5139 },
|
|
5140
|
|
5141 camelCase: function( string ) {
|
|
5142 return string.replace( rdashAlpha, fcamelCase );
|
|
5143 }
|
|
5144 });
|
|
5145
|
|
5146 // DEPRECATED, Use jQuery.css() instead
|
|
5147 jQuery.curCSS = jQuery.css;
|
|
5148
|
|
5149 jQuery.each(["height", "width"], function( i, name ) {
|
|
5150 jQuery.cssHooks[ name ] = {
|
|
5151 get: function( elem, computed, extra ) {
|
|
5152 var val;
|
|
5153
|
|
5154 if ( computed ) {
|
|
5155 if ( elem.offsetWidth !== 0 ) {
|
|
5156 val = getWH( elem, name, extra );
|
|
5157
|
|
5158 } else {
|
|
5159 jQuery.swap( elem, cssShow, function() {
|
|
5160 val = getWH( elem, name, extra );
|
|
5161 });
|
|
5162 }
|
|
5163
|
|
5164 return val + "px";
|
|
5165 }
|
|
5166 },
|
|
5167
|
|
5168 set: function( elem, value ) {
|
|
5169 if ( rnumpx.test( value ) ) {
|
|
5170 // ignore negative width and height values #1599
|
|
5171 value = parseFloat(value);
|
|
5172
|
|
5173 if ( value >= 0 ) {
|
|
5174 return value + "px";
|
|
5175 }
|
|
5176
|
|
5177 } else {
|
|
5178 return value;
|
|
5179 }
|
|
5180 }
|
|
5181 };
|
|
5182 });
|
|
5183
|
|
5184 if ( !jQuery.support.opacity ) {
|
|
5185 jQuery.cssHooks.opacity = {
|
|
5186 get: function( elem, computed ) {
|
|
5187 // IE uses filters for opacity
|
|
5188 return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ?
|
|
5189 (parseFloat(RegExp.$1) / 100) + "" :
|
|
5190 computed ? "1" : "";
|
|
5191 },
|
|
5192
|
|
5193 set: function( elem, value ) {
|
|
5194 var style = elem.style;
|
|
5195
|
|
5196 // IE has trouble with opacity if it does not have layout
|
|
5197 // Force it by setting the zoom level
|
|
5198 style.zoom = 1;
|
|
5199
|
|
5200 // Set the alpha filter to set the opacity
|
|
5201 var opacity = jQuery.isNaN(value) ?
|
|
5202 "" :
|
|
5203 "alpha(opacity=" + value * 100 + ")",
|
|
5204 filter = style.filter || "";
|
|
5205
|
|
5206 style.filter = ralpha.test(filter) ?
|
|
5207 filter.replace(ralpha, opacity) :
|
|
5208 style.filter + ' ' + opacity;
|
|
5209 }
|
|
5210 };
|
|
5211 }
|
|
5212
|
|
5213 if ( getComputedStyle ) {
|
|
5214 curCSS = function( elem, newName, name ) {
|
|
5215 var ret, defaultView, computedStyle;
|
|
5216
|
|
5217 name = name.replace( rupper, "-$1" ).toLowerCase();
|
|
5218
|
|
5219 if ( !(defaultView = elem.ownerDocument.defaultView) ) {
|
|
5220 return undefined;
|
|
5221 }
|
|
5222
|
|
5223 if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
|
|
5224 ret = computedStyle.getPropertyValue( name );
|
|
5225 if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
|
|
5226 ret = jQuery.style( elem, name );
|
|
5227 }
|
|
5228 }
|
|
5229
|
|
5230 return ret;
|
|
5231 };
|
|
5232
|
|
5233 } else if ( document.documentElement.currentStyle ) {
|
|
5234 curCSS = function( elem, name ) {
|
|
5235 var left, rsLeft, ret = elem.currentStyle && elem.currentStyle[ name ], style = elem.style;
|
|
5236
|
|
5237 // From the awesome hack by Dean Edwards
|
|
5238 // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
|
|
5239
|
|
5240 // If we're not dealing with a regular pixel number
|
|
5241 // but a number that has a weird ending, we need to convert it to pixels
|
|
5242 if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
|
|
5243 // Remember the original values
|
|
5244 left = style.left;
|
|
5245 rsLeft = elem.runtimeStyle.left;
|
|
5246
|
|
5247 // Put in the new values to get a computed value out
|
|
5248 elem.runtimeStyle.left = elem.currentStyle.left;
|
|
5249 style.left = name === "fontSize" ? "1em" : (ret || 0);
|
|
5250 ret = style.pixelLeft + "px";
|
|
5251
|
|
5252 // Revert the changed values
|
|
5253 style.left = left;
|
|
5254 elem.runtimeStyle.left = rsLeft;
|
|
5255 }
|
|
5256
|
|
5257 return ret;
|
|
5258 };
|
|
5259 }
|
|
5260
|
|
5261 function getWH( elem, name, extra ) {
|
|
5262 var which = name === "width" ? cssWidth : cssHeight,
|
|
5263 val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
|
|
5264
|
|
5265 if ( extra === "border" ) {
|
|
5266 return val;
|
|
5267 }
|
|
5268
|
|
5269 jQuery.each( which, function() {
|
|
5270 if ( !extra ) {
|
|
5271 val -= parseFloat(jQuery.css( elem, "padding" + this )) || 0;
|
|
5272 }
|
|
5273
|
|
5274 if ( extra === "margin" ) {
|
|
5275 val += parseFloat(jQuery.css( elem, "margin" + this )) || 0;
|
|
5276
|
|
5277 } else {
|
|
5278 val -= parseFloat(jQuery.css( elem, "border" + this + "Width" )) || 0;
|
|
5279 }
|
|
5280 });
|
|
5281
|
|
5282 return val;
|
|
5283 }
|
|
5284
|
|
5285 if ( jQuery.expr && jQuery.expr.filters ) {
|
|
5286 jQuery.expr.filters.hidden = function( elem ) {
|
|
5287 var width = elem.offsetWidth, height = elem.offsetHeight;
|
|
5288
|
|
5289 return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
|
|
5290 };
|
|
5291
|
|
5292 jQuery.expr.filters.visible = function( elem ) {
|
|
5293 return !jQuery.expr.filters.hidden( elem );
|
|
5294 };
|
|
5295 }
|
|
5296
|
|
5297
|
|
5298
|
|
5299
|
|
5300 var jsc = jQuery.now(),
|
|
5301 rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
|
|
5302 rselectTextarea = /^(?:select|textarea)/i,
|
|
5303 rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
|
|
5304 rnoContent = /^(?:GET|HEAD|DELETE)$/,
|
|
5305 rbracket = /\[\]$/,
|
|
5306 jsre = /\=\?(&|$)/,
|
|
5307 rquery = /\?/,
|
|
5308 rts = /([?&])_=[^&]*/,
|
|
5309 rurl = /^(\w+:)?\/\/([^\/?#]+)/,
|
|
5310 r20 = /%20/g,
|
|
5311 rhash = /#.*$/,
|
|
5312
|
|
5313 // Keep a copy of the old load method
|
|
5314 _load = jQuery.fn.load;
|
|
5315
|
|
5316 jQuery.fn.extend({
|
|
5317 load: function( url, params, callback ) {
|
|
5318 if ( typeof url !== "string" && _load ) {
|
|
5319 return _load.apply( this, arguments );
|
|
5320
|
|
5321 // Don't do a request if no elements are being requested
|
|
5322 } else if ( !this.length ) {
|
|
5323 return this;
|
|
5324 }
|
|
5325
|
|
5326 var off = url.indexOf(" ");
|
|
5327 if ( off >= 0 ) {
|
|
5328 var selector = url.slice(off, url.length);
|
|
5329 url = url.slice(0, off);
|
|
5330 }
|
|
5331
|
|
5332 // Default to a GET request
|
|
5333 var type = "GET";
|
|
5334
|
|
5335 // If the second parameter was provided
|
|
5336 if ( params ) {
|
|
5337 // If it's a function
|
|
5338 if ( jQuery.isFunction( params ) ) {
|
|
5339 // We assume that it's the callback
|
|
5340 callback = params;
|
|
5341 params = null;
|
|
5342
|
|
5343 // Otherwise, build a param string
|
|
5344 } else if ( typeof params === "object" ) {
|
|
5345 params = jQuery.param( params, jQuery.ajaxSettings.traditional );
|
|
5346 type = "POST";
|
|
5347 }
|
|
5348 }
|
|
5349
|
|
5350 var self = this;
|
|
5351
|
|
5352 // Request the remote document
|
|
5353 jQuery.ajax({
|
|
5354 url: url,
|
|
5355 type: type,
|
|
5356 dataType: "html",
|
|
5357 data: params,
|
|
5358 complete: function( res, status ) {
|
|
5359 // If successful, inject the HTML into all the matched elements
|
|
5360 if ( status === "success" || status === "notmodified" ) {
|
|
5361 // See if a selector was specified
|
|
5362 self.html( selector ?
|
|
5363 // Create a dummy div to hold the results
|
|
5364 jQuery("<div>")
|
|
5365 // inject the contents of the document in, removing the scripts
|
|
5366 // to avoid any 'Permission Denied' errors in IE
|
|
5367 .append(res.responseText.replace(rscript, ""))
|
|
5368
|
|
5369 // Locate the specified elements
|
|
5370 .find(selector) :
|
|
5371
|
|
5372 // If not, just inject the full result
|
|
5373 res.responseText );
|
|
5374 }
|
|
5375
|
|
5376 if ( callback ) {
|
|
5377 self.each( callback, [res.responseText, status, res] );
|
|
5378 }
|
|
5379 }
|
|
5380 });
|
|
5381
|
|
5382 return this;
|
|
5383 },
|
|
5384
|
|
5385 serialize: function() {
|
|
5386 return jQuery.param(this.serializeArray());
|
|
5387 },
|
|
5388
|
|
5389 serializeArray: function() {
|
|
5390 return this.map(function() {
|
|
5391 return this.elements ? jQuery.makeArray(this.elements) : this;
|
|
5392 })
|
|
5393 .filter(function() {
|
|
5394 return this.name && !this.disabled &&
|
|
5395 (this.checked || rselectTextarea.test(this.nodeName) ||
|
|
5396 rinput.test(this.type));
|
|
5397 })
|
|
5398 .map(function( i, elem ) {
|
|
5399 var val = jQuery(this).val();
|
|
5400
|
|
5401 return val == null ?
|
|
5402 null :
|
|
5403 jQuery.isArray(val) ?
|
|
5404 jQuery.map( val, function( val, i ) {
|
|
5405 return { name: elem.name, value: val };
|
|
5406 }) :
|
|
5407 { name: elem.name, value: val };
|
|
5408 }).get();
|
|
5409 }
|
|
5410 });
|
|
5411
|
|
5412 // Attach a bunch of functions for handling common AJAX events
|
|
5413 jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function( i, o ) {
|
|
5414 jQuery.fn[o] = function( f ) {
|
|
5415 return this.bind(o, f);
|
|
5416 };
|
|
5417 });
|
|
5418
|
|
5419 jQuery.extend({
|
|
5420 get: function( url, data, callback, type ) {
|
|
5421 // shift arguments if data argument was omited
|
|
5422 if ( jQuery.isFunction( data ) ) {
|
|
5423 type = type || callback;
|
|
5424 callback = data;
|
|
5425 data = null;
|
|
5426 }
|
|
5427
|
|
5428 return jQuery.ajax({
|
|
5429 type: "GET",
|
|
5430 url: url,
|
|
5431 data: data,
|
|
5432 success: callback,
|
|
5433 dataType: type
|
|
5434 });
|
|
5435 },
|
|
5436
|
|
5437 getScript: function( url, callback ) {
|
|
5438 return jQuery.get(url, null, callback, "script");
|
|
5439 },
|
|
5440
|
|
5441 getJSON: function( url, data, callback ) {
|
|
5442 return jQuery.get(url, data, callback, "json");
|
|
5443 },
|
|
5444
|
|
5445 post: function( url, data, callback, type ) {
|
|
5446 // shift arguments if data argument was omited
|
|
5447 if ( jQuery.isFunction( data ) ) {
|
|
5448 type = type || callback;
|
|
5449 callback = data;
|
|
5450 data = {};
|
|
5451 }
|
|
5452
|
|
5453 return jQuery.ajax({
|
|
5454 type: "POST",
|
|
5455 url: url,
|
|
5456 data: data,
|
|
5457 success: callback,
|
|
5458 dataType: type
|
|
5459 });
|
|
5460 },
|
|
5461
|
|
5462 ajaxSetup: function( settings ) {
|
|
5463 jQuery.extend( jQuery.ajaxSettings, settings );
|
|
5464 },
|
|
5465
|
|
5466 ajaxSettings: {
|
|
5467 url: location.href,
|
|
5468 global: true,
|
|
5469 type: "GET",
|
|
5470 contentType: "application/x-www-form-urlencoded",
|
|
5471 processData: true,
|
|
5472 async: true,
|
|
5473 /*
|
|
5474 timeout: 0,
|
|
5475 data: null,
|
|
5476 username: null,
|
|
5477 password: null,
|
|
5478 traditional: false,
|
|
5479 */
|
|
5480 // This function can be overriden by calling jQuery.ajaxSetup
|
|
5481 xhr: function() {
|
|
5482 return new window.XMLHttpRequest();
|
|
5483 },
|
|
5484 accepts: {
|
|
5485 xml: "application/xml, text/xml",
|
|
5486 html: "text/html",
|
|
5487 script: "text/javascript, application/javascript",
|
|
5488 json: "application/json, text/javascript",
|
|
5489 text: "text/plain",
|
|
5490 _default: "*/*"
|
|
5491 }
|
|
5492 },
|
|
5493
|
|
5494 ajax: function( origSettings ) {
|
|
5495 var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings),
|
|
5496 jsonp, status, data, type = s.type.toUpperCase(), noContent = rnoContent.test(type);
|
|
5497
|
|
5498 s.url = s.url.replace( rhash, "" );
|
|
5499
|
|
5500 // Use original (not extended) context object if it was provided
|
|
5501 s.context = origSettings && origSettings.context != null ? origSettings.context : s;
|
|
5502
|
|
5503 // convert data if not already a string
|
|
5504 if ( s.data && s.processData && typeof s.data !== "string" ) {
|
|
5505 s.data = jQuery.param( s.data, s.traditional );
|
|
5506 }
|
|
5507
|
|
5508 // Handle JSONP Parameter Callbacks
|
|
5509 if ( s.dataType === "jsonp" ) {
|
|
5510 if ( type === "GET" ) {
|
|
5511 if ( !jsre.test( s.url ) ) {
|
|
5512 s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?";
|
|
5513 }
|
|
5514 } else if ( !s.data || !jsre.test(s.data) ) {
|
|
5515 s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
|
|
5516 }
|
|
5517 s.dataType = "json";
|
|
5518 }
|
|
5519
|
|
5520 // Build temporary JSONP function
|
|
5521 if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {
|
|
5522 jsonp = s.jsonpCallback || ("jsonp" + jsc++);
|
|
5523
|
|
5524 // Replace the =? sequence both in the query string and the data
|
|
5525 if ( s.data ) {
|
|
5526 s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
|
|
5527 }
|
|
5528
|
|
5529 s.url = s.url.replace(jsre, "=" + jsonp + "$1");
|
|
5530
|
|
5531 // We need to make sure
|
|
5532 // that a JSONP style response is executed properly
|
|
5533 s.dataType = "script";
|
|
5534
|
|
5535 // Handle JSONP-style loading
|
|
5536 var customJsonp = window[ jsonp ];
|
|
5537
|
|
5538 window[ jsonp ] = function( tmp ) {
|
|
5539 data = tmp;
|
|
5540 jQuery.handleSuccess( s, xhr, status, data );
|
|
5541 jQuery.handleComplete( s, xhr, status, data );
|
|
5542
|
|
5543 if ( jQuery.isFunction( customJsonp ) ) {
|
|
5544 customJsonp( tmp );
|
|
5545
|
|
5546 } else {
|
|
5547 // Garbage collect
|
|
5548 window[ jsonp ] = undefined;
|
|
5549
|
|
5550 try {
|
|
5551 delete window[ jsonp ];
|
|
5552 } catch( jsonpError ) {}
|
|
5553 }
|
|
5554
|
|
5555 if ( head ) {
|
|
5556 head.removeChild( script );
|
|
5557 }
|
|
5558 };
|
|
5559 }
|
|
5560
|
|
5561 if ( s.dataType === "script" && s.cache === null ) {
|
|
5562 s.cache = false;
|
|
5563 }
|
|
5564
|
|
5565 if ( s.cache === false && type === "GET" ) {
|
|
5566 var ts = jQuery.now();
|
|
5567
|
|
5568 // try replacing _= if it is there
|
|
5569 var ret = s.url.replace(rts, "$1_=" + ts);
|
|
5570
|
|
5571 // if nothing was replaced, add timestamp to the end
|
|
5572 s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
|
|
5573 }
|
|
5574
|
|
5575 // If data is available, append data to url for get requests
|
|
5576 if ( s.data && type === "GET" ) {
|
|
5577 s.url += (rquery.test(s.url) ? "&" : "?") + s.data;
|
|
5578 }
|
|
5579
|
|
5580 // Watch for a new set of requests
|
|
5581 if ( s.global && jQuery.active++ === 0 ) {
|
|
5582 jQuery.event.trigger( "ajaxStart" );
|
|
5583 }
|
|
5584
|
|
5585 // Matches an absolute URL, and saves the domain
|
|
5586 var parts = rurl.exec( s.url ),
|
|
5587 remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
|
|
5588
|
|
5589 // If we're requesting a remote document
|
|
5590 // and trying to load JSON or Script with a GET
|
|
5591 if ( s.dataType === "script" && type === "GET" && remote ) {
|
|
5592 var head = document.getElementsByTagName("head")[0] || document.documentElement;
|
|
5593 var script = document.createElement("script");
|
|
5594 if ( s.scriptCharset ) {
|
|
5595 script.charset = s.scriptCharset;
|
|
5596 }
|
|
5597 script.src = s.url;
|
|
5598
|
|
5599 // Handle Script loading
|
|
5600 if ( !jsonp ) {
|
|
5601 var done = false;
|
|
5602
|
|
5603 // Attach handlers for all browsers
|
|
5604 script.onload = script.onreadystatechange = function() {
|
|
5605 if ( !done && (!this.readyState ||
|
|
5606 this.readyState === "loaded" || this.readyState === "complete") ) {
|
|
5607 done = true;
|
|
5608 jQuery.handleSuccess( s, xhr, status, data );
|
|
5609 jQuery.handleComplete( s, xhr, status, data );
|
|
5610
|
|
5611 // Handle memory leak in IE
|
|
5612 script.onload = script.onreadystatechange = null;
|
|
5613 if ( head && script.parentNode ) {
|
|
5614 head.removeChild( script );
|
|
5615 }
|
|
5616 }
|
|
5617 };
|
|
5618 }
|
|
5619
|
|
5620 // Use insertBefore instead of appendChild to circumvent an IE6 bug.
|
|
5621 // This arises when a base node is used (#2709 and #4378).
|
|
5622 head.insertBefore( script, head.firstChild );
|
|
5623
|
|
5624 // We handle everything using the script element injection
|
|
5625 return undefined;
|
|
5626 }
|
|
5627
|
|
5628 var requestDone = false;
|
|
5629
|
|
5630 // Create the request object
|
|
5631 var xhr = s.xhr();
|
|
5632
|
|
5633 if ( !xhr ) {
|
|
5634 return;
|
|
5635 }
|
|
5636
|
|
5637 // Open the socket
|
|
5638 // Passing null username, generates a login popup on Opera (#2865)
|
|
5639 if ( s.username ) {
|
|
5640 xhr.open(type, s.url, s.async, s.username, s.password);
|
|
5641 } else {
|
|
5642 xhr.open(type, s.url, s.async);
|
|
5643 }
|
|
5644
|
|
5645 // Need an extra try/catch for cross domain requests in Firefox 3
|
|
5646 try {
|
|
5647 // Set content-type if data specified and content-body is valid for this type
|
|
5648 if ( (s.data != null && !noContent) || (origSettings && origSettings.contentType) ) {
|
|
5649 xhr.setRequestHeader("Content-Type", s.contentType);
|
|
5650 }
|
|
5651
|
|
5652 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
|
|
5653 if ( s.ifModified ) {
|
|
5654 if ( jQuery.lastModified[s.url] ) {
|
|
5655 xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]);
|
|
5656 }
|
|
5657
|
|
5658 if ( jQuery.etag[s.url] ) {
|
|
5659 xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]);
|
|
5660 }
|
|
5661 }
|
|
5662
|
|
5663 // Set header so the called script knows that it's an XMLHttpRequest
|
|
5664 // Only send the header if it's not a remote XHR
|
|
5665 if ( !remote ) {
|
|
5666 xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
|
|
5667 }
|
|
5668
|
|
5669 // Set the Accepts header for the server, depending on the dataType
|
|
5670 xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
|
|
5671 s.accepts[ s.dataType ] + ", */*; q=0.01" :
|
|
5672 s.accepts._default );
|
|
5673 } catch( headerError ) {}
|
|
5674
|
|
5675 // Allow custom headers/mimetypes and early abort
|
|
5676 if ( s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false ) {
|
|
5677 // Handle the global AJAX counter
|
|
5678 if ( s.global && jQuery.active-- === 1 ) {
|
|
5679 jQuery.event.trigger( "ajaxStop" );
|
|
5680 }
|
|
5681
|
|
5682 // close opended socket
|
|
5683 xhr.abort();
|
|
5684 return false;
|
|
5685 }
|
|
5686
|
|
5687 if ( s.global ) {
|
|
5688 jQuery.triggerGlobal( s, "ajaxSend", [xhr, s] );
|
|
5689 }
|
|
5690
|
|
5691 // Wait for a response to come back
|
|
5692 var onreadystatechange = xhr.onreadystatechange = function( isTimeout ) {
|
|
5693 // The request was aborted
|
|
5694 if ( !xhr || xhr.readyState === 0 || isTimeout === "abort" ) {
|
|
5695 // Opera doesn't call onreadystatechange before this point
|
|
5696 // so we simulate the call
|
|
5697 if ( !requestDone ) {
|
|
5698 jQuery.handleComplete( s, xhr, status, data );
|
|
5699 }
|
|
5700
|
|
5701 requestDone = true;
|
|
5702 if ( xhr ) {
|
|
5703 xhr.onreadystatechange = jQuery.noop;
|
|
5704 }
|
|
5705
|
|
5706 // The transfer is complete and the data is available, or the request timed out
|
|
5707 } else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) {
|
|
5708 requestDone = true;
|
|
5709 xhr.onreadystatechange = jQuery.noop;
|
|
5710
|
|
5711 status = isTimeout === "timeout" ?
|
|
5712 "timeout" :
|
|
5713 !jQuery.httpSuccess( xhr ) ?
|
|
5714 "error" :
|
|
5715 s.ifModified && jQuery.httpNotModified( xhr, s.url ) ?
|
|
5716 "notmodified" :
|
|
5717 "success";
|
|
5718
|
|
5719 var errMsg;
|
|
5720
|
|
5721 if ( status === "success" ) {
|
|
5722 // Watch for, and catch, XML document parse errors
|
|
5723 try {
|
|
5724 // process the data (runs the xml through httpData regardless of callback)
|
|
5725 data = jQuery.httpData( xhr, s.dataType, s );
|
|
5726 } catch( parserError ) {
|
|
5727 status = "parsererror";
|
|
5728 errMsg = parserError;
|
|
5729 }
|
|
5730 }
|
|
5731
|
|
5732 // Make sure that the request was successful or notmodified
|
|
5733 if ( status === "success" || status === "notmodified" ) {
|
|
5734 // JSONP handles its own success callback
|
|
5735 if ( !jsonp ) {
|
|
5736 jQuery.handleSuccess( s, xhr, status, data );
|
|
5737 }
|
|
5738 } else {
|
|
5739 jQuery.handleError( s, xhr, status, errMsg );
|
|
5740 }
|
|
5741
|
|
5742 // Fire the complete handlers
|
|
5743 if ( !jsonp ) {
|
|
5744 jQuery.handleComplete( s, xhr, status, data );
|
|
5745 }
|
|
5746
|
|
5747 if ( isTimeout === "timeout" ) {
|
|
5748 xhr.abort();
|
|
5749 }
|
|
5750
|
|
5751 // Stop memory leaks
|
|
5752 if ( s.async ) {
|
|
5753 xhr = null;
|
|
5754 }
|
|
5755 }
|
|
5756 };
|
|
5757
|
|
5758 // Override the abort handler, if we can (IE 6 doesn't allow it, but that's OK)
|
|
5759 // Opera doesn't fire onreadystatechange at all on abort
|
|
5760 try {
|
|
5761 var oldAbort = xhr.abort;
|
|
5762 xhr.abort = function() {
|
|
5763 // xhr.abort in IE7 is not a native JS function
|
|
5764 // and does not have a call property
|
|
5765 if ( xhr && oldAbort.call ) {
|
|
5766 oldAbort.call( xhr );
|
|
5767 }
|
|
5768
|
|
5769 onreadystatechange( "abort" );
|
|
5770 };
|
|
5771 } catch( abortError ) {}
|
|
5772
|
|
5773 // Timeout checker
|
|
5774 if ( s.async && s.timeout > 0 ) {
|
|
5775 setTimeout(function() {
|
|
5776 // Check to see if the request is still happening
|
|
5777 if ( xhr && !requestDone ) {
|
|
5778 onreadystatechange( "timeout" );
|
|
5779 }
|
|
5780 }, s.timeout);
|
|
5781 }
|
|
5782
|
|
5783 // Send the data
|
|
5784 try {
|
|
5785 xhr.send( noContent || s.data == null ? null : s.data );
|
|
5786
|
|
5787 } catch( sendError ) {
|
|
5788 jQuery.handleError( s, xhr, null, sendError );
|
|
5789
|
|
5790 // Fire the complete handlers
|
|
5791 jQuery.handleComplete( s, xhr, status, data );
|
|
5792 }
|
|
5793
|
|
5794 // firefox 1.5 doesn't fire statechange for sync requests
|
|
5795 if ( !s.async ) {
|
|
5796 onreadystatechange();
|
|
5797 }
|
|
5798
|
|
5799 // return XMLHttpRequest to allow aborting the request etc.
|
|
5800 return xhr;
|
|
5801 },
|
|
5802
|
|
5803 // Serialize an array of form elements or a set of
|
|
5804 // key/values into a query string
|
|
5805 param: function( a, traditional ) {
|
|
5806 var s = [], add = function( key, value ) {
|
|
5807 // If value is a function, invoke it and return its value
|
|
5808 value = jQuery.isFunction(value) ? value() : value;
|
|
5809 s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
|
|
5810 };
|
|
5811
|
|
5812 // Set traditional to true for jQuery <= 1.3.2 behavior.
|
|
5813 if ( traditional === undefined ) {
|
|
5814 traditional = jQuery.ajaxSettings.traditional;
|
|
5815 }
|
|
5816
|
|
5817 // If an array was passed in, assume that it is an array of form elements.
|
|
5818 if ( jQuery.isArray(a) || a.jquery ) {
|
|
5819 // Serialize the form elements
|
|
5820 jQuery.each( a, function() {
|
|
5821 add( this.name, this.value );
|
|
5822 });
|
|
5823
|
|
5824 } else {
|
|
5825 // If traditional, encode the "old" way (the way 1.3.2 or older
|
|
5826 // did it), otherwise encode params recursively.
|
|
5827 for ( var prefix in a ) {
|
|
5828 buildParams( prefix, a[prefix], traditional, add );
|
|
5829 }
|
|
5830 }
|
|
5831
|
|
5832 // Return the resulting serialization
|
|
5833 return s.join("&").replace(r20, "+");
|
|
5834 }
|
|
5835 });
|
|
5836
|
|
5837 function buildParams( prefix, obj, traditional, add ) {
|
|
5838 if ( jQuery.isArray(obj) && obj.length ) {
|
|
5839 // Serialize array item.
|
|
5840 jQuery.each( obj, function( i, v ) {
|
|
5841 if ( traditional || rbracket.test( prefix ) ) {
|
|
5842 // Treat each array item as a scalar.
|
|
5843 add( prefix, v );
|
|
5844
|
|
5845 } else {
|
|
5846 // If array item is non-scalar (array or object), encode its
|
|
5847 // numeric index to resolve deserialization ambiguity issues.
|
|
5848 // Note that rack (as of 1.0.0) can't currently deserialize
|
|
5849 // nested arrays properly, and attempting to do so may cause
|
|
5850 // a server error. Possible fixes are to modify rack's
|
|
5851 // deserialization algorithm or to provide an option or flag
|
|
5852 // to force array serialization to be shallow.
|
|
5853 buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
|
|
5854 }
|
|
5855 });
|
|
5856
|
|
5857 } else if ( !traditional && obj != null && typeof obj === "object" ) {
|
|
5858 if ( jQuery.isEmptyObject( obj ) ) {
|
|
5859 add( prefix, "" );
|
|
5860
|
|
5861 // Serialize object item.
|
|
5862 } else {
|
|
5863 jQuery.each( obj, function( k, v ) {
|
|
5864 buildParams( prefix + "[" + k + "]", v, traditional, add );
|
|
5865 });
|
|
5866 }
|
|
5867
|
|
5868 } else {
|
|
5869 // Serialize scalar item.
|
|
5870 add( prefix, obj );
|
|
5871 }
|
|
5872 }
|
|
5873
|
|
5874 // This is still on the jQuery object... for now
|
|
5875 // Want to move this to jQuery.ajax some day
|
|
5876 jQuery.extend({
|
|
5877
|
|
5878 // Counter for holding the number of active queries
|
|
5879 active: 0,
|
|
5880
|
|
5881 // Last-Modified header cache for next request
|
|
5882 lastModified: {},
|
|
5883 etag: {},
|
|
5884
|
|
5885 handleError: function( s, xhr, status, e ) {
|
|
5886 // If a local callback was specified, fire it
|
|
5887 if ( s.error ) {
|
|
5888 s.error.call( s.context, xhr, status, e );
|
|
5889 }
|
|
5890
|
|
5891 // Fire the global callback
|
|
5892 if ( s.global ) {
|
|
5893 jQuery.triggerGlobal( s, "ajaxError", [xhr, s, e] );
|
|
5894 }
|
|
5895 },
|
|
5896
|
|
5897 handleSuccess: function( s, xhr, status, data ) {
|
|
5898 // If a local callback was specified, fire it and pass it the data
|
|
5899 if ( s.success ) {
|
|
5900 s.success.call( s.context, data, status, xhr );
|
|
5901 }
|
|
5902
|
|
5903 // Fire the global callback
|
|
5904 if ( s.global ) {
|
|
5905 jQuery.triggerGlobal( s, "ajaxSuccess", [xhr, s] );
|
|
5906 }
|
|
5907 },
|
|
5908
|
|
5909 handleComplete: function( s, xhr, status ) {
|
|
5910 // Process result
|
|
5911 if ( s.complete ) {
|
|
5912 s.complete.call( s.context, xhr, status );
|
|
5913 }
|
|
5914
|
|
5915 // The request was completed
|
|
5916 if ( s.global ) {
|
|
5917 jQuery.triggerGlobal( s, "ajaxComplete", [xhr, s] );
|
|
5918 }
|
|
5919
|
|
5920 // Handle the global AJAX counter
|
|
5921 if ( s.global && jQuery.active-- === 1 ) {
|
|
5922 jQuery.event.trigger( "ajaxStop" );
|
|
5923 }
|
|
5924 },
|
|
5925
|
|
5926 triggerGlobal: function( s, type, args ) {
|
|
5927 (s.context && s.context.url == null ? jQuery(s.context) : jQuery.event).trigger(type, args);
|
|
5928 },
|
|
5929
|
|
5930 // Determines if an XMLHttpRequest was successful or not
|
|
5931 httpSuccess: function( xhr ) {
|
|
5932 try {
|
|
5933 // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
|
|
5934 return !xhr.status && location.protocol === "file:" ||
|
|
5935 xhr.status >= 200 && xhr.status < 300 ||
|
|
5936 xhr.status === 304 || xhr.status === 1223;
|
|
5937 } catch(e) {}
|
|
5938
|
|
5939 return false;
|
|
5940 },
|
|
5941
|
|
5942 // Determines if an XMLHttpRequest returns NotModified
|
|
5943 httpNotModified: function( xhr, url ) {
|
|
5944 var lastModified = xhr.getResponseHeader("Last-Modified"),
|
|
5945 etag = xhr.getResponseHeader("Etag");
|
|
5946
|
|
5947 if ( lastModified ) {
|
|
5948 jQuery.lastModified[url] = lastModified;
|
|
5949 }
|
|
5950
|
|
5951 if ( etag ) {
|
|
5952 jQuery.etag[url] = etag;
|
|
5953 }
|
|
5954
|
|
5955 return xhr.status === 304;
|
|
5956 },
|
|
5957
|
|
5958 httpData: function( xhr, type, s ) {
|
|
5959 var ct = xhr.getResponseHeader("content-type") || "",
|
|
5960 xml = type === "xml" || !type && ct.indexOf("xml") >= 0,
|
|
5961 data = xml ? xhr.responseXML : xhr.responseText;
|
|
5962
|
|
5963 if ( xml && data.documentElement.nodeName === "parsererror" ) {
|
|
5964 jQuery.error( "parsererror" );
|
|
5965 }
|
|
5966
|
|
5967 // Allow a pre-filtering function to sanitize the response
|
|
5968 // s is checked to keep backwards compatibility
|
|
5969 if ( s && s.dataFilter ) {
|
|
5970 data = s.dataFilter( data, type );
|
|
5971 }
|
|
5972
|
|
5973 // The filter can actually parse the response
|
|
5974 if ( typeof data === "string" ) {
|
|
5975 // Get the JavaScript object, if JSON is used.
|
|
5976 if ( type === "json" || !type && ct.indexOf("json") >= 0 ) {
|
|
5977 data = jQuery.parseJSON( data );
|
|
5978
|
|
5979 // If the type is "script", eval it in global context
|
|
5980 } else if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) {
|
|
5981 jQuery.globalEval( data );
|
|
5982 }
|
|
5983 }
|
|
5984
|
|
5985 return data;
|
|
5986 }
|
|
5987
|
|
5988 });
|
|
5989
|
|
5990 /*
|
|
5991 * Create the request object; Microsoft failed to properly
|
|
5992 * implement the XMLHttpRequest in IE7 (can't request local files),
|
|
5993 * so we use the ActiveXObject when it is available
|
|
5994 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
|
|
5995 * we need a fallback.
|
|
5996 */
|
|
5997 if ( window.ActiveXObject ) {
|
|
5998 jQuery.ajaxSettings.xhr = function() {
|
|
5999 if ( window.location.protocol !== "file:" ) {
|
|
6000 try {
|
|
6001 return new window.XMLHttpRequest();
|
|
6002 } catch(xhrError) {}
|
|
6003 }
|
|
6004
|
|
6005 try {
|
|
6006 return new window.ActiveXObject("Microsoft.XMLHTTP");
|
|
6007 } catch(activeError) {}
|
|
6008 };
|
|
6009 }
|
|
6010
|
|
6011 // Does this browser support XHR requests?
|
|
6012 jQuery.support.ajax = !!jQuery.ajaxSettings.xhr();
|
|
6013
|
|
6014
|
|
6015
|
|
6016
|
|
6017 var elemdisplay = {},
|
|
6018 rfxtypes = /^(?:toggle|show|hide)$/,
|
|
6019 rfxnum = /^([+\-]=)?([\d+.\-]+)(.*)$/,
|
|
6020 timerId,
|
|
6021 fxAttrs = [
|
|
6022 // height animations
|
|
6023 [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
|
|
6024 // width animations
|
|
6025 [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
|
|
6026 // opacity animations
|
|
6027 [ "opacity" ]
|
|
6028 ];
|
|
6029
|
|
6030 jQuery.fn.extend({
|
|
6031 show: function( speed, easing, callback ) {
|
|
6032 if ( speed || speed === 0 ) {
|
|
6033 return this.animate( genFx("show", 3), speed, easing, callback);
|
|
6034 } else {
|
|
6035 for ( var i = 0, j = this.length; i < j; i++ ) {
|
|
6036 // Reset the inline display of this element to learn if it is
|
|
6037 // being hidden by cascaded rules or not
|
|
6038 if ( !jQuery.data(this[i], "olddisplay") && this[i].style.display === "none" ) {
|
|
6039 this[i].style.display = "";
|
|
6040 }
|
|
6041
|
|
6042 // Set elements which have been overridden with display: none
|
|
6043 // in a stylesheet to whatever the default browser style is
|
|
6044 // for such an element
|
|
6045 if ( this[i].style.display === "" && jQuery.css( this[i], "display" ) === "none" ) {
|
|
6046 jQuery.data(this[i], "olddisplay", defaultDisplay(this[i].nodeName));
|
|
6047 }
|
|
6048 }
|
|
6049
|
|
6050 // Set the display of most of the elements in a second loop
|
|
6051 // to avoid the constant reflow
|
|
6052 for ( i = 0; i < j; i++ ) {
|
|
6053 this[i].style.display = jQuery.data(this[i], "olddisplay") || "";
|
|
6054 }
|
|
6055
|
|
6056 return this;
|
|
6057 }
|
|
6058 },
|
|
6059
|
|
6060 hide: function( speed, easing, callback ) {
|
|
6061 if ( speed || speed === 0 ) {
|
|
6062 return this.animate( genFx("hide", 3), speed, easing, callback);
|
|
6063
|
|
6064 } else {
|
|
6065 for ( var i = 0, j = this.length; i < j; i++ ) {
|
|
6066 var display = jQuery.css( this[i], "display" );
|
|
6067
|
|
6068 if ( display !== "none" ) {
|
|
6069 jQuery.data( this[i], "olddisplay", display );
|
|
6070 }
|
|
6071 }
|
|
6072
|
|
6073 // Set the display of the elements in a second loop
|
|
6074 // to avoid the constant reflow
|
|
6075 for ( i = 0; i < j; i++ ) {
|
|
6076 this[i].style.display = "none";
|
|
6077 }
|
|
6078
|
|
6079 return this;
|
|
6080 }
|
|
6081 },
|
|
6082
|
|
6083 // Save the old toggle function
|
|
6084 _toggle: jQuery.fn.toggle,
|
|
6085
|
|
6086 toggle: function( fn, fn2, callback ) {
|
|
6087 var bool = typeof fn === "boolean";
|
|
6088
|
|
6089 if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
|
|
6090 this._toggle.apply( this, arguments );
|
|
6091
|
|
6092 } else if ( fn == null || bool ) {
|
|
6093 this.each(function() {
|
|
6094 var state = bool ? fn : jQuery(this).is(":hidden");
|
|
6095 jQuery(this)[ state ? "show" : "hide" ]();
|
|
6096 });
|
|
6097
|
|
6098 } else {
|
|
6099 this.animate(genFx("toggle", 3), fn, fn2, callback);
|
|
6100 }
|
|
6101
|
|
6102 return this;
|
|
6103 },
|
|
6104
|
|
6105 fadeTo: function( speed, to, easing, callback ) {
|
|
6106 return this.filter(":hidden").css("opacity", 0).show().end()
|
|
6107 .animate({opacity: to}, speed, easing, callback);
|
|
6108 },
|
|
6109
|
|
6110 animate: function( prop, speed, easing, callback ) {
|
|
6111 var optall = jQuery.speed(speed, easing, callback);
|
|
6112
|
|
6113 if ( jQuery.isEmptyObject( prop ) ) {
|
|
6114 return this.each( optall.complete );
|
|
6115 }
|
|
6116
|
|
6117 return this[ optall.queue === false ? "each" : "queue" ](function() {
|
|
6118 // XXX ‘this’ does not always have a nodeName when running the
|
|
6119 // test suite
|
|
6120
|
|
6121 var opt = jQuery.extend({}, optall), p,
|
|
6122 isElement = this.nodeType === 1,
|
|
6123 hidden = isElement && jQuery(this).is(":hidden"),
|
|
6124 self = this;
|
|
6125
|
|
6126 for ( p in prop ) {
|
|
6127 var name = jQuery.camelCase( p );
|
|
6128
|
|
6129 if ( p !== name ) {
|
|
6130 prop[ name ] = prop[ p ];
|
|
6131 delete prop[ p ];
|
|
6132 p = name;
|
|
6133 }
|
|
6134
|
|
6135 if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {
|
|
6136 return opt.complete.call(this);
|
|
6137 }
|
|
6138
|
|
6139 if ( isElement && ( p === "height" || p === "width" ) ) {
|
|
6140 // Make sure that nothing sneaks out
|
|
6141 // Record all 3 overflow attributes because IE does not
|
|
6142 // change the overflow attribute when overflowX and
|
|
6143 // overflowY are set to the same value
|
|
6144 opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
|
|
6145
|
|
6146 // Set display property to inline-block for height/width
|
|
6147 // animations on inline elements that are having width/height
|
|
6148 // animated
|
|
6149 if ( jQuery.css( this, "display" ) === "inline" &&
|
|
6150 jQuery.css( this, "float" ) === "none" ) {
|
|
6151 if ( !jQuery.support.inlineBlockNeedsLayout ) {
|
|
6152 this.style.display = "inline-block";
|
|
6153
|
|
6154 } else {
|
|
6155 var display = defaultDisplay(this.nodeName);
|
|
6156
|
|
6157 // inline-level elements accept inline-block;
|
|
6158 // block-level elements need to be inline with layout
|
|
6159 if ( display === "inline" ) {
|
|
6160 this.style.display = "inline-block";
|
|
6161
|
|
6162 } else {
|
|
6163 this.style.display = "inline";
|
|
6164 this.style.zoom = 1;
|
|
6165 }
|
|
6166 }
|
|
6167 }
|
|
6168 }
|
|
6169
|
|
6170 if ( jQuery.isArray( prop[p] ) ) {
|
|
6171 // Create (if needed) and add to specialEasing
|
|
6172 (opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
|
|
6173 prop[p] = prop[p][0];
|
|
6174 }
|
|
6175 }
|
|
6176
|
|
6177 if ( opt.overflow != null ) {
|
|
6178 this.style.overflow = "hidden";
|
|
6179 }
|
|
6180
|
|
6181 opt.curAnim = jQuery.extend({}, prop);
|
|
6182
|
|
6183 jQuery.each( prop, function( name, val ) {
|
|
6184 var e = new jQuery.fx( self, opt, name );
|
|
6185
|
|
6186 if ( rfxtypes.test(val) ) {
|
|
6187 e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );
|
|
6188
|
|
6189 } else {
|
|
6190 var parts = rfxnum.exec(val),
|
|
6191 start = e.cur(true) || 0;
|
|
6192
|
|
6193 if ( parts ) {
|
|
6194 var end = parseFloat( parts[2] ),
|
|
6195 unit = parts[3] || "px";
|
|
6196
|
|
6197 // We need to compute starting value
|
|
6198 if ( unit !== "px" ) {
|
|
6199 jQuery.style( self, name, (end || 1) + unit);
|
|
6200 start = ((end || 1) / e.cur(true)) * start;
|
|
6201 jQuery.style( self, name, start + unit);
|
|
6202 }
|
|
6203
|
|
6204 // If a +=/-= token was provided, we're doing a relative animation
|
|
6205 if ( parts[1] ) {
|
|
6206 end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
|
|
6207 }
|
|
6208
|
|
6209 e.custom( start, end, unit );
|
|
6210
|
|
6211 } else {
|
|
6212 e.custom( start, val, "" );
|
|
6213 }
|
|
6214 }
|
|
6215 });
|
|
6216
|
|
6217 // For JS strict compliance
|
|
6218 return true;
|
|
6219 });
|
|
6220 },
|
|
6221
|
|
6222 stop: function( clearQueue, gotoEnd ) {
|
|
6223 var timers = jQuery.timers;
|
|
6224
|
|
6225 if ( clearQueue ) {
|
|
6226 this.queue([]);
|
|
6227 }
|
|
6228
|
|
6229 this.each(function() {
|
|
6230 // go in reverse order so anything added to the queue during the loop is ignored
|
|
6231 for ( var i = timers.length - 1; i >= 0; i-- ) {
|
|
6232 if ( timers[i].elem === this ) {
|
|
6233 if (gotoEnd) {
|
|
6234 // force the next step to be the last
|
|
6235 timers[i](true);
|
|
6236 }
|
|
6237
|
|
6238 timers.splice(i, 1);
|
|
6239 }
|
|
6240 }
|
|
6241 });
|
|
6242
|
|
6243 // start the next in the queue if the last step wasn't forced
|
|
6244 if ( !gotoEnd ) {
|
|
6245 this.dequeue();
|
|
6246 }
|
|
6247
|
|
6248 return this;
|
|
6249 }
|
|
6250
|
|
6251 });
|
|
6252
|
|
6253 function genFx( type, num ) {
|
|
6254 var obj = {};
|
|
6255
|
|
6256 jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
|
|
6257 obj[ this ] = type;
|
|
6258 });
|
|
6259
|
|
6260 return obj;
|
|
6261 }
|
|
6262
|
|
6263 // Generate shortcuts for custom animations
|
|
6264 jQuery.each({
|
|
6265 slideDown: genFx("show", 1),
|
|
6266 slideUp: genFx("hide", 1),
|
|
6267 slideToggle: genFx("toggle", 1),
|
|
6268 fadeIn: { opacity: "show" },
|
|
6269 fadeOut: { opacity: "hide" }
|
|
6270 }, function( name, props ) {
|
|
6271 jQuery.fn[ name ] = function( speed, easing, callback ) {
|
|
6272 return this.animate( props, speed, easing, callback );
|
|
6273 };
|
|
6274 });
|
|
6275
|
|
6276 jQuery.extend({
|
|
6277 speed: function( speed, easing, fn ) {
|
|
6278 var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
|
|
6279 complete: fn || !fn && easing ||
|
|
6280 jQuery.isFunction( speed ) && speed,
|
|
6281 duration: speed,
|
|
6282 easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
|
|
6283 };
|
|
6284
|
|
6285 opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
|
|
6286 opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
|
|
6287
|
|
6288 // Queueing
|
|
6289 opt.old = opt.complete;
|
|
6290 opt.complete = function() {
|
|
6291 if ( opt.queue !== false ) {
|
|
6292 jQuery(this).dequeue();
|
|
6293 }
|
|
6294 if ( jQuery.isFunction( opt.old ) ) {
|
|
6295 opt.old.call( this );
|
|
6296 }
|
|
6297 };
|
|
6298
|
|
6299 return opt;
|
|
6300 },
|
|
6301
|
|
6302 easing: {
|
|
6303 linear: function( p, n, firstNum, diff ) {
|
|
6304 return firstNum + diff * p;
|
|
6305 },
|
|
6306 swing: function( p, n, firstNum, diff ) {
|
|
6307 return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
|
|
6308 }
|
|
6309 },
|
|
6310
|
|
6311 timers: [],
|
|
6312
|
|
6313 fx: function( elem, options, prop ) {
|
|
6314 this.options = options;
|
|
6315 this.elem = elem;
|
|
6316 this.prop = prop;
|
|
6317
|
|
6318 if ( !options.orig ) {
|
|
6319 options.orig = {};
|
|
6320 }
|
|
6321 }
|
|
6322
|
|
6323 });
|
|
6324
|
|
6325 jQuery.fx.prototype = {
|
|
6326 // Simple function for setting a style value
|
|
6327 update: function() {
|
|
6328 if ( this.options.step ) {
|
|
6329 this.options.step.call( this.elem, this.now, this );
|
|
6330 }
|
|
6331
|
|
6332 (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
|
|
6333 },
|
|
6334
|
|
6335 // Get the current size
|
|
6336 cur: function() {
|
|
6337 if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
|
|
6338 return this.elem[ this.prop ];
|
|
6339 }
|
|
6340
|
|
6341 var r = parseFloat( jQuery.css( this.elem, this.prop ) );
|
|
6342 return r && r > -10000 ? r : 0;
|
|
6343 },
|
|
6344
|
|
6345 // Start an animation from one number to another
|
|
6346 custom: function( from, to, unit ) {
|
|
6347 this.startTime = jQuery.now();
|
|
6348 this.start = from;
|
|
6349 this.end = to;
|
|
6350 this.unit = unit || this.unit || "px";
|
|
6351 this.now = this.start;
|
|
6352 this.pos = this.state = 0;
|
|
6353
|
|
6354 var self = this, fx = jQuery.fx;
|
|
6355 function t( gotoEnd ) {
|
|
6356 return self.step(gotoEnd);
|
|
6357 }
|
|
6358
|
|
6359 t.elem = this.elem;
|
|
6360
|
|
6361 if ( t() && jQuery.timers.push(t) && !timerId ) {
|
|
6362 timerId = setInterval(fx.tick, fx.interval);
|
|
6363 }
|
|
6364 },
|
|
6365
|
|
6366 // Simple 'show' function
|
|
6367 show: function() {
|
|
6368 // Remember where we started, so that we can go back to it later
|
|
6369 this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
|
|
6370 this.options.show = true;
|
|
6371
|
|
6372 // Begin the animation
|
|
6373 // Make sure that we start at a small width/height to avoid any
|
|
6374 // flash of content
|
|
6375 this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
|
|
6376
|
|
6377 // Start by showing the element
|
|
6378 jQuery( this.elem ).show();
|
|
6379 },
|
|
6380
|
|
6381 // Simple 'hide' function
|
|
6382 hide: function() {
|
|
6383 // Remember where we started, so that we can go back to it later
|
|
6384 this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
|
|
6385 this.options.hide = true;
|
|
6386
|
|
6387 // Begin the animation
|
|
6388 this.custom(this.cur(), 0);
|
|
6389 },
|
|
6390
|
|
6391 // Each step of an animation
|
|
6392 step: function( gotoEnd ) {
|
|
6393 var t = jQuery.now(), done = true;
|
|
6394
|
|
6395 if ( gotoEnd || t >= this.options.duration + this.startTime ) {
|
|
6396 this.now = this.end;
|
|
6397 this.pos = this.state = 1;
|
|
6398 this.update();
|
|
6399
|
|
6400 this.options.curAnim[ this.prop ] = true;
|
|
6401
|
|
6402 for ( var i in this.options.curAnim ) {
|
|
6403 if ( this.options.curAnim[i] !== true ) {
|
|
6404 done = false;
|
|
6405 }
|
|
6406 }
|
|
6407
|
|
6408 if ( done ) {
|
|
6409 // Reset the overflow
|
|
6410 if ( this.options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
|
|
6411 var elem = this.elem, options = this.options;
|
|
6412 jQuery.each( [ "", "X", "Y" ], function (index, value) {
|
|
6413 elem.style[ "overflow" + value ] = options.overflow[index];
|
|
6414 } );
|
|
6415 }
|
|
6416
|
|
6417 // Hide the element if the "hide" operation was done
|
|
6418 if ( this.options.hide ) {
|
|
6419 jQuery(this.elem).hide();
|
|
6420 }
|
|
6421
|
|
6422 // Reset the properties, if the item has been hidden or shown
|
|
6423 if ( this.options.hide || this.options.show ) {
|
|
6424 for ( var p in this.options.curAnim ) {
|
|
6425 jQuery.style( this.elem, p, this.options.orig[p] );
|
|
6426 }
|
|
6427 }
|
|
6428
|
|
6429 // Execute the complete function
|
|
6430 this.options.complete.call( this.elem );
|
|
6431 }
|
|
6432
|
|
6433 return false;
|
|
6434
|
|
6435 } else {
|
|
6436 var n = t - this.startTime;
|
|
6437 this.state = n / this.options.duration;
|
|
6438
|
|
6439 // Perform the easing function, defaults to swing
|
|
6440 var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
|
|
6441 var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
|
|
6442 this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
|
|
6443 this.now = this.start + ((this.end - this.start) * this.pos);
|
|
6444
|
|
6445 // Perform the next step of the animation
|
|
6446 this.update();
|
|
6447 }
|
|
6448
|
|
6449 return true;
|
|
6450 }
|
|
6451 };
|
|
6452
|
|
6453 jQuery.extend( jQuery.fx, {
|
|
6454 tick: function() {
|
|
6455 var timers = jQuery.timers;
|
|
6456
|
|
6457 for ( var i = 0; i < timers.length; i++ ) {
|
|
6458 if ( !timers[i]() ) {
|
|
6459 timers.splice(i--, 1);
|
|
6460 }
|
|
6461 }
|
|
6462
|
|
6463 if ( !timers.length ) {
|
|
6464 jQuery.fx.stop();
|
|
6465 }
|
|
6466 },
|
|
6467
|
|
6468 interval: 13,
|
|
6469
|
|
6470 stop: function() {
|
|
6471 clearInterval( timerId );
|
|
6472 timerId = null;
|
|
6473 },
|
|
6474
|
|
6475 speeds: {
|
|
6476 slow: 600,
|
|
6477 fast: 200,
|
|
6478 // Default speed
|
|
6479 _default: 400
|
|
6480 },
|
|
6481
|
|
6482 step: {
|
|
6483 opacity: function( fx ) {
|
|
6484 jQuery.style( fx.elem, "opacity", fx.now );
|
|
6485 },
|
|
6486
|
|
6487 _default: function( fx ) {
|
|
6488 if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
|
|
6489 fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
|
|
6490 } else {
|
|
6491 fx.elem[ fx.prop ] = fx.now;
|
|
6492 }
|
|
6493 }
|
|
6494 }
|
|
6495 });
|
|
6496
|
|
6497 if ( jQuery.expr && jQuery.expr.filters ) {
|
|
6498 jQuery.expr.filters.animated = function( elem ) {
|
|
6499 return jQuery.grep(jQuery.timers, function( fn ) {
|
|
6500 return elem === fn.elem;
|
|
6501 }).length;
|
|
6502 };
|
|
6503 }
|
|
6504
|
|
6505 function defaultDisplay( nodeName ) {
|
|
6506 if ( !elemdisplay[ nodeName ] ) {
|
|
6507 var elem = jQuery("<" + nodeName + ">").appendTo("body"),
|
|
6508 display = elem.css("display");
|
|
6509
|
|
6510 elem.remove();
|
|
6511
|
|
6512 if ( display === "none" || display === "" ) {
|
|
6513 display = "block";
|
|
6514 }
|
|
6515
|
|
6516 elemdisplay[ nodeName ] = display;
|
|
6517 }
|
|
6518
|
|
6519 return elemdisplay[ nodeName ];
|
|
6520 }
|
|
6521
|
|
6522
|
|
6523
|
|
6524
|
|
6525 var rtable = /^t(?:able|d|h)$/i,
|
|
6526 rroot = /^(?:body|html)$/i;
|
|
6527
|
|
6528 if ( "getBoundingClientRect" in document.documentElement ) {
|
|
6529 jQuery.fn.offset = function( options ) {
|
|
6530 var elem = this[0], box;
|
|
6531
|
|
6532 if ( options ) {
|
|
6533 return this.each(function( i ) {
|
|
6534 jQuery.offset.setOffset( this, options, i );
|
|
6535 });
|
|
6536 }
|
|
6537
|
|
6538 if ( !elem || !elem.ownerDocument ) {
|
|
6539 return null;
|
|
6540 }
|
|
6541
|
|
6542 if ( elem === elem.ownerDocument.body ) {
|
|
6543 return jQuery.offset.bodyOffset( elem );
|
|
6544 }
|
|
6545
|
|
6546 try {
|
|
6547 box = elem.getBoundingClientRect();
|
|
6548 } catch(e) {}
|
|
6549
|
|
6550 var doc = elem.ownerDocument,
|
|
6551 docElem = doc.documentElement;
|
|
6552
|
|
6553 // Make sure we're not dealing with a disconnected DOM node
|
|
6554 if ( !box || !jQuery.contains( docElem, elem ) ) {
|
|
6555 return box || { top: 0, left: 0 };
|
|
6556 }
|
|
6557
|
|
6558 var body = doc.body,
|
|
6559 win = getWindow(doc),
|
|
6560 clientTop = docElem.clientTop || body.clientTop || 0,
|
|
6561 clientLeft = docElem.clientLeft || body.clientLeft || 0,
|
|
6562 scrollTop = (win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop ),
|
|
6563 scrollLeft = (win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft),
|
|
6564 top = box.top + scrollTop - clientTop,
|
|
6565 left = box.left + scrollLeft - clientLeft;
|
|
6566
|
|
6567 return { top: top, left: left };
|
|
6568 };
|
|
6569
|
|
6570 } else {
|
|
6571 jQuery.fn.offset = function( options ) {
|
|
6572 var elem = this[0];
|
|
6573
|
|
6574 if ( options ) {
|
|
6575 return this.each(function( i ) {
|
|
6576 jQuery.offset.setOffset( this, options, i );
|
|
6577 });
|
|
6578 }
|
|
6579
|
|
6580 if ( !elem || !elem.ownerDocument ) {
|
|
6581 return null;
|
|
6582 }
|
|
6583
|
|
6584 if ( elem === elem.ownerDocument.body ) {
|
|
6585 return jQuery.offset.bodyOffset( elem );
|
|
6586 }
|
|
6587
|
|
6588 jQuery.offset.initialize();
|
|
6589
|
|
6590 var offsetParent = elem.offsetParent, prevOffsetParent = elem,
|
|
6591 doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
|
|
6592 body = doc.body, defaultView = doc.defaultView,
|
|
6593 prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
|
|
6594 top = elem.offsetTop, left = elem.offsetLeft;
|
|
6595
|
|
6596 while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
|
|
6597 if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
|
|
6598 break;
|
|
6599 }
|
|
6600
|
|
6601 computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
|
|
6602 top -= elem.scrollTop;
|
|
6603 left -= elem.scrollLeft;
|
|
6604
|
|
6605 if ( elem === offsetParent ) {
|
|
6606 top += elem.offsetTop;
|
|
6607 left += elem.offsetLeft;
|
|
6608
|
|
6609 if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
|
|
6610 top += parseFloat( computedStyle.borderTopWidth ) || 0;
|
|
6611 left += parseFloat( computedStyle.borderLeftWidth ) || 0;
|
|
6612 }
|
|
6613
|
|
6614 prevOffsetParent = offsetParent;
|
|
6615 offsetParent = elem.offsetParent;
|
|
6616 }
|
|
6617
|
|
6618 if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
|
|
6619 top += parseFloat( computedStyle.borderTopWidth ) || 0;
|
|
6620 left += parseFloat( computedStyle.borderLeftWidth ) || 0;
|
|
6621 }
|
|
6622
|
|
6623 prevComputedStyle = computedStyle;
|
|
6624 }
|
|
6625
|
|
6626 if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
|
|
6627 top += body.offsetTop;
|
|
6628 left += body.offsetLeft;
|
|
6629 }
|
|
6630
|
|
6631 if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
|
|
6632 top += Math.max( docElem.scrollTop, body.scrollTop );
|
|
6633 left += Math.max( docElem.scrollLeft, body.scrollLeft );
|
|
6634 }
|
|
6635
|
|
6636 return { top: top, left: left };
|
|
6637 };
|
|
6638 }
|
|
6639
|
|
6640 jQuery.offset = {
|
|
6641 initialize: function() {
|
|
6642 var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
|
|
6643 html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
|
|
6644
|
|
6645 jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
|
|
6646
|
|
6647 container.innerHTML = html;
|
|
6648 body.insertBefore( container, body.firstChild );
|
|
6649 innerDiv = container.firstChild;
|
|
6650 checkDiv = innerDiv.firstChild;
|
|
6651 td = innerDiv.nextSibling.firstChild.firstChild;
|
|
6652
|
|
6653 this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
|
|
6654 this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
|
|
6655
|
|
6656 checkDiv.style.position = "fixed";
|
|
6657 checkDiv.style.top = "20px";
|
|
6658
|
|
6659 // safari subtracts parent border width here which is 5px
|
|
6660 this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
|
|
6661 checkDiv.style.position = checkDiv.style.top = "";
|
|
6662
|
|
6663 innerDiv.style.overflow = "hidden";
|
|
6664 innerDiv.style.position = "relative";
|
|
6665
|
|
6666 this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
|
|
6667
|
|
6668 this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
|
|
6669
|
|
6670 body.removeChild( container );
|
|
6671 body = container = innerDiv = checkDiv = table = td = null;
|
|
6672 jQuery.offset.initialize = jQuery.noop;
|
|
6673 },
|
|
6674
|
|
6675 bodyOffset: function( body ) {
|
|
6676 var top = body.offsetTop, left = body.offsetLeft;
|
|
6677
|
|
6678 jQuery.offset.initialize();
|
|
6679
|
|
6680 if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
|
|
6681 top += parseFloat( jQuery.css(body, "marginTop") ) || 0;
|
|
6682 left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
|
|
6683 }
|
|
6684
|
|
6685 return { top: top, left: left };
|
|
6686 },
|
|
6687
|
|
6688 setOffset: function( elem, options, i ) {
|
|
6689 var position = jQuery.css( elem, "position" );
|
|
6690
|
|
6691 // set position first, in-case top/left are set even on static elem
|
|
6692 if ( position === "static" ) {
|
|
6693 elem.style.position = "relative";
|
|
6694 }
|
|
6695
|
|
6696 var curElem = jQuery( elem ),
|
|
6697 curOffset = curElem.offset(),
|
|
6698 curCSSTop = jQuery.css( elem, "top" ),
|
|
6699 curCSSLeft = jQuery.css( elem, "left" ),
|
|
6700 calculatePosition = (position === "absolute" && jQuery.inArray('auto', [curCSSTop, curCSSLeft]) > -1),
|
|
6701 props = {}, curPosition = {}, curTop, curLeft;
|
|
6702
|
|
6703 // need to be able to calculate position if either top or left is auto and position is absolute
|
|
6704 if ( calculatePosition ) {
|
|
6705 curPosition = curElem.position();
|
|
6706 }
|
|
6707
|
|
6708 curTop = calculatePosition ? curPosition.top : parseInt( curCSSTop, 10 ) || 0;
|
|
6709 curLeft = calculatePosition ? curPosition.left : parseInt( curCSSLeft, 10 ) || 0;
|
|
6710
|
|
6711 if ( jQuery.isFunction( options ) ) {
|
|
6712 options = options.call( elem, i, curOffset );
|
|
6713 }
|
|
6714
|
|
6715 if (options.top != null) {
|
|
6716 props.top = (options.top - curOffset.top) + curTop;
|
|
6717 }
|
|
6718 if (options.left != null) {
|
|
6719 props.left = (options.left - curOffset.left) + curLeft;
|
|
6720 }
|
|
6721
|
|
6722 if ( "using" in options ) {
|
|
6723 options.using.call( elem, props );
|
|
6724 } else {
|
|
6725 curElem.css( props );
|
|
6726 }
|
|
6727 }
|
|
6728 };
|
|
6729
|
|
6730
|
|
6731 jQuery.fn.extend({
|
|
6732 position: function() {
|
|
6733 if ( !this[0] ) {
|
|
6734 return null;
|
|
6735 }
|
|
6736
|
|
6737 var elem = this[0],
|
|
6738
|
|
6739 // Get *real* offsetParent
|
|
6740 offsetParent = this.offsetParent(),
|
|
6741
|
|
6742 // Get correct offsets
|
|
6743 offset = this.offset(),
|
|
6744 parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
|
|
6745
|
|
6746 // Subtract element margins
|
|
6747 // note: when an element has margin: auto the offsetLeft and marginLeft
|
|
6748 // are the same in Safari causing offset.left to incorrectly be 0
|
|
6749 offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
|
|
6750 offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
|
|
6751
|
|
6752 // Add offsetParent borders
|
|
6753 parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
|
|
6754 parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
|
|
6755
|
|
6756 // Subtract the two offsets
|
|
6757 return {
|
|
6758 top: offset.top - parentOffset.top,
|
|
6759 left: offset.left - parentOffset.left
|
|
6760 };
|
|
6761 },
|
|
6762
|
|
6763 offsetParent: function() {
|
|
6764 return this.map(function() {
|
|
6765 var offsetParent = this.offsetParent || document.body;
|
|
6766 while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
|
|
6767 offsetParent = offsetParent.offsetParent;
|
|
6768 }
|
|
6769 return offsetParent;
|
|
6770 });
|
|
6771 }
|
|
6772 });
|
|
6773
|
|
6774
|
|
6775 // Create scrollLeft and scrollTop methods
|
|
6776 jQuery.each( ["Left", "Top"], function( i, name ) {
|
|
6777 var method = "scroll" + name;
|
|
6778
|
|
6779 jQuery.fn[ method ] = function(val) {
|
|
6780 var elem = this[0], win;
|
|
6781
|
|
6782 if ( !elem ) {
|
|
6783 return null;
|
|
6784 }
|
|
6785
|
|
6786 if ( val !== undefined ) {
|
|
6787 // Set the scroll offset
|
|
6788 return this.each(function() {
|
|
6789 win = getWindow( this );
|
|
6790
|
|
6791 if ( win ) {
|
|
6792 win.scrollTo(
|
|
6793 !i ? val : jQuery(win).scrollLeft(),
|
|
6794 i ? val : jQuery(win).scrollTop()
|
|
6795 );
|
|
6796
|
|
6797 } else {
|
|
6798 this[ method ] = val;
|
|
6799 }
|
|
6800 });
|
|
6801 } else {
|
|
6802 win = getWindow( elem );
|
|
6803
|
|
6804 // Return the scroll offset
|
|
6805 return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
|
|
6806 jQuery.support.boxModel && win.document.documentElement[ method ] ||
|
|
6807 win.document.body[ method ] :
|
|
6808 elem[ method ];
|
|
6809 }
|
|
6810 };
|
|
6811 });
|
|
6812
|
|
6813 function getWindow( elem ) {
|
|
6814 return jQuery.isWindow( elem ) ?
|
|
6815 elem :
|
|
6816 elem.nodeType === 9 ?
|
|
6817 elem.defaultView || elem.parentWindow :
|
|
6818 false;
|
|
6819 }
|
|
6820
|
|
6821
|
|
6822
|
|
6823
|
|
6824 // Create innerHeight, innerWidth, outerHeight and outerWidth methods
|
|
6825 jQuery.each([ "Height", "Width" ], function( i, name ) {
|
|
6826
|
|
6827 var type = name.toLowerCase();
|
|
6828
|
|
6829 // innerHeight and innerWidth
|
|
6830 jQuery.fn["inner" + name] = function() {
|
|
6831 return this[0] ?
|
|
6832 parseFloat( jQuery.css( this[0], type, "padding" ) ) :
|
|
6833 null;
|
|
6834 };
|
|
6835
|
|
6836 // outerHeight and outerWidth
|
|
6837 jQuery.fn["outer" + name] = function( margin ) {
|
|
6838 return this[0] ?
|
|
6839 parseFloat( jQuery.css( this[0], type, margin ? "margin" : "border" ) ) :
|
|
6840 null;
|
|
6841 };
|
|
6842
|
|
6843 jQuery.fn[ type ] = function( size ) {
|
|
6844 // Get window width or height
|
|
6845 var elem = this[0];
|
|
6846 if ( !elem ) {
|
|
6847 return size == null ? null : this;
|
|
6848 }
|
|
6849
|
|
6850 if ( jQuery.isFunction( size ) ) {
|
|
6851 return this.each(function( i ) {
|
|
6852 var self = jQuery( this );
|
|
6853 self[ type ]( size.call( this, i, self[ type ]() ) );
|
|
6854 });
|
|
6855 }
|
|
6856
|
|
6857 return jQuery.isWindow( elem ) ?
|
|
6858 // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
|
|
6859 elem.document.compatMode === "CSS1Compat" && elem.document.documentElement[ "client" + name ] ||
|
|
6860 elem.document.body[ "client" + name ] :
|
|
6861
|
|
6862 // Get document width or height
|
|
6863 (elem.nodeType === 9) ? // is it a document
|
|
6864 // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
|
|
6865 Math.max(
|
|
6866 elem.documentElement["client" + name],
|
|
6867 elem.body["scroll" + name], elem.documentElement["scroll" + name],
|
|
6868 elem.body["offset" + name], elem.documentElement["offset" + name]
|
|
6869 ) :
|
|
6870
|
|
6871 // Get or set width or height on the element
|
|
6872 size === undefined ?
|
|
6873 // Get width or height on the element
|
|
6874 parseFloat( jQuery.css( elem, type ) ) :
|
|
6875
|
|
6876 // Set the width or height on the element (default to pixels if value is unitless)
|
|
6877 this.css( type, typeof size === "string" ? size : size + "px" );
|
|
6878 };
|
|
6879
|
|
6880 });
|
|
6881
|
|
6882
|
|
6883 })(window);
|