annotate testHtml/Digital Audio FX Perceptual Attributes_files/jquery.js @ 25:4a4bd554b4c1 tip

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