1*31337658SMarcel Moolenaar/*! 2*31337658SMarcel Moolenaar * jQuery JavaScript Library v1.7 3*31337658SMarcel Moolenaar * http://jquery.com/ 4*31337658SMarcel Moolenaar * 5*31337658SMarcel Moolenaar * Copyright 2011, John Resig 6*31337658SMarcel Moolenaar * Dual licensed under the MIT or GPL Version 2 licenses. 7*31337658SMarcel Moolenaar * http://jquery.org/license 8*31337658SMarcel Moolenaar * 9*31337658SMarcel Moolenaar * Includes Sizzle.js 10*31337658SMarcel Moolenaar * http://sizzlejs.com/ 11*31337658SMarcel Moolenaar * Copyright 2011, The Dojo Foundation 12*31337658SMarcel Moolenaar * Released under the MIT, BSD, and GPL Licenses. 13*31337658SMarcel Moolenaar * 14*31337658SMarcel Moolenaar * Date: Thu Nov 3 16:18:21 2011 -0400 15*31337658SMarcel Moolenaar */ 16*31337658SMarcel Moolenaar(function( window, undefined ) { 17*31337658SMarcel Moolenaar 18*31337658SMarcel Moolenaar// Use the correct document accordingly with window argument (sandbox) 19*31337658SMarcel Moolenaarvar document = window.document, 20*31337658SMarcel Moolenaar navigator = window.navigator, 21*31337658SMarcel Moolenaar location = window.location; 22*31337658SMarcel Moolenaarvar jQuery = (function() { 23*31337658SMarcel Moolenaar 24*31337658SMarcel Moolenaar// Define a local copy of jQuery 25*31337658SMarcel Moolenaarvar jQuery = function( selector, context ) { 26*31337658SMarcel Moolenaar // The jQuery object is actually just the init constructor 'enhanced' 27*31337658SMarcel Moolenaar return new jQuery.fn.init( selector, context, rootjQuery ); 28*31337658SMarcel Moolenaar }, 29*31337658SMarcel Moolenaar 30*31337658SMarcel Moolenaar // Map over jQuery in case of overwrite 31*31337658SMarcel Moolenaar _jQuery = window.jQuery, 32*31337658SMarcel Moolenaar 33*31337658SMarcel Moolenaar // Map over the $ in case of overwrite 34*31337658SMarcel Moolenaar _$ = window.$, 35*31337658SMarcel Moolenaar 36*31337658SMarcel Moolenaar // A central reference to the root jQuery(document) 37*31337658SMarcel Moolenaar rootjQuery, 38*31337658SMarcel Moolenaar 39*31337658SMarcel Moolenaar // A simple way to check for HTML strings or ID strings 40*31337658SMarcel Moolenaar // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) 41*31337658SMarcel Moolenaar quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, 42*31337658SMarcel Moolenaar 43*31337658SMarcel Moolenaar // Check if a string has a non-whitespace character in it 44*31337658SMarcel Moolenaar rnotwhite = /\S/, 45*31337658SMarcel Moolenaar 46*31337658SMarcel Moolenaar // Used for trimming whitespace 47*31337658SMarcel Moolenaar trimLeft = /^\s+/, 48*31337658SMarcel Moolenaar trimRight = /\s+$/, 49*31337658SMarcel Moolenaar 50*31337658SMarcel Moolenaar // Check for digits 51*31337658SMarcel Moolenaar rdigit = /\d/, 52*31337658SMarcel Moolenaar 53*31337658SMarcel Moolenaar // Match a standalone tag 54*31337658SMarcel Moolenaar rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, 55*31337658SMarcel Moolenaar 56*31337658SMarcel Moolenaar // JSON RegExp 57*31337658SMarcel Moolenaar rvalidchars = /^[\],:{}\s]*$/, 58*31337658SMarcel Moolenaar rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, 59*31337658SMarcel Moolenaar rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, 60*31337658SMarcel Moolenaar rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, 61*31337658SMarcel Moolenaar 62*31337658SMarcel Moolenaar // Useragent RegExp 63*31337658SMarcel Moolenaar rwebkit = /(webkit)[ \/]([\w.]+)/, 64*31337658SMarcel Moolenaar ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, 65*31337658SMarcel Moolenaar rmsie = /(msie) ([\w.]+)/, 66*31337658SMarcel Moolenaar rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, 67*31337658SMarcel Moolenaar 68*31337658SMarcel Moolenaar // Matches dashed string for camelizing 69*31337658SMarcel Moolenaar rdashAlpha = /-([a-z]|[0-9])/ig, 70*31337658SMarcel Moolenaar rmsPrefix = /^-ms-/, 71*31337658SMarcel Moolenaar 72*31337658SMarcel Moolenaar // Used by jQuery.camelCase as callback to replace() 73*31337658SMarcel Moolenaar fcamelCase = function( all, letter ) { 74*31337658SMarcel Moolenaar return ( letter + "" ).toUpperCase(); 75*31337658SMarcel Moolenaar }, 76*31337658SMarcel Moolenaar 77*31337658SMarcel Moolenaar // Keep a UserAgent string for use with jQuery.browser 78*31337658SMarcel Moolenaar userAgent = navigator.userAgent, 79*31337658SMarcel Moolenaar 80*31337658SMarcel Moolenaar // For matching the engine and version of the browser 81*31337658SMarcel Moolenaar browserMatch, 82*31337658SMarcel Moolenaar 83*31337658SMarcel Moolenaar // The deferred used on DOM ready 84*31337658SMarcel Moolenaar readyList, 85*31337658SMarcel Moolenaar 86*31337658SMarcel Moolenaar // The ready event handler 87*31337658SMarcel Moolenaar DOMContentLoaded, 88*31337658SMarcel Moolenaar 89*31337658SMarcel Moolenaar // Save a reference to some core methods 90*31337658SMarcel Moolenaar toString = Object.prototype.toString, 91*31337658SMarcel Moolenaar hasOwn = Object.prototype.hasOwnProperty, 92*31337658SMarcel Moolenaar push = Array.prototype.push, 93*31337658SMarcel Moolenaar slice = Array.prototype.slice, 94*31337658SMarcel Moolenaar trim = String.prototype.trim, 95*31337658SMarcel Moolenaar indexOf = Array.prototype.indexOf, 96*31337658SMarcel Moolenaar 97*31337658SMarcel Moolenaar // [[Class]] -> type pairs 98*31337658SMarcel Moolenaar class2type = {}; 99*31337658SMarcel Moolenaar 100*31337658SMarcel MoolenaarjQuery.fn = jQuery.prototype = { 101*31337658SMarcel Moolenaar constructor: jQuery, 102*31337658SMarcel Moolenaar init: function( selector, context, rootjQuery ) { 103*31337658SMarcel Moolenaar var match, elem, ret, doc; 104*31337658SMarcel Moolenaar 105*31337658SMarcel Moolenaar // Handle $(""), $(null), or $(undefined) 106*31337658SMarcel Moolenaar if ( !selector ) { 107*31337658SMarcel Moolenaar return this; 108*31337658SMarcel Moolenaar } 109*31337658SMarcel Moolenaar 110*31337658SMarcel Moolenaar // Handle $(DOMElement) 111*31337658SMarcel Moolenaar if ( selector.nodeType ) { 112*31337658SMarcel Moolenaar this.context = this[0] = selector; 113*31337658SMarcel Moolenaar this.length = 1; 114*31337658SMarcel Moolenaar return this; 115*31337658SMarcel Moolenaar } 116*31337658SMarcel Moolenaar 117*31337658SMarcel Moolenaar // The body element only exists once, optimize finding it 118*31337658SMarcel Moolenaar if ( selector === "body" && !context && document.body ) { 119*31337658SMarcel Moolenaar this.context = document; 120*31337658SMarcel Moolenaar this[0] = document.body; 121*31337658SMarcel Moolenaar this.selector = selector; 122*31337658SMarcel Moolenaar this.length = 1; 123*31337658SMarcel Moolenaar return this; 124*31337658SMarcel Moolenaar } 125*31337658SMarcel Moolenaar 126*31337658SMarcel Moolenaar // Handle HTML strings 127*31337658SMarcel Moolenaar if ( typeof selector === "string" ) { 128*31337658SMarcel Moolenaar // Are we dealing with HTML string or an ID? 129*31337658SMarcel Moolenaar if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { 130*31337658SMarcel Moolenaar // Assume that strings that start and end with <> are HTML and skip the regex check 131*31337658SMarcel Moolenaar match = [ null, selector, null ]; 132*31337658SMarcel Moolenaar 133*31337658SMarcel Moolenaar } else { 134*31337658SMarcel Moolenaar match = quickExpr.exec( selector ); 135*31337658SMarcel Moolenaar } 136*31337658SMarcel Moolenaar 137*31337658SMarcel Moolenaar // Verify a match, and that no context was specified for #id 138*31337658SMarcel Moolenaar if ( match && (match[1] || !context) ) { 139*31337658SMarcel Moolenaar 140*31337658SMarcel Moolenaar // HANDLE: $(html) -> $(array) 141*31337658SMarcel Moolenaar if ( match[1] ) { 142*31337658SMarcel Moolenaar context = context instanceof jQuery ? context[0] : context; 143*31337658SMarcel Moolenaar doc = ( context ? context.ownerDocument || context : document ); 144*31337658SMarcel Moolenaar 145*31337658SMarcel Moolenaar // If a single string is passed in and it's a single tag 146*31337658SMarcel Moolenaar // just do a createElement and skip the rest 147*31337658SMarcel Moolenaar ret = rsingleTag.exec( selector ); 148*31337658SMarcel Moolenaar 149*31337658SMarcel Moolenaar if ( ret ) { 150*31337658SMarcel Moolenaar if ( jQuery.isPlainObject( context ) ) { 151*31337658SMarcel Moolenaar selector = [ document.createElement( ret[1] ) ]; 152*31337658SMarcel Moolenaar jQuery.fn.attr.call( selector, context, true ); 153*31337658SMarcel Moolenaar 154*31337658SMarcel Moolenaar } else { 155*31337658SMarcel Moolenaar selector = [ doc.createElement( ret[1] ) ]; 156*31337658SMarcel Moolenaar } 157*31337658SMarcel Moolenaar 158*31337658SMarcel Moolenaar } else { 159*31337658SMarcel Moolenaar ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); 160*31337658SMarcel Moolenaar selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; 161*31337658SMarcel Moolenaar } 162*31337658SMarcel Moolenaar 163*31337658SMarcel Moolenaar return jQuery.merge( this, selector ); 164*31337658SMarcel Moolenaar 165*31337658SMarcel Moolenaar // HANDLE: $("#id") 166*31337658SMarcel Moolenaar } else { 167*31337658SMarcel Moolenaar elem = document.getElementById( match[2] ); 168*31337658SMarcel Moolenaar 169*31337658SMarcel Moolenaar // Check parentNode to catch when Blackberry 4.6 returns 170*31337658SMarcel Moolenaar // nodes that are no longer in the document #6963 171*31337658SMarcel Moolenaar if ( elem && elem.parentNode ) { 172*31337658SMarcel Moolenaar // Handle the case where IE and Opera return items 173*31337658SMarcel Moolenaar // by name instead of ID 174*31337658SMarcel Moolenaar if ( elem.id !== match[2] ) { 175*31337658SMarcel Moolenaar return rootjQuery.find( selector ); 176*31337658SMarcel Moolenaar } 177*31337658SMarcel Moolenaar 178*31337658SMarcel Moolenaar // Otherwise, we inject the element directly into the jQuery object 179*31337658SMarcel Moolenaar this.length = 1; 180*31337658SMarcel Moolenaar this[0] = elem; 181*31337658SMarcel Moolenaar } 182*31337658SMarcel Moolenaar 183*31337658SMarcel Moolenaar this.context = document; 184*31337658SMarcel Moolenaar this.selector = selector; 185*31337658SMarcel Moolenaar return this; 186*31337658SMarcel Moolenaar } 187*31337658SMarcel Moolenaar 188*31337658SMarcel Moolenaar // HANDLE: $(expr, $(...)) 189*31337658SMarcel Moolenaar } else if ( !context || context.jquery ) { 190*31337658SMarcel Moolenaar return ( context || rootjQuery ).find( selector ); 191*31337658SMarcel Moolenaar 192*31337658SMarcel Moolenaar // HANDLE: $(expr, context) 193*31337658SMarcel Moolenaar // (which is just equivalent to: $(context).find(expr) 194*31337658SMarcel Moolenaar } else { 195*31337658SMarcel Moolenaar return this.constructor( context ).find( selector ); 196*31337658SMarcel Moolenaar } 197*31337658SMarcel Moolenaar 198*31337658SMarcel Moolenaar // HANDLE: $(function) 199*31337658SMarcel Moolenaar // Shortcut for document ready 200*31337658SMarcel Moolenaar } else if ( jQuery.isFunction( selector ) ) { 201*31337658SMarcel Moolenaar return rootjQuery.ready( selector ); 202*31337658SMarcel Moolenaar } 203*31337658SMarcel Moolenaar 204*31337658SMarcel Moolenaar if ( selector.selector !== undefined ) { 205*31337658SMarcel Moolenaar this.selector = selector.selector; 206*31337658SMarcel Moolenaar this.context = selector.context; 207*31337658SMarcel Moolenaar } 208*31337658SMarcel Moolenaar 209*31337658SMarcel Moolenaar return jQuery.makeArray( selector, this ); 210*31337658SMarcel Moolenaar }, 211*31337658SMarcel Moolenaar 212*31337658SMarcel Moolenaar // Start with an empty selector 213*31337658SMarcel Moolenaar selector: "", 214*31337658SMarcel Moolenaar 215*31337658SMarcel Moolenaar // The current version of jQuery being used 216*31337658SMarcel Moolenaar jquery: "1.7", 217*31337658SMarcel Moolenaar 218*31337658SMarcel Moolenaar // The default length of a jQuery object is 0 219*31337658SMarcel Moolenaar length: 0, 220*31337658SMarcel Moolenaar 221*31337658SMarcel Moolenaar // The number of elements contained in the matched element set 222*31337658SMarcel Moolenaar size: function() { 223*31337658SMarcel Moolenaar return this.length; 224*31337658SMarcel Moolenaar }, 225*31337658SMarcel Moolenaar 226*31337658SMarcel Moolenaar toArray: function() { 227*31337658SMarcel Moolenaar return slice.call( this, 0 ); 228*31337658SMarcel Moolenaar }, 229*31337658SMarcel Moolenaar 230*31337658SMarcel Moolenaar // Get the Nth element in the matched element set OR 231*31337658SMarcel Moolenaar // Get the whole matched element set as a clean array 232*31337658SMarcel Moolenaar get: function( num ) { 233*31337658SMarcel Moolenaar return num == null ? 234*31337658SMarcel Moolenaar 235*31337658SMarcel Moolenaar // Return a 'clean' array 236*31337658SMarcel Moolenaar this.toArray() : 237*31337658SMarcel Moolenaar 238*31337658SMarcel Moolenaar // Return just the object 239*31337658SMarcel Moolenaar ( num < 0 ? this[ this.length + num ] : this[ num ] ); 240*31337658SMarcel Moolenaar }, 241*31337658SMarcel Moolenaar 242*31337658SMarcel Moolenaar // Take an array of elements and push it onto the stack 243*31337658SMarcel Moolenaar // (returning the new matched element set) 244*31337658SMarcel Moolenaar pushStack: function( elems, name, selector ) { 245*31337658SMarcel Moolenaar // Build a new jQuery matched element set 246*31337658SMarcel Moolenaar var ret = this.constructor(); 247*31337658SMarcel Moolenaar 248*31337658SMarcel Moolenaar if ( jQuery.isArray( elems ) ) { 249*31337658SMarcel Moolenaar push.apply( ret, elems ); 250*31337658SMarcel Moolenaar 251*31337658SMarcel Moolenaar } else { 252*31337658SMarcel Moolenaar jQuery.merge( ret, elems ); 253*31337658SMarcel Moolenaar } 254*31337658SMarcel Moolenaar 255*31337658SMarcel Moolenaar // Add the old object onto the stack (as a reference) 256*31337658SMarcel Moolenaar ret.prevObject = this; 257*31337658SMarcel Moolenaar 258*31337658SMarcel Moolenaar ret.context = this.context; 259*31337658SMarcel Moolenaar 260*31337658SMarcel Moolenaar if ( name === "find" ) { 261*31337658SMarcel Moolenaar ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; 262*31337658SMarcel Moolenaar } else if ( name ) { 263*31337658SMarcel Moolenaar ret.selector = this.selector + "." + name + "(" + selector + ")"; 264*31337658SMarcel Moolenaar } 265*31337658SMarcel Moolenaar 266*31337658SMarcel Moolenaar // Return the newly-formed element set 267*31337658SMarcel Moolenaar return ret; 268*31337658SMarcel Moolenaar }, 269*31337658SMarcel Moolenaar 270*31337658SMarcel Moolenaar // Execute a callback for every element in the matched set. 271*31337658SMarcel Moolenaar // (You can seed the arguments with an array of args, but this is 272*31337658SMarcel Moolenaar // only used internally.) 273*31337658SMarcel Moolenaar each: function( callback, args ) { 274*31337658SMarcel Moolenaar return jQuery.each( this, callback, args ); 275*31337658SMarcel Moolenaar }, 276*31337658SMarcel Moolenaar 277*31337658SMarcel Moolenaar ready: function( fn ) { 278*31337658SMarcel Moolenaar // Attach the listeners 279*31337658SMarcel Moolenaar jQuery.bindReady(); 280*31337658SMarcel Moolenaar 281*31337658SMarcel Moolenaar // Add the callback 282*31337658SMarcel Moolenaar readyList.add( fn ); 283*31337658SMarcel Moolenaar 284*31337658SMarcel Moolenaar return this; 285*31337658SMarcel Moolenaar }, 286*31337658SMarcel Moolenaar 287*31337658SMarcel Moolenaar eq: function( i ) { 288*31337658SMarcel Moolenaar return i === -1 ? 289*31337658SMarcel Moolenaar this.slice( i ) : 290*31337658SMarcel Moolenaar this.slice( i, +i + 1 ); 291*31337658SMarcel Moolenaar }, 292*31337658SMarcel Moolenaar 293*31337658SMarcel Moolenaar first: function() { 294*31337658SMarcel Moolenaar return this.eq( 0 ); 295*31337658SMarcel Moolenaar }, 296*31337658SMarcel Moolenaar 297*31337658SMarcel Moolenaar last: function() { 298*31337658SMarcel Moolenaar return this.eq( -1 ); 299*31337658SMarcel Moolenaar }, 300*31337658SMarcel Moolenaar 301*31337658SMarcel Moolenaar slice: function() { 302*31337658SMarcel Moolenaar return this.pushStack( slice.apply( this, arguments ), 303*31337658SMarcel Moolenaar "slice", slice.call(arguments).join(",") ); 304*31337658SMarcel Moolenaar }, 305*31337658SMarcel Moolenaar 306*31337658SMarcel Moolenaar map: function( callback ) { 307*31337658SMarcel Moolenaar return this.pushStack( jQuery.map(this, function( elem, i ) { 308*31337658SMarcel Moolenaar return callback.call( elem, i, elem ); 309*31337658SMarcel Moolenaar })); 310*31337658SMarcel Moolenaar }, 311*31337658SMarcel Moolenaar 312*31337658SMarcel Moolenaar end: function() { 313*31337658SMarcel Moolenaar return this.prevObject || this.constructor(null); 314*31337658SMarcel Moolenaar }, 315*31337658SMarcel Moolenaar 316*31337658SMarcel Moolenaar // For internal use only. 317*31337658SMarcel Moolenaar // Behaves like an Array's method, not like a jQuery method. 318*31337658SMarcel Moolenaar push: push, 319*31337658SMarcel Moolenaar sort: [].sort, 320*31337658SMarcel Moolenaar splice: [].splice 321*31337658SMarcel Moolenaar}; 322*31337658SMarcel Moolenaar 323*31337658SMarcel Moolenaar// Give the init function the jQuery prototype for later instantiation 324*31337658SMarcel MoolenaarjQuery.fn.init.prototype = jQuery.fn; 325*31337658SMarcel Moolenaar 326*31337658SMarcel MoolenaarjQuery.extend = jQuery.fn.extend = function() { 327*31337658SMarcel Moolenaar var options, name, src, copy, copyIsArray, clone, 328*31337658SMarcel Moolenaar target = arguments[0] || {}, 329*31337658SMarcel Moolenaar i = 1, 330*31337658SMarcel Moolenaar length = arguments.length, 331*31337658SMarcel Moolenaar deep = false; 332*31337658SMarcel Moolenaar 333*31337658SMarcel Moolenaar // Handle a deep copy situation 334*31337658SMarcel Moolenaar if ( typeof target === "boolean" ) { 335*31337658SMarcel Moolenaar deep = target; 336*31337658SMarcel Moolenaar target = arguments[1] || {}; 337*31337658SMarcel Moolenaar // skip the boolean and the target 338*31337658SMarcel Moolenaar i = 2; 339*31337658SMarcel Moolenaar } 340*31337658SMarcel Moolenaar 341*31337658SMarcel Moolenaar // Handle case when target is a string or something (possible in deep copy) 342*31337658SMarcel Moolenaar if ( typeof target !== "object" && !jQuery.isFunction(target) ) { 343*31337658SMarcel Moolenaar target = {}; 344*31337658SMarcel Moolenaar } 345*31337658SMarcel Moolenaar 346*31337658SMarcel Moolenaar // extend jQuery itself if only one argument is passed 347*31337658SMarcel Moolenaar if ( length === i ) { 348*31337658SMarcel Moolenaar target = this; 349*31337658SMarcel Moolenaar --i; 350*31337658SMarcel Moolenaar } 351*31337658SMarcel Moolenaar 352*31337658SMarcel Moolenaar for ( ; i < length; i++ ) { 353*31337658SMarcel Moolenaar // Only deal with non-null/undefined values 354*31337658SMarcel Moolenaar if ( (options = arguments[ i ]) != null ) { 355*31337658SMarcel Moolenaar // Extend the base object 356*31337658SMarcel Moolenaar for ( name in options ) { 357*31337658SMarcel Moolenaar src = target[ name ]; 358*31337658SMarcel Moolenaar copy = options[ name ]; 359*31337658SMarcel Moolenaar 360*31337658SMarcel Moolenaar // Prevent never-ending loop 361*31337658SMarcel Moolenaar if ( target === copy ) { 362*31337658SMarcel Moolenaar continue; 363*31337658SMarcel Moolenaar } 364*31337658SMarcel Moolenaar 365*31337658SMarcel Moolenaar // Recurse if we're merging plain objects or arrays 366*31337658SMarcel Moolenaar if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { 367*31337658SMarcel Moolenaar if ( copyIsArray ) { 368*31337658SMarcel Moolenaar copyIsArray = false; 369*31337658SMarcel Moolenaar clone = src && jQuery.isArray(src) ? src : []; 370*31337658SMarcel Moolenaar 371*31337658SMarcel Moolenaar } else { 372*31337658SMarcel Moolenaar clone = src && jQuery.isPlainObject(src) ? src : {}; 373*31337658SMarcel Moolenaar } 374*31337658SMarcel Moolenaar 375*31337658SMarcel Moolenaar // Never move original objects, clone them 376*31337658SMarcel Moolenaar target[ name ] = jQuery.extend( deep, clone, copy ); 377*31337658SMarcel Moolenaar 378*31337658SMarcel Moolenaar // Don't bring in undefined values 379*31337658SMarcel Moolenaar } else if ( copy !== undefined ) { 380*31337658SMarcel Moolenaar target[ name ] = copy; 381*31337658SMarcel Moolenaar } 382*31337658SMarcel Moolenaar } 383*31337658SMarcel Moolenaar } 384*31337658SMarcel Moolenaar } 385*31337658SMarcel Moolenaar 386*31337658SMarcel Moolenaar // Return the modified object 387*31337658SMarcel Moolenaar return target; 388*31337658SMarcel Moolenaar}; 389*31337658SMarcel Moolenaar 390*31337658SMarcel MoolenaarjQuery.extend({ 391*31337658SMarcel Moolenaar noConflict: function( deep ) { 392*31337658SMarcel Moolenaar if ( window.$ === jQuery ) { 393*31337658SMarcel Moolenaar window.$ = _$; 394*31337658SMarcel Moolenaar } 395*31337658SMarcel Moolenaar 396*31337658SMarcel Moolenaar if ( deep && window.jQuery === jQuery ) { 397*31337658SMarcel Moolenaar window.jQuery = _jQuery; 398*31337658SMarcel Moolenaar } 399*31337658SMarcel Moolenaar 400*31337658SMarcel Moolenaar return jQuery; 401*31337658SMarcel Moolenaar }, 402*31337658SMarcel Moolenaar 403*31337658SMarcel Moolenaar // Is the DOM ready to be used? Set to true once it occurs. 404*31337658SMarcel Moolenaar isReady: false, 405*31337658SMarcel Moolenaar 406*31337658SMarcel Moolenaar // A counter to track how many items to wait for before 407*31337658SMarcel Moolenaar // the ready event fires. See #6781 408*31337658SMarcel Moolenaar readyWait: 1, 409*31337658SMarcel Moolenaar 410*31337658SMarcel Moolenaar // Hold (or release) the ready event 411*31337658SMarcel Moolenaar holdReady: function( hold ) { 412*31337658SMarcel Moolenaar if ( hold ) { 413*31337658SMarcel Moolenaar jQuery.readyWait++; 414*31337658SMarcel Moolenaar } else { 415*31337658SMarcel Moolenaar jQuery.ready( true ); 416*31337658SMarcel Moolenaar } 417*31337658SMarcel Moolenaar }, 418*31337658SMarcel Moolenaar 419*31337658SMarcel Moolenaar // Handle when the DOM is ready 420*31337658SMarcel Moolenaar ready: function( wait ) { 421*31337658SMarcel Moolenaar // Either a released hold or an DOMready/load event and not yet ready 422*31337658SMarcel Moolenaar if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { 423*31337658SMarcel Moolenaar // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). 424*31337658SMarcel Moolenaar if ( !document.body ) { 425*31337658SMarcel Moolenaar return setTimeout( jQuery.ready, 1 ); 426*31337658SMarcel Moolenaar } 427*31337658SMarcel Moolenaar 428*31337658SMarcel Moolenaar // Remember that the DOM is ready 429*31337658SMarcel Moolenaar jQuery.isReady = true; 430*31337658SMarcel Moolenaar 431*31337658SMarcel Moolenaar // If a normal DOM Ready event fired, decrement, and wait if need be 432*31337658SMarcel Moolenaar if ( wait !== true && --jQuery.readyWait > 0 ) { 433*31337658SMarcel Moolenaar return; 434*31337658SMarcel Moolenaar } 435*31337658SMarcel Moolenaar 436*31337658SMarcel Moolenaar // If there are functions bound, to execute 437*31337658SMarcel Moolenaar readyList.fireWith( document, [ jQuery ] ); 438*31337658SMarcel Moolenaar 439*31337658SMarcel Moolenaar // Trigger any bound ready events 440*31337658SMarcel Moolenaar if ( jQuery.fn.trigger ) { 441*31337658SMarcel Moolenaar jQuery( document ).trigger( "ready" ).unbind( "ready" ); 442*31337658SMarcel Moolenaar } 443*31337658SMarcel Moolenaar } 444*31337658SMarcel Moolenaar }, 445*31337658SMarcel Moolenaar 446*31337658SMarcel Moolenaar bindReady: function() { 447*31337658SMarcel Moolenaar if ( readyList ) { 448*31337658SMarcel Moolenaar return; 449*31337658SMarcel Moolenaar } 450*31337658SMarcel Moolenaar 451*31337658SMarcel Moolenaar readyList = jQuery.Callbacks( "once memory" ); 452*31337658SMarcel Moolenaar 453*31337658SMarcel Moolenaar // Catch cases where $(document).ready() is called after the 454*31337658SMarcel Moolenaar // browser event has already occurred. 455*31337658SMarcel Moolenaar if ( document.readyState === "complete" ) { 456*31337658SMarcel Moolenaar // Handle it asynchronously to allow scripts the opportunity to delay ready 457*31337658SMarcel Moolenaar return setTimeout( jQuery.ready, 1 ); 458*31337658SMarcel Moolenaar } 459*31337658SMarcel Moolenaar 460*31337658SMarcel Moolenaar // Mozilla, Opera and webkit nightlies currently support this event 461*31337658SMarcel Moolenaar if ( document.addEventListener ) { 462*31337658SMarcel Moolenaar // Use the handy event callback 463*31337658SMarcel Moolenaar document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); 464*31337658SMarcel Moolenaar 465*31337658SMarcel Moolenaar // A fallback to window.onload, that will always work 466*31337658SMarcel Moolenaar window.addEventListener( "load", jQuery.ready, false ); 467*31337658SMarcel Moolenaar 468*31337658SMarcel Moolenaar // If IE event model is used 469*31337658SMarcel Moolenaar } else if ( document.attachEvent ) { 470*31337658SMarcel Moolenaar // ensure firing before onload, 471*31337658SMarcel Moolenaar // maybe late but safe also for iframes 472*31337658SMarcel Moolenaar document.attachEvent( "onreadystatechange", DOMContentLoaded ); 473*31337658SMarcel Moolenaar 474*31337658SMarcel Moolenaar // A fallback to window.onload, that will always work 475*31337658SMarcel Moolenaar window.attachEvent( "onload", jQuery.ready ); 476*31337658SMarcel Moolenaar 477*31337658SMarcel Moolenaar // If IE and not a frame 478*31337658SMarcel Moolenaar // continually check to see if the document is ready 479*31337658SMarcel Moolenaar var toplevel = false; 480*31337658SMarcel Moolenaar 481*31337658SMarcel Moolenaar try { 482*31337658SMarcel Moolenaar toplevel = window.frameElement == null; 483*31337658SMarcel Moolenaar } catch(e) {} 484*31337658SMarcel Moolenaar 485*31337658SMarcel Moolenaar if ( document.documentElement.doScroll && toplevel ) { 486*31337658SMarcel Moolenaar doScrollCheck(); 487*31337658SMarcel Moolenaar } 488*31337658SMarcel Moolenaar } 489*31337658SMarcel Moolenaar }, 490*31337658SMarcel Moolenaar 491*31337658SMarcel Moolenaar // See test/unit/core.js for details concerning isFunction. 492*31337658SMarcel Moolenaar // Since version 1.3, DOM methods and functions like alert 493*31337658SMarcel Moolenaar // aren't supported. They return false on IE (#2968). 494*31337658SMarcel Moolenaar isFunction: function( obj ) { 495*31337658SMarcel Moolenaar return jQuery.type(obj) === "function"; 496*31337658SMarcel Moolenaar }, 497*31337658SMarcel Moolenaar 498*31337658SMarcel Moolenaar isArray: Array.isArray || function( obj ) { 499*31337658SMarcel Moolenaar return jQuery.type(obj) === "array"; 500*31337658SMarcel Moolenaar }, 501*31337658SMarcel Moolenaar 502*31337658SMarcel Moolenaar // A crude way of determining if an object is a window 503*31337658SMarcel Moolenaar isWindow: function( obj ) { 504*31337658SMarcel Moolenaar return obj && typeof obj === "object" && "setInterval" in obj; 505*31337658SMarcel Moolenaar }, 506*31337658SMarcel Moolenaar 507*31337658SMarcel Moolenaar isNumeric: function( obj ) { 508*31337658SMarcel Moolenaar return obj != null && rdigit.test( obj ) && !isNaN( obj ); 509*31337658SMarcel Moolenaar }, 510*31337658SMarcel Moolenaar 511*31337658SMarcel Moolenaar type: function( obj ) { 512*31337658SMarcel Moolenaar return obj == null ? 513*31337658SMarcel Moolenaar String( obj ) : 514*31337658SMarcel Moolenaar class2type[ toString.call(obj) ] || "object"; 515*31337658SMarcel Moolenaar }, 516*31337658SMarcel Moolenaar 517*31337658SMarcel Moolenaar isPlainObject: function( obj ) { 518*31337658SMarcel Moolenaar // Must be an Object. 519*31337658SMarcel Moolenaar // Because of IE, we also have to check the presence of the constructor property. 520*31337658SMarcel Moolenaar // Make sure that DOM nodes and window objects don't pass through, as well 521*31337658SMarcel Moolenaar if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { 522*31337658SMarcel Moolenaar return false; 523*31337658SMarcel Moolenaar } 524*31337658SMarcel Moolenaar 525*31337658SMarcel Moolenaar try { 526*31337658SMarcel Moolenaar // Not own constructor property must be Object 527*31337658SMarcel Moolenaar if ( obj.constructor && 528*31337658SMarcel Moolenaar !hasOwn.call(obj, "constructor") && 529*31337658SMarcel Moolenaar !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { 530*31337658SMarcel Moolenaar return false; 531*31337658SMarcel Moolenaar } 532*31337658SMarcel Moolenaar } catch ( e ) { 533*31337658SMarcel Moolenaar // IE8,9 Will throw exceptions on certain host objects #9897 534*31337658SMarcel Moolenaar return false; 535*31337658SMarcel Moolenaar } 536*31337658SMarcel Moolenaar 537*31337658SMarcel Moolenaar // Own properties are enumerated firstly, so to speed up, 538*31337658SMarcel Moolenaar // if last one is own, then all properties are own. 539*31337658SMarcel Moolenaar 540*31337658SMarcel Moolenaar var key; 541*31337658SMarcel Moolenaar for ( key in obj ) {} 542*31337658SMarcel Moolenaar 543*31337658SMarcel Moolenaar return key === undefined || hasOwn.call( obj, key ); 544*31337658SMarcel Moolenaar }, 545*31337658SMarcel Moolenaar 546*31337658SMarcel Moolenaar isEmptyObject: function( obj ) { 547*31337658SMarcel Moolenaar for ( var name in obj ) { 548*31337658SMarcel Moolenaar return false; 549*31337658SMarcel Moolenaar } 550*31337658SMarcel Moolenaar return true; 551*31337658SMarcel Moolenaar }, 552*31337658SMarcel Moolenaar 553*31337658SMarcel Moolenaar error: function( msg ) { 554*31337658SMarcel Moolenaar throw msg; 555*31337658SMarcel Moolenaar }, 556*31337658SMarcel Moolenaar 557*31337658SMarcel Moolenaar parseJSON: function( data ) { 558*31337658SMarcel Moolenaar if ( typeof data !== "string" || !data ) { 559*31337658SMarcel Moolenaar return null; 560*31337658SMarcel Moolenaar } 561*31337658SMarcel Moolenaar 562*31337658SMarcel Moolenaar // Make sure leading/trailing whitespace is removed (IE can't handle it) 563*31337658SMarcel Moolenaar data = jQuery.trim( data ); 564*31337658SMarcel Moolenaar 565*31337658SMarcel Moolenaar // Attempt to parse using the native JSON parser first 566*31337658SMarcel Moolenaar if ( window.JSON && window.JSON.parse ) { 567*31337658SMarcel Moolenaar return window.JSON.parse( data ); 568*31337658SMarcel Moolenaar } 569*31337658SMarcel Moolenaar 570*31337658SMarcel Moolenaar // Make sure the incoming data is actual JSON 571*31337658SMarcel Moolenaar // Logic borrowed from http://json.org/json2.js 572*31337658SMarcel Moolenaar if ( rvalidchars.test( data.replace( rvalidescape, "@" ) 573*31337658SMarcel Moolenaar .replace( rvalidtokens, "]" ) 574*31337658SMarcel Moolenaar .replace( rvalidbraces, "")) ) { 575*31337658SMarcel Moolenaar 576*31337658SMarcel Moolenaar return ( new Function( "return " + data ) )(); 577*31337658SMarcel Moolenaar 578*31337658SMarcel Moolenaar } 579*31337658SMarcel Moolenaar jQuery.error( "Invalid JSON: " + data ); 580*31337658SMarcel Moolenaar }, 581*31337658SMarcel Moolenaar 582*31337658SMarcel Moolenaar // Cross-browser xml parsing 583*31337658SMarcel Moolenaar parseXML: function( data ) { 584*31337658SMarcel Moolenaar var xml, tmp; 585*31337658SMarcel Moolenaar try { 586*31337658SMarcel Moolenaar if ( window.DOMParser ) { // Standard 587*31337658SMarcel Moolenaar tmp = new DOMParser(); 588*31337658SMarcel Moolenaar xml = tmp.parseFromString( data , "text/xml" ); 589*31337658SMarcel Moolenaar } else { // IE 590*31337658SMarcel Moolenaar xml = new ActiveXObject( "Microsoft.XMLDOM" ); 591*31337658SMarcel Moolenaar xml.async = "false"; 592*31337658SMarcel Moolenaar xml.loadXML( data ); 593*31337658SMarcel Moolenaar } 594*31337658SMarcel Moolenaar } catch( e ) { 595*31337658SMarcel Moolenaar xml = undefined; 596*31337658SMarcel Moolenaar } 597*31337658SMarcel Moolenaar if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { 598*31337658SMarcel Moolenaar jQuery.error( "Invalid XML: " + data ); 599*31337658SMarcel Moolenaar } 600*31337658SMarcel Moolenaar return xml; 601*31337658SMarcel Moolenaar }, 602*31337658SMarcel Moolenaar 603*31337658SMarcel Moolenaar noop: function() {}, 604*31337658SMarcel Moolenaar 605*31337658SMarcel Moolenaar // Evaluates a script in a global context 606*31337658SMarcel Moolenaar // Workarounds based on findings by Jim Driscoll 607*31337658SMarcel Moolenaar // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context 608*31337658SMarcel Moolenaar globalEval: function( data ) { 609*31337658SMarcel Moolenaar if ( data && rnotwhite.test( data ) ) { 610*31337658SMarcel Moolenaar // We use execScript on Internet Explorer 611*31337658SMarcel Moolenaar // We use an anonymous function so that context is window 612*31337658SMarcel Moolenaar // rather than jQuery in Firefox 613*31337658SMarcel Moolenaar ( window.execScript || function( data ) { 614*31337658SMarcel Moolenaar window[ "eval" ].call( window, data ); 615*31337658SMarcel Moolenaar } )( data ); 616*31337658SMarcel Moolenaar } 617*31337658SMarcel Moolenaar }, 618*31337658SMarcel Moolenaar 619*31337658SMarcel Moolenaar // Convert dashed to camelCase; used by the css and data modules 620*31337658SMarcel Moolenaar // Microsoft forgot to hump their vendor prefix (#9572) 621*31337658SMarcel Moolenaar camelCase: function( string ) { 622*31337658SMarcel Moolenaar return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); 623*31337658SMarcel Moolenaar }, 624*31337658SMarcel Moolenaar 625*31337658SMarcel Moolenaar nodeName: function( elem, name ) { 626*31337658SMarcel Moolenaar return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); 627*31337658SMarcel Moolenaar }, 628*31337658SMarcel Moolenaar 629*31337658SMarcel Moolenaar // args is for internal usage only 630*31337658SMarcel Moolenaar each: function( object, callback, args ) { 631*31337658SMarcel Moolenaar var name, i = 0, 632*31337658SMarcel Moolenaar length = object.length, 633*31337658SMarcel Moolenaar isObj = length === undefined || jQuery.isFunction( object ); 634*31337658SMarcel Moolenaar 635*31337658SMarcel Moolenaar if ( args ) { 636*31337658SMarcel Moolenaar if ( isObj ) { 637*31337658SMarcel Moolenaar for ( name in object ) { 638*31337658SMarcel Moolenaar if ( callback.apply( object[ name ], args ) === false ) { 639*31337658SMarcel Moolenaar break; 640*31337658SMarcel Moolenaar } 641*31337658SMarcel Moolenaar } 642*31337658SMarcel Moolenaar } else { 643*31337658SMarcel Moolenaar for ( ; i < length; ) { 644*31337658SMarcel Moolenaar if ( callback.apply( object[ i++ ], args ) === false ) { 645*31337658SMarcel Moolenaar break; 646*31337658SMarcel Moolenaar } 647*31337658SMarcel Moolenaar } 648*31337658SMarcel Moolenaar } 649*31337658SMarcel Moolenaar 650*31337658SMarcel Moolenaar // A special, fast, case for the most common use of each 651*31337658SMarcel Moolenaar } else { 652*31337658SMarcel Moolenaar if ( isObj ) { 653*31337658SMarcel Moolenaar for ( name in object ) { 654*31337658SMarcel Moolenaar if ( callback.call( object[ name ], name, object[ name ] ) === false ) { 655*31337658SMarcel Moolenaar break; 656*31337658SMarcel Moolenaar } 657*31337658SMarcel Moolenaar } 658*31337658SMarcel Moolenaar } else { 659*31337658SMarcel Moolenaar for ( ; i < length; ) { 660*31337658SMarcel Moolenaar if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { 661*31337658SMarcel Moolenaar break; 662*31337658SMarcel Moolenaar } 663*31337658SMarcel Moolenaar } 664*31337658SMarcel Moolenaar } 665*31337658SMarcel Moolenaar } 666*31337658SMarcel Moolenaar 667*31337658SMarcel Moolenaar return object; 668*31337658SMarcel Moolenaar }, 669*31337658SMarcel Moolenaar 670*31337658SMarcel Moolenaar // Use native String.trim function wherever possible 671*31337658SMarcel Moolenaar trim: trim ? 672*31337658SMarcel Moolenaar function( text ) { 673*31337658SMarcel Moolenaar return text == null ? 674*31337658SMarcel Moolenaar "" : 675*31337658SMarcel Moolenaar trim.call( text ); 676*31337658SMarcel Moolenaar } : 677*31337658SMarcel Moolenaar 678*31337658SMarcel Moolenaar // Otherwise use our own trimming functionality 679*31337658SMarcel Moolenaar function( text ) { 680*31337658SMarcel Moolenaar return text == null ? 681*31337658SMarcel Moolenaar "" : 682*31337658SMarcel Moolenaar text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); 683*31337658SMarcel Moolenaar }, 684*31337658SMarcel Moolenaar 685*31337658SMarcel Moolenaar // results is for internal usage only 686*31337658SMarcel Moolenaar makeArray: function( array, results ) { 687*31337658SMarcel Moolenaar var ret = results || []; 688*31337658SMarcel Moolenaar 689*31337658SMarcel Moolenaar if ( array != null ) { 690*31337658SMarcel Moolenaar // The window, strings (and functions) also have 'length' 691*31337658SMarcel Moolenaar // The extra typeof function check is to prevent crashes 692*31337658SMarcel Moolenaar // in Safari 2 (See: #3039) 693*31337658SMarcel Moolenaar // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 694*31337658SMarcel Moolenaar var type = jQuery.type( array ); 695*31337658SMarcel Moolenaar 696*31337658SMarcel Moolenaar if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { 697*31337658SMarcel Moolenaar push.call( ret, array ); 698*31337658SMarcel Moolenaar } else { 699*31337658SMarcel Moolenaar jQuery.merge( ret, array ); 700*31337658SMarcel Moolenaar } 701*31337658SMarcel Moolenaar } 702*31337658SMarcel Moolenaar 703*31337658SMarcel Moolenaar return ret; 704*31337658SMarcel Moolenaar }, 705*31337658SMarcel Moolenaar 706*31337658SMarcel Moolenaar inArray: function( elem, array, i ) { 707*31337658SMarcel Moolenaar var len; 708*31337658SMarcel Moolenaar 709*31337658SMarcel Moolenaar if ( array ) { 710*31337658SMarcel Moolenaar if ( indexOf ) { 711*31337658SMarcel Moolenaar return indexOf.call( array, elem, i ); 712*31337658SMarcel Moolenaar } 713*31337658SMarcel Moolenaar 714*31337658SMarcel Moolenaar len = array.length; 715*31337658SMarcel Moolenaar i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; 716*31337658SMarcel Moolenaar 717*31337658SMarcel Moolenaar for ( ; i < len; i++ ) { 718*31337658SMarcel Moolenaar // Skip accessing in sparse arrays 719*31337658SMarcel Moolenaar if ( i in array && array[ i ] === elem ) { 720*31337658SMarcel Moolenaar return i; 721*31337658SMarcel Moolenaar } 722*31337658SMarcel Moolenaar } 723*31337658SMarcel Moolenaar } 724*31337658SMarcel Moolenaar 725*31337658SMarcel Moolenaar return -1; 726*31337658SMarcel Moolenaar }, 727*31337658SMarcel Moolenaar 728*31337658SMarcel Moolenaar merge: function( first, second ) { 729*31337658SMarcel Moolenaar var i = first.length, 730*31337658SMarcel Moolenaar j = 0; 731*31337658SMarcel Moolenaar 732*31337658SMarcel Moolenaar if ( typeof second.length === "number" ) { 733*31337658SMarcel Moolenaar for ( var l = second.length; j < l; j++ ) { 734*31337658SMarcel Moolenaar first[ i++ ] = second[ j ]; 735*31337658SMarcel Moolenaar } 736*31337658SMarcel Moolenaar 737*31337658SMarcel Moolenaar } else { 738*31337658SMarcel Moolenaar while ( second[j] !== undefined ) { 739*31337658SMarcel Moolenaar first[ i++ ] = second[ j++ ]; 740*31337658SMarcel Moolenaar } 741*31337658SMarcel Moolenaar } 742*31337658SMarcel Moolenaar 743*31337658SMarcel Moolenaar first.length = i; 744*31337658SMarcel Moolenaar 745*31337658SMarcel Moolenaar return first; 746*31337658SMarcel Moolenaar }, 747*31337658SMarcel Moolenaar 748*31337658SMarcel Moolenaar grep: function( elems, callback, inv ) { 749*31337658SMarcel Moolenaar var ret = [], retVal; 750*31337658SMarcel Moolenaar inv = !!inv; 751*31337658SMarcel Moolenaar 752*31337658SMarcel Moolenaar // Go through the array, only saving the items 753*31337658SMarcel Moolenaar // that pass the validator function 754*31337658SMarcel Moolenaar for ( var i = 0, length = elems.length; i < length; i++ ) { 755*31337658SMarcel Moolenaar retVal = !!callback( elems[ i ], i ); 756*31337658SMarcel Moolenaar if ( inv !== retVal ) { 757*31337658SMarcel Moolenaar ret.push( elems[ i ] ); 758*31337658SMarcel Moolenaar } 759*31337658SMarcel Moolenaar } 760*31337658SMarcel Moolenaar 761*31337658SMarcel Moolenaar return ret; 762*31337658SMarcel Moolenaar }, 763*31337658SMarcel Moolenaar 764*31337658SMarcel Moolenaar // arg is for internal usage only 765*31337658SMarcel Moolenaar map: function( elems, callback, arg ) { 766*31337658SMarcel Moolenaar var value, key, ret = [], 767*31337658SMarcel Moolenaar i = 0, 768*31337658SMarcel Moolenaar length = elems.length, 769*31337658SMarcel Moolenaar // jquery objects are treated as arrays 770*31337658SMarcel Moolenaar isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; 771*31337658SMarcel Moolenaar 772*31337658SMarcel Moolenaar // Go through the array, translating each of the items to their 773*31337658SMarcel Moolenaar if ( isArray ) { 774*31337658SMarcel Moolenaar for ( ; i < length; i++ ) { 775*31337658SMarcel Moolenaar value = callback( elems[ i ], i, arg ); 776*31337658SMarcel Moolenaar 777*31337658SMarcel Moolenaar if ( value != null ) { 778*31337658SMarcel Moolenaar ret[ ret.length ] = value; 779*31337658SMarcel Moolenaar } 780*31337658SMarcel Moolenaar } 781*31337658SMarcel Moolenaar 782*31337658SMarcel Moolenaar // Go through every key on the object, 783*31337658SMarcel Moolenaar } else { 784*31337658SMarcel Moolenaar for ( key in elems ) { 785*31337658SMarcel Moolenaar value = callback( elems[ key ], key, arg ); 786*31337658SMarcel Moolenaar 787*31337658SMarcel Moolenaar if ( value != null ) { 788*31337658SMarcel Moolenaar ret[ ret.length ] = value; 789*31337658SMarcel Moolenaar } 790*31337658SMarcel Moolenaar } 791*31337658SMarcel Moolenaar } 792*31337658SMarcel Moolenaar 793*31337658SMarcel Moolenaar // Flatten any nested arrays 794*31337658SMarcel Moolenaar return ret.concat.apply( [], ret ); 795*31337658SMarcel Moolenaar }, 796*31337658SMarcel Moolenaar 797*31337658SMarcel Moolenaar // A global GUID counter for objects 798*31337658SMarcel Moolenaar guid: 1, 799*31337658SMarcel Moolenaar 800*31337658SMarcel Moolenaar // Bind a function to a context, optionally partially applying any 801*31337658SMarcel Moolenaar // arguments. 802*31337658SMarcel Moolenaar proxy: function( fn, context ) { 803*31337658SMarcel Moolenaar if ( typeof context === "string" ) { 804*31337658SMarcel Moolenaar var tmp = fn[ context ]; 805*31337658SMarcel Moolenaar context = fn; 806*31337658SMarcel Moolenaar fn = tmp; 807*31337658SMarcel Moolenaar } 808*31337658SMarcel Moolenaar 809*31337658SMarcel Moolenaar // Quick check to determine if target is callable, in the spec 810*31337658SMarcel Moolenaar // this throws a TypeError, but we will just return undefined. 811*31337658SMarcel Moolenaar if ( !jQuery.isFunction( fn ) ) { 812*31337658SMarcel Moolenaar return undefined; 813*31337658SMarcel Moolenaar } 814*31337658SMarcel Moolenaar 815*31337658SMarcel Moolenaar // Simulated bind 816*31337658SMarcel Moolenaar var args = slice.call( arguments, 2 ), 817*31337658SMarcel Moolenaar proxy = function() { 818*31337658SMarcel Moolenaar return fn.apply( context, args.concat( slice.call( arguments ) ) ); 819*31337658SMarcel Moolenaar }; 820*31337658SMarcel Moolenaar 821*31337658SMarcel Moolenaar // Set the guid of unique handler to the same of original handler, so it can be removed 822*31337658SMarcel Moolenaar proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; 823*31337658SMarcel Moolenaar 824*31337658SMarcel Moolenaar return proxy; 825*31337658SMarcel Moolenaar }, 826*31337658SMarcel Moolenaar 827*31337658SMarcel Moolenaar // Mutifunctional method to get and set values to a collection 828*31337658SMarcel Moolenaar // The value/s can optionally be executed if it's a function 829*31337658SMarcel Moolenaar access: function( elems, key, value, exec, fn, pass ) { 830*31337658SMarcel Moolenaar var length = elems.length; 831*31337658SMarcel Moolenaar 832*31337658SMarcel Moolenaar // Setting many attributes 833*31337658SMarcel Moolenaar if ( typeof key === "object" ) { 834*31337658SMarcel Moolenaar for ( var k in key ) { 835*31337658SMarcel Moolenaar jQuery.access( elems, k, key[k], exec, fn, value ); 836*31337658SMarcel Moolenaar } 837*31337658SMarcel Moolenaar return elems; 838*31337658SMarcel Moolenaar } 839*31337658SMarcel Moolenaar 840*31337658SMarcel Moolenaar // Setting one attribute 841*31337658SMarcel Moolenaar if ( value !== undefined ) { 842*31337658SMarcel Moolenaar // Optionally, function values get executed if exec is true 843*31337658SMarcel Moolenaar exec = !pass && exec && jQuery.isFunction(value); 844*31337658SMarcel Moolenaar 845*31337658SMarcel Moolenaar for ( var i = 0; i < length; i++ ) { 846*31337658SMarcel Moolenaar fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); 847*31337658SMarcel Moolenaar } 848*31337658SMarcel Moolenaar 849*31337658SMarcel Moolenaar return elems; 850*31337658SMarcel Moolenaar } 851*31337658SMarcel Moolenaar 852*31337658SMarcel Moolenaar // Getting an attribute 853*31337658SMarcel Moolenaar return length ? fn( elems[0], key ) : undefined; 854*31337658SMarcel Moolenaar }, 855*31337658SMarcel Moolenaar 856*31337658SMarcel Moolenaar now: function() { 857*31337658SMarcel Moolenaar return ( new Date() ).getTime(); 858*31337658SMarcel Moolenaar }, 859*31337658SMarcel Moolenaar 860*31337658SMarcel Moolenaar // Use of jQuery.browser is frowned upon. 861*31337658SMarcel Moolenaar // More details: http://docs.jquery.com/Utilities/jQuery.browser 862*31337658SMarcel Moolenaar uaMatch: function( ua ) { 863*31337658SMarcel Moolenaar ua = ua.toLowerCase(); 864*31337658SMarcel Moolenaar 865*31337658SMarcel Moolenaar var match = rwebkit.exec( ua ) || 866*31337658SMarcel Moolenaar ropera.exec( ua ) || 867*31337658SMarcel Moolenaar rmsie.exec( ua ) || 868*31337658SMarcel Moolenaar ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || 869*31337658SMarcel Moolenaar []; 870*31337658SMarcel Moolenaar 871*31337658SMarcel Moolenaar return { browser: match[1] || "", version: match[2] || "0" }; 872*31337658SMarcel Moolenaar }, 873*31337658SMarcel Moolenaar 874*31337658SMarcel Moolenaar sub: function() { 875*31337658SMarcel Moolenaar function jQuerySub( selector, context ) { 876*31337658SMarcel Moolenaar return new jQuerySub.fn.init( selector, context ); 877*31337658SMarcel Moolenaar } 878*31337658SMarcel Moolenaar jQuery.extend( true, jQuerySub, this ); 879*31337658SMarcel Moolenaar jQuerySub.superclass = this; 880*31337658SMarcel Moolenaar jQuerySub.fn = jQuerySub.prototype = this(); 881*31337658SMarcel Moolenaar jQuerySub.fn.constructor = jQuerySub; 882*31337658SMarcel Moolenaar jQuerySub.sub = this.sub; 883*31337658SMarcel Moolenaar jQuerySub.fn.init = function init( selector, context ) { 884*31337658SMarcel Moolenaar if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { 885*31337658SMarcel Moolenaar context = jQuerySub( context ); 886*31337658SMarcel Moolenaar } 887*31337658SMarcel Moolenaar 888*31337658SMarcel Moolenaar return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); 889*31337658SMarcel Moolenaar }; 890*31337658SMarcel Moolenaar jQuerySub.fn.init.prototype = jQuerySub.fn; 891*31337658SMarcel Moolenaar var rootjQuerySub = jQuerySub(document); 892*31337658SMarcel Moolenaar return jQuerySub; 893*31337658SMarcel Moolenaar }, 894*31337658SMarcel Moolenaar 895*31337658SMarcel Moolenaar browser: {} 896*31337658SMarcel Moolenaar}); 897*31337658SMarcel Moolenaar 898*31337658SMarcel Moolenaar// Populate the class2type map 899*31337658SMarcel MoolenaarjQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { 900*31337658SMarcel Moolenaar class2type[ "[object " + name + "]" ] = name.toLowerCase(); 901*31337658SMarcel Moolenaar}); 902*31337658SMarcel Moolenaar 903*31337658SMarcel MoolenaarbrowserMatch = jQuery.uaMatch( userAgent ); 904*31337658SMarcel Moolenaarif ( browserMatch.browser ) { 905*31337658SMarcel Moolenaar jQuery.browser[ browserMatch.browser ] = true; 906*31337658SMarcel Moolenaar jQuery.browser.version = browserMatch.version; 907*31337658SMarcel Moolenaar} 908*31337658SMarcel Moolenaar 909*31337658SMarcel Moolenaar// Deprecated, use jQuery.browser.webkit instead 910*31337658SMarcel Moolenaarif ( jQuery.browser.webkit ) { 911*31337658SMarcel Moolenaar jQuery.browser.safari = true; 912*31337658SMarcel Moolenaar} 913*31337658SMarcel Moolenaar 914*31337658SMarcel Moolenaar// IE doesn't match non-breaking spaces with \s 915*31337658SMarcel Moolenaarif ( rnotwhite.test( "\xA0" ) ) { 916*31337658SMarcel Moolenaar trimLeft = /^[\s\xA0]+/; 917*31337658SMarcel Moolenaar trimRight = /[\s\xA0]+$/; 918*31337658SMarcel Moolenaar} 919*31337658SMarcel Moolenaar 920*31337658SMarcel Moolenaar// All jQuery objects should point back to these 921*31337658SMarcel MoolenaarrootjQuery = jQuery(document); 922*31337658SMarcel Moolenaar 923*31337658SMarcel Moolenaar// Cleanup functions for the document ready method 924*31337658SMarcel Moolenaarif ( document.addEventListener ) { 925*31337658SMarcel Moolenaar DOMContentLoaded = function() { 926*31337658SMarcel Moolenaar document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); 927*31337658SMarcel Moolenaar jQuery.ready(); 928*31337658SMarcel Moolenaar }; 929*31337658SMarcel Moolenaar 930*31337658SMarcel Moolenaar} else if ( document.attachEvent ) { 931*31337658SMarcel Moolenaar DOMContentLoaded = function() { 932*31337658SMarcel Moolenaar // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). 933*31337658SMarcel Moolenaar if ( document.readyState === "complete" ) { 934*31337658SMarcel Moolenaar document.detachEvent( "onreadystatechange", DOMContentLoaded ); 935*31337658SMarcel Moolenaar jQuery.ready(); 936*31337658SMarcel Moolenaar } 937*31337658SMarcel Moolenaar }; 938*31337658SMarcel Moolenaar} 939*31337658SMarcel Moolenaar 940*31337658SMarcel Moolenaar// The DOM ready check for Internet Explorer 941*31337658SMarcel Moolenaarfunction doScrollCheck() { 942*31337658SMarcel Moolenaar if ( jQuery.isReady ) { 943*31337658SMarcel Moolenaar return; 944*31337658SMarcel Moolenaar } 945*31337658SMarcel Moolenaar 946*31337658SMarcel Moolenaar try { 947*31337658SMarcel Moolenaar // If IE is used, use the trick by Diego Perini 948*31337658SMarcel Moolenaar // http://javascript.nwbox.com/IEContentLoaded/ 949*31337658SMarcel Moolenaar document.documentElement.doScroll("left"); 950*31337658SMarcel Moolenaar } catch(e) { 951*31337658SMarcel Moolenaar setTimeout( doScrollCheck, 1 ); 952*31337658SMarcel Moolenaar return; 953*31337658SMarcel Moolenaar } 954*31337658SMarcel Moolenaar 955*31337658SMarcel Moolenaar // and execute any waiting functions 956*31337658SMarcel Moolenaar jQuery.ready(); 957*31337658SMarcel Moolenaar} 958*31337658SMarcel Moolenaar 959*31337658SMarcel Moolenaar// Expose jQuery as an AMD module, but only for AMD loaders that 960*31337658SMarcel Moolenaar// understand the issues with loading multiple versions of jQuery 961*31337658SMarcel Moolenaar// in a page that all might call define(). The loader will indicate 962*31337658SMarcel Moolenaar// they have special allowances for multiple jQuery versions by 963*31337658SMarcel Moolenaar// specifying define.amd.jQuery = true. Register as a named module, 964*31337658SMarcel Moolenaar// since jQuery can be concatenated with other files that may use define, 965*31337658SMarcel Moolenaar// but not use a proper concatenation script that understands anonymous 966*31337658SMarcel Moolenaar// AMD modules. A named AMD is safest and most robust way to register. 967*31337658SMarcel Moolenaar// Lowercase jquery is used because AMD module names are derived from 968*31337658SMarcel Moolenaar// file names, and jQuery is normally delivered in a lowercase file name. 969*31337658SMarcel Moolenaarif ( typeof define === "function" && define.amd && define.amd.jQuery ) { 970*31337658SMarcel Moolenaar define( "jquery", [], function () { return jQuery; } ); 971*31337658SMarcel Moolenaar} 972*31337658SMarcel Moolenaar 973*31337658SMarcel Moolenaarreturn jQuery; 974*31337658SMarcel Moolenaar 975*31337658SMarcel Moolenaar})(); 976*31337658SMarcel Moolenaar 977*31337658SMarcel Moolenaar 978*31337658SMarcel Moolenaar// String to Object flags format cache 979*31337658SMarcel Moolenaarvar flagsCache = {}; 980*31337658SMarcel Moolenaar 981*31337658SMarcel Moolenaar// Convert String-formatted flags into Object-formatted ones and store in cache 982*31337658SMarcel Moolenaarfunction createFlags( flags ) { 983*31337658SMarcel Moolenaar var object = flagsCache[ flags ] = {}, 984*31337658SMarcel Moolenaar i, length; 985*31337658SMarcel Moolenaar flags = flags.split( /\s+/ ); 986*31337658SMarcel Moolenaar for ( i = 0, length = flags.length; i < length; i++ ) { 987*31337658SMarcel Moolenaar object[ flags[i] ] = true; 988*31337658SMarcel Moolenaar } 989*31337658SMarcel Moolenaar return object; 990*31337658SMarcel Moolenaar} 991*31337658SMarcel Moolenaar 992*31337658SMarcel Moolenaar/* 993*31337658SMarcel Moolenaar * Create a callback list using the following parameters: 994*31337658SMarcel Moolenaar * 995*31337658SMarcel Moolenaar * flags: an optional list of space-separated flags that will change how 996*31337658SMarcel Moolenaar * the callback list behaves 997*31337658SMarcel Moolenaar * 998*31337658SMarcel Moolenaar * By default a callback list will act like an event callback list and can be 999*31337658SMarcel Moolenaar * "fired" multiple times. 1000*31337658SMarcel Moolenaar * 1001*31337658SMarcel Moolenaar * Possible flags: 1002*31337658SMarcel Moolenaar * 1003*31337658SMarcel Moolenaar * once: will ensure the callback list can only be fired once (like a Deferred) 1004*31337658SMarcel Moolenaar * 1005*31337658SMarcel Moolenaar * memory: will keep track of previous values and will call any callback added 1006*31337658SMarcel Moolenaar * after the list has been fired right away with the latest "memorized" 1007*31337658SMarcel Moolenaar * values (like a Deferred) 1008*31337658SMarcel Moolenaar * 1009*31337658SMarcel Moolenaar * unique: will ensure a callback can only be added once (no duplicate in the list) 1010*31337658SMarcel Moolenaar * 1011*31337658SMarcel Moolenaar * stopOnFalse: interrupt callings when a callback returns false 1012*31337658SMarcel Moolenaar * 1013*31337658SMarcel Moolenaar */ 1014*31337658SMarcel MoolenaarjQuery.Callbacks = function( flags ) { 1015*31337658SMarcel Moolenaar 1016*31337658SMarcel Moolenaar // Convert flags from String-formatted to Object-formatted 1017*31337658SMarcel Moolenaar // (we check in cache first) 1018*31337658SMarcel Moolenaar flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; 1019*31337658SMarcel Moolenaar 1020*31337658SMarcel Moolenaar var // Actual callback list 1021*31337658SMarcel Moolenaar list = [], 1022*31337658SMarcel Moolenaar // Stack of fire calls for repeatable lists 1023*31337658SMarcel Moolenaar stack = [], 1024*31337658SMarcel Moolenaar // Last fire value (for non-forgettable lists) 1025*31337658SMarcel Moolenaar memory, 1026*31337658SMarcel Moolenaar // Flag to know if list is currently firing 1027*31337658SMarcel Moolenaar firing, 1028*31337658SMarcel Moolenaar // First callback to fire (used internally by add and fireWith) 1029*31337658SMarcel Moolenaar firingStart, 1030*31337658SMarcel Moolenaar // End of the loop when firing 1031*31337658SMarcel Moolenaar firingLength, 1032*31337658SMarcel Moolenaar // Index of currently firing callback (modified by remove if needed) 1033*31337658SMarcel Moolenaar firingIndex, 1034*31337658SMarcel Moolenaar // Add one or several callbacks to the list 1035*31337658SMarcel Moolenaar add = function( args ) { 1036*31337658SMarcel Moolenaar var i, 1037*31337658SMarcel Moolenaar length, 1038*31337658SMarcel Moolenaar elem, 1039*31337658SMarcel Moolenaar type, 1040*31337658SMarcel Moolenaar actual; 1041*31337658SMarcel Moolenaar for ( i = 0, length = args.length; i < length; i++ ) { 1042*31337658SMarcel Moolenaar elem = args[ i ]; 1043*31337658SMarcel Moolenaar type = jQuery.type( elem ); 1044*31337658SMarcel Moolenaar if ( type === "array" ) { 1045*31337658SMarcel Moolenaar // Inspect recursively 1046*31337658SMarcel Moolenaar add( elem ); 1047*31337658SMarcel Moolenaar } else if ( type === "function" ) { 1048*31337658SMarcel Moolenaar // Add if not in unique mode and callback is not in 1049*31337658SMarcel Moolenaar if ( !flags.unique || !self.has( elem ) ) { 1050*31337658SMarcel Moolenaar list.push( elem ); 1051*31337658SMarcel Moolenaar } 1052*31337658SMarcel Moolenaar } 1053*31337658SMarcel Moolenaar } 1054*31337658SMarcel Moolenaar }, 1055*31337658SMarcel Moolenaar // Fire callbacks 1056*31337658SMarcel Moolenaar fire = function( context, args ) { 1057*31337658SMarcel Moolenaar args = args || []; 1058*31337658SMarcel Moolenaar memory = !flags.memory || [ context, args ]; 1059*31337658SMarcel Moolenaar firing = true; 1060*31337658SMarcel Moolenaar firingIndex = firingStart || 0; 1061*31337658SMarcel Moolenaar firingStart = 0; 1062*31337658SMarcel Moolenaar firingLength = list.length; 1063*31337658SMarcel Moolenaar for ( ; list && firingIndex < firingLength; firingIndex++ ) { 1064*31337658SMarcel Moolenaar if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { 1065*31337658SMarcel Moolenaar memory = true; // Mark as halted 1066*31337658SMarcel Moolenaar break; 1067*31337658SMarcel Moolenaar } 1068*31337658SMarcel Moolenaar } 1069*31337658SMarcel Moolenaar firing = false; 1070*31337658SMarcel Moolenaar if ( list ) { 1071*31337658SMarcel Moolenaar if ( !flags.once ) { 1072*31337658SMarcel Moolenaar if ( stack && stack.length ) { 1073*31337658SMarcel Moolenaar memory = stack.shift(); 1074*31337658SMarcel Moolenaar self.fireWith( memory[ 0 ], memory[ 1 ] ); 1075*31337658SMarcel Moolenaar } 1076*31337658SMarcel Moolenaar } else if ( memory === true ) { 1077*31337658SMarcel Moolenaar self.disable(); 1078*31337658SMarcel Moolenaar } else { 1079*31337658SMarcel Moolenaar list = []; 1080*31337658SMarcel Moolenaar } 1081*31337658SMarcel Moolenaar } 1082*31337658SMarcel Moolenaar }, 1083*31337658SMarcel Moolenaar // Actual Callbacks object 1084*31337658SMarcel Moolenaar self = { 1085*31337658SMarcel Moolenaar // Add a callback or a collection of callbacks to the list 1086*31337658SMarcel Moolenaar add: function() { 1087*31337658SMarcel Moolenaar if ( list ) { 1088*31337658SMarcel Moolenaar var length = list.length; 1089*31337658SMarcel Moolenaar add( arguments ); 1090*31337658SMarcel Moolenaar // Do we need to add the callbacks to the 1091*31337658SMarcel Moolenaar // current firing batch? 1092*31337658SMarcel Moolenaar if ( firing ) { 1093*31337658SMarcel Moolenaar firingLength = list.length; 1094*31337658SMarcel Moolenaar // With memory, if we're not firing then 1095*31337658SMarcel Moolenaar // we should call right away, unless previous 1096*31337658SMarcel Moolenaar // firing was halted (stopOnFalse) 1097*31337658SMarcel Moolenaar } else if ( memory && memory !== true ) { 1098*31337658SMarcel Moolenaar firingStart = length; 1099*31337658SMarcel Moolenaar fire( memory[ 0 ], memory[ 1 ] ); 1100*31337658SMarcel Moolenaar } 1101*31337658SMarcel Moolenaar } 1102*31337658SMarcel Moolenaar return this; 1103*31337658SMarcel Moolenaar }, 1104*31337658SMarcel Moolenaar // Remove a callback from the list 1105*31337658SMarcel Moolenaar remove: function() { 1106*31337658SMarcel Moolenaar if ( list ) { 1107*31337658SMarcel Moolenaar var args = arguments, 1108*31337658SMarcel Moolenaar argIndex = 0, 1109*31337658SMarcel Moolenaar argLength = args.length; 1110*31337658SMarcel Moolenaar for ( ; argIndex < argLength ; argIndex++ ) { 1111*31337658SMarcel Moolenaar for ( var i = 0; i < list.length; i++ ) { 1112*31337658SMarcel Moolenaar if ( args[ argIndex ] === list[ i ] ) { 1113*31337658SMarcel Moolenaar // Handle firingIndex and firingLength 1114*31337658SMarcel Moolenaar if ( firing ) { 1115*31337658SMarcel Moolenaar if ( i <= firingLength ) { 1116*31337658SMarcel Moolenaar firingLength--; 1117*31337658SMarcel Moolenaar if ( i <= firingIndex ) { 1118*31337658SMarcel Moolenaar firingIndex--; 1119*31337658SMarcel Moolenaar } 1120*31337658SMarcel Moolenaar } 1121*31337658SMarcel Moolenaar } 1122*31337658SMarcel Moolenaar // Remove the element 1123*31337658SMarcel Moolenaar list.splice( i--, 1 ); 1124*31337658SMarcel Moolenaar // If we have some unicity property then 1125*31337658SMarcel Moolenaar // we only need to do this once 1126*31337658SMarcel Moolenaar if ( flags.unique ) { 1127*31337658SMarcel Moolenaar break; 1128*31337658SMarcel Moolenaar } 1129*31337658SMarcel Moolenaar } 1130*31337658SMarcel Moolenaar } 1131*31337658SMarcel Moolenaar } 1132*31337658SMarcel Moolenaar } 1133*31337658SMarcel Moolenaar return this; 1134*31337658SMarcel Moolenaar }, 1135*31337658SMarcel Moolenaar // Control if a given callback is in the list 1136*31337658SMarcel Moolenaar has: function( fn ) { 1137*31337658SMarcel Moolenaar if ( list ) { 1138*31337658SMarcel Moolenaar var i = 0, 1139*31337658SMarcel Moolenaar length = list.length; 1140*31337658SMarcel Moolenaar for ( ; i < length; i++ ) { 1141*31337658SMarcel Moolenaar if ( fn === list[ i ] ) { 1142*31337658SMarcel Moolenaar return true; 1143*31337658SMarcel Moolenaar } 1144*31337658SMarcel Moolenaar } 1145*31337658SMarcel Moolenaar } 1146*31337658SMarcel Moolenaar return false; 1147*31337658SMarcel Moolenaar }, 1148*31337658SMarcel Moolenaar // Remove all callbacks from the list 1149*31337658SMarcel Moolenaar empty: function() { 1150*31337658SMarcel Moolenaar list = []; 1151*31337658SMarcel Moolenaar return this; 1152*31337658SMarcel Moolenaar }, 1153*31337658SMarcel Moolenaar // Have the list do nothing anymore 1154*31337658SMarcel Moolenaar disable: function() { 1155*31337658SMarcel Moolenaar list = stack = memory = undefined; 1156*31337658SMarcel Moolenaar return this; 1157*31337658SMarcel Moolenaar }, 1158*31337658SMarcel Moolenaar // Is it disabled? 1159*31337658SMarcel Moolenaar disabled: function() { 1160*31337658SMarcel Moolenaar return !list; 1161*31337658SMarcel Moolenaar }, 1162*31337658SMarcel Moolenaar // Lock the list in its current state 1163*31337658SMarcel Moolenaar lock: function() { 1164*31337658SMarcel Moolenaar stack = undefined; 1165*31337658SMarcel Moolenaar if ( !memory || memory === true ) { 1166*31337658SMarcel Moolenaar self.disable(); 1167*31337658SMarcel Moolenaar } 1168*31337658SMarcel Moolenaar return this; 1169*31337658SMarcel Moolenaar }, 1170*31337658SMarcel Moolenaar // Is it locked? 1171*31337658SMarcel Moolenaar locked: function() { 1172*31337658SMarcel Moolenaar return !stack; 1173*31337658SMarcel Moolenaar }, 1174*31337658SMarcel Moolenaar // Call all callbacks with the given context and arguments 1175*31337658SMarcel Moolenaar fireWith: function( context, args ) { 1176*31337658SMarcel Moolenaar if ( stack ) { 1177*31337658SMarcel Moolenaar if ( firing ) { 1178*31337658SMarcel Moolenaar if ( !flags.once ) { 1179*31337658SMarcel Moolenaar stack.push( [ context, args ] ); 1180*31337658SMarcel Moolenaar } 1181*31337658SMarcel Moolenaar } else if ( !( flags.once && memory ) ) { 1182*31337658SMarcel Moolenaar fire( context, args ); 1183*31337658SMarcel Moolenaar } 1184*31337658SMarcel Moolenaar } 1185*31337658SMarcel Moolenaar return this; 1186*31337658SMarcel Moolenaar }, 1187*31337658SMarcel Moolenaar // Call all the callbacks with the given arguments 1188*31337658SMarcel Moolenaar fire: function() { 1189*31337658SMarcel Moolenaar self.fireWith( this, arguments ); 1190*31337658SMarcel Moolenaar return this; 1191*31337658SMarcel Moolenaar }, 1192*31337658SMarcel Moolenaar // To know if the callbacks have already been called at least once 1193*31337658SMarcel Moolenaar fired: function() { 1194*31337658SMarcel Moolenaar return !!memory; 1195*31337658SMarcel Moolenaar } 1196*31337658SMarcel Moolenaar }; 1197*31337658SMarcel Moolenaar 1198*31337658SMarcel Moolenaar return self; 1199*31337658SMarcel Moolenaar}; 1200*31337658SMarcel Moolenaar 1201*31337658SMarcel Moolenaar 1202*31337658SMarcel Moolenaar 1203*31337658SMarcel Moolenaar 1204*31337658SMarcel Moolenaarvar // Static reference to slice 1205*31337658SMarcel Moolenaar sliceDeferred = [].slice; 1206*31337658SMarcel Moolenaar 1207*31337658SMarcel MoolenaarjQuery.extend({ 1208*31337658SMarcel Moolenaar 1209*31337658SMarcel Moolenaar Deferred: function( func ) { 1210*31337658SMarcel Moolenaar var doneList = jQuery.Callbacks( "once memory" ), 1211*31337658SMarcel Moolenaar failList = jQuery.Callbacks( "once memory" ), 1212*31337658SMarcel Moolenaar progressList = jQuery.Callbacks( "memory" ), 1213*31337658SMarcel Moolenaar state = "pending", 1214*31337658SMarcel Moolenaar lists = { 1215*31337658SMarcel Moolenaar resolve: doneList, 1216*31337658SMarcel Moolenaar reject: failList, 1217*31337658SMarcel Moolenaar notify: progressList 1218*31337658SMarcel Moolenaar }, 1219*31337658SMarcel Moolenaar promise = { 1220*31337658SMarcel Moolenaar done: doneList.add, 1221*31337658SMarcel Moolenaar fail: failList.add, 1222*31337658SMarcel Moolenaar progress: progressList.add, 1223*31337658SMarcel Moolenaar 1224*31337658SMarcel Moolenaar state: function() { 1225*31337658SMarcel Moolenaar return state; 1226*31337658SMarcel Moolenaar }, 1227*31337658SMarcel Moolenaar 1228*31337658SMarcel Moolenaar // Deprecated 1229*31337658SMarcel Moolenaar isResolved: doneList.fired, 1230*31337658SMarcel Moolenaar isRejected: failList.fired, 1231*31337658SMarcel Moolenaar 1232*31337658SMarcel Moolenaar then: function( doneCallbacks, failCallbacks, progressCallbacks ) { 1233*31337658SMarcel Moolenaar deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); 1234*31337658SMarcel Moolenaar return this; 1235*31337658SMarcel Moolenaar }, 1236*31337658SMarcel Moolenaar always: function() { 1237*31337658SMarcel Moolenaar return deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); 1238*31337658SMarcel Moolenaar }, 1239*31337658SMarcel Moolenaar pipe: function( fnDone, fnFail, fnProgress ) { 1240*31337658SMarcel Moolenaar return jQuery.Deferred(function( newDefer ) { 1241*31337658SMarcel Moolenaar jQuery.each( { 1242*31337658SMarcel Moolenaar done: [ fnDone, "resolve" ], 1243*31337658SMarcel Moolenaar fail: [ fnFail, "reject" ], 1244*31337658SMarcel Moolenaar progress: [ fnProgress, "notify" ] 1245*31337658SMarcel Moolenaar }, function( handler, data ) { 1246*31337658SMarcel Moolenaar var fn = data[ 0 ], 1247*31337658SMarcel Moolenaar action = data[ 1 ], 1248*31337658SMarcel Moolenaar returned; 1249*31337658SMarcel Moolenaar if ( jQuery.isFunction( fn ) ) { 1250*31337658SMarcel Moolenaar deferred[ handler ](function() { 1251*31337658SMarcel Moolenaar returned = fn.apply( this, arguments ); 1252*31337658SMarcel Moolenaar if ( returned && jQuery.isFunction( returned.promise ) ) { 1253*31337658SMarcel Moolenaar returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); 1254*31337658SMarcel Moolenaar } else { 1255*31337658SMarcel Moolenaar newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); 1256*31337658SMarcel Moolenaar } 1257*31337658SMarcel Moolenaar }); 1258*31337658SMarcel Moolenaar } else { 1259*31337658SMarcel Moolenaar deferred[ handler ]( newDefer[ action ] ); 1260*31337658SMarcel Moolenaar } 1261*31337658SMarcel Moolenaar }); 1262*31337658SMarcel Moolenaar }).promise(); 1263*31337658SMarcel Moolenaar }, 1264*31337658SMarcel Moolenaar // Get a promise for this deferred 1265*31337658SMarcel Moolenaar // If obj is provided, the promise aspect is added to the object 1266*31337658SMarcel Moolenaar promise: function( obj ) { 1267*31337658SMarcel Moolenaar if ( obj == null ) { 1268*31337658SMarcel Moolenaar obj = promise; 1269*31337658SMarcel Moolenaar } else { 1270*31337658SMarcel Moolenaar for ( var key in promise ) { 1271*31337658SMarcel Moolenaar obj[ key ] = promise[ key ]; 1272*31337658SMarcel Moolenaar } 1273*31337658SMarcel Moolenaar } 1274*31337658SMarcel Moolenaar return obj; 1275*31337658SMarcel Moolenaar } 1276*31337658SMarcel Moolenaar }, 1277*31337658SMarcel Moolenaar deferred = promise.promise({}), 1278*31337658SMarcel Moolenaar key; 1279*31337658SMarcel Moolenaar 1280*31337658SMarcel Moolenaar for ( key in lists ) { 1281*31337658SMarcel Moolenaar deferred[ key ] = lists[ key ].fire; 1282*31337658SMarcel Moolenaar deferred[ key + "With" ] = lists[ key ].fireWith; 1283*31337658SMarcel Moolenaar } 1284*31337658SMarcel Moolenaar 1285*31337658SMarcel Moolenaar // Handle state 1286*31337658SMarcel Moolenaar deferred.done( function() { 1287*31337658SMarcel Moolenaar state = "resolved"; 1288*31337658SMarcel Moolenaar }, failList.disable, progressList.lock ).fail( function() { 1289*31337658SMarcel Moolenaar state = "rejected"; 1290*31337658SMarcel Moolenaar }, doneList.disable, progressList.lock ); 1291*31337658SMarcel Moolenaar 1292*31337658SMarcel Moolenaar // Call given func if any 1293*31337658SMarcel Moolenaar if ( func ) { 1294*31337658SMarcel Moolenaar func.call( deferred, deferred ); 1295*31337658SMarcel Moolenaar } 1296*31337658SMarcel Moolenaar 1297*31337658SMarcel Moolenaar // All done! 1298*31337658SMarcel Moolenaar return deferred; 1299*31337658SMarcel Moolenaar }, 1300*31337658SMarcel Moolenaar 1301*31337658SMarcel Moolenaar // Deferred helper 1302*31337658SMarcel Moolenaar when: function( firstParam ) { 1303*31337658SMarcel Moolenaar var args = sliceDeferred.call( arguments, 0 ), 1304*31337658SMarcel Moolenaar i = 0, 1305*31337658SMarcel Moolenaar length = args.length, 1306*31337658SMarcel Moolenaar pValues = new Array( length ), 1307*31337658SMarcel Moolenaar count = length, 1308*31337658SMarcel Moolenaar pCount = length, 1309*31337658SMarcel Moolenaar deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? 1310*31337658SMarcel Moolenaar firstParam : 1311*31337658SMarcel Moolenaar jQuery.Deferred(), 1312*31337658SMarcel Moolenaar promise = deferred.promise(); 1313*31337658SMarcel Moolenaar function resolveFunc( i ) { 1314*31337658SMarcel Moolenaar return function( value ) { 1315*31337658SMarcel Moolenaar args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; 1316*31337658SMarcel Moolenaar if ( !( --count ) ) { 1317*31337658SMarcel Moolenaar deferred.resolveWith( deferred, args ); 1318*31337658SMarcel Moolenaar } 1319*31337658SMarcel Moolenaar }; 1320*31337658SMarcel Moolenaar } 1321*31337658SMarcel Moolenaar function progressFunc( i ) { 1322*31337658SMarcel Moolenaar return function( value ) { 1323*31337658SMarcel Moolenaar pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; 1324*31337658SMarcel Moolenaar deferred.notifyWith( promise, pValues ); 1325*31337658SMarcel Moolenaar }; 1326*31337658SMarcel Moolenaar } 1327*31337658SMarcel Moolenaar if ( length > 1 ) { 1328*31337658SMarcel Moolenaar for ( ; i < length; i++ ) { 1329*31337658SMarcel Moolenaar if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { 1330*31337658SMarcel Moolenaar args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); 1331*31337658SMarcel Moolenaar } else { 1332*31337658SMarcel Moolenaar --count; 1333*31337658SMarcel Moolenaar } 1334*31337658SMarcel Moolenaar } 1335*31337658SMarcel Moolenaar if ( !count ) { 1336*31337658SMarcel Moolenaar deferred.resolveWith( deferred, args ); 1337*31337658SMarcel Moolenaar } 1338*31337658SMarcel Moolenaar } else if ( deferred !== firstParam ) { 1339*31337658SMarcel Moolenaar deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); 1340*31337658SMarcel Moolenaar } 1341*31337658SMarcel Moolenaar return promise; 1342*31337658SMarcel Moolenaar } 1343*31337658SMarcel Moolenaar}); 1344*31337658SMarcel Moolenaar 1345*31337658SMarcel Moolenaar 1346*31337658SMarcel Moolenaar 1347*31337658SMarcel Moolenaar 1348*31337658SMarcel MoolenaarjQuery.support = (function() { 1349*31337658SMarcel Moolenaar 1350*31337658SMarcel Moolenaar var div = document.createElement( "div" ), 1351*31337658SMarcel Moolenaar documentElement = document.documentElement, 1352*31337658SMarcel Moolenaar all, 1353*31337658SMarcel Moolenaar a, 1354*31337658SMarcel Moolenaar select, 1355*31337658SMarcel Moolenaar opt, 1356*31337658SMarcel Moolenaar input, 1357*31337658SMarcel Moolenaar marginDiv, 1358*31337658SMarcel Moolenaar support, 1359*31337658SMarcel Moolenaar fragment, 1360*31337658SMarcel Moolenaar body, 1361*31337658SMarcel Moolenaar testElementParent, 1362*31337658SMarcel Moolenaar testElement, 1363*31337658SMarcel Moolenaar testElementStyle, 1364*31337658SMarcel Moolenaar tds, 1365*31337658SMarcel Moolenaar events, 1366*31337658SMarcel Moolenaar eventName, 1367*31337658SMarcel Moolenaar i, 1368*31337658SMarcel Moolenaar isSupported; 1369*31337658SMarcel Moolenaar 1370*31337658SMarcel Moolenaar // Preliminary tests 1371*31337658SMarcel Moolenaar div.setAttribute("className", "t"); 1372*31337658SMarcel Moolenaar div.innerHTML = " <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/><nav></nav>"; 1373*31337658SMarcel Moolenaar 1374*31337658SMarcel Moolenaar 1375*31337658SMarcel Moolenaar all = div.getElementsByTagName( "*" ); 1376*31337658SMarcel Moolenaar a = div.getElementsByTagName( "a" )[ 0 ]; 1377*31337658SMarcel Moolenaar 1378*31337658SMarcel Moolenaar // Can't get basic test support 1379*31337658SMarcel Moolenaar if ( !all || !all.length || !a ) { 1380*31337658SMarcel Moolenaar return {}; 1381*31337658SMarcel Moolenaar } 1382*31337658SMarcel Moolenaar 1383*31337658SMarcel Moolenaar // First batch of supports tests 1384*31337658SMarcel Moolenaar select = document.createElement( "select" ); 1385*31337658SMarcel Moolenaar opt = select.appendChild( document.createElement("option") ); 1386*31337658SMarcel Moolenaar input = div.getElementsByTagName( "input" )[ 0 ]; 1387*31337658SMarcel Moolenaar 1388*31337658SMarcel Moolenaar support = { 1389*31337658SMarcel Moolenaar // IE strips leading whitespace when .innerHTML is used 1390*31337658SMarcel Moolenaar leadingWhitespace: ( div.firstChild.nodeType === 3 ), 1391*31337658SMarcel Moolenaar 1392*31337658SMarcel Moolenaar // Make sure that tbody elements aren't automatically inserted 1393*31337658SMarcel Moolenaar // IE will insert them into empty tables 1394*31337658SMarcel Moolenaar tbody: !div.getElementsByTagName( "tbody" ).length, 1395*31337658SMarcel Moolenaar 1396*31337658SMarcel Moolenaar // Make sure that link elements get serialized correctly by innerHTML 1397*31337658SMarcel Moolenaar // This requires a wrapper element in IE 1398*31337658SMarcel Moolenaar htmlSerialize: !!div.getElementsByTagName( "link" ).length, 1399*31337658SMarcel Moolenaar 1400*31337658SMarcel Moolenaar // Get the style information from getAttribute 1401*31337658SMarcel Moolenaar // (IE uses .cssText instead) 1402*31337658SMarcel Moolenaar style: /top/.test( a.getAttribute("style") ), 1403*31337658SMarcel Moolenaar 1404*31337658SMarcel Moolenaar // Make sure that URLs aren't manipulated 1405*31337658SMarcel Moolenaar // (IE normalizes it by default) 1406*31337658SMarcel Moolenaar hrefNormalized: ( a.getAttribute( "href" ) === "/a" ), 1407*31337658SMarcel Moolenaar 1408*31337658SMarcel Moolenaar // Make sure that element opacity exists 1409*31337658SMarcel Moolenaar // (IE uses filter instead) 1410*31337658SMarcel Moolenaar // Use a regex to work around a WebKit issue. See #5145 1411*31337658SMarcel Moolenaar opacity: /^0.55/.test( a.style.opacity ), 1412*31337658SMarcel Moolenaar 1413*31337658SMarcel Moolenaar // Verify style float existence 1414*31337658SMarcel Moolenaar // (IE uses styleFloat instead of cssFloat) 1415*31337658SMarcel Moolenaar cssFloat: !!a.style.cssFloat, 1416*31337658SMarcel Moolenaar 1417*31337658SMarcel Moolenaar // Make sure unknown elements (like HTML5 elems) are handled appropriately 1418*31337658SMarcel Moolenaar unknownElems: !!div.getElementsByTagName( "nav" ).length, 1419*31337658SMarcel Moolenaar 1420*31337658SMarcel Moolenaar // Make sure that if no value is specified for a checkbox 1421*31337658SMarcel Moolenaar // that it defaults to "on". 1422*31337658SMarcel Moolenaar // (WebKit defaults to "" instead) 1423*31337658SMarcel Moolenaar checkOn: ( input.value === "on" ), 1424*31337658SMarcel Moolenaar 1425*31337658SMarcel Moolenaar // Make sure that a selected-by-default option has a working selected property. 1426*31337658SMarcel Moolenaar // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) 1427*31337658SMarcel Moolenaar optSelected: opt.selected, 1428*31337658SMarcel Moolenaar 1429*31337658SMarcel Moolenaar // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) 1430*31337658SMarcel Moolenaar getSetAttribute: div.className !== "t", 1431*31337658SMarcel Moolenaar 1432*31337658SMarcel Moolenaar // Tests for enctype support on a form(#6743) 1433*31337658SMarcel Moolenaar enctype: !!document.createElement("form").enctype, 1434*31337658SMarcel Moolenaar 1435*31337658SMarcel Moolenaar // Will be defined later 1436*31337658SMarcel Moolenaar submitBubbles: true, 1437*31337658SMarcel Moolenaar changeBubbles: true, 1438*31337658SMarcel Moolenaar focusinBubbles: false, 1439*31337658SMarcel Moolenaar deleteExpando: true, 1440*31337658SMarcel Moolenaar noCloneEvent: true, 1441*31337658SMarcel Moolenaar inlineBlockNeedsLayout: false, 1442*31337658SMarcel Moolenaar shrinkWrapBlocks: false, 1443*31337658SMarcel Moolenaar reliableMarginRight: true 1444*31337658SMarcel Moolenaar }; 1445*31337658SMarcel Moolenaar 1446*31337658SMarcel Moolenaar // Make sure checked status is properly cloned 1447*31337658SMarcel Moolenaar input.checked = true; 1448*31337658SMarcel Moolenaar support.noCloneChecked = input.cloneNode( true ).checked; 1449*31337658SMarcel Moolenaar 1450*31337658SMarcel Moolenaar // Make sure that the options inside disabled selects aren't marked as disabled 1451*31337658SMarcel Moolenaar // (WebKit marks them as disabled) 1452*31337658SMarcel Moolenaar select.disabled = true; 1453*31337658SMarcel Moolenaar support.optDisabled = !opt.disabled; 1454*31337658SMarcel Moolenaar 1455*31337658SMarcel Moolenaar // Test to see if it's possible to delete an expando from an element 1456*31337658SMarcel Moolenaar // Fails in Internet Explorer 1457*31337658SMarcel Moolenaar try { 1458*31337658SMarcel Moolenaar delete div.test; 1459*31337658SMarcel Moolenaar } catch( e ) { 1460*31337658SMarcel Moolenaar support.deleteExpando = false; 1461*31337658SMarcel Moolenaar } 1462*31337658SMarcel Moolenaar 1463*31337658SMarcel Moolenaar if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { 1464*31337658SMarcel Moolenaar div.attachEvent( "onclick", function() { 1465*31337658SMarcel Moolenaar // Cloning a node shouldn't copy over any 1466*31337658SMarcel Moolenaar // bound event handlers (IE does this) 1467*31337658SMarcel Moolenaar support.noCloneEvent = false; 1468*31337658SMarcel Moolenaar }); 1469*31337658SMarcel Moolenaar div.cloneNode( true ).fireEvent( "onclick" ); 1470*31337658SMarcel Moolenaar } 1471*31337658SMarcel Moolenaar 1472*31337658SMarcel Moolenaar // Check if a radio maintains its value 1473*31337658SMarcel Moolenaar // after being appended to the DOM 1474*31337658SMarcel Moolenaar input = document.createElement("input"); 1475*31337658SMarcel Moolenaar input.value = "t"; 1476*31337658SMarcel Moolenaar input.setAttribute("type", "radio"); 1477*31337658SMarcel Moolenaar support.radioValue = input.value === "t"; 1478*31337658SMarcel Moolenaar 1479*31337658SMarcel Moolenaar input.setAttribute("checked", "checked"); 1480*31337658SMarcel Moolenaar div.appendChild( input ); 1481*31337658SMarcel Moolenaar fragment = document.createDocumentFragment(); 1482*31337658SMarcel Moolenaar fragment.appendChild( div.lastChild ); 1483*31337658SMarcel Moolenaar 1484*31337658SMarcel Moolenaar // WebKit doesn't clone checked state correctly in fragments 1485*31337658SMarcel Moolenaar support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; 1486*31337658SMarcel Moolenaar 1487*31337658SMarcel Moolenaar div.innerHTML = ""; 1488*31337658SMarcel Moolenaar 1489*31337658SMarcel Moolenaar // Figure out if the W3C box model works as expected 1490*31337658SMarcel Moolenaar div.style.width = div.style.paddingLeft = "1px"; 1491*31337658SMarcel Moolenaar 1492*31337658SMarcel Moolenaar // We don't want to do body-related feature tests on frameset 1493*31337658SMarcel Moolenaar // documents, which lack a body. So we use 1494*31337658SMarcel Moolenaar // document.getElementsByTagName("body")[0], which is undefined in 1495*31337658SMarcel Moolenaar // frameset documents, while document.body isn’t. (7398) 1496*31337658SMarcel Moolenaar body = document.getElementsByTagName("body")[ 0 ]; 1497*31337658SMarcel Moolenaar // We use our own, invisible, body unless the body is already present 1498*31337658SMarcel Moolenaar // in which case we use a div (#9239) 1499*31337658SMarcel Moolenaar testElement = document.createElement( body ? "div" : "body" ); 1500*31337658SMarcel Moolenaar testElementStyle = { 1501*31337658SMarcel Moolenaar visibility: "hidden", 1502*31337658SMarcel Moolenaar width: 0, 1503*31337658SMarcel Moolenaar height: 0, 1504*31337658SMarcel Moolenaar border: 0, 1505*31337658SMarcel Moolenaar margin: 0, 1506*31337658SMarcel Moolenaar background: "none" 1507*31337658SMarcel Moolenaar }; 1508*31337658SMarcel Moolenaar if ( body ) { 1509*31337658SMarcel Moolenaar jQuery.extend( testElementStyle, { 1510*31337658SMarcel Moolenaar position: "absolute", 1511*31337658SMarcel Moolenaar left: "-999px", 1512*31337658SMarcel Moolenaar top: "-999px" 1513*31337658SMarcel Moolenaar }); 1514*31337658SMarcel Moolenaar } 1515*31337658SMarcel Moolenaar for ( i in testElementStyle ) { 1516*31337658SMarcel Moolenaar testElement.style[ i ] = testElementStyle[ i ]; 1517*31337658SMarcel Moolenaar } 1518*31337658SMarcel Moolenaar testElement.appendChild( div ); 1519*31337658SMarcel Moolenaar testElementParent = body || documentElement; 1520*31337658SMarcel Moolenaar testElementParent.insertBefore( testElement, testElementParent.firstChild ); 1521*31337658SMarcel Moolenaar 1522*31337658SMarcel Moolenaar // Check if a disconnected checkbox will retain its checked 1523*31337658SMarcel Moolenaar // value of true after appended to the DOM (IE6/7) 1524*31337658SMarcel Moolenaar support.appendChecked = input.checked; 1525*31337658SMarcel Moolenaar 1526*31337658SMarcel Moolenaar support.boxModel = div.offsetWidth === 2; 1527*31337658SMarcel Moolenaar 1528*31337658SMarcel Moolenaar if ( "zoom" in div.style ) { 1529*31337658SMarcel Moolenaar // Check if natively block-level elements act like inline-block 1530*31337658SMarcel Moolenaar // elements when setting their display to 'inline' and giving 1531*31337658SMarcel Moolenaar // them layout 1532*31337658SMarcel Moolenaar // (IE < 8 does this) 1533*31337658SMarcel Moolenaar div.style.display = "inline"; 1534*31337658SMarcel Moolenaar div.style.zoom = 1; 1535*31337658SMarcel Moolenaar support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); 1536*31337658SMarcel Moolenaar 1537*31337658SMarcel Moolenaar // Check if elements with layout shrink-wrap their children 1538*31337658SMarcel Moolenaar // (IE 6 does this) 1539*31337658SMarcel Moolenaar div.style.display = ""; 1540*31337658SMarcel Moolenaar div.innerHTML = "<div style='width:4px;'></div>"; 1541*31337658SMarcel Moolenaar support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); 1542*31337658SMarcel Moolenaar } 1543*31337658SMarcel Moolenaar 1544*31337658SMarcel Moolenaar div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>"; 1545*31337658SMarcel Moolenaar tds = div.getElementsByTagName( "td" ); 1546*31337658SMarcel Moolenaar 1547*31337658SMarcel Moolenaar // Check if table cells still have offsetWidth/Height when they are set 1548*31337658SMarcel Moolenaar // to display:none and there are still other visible table cells in a 1549*31337658SMarcel Moolenaar // table row; if so, offsetWidth/Height are not reliable for use when 1550*31337658SMarcel Moolenaar // determining if an element has been hidden directly using 1551*31337658SMarcel Moolenaar // display:none (it is still safe to use offsets if a parent element is 1552*31337658SMarcel Moolenaar // hidden; don safety goggles and see bug #4512 for more information). 1553*31337658SMarcel Moolenaar // (only IE 8 fails this test) 1554*31337658SMarcel Moolenaar isSupported = ( tds[ 0 ].offsetHeight === 0 ); 1555*31337658SMarcel Moolenaar 1556*31337658SMarcel Moolenaar tds[ 0 ].style.display = ""; 1557*31337658SMarcel Moolenaar tds[ 1 ].style.display = "none"; 1558*31337658SMarcel Moolenaar 1559*31337658SMarcel Moolenaar // Check if empty table cells still have offsetWidth/Height 1560*31337658SMarcel Moolenaar // (IE < 8 fail this test) 1561*31337658SMarcel Moolenaar support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); 1562*31337658SMarcel Moolenaar div.innerHTML = ""; 1563*31337658SMarcel Moolenaar 1564*31337658SMarcel Moolenaar // Check if div with explicit width and no margin-right incorrectly 1565*31337658SMarcel Moolenaar // gets computed margin-right based on width of container. For more 1566*31337658SMarcel Moolenaar // info see bug #3333 1567*31337658SMarcel Moolenaar // Fails in WebKit before Feb 2011 nightlies 1568*31337658SMarcel Moolenaar // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right 1569*31337658SMarcel Moolenaar if ( document.defaultView && document.defaultView.getComputedStyle ) { 1570*31337658SMarcel Moolenaar marginDiv = document.createElement( "div" ); 1571*31337658SMarcel Moolenaar marginDiv.style.width = "0"; 1572*31337658SMarcel Moolenaar marginDiv.style.marginRight = "0"; 1573*31337658SMarcel Moolenaar div.appendChild( marginDiv ); 1574*31337658SMarcel Moolenaar support.reliableMarginRight = 1575*31337658SMarcel Moolenaar ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; 1576*31337658SMarcel Moolenaar } 1577*31337658SMarcel Moolenaar 1578*31337658SMarcel Moolenaar // Technique from Juriy Zaytsev 1579*31337658SMarcel Moolenaar // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ 1580*31337658SMarcel Moolenaar // We only care about the case where non-standard event systems 1581*31337658SMarcel Moolenaar // are used, namely in IE. Short-circuiting here helps us to 1582*31337658SMarcel Moolenaar // avoid an eval call (in setAttribute) which can cause CSP 1583*31337658SMarcel Moolenaar // to go haywire. See: https://developer.mozilla.org/en/Security/CSP 1584*31337658SMarcel Moolenaar if ( div.attachEvent ) { 1585*31337658SMarcel Moolenaar for( i in { 1586*31337658SMarcel Moolenaar submit: 1, 1587*31337658SMarcel Moolenaar change: 1, 1588*31337658SMarcel Moolenaar focusin: 1 1589*31337658SMarcel Moolenaar } ) { 1590*31337658SMarcel Moolenaar eventName = "on" + i; 1591*31337658SMarcel Moolenaar isSupported = ( eventName in div ); 1592*31337658SMarcel Moolenaar if ( !isSupported ) { 1593*31337658SMarcel Moolenaar div.setAttribute( eventName, "return;" ); 1594*31337658SMarcel Moolenaar isSupported = ( typeof div[ eventName ] === "function" ); 1595*31337658SMarcel Moolenaar } 1596*31337658SMarcel Moolenaar support[ i + "Bubbles" ] = isSupported; 1597*31337658SMarcel Moolenaar } 1598*31337658SMarcel Moolenaar } 1599*31337658SMarcel Moolenaar 1600*31337658SMarcel Moolenaar // Run fixed position tests at doc ready to avoid a crash 1601*31337658SMarcel Moolenaar // related to the invisible body in IE8 1602*31337658SMarcel Moolenaar jQuery(function() { 1603*31337658SMarcel Moolenaar var container, outer, inner, table, td, offsetSupport, 1604*31337658SMarcel Moolenaar conMarginTop = 1, 1605*31337658SMarcel Moolenaar ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;", 1606*31337658SMarcel Moolenaar vb = "visibility:hidden;border:0;", 1607*31337658SMarcel Moolenaar style = "style='" + ptlm + "border:5px solid #000;padding:0;'", 1608*31337658SMarcel Moolenaar html = "<div " + style + "><div></div></div>" + 1609*31337658SMarcel Moolenaar "<table " + style + " cellpadding='0' cellspacing='0'>" + 1610*31337658SMarcel Moolenaar "<tr><td></td></tr></table>"; 1611*31337658SMarcel Moolenaar 1612*31337658SMarcel Moolenaar // Reconstruct a container 1613*31337658SMarcel Moolenaar body = document.getElementsByTagName("body")[0]; 1614*31337658SMarcel Moolenaar if ( !body ) { 1615*31337658SMarcel Moolenaar // Return for frameset docs that don't have a body 1616*31337658SMarcel Moolenaar // These tests cannot be done 1617*31337658SMarcel Moolenaar return; 1618*31337658SMarcel Moolenaar } 1619*31337658SMarcel Moolenaar 1620*31337658SMarcel Moolenaar container = document.createElement("div"); 1621*31337658SMarcel Moolenaar container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; 1622*31337658SMarcel Moolenaar body.insertBefore( container, body.firstChild ); 1623*31337658SMarcel Moolenaar 1624*31337658SMarcel Moolenaar // Construct a test element 1625*31337658SMarcel Moolenaar testElement = document.createElement("div"); 1626*31337658SMarcel Moolenaar testElement.style.cssText = ptlm + vb; 1627*31337658SMarcel Moolenaar 1628*31337658SMarcel Moolenaar testElement.innerHTML = html; 1629*31337658SMarcel Moolenaar container.appendChild( testElement ); 1630*31337658SMarcel Moolenaar outer = testElement.firstChild; 1631*31337658SMarcel Moolenaar inner = outer.firstChild; 1632*31337658SMarcel Moolenaar td = outer.nextSibling.firstChild.firstChild; 1633*31337658SMarcel Moolenaar 1634*31337658SMarcel Moolenaar offsetSupport = { 1635*31337658SMarcel Moolenaar doesNotAddBorder: ( inner.offsetTop !== 5 ), 1636*31337658SMarcel Moolenaar doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) 1637*31337658SMarcel Moolenaar }; 1638*31337658SMarcel Moolenaar 1639*31337658SMarcel Moolenaar inner.style.position = "fixed"; 1640*31337658SMarcel Moolenaar inner.style.top = "20px"; 1641*31337658SMarcel Moolenaar 1642*31337658SMarcel Moolenaar // safari subtracts parent border width here which is 5px 1643*31337658SMarcel Moolenaar offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); 1644*31337658SMarcel Moolenaar inner.style.position = inner.style.top = ""; 1645*31337658SMarcel Moolenaar 1646*31337658SMarcel Moolenaar outer.style.overflow = "hidden"; 1647*31337658SMarcel Moolenaar outer.style.position = "relative"; 1648*31337658SMarcel Moolenaar 1649*31337658SMarcel Moolenaar offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); 1650*31337658SMarcel Moolenaar offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); 1651*31337658SMarcel Moolenaar 1652*31337658SMarcel Moolenaar body.removeChild( container ); 1653*31337658SMarcel Moolenaar testElement = container = null; 1654*31337658SMarcel Moolenaar 1655*31337658SMarcel Moolenaar jQuery.extend( support, offsetSupport ); 1656*31337658SMarcel Moolenaar }); 1657*31337658SMarcel Moolenaar 1658*31337658SMarcel Moolenaar testElement.innerHTML = ""; 1659*31337658SMarcel Moolenaar testElementParent.removeChild( testElement ); 1660*31337658SMarcel Moolenaar 1661*31337658SMarcel Moolenaar // Null connected elements to avoid leaks in IE 1662*31337658SMarcel Moolenaar testElement = fragment = select = opt = body = marginDiv = div = input = null; 1663*31337658SMarcel Moolenaar 1664*31337658SMarcel Moolenaar return support; 1665*31337658SMarcel Moolenaar})(); 1666*31337658SMarcel Moolenaar 1667*31337658SMarcel Moolenaar// Keep track of boxModel 1668*31337658SMarcel MoolenaarjQuery.boxModel = jQuery.support.boxModel; 1669*31337658SMarcel Moolenaar 1670*31337658SMarcel Moolenaar 1671*31337658SMarcel Moolenaar 1672*31337658SMarcel Moolenaar 1673*31337658SMarcel Moolenaarvar rbrace = /^(?:\{.*\}|\[.*\])$/, 1674*31337658SMarcel Moolenaar rmultiDash = /([A-Z])/g; 1675*31337658SMarcel Moolenaar 1676*31337658SMarcel MoolenaarjQuery.extend({ 1677*31337658SMarcel Moolenaar cache: {}, 1678*31337658SMarcel Moolenaar 1679*31337658SMarcel Moolenaar // Please use with caution 1680*31337658SMarcel Moolenaar uuid: 0, 1681*31337658SMarcel Moolenaar 1682*31337658SMarcel Moolenaar // Unique for each copy of jQuery on the page 1683*31337658SMarcel Moolenaar // Non-digits removed to match rinlinejQuery 1684*31337658SMarcel Moolenaar expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), 1685*31337658SMarcel Moolenaar 1686*31337658SMarcel Moolenaar // The following elements throw uncatchable exceptions if you 1687*31337658SMarcel Moolenaar // attempt to add expando properties to them. 1688*31337658SMarcel Moolenaar noData: { 1689*31337658SMarcel Moolenaar "embed": true, 1690*31337658SMarcel Moolenaar // Ban all objects except for Flash (which handle expandos) 1691*31337658SMarcel Moolenaar "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", 1692*31337658SMarcel Moolenaar "applet": true 1693*31337658SMarcel Moolenaar }, 1694*31337658SMarcel Moolenaar 1695*31337658SMarcel Moolenaar hasData: function( elem ) { 1696*31337658SMarcel Moolenaar elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; 1697*31337658SMarcel Moolenaar return !!elem && !isEmptyDataObject( elem ); 1698*31337658SMarcel Moolenaar }, 1699*31337658SMarcel Moolenaar 1700*31337658SMarcel Moolenaar data: function( elem, name, data, pvt /* Internal Use Only */ ) { 1701*31337658SMarcel Moolenaar if ( !jQuery.acceptData( elem ) ) { 1702*31337658SMarcel Moolenaar return; 1703*31337658SMarcel Moolenaar } 1704*31337658SMarcel Moolenaar 1705*31337658SMarcel Moolenaar var privateCache, thisCache, ret, 1706*31337658SMarcel Moolenaar internalKey = jQuery.expando, 1707*31337658SMarcel Moolenaar getByName = typeof name === "string", 1708*31337658SMarcel Moolenaar 1709*31337658SMarcel Moolenaar // We have to handle DOM nodes and JS objects differently because IE6-7 1710*31337658SMarcel Moolenaar // can't GC object references properly across the DOM-JS boundary 1711*31337658SMarcel Moolenaar isNode = elem.nodeType, 1712*31337658SMarcel Moolenaar 1713*31337658SMarcel Moolenaar // Only DOM nodes need the global jQuery cache; JS object data is 1714*31337658SMarcel Moolenaar // attached directly to the object so GC can occur automatically 1715*31337658SMarcel Moolenaar cache = isNode ? jQuery.cache : elem, 1716*31337658SMarcel Moolenaar 1717*31337658SMarcel Moolenaar // Only defining an ID for JS objects if its cache already exists allows 1718*31337658SMarcel Moolenaar // the code to shortcut on the same path as a DOM node with no cache 1719*31337658SMarcel Moolenaar id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando, 1720*31337658SMarcel Moolenaar isEvents = name === "events"; 1721*31337658SMarcel Moolenaar 1722*31337658SMarcel Moolenaar // Avoid doing any more work than we need to when trying to get data on an 1723*31337658SMarcel Moolenaar // object that has no data at all 1724*31337658SMarcel Moolenaar if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { 1725*31337658SMarcel Moolenaar return; 1726*31337658SMarcel Moolenaar } 1727*31337658SMarcel Moolenaar 1728*31337658SMarcel Moolenaar if ( !id ) { 1729*31337658SMarcel Moolenaar // Only DOM nodes need a new unique ID for each element since their data 1730*31337658SMarcel Moolenaar // ends up in the global cache 1731*31337658SMarcel Moolenaar if ( isNode ) { 1732*31337658SMarcel Moolenaar elem[ jQuery.expando ] = id = ++jQuery.uuid; 1733*31337658SMarcel Moolenaar } else { 1734*31337658SMarcel Moolenaar id = jQuery.expando; 1735*31337658SMarcel Moolenaar } 1736*31337658SMarcel Moolenaar } 1737*31337658SMarcel Moolenaar 1738*31337658SMarcel Moolenaar if ( !cache[ id ] ) { 1739*31337658SMarcel Moolenaar cache[ id ] = {}; 1740*31337658SMarcel Moolenaar 1741*31337658SMarcel Moolenaar // Avoids exposing jQuery metadata on plain JS objects when the object 1742*31337658SMarcel Moolenaar // is serialized using JSON.stringify 1743*31337658SMarcel Moolenaar if ( !isNode ) { 1744*31337658SMarcel Moolenaar cache[ id ].toJSON = jQuery.noop; 1745*31337658SMarcel Moolenaar } 1746*31337658SMarcel Moolenaar } 1747*31337658SMarcel Moolenaar 1748*31337658SMarcel Moolenaar // An object can be passed to jQuery.data instead of a key/value pair; this gets 1749*31337658SMarcel Moolenaar // shallow copied over onto the existing cache 1750*31337658SMarcel Moolenaar if ( typeof name === "object" || typeof name === "function" ) { 1751*31337658SMarcel Moolenaar if ( pvt ) { 1752*31337658SMarcel Moolenaar cache[ id ] = jQuery.extend( cache[ id ], name ); 1753*31337658SMarcel Moolenaar } else { 1754*31337658SMarcel Moolenaar cache[ id ].data = jQuery.extend( cache[ id ].data, name ); 1755*31337658SMarcel Moolenaar } 1756*31337658SMarcel Moolenaar } 1757*31337658SMarcel Moolenaar 1758*31337658SMarcel Moolenaar privateCache = thisCache = cache[ id ]; 1759*31337658SMarcel Moolenaar 1760*31337658SMarcel Moolenaar // jQuery data() is stored in a separate object inside the object's internal data 1761*31337658SMarcel Moolenaar // cache in order to avoid key collisions between internal data and user-defined 1762*31337658SMarcel Moolenaar // data. 1763*31337658SMarcel Moolenaar if ( !pvt ) { 1764*31337658SMarcel Moolenaar if ( !thisCache.data ) { 1765*31337658SMarcel Moolenaar thisCache.data = {}; 1766*31337658SMarcel Moolenaar } 1767*31337658SMarcel Moolenaar 1768*31337658SMarcel Moolenaar thisCache = thisCache.data; 1769*31337658SMarcel Moolenaar } 1770*31337658SMarcel Moolenaar 1771*31337658SMarcel Moolenaar if ( data !== undefined ) { 1772*31337658SMarcel Moolenaar thisCache[ jQuery.camelCase( name ) ] = data; 1773*31337658SMarcel Moolenaar } 1774*31337658SMarcel Moolenaar 1775*31337658SMarcel Moolenaar // Users should not attempt to inspect the internal events object using jQuery.data, 1776*31337658SMarcel Moolenaar // it is undocumented and subject to change. But does anyone listen? No. 1777*31337658SMarcel Moolenaar if ( isEvents && !thisCache[ name ] ) { 1778*31337658SMarcel Moolenaar return privateCache.events; 1779*31337658SMarcel Moolenaar } 1780*31337658SMarcel Moolenaar 1781*31337658SMarcel Moolenaar // Check for both converted-to-camel and non-converted data property names 1782*31337658SMarcel Moolenaar // If a data property was specified 1783*31337658SMarcel Moolenaar if ( getByName ) { 1784*31337658SMarcel Moolenaar 1785*31337658SMarcel Moolenaar // First Try to find as-is property data 1786*31337658SMarcel Moolenaar ret = thisCache[ name ]; 1787*31337658SMarcel Moolenaar 1788*31337658SMarcel Moolenaar // Test for null|undefined property data 1789*31337658SMarcel Moolenaar if ( ret == null ) { 1790*31337658SMarcel Moolenaar 1791*31337658SMarcel Moolenaar // Try to find the camelCased property 1792*31337658SMarcel Moolenaar ret = thisCache[ jQuery.camelCase( name ) ]; 1793*31337658SMarcel Moolenaar } 1794*31337658SMarcel Moolenaar } else { 1795*31337658SMarcel Moolenaar ret = thisCache; 1796*31337658SMarcel Moolenaar } 1797*31337658SMarcel Moolenaar 1798*31337658SMarcel Moolenaar return ret; 1799*31337658SMarcel Moolenaar }, 1800*31337658SMarcel Moolenaar 1801*31337658SMarcel Moolenaar removeData: function( elem, name, pvt /* Internal Use Only */ ) { 1802*31337658SMarcel Moolenaar if ( !jQuery.acceptData( elem ) ) { 1803*31337658SMarcel Moolenaar return; 1804*31337658SMarcel Moolenaar } 1805*31337658SMarcel Moolenaar 1806*31337658SMarcel Moolenaar var thisCache, i, l, 1807*31337658SMarcel Moolenaar 1808*31337658SMarcel Moolenaar // Reference to internal data cache key 1809*31337658SMarcel Moolenaar internalKey = jQuery.expando, 1810*31337658SMarcel Moolenaar 1811*31337658SMarcel Moolenaar isNode = elem.nodeType, 1812*31337658SMarcel Moolenaar 1813*31337658SMarcel Moolenaar // See jQuery.data for more information 1814*31337658SMarcel Moolenaar cache = isNode ? jQuery.cache : elem, 1815*31337658SMarcel Moolenaar 1816*31337658SMarcel Moolenaar // See jQuery.data for more information 1817*31337658SMarcel Moolenaar id = isNode ? elem[ jQuery.expando ] : jQuery.expando; 1818*31337658SMarcel Moolenaar 1819*31337658SMarcel Moolenaar // If there is already no cache entry for this object, there is no 1820*31337658SMarcel Moolenaar // purpose in continuing 1821*31337658SMarcel Moolenaar if ( !cache[ id ] ) { 1822*31337658SMarcel Moolenaar return; 1823*31337658SMarcel Moolenaar } 1824*31337658SMarcel Moolenaar 1825*31337658SMarcel Moolenaar if ( name ) { 1826*31337658SMarcel Moolenaar 1827*31337658SMarcel Moolenaar thisCache = pvt ? cache[ id ] : cache[ id ].data; 1828*31337658SMarcel Moolenaar 1829*31337658SMarcel Moolenaar if ( thisCache ) { 1830*31337658SMarcel Moolenaar 1831*31337658SMarcel Moolenaar // Support space separated names 1832*31337658SMarcel Moolenaar if ( jQuery.isArray( name ) ) { 1833*31337658SMarcel Moolenaar name = name; 1834*31337658SMarcel Moolenaar } else if ( name in thisCache ) { 1835*31337658SMarcel Moolenaar name = [ name ]; 1836*31337658SMarcel Moolenaar } else { 1837*31337658SMarcel Moolenaar 1838*31337658SMarcel Moolenaar // split the camel cased version by spaces 1839*31337658SMarcel Moolenaar name = jQuery.camelCase( name ); 1840*31337658SMarcel Moolenaar if ( name in thisCache ) { 1841*31337658SMarcel Moolenaar name = [ name ]; 1842*31337658SMarcel Moolenaar } else { 1843*31337658SMarcel Moolenaar name = name.split( " " ); 1844*31337658SMarcel Moolenaar } 1845*31337658SMarcel Moolenaar } 1846*31337658SMarcel Moolenaar 1847*31337658SMarcel Moolenaar for ( i = 0, l = name.length; i < l; i++ ) { 1848*31337658SMarcel Moolenaar delete thisCache[ name[i] ]; 1849*31337658SMarcel Moolenaar } 1850*31337658SMarcel Moolenaar 1851*31337658SMarcel Moolenaar // If there is no data left in the cache, we want to continue 1852*31337658SMarcel Moolenaar // and let the cache object itself get destroyed 1853*31337658SMarcel Moolenaar if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { 1854*31337658SMarcel Moolenaar return; 1855*31337658SMarcel Moolenaar } 1856*31337658SMarcel Moolenaar } 1857*31337658SMarcel Moolenaar } 1858*31337658SMarcel Moolenaar 1859*31337658SMarcel Moolenaar // See jQuery.data for more information 1860*31337658SMarcel Moolenaar if ( !pvt ) { 1861*31337658SMarcel Moolenaar delete cache[ id ].data; 1862*31337658SMarcel Moolenaar 1863*31337658SMarcel Moolenaar // Don't destroy the parent cache unless the internal data object 1864*31337658SMarcel Moolenaar // had been the only thing left in it 1865*31337658SMarcel Moolenaar if ( !isEmptyDataObject(cache[ id ]) ) { 1866*31337658SMarcel Moolenaar return; 1867*31337658SMarcel Moolenaar } 1868*31337658SMarcel Moolenaar } 1869*31337658SMarcel Moolenaar 1870*31337658SMarcel Moolenaar // Browsers that fail expando deletion also refuse to delete expandos on 1871*31337658SMarcel Moolenaar // the window, but it will allow it on all other JS objects; other browsers 1872*31337658SMarcel Moolenaar // don't care 1873*31337658SMarcel Moolenaar // Ensure that `cache` is not a window object #10080 1874*31337658SMarcel Moolenaar if ( jQuery.support.deleteExpando || !cache.setInterval ) { 1875*31337658SMarcel Moolenaar delete cache[ id ]; 1876*31337658SMarcel Moolenaar } else { 1877*31337658SMarcel Moolenaar cache[ id ] = null; 1878*31337658SMarcel Moolenaar } 1879*31337658SMarcel Moolenaar 1880*31337658SMarcel Moolenaar // We destroyed the cache and need to eliminate the expando on the node to avoid 1881*31337658SMarcel Moolenaar // false lookups in the cache for entries that no longer exist 1882*31337658SMarcel Moolenaar if ( isNode ) { 1883*31337658SMarcel Moolenaar // IE does not allow us to delete expando properties from nodes, 1884*31337658SMarcel Moolenaar // nor does it have a removeAttribute function on Document nodes; 1885*31337658SMarcel Moolenaar // we must handle all of these cases 1886*31337658SMarcel Moolenaar if ( jQuery.support.deleteExpando ) { 1887*31337658SMarcel Moolenaar delete elem[ jQuery.expando ]; 1888*31337658SMarcel Moolenaar } else if ( elem.removeAttribute ) { 1889*31337658SMarcel Moolenaar elem.removeAttribute( jQuery.expando ); 1890*31337658SMarcel Moolenaar } else { 1891*31337658SMarcel Moolenaar elem[ jQuery.expando ] = null; 1892*31337658SMarcel Moolenaar } 1893*31337658SMarcel Moolenaar } 1894*31337658SMarcel Moolenaar }, 1895*31337658SMarcel Moolenaar 1896*31337658SMarcel Moolenaar // For internal use only. 1897*31337658SMarcel Moolenaar _data: function( elem, name, data ) { 1898*31337658SMarcel Moolenaar return jQuery.data( elem, name, data, true ); 1899*31337658SMarcel Moolenaar }, 1900*31337658SMarcel Moolenaar 1901*31337658SMarcel Moolenaar // A method for determining if a DOM node can handle the data expando 1902*31337658SMarcel Moolenaar acceptData: function( elem ) { 1903*31337658SMarcel Moolenaar if ( elem.nodeName ) { 1904*31337658SMarcel Moolenaar var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; 1905*31337658SMarcel Moolenaar 1906*31337658SMarcel Moolenaar if ( match ) { 1907*31337658SMarcel Moolenaar return !(match === true || elem.getAttribute("classid") !== match); 1908*31337658SMarcel Moolenaar } 1909*31337658SMarcel Moolenaar } 1910*31337658SMarcel Moolenaar 1911*31337658SMarcel Moolenaar return true; 1912*31337658SMarcel Moolenaar } 1913*31337658SMarcel Moolenaar}); 1914*31337658SMarcel Moolenaar 1915*31337658SMarcel MoolenaarjQuery.fn.extend({ 1916*31337658SMarcel Moolenaar data: function( key, value ) { 1917*31337658SMarcel Moolenaar var parts, attr, name, 1918*31337658SMarcel Moolenaar data = null; 1919*31337658SMarcel Moolenaar 1920*31337658SMarcel Moolenaar if ( typeof key === "undefined" ) { 1921*31337658SMarcel Moolenaar if ( this.length ) { 1922*31337658SMarcel Moolenaar data = jQuery.data( this[0] ); 1923*31337658SMarcel Moolenaar 1924*31337658SMarcel Moolenaar if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) { 1925*31337658SMarcel Moolenaar attr = this[0].attributes; 1926*31337658SMarcel Moolenaar for ( var i = 0, l = attr.length; i < l; i++ ) { 1927*31337658SMarcel Moolenaar name = attr[i].name; 1928*31337658SMarcel Moolenaar 1929*31337658SMarcel Moolenaar if ( name.indexOf( "data-" ) === 0 ) { 1930*31337658SMarcel Moolenaar name = jQuery.camelCase( name.substring(5) ); 1931*31337658SMarcel Moolenaar 1932*31337658SMarcel Moolenaar dataAttr( this[0], name, data[ name ] ); 1933*31337658SMarcel Moolenaar } 1934*31337658SMarcel Moolenaar } 1935*31337658SMarcel Moolenaar jQuery._data( this[0], "parsedAttrs", true ); 1936*31337658SMarcel Moolenaar } 1937*31337658SMarcel Moolenaar } 1938*31337658SMarcel Moolenaar 1939*31337658SMarcel Moolenaar return data; 1940*31337658SMarcel Moolenaar 1941*31337658SMarcel Moolenaar } else if ( typeof key === "object" ) { 1942*31337658SMarcel Moolenaar return this.each(function() { 1943*31337658SMarcel Moolenaar jQuery.data( this, key ); 1944*31337658SMarcel Moolenaar }); 1945*31337658SMarcel Moolenaar } 1946*31337658SMarcel Moolenaar 1947*31337658SMarcel Moolenaar parts = key.split("."); 1948*31337658SMarcel Moolenaar parts[1] = parts[1] ? "." + parts[1] : ""; 1949*31337658SMarcel Moolenaar 1950*31337658SMarcel Moolenaar if ( value === undefined ) { 1951*31337658SMarcel Moolenaar data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); 1952*31337658SMarcel Moolenaar 1953*31337658SMarcel Moolenaar // Try to fetch any internally stored data first 1954*31337658SMarcel Moolenaar if ( data === undefined && this.length ) { 1955*31337658SMarcel Moolenaar data = jQuery.data( this[0], key ); 1956*31337658SMarcel Moolenaar data = dataAttr( this[0], key, data ); 1957*31337658SMarcel Moolenaar } 1958*31337658SMarcel Moolenaar 1959*31337658SMarcel Moolenaar return data === undefined && parts[1] ? 1960*31337658SMarcel Moolenaar this.data( parts[0] ) : 1961*31337658SMarcel Moolenaar data; 1962*31337658SMarcel Moolenaar 1963*31337658SMarcel Moolenaar } else { 1964*31337658SMarcel Moolenaar return this.each(function() { 1965*31337658SMarcel Moolenaar var $this = jQuery( this ), 1966*31337658SMarcel Moolenaar args = [ parts[0], value ]; 1967*31337658SMarcel Moolenaar 1968*31337658SMarcel Moolenaar $this.triggerHandler( "setData" + parts[1] + "!", args ); 1969*31337658SMarcel Moolenaar jQuery.data( this, key, value ); 1970*31337658SMarcel Moolenaar $this.triggerHandler( "changeData" + parts[1] + "!", args ); 1971*31337658SMarcel Moolenaar }); 1972*31337658SMarcel Moolenaar } 1973*31337658SMarcel Moolenaar }, 1974*31337658SMarcel Moolenaar 1975*31337658SMarcel Moolenaar removeData: function( key ) { 1976*31337658SMarcel Moolenaar return this.each(function() { 1977*31337658SMarcel Moolenaar jQuery.removeData( this, key ); 1978*31337658SMarcel Moolenaar }); 1979*31337658SMarcel Moolenaar } 1980*31337658SMarcel Moolenaar}); 1981*31337658SMarcel Moolenaar 1982*31337658SMarcel Moolenaarfunction dataAttr( elem, key, data ) { 1983*31337658SMarcel Moolenaar // If nothing was found internally, try to fetch any 1984*31337658SMarcel Moolenaar // data from the HTML5 data-* attribute 1985*31337658SMarcel Moolenaar if ( data === undefined && elem.nodeType === 1 ) { 1986*31337658SMarcel Moolenaar 1987*31337658SMarcel Moolenaar var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); 1988*31337658SMarcel Moolenaar 1989*31337658SMarcel Moolenaar data = elem.getAttribute( name ); 1990*31337658SMarcel Moolenaar 1991*31337658SMarcel Moolenaar if ( typeof data === "string" ) { 1992*31337658SMarcel Moolenaar try { 1993*31337658SMarcel Moolenaar data = data === "true" ? true : 1994*31337658SMarcel Moolenaar data === "false" ? false : 1995*31337658SMarcel Moolenaar data === "null" ? null : 1996*31337658SMarcel Moolenaar jQuery.isNumeric( data ) ? parseFloat( data ) : 1997*31337658SMarcel Moolenaar rbrace.test( data ) ? jQuery.parseJSON( data ) : 1998*31337658SMarcel Moolenaar data; 1999*31337658SMarcel Moolenaar } catch( e ) {} 2000*31337658SMarcel Moolenaar 2001*31337658SMarcel Moolenaar // Make sure we set the data so it isn't changed later 2002*31337658SMarcel Moolenaar jQuery.data( elem, key, data ); 2003*31337658SMarcel Moolenaar 2004*31337658SMarcel Moolenaar } else { 2005*31337658SMarcel Moolenaar data = undefined; 2006*31337658SMarcel Moolenaar } 2007*31337658SMarcel Moolenaar } 2008*31337658SMarcel Moolenaar 2009*31337658SMarcel Moolenaar return data; 2010*31337658SMarcel Moolenaar} 2011*31337658SMarcel Moolenaar 2012*31337658SMarcel Moolenaar// checks a cache object for emptiness 2013*31337658SMarcel Moolenaarfunction isEmptyDataObject( obj ) { 2014*31337658SMarcel Moolenaar for ( var name in obj ) { 2015*31337658SMarcel Moolenaar 2016*31337658SMarcel Moolenaar // if the public data object is empty, the private is still empty 2017*31337658SMarcel Moolenaar if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { 2018*31337658SMarcel Moolenaar continue; 2019*31337658SMarcel Moolenaar } 2020*31337658SMarcel Moolenaar if ( name !== "toJSON" ) { 2021*31337658SMarcel Moolenaar return false; 2022*31337658SMarcel Moolenaar } 2023*31337658SMarcel Moolenaar } 2024*31337658SMarcel Moolenaar 2025*31337658SMarcel Moolenaar return true; 2026*31337658SMarcel Moolenaar} 2027*31337658SMarcel Moolenaar 2028*31337658SMarcel Moolenaar 2029*31337658SMarcel Moolenaar 2030*31337658SMarcel Moolenaar 2031*31337658SMarcel Moolenaarfunction handleQueueMarkDefer( elem, type, src ) { 2032*31337658SMarcel Moolenaar var deferDataKey = type + "defer", 2033*31337658SMarcel Moolenaar queueDataKey = type + "queue", 2034*31337658SMarcel Moolenaar markDataKey = type + "mark", 2035*31337658SMarcel Moolenaar defer = jQuery._data( elem, deferDataKey ); 2036*31337658SMarcel Moolenaar if ( defer && 2037*31337658SMarcel Moolenaar ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && 2038*31337658SMarcel Moolenaar ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { 2039*31337658SMarcel Moolenaar // Give room for hard-coded callbacks to fire first 2040*31337658SMarcel Moolenaar // and eventually mark/queue something else on the element 2041*31337658SMarcel Moolenaar setTimeout( function() { 2042*31337658SMarcel Moolenaar if ( !jQuery._data( elem, queueDataKey ) && 2043*31337658SMarcel Moolenaar !jQuery._data( elem, markDataKey ) ) { 2044*31337658SMarcel Moolenaar jQuery.removeData( elem, deferDataKey, true ); 2045*31337658SMarcel Moolenaar defer.fire(); 2046*31337658SMarcel Moolenaar } 2047*31337658SMarcel Moolenaar }, 0 ); 2048*31337658SMarcel Moolenaar } 2049*31337658SMarcel Moolenaar} 2050*31337658SMarcel Moolenaar 2051*31337658SMarcel MoolenaarjQuery.extend({ 2052*31337658SMarcel Moolenaar 2053*31337658SMarcel Moolenaar _mark: function( elem, type ) { 2054*31337658SMarcel Moolenaar if ( elem ) { 2055*31337658SMarcel Moolenaar type = ( type || "fx" ) + "mark"; 2056*31337658SMarcel Moolenaar jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); 2057*31337658SMarcel Moolenaar } 2058*31337658SMarcel Moolenaar }, 2059*31337658SMarcel Moolenaar 2060*31337658SMarcel Moolenaar _unmark: function( force, elem, type ) { 2061*31337658SMarcel Moolenaar if ( force !== true ) { 2062*31337658SMarcel Moolenaar type = elem; 2063*31337658SMarcel Moolenaar elem = force; 2064*31337658SMarcel Moolenaar force = false; 2065*31337658SMarcel Moolenaar } 2066*31337658SMarcel Moolenaar if ( elem ) { 2067*31337658SMarcel Moolenaar type = type || "fx"; 2068*31337658SMarcel Moolenaar var key = type + "mark", 2069*31337658SMarcel Moolenaar count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); 2070*31337658SMarcel Moolenaar if ( count ) { 2071*31337658SMarcel Moolenaar jQuery._data( elem, key, count ); 2072*31337658SMarcel Moolenaar } else { 2073*31337658SMarcel Moolenaar jQuery.removeData( elem, key, true ); 2074*31337658SMarcel Moolenaar handleQueueMarkDefer( elem, type, "mark" ); 2075*31337658SMarcel Moolenaar } 2076*31337658SMarcel Moolenaar } 2077*31337658SMarcel Moolenaar }, 2078*31337658SMarcel Moolenaar 2079*31337658SMarcel Moolenaar queue: function( elem, type, data ) { 2080*31337658SMarcel Moolenaar var q; 2081*31337658SMarcel Moolenaar if ( elem ) { 2082*31337658SMarcel Moolenaar type = ( type || "fx" ) + "queue"; 2083*31337658SMarcel Moolenaar q = jQuery._data( elem, type ); 2084*31337658SMarcel Moolenaar 2085*31337658SMarcel Moolenaar // Speed up dequeue by getting out quickly if this is just a lookup 2086*31337658SMarcel Moolenaar if ( data ) { 2087*31337658SMarcel Moolenaar if ( !q || jQuery.isArray(data) ) { 2088*31337658SMarcel Moolenaar q = jQuery._data( elem, type, jQuery.makeArray(data) ); 2089*31337658SMarcel Moolenaar } else { 2090*31337658SMarcel Moolenaar q.push( data ); 2091*31337658SMarcel Moolenaar } 2092*31337658SMarcel Moolenaar } 2093*31337658SMarcel Moolenaar return q || []; 2094*31337658SMarcel Moolenaar } 2095*31337658SMarcel Moolenaar }, 2096*31337658SMarcel Moolenaar 2097*31337658SMarcel Moolenaar dequeue: function( elem, type ) { 2098*31337658SMarcel Moolenaar type = type || "fx"; 2099*31337658SMarcel Moolenaar 2100*31337658SMarcel Moolenaar var queue = jQuery.queue( elem, type ), 2101*31337658SMarcel Moolenaar fn = queue.shift(), 2102*31337658SMarcel Moolenaar hooks = {}; 2103*31337658SMarcel Moolenaar 2104*31337658SMarcel Moolenaar // If the fx queue is dequeued, always remove the progress sentinel 2105*31337658SMarcel Moolenaar if ( fn === "inprogress" ) { 2106*31337658SMarcel Moolenaar fn = queue.shift(); 2107*31337658SMarcel Moolenaar } 2108*31337658SMarcel Moolenaar 2109*31337658SMarcel Moolenaar if ( fn ) { 2110*31337658SMarcel Moolenaar // Add a progress sentinel to prevent the fx queue from being 2111*31337658SMarcel Moolenaar // automatically dequeued 2112*31337658SMarcel Moolenaar if ( type === "fx" ) { 2113*31337658SMarcel Moolenaar queue.unshift( "inprogress" ); 2114*31337658SMarcel Moolenaar } 2115*31337658SMarcel Moolenaar 2116*31337658SMarcel Moolenaar jQuery._data( elem, type + ".run", hooks ); 2117*31337658SMarcel Moolenaar fn.call( elem, function() { 2118*31337658SMarcel Moolenaar jQuery.dequeue( elem, type ); 2119*31337658SMarcel Moolenaar }, hooks ); 2120*31337658SMarcel Moolenaar } 2121*31337658SMarcel Moolenaar 2122*31337658SMarcel Moolenaar if ( !queue.length ) { 2123*31337658SMarcel Moolenaar jQuery.removeData( elem, type + "queue " + type + ".run", true ); 2124*31337658SMarcel Moolenaar handleQueueMarkDefer( elem, type, "queue" ); 2125*31337658SMarcel Moolenaar } 2126*31337658SMarcel Moolenaar } 2127*31337658SMarcel Moolenaar}); 2128*31337658SMarcel Moolenaar 2129*31337658SMarcel MoolenaarjQuery.fn.extend({ 2130*31337658SMarcel Moolenaar queue: function( type, data ) { 2131*31337658SMarcel Moolenaar if ( typeof type !== "string" ) { 2132*31337658SMarcel Moolenaar data = type; 2133*31337658SMarcel Moolenaar type = "fx"; 2134*31337658SMarcel Moolenaar } 2135*31337658SMarcel Moolenaar 2136*31337658SMarcel Moolenaar if ( data === undefined ) { 2137*31337658SMarcel Moolenaar return jQuery.queue( this[0], type ); 2138*31337658SMarcel Moolenaar } 2139*31337658SMarcel Moolenaar return this.each(function() { 2140*31337658SMarcel Moolenaar var queue = jQuery.queue( this, type, data ); 2141*31337658SMarcel Moolenaar 2142*31337658SMarcel Moolenaar if ( type === "fx" && queue[0] !== "inprogress" ) { 2143*31337658SMarcel Moolenaar jQuery.dequeue( this, type ); 2144*31337658SMarcel Moolenaar } 2145*31337658SMarcel Moolenaar }); 2146*31337658SMarcel Moolenaar }, 2147*31337658SMarcel Moolenaar dequeue: function( type ) { 2148*31337658SMarcel Moolenaar return this.each(function() { 2149*31337658SMarcel Moolenaar jQuery.dequeue( this, type ); 2150*31337658SMarcel Moolenaar }); 2151*31337658SMarcel Moolenaar }, 2152*31337658SMarcel Moolenaar // Based off of the plugin by Clint Helfers, with permission. 2153*31337658SMarcel Moolenaar // http://blindsignals.com/index.php/2009/07/jquery-delay/ 2154*31337658SMarcel Moolenaar delay: function( time, type ) { 2155*31337658SMarcel Moolenaar time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; 2156*31337658SMarcel Moolenaar type = type || "fx"; 2157*31337658SMarcel Moolenaar 2158*31337658SMarcel Moolenaar return this.queue( type, function( next, hooks ) { 2159*31337658SMarcel Moolenaar var timeout = setTimeout( next, time ); 2160*31337658SMarcel Moolenaar hooks.stop = function() { 2161*31337658SMarcel Moolenaar clearTimeout( timeout ); 2162*31337658SMarcel Moolenaar }; 2163*31337658SMarcel Moolenaar }); 2164*31337658SMarcel Moolenaar }, 2165*31337658SMarcel Moolenaar clearQueue: function( type ) { 2166*31337658SMarcel Moolenaar return this.queue( type || "fx", [] ); 2167*31337658SMarcel Moolenaar }, 2168*31337658SMarcel Moolenaar // Get a promise resolved when queues of a certain type 2169*31337658SMarcel Moolenaar // are emptied (fx is the type by default) 2170*31337658SMarcel Moolenaar promise: function( type, object ) { 2171*31337658SMarcel Moolenaar if ( typeof type !== "string" ) { 2172*31337658SMarcel Moolenaar object = type; 2173*31337658SMarcel Moolenaar type = undefined; 2174*31337658SMarcel Moolenaar } 2175*31337658SMarcel Moolenaar type = type || "fx"; 2176*31337658SMarcel Moolenaar var defer = jQuery.Deferred(), 2177*31337658SMarcel Moolenaar elements = this, 2178*31337658SMarcel Moolenaar i = elements.length, 2179*31337658SMarcel Moolenaar count = 1, 2180*31337658SMarcel Moolenaar deferDataKey = type + "defer", 2181*31337658SMarcel Moolenaar queueDataKey = type + "queue", 2182*31337658SMarcel Moolenaar markDataKey = type + "mark", 2183*31337658SMarcel Moolenaar tmp; 2184*31337658SMarcel Moolenaar function resolve() { 2185*31337658SMarcel Moolenaar if ( !( --count ) ) { 2186*31337658SMarcel Moolenaar defer.resolveWith( elements, [ elements ] ); 2187*31337658SMarcel Moolenaar } 2188*31337658SMarcel Moolenaar } 2189*31337658SMarcel Moolenaar while( i-- ) { 2190*31337658SMarcel Moolenaar if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || 2191*31337658SMarcel Moolenaar ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || 2192*31337658SMarcel Moolenaar jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && 2193*31337658SMarcel Moolenaar jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { 2194*31337658SMarcel Moolenaar count++; 2195*31337658SMarcel Moolenaar tmp.add( resolve ); 2196*31337658SMarcel Moolenaar } 2197*31337658SMarcel Moolenaar } 2198*31337658SMarcel Moolenaar resolve(); 2199*31337658SMarcel Moolenaar return defer.promise(); 2200*31337658SMarcel Moolenaar } 2201*31337658SMarcel Moolenaar}); 2202*31337658SMarcel Moolenaar 2203*31337658SMarcel Moolenaar 2204*31337658SMarcel Moolenaar 2205*31337658SMarcel Moolenaar 2206*31337658SMarcel Moolenaarvar rclass = /[\n\t\r]/g, 2207*31337658SMarcel Moolenaar rspace = /\s+/, 2208*31337658SMarcel Moolenaar rreturn = /\r/g, 2209*31337658SMarcel Moolenaar rtype = /^(?:button|input)$/i, 2210*31337658SMarcel Moolenaar rfocusable = /^(?:button|input|object|select|textarea)$/i, 2211*31337658SMarcel Moolenaar rclickable = /^a(?:rea)?$/i, 2212*31337658SMarcel Moolenaar rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, 2213*31337658SMarcel Moolenaar getSetAttribute = jQuery.support.getSetAttribute, 2214*31337658SMarcel Moolenaar nodeHook, boolHook, fixSpecified; 2215*31337658SMarcel Moolenaar 2216*31337658SMarcel MoolenaarjQuery.fn.extend({ 2217*31337658SMarcel Moolenaar attr: function( name, value ) { 2218*31337658SMarcel Moolenaar return jQuery.access( this, name, value, true, jQuery.attr ); 2219*31337658SMarcel Moolenaar }, 2220*31337658SMarcel Moolenaar 2221*31337658SMarcel Moolenaar removeAttr: function( name ) { 2222*31337658SMarcel Moolenaar return this.each(function() { 2223*31337658SMarcel Moolenaar jQuery.removeAttr( this, name ); 2224*31337658SMarcel Moolenaar }); 2225*31337658SMarcel Moolenaar }, 2226*31337658SMarcel Moolenaar 2227*31337658SMarcel Moolenaar prop: function( name, value ) { 2228*31337658SMarcel Moolenaar return jQuery.access( this, name, value, true, jQuery.prop ); 2229*31337658SMarcel Moolenaar }, 2230*31337658SMarcel Moolenaar 2231*31337658SMarcel Moolenaar removeProp: function( name ) { 2232*31337658SMarcel Moolenaar name = jQuery.propFix[ name ] || name; 2233*31337658SMarcel Moolenaar return this.each(function() { 2234*31337658SMarcel Moolenaar // try/catch handles cases where IE balks (such as removing a property on window) 2235*31337658SMarcel Moolenaar try { 2236*31337658SMarcel Moolenaar this[ name ] = undefined; 2237*31337658SMarcel Moolenaar delete this[ name ]; 2238*31337658SMarcel Moolenaar } catch( e ) {} 2239*31337658SMarcel Moolenaar }); 2240*31337658SMarcel Moolenaar }, 2241*31337658SMarcel Moolenaar 2242*31337658SMarcel Moolenaar addClass: function( value ) { 2243*31337658SMarcel Moolenaar var classNames, i, l, elem, 2244*31337658SMarcel Moolenaar setClass, c, cl; 2245*31337658SMarcel Moolenaar 2246*31337658SMarcel Moolenaar if ( jQuery.isFunction( value ) ) { 2247*31337658SMarcel Moolenaar return this.each(function( j ) { 2248*31337658SMarcel Moolenaar jQuery( this ).addClass( value.call(this, j, this.className) ); 2249*31337658SMarcel Moolenaar }); 2250*31337658SMarcel Moolenaar } 2251*31337658SMarcel Moolenaar 2252*31337658SMarcel Moolenaar if ( value && typeof value === "string" ) { 2253*31337658SMarcel Moolenaar classNames = value.split( rspace ); 2254*31337658SMarcel Moolenaar 2255*31337658SMarcel Moolenaar for ( i = 0, l = this.length; i < l; i++ ) { 2256*31337658SMarcel Moolenaar elem = this[ i ]; 2257*31337658SMarcel Moolenaar 2258*31337658SMarcel Moolenaar if ( elem.nodeType === 1 ) { 2259*31337658SMarcel Moolenaar if ( !elem.className && classNames.length === 1 ) { 2260*31337658SMarcel Moolenaar elem.className = value; 2261*31337658SMarcel Moolenaar 2262*31337658SMarcel Moolenaar } else { 2263*31337658SMarcel Moolenaar setClass = " " + elem.className + " "; 2264*31337658SMarcel Moolenaar 2265*31337658SMarcel Moolenaar for ( c = 0, cl = classNames.length; c < cl; c++ ) { 2266*31337658SMarcel Moolenaar if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { 2267*31337658SMarcel Moolenaar setClass += classNames[ c ] + " "; 2268*31337658SMarcel Moolenaar } 2269*31337658SMarcel Moolenaar } 2270*31337658SMarcel Moolenaar elem.className = jQuery.trim( setClass ); 2271*31337658SMarcel Moolenaar } 2272*31337658SMarcel Moolenaar } 2273*31337658SMarcel Moolenaar } 2274*31337658SMarcel Moolenaar } 2275*31337658SMarcel Moolenaar 2276*31337658SMarcel Moolenaar return this; 2277*31337658SMarcel Moolenaar }, 2278*31337658SMarcel Moolenaar 2279*31337658SMarcel Moolenaar removeClass: function( value ) { 2280*31337658SMarcel Moolenaar var classNames, i, l, elem, className, c, cl; 2281*31337658SMarcel Moolenaar 2282*31337658SMarcel Moolenaar if ( jQuery.isFunction( value ) ) { 2283*31337658SMarcel Moolenaar return this.each(function( j ) { 2284*31337658SMarcel Moolenaar jQuery( this ).removeClass( value.call(this, j, this.className) ); 2285*31337658SMarcel Moolenaar }); 2286*31337658SMarcel Moolenaar } 2287*31337658SMarcel Moolenaar 2288*31337658SMarcel Moolenaar if ( (value && typeof value === "string") || value === undefined ) { 2289*31337658SMarcel Moolenaar classNames = ( value || "" ).split( rspace ); 2290*31337658SMarcel Moolenaar 2291*31337658SMarcel Moolenaar for ( i = 0, l = this.length; i < l; i++ ) { 2292*31337658SMarcel Moolenaar elem = this[ i ]; 2293*31337658SMarcel Moolenaar 2294*31337658SMarcel Moolenaar if ( elem.nodeType === 1 && elem.className ) { 2295*31337658SMarcel Moolenaar if ( value ) { 2296*31337658SMarcel Moolenaar className = (" " + elem.className + " ").replace( rclass, " " ); 2297*31337658SMarcel Moolenaar for ( c = 0, cl = classNames.length; c < cl; c++ ) { 2298*31337658SMarcel Moolenaar className = className.replace(" " + classNames[ c ] + " ", " "); 2299*31337658SMarcel Moolenaar } 2300*31337658SMarcel Moolenaar elem.className = jQuery.trim( className ); 2301*31337658SMarcel Moolenaar 2302*31337658SMarcel Moolenaar } else { 2303*31337658SMarcel Moolenaar elem.className = ""; 2304*31337658SMarcel Moolenaar } 2305*31337658SMarcel Moolenaar } 2306*31337658SMarcel Moolenaar } 2307*31337658SMarcel Moolenaar } 2308*31337658SMarcel Moolenaar 2309*31337658SMarcel Moolenaar return this; 2310*31337658SMarcel Moolenaar }, 2311*31337658SMarcel Moolenaar 2312*31337658SMarcel Moolenaar toggleClass: function( value, stateVal ) { 2313*31337658SMarcel Moolenaar var type = typeof value, 2314*31337658SMarcel Moolenaar isBool = typeof stateVal === "boolean"; 2315*31337658SMarcel Moolenaar 2316*31337658SMarcel Moolenaar if ( jQuery.isFunction( value ) ) { 2317*31337658SMarcel Moolenaar return this.each(function( i ) { 2318*31337658SMarcel Moolenaar jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); 2319*31337658SMarcel Moolenaar }); 2320*31337658SMarcel Moolenaar } 2321*31337658SMarcel Moolenaar 2322*31337658SMarcel Moolenaar return this.each(function() { 2323*31337658SMarcel Moolenaar if ( type === "string" ) { 2324*31337658SMarcel Moolenaar // toggle individual class names 2325*31337658SMarcel Moolenaar var className, 2326*31337658SMarcel Moolenaar i = 0, 2327*31337658SMarcel Moolenaar self = jQuery( this ), 2328*31337658SMarcel Moolenaar state = stateVal, 2329*31337658SMarcel Moolenaar classNames = value.split( rspace ); 2330*31337658SMarcel Moolenaar 2331*31337658SMarcel Moolenaar while ( (className = classNames[ i++ ]) ) { 2332*31337658SMarcel Moolenaar // check each className given, space seperated list 2333*31337658SMarcel Moolenaar state = isBool ? state : !self.hasClass( className ); 2334*31337658SMarcel Moolenaar self[ state ? "addClass" : "removeClass" ]( className ); 2335*31337658SMarcel Moolenaar } 2336*31337658SMarcel Moolenaar 2337*31337658SMarcel Moolenaar } else if ( type === "undefined" || type === "boolean" ) { 2338*31337658SMarcel Moolenaar if ( this.className ) { 2339*31337658SMarcel Moolenaar // store className if set 2340*31337658SMarcel Moolenaar jQuery._data( this, "__className__", this.className ); 2341*31337658SMarcel Moolenaar } 2342*31337658SMarcel Moolenaar 2343*31337658SMarcel Moolenaar // toggle whole className 2344*31337658SMarcel Moolenaar this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; 2345*31337658SMarcel Moolenaar } 2346*31337658SMarcel Moolenaar }); 2347*31337658SMarcel Moolenaar }, 2348*31337658SMarcel Moolenaar 2349*31337658SMarcel Moolenaar hasClass: function( selector ) { 2350*31337658SMarcel Moolenaar var className = " " + selector + " ", 2351*31337658SMarcel Moolenaar i = 0, 2352*31337658SMarcel Moolenaar l = this.length; 2353*31337658SMarcel Moolenaar for ( ; i < l; i++ ) { 2354*31337658SMarcel Moolenaar if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { 2355*31337658SMarcel Moolenaar return true; 2356*31337658SMarcel Moolenaar } 2357*31337658SMarcel Moolenaar } 2358*31337658SMarcel Moolenaar 2359*31337658SMarcel Moolenaar return false; 2360*31337658SMarcel Moolenaar }, 2361*31337658SMarcel Moolenaar 2362*31337658SMarcel Moolenaar val: function( value ) { 2363*31337658SMarcel Moolenaar var hooks, ret, isFunction, 2364*31337658SMarcel Moolenaar elem = this[0]; 2365*31337658SMarcel Moolenaar 2366*31337658SMarcel Moolenaar if ( !arguments.length ) { 2367*31337658SMarcel Moolenaar if ( elem ) { 2368*31337658SMarcel Moolenaar hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; 2369*31337658SMarcel Moolenaar 2370*31337658SMarcel Moolenaar if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { 2371*31337658SMarcel Moolenaar return ret; 2372*31337658SMarcel Moolenaar } 2373*31337658SMarcel Moolenaar 2374*31337658SMarcel Moolenaar ret = elem.value; 2375*31337658SMarcel Moolenaar 2376*31337658SMarcel Moolenaar return typeof ret === "string" ? 2377*31337658SMarcel Moolenaar // handle most common string cases 2378*31337658SMarcel Moolenaar ret.replace(rreturn, "") : 2379*31337658SMarcel Moolenaar // handle cases where value is null/undef or number 2380*31337658SMarcel Moolenaar ret == null ? "" : ret; 2381*31337658SMarcel Moolenaar } 2382*31337658SMarcel Moolenaar 2383*31337658SMarcel Moolenaar return undefined; 2384*31337658SMarcel Moolenaar } 2385*31337658SMarcel Moolenaar 2386*31337658SMarcel Moolenaar isFunction = jQuery.isFunction( value ); 2387*31337658SMarcel Moolenaar 2388*31337658SMarcel Moolenaar return this.each(function( i ) { 2389*31337658SMarcel Moolenaar var self = jQuery(this), val; 2390*31337658SMarcel Moolenaar 2391*31337658SMarcel Moolenaar if ( this.nodeType !== 1 ) { 2392*31337658SMarcel Moolenaar return; 2393*31337658SMarcel Moolenaar } 2394*31337658SMarcel Moolenaar 2395*31337658SMarcel Moolenaar if ( isFunction ) { 2396*31337658SMarcel Moolenaar val = value.call( this, i, self.val() ); 2397*31337658SMarcel Moolenaar } else { 2398*31337658SMarcel Moolenaar val = value; 2399*31337658SMarcel Moolenaar } 2400*31337658SMarcel Moolenaar 2401*31337658SMarcel Moolenaar // Treat null/undefined as ""; convert numbers to string 2402*31337658SMarcel Moolenaar if ( val == null ) { 2403*31337658SMarcel Moolenaar val = ""; 2404*31337658SMarcel Moolenaar } else if ( typeof val === "number" ) { 2405*31337658SMarcel Moolenaar val += ""; 2406*31337658SMarcel Moolenaar } else if ( jQuery.isArray( val ) ) { 2407*31337658SMarcel Moolenaar val = jQuery.map(val, function ( value ) { 2408*31337658SMarcel Moolenaar return value == null ? "" : value + ""; 2409*31337658SMarcel Moolenaar }); 2410*31337658SMarcel Moolenaar } 2411*31337658SMarcel Moolenaar 2412*31337658SMarcel Moolenaar hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; 2413*31337658SMarcel Moolenaar 2414*31337658SMarcel Moolenaar // If set returns undefined, fall back to normal setting 2415*31337658SMarcel Moolenaar if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { 2416*31337658SMarcel Moolenaar this.value = val; 2417*31337658SMarcel Moolenaar } 2418*31337658SMarcel Moolenaar }); 2419*31337658SMarcel Moolenaar } 2420*31337658SMarcel Moolenaar}); 2421*31337658SMarcel Moolenaar 2422*31337658SMarcel MoolenaarjQuery.extend({ 2423*31337658SMarcel Moolenaar valHooks: { 2424*31337658SMarcel Moolenaar option: { 2425*31337658SMarcel Moolenaar get: function( elem ) { 2426*31337658SMarcel Moolenaar // attributes.value is undefined in Blackberry 4.7 but 2427*31337658SMarcel Moolenaar // uses .value. See #6932 2428*31337658SMarcel Moolenaar var val = elem.attributes.value; 2429*31337658SMarcel Moolenaar return !val || val.specified ? elem.value : elem.text; 2430*31337658SMarcel Moolenaar } 2431*31337658SMarcel Moolenaar }, 2432*31337658SMarcel Moolenaar select: { 2433*31337658SMarcel Moolenaar get: function( elem ) { 2434*31337658SMarcel Moolenaar var value, i, max, option, 2435*31337658SMarcel Moolenaar index = elem.selectedIndex, 2436*31337658SMarcel Moolenaar values = [], 2437*31337658SMarcel Moolenaar options = elem.options, 2438*31337658SMarcel Moolenaar one = elem.type === "select-one"; 2439*31337658SMarcel Moolenaar 2440*31337658SMarcel Moolenaar // Nothing was selected 2441*31337658SMarcel Moolenaar if ( index < 0 ) { 2442*31337658SMarcel Moolenaar return null; 2443*31337658SMarcel Moolenaar } 2444*31337658SMarcel Moolenaar 2445*31337658SMarcel Moolenaar // Loop through all the selected options 2446*31337658SMarcel Moolenaar i = one ? index : 0; 2447*31337658SMarcel Moolenaar max = one ? index + 1 : options.length; 2448*31337658SMarcel Moolenaar for ( ; i < max; i++ ) { 2449*31337658SMarcel Moolenaar option = options[ i ]; 2450*31337658SMarcel Moolenaar 2451*31337658SMarcel Moolenaar // Don't return options that are disabled or in a disabled optgroup 2452*31337658SMarcel Moolenaar if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && 2453*31337658SMarcel Moolenaar (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { 2454*31337658SMarcel Moolenaar 2455*31337658SMarcel Moolenaar // Get the specific value for the option 2456*31337658SMarcel Moolenaar value = jQuery( option ).val(); 2457*31337658SMarcel Moolenaar 2458*31337658SMarcel Moolenaar // We don't need an array for one selects 2459*31337658SMarcel Moolenaar if ( one ) { 2460*31337658SMarcel Moolenaar return value; 2461*31337658SMarcel Moolenaar } 2462*31337658SMarcel Moolenaar 2463*31337658SMarcel Moolenaar // Multi-Selects return an array 2464*31337658SMarcel Moolenaar values.push( value ); 2465*31337658SMarcel Moolenaar } 2466*31337658SMarcel Moolenaar } 2467*31337658SMarcel Moolenaar 2468*31337658SMarcel Moolenaar // Fixes Bug #2551 -- select.val() broken in IE after form.reset() 2469*31337658SMarcel Moolenaar if ( one && !values.length && options.length ) { 2470*31337658SMarcel Moolenaar return jQuery( options[ index ] ).val(); 2471*31337658SMarcel Moolenaar } 2472*31337658SMarcel Moolenaar 2473*31337658SMarcel Moolenaar return values; 2474*31337658SMarcel Moolenaar }, 2475*31337658SMarcel Moolenaar 2476*31337658SMarcel Moolenaar set: function( elem, value ) { 2477*31337658SMarcel Moolenaar var values = jQuery.makeArray( value ); 2478*31337658SMarcel Moolenaar 2479*31337658SMarcel Moolenaar jQuery(elem).find("option").each(function() { 2480*31337658SMarcel Moolenaar this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; 2481*31337658SMarcel Moolenaar }); 2482*31337658SMarcel Moolenaar 2483*31337658SMarcel Moolenaar if ( !values.length ) { 2484*31337658SMarcel Moolenaar elem.selectedIndex = -1; 2485*31337658SMarcel Moolenaar } 2486*31337658SMarcel Moolenaar return values; 2487*31337658SMarcel Moolenaar } 2488*31337658SMarcel Moolenaar } 2489*31337658SMarcel Moolenaar }, 2490*31337658SMarcel Moolenaar 2491*31337658SMarcel Moolenaar attrFn: { 2492*31337658SMarcel Moolenaar val: true, 2493*31337658SMarcel Moolenaar css: true, 2494*31337658SMarcel Moolenaar html: true, 2495*31337658SMarcel Moolenaar text: true, 2496*31337658SMarcel Moolenaar data: true, 2497*31337658SMarcel Moolenaar width: true, 2498*31337658SMarcel Moolenaar height: true, 2499*31337658SMarcel Moolenaar offset: true 2500*31337658SMarcel Moolenaar }, 2501*31337658SMarcel Moolenaar 2502*31337658SMarcel Moolenaar attr: function( elem, name, value, pass ) { 2503*31337658SMarcel Moolenaar var ret, hooks, notxml, 2504*31337658SMarcel Moolenaar nType = elem.nodeType; 2505*31337658SMarcel Moolenaar 2506*31337658SMarcel Moolenaar // don't get/set attributes on text, comment and attribute nodes 2507*31337658SMarcel Moolenaar if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { 2508*31337658SMarcel Moolenaar return undefined; 2509*31337658SMarcel Moolenaar } 2510*31337658SMarcel Moolenaar 2511*31337658SMarcel Moolenaar if ( pass && name in jQuery.attrFn ) { 2512*31337658SMarcel Moolenaar return jQuery( elem )[ name ]( value ); 2513*31337658SMarcel Moolenaar } 2514*31337658SMarcel Moolenaar 2515*31337658SMarcel Moolenaar // Fallback to prop when attributes are not supported 2516*31337658SMarcel Moolenaar if ( !("getAttribute" in elem) ) { 2517*31337658SMarcel Moolenaar return jQuery.prop( elem, name, value ); 2518*31337658SMarcel Moolenaar } 2519*31337658SMarcel Moolenaar 2520*31337658SMarcel Moolenaar notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); 2521*31337658SMarcel Moolenaar 2522*31337658SMarcel Moolenaar // All attributes are lowercase 2523*31337658SMarcel Moolenaar // Grab necessary hook if one is defined 2524*31337658SMarcel Moolenaar if ( notxml ) { 2525*31337658SMarcel Moolenaar name = name.toLowerCase(); 2526*31337658SMarcel Moolenaar hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); 2527*31337658SMarcel Moolenaar } 2528*31337658SMarcel Moolenaar 2529*31337658SMarcel Moolenaar if ( value !== undefined ) { 2530*31337658SMarcel Moolenaar 2531*31337658SMarcel Moolenaar if ( value === null ) { 2532*31337658SMarcel Moolenaar jQuery.removeAttr( elem, name ); 2533*31337658SMarcel Moolenaar return undefined; 2534*31337658SMarcel Moolenaar 2535*31337658SMarcel Moolenaar } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { 2536*31337658SMarcel Moolenaar return ret; 2537*31337658SMarcel Moolenaar 2538*31337658SMarcel Moolenaar } else { 2539*31337658SMarcel Moolenaar elem.setAttribute( name, "" + value ); 2540*31337658SMarcel Moolenaar return value; 2541*31337658SMarcel Moolenaar } 2542*31337658SMarcel Moolenaar 2543*31337658SMarcel Moolenaar } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { 2544*31337658SMarcel Moolenaar return ret; 2545*31337658SMarcel Moolenaar 2546*31337658SMarcel Moolenaar } else { 2547*31337658SMarcel Moolenaar 2548*31337658SMarcel Moolenaar ret = elem.getAttribute( name ); 2549*31337658SMarcel Moolenaar 2550*31337658SMarcel Moolenaar // Non-existent attributes return null, we normalize to undefined 2551*31337658SMarcel Moolenaar return ret === null ? 2552*31337658SMarcel Moolenaar undefined : 2553*31337658SMarcel Moolenaar ret; 2554*31337658SMarcel Moolenaar } 2555*31337658SMarcel Moolenaar }, 2556*31337658SMarcel Moolenaar 2557*31337658SMarcel Moolenaar removeAttr: function( elem, value ) { 2558*31337658SMarcel Moolenaar var propName, attrNames, name, l, 2559*31337658SMarcel Moolenaar i = 0; 2560*31337658SMarcel Moolenaar 2561*31337658SMarcel Moolenaar if ( elem.nodeType === 1 ) { 2562*31337658SMarcel Moolenaar attrNames = ( value || "" ).split( rspace ); 2563*31337658SMarcel Moolenaar l = attrNames.length; 2564*31337658SMarcel Moolenaar 2565*31337658SMarcel Moolenaar for ( ; i < l; i++ ) { 2566*31337658SMarcel Moolenaar name = attrNames[ i ].toLowerCase(); 2567*31337658SMarcel Moolenaar propName = jQuery.propFix[ name ] || name; 2568*31337658SMarcel Moolenaar 2569*31337658SMarcel Moolenaar // See #9699 for explanation of this approach (setting first, then removal) 2570*31337658SMarcel Moolenaar jQuery.attr( elem, name, "" ); 2571*31337658SMarcel Moolenaar elem.removeAttribute( getSetAttribute ? name : propName ); 2572*31337658SMarcel Moolenaar 2573*31337658SMarcel Moolenaar // Set corresponding property to false for boolean attributes 2574*31337658SMarcel Moolenaar if ( rboolean.test( name ) && propName in elem ) { 2575*31337658SMarcel Moolenaar elem[ propName ] = false; 2576*31337658SMarcel Moolenaar } 2577*31337658SMarcel Moolenaar } 2578*31337658SMarcel Moolenaar } 2579*31337658SMarcel Moolenaar }, 2580*31337658SMarcel Moolenaar 2581*31337658SMarcel Moolenaar attrHooks: { 2582*31337658SMarcel Moolenaar type: { 2583*31337658SMarcel Moolenaar set: function( elem, value ) { 2584*31337658SMarcel Moolenaar // We can't allow the type property to be changed (since it causes problems in IE) 2585*31337658SMarcel Moolenaar if ( rtype.test( elem.nodeName ) && elem.parentNode ) { 2586*31337658SMarcel Moolenaar jQuery.error( "type property can't be changed" ); 2587*31337658SMarcel Moolenaar } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { 2588*31337658SMarcel Moolenaar // Setting the type on a radio button after the value resets the value in IE6-9 2589*31337658SMarcel Moolenaar // Reset value to it's default in case type is set after value 2590*31337658SMarcel Moolenaar // This is for element creation 2591*31337658SMarcel Moolenaar var val = elem.value; 2592*31337658SMarcel Moolenaar elem.setAttribute( "type", value ); 2593*31337658SMarcel Moolenaar if ( val ) { 2594*31337658SMarcel Moolenaar elem.value = val; 2595*31337658SMarcel Moolenaar } 2596*31337658SMarcel Moolenaar return value; 2597*31337658SMarcel Moolenaar } 2598*31337658SMarcel Moolenaar } 2599*31337658SMarcel Moolenaar }, 2600*31337658SMarcel Moolenaar // Use the value property for back compat 2601*31337658SMarcel Moolenaar // Use the nodeHook for button elements in IE6/7 (#1954) 2602*31337658SMarcel Moolenaar value: { 2603*31337658SMarcel Moolenaar get: function( elem, name ) { 2604*31337658SMarcel Moolenaar if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { 2605*31337658SMarcel Moolenaar return nodeHook.get( elem, name ); 2606*31337658SMarcel Moolenaar } 2607*31337658SMarcel Moolenaar return name in elem ? 2608*31337658SMarcel Moolenaar elem.value : 2609*31337658SMarcel Moolenaar null; 2610*31337658SMarcel Moolenaar }, 2611*31337658SMarcel Moolenaar set: function( elem, value, name ) { 2612*31337658SMarcel Moolenaar if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { 2613*31337658SMarcel Moolenaar return nodeHook.set( elem, value, name ); 2614*31337658SMarcel Moolenaar } 2615*31337658SMarcel Moolenaar // Does not return so that setAttribute is also used 2616*31337658SMarcel Moolenaar elem.value = value; 2617*31337658SMarcel Moolenaar } 2618*31337658SMarcel Moolenaar } 2619*31337658SMarcel Moolenaar }, 2620*31337658SMarcel Moolenaar 2621*31337658SMarcel Moolenaar propFix: { 2622*31337658SMarcel Moolenaar tabindex: "tabIndex", 2623*31337658SMarcel Moolenaar readonly: "readOnly", 2624*31337658SMarcel Moolenaar "for": "htmlFor", 2625*31337658SMarcel Moolenaar "class": "className", 2626*31337658SMarcel Moolenaar maxlength: "maxLength", 2627*31337658SMarcel Moolenaar cellspacing: "cellSpacing", 2628*31337658SMarcel Moolenaar cellpadding: "cellPadding", 2629*31337658SMarcel Moolenaar rowspan: "rowSpan", 2630*31337658SMarcel Moolenaar colspan: "colSpan", 2631*31337658SMarcel Moolenaar usemap: "useMap", 2632*31337658SMarcel Moolenaar frameborder: "frameBorder", 2633*31337658SMarcel Moolenaar contenteditable: "contentEditable" 2634*31337658SMarcel Moolenaar }, 2635*31337658SMarcel Moolenaar 2636*31337658SMarcel Moolenaar prop: function( elem, name, value ) { 2637*31337658SMarcel Moolenaar var ret, hooks, notxml, 2638*31337658SMarcel Moolenaar nType = elem.nodeType; 2639*31337658SMarcel Moolenaar 2640*31337658SMarcel Moolenaar // don't get/set properties on text, comment and attribute nodes 2641*31337658SMarcel Moolenaar if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { 2642*31337658SMarcel Moolenaar return undefined; 2643*31337658SMarcel Moolenaar } 2644*31337658SMarcel Moolenaar 2645*31337658SMarcel Moolenaar notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); 2646*31337658SMarcel Moolenaar 2647*31337658SMarcel Moolenaar if ( notxml ) { 2648*31337658SMarcel Moolenaar // Fix name and attach hooks 2649*31337658SMarcel Moolenaar name = jQuery.propFix[ name ] || name; 2650*31337658SMarcel Moolenaar hooks = jQuery.propHooks[ name ]; 2651*31337658SMarcel Moolenaar } 2652*31337658SMarcel Moolenaar 2653*31337658SMarcel Moolenaar if ( value !== undefined ) { 2654*31337658SMarcel Moolenaar if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { 2655*31337658SMarcel Moolenaar return ret; 2656*31337658SMarcel Moolenaar 2657*31337658SMarcel Moolenaar } else { 2658*31337658SMarcel Moolenaar return ( elem[ name ] = value ); 2659*31337658SMarcel Moolenaar } 2660*31337658SMarcel Moolenaar 2661*31337658SMarcel Moolenaar } else { 2662*31337658SMarcel Moolenaar if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { 2663*31337658SMarcel Moolenaar return ret; 2664*31337658SMarcel Moolenaar 2665*31337658SMarcel Moolenaar } else { 2666*31337658SMarcel Moolenaar return elem[ name ]; 2667*31337658SMarcel Moolenaar } 2668*31337658SMarcel Moolenaar } 2669*31337658SMarcel Moolenaar }, 2670*31337658SMarcel Moolenaar 2671*31337658SMarcel Moolenaar propHooks: { 2672*31337658SMarcel Moolenaar tabIndex: { 2673*31337658SMarcel Moolenaar get: function( elem ) { 2674*31337658SMarcel Moolenaar // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set 2675*31337658SMarcel Moolenaar // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ 2676*31337658SMarcel Moolenaar var attributeNode = elem.getAttributeNode("tabindex"); 2677*31337658SMarcel Moolenaar 2678*31337658SMarcel Moolenaar return attributeNode && attributeNode.specified ? 2679*31337658SMarcel Moolenaar parseInt( attributeNode.value, 10 ) : 2680*31337658SMarcel Moolenaar rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? 2681*31337658SMarcel Moolenaar 0 : 2682*31337658SMarcel Moolenaar undefined; 2683*31337658SMarcel Moolenaar } 2684*31337658SMarcel Moolenaar } 2685*31337658SMarcel Moolenaar } 2686*31337658SMarcel Moolenaar}); 2687*31337658SMarcel Moolenaar 2688*31337658SMarcel Moolenaar// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) 2689*31337658SMarcel MoolenaarjQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; 2690*31337658SMarcel Moolenaar 2691*31337658SMarcel Moolenaar// Hook for boolean attributes 2692*31337658SMarcel MoolenaarboolHook = { 2693*31337658SMarcel Moolenaar get: function( elem, name ) { 2694*31337658SMarcel Moolenaar // Align boolean attributes with corresponding properties 2695*31337658SMarcel Moolenaar // Fall back to attribute presence where some booleans are not supported 2696*31337658SMarcel Moolenaar var attrNode, 2697*31337658SMarcel Moolenaar property = jQuery.prop( elem, name ); 2698*31337658SMarcel Moolenaar return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? 2699*31337658SMarcel Moolenaar name.toLowerCase() : 2700*31337658SMarcel Moolenaar undefined; 2701*31337658SMarcel Moolenaar }, 2702*31337658SMarcel Moolenaar set: function( elem, value, name ) { 2703*31337658SMarcel Moolenaar var propName; 2704*31337658SMarcel Moolenaar if ( value === false ) { 2705*31337658SMarcel Moolenaar // Remove boolean attributes when set to false 2706*31337658SMarcel Moolenaar jQuery.removeAttr( elem, name ); 2707*31337658SMarcel Moolenaar } else { 2708*31337658SMarcel Moolenaar // value is true since we know at this point it's type boolean and not false 2709*31337658SMarcel Moolenaar // Set boolean attributes to the same name and set the DOM property 2710*31337658SMarcel Moolenaar propName = jQuery.propFix[ name ] || name; 2711*31337658SMarcel Moolenaar if ( propName in elem ) { 2712*31337658SMarcel Moolenaar // Only set the IDL specifically if it already exists on the element 2713*31337658SMarcel Moolenaar elem[ propName ] = true; 2714*31337658SMarcel Moolenaar } 2715*31337658SMarcel Moolenaar 2716*31337658SMarcel Moolenaar elem.setAttribute( name, name.toLowerCase() ); 2717*31337658SMarcel Moolenaar } 2718*31337658SMarcel Moolenaar return name; 2719*31337658SMarcel Moolenaar } 2720*31337658SMarcel Moolenaar}; 2721*31337658SMarcel Moolenaar 2722*31337658SMarcel Moolenaar// IE6/7 do not support getting/setting some attributes with get/setAttribute 2723*31337658SMarcel Moolenaarif ( !getSetAttribute ) { 2724*31337658SMarcel Moolenaar 2725*31337658SMarcel Moolenaar fixSpecified = { 2726*31337658SMarcel Moolenaar name: true, 2727*31337658SMarcel Moolenaar id: true 2728*31337658SMarcel Moolenaar }; 2729*31337658SMarcel Moolenaar 2730*31337658SMarcel Moolenaar // Use this for any attribute in IE6/7 2731*31337658SMarcel Moolenaar // This fixes almost every IE6/7 issue 2732*31337658SMarcel Moolenaar nodeHook = jQuery.valHooks.button = { 2733*31337658SMarcel Moolenaar get: function( elem, name ) { 2734*31337658SMarcel Moolenaar var ret; 2735*31337658SMarcel Moolenaar ret = elem.getAttributeNode( name ); 2736*31337658SMarcel Moolenaar return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? 2737*31337658SMarcel Moolenaar ret.nodeValue : 2738*31337658SMarcel Moolenaar undefined; 2739*31337658SMarcel Moolenaar }, 2740*31337658SMarcel Moolenaar set: function( elem, value, name ) { 2741*31337658SMarcel Moolenaar // Set the existing or create a new attribute node 2742*31337658SMarcel Moolenaar var ret = elem.getAttributeNode( name ); 2743*31337658SMarcel Moolenaar if ( !ret ) { 2744*31337658SMarcel Moolenaar ret = document.createAttribute( name ); 2745*31337658SMarcel Moolenaar elem.setAttributeNode( ret ); 2746*31337658SMarcel Moolenaar } 2747*31337658SMarcel Moolenaar return ( ret.nodeValue = value + "" ); 2748*31337658SMarcel Moolenaar } 2749*31337658SMarcel Moolenaar }; 2750*31337658SMarcel Moolenaar 2751*31337658SMarcel Moolenaar // Apply the nodeHook to tabindex 2752*31337658SMarcel Moolenaar jQuery.attrHooks.tabindex.set = nodeHook.set; 2753*31337658SMarcel Moolenaar 2754*31337658SMarcel Moolenaar // Set width and height to auto instead of 0 on empty string( Bug #8150 ) 2755*31337658SMarcel Moolenaar // This is for removals 2756*31337658SMarcel Moolenaar jQuery.each([ "width", "height" ], function( i, name ) { 2757*31337658SMarcel Moolenaar jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { 2758*31337658SMarcel Moolenaar set: function( elem, value ) { 2759*31337658SMarcel Moolenaar if ( value === "" ) { 2760*31337658SMarcel Moolenaar elem.setAttribute( name, "auto" ); 2761*31337658SMarcel Moolenaar return value; 2762*31337658SMarcel Moolenaar } 2763*31337658SMarcel Moolenaar } 2764*31337658SMarcel Moolenaar }); 2765*31337658SMarcel Moolenaar }); 2766*31337658SMarcel Moolenaar 2767*31337658SMarcel Moolenaar // Set contenteditable to false on removals(#10429) 2768*31337658SMarcel Moolenaar // Setting to empty string throws an error as an invalid value 2769*31337658SMarcel Moolenaar jQuery.attrHooks.contenteditable = { 2770*31337658SMarcel Moolenaar get: nodeHook.get, 2771*31337658SMarcel Moolenaar set: function( elem, value, name ) { 2772*31337658SMarcel Moolenaar if ( value === "" ) { 2773*31337658SMarcel Moolenaar value = "false"; 2774*31337658SMarcel Moolenaar } 2775*31337658SMarcel Moolenaar nodeHook.set( elem, value, name ); 2776*31337658SMarcel Moolenaar } 2777*31337658SMarcel Moolenaar }; 2778*31337658SMarcel Moolenaar} 2779*31337658SMarcel Moolenaar 2780*31337658SMarcel Moolenaar 2781*31337658SMarcel Moolenaar// Some attributes require a special call on IE 2782*31337658SMarcel Moolenaarif ( !jQuery.support.hrefNormalized ) { 2783*31337658SMarcel Moolenaar jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { 2784*31337658SMarcel Moolenaar jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { 2785*31337658SMarcel Moolenaar get: function( elem ) { 2786*31337658SMarcel Moolenaar var ret = elem.getAttribute( name, 2 ); 2787*31337658SMarcel Moolenaar return ret === null ? undefined : ret; 2788*31337658SMarcel Moolenaar } 2789*31337658SMarcel Moolenaar }); 2790*31337658SMarcel Moolenaar }); 2791*31337658SMarcel Moolenaar} 2792*31337658SMarcel Moolenaar 2793*31337658SMarcel Moolenaarif ( !jQuery.support.style ) { 2794*31337658SMarcel Moolenaar jQuery.attrHooks.style = { 2795*31337658SMarcel Moolenaar get: function( elem ) { 2796*31337658SMarcel Moolenaar // Return undefined in the case of empty string 2797*31337658SMarcel Moolenaar // Normalize to lowercase since IE uppercases css property names 2798*31337658SMarcel Moolenaar return elem.style.cssText.toLowerCase() || undefined; 2799*31337658SMarcel Moolenaar }, 2800*31337658SMarcel Moolenaar set: function( elem, value ) { 2801*31337658SMarcel Moolenaar return ( elem.style.cssText = "" + value ); 2802*31337658SMarcel Moolenaar } 2803*31337658SMarcel Moolenaar }; 2804*31337658SMarcel Moolenaar} 2805*31337658SMarcel Moolenaar 2806*31337658SMarcel Moolenaar// Safari mis-reports the default selected property of an option 2807*31337658SMarcel Moolenaar// Accessing the parent's selectedIndex property fixes it 2808*31337658SMarcel Moolenaarif ( !jQuery.support.optSelected ) { 2809*31337658SMarcel Moolenaar jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { 2810*31337658SMarcel Moolenaar get: function( elem ) { 2811*31337658SMarcel Moolenaar var parent = elem.parentNode; 2812*31337658SMarcel Moolenaar 2813*31337658SMarcel Moolenaar if ( parent ) { 2814*31337658SMarcel Moolenaar parent.selectedIndex; 2815*31337658SMarcel Moolenaar 2816*31337658SMarcel Moolenaar // Make sure that it also works with optgroups, see #5701 2817*31337658SMarcel Moolenaar if ( parent.parentNode ) { 2818*31337658SMarcel Moolenaar parent.parentNode.selectedIndex; 2819*31337658SMarcel Moolenaar } 2820*31337658SMarcel Moolenaar } 2821*31337658SMarcel Moolenaar return null; 2822*31337658SMarcel Moolenaar } 2823*31337658SMarcel Moolenaar }); 2824*31337658SMarcel Moolenaar} 2825*31337658SMarcel Moolenaar 2826*31337658SMarcel Moolenaar// IE6/7 call enctype encoding 2827*31337658SMarcel Moolenaarif ( !jQuery.support.enctype ) { 2828*31337658SMarcel Moolenaar jQuery.propFix.enctype = "encoding"; 2829*31337658SMarcel Moolenaar} 2830*31337658SMarcel Moolenaar 2831*31337658SMarcel Moolenaar// Radios and checkboxes getter/setter 2832*31337658SMarcel Moolenaarif ( !jQuery.support.checkOn ) { 2833*31337658SMarcel Moolenaar jQuery.each([ "radio", "checkbox" ], function() { 2834*31337658SMarcel Moolenaar jQuery.valHooks[ this ] = { 2835*31337658SMarcel Moolenaar get: function( elem ) { 2836*31337658SMarcel Moolenaar // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified 2837*31337658SMarcel Moolenaar return elem.getAttribute("value") === null ? "on" : elem.value; 2838*31337658SMarcel Moolenaar } 2839*31337658SMarcel Moolenaar }; 2840*31337658SMarcel Moolenaar }); 2841*31337658SMarcel Moolenaar} 2842*31337658SMarcel MoolenaarjQuery.each([ "radio", "checkbox" ], function() { 2843*31337658SMarcel Moolenaar jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { 2844*31337658SMarcel Moolenaar set: function( elem, value ) { 2845*31337658SMarcel Moolenaar if ( jQuery.isArray( value ) ) { 2846*31337658SMarcel Moolenaar return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); 2847*31337658SMarcel Moolenaar } 2848*31337658SMarcel Moolenaar } 2849*31337658SMarcel Moolenaar }); 2850*31337658SMarcel Moolenaar}); 2851*31337658SMarcel Moolenaar 2852*31337658SMarcel Moolenaar 2853*31337658SMarcel Moolenaar 2854*31337658SMarcel Moolenaar 2855*31337658SMarcel Moolenaarvar rnamespaces = /\.(.*)$/, 2856*31337658SMarcel Moolenaar rformElems = /^(?:textarea|input|select)$/i, 2857*31337658SMarcel Moolenaar rperiod = /\./g, 2858*31337658SMarcel Moolenaar rspaces = / /g, 2859*31337658SMarcel Moolenaar rescape = /[^\w\s.|`]/g, 2860*31337658SMarcel Moolenaar rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, 2861*31337658SMarcel Moolenaar rhoverHack = /\bhover(\.\S+)?/, 2862*31337658SMarcel Moolenaar rkeyEvent = /^key/, 2863*31337658SMarcel Moolenaar rmouseEvent = /^(?:mouse|contextmenu)|click/, 2864*31337658SMarcel Moolenaar rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, 2865*31337658SMarcel Moolenaar quickParse = function( selector ) { 2866*31337658SMarcel Moolenaar var quick = rquickIs.exec( selector ); 2867*31337658SMarcel Moolenaar if ( quick ) { 2868*31337658SMarcel Moolenaar // 0 1 2 3 2869*31337658SMarcel Moolenaar // [ _, tag, id, class ] 2870*31337658SMarcel Moolenaar quick[1] = ( quick[1] || "" ).toLowerCase(); 2871*31337658SMarcel Moolenaar quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); 2872*31337658SMarcel Moolenaar } 2873*31337658SMarcel Moolenaar return quick; 2874*31337658SMarcel Moolenaar }, 2875*31337658SMarcel Moolenaar quickIs = function( elem, m ) { 2876*31337658SMarcel Moolenaar return ( 2877*31337658SMarcel Moolenaar (!m[1] || elem.nodeName.toLowerCase() === m[1]) && 2878*31337658SMarcel Moolenaar (!m[2] || elem.id === m[2]) && 2879*31337658SMarcel Moolenaar (!m[3] || m[3].test( elem.className )) 2880*31337658SMarcel Moolenaar ); 2881*31337658SMarcel Moolenaar }, 2882*31337658SMarcel Moolenaar hoverHack = function( events ) { 2883*31337658SMarcel Moolenaar return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); 2884*31337658SMarcel Moolenaar }; 2885*31337658SMarcel Moolenaar 2886*31337658SMarcel Moolenaar/* 2887*31337658SMarcel Moolenaar * Helper functions for managing events -- not part of the public interface. 2888*31337658SMarcel Moolenaar * Props to Dean Edwards' addEvent library for many of the ideas. 2889*31337658SMarcel Moolenaar */ 2890*31337658SMarcel MoolenaarjQuery.event = { 2891*31337658SMarcel Moolenaar 2892*31337658SMarcel Moolenaar add: function( elem, types, handler, data, selector ) { 2893*31337658SMarcel Moolenaar 2894*31337658SMarcel Moolenaar var elemData, eventHandle, events, 2895*31337658SMarcel Moolenaar t, tns, type, namespaces, handleObj, 2896*31337658SMarcel Moolenaar handleObjIn, quick, handlers, special; 2897*31337658SMarcel Moolenaar 2898*31337658SMarcel Moolenaar // Don't attach events to noData or text/comment nodes (allow plain objects tho) 2899*31337658SMarcel Moolenaar if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { 2900*31337658SMarcel Moolenaar return; 2901*31337658SMarcel Moolenaar } 2902*31337658SMarcel Moolenaar 2903*31337658SMarcel Moolenaar // Caller can pass in an object of custom data in lieu of the handler 2904*31337658SMarcel Moolenaar if ( handler.handler ) { 2905*31337658SMarcel Moolenaar handleObjIn = handler; 2906*31337658SMarcel Moolenaar handler = handleObjIn.handler; 2907*31337658SMarcel Moolenaar } 2908*31337658SMarcel Moolenaar 2909*31337658SMarcel Moolenaar // Make sure that the handler has a unique ID, used to find/remove it later 2910*31337658SMarcel Moolenaar if ( !handler.guid ) { 2911*31337658SMarcel Moolenaar handler.guid = jQuery.guid++; 2912*31337658SMarcel Moolenaar } 2913*31337658SMarcel Moolenaar 2914*31337658SMarcel Moolenaar // Init the element's event structure and main handler, if this is the first 2915*31337658SMarcel Moolenaar events = elemData.events; 2916*31337658SMarcel Moolenaar if ( !events ) { 2917*31337658SMarcel Moolenaar elemData.events = events = {}; 2918*31337658SMarcel Moolenaar } 2919*31337658SMarcel Moolenaar eventHandle = elemData.handle; 2920*31337658SMarcel Moolenaar if ( !eventHandle ) { 2921*31337658SMarcel Moolenaar elemData.handle = eventHandle = function( e ) { 2922*31337658SMarcel Moolenaar // Discard the second event of a jQuery.event.trigger() and 2923*31337658SMarcel Moolenaar // when an event is called after a page has unloaded 2924*31337658SMarcel Moolenaar return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? 2925*31337658SMarcel Moolenaar jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : 2926*31337658SMarcel Moolenaar undefined; 2927*31337658SMarcel Moolenaar }; 2928*31337658SMarcel Moolenaar // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events 2929*31337658SMarcel Moolenaar eventHandle.elem = elem; 2930*31337658SMarcel Moolenaar } 2931*31337658SMarcel Moolenaar 2932*31337658SMarcel Moolenaar // Handle multiple events separated by a space 2933*31337658SMarcel Moolenaar // jQuery(...).bind("mouseover mouseout", fn); 2934*31337658SMarcel Moolenaar types = hoverHack(types).split( " " ); 2935*31337658SMarcel Moolenaar for ( t = 0; t < types.length; t++ ) { 2936*31337658SMarcel Moolenaar 2937*31337658SMarcel Moolenaar tns = rtypenamespace.exec( types[t] ) || []; 2938*31337658SMarcel Moolenaar type = tns[1]; 2939*31337658SMarcel Moolenaar namespaces = ( tns[2] || "" ).split( "." ).sort(); 2940*31337658SMarcel Moolenaar 2941*31337658SMarcel Moolenaar // If event changes its type, use the special event handlers for the changed type 2942*31337658SMarcel Moolenaar special = jQuery.event.special[ type ] || {}; 2943*31337658SMarcel Moolenaar 2944*31337658SMarcel Moolenaar // If selector defined, determine special event api type, otherwise given type 2945*31337658SMarcel Moolenaar type = ( selector ? special.delegateType : special.bindType ) || type; 2946*31337658SMarcel Moolenaar 2947*31337658SMarcel Moolenaar // Update special based on newly reset type 2948*31337658SMarcel Moolenaar special = jQuery.event.special[ type ] || {}; 2949*31337658SMarcel Moolenaar 2950*31337658SMarcel Moolenaar // handleObj is passed to all event handlers 2951*31337658SMarcel Moolenaar handleObj = jQuery.extend({ 2952*31337658SMarcel Moolenaar type: type, 2953*31337658SMarcel Moolenaar origType: tns[1], 2954*31337658SMarcel Moolenaar data: data, 2955*31337658SMarcel Moolenaar handler: handler, 2956*31337658SMarcel Moolenaar guid: handler.guid, 2957*31337658SMarcel Moolenaar selector: selector, 2958*31337658SMarcel Moolenaar namespace: namespaces.join(".") 2959*31337658SMarcel Moolenaar }, handleObjIn ); 2960*31337658SMarcel Moolenaar 2961*31337658SMarcel Moolenaar // Delegated event; pre-analyze selector so it's processed quickly on event dispatch 2962*31337658SMarcel Moolenaar if ( selector ) { 2963*31337658SMarcel Moolenaar handleObj.quick = quickParse( selector ); 2964*31337658SMarcel Moolenaar if ( !handleObj.quick && jQuery.expr.match.POS.test( selector ) ) { 2965*31337658SMarcel Moolenaar handleObj.isPositional = true; 2966*31337658SMarcel Moolenaar } 2967*31337658SMarcel Moolenaar } 2968*31337658SMarcel Moolenaar 2969*31337658SMarcel Moolenaar // Init the event handler queue if we're the first 2970*31337658SMarcel Moolenaar handlers = events[ type ]; 2971*31337658SMarcel Moolenaar if ( !handlers ) { 2972*31337658SMarcel Moolenaar handlers = events[ type ] = []; 2973*31337658SMarcel Moolenaar handlers.delegateCount = 0; 2974*31337658SMarcel Moolenaar 2975*31337658SMarcel Moolenaar // Only use addEventListener/attachEvent if the special events handler returns false 2976*31337658SMarcel Moolenaar if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { 2977*31337658SMarcel Moolenaar // Bind the global event handler to the element 2978*31337658SMarcel Moolenaar if ( elem.addEventListener ) { 2979*31337658SMarcel Moolenaar elem.addEventListener( type, eventHandle, false ); 2980*31337658SMarcel Moolenaar 2981*31337658SMarcel Moolenaar } else if ( elem.attachEvent ) { 2982*31337658SMarcel Moolenaar elem.attachEvent( "on" + type, eventHandle ); 2983*31337658SMarcel Moolenaar } 2984*31337658SMarcel Moolenaar } 2985*31337658SMarcel Moolenaar } 2986*31337658SMarcel Moolenaar 2987*31337658SMarcel Moolenaar if ( special.add ) { 2988*31337658SMarcel Moolenaar special.add.call( elem, handleObj ); 2989*31337658SMarcel Moolenaar 2990*31337658SMarcel Moolenaar if ( !handleObj.handler.guid ) { 2991*31337658SMarcel Moolenaar handleObj.handler.guid = handler.guid; 2992*31337658SMarcel Moolenaar } 2993*31337658SMarcel Moolenaar } 2994*31337658SMarcel Moolenaar 2995*31337658SMarcel Moolenaar // Add to the element's handler list, delegates in front 2996*31337658SMarcel Moolenaar if ( selector ) { 2997*31337658SMarcel Moolenaar handlers.splice( handlers.delegateCount++, 0, handleObj ); 2998*31337658SMarcel Moolenaar } else { 2999*31337658SMarcel Moolenaar handlers.push( handleObj ); 3000*31337658SMarcel Moolenaar } 3001*31337658SMarcel Moolenaar 3002*31337658SMarcel Moolenaar // Keep track of which events have ever been used, for event optimization 3003*31337658SMarcel Moolenaar jQuery.event.global[ type ] = true; 3004*31337658SMarcel Moolenaar } 3005*31337658SMarcel Moolenaar 3006*31337658SMarcel Moolenaar // Nullify elem to prevent memory leaks in IE 3007*31337658SMarcel Moolenaar elem = null; 3008*31337658SMarcel Moolenaar }, 3009*31337658SMarcel Moolenaar 3010*31337658SMarcel Moolenaar global: {}, 3011*31337658SMarcel Moolenaar 3012*31337658SMarcel Moolenaar // Detach an event or set of events from an element 3013*31337658SMarcel Moolenaar remove: function( elem, types, handler, selector ) { 3014*31337658SMarcel Moolenaar 3015*31337658SMarcel Moolenaar var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), 3016*31337658SMarcel Moolenaar t, tns, type, namespaces, origCount, 3017*31337658SMarcel Moolenaar j, events, special, handle, eventType, handleObj; 3018*31337658SMarcel Moolenaar 3019*31337658SMarcel Moolenaar if ( !elemData || !(events = elemData.events) ) { 3020*31337658SMarcel Moolenaar return; 3021*31337658SMarcel Moolenaar } 3022*31337658SMarcel Moolenaar 3023*31337658SMarcel Moolenaar // Once for each type.namespace in types; type may be omitted 3024*31337658SMarcel Moolenaar types = hoverHack( types || "" ).split(" "); 3025*31337658SMarcel Moolenaar for ( t = 0; t < types.length; t++ ) { 3026*31337658SMarcel Moolenaar tns = rtypenamespace.exec( types[t] ) || []; 3027*31337658SMarcel Moolenaar type = tns[1]; 3028*31337658SMarcel Moolenaar namespaces = tns[2]; 3029*31337658SMarcel Moolenaar 3030*31337658SMarcel Moolenaar // Unbind all events (on this namespace, if provided) for the element 3031*31337658SMarcel Moolenaar if ( !type ) { 3032*31337658SMarcel Moolenaar namespaces = namespaces? "." + namespaces : ""; 3033*31337658SMarcel Moolenaar for ( j in events ) { 3034*31337658SMarcel Moolenaar jQuery.event.remove( elem, j + namespaces, handler, selector ); 3035*31337658SMarcel Moolenaar } 3036*31337658SMarcel Moolenaar return; 3037*31337658SMarcel Moolenaar } 3038*31337658SMarcel Moolenaar 3039*31337658SMarcel Moolenaar special = jQuery.event.special[ type ] || {}; 3040*31337658SMarcel Moolenaar type = ( selector? special.delegateType : special.bindType ) || type; 3041*31337658SMarcel Moolenaar eventType = events[ type ] || []; 3042*31337658SMarcel Moolenaar origCount = eventType.length; 3043*31337658SMarcel Moolenaar namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; 3044*31337658SMarcel Moolenaar 3045*31337658SMarcel Moolenaar // Only need to loop for special events or selective removal 3046*31337658SMarcel Moolenaar if ( handler || namespaces || selector || special.remove ) { 3047*31337658SMarcel Moolenaar for ( j = 0; j < eventType.length; j++ ) { 3048*31337658SMarcel Moolenaar handleObj = eventType[ j ]; 3049*31337658SMarcel Moolenaar 3050*31337658SMarcel Moolenaar if ( !handler || handler.guid === handleObj.guid ) { 3051*31337658SMarcel Moolenaar if ( !namespaces || namespaces.test( handleObj.namespace ) ) { 3052*31337658SMarcel Moolenaar if ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) { 3053*31337658SMarcel Moolenaar eventType.splice( j--, 1 ); 3054*31337658SMarcel Moolenaar 3055*31337658SMarcel Moolenaar if ( handleObj.selector ) { 3056*31337658SMarcel Moolenaar eventType.delegateCount--; 3057*31337658SMarcel Moolenaar } 3058*31337658SMarcel Moolenaar if ( special.remove ) { 3059*31337658SMarcel Moolenaar special.remove.call( elem, handleObj ); 3060*31337658SMarcel Moolenaar } 3061*31337658SMarcel Moolenaar } 3062*31337658SMarcel Moolenaar } 3063*31337658SMarcel Moolenaar } 3064*31337658SMarcel Moolenaar } 3065*31337658SMarcel Moolenaar } else { 3066*31337658SMarcel Moolenaar // Removing all events 3067*31337658SMarcel Moolenaar eventType.length = 0; 3068*31337658SMarcel Moolenaar } 3069*31337658SMarcel Moolenaar 3070*31337658SMarcel Moolenaar // Remove generic event handler if we removed something and no more handlers exist 3071*31337658SMarcel Moolenaar // (avoids potential for endless recursion during removal of special event handlers) 3072*31337658SMarcel Moolenaar if ( eventType.length === 0 && origCount !== eventType.length ) { 3073*31337658SMarcel Moolenaar if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { 3074*31337658SMarcel Moolenaar jQuery.removeEvent( elem, type, elemData.handle ); 3075*31337658SMarcel Moolenaar } 3076*31337658SMarcel Moolenaar 3077*31337658SMarcel Moolenaar delete events[ type ]; 3078*31337658SMarcel Moolenaar } 3079*31337658SMarcel Moolenaar } 3080*31337658SMarcel Moolenaar 3081*31337658SMarcel Moolenaar // Remove the expando if it's no longer used 3082*31337658SMarcel Moolenaar if ( jQuery.isEmptyObject( events ) ) { 3083*31337658SMarcel Moolenaar handle = elemData.handle; 3084*31337658SMarcel Moolenaar if ( handle ) { 3085*31337658SMarcel Moolenaar handle.elem = null; 3086*31337658SMarcel Moolenaar } 3087*31337658SMarcel Moolenaar 3088*31337658SMarcel Moolenaar // removeData also checks for emptiness and clears the expando if empty 3089*31337658SMarcel Moolenaar // so use it instead of delete 3090*31337658SMarcel Moolenaar jQuery.removeData( elem, [ "events", "handle" ], true ); 3091*31337658SMarcel Moolenaar } 3092*31337658SMarcel Moolenaar }, 3093*31337658SMarcel Moolenaar 3094*31337658SMarcel Moolenaar // Events that are safe to short-circuit if no handlers are attached. 3095*31337658SMarcel Moolenaar // Native DOM events should not be added, they may have inline handlers. 3096*31337658SMarcel Moolenaar customEvent: { 3097*31337658SMarcel Moolenaar "getData": true, 3098*31337658SMarcel Moolenaar "setData": true, 3099*31337658SMarcel Moolenaar "changeData": true 3100*31337658SMarcel Moolenaar }, 3101*31337658SMarcel Moolenaar 3102*31337658SMarcel Moolenaar trigger: function( event, data, elem, onlyHandlers ) { 3103*31337658SMarcel Moolenaar // Don't do events on text and comment nodes 3104*31337658SMarcel Moolenaar if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { 3105*31337658SMarcel Moolenaar return; 3106*31337658SMarcel Moolenaar } 3107*31337658SMarcel Moolenaar 3108*31337658SMarcel Moolenaar // Event object or event type 3109*31337658SMarcel Moolenaar var type = event.type || event, 3110*31337658SMarcel Moolenaar namespaces = [], 3111*31337658SMarcel Moolenaar cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; 3112*31337658SMarcel Moolenaar 3113*31337658SMarcel Moolenaar if ( type.indexOf( "!" ) >= 0 ) { 3114*31337658SMarcel Moolenaar // Exclusive events trigger only for the exact event (no namespaces) 3115*31337658SMarcel Moolenaar type = type.slice(0, -1); 3116*31337658SMarcel Moolenaar exclusive = true; 3117*31337658SMarcel Moolenaar } 3118*31337658SMarcel Moolenaar 3119*31337658SMarcel Moolenaar if ( type.indexOf( "." ) >= 0 ) { 3120*31337658SMarcel Moolenaar // Namespaced trigger; create a regexp to match event type in handle() 3121*31337658SMarcel Moolenaar namespaces = type.split("."); 3122*31337658SMarcel Moolenaar type = namespaces.shift(); 3123*31337658SMarcel Moolenaar namespaces.sort(); 3124*31337658SMarcel Moolenaar } 3125*31337658SMarcel Moolenaar 3126*31337658SMarcel Moolenaar if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { 3127*31337658SMarcel Moolenaar // No jQuery handlers for this event type, and it can't have inline handlers 3128*31337658SMarcel Moolenaar return; 3129*31337658SMarcel Moolenaar } 3130*31337658SMarcel Moolenaar 3131*31337658SMarcel Moolenaar // Caller can pass in an Event, Object, or just an event type string 3132*31337658SMarcel Moolenaar event = typeof event === "object" ? 3133*31337658SMarcel Moolenaar // jQuery.Event object 3134*31337658SMarcel Moolenaar event[ jQuery.expando ] ? event : 3135*31337658SMarcel Moolenaar // Object literal 3136*31337658SMarcel Moolenaar new jQuery.Event( type, event ) : 3137*31337658SMarcel Moolenaar // Just the event type (string) 3138*31337658SMarcel Moolenaar new jQuery.Event( type ); 3139*31337658SMarcel Moolenaar 3140*31337658SMarcel Moolenaar event.type = type; 3141*31337658SMarcel Moolenaar event.isTrigger = true; 3142*31337658SMarcel Moolenaar event.exclusive = exclusive; 3143*31337658SMarcel Moolenaar event.namespace = namespaces.join( "." ); 3144*31337658SMarcel Moolenaar event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; 3145*31337658SMarcel Moolenaar ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; 3146*31337658SMarcel Moolenaar 3147*31337658SMarcel Moolenaar // triggerHandler() and global events don't bubble or run the default action 3148*31337658SMarcel Moolenaar if ( onlyHandlers || !elem ) { 3149*31337658SMarcel Moolenaar event.preventDefault(); 3150*31337658SMarcel Moolenaar } 3151*31337658SMarcel Moolenaar 3152*31337658SMarcel Moolenaar // Handle a global trigger 3153*31337658SMarcel Moolenaar if ( !elem ) { 3154*31337658SMarcel Moolenaar 3155*31337658SMarcel Moolenaar // TODO: Stop taunting the data cache; remove global events and always attach to document 3156*31337658SMarcel Moolenaar cache = jQuery.cache; 3157*31337658SMarcel Moolenaar for ( i in cache ) { 3158*31337658SMarcel Moolenaar if ( cache[ i ].events && cache[ i ].events[ type ] ) { 3159*31337658SMarcel Moolenaar jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); 3160*31337658SMarcel Moolenaar } 3161*31337658SMarcel Moolenaar } 3162*31337658SMarcel Moolenaar return; 3163*31337658SMarcel Moolenaar } 3164*31337658SMarcel Moolenaar 3165*31337658SMarcel Moolenaar // Clean up the event in case it is being reused 3166*31337658SMarcel Moolenaar event.result = undefined; 3167*31337658SMarcel Moolenaar if ( !event.target ) { 3168*31337658SMarcel Moolenaar event.target = elem; 3169*31337658SMarcel Moolenaar } 3170*31337658SMarcel Moolenaar 3171*31337658SMarcel Moolenaar // Clone any incoming data and prepend the event, creating the handler arg list 3172*31337658SMarcel Moolenaar data = data != null ? jQuery.makeArray( data ) : []; 3173*31337658SMarcel Moolenaar data.unshift( event ); 3174*31337658SMarcel Moolenaar 3175*31337658SMarcel Moolenaar // Allow special events to draw outside the lines 3176*31337658SMarcel Moolenaar special = jQuery.event.special[ type ] || {}; 3177*31337658SMarcel Moolenaar if ( special.trigger && special.trigger.apply( elem, data ) === false ) { 3178*31337658SMarcel Moolenaar return; 3179*31337658SMarcel Moolenaar } 3180*31337658SMarcel Moolenaar 3181*31337658SMarcel Moolenaar // Determine event propagation path in advance, per W3C events spec (#9951) 3182*31337658SMarcel Moolenaar // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) 3183*31337658SMarcel Moolenaar eventPath = [[ elem, special.bindType || type ]]; 3184*31337658SMarcel Moolenaar if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { 3185*31337658SMarcel Moolenaar 3186*31337658SMarcel Moolenaar bubbleType = special.delegateType || type; 3187*31337658SMarcel Moolenaar old = null; 3188*31337658SMarcel Moolenaar for ( cur = elem.parentNode; cur; cur = cur.parentNode ) { 3189*31337658SMarcel Moolenaar eventPath.push([ cur, bubbleType ]); 3190*31337658SMarcel Moolenaar old = cur; 3191*31337658SMarcel Moolenaar } 3192*31337658SMarcel Moolenaar 3193*31337658SMarcel Moolenaar // Only add window if we got to document (e.g., not plain obj or detached DOM) 3194*31337658SMarcel Moolenaar if ( old && old === elem.ownerDocument ) { 3195*31337658SMarcel Moolenaar eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); 3196*31337658SMarcel Moolenaar } 3197*31337658SMarcel Moolenaar } 3198*31337658SMarcel Moolenaar 3199*31337658SMarcel Moolenaar // Fire handlers on the event path 3200*31337658SMarcel Moolenaar for ( i = 0; i < eventPath.length; i++ ) { 3201*31337658SMarcel Moolenaar 3202*31337658SMarcel Moolenaar cur = eventPath[i][0]; 3203*31337658SMarcel Moolenaar event.type = eventPath[i][1]; 3204*31337658SMarcel Moolenaar 3205*31337658SMarcel Moolenaar handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); 3206*31337658SMarcel Moolenaar if ( handle ) { 3207*31337658SMarcel Moolenaar handle.apply( cur, data ); 3208*31337658SMarcel Moolenaar } 3209*31337658SMarcel Moolenaar handle = ontype && cur[ ontype ]; 3210*31337658SMarcel Moolenaar if ( handle && jQuery.acceptData( cur ) ) { 3211*31337658SMarcel Moolenaar handle.apply( cur, data ); 3212*31337658SMarcel Moolenaar } 3213*31337658SMarcel Moolenaar 3214*31337658SMarcel Moolenaar if ( event.isPropagationStopped() ) { 3215*31337658SMarcel Moolenaar break; 3216*31337658SMarcel Moolenaar } 3217*31337658SMarcel Moolenaar } 3218*31337658SMarcel Moolenaar event.type = type; 3219*31337658SMarcel Moolenaar 3220*31337658SMarcel Moolenaar // If nobody prevented the default action, do it now 3221*31337658SMarcel Moolenaar if ( !event.isDefaultPrevented() ) { 3222*31337658SMarcel Moolenaar 3223*31337658SMarcel Moolenaar if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && 3224*31337658SMarcel Moolenaar !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { 3225*31337658SMarcel Moolenaar 3226*31337658SMarcel Moolenaar // Call a native DOM method on the target with the same name name as the event. 3227*31337658SMarcel Moolenaar // Can't use an .isFunction() check here because IE6/7 fails that test. 3228*31337658SMarcel Moolenaar // Don't do default actions on window, that's where global variables be (#6170) 3229*31337658SMarcel Moolenaar // IE<9 dies on focus/blur to hidden element (#1486) 3230*31337658SMarcel Moolenaar if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { 3231*31337658SMarcel Moolenaar 3232*31337658SMarcel Moolenaar // Don't re-trigger an onFOO event when we call its FOO() method 3233*31337658SMarcel Moolenaar old = elem[ ontype ]; 3234*31337658SMarcel Moolenaar 3235*31337658SMarcel Moolenaar if ( old ) { 3236*31337658SMarcel Moolenaar elem[ ontype ] = null; 3237*31337658SMarcel Moolenaar } 3238*31337658SMarcel Moolenaar 3239*31337658SMarcel Moolenaar // Prevent re-triggering of the same event, since we already bubbled it above 3240*31337658SMarcel Moolenaar jQuery.event.triggered = type; 3241*31337658SMarcel Moolenaar elem[ type ](); 3242*31337658SMarcel Moolenaar jQuery.event.triggered = undefined; 3243*31337658SMarcel Moolenaar 3244*31337658SMarcel Moolenaar if ( old ) { 3245*31337658SMarcel Moolenaar elem[ ontype ] = old; 3246*31337658SMarcel Moolenaar } 3247*31337658SMarcel Moolenaar } 3248*31337658SMarcel Moolenaar } 3249*31337658SMarcel Moolenaar } 3250*31337658SMarcel Moolenaar 3251*31337658SMarcel Moolenaar return event.result; 3252*31337658SMarcel Moolenaar }, 3253*31337658SMarcel Moolenaar 3254*31337658SMarcel Moolenaar dispatch: function( event ) { 3255*31337658SMarcel Moolenaar 3256*31337658SMarcel Moolenaar // Make a writable jQuery.Event from the native event object 3257*31337658SMarcel Moolenaar event = jQuery.event.fix( event || window.event ); 3258*31337658SMarcel Moolenaar 3259*31337658SMarcel Moolenaar var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), 3260*31337658SMarcel Moolenaar delegateCount = handlers.delegateCount, 3261*31337658SMarcel Moolenaar args = [].slice.call( arguments, 0 ), 3262*31337658SMarcel Moolenaar run_all = !event.exclusive && !event.namespace, 3263*31337658SMarcel Moolenaar specialHandle = ( jQuery.event.special[ event.type ] || {} ).handle, 3264*31337658SMarcel Moolenaar handlerQueue = [], 3265*31337658SMarcel Moolenaar i, j, cur, ret, selMatch, matched, matches, handleObj, sel, hit, related; 3266*31337658SMarcel Moolenaar 3267*31337658SMarcel Moolenaar // Use the fix-ed jQuery.Event rather than the (read-only) native event 3268*31337658SMarcel Moolenaar args[0] = event; 3269*31337658SMarcel Moolenaar event.delegateTarget = this; 3270*31337658SMarcel Moolenaar 3271*31337658SMarcel Moolenaar // Determine handlers that should run if there are delegated events 3272*31337658SMarcel Moolenaar // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861) 3273*31337658SMarcel Moolenaar if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) { 3274*31337658SMarcel Moolenaar 3275*31337658SMarcel Moolenaar for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { 3276*31337658SMarcel Moolenaar selMatch = {}; 3277*31337658SMarcel Moolenaar matches = []; 3278*31337658SMarcel Moolenaar for ( i = 0; i < delegateCount; i++ ) { 3279*31337658SMarcel Moolenaar handleObj = handlers[ i ]; 3280*31337658SMarcel Moolenaar sel = handleObj.selector; 3281*31337658SMarcel Moolenaar hit = selMatch[ sel ]; 3282*31337658SMarcel Moolenaar 3283*31337658SMarcel Moolenaar if ( handleObj.isPositional ) { 3284*31337658SMarcel Moolenaar // Since .is() does not work for positionals; see http://jsfiddle.net/eJ4yd/3/ 3285*31337658SMarcel Moolenaar hit = ( hit || (selMatch[ sel ] = jQuery( sel )) ).index( cur ) >= 0; 3286*31337658SMarcel Moolenaar } else if ( hit === undefined ) { 3287*31337658SMarcel Moolenaar hit = selMatch[ sel ] = ( handleObj.quick ? quickIs( cur, handleObj.quick ) : jQuery( cur ).is( sel ) ); 3288*31337658SMarcel Moolenaar } 3289*31337658SMarcel Moolenaar if ( hit ) { 3290*31337658SMarcel Moolenaar matches.push( handleObj ); 3291*31337658SMarcel Moolenaar } 3292*31337658SMarcel Moolenaar } 3293*31337658SMarcel Moolenaar if ( matches.length ) { 3294*31337658SMarcel Moolenaar handlerQueue.push({ elem: cur, matches: matches }); 3295*31337658SMarcel Moolenaar } 3296*31337658SMarcel Moolenaar } 3297*31337658SMarcel Moolenaar } 3298*31337658SMarcel Moolenaar 3299*31337658SMarcel Moolenaar // Add the remaining (directly-bound) handlers 3300*31337658SMarcel Moolenaar if ( handlers.length > delegateCount ) { 3301*31337658SMarcel Moolenaar handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); 3302*31337658SMarcel Moolenaar } 3303*31337658SMarcel Moolenaar 3304*31337658SMarcel Moolenaar // Run delegates first; they may want to stop propagation beneath us 3305*31337658SMarcel Moolenaar for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { 3306*31337658SMarcel Moolenaar matched = handlerQueue[ i ]; 3307*31337658SMarcel Moolenaar event.currentTarget = matched.elem; 3308*31337658SMarcel Moolenaar 3309*31337658SMarcel Moolenaar for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { 3310*31337658SMarcel Moolenaar handleObj = matched.matches[ j ]; 3311*31337658SMarcel Moolenaar 3312*31337658SMarcel Moolenaar // Triggered event must either 1) be non-exclusive and have no namespace, or 3313*31337658SMarcel Moolenaar // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). 3314*31337658SMarcel Moolenaar if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { 3315*31337658SMarcel Moolenaar 3316*31337658SMarcel Moolenaar event.data = handleObj.data; 3317*31337658SMarcel Moolenaar event.handleObj = handleObj; 3318*31337658SMarcel Moolenaar 3319*31337658SMarcel Moolenaar ret = ( specialHandle || handleObj.handler ).apply( matched.elem, args ); 3320*31337658SMarcel Moolenaar 3321*31337658SMarcel Moolenaar if ( ret !== undefined ) { 3322*31337658SMarcel Moolenaar event.result = ret; 3323*31337658SMarcel Moolenaar if ( ret === false ) { 3324*31337658SMarcel Moolenaar event.preventDefault(); 3325*31337658SMarcel Moolenaar event.stopPropagation(); 3326*31337658SMarcel Moolenaar } 3327*31337658SMarcel Moolenaar } 3328*31337658SMarcel Moolenaar } 3329*31337658SMarcel Moolenaar } 3330*31337658SMarcel Moolenaar } 3331*31337658SMarcel Moolenaar 3332*31337658SMarcel Moolenaar return event.result; 3333*31337658SMarcel Moolenaar }, 3334*31337658SMarcel Moolenaar 3335*31337658SMarcel Moolenaar // Includes some event props shared by KeyEvent and MouseEvent 3336*31337658SMarcel Moolenaar // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** 3337*31337658SMarcel Moolenaar props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), 3338*31337658SMarcel Moolenaar 3339*31337658SMarcel Moolenaar fixHooks: {}, 3340*31337658SMarcel Moolenaar 3341*31337658SMarcel Moolenaar keyHooks: { 3342*31337658SMarcel Moolenaar props: "char charCode key keyCode".split(" "), 3343*31337658SMarcel Moolenaar filter: function( event, original ) { 3344*31337658SMarcel Moolenaar 3345*31337658SMarcel Moolenaar // Add which for key events 3346*31337658SMarcel Moolenaar if ( event.which == null ) { 3347*31337658SMarcel Moolenaar event.which = original.charCode != null ? original.charCode : original.keyCode; 3348*31337658SMarcel Moolenaar } 3349*31337658SMarcel Moolenaar 3350*31337658SMarcel Moolenaar return event; 3351*31337658SMarcel Moolenaar } 3352*31337658SMarcel Moolenaar }, 3353*31337658SMarcel Moolenaar 3354*31337658SMarcel Moolenaar mouseHooks: { 3355*31337658SMarcel Moolenaar props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement wheelDelta".split(" "), 3356*31337658SMarcel Moolenaar filter: function( event, original ) { 3357*31337658SMarcel Moolenaar var eventDoc, doc, body, 3358*31337658SMarcel Moolenaar button = original.button, 3359*31337658SMarcel Moolenaar fromElement = original.fromElement; 3360*31337658SMarcel Moolenaar 3361*31337658SMarcel Moolenaar // Calculate pageX/Y if missing and clientX/Y available 3362*31337658SMarcel Moolenaar if ( event.pageX == null && original.clientX != null ) { 3363*31337658SMarcel Moolenaar eventDoc = event.target.ownerDocument || document; 3364*31337658SMarcel Moolenaar doc = eventDoc.documentElement; 3365*31337658SMarcel Moolenaar body = eventDoc.body; 3366*31337658SMarcel Moolenaar 3367*31337658SMarcel Moolenaar event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); 3368*31337658SMarcel Moolenaar event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); 3369*31337658SMarcel Moolenaar } 3370*31337658SMarcel Moolenaar 3371*31337658SMarcel Moolenaar // Add relatedTarget, if necessary 3372*31337658SMarcel Moolenaar if ( !event.relatedTarget && fromElement ) { 3373*31337658SMarcel Moolenaar event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; 3374*31337658SMarcel Moolenaar } 3375*31337658SMarcel Moolenaar 3376*31337658SMarcel Moolenaar // Add which for click: 1 === left; 2 === middle; 3 === right 3377*31337658SMarcel Moolenaar // Note: button is not normalized, so don't use it 3378*31337658SMarcel Moolenaar if ( !event.which && button !== undefined ) { 3379*31337658SMarcel Moolenaar event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); 3380*31337658SMarcel Moolenaar } 3381*31337658SMarcel Moolenaar 3382*31337658SMarcel Moolenaar return event; 3383*31337658SMarcel Moolenaar } 3384*31337658SMarcel Moolenaar }, 3385*31337658SMarcel Moolenaar 3386*31337658SMarcel Moolenaar fix: function( event ) { 3387*31337658SMarcel Moolenaar if ( event[ jQuery.expando ] ) { 3388*31337658SMarcel Moolenaar return event; 3389*31337658SMarcel Moolenaar } 3390*31337658SMarcel Moolenaar 3391*31337658SMarcel Moolenaar // Create a writable copy of the event object and normalize some properties 3392*31337658SMarcel Moolenaar var i, prop, 3393*31337658SMarcel Moolenaar originalEvent = event, 3394*31337658SMarcel Moolenaar fixHook = jQuery.event.fixHooks[ event.type ] || {}, 3395*31337658SMarcel Moolenaar copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; 3396*31337658SMarcel Moolenaar 3397*31337658SMarcel Moolenaar event = jQuery.Event( originalEvent ); 3398*31337658SMarcel Moolenaar 3399*31337658SMarcel Moolenaar for ( i = copy.length; i; ) { 3400*31337658SMarcel Moolenaar prop = copy[ --i ]; 3401*31337658SMarcel Moolenaar event[ prop ] = originalEvent[ prop ]; 3402*31337658SMarcel Moolenaar } 3403*31337658SMarcel Moolenaar 3404*31337658SMarcel Moolenaar // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) 3405*31337658SMarcel Moolenaar if ( !event.target ) { 3406*31337658SMarcel Moolenaar event.target = originalEvent.srcElement || document; 3407*31337658SMarcel Moolenaar } 3408*31337658SMarcel Moolenaar 3409*31337658SMarcel Moolenaar // Target should not be a text node (#504, Safari) 3410*31337658SMarcel Moolenaar if ( event.target.nodeType === 3 ) { 3411*31337658SMarcel Moolenaar event.target = event.target.parentNode; 3412*31337658SMarcel Moolenaar } 3413*31337658SMarcel Moolenaar 3414*31337658SMarcel Moolenaar // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) 3415*31337658SMarcel Moolenaar if ( event.metaKey === undefined ) { 3416*31337658SMarcel Moolenaar event.metaKey = event.ctrlKey; 3417*31337658SMarcel Moolenaar } 3418*31337658SMarcel Moolenaar 3419*31337658SMarcel Moolenaar return fixHook.filter? fixHook.filter( event, originalEvent ) : event; 3420*31337658SMarcel Moolenaar }, 3421*31337658SMarcel Moolenaar 3422*31337658SMarcel Moolenaar special: { 3423*31337658SMarcel Moolenaar ready: { 3424*31337658SMarcel Moolenaar // Make sure the ready event is setup 3425*31337658SMarcel Moolenaar setup: jQuery.bindReady 3426*31337658SMarcel Moolenaar }, 3427*31337658SMarcel Moolenaar 3428*31337658SMarcel Moolenaar focus: { 3429*31337658SMarcel Moolenaar delegateType: "focusin", 3430*31337658SMarcel Moolenaar noBubble: true 3431*31337658SMarcel Moolenaar }, 3432*31337658SMarcel Moolenaar blur: { 3433*31337658SMarcel Moolenaar delegateType: "focusout", 3434*31337658SMarcel Moolenaar noBubble: true 3435*31337658SMarcel Moolenaar }, 3436*31337658SMarcel Moolenaar 3437*31337658SMarcel Moolenaar beforeunload: { 3438*31337658SMarcel Moolenaar setup: function( data, namespaces, eventHandle ) { 3439*31337658SMarcel Moolenaar // We only want to do this special case on windows 3440*31337658SMarcel Moolenaar if ( jQuery.isWindow( this ) ) { 3441*31337658SMarcel Moolenaar this.onbeforeunload = eventHandle; 3442*31337658SMarcel Moolenaar } 3443*31337658SMarcel Moolenaar }, 3444*31337658SMarcel Moolenaar 3445*31337658SMarcel Moolenaar teardown: function( namespaces, eventHandle ) { 3446*31337658SMarcel Moolenaar if ( this.onbeforeunload === eventHandle ) { 3447*31337658SMarcel Moolenaar this.onbeforeunload = null; 3448*31337658SMarcel Moolenaar } 3449*31337658SMarcel Moolenaar } 3450*31337658SMarcel Moolenaar } 3451*31337658SMarcel Moolenaar }, 3452*31337658SMarcel Moolenaar 3453*31337658SMarcel Moolenaar simulate: function( type, elem, event, bubble ) { 3454*31337658SMarcel Moolenaar // Piggyback on a donor event to simulate a different one. 3455*31337658SMarcel Moolenaar // Fake originalEvent to avoid donor's stopPropagation, but if the 3456*31337658SMarcel Moolenaar // simulated event prevents default then we do the same on the donor. 3457*31337658SMarcel Moolenaar var e = jQuery.extend( 3458*31337658SMarcel Moolenaar new jQuery.Event(), 3459*31337658SMarcel Moolenaar event, 3460*31337658SMarcel Moolenaar { type: type, 3461*31337658SMarcel Moolenaar isSimulated: true, 3462*31337658SMarcel Moolenaar originalEvent: {} 3463*31337658SMarcel Moolenaar } 3464*31337658SMarcel Moolenaar ); 3465*31337658SMarcel Moolenaar if ( bubble ) { 3466*31337658SMarcel Moolenaar jQuery.event.trigger( e, null, elem ); 3467*31337658SMarcel Moolenaar } else { 3468*31337658SMarcel Moolenaar jQuery.event.dispatch.call( elem, e ); 3469*31337658SMarcel Moolenaar } 3470*31337658SMarcel Moolenaar if ( e.isDefaultPrevented() ) { 3471*31337658SMarcel Moolenaar event.preventDefault(); 3472*31337658SMarcel Moolenaar } 3473*31337658SMarcel Moolenaar } 3474*31337658SMarcel Moolenaar}; 3475*31337658SMarcel Moolenaar 3476*31337658SMarcel Moolenaar// Some plugins are using, but it's undocumented/deprecated and will be removed. 3477*31337658SMarcel Moolenaar// The 1.7 special event interface should provide all the hooks needed now. 3478*31337658SMarcel MoolenaarjQuery.event.handle = jQuery.event.dispatch; 3479*31337658SMarcel Moolenaar 3480*31337658SMarcel MoolenaarjQuery.removeEvent = document.removeEventListener ? 3481*31337658SMarcel Moolenaar function( elem, type, handle ) { 3482*31337658SMarcel Moolenaar if ( elem.removeEventListener ) { 3483*31337658SMarcel Moolenaar elem.removeEventListener( type, handle, false ); 3484*31337658SMarcel Moolenaar } 3485*31337658SMarcel Moolenaar } : 3486*31337658SMarcel Moolenaar function( elem, type, handle ) { 3487*31337658SMarcel Moolenaar if ( elem.detachEvent ) { 3488*31337658SMarcel Moolenaar elem.detachEvent( "on" + type, handle ); 3489*31337658SMarcel Moolenaar } 3490*31337658SMarcel Moolenaar }; 3491*31337658SMarcel Moolenaar 3492*31337658SMarcel MoolenaarjQuery.Event = function( src, props ) { 3493*31337658SMarcel Moolenaar // Allow instantiation without the 'new' keyword 3494*31337658SMarcel Moolenaar if ( !(this instanceof jQuery.Event) ) { 3495*31337658SMarcel Moolenaar return new jQuery.Event( src, props ); 3496*31337658SMarcel Moolenaar } 3497*31337658SMarcel Moolenaar 3498*31337658SMarcel Moolenaar // Event object 3499*31337658SMarcel Moolenaar if ( src && src.type ) { 3500*31337658SMarcel Moolenaar this.originalEvent = src; 3501*31337658SMarcel Moolenaar this.type = src.type; 3502*31337658SMarcel Moolenaar 3503*31337658SMarcel Moolenaar // Events bubbling up the document may have been marked as prevented 3504*31337658SMarcel Moolenaar // by a handler lower down the tree; reflect the correct value. 3505*31337658SMarcel Moolenaar this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || 3506*31337658SMarcel Moolenaar src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; 3507*31337658SMarcel Moolenaar 3508*31337658SMarcel Moolenaar // Event type 3509*31337658SMarcel Moolenaar } else { 3510*31337658SMarcel Moolenaar this.type = src; 3511*31337658SMarcel Moolenaar } 3512*31337658SMarcel Moolenaar 3513*31337658SMarcel Moolenaar // Put explicitly provided properties onto the event object 3514*31337658SMarcel Moolenaar if ( props ) { 3515*31337658SMarcel Moolenaar jQuery.extend( this, props ); 3516*31337658SMarcel Moolenaar } 3517*31337658SMarcel Moolenaar 3518*31337658SMarcel Moolenaar // Create a timestamp if incoming event doesn't have one 3519*31337658SMarcel Moolenaar this.timeStamp = src && src.timeStamp || jQuery.now(); 3520*31337658SMarcel Moolenaar 3521*31337658SMarcel Moolenaar // Mark it as fixed 3522*31337658SMarcel Moolenaar this[ jQuery.expando ] = true; 3523*31337658SMarcel Moolenaar}; 3524*31337658SMarcel Moolenaar 3525*31337658SMarcel Moolenaarfunction returnFalse() { 3526*31337658SMarcel Moolenaar return false; 3527*31337658SMarcel Moolenaar} 3528*31337658SMarcel Moolenaarfunction returnTrue() { 3529*31337658SMarcel Moolenaar return true; 3530*31337658SMarcel Moolenaar} 3531*31337658SMarcel Moolenaar 3532*31337658SMarcel Moolenaar// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding 3533*31337658SMarcel Moolenaar// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html 3534*31337658SMarcel MoolenaarjQuery.Event.prototype = { 3535*31337658SMarcel Moolenaar preventDefault: function() { 3536*31337658SMarcel Moolenaar this.isDefaultPrevented = returnTrue; 3537*31337658SMarcel Moolenaar 3538*31337658SMarcel Moolenaar var e = this.originalEvent; 3539*31337658SMarcel Moolenaar if ( !e ) { 3540*31337658SMarcel Moolenaar return; 3541*31337658SMarcel Moolenaar } 3542*31337658SMarcel Moolenaar 3543*31337658SMarcel Moolenaar // if preventDefault exists run it on the original event 3544*31337658SMarcel Moolenaar if ( e.preventDefault ) { 3545*31337658SMarcel Moolenaar e.preventDefault(); 3546*31337658SMarcel Moolenaar 3547*31337658SMarcel Moolenaar // otherwise set the returnValue property of the original event to false (IE) 3548*31337658SMarcel Moolenaar } else { 3549*31337658SMarcel Moolenaar e.returnValue = false; 3550*31337658SMarcel Moolenaar } 3551*31337658SMarcel Moolenaar }, 3552*31337658SMarcel Moolenaar stopPropagation: function() { 3553*31337658SMarcel Moolenaar this.isPropagationStopped = returnTrue; 3554*31337658SMarcel Moolenaar 3555*31337658SMarcel Moolenaar var e = this.originalEvent; 3556*31337658SMarcel Moolenaar if ( !e ) { 3557*31337658SMarcel Moolenaar return; 3558*31337658SMarcel Moolenaar } 3559*31337658SMarcel Moolenaar // if stopPropagation exists run it on the original event 3560*31337658SMarcel Moolenaar if ( e.stopPropagation ) { 3561*31337658SMarcel Moolenaar e.stopPropagation(); 3562*31337658SMarcel Moolenaar } 3563*31337658SMarcel Moolenaar // otherwise set the cancelBubble property of the original event to true (IE) 3564*31337658SMarcel Moolenaar e.cancelBubble = true; 3565*31337658SMarcel Moolenaar }, 3566*31337658SMarcel Moolenaar stopImmediatePropagation: function() { 3567*31337658SMarcel Moolenaar this.isImmediatePropagationStopped = returnTrue; 3568*31337658SMarcel Moolenaar this.stopPropagation(); 3569*31337658SMarcel Moolenaar }, 3570*31337658SMarcel Moolenaar isDefaultPrevented: returnFalse, 3571*31337658SMarcel Moolenaar isPropagationStopped: returnFalse, 3572*31337658SMarcel Moolenaar isImmediatePropagationStopped: returnFalse 3573*31337658SMarcel Moolenaar}; 3574*31337658SMarcel Moolenaar 3575*31337658SMarcel Moolenaar// Create mouseenter/leave events using mouseover/out and event-time checks 3576*31337658SMarcel MoolenaarjQuery.each({ 3577*31337658SMarcel Moolenaar mouseenter: "mouseover", 3578*31337658SMarcel Moolenaar mouseleave: "mouseout" 3579*31337658SMarcel Moolenaar}, function( orig, fix ) { 3580*31337658SMarcel Moolenaar jQuery.event.special[ orig ] = jQuery.event.special[ fix ] = { 3581*31337658SMarcel Moolenaar delegateType: fix, 3582*31337658SMarcel Moolenaar bindType: fix, 3583*31337658SMarcel Moolenaar 3584*31337658SMarcel Moolenaar handle: function( event ) { 3585*31337658SMarcel Moolenaar var target = this, 3586*31337658SMarcel Moolenaar related = event.relatedTarget, 3587*31337658SMarcel Moolenaar handleObj = event.handleObj, 3588*31337658SMarcel Moolenaar selector = handleObj.selector, 3589*31337658SMarcel Moolenaar oldType, ret; 3590*31337658SMarcel Moolenaar 3591*31337658SMarcel Moolenaar // For a real mouseover/out, always call the handler; for 3592*31337658SMarcel Moolenaar // mousenter/leave call the handler if related is outside the target. 3593*31337658SMarcel Moolenaar // NB: No relatedTarget if the mouse left/entered the browser window 3594*31337658SMarcel Moolenaar if ( !related || handleObj.origType === event.type || (related !== target && !jQuery.contains( target, related )) ) { 3595*31337658SMarcel Moolenaar oldType = event.type; 3596*31337658SMarcel Moolenaar event.type = handleObj.origType; 3597*31337658SMarcel Moolenaar ret = handleObj.handler.apply( this, arguments ); 3598*31337658SMarcel Moolenaar event.type = oldType; 3599*31337658SMarcel Moolenaar } 3600*31337658SMarcel Moolenaar return ret; 3601*31337658SMarcel Moolenaar } 3602*31337658SMarcel Moolenaar }; 3603*31337658SMarcel Moolenaar}); 3604*31337658SMarcel Moolenaar 3605*31337658SMarcel Moolenaar// IE submit delegation 3606*31337658SMarcel Moolenaarif ( !jQuery.support.submitBubbles ) { 3607*31337658SMarcel Moolenaar 3608*31337658SMarcel Moolenaar jQuery.event.special.submit = { 3609*31337658SMarcel Moolenaar setup: function() { 3610*31337658SMarcel Moolenaar // Only need this for delegated form submit events 3611*31337658SMarcel Moolenaar if ( jQuery.nodeName( this, "form" ) ) { 3612*31337658SMarcel Moolenaar return false; 3613*31337658SMarcel Moolenaar } 3614*31337658SMarcel Moolenaar 3615*31337658SMarcel Moolenaar // Lazy-add a submit handler when a descendant form may potentially be submitted 3616*31337658SMarcel Moolenaar jQuery.event.add( this, "click._submit keypress._submit", function( e ) { 3617*31337658SMarcel Moolenaar // Node name check avoids a VML-related crash in IE (#9807) 3618*31337658SMarcel Moolenaar var elem = e.target, 3619*31337658SMarcel Moolenaar form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; 3620*31337658SMarcel Moolenaar if ( form && !form._submit_attached ) { 3621*31337658SMarcel Moolenaar jQuery.event.add( form, "submit._submit", function( event ) { 3622*31337658SMarcel Moolenaar // Form was submitted, bubble the event up the tree 3623*31337658SMarcel Moolenaar if ( this.parentNode ) { 3624*31337658SMarcel Moolenaar jQuery.event.simulate( "submit", this.parentNode, event, true ); 3625*31337658SMarcel Moolenaar } 3626*31337658SMarcel Moolenaar }); 3627*31337658SMarcel Moolenaar form._submit_attached = true; 3628*31337658SMarcel Moolenaar } 3629*31337658SMarcel Moolenaar }); 3630*31337658SMarcel Moolenaar // return undefined since we don't need an event listener 3631*31337658SMarcel Moolenaar }, 3632*31337658SMarcel Moolenaar 3633*31337658SMarcel Moolenaar teardown: function() { 3634*31337658SMarcel Moolenaar // Only need this for delegated form submit events 3635*31337658SMarcel Moolenaar if ( jQuery.nodeName( this, "form" ) ) { 3636*31337658SMarcel Moolenaar return false; 3637*31337658SMarcel Moolenaar } 3638*31337658SMarcel Moolenaar 3639*31337658SMarcel Moolenaar // Remove delegated handlers; cleanData eventually reaps submit handlers attached above 3640*31337658SMarcel Moolenaar jQuery.event.remove( this, "._submit" ); 3641*31337658SMarcel Moolenaar } 3642*31337658SMarcel Moolenaar }; 3643*31337658SMarcel Moolenaar} 3644*31337658SMarcel Moolenaar 3645*31337658SMarcel Moolenaar// IE change delegation and checkbox/radio fix 3646*31337658SMarcel Moolenaarif ( !jQuery.support.changeBubbles ) { 3647*31337658SMarcel Moolenaar 3648*31337658SMarcel Moolenaar jQuery.event.special.change = { 3649*31337658SMarcel Moolenaar 3650*31337658SMarcel Moolenaar setup: function() { 3651*31337658SMarcel Moolenaar 3652*31337658SMarcel Moolenaar if ( rformElems.test( this.nodeName ) ) { 3653*31337658SMarcel Moolenaar // IE doesn't fire change on a check/radio until blur; trigger it on click 3654*31337658SMarcel Moolenaar // after a propertychange. Eat the blur-change in special.change.handle. 3655*31337658SMarcel Moolenaar // This still fires onchange a second time for check/radio after blur. 3656*31337658SMarcel Moolenaar if ( this.type === "checkbox" || this.type === "radio" ) { 3657*31337658SMarcel Moolenaar jQuery.event.add( this, "propertychange._change", function( event ) { 3658*31337658SMarcel Moolenaar if ( event.originalEvent.propertyName === "checked" ) { 3659*31337658SMarcel Moolenaar this._just_changed = true; 3660*31337658SMarcel Moolenaar } 3661*31337658SMarcel Moolenaar }); 3662*31337658SMarcel Moolenaar jQuery.event.add( this, "click._change", function( event ) { 3663*31337658SMarcel Moolenaar if ( this._just_changed ) { 3664*31337658SMarcel Moolenaar this._just_changed = false; 3665*31337658SMarcel Moolenaar jQuery.event.simulate( "change", this, event, true ); 3666*31337658SMarcel Moolenaar } 3667*31337658SMarcel Moolenaar }); 3668*31337658SMarcel Moolenaar } 3669*31337658SMarcel Moolenaar return false; 3670*31337658SMarcel Moolenaar } 3671*31337658SMarcel Moolenaar // Delegated event; lazy-add a change handler on descendant inputs 3672*31337658SMarcel Moolenaar jQuery.event.add( this, "beforeactivate._change", function( e ) { 3673*31337658SMarcel Moolenaar var elem = e.target; 3674*31337658SMarcel Moolenaar 3675*31337658SMarcel Moolenaar if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { 3676*31337658SMarcel Moolenaar jQuery.event.add( elem, "change._change", function( event ) { 3677*31337658SMarcel Moolenaar if ( this.parentNode && !event.isSimulated ) { 3678*31337658SMarcel Moolenaar jQuery.event.simulate( "change", this.parentNode, event, true ); 3679*31337658SMarcel Moolenaar } 3680*31337658SMarcel Moolenaar }); 3681*31337658SMarcel Moolenaar elem._change_attached = true; 3682*31337658SMarcel Moolenaar } 3683*31337658SMarcel Moolenaar }); 3684*31337658SMarcel Moolenaar }, 3685*31337658SMarcel Moolenaar 3686*31337658SMarcel Moolenaar handle: function( event ) { 3687*31337658SMarcel Moolenaar var elem = event.target; 3688*31337658SMarcel Moolenaar 3689*31337658SMarcel Moolenaar // Swallow native change events from checkbox/radio, we already triggered them above 3690*31337658SMarcel Moolenaar if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { 3691*31337658SMarcel Moolenaar return event.handleObj.handler.apply( this, arguments ); 3692*31337658SMarcel Moolenaar } 3693*31337658SMarcel Moolenaar }, 3694*31337658SMarcel Moolenaar 3695*31337658SMarcel Moolenaar teardown: function() { 3696*31337658SMarcel Moolenaar jQuery.event.remove( this, "._change" ); 3697*31337658SMarcel Moolenaar 3698*31337658SMarcel Moolenaar return rformElems.test( this.nodeName ); 3699*31337658SMarcel Moolenaar } 3700*31337658SMarcel Moolenaar }; 3701*31337658SMarcel Moolenaar} 3702*31337658SMarcel Moolenaar 3703*31337658SMarcel Moolenaar// Create "bubbling" focus and blur events 3704*31337658SMarcel Moolenaarif ( !jQuery.support.focusinBubbles ) { 3705*31337658SMarcel Moolenaar jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { 3706*31337658SMarcel Moolenaar 3707*31337658SMarcel Moolenaar // Attach a single capturing handler while someone wants focusin/focusout 3708*31337658SMarcel Moolenaar var attaches = 0, 3709*31337658SMarcel Moolenaar handler = function( event ) { 3710*31337658SMarcel Moolenaar jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); 3711*31337658SMarcel Moolenaar }; 3712*31337658SMarcel Moolenaar 3713*31337658SMarcel Moolenaar jQuery.event.special[ fix ] = { 3714*31337658SMarcel Moolenaar setup: function() { 3715*31337658SMarcel Moolenaar if ( attaches++ === 0 ) { 3716*31337658SMarcel Moolenaar document.addEventListener( orig, handler, true ); 3717*31337658SMarcel Moolenaar } 3718*31337658SMarcel Moolenaar }, 3719*31337658SMarcel Moolenaar teardown: function() { 3720*31337658SMarcel Moolenaar if ( --attaches === 0 ) { 3721*31337658SMarcel Moolenaar document.removeEventListener( orig, handler, true ); 3722*31337658SMarcel Moolenaar } 3723*31337658SMarcel Moolenaar } 3724*31337658SMarcel Moolenaar }; 3725*31337658SMarcel Moolenaar }); 3726*31337658SMarcel Moolenaar} 3727*31337658SMarcel Moolenaar 3728*31337658SMarcel MoolenaarjQuery.fn.extend({ 3729*31337658SMarcel Moolenaar 3730*31337658SMarcel Moolenaar on: function( types, selector, data, fn, /*INTERNAL*/ one ) { 3731*31337658SMarcel Moolenaar var origFn, type; 3732*31337658SMarcel Moolenaar 3733*31337658SMarcel Moolenaar // Types can be a map of types/handlers 3734*31337658SMarcel Moolenaar if ( typeof types === "object" ) { 3735*31337658SMarcel Moolenaar // ( types-Object, selector, data ) 3736*31337658SMarcel Moolenaar if ( typeof selector !== "string" ) { 3737*31337658SMarcel Moolenaar // ( types-Object, data ) 3738*31337658SMarcel Moolenaar data = selector; 3739*31337658SMarcel Moolenaar selector = undefined; 3740*31337658SMarcel Moolenaar } 3741*31337658SMarcel Moolenaar for ( type in types ) { 3742*31337658SMarcel Moolenaar this.on( type, selector, data, types[ type ], one ); 3743*31337658SMarcel Moolenaar } 3744*31337658SMarcel Moolenaar return this; 3745*31337658SMarcel Moolenaar } 3746*31337658SMarcel Moolenaar 3747*31337658SMarcel Moolenaar if ( data == null && fn == null ) { 3748*31337658SMarcel Moolenaar // ( types, fn ) 3749*31337658SMarcel Moolenaar fn = selector; 3750*31337658SMarcel Moolenaar data = selector = undefined; 3751*31337658SMarcel Moolenaar } else if ( fn == null ) { 3752*31337658SMarcel Moolenaar if ( typeof selector === "string" ) { 3753*31337658SMarcel Moolenaar // ( types, selector, fn ) 3754*31337658SMarcel Moolenaar fn = data; 3755*31337658SMarcel Moolenaar data = undefined; 3756*31337658SMarcel Moolenaar } else { 3757*31337658SMarcel Moolenaar // ( types, data, fn ) 3758*31337658SMarcel Moolenaar fn = data; 3759*31337658SMarcel Moolenaar data = selector; 3760*31337658SMarcel Moolenaar selector = undefined; 3761*31337658SMarcel Moolenaar } 3762*31337658SMarcel Moolenaar } 3763*31337658SMarcel Moolenaar if ( fn === false ) { 3764*31337658SMarcel Moolenaar fn = returnFalse; 3765*31337658SMarcel Moolenaar } else if ( !fn ) { 3766*31337658SMarcel Moolenaar return this; 3767*31337658SMarcel Moolenaar } 3768*31337658SMarcel Moolenaar 3769*31337658SMarcel Moolenaar if ( one === 1 ) { 3770*31337658SMarcel Moolenaar origFn = fn; 3771*31337658SMarcel Moolenaar fn = function( event ) { 3772*31337658SMarcel Moolenaar // Can use an empty set, since event contains the info 3773*31337658SMarcel Moolenaar jQuery().off( event ); 3774*31337658SMarcel Moolenaar return origFn.apply( this, arguments ); 3775*31337658SMarcel Moolenaar }; 3776*31337658SMarcel Moolenaar // Use same guid so caller can remove using origFn 3777*31337658SMarcel Moolenaar fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); 3778*31337658SMarcel Moolenaar } 3779*31337658SMarcel Moolenaar return this.each( function() { 3780*31337658SMarcel Moolenaar jQuery.event.add( this, types, fn, data, selector ); 3781*31337658SMarcel Moolenaar }); 3782*31337658SMarcel Moolenaar }, 3783*31337658SMarcel Moolenaar one: function( types, selector, data, fn ) { 3784*31337658SMarcel Moolenaar return this.on.call( this, types, selector, data, fn, 1 ); 3785*31337658SMarcel Moolenaar }, 3786*31337658SMarcel Moolenaar off: function( types, selector, fn ) { 3787*31337658SMarcel Moolenaar if ( types && types.preventDefault && types.handleObj ) { 3788*31337658SMarcel Moolenaar // ( event ) dispatched jQuery.Event 3789*31337658SMarcel Moolenaar var handleObj = types.handleObj; 3790*31337658SMarcel Moolenaar jQuery( types.delegateTarget ).off( 3791*31337658SMarcel Moolenaar handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type, 3792*31337658SMarcel Moolenaar handleObj.selector, 3793*31337658SMarcel Moolenaar handleObj.handler 3794*31337658SMarcel Moolenaar ); 3795*31337658SMarcel Moolenaar return this; 3796*31337658SMarcel Moolenaar } 3797*31337658SMarcel Moolenaar if ( typeof types === "object" ) { 3798*31337658SMarcel Moolenaar // ( types-object [, selector] ) 3799*31337658SMarcel Moolenaar for ( var type in types ) { 3800*31337658SMarcel Moolenaar this.off( type, selector, types[ type ] ); 3801*31337658SMarcel Moolenaar } 3802*31337658SMarcel Moolenaar return this; 3803*31337658SMarcel Moolenaar } 3804*31337658SMarcel Moolenaar if ( selector === false || typeof selector === "function" ) { 3805*31337658SMarcel Moolenaar // ( types [, fn] ) 3806*31337658SMarcel Moolenaar fn = selector; 3807*31337658SMarcel Moolenaar selector = undefined; 3808*31337658SMarcel Moolenaar } 3809*31337658SMarcel Moolenaar if ( fn === false ) { 3810*31337658SMarcel Moolenaar fn = returnFalse; 3811*31337658SMarcel Moolenaar } 3812*31337658SMarcel Moolenaar return this.each(function() { 3813*31337658SMarcel Moolenaar jQuery.event.remove( this, types, fn, selector ); 3814*31337658SMarcel Moolenaar }); 3815*31337658SMarcel Moolenaar }, 3816*31337658SMarcel Moolenaar 3817*31337658SMarcel Moolenaar bind: function( types, data, fn ) { 3818*31337658SMarcel Moolenaar return this.on( types, null, data, fn ); 3819*31337658SMarcel Moolenaar }, 3820*31337658SMarcel Moolenaar unbind: function( types, fn ) { 3821*31337658SMarcel Moolenaar return this.off( types, null, fn ); 3822*31337658SMarcel Moolenaar }, 3823*31337658SMarcel Moolenaar 3824*31337658SMarcel Moolenaar live: function( types, data, fn ) { 3825*31337658SMarcel Moolenaar jQuery( this.context ).on( types, this.selector, data, fn ); 3826*31337658SMarcel Moolenaar return this; 3827*31337658SMarcel Moolenaar }, 3828*31337658SMarcel Moolenaar die: function( types, fn ) { 3829*31337658SMarcel Moolenaar jQuery( this.context ).off( types, this.selector || "**", fn ); 3830*31337658SMarcel Moolenaar return this; 3831*31337658SMarcel Moolenaar }, 3832*31337658SMarcel Moolenaar 3833*31337658SMarcel Moolenaar delegate: function( selector, types, data, fn ) { 3834*31337658SMarcel Moolenaar return this.on( types, selector, data, fn ); 3835*31337658SMarcel Moolenaar }, 3836*31337658SMarcel Moolenaar undelegate: function( selector, types, fn ) { 3837*31337658SMarcel Moolenaar // ( namespace ) or ( selector, types [, fn] ) 3838*31337658SMarcel Moolenaar return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); 3839*31337658SMarcel Moolenaar }, 3840*31337658SMarcel Moolenaar 3841*31337658SMarcel Moolenaar trigger: function( type, data ) { 3842*31337658SMarcel Moolenaar return this.each(function() { 3843*31337658SMarcel Moolenaar jQuery.event.trigger( type, data, this ); 3844*31337658SMarcel Moolenaar }); 3845*31337658SMarcel Moolenaar }, 3846*31337658SMarcel Moolenaar triggerHandler: function( type, data ) { 3847*31337658SMarcel Moolenaar if ( this[0] ) { 3848*31337658SMarcel Moolenaar return jQuery.event.trigger( type, data, this[0], true ); 3849*31337658SMarcel Moolenaar } 3850*31337658SMarcel Moolenaar }, 3851*31337658SMarcel Moolenaar 3852*31337658SMarcel Moolenaar toggle: function( fn ) { 3853*31337658SMarcel Moolenaar // Save reference to arguments for access in closure 3854*31337658SMarcel Moolenaar var args = arguments, 3855*31337658SMarcel Moolenaar guid = fn.guid || jQuery.guid++, 3856*31337658SMarcel Moolenaar i = 0, 3857*31337658SMarcel Moolenaar toggler = function( event ) { 3858*31337658SMarcel Moolenaar // Figure out which function to execute 3859*31337658SMarcel Moolenaar var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; 3860*31337658SMarcel Moolenaar jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); 3861*31337658SMarcel Moolenaar 3862*31337658SMarcel Moolenaar // Make sure that clicks stop 3863*31337658SMarcel Moolenaar event.preventDefault(); 3864*31337658SMarcel Moolenaar 3865*31337658SMarcel Moolenaar // and execute the function 3866*31337658SMarcel Moolenaar return args[ lastToggle ].apply( this, arguments ) || false; 3867*31337658SMarcel Moolenaar }; 3868*31337658SMarcel Moolenaar 3869*31337658SMarcel Moolenaar // link all the functions, so any of them can unbind this click handler 3870*31337658SMarcel Moolenaar toggler.guid = guid; 3871*31337658SMarcel Moolenaar while ( i < args.length ) { 3872*31337658SMarcel Moolenaar args[ i++ ].guid = guid; 3873*31337658SMarcel Moolenaar } 3874*31337658SMarcel Moolenaar 3875*31337658SMarcel Moolenaar return this.click( toggler ); 3876*31337658SMarcel Moolenaar }, 3877*31337658SMarcel Moolenaar 3878*31337658SMarcel Moolenaar hover: function( fnOver, fnOut ) { 3879*31337658SMarcel Moolenaar return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); 3880*31337658SMarcel Moolenaar } 3881*31337658SMarcel Moolenaar}); 3882*31337658SMarcel Moolenaar 3883*31337658SMarcel MoolenaarjQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + 3884*31337658SMarcel Moolenaar "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + 3885*31337658SMarcel Moolenaar "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { 3886*31337658SMarcel Moolenaar 3887*31337658SMarcel Moolenaar // Handle event binding 3888*31337658SMarcel Moolenaar jQuery.fn[ name ] = function( data, fn ) { 3889*31337658SMarcel Moolenaar if ( fn == null ) { 3890*31337658SMarcel Moolenaar fn = data; 3891*31337658SMarcel Moolenaar data = null; 3892*31337658SMarcel Moolenaar } 3893*31337658SMarcel Moolenaar 3894*31337658SMarcel Moolenaar return arguments.length > 0 ? 3895*31337658SMarcel Moolenaar this.bind( name, data, fn ) : 3896*31337658SMarcel Moolenaar this.trigger( name ); 3897*31337658SMarcel Moolenaar }; 3898*31337658SMarcel Moolenaar 3899*31337658SMarcel Moolenaar if ( jQuery.attrFn ) { 3900*31337658SMarcel Moolenaar jQuery.attrFn[ name ] = true; 3901*31337658SMarcel Moolenaar } 3902*31337658SMarcel Moolenaar 3903*31337658SMarcel Moolenaar if ( rkeyEvent.test( name ) ) { 3904*31337658SMarcel Moolenaar jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; 3905*31337658SMarcel Moolenaar } 3906*31337658SMarcel Moolenaar 3907*31337658SMarcel Moolenaar if ( rmouseEvent.test( name ) ) { 3908*31337658SMarcel Moolenaar jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; 3909*31337658SMarcel Moolenaar } 3910*31337658SMarcel Moolenaar}); 3911*31337658SMarcel Moolenaar 3912*31337658SMarcel Moolenaar 3913*31337658SMarcel Moolenaar 3914*31337658SMarcel Moolenaar/*! 3915*31337658SMarcel Moolenaar * Sizzle CSS Selector Engine 3916*31337658SMarcel Moolenaar * Copyright 2011, The Dojo Foundation 3917*31337658SMarcel Moolenaar * Released under the MIT, BSD, and GPL Licenses. 3918*31337658SMarcel Moolenaar * More information: http://sizzlejs.com/ 3919*31337658SMarcel Moolenaar */ 3920*31337658SMarcel Moolenaar(function(){ 3921*31337658SMarcel Moolenaar 3922*31337658SMarcel Moolenaarvar chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, 3923*31337658SMarcel Moolenaar expando = "sizcache" + (Math.random() + '').replace('.', ''), 3924*31337658SMarcel Moolenaar done = 0, 3925*31337658SMarcel Moolenaar toString = Object.prototype.toString, 3926*31337658SMarcel Moolenaar hasDuplicate = false, 3927*31337658SMarcel Moolenaar baseHasDuplicate = true, 3928*31337658SMarcel Moolenaar rBackslash = /\\/g, 3929*31337658SMarcel Moolenaar rReturn = /\r\n/g, 3930*31337658SMarcel Moolenaar rNonWord = /\W/; 3931*31337658SMarcel Moolenaar 3932*31337658SMarcel Moolenaar// Here we check if the JavaScript engine is using some sort of 3933*31337658SMarcel Moolenaar// optimization where it does not always call our comparision 3934*31337658SMarcel Moolenaar// function. If that is the case, discard the hasDuplicate value. 3935*31337658SMarcel Moolenaar// Thus far that includes Google Chrome. 3936*31337658SMarcel Moolenaar[0, 0].sort(function() { 3937*31337658SMarcel Moolenaar baseHasDuplicate = false; 3938*31337658SMarcel Moolenaar return 0; 3939*31337658SMarcel Moolenaar}); 3940*31337658SMarcel Moolenaar 3941*31337658SMarcel Moolenaarvar Sizzle = function( selector, context, results, seed ) { 3942*31337658SMarcel Moolenaar results = results || []; 3943*31337658SMarcel Moolenaar context = context || document; 3944*31337658SMarcel Moolenaar 3945*31337658SMarcel Moolenaar var origContext = context; 3946*31337658SMarcel Moolenaar 3947*31337658SMarcel Moolenaar if ( context.nodeType !== 1 && context.nodeType !== 9 ) { 3948*31337658SMarcel Moolenaar return []; 3949*31337658SMarcel Moolenaar } 3950*31337658SMarcel Moolenaar 3951*31337658SMarcel Moolenaar if ( !selector || typeof selector !== "string" ) { 3952*31337658SMarcel Moolenaar return results; 3953*31337658SMarcel Moolenaar } 3954*31337658SMarcel Moolenaar 3955*31337658SMarcel Moolenaar var m, set, checkSet, extra, ret, cur, pop, i, 3956*31337658SMarcel Moolenaar prune = true, 3957*31337658SMarcel Moolenaar contextXML = Sizzle.isXML( context ), 3958*31337658SMarcel Moolenaar parts = [], 3959*31337658SMarcel Moolenaar soFar = selector; 3960*31337658SMarcel Moolenaar 3961*31337658SMarcel Moolenaar // Reset the position of the chunker regexp (start from head) 3962*31337658SMarcel Moolenaar do { 3963*31337658SMarcel Moolenaar chunker.exec( "" ); 3964*31337658SMarcel Moolenaar m = chunker.exec( soFar ); 3965*31337658SMarcel Moolenaar 3966*31337658SMarcel Moolenaar if ( m ) { 3967*31337658SMarcel Moolenaar soFar = m[3]; 3968*31337658SMarcel Moolenaar 3969*31337658SMarcel Moolenaar parts.push( m[1] ); 3970*31337658SMarcel Moolenaar 3971*31337658SMarcel Moolenaar if ( m[2] ) { 3972*31337658SMarcel Moolenaar extra = m[3]; 3973*31337658SMarcel Moolenaar break; 3974*31337658SMarcel Moolenaar } 3975*31337658SMarcel Moolenaar } 3976*31337658SMarcel Moolenaar } while ( m ); 3977*31337658SMarcel Moolenaar 3978*31337658SMarcel Moolenaar if ( parts.length > 1 && origPOS.exec( selector ) ) { 3979*31337658SMarcel Moolenaar 3980*31337658SMarcel Moolenaar if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { 3981*31337658SMarcel Moolenaar set = posProcess( parts[0] + parts[1], context, seed ); 3982*31337658SMarcel Moolenaar 3983*31337658SMarcel Moolenaar } else { 3984*31337658SMarcel Moolenaar set = Expr.relative[ parts[0] ] ? 3985*31337658SMarcel Moolenaar [ context ] : 3986*31337658SMarcel Moolenaar Sizzle( parts.shift(), context ); 3987*31337658SMarcel Moolenaar 3988*31337658SMarcel Moolenaar while ( parts.length ) { 3989*31337658SMarcel Moolenaar selector = parts.shift(); 3990*31337658SMarcel Moolenaar 3991*31337658SMarcel Moolenaar if ( Expr.relative[ selector ] ) { 3992*31337658SMarcel Moolenaar selector += parts.shift(); 3993*31337658SMarcel Moolenaar } 3994*31337658SMarcel Moolenaar 3995*31337658SMarcel Moolenaar set = posProcess( selector, set, seed ); 3996*31337658SMarcel Moolenaar } 3997*31337658SMarcel Moolenaar } 3998*31337658SMarcel Moolenaar 3999*31337658SMarcel Moolenaar } else { 4000*31337658SMarcel Moolenaar // Take a shortcut and set the context if the root selector is an ID 4001*31337658SMarcel Moolenaar // (but not if it'll be faster if the inner selector is an ID) 4002*31337658SMarcel Moolenaar if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && 4003*31337658SMarcel Moolenaar Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { 4004*31337658SMarcel Moolenaar 4005*31337658SMarcel Moolenaar ret = Sizzle.find( parts.shift(), context, contextXML ); 4006*31337658SMarcel Moolenaar context = ret.expr ? 4007*31337658SMarcel Moolenaar Sizzle.filter( ret.expr, ret.set )[0] : 4008*31337658SMarcel Moolenaar ret.set[0]; 4009*31337658SMarcel Moolenaar } 4010*31337658SMarcel Moolenaar 4011*31337658SMarcel Moolenaar if ( context ) { 4012*31337658SMarcel Moolenaar ret = seed ? 4013*31337658SMarcel Moolenaar { expr: parts.pop(), set: makeArray(seed) } : 4014*31337658SMarcel Moolenaar Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); 4015*31337658SMarcel Moolenaar 4016*31337658SMarcel Moolenaar set = ret.expr ? 4017*31337658SMarcel Moolenaar Sizzle.filter( ret.expr, ret.set ) : 4018*31337658SMarcel Moolenaar ret.set; 4019*31337658SMarcel Moolenaar 4020*31337658SMarcel Moolenaar if ( parts.length > 0 ) { 4021*31337658SMarcel Moolenaar checkSet = makeArray( set ); 4022*31337658SMarcel Moolenaar 4023*31337658SMarcel Moolenaar } else { 4024*31337658SMarcel Moolenaar prune = false; 4025*31337658SMarcel Moolenaar } 4026*31337658SMarcel Moolenaar 4027*31337658SMarcel Moolenaar while ( parts.length ) { 4028*31337658SMarcel Moolenaar cur = parts.pop(); 4029*31337658SMarcel Moolenaar pop = cur; 4030*31337658SMarcel Moolenaar 4031*31337658SMarcel Moolenaar if ( !Expr.relative[ cur ] ) { 4032*31337658SMarcel Moolenaar cur = ""; 4033*31337658SMarcel Moolenaar } else { 4034*31337658SMarcel Moolenaar pop = parts.pop(); 4035*31337658SMarcel Moolenaar } 4036*31337658SMarcel Moolenaar 4037*31337658SMarcel Moolenaar if ( pop == null ) { 4038*31337658SMarcel Moolenaar pop = context; 4039*31337658SMarcel Moolenaar } 4040*31337658SMarcel Moolenaar 4041*31337658SMarcel Moolenaar Expr.relative[ cur ]( checkSet, pop, contextXML ); 4042*31337658SMarcel Moolenaar } 4043*31337658SMarcel Moolenaar 4044*31337658SMarcel Moolenaar } else { 4045*31337658SMarcel Moolenaar checkSet = parts = []; 4046*31337658SMarcel Moolenaar } 4047*31337658SMarcel Moolenaar } 4048*31337658SMarcel Moolenaar 4049*31337658SMarcel Moolenaar if ( !checkSet ) { 4050*31337658SMarcel Moolenaar checkSet = set; 4051*31337658SMarcel Moolenaar } 4052*31337658SMarcel Moolenaar 4053*31337658SMarcel Moolenaar if ( !checkSet ) { 4054*31337658SMarcel Moolenaar Sizzle.error( cur || selector ); 4055*31337658SMarcel Moolenaar } 4056*31337658SMarcel Moolenaar 4057*31337658SMarcel Moolenaar if ( toString.call(checkSet) === "[object Array]" ) { 4058*31337658SMarcel Moolenaar if ( !prune ) { 4059*31337658SMarcel Moolenaar results.push.apply( results, checkSet ); 4060*31337658SMarcel Moolenaar 4061*31337658SMarcel Moolenaar } else if ( context && context.nodeType === 1 ) { 4062*31337658SMarcel Moolenaar for ( i = 0; checkSet[i] != null; i++ ) { 4063*31337658SMarcel Moolenaar if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { 4064*31337658SMarcel Moolenaar results.push( set[i] ); 4065*31337658SMarcel Moolenaar } 4066*31337658SMarcel Moolenaar } 4067*31337658SMarcel Moolenaar 4068*31337658SMarcel Moolenaar } else { 4069*31337658SMarcel Moolenaar for ( i = 0; checkSet[i] != null; i++ ) { 4070*31337658SMarcel Moolenaar if ( checkSet[i] && checkSet[i].nodeType === 1 ) { 4071*31337658SMarcel Moolenaar results.push( set[i] ); 4072*31337658SMarcel Moolenaar } 4073*31337658SMarcel Moolenaar } 4074*31337658SMarcel Moolenaar } 4075*31337658SMarcel Moolenaar 4076*31337658SMarcel Moolenaar } else { 4077*31337658SMarcel Moolenaar makeArray( checkSet, results ); 4078*31337658SMarcel Moolenaar } 4079*31337658SMarcel Moolenaar 4080*31337658SMarcel Moolenaar if ( extra ) { 4081*31337658SMarcel Moolenaar Sizzle( extra, origContext, results, seed ); 4082*31337658SMarcel Moolenaar Sizzle.uniqueSort( results ); 4083*31337658SMarcel Moolenaar } 4084*31337658SMarcel Moolenaar 4085*31337658SMarcel Moolenaar return results; 4086*31337658SMarcel Moolenaar}; 4087*31337658SMarcel Moolenaar 4088*31337658SMarcel MoolenaarSizzle.uniqueSort = function( results ) { 4089*31337658SMarcel Moolenaar if ( sortOrder ) { 4090*31337658SMarcel Moolenaar hasDuplicate = baseHasDuplicate; 4091*31337658SMarcel Moolenaar results.sort( sortOrder ); 4092*31337658SMarcel Moolenaar 4093*31337658SMarcel Moolenaar if ( hasDuplicate ) { 4094*31337658SMarcel Moolenaar for ( var i = 1; i < results.length; i++ ) { 4095*31337658SMarcel Moolenaar if ( results[i] === results[ i - 1 ] ) { 4096*31337658SMarcel Moolenaar results.splice( i--, 1 ); 4097*31337658SMarcel Moolenaar } 4098*31337658SMarcel Moolenaar } 4099*31337658SMarcel Moolenaar } 4100*31337658SMarcel Moolenaar } 4101*31337658SMarcel Moolenaar 4102*31337658SMarcel Moolenaar return results; 4103*31337658SMarcel Moolenaar}; 4104*31337658SMarcel Moolenaar 4105*31337658SMarcel MoolenaarSizzle.matches = function( expr, set ) { 4106*31337658SMarcel Moolenaar return Sizzle( expr, null, null, set ); 4107*31337658SMarcel Moolenaar}; 4108*31337658SMarcel Moolenaar 4109*31337658SMarcel MoolenaarSizzle.matchesSelector = function( node, expr ) { 4110*31337658SMarcel Moolenaar return Sizzle( expr, null, null, [node] ).length > 0; 4111*31337658SMarcel Moolenaar}; 4112*31337658SMarcel Moolenaar 4113*31337658SMarcel MoolenaarSizzle.find = function( expr, context, isXML ) { 4114*31337658SMarcel Moolenaar var set, i, len, match, type, left; 4115*31337658SMarcel Moolenaar 4116*31337658SMarcel Moolenaar if ( !expr ) { 4117*31337658SMarcel Moolenaar return []; 4118*31337658SMarcel Moolenaar } 4119*31337658SMarcel Moolenaar 4120*31337658SMarcel Moolenaar for ( i = 0, len = Expr.order.length; i < len; i++ ) { 4121*31337658SMarcel Moolenaar type = Expr.order[i]; 4122*31337658SMarcel Moolenaar 4123*31337658SMarcel Moolenaar if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { 4124*31337658SMarcel Moolenaar left = match[1]; 4125*31337658SMarcel Moolenaar match.splice( 1, 1 ); 4126*31337658SMarcel Moolenaar 4127*31337658SMarcel Moolenaar if ( left.substr( left.length - 1 ) !== "\\" ) { 4128*31337658SMarcel Moolenaar match[1] = (match[1] || "").replace( rBackslash, "" ); 4129*31337658SMarcel Moolenaar set = Expr.find[ type ]( match, context, isXML ); 4130*31337658SMarcel Moolenaar 4131*31337658SMarcel Moolenaar if ( set != null ) { 4132*31337658SMarcel Moolenaar expr = expr.replace( Expr.match[ type ], "" ); 4133*31337658SMarcel Moolenaar break; 4134*31337658SMarcel Moolenaar } 4135*31337658SMarcel Moolenaar } 4136*31337658SMarcel Moolenaar } 4137*31337658SMarcel Moolenaar } 4138*31337658SMarcel Moolenaar 4139*31337658SMarcel Moolenaar if ( !set ) { 4140*31337658SMarcel Moolenaar set = typeof context.getElementsByTagName !== "undefined" ? 4141*31337658SMarcel Moolenaar context.getElementsByTagName( "*" ) : 4142*31337658SMarcel Moolenaar []; 4143*31337658SMarcel Moolenaar } 4144*31337658SMarcel Moolenaar 4145*31337658SMarcel Moolenaar return { set: set, expr: expr }; 4146*31337658SMarcel Moolenaar}; 4147*31337658SMarcel Moolenaar 4148*31337658SMarcel MoolenaarSizzle.filter = function( expr, set, inplace, not ) { 4149*31337658SMarcel Moolenaar var match, anyFound, 4150*31337658SMarcel Moolenaar type, found, item, filter, left, 4151*31337658SMarcel Moolenaar i, pass, 4152*31337658SMarcel Moolenaar old = expr, 4153*31337658SMarcel Moolenaar result = [], 4154*31337658SMarcel Moolenaar curLoop = set, 4155*31337658SMarcel Moolenaar isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); 4156*31337658SMarcel Moolenaar 4157*31337658SMarcel Moolenaar while ( expr && set.length ) { 4158*31337658SMarcel Moolenaar for ( type in Expr.filter ) { 4159*31337658SMarcel Moolenaar if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { 4160*31337658SMarcel Moolenaar filter = Expr.filter[ type ]; 4161*31337658SMarcel Moolenaar left = match[1]; 4162*31337658SMarcel Moolenaar 4163*31337658SMarcel Moolenaar anyFound = false; 4164*31337658SMarcel Moolenaar 4165*31337658SMarcel Moolenaar match.splice(1,1); 4166*31337658SMarcel Moolenaar 4167*31337658SMarcel Moolenaar if ( left.substr( left.length - 1 ) === "\\" ) { 4168*31337658SMarcel Moolenaar continue; 4169*31337658SMarcel Moolenaar } 4170*31337658SMarcel Moolenaar 4171*31337658SMarcel Moolenaar if ( curLoop === result ) { 4172*31337658SMarcel Moolenaar result = []; 4173*31337658SMarcel Moolenaar } 4174*31337658SMarcel Moolenaar 4175*31337658SMarcel Moolenaar if ( Expr.preFilter[ type ] ) { 4176*31337658SMarcel Moolenaar match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); 4177*31337658SMarcel Moolenaar 4178*31337658SMarcel Moolenaar if ( !match ) { 4179*31337658SMarcel Moolenaar anyFound = found = true; 4180*31337658SMarcel Moolenaar 4181*31337658SMarcel Moolenaar } else if ( match === true ) { 4182*31337658SMarcel Moolenaar continue; 4183*31337658SMarcel Moolenaar } 4184*31337658SMarcel Moolenaar } 4185*31337658SMarcel Moolenaar 4186*31337658SMarcel Moolenaar if ( match ) { 4187*31337658SMarcel Moolenaar for ( i = 0; (item = curLoop[i]) != null; i++ ) { 4188*31337658SMarcel Moolenaar if ( item ) { 4189*31337658SMarcel Moolenaar found = filter( item, match, i, curLoop ); 4190*31337658SMarcel Moolenaar pass = not ^ found; 4191*31337658SMarcel Moolenaar 4192*31337658SMarcel Moolenaar if ( inplace && found != null ) { 4193*31337658SMarcel Moolenaar if ( pass ) { 4194*31337658SMarcel Moolenaar anyFound = true; 4195*31337658SMarcel Moolenaar 4196*31337658SMarcel Moolenaar } else { 4197*31337658SMarcel Moolenaar curLoop[i] = false; 4198*31337658SMarcel Moolenaar } 4199*31337658SMarcel Moolenaar 4200*31337658SMarcel Moolenaar } else if ( pass ) { 4201*31337658SMarcel Moolenaar result.push( item ); 4202*31337658SMarcel Moolenaar anyFound = true; 4203*31337658SMarcel Moolenaar } 4204*31337658SMarcel Moolenaar } 4205*31337658SMarcel Moolenaar } 4206*31337658SMarcel Moolenaar } 4207*31337658SMarcel Moolenaar 4208*31337658SMarcel Moolenaar if ( found !== undefined ) { 4209*31337658SMarcel Moolenaar if ( !inplace ) { 4210*31337658SMarcel Moolenaar curLoop = result; 4211*31337658SMarcel Moolenaar } 4212*31337658SMarcel Moolenaar 4213*31337658SMarcel Moolenaar expr = expr.replace( Expr.match[ type ], "" ); 4214*31337658SMarcel Moolenaar 4215*31337658SMarcel Moolenaar if ( !anyFound ) { 4216*31337658SMarcel Moolenaar return []; 4217*31337658SMarcel Moolenaar } 4218*31337658SMarcel Moolenaar 4219*31337658SMarcel Moolenaar break; 4220*31337658SMarcel Moolenaar } 4221*31337658SMarcel Moolenaar } 4222*31337658SMarcel Moolenaar } 4223*31337658SMarcel Moolenaar 4224*31337658SMarcel Moolenaar // Improper expression 4225*31337658SMarcel Moolenaar if ( expr === old ) { 4226*31337658SMarcel Moolenaar if ( anyFound == null ) { 4227*31337658SMarcel Moolenaar Sizzle.error( expr ); 4228*31337658SMarcel Moolenaar 4229*31337658SMarcel Moolenaar } else { 4230*31337658SMarcel Moolenaar break; 4231*31337658SMarcel Moolenaar } 4232*31337658SMarcel Moolenaar } 4233*31337658SMarcel Moolenaar 4234*31337658SMarcel Moolenaar old = expr; 4235*31337658SMarcel Moolenaar } 4236*31337658SMarcel Moolenaar 4237*31337658SMarcel Moolenaar return curLoop; 4238*31337658SMarcel Moolenaar}; 4239*31337658SMarcel Moolenaar 4240*31337658SMarcel MoolenaarSizzle.error = function( msg ) { 4241*31337658SMarcel Moolenaar throw "Syntax error, unrecognized expression: " + msg; 4242*31337658SMarcel Moolenaar}; 4243*31337658SMarcel Moolenaar 4244*31337658SMarcel Moolenaar/** 4245*31337658SMarcel Moolenaar * Utility function for retreiving the text value of an array of DOM nodes 4246*31337658SMarcel Moolenaar * @param {Array|Element} elem 4247*31337658SMarcel Moolenaar */ 4248*31337658SMarcel Moolenaarvar getText = Sizzle.getText = function( elem ) { 4249*31337658SMarcel Moolenaar var i, node, 4250*31337658SMarcel Moolenaar nodeType = elem.nodeType, 4251*31337658SMarcel Moolenaar ret = ""; 4252*31337658SMarcel Moolenaar 4253*31337658SMarcel Moolenaar if ( nodeType ) { 4254*31337658SMarcel Moolenaar if ( nodeType === 1 ) { 4255*31337658SMarcel Moolenaar // Use textContent || innerText for elements 4256*31337658SMarcel Moolenaar if ( typeof elem.textContent === 'string' ) { 4257*31337658SMarcel Moolenaar return elem.textContent; 4258*31337658SMarcel Moolenaar } else if ( typeof elem.innerText === 'string' ) { 4259*31337658SMarcel Moolenaar // Replace IE's carriage returns 4260*31337658SMarcel Moolenaar return elem.innerText.replace( rReturn, '' ); 4261*31337658SMarcel Moolenaar } else { 4262*31337658SMarcel Moolenaar // Traverse it's children 4263*31337658SMarcel Moolenaar for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { 4264*31337658SMarcel Moolenaar ret += getText( elem ); 4265*31337658SMarcel Moolenaar } 4266*31337658SMarcel Moolenaar } 4267*31337658SMarcel Moolenaar } else if ( nodeType === 3 || nodeType === 4 ) { 4268*31337658SMarcel Moolenaar return elem.nodeValue; 4269*31337658SMarcel Moolenaar } 4270*31337658SMarcel Moolenaar } else { 4271*31337658SMarcel Moolenaar 4272*31337658SMarcel Moolenaar // If no nodeType, this is expected to be an array 4273*31337658SMarcel Moolenaar for ( i = 0; (node = elem[i]); i++ ) { 4274*31337658SMarcel Moolenaar // Do not traverse comment nodes 4275*31337658SMarcel Moolenaar if ( node.nodeType !== 8 ) { 4276*31337658SMarcel Moolenaar ret += getText( node ); 4277*31337658SMarcel Moolenaar } 4278*31337658SMarcel Moolenaar } 4279*31337658SMarcel Moolenaar } 4280*31337658SMarcel Moolenaar return ret; 4281*31337658SMarcel Moolenaar}; 4282*31337658SMarcel Moolenaar 4283*31337658SMarcel Moolenaarvar Expr = Sizzle.selectors = { 4284*31337658SMarcel Moolenaar order: [ "ID", "NAME", "TAG" ], 4285*31337658SMarcel Moolenaar 4286*31337658SMarcel Moolenaar match: { 4287*31337658SMarcel Moolenaar ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, 4288*31337658SMarcel Moolenaar CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, 4289*31337658SMarcel Moolenaar NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, 4290*31337658SMarcel Moolenaar ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, 4291*31337658SMarcel Moolenaar TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, 4292*31337658SMarcel Moolenaar CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, 4293*31337658SMarcel Moolenaar POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, 4294*31337658SMarcel Moolenaar PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ 4295*31337658SMarcel Moolenaar }, 4296*31337658SMarcel Moolenaar 4297*31337658SMarcel Moolenaar leftMatch: {}, 4298*31337658SMarcel Moolenaar 4299*31337658SMarcel Moolenaar attrMap: { 4300*31337658SMarcel Moolenaar "class": "className", 4301*31337658SMarcel Moolenaar "for": "htmlFor" 4302*31337658SMarcel Moolenaar }, 4303*31337658SMarcel Moolenaar 4304*31337658SMarcel Moolenaar attrHandle: { 4305*31337658SMarcel Moolenaar href: function( elem ) { 4306*31337658SMarcel Moolenaar return elem.getAttribute( "href" ); 4307*31337658SMarcel Moolenaar }, 4308*31337658SMarcel Moolenaar type: function( elem ) { 4309*31337658SMarcel Moolenaar return elem.getAttribute( "type" ); 4310*31337658SMarcel Moolenaar } 4311*31337658SMarcel Moolenaar }, 4312*31337658SMarcel Moolenaar 4313*31337658SMarcel Moolenaar relative: { 4314*31337658SMarcel Moolenaar "+": function(checkSet, part){ 4315*31337658SMarcel Moolenaar var isPartStr = typeof part === "string", 4316*31337658SMarcel Moolenaar isTag = isPartStr && !rNonWord.test( part ), 4317*31337658SMarcel Moolenaar isPartStrNotTag = isPartStr && !isTag; 4318*31337658SMarcel Moolenaar 4319*31337658SMarcel Moolenaar if ( isTag ) { 4320*31337658SMarcel Moolenaar part = part.toLowerCase(); 4321*31337658SMarcel Moolenaar } 4322*31337658SMarcel Moolenaar 4323*31337658SMarcel Moolenaar for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { 4324*31337658SMarcel Moolenaar if ( (elem = checkSet[i]) ) { 4325*31337658SMarcel Moolenaar while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} 4326*31337658SMarcel Moolenaar 4327*31337658SMarcel Moolenaar checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? 4328*31337658SMarcel Moolenaar elem || false : 4329*31337658SMarcel Moolenaar elem === part; 4330*31337658SMarcel Moolenaar } 4331*31337658SMarcel Moolenaar } 4332*31337658SMarcel Moolenaar 4333*31337658SMarcel Moolenaar if ( isPartStrNotTag ) { 4334*31337658SMarcel Moolenaar Sizzle.filter( part, checkSet, true ); 4335*31337658SMarcel Moolenaar } 4336*31337658SMarcel Moolenaar }, 4337*31337658SMarcel Moolenaar 4338*31337658SMarcel Moolenaar ">": function( checkSet, part ) { 4339*31337658SMarcel Moolenaar var elem, 4340*31337658SMarcel Moolenaar isPartStr = typeof part === "string", 4341*31337658SMarcel Moolenaar i = 0, 4342*31337658SMarcel Moolenaar l = checkSet.length; 4343*31337658SMarcel Moolenaar 4344*31337658SMarcel Moolenaar if ( isPartStr && !rNonWord.test( part ) ) { 4345*31337658SMarcel Moolenaar part = part.toLowerCase(); 4346*31337658SMarcel Moolenaar 4347*31337658SMarcel Moolenaar for ( ; i < l; i++ ) { 4348*31337658SMarcel Moolenaar elem = checkSet[i]; 4349*31337658SMarcel Moolenaar 4350*31337658SMarcel Moolenaar if ( elem ) { 4351*31337658SMarcel Moolenaar var parent = elem.parentNode; 4352*31337658SMarcel Moolenaar checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; 4353*31337658SMarcel Moolenaar } 4354*31337658SMarcel Moolenaar } 4355*31337658SMarcel Moolenaar 4356*31337658SMarcel Moolenaar } else { 4357*31337658SMarcel Moolenaar for ( ; i < l; i++ ) { 4358*31337658SMarcel Moolenaar elem = checkSet[i]; 4359*31337658SMarcel Moolenaar 4360*31337658SMarcel Moolenaar if ( elem ) { 4361*31337658SMarcel Moolenaar checkSet[i] = isPartStr ? 4362*31337658SMarcel Moolenaar elem.parentNode : 4363*31337658SMarcel Moolenaar elem.parentNode === part; 4364*31337658SMarcel Moolenaar } 4365*31337658SMarcel Moolenaar } 4366*31337658SMarcel Moolenaar 4367*31337658SMarcel Moolenaar if ( isPartStr ) { 4368*31337658SMarcel Moolenaar Sizzle.filter( part, checkSet, true ); 4369*31337658SMarcel Moolenaar } 4370*31337658SMarcel Moolenaar } 4371*31337658SMarcel Moolenaar }, 4372*31337658SMarcel Moolenaar 4373*31337658SMarcel Moolenaar "": function(checkSet, part, isXML){ 4374*31337658SMarcel Moolenaar var nodeCheck, 4375*31337658SMarcel Moolenaar doneName = done++, 4376*31337658SMarcel Moolenaar checkFn = dirCheck; 4377*31337658SMarcel Moolenaar 4378*31337658SMarcel Moolenaar if ( typeof part === "string" && !rNonWord.test( part ) ) { 4379*31337658SMarcel Moolenaar part = part.toLowerCase(); 4380*31337658SMarcel Moolenaar nodeCheck = part; 4381*31337658SMarcel Moolenaar checkFn = dirNodeCheck; 4382*31337658SMarcel Moolenaar } 4383*31337658SMarcel Moolenaar 4384*31337658SMarcel Moolenaar checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); 4385*31337658SMarcel Moolenaar }, 4386*31337658SMarcel Moolenaar 4387*31337658SMarcel Moolenaar "~": function( checkSet, part, isXML ) { 4388*31337658SMarcel Moolenaar var nodeCheck, 4389*31337658SMarcel Moolenaar doneName = done++, 4390*31337658SMarcel Moolenaar checkFn = dirCheck; 4391*31337658SMarcel Moolenaar 4392*31337658SMarcel Moolenaar if ( typeof part === "string" && !rNonWord.test( part ) ) { 4393*31337658SMarcel Moolenaar part = part.toLowerCase(); 4394*31337658SMarcel Moolenaar nodeCheck = part; 4395*31337658SMarcel Moolenaar checkFn = dirNodeCheck; 4396*31337658SMarcel Moolenaar } 4397*31337658SMarcel Moolenaar 4398*31337658SMarcel Moolenaar checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); 4399*31337658SMarcel Moolenaar } 4400*31337658SMarcel Moolenaar }, 4401*31337658SMarcel Moolenaar 4402*31337658SMarcel Moolenaar find: { 4403*31337658SMarcel Moolenaar ID: function( match, context, isXML ) { 4404*31337658SMarcel Moolenaar if ( typeof context.getElementById !== "undefined" && !isXML ) { 4405*31337658SMarcel Moolenaar var m = context.getElementById(match[1]); 4406*31337658SMarcel Moolenaar // Check parentNode to catch when Blackberry 4.6 returns 4407*31337658SMarcel Moolenaar // nodes that are no longer in the document #6963 4408*31337658SMarcel Moolenaar return m && m.parentNode ? [m] : []; 4409*31337658SMarcel Moolenaar } 4410*31337658SMarcel Moolenaar }, 4411*31337658SMarcel Moolenaar 4412*31337658SMarcel Moolenaar NAME: function( match, context ) { 4413*31337658SMarcel Moolenaar if ( typeof context.getElementsByName !== "undefined" ) { 4414*31337658SMarcel Moolenaar var ret = [], 4415*31337658SMarcel Moolenaar results = context.getElementsByName( match[1] ); 4416*31337658SMarcel Moolenaar 4417*31337658SMarcel Moolenaar for ( var i = 0, l = results.length; i < l; i++ ) { 4418*31337658SMarcel Moolenaar if ( results[i].getAttribute("name") === match[1] ) { 4419*31337658SMarcel Moolenaar ret.push( results[i] ); 4420*31337658SMarcel Moolenaar } 4421*31337658SMarcel Moolenaar } 4422*31337658SMarcel Moolenaar 4423*31337658SMarcel Moolenaar return ret.length === 0 ? null : ret; 4424*31337658SMarcel Moolenaar } 4425*31337658SMarcel Moolenaar }, 4426*31337658SMarcel Moolenaar 4427*31337658SMarcel Moolenaar TAG: function( match, context ) { 4428*31337658SMarcel Moolenaar if ( typeof context.getElementsByTagName !== "undefined" ) { 4429*31337658SMarcel Moolenaar return context.getElementsByTagName( match[1] ); 4430*31337658SMarcel Moolenaar } 4431*31337658SMarcel Moolenaar } 4432*31337658SMarcel Moolenaar }, 4433*31337658SMarcel Moolenaar preFilter: { 4434*31337658SMarcel Moolenaar CLASS: function( match, curLoop, inplace, result, not, isXML ) { 4435*31337658SMarcel Moolenaar match = " " + match[1].replace( rBackslash, "" ) + " "; 4436*31337658SMarcel Moolenaar 4437*31337658SMarcel Moolenaar if ( isXML ) { 4438*31337658SMarcel Moolenaar return match; 4439*31337658SMarcel Moolenaar } 4440*31337658SMarcel Moolenaar 4441*31337658SMarcel Moolenaar for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { 4442*31337658SMarcel Moolenaar if ( elem ) { 4443*31337658SMarcel Moolenaar if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { 4444*31337658SMarcel Moolenaar if ( !inplace ) { 4445*31337658SMarcel Moolenaar result.push( elem ); 4446*31337658SMarcel Moolenaar } 4447*31337658SMarcel Moolenaar 4448*31337658SMarcel Moolenaar } else if ( inplace ) { 4449*31337658SMarcel Moolenaar curLoop[i] = false; 4450*31337658SMarcel Moolenaar } 4451*31337658SMarcel Moolenaar } 4452*31337658SMarcel Moolenaar } 4453*31337658SMarcel Moolenaar 4454*31337658SMarcel Moolenaar return false; 4455*31337658SMarcel Moolenaar }, 4456*31337658SMarcel Moolenaar 4457*31337658SMarcel Moolenaar ID: function( match ) { 4458*31337658SMarcel Moolenaar return match[1].replace( rBackslash, "" ); 4459*31337658SMarcel Moolenaar }, 4460*31337658SMarcel Moolenaar 4461*31337658SMarcel Moolenaar TAG: function( match, curLoop ) { 4462*31337658SMarcel Moolenaar return match[1].replace( rBackslash, "" ).toLowerCase(); 4463*31337658SMarcel Moolenaar }, 4464*31337658SMarcel Moolenaar 4465*31337658SMarcel Moolenaar CHILD: function( match ) { 4466*31337658SMarcel Moolenaar if ( match[1] === "nth" ) { 4467*31337658SMarcel Moolenaar if ( !match[2] ) { 4468*31337658SMarcel Moolenaar Sizzle.error( match[0] ); 4469*31337658SMarcel Moolenaar } 4470*31337658SMarcel Moolenaar 4471*31337658SMarcel Moolenaar match[2] = match[2].replace(/^\+|\s*/g, ''); 4472*31337658SMarcel Moolenaar 4473*31337658SMarcel Moolenaar // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' 4474*31337658SMarcel Moolenaar var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( 4475*31337658SMarcel Moolenaar match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || 4476*31337658SMarcel Moolenaar !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); 4477*31337658SMarcel Moolenaar 4478*31337658SMarcel Moolenaar // calculate the numbers (first)n+(last) including if they are negative 4479*31337658SMarcel Moolenaar match[2] = (test[1] + (test[2] || 1)) - 0; 4480*31337658SMarcel Moolenaar match[3] = test[3] - 0; 4481*31337658SMarcel Moolenaar } 4482*31337658SMarcel Moolenaar else if ( match[2] ) { 4483*31337658SMarcel Moolenaar Sizzle.error( match[0] ); 4484*31337658SMarcel Moolenaar } 4485*31337658SMarcel Moolenaar 4486*31337658SMarcel Moolenaar // TODO: Move to normal caching system 4487*31337658SMarcel Moolenaar match[0] = done++; 4488*31337658SMarcel Moolenaar 4489*31337658SMarcel Moolenaar return match; 4490*31337658SMarcel Moolenaar }, 4491*31337658SMarcel Moolenaar 4492*31337658SMarcel Moolenaar ATTR: function( match, curLoop, inplace, result, not, isXML ) { 4493*31337658SMarcel Moolenaar var name = match[1] = match[1].replace( rBackslash, "" ); 4494*31337658SMarcel Moolenaar 4495*31337658SMarcel Moolenaar if ( !isXML && Expr.attrMap[name] ) { 4496*31337658SMarcel Moolenaar match[1] = Expr.attrMap[name]; 4497*31337658SMarcel Moolenaar } 4498*31337658SMarcel Moolenaar 4499*31337658SMarcel Moolenaar // Handle if an un-quoted value was used 4500*31337658SMarcel Moolenaar match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); 4501*31337658SMarcel Moolenaar 4502*31337658SMarcel Moolenaar if ( match[2] === "~=" ) { 4503*31337658SMarcel Moolenaar match[4] = " " + match[4] + " "; 4504*31337658SMarcel Moolenaar } 4505*31337658SMarcel Moolenaar 4506*31337658SMarcel Moolenaar return match; 4507*31337658SMarcel Moolenaar }, 4508*31337658SMarcel Moolenaar 4509*31337658SMarcel Moolenaar PSEUDO: function( match, curLoop, inplace, result, not ) { 4510*31337658SMarcel Moolenaar if ( match[1] === "not" ) { 4511*31337658SMarcel Moolenaar // If we're dealing with a complex expression, or a simple one 4512*31337658SMarcel Moolenaar if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { 4513*31337658SMarcel Moolenaar match[3] = Sizzle(match[3], null, null, curLoop); 4514*31337658SMarcel Moolenaar 4515*31337658SMarcel Moolenaar } else { 4516*31337658SMarcel Moolenaar var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); 4517*31337658SMarcel Moolenaar 4518*31337658SMarcel Moolenaar if ( !inplace ) { 4519*31337658SMarcel Moolenaar result.push.apply( result, ret ); 4520*31337658SMarcel Moolenaar } 4521*31337658SMarcel Moolenaar 4522*31337658SMarcel Moolenaar return false; 4523*31337658SMarcel Moolenaar } 4524*31337658SMarcel Moolenaar 4525*31337658SMarcel Moolenaar } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { 4526*31337658SMarcel Moolenaar return true; 4527*31337658SMarcel Moolenaar } 4528*31337658SMarcel Moolenaar 4529*31337658SMarcel Moolenaar return match; 4530*31337658SMarcel Moolenaar }, 4531*31337658SMarcel Moolenaar 4532*31337658SMarcel Moolenaar POS: function( match ) { 4533*31337658SMarcel Moolenaar match.unshift( true ); 4534*31337658SMarcel Moolenaar 4535*31337658SMarcel Moolenaar return match; 4536*31337658SMarcel Moolenaar } 4537*31337658SMarcel Moolenaar }, 4538*31337658SMarcel Moolenaar 4539*31337658SMarcel Moolenaar filters: { 4540*31337658SMarcel Moolenaar enabled: function( elem ) { 4541*31337658SMarcel Moolenaar return elem.disabled === false && elem.type !== "hidden"; 4542*31337658SMarcel Moolenaar }, 4543*31337658SMarcel Moolenaar 4544*31337658SMarcel Moolenaar disabled: function( elem ) { 4545*31337658SMarcel Moolenaar return elem.disabled === true; 4546*31337658SMarcel Moolenaar }, 4547*31337658SMarcel Moolenaar 4548*31337658SMarcel Moolenaar checked: function( elem ) { 4549*31337658SMarcel Moolenaar return elem.checked === true; 4550*31337658SMarcel Moolenaar }, 4551*31337658SMarcel Moolenaar 4552*31337658SMarcel Moolenaar selected: function( elem ) { 4553*31337658SMarcel Moolenaar // Accessing this property makes selected-by-default 4554*31337658SMarcel Moolenaar // options in Safari work properly 4555*31337658SMarcel Moolenaar if ( elem.parentNode ) { 4556*31337658SMarcel Moolenaar elem.parentNode.selectedIndex; 4557*31337658SMarcel Moolenaar } 4558*31337658SMarcel Moolenaar 4559*31337658SMarcel Moolenaar return elem.selected === true; 4560*31337658SMarcel Moolenaar }, 4561*31337658SMarcel Moolenaar 4562*31337658SMarcel Moolenaar parent: function( elem ) { 4563*31337658SMarcel Moolenaar return !!elem.firstChild; 4564*31337658SMarcel Moolenaar }, 4565*31337658SMarcel Moolenaar 4566*31337658SMarcel Moolenaar empty: function( elem ) { 4567*31337658SMarcel Moolenaar return !elem.firstChild; 4568*31337658SMarcel Moolenaar }, 4569*31337658SMarcel Moolenaar 4570*31337658SMarcel Moolenaar has: function( elem, i, match ) { 4571*31337658SMarcel Moolenaar return !!Sizzle( match[3], elem ).length; 4572*31337658SMarcel Moolenaar }, 4573*31337658SMarcel Moolenaar 4574*31337658SMarcel Moolenaar header: function( elem ) { 4575*31337658SMarcel Moolenaar return (/h\d/i).test( elem.nodeName ); 4576*31337658SMarcel Moolenaar }, 4577*31337658SMarcel Moolenaar 4578*31337658SMarcel Moolenaar text: function( elem ) { 4579*31337658SMarcel Moolenaar var attr = elem.getAttribute( "type" ), type = elem.type; 4580*31337658SMarcel Moolenaar // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 4581*31337658SMarcel Moolenaar // use getAttribute instead to test this case 4582*31337658SMarcel Moolenaar return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); 4583*31337658SMarcel Moolenaar }, 4584*31337658SMarcel Moolenaar 4585*31337658SMarcel Moolenaar radio: function( elem ) { 4586*31337658SMarcel Moolenaar return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; 4587*31337658SMarcel Moolenaar }, 4588*31337658SMarcel Moolenaar 4589*31337658SMarcel Moolenaar checkbox: function( elem ) { 4590*31337658SMarcel Moolenaar return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; 4591*31337658SMarcel Moolenaar }, 4592*31337658SMarcel Moolenaar 4593*31337658SMarcel Moolenaar file: function( elem ) { 4594*31337658SMarcel Moolenaar return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; 4595*31337658SMarcel Moolenaar }, 4596*31337658SMarcel Moolenaar 4597*31337658SMarcel Moolenaar password: function( elem ) { 4598*31337658SMarcel Moolenaar return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; 4599*31337658SMarcel Moolenaar }, 4600*31337658SMarcel Moolenaar 4601*31337658SMarcel Moolenaar submit: function( elem ) { 4602*31337658SMarcel Moolenaar var name = elem.nodeName.toLowerCase(); 4603*31337658SMarcel Moolenaar return (name === "input" || name === "button") && "submit" === elem.type; 4604*31337658SMarcel Moolenaar }, 4605*31337658SMarcel Moolenaar 4606*31337658SMarcel Moolenaar image: function( elem ) { 4607*31337658SMarcel Moolenaar return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; 4608*31337658SMarcel Moolenaar }, 4609*31337658SMarcel Moolenaar 4610*31337658SMarcel Moolenaar reset: function( elem ) { 4611*31337658SMarcel Moolenaar var name = elem.nodeName.toLowerCase(); 4612*31337658SMarcel Moolenaar return (name === "input" || name === "button") && "reset" === elem.type; 4613*31337658SMarcel Moolenaar }, 4614*31337658SMarcel Moolenaar 4615*31337658SMarcel Moolenaar button: function( elem ) { 4616*31337658SMarcel Moolenaar var name = elem.nodeName.toLowerCase(); 4617*31337658SMarcel Moolenaar return name === "input" && "button" === elem.type || name === "button"; 4618*31337658SMarcel Moolenaar }, 4619*31337658SMarcel Moolenaar 4620*31337658SMarcel Moolenaar input: function( elem ) { 4621*31337658SMarcel Moolenaar return (/input|select|textarea|button/i).test( elem.nodeName ); 4622*31337658SMarcel Moolenaar }, 4623*31337658SMarcel Moolenaar 4624*31337658SMarcel Moolenaar focus: function( elem ) { 4625*31337658SMarcel Moolenaar return elem === elem.ownerDocument.activeElement; 4626*31337658SMarcel Moolenaar } 4627*31337658SMarcel Moolenaar }, 4628*31337658SMarcel Moolenaar setFilters: { 4629*31337658SMarcel Moolenaar first: function( elem, i ) { 4630*31337658SMarcel Moolenaar return i === 0; 4631*31337658SMarcel Moolenaar }, 4632*31337658SMarcel Moolenaar 4633*31337658SMarcel Moolenaar last: function( elem, i, match, array ) { 4634*31337658SMarcel Moolenaar return i === array.length - 1; 4635*31337658SMarcel Moolenaar }, 4636*31337658SMarcel Moolenaar 4637*31337658SMarcel Moolenaar even: function( elem, i ) { 4638*31337658SMarcel Moolenaar return i % 2 === 0; 4639*31337658SMarcel Moolenaar }, 4640*31337658SMarcel Moolenaar 4641*31337658SMarcel Moolenaar odd: function( elem, i ) { 4642*31337658SMarcel Moolenaar return i % 2 === 1; 4643*31337658SMarcel Moolenaar }, 4644*31337658SMarcel Moolenaar 4645*31337658SMarcel Moolenaar lt: function( elem, i, match ) { 4646*31337658SMarcel Moolenaar return i < match[3] - 0; 4647*31337658SMarcel Moolenaar }, 4648*31337658SMarcel Moolenaar 4649*31337658SMarcel Moolenaar gt: function( elem, i, match ) { 4650*31337658SMarcel Moolenaar return i > match[3] - 0; 4651*31337658SMarcel Moolenaar }, 4652*31337658SMarcel Moolenaar 4653*31337658SMarcel Moolenaar nth: function( elem, i, match ) { 4654*31337658SMarcel Moolenaar return match[3] - 0 === i; 4655*31337658SMarcel Moolenaar }, 4656*31337658SMarcel Moolenaar 4657*31337658SMarcel Moolenaar eq: function( elem, i, match ) { 4658*31337658SMarcel Moolenaar return match[3] - 0 === i; 4659*31337658SMarcel Moolenaar } 4660*31337658SMarcel Moolenaar }, 4661*31337658SMarcel Moolenaar filter: { 4662*31337658SMarcel Moolenaar PSEUDO: function( elem, match, i, array ) { 4663*31337658SMarcel Moolenaar var name = match[1], 4664*31337658SMarcel Moolenaar filter = Expr.filters[ name ]; 4665*31337658SMarcel Moolenaar 4666*31337658SMarcel Moolenaar if ( filter ) { 4667*31337658SMarcel Moolenaar return filter( elem, i, match, array ); 4668*31337658SMarcel Moolenaar 4669*31337658SMarcel Moolenaar } else if ( name === "contains" ) { 4670*31337658SMarcel Moolenaar return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; 4671*31337658SMarcel Moolenaar 4672*31337658SMarcel Moolenaar } else if ( name === "not" ) { 4673*31337658SMarcel Moolenaar var not = match[3]; 4674*31337658SMarcel Moolenaar 4675*31337658SMarcel Moolenaar for ( var j = 0, l = not.length; j < l; j++ ) { 4676*31337658SMarcel Moolenaar if ( not[j] === elem ) { 4677*31337658SMarcel Moolenaar return false; 4678*31337658SMarcel Moolenaar } 4679*31337658SMarcel Moolenaar } 4680*31337658SMarcel Moolenaar 4681*31337658SMarcel Moolenaar return true; 4682*31337658SMarcel Moolenaar 4683*31337658SMarcel Moolenaar } else { 4684*31337658SMarcel Moolenaar Sizzle.error( name ); 4685*31337658SMarcel Moolenaar } 4686*31337658SMarcel Moolenaar }, 4687*31337658SMarcel Moolenaar 4688*31337658SMarcel Moolenaar CHILD: function( elem, match ) { 4689*31337658SMarcel Moolenaar var first, last, 4690*31337658SMarcel Moolenaar doneName, parent, cache, 4691*31337658SMarcel Moolenaar count, diff, 4692*31337658SMarcel Moolenaar type = match[1], 4693*31337658SMarcel Moolenaar node = elem; 4694*31337658SMarcel Moolenaar 4695*31337658SMarcel Moolenaar switch ( type ) { 4696*31337658SMarcel Moolenaar case "only": 4697*31337658SMarcel Moolenaar case "first": 4698*31337658SMarcel Moolenaar while ( (node = node.previousSibling) ) { 4699*31337658SMarcel Moolenaar if ( node.nodeType === 1 ) { 4700*31337658SMarcel Moolenaar return false; 4701*31337658SMarcel Moolenaar } 4702*31337658SMarcel Moolenaar } 4703*31337658SMarcel Moolenaar 4704*31337658SMarcel Moolenaar if ( type === "first" ) { 4705*31337658SMarcel Moolenaar return true; 4706*31337658SMarcel Moolenaar } 4707*31337658SMarcel Moolenaar 4708*31337658SMarcel Moolenaar node = elem; 4709*31337658SMarcel Moolenaar 4710*31337658SMarcel Moolenaar case "last": 4711*31337658SMarcel Moolenaar while ( (node = node.nextSibling) ) { 4712*31337658SMarcel Moolenaar if ( node.nodeType === 1 ) { 4713*31337658SMarcel Moolenaar return false; 4714*31337658SMarcel Moolenaar } 4715*31337658SMarcel Moolenaar } 4716*31337658SMarcel Moolenaar 4717*31337658SMarcel Moolenaar return true; 4718*31337658SMarcel Moolenaar 4719*31337658SMarcel Moolenaar case "nth": 4720*31337658SMarcel Moolenaar first = match[2]; 4721*31337658SMarcel Moolenaar last = match[3]; 4722*31337658SMarcel Moolenaar 4723*31337658SMarcel Moolenaar if ( first === 1 && last === 0 ) { 4724*31337658SMarcel Moolenaar return true; 4725*31337658SMarcel Moolenaar } 4726*31337658SMarcel Moolenaar 4727*31337658SMarcel Moolenaar doneName = match[0]; 4728*31337658SMarcel Moolenaar parent = elem.parentNode; 4729*31337658SMarcel Moolenaar 4730*31337658SMarcel Moolenaar if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { 4731*31337658SMarcel Moolenaar count = 0; 4732*31337658SMarcel Moolenaar 4733*31337658SMarcel Moolenaar for ( node = parent.firstChild; node; node = node.nextSibling ) { 4734*31337658SMarcel Moolenaar if ( node.nodeType === 1 ) { 4735*31337658SMarcel Moolenaar node.nodeIndex = ++count; 4736*31337658SMarcel Moolenaar } 4737*31337658SMarcel Moolenaar } 4738*31337658SMarcel Moolenaar 4739*31337658SMarcel Moolenaar parent[ expando ] = doneName; 4740*31337658SMarcel Moolenaar } 4741*31337658SMarcel Moolenaar 4742*31337658SMarcel Moolenaar diff = elem.nodeIndex - last; 4743*31337658SMarcel Moolenaar 4744*31337658SMarcel Moolenaar if ( first === 0 ) { 4745*31337658SMarcel Moolenaar return diff === 0; 4746*31337658SMarcel Moolenaar 4747*31337658SMarcel Moolenaar } else { 4748*31337658SMarcel Moolenaar return ( diff % first === 0 && diff / first >= 0 ); 4749*31337658SMarcel Moolenaar } 4750*31337658SMarcel Moolenaar } 4751*31337658SMarcel Moolenaar }, 4752*31337658SMarcel Moolenaar 4753*31337658SMarcel Moolenaar ID: function( elem, match ) { 4754*31337658SMarcel Moolenaar return elem.nodeType === 1 && elem.getAttribute("id") === match; 4755*31337658SMarcel Moolenaar }, 4756*31337658SMarcel Moolenaar 4757*31337658SMarcel Moolenaar TAG: function( elem, match ) { 4758*31337658SMarcel Moolenaar return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; 4759*31337658SMarcel Moolenaar }, 4760*31337658SMarcel Moolenaar 4761*31337658SMarcel Moolenaar CLASS: function( elem, match ) { 4762*31337658SMarcel Moolenaar return (" " + (elem.className || elem.getAttribute("class")) + " ") 4763*31337658SMarcel Moolenaar .indexOf( match ) > -1; 4764*31337658SMarcel Moolenaar }, 4765*31337658SMarcel Moolenaar 4766*31337658SMarcel Moolenaar ATTR: function( elem, match ) { 4767*31337658SMarcel Moolenaar var name = match[1], 4768*31337658SMarcel Moolenaar result = Sizzle.attr ? 4769*31337658SMarcel Moolenaar Sizzle.attr( elem, name ) : 4770*31337658SMarcel Moolenaar Expr.attrHandle[ name ] ? 4771*31337658SMarcel Moolenaar Expr.attrHandle[ name ]( elem ) : 4772*31337658SMarcel Moolenaar elem[ name ] != null ? 4773*31337658SMarcel Moolenaar elem[ name ] : 4774*31337658SMarcel Moolenaar elem.getAttribute( name ), 4775*31337658SMarcel Moolenaar value = result + "", 4776*31337658SMarcel Moolenaar type = match[2], 4777*31337658SMarcel Moolenaar check = match[4]; 4778*31337658SMarcel Moolenaar 4779*31337658SMarcel Moolenaar return result == null ? 4780*31337658SMarcel Moolenaar type === "!=" : 4781*31337658SMarcel Moolenaar !type && Sizzle.attr ? 4782*31337658SMarcel Moolenaar result != null : 4783*31337658SMarcel Moolenaar type === "=" ? 4784*31337658SMarcel Moolenaar value === check : 4785*31337658SMarcel Moolenaar type === "*=" ? 4786*31337658SMarcel Moolenaar value.indexOf(check) >= 0 : 4787*31337658SMarcel Moolenaar type === "~=" ? 4788*31337658SMarcel Moolenaar (" " + value + " ").indexOf(check) >= 0 : 4789*31337658SMarcel Moolenaar !check ? 4790*31337658SMarcel Moolenaar value && result !== false : 4791*31337658SMarcel Moolenaar type === "!=" ? 4792*31337658SMarcel Moolenaar value !== check : 4793*31337658SMarcel Moolenaar type === "^=" ? 4794*31337658SMarcel Moolenaar value.indexOf(check) === 0 : 4795*31337658SMarcel Moolenaar type === "$=" ? 4796*31337658SMarcel Moolenaar value.substr(value.length - check.length) === check : 4797*31337658SMarcel Moolenaar type === "|=" ? 4798*31337658SMarcel Moolenaar value === check || value.substr(0, check.length + 1) === check + "-" : 4799*31337658SMarcel Moolenaar false; 4800*31337658SMarcel Moolenaar }, 4801*31337658SMarcel Moolenaar 4802*31337658SMarcel Moolenaar POS: function( elem, match, i, array ) { 4803*31337658SMarcel Moolenaar var name = match[2], 4804*31337658SMarcel Moolenaar filter = Expr.setFilters[ name ]; 4805*31337658SMarcel Moolenaar 4806*31337658SMarcel Moolenaar if ( filter ) { 4807*31337658SMarcel Moolenaar return filter( elem, i, match, array ); 4808*31337658SMarcel Moolenaar } 4809*31337658SMarcel Moolenaar } 4810*31337658SMarcel Moolenaar } 4811*31337658SMarcel Moolenaar}; 4812*31337658SMarcel Moolenaar 4813*31337658SMarcel Moolenaarvar origPOS = Expr.match.POS, 4814*31337658SMarcel Moolenaar fescape = function(all, num){ 4815*31337658SMarcel Moolenaar return "\\" + (num - 0 + 1); 4816*31337658SMarcel Moolenaar }; 4817*31337658SMarcel Moolenaar 4818*31337658SMarcel Moolenaarfor ( var type in Expr.match ) { 4819*31337658SMarcel Moolenaar Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); 4820*31337658SMarcel Moolenaar Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); 4821*31337658SMarcel Moolenaar} 4822*31337658SMarcel Moolenaar 4823*31337658SMarcel Moolenaarvar makeArray = function( array, results ) { 4824*31337658SMarcel Moolenaar array = Array.prototype.slice.call( array, 0 ); 4825*31337658SMarcel Moolenaar 4826*31337658SMarcel Moolenaar if ( results ) { 4827*31337658SMarcel Moolenaar results.push.apply( results, array ); 4828*31337658SMarcel Moolenaar return results; 4829*31337658SMarcel Moolenaar } 4830*31337658SMarcel Moolenaar 4831*31337658SMarcel Moolenaar return array; 4832*31337658SMarcel Moolenaar}; 4833*31337658SMarcel Moolenaar 4834*31337658SMarcel Moolenaar// Perform a simple check to determine if the browser is capable of 4835*31337658SMarcel Moolenaar// converting a NodeList to an array using builtin methods. 4836*31337658SMarcel Moolenaar// Also verifies that the returned array holds DOM nodes 4837*31337658SMarcel Moolenaar// (which is not the case in the Blackberry browser) 4838*31337658SMarcel Moolenaartry { 4839*31337658SMarcel Moolenaar Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; 4840*31337658SMarcel Moolenaar 4841*31337658SMarcel Moolenaar// Provide a fallback method if it does not work 4842*31337658SMarcel Moolenaar} catch( e ) { 4843*31337658SMarcel Moolenaar makeArray = function( array, results ) { 4844*31337658SMarcel Moolenaar var i = 0, 4845*31337658SMarcel Moolenaar ret = results || []; 4846*31337658SMarcel Moolenaar 4847*31337658SMarcel Moolenaar if ( toString.call(array) === "[object Array]" ) { 4848*31337658SMarcel Moolenaar Array.prototype.push.apply( ret, array ); 4849*31337658SMarcel Moolenaar 4850*31337658SMarcel Moolenaar } else { 4851*31337658SMarcel Moolenaar if ( typeof array.length === "number" ) { 4852*31337658SMarcel Moolenaar for ( var l = array.length; i < l; i++ ) { 4853*31337658SMarcel Moolenaar ret.push( array[i] ); 4854*31337658SMarcel Moolenaar } 4855*31337658SMarcel Moolenaar 4856*31337658SMarcel Moolenaar } else { 4857*31337658SMarcel Moolenaar for ( ; array[i]; i++ ) { 4858*31337658SMarcel Moolenaar ret.push( array[i] ); 4859*31337658SMarcel Moolenaar } 4860*31337658SMarcel Moolenaar } 4861*31337658SMarcel Moolenaar } 4862*31337658SMarcel Moolenaar 4863*31337658SMarcel Moolenaar return ret; 4864*31337658SMarcel Moolenaar }; 4865*31337658SMarcel Moolenaar} 4866*31337658SMarcel Moolenaar 4867*31337658SMarcel Moolenaarvar sortOrder, siblingCheck; 4868*31337658SMarcel Moolenaar 4869*31337658SMarcel Moolenaarif ( document.documentElement.compareDocumentPosition ) { 4870*31337658SMarcel Moolenaar sortOrder = function( a, b ) { 4871*31337658SMarcel Moolenaar if ( a === b ) { 4872*31337658SMarcel Moolenaar hasDuplicate = true; 4873*31337658SMarcel Moolenaar return 0; 4874*31337658SMarcel Moolenaar } 4875*31337658SMarcel Moolenaar 4876*31337658SMarcel Moolenaar if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { 4877*31337658SMarcel Moolenaar return a.compareDocumentPosition ? -1 : 1; 4878*31337658SMarcel Moolenaar } 4879*31337658SMarcel Moolenaar 4880*31337658SMarcel Moolenaar return a.compareDocumentPosition(b) & 4 ? -1 : 1; 4881*31337658SMarcel Moolenaar }; 4882*31337658SMarcel Moolenaar 4883*31337658SMarcel Moolenaar} else { 4884*31337658SMarcel Moolenaar sortOrder = function( a, b ) { 4885*31337658SMarcel Moolenaar // The nodes are identical, we can exit early 4886*31337658SMarcel Moolenaar if ( a === b ) { 4887*31337658SMarcel Moolenaar hasDuplicate = true; 4888*31337658SMarcel Moolenaar return 0; 4889*31337658SMarcel Moolenaar 4890*31337658SMarcel Moolenaar // Fallback to using sourceIndex (in IE) if it's available on both nodes 4891*31337658SMarcel Moolenaar } else if ( a.sourceIndex && b.sourceIndex ) { 4892*31337658SMarcel Moolenaar return a.sourceIndex - b.sourceIndex; 4893*31337658SMarcel Moolenaar } 4894*31337658SMarcel Moolenaar 4895*31337658SMarcel Moolenaar var al, bl, 4896*31337658SMarcel Moolenaar ap = [], 4897*31337658SMarcel Moolenaar bp = [], 4898*31337658SMarcel Moolenaar aup = a.parentNode, 4899*31337658SMarcel Moolenaar bup = b.parentNode, 4900*31337658SMarcel Moolenaar cur = aup; 4901*31337658SMarcel Moolenaar 4902*31337658SMarcel Moolenaar // If the nodes are siblings (or identical) we can do a quick check 4903*31337658SMarcel Moolenaar if ( aup === bup ) { 4904*31337658SMarcel Moolenaar return siblingCheck( a, b ); 4905*31337658SMarcel Moolenaar 4906*31337658SMarcel Moolenaar // If no parents were found then the nodes are disconnected 4907*31337658SMarcel Moolenaar } else if ( !aup ) { 4908*31337658SMarcel Moolenaar return -1; 4909*31337658SMarcel Moolenaar 4910*31337658SMarcel Moolenaar } else if ( !bup ) { 4911*31337658SMarcel Moolenaar return 1; 4912*31337658SMarcel Moolenaar } 4913*31337658SMarcel Moolenaar 4914*31337658SMarcel Moolenaar // Otherwise they're somewhere else in the tree so we need 4915*31337658SMarcel Moolenaar // to build up a full list of the parentNodes for comparison 4916*31337658SMarcel Moolenaar while ( cur ) { 4917*31337658SMarcel Moolenaar ap.unshift( cur ); 4918*31337658SMarcel Moolenaar cur = cur.parentNode; 4919*31337658SMarcel Moolenaar } 4920*31337658SMarcel Moolenaar 4921*31337658SMarcel Moolenaar cur = bup; 4922*31337658SMarcel Moolenaar 4923*31337658SMarcel Moolenaar while ( cur ) { 4924*31337658SMarcel Moolenaar bp.unshift( cur ); 4925*31337658SMarcel Moolenaar cur = cur.parentNode; 4926*31337658SMarcel Moolenaar } 4927*31337658SMarcel Moolenaar 4928*31337658SMarcel Moolenaar al = ap.length; 4929*31337658SMarcel Moolenaar bl = bp.length; 4930*31337658SMarcel Moolenaar 4931*31337658SMarcel Moolenaar // Start walking down the tree looking for a discrepancy 4932*31337658SMarcel Moolenaar for ( var i = 0; i < al && i < bl; i++ ) { 4933*31337658SMarcel Moolenaar if ( ap[i] !== bp[i] ) { 4934*31337658SMarcel Moolenaar return siblingCheck( ap[i], bp[i] ); 4935*31337658SMarcel Moolenaar } 4936*31337658SMarcel Moolenaar } 4937*31337658SMarcel Moolenaar 4938*31337658SMarcel Moolenaar // We ended someplace up the tree so do a sibling check 4939*31337658SMarcel Moolenaar return i === al ? 4940*31337658SMarcel Moolenaar siblingCheck( a, bp[i], -1 ) : 4941*31337658SMarcel Moolenaar siblingCheck( ap[i], b, 1 ); 4942*31337658SMarcel Moolenaar }; 4943*31337658SMarcel Moolenaar 4944*31337658SMarcel Moolenaar siblingCheck = function( a, b, ret ) { 4945*31337658SMarcel Moolenaar if ( a === b ) { 4946*31337658SMarcel Moolenaar return ret; 4947*31337658SMarcel Moolenaar } 4948*31337658SMarcel Moolenaar 4949*31337658SMarcel Moolenaar var cur = a.nextSibling; 4950*31337658SMarcel Moolenaar 4951*31337658SMarcel Moolenaar while ( cur ) { 4952*31337658SMarcel Moolenaar if ( cur === b ) { 4953*31337658SMarcel Moolenaar return -1; 4954*31337658SMarcel Moolenaar } 4955*31337658SMarcel Moolenaar 4956*31337658SMarcel Moolenaar cur = cur.nextSibling; 4957*31337658SMarcel Moolenaar } 4958*31337658SMarcel Moolenaar 4959*31337658SMarcel Moolenaar return 1; 4960*31337658SMarcel Moolenaar }; 4961*31337658SMarcel Moolenaar} 4962*31337658SMarcel Moolenaar 4963*31337658SMarcel Moolenaar// Check to see if the browser returns elements by name when 4964*31337658SMarcel Moolenaar// querying by getElementById (and provide a workaround) 4965*31337658SMarcel Moolenaar(function(){ 4966*31337658SMarcel Moolenaar // We're going to inject a fake input element with a specified name 4967*31337658SMarcel Moolenaar var form = document.createElement("div"), 4968*31337658SMarcel Moolenaar id = "script" + (new Date()).getTime(), 4969*31337658SMarcel Moolenaar root = document.documentElement; 4970*31337658SMarcel Moolenaar 4971*31337658SMarcel Moolenaar form.innerHTML = "<a name='" + id + "'/>"; 4972*31337658SMarcel Moolenaar 4973*31337658SMarcel Moolenaar // Inject it into the root element, check its status, and remove it quickly 4974*31337658SMarcel Moolenaar root.insertBefore( form, root.firstChild ); 4975*31337658SMarcel Moolenaar 4976*31337658SMarcel Moolenaar // The workaround has to do additional checks after a getElementById 4977*31337658SMarcel Moolenaar // Which slows things down for other browsers (hence the branching) 4978*31337658SMarcel Moolenaar if ( document.getElementById( id ) ) { 4979*31337658SMarcel Moolenaar Expr.find.ID = function( match, context, isXML ) { 4980*31337658SMarcel Moolenaar if ( typeof context.getElementById !== "undefined" && !isXML ) { 4981*31337658SMarcel Moolenaar var m = context.getElementById(match[1]); 4982*31337658SMarcel Moolenaar 4983*31337658SMarcel Moolenaar return m ? 4984*31337658SMarcel Moolenaar m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? 4985*31337658SMarcel Moolenaar [m] : 4986*31337658SMarcel Moolenaar undefined : 4987*31337658SMarcel Moolenaar []; 4988*31337658SMarcel Moolenaar } 4989*31337658SMarcel Moolenaar }; 4990*31337658SMarcel Moolenaar 4991*31337658SMarcel Moolenaar Expr.filter.ID = function( elem, match ) { 4992*31337658SMarcel Moolenaar var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); 4993*31337658SMarcel Moolenaar 4994*31337658SMarcel Moolenaar return elem.nodeType === 1 && node && node.nodeValue === match; 4995*31337658SMarcel Moolenaar }; 4996*31337658SMarcel Moolenaar } 4997*31337658SMarcel Moolenaar 4998*31337658SMarcel Moolenaar root.removeChild( form ); 4999*31337658SMarcel Moolenaar 5000*31337658SMarcel Moolenaar // release memory in IE 5001*31337658SMarcel Moolenaar root = form = null; 5002*31337658SMarcel Moolenaar})(); 5003*31337658SMarcel Moolenaar 5004*31337658SMarcel Moolenaar(function(){ 5005*31337658SMarcel Moolenaar // Check to see if the browser returns only elements 5006*31337658SMarcel Moolenaar // when doing getElementsByTagName("*") 5007*31337658SMarcel Moolenaar 5008*31337658SMarcel Moolenaar // Create a fake element 5009*31337658SMarcel Moolenaar var div = document.createElement("div"); 5010*31337658SMarcel Moolenaar div.appendChild( document.createComment("") ); 5011*31337658SMarcel Moolenaar 5012*31337658SMarcel Moolenaar // Make sure no comments are found 5013*31337658SMarcel Moolenaar if ( div.getElementsByTagName("*").length > 0 ) { 5014*31337658SMarcel Moolenaar Expr.find.TAG = function( match, context ) { 5015*31337658SMarcel Moolenaar var results = context.getElementsByTagName( match[1] ); 5016*31337658SMarcel Moolenaar 5017*31337658SMarcel Moolenaar // Filter out possible comments 5018*31337658SMarcel Moolenaar if ( match[1] === "*" ) { 5019*31337658SMarcel Moolenaar var tmp = []; 5020*31337658SMarcel Moolenaar 5021*31337658SMarcel Moolenaar for ( var i = 0; results[i]; i++ ) { 5022*31337658SMarcel Moolenaar if ( results[i].nodeType === 1 ) { 5023*31337658SMarcel Moolenaar tmp.push( results[i] ); 5024*31337658SMarcel Moolenaar } 5025*31337658SMarcel Moolenaar } 5026*31337658SMarcel Moolenaar 5027*31337658SMarcel Moolenaar results = tmp; 5028*31337658SMarcel Moolenaar } 5029*31337658SMarcel Moolenaar 5030*31337658SMarcel Moolenaar return results; 5031*31337658SMarcel Moolenaar }; 5032*31337658SMarcel Moolenaar } 5033*31337658SMarcel Moolenaar 5034*31337658SMarcel Moolenaar // Check to see if an attribute returns normalized href attributes 5035*31337658SMarcel Moolenaar div.innerHTML = "<a href='#'></a>"; 5036*31337658SMarcel Moolenaar 5037*31337658SMarcel Moolenaar if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && 5038*31337658SMarcel Moolenaar div.firstChild.getAttribute("href") !== "#" ) { 5039*31337658SMarcel Moolenaar 5040*31337658SMarcel Moolenaar Expr.attrHandle.href = function( elem ) { 5041*31337658SMarcel Moolenaar return elem.getAttribute( "href", 2 ); 5042*31337658SMarcel Moolenaar }; 5043*31337658SMarcel Moolenaar } 5044*31337658SMarcel Moolenaar 5045*31337658SMarcel Moolenaar // release memory in IE 5046*31337658SMarcel Moolenaar div = null; 5047*31337658SMarcel Moolenaar})(); 5048*31337658SMarcel Moolenaar 5049*31337658SMarcel Moolenaarif ( document.querySelectorAll ) { 5050*31337658SMarcel Moolenaar (function(){ 5051*31337658SMarcel Moolenaar var oldSizzle = Sizzle, 5052*31337658SMarcel Moolenaar div = document.createElement("div"), 5053*31337658SMarcel Moolenaar id = "__sizzle__"; 5054*31337658SMarcel Moolenaar 5055*31337658SMarcel Moolenaar div.innerHTML = "<p class='TEST'></p>"; 5056*31337658SMarcel Moolenaar 5057*31337658SMarcel Moolenaar // Safari can't handle uppercase or unicode characters when 5058*31337658SMarcel Moolenaar // in quirks mode. 5059*31337658SMarcel Moolenaar if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { 5060*31337658SMarcel Moolenaar return; 5061*31337658SMarcel Moolenaar } 5062*31337658SMarcel Moolenaar 5063*31337658SMarcel Moolenaar Sizzle = function( query, context, extra, seed ) { 5064*31337658SMarcel Moolenaar context = context || document; 5065*31337658SMarcel Moolenaar 5066*31337658SMarcel Moolenaar // Only use querySelectorAll on non-XML documents 5067*31337658SMarcel Moolenaar // (ID selectors don't work in non-HTML documents) 5068*31337658SMarcel Moolenaar if ( !seed && !Sizzle.isXML(context) ) { 5069*31337658SMarcel Moolenaar // See if we find a selector to speed up 5070*31337658SMarcel Moolenaar var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); 5071*31337658SMarcel Moolenaar 5072*31337658SMarcel Moolenaar if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { 5073*31337658SMarcel Moolenaar // Speed-up: Sizzle("TAG") 5074*31337658SMarcel Moolenaar if ( match[1] ) { 5075*31337658SMarcel Moolenaar return makeArray( context.getElementsByTagName( query ), extra ); 5076*31337658SMarcel Moolenaar 5077*31337658SMarcel Moolenaar // Speed-up: Sizzle(".CLASS") 5078*31337658SMarcel Moolenaar } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { 5079*31337658SMarcel Moolenaar return makeArray( context.getElementsByClassName( match[2] ), extra ); 5080*31337658SMarcel Moolenaar } 5081*31337658SMarcel Moolenaar } 5082*31337658SMarcel Moolenaar 5083*31337658SMarcel Moolenaar if ( context.nodeType === 9 ) { 5084*31337658SMarcel Moolenaar // Speed-up: Sizzle("body") 5085*31337658SMarcel Moolenaar // The body element only exists once, optimize finding it 5086*31337658SMarcel Moolenaar if ( query === "body" && context.body ) { 5087*31337658SMarcel Moolenaar return makeArray( [ context.body ], extra ); 5088*31337658SMarcel Moolenaar 5089*31337658SMarcel Moolenaar // Speed-up: Sizzle("#ID") 5090*31337658SMarcel Moolenaar } else if ( match && match[3] ) { 5091*31337658SMarcel Moolenaar var elem = context.getElementById( match[3] ); 5092*31337658SMarcel Moolenaar 5093*31337658SMarcel Moolenaar // Check parentNode to catch when Blackberry 4.6 returns 5094*31337658SMarcel Moolenaar // nodes that are no longer in the document #6963 5095*31337658SMarcel Moolenaar if ( elem && elem.parentNode ) { 5096*31337658SMarcel Moolenaar // Handle the case where IE and Opera return items 5097*31337658SMarcel Moolenaar // by name instead of ID 5098*31337658SMarcel Moolenaar if ( elem.id === match[3] ) { 5099*31337658SMarcel Moolenaar return makeArray( [ elem ], extra ); 5100*31337658SMarcel Moolenaar } 5101*31337658SMarcel Moolenaar 5102*31337658SMarcel Moolenaar } else { 5103*31337658SMarcel Moolenaar return makeArray( [], extra ); 5104*31337658SMarcel Moolenaar } 5105*31337658SMarcel Moolenaar } 5106*31337658SMarcel Moolenaar 5107*31337658SMarcel Moolenaar try { 5108*31337658SMarcel Moolenaar return makeArray( context.querySelectorAll(query), extra ); 5109*31337658SMarcel Moolenaar } catch(qsaError) {} 5110*31337658SMarcel Moolenaar 5111*31337658SMarcel Moolenaar // qSA works strangely on Element-rooted queries 5112*31337658SMarcel Moolenaar // We can work around this by specifying an extra ID on the root 5113*31337658SMarcel Moolenaar // and working up from there (Thanks to Andrew Dupont for the technique) 5114*31337658SMarcel Moolenaar // IE 8 doesn't work on object elements 5115*31337658SMarcel Moolenaar } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { 5116*31337658SMarcel Moolenaar var oldContext = context, 5117*31337658SMarcel Moolenaar old = context.getAttribute( "id" ), 5118*31337658SMarcel Moolenaar nid = old || id, 5119*31337658SMarcel Moolenaar hasParent = context.parentNode, 5120*31337658SMarcel Moolenaar relativeHierarchySelector = /^\s*[+~]/.test( query ); 5121*31337658SMarcel Moolenaar 5122*31337658SMarcel Moolenaar if ( !old ) { 5123*31337658SMarcel Moolenaar context.setAttribute( "id", nid ); 5124*31337658SMarcel Moolenaar } else { 5125*31337658SMarcel Moolenaar nid = nid.replace( /'/g, "\\$&" ); 5126*31337658SMarcel Moolenaar } 5127*31337658SMarcel Moolenaar if ( relativeHierarchySelector && hasParent ) { 5128*31337658SMarcel Moolenaar context = context.parentNode; 5129*31337658SMarcel Moolenaar } 5130*31337658SMarcel Moolenaar 5131*31337658SMarcel Moolenaar try { 5132*31337658SMarcel Moolenaar if ( !relativeHierarchySelector || hasParent ) { 5133*31337658SMarcel Moolenaar return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); 5134*31337658SMarcel Moolenaar } 5135*31337658SMarcel Moolenaar 5136*31337658SMarcel Moolenaar } catch(pseudoError) { 5137*31337658SMarcel Moolenaar } finally { 5138*31337658SMarcel Moolenaar if ( !old ) { 5139*31337658SMarcel Moolenaar oldContext.removeAttribute( "id" ); 5140*31337658SMarcel Moolenaar } 5141*31337658SMarcel Moolenaar } 5142*31337658SMarcel Moolenaar } 5143*31337658SMarcel Moolenaar } 5144*31337658SMarcel Moolenaar 5145*31337658SMarcel Moolenaar return oldSizzle(query, context, extra, seed); 5146*31337658SMarcel Moolenaar }; 5147*31337658SMarcel Moolenaar 5148*31337658SMarcel Moolenaar for ( var prop in oldSizzle ) { 5149*31337658SMarcel Moolenaar Sizzle[ prop ] = oldSizzle[ prop ]; 5150*31337658SMarcel Moolenaar } 5151*31337658SMarcel Moolenaar 5152*31337658SMarcel Moolenaar // release memory in IE 5153*31337658SMarcel Moolenaar div = null; 5154*31337658SMarcel Moolenaar })(); 5155*31337658SMarcel Moolenaar} 5156*31337658SMarcel Moolenaar 5157*31337658SMarcel Moolenaar(function(){ 5158*31337658SMarcel Moolenaar var html = document.documentElement, 5159*31337658SMarcel Moolenaar matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; 5160*31337658SMarcel Moolenaar 5161*31337658SMarcel Moolenaar if ( matches ) { 5162*31337658SMarcel Moolenaar // Check to see if it's possible to do matchesSelector 5163*31337658SMarcel Moolenaar // on a disconnected node (IE 9 fails this) 5164*31337658SMarcel Moolenaar var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), 5165*31337658SMarcel Moolenaar pseudoWorks = false; 5166*31337658SMarcel Moolenaar 5167*31337658SMarcel Moolenaar try { 5168*31337658SMarcel Moolenaar // This should fail with an exception 5169*31337658SMarcel Moolenaar // Gecko does not error, returns false instead 5170*31337658SMarcel Moolenaar matches.call( document.documentElement, "[test!='']:sizzle" ); 5171*31337658SMarcel Moolenaar 5172*31337658SMarcel Moolenaar } catch( pseudoError ) { 5173*31337658SMarcel Moolenaar pseudoWorks = true; 5174*31337658SMarcel Moolenaar } 5175*31337658SMarcel Moolenaar 5176*31337658SMarcel Moolenaar Sizzle.matchesSelector = function( node, expr ) { 5177*31337658SMarcel Moolenaar // Make sure that attribute selectors are quoted 5178*31337658SMarcel Moolenaar expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); 5179*31337658SMarcel Moolenaar 5180*31337658SMarcel Moolenaar if ( !Sizzle.isXML( node ) ) { 5181*31337658SMarcel Moolenaar try { 5182*31337658SMarcel Moolenaar if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { 5183*31337658SMarcel Moolenaar var ret = matches.call( node, expr ); 5184*31337658SMarcel Moolenaar 5185*31337658SMarcel Moolenaar // IE 9's matchesSelector returns false on disconnected nodes 5186*31337658SMarcel Moolenaar if ( ret || !disconnectedMatch || 5187*31337658SMarcel Moolenaar // As well, disconnected nodes are said to be in a document 5188*31337658SMarcel Moolenaar // fragment in IE 9, so check for that 5189*31337658SMarcel Moolenaar node.document && node.document.nodeType !== 11 ) { 5190*31337658SMarcel Moolenaar return ret; 5191*31337658SMarcel Moolenaar } 5192*31337658SMarcel Moolenaar } 5193*31337658SMarcel Moolenaar } catch(e) {} 5194*31337658SMarcel Moolenaar } 5195*31337658SMarcel Moolenaar 5196*31337658SMarcel Moolenaar return Sizzle(expr, null, null, [node]).length > 0; 5197*31337658SMarcel Moolenaar }; 5198*31337658SMarcel Moolenaar } 5199*31337658SMarcel Moolenaar})(); 5200*31337658SMarcel Moolenaar 5201*31337658SMarcel Moolenaar(function(){ 5202*31337658SMarcel Moolenaar var div = document.createElement("div"); 5203*31337658SMarcel Moolenaar 5204*31337658SMarcel Moolenaar div.innerHTML = "<div class='test e'></div><div class='test'></div>"; 5205*31337658SMarcel Moolenaar 5206*31337658SMarcel Moolenaar // Opera can't find a second classname (in 9.6) 5207*31337658SMarcel Moolenaar // Also, make sure that getElementsByClassName actually exists 5208*31337658SMarcel Moolenaar if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { 5209*31337658SMarcel Moolenaar return; 5210*31337658SMarcel Moolenaar } 5211*31337658SMarcel Moolenaar 5212*31337658SMarcel Moolenaar // Safari caches class attributes, doesn't catch changes (in 3.2) 5213*31337658SMarcel Moolenaar div.lastChild.className = "e"; 5214*31337658SMarcel Moolenaar 5215*31337658SMarcel Moolenaar if ( div.getElementsByClassName("e").length === 1 ) { 5216*31337658SMarcel Moolenaar return; 5217*31337658SMarcel Moolenaar } 5218*31337658SMarcel Moolenaar 5219*31337658SMarcel Moolenaar Expr.order.splice(1, 0, "CLASS"); 5220*31337658SMarcel Moolenaar Expr.find.CLASS = function( match, context, isXML ) { 5221*31337658SMarcel Moolenaar if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { 5222*31337658SMarcel Moolenaar return context.getElementsByClassName(match[1]); 5223*31337658SMarcel Moolenaar } 5224*31337658SMarcel Moolenaar }; 5225*31337658SMarcel Moolenaar 5226*31337658SMarcel Moolenaar // release memory in IE 5227*31337658SMarcel Moolenaar div = null; 5228*31337658SMarcel Moolenaar})(); 5229*31337658SMarcel Moolenaar 5230*31337658SMarcel Moolenaarfunction dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { 5231*31337658SMarcel Moolenaar for ( var i = 0, l = checkSet.length; i < l; i++ ) { 5232*31337658SMarcel Moolenaar var elem = checkSet[i]; 5233*31337658SMarcel Moolenaar 5234*31337658SMarcel Moolenaar if ( elem ) { 5235*31337658SMarcel Moolenaar var match = false; 5236*31337658SMarcel Moolenaar 5237*31337658SMarcel Moolenaar elem = elem[dir]; 5238*31337658SMarcel Moolenaar 5239*31337658SMarcel Moolenaar while ( elem ) { 5240*31337658SMarcel Moolenaar if ( elem[ expando ] === doneName ) { 5241*31337658SMarcel Moolenaar match = checkSet[elem.sizset]; 5242*31337658SMarcel Moolenaar break; 5243*31337658SMarcel Moolenaar } 5244*31337658SMarcel Moolenaar 5245*31337658SMarcel Moolenaar if ( elem.nodeType === 1 && !isXML ){ 5246*31337658SMarcel Moolenaar elem[ expando ] = doneName; 5247*31337658SMarcel Moolenaar elem.sizset = i; 5248*31337658SMarcel Moolenaar } 5249*31337658SMarcel Moolenaar 5250*31337658SMarcel Moolenaar if ( elem.nodeName.toLowerCase() === cur ) { 5251*31337658SMarcel Moolenaar match = elem; 5252*31337658SMarcel Moolenaar break; 5253*31337658SMarcel Moolenaar } 5254*31337658SMarcel Moolenaar 5255*31337658SMarcel Moolenaar elem = elem[dir]; 5256*31337658SMarcel Moolenaar } 5257*31337658SMarcel Moolenaar 5258*31337658SMarcel Moolenaar checkSet[i] = match; 5259*31337658SMarcel Moolenaar } 5260*31337658SMarcel Moolenaar } 5261*31337658SMarcel Moolenaar} 5262*31337658SMarcel Moolenaar 5263*31337658SMarcel Moolenaarfunction dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { 5264*31337658SMarcel Moolenaar for ( var i = 0, l = checkSet.length; i < l; i++ ) { 5265*31337658SMarcel Moolenaar var elem = checkSet[i]; 5266*31337658SMarcel Moolenaar 5267*31337658SMarcel Moolenaar if ( elem ) { 5268*31337658SMarcel Moolenaar var match = false; 5269*31337658SMarcel Moolenaar 5270*31337658SMarcel Moolenaar elem = elem[dir]; 5271*31337658SMarcel Moolenaar 5272*31337658SMarcel Moolenaar while ( elem ) { 5273*31337658SMarcel Moolenaar if ( elem[ expando ] === doneName ) { 5274*31337658SMarcel Moolenaar match = checkSet[elem.sizset]; 5275*31337658SMarcel Moolenaar break; 5276*31337658SMarcel Moolenaar } 5277*31337658SMarcel Moolenaar 5278*31337658SMarcel Moolenaar if ( elem.nodeType === 1 ) { 5279*31337658SMarcel Moolenaar if ( !isXML ) { 5280*31337658SMarcel Moolenaar elem[ expando ] = doneName; 5281*31337658SMarcel Moolenaar elem.sizset = i; 5282*31337658SMarcel Moolenaar } 5283*31337658SMarcel Moolenaar 5284*31337658SMarcel Moolenaar if ( typeof cur !== "string" ) { 5285*31337658SMarcel Moolenaar if ( elem === cur ) { 5286*31337658SMarcel Moolenaar match = true; 5287*31337658SMarcel Moolenaar break; 5288*31337658SMarcel Moolenaar } 5289*31337658SMarcel Moolenaar 5290*31337658SMarcel Moolenaar } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { 5291*31337658SMarcel Moolenaar match = elem; 5292*31337658SMarcel Moolenaar break; 5293*31337658SMarcel Moolenaar } 5294*31337658SMarcel Moolenaar } 5295*31337658SMarcel Moolenaar 5296*31337658SMarcel Moolenaar elem = elem[dir]; 5297*31337658SMarcel Moolenaar } 5298*31337658SMarcel Moolenaar 5299*31337658SMarcel Moolenaar checkSet[i] = match; 5300*31337658SMarcel Moolenaar } 5301*31337658SMarcel Moolenaar } 5302*31337658SMarcel Moolenaar} 5303*31337658SMarcel Moolenaar 5304*31337658SMarcel Moolenaarif ( document.documentElement.contains ) { 5305*31337658SMarcel Moolenaar Sizzle.contains = function( a, b ) { 5306*31337658SMarcel Moolenaar return a !== b && (a.contains ? a.contains(b) : true); 5307*31337658SMarcel Moolenaar }; 5308*31337658SMarcel Moolenaar 5309*31337658SMarcel Moolenaar} else if ( document.documentElement.compareDocumentPosition ) { 5310*31337658SMarcel Moolenaar Sizzle.contains = function( a, b ) { 5311*31337658SMarcel Moolenaar return !!(a.compareDocumentPosition(b) & 16); 5312*31337658SMarcel Moolenaar }; 5313*31337658SMarcel Moolenaar 5314*31337658SMarcel Moolenaar} else { 5315*31337658SMarcel Moolenaar Sizzle.contains = function() { 5316*31337658SMarcel Moolenaar return false; 5317*31337658SMarcel Moolenaar }; 5318*31337658SMarcel Moolenaar} 5319*31337658SMarcel Moolenaar 5320*31337658SMarcel MoolenaarSizzle.isXML = function( elem ) { 5321*31337658SMarcel Moolenaar // documentElement is verified for cases where it doesn't yet exist 5322*31337658SMarcel Moolenaar // (such as loading iframes in IE - #4833) 5323*31337658SMarcel Moolenaar var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; 5324*31337658SMarcel Moolenaar 5325*31337658SMarcel Moolenaar return documentElement ? documentElement.nodeName !== "HTML" : false; 5326*31337658SMarcel Moolenaar}; 5327*31337658SMarcel Moolenaar 5328*31337658SMarcel Moolenaarvar posProcess = function( selector, context, seed ) { 5329*31337658SMarcel Moolenaar var match, 5330*31337658SMarcel Moolenaar tmpSet = [], 5331*31337658SMarcel Moolenaar later = "", 5332*31337658SMarcel Moolenaar root = context.nodeType ? [context] : context; 5333*31337658SMarcel Moolenaar 5334*31337658SMarcel Moolenaar // Position selectors must be done after the filter 5335*31337658SMarcel Moolenaar // And so must :not(positional) so we move all PSEUDOs to the end 5336*31337658SMarcel Moolenaar while ( (match = Expr.match.PSEUDO.exec( selector )) ) { 5337*31337658SMarcel Moolenaar later += match[0]; 5338*31337658SMarcel Moolenaar selector = selector.replace( Expr.match.PSEUDO, "" ); 5339*31337658SMarcel Moolenaar } 5340*31337658SMarcel Moolenaar 5341*31337658SMarcel Moolenaar selector = Expr.relative[selector] ? selector + "*" : selector; 5342*31337658SMarcel Moolenaar 5343*31337658SMarcel Moolenaar for ( var i = 0, l = root.length; i < l; i++ ) { 5344*31337658SMarcel Moolenaar Sizzle( selector, root[i], tmpSet, seed ); 5345*31337658SMarcel Moolenaar } 5346*31337658SMarcel Moolenaar 5347*31337658SMarcel Moolenaar return Sizzle.filter( later, tmpSet ); 5348*31337658SMarcel Moolenaar}; 5349*31337658SMarcel Moolenaar 5350*31337658SMarcel Moolenaar// EXPOSE 5351*31337658SMarcel Moolenaar// Override sizzle attribute retrieval 5352*31337658SMarcel MoolenaarSizzle.attr = jQuery.attr; 5353*31337658SMarcel MoolenaarSizzle.selectors.attrMap = {}; 5354*31337658SMarcel MoolenaarjQuery.find = Sizzle; 5355*31337658SMarcel MoolenaarjQuery.expr = Sizzle.selectors; 5356*31337658SMarcel MoolenaarjQuery.expr[":"] = jQuery.expr.filters; 5357*31337658SMarcel MoolenaarjQuery.unique = Sizzle.uniqueSort; 5358*31337658SMarcel MoolenaarjQuery.text = Sizzle.getText; 5359*31337658SMarcel MoolenaarjQuery.isXMLDoc = Sizzle.isXML; 5360*31337658SMarcel MoolenaarjQuery.contains = Sizzle.contains; 5361*31337658SMarcel Moolenaar 5362*31337658SMarcel Moolenaar 5363*31337658SMarcel Moolenaar})(); 5364*31337658SMarcel Moolenaar 5365*31337658SMarcel Moolenaar 5366*31337658SMarcel Moolenaarvar runtil = /Until$/, 5367*31337658SMarcel Moolenaar rparentsprev = /^(?:parents|prevUntil|prevAll)/, 5368*31337658SMarcel Moolenaar // Note: This RegExp should be improved, or likely pulled from Sizzle 5369*31337658SMarcel Moolenaar rmultiselector = /,/, 5370*31337658SMarcel Moolenaar isSimple = /^.[^:#\[\.,]*$/, 5371*31337658SMarcel Moolenaar slice = Array.prototype.slice, 5372*31337658SMarcel Moolenaar POS = jQuery.expr.match.POS, 5373*31337658SMarcel Moolenaar // methods guaranteed to produce a unique set when starting from a unique set 5374*31337658SMarcel Moolenaar guaranteedUnique = { 5375*31337658SMarcel Moolenaar children: true, 5376*31337658SMarcel Moolenaar contents: true, 5377*31337658SMarcel Moolenaar next: true, 5378*31337658SMarcel Moolenaar prev: true 5379*31337658SMarcel Moolenaar }; 5380*31337658SMarcel Moolenaar 5381*31337658SMarcel MoolenaarjQuery.fn.extend({ 5382*31337658SMarcel Moolenaar find: function( selector ) { 5383*31337658SMarcel Moolenaar var self = this, 5384*31337658SMarcel Moolenaar i, l; 5385*31337658SMarcel Moolenaar 5386*31337658SMarcel Moolenaar if ( typeof selector !== "string" ) { 5387*31337658SMarcel Moolenaar return jQuery( selector ).filter(function() { 5388*31337658SMarcel Moolenaar for ( i = 0, l = self.length; i < l; i++ ) { 5389*31337658SMarcel Moolenaar if ( jQuery.contains( self[ i ], this ) ) { 5390*31337658SMarcel Moolenaar return true; 5391*31337658SMarcel Moolenaar } 5392*31337658SMarcel Moolenaar } 5393*31337658SMarcel Moolenaar }); 5394*31337658SMarcel Moolenaar } 5395*31337658SMarcel Moolenaar 5396*31337658SMarcel Moolenaar var ret = this.pushStack( "", "find", selector ), 5397*31337658SMarcel Moolenaar length, n, r; 5398*31337658SMarcel Moolenaar 5399*31337658SMarcel Moolenaar for ( i = 0, l = this.length; i < l; i++ ) { 5400*31337658SMarcel Moolenaar length = ret.length; 5401*31337658SMarcel Moolenaar jQuery.find( selector, this[i], ret ); 5402*31337658SMarcel Moolenaar 5403*31337658SMarcel Moolenaar if ( i > 0 ) { 5404*31337658SMarcel Moolenaar // Make sure that the results are unique 5405*31337658SMarcel Moolenaar for ( n = length; n < ret.length; n++ ) { 5406*31337658SMarcel Moolenaar for ( r = 0; r < length; r++ ) { 5407*31337658SMarcel Moolenaar if ( ret[r] === ret[n] ) { 5408*31337658SMarcel Moolenaar ret.splice(n--, 1); 5409*31337658SMarcel Moolenaar break; 5410*31337658SMarcel Moolenaar } 5411*31337658SMarcel Moolenaar } 5412*31337658SMarcel Moolenaar } 5413*31337658SMarcel Moolenaar } 5414*31337658SMarcel Moolenaar } 5415*31337658SMarcel Moolenaar 5416*31337658SMarcel Moolenaar return ret; 5417*31337658SMarcel Moolenaar }, 5418*31337658SMarcel Moolenaar 5419*31337658SMarcel Moolenaar has: function( target ) { 5420*31337658SMarcel Moolenaar var targets = jQuery( target ); 5421*31337658SMarcel Moolenaar return this.filter(function() { 5422*31337658SMarcel Moolenaar for ( var i = 0, l = targets.length; i < l; i++ ) { 5423*31337658SMarcel Moolenaar if ( jQuery.contains( this, targets[i] ) ) { 5424*31337658SMarcel Moolenaar return true; 5425*31337658SMarcel Moolenaar } 5426*31337658SMarcel Moolenaar } 5427*31337658SMarcel Moolenaar }); 5428*31337658SMarcel Moolenaar }, 5429*31337658SMarcel Moolenaar 5430*31337658SMarcel Moolenaar not: function( selector ) { 5431*31337658SMarcel Moolenaar return this.pushStack( winnow(this, selector, false), "not", selector); 5432*31337658SMarcel Moolenaar }, 5433*31337658SMarcel Moolenaar 5434*31337658SMarcel Moolenaar filter: function( selector ) { 5435*31337658SMarcel Moolenaar return this.pushStack( winnow(this, selector, true), "filter", selector ); 5436*31337658SMarcel Moolenaar }, 5437*31337658SMarcel Moolenaar 5438*31337658SMarcel Moolenaar is: function( selector ) { 5439*31337658SMarcel Moolenaar return !!selector && ( 5440*31337658SMarcel Moolenaar typeof selector === "string" ? 5441*31337658SMarcel Moolenaar // If this is a positional selector, check membership in the returned set 5442*31337658SMarcel Moolenaar // so $("p:first").is("p:last") won't return true for a doc with two "p". 5443*31337658SMarcel Moolenaar POS.test( selector ) ? 5444*31337658SMarcel Moolenaar jQuery( selector, this.context ).index( this[0] ) >= 0 : 5445*31337658SMarcel Moolenaar jQuery.filter( selector, this ).length > 0 : 5446*31337658SMarcel Moolenaar this.filter( selector ).length > 0 ); 5447*31337658SMarcel Moolenaar }, 5448*31337658SMarcel Moolenaar 5449*31337658SMarcel Moolenaar closest: function( selectors, context ) { 5450*31337658SMarcel Moolenaar var ret = [], i, l, cur = this[0]; 5451*31337658SMarcel Moolenaar 5452*31337658SMarcel Moolenaar // Array (deprecated as of jQuery 1.7) 5453*31337658SMarcel Moolenaar if ( jQuery.isArray( selectors ) ) { 5454*31337658SMarcel Moolenaar var level = 1; 5455*31337658SMarcel Moolenaar 5456*31337658SMarcel Moolenaar while ( cur && cur.ownerDocument && cur !== context ) { 5457*31337658SMarcel Moolenaar for ( i = 0; i < selectors.length; i++ ) { 5458*31337658SMarcel Moolenaar 5459*31337658SMarcel Moolenaar if ( jQuery( cur ).is( selectors[ i ] ) ) { 5460*31337658SMarcel Moolenaar ret.push({ selector: selectors[ i ], elem: cur, level: level }); 5461*31337658SMarcel Moolenaar } 5462*31337658SMarcel Moolenaar } 5463*31337658SMarcel Moolenaar 5464*31337658SMarcel Moolenaar cur = cur.parentNode; 5465*31337658SMarcel Moolenaar level++; 5466*31337658SMarcel Moolenaar } 5467*31337658SMarcel Moolenaar 5468*31337658SMarcel Moolenaar return ret; 5469*31337658SMarcel Moolenaar } 5470*31337658SMarcel Moolenaar 5471*31337658SMarcel Moolenaar // String 5472*31337658SMarcel Moolenaar var pos = POS.test( selectors ) || typeof selectors !== "string" ? 5473*31337658SMarcel Moolenaar jQuery( selectors, context || this.context ) : 5474*31337658SMarcel Moolenaar 0; 5475*31337658SMarcel Moolenaar 5476*31337658SMarcel Moolenaar for ( i = 0, l = this.length; i < l; i++ ) { 5477*31337658SMarcel Moolenaar cur = this[i]; 5478*31337658SMarcel Moolenaar 5479*31337658SMarcel Moolenaar while ( cur ) { 5480*31337658SMarcel Moolenaar if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { 5481*31337658SMarcel Moolenaar ret.push( cur ); 5482*31337658SMarcel Moolenaar break; 5483*31337658SMarcel Moolenaar 5484*31337658SMarcel Moolenaar } else { 5485*31337658SMarcel Moolenaar cur = cur.parentNode; 5486*31337658SMarcel Moolenaar if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { 5487*31337658SMarcel Moolenaar break; 5488*31337658SMarcel Moolenaar } 5489*31337658SMarcel Moolenaar } 5490*31337658SMarcel Moolenaar } 5491*31337658SMarcel Moolenaar } 5492*31337658SMarcel Moolenaar 5493*31337658SMarcel Moolenaar ret = ret.length > 1 ? jQuery.unique( ret ) : ret; 5494*31337658SMarcel Moolenaar 5495*31337658SMarcel Moolenaar return this.pushStack( ret, "closest", selectors ); 5496*31337658SMarcel Moolenaar }, 5497*31337658SMarcel Moolenaar 5498*31337658SMarcel Moolenaar // Determine the position of an element within 5499*31337658SMarcel Moolenaar // the matched set of elements 5500*31337658SMarcel Moolenaar index: function( elem ) { 5501*31337658SMarcel Moolenaar 5502*31337658SMarcel Moolenaar // No argument, return index in parent 5503*31337658SMarcel Moolenaar if ( !elem ) { 5504*31337658SMarcel Moolenaar return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; 5505*31337658SMarcel Moolenaar } 5506*31337658SMarcel Moolenaar 5507*31337658SMarcel Moolenaar // index in selector 5508*31337658SMarcel Moolenaar if ( typeof elem === "string" ) { 5509*31337658SMarcel Moolenaar return jQuery.inArray( this[0], jQuery( elem ) ); 5510*31337658SMarcel Moolenaar } 5511*31337658SMarcel Moolenaar 5512*31337658SMarcel Moolenaar // Locate the position of the desired element 5513*31337658SMarcel Moolenaar return jQuery.inArray( 5514*31337658SMarcel Moolenaar // If it receives a jQuery object, the first element is used 5515*31337658SMarcel Moolenaar elem.jquery ? elem[0] : elem, this ); 5516*31337658SMarcel Moolenaar }, 5517*31337658SMarcel Moolenaar 5518*31337658SMarcel Moolenaar add: function( selector, context ) { 5519*31337658SMarcel Moolenaar var set = typeof selector === "string" ? 5520*31337658SMarcel Moolenaar jQuery( selector, context ) : 5521*31337658SMarcel Moolenaar jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), 5522*31337658SMarcel Moolenaar all = jQuery.merge( this.get(), set ); 5523*31337658SMarcel Moolenaar 5524*31337658SMarcel Moolenaar return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? 5525*31337658SMarcel Moolenaar all : 5526*31337658SMarcel Moolenaar jQuery.unique( all ) ); 5527*31337658SMarcel Moolenaar }, 5528*31337658SMarcel Moolenaar 5529*31337658SMarcel Moolenaar andSelf: function() { 5530*31337658SMarcel Moolenaar return this.add( this.prevObject ); 5531*31337658SMarcel Moolenaar } 5532*31337658SMarcel Moolenaar}); 5533*31337658SMarcel Moolenaar 5534*31337658SMarcel Moolenaar// A painfully simple check to see if an element is disconnected 5535*31337658SMarcel Moolenaar// from a document (should be improved, where feasible). 5536*31337658SMarcel Moolenaarfunction isDisconnected( node ) { 5537*31337658SMarcel Moolenaar return !node || !node.parentNode || node.parentNode.nodeType === 11; 5538*31337658SMarcel Moolenaar} 5539*31337658SMarcel Moolenaar 5540*31337658SMarcel MoolenaarjQuery.each({ 5541*31337658SMarcel Moolenaar parent: function( elem ) { 5542*31337658SMarcel Moolenaar var parent = elem.parentNode; 5543*31337658SMarcel Moolenaar return parent && parent.nodeType !== 11 ? parent : null; 5544*31337658SMarcel Moolenaar }, 5545*31337658SMarcel Moolenaar parents: function( elem ) { 5546*31337658SMarcel Moolenaar return jQuery.dir( elem, "parentNode" ); 5547*31337658SMarcel Moolenaar }, 5548*31337658SMarcel Moolenaar parentsUntil: function( elem, i, until ) { 5549*31337658SMarcel Moolenaar return jQuery.dir( elem, "parentNode", until ); 5550*31337658SMarcel Moolenaar }, 5551*31337658SMarcel Moolenaar next: function( elem ) { 5552*31337658SMarcel Moolenaar return jQuery.nth( elem, 2, "nextSibling" ); 5553*31337658SMarcel Moolenaar }, 5554*31337658SMarcel Moolenaar prev: function( elem ) { 5555*31337658SMarcel Moolenaar return jQuery.nth( elem, 2, "previousSibling" ); 5556*31337658SMarcel Moolenaar }, 5557*31337658SMarcel Moolenaar nextAll: function( elem ) { 5558*31337658SMarcel Moolenaar return jQuery.dir( elem, "nextSibling" ); 5559*31337658SMarcel Moolenaar }, 5560*31337658SMarcel Moolenaar prevAll: function( elem ) { 5561*31337658SMarcel Moolenaar return jQuery.dir( elem, "previousSibling" ); 5562*31337658SMarcel Moolenaar }, 5563*31337658SMarcel Moolenaar nextUntil: function( elem, i, until ) { 5564*31337658SMarcel Moolenaar return jQuery.dir( elem, "nextSibling", until ); 5565*31337658SMarcel Moolenaar }, 5566*31337658SMarcel Moolenaar prevUntil: function( elem, i, until ) { 5567*31337658SMarcel Moolenaar return jQuery.dir( elem, "previousSibling", until ); 5568*31337658SMarcel Moolenaar }, 5569*31337658SMarcel Moolenaar siblings: function( elem ) { 5570*31337658SMarcel Moolenaar return jQuery.sibling( elem.parentNode.firstChild, elem ); 5571*31337658SMarcel Moolenaar }, 5572*31337658SMarcel Moolenaar children: function( elem ) { 5573*31337658SMarcel Moolenaar return jQuery.sibling( elem.firstChild ); 5574*31337658SMarcel Moolenaar }, 5575*31337658SMarcel Moolenaar contents: function( elem ) { 5576*31337658SMarcel Moolenaar return jQuery.nodeName( elem, "iframe" ) ? 5577*31337658SMarcel Moolenaar elem.contentDocument || elem.contentWindow.document : 5578*31337658SMarcel Moolenaar jQuery.makeArray( elem.childNodes ); 5579*31337658SMarcel Moolenaar } 5580*31337658SMarcel Moolenaar}, function( name, fn ) { 5581*31337658SMarcel Moolenaar jQuery.fn[ name ] = function( until, selector ) { 5582*31337658SMarcel Moolenaar var ret = jQuery.map( this, fn, until ), 5583*31337658SMarcel Moolenaar // The variable 'args' was introduced in 5584*31337658SMarcel Moolenaar // https://github.com/jquery/jquery/commit/52a0238 5585*31337658SMarcel Moolenaar // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. 5586*31337658SMarcel Moolenaar // http://code.google.com/p/v8/issues/detail?id=1050 5587*31337658SMarcel Moolenaar args = slice.call(arguments); 5588*31337658SMarcel Moolenaar 5589*31337658SMarcel Moolenaar if ( !runtil.test( name ) ) { 5590*31337658SMarcel Moolenaar selector = until; 5591*31337658SMarcel Moolenaar } 5592*31337658SMarcel Moolenaar 5593*31337658SMarcel Moolenaar if ( selector && typeof selector === "string" ) { 5594*31337658SMarcel Moolenaar ret = jQuery.filter( selector, ret ); 5595*31337658SMarcel Moolenaar } 5596*31337658SMarcel Moolenaar 5597*31337658SMarcel Moolenaar ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; 5598*31337658SMarcel Moolenaar 5599*31337658SMarcel Moolenaar if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { 5600*31337658SMarcel Moolenaar ret = ret.reverse(); 5601*31337658SMarcel Moolenaar } 5602*31337658SMarcel Moolenaar 5603*31337658SMarcel Moolenaar return this.pushStack( ret, name, args.join(",") ); 5604*31337658SMarcel Moolenaar }; 5605*31337658SMarcel Moolenaar}); 5606*31337658SMarcel Moolenaar 5607*31337658SMarcel MoolenaarjQuery.extend({ 5608*31337658SMarcel Moolenaar filter: function( expr, elems, not ) { 5609*31337658SMarcel Moolenaar if ( not ) { 5610*31337658SMarcel Moolenaar expr = ":not(" + expr + ")"; 5611*31337658SMarcel Moolenaar } 5612*31337658SMarcel Moolenaar 5613*31337658SMarcel Moolenaar return elems.length === 1 ? 5614*31337658SMarcel Moolenaar jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : 5615*31337658SMarcel Moolenaar jQuery.find.matches(expr, elems); 5616*31337658SMarcel Moolenaar }, 5617*31337658SMarcel Moolenaar 5618*31337658SMarcel Moolenaar dir: function( elem, dir, until ) { 5619*31337658SMarcel Moolenaar var matched = [], 5620*31337658SMarcel Moolenaar cur = elem[ dir ]; 5621*31337658SMarcel Moolenaar 5622*31337658SMarcel Moolenaar while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { 5623*31337658SMarcel Moolenaar if ( cur.nodeType === 1 ) { 5624*31337658SMarcel Moolenaar matched.push( cur ); 5625*31337658SMarcel Moolenaar } 5626*31337658SMarcel Moolenaar cur = cur[dir]; 5627*31337658SMarcel Moolenaar } 5628*31337658SMarcel Moolenaar return matched; 5629*31337658SMarcel Moolenaar }, 5630*31337658SMarcel Moolenaar 5631*31337658SMarcel Moolenaar nth: function( cur, result, dir, elem ) { 5632*31337658SMarcel Moolenaar result = result || 1; 5633*31337658SMarcel Moolenaar var num = 0; 5634*31337658SMarcel Moolenaar 5635*31337658SMarcel Moolenaar for ( ; cur; cur = cur[dir] ) { 5636*31337658SMarcel Moolenaar if ( cur.nodeType === 1 && ++num === result ) { 5637*31337658SMarcel Moolenaar break; 5638*31337658SMarcel Moolenaar } 5639*31337658SMarcel Moolenaar } 5640*31337658SMarcel Moolenaar 5641*31337658SMarcel Moolenaar return cur; 5642*31337658SMarcel Moolenaar }, 5643*31337658SMarcel Moolenaar 5644*31337658SMarcel Moolenaar sibling: function( n, elem ) { 5645*31337658SMarcel Moolenaar var r = []; 5646*31337658SMarcel Moolenaar 5647*31337658SMarcel Moolenaar for ( ; n; n = n.nextSibling ) { 5648*31337658SMarcel Moolenaar if ( n.nodeType === 1 && n !== elem ) { 5649*31337658SMarcel Moolenaar r.push( n ); 5650*31337658SMarcel Moolenaar } 5651*31337658SMarcel Moolenaar } 5652*31337658SMarcel Moolenaar 5653*31337658SMarcel Moolenaar return r; 5654*31337658SMarcel Moolenaar } 5655*31337658SMarcel Moolenaar}); 5656*31337658SMarcel Moolenaar 5657*31337658SMarcel Moolenaar// Implement the identical functionality for filter and not 5658*31337658SMarcel Moolenaarfunction winnow( elements, qualifier, keep ) { 5659*31337658SMarcel Moolenaar 5660*31337658SMarcel Moolenaar // Can't pass null or undefined to indexOf in Firefox 4 5661*31337658SMarcel Moolenaar // Set to 0 to skip string check 5662*31337658SMarcel Moolenaar qualifier = qualifier || 0; 5663*31337658SMarcel Moolenaar 5664*31337658SMarcel Moolenaar if ( jQuery.isFunction( qualifier ) ) { 5665*31337658SMarcel Moolenaar return jQuery.grep(elements, function( elem, i ) { 5666*31337658SMarcel Moolenaar var retVal = !!qualifier.call( elem, i, elem ); 5667*31337658SMarcel Moolenaar return retVal === keep; 5668*31337658SMarcel Moolenaar }); 5669*31337658SMarcel Moolenaar 5670*31337658SMarcel Moolenaar } else if ( qualifier.nodeType ) { 5671*31337658SMarcel Moolenaar return jQuery.grep(elements, function( elem, i ) { 5672*31337658SMarcel Moolenaar return ( elem === qualifier ) === keep; 5673*31337658SMarcel Moolenaar }); 5674*31337658SMarcel Moolenaar 5675*31337658SMarcel Moolenaar } else if ( typeof qualifier === "string" ) { 5676*31337658SMarcel Moolenaar var filtered = jQuery.grep(elements, function( elem ) { 5677*31337658SMarcel Moolenaar return elem.nodeType === 1; 5678*31337658SMarcel Moolenaar }); 5679*31337658SMarcel Moolenaar 5680*31337658SMarcel Moolenaar if ( isSimple.test( qualifier ) ) { 5681*31337658SMarcel Moolenaar return jQuery.filter(qualifier, filtered, !keep); 5682*31337658SMarcel Moolenaar } else { 5683*31337658SMarcel Moolenaar qualifier = jQuery.filter( qualifier, filtered ); 5684*31337658SMarcel Moolenaar } 5685*31337658SMarcel Moolenaar } 5686*31337658SMarcel Moolenaar 5687*31337658SMarcel Moolenaar return jQuery.grep(elements, function( elem, i ) { 5688*31337658SMarcel Moolenaar return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; 5689*31337658SMarcel Moolenaar }); 5690*31337658SMarcel Moolenaar} 5691*31337658SMarcel Moolenaar 5692*31337658SMarcel Moolenaar 5693*31337658SMarcel Moolenaar 5694*31337658SMarcel Moolenaar 5695*31337658SMarcel Moolenaarfunction createSafeFragment( document ) { 5696*31337658SMarcel Moolenaar var list = nodeNames.split( " " ), 5697*31337658SMarcel Moolenaar safeFrag = document.createDocumentFragment(); 5698*31337658SMarcel Moolenaar 5699*31337658SMarcel Moolenaar if ( safeFrag.createElement ) { 5700*31337658SMarcel Moolenaar while ( list.length ) { 5701*31337658SMarcel Moolenaar safeFrag.createElement( 5702*31337658SMarcel Moolenaar list.pop() 5703*31337658SMarcel Moolenaar ); 5704*31337658SMarcel Moolenaar } 5705*31337658SMarcel Moolenaar } 5706*31337658SMarcel Moolenaar return safeFrag; 5707*31337658SMarcel Moolenaar} 5708*31337658SMarcel Moolenaar 5709*31337658SMarcel Moolenaarvar nodeNames = "abbr article aside audio canvas datalist details figcaption figure footer " + 5710*31337658SMarcel Moolenaar "header hgroup mark meter nav output progress section summary time video", 5711*31337658SMarcel Moolenaar rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, 5712*31337658SMarcel Moolenaar rleadingWhitespace = /^\s+/, 5713*31337658SMarcel Moolenaar rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, 5714*31337658SMarcel Moolenaar rtagName = /<([\w:]+)/, 5715*31337658SMarcel Moolenaar rtbody = /<tbody/i, 5716*31337658SMarcel Moolenaar rhtml = /<|&#?\w+;/, 5717*31337658SMarcel Moolenaar rnoInnerhtml = /<(?:script|style)/i, 5718*31337658SMarcel Moolenaar rnocache = /<(?:script|object|embed|option|style)/i, 5719*31337658SMarcel Moolenaar rnoshimcache = new RegExp("<(?:" + nodeNames.replace(" ", "|") + ")", "i"), 5720*31337658SMarcel Moolenaar // checked="checked" or checked 5721*31337658SMarcel Moolenaar rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, 5722*31337658SMarcel Moolenaar rscriptType = /\/(java|ecma)script/i, 5723*31337658SMarcel Moolenaar rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/, 5724*31337658SMarcel Moolenaar wrapMap = { 5725*31337658SMarcel Moolenaar option: [ 1, "<select multiple='multiple'>", "</select>" ], 5726*31337658SMarcel Moolenaar legend: [ 1, "<fieldset>", "</fieldset>" ], 5727*31337658SMarcel Moolenaar thead: [ 1, "<table>", "</table>" ], 5728*31337658SMarcel Moolenaar tr: [ 2, "<table><tbody>", "</tbody></table>" ], 5729*31337658SMarcel Moolenaar td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], 5730*31337658SMarcel Moolenaar col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ], 5731*31337658SMarcel Moolenaar area: [ 1, "<map>", "</map>" ], 5732*31337658SMarcel Moolenaar _default: [ 0, "", "" ] 5733*31337658SMarcel Moolenaar }, 5734*31337658SMarcel Moolenaar safeFragment = createSafeFragment( document ); 5735*31337658SMarcel Moolenaar 5736*31337658SMarcel MoolenaarwrapMap.optgroup = wrapMap.option; 5737*31337658SMarcel MoolenaarwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; 5738*31337658SMarcel MoolenaarwrapMap.th = wrapMap.td; 5739*31337658SMarcel Moolenaar 5740*31337658SMarcel Moolenaar// IE can't serialize <link> and <script> tags normally 5741*31337658SMarcel Moolenaarif ( !jQuery.support.htmlSerialize ) { 5742*31337658SMarcel Moolenaar wrapMap._default = [ 1, "div<div>", "</div>" ]; 5743*31337658SMarcel Moolenaar} 5744*31337658SMarcel Moolenaar 5745*31337658SMarcel MoolenaarjQuery.fn.extend({ 5746*31337658SMarcel Moolenaar text: function( text ) { 5747*31337658SMarcel Moolenaar if ( jQuery.isFunction(text) ) { 5748*31337658SMarcel Moolenaar return this.each(function(i) { 5749*31337658SMarcel Moolenaar var self = jQuery( this ); 5750*31337658SMarcel Moolenaar 5751*31337658SMarcel Moolenaar self.text( text.call(this, i, self.text()) ); 5752*31337658SMarcel Moolenaar }); 5753*31337658SMarcel Moolenaar } 5754*31337658SMarcel Moolenaar 5755*31337658SMarcel Moolenaar if ( typeof text !== "object" && text !== undefined ) { 5756*31337658SMarcel Moolenaar return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); 5757*31337658SMarcel Moolenaar } 5758*31337658SMarcel Moolenaar 5759*31337658SMarcel Moolenaar return jQuery.text( this ); 5760*31337658SMarcel Moolenaar }, 5761*31337658SMarcel Moolenaar 5762*31337658SMarcel Moolenaar wrapAll: function( html ) { 5763*31337658SMarcel Moolenaar if ( jQuery.isFunction( html ) ) { 5764*31337658SMarcel Moolenaar return this.each(function(i) { 5765*31337658SMarcel Moolenaar jQuery(this).wrapAll( html.call(this, i) ); 5766*31337658SMarcel Moolenaar }); 5767*31337658SMarcel Moolenaar } 5768*31337658SMarcel Moolenaar 5769*31337658SMarcel Moolenaar if ( this[0] ) { 5770*31337658SMarcel Moolenaar // The elements to wrap the target around 5771*31337658SMarcel Moolenaar var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); 5772*31337658SMarcel Moolenaar 5773*31337658SMarcel Moolenaar if ( this[0].parentNode ) { 5774*31337658SMarcel Moolenaar wrap.insertBefore( this[0] ); 5775*31337658SMarcel Moolenaar } 5776*31337658SMarcel Moolenaar 5777*31337658SMarcel Moolenaar wrap.map(function() { 5778*31337658SMarcel Moolenaar var elem = this; 5779*31337658SMarcel Moolenaar 5780*31337658SMarcel Moolenaar while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { 5781*31337658SMarcel Moolenaar elem = elem.firstChild; 5782*31337658SMarcel Moolenaar } 5783*31337658SMarcel Moolenaar 5784*31337658SMarcel Moolenaar return elem; 5785*31337658SMarcel Moolenaar }).append( this ); 5786*31337658SMarcel Moolenaar } 5787*31337658SMarcel Moolenaar 5788*31337658SMarcel Moolenaar return this; 5789*31337658SMarcel Moolenaar }, 5790*31337658SMarcel Moolenaar 5791*31337658SMarcel Moolenaar wrapInner: function( html ) { 5792*31337658SMarcel Moolenaar if ( jQuery.isFunction( html ) ) { 5793*31337658SMarcel Moolenaar return this.each(function(i) { 5794*31337658SMarcel Moolenaar jQuery(this).wrapInner( html.call(this, i) ); 5795*31337658SMarcel Moolenaar }); 5796*31337658SMarcel Moolenaar } 5797*31337658SMarcel Moolenaar 5798*31337658SMarcel Moolenaar return this.each(function() { 5799*31337658SMarcel Moolenaar var self = jQuery( this ), 5800*31337658SMarcel Moolenaar contents = self.contents(); 5801*31337658SMarcel Moolenaar 5802*31337658SMarcel Moolenaar if ( contents.length ) { 5803*31337658SMarcel Moolenaar contents.wrapAll( html ); 5804*31337658SMarcel Moolenaar 5805*31337658SMarcel Moolenaar } else { 5806*31337658SMarcel Moolenaar self.append( html ); 5807*31337658SMarcel Moolenaar } 5808*31337658SMarcel Moolenaar }); 5809*31337658SMarcel Moolenaar }, 5810*31337658SMarcel Moolenaar 5811*31337658SMarcel Moolenaar wrap: function( html ) { 5812*31337658SMarcel Moolenaar return this.each(function() { 5813*31337658SMarcel Moolenaar jQuery( this ).wrapAll( html ); 5814*31337658SMarcel Moolenaar }); 5815*31337658SMarcel Moolenaar }, 5816*31337658SMarcel Moolenaar 5817*31337658SMarcel Moolenaar unwrap: function() { 5818*31337658SMarcel Moolenaar return this.parent().each(function() { 5819*31337658SMarcel Moolenaar if ( !jQuery.nodeName( this, "body" ) ) { 5820*31337658SMarcel Moolenaar jQuery( this ).replaceWith( this.childNodes ); 5821*31337658SMarcel Moolenaar } 5822*31337658SMarcel Moolenaar }).end(); 5823*31337658SMarcel Moolenaar }, 5824*31337658SMarcel Moolenaar 5825*31337658SMarcel Moolenaar append: function() { 5826*31337658SMarcel Moolenaar return this.domManip(arguments, true, function( elem ) { 5827*31337658SMarcel Moolenaar if ( this.nodeType === 1 ) { 5828*31337658SMarcel Moolenaar this.appendChild( elem ); 5829*31337658SMarcel Moolenaar } 5830*31337658SMarcel Moolenaar }); 5831*31337658SMarcel Moolenaar }, 5832*31337658SMarcel Moolenaar 5833*31337658SMarcel Moolenaar prepend: function() { 5834*31337658SMarcel Moolenaar return this.domManip(arguments, true, function( elem ) { 5835*31337658SMarcel Moolenaar if ( this.nodeType === 1 ) { 5836*31337658SMarcel Moolenaar this.insertBefore( elem, this.firstChild ); 5837*31337658SMarcel Moolenaar } 5838*31337658SMarcel Moolenaar }); 5839*31337658SMarcel Moolenaar }, 5840*31337658SMarcel Moolenaar 5841*31337658SMarcel Moolenaar before: function() { 5842*31337658SMarcel Moolenaar if ( this[0] && this[0].parentNode ) { 5843*31337658SMarcel Moolenaar return this.domManip(arguments, false, function( elem ) { 5844*31337658SMarcel Moolenaar this.parentNode.insertBefore( elem, this ); 5845*31337658SMarcel Moolenaar }); 5846*31337658SMarcel Moolenaar } else if ( arguments.length ) { 5847*31337658SMarcel Moolenaar var set = jQuery(arguments[0]); 5848*31337658SMarcel Moolenaar set.push.apply( set, this.toArray() ); 5849*31337658SMarcel Moolenaar return this.pushStack( set, "before", arguments ); 5850*31337658SMarcel Moolenaar } 5851*31337658SMarcel Moolenaar }, 5852*31337658SMarcel Moolenaar 5853*31337658SMarcel Moolenaar after: function() { 5854*31337658SMarcel Moolenaar if ( this[0] && this[0].parentNode ) { 5855*31337658SMarcel Moolenaar return this.domManip(arguments, false, function( elem ) { 5856*31337658SMarcel Moolenaar this.parentNode.insertBefore( elem, this.nextSibling ); 5857*31337658SMarcel Moolenaar }); 5858*31337658SMarcel Moolenaar } else if ( arguments.length ) { 5859*31337658SMarcel Moolenaar var set = this.pushStack( this, "after", arguments ); 5860*31337658SMarcel Moolenaar set.push.apply( set, jQuery(arguments[0]).toArray() ); 5861*31337658SMarcel Moolenaar return set; 5862*31337658SMarcel Moolenaar } 5863*31337658SMarcel Moolenaar }, 5864*31337658SMarcel Moolenaar 5865*31337658SMarcel Moolenaar // keepData is for internal use only--do not document 5866*31337658SMarcel Moolenaar remove: function( selector, keepData ) { 5867*31337658SMarcel Moolenaar for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { 5868*31337658SMarcel Moolenaar if ( !selector || jQuery.filter( selector, [ elem ] ).length ) { 5869*31337658SMarcel Moolenaar if ( !keepData && elem.nodeType === 1 ) { 5870*31337658SMarcel Moolenaar jQuery.cleanData( elem.getElementsByTagName("*") ); 5871*31337658SMarcel Moolenaar jQuery.cleanData( [ elem ] ); 5872*31337658SMarcel Moolenaar } 5873*31337658SMarcel Moolenaar 5874*31337658SMarcel Moolenaar if ( elem.parentNode ) { 5875*31337658SMarcel Moolenaar elem.parentNode.removeChild( elem ); 5876*31337658SMarcel Moolenaar } 5877*31337658SMarcel Moolenaar } 5878*31337658SMarcel Moolenaar } 5879*31337658SMarcel Moolenaar 5880*31337658SMarcel Moolenaar return this; 5881*31337658SMarcel Moolenaar }, 5882*31337658SMarcel Moolenaar 5883*31337658SMarcel Moolenaar empty: function() { 5884*31337658SMarcel Moolenaar for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { 5885*31337658SMarcel Moolenaar // Remove element nodes and prevent memory leaks 5886*31337658SMarcel Moolenaar if ( elem.nodeType === 1 ) { 5887*31337658SMarcel Moolenaar jQuery.cleanData( elem.getElementsByTagName("*") ); 5888*31337658SMarcel Moolenaar } 5889*31337658SMarcel Moolenaar 5890*31337658SMarcel Moolenaar // Remove any remaining nodes 5891*31337658SMarcel Moolenaar while ( elem.firstChild ) { 5892*31337658SMarcel Moolenaar elem.removeChild( elem.firstChild ); 5893*31337658SMarcel Moolenaar } 5894*31337658SMarcel Moolenaar } 5895*31337658SMarcel Moolenaar 5896*31337658SMarcel Moolenaar return this; 5897*31337658SMarcel Moolenaar }, 5898*31337658SMarcel Moolenaar 5899*31337658SMarcel Moolenaar clone: function( dataAndEvents, deepDataAndEvents ) { 5900*31337658SMarcel Moolenaar dataAndEvents = dataAndEvents == null ? false : dataAndEvents; 5901*31337658SMarcel Moolenaar deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; 5902*31337658SMarcel Moolenaar 5903*31337658SMarcel Moolenaar return this.map( function () { 5904*31337658SMarcel Moolenaar return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); 5905*31337658SMarcel Moolenaar }); 5906*31337658SMarcel Moolenaar }, 5907*31337658SMarcel Moolenaar 5908*31337658SMarcel Moolenaar html: function( value ) { 5909*31337658SMarcel Moolenaar if ( value === undefined ) { 5910*31337658SMarcel Moolenaar return this[0] && this[0].nodeType === 1 ? 5911*31337658SMarcel Moolenaar this[0].innerHTML.replace(rinlinejQuery, "") : 5912*31337658SMarcel Moolenaar null; 5913*31337658SMarcel Moolenaar 5914*31337658SMarcel Moolenaar // See if we can take a shortcut and just use innerHTML 5915*31337658SMarcel Moolenaar } else if ( typeof value === "string" && !rnoInnerhtml.test( value ) && 5916*31337658SMarcel Moolenaar (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) && 5917*31337658SMarcel Moolenaar !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) { 5918*31337658SMarcel Moolenaar 5919*31337658SMarcel Moolenaar value = value.replace(rxhtmlTag, "<$1></$2>"); 5920*31337658SMarcel Moolenaar 5921*31337658SMarcel Moolenaar try { 5922*31337658SMarcel Moolenaar for ( var i = 0, l = this.length; i < l; i++ ) { 5923*31337658SMarcel Moolenaar // Remove element nodes and prevent memory leaks 5924*31337658SMarcel Moolenaar if ( this[i].nodeType === 1 ) { 5925*31337658SMarcel Moolenaar jQuery.cleanData( this[i].getElementsByTagName("*") ); 5926*31337658SMarcel Moolenaar this[i].innerHTML = value; 5927*31337658SMarcel Moolenaar } 5928*31337658SMarcel Moolenaar } 5929*31337658SMarcel Moolenaar 5930*31337658SMarcel Moolenaar // If using innerHTML throws an exception, use the fallback method 5931*31337658SMarcel Moolenaar } catch(e) { 5932*31337658SMarcel Moolenaar this.empty().append( value ); 5933*31337658SMarcel Moolenaar } 5934*31337658SMarcel Moolenaar 5935*31337658SMarcel Moolenaar } else if ( jQuery.isFunction( value ) ) { 5936*31337658SMarcel Moolenaar this.each(function(i){ 5937*31337658SMarcel Moolenaar var self = jQuery( this ); 5938*31337658SMarcel Moolenaar 5939*31337658SMarcel Moolenaar self.html( value.call(this, i, self.html()) ); 5940*31337658SMarcel Moolenaar }); 5941*31337658SMarcel Moolenaar 5942*31337658SMarcel Moolenaar } else { 5943*31337658SMarcel Moolenaar this.empty().append( value ); 5944*31337658SMarcel Moolenaar } 5945*31337658SMarcel Moolenaar 5946*31337658SMarcel Moolenaar return this; 5947*31337658SMarcel Moolenaar }, 5948*31337658SMarcel Moolenaar 5949*31337658SMarcel Moolenaar replaceWith: function( value ) { 5950*31337658SMarcel Moolenaar if ( this[0] && this[0].parentNode ) { 5951*31337658SMarcel Moolenaar // Make sure that the elements are removed from the DOM before they are inserted 5952*31337658SMarcel Moolenaar // this can help fix replacing a parent with child elements 5953*31337658SMarcel Moolenaar if ( jQuery.isFunction( value ) ) { 5954*31337658SMarcel Moolenaar return this.each(function(i) { 5955*31337658SMarcel Moolenaar var self = jQuery(this), old = self.html(); 5956*31337658SMarcel Moolenaar self.replaceWith( value.call( this, i, old ) ); 5957*31337658SMarcel Moolenaar }); 5958*31337658SMarcel Moolenaar } 5959*31337658SMarcel Moolenaar 5960*31337658SMarcel Moolenaar if ( typeof value !== "string" ) { 5961*31337658SMarcel Moolenaar value = jQuery( value ).detach(); 5962*31337658SMarcel Moolenaar } 5963*31337658SMarcel Moolenaar 5964*31337658SMarcel Moolenaar return this.each(function() { 5965*31337658SMarcel Moolenaar var next = this.nextSibling, 5966*31337658SMarcel Moolenaar parent = this.parentNode; 5967*31337658SMarcel Moolenaar 5968*31337658SMarcel Moolenaar jQuery( this ).remove(); 5969*31337658SMarcel Moolenaar 5970*31337658SMarcel Moolenaar if ( next ) { 5971*31337658SMarcel Moolenaar jQuery(next).before( value ); 5972*31337658SMarcel Moolenaar } else { 5973*31337658SMarcel Moolenaar jQuery(parent).append( value ); 5974*31337658SMarcel Moolenaar } 5975*31337658SMarcel Moolenaar }); 5976*31337658SMarcel Moolenaar } else { 5977*31337658SMarcel Moolenaar return this.length ? 5978*31337658SMarcel Moolenaar this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) : 5979*31337658SMarcel Moolenaar this; 5980*31337658SMarcel Moolenaar } 5981*31337658SMarcel Moolenaar }, 5982*31337658SMarcel Moolenaar 5983*31337658SMarcel Moolenaar detach: function( selector ) { 5984*31337658SMarcel Moolenaar return this.remove( selector, true ); 5985*31337658SMarcel Moolenaar }, 5986*31337658SMarcel Moolenaar 5987*31337658SMarcel Moolenaar domManip: function( args, table, callback ) { 5988*31337658SMarcel Moolenaar var results, first, fragment, parent, 5989*31337658SMarcel Moolenaar value = args[0], 5990*31337658SMarcel Moolenaar scripts = []; 5991*31337658SMarcel Moolenaar 5992*31337658SMarcel Moolenaar // We can't cloneNode fragments that contain checked, in WebKit 5993*31337658SMarcel Moolenaar if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) { 5994*31337658SMarcel Moolenaar return this.each(function() { 5995*31337658SMarcel Moolenaar jQuery(this).domManip( args, table, callback, true ); 5996*31337658SMarcel Moolenaar }); 5997*31337658SMarcel Moolenaar } 5998*31337658SMarcel Moolenaar 5999*31337658SMarcel Moolenaar if ( jQuery.isFunction(value) ) { 6000*31337658SMarcel Moolenaar return this.each(function(i) { 6001*31337658SMarcel Moolenaar var self = jQuery(this); 6002*31337658SMarcel Moolenaar args[0] = value.call(this, i, table ? self.html() : undefined); 6003*31337658SMarcel Moolenaar self.domManip( args, table, callback ); 6004*31337658SMarcel Moolenaar }); 6005*31337658SMarcel Moolenaar } 6006*31337658SMarcel Moolenaar 6007*31337658SMarcel Moolenaar if ( this[0] ) { 6008*31337658SMarcel Moolenaar parent = value && value.parentNode; 6009*31337658SMarcel Moolenaar 6010*31337658SMarcel Moolenaar // If we're in a fragment, just use that instead of building a new one 6011*31337658SMarcel Moolenaar if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) { 6012*31337658SMarcel Moolenaar results = { fragment: parent }; 6013*31337658SMarcel Moolenaar 6014*31337658SMarcel Moolenaar } else { 6015*31337658SMarcel Moolenaar results = jQuery.buildFragment( args, this, scripts ); 6016*31337658SMarcel Moolenaar } 6017*31337658SMarcel Moolenaar 6018*31337658SMarcel Moolenaar fragment = results.fragment; 6019*31337658SMarcel Moolenaar 6020*31337658SMarcel Moolenaar if ( fragment.childNodes.length === 1 ) { 6021*31337658SMarcel Moolenaar first = fragment = fragment.firstChild; 6022*31337658SMarcel Moolenaar } else { 6023*31337658SMarcel Moolenaar first = fragment.firstChild; 6024*31337658SMarcel Moolenaar } 6025*31337658SMarcel Moolenaar 6026*31337658SMarcel Moolenaar if ( first ) { 6027*31337658SMarcel Moolenaar table = table && jQuery.nodeName( first, "tr" ); 6028*31337658SMarcel Moolenaar 6029*31337658SMarcel Moolenaar for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) { 6030*31337658SMarcel Moolenaar callback.call( 6031*31337658SMarcel Moolenaar table ? 6032*31337658SMarcel Moolenaar root(this[i], first) : 6033*31337658SMarcel Moolenaar this[i], 6034*31337658SMarcel Moolenaar // Make sure that we do not leak memory by inadvertently discarding 6035*31337658SMarcel Moolenaar // the original fragment (which might have attached data) instead of 6036*31337658SMarcel Moolenaar // using it; in addition, use the original fragment object for the last 6037*31337658SMarcel Moolenaar // item instead of first because it can end up being emptied incorrectly 6038*31337658SMarcel Moolenaar // in certain situations (Bug #8070). 6039*31337658SMarcel Moolenaar // Fragments from the fragment cache must always be cloned and never used 6040*31337658SMarcel Moolenaar // in place. 6041*31337658SMarcel Moolenaar results.cacheable || ( l > 1 && i < lastIndex ) ? 6042*31337658SMarcel Moolenaar jQuery.clone( fragment, true, true ) : 6043*31337658SMarcel Moolenaar fragment 6044*31337658SMarcel Moolenaar ); 6045*31337658SMarcel Moolenaar } 6046*31337658SMarcel Moolenaar } 6047*31337658SMarcel Moolenaar 6048*31337658SMarcel Moolenaar if ( scripts.length ) { 6049*31337658SMarcel Moolenaar jQuery.each( scripts, evalScript ); 6050*31337658SMarcel Moolenaar } 6051*31337658SMarcel Moolenaar } 6052*31337658SMarcel Moolenaar 6053*31337658SMarcel Moolenaar return this; 6054*31337658SMarcel Moolenaar } 6055*31337658SMarcel Moolenaar}); 6056*31337658SMarcel Moolenaar 6057*31337658SMarcel Moolenaarfunction root( elem, cur ) { 6058*31337658SMarcel Moolenaar return jQuery.nodeName(elem, "table") ? 6059*31337658SMarcel Moolenaar (elem.getElementsByTagName("tbody")[0] || 6060*31337658SMarcel Moolenaar elem.appendChild(elem.ownerDocument.createElement("tbody"))) : 6061*31337658SMarcel Moolenaar elem; 6062*31337658SMarcel Moolenaar} 6063*31337658SMarcel Moolenaar 6064*31337658SMarcel Moolenaarfunction cloneCopyEvent( src, dest ) { 6065*31337658SMarcel Moolenaar 6066*31337658SMarcel Moolenaar if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { 6067*31337658SMarcel Moolenaar return; 6068*31337658SMarcel Moolenaar } 6069*31337658SMarcel Moolenaar 6070*31337658SMarcel Moolenaar var type, i, l, 6071*31337658SMarcel Moolenaar oldData = jQuery._data( src ), 6072*31337658SMarcel Moolenaar curData = jQuery._data( dest, oldData ), 6073*31337658SMarcel Moolenaar events = oldData.events; 6074*31337658SMarcel Moolenaar 6075*31337658SMarcel Moolenaar if ( events ) { 6076*31337658SMarcel Moolenaar delete curData.handle; 6077*31337658SMarcel Moolenaar curData.events = {}; 6078*31337658SMarcel Moolenaar 6079*31337658SMarcel Moolenaar for ( type in events ) { 6080*31337658SMarcel Moolenaar for ( i = 0, l = events[ type ].length; i < l; i++ ) { 6081*31337658SMarcel Moolenaar jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data ); 6082*31337658SMarcel Moolenaar } 6083*31337658SMarcel Moolenaar } 6084*31337658SMarcel Moolenaar } 6085*31337658SMarcel Moolenaar 6086*31337658SMarcel Moolenaar // make the cloned public data object a copy from the original 6087*31337658SMarcel Moolenaar if ( curData.data ) { 6088*31337658SMarcel Moolenaar curData.data = jQuery.extend( {}, curData.data ); 6089*31337658SMarcel Moolenaar } 6090*31337658SMarcel Moolenaar} 6091*31337658SMarcel Moolenaar 6092*31337658SMarcel Moolenaarfunction cloneFixAttributes( src, dest ) { 6093*31337658SMarcel Moolenaar var nodeName; 6094*31337658SMarcel Moolenaar 6095*31337658SMarcel Moolenaar // We do not need to do anything for non-Elements 6096*31337658SMarcel Moolenaar if ( dest.nodeType !== 1 ) { 6097*31337658SMarcel Moolenaar return; 6098*31337658SMarcel Moolenaar } 6099*31337658SMarcel Moolenaar 6100*31337658SMarcel Moolenaar // clearAttributes removes the attributes, which we don't want, 6101*31337658SMarcel Moolenaar // but also removes the attachEvent events, which we *do* want 6102*31337658SMarcel Moolenaar if ( dest.clearAttributes ) { 6103*31337658SMarcel Moolenaar dest.clearAttributes(); 6104*31337658SMarcel Moolenaar } 6105*31337658SMarcel Moolenaar 6106*31337658SMarcel Moolenaar // mergeAttributes, in contrast, only merges back on the 6107*31337658SMarcel Moolenaar // original attributes, not the events 6108*31337658SMarcel Moolenaar if ( dest.mergeAttributes ) { 6109*31337658SMarcel Moolenaar dest.mergeAttributes( src ); 6110*31337658SMarcel Moolenaar } 6111*31337658SMarcel Moolenaar 6112*31337658SMarcel Moolenaar nodeName = dest.nodeName.toLowerCase(); 6113*31337658SMarcel Moolenaar 6114*31337658SMarcel Moolenaar // IE6-8 fail to clone children inside object elements that use 6115*31337658SMarcel Moolenaar // the proprietary classid attribute value (rather than the type 6116*31337658SMarcel Moolenaar // attribute) to identify the type of content to display 6117*31337658SMarcel Moolenaar if ( nodeName === "object" ) { 6118*31337658SMarcel Moolenaar dest.outerHTML = src.outerHTML; 6119*31337658SMarcel Moolenaar 6120*31337658SMarcel Moolenaar } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) { 6121*31337658SMarcel Moolenaar // IE6-8 fails to persist the checked state of a cloned checkbox 6122*31337658SMarcel Moolenaar // or radio button. Worse, IE6-7 fail to give the cloned element 6123*31337658SMarcel Moolenaar // a checked appearance if the defaultChecked value isn't also set 6124*31337658SMarcel Moolenaar if ( src.checked ) { 6125*31337658SMarcel Moolenaar dest.defaultChecked = dest.checked = src.checked; 6126*31337658SMarcel Moolenaar } 6127*31337658SMarcel Moolenaar 6128*31337658SMarcel Moolenaar // IE6-7 get confused and end up setting the value of a cloned 6129*31337658SMarcel Moolenaar // checkbox/radio button to an empty string instead of "on" 6130*31337658SMarcel Moolenaar if ( dest.value !== src.value ) { 6131*31337658SMarcel Moolenaar dest.value = src.value; 6132*31337658SMarcel Moolenaar } 6133*31337658SMarcel Moolenaar 6134*31337658SMarcel Moolenaar // IE6-8 fails to return the selected option to the default selected 6135*31337658SMarcel Moolenaar // state when cloning options 6136*31337658SMarcel Moolenaar } else if ( nodeName === "option" ) { 6137*31337658SMarcel Moolenaar dest.selected = src.defaultSelected; 6138*31337658SMarcel Moolenaar 6139*31337658SMarcel Moolenaar // IE6-8 fails to set the defaultValue to the correct value when 6140*31337658SMarcel Moolenaar // cloning other types of input fields 6141*31337658SMarcel Moolenaar } else if ( nodeName === "input" || nodeName === "textarea" ) { 6142*31337658SMarcel Moolenaar dest.defaultValue = src.defaultValue; 6143*31337658SMarcel Moolenaar } 6144*31337658SMarcel Moolenaar 6145*31337658SMarcel Moolenaar // Event data gets referenced instead of copied if the expando 6146*31337658SMarcel Moolenaar // gets copied too 6147*31337658SMarcel Moolenaar dest.removeAttribute( jQuery.expando ); 6148*31337658SMarcel Moolenaar} 6149*31337658SMarcel Moolenaar 6150*31337658SMarcel MoolenaarjQuery.buildFragment = function( args, nodes, scripts ) { 6151*31337658SMarcel Moolenaar var fragment, cacheable, cacheresults, doc, 6152*31337658SMarcel Moolenaar first = args[ 0 ]; 6153*31337658SMarcel Moolenaar 6154*31337658SMarcel Moolenaar // nodes may contain either an explicit document object, 6155*31337658SMarcel Moolenaar // a jQuery collection or context object. 6156*31337658SMarcel Moolenaar // If nodes[0] contains a valid object to assign to doc 6157*31337658SMarcel Moolenaar if ( nodes && nodes[0] ) { 6158*31337658SMarcel Moolenaar doc = nodes[0].ownerDocument || nodes[0]; 6159*31337658SMarcel Moolenaar } 6160*31337658SMarcel Moolenaar 6161*31337658SMarcel Moolenaar // Ensure that an attr object doesn't incorrectly stand in as a document object 6162*31337658SMarcel Moolenaar // Chrome and Firefox seem to allow this to occur and will throw exception 6163*31337658SMarcel Moolenaar // Fixes #8950 6164*31337658SMarcel Moolenaar if ( !doc.createDocumentFragment ) { 6165*31337658SMarcel Moolenaar doc = document; 6166*31337658SMarcel Moolenaar } 6167*31337658SMarcel Moolenaar 6168*31337658SMarcel Moolenaar // Only cache "small" (1/2 KB) HTML strings that are associated with the main document 6169*31337658SMarcel Moolenaar // Cloning options loses the selected state, so don't cache them 6170*31337658SMarcel Moolenaar // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment 6171*31337658SMarcel Moolenaar // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache 6172*31337658SMarcel Moolenaar // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501 6173*31337658SMarcel Moolenaar if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document && 6174*31337658SMarcel Moolenaar first.charAt(0) === "<" && !rnocache.test( first ) && 6175*31337658SMarcel Moolenaar (jQuery.support.checkClone || !rchecked.test( first )) && 6176*31337658SMarcel Moolenaar (!jQuery.support.unknownElems && rnoshimcache.test( first )) ) { 6177*31337658SMarcel Moolenaar 6178*31337658SMarcel Moolenaar cacheable = true; 6179*31337658SMarcel Moolenaar 6180*31337658SMarcel Moolenaar cacheresults = jQuery.fragments[ first ]; 6181*31337658SMarcel Moolenaar if ( cacheresults && cacheresults !== 1 ) { 6182*31337658SMarcel Moolenaar fragment = cacheresults; 6183*31337658SMarcel Moolenaar } 6184*31337658SMarcel Moolenaar } 6185*31337658SMarcel Moolenaar 6186*31337658SMarcel Moolenaar if ( !fragment ) { 6187*31337658SMarcel Moolenaar fragment = doc.createDocumentFragment(); 6188*31337658SMarcel Moolenaar jQuery.clean( args, doc, fragment, scripts ); 6189*31337658SMarcel Moolenaar } 6190*31337658SMarcel Moolenaar 6191*31337658SMarcel Moolenaar if ( cacheable ) { 6192*31337658SMarcel Moolenaar jQuery.fragments[ first ] = cacheresults ? fragment : 1; 6193*31337658SMarcel Moolenaar } 6194*31337658SMarcel Moolenaar 6195*31337658SMarcel Moolenaar return { fragment: fragment, cacheable: cacheable }; 6196*31337658SMarcel Moolenaar}; 6197*31337658SMarcel Moolenaar 6198*31337658SMarcel MoolenaarjQuery.fragments = {}; 6199*31337658SMarcel Moolenaar 6200*31337658SMarcel MoolenaarjQuery.each({ 6201*31337658SMarcel Moolenaar appendTo: "append", 6202*31337658SMarcel Moolenaar prependTo: "prepend", 6203*31337658SMarcel Moolenaar insertBefore: "before", 6204*31337658SMarcel Moolenaar insertAfter: "after", 6205*31337658SMarcel Moolenaar replaceAll: "replaceWith" 6206*31337658SMarcel Moolenaar}, function( name, original ) { 6207*31337658SMarcel Moolenaar jQuery.fn[ name ] = function( selector ) { 6208*31337658SMarcel Moolenaar var ret = [], 6209*31337658SMarcel Moolenaar insert = jQuery( selector ), 6210*31337658SMarcel Moolenaar parent = this.length === 1 && this[0].parentNode; 6211*31337658SMarcel Moolenaar 6212*31337658SMarcel Moolenaar if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) { 6213*31337658SMarcel Moolenaar insert[ original ]( this[0] ); 6214*31337658SMarcel Moolenaar return this; 6215*31337658SMarcel Moolenaar 6216*31337658SMarcel Moolenaar } else { 6217*31337658SMarcel Moolenaar for ( var i = 0, l = insert.length; i < l; i++ ) { 6218*31337658SMarcel Moolenaar var elems = ( i > 0 ? this.clone(true) : this ).get(); 6219*31337658SMarcel Moolenaar jQuery( insert[i] )[ original ]( elems ); 6220*31337658SMarcel Moolenaar ret = ret.concat( elems ); 6221*31337658SMarcel Moolenaar } 6222*31337658SMarcel Moolenaar 6223*31337658SMarcel Moolenaar return this.pushStack( ret, name, insert.selector ); 6224*31337658SMarcel Moolenaar } 6225*31337658SMarcel Moolenaar }; 6226*31337658SMarcel Moolenaar}); 6227*31337658SMarcel Moolenaar 6228*31337658SMarcel Moolenaarfunction getAll( elem ) { 6229*31337658SMarcel Moolenaar if ( typeof elem.getElementsByTagName !== "undefined" ) { 6230*31337658SMarcel Moolenaar return elem.getElementsByTagName( "*" ); 6231*31337658SMarcel Moolenaar 6232*31337658SMarcel Moolenaar } else if ( typeof elem.querySelectorAll !== "undefined" ) { 6233*31337658SMarcel Moolenaar return elem.querySelectorAll( "*" ); 6234*31337658SMarcel Moolenaar 6235*31337658SMarcel Moolenaar } else { 6236*31337658SMarcel Moolenaar return []; 6237*31337658SMarcel Moolenaar } 6238*31337658SMarcel Moolenaar} 6239*31337658SMarcel Moolenaar 6240*31337658SMarcel Moolenaar// Used in clean, fixes the defaultChecked property 6241*31337658SMarcel Moolenaarfunction fixDefaultChecked( elem ) { 6242*31337658SMarcel Moolenaar if ( elem.type === "checkbox" || elem.type === "radio" ) { 6243*31337658SMarcel Moolenaar elem.defaultChecked = elem.checked; 6244*31337658SMarcel Moolenaar } 6245*31337658SMarcel Moolenaar} 6246*31337658SMarcel Moolenaar// Finds all inputs and passes them to fixDefaultChecked 6247*31337658SMarcel Moolenaarfunction findInputs( elem ) { 6248*31337658SMarcel Moolenaar var nodeName = ( elem.nodeName || "" ).toLowerCase(); 6249*31337658SMarcel Moolenaar if ( nodeName === "input" ) { 6250*31337658SMarcel Moolenaar fixDefaultChecked( elem ); 6251*31337658SMarcel Moolenaar // Skip scripts, get other children 6252*31337658SMarcel Moolenaar } else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) { 6253*31337658SMarcel Moolenaar jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked ); 6254*31337658SMarcel Moolenaar } 6255*31337658SMarcel Moolenaar} 6256*31337658SMarcel Moolenaar 6257*31337658SMarcel MoolenaarjQuery.extend({ 6258*31337658SMarcel Moolenaar clone: function( elem, dataAndEvents, deepDataAndEvents ) { 6259*31337658SMarcel Moolenaar var clone = elem.cloneNode(true), 6260*31337658SMarcel Moolenaar srcElements, 6261*31337658SMarcel Moolenaar destElements, 6262*31337658SMarcel Moolenaar i; 6263*31337658SMarcel Moolenaar 6264*31337658SMarcel Moolenaar if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && 6265*31337658SMarcel Moolenaar (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { 6266*31337658SMarcel Moolenaar // IE copies events bound via attachEvent when using cloneNode. 6267*31337658SMarcel Moolenaar // Calling detachEvent on the clone will also remove the events 6268*31337658SMarcel Moolenaar // from the original. In order to get around this, we use some 6269*31337658SMarcel Moolenaar // proprietary methods to clear the events. Thanks to MooTools 6270*31337658SMarcel Moolenaar // guys for this hotness. 6271*31337658SMarcel Moolenaar 6272*31337658SMarcel Moolenaar cloneFixAttributes( elem, clone ); 6273*31337658SMarcel Moolenaar 6274*31337658SMarcel Moolenaar // Using Sizzle here is crazy slow, so we use getElementsByTagName 6275*31337658SMarcel Moolenaar // instead 6276*31337658SMarcel Moolenaar srcElements = getAll( elem ); 6277*31337658SMarcel Moolenaar destElements = getAll( clone ); 6278*31337658SMarcel Moolenaar 6279*31337658SMarcel Moolenaar // Weird iteration because IE will replace the length property 6280*31337658SMarcel Moolenaar // with an element if you are cloning the body and one of the 6281*31337658SMarcel Moolenaar // elements on the page has a name or id of "length" 6282*31337658SMarcel Moolenaar for ( i = 0; srcElements[i]; ++i ) { 6283*31337658SMarcel Moolenaar // Ensure that the destination node is not null; Fixes #9587 6284*31337658SMarcel Moolenaar if ( destElements[i] ) { 6285*31337658SMarcel Moolenaar cloneFixAttributes( srcElements[i], destElements[i] ); 6286*31337658SMarcel Moolenaar } 6287*31337658SMarcel Moolenaar } 6288*31337658SMarcel Moolenaar } 6289*31337658SMarcel Moolenaar 6290*31337658SMarcel Moolenaar // Copy the events from the original to the clone 6291*31337658SMarcel Moolenaar if ( dataAndEvents ) { 6292*31337658SMarcel Moolenaar cloneCopyEvent( elem, clone ); 6293*31337658SMarcel Moolenaar 6294*31337658SMarcel Moolenaar if ( deepDataAndEvents ) { 6295*31337658SMarcel Moolenaar srcElements = getAll( elem ); 6296*31337658SMarcel Moolenaar destElements = getAll( clone ); 6297*31337658SMarcel Moolenaar 6298*31337658SMarcel Moolenaar for ( i = 0; srcElements[i]; ++i ) { 6299*31337658SMarcel Moolenaar cloneCopyEvent( srcElements[i], destElements[i] ); 6300*31337658SMarcel Moolenaar } 6301*31337658SMarcel Moolenaar } 6302*31337658SMarcel Moolenaar } 6303*31337658SMarcel Moolenaar 6304*31337658SMarcel Moolenaar srcElements = destElements = null; 6305*31337658SMarcel Moolenaar 6306*31337658SMarcel Moolenaar // Return the cloned set 6307*31337658SMarcel Moolenaar return clone; 6308*31337658SMarcel Moolenaar }, 6309*31337658SMarcel Moolenaar 6310*31337658SMarcel Moolenaar clean: function( elems, context, fragment, scripts ) { 6311*31337658SMarcel Moolenaar var checkScriptType; 6312*31337658SMarcel Moolenaar 6313*31337658SMarcel Moolenaar context = context || document; 6314*31337658SMarcel Moolenaar 6315*31337658SMarcel Moolenaar // !context.createElement fails in IE with an error but returns typeof 'object' 6316*31337658SMarcel Moolenaar if ( typeof context.createElement === "undefined" ) { 6317*31337658SMarcel Moolenaar context = context.ownerDocument || context[0] && context[0].ownerDocument || document; 6318*31337658SMarcel Moolenaar } 6319*31337658SMarcel Moolenaar 6320*31337658SMarcel Moolenaar var ret = [], j; 6321*31337658SMarcel Moolenaar 6322*31337658SMarcel Moolenaar for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { 6323*31337658SMarcel Moolenaar if ( typeof elem === "number" ) { 6324*31337658SMarcel Moolenaar elem += ""; 6325*31337658SMarcel Moolenaar } 6326*31337658SMarcel Moolenaar 6327*31337658SMarcel Moolenaar if ( !elem ) { 6328*31337658SMarcel Moolenaar continue; 6329*31337658SMarcel Moolenaar } 6330*31337658SMarcel Moolenaar 6331*31337658SMarcel Moolenaar // Convert html string into DOM nodes 6332*31337658SMarcel Moolenaar if ( typeof elem === "string" ) { 6333*31337658SMarcel Moolenaar if ( !rhtml.test( elem ) ) { 6334*31337658SMarcel Moolenaar elem = context.createTextNode( elem ); 6335*31337658SMarcel Moolenaar } else { 6336*31337658SMarcel Moolenaar // Fix "XHTML"-style tags in all browsers 6337*31337658SMarcel Moolenaar elem = elem.replace(rxhtmlTag, "<$1></$2>"); 6338*31337658SMarcel Moolenaar 6339*31337658SMarcel Moolenaar // Trim whitespace, otherwise indexOf won't work as expected 6340*31337658SMarcel Moolenaar var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(), 6341*31337658SMarcel Moolenaar wrap = wrapMap[ tag ] || wrapMap._default, 6342*31337658SMarcel Moolenaar depth = wrap[0], 6343*31337658SMarcel Moolenaar div = context.createElement("div"); 6344*31337658SMarcel Moolenaar 6345*31337658SMarcel Moolenaar // Append wrapper element to unknown element safe doc fragment 6346*31337658SMarcel Moolenaar if ( context === document ) { 6347*31337658SMarcel Moolenaar // Use the fragment we've already created for this document 6348*31337658SMarcel Moolenaar safeFragment.appendChild( div ); 6349*31337658SMarcel Moolenaar } else { 6350*31337658SMarcel Moolenaar // Use a fragment created with the owner document 6351*31337658SMarcel Moolenaar createSafeFragment( context ).appendChild( div ); 6352*31337658SMarcel Moolenaar } 6353*31337658SMarcel Moolenaar 6354*31337658SMarcel Moolenaar // Go to html and back, then peel off extra wrappers 6355*31337658SMarcel Moolenaar div.innerHTML = wrap[1] + elem + wrap[2]; 6356*31337658SMarcel Moolenaar 6357*31337658SMarcel Moolenaar // Move to the right depth 6358*31337658SMarcel Moolenaar while ( depth-- ) { 6359*31337658SMarcel Moolenaar div = div.lastChild; 6360*31337658SMarcel Moolenaar } 6361*31337658SMarcel Moolenaar 6362*31337658SMarcel Moolenaar // Remove IE's autoinserted <tbody> from table fragments 6363*31337658SMarcel Moolenaar if ( !jQuery.support.tbody ) { 6364*31337658SMarcel Moolenaar 6365*31337658SMarcel Moolenaar // String was a <table>, *may* have spurious <tbody> 6366*31337658SMarcel Moolenaar var hasBody = rtbody.test(elem), 6367*31337658SMarcel Moolenaar tbody = tag === "table" && !hasBody ? 6368*31337658SMarcel Moolenaar div.firstChild && div.firstChild.childNodes : 6369*31337658SMarcel Moolenaar 6370*31337658SMarcel Moolenaar // String was a bare <thead> or <tfoot> 6371*31337658SMarcel Moolenaar wrap[1] === "<table>" && !hasBody ? 6372*31337658SMarcel Moolenaar div.childNodes : 6373*31337658SMarcel Moolenaar []; 6374*31337658SMarcel Moolenaar 6375*31337658SMarcel Moolenaar for ( j = tbody.length - 1; j >= 0 ; --j ) { 6376*31337658SMarcel Moolenaar if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) { 6377*31337658SMarcel Moolenaar tbody[ j ].parentNode.removeChild( tbody[ j ] ); 6378*31337658SMarcel Moolenaar } 6379*31337658SMarcel Moolenaar } 6380*31337658SMarcel Moolenaar } 6381*31337658SMarcel Moolenaar 6382*31337658SMarcel Moolenaar // IE completely kills leading whitespace when innerHTML is used 6383*31337658SMarcel Moolenaar if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { 6384*31337658SMarcel Moolenaar div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild ); 6385*31337658SMarcel Moolenaar } 6386*31337658SMarcel Moolenaar 6387*31337658SMarcel Moolenaar elem = div.childNodes; 6388*31337658SMarcel Moolenaar } 6389*31337658SMarcel Moolenaar } 6390*31337658SMarcel Moolenaar 6391*31337658SMarcel Moolenaar // Resets defaultChecked for any radios and checkboxes 6392*31337658SMarcel Moolenaar // about to be appended to the DOM in IE 6/7 (#8060) 6393*31337658SMarcel Moolenaar var len; 6394*31337658SMarcel Moolenaar if ( !jQuery.support.appendChecked ) { 6395*31337658SMarcel Moolenaar if ( elem[0] && typeof (len = elem.length) === "number" ) { 6396*31337658SMarcel Moolenaar for ( j = 0; j < len; j++ ) { 6397*31337658SMarcel Moolenaar findInputs( elem[j] ); 6398*31337658SMarcel Moolenaar } 6399*31337658SMarcel Moolenaar } else { 6400*31337658SMarcel Moolenaar findInputs( elem ); 6401*31337658SMarcel Moolenaar } 6402*31337658SMarcel Moolenaar } 6403*31337658SMarcel Moolenaar 6404*31337658SMarcel Moolenaar if ( elem.nodeType ) { 6405*31337658SMarcel Moolenaar ret.push( elem ); 6406*31337658SMarcel Moolenaar } else { 6407*31337658SMarcel Moolenaar ret = jQuery.merge( ret, elem ); 6408*31337658SMarcel Moolenaar } 6409*31337658SMarcel Moolenaar } 6410*31337658SMarcel Moolenaar 6411*31337658SMarcel Moolenaar if ( fragment ) { 6412*31337658SMarcel Moolenaar checkScriptType = function( elem ) { 6413*31337658SMarcel Moolenaar return !elem.type || rscriptType.test( elem.type ); 6414*31337658SMarcel Moolenaar }; 6415*31337658SMarcel Moolenaar for ( i = 0; ret[i]; i++ ) { 6416*31337658SMarcel Moolenaar if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) { 6417*31337658SMarcel Moolenaar scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] ); 6418*31337658SMarcel Moolenaar 6419*31337658SMarcel Moolenaar } else { 6420*31337658SMarcel Moolenaar if ( ret[i].nodeType === 1 ) { 6421*31337658SMarcel Moolenaar var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType ); 6422*31337658SMarcel Moolenaar 6423*31337658SMarcel Moolenaar ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) ); 6424*31337658SMarcel Moolenaar } 6425*31337658SMarcel Moolenaar fragment.appendChild( ret[i] ); 6426*31337658SMarcel Moolenaar } 6427*31337658SMarcel Moolenaar } 6428*31337658SMarcel Moolenaar } 6429*31337658SMarcel Moolenaar 6430*31337658SMarcel Moolenaar return ret; 6431*31337658SMarcel Moolenaar }, 6432*31337658SMarcel Moolenaar 6433*31337658SMarcel Moolenaar cleanData: function( elems ) { 6434*31337658SMarcel Moolenaar var data, id, 6435*31337658SMarcel Moolenaar cache = jQuery.cache, 6436*31337658SMarcel Moolenaar special = jQuery.event.special, 6437*31337658SMarcel Moolenaar deleteExpando = jQuery.support.deleteExpando; 6438*31337658SMarcel Moolenaar 6439*31337658SMarcel Moolenaar for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { 6440*31337658SMarcel Moolenaar if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { 6441*31337658SMarcel Moolenaar continue; 6442*31337658SMarcel Moolenaar } 6443*31337658SMarcel Moolenaar 6444*31337658SMarcel Moolenaar id = elem[ jQuery.expando ]; 6445*31337658SMarcel Moolenaar 6446*31337658SMarcel Moolenaar if ( id ) { 6447*31337658SMarcel Moolenaar data = cache[ id ]; 6448*31337658SMarcel Moolenaar 6449*31337658SMarcel Moolenaar if ( data && data.events ) { 6450*31337658SMarcel Moolenaar for ( var type in data.events ) { 6451*31337658SMarcel Moolenaar if ( special[ type ] ) { 6452*31337658SMarcel Moolenaar jQuery.event.remove( elem, type ); 6453*31337658SMarcel Moolenaar 6454*31337658SMarcel Moolenaar // This is a shortcut to avoid jQuery.event.remove's overhead 6455*31337658SMarcel Moolenaar } else { 6456*31337658SMarcel Moolenaar jQuery.removeEvent( elem, type, data.handle ); 6457*31337658SMarcel Moolenaar } 6458*31337658SMarcel Moolenaar } 6459*31337658SMarcel Moolenaar 6460*31337658SMarcel Moolenaar // Null the DOM reference to avoid IE6/7/8 leak (#7054) 6461*31337658SMarcel Moolenaar if ( data.handle ) { 6462*31337658SMarcel Moolenaar data.handle.elem = null; 6463*31337658SMarcel Moolenaar } 6464*31337658SMarcel Moolenaar } 6465*31337658SMarcel Moolenaar 6466*31337658SMarcel Moolenaar if ( deleteExpando ) { 6467*31337658SMarcel Moolenaar delete elem[ jQuery.expando ]; 6468*31337658SMarcel Moolenaar 6469*31337658SMarcel Moolenaar } else if ( elem.removeAttribute ) { 6470*31337658SMarcel Moolenaar elem.removeAttribute( jQuery.expando ); 6471*31337658SMarcel Moolenaar } 6472*31337658SMarcel Moolenaar 6473*31337658SMarcel Moolenaar delete cache[ id ]; 6474*31337658SMarcel Moolenaar } 6475*31337658SMarcel Moolenaar } 6476*31337658SMarcel Moolenaar } 6477*31337658SMarcel Moolenaar}); 6478*31337658SMarcel Moolenaar 6479*31337658SMarcel Moolenaarfunction evalScript( i, elem ) { 6480*31337658SMarcel Moolenaar if ( elem.src ) { 6481*31337658SMarcel Moolenaar jQuery.ajax({ 6482*31337658SMarcel Moolenaar url: elem.src, 6483*31337658SMarcel Moolenaar async: false, 6484*31337658SMarcel Moolenaar dataType: "script" 6485*31337658SMarcel Moolenaar }); 6486*31337658SMarcel Moolenaar } else { 6487*31337658SMarcel Moolenaar jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) ); 6488*31337658SMarcel Moolenaar } 6489*31337658SMarcel Moolenaar 6490*31337658SMarcel Moolenaar if ( elem.parentNode ) { 6491*31337658SMarcel Moolenaar elem.parentNode.removeChild( elem ); 6492*31337658SMarcel Moolenaar } 6493*31337658SMarcel Moolenaar} 6494*31337658SMarcel Moolenaar 6495*31337658SMarcel Moolenaar 6496*31337658SMarcel Moolenaar 6497*31337658SMarcel Moolenaar 6498*31337658SMarcel Moolenaarvar ralpha = /alpha\([^)]*\)/i, 6499*31337658SMarcel Moolenaar ropacity = /opacity=([^)]*)/, 6500*31337658SMarcel Moolenaar // fixed for IE9, see #8346 6501*31337658SMarcel Moolenaar rupper = /([A-Z]|^ms)/g, 6502*31337658SMarcel Moolenaar rnumpx = /^-?\d+(?:px)?$/i, 6503*31337658SMarcel Moolenaar rnum = /^-?\d/, 6504*31337658SMarcel Moolenaar rrelNum = /^([\-+])=([\-+.\de]+)/, 6505*31337658SMarcel Moolenaar 6506*31337658SMarcel Moolenaar cssShow = { position: "absolute", visibility: "hidden", display: "block" }, 6507*31337658SMarcel Moolenaar cssWidth = [ "Left", "Right" ], 6508*31337658SMarcel Moolenaar cssHeight = [ "Top", "Bottom" ], 6509*31337658SMarcel Moolenaar curCSS, 6510*31337658SMarcel Moolenaar 6511*31337658SMarcel Moolenaar getComputedStyle, 6512*31337658SMarcel Moolenaar currentStyle; 6513*31337658SMarcel Moolenaar 6514*31337658SMarcel MoolenaarjQuery.fn.css = function( name, value ) { 6515*31337658SMarcel Moolenaar // Setting 'undefined' is a no-op 6516*31337658SMarcel Moolenaar if ( arguments.length === 2 && value === undefined ) { 6517*31337658SMarcel Moolenaar return this; 6518*31337658SMarcel Moolenaar } 6519*31337658SMarcel Moolenaar 6520*31337658SMarcel Moolenaar return jQuery.access( this, name, value, true, function( elem, name, value ) { 6521*31337658SMarcel Moolenaar return value !== undefined ? 6522*31337658SMarcel Moolenaar jQuery.style( elem, name, value ) : 6523*31337658SMarcel Moolenaar jQuery.css( elem, name ); 6524*31337658SMarcel Moolenaar }); 6525*31337658SMarcel Moolenaar}; 6526*31337658SMarcel Moolenaar 6527*31337658SMarcel MoolenaarjQuery.extend({ 6528*31337658SMarcel Moolenaar // Add in style property hooks for overriding the default 6529*31337658SMarcel Moolenaar // behavior of getting and setting a style property 6530*31337658SMarcel Moolenaar cssHooks: { 6531*31337658SMarcel Moolenaar opacity: { 6532*31337658SMarcel Moolenaar get: function( elem, computed ) { 6533*31337658SMarcel Moolenaar if ( computed ) { 6534*31337658SMarcel Moolenaar // We should always get a number back from opacity 6535*31337658SMarcel Moolenaar var ret = curCSS( elem, "opacity", "opacity" ); 6536*31337658SMarcel Moolenaar return ret === "" ? "1" : ret; 6537*31337658SMarcel Moolenaar 6538*31337658SMarcel Moolenaar } else { 6539*31337658SMarcel Moolenaar return elem.style.opacity; 6540*31337658SMarcel Moolenaar } 6541*31337658SMarcel Moolenaar } 6542*31337658SMarcel Moolenaar } 6543*31337658SMarcel Moolenaar }, 6544*31337658SMarcel Moolenaar 6545*31337658SMarcel Moolenaar // Exclude the following css properties to add px 6546*31337658SMarcel Moolenaar cssNumber: { 6547*31337658SMarcel Moolenaar "fillOpacity": true, 6548*31337658SMarcel Moolenaar "fontWeight": true, 6549*31337658SMarcel Moolenaar "lineHeight": true, 6550*31337658SMarcel Moolenaar "opacity": true, 6551*31337658SMarcel Moolenaar "orphans": true, 6552*31337658SMarcel Moolenaar "widows": true, 6553*31337658SMarcel Moolenaar "zIndex": true, 6554*31337658SMarcel Moolenaar "zoom": true 6555*31337658SMarcel Moolenaar }, 6556*31337658SMarcel Moolenaar 6557*31337658SMarcel Moolenaar // Add in properties whose names you wish to fix before 6558*31337658SMarcel Moolenaar // setting or getting the value 6559*31337658SMarcel Moolenaar cssProps: { 6560*31337658SMarcel Moolenaar // normalize float css property 6561*31337658SMarcel Moolenaar "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" 6562*31337658SMarcel Moolenaar }, 6563*31337658SMarcel Moolenaar 6564*31337658SMarcel Moolenaar // Get and set the style property on a DOM Node 6565*31337658SMarcel Moolenaar style: function( elem, name, value, extra ) { 6566*31337658SMarcel Moolenaar // Don't set styles on text and comment nodes 6567*31337658SMarcel Moolenaar if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { 6568*31337658SMarcel Moolenaar return; 6569*31337658SMarcel Moolenaar } 6570*31337658SMarcel Moolenaar 6571*31337658SMarcel Moolenaar // Make sure that we're working with the right name 6572*31337658SMarcel Moolenaar var ret, type, origName = jQuery.camelCase( name ), 6573*31337658SMarcel Moolenaar style = elem.style, hooks = jQuery.cssHooks[ origName ]; 6574*31337658SMarcel Moolenaar 6575*31337658SMarcel Moolenaar name = jQuery.cssProps[ origName ] || origName; 6576*31337658SMarcel Moolenaar 6577*31337658SMarcel Moolenaar // Check if we're setting a value 6578*31337658SMarcel Moolenaar if ( value !== undefined ) { 6579*31337658SMarcel Moolenaar type = typeof value; 6580*31337658SMarcel Moolenaar 6581*31337658SMarcel Moolenaar // convert relative number strings (+= or -=) to relative numbers. #7345 6582*31337658SMarcel Moolenaar if ( type === "string" && (ret = rrelNum.exec( value )) ) { 6583*31337658SMarcel Moolenaar value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) ); 6584*31337658SMarcel Moolenaar // Fixes bug #9237 6585*31337658SMarcel Moolenaar type = "number"; 6586*31337658SMarcel Moolenaar } 6587*31337658SMarcel Moolenaar 6588*31337658SMarcel Moolenaar // Make sure that NaN and null values aren't set. See: #7116 6589*31337658SMarcel Moolenaar if ( value == null || type === "number" && isNaN( value ) ) { 6590*31337658SMarcel Moolenaar return; 6591*31337658SMarcel Moolenaar } 6592*31337658SMarcel Moolenaar 6593*31337658SMarcel Moolenaar // If a number was passed in, add 'px' to the (except for certain CSS properties) 6594*31337658SMarcel Moolenaar if ( type === "number" && !jQuery.cssNumber[ origName ] ) { 6595*31337658SMarcel Moolenaar value += "px"; 6596*31337658SMarcel Moolenaar } 6597*31337658SMarcel Moolenaar 6598*31337658SMarcel Moolenaar // If a hook was provided, use that value, otherwise just set the specified value 6599*31337658SMarcel Moolenaar if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) { 6600*31337658SMarcel Moolenaar // Wrapped to prevent IE from throwing errors when 'invalid' values are provided 6601*31337658SMarcel Moolenaar // Fixes bug #5509 6602*31337658SMarcel Moolenaar try { 6603*31337658SMarcel Moolenaar style[ name ] = value; 6604*31337658SMarcel Moolenaar } catch(e) {} 6605*31337658SMarcel Moolenaar } 6606*31337658SMarcel Moolenaar 6607*31337658SMarcel Moolenaar } else { 6608*31337658SMarcel Moolenaar // If a hook was provided get the non-computed value from there 6609*31337658SMarcel Moolenaar if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { 6610*31337658SMarcel Moolenaar return ret; 6611*31337658SMarcel Moolenaar } 6612*31337658SMarcel Moolenaar 6613*31337658SMarcel Moolenaar // Otherwise just get the value from the style object 6614*31337658SMarcel Moolenaar return style[ name ]; 6615*31337658SMarcel Moolenaar } 6616*31337658SMarcel Moolenaar }, 6617*31337658SMarcel Moolenaar 6618*31337658SMarcel Moolenaar css: function( elem, name, extra ) { 6619*31337658SMarcel Moolenaar var ret, hooks; 6620*31337658SMarcel Moolenaar 6621*31337658SMarcel Moolenaar // Make sure that we're working with the right name 6622*31337658SMarcel Moolenaar name = jQuery.camelCase( name ); 6623*31337658SMarcel Moolenaar hooks = jQuery.cssHooks[ name ]; 6624*31337658SMarcel Moolenaar name = jQuery.cssProps[ name ] || name; 6625*31337658SMarcel Moolenaar 6626*31337658SMarcel Moolenaar // cssFloat needs a special treatment 6627*31337658SMarcel Moolenaar if ( name === "cssFloat" ) { 6628*31337658SMarcel Moolenaar name = "float"; 6629*31337658SMarcel Moolenaar } 6630*31337658SMarcel Moolenaar 6631*31337658SMarcel Moolenaar // If a hook was provided get the computed value from there 6632*31337658SMarcel Moolenaar if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) { 6633*31337658SMarcel Moolenaar return ret; 6634*31337658SMarcel Moolenaar 6635*31337658SMarcel Moolenaar // Otherwise, if a way to get the computed value exists, use that 6636*31337658SMarcel Moolenaar } else if ( curCSS ) { 6637*31337658SMarcel Moolenaar return curCSS( elem, name ); 6638*31337658SMarcel Moolenaar } 6639*31337658SMarcel Moolenaar }, 6640*31337658SMarcel Moolenaar 6641*31337658SMarcel Moolenaar // A method for quickly swapping in/out CSS properties to get correct calculations 6642*31337658SMarcel Moolenaar swap: function( elem, options, callback ) { 6643*31337658SMarcel Moolenaar var old = {}; 6644*31337658SMarcel Moolenaar 6645*31337658SMarcel Moolenaar // Remember the old values, and insert the new ones 6646*31337658SMarcel Moolenaar for ( var name in options ) { 6647*31337658SMarcel Moolenaar old[ name ] = elem.style[ name ]; 6648*31337658SMarcel Moolenaar elem.style[ name ] = options[ name ]; 6649*31337658SMarcel Moolenaar } 6650*31337658SMarcel Moolenaar 6651*31337658SMarcel Moolenaar callback.call( elem ); 6652*31337658SMarcel Moolenaar 6653*31337658SMarcel Moolenaar // Revert the old values 6654*31337658SMarcel Moolenaar for ( name in options ) { 6655*31337658SMarcel Moolenaar elem.style[ name ] = old[ name ]; 6656*31337658SMarcel Moolenaar } 6657*31337658SMarcel Moolenaar } 6658*31337658SMarcel Moolenaar}); 6659*31337658SMarcel Moolenaar 6660*31337658SMarcel Moolenaar// DEPRECATED, Use jQuery.css() instead 6661*31337658SMarcel MoolenaarjQuery.curCSS = jQuery.css; 6662*31337658SMarcel Moolenaar 6663*31337658SMarcel MoolenaarjQuery.each(["height", "width"], function( i, name ) { 6664*31337658SMarcel Moolenaar jQuery.cssHooks[ name ] = { 6665*31337658SMarcel Moolenaar get: function( elem, computed, extra ) { 6666*31337658SMarcel Moolenaar var val; 6667*31337658SMarcel Moolenaar 6668*31337658SMarcel Moolenaar if ( computed ) { 6669*31337658SMarcel Moolenaar if ( elem.offsetWidth !== 0 ) { 6670*31337658SMarcel Moolenaar return getWH( elem, name, extra ); 6671*31337658SMarcel Moolenaar } else { 6672*31337658SMarcel Moolenaar jQuery.swap( elem, cssShow, function() { 6673*31337658SMarcel Moolenaar val = getWH( elem, name, extra ); 6674*31337658SMarcel Moolenaar }); 6675*31337658SMarcel Moolenaar } 6676*31337658SMarcel Moolenaar 6677*31337658SMarcel Moolenaar return val; 6678*31337658SMarcel Moolenaar } 6679*31337658SMarcel Moolenaar }, 6680*31337658SMarcel Moolenaar 6681*31337658SMarcel Moolenaar set: function( elem, value ) { 6682*31337658SMarcel Moolenaar if ( rnumpx.test( value ) ) { 6683*31337658SMarcel Moolenaar // ignore negative width and height values #1599 6684*31337658SMarcel Moolenaar value = parseFloat( value ); 6685*31337658SMarcel Moolenaar 6686*31337658SMarcel Moolenaar if ( value >= 0 ) { 6687*31337658SMarcel Moolenaar return value + "px"; 6688*31337658SMarcel Moolenaar } 6689*31337658SMarcel Moolenaar 6690*31337658SMarcel Moolenaar } else { 6691*31337658SMarcel Moolenaar return value; 6692*31337658SMarcel Moolenaar } 6693*31337658SMarcel Moolenaar } 6694*31337658SMarcel Moolenaar }; 6695*31337658SMarcel Moolenaar}); 6696*31337658SMarcel Moolenaar 6697*31337658SMarcel Moolenaarif ( !jQuery.support.opacity ) { 6698*31337658SMarcel Moolenaar jQuery.cssHooks.opacity = { 6699*31337658SMarcel Moolenaar get: function( elem, computed ) { 6700*31337658SMarcel Moolenaar // IE uses filters for opacity 6701*31337658SMarcel Moolenaar return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ? 6702*31337658SMarcel Moolenaar ( parseFloat( RegExp.$1 ) / 100 ) + "" : 6703*31337658SMarcel Moolenaar computed ? "1" : ""; 6704*31337658SMarcel Moolenaar }, 6705*31337658SMarcel Moolenaar 6706*31337658SMarcel Moolenaar set: function( elem, value ) { 6707*31337658SMarcel Moolenaar var style = elem.style, 6708*31337658SMarcel Moolenaar currentStyle = elem.currentStyle, 6709*31337658SMarcel Moolenaar opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "", 6710*31337658SMarcel Moolenaar filter = currentStyle && currentStyle.filter || style.filter || ""; 6711*31337658SMarcel Moolenaar 6712*31337658SMarcel Moolenaar // IE has trouble with opacity if it does not have layout 6713*31337658SMarcel Moolenaar // Force it by setting the zoom level 6714*31337658SMarcel Moolenaar style.zoom = 1; 6715*31337658SMarcel Moolenaar 6716*31337658SMarcel Moolenaar // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652 6717*31337658SMarcel Moolenaar if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) { 6718*31337658SMarcel Moolenaar 6719*31337658SMarcel Moolenaar // Setting style.filter to null, "" & " " still leave "filter:" in the cssText 6720*31337658SMarcel Moolenaar // if "filter:" is present at all, clearType is disabled, we want to avoid this 6721*31337658SMarcel Moolenaar // style.removeAttribute is IE Only, but so apparently is this code path... 6722*31337658SMarcel Moolenaar style.removeAttribute( "filter" ); 6723*31337658SMarcel Moolenaar 6724*31337658SMarcel Moolenaar // if there there is no filter style applied in a css rule, we are done 6725*31337658SMarcel Moolenaar if ( currentStyle && !currentStyle.filter ) { 6726*31337658SMarcel Moolenaar return; 6727*31337658SMarcel Moolenaar } 6728*31337658SMarcel Moolenaar } 6729*31337658SMarcel Moolenaar 6730*31337658SMarcel Moolenaar // otherwise, set new filter values 6731*31337658SMarcel Moolenaar style.filter = ralpha.test( filter ) ? 6732*31337658SMarcel Moolenaar filter.replace( ralpha, opacity ) : 6733*31337658SMarcel Moolenaar filter + " " + opacity; 6734*31337658SMarcel Moolenaar } 6735*31337658SMarcel Moolenaar }; 6736*31337658SMarcel Moolenaar} 6737*31337658SMarcel Moolenaar 6738*31337658SMarcel MoolenaarjQuery(function() { 6739*31337658SMarcel Moolenaar // This hook cannot be added until DOM ready because the support test 6740*31337658SMarcel Moolenaar // for it is not run until after DOM ready 6741*31337658SMarcel Moolenaar if ( !jQuery.support.reliableMarginRight ) { 6742*31337658SMarcel Moolenaar jQuery.cssHooks.marginRight = { 6743*31337658SMarcel Moolenaar get: function( elem, computed ) { 6744*31337658SMarcel Moolenaar // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right 6745*31337658SMarcel Moolenaar // Work around by temporarily setting element display to inline-block 6746*31337658SMarcel Moolenaar var ret; 6747*31337658SMarcel Moolenaar jQuery.swap( elem, { "display": "inline-block" }, function() { 6748*31337658SMarcel Moolenaar if ( computed ) { 6749*31337658SMarcel Moolenaar ret = curCSS( elem, "margin-right", "marginRight" ); 6750*31337658SMarcel Moolenaar } else { 6751*31337658SMarcel Moolenaar ret = elem.style.marginRight; 6752*31337658SMarcel Moolenaar } 6753*31337658SMarcel Moolenaar }); 6754*31337658SMarcel Moolenaar return ret; 6755*31337658SMarcel Moolenaar } 6756*31337658SMarcel Moolenaar }; 6757*31337658SMarcel Moolenaar } 6758*31337658SMarcel Moolenaar}); 6759*31337658SMarcel Moolenaar 6760*31337658SMarcel Moolenaarif ( document.defaultView && document.defaultView.getComputedStyle ) { 6761*31337658SMarcel Moolenaar getComputedStyle = function( elem, name ) { 6762*31337658SMarcel Moolenaar var ret, defaultView, computedStyle; 6763*31337658SMarcel Moolenaar 6764*31337658SMarcel Moolenaar name = name.replace( rupper, "-$1" ).toLowerCase(); 6765*31337658SMarcel Moolenaar 6766*31337658SMarcel Moolenaar if ( !(defaultView = elem.ownerDocument.defaultView) ) { 6767*31337658SMarcel Moolenaar return undefined; 6768*31337658SMarcel Moolenaar } 6769*31337658SMarcel Moolenaar 6770*31337658SMarcel Moolenaar if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) { 6771*31337658SMarcel Moolenaar ret = computedStyle.getPropertyValue( name ); 6772*31337658SMarcel Moolenaar if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) { 6773*31337658SMarcel Moolenaar ret = jQuery.style( elem, name ); 6774*31337658SMarcel Moolenaar } 6775*31337658SMarcel Moolenaar } 6776*31337658SMarcel Moolenaar 6777*31337658SMarcel Moolenaar return ret; 6778*31337658SMarcel Moolenaar }; 6779*31337658SMarcel Moolenaar} 6780*31337658SMarcel Moolenaar 6781*31337658SMarcel Moolenaarif ( document.documentElement.currentStyle ) { 6782*31337658SMarcel Moolenaar currentStyle = function( elem, name ) { 6783*31337658SMarcel Moolenaar var left, rsLeft, uncomputed, 6784*31337658SMarcel Moolenaar ret = elem.currentStyle && elem.currentStyle[ name ], 6785*31337658SMarcel Moolenaar style = elem.style; 6786*31337658SMarcel Moolenaar 6787*31337658SMarcel Moolenaar // Avoid setting ret to empty string here 6788*31337658SMarcel Moolenaar // so we don't default to auto 6789*31337658SMarcel Moolenaar if ( ret === null && style && (uncomputed = style[ name ]) ) { 6790*31337658SMarcel Moolenaar ret = uncomputed; 6791*31337658SMarcel Moolenaar } 6792*31337658SMarcel Moolenaar 6793*31337658SMarcel Moolenaar // From the awesome hack by Dean Edwards 6794*31337658SMarcel Moolenaar // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 6795*31337658SMarcel Moolenaar 6796*31337658SMarcel Moolenaar // If we're not dealing with a regular pixel number 6797*31337658SMarcel Moolenaar // but a number that has a weird ending, we need to convert it to pixels 6798*31337658SMarcel Moolenaar if ( !rnumpx.test( ret ) && rnum.test( ret ) ) { 6799*31337658SMarcel Moolenaar 6800*31337658SMarcel Moolenaar // Remember the original values 6801*31337658SMarcel Moolenaar left = style.left; 6802*31337658SMarcel Moolenaar rsLeft = elem.runtimeStyle && elem.runtimeStyle.left; 6803*31337658SMarcel Moolenaar 6804*31337658SMarcel Moolenaar // Put in the new values to get a computed value out 6805*31337658SMarcel Moolenaar if ( rsLeft ) { 6806*31337658SMarcel Moolenaar elem.runtimeStyle.left = elem.currentStyle.left; 6807*31337658SMarcel Moolenaar } 6808*31337658SMarcel Moolenaar style.left = name === "fontSize" ? "1em" : ( ret || 0 ); 6809*31337658SMarcel Moolenaar ret = style.pixelLeft + "px"; 6810*31337658SMarcel Moolenaar 6811*31337658SMarcel Moolenaar // Revert the changed values 6812*31337658SMarcel Moolenaar style.left = left; 6813*31337658SMarcel Moolenaar if ( rsLeft ) { 6814*31337658SMarcel Moolenaar elem.runtimeStyle.left = rsLeft; 6815*31337658SMarcel Moolenaar } 6816*31337658SMarcel Moolenaar } 6817*31337658SMarcel Moolenaar 6818*31337658SMarcel Moolenaar return ret === "" ? "auto" : ret; 6819*31337658SMarcel Moolenaar }; 6820*31337658SMarcel Moolenaar} 6821*31337658SMarcel Moolenaar 6822*31337658SMarcel MoolenaarcurCSS = getComputedStyle || currentStyle; 6823*31337658SMarcel Moolenaar 6824*31337658SMarcel Moolenaarfunction getWH( elem, name, extra ) { 6825*31337658SMarcel Moolenaar 6826*31337658SMarcel Moolenaar // Start with offset property 6827*31337658SMarcel Moolenaar var val = name === "width" ? elem.offsetWidth : elem.offsetHeight, 6828*31337658SMarcel Moolenaar which = name === "width" ? cssWidth : cssHeight; 6829*31337658SMarcel Moolenaar 6830*31337658SMarcel Moolenaar if ( val > 0 ) { 6831*31337658SMarcel Moolenaar if ( extra !== "border" ) { 6832*31337658SMarcel Moolenaar jQuery.each( which, function() { 6833*31337658SMarcel Moolenaar if ( !extra ) { 6834*31337658SMarcel Moolenaar val -= parseFloat( jQuery.css( elem, "padding" + this ) ) || 0; 6835*31337658SMarcel Moolenaar } 6836*31337658SMarcel Moolenaar if ( extra === "margin" ) { 6837*31337658SMarcel Moolenaar val += parseFloat( jQuery.css( elem, extra + this ) ) || 0; 6838*31337658SMarcel Moolenaar } else { 6839*31337658SMarcel Moolenaar val -= parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0; 6840*31337658SMarcel Moolenaar } 6841*31337658SMarcel Moolenaar }); 6842*31337658SMarcel Moolenaar } 6843*31337658SMarcel Moolenaar 6844*31337658SMarcel Moolenaar return val + "px"; 6845*31337658SMarcel Moolenaar } 6846*31337658SMarcel Moolenaar 6847*31337658SMarcel Moolenaar // Fall back to computed then uncomputed css if necessary 6848*31337658SMarcel Moolenaar val = curCSS( elem, name, name ); 6849*31337658SMarcel Moolenaar if ( val < 0 || val == null ) { 6850*31337658SMarcel Moolenaar val = elem.style[ name ] || 0; 6851*31337658SMarcel Moolenaar } 6852*31337658SMarcel Moolenaar // Normalize "", auto, and prepare for extra 6853*31337658SMarcel Moolenaar val = parseFloat( val ) || 0; 6854*31337658SMarcel Moolenaar 6855*31337658SMarcel Moolenaar // Add padding, border, margin 6856*31337658SMarcel Moolenaar if ( extra ) { 6857*31337658SMarcel Moolenaar jQuery.each( which, function() { 6858*31337658SMarcel Moolenaar val += parseFloat( jQuery.css( elem, "padding" + this ) ) || 0; 6859*31337658SMarcel Moolenaar if ( extra !== "padding" ) { 6860*31337658SMarcel Moolenaar val += parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0; 6861*31337658SMarcel Moolenaar } 6862*31337658SMarcel Moolenaar if ( extra === "margin" ) { 6863*31337658SMarcel Moolenaar val += parseFloat( jQuery.css( elem, extra + this ) ) || 0; 6864*31337658SMarcel Moolenaar } 6865*31337658SMarcel Moolenaar }); 6866*31337658SMarcel Moolenaar } 6867*31337658SMarcel Moolenaar 6868*31337658SMarcel Moolenaar return val + "px"; 6869*31337658SMarcel Moolenaar} 6870*31337658SMarcel Moolenaar 6871*31337658SMarcel Moolenaarif ( jQuery.expr && jQuery.expr.filters ) { 6872*31337658SMarcel Moolenaar jQuery.expr.filters.hidden = function( elem ) { 6873*31337658SMarcel Moolenaar var width = elem.offsetWidth, 6874*31337658SMarcel Moolenaar height = elem.offsetHeight; 6875*31337658SMarcel Moolenaar 6876*31337658SMarcel Moolenaar return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none"); 6877*31337658SMarcel Moolenaar }; 6878*31337658SMarcel Moolenaar 6879*31337658SMarcel Moolenaar jQuery.expr.filters.visible = function( elem ) { 6880*31337658SMarcel Moolenaar return !jQuery.expr.filters.hidden( elem ); 6881*31337658SMarcel Moolenaar }; 6882*31337658SMarcel Moolenaar} 6883*31337658SMarcel Moolenaar 6884*31337658SMarcel Moolenaar 6885*31337658SMarcel Moolenaar 6886*31337658SMarcel Moolenaar 6887*31337658SMarcel Moolenaarvar r20 = /%20/g, 6888*31337658SMarcel Moolenaar rbracket = /\[\]$/, 6889*31337658SMarcel Moolenaar rCRLF = /\r?\n/g, 6890*31337658SMarcel Moolenaar rhash = /#.*$/, 6891*31337658SMarcel Moolenaar rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL 6892*31337658SMarcel Moolenaar rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, 6893*31337658SMarcel Moolenaar // #7653, #8125, #8152: local protocol detection 6894*31337658SMarcel Moolenaar rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/, 6895*31337658SMarcel Moolenaar rnoContent = /^(?:GET|HEAD)$/, 6896*31337658SMarcel Moolenaar rprotocol = /^\/\//, 6897*31337658SMarcel Moolenaar rquery = /\?/, 6898*31337658SMarcel Moolenaar rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, 6899*31337658SMarcel Moolenaar rselectTextarea = /^(?:select|textarea)/i, 6900*31337658SMarcel Moolenaar rspacesAjax = /\s+/, 6901*31337658SMarcel Moolenaar rts = /([?&])_=[^&]*/, 6902*31337658SMarcel Moolenaar rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/, 6903*31337658SMarcel Moolenaar 6904*31337658SMarcel Moolenaar // Keep a copy of the old load method 6905*31337658SMarcel Moolenaar _load = jQuery.fn.load, 6906*31337658SMarcel Moolenaar 6907*31337658SMarcel Moolenaar /* Prefilters 6908*31337658SMarcel Moolenaar * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) 6909*31337658SMarcel Moolenaar * 2) These are called: 6910*31337658SMarcel Moolenaar * - BEFORE asking for a transport 6911*31337658SMarcel Moolenaar * - AFTER param serialization (s.data is a string if s.processData is true) 6912*31337658SMarcel Moolenaar * 3) key is the dataType 6913*31337658SMarcel Moolenaar * 4) the catchall symbol "*" can be used 6914*31337658SMarcel Moolenaar * 5) execution will start with transport dataType and THEN continue down to "*" if needed 6915*31337658SMarcel Moolenaar */ 6916*31337658SMarcel Moolenaar prefilters = {}, 6917*31337658SMarcel Moolenaar 6918*31337658SMarcel Moolenaar /* Transports bindings 6919*31337658SMarcel Moolenaar * 1) key is the dataType 6920*31337658SMarcel Moolenaar * 2) the catchall symbol "*" can be used 6921*31337658SMarcel Moolenaar * 3) selection will start with transport dataType and THEN go to "*" if needed 6922*31337658SMarcel Moolenaar */ 6923*31337658SMarcel Moolenaar transports = {}, 6924*31337658SMarcel Moolenaar 6925*31337658SMarcel Moolenaar // Document location 6926*31337658SMarcel Moolenaar ajaxLocation, 6927*31337658SMarcel Moolenaar 6928*31337658SMarcel Moolenaar // Document location segments 6929*31337658SMarcel Moolenaar ajaxLocParts, 6930*31337658SMarcel Moolenaar 6931*31337658SMarcel Moolenaar // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression 6932*31337658SMarcel Moolenaar allTypes = ["*/"] + ["*"]; 6933*31337658SMarcel Moolenaar 6934*31337658SMarcel Moolenaar// #8138, IE may throw an exception when accessing 6935*31337658SMarcel Moolenaar// a field from window.location if document.domain has been set 6936*31337658SMarcel Moolenaartry { 6937*31337658SMarcel Moolenaar ajaxLocation = location.href; 6938*31337658SMarcel Moolenaar} catch( e ) { 6939*31337658SMarcel Moolenaar // Use the href attribute of an A element 6940*31337658SMarcel Moolenaar // since IE will modify it given document.location 6941*31337658SMarcel Moolenaar ajaxLocation = document.createElement( "a" ); 6942*31337658SMarcel Moolenaar ajaxLocation.href = ""; 6943*31337658SMarcel Moolenaar ajaxLocation = ajaxLocation.href; 6944*31337658SMarcel Moolenaar} 6945*31337658SMarcel Moolenaar 6946*31337658SMarcel Moolenaar// Segment location into parts 6947*31337658SMarcel MoolenaarajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || []; 6948*31337658SMarcel Moolenaar 6949*31337658SMarcel Moolenaar// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport 6950*31337658SMarcel Moolenaarfunction addToPrefiltersOrTransports( structure ) { 6951*31337658SMarcel Moolenaar 6952*31337658SMarcel Moolenaar // dataTypeExpression is optional and defaults to "*" 6953*31337658SMarcel Moolenaar return function( dataTypeExpression, func ) { 6954*31337658SMarcel Moolenaar 6955*31337658SMarcel Moolenaar if ( typeof dataTypeExpression !== "string" ) { 6956*31337658SMarcel Moolenaar func = dataTypeExpression; 6957*31337658SMarcel Moolenaar dataTypeExpression = "*"; 6958*31337658SMarcel Moolenaar } 6959*31337658SMarcel Moolenaar 6960*31337658SMarcel Moolenaar if ( jQuery.isFunction( func ) ) { 6961*31337658SMarcel Moolenaar var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ), 6962*31337658SMarcel Moolenaar i = 0, 6963*31337658SMarcel Moolenaar length = dataTypes.length, 6964*31337658SMarcel Moolenaar dataType, 6965*31337658SMarcel Moolenaar list, 6966*31337658SMarcel Moolenaar placeBefore; 6967*31337658SMarcel Moolenaar 6968*31337658SMarcel Moolenaar // For each dataType in the dataTypeExpression 6969*31337658SMarcel Moolenaar for ( ; i < length; i++ ) { 6970*31337658SMarcel Moolenaar dataType = dataTypes[ i ]; 6971*31337658SMarcel Moolenaar // We control if we're asked to add before 6972*31337658SMarcel Moolenaar // any existing element 6973*31337658SMarcel Moolenaar placeBefore = /^\+/.test( dataType ); 6974*31337658SMarcel Moolenaar if ( placeBefore ) { 6975*31337658SMarcel Moolenaar dataType = dataType.substr( 1 ) || "*"; 6976*31337658SMarcel Moolenaar } 6977*31337658SMarcel Moolenaar list = structure[ dataType ] = structure[ dataType ] || []; 6978*31337658SMarcel Moolenaar // then we add to the structure accordingly 6979*31337658SMarcel Moolenaar list[ placeBefore ? "unshift" : "push" ]( func ); 6980*31337658SMarcel Moolenaar } 6981*31337658SMarcel Moolenaar } 6982*31337658SMarcel Moolenaar }; 6983*31337658SMarcel Moolenaar} 6984*31337658SMarcel Moolenaar 6985*31337658SMarcel Moolenaar// Base inspection function for prefilters and transports 6986*31337658SMarcel Moolenaarfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR, 6987*31337658SMarcel Moolenaar dataType /* internal */, inspected /* internal */ ) { 6988*31337658SMarcel Moolenaar 6989*31337658SMarcel Moolenaar dataType = dataType || options.dataTypes[ 0 ]; 6990*31337658SMarcel Moolenaar inspected = inspected || {}; 6991*31337658SMarcel Moolenaar 6992*31337658SMarcel Moolenaar inspected[ dataType ] = true; 6993*31337658SMarcel Moolenaar 6994*31337658SMarcel Moolenaar var list = structure[ dataType ], 6995*31337658SMarcel Moolenaar i = 0, 6996*31337658SMarcel Moolenaar length = list ? list.length : 0, 6997*31337658SMarcel Moolenaar executeOnly = ( structure === prefilters ), 6998*31337658SMarcel Moolenaar selection; 6999*31337658SMarcel Moolenaar 7000*31337658SMarcel Moolenaar for ( ; i < length && ( executeOnly || !selection ); i++ ) { 7001*31337658SMarcel Moolenaar selection = list[ i ]( options, originalOptions, jqXHR ); 7002*31337658SMarcel Moolenaar // If we got redirected to another dataType 7003*31337658SMarcel Moolenaar // we try there if executing only and not done already 7004*31337658SMarcel Moolenaar if ( typeof selection === "string" ) { 7005*31337658SMarcel Moolenaar if ( !executeOnly || inspected[ selection ] ) { 7006*31337658SMarcel Moolenaar selection = undefined; 7007*31337658SMarcel Moolenaar } else { 7008*31337658SMarcel Moolenaar options.dataTypes.unshift( selection ); 7009*31337658SMarcel Moolenaar selection = inspectPrefiltersOrTransports( 7010*31337658SMarcel Moolenaar structure, options, originalOptions, jqXHR, selection, inspected ); 7011*31337658SMarcel Moolenaar } 7012*31337658SMarcel Moolenaar } 7013*31337658SMarcel Moolenaar } 7014*31337658SMarcel Moolenaar // If we're only executing or nothing was selected 7015*31337658SMarcel Moolenaar // we try the catchall dataType if not done already 7016*31337658SMarcel Moolenaar if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) { 7017*31337658SMarcel Moolenaar selection = inspectPrefiltersOrTransports( 7018*31337658SMarcel Moolenaar structure, options, originalOptions, jqXHR, "*", inspected ); 7019*31337658SMarcel Moolenaar } 7020*31337658SMarcel Moolenaar // unnecessary when only executing (prefilters) 7021*31337658SMarcel Moolenaar // but it'll be ignored by the caller in that case 7022*31337658SMarcel Moolenaar return selection; 7023*31337658SMarcel Moolenaar} 7024*31337658SMarcel Moolenaar 7025*31337658SMarcel Moolenaar// A special extend for ajax options 7026*31337658SMarcel Moolenaar// that takes "flat" options (not to be deep extended) 7027*31337658SMarcel Moolenaar// Fixes #9887 7028*31337658SMarcel Moolenaarfunction ajaxExtend( target, src ) { 7029*31337658SMarcel Moolenaar var key, deep, 7030*31337658SMarcel Moolenaar flatOptions = jQuery.ajaxSettings.flatOptions || {}; 7031*31337658SMarcel Moolenaar for ( key in src ) { 7032*31337658SMarcel Moolenaar if ( src[ key ] !== undefined ) { 7033*31337658SMarcel Moolenaar ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; 7034*31337658SMarcel Moolenaar } 7035*31337658SMarcel Moolenaar } 7036*31337658SMarcel Moolenaar if ( deep ) { 7037*31337658SMarcel Moolenaar jQuery.extend( true, target, deep ); 7038*31337658SMarcel Moolenaar } 7039*31337658SMarcel Moolenaar} 7040*31337658SMarcel Moolenaar 7041*31337658SMarcel MoolenaarjQuery.fn.extend({ 7042*31337658SMarcel Moolenaar load: function( url, params, callback ) { 7043*31337658SMarcel Moolenaar if ( typeof url !== "string" && _load ) { 7044*31337658SMarcel Moolenaar return _load.apply( this, arguments ); 7045*31337658SMarcel Moolenaar 7046*31337658SMarcel Moolenaar // Don't do a request if no elements are being requested 7047*31337658SMarcel Moolenaar } else if ( !this.length ) { 7048*31337658SMarcel Moolenaar return this; 7049*31337658SMarcel Moolenaar } 7050*31337658SMarcel Moolenaar 7051*31337658SMarcel Moolenaar var off = url.indexOf( " " ); 7052*31337658SMarcel Moolenaar if ( off >= 0 ) { 7053*31337658SMarcel Moolenaar var selector = url.slice( off, url.length ); 7054*31337658SMarcel Moolenaar url = url.slice( 0, off ); 7055*31337658SMarcel Moolenaar } 7056*31337658SMarcel Moolenaar 7057*31337658SMarcel Moolenaar // Default to a GET request 7058*31337658SMarcel Moolenaar var type = "GET"; 7059*31337658SMarcel Moolenaar 7060*31337658SMarcel Moolenaar // If the second parameter was provided 7061*31337658SMarcel Moolenaar if ( params ) { 7062*31337658SMarcel Moolenaar // If it's a function 7063*31337658SMarcel Moolenaar if ( jQuery.isFunction( params ) ) { 7064*31337658SMarcel Moolenaar // We assume that it's the callback 7065*31337658SMarcel Moolenaar callback = params; 7066*31337658SMarcel Moolenaar params = undefined; 7067*31337658SMarcel Moolenaar 7068*31337658SMarcel Moolenaar // Otherwise, build a param string 7069*31337658SMarcel Moolenaar } else if ( typeof params === "object" ) { 7070*31337658SMarcel Moolenaar params = jQuery.param( params, jQuery.ajaxSettings.traditional ); 7071*31337658SMarcel Moolenaar type = "POST"; 7072*31337658SMarcel Moolenaar } 7073*31337658SMarcel Moolenaar } 7074*31337658SMarcel Moolenaar 7075*31337658SMarcel Moolenaar var self = this; 7076*31337658SMarcel Moolenaar 7077*31337658SMarcel Moolenaar // Request the remote document 7078*31337658SMarcel Moolenaar jQuery.ajax({ 7079*31337658SMarcel Moolenaar url: url, 7080*31337658SMarcel Moolenaar type: type, 7081*31337658SMarcel Moolenaar dataType: "html", 7082*31337658SMarcel Moolenaar data: params, 7083*31337658SMarcel Moolenaar // Complete callback (responseText is used internally) 7084*31337658SMarcel Moolenaar complete: function( jqXHR, status, responseText ) { 7085*31337658SMarcel Moolenaar // Store the response as specified by the jqXHR object 7086*31337658SMarcel Moolenaar responseText = jqXHR.responseText; 7087*31337658SMarcel Moolenaar // If successful, inject the HTML into all the matched elements 7088*31337658SMarcel Moolenaar if ( jqXHR.isResolved() ) { 7089*31337658SMarcel Moolenaar // #4825: Get the actual response in case 7090*31337658SMarcel Moolenaar // a dataFilter is present in ajaxSettings 7091*31337658SMarcel Moolenaar jqXHR.done(function( r ) { 7092*31337658SMarcel Moolenaar responseText = r; 7093*31337658SMarcel Moolenaar }); 7094*31337658SMarcel Moolenaar // See if a selector was specified 7095*31337658SMarcel Moolenaar self.html( selector ? 7096*31337658SMarcel Moolenaar // Create a dummy div to hold the results 7097*31337658SMarcel Moolenaar jQuery("<div>") 7098*31337658SMarcel Moolenaar // inject the contents of the document in, removing the scripts 7099*31337658SMarcel Moolenaar // to avoid any 'Permission Denied' errors in IE 7100*31337658SMarcel Moolenaar .append(responseText.replace(rscript, "")) 7101*31337658SMarcel Moolenaar 7102*31337658SMarcel Moolenaar // Locate the specified elements 7103*31337658SMarcel Moolenaar .find(selector) : 7104*31337658SMarcel Moolenaar 7105*31337658SMarcel Moolenaar // If not, just inject the full result 7106*31337658SMarcel Moolenaar responseText ); 7107*31337658SMarcel Moolenaar } 7108*31337658SMarcel Moolenaar 7109*31337658SMarcel Moolenaar if ( callback ) { 7110*31337658SMarcel Moolenaar self.each( callback, [ responseText, status, jqXHR ] ); 7111*31337658SMarcel Moolenaar } 7112*31337658SMarcel Moolenaar } 7113*31337658SMarcel Moolenaar }); 7114*31337658SMarcel Moolenaar 7115*31337658SMarcel Moolenaar return this; 7116*31337658SMarcel Moolenaar }, 7117*31337658SMarcel Moolenaar 7118*31337658SMarcel Moolenaar serialize: function() { 7119*31337658SMarcel Moolenaar return jQuery.param( this.serializeArray() ); 7120*31337658SMarcel Moolenaar }, 7121*31337658SMarcel Moolenaar 7122*31337658SMarcel Moolenaar serializeArray: function() { 7123*31337658SMarcel Moolenaar return this.map(function(){ 7124*31337658SMarcel Moolenaar return this.elements ? jQuery.makeArray( this.elements ) : this; 7125*31337658SMarcel Moolenaar }) 7126*31337658SMarcel Moolenaar .filter(function(){ 7127*31337658SMarcel Moolenaar return this.name && !this.disabled && 7128*31337658SMarcel Moolenaar ( this.checked || rselectTextarea.test( this.nodeName ) || 7129*31337658SMarcel Moolenaar rinput.test( this.type ) ); 7130*31337658SMarcel Moolenaar }) 7131*31337658SMarcel Moolenaar .map(function( i, elem ){ 7132*31337658SMarcel Moolenaar var val = jQuery( this ).val(); 7133*31337658SMarcel Moolenaar 7134*31337658SMarcel Moolenaar return val == null ? 7135*31337658SMarcel Moolenaar null : 7136*31337658SMarcel Moolenaar jQuery.isArray( val ) ? 7137*31337658SMarcel Moolenaar jQuery.map( val, function( val, i ){ 7138*31337658SMarcel Moolenaar return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 7139*31337658SMarcel Moolenaar }) : 7140*31337658SMarcel Moolenaar { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 7141*31337658SMarcel Moolenaar }).get(); 7142*31337658SMarcel Moolenaar } 7143*31337658SMarcel Moolenaar}); 7144*31337658SMarcel Moolenaar 7145*31337658SMarcel Moolenaar// Attach a bunch of functions for handling common AJAX events 7146*31337658SMarcel MoolenaarjQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){ 7147*31337658SMarcel Moolenaar jQuery.fn[ o ] = function( f ){ 7148*31337658SMarcel Moolenaar return this.bind( o, f ); 7149*31337658SMarcel Moolenaar }; 7150*31337658SMarcel Moolenaar}); 7151*31337658SMarcel Moolenaar 7152*31337658SMarcel MoolenaarjQuery.each( [ "get", "post" ], function( i, method ) { 7153*31337658SMarcel Moolenaar jQuery[ method ] = function( url, data, callback, type ) { 7154*31337658SMarcel Moolenaar // shift arguments if data argument was omitted 7155*31337658SMarcel Moolenaar if ( jQuery.isFunction( data ) ) { 7156*31337658SMarcel Moolenaar type = type || callback; 7157*31337658SMarcel Moolenaar callback = data; 7158*31337658SMarcel Moolenaar data = undefined; 7159*31337658SMarcel Moolenaar } 7160*31337658SMarcel Moolenaar 7161*31337658SMarcel Moolenaar return jQuery.ajax({ 7162*31337658SMarcel Moolenaar type: method, 7163*31337658SMarcel Moolenaar url: url, 7164*31337658SMarcel Moolenaar data: data, 7165*31337658SMarcel Moolenaar success: callback, 7166*31337658SMarcel Moolenaar dataType: type 7167*31337658SMarcel Moolenaar }); 7168*31337658SMarcel Moolenaar }; 7169*31337658SMarcel Moolenaar}); 7170*31337658SMarcel Moolenaar 7171*31337658SMarcel MoolenaarjQuery.extend({ 7172*31337658SMarcel Moolenaar 7173*31337658SMarcel Moolenaar getScript: function( url, callback ) { 7174*31337658SMarcel Moolenaar return jQuery.get( url, undefined, callback, "script" ); 7175*31337658SMarcel Moolenaar }, 7176*31337658SMarcel Moolenaar 7177*31337658SMarcel Moolenaar getJSON: function( url, data, callback ) { 7178*31337658SMarcel Moolenaar return jQuery.get( url, data, callback, "json" ); 7179*31337658SMarcel Moolenaar }, 7180*31337658SMarcel Moolenaar 7181*31337658SMarcel Moolenaar // Creates a full fledged settings object into target 7182*31337658SMarcel Moolenaar // with both ajaxSettings and settings fields. 7183*31337658SMarcel Moolenaar // If target is omitted, writes into ajaxSettings. 7184*31337658SMarcel Moolenaar ajaxSetup: function( target, settings ) { 7185*31337658SMarcel Moolenaar if ( settings ) { 7186*31337658SMarcel Moolenaar // Building a settings object 7187*31337658SMarcel Moolenaar ajaxExtend( target, jQuery.ajaxSettings ); 7188*31337658SMarcel Moolenaar } else { 7189*31337658SMarcel Moolenaar // Extending ajaxSettings 7190*31337658SMarcel Moolenaar settings = target; 7191*31337658SMarcel Moolenaar target = jQuery.ajaxSettings; 7192*31337658SMarcel Moolenaar } 7193*31337658SMarcel Moolenaar ajaxExtend( target, settings ); 7194*31337658SMarcel Moolenaar return target; 7195*31337658SMarcel Moolenaar }, 7196*31337658SMarcel Moolenaar 7197*31337658SMarcel Moolenaar ajaxSettings: { 7198*31337658SMarcel Moolenaar url: ajaxLocation, 7199*31337658SMarcel Moolenaar isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), 7200*31337658SMarcel Moolenaar global: true, 7201*31337658SMarcel Moolenaar type: "GET", 7202*31337658SMarcel Moolenaar contentType: "application/x-www-form-urlencoded", 7203*31337658SMarcel Moolenaar processData: true, 7204*31337658SMarcel Moolenaar async: true, 7205*31337658SMarcel Moolenaar /* 7206*31337658SMarcel Moolenaar timeout: 0, 7207*31337658SMarcel Moolenaar data: null, 7208*31337658SMarcel Moolenaar dataType: null, 7209*31337658SMarcel Moolenaar username: null, 7210*31337658SMarcel Moolenaar password: null, 7211*31337658SMarcel Moolenaar cache: null, 7212*31337658SMarcel Moolenaar traditional: false, 7213*31337658SMarcel Moolenaar headers: {}, 7214*31337658SMarcel Moolenaar */ 7215*31337658SMarcel Moolenaar 7216*31337658SMarcel Moolenaar accepts: { 7217*31337658SMarcel Moolenaar xml: "application/xml, text/xml", 7218*31337658SMarcel Moolenaar html: "text/html", 7219*31337658SMarcel Moolenaar text: "text/plain", 7220*31337658SMarcel Moolenaar json: "application/json, text/javascript", 7221*31337658SMarcel Moolenaar "*": allTypes 7222*31337658SMarcel Moolenaar }, 7223*31337658SMarcel Moolenaar 7224*31337658SMarcel Moolenaar contents: { 7225*31337658SMarcel Moolenaar xml: /xml/, 7226*31337658SMarcel Moolenaar html: /html/, 7227*31337658SMarcel Moolenaar json: /json/ 7228*31337658SMarcel Moolenaar }, 7229*31337658SMarcel Moolenaar 7230*31337658SMarcel Moolenaar responseFields: { 7231*31337658SMarcel Moolenaar xml: "responseXML", 7232*31337658SMarcel Moolenaar text: "responseText" 7233*31337658SMarcel Moolenaar }, 7234*31337658SMarcel Moolenaar 7235*31337658SMarcel Moolenaar // List of data converters 7236*31337658SMarcel Moolenaar // 1) key format is "source_type destination_type" (a single space in-between) 7237*31337658SMarcel Moolenaar // 2) the catchall symbol "*" can be used for source_type 7238*31337658SMarcel Moolenaar converters: { 7239*31337658SMarcel Moolenaar 7240*31337658SMarcel Moolenaar // Convert anything to text 7241*31337658SMarcel Moolenaar "* text": window.String, 7242*31337658SMarcel Moolenaar 7243*31337658SMarcel Moolenaar // Text to html (true = no transformation) 7244*31337658SMarcel Moolenaar "text html": true, 7245*31337658SMarcel Moolenaar 7246*31337658SMarcel Moolenaar // Evaluate text as a json expression 7247*31337658SMarcel Moolenaar "text json": jQuery.parseJSON, 7248*31337658SMarcel Moolenaar 7249*31337658SMarcel Moolenaar // Parse text as xml 7250*31337658SMarcel Moolenaar "text xml": jQuery.parseXML 7251*31337658SMarcel Moolenaar }, 7252*31337658SMarcel Moolenaar 7253*31337658SMarcel Moolenaar // For options that shouldn't be deep extended: 7254*31337658SMarcel Moolenaar // you can add your own custom options here if 7255*31337658SMarcel Moolenaar // and when you create one that shouldn't be 7256*31337658SMarcel Moolenaar // deep extended (see ajaxExtend) 7257*31337658SMarcel Moolenaar flatOptions: { 7258*31337658SMarcel Moolenaar context: true, 7259*31337658SMarcel Moolenaar url: true 7260*31337658SMarcel Moolenaar } 7261*31337658SMarcel Moolenaar }, 7262*31337658SMarcel Moolenaar 7263*31337658SMarcel Moolenaar ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), 7264*31337658SMarcel Moolenaar ajaxTransport: addToPrefiltersOrTransports( transports ), 7265*31337658SMarcel Moolenaar 7266*31337658SMarcel Moolenaar // Main method 7267*31337658SMarcel Moolenaar ajax: function( url, options ) { 7268*31337658SMarcel Moolenaar 7269*31337658SMarcel Moolenaar // If url is an object, simulate pre-1.5 signature 7270*31337658SMarcel Moolenaar if ( typeof url === "object" ) { 7271*31337658SMarcel Moolenaar options = url; 7272*31337658SMarcel Moolenaar url = undefined; 7273*31337658SMarcel Moolenaar } 7274*31337658SMarcel Moolenaar 7275*31337658SMarcel Moolenaar // Force options to be an object 7276*31337658SMarcel Moolenaar options = options || {}; 7277*31337658SMarcel Moolenaar 7278*31337658SMarcel Moolenaar var // Create the final options object 7279*31337658SMarcel Moolenaar s = jQuery.ajaxSetup( {}, options ), 7280*31337658SMarcel Moolenaar // Callbacks context 7281*31337658SMarcel Moolenaar callbackContext = s.context || s, 7282*31337658SMarcel Moolenaar // Context for global events 7283*31337658SMarcel Moolenaar // It's the callbackContext if one was provided in the options 7284*31337658SMarcel Moolenaar // and if it's a DOM node or a jQuery collection 7285*31337658SMarcel Moolenaar globalEventContext = callbackContext !== s && 7286*31337658SMarcel Moolenaar ( callbackContext.nodeType || callbackContext instanceof jQuery ) ? 7287*31337658SMarcel Moolenaar jQuery( callbackContext ) : jQuery.event, 7288*31337658SMarcel Moolenaar // Deferreds 7289*31337658SMarcel Moolenaar deferred = jQuery.Deferred(), 7290*31337658SMarcel Moolenaar completeDeferred = jQuery.Callbacks( "once memory" ), 7291*31337658SMarcel Moolenaar // Status-dependent callbacks 7292*31337658SMarcel Moolenaar statusCode = s.statusCode || {}, 7293*31337658SMarcel Moolenaar // ifModified key 7294*31337658SMarcel Moolenaar ifModifiedKey, 7295*31337658SMarcel Moolenaar // Headers (they are sent all at once) 7296*31337658SMarcel Moolenaar requestHeaders = {}, 7297*31337658SMarcel Moolenaar requestHeadersNames = {}, 7298*31337658SMarcel Moolenaar // Response headers 7299*31337658SMarcel Moolenaar responseHeadersString, 7300*31337658SMarcel Moolenaar responseHeaders, 7301*31337658SMarcel Moolenaar // transport 7302*31337658SMarcel Moolenaar transport, 7303*31337658SMarcel Moolenaar // timeout handle 7304*31337658SMarcel Moolenaar timeoutTimer, 7305*31337658SMarcel Moolenaar // Cross-domain detection vars 7306*31337658SMarcel Moolenaar parts, 7307*31337658SMarcel Moolenaar // The jqXHR state 7308*31337658SMarcel Moolenaar state = 0, 7309*31337658SMarcel Moolenaar // To know if global events are to be dispatched 7310*31337658SMarcel Moolenaar fireGlobals, 7311*31337658SMarcel Moolenaar // Loop variable 7312*31337658SMarcel Moolenaar i, 7313*31337658SMarcel Moolenaar // Fake xhr 7314*31337658SMarcel Moolenaar jqXHR = { 7315*31337658SMarcel Moolenaar 7316*31337658SMarcel Moolenaar readyState: 0, 7317*31337658SMarcel Moolenaar 7318*31337658SMarcel Moolenaar // Caches the header 7319*31337658SMarcel Moolenaar setRequestHeader: function( name, value ) { 7320*31337658SMarcel Moolenaar if ( !state ) { 7321*31337658SMarcel Moolenaar var lname = name.toLowerCase(); 7322*31337658SMarcel Moolenaar name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name; 7323*31337658SMarcel Moolenaar requestHeaders[ name ] = value; 7324*31337658SMarcel Moolenaar } 7325*31337658SMarcel Moolenaar return this; 7326*31337658SMarcel Moolenaar }, 7327*31337658SMarcel Moolenaar 7328*31337658SMarcel Moolenaar // Raw string 7329*31337658SMarcel Moolenaar getAllResponseHeaders: function() { 7330*31337658SMarcel Moolenaar return state === 2 ? responseHeadersString : null; 7331*31337658SMarcel Moolenaar }, 7332*31337658SMarcel Moolenaar 7333*31337658SMarcel Moolenaar // Builds headers hashtable if needed 7334*31337658SMarcel Moolenaar getResponseHeader: function( key ) { 7335*31337658SMarcel Moolenaar var match; 7336*31337658SMarcel Moolenaar if ( state === 2 ) { 7337*31337658SMarcel Moolenaar if ( !responseHeaders ) { 7338*31337658SMarcel Moolenaar responseHeaders = {}; 7339*31337658SMarcel Moolenaar while( ( match = rheaders.exec( responseHeadersString ) ) ) { 7340*31337658SMarcel Moolenaar responseHeaders[ match[1].toLowerCase() ] = match[ 2 ]; 7341*31337658SMarcel Moolenaar } 7342*31337658SMarcel Moolenaar } 7343*31337658SMarcel Moolenaar match = responseHeaders[ key.toLowerCase() ]; 7344*31337658SMarcel Moolenaar } 7345*31337658SMarcel Moolenaar return match === undefined ? null : match; 7346*31337658SMarcel Moolenaar }, 7347*31337658SMarcel Moolenaar 7348*31337658SMarcel Moolenaar // Overrides response content-type header 7349*31337658SMarcel Moolenaar overrideMimeType: function( type ) { 7350*31337658SMarcel Moolenaar if ( !state ) { 7351*31337658SMarcel Moolenaar s.mimeType = type; 7352*31337658SMarcel Moolenaar } 7353*31337658SMarcel Moolenaar return this; 7354*31337658SMarcel Moolenaar }, 7355*31337658SMarcel Moolenaar 7356*31337658SMarcel Moolenaar // Cancel the request 7357*31337658SMarcel Moolenaar abort: function( statusText ) { 7358*31337658SMarcel Moolenaar statusText = statusText || "abort"; 7359*31337658SMarcel Moolenaar if ( transport ) { 7360*31337658SMarcel Moolenaar transport.abort( statusText ); 7361*31337658SMarcel Moolenaar } 7362*31337658SMarcel Moolenaar done( 0, statusText ); 7363*31337658SMarcel Moolenaar return this; 7364*31337658SMarcel Moolenaar } 7365*31337658SMarcel Moolenaar }; 7366*31337658SMarcel Moolenaar 7367*31337658SMarcel Moolenaar // Callback for when everything is done 7368*31337658SMarcel Moolenaar // It is defined here because jslint complains if it is declared 7369*31337658SMarcel Moolenaar // at the end of the function (which would be more logical and readable) 7370*31337658SMarcel Moolenaar function done( status, nativeStatusText, responses, headers ) { 7371*31337658SMarcel Moolenaar 7372*31337658SMarcel Moolenaar // Called once 7373*31337658SMarcel Moolenaar if ( state === 2 ) { 7374*31337658SMarcel Moolenaar return; 7375*31337658SMarcel Moolenaar } 7376*31337658SMarcel Moolenaar 7377*31337658SMarcel Moolenaar // State is "done" now 7378*31337658SMarcel Moolenaar state = 2; 7379*31337658SMarcel Moolenaar 7380*31337658SMarcel Moolenaar // Clear timeout if it exists 7381*31337658SMarcel Moolenaar if ( timeoutTimer ) { 7382*31337658SMarcel Moolenaar clearTimeout( timeoutTimer ); 7383*31337658SMarcel Moolenaar } 7384*31337658SMarcel Moolenaar 7385*31337658SMarcel Moolenaar // Dereference transport for early garbage collection 7386*31337658SMarcel Moolenaar // (no matter how long the jqXHR object will be used) 7387*31337658SMarcel Moolenaar transport = undefined; 7388*31337658SMarcel Moolenaar 7389*31337658SMarcel Moolenaar // Cache response headers 7390*31337658SMarcel Moolenaar responseHeadersString = headers || ""; 7391*31337658SMarcel Moolenaar 7392*31337658SMarcel Moolenaar // Set readyState 7393*31337658SMarcel Moolenaar jqXHR.readyState = status > 0 ? 4 : 0; 7394*31337658SMarcel Moolenaar 7395*31337658SMarcel Moolenaar var isSuccess, 7396*31337658SMarcel Moolenaar success, 7397*31337658SMarcel Moolenaar error, 7398*31337658SMarcel Moolenaar statusText = nativeStatusText, 7399*31337658SMarcel Moolenaar response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined, 7400*31337658SMarcel Moolenaar lastModified, 7401*31337658SMarcel Moolenaar etag; 7402*31337658SMarcel Moolenaar 7403*31337658SMarcel Moolenaar // If successful, handle type chaining 7404*31337658SMarcel Moolenaar if ( status >= 200 && status < 300 || status === 304 ) { 7405*31337658SMarcel Moolenaar 7406*31337658SMarcel Moolenaar // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 7407*31337658SMarcel Moolenaar if ( s.ifModified ) { 7408*31337658SMarcel Moolenaar 7409*31337658SMarcel Moolenaar if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) { 7410*31337658SMarcel Moolenaar jQuery.lastModified[ ifModifiedKey ] = lastModified; 7411*31337658SMarcel Moolenaar } 7412*31337658SMarcel Moolenaar if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) { 7413*31337658SMarcel Moolenaar jQuery.etag[ ifModifiedKey ] = etag; 7414*31337658SMarcel Moolenaar } 7415*31337658SMarcel Moolenaar } 7416*31337658SMarcel Moolenaar 7417*31337658SMarcel Moolenaar // If not modified 7418*31337658SMarcel Moolenaar if ( status === 304 ) { 7419*31337658SMarcel Moolenaar 7420*31337658SMarcel Moolenaar statusText = "notmodified"; 7421*31337658SMarcel Moolenaar isSuccess = true; 7422*31337658SMarcel Moolenaar 7423*31337658SMarcel Moolenaar // If we have data 7424*31337658SMarcel Moolenaar } else { 7425*31337658SMarcel Moolenaar 7426*31337658SMarcel Moolenaar try { 7427*31337658SMarcel Moolenaar success = ajaxConvert( s, response ); 7428*31337658SMarcel Moolenaar statusText = "success"; 7429*31337658SMarcel Moolenaar isSuccess = true; 7430*31337658SMarcel Moolenaar } catch(e) { 7431*31337658SMarcel Moolenaar // We have a parsererror 7432*31337658SMarcel Moolenaar statusText = "parsererror"; 7433*31337658SMarcel Moolenaar error = e; 7434*31337658SMarcel Moolenaar } 7435*31337658SMarcel Moolenaar } 7436*31337658SMarcel Moolenaar } else { 7437*31337658SMarcel Moolenaar // We extract error from statusText 7438*31337658SMarcel Moolenaar // then normalize statusText and status for non-aborts 7439*31337658SMarcel Moolenaar error = statusText; 7440*31337658SMarcel Moolenaar if ( !statusText || status ) { 7441*31337658SMarcel Moolenaar statusText = "error"; 7442*31337658SMarcel Moolenaar if ( status < 0 ) { 7443*31337658SMarcel Moolenaar status = 0; 7444*31337658SMarcel Moolenaar } 7445*31337658SMarcel Moolenaar } 7446*31337658SMarcel Moolenaar } 7447*31337658SMarcel Moolenaar 7448*31337658SMarcel Moolenaar // Set data for the fake xhr object 7449*31337658SMarcel Moolenaar jqXHR.status = status; 7450*31337658SMarcel Moolenaar jqXHR.statusText = "" + ( nativeStatusText || statusText ); 7451*31337658SMarcel Moolenaar 7452*31337658SMarcel Moolenaar // Success/Error 7453*31337658SMarcel Moolenaar if ( isSuccess ) { 7454*31337658SMarcel Moolenaar deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); 7455*31337658SMarcel Moolenaar } else { 7456*31337658SMarcel Moolenaar deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); 7457*31337658SMarcel Moolenaar } 7458*31337658SMarcel Moolenaar 7459*31337658SMarcel Moolenaar // Status-dependent callbacks 7460*31337658SMarcel Moolenaar jqXHR.statusCode( statusCode ); 7461*31337658SMarcel Moolenaar statusCode = undefined; 7462*31337658SMarcel Moolenaar 7463*31337658SMarcel Moolenaar if ( fireGlobals ) { 7464*31337658SMarcel Moolenaar globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ), 7465*31337658SMarcel Moolenaar [ jqXHR, s, isSuccess ? success : error ] ); 7466*31337658SMarcel Moolenaar } 7467*31337658SMarcel Moolenaar 7468*31337658SMarcel Moolenaar // Complete 7469*31337658SMarcel Moolenaar completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); 7470*31337658SMarcel Moolenaar 7471*31337658SMarcel Moolenaar if ( fireGlobals ) { 7472*31337658SMarcel Moolenaar globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); 7473*31337658SMarcel Moolenaar // Handle the global AJAX counter 7474*31337658SMarcel Moolenaar if ( !( --jQuery.active ) ) { 7475*31337658SMarcel Moolenaar jQuery.event.trigger( "ajaxStop" ); 7476*31337658SMarcel Moolenaar } 7477*31337658SMarcel Moolenaar } 7478*31337658SMarcel Moolenaar } 7479*31337658SMarcel Moolenaar 7480*31337658SMarcel Moolenaar // Attach deferreds 7481*31337658SMarcel Moolenaar deferred.promise( jqXHR ); 7482*31337658SMarcel Moolenaar jqXHR.success = jqXHR.done; 7483*31337658SMarcel Moolenaar jqXHR.error = jqXHR.fail; 7484*31337658SMarcel Moolenaar jqXHR.complete = completeDeferred.add; 7485*31337658SMarcel Moolenaar 7486*31337658SMarcel Moolenaar // Status-dependent callbacks 7487*31337658SMarcel Moolenaar jqXHR.statusCode = function( map ) { 7488*31337658SMarcel Moolenaar if ( map ) { 7489*31337658SMarcel Moolenaar var tmp; 7490*31337658SMarcel Moolenaar if ( state < 2 ) { 7491*31337658SMarcel Moolenaar for ( tmp in map ) { 7492*31337658SMarcel Moolenaar statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ]; 7493*31337658SMarcel Moolenaar } 7494*31337658SMarcel Moolenaar } else { 7495*31337658SMarcel Moolenaar tmp = map[ jqXHR.status ]; 7496*31337658SMarcel Moolenaar jqXHR.then( tmp, tmp ); 7497*31337658SMarcel Moolenaar } 7498*31337658SMarcel Moolenaar } 7499*31337658SMarcel Moolenaar return this; 7500*31337658SMarcel Moolenaar }; 7501*31337658SMarcel Moolenaar 7502*31337658SMarcel Moolenaar // Remove hash character (#7531: and string promotion) 7503*31337658SMarcel Moolenaar // Add protocol if not provided (#5866: IE7 issue with protocol-less urls) 7504*31337658SMarcel Moolenaar // We also use the url parameter if available 7505*31337658SMarcel Moolenaar s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" ); 7506*31337658SMarcel Moolenaar 7507*31337658SMarcel Moolenaar // Extract dataTypes list 7508*31337658SMarcel Moolenaar s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax ); 7509*31337658SMarcel Moolenaar 7510*31337658SMarcel Moolenaar // Determine if a cross-domain request is in order 7511*31337658SMarcel Moolenaar if ( s.crossDomain == null ) { 7512*31337658SMarcel Moolenaar parts = rurl.exec( s.url.toLowerCase() ); 7513*31337658SMarcel Moolenaar s.crossDomain = !!( parts && 7514*31337658SMarcel Moolenaar ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] || 7515*31337658SMarcel Moolenaar ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) != 7516*31337658SMarcel Moolenaar ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) ) 7517*31337658SMarcel Moolenaar ); 7518*31337658SMarcel Moolenaar } 7519*31337658SMarcel Moolenaar 7520*31337658SMarcel Moolenaar // Convert data if not already a string 7521*31337658SMarcel Moolenaar if ( s.data && s.processData && typeof s.data !== "string" ) { 7522*31337658SMarcel Moolenaar s.data = jQuery.param( s.data, s.traditional ); 7523*31337658SMarcel Moolenaar } 7524*31337658SMarcel Moolenaar 7525*31337658SMarcel Moolenaar // Apply prefilters 7526*31337658SMarcel Moolenaar inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); 7527*31337658SMarcel Moolenaar 7528*31337658SMarcel Moolenaar // If request was aborted inside a prefiler, stop there 7529*31337658SMarcel Moolenaar if ( state === 2 ) { 7530*31337658SMarcel Moolenaar return false; 7531*31337658SMarcel Moolenaar } 7532*31337658SMarcel Moolenaar 7533*31337658SMarcel Moolenaar // We can fire global events as of now if asked to 7534*31337658SMarcel Moolenaar fireGlobals = s.global; 7535*31337658SMarcel Moolenaar 7536*31337658SMarcel Moolenaar // Uppercase the type 7537*31337658SMarcel Moolenaar s.type = s.type.toUpperCase(); 7538*31337658SMarcel Moolenaar 7539*31337658SMarcel Moolenaar // Determine if request has content 7540*31337658SMarcel Moolenaar s.hasContent = !rnoContent.test( s.type ); 7541*31337658SMarcel Moolenaar 7542*31337658SMarcel Moolenaar // Watch for a new set of requests 7543*31337658SMarcel Moolenaar if ( fireGlobals && jQuery.active++ === 0 ) { 7544*31337658SMarcel Moolenaar jQuery.event.trigger( "ajaxStart" ); 7545*31337658SMarcel Moolenaar } 7546*31337658SMarcel Moolenaar 7547*31337658SMarcel Moolenaar // More options handling for requests with no content 7548*31337658SMarcel Moolenaar if ( !s.hasContent ) { 7549*31337658SMarcel Moolenaar 7550*31337658SMarcel Moolenaar // If data is available, append data to url 7551*31337658SMarcel Moolenaar if ( s.data ) { 7552*31337658SMarcel Moolenaar s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data; 7553*31337658SMarcel Moolenaar // #9682: remove data so that it's not used in an eventual retry 7554*31337658SMarcel Moolenaar delete s.data; 7555*31337658SMarcel Moolenaar } 7556*31337658SMarcel Moolenaar 7557*31337658SMarcel Moolenaar // Get ifModifiedKey before adding the anti-cache parameter 7558*31337658SMarcel Moolenaar ifModifiedKey = s.url; 7559*31337658SMarcel Moolenaar 7560*31337658SMarcel Moolenaar // Add anti-cache in url if needed 7561*31337658SMarcel Moolenaar if ( s.cache === false ) { 7562*31337658SMarcel Moolenaar 7563*31337658SMarcel Moolenaar var ts = jQuery.now(), 7564*31337658SMarcel Moolenaar // try replacing _= if it is there 7565*31337658SMarcel Moolenaar ret = s.url.replace( rts, "$1_=" + ts ); 7566*31337658SMarcel Moolenaar 7567*31337658SMarcel Moolenaar // if nothing was replaced, add timestamp to the end 7568*31337658SMarcel Moolenaar s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" ); 7569*31337658SMarcel Moolenaar } 7570*31337658SMarcel Moolenaar } 7571*31337658SMarcel Moolenaar 7572*31337658SMarcel Moolenaar // Set the correct header, if data is being sent 7573*31337658SMarcel Moolenaar if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { 7574*31337658SMarcel Moolenaar jqXHR.setRequestHeader( "Content-Type", s.contentType ); 7575*31337658SMarcel Moolenaar } 7576*31337658SMarcel Moolenaar 7577*31337658SMarcel Moolenaar // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 7578*31337658SMarcel Moolenaar if ( s.ifModified ) { 7579*31337658SMarcel Moolenaar ifModifiedKey = ifModifiedKey || s.url; 7580*31337658SMarcel Moolenaar if ( jQuery.lastModified[ ifModifiedKey ] ) { 7581*31337658SMarcel Moolenaar jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] ); 7582*31337658SMarcel Moolenaar } 7583*31337658SMarcel Moolenaar if ( jQuery.etag[ ifModifiedKey ] ) { 7584*31337658SMarcel Moolenaar jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] ); 7585*31337658SMarcel Moolenaar } 7586*31337658SMarcel Moolenaar } 7587*31337658SMarcel Moolenaar 7588*31337658SMarcel Moolenaar // Set the Accepts header for the server, depending on the dataType 7589*31337658SMarcel Moolenaar jqXHR.setRequestHeader( 7590*31337658SMarcel Moolenaar "Accept", 7591*31337658SMarcel Moolenaar s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ? 7592*31337658SMarcel Moolenaar s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : 7593*31337658SMarcel Moolenaar s.accepts[ "*" ] 7594*31337658SMarcel Moolenaar ); 7595*31337658SMarcel Moolenaar 7596*31337658SMarcel Moolenaar // Check for headers option 7597*31337658SMarcel Moolenaar for ( i in s.headers ) { 7598*31337658SMarcel Moolenaar jqXHR.setRequestHeader( i, s.headers[ i ] ); 7599*31337658SMarcel Moolenaar } 7600*31337658SMarcel Moolenaar 7601*31337658SMarcel Moolenaar // Allow custom headers/mimetypes and early abort 7602*31337658SMarcel Moolenaar if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) { 7603*31337658SMarcel Moolenaar // Abort if not done already 7604*31337658SMarcel Moolenaar jqXHR.abort(); 7605*31337658SMarcel Moolenaar return false; 7606*31337658SMarcel Moolenaar 7607*31337658SMarcel Moolenaar } 7608*31337658SMarcel Moolenaar 7609*31337658SMarcel Moolenaar // Install callbacks on deferreds 7610*31337658SMarcel Moolenaar for ( i in { success: 1, error: 1, complete: 1 } ) { 7611*31337658SMarcel Moolenaar jqXHR[ i ]( s[ i ] ); 7612*31337658SMarcel Moolenaar } 7613*31337658SMarcel Moolenaar 7614*31337658SMarcel Moolenaar // Get transport 7615*31337658SMarcel Moolenaar transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); 7616*31337658SMarcel Moolenaar 7617*31337658SMarcel Moolenaar // If no transport, we auto-abort 7618*31337658SMarcel Moolenaar if ( !transport ) { 7619*31337658SMarcel Moolenaar done( -1, "No Transport" ); 7620*31337658SMarcel Moolenaar } else { 7621*31337658SMarcel Moolenaar jqXHR.readyState = 1; 7622*31337658SMarcel Moolenaar // Send global event 7623*31337658SMarcel Moolenaar if ( fireGlobals ) { 7624*31337658SMarcel Moolenaar globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); 7625*31337658SMarcel Moolenaar } 7626*31337658SMarcel Moolenaar // Timeout 7627*31337658SMarcel Moolenaar if ( s.async && s.timeout > 0 ) { 7628*31337658SMarcel Moolenaar timeoutTimer = setTimeout( function(){ 7629*31337658SMarcel Moolenaar jqXHR.abort( "timeout" ); 7630*31337658SMarcel Moolenaar }, s.timeout ); 7631*31337658SMarcel Moolenaar } 7632*31337658SMarcel Moolenaar 7633*31337658SMarcel Moolenaar try { 7634*31337658SMarcel Moolenaar state = 1; 7635*31337658SMarcel Moolenaar transport.send( requestHeaders, done ); 7636*31337658SMarcel Moolenaar } catch (e) { 7637*31337658SMarcel Moolenaar // Propagate exception as error if not done 7638*31337658SMarcel Moolenaar if ( state < 2 ) { 7639*31337658SMarcel Moolenaar done( -1, e ); 7640*31337658SMarcel Moolenaar // Simply rethrow otherwise 7641*31337658SMarcel Moolenaar } else { 7642*31337658SMarcel Moolenaar jQuery.error( e ); 7643*31337658SMarcel Moolenaar } 7644*31337658SMarcel Moolenaar } 7645*31337658SMarcel Moolenaar } 7646*31337658SMarcel Moolenaar 7647*31337658SMarcel Moolenaar return jqXHR; 7648*31337658SMarcel Moolenaar }, 7649*31337658SMarcel Moolenaar 7650*31337658SMarcel Moolenaar // Serialize an array of form elements or a set of 7651*31337658SMarcel Moolenaar // key/values into a query string 7652*31337658SMarcel Moolenaar param: function( a, traditional ) { 7653*31337658SMarcel Moolenaar var s = [], 7654*31337658SMarcel Moolenaar add = function( key, value ) { 7655*31337658SMarcel Moolenaar // If value is a function, invoke it and return its value 7656*31337658SMarcel Moolenaar value = jQuery.isFunction( value ) ? value() : value; 7657*31337658SMarcel Moolenaar s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); 7658*31337658SMarcel Moolenaar }; 7659*31337658SMarcel Moolenaar 7660*31337658SMarcel Moolenaar // Set traditional to true for jQuery <= 1.3.2 behavior. 7661*31337658SMarcel Moolenaar if ( traditional === undefined ) { 7662*31337658SMarcel Moolenaar traditional = jQuery.ajaxSettings.traditional; 7663*31337658SMarcel Moolenaar } 7664*31337658SMarcel Moolenaar 7665*31337658SMarcel Moolenaar // If an array was passed in, assume that it is an array of form elements. 7666*31337658SMarcel Moolenaar if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { 7667*31337658SMarcel Moolenaar // Serialize the form elements 7668*31337658SMarcel Moolenaar jQuery.each( a, function() { 7669*31337658SMarcel Moolenaar add( this.name, this.value ); 7670*31337658SMarcel Moolenaar }); 7671*31337658SMarcel Moolenaar 7672*31337658SMarcel Moolenaar } else { 7673*31337658SMarcel Moolenaar // If traditional, encode the "old" way (the way 1.3.2 or older 7674*31337658SMarcel Moolenaar // did it), otherwise encode params recursively. 7675*31337658SMarcel Moolenaar for ( var prefix in a ) { 7676*31337658SMarcel Moolenaar buildParams( prefix, a[ prefix ], traditional, add ); 7677*31337658SMarcel Moolenaar } 7678*31337658SMarcel Moolenaar } 7679*31337658SMarcel Moolenaar 7680*31337658SMarcel Moolenaar // Return the resulting serialization 7681*31337658SMarcel Moolenaar return s.join( "&" ).replace( r20, "+" ); 7682*31337658SMarcel Moolenaar } 7683*31337658SMarcel Moolenaar}); 7684*31337658SMarcel Moolenaar 7685*31337658SMarcel Moolenaarfunction buildParams( prefix, obj, traditional, add ) { 7686*31337658SMarcel Moolenaar if ( jQuery.isArray( obj ) ) { 7687*31337658SMarcel Moolenaar // Serialize array item. 7688*31337658SMarcel Moolenaar jQuery.each( obj, function( i, v ) { 7689*31337658SMarcel Moolenaar if ( traditional || rbracket.test( prefix ) ) { 7690*31337658SMarcel Moolenaar // Treat each array item as a scalar. 7691*31337658SMarcel Moolenaar add( prefix, v ); 7692*31337658SMarcel Moolenaar 7693*31337658SMarcel Moolenaar } else { 7694*31337658SMarcel Moolenaar // If array item is non-scalar (array or object), encode its 7695*31337658SMarcel Moolenaar // numeric index to resolve deserialization ambiguity issues. 7696*31337658SMarcel Moolenaar // Note that rack (as of 1.0.0) can't currently deserialize 7697*31337658SMarcel Moolenaar // nested arrays properly, and attempting to do so may cause 7698*31337658SMarcel Moolenaar // a server error. Possible fixes are to modify rack's 7699*31337658SMarcel Moolenaar // deserialization algorithm or to provide an option or flag 7700*31337658SMarcel Moolenaar // to force array serialization to be shallow. 7701*31337658SMarcel Moolenaar buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add ); 7702*31337658SMarcel Moolenaar } 7703*31337658SMarcel Moolenaar }); 7704*31337658SMarcel Moolenaar 7705*31337658SMarcel Moolenaar } else if ( !traditional && obj != null && typeof obj === "object" ) { 7706*31337658SMarcel Moolenaar // Serialize object item. 7707*31337658SMarcel Moolenaar for ( var name in obj ) { 7708*31337658SMarcel Moolenaar buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); 7709*31337658SMarcel Moolenaar } 7710*31337658SMarcel Moolenaar 7711*31337658SMarcel Moolenaar } else { 7712*31337658SMarcel Moolenaar // Serialize scalar item. 7713*31337658SMarcel Moolenaar add( prefix, obj ); 7714*31337658SMarcel Moolenaar } 7715*31337658SMarcel Moolenaar} 7716*31337658SMarcel Moolenaar 7717*31337658SMarcel Moolenaar// This is still on the jQuery object... for now 7718*31337658SMarcel Moolenaar// Want to move this to jQuery.ajax some day 7719*31337658SMarcel MoolenaarjQuery.extend({ 7720*31337658SMarcel Moolenaar 7721*31337658SMarcel Moolenaar // Counter for holding the number of active queries 7722*31337658SMarcel Moolenaar active: 0, 7723*31337658SMarcel Moolenaar 7724*31337658SMarcel Moolenaar // Last-Modified header cache for next request 7725*31337658SMarcel Moolenaar lastModified: {}, 7726*31337658SMarcel Moolenaar etag: {} 7727*31337658SMarcel Moolenaar 7728*31337658SMarcel Moolenaar}); 7729*31337658SMarcel Moolenaar 7730*31337658SMarcel Moolenaar/* Handles responses to an ajax request: 7731*31337658SMarcel Moolenaar * - sets all responseXXX fields accordingly 7732*31337658SMarcel Moolenaar * - finds the right dataType (mediates between content-type and expected dataType) 7733*31337658SMarcel Moolenaar * - returns the corresponding response 7734*31337658SMarcel Moolenaar */ 7735*31337658SMarcel Moolenaarfunction ajaxHandleResponses( s, jqXHR, responses ) { 7736*31337658SMarcel Moolenaar 7737*31337658SMarcel Moolenaar var contents = s.contents, 7738*31337658SMarcel Moolenaar dataTypes = s.dataTypes, 7739*31337658SMarcel Moolenaar responseFields = s.responseFields, 7740*31337658SMarcel Moolenaar ct, 7741*31337658SMarcel Moolenaar type, 7742*31337658SMarcel Moolenaar finalDataType, 7743*31337658SMarcel Moolenaar firstDataType; 7744*31337658SMarcel Moolenaar 7745*31337658SMarcel Moolenaar // Fill responseXXX fields 7746*31337658SMarcel Moolenaar for ( type in responseFields ) { 7747*31337658SMarcel Moolenaar if ( type in responses ) { 7748*31337658SMarcel Moolenaar jqXHR[ responseFields[type] ] = responses[ type ]; 7749*31337658SMarcel Moolenaar } 7750*31337658SMarcel Moolenaar } 7751*31337658SMarcel Moolenaar 7752*31337658SMarcel Moolenaar // Remove auto dataType and get content-type in the process 7753*31337658SMarcel Moolenaar while( dataTypes[ 0 ] === "*" ) { 7754*31337658SMarcel Moolenaar dataTypes.shift(); 7755*31337658SMarcel Moolenaar if ( ct === undefined ) { 7756*31337658SMarcel Moolenaar ct = s.mimeType || jqXHR.getResponseHeader( "content-type" ); 7757*31337658SMarcel Moolenaar } 7758*31337658SMarcel Moolenaar } 7759*31337658SMarcel Moolenaar 7760*31337658SMarcel Moolenaar // Check if we're dealing with a known content-type 7761*31337658SMarcel Moolenaar if ( ct ) { 7762*31337658SMarcel Moolenaar for ( type in contents ) { 7763*31337658SMarcel Moolenaar if ( contents[ type ] && contents[ type ].test( ct ) ) { 7764*31337658SMarcel Moolenaar dataTypes.unshift( type ); 7765*31337658SMarcel Moolenaar break; 7766*31337658SMarcel Moolenaar } 7767*31337658SMarcel Moolenaar } 7768*31337658SMarcel Moolenaar } 7769*31337658SMarcel Moolenaar 7770*31337658SMarcel Moolenaar // Check to see if we have a response for the expected dataType 7771*31337658SMarcel Moolenaar if ( dataTypes[ 0 ] in responses ) { 7772*31337658SMarcel Moolenaar finalDataType = dataTypes[ 0 ]; 7773*31337658SMarcel Moolenaar } else { 7774*31337658SMarcel Moolenaar // Try convertible dataTypes 7775*31337658SMarcel Moolenaar for ( type in responses ) { 7776*31337658SMarcel Moolenaar if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) { 7777*31337658SMarcel Moolenaar finalDataType = type; 7778*31337658SMarcel Moolenaar break; 7779*31337658SMarcel Moolenaar } 7780*31337658SMarcel Moolenaar if ( !firstDataType ) { 7781*31337658SMarcel Moolenaar firstDataType = type; 7782*31337658SMarcel Moolenaar } 7783*31337658SMarcel Moolenaar } 7784*31337658SMarcel Moolenaar // Or just use first one 7785*31337658SMarcel Moolenaar finalDataType = finalDataType || firstDataType; 7786*31337658SMarcel Moolenaar } 7787*31337658SMarcel Moolenaar 7788*31337658SMarcel Moolenaar // If we found a dataType 7789*31337658SMarcel Moolenaar // We add the dataType to the list if needed 7790*31337658SMarcel Moolenaar // and return the corresponding response 7791*31337658SMarcel Moolenaar if ( finalDataType ) { 7792*31337658SMarcel Moolenaar if ( finalDataType !== dataTypes[ 0 ] ) { 7793*31337658SMarcel Moolenaar dataTypes.unshift( finalDataType ); 7794*31337658SMarcel Moolenaar } 7795*31337658SMarcel Moolenaar return responses[ finalDataType ]; 7796*31337658SMarcel Moolenaar } 7797*31337658SMarcel Moolenaar} 7798*31337658SMarcel Moolenaar 7799*31337658SMarcel Moolenaar// Chain conversions given the request and the original response 7800*31337658SMarcel Moolenaarfunction ajaxConvert( s, response ) { 7801*31337658SMarcel Moolenaar 7802*31337658SMarcel Moolenaar // Apply the dataFilter if provided 7803*31337658SMarcel Moolenaar if ( s.dataFilter ) { 7804*31337658SMarcel Moolenaar response = s.dataFilter( response, s.dataType ); 7805*31337658SMarcel Moolenaar } 7806*31337658SMarcel Moolenaar 7807*31337658SMarcel Moolenaar var dataTypes = s.dataTypes, 7808*31337658SMarcel Moolenaar converters = {}, 7809*31337658SMarcel Moolenaar i, 7810*31337658SMarcel Moolenaar key, 7811*31337658SMarcel Moolenaar length = dataTypes.length, 7812*31337658SMarcel Moolenaar tmp, 7813*31337658SMarcel Moolenaar // Current and previous dataTypes 7814*31337658SMarcel Moolenaar current = dataTypes[ 0 ], 7815*31337658SMarcel Moolenaar prev, 7816*31337658SMarcel Moolenaar // Conversion expression 7817*31337658SMarcel Moolenaar conversion, 7818*31337658SMarcel Moolenaar // Conversion function 7819*31337658SMarcel Moolenaar conv, 7820*31337658SMarcel Moolenaar // Conversion functions (transitive conversion) 7821*31337658SMarcel Moolenaar conv1, 7822*31337658SMarcel Moolenaar conv2; 7823*31337658SMarcel Moolenaar 7824*31337658SMarcel Moolenaar // For each dataType in the chain 7825*31337658SMarcel Moolenaar for ( i = 1; i < length; i++ ) { 7826*31337658SMarcel Moolenaar 7827*31337658SMarcel Moolenaar // Create converters map 7828*31337658SMarcel Moolenaar // with lowercased keys 7829*31337658SMarcel Moolenaar if ( i === 1 ) { 7830*31337658SMarcel Moolenaar for ( key in s.converters ) { 7831*31337658SMarcel Moolenaar if ( typeof key === "string" ) { 7832*31337658SMarcel Moolenaar converters[ key.toLowerCase() ] = s.converters[ key ]; 7833*31337658SMarcel Moolenaar } 7834*31337658SMarcel Moolenaar } 7835*31337658SMarcel Moolenaar } 7836*31337658SMarcel Moolenaar 7837*31337658SMarcel Moolenaar // Get the dataTypes 7838*31337658SMarcel Moolenaar prev = current; 7839*31337658SMarcel Moolenaar current = dataTypes[ i ]; 7840*31337658SMarcel Moolenaar 7841*31337658SMarcel Moolenaar // If current is auto dataType, update it to prev 7842*31337658SMarcel Moolenaar if ( current === "*" ) { 7843*31337658SMarcel Moolenaar current = prev; 7844*31337658SMarcel Moolenaar // If no auto and dataTypes are actually different 7845*31337658SMarcel Moolenaar } else if ( prev !== "*" && prev !== current ) { 7846*31337658SMarcel Moolenaar 7847*31337658SMarcel Moolenaar // Get the converter 7848*31337658SMarcel Moolenaar conversion = prev + " " + current; 7849*31337658SMarcel Moolenaar conv = converters[ conversion ] || converters[ "* " + current ]; 7850*31337658SMarcel Moolenaar 7851*31337658SMarcel Moolenaar // If there is no direct converter, search transitively 7852*31337658SMarcel Moolenaar if ( !conv ) { 7853*31337658SMarcel Moolenaar conv2 = undefined; 7854*31337658SMarcel Moolenaar for ( conv1 in converters ) { 7855*31337658SMarcel Moolenaar tmp = conv1.split( " " ); 7856*31337658SMarcel Moolenaar if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) { 7857*31337658SMarcel Moolenaar conv2 = converters[ tmp[1] + " " + current ]; 7858*31337658SMarcel Moolenaar if ( conv2 ) { 7859*31337658SMarcel Moolenaar conv1 = converters[ conv1 ]; 7860*31337658SMarcel Moolenaar if ( conv1 === true ) { 7861*31337658SMarcel Moolenaar conv = conv2; 7862*31337658SMarcel Moolenaar } else if ( conv2 === true ) { 7863*31337658SMarcel Moolenaar conv = conv1; 7864*31337658SMarcel Moolenaar } 7865*31337658SMarcel Moolenaar break; 7866*31337658SMarcel Moolenaar } 7867*31337658SMarcel Moolenaar } 7868*31337658SMarcel Moolenaar } 7869*31337658SMarcel Moolenaar } 7870*31337658SMarcel Moolenaar // If we found no converter, dispatch an error 7871*31337658SMarcel Moolenaar if ( !( conv || conv2 ) ) { 7872*31337658SMarcel Moolenaar jQuery.error( "No conversion from " + conversion.replace(" "," to ") ); 7873*31337658SMarcel Moolenaar } 7874*31337658SMarcel Moolenaar // If found converter is not an equivalence 7875*31337658SMarcel Moolenaar if ( conv !== true ) { 7876*31337658SMarcel Moolenaar // Convert with 1 or 2 converters accordingly 7877*31337658SMarcel Moolenaar response = conv ? conv( response ) : conv2( conv1(response) ); 7878*31337658SMarcel Moolenaar } 7879*31337658SMarcel Moolenaar } 7880*31337658SMarcel Moolenaar } 7881*31337658SMarcel Moolenaar return response; 7882*31337658SMarcel Moolenaar} 7883*31337658SMarcel Moolenaar 7884*31337658SMarcel Moolenaar 7885*31337658SMarcel Moolenaar 7886*31337658SMarcel Moolenaar 7887*31337658SMarcel Moolenaarvar jsc = jQuery.now(), 7888*31337658SMarcel Moolenaar jsre = /(\=)\?(&|$)|\?\?/i; 7889*31337658SMarcel Moolenaar 7890*31337658SMarcel Moolenaar// Default jsonp settings 7891*31337658SMarcel MoolenaarjQuery.ajaxSetup({ 7892*31337658SMarcel Moolenaar jsonp: "callback", 7893*31337658SMarcel Moolenaar jsonpCallback: function() { 7894*31337658SMarcel Moolenaar return jQuery.expando + "_" + ( jsc++ ); 7895*31337658SMarcel Moolenaar } 7896*31337658SMarcel Moolenaar}); 7897*31337658SMarcel Moolenaar 7898*31337658SMarcel Moolenaar// Detect, normalize options and install callbacks for jsonp requests 7899*31337658SMarcel MoolenaarjQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { 7900*31337658SMarcel Moolenaar 7901*31337658SMarcel Moolenaar var inspectData = s.contentType === "application/x-www-form-urlencoded" && 7902*31337658SMarcel Moolenaar ( typeof s.data === "string" ); 7903*31337658SMarcel Moolenaar 7904*31337658SMarcel Moolenaar if ( s.dataTypes[ 0 ] === "jsonp" || 7905*31337658SMarcel Moolenaar s.jsonp !== false && ( jsre.test( s.url ) || 7906*31337658SMarcel Moolenaar inspectData && jsre.test( s.data ) ) ) { 7907*31337658SMarcel Moolenaar 7908*31337658SMarcel Moolenaar var responseContainer, 7909*31337658SMarcel Moolenaar jsonpCallback = s.jsonpCallback = 7910*31337658SMarcel Moolenaar jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback, 7911*31337658SMarcel Moolenaar previous = window[ jsonpCallback ], 7912*31337658SMarcel Moolenaar url = s.url, 7913*31337658SMarcel Moolenaar data = s.data, 7914*31337658SMarcel Moolenaar replace = "$1" + jsonpCallback + "$2"; 7915*31337658SMarcel Moolenaar 7916*31337658SMarcel Moolenaar if ( s.jsonp !== false ) { 7917*31337658SMarcel Moolenaar url = url.replace( jsre, replace ); 7918*31337658SMarcel Moolenaar if ( s.url === url ) { 7919*31337658SMarcel Moolenaar if ( inspectData ) { 7920*31337658SMarcel Moolenaar data = data.replace( jsre, replace ); 7921*31337658SMarcel Moolenaar } 7922*31337658SMarcel Moolenaar if ( s.data === data ) { 7923*31337658SMarcel Moolenaar // Add callback manually 7924*31337658SMarcel Moolenaar url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback; 7925*31337658SMarcel Moolenaar } 7926*31337658SMarcel Moolenaar } 7927*31337658SMarcel Moolenaar } 7928*31337658SMarcel Moolenaar 7929*31337658SMarcel Moolenaar s.url = url; 7930*31337658SMarcel Moolenaar s.data = data; 7931*31337658SMarcel Moolenaar 7932*31337658SMarcel Moolenaar // Install callback 7933*31337658SMarcel Moolenaar window[ jsonpCallback ] = function( response ) { 7934*31337658SMarcel Moolenaar responseContainer = [ response ]; 7935*31337658SMarcel Moolenaar }; 7936*31337658SMarcel Moolenaar 7937*31337658SMarcel Moolenaar // Clean-up function 7938*31337658SMarcel Moolenaar jqXHR.always(function() { 7939*31337658SMarcel Moolenaar // Set callback back to previous value 7940*31337658SMarcel Moolenaar window[ jsonpCallback ] = previous; 7941*31337658SMarcel Moolenaar // Call if it was a function and we have a response 7942*31337658SMarcel Moolenaar if ( responseContainer && jQuery.isFunction( previous ) ) { 7943*31337658SMarcel Moolenaar window[ jsonpCallback ]( responseContainer[ 0 ] ); 7944*31337658SMarcel Moolenaar } 7945*31337658SMarcel Moolenaar }); 7946*31337658SMarcel Moolenaar 7947*31337658SMarcel Moolenaar // Use data converter to retrieve json after script execution 7948*31337658SMarcel Moolenaar s.converters["script json"] = function() { 7949*31337658SMarcel Moolenaar if ( !responseContainer ) { 7950*31337658SMarcel Moolenaar jQuery.error( jsonpCallback + " was not called" ); 7951*31337658SMarcel Moolenaar } 7952*31337658SMarcel Moolenaar return responseContainer[ 0 ]; 7953*31337658SMarcel Moolenaar }; 7954*31337658SMarcel Moolenaar 7955*31337658SMarcel Moolenaar // force json dataType 7956*31337658SMarcel Moolenaar s.dataTypes[ 0 ] = "json"; 7957*31337658SMarcel Moolenaar 7958*31337658SMarcel Moolenaar // Delegate to script 7959*31337658SMarcel Moolenaar return "script"; 7960*31337658SMarcel Moolenaar } 7961*31337658SMarcel Moolenaar}); 7962*31337658SMarcel Moolenaar 7963*31337658SMarcel Moolenaar 7964*31337658SMarcel Moolenaar 7965*31337658SMarcel Moolenaar 7966*31337658SMarcel Moolenaar// Install script dataType 7967*31337658SMarcel MoolenaarjQuery.ajaxSetup({ 7968*31337658SMarcel Moolenaar accepts: { 7969*31337658SMarcel Moolenaar script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" 7970*31337658SMarcel Moolenaar }, 7971*31337658SMarcel Moolenaar contents: { 7972*31337658SMarcel Moolenaar script: /javascript|ecmascript/ 7973*31337658SMarcel Moolenaar }, 7974*31337658SMarcel Moolenaar converters: { 7975*31337658SMarcel Moolenaar "text script": function( text ) { 7976*31337658SMarcel Moolenaar jQuery.globalEval( text ); 7977*31337658SMarcel Moolenaar return text; 7978*31337658SMarcel Moolenaar } 7979*31337658SMarcel Moolenaar } 7980*31337658SMarcel Moolenaar}); 7981*31337658SMarcel Moolenaar 7982*31337658SMarcel Moolenaar// Handle cache's special case and global 7983*31337658SMarcel MoolenaarjQuery.ajaxPrefilter( "script", function( s ) { 7984*31337658SMarcel Moolenaar if ( s.cache === undefined ) { 7985*31337658SMarcel Moolenaar s.cache = false; 7986*31337658SMarcel Moolenaar } 7987*31337658SMarcel Moolenaar if ( s.crossDomain ) { 7988*31337658SMarcel Moolenaar s.type = "GET"; 7989*31337658SMarcel Moolenaar s.global = false; 7990*31337658SMarcel Moolenaar } 7991*31337658SMarcel Moolenaar}); 7992*31337658SMarcel Moolenaar 7993*31337658SMarcel Moolenaar// Bind script tag hack transport 7994*31337658SMarcel MoolenaarjQuery.ajaxTransport( "script", function(s) { 7995*31337658SMarcel Moolenaar 7996*31337658SMarcel Moolenaar // This transport only deals with cross domain requests 7997*31337658SMarcel Moolenaar if ( s.crossDomain ) { 7998*31337658SMarcel Moolenaar 7999*31337658SMarcel Moolenaar var script, 8000*31337658SMarcel Moolenaar head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement; 8001*31337658SMarcel Moolenaar 8002*31337658SMarcel Moolenaar return { 8003*31337658SMarcel Moolenaar 8004*31337658SMarcel Moolenaar send: function( _, callback ) { 8005*31337658SMarcel Moolenaar 8006*31337658SMarcel Moolenaar script = document.createElement( "script" ); 8007*31337658SMarcel Moolenaar 8008*31337658SMarcel Moolenaar script.async = "async"; 8009*31337658SMarcel Moolenaar 8010*31337658SMarcel Moolenaar if ( s.scriptCharset ) { 8011*31337658SMarcel Moolenaar script.charset = s.scriptCharset; 8012*31337658SMarcel Moolenaar } 8013*31337658SMarcel Moolenaar 8014*31337658SMarcel Moolenaar script.src = s.url; 8015*31337658SMarcel Moolenaar 8016*31337658SMarcel Moolenaar // Attach handlers for all browsers 8017*31337658SMarcel Moolenaar script.onload = script.onreadystatechange = function( _, isAbort ) { 8018*31337658SMarcel Moolenaar 8019*31337658SMarcel Moolenaar if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) { 8020*31337658SMarcel Moolenaar 8021*31337658SMarcel Moolenaar // Handle memory leak in IE 8022*31337658SMarcel Moolenaar script.onload = script.onreadystatechange = null; 8023*31337658SMarcel Moolenaar 8024*31337658SMarcel Moolenaar // Remove the script 8025*31337658SMarcel Moolenaar if ( head && script.parentNode ) { 8026*31337658SMarcel Moolenaar head.removeChild( script ); 8027*31337658SMarcel Moolenaar } 8028*31337658SMarcel Moolenaar 8029*31337658SMarcel Moolenaar // Dereference the script 8030*31337658SMarcel Moolenaar script = undefined; 8031*31337658SMarcel Moolenaar 8032*31337658SMarcel Moolenaar // Callback if not abort 8033*31337658SMarcel Moolenaar if ( !isAbort ) { 8034*31337658SMarcel Moolenaar callback( 200, "success" ); 8035*31337658SMarcel Moolenaar } 8036*31337658SMarcel Moolenaar } 8037*31337658SMarcel Moolenaar }; 8038*31337658SMarcel Moolenaar // Use insertBefore instead of appendChild to circumvent an IE6 bug. 8039*31337658SMarcel Moolenaar // This arises when a base node is used (#2709 and #4378). 8040*31337658SMarcel Moolenaar head.insertBefore( script, head.firstChild ); 8041*31337658SMarcel Moolenaar }, 8042*31337658SMarcel Moolenaar 8043*31337658SMarcel Moolenaar abort: function() { 8044*31337658SMarcel Moolenaar if ( script ) { 8045*31337658SMarcel Moolenaar script.onload( 0, 1 ); 8046*31337658SMarcel Moolenaar } 8047*31337658SMarcel Moolenaar } 8048*31337658SMarcel Moolenaar }; 8049*31337658SMarcel Moolenaar } 8050*31337658SMarcel Moolenaar}); 8051*31337658SMarcel Moolenaar 8052*31337658SMarcel Moolenaar 8053*31337658SMarcel Moolenaar 8054*31337658SMarcel Moolenaar 8055*31337658SMarcel Moolenaarvar // #5280: Internet Explorer will keep connections alive if we don't abort on unload 8056*31337658SMarcel Moolenaar xhrOnUnloadAbort = window.ActiveXObject ? function() { 8057*31337658SMarcel Moolenaar // Abort all pending requests 8058*31337658SMarcel Moolenaar for ( var key in xhrCallbacks ) { 8059*31337658SMarcel Moolenaar xhrCallbacks[ key ]( 0, 1 ); 8060*31337658SMarcel Moolenaar } 8061*31337658SMarcel Moolenaar } : false, 8062*31337658SMarcel Moolenaar xhrId = 0, 8063*31337658SMarcel Moolenaar xhrCallbacks; 8064*31337658SMarcel Moolenaar 8065*31337658SMarcel Moolenaar// Functions to create xhrs 8066*31337658SMarcel Moolenaarfunction createStandardXHR() { 8067*31337658SMarcel Moolenaar try { 8068*31337658SMarcel Moolenaar return new window.XMLHttpRequest(); 8069*31337658SMarcel Moolenaar } catch( e ) {} 8070*31337658SMarcel Moolenaar} 8071*31337658SMarcel Moolenaar 8072*31337658SMarcel Moolenaarfunction createActiveXHR() { 8073*31337658SMarcel Moolenaar try { 8074*31337658SMarcel Moolenaar return new window.ActiveXObject( "Microsoft.XMLHTTP" ); 8075*31337658SMarcel Moolenaar } catch( e ) {} 8076*31337658SMarcel Moolenaar} 8077*31337658SMarcel Moolenaar 8078*31337658SMarcel Moolenaar// Create the request object 8079*31337658SMarcel Moolenaar// (This is still attached to ajaxSettings for backward compatibility) 8080*31337658SMarcel MoolenaarjQuery.ajaxSettings.xhr = window.ActiveXObject ? 8081*31337658SMarcel Moolenaar /* Microsoft failed to properly 8082*31337658SMarcel Moolenaar * implement the XMLHttpRequest in IE7 (can't request local files), 8083*31337658SMarcel Moolenaar * so we use the ActiveXObject when it is available 8084*31337658SMarcel Moolenaar * Additionally XMLHttpRequest can be disabled in IE7/IE8 so 8085*31337658SMarcel Moolenaar * we need a fallback. 8086*31337658SMarcel Moolenaar */ 8087*31337658SMarcel Moolenaar function() { 8088*31337658SMarcel Moolenaar return !this.isLocal && createStandardXHR() || createActiveXHR(); 8089*31337658SMarcel Moolenaar } : 8090*31337658SMarcel Moolenaar // For all other browsers, use the standard XMLHttpRequest object 8091*31337658SMarcel Moolenaar createStandardXHR; 8092*31337658SMarcel Moolenaar 8093*31337658SMarcel Moolenaar// Determine support properties 8094*31337658SMarcel Moolenaar(function( xhr ) { 8095*31337658SMarcel Moolenaar jQuery.extend( jQuery.support, { 8096*31337658SMarcel Moolenaar ajax: !!xhr, 8097*31337658SMarcel Moolenaar cors: !!xhr && ( "withCredentials" in xhr ) 8098*31337658SMarcel Moolenaar }); 8099*31337658SMarcel Moolenaar})( jQuery.ajaxSettings.xhr() ); 8100*31337658SMarcel Moolenaar 8101*31337658SMarcel Moolenaar// Create transport if the browser can provide an xhr 8102*31337658SMarcel Moolenaarif ( jQuery.support.ajax ) { 8103*31337658SMarcel Moolenaar 8104*31337658SMarcel Moolenaar jQuery.ajaxTransport(function( s ) { 8105*31337658SMarcel Moolenaar // Cross domain only allowed if supported through XMLHttpRequest 8106*31337658SMarcel Moolenaar if ( !s.crossDomain || jQuery.support.cors ) { 8107*31337658SMarcel Moolenaar 8108*31337658SMarcel Moolenaar var callback; 8109*31337658SMarcel Moolenaar 8110*31337658SMarcel Moolenaar return { 8111*31337658SMarcel Moolenaar send: function( headers, complete ) { 8112*31337658SMarcel Moolenaar 8113*31337658SMarcel Moolenaar // Get a new xhr 8114*31337658SMarcel Moolenaar var xhr = s.xhr(), 8115*31337658SMarcel Moolenaar handle, 8116*31337658SMarcel Moolenaar i; 8117*31337658SMarcel Moolenaar 8118*31337658SMarcel Moolenaar // Open the socket 8119*31337658SMarcel Moolenaar // Passing null username, generates a login popup on Opera (#2865) 8120*31337658SMarcel Moolenaar if ( s.username ) { 8121*31337658SMarcel Moolenaar xhr.open( s.type, s.url, s.async, s.username, s.password ); 8122*31337658SMarcel Moolenaar } else { 8123*31337658SMarcel Moolenaar xhr.open( s.type, s.url, s.async ); 8124*31337658SMarcel Moolenaar } 8125*31337658SMarcel Moolenaar 8126*31337658SMarcel Moolenaar // Apply custom fields if provided 8127*31337658SMarcel Moolenaar if ( s.xhrFields ) { 8128*31337658SMarcel Moolenaar for ( i in s.xhrFields ) { 8129*31337658SMarcel Moolenaar xhr[ i ] = s.xhrFields[ i ]; 8130*31337658SMarcel Moolenaar } 8131*31337658SMarcel Moolenaar } 8132*31337658SMarcel Moolenaar 8133*31337658SMarcel Moolenaar // Override mime type if needed 8134*31337658SMarcel Moolenaar if ( s.mimeType && xhr.overrideMimeType ) { 8135*31337658SMarcel Moolenaar xhr.overrideMimeType( s.mimeType ); 8136*31337658SMarcel Moolenaar } 8137*31337658SMarcel Moolenaar 8138*31337658SMarcel Moolenaar // X-Requested-With header 8139*31337658SMarcel Moolenaar // For cross-domain requests, seeing as conditions for a preflight are 8140*31337658SMarcel Moolenaar // akin to a jigsaw puzzle, we simply never set it to be sure. 8141*31337658SMarcel Moolenaar // (it can always be set on a per-request basis or even using ajaxSetup) 8142*31337658SMarcel Moolenaar // For same-domain requests, won't change header if already provided. 8143*31337658SMarcel Moolenaar if ( !s.crossDomain && !headers["X-Requested-With"] ) { 8144*31337658SMarcel Moolenaar headers[ "X-Requested-With" ] = "XMLHttpRequest"; 8145*31337658SMarcel Moolenaar } 8146*31337658SMarcel Moolenaar 8147*31337658SMarcel Moolenaar // Need an extra try/catch for cross domain requests in Firefox 3 8148*31337658SMarcel Moolenaar try { 8149*31337658SMarcel Moolenaar for ( i in headers ) { 8150*31337658SMarcel Moolenaar xhr.setRequestHeader( i, headers[ i ] ); 8151*31337658SMarcel Moolenaar } 8152*31337658SMarcel Moolenaar } catch( _ ) {} 8153*31337658SMarcel Moolenaar 8154*31337658SMarcel Moolenaar // Do send the request 8155*31337658SMarcel Moolenaar // This may raise an exception which is actually 8156*31337658SMarcel Moolenaar // handled in jQuery.ajax (so no try/catch here) 8157*31337658SMarcel Moolenaar xhr.send( ( s.hasContent && s.data ) || null ); 8158*31337658SMarcel Moolenaar 8159*31337658SMarcel Moolenaar // Listener 8160*31337658SMarcel Moolenaar callback = function( _, isAbort ) { 8161*31337658SMarcel Moolenaar 8162*31337658SMarcel Moolenaar var status, 8163*31337658SMarcel Moolenaar statusText, 8164*31337658SMarcel Moolenaar responseHeaders, 8165*31337658SMarcel Moolenaar responses, 8166*31337658SMarcel Moolenaar xml; 8167*31337658SMarcel Moolenaar 8168*31337658SMarcel Moolenaar // Firefox throws exceptions when accessing properties 8169*31337658SMarcel Moolenaar // of an xhr when a network error occured 8170*31337658SMarcel Moolenaar // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE) 8171*31337658SMarcel Moolenaar try { 8172*31337658SMarcel Moolenaar 8173*31337658SMarcel Moolenaar // Was never called and is aborted or complete 8174*31337658SMarcel Moolenaar if ( callback && ( isAbort || xhr.readyState === 4 ) ) { 8175*31337658SMarcel Moolenaar 8176*31337658SMarcel Moolenaar // Only called once 8177*31337658SMarcel Moolenaar callback = undefined; 8178*31337658SMarcel Moolenaar 8179*31337658SMarcel Moolenaar // Do not keep as active anymore 8180*31337658SMarcel Moolenaar if ( handle ) { 8181*31337658SMarcel Moolenaar xhr.onreadystatechange = jQuery.noop; 8182*31337658SMarcel Moolenaar if ( xhrOnUnloadAbort ) { 8183*31337658SMarcel Moolenaar delete xhrCallbacks[ handle ]; 8184*31337658SMarcel Moolenaar } 8185*31337658SMarcel Moolenaar } 8186*31337658SMarcel Moolenaar 8187*31337658SMarcel Moolenaar // If it's an abort 8188*31337658SMarcel Moolenaar if ( isAbort ) { 8189*31337658SMarcel Moolenaar // Abort it manually if needed 8190*31337658SMarcel Moolenaar if ( xhr.readyState !== 4 ) { 8191*31337658SMarcel Moolenaar xhr.abort(); 8192*31337658SMarcel Moolenaar } 8193*31337658SMarcel Moolenaar } else { 8194*31337658SMarcel Moolenaar status = xhr.status; 8195*31337658SMarcel Moolenaar responseHeaders = xhr.getAllResponseHeaders(); 8196*31337658SMarcel Moolenaar responses = {}; 8197*31337658SMarcel Moolenaar xml = xhr.responseXML; 8198*31337658SMarcel Moolenaar 8199*31337658SMarcel Moolenaar // Construct response list 8200*31337658SMarcel Moolenaar if ( xml && xml.documentElement /* #4958 */ ) { 8201*31337658SMarcel Moolenaar responses.xml = xml; 8202*31337658SMarcel Moolenaar } 8203*31337658SMarcel Moolenaar responses.text = xhr.responseText; 8204*31337658SMarcel Moolenaar 8205*31337658SMarcel Moolenaar // Firefox throws an exception when accessing 8206*31337658SMarcel Moolenaar // statusText for faulty cross-domain requests 8207*31337658SMarcel Moolenaar try { 8208*31337658SMarcel Moolenaar statusText = xhr.statusText; 8209*31337658SMarcel Moolenaar } catch( e ) { 8210*31337658SMarcel Moolenaar // We normalize with Webkit giving an empty statusText 8211*31337658SMarcel Moolenaar statusText = ""; 8212*31337658SMarcel Moolenaar } 8213*31337658SMarcel Moolenaar 8214*31337658SMarcel Moolenaar // Filter status for non standard behaviors 8215*31337658SMarcel Moolenaar 8216*31337658SMarcel Moolenaar // If the request is local and we have data: assume a success 8217*31337658SMarcel Moolenaar // (success with no data won't get notified, that's the best we 8218*31337658SMarcel Moolenaar // can do given current implementations) 8219*31337658SMarcel Moolenaar if ( !status && s.isLocal && !s.crossDomain ) { 8220*31337658SMarcel Moolenaar status = responses.text ? 200 : 404; 8221*31337658SMarcel Moolenaar // IE - #1450: sometimes returns 1223 when it should be 204 8222*31337658SMarcel Moolenaar } else if ( status === 1223 ) { 8223*31337658SMarcel Moolenaar status = 204; 8224*31337658SMarcel Moolenaar } 8225*31337658SMarcel Moolenaar } 8226*31337658SMarcel Moolenaar } 8227*31337658SMarcel Moolenaar } catch( firefoxAccessException ) { 8228*31337658SMarcel Moolenaar if ( !isAbort ) { 8229*31337658SMarcel Moolenaar complete( -1, firefoxAccessException ); 8230*31337658SMarcel Moolenaar } 8231*31337658SMarcel Moolenaar } 8232*31337658SMarcel Moolenaar 8233*31337658SMarcel Moolenaar // Call complete if needed 8234*31337658SMarcel Moolenaar if ( responses ) { 8235*31337658SMarcel Moolenaar complete( status, statusText, responses, responseHeaders ); 8236*31337658SMarcel Moolenaar } 8237*31337658SMarcel Moolenaar }; 8238*31337658SMarcel Moolenaar 8239*31337658SMarcel Moolenaar // if we're in sync mode or it's in cache 8240*31337658SMarcel Moolenaar // and has been retrieved directly (IE6 & IE7) 8241*31337658SMarcel Moolenaar // we need to manually fire the callback 8242*31337658SMarcel Moolenaar if ( !s.async || xhr.readyState === 4 ) { 8243*31337658SMarcel Moolenaar callback(); 8244*31337658SMarcel Moolenaar } else { 8245*31337658SMarcel Moolenaar handle = ++xhrId; 8246*31337658SMarcel Moolenaar if ( xhrOnUnloadAbort ) { 8247*31337658SMarcel Moolenaar // Create the active xhrs callbacks list if needed 8248*31337658SMarcel Moolenaar // and attach the unload handler 8249*31337658SMarcel Moolenaar if ( !xhrCallbacks ) { 8250*31337658SMarcel Moolenaar xhrCallbacks = {}; 8251*31337658SMarcel Moolenaar jQuery( window ).unload( xhrOnUnloadAbort ); 8252*31337658SMarcel Moolenaar } 8253*31337658SMarcel Moolenaar // Add to list of active xhrs callbacks 8254*31337658SMarcel Moolenaar xhrCallbacks[ handle ] = callback; 8255*31337658SMarcel Moolenaar } 8256*31337658SMarcel Moolenaar xhr.onreadystatechange = callback; 8257*31337658SMarcel Moolenaar } 8258*31337658SMarcel Moolenaar }, 8259*31337658SMarcel Moolenaar 8260*31337658SMarcel Moolenaar abort: function() { 8261*31337658SMarcel Moolenaar if ( callback ) { 8262*31337658SMarcel Moolenaar callback(0,1); 8263*31337658SMarcel Moolenaar } 8264*31337658SMarcel Moolenaar } 8265*31337658SMarcel Moolenaar }; 8266*31337658SMarcel Moolenaar } 8267*31337658SMarcel Moolenaar }); 8268*31337658SMarcel Moolenaar} 8269*31337658SMarcel Moolenaar 8270*31337658SMarcel Moolenaar 8271*31337658SMarcel Moolenaar 8272*31337658SMarcel Moolenaar 8273*31337658SMarcel Moolenaarvar elemdisplay = {}, 8274*31337658SMarcel Moolenaar iframe, iframeDoc, 8275*31337658SMarcel Moolenaar rfxtypes = /^(?:toggle|show|hide)$/, 8276*31337658SMarcel Moolenaar rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i, 8277*31337658SMarcel Moolenaar timerId, 8278*31337658SMarcel Moolenaar fxAttrs = [ 8279*31337658SMarcel Moolenaar // height animations 8280*31337658SMarcel Moolenaar [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ], 8281*31337658SMarcel Moolenaar // width animations 8282*31337658SMarcel Moolenaar [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ], 8283*31337658SMarcel Moolenaar // opacity animations 8284*31337658SMarcel Moolenaar [ "opacity" ] 8285*31337658SMarcel Moolenaar ], 8286*31337658SMarcel Moolenaar fxNow; 8287*31337658SMarcel Moolenaar 8288*31337658SMarcel MoolenaarjQuery.fn.extend({ 8289*31337658SMarcel Moolenaar show: function( speed, easing, callback ) { 8290*31337658SMarcel Moolenaar var elem, display; 8291*31337658SMarcel Moolenaar 8292*31337658SMarcel Moolenaar if ( speed || speed === 0 ) { 8293*31337658SMarcel Moolenaar return this.animate( genFx("show", 3), speed, easing, callback ); 8294*31337658SMarcel Moolenaar 8295*31337658SMarcel Moolenaar } else { 8296*31337658SMarcel Moolenaar for ( var i = 0, j = this.length; i < j; i++ ) { 8297*31337658SMarcel Moolenaar elem = this[ i ]; 8298*31337658SMarcel Moolenaar 8299*31337658SMarcel Moolenaar if ( elem.style ) { 8300*31337658SMarcel Moolenaar display = elem.style.display; 8301*31337658SMarcel Moolenaar 8302*31337658SMarcel Moolenaar // Reset the inline display of this element to learn if it is 8303*31337658SMarcel Moolenaar // being hidden by cascaded rules or not 8304*31337658SMarcel Moolenaar if ( !jQuery._data(elem, "olddisplay") && display === "none" ) { 8305*31337658SMarcel Moolenaar display = elem.style.display = ""; 8306*31337658SMarcel Moolenaar } 8307*31337658SMarcel Moolenaar 8308*31337658SMarcel Moolenaar // Set elements which have been overridden with display: none 8309*31337658SMarcel Moolenaar // in a stylesheet to whatever the default browser style is 8310*31337658SMarcel Moolenaar // for such an element 8311*31337658SMarcel Moolenaar if ( display === "" && jQuery.css(elem, "display") === "none" ) { 8312*31337658SMarcel Moolenaar jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) ); 8313*31337658SMarcel Moolenaar } 8314*31337658SMarcel Moolenaar } 8315*31337658SMarcel Moolenaar } 8316*31337658SMarcel Moolenaar 8317*31337658SMarcel Moolenaar // Set the display of most of the elements in a second loop 8318*31337658SMarcel Moolenaar // to avoid the constant reflow 8319*31337658SMarcel Moolenaar for ( i = 0; i < j; i++ ) { 8320*31337658SMarcel Moolenaar elem = this[ i ]; 8321*31337658SMarcel Moolenaar 8322*31337658SMarcel Moolenaar if ( elem.style ) { 8323*31337658SMarcel Moolenaar display = elem.style.display; 8324*31337658SMarcel Moolenaar 8325*31337658SMarcel Moolenaar if ( display === "" || display === "none" ) { 8326*31337658SMarcel Moolenaar elem.style.display = jQuery._data( elem, "olddisplay" ) || ""; 8327*31337658SMarcel Moolenaar } 8328*31337658SMarcel Moolenaar } 8329*31337658SMarcel Moolenaar } 8330*31337658SMarcel Moolenaar 8331*31337658SMarcel Moolenaar return this; 8332*31337658SMarcel Moolenaar } 8333*31337658SMarcel Moolenaar }, 8334*31337658SMarcel Moolenaar 8335*31337658SMarcel Moolenaar hide: function( speed, easing, callback ) { 8336*31337658SMarcel Moolenaar if ( speed || speed === 0 ) { 8337*31337658SMarcel Moolenaar return this.animate( genFx("hide", 3), speed, easing, callback); 8338*31337658SMarcel Moolenaar 8339*31337658SMarcel Moolenaar } else { 8340*31337658SMarcel Moolenaar var elem, display, 8341*31337658SMarcel Moolenaar i = 0, 8342*31337658SMarcel Moolenaar j = this.length; 8343*31337658SMarcel Moolenaar 8344*31337658SMarcel Moolenaar for ( ; i < j; i++ ) { 8345*31337658SMarcel Moolenaar elem = this[i]; 8346*31337658SMarcel Moolenaar if ( elem.style ) { 8347*31337658SMarcel Moolenaar display = jQuery.css( elem, "display" ); 8348*31337658SMarcel Moolenaar 8349*31337658SMarcel Moolenaar if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) { 8350*31337658SMarcel Moolenaar jQuery._data( elem, "olddisplay", display ); 8351*31337658SMarcel Moolenaar } 8352*31337658SMarcel Moolenaar } 8353*31337658SMarcel Moolenaar } 8354*31337658SMarcel Moolenaar 8355*31337658SMarcel Moolenaar // Set the display of the elements in a second loop 8356*31337658SMarcel Moolenaar // to avoid the constant reflow 8357*31337658SMarcel Moolenaar for ( i = 0; i < j; i++ ) { 8358*31337658SMarcel Moolenaar if ( this[i].style ) { 8359*31337658SMarcel Moolenaar this[i].style.display = "none"; 8360*31337658SMarcel Moolenaar } 8361*31337658SMarcel Moolenaar } 8362*31337658SMarcel Moolenaar 8363*31337658SMarcel Moolenaar return this; 8364*31337658SMarcel Moolenaar } 8365*31337658SMarcel Moolenaar }, 8366*31337658SMarcel Moolenaar 8367*31337658SMarcel Moolenaar // Save the old toggle function 8368*31337658SMarcel Moolenaar _toggle: jQuery.fn.toggle, 8369*31337658SMarcel Moolenaar 8370*31337658SMarcel Moolenaar toggle: function( fn, fn2, callback ) { 8371*31337658SMarcel Moolenaar var bool = typeof fn === "boolean"; 8372*31337658SMarcel Moolenaar 8373*31337658SMarcel Moolenaar if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) { 8374*31337658SMarcel Moolenaar this._toggle.apply( this, arguments ); 8375*31337658SMarcel Moolenaar 8376*31337658SMarcel Moolenaar } else if ( fn == null || bool ) { 8377*31337658SMarcel Moolenaar this.each(function() { 8378*31337658SMarcel Moolenaar var state = bool ? fn : jQuery(this).is(":hidden"); 8379*31337658SMarcel Moolenaar jQuery(this)[ state ? "show" : "hide" ](); 8380*31337658SMarcel Moolenaar }); 8381*31337658SMarcel Moolenaar 8382*31337658SMarcel Moolenaar } else { 8383*31337658SMarcel Moolenaar this.animate(genFx("toggle", 3), fn, fn2, callback); 8384*31337658SMarcel Moolenaar } 8385*31337658SMarcel Moolenaar 8386*31337658SMarcel Moolenaar return this; 8387*31337658SMarcel Moolenaar }, 8388*31337658SMarcel Moolenaar 8389*31337658SMarcel Moolenaar fadeTo: function( speed, to, easing, callback ) { 8390*31337658SMarcel Moolenaar return this.filter(":hidden").css("opacity", 0).show().end() 8391*31337658SMarcel Moolenaar .animate({opacity: to}, speed, easing, callback); 8392*31337658SMarcel Moolenaar }, 8393*31337658SMarcel Moolenaar 8394*31337658SMarcel Moolenaar animate: function( prop, speed, easing, callback ) { 8395*31337658SMarcel Moolenaar var optall = jQuery.speed( speed, easing, callback ); 8396*31337658SMarcel Moolenaar 8397*31337658SMarcel Moolenaar if ( jQuery.isEmptyObject( prop ) ) { 8398*31337658SMarcel Moolenaar return this.each( optall.complete, [ false ] ); 8399*31337658SMarcel Moolenaar } 8400*31337658SMarcel Moolenaar 8401*31337658SMarcel Moolenaar // Do not change referenced properties as per-property easing will be lost 8402*31337658SMarcel Moolenaar prop = jQuery.extend( {}, prop ); 8403*31337658SMarcel Moolenaar 8404*31337658SMarcel Moolenaar function doAnimation() { 8405*31337658SMarcel Moolenaar // XXX 'this' does not always have a nodeName when running the 8406*31337658SMarcel Moolenaar // test suite 8407*31337658SMarcel Moolenaar 8408*31337658SMarcel Moolenaar if ( optall.queue === false ) { 8409*31337658SMarcel Moolenaar jQuery._mark( this ); 8410*31337658SMarcel Moolenaar } 8411*31337658SMarcel Moolenaar 8412*31337658SMarcel Moolenaar var opt = jQuery.extend( {}, optall ), 8413*31337658SMarcel Moolenaar isElement = this.nodeType === 1, 8414*31337658SMarcel Moolenaar hidden = isElement && jQuery(this).is(":hidden"), 8415*31337658SMarcel Moolenaar name, val, p, e, 8416*31337658SMarcel Moolenaar parts, start, end, unit, 8417*31337658SMarcel Moolenaar method; 8418*31337658SMarcel Moolenaar 8419*31337658SMarcel Moolenaar // will store per property easing and be used to determine when an animation is complete 8420*31337658SMarcel Moolenaar opt.animatedProperties = {}; 8421*31337658SMarcel Moolenaar 8422*31337658SMarcel Moolenaar for ( p in prop ) { 8423*31337658SMarcel Moolenaar 8424*31337658SMarcel Moolenaar // property name normalization 8425*31337658SMarcel Moolenaar name = jQuery.camelCase( p ); 8426*31337658SMarcel Moolenaar if ( p !== name ) { 8427*31337658SMarcel Moolenaar prop[ name ] = prop[ p ]; 8428*31337658SMarcel Moolenaar delete prop[ p ]; 8429*31337658SMarcel Moolenaar } 8430*31337658SMarcel Moolenaar 8431*31337658SMarcel Moolenaar val = prop[ name ]; 8432*31337658SMarcel Moolenaar 8433*31337658SMarcel Moolenaar // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default) 8434*31337658SMarcel Moolenaar if ( jQuery.isArray( val ) ) { 8435*31337658SMarcel Moolenaar opt.animatedProperties[ name ] = val[ 1 ]; 8436*31337658SMarcel Moolenaar val = prop[ name ] = val[ 0 ]; 8437*31337658SMarcel Moolenaar } else { 8438*31337658SMarcel Moolenaar opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing'; 8439*31337658SMarcel Moolenaar } 8440*31337658SMarcel Moolenaar 8441*31337658SMarcel Moolenaar if ( val === "hide" && hidden || val === "show" && !hidden ) { 8442*31337658SMarcel Moolenaar return opt.complete.call( this ); 8443*31337658SMarcel Moolenaar } 8444*31337658SMarcel Moolenaar 8445*31337658SMarcel Moolenaar if ( isElement && ( name === "height" || name === "width" ) ) { 8446*31337658SMarcel Moolenaar // Make sure that nothing sneaks out 8447*31337658SMarcel Moolenaar // Record all 3 overflow attributes because IE does not 8448*31337658SMarcel Moolenaar // change the overflow attribute when overflowX and 8449*31337658SMarcel Moolenaar // overflowY are set to the same value 8450*31337658SMarcel Moolenaar opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ]; 8451*31337658SMarcel Moolenaar 8452*31337658SMarcel Moolenaar // Set display property to inline-block for height/width 8453*31337658SMarcel Moolenaar // animations on inline elements that are having width/height animated 8454*31337658SMarcel Moolenaar if ( jQuery.css( this, "display" ) === "inline" && 8455*31337658SMarcel Moolenaar jQuery.css( this, "float" ) === "none" ) { 8456*31337658SMarcel Moolenaar 8457*31337658SMarcel Moolenaar // inline-level elements accept inline-block; 8458*31337658SMarcel Moolenaar // block-level elements need to be inline with layout 8459*31337658SMarcel Moolenaar if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) { 8460*31337658SMarcel Moolenaar this.style.display = "inline-block"; 8461*31337658SMarcel Moolenaar 8462*31337658SMarcel Moolenaar } else { 8463*31337658SMarcel Moolenaar this.style.zoom = 1; 8464*31337658SMarcel Moolenaar } 8465*31337658SMarcel Moolenaar } 8466*31337658SMarcel Moolenaar } 8467*31337658SMarcel Moolenaar } 8468*31337658SMarcel Moolenaar 8469*31337658SMarcel Moolenaar if ( opt.overflow != null ) { 8470*31337658SMarcel Moolenaar this.style.overflow = "hidden"; 8471*31337658SMarcel Moolenaar } 8472*31337658SMarcel Moolenaar 8473*31337658SMarcel Moolenaar for ( p in prop ) { 8474*31337658SMarcel Moolenaar e = new jQuery.fx( this, opt, p ); 8475*31337658SMarcel Moolenaar val = prop[ p ]; 8476*31337658SMarcel Moolenaar 8477*31337658SMarcel Moolenaar if ( rfxtypes.test( val ) ) { 8478*31337658SMarcel Moolenaar 8479*31337658SMarcel Moolenaar // Tracks whether to show or hide based on private 8480*31337658SMarcel Moolenaar // data attached to the element 8481*31337658SMarcel Moolenaar method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 ); 8482*31337658SMarcel Moolenaar if ( method ) { 8483*31337658SMarcel Moolenaar jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" ); 8484*31337658SMarcel Moolenaar e[ method ](); 8485*31337658SMarcel Moolenaar } else { 8486*31337658SMarcel Moolenaar e[ val ](); 8487*31337658SMarcel Moolenaar } 8488*31337658SMarcel Moolenaar 8489*31337658SMarcel Moolenaar } else { 8490*31337658SMarcel Moolenaar parts = rfxnum.exec( val ); 8491*31337658SMarcel Moolenaar start = e.cur(); 8492*31337658SMarcel Moolenaar 8493*31337658SMarcel Moolenaar if ( parts ) { 8494*31337658SMarcel Moolenaar end = parseFloat( parts[2] ); 8495*31337658SMarcel Moolenaar unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" ); 8496*31337658SMarcel Moolenaar 8497*31337658SMarcel Moolenaar // We need to compute starting value 8498*31337658SMarcel Moolenaar if ( unit !== "px" ) { 8499*31337658SMarcel Moolenaar jQuery.style( this, p, (end || 1) + unit); 8500*31337658SMarcel Moolenaar start = ( (end || 1) / e.cur() ) * start; 8501*31337658SMarcel Moolenaar jQuery.style( this, p, start + unit); 8502*31337658SMarcel Moolenaar } 8503*31337658SMarcel Moolenaar 8504*31337658SMarcel Moolenaar // If a +=/-= token was provided, we're doing a relative animation 8505*31337658SMarcel Moolenaar if ( parts[1] ) { 8506*31337658SMarcel Moolenaar end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start; 8507*31337658SMarcel Moolenaar } 8508*31337658SMarcel Moolenaar 8509*31337658SMarcel Moolenaar e.custom( start, end, unit ); 8510*31337658SMarcel Moolenaar 8511*31337658SMarcel Moolenaar } else { 8512*31337658SMarcel Moolenaar e.custom( start, val, "" ); 8513*31337658SMarcel Moolenaar } 8514*31337658SMarcel Moolenaar } 8515*31337658SMarcel Moolenaar } 8516*31337658SMarcel Moolenaar 8517*31337658SMarcel Moolenaar // For JS strict compliance 8518*31337658SMarcel Moolenaar return true; 8519*31337658SMarcel Moolenaar } 8520*31337658SMarcel Moolenaar 8521*31337658SMarcel Moolenaar return optall.queue === false ? 8522*31337658SMarcel Moolenaar this.each( doAnimation ) : 8523*31337658SMarcel Moolenaar this.queue( optall.queue, doAnimation ); 8524*31337658SMarcel Moolenaar }, 8525*31337658SMarcel Moolenaar 8526*31337658SMarcel Moolenaar stop: function( type, clearQueue, gotoEnd ) { 8527*31337658SMarcel Moolenaar if ( typeof type !== "string" ) { 8528*31337658SMarcel Moolenaar gotoEnd = clearQueue; 8529*31337658SMarcel Moolenaar clearQueue = type; 8530*31337658SMarcel Moolenaar type = undefined; 8531*31337658SMarcel Moolenaar } 8532*31337658SMarcel Moolenaar if ( clearQueue && type !== false ) { 8533*31337658SMarcel Moolenaar this.queue( type || "fx", [] ); 8534*31337658SMarcel Moolenaar } 8535*31337658SMarcel Moolenaar 8536*31337658SMarcel Moolenaar return this.each(function() { 8537*31337658SMarcel Moolenaar var i, 8538*31337658SMarcel Moolenaar hadTimers = false, 8539*31337658SMarcel Moolenaar timers = jQuery.timers, 8540*31337658SMarcel Moolenaar data = jQuery._data( this ); 8541*31337658SMarcel Moolenaar 8542*31337658SMarcel Moolenaar // clear marker counters if we know they won't be 8543*31337658SMarcel Moolenaar if ( !gotoEnd ) { 8544*31337658SMarcel Moolenaar jQuery._unmark( true, this ); 8545*31337658SMarcel Moolenaar } 8546*31337658SMarcel Moolenaar 8547*31337658SMarcel Moolenaar function stopQueue( elem, data, i ) { 8548*31337658SMarcel Moolenaar var hooks = data[ i ]; 8549*31337658SMarcel Moolenaar jQuery.removeData( elem, i, true ); 8550*31337658SMarcel Moolenaar hooks.stop( gotoEnd ); 8551*31337658SMarcel Moolenaar } 8552*31337658SMarcel Moolenaar 8553*31337658SMarcel Moolenaar if ( type == null ) { 8554*31337658SMarcel Moolenaar for ( i in data ) { 8555*31337658SMarcel Moolenaar if ( data[ i ].stop && i.indexOf(".run") === i.length - 4 ) { 8556*31337658SMarcel Moolenaar stopQueue( this, data, i ); 8557*31337658SMarcel Moolenaar } 8558*31337658SMarcel Moolenaar } 8559*31337658SMarcel Moolenaar } else if ( data[ i = type + ".run" ] && data[ i ].stop ){ 8560*31337658SMarcel Moolenaar stopQueue( this, data, i ); 8561*31337658SMarcel Moolenaar } 8562*31337658SMarcel Moolenaar 8563*31337658SMarcel Moolenaar for ( i = timers.length; i--; ) { 8564*31337658SMarcel Moolenaar if ( timers[ i ].elem === this && (type == null || timers[ i ].queue === type) ) { 8565*31337658SMarcel Moolenaar if ( gotoEnd ) { 8566*31337658SMarcel Moolenaar 8567*31337658SMarcel Moolenaar // force the next step to be the last 8568*31337658SMarcel Moolenaar timers[ i ]( true ); 8569*31337658SMarcel Moolenaar } else { 8570*31337658SMarcel Moolenaar timers[ i ].saveState(); 8571*31337658SMarcel Moolenaar } 8572*31337658SMarcel Moolenaar hadTimers = true; 8573*31337658SMarcel Moolenaar timers.splice( i, 1 ); 8574*31337658SMarcel Moolenaar } 8575*31337658SMarcel Moolenaar } 8576*31337658SMarcel Moolenaar 8577*31337658SMarcel Moolenaar // start the next in the queue if the last step wasn't forced 8578*31337658SMarcel Moolenaar // timers currently will call their complete callbacks, which will dequeue 8579*31337658SMarcel Moolenaar // but only if they were gotoEnd 8580*31337658SMarcel Moolenaar if ( !( gotoEnd && hadTimers ) ) { 8581*31337658SMarcel Moolenaar jQuery.dequeue( this, type ); 8582*31337658SMarcel Moolenaar } 8583*31337658SMarcel Moolenaar }); 8584*31337658SMarcel Moolenaar } 8585*31337658SMarcel Moolenaar 8586*31337658SMarcel Moolenaar}); 8587*31337658SMarcel Moolenaar 8588*31337658SMarcel Moolenaar// Animations created synchronously will run synchronously 8589*31337658SMarcel Moolenaarfunction createFxNow() { 8590*31337658SMarcel Moolenaar setTimeout( clearFxNow, 0 ); 8591*31337658SMarcel Moolenaar return ( fxNow = jQuery.now() ); 8592*31337658SMarcel Moolenaar} 8593*31337658SMarcel Moolenaar 8594*31337658SMarcel Moolenaarfunction clearFxNow() { 8595*31337658SMarcel Moolenaar fxNow = undefined; 8596*31337658SMarcel Moolenaar} 8597*31337658SMarcel Moolenaar 8598*31337658SMarcel Moolenaar// Generate parameters to create a standard animation 8599*31337658SMarcel Moolenaarfunction genFx( type, num ) { 8600*31337658SMarcel Moolenaar var obj = {}; 8601*31337658SMarcel Moolenaar 8602*31337658SMarcel Moolenaar jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() { 8603*31337658SMarcel Moolenaar obj[ this ] = type; 8604*31337658SMarcel Moolenaar }); 8605*31337658SMarcel Moolenaar 8606*31337658SMarcel Moolenaar return obj; 8607*31337658SMarcel Moolenaar} 8608*31337658SMarcel Moolenaar 8609*31337658SMarcel Moolenaar// Generate shortcuts for custom animations 8610*31337658SMarcel MoolenaarjQuery.each({ 8611*31337658SMarcel Moolenaar slideDown: genFx( "show", 1 ), 8612*31337658SMarcel Moolenaar slideUp: genFx( "hide", 1 ), 8613*31337658SMarcel Moolenaar slideToggle: genFx( "toggle", 1 ), 8614*31337658SMarcel Moolenaar fadeIn: { opacity: "show" }, 8615*31337658SMarcel Moolenaar fadeOut: { opacity: "hide" }, 8616*31337658SMarcel Moolenaar fadeToggle: { opacity: "toggle" } 8617*31337658SMarcel Moolenaar}, function( name, props ) { 8618*31337658SMarcel Moolenaar jQuery.fn[ name ] = function( speed, easing, callback ) { 8619*31337658SMarcel Moolenaar return this.animate( props, speed, easing, callback ); 8620*31337658SMarcel Moolenaar }; 8621*31337658SMarcel Moolenaar}); 8622*31337658SMarcel Moolenaar 8623*31337658SMarcel MoolenaarjQuery.extend({ 8624*31337658SMarcel Moolenaar speed: function( speed, easing, fn ) { 8625*31337658SMarcel Moolenaar var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { 8626*31337658SMarcel Moolenaar complete: fn || !fn && easing || 8627*31337658SMarcel Moolenaar jQuery.isFunction( speed ) && speed, 8628*31337658SMarcel Moolenaar duration: speed, 8629*31337658SMarcel Moolenaar easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing 8630*31337658SMarcel Moolenaar }; 8631*31337658SMarcel Moolenaar 8632*31337658SMarcel Moolenaar opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : 8633*31337658SMarcel Moolenaar opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default; 8634*31337658SMarcel Moolenaar 8635*31337658SMarcel Moolenaar // normalize opt.queue - true/undefined/null -> "fx" 8636*31337658SMarcel Moolenaar if ( opt.queue == null || opt.queue === true ) { 8637*31337658SMarcel Moolenaar opt.queue = "fx"; 8638*31337658SMarcel Moolenaar } 8639*31337658SMarcel Moolenaar 8640*31337658SMarcel Moolenaar // Queueing 8641*31337658SMarcel Moolenaar opt.old = opt.complete; 8642*31337658SMarcel Moolenaar 8643*31337658SMarcel Moolenaar opt.complete = function( noUnmark ) { 8644*31337658SMarcel Moolenaar if ( jQuery.isFunction( opt.old ) ) { 8645*31337658SMarcel Moolenaar opt.old.call( this ); 8646*31337658SMarcel Moolenaar } 8647*31337658SMarcel Moolenaar 8648*31337658SMarcel Moolenaar if ( opt.queue ) { 8649*31337658SMarcel Moolenaar jQuery.dequeue( this, opt.queue ); 8650*31337658SMarcel Moolenaar } else if ( noUnmark !== false ) { 8651*31337658SMarcel Moolenaar jQuery._unmark( this ); 8652*31337658SMarcel Moolenaar } 8653*31337658SMarcel Moolenaar }; 8654*31337658SMarcel Moolenaar 8655*31337658SMarcel Moolenaar return opt; 8656*31337658SMarcel Moolenaar }, 8657*31337658SMarcel Moolenaar 8658*31337658SMarcel Moolenaar easing: { 8659*31337658SMarcel Moolenaar linear: function( p, n, firstNum, diff ) { 8660*31337658SMarcel Moolenaar return firstNum + diff * p; 8661*31337658SMarcel Moolenaar }, 8662*31337658SMarcel Moolenaar swing: function( p, n, firstNum, diff ) { 8663*31337658SMarcel Moolenaar return ( ( -Math.cos( p*Math.PI ) / 2 ) + 0.5 ) * diff + firstNum; 8664*31337658SMarcel Moolenaar } 8665*31337658SMarcel Moolenaar }, 8666*31337658SMarcel Moolenaar 8667*31337658SMarcel Moolenaar timers: [], 8668*31337658SMarcel Moolenaar 8669*31337658SMarcel Moolenaar fx: function( elem, options, prop ) { 8670*31337658SMarcel Moolenaar this.options = options; 8671*31337658SMarcel Moolenaar this.elem = elem; 8672*31337658SMarcel Moolenaar this.prop = prop; 8673*31337658SMarcel Moolenaar 8674*31337658SMarcel Moolenaar options.orig = options.orig || {}; 8675*31337658SMarcel Moolenaar } 8676*31337658SMarcel Moolenaar 8677*31337658SMarcel Moolenaar}); 8678*31337658SMarcel Moolenaar 8679*31337658SMarcel MoolenaarjQuery.fx.prototype = { 8680*31337658SMarcel Moolenaar // Simple function for setting a style value 8681*31337658SMarcel Moolenaar update: function() { 8682*31337658SMarcel Moolenaar if ( this.options.step ) { 8683*31337658SMarcel Moolenaar this.options.step.call( this.elem, this.now, this ); 8684*31337658SMarcel Moolenaar } 8685*31337658SMarcel Moolenaar 8686*31337658SMarcel Moolenaar ( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this ); 8687*31337658SMarcel Moolenaar }, 8688*31337658SMarcel Moolenaar 8689*31337658SMarcel Moolenaar // Get the current size 8690*31337658SMarcel Moolenaar cur: function() { 8691*31337658SMarcel Moolenaar if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) { 8692*31337658SMarcel Moolenaar return this.elem[ this.prop ]; 8693*31337658SMarcel Moolenaar } 8694*31337658SMarcel Moolenaar 8695*31337658SMarcel Moolenaar var parsed, 8696*31337658SMarcel Moolenaar r = jQuery.css( this.elem, this.prop ); 8697*31337658SMarcel Moolenaar // Empty strings, null, undefined and "auto" are converted to 0, 8698*31337658SMarcel Moolenaar // complex values such as "rotate(1rad)" are returned as is, 8699*31337658SMarcel Moolenaar // simple values such as "10px" are parsed to Float. 8700*31337658SMarcel Moolenaar return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed; 8701*31337658SMarcel Moolenaar }, 8702*31337658SMarcel Moolenaar 8703*31337658SMarcel Moolenaar // Start an animation from one number to another 8704*31337658SMarcel Moolenaar custom: function( from, to, unit ) { 8705*31337658SMarcel Moolenaar var self = this, 8706*31337658SMarcel Moolenaar fx = jQuery.fx; 8707*31337658SMarcel Moolenaar 8708*31337658SMarcel Moolenaar this.startTime = fxNow || createFxNow(); 8709*31337658SMarcel Moolenaar this.end = to; 8710*31337658SMarcel Moolenaar this.now = this.start = from; 8711*31337658SMarcel Moolenaar this.pos = this.state = 0; 8712*31337658SMarcel Moolenaar this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" ); 8713*31337658SMarcel Moolenaar 8714*31337658SMarcel Moolenaar function t( gotoEnd ) { 8715*31337658SMarcel Moolenaar return self.step( gotoEnd ); 8716*31337658SMarcel Moolenaar } 8717*31337658SMarcel Moolenaar 8718*31337658SMarcel Moolenaar t.queue = this.options.queue; 8719*31337658SMarcel Moolenaar t.elem = this.elem; 8720*31337658SMarcel Moolenaar t.saveState = function() { 8721*31337658SMarcel Moolenaar if ( self.options.hide && jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) { 8722*31337658SMarcel Moolenaar jQuery._data( self.elem, "fxshow" + self.prop, self.start ); 8723*31337658SMarcel Moolenaar } 8724*31337658SMarcel Moolenaar }; 8725*31337658SMarcel Moolenaar 8726*31337658SMarcel Moolenaar if ( t() && jQuery.timers.push(t) && !timerId ) { 8727*31337658SMarcel Moolenaar timerId = setInterval( fx.tick, fx.interval ); 8728*31337658SMarcel Moolenaar } 8729*31337658SMarcel Moolenaar }, 8730*31337658SMarcel Moolenaar 8731*31337658SMarcel Moolenaar // Simple 'show' function 8732*31337658SMarcel Moolenaar show: function() { 8733*31337658SMarcel Moolenaar var dataShow = jQuery._data( this.elem, "fxshow" + this.prop ); 8734*31337658SMarcel Moolenaar 8735*31337658SMarcel Moolenaar // Remember where we started, so that we can go back to it later 8736*31337658SMarcel Moolenaar this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop ); 8737*31337658SMarcel Moolenaar this.options.show = true; 8738*31337658SMarcel Moolenaar 8739*31337658SMarcel Moolenaar // Begin the animation 8740*31337658SMarcel Moolenaar // Make sure that we start at a small width/height to avoid any flash of content 8741*31337658SMarcel Moolenaar if ( dataShow !== undefined ) { 8742*31337658SMarcel Moolenaar // This show is picking up where a previous hide or show left off 8743*31337658SMarcel Moolenaar this.custom( this.cur(), dataShow ); 8744*31337658SMarcel Moolenaar } else { 8745*31337658SMarcel Moolenaar this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() ); 8746*31337658SMarcel Moolenaar } 8747*31337658SMarcel Moolenaar 8748*31337658SMarcel Moolenaar // Start by showing the element 8749*31337658SMarcel Moolenaar jQuery( this.elem ).show(); 8750*31337658SMarcel Moolenaar }, 8751*31337658SMarcel Moolenaar 8752*31337658SMarcel Moolenaar // Simple 'hide' function 8753*31337658SMarcel Moolenaar hide: function() { 8754*31337658SMarcel Moolenaar // Remember where we started, so that we can go back to it later 8755*31337658SMarcel Moolenaar this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop ); 8756*31337658SMarcel Moolenaar this.options.hide = true; 8757*31337658SMarcel Moolenaar 8758*31337658SMarcel Moolenaar // Begin the animation 8759*31337658SMarcel Moolenaar this.custom( this.cur(), 0 ); 8760*31337658SMarcel Moolenaar }, 8761*31337658SMarcel Moolenaar 8762*31337658SMarcel Moolenaar // Each step of an animation 8763*31337658SMarcel Moolenaar step: function( gotoEnd ) { 8764*31337658SMarcel Moolenaar var p, n, complete, 8765*31337658SMarcel Moolenaar t = fxNow || createFxNow(), 8766*31337658SMarcel Moolenaar done = true, 8767*31337658SMarcel Moolenaar elem = this.elem, 8768*31337658SMarcel Moolenaar options = this.options; 8769*31337658SMarcel Moolenaar 8770*31337658SMarcel Moolenaar if ( gotoEnd || t >= options.duration + this.startTime ) { 8771*31337658SMarcel Moolenaar this.now = this.end; 8772*31337658SMarcel Moolenaar this.pos = this.state = 1; 8773*31337658SMarcel Moolenaar this.update(); 8774*31337658SMarcel Moolenaar 8775*31337658SMarcel Moolenaar options.animatedProperties[ this.prop ] = true; 8776*31337658SMarcel Moolenaar 8777*31337658SMarcel Moolenaar for ( p in options.animatedProperties ) { 8778*31337658SMarcel Moolenaar if ( options.animatedProperties[ p ] !== true ) { 8779*31337658SMarcel Moolenaar done = false; 8780*31337658SMarcel Moolenaar } 8781*31337658SMarcel Moolenaar } 8782*31337658SMarcel Moolenaar 8783*31337658SMarcel Moolenaar if ( done ) { 8784*31337658SMarcel Moolenaar // Reset the overflow 8785*31337658SMarcel Moolenaar if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) { 8786*31337658SMarcel Moolenaar 8787*31337658SMarcel Moolenaar jQuery.each( [ "", "X", "Y" ], function( index, value ) { 8788*31337658SMarcel Moolenaar elem.style[ "overflow" + value ] = options.overflow[ index ]; 8789*31337658SMarcel Moolenaar }); 8790*31337658SMarcel Moolenaar } 8791*31337658SMarcel Moolenaar 8792*31337658SMarcel Moolenaar // Hide the element if the "hide" operation was done 8793*31337658SMarcel Moolenaar if ( options.hide ) { 8794*31337658SMarcel Moolenaar jQuery( elem ).hide(); 8795*31337658SMarcel Moolenaar } 8796*31337658SMarcel Moolenaar 8797*31337658SMarcel Moolenaar // Reset the properties, if the item has been hidden or shown 8798*31337658SMarcel Moolenaar if ( options.hide || options.show ) { 8799*31337658SMarcel Moolenaar for ( p in options.animatedProperties ) { 8800*31337658SMarcel Moolenaar jQuery.style( elem, p, options.orig[ p ] ); 8801*31337658SMarcel Moolenaar jQuery.removeData( elem, "fxshow" + p, true ); 8802*31337658SMarcel Moolenaar // Toggle data is no longer needed 8803*31337658SMarcel Moolenaar jQuery.removeData( elem, "toggle" + p, true ); 8804*31337658SMarcel Moolenaar } 8805*31337658SMarcel Moolenaar } 8806*31337658SMarcel Moolenaar 8807*31337658SMarcel Moolenaar // Execute the complete function 8808*31337658SMarcel Moolenaar // in the event that the complete function throws an exception 8809*31337658SMarcel Moolenaar // we must ensure it won't be called twice. #5684 8810*31337658SMarcel Moolenaar 8811*31337658SMarcel Moolenaar complete = options.complete; 8812*31337658SMarcel Moolenaar if ( complete ) { 8813*31337658SMarcel Moolenaar 8814*31337658SMarcel Moolenaar options.complete = false; 8815*31337658SMarcel Moolenaar complete.call( elem ); 8816*31337658SMarcel Moolenaar } 8817*31337658SMarcel Moolenaar } 8818*31337658SMarcel Moolenaar 8819*31337658SMarcel Moolenaar return false; 8820*31337658SMarcel Moolenaar 8821*31337658SMarcel Moolenaar } else { 8822*31337658SMarcel Moolenaar // classical easing cannot be used with an Infinity duration 8823*31337658SMarcel Moolenaar if ( options.duration == Infinity ) { 8824*31337658SMarcel Moolenaar this.now = t; 8825*31337658SMarcel Moolenaar } else { 8826*31337658SMarcel Moolenaar n = t - this.startTime; 8827*31337658SMarcel Moolenaar this.state = n / options.duration; 8828*31337658SMarcel Moolenaar 8829*31337658SMarcel Moolenaar // Perform the easing function, defaults to swing 8830*31337658SMarcel Moolenaar this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration ); 8831*31337658SMarcel Moolenaar this.now = this.start + ( (this.end - this.start) * this.pos ); 8832*31337658SMarcel Moolenaar } 8833*31337658SMarcel Moolenaar // Perform the next step of the animation 8834*31337658SMarcel Moolenaar this.update(); 8835*31337658SMarcel Moolenaar } 8836*31337658SMarcel Moolenaar 8837*31337658SMarcel Moolenaar return true; 8838*31337658SMarcel Moolenaar } 8839*31337658SMarcel Moolenaar}; 8840*31337658SMarcel Moolenaar 8841*31337658SMarcel MoolenaarjQuery.extend( jQuery.fx, { 8842*31337658SMarcel Moolenaar tick: function() { 8843*31337658SMarcel Moolenaar var timer, 8844*31337658SMarcel Moolenaar timers = jQuery.timers, 8845*31337658SMarcel Moolenaar i = 0; 8846*31337658SMarcel Moolenaar 8847*31337658SMarcel Moolenaar for ( ; i < timers.length; i++ ) { 8848*31337658SMarcel Moolenaar timer = timers[ i ]; 8849*31337658SMarcel Moolenaar // Checks the timer has not already been removed 8850*31337658SMarcel Moolenaar if ( !timer() && timers[ i ] === timer ) { 8851*31337658SMarcel Moolenaar timers.splice( i--, 1 ); 8852*31337658SMarcel Moolenaar } 8853*31337658SMarcel Moolenaar } 8854*31337658SMarcel Moolenaar 8855*31337658SMarcel Moolenaar if ( !timers.length ) { 8856*31337658SMarcel Moolenaar jQuery.fx.stop(); 8857*31337658SMarcel Moolenaar } 8858*31337658SMarcel Moolenaar }, 8859*31337658SMarcel Moolenaar 8860*31337658SMarcel Moolenaar interval: 13, 8861*31337658SMarcel Moolenaar 8862*31337658SMarcel Moolenaar stop: function() { 8863*31337658SMarcel Moolenaar clearInterval( timerId ); 8864*31337658SMarcel Moolenaar timerId = null; 8865*31337658SMarcel Moolenaar }, 8866*31337658SMarcel Moolenaar 8867*31337658SMarcel Moolenaar speeds: { 8868*31337658SMarcel Moolenaar slow: 600, 8869*31337658SMarcel Moolenaar fast: 200, 8870*31337658SMarcel Moolenaar // Default speed 8871*31337658SMarcel Moolenaar _default: 400 8872*31337658SMarcel Moolenaar }, 8873*31337658SMarcel Moolenaar 8874*31337658SMarcel Moolenaar step: { 8875*31337658SMarcel Moolenaar opacity: function( fx ) { 8876*31337658SMarcel Moolenaar jQuery.style( fx.elem, "opacity", fx.now ); 8877*31337658SMarcel Moolenaar }, 8878*31337658SMarcel Moolenaar 8879*31337658SMarcel Moolenaar _default: function( fx ) { 8880*31337658SMarcel Moolenaar if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) { 8881*31337658SMarcel Moolenaar fx.elem.style[ fx.prop ] = fx.now + fx.unit; 8882*31337658SMarcel Moolenaar } else { 8883*31337658SMarcel Moolenaar fx.elem[ fx.prop ] = fx.now; 8884*31337658SMarcel Moolenaar } 8885*31337658SMarcel Moolenaar } 8886*31337658SMarcel Moolenaar } 8887*31337658SMarcel Moolenaar}); 8888*31337658SMarcel Moolenaar 8889*31337658SMarcel Moolenaar// Adds width/height step functions 8890*31337658SMarcel Moolenaar// Do not set anything below 0 8891*31337658SMarcel MoolenaarjQuery.each([ "width", "height" ], function( i, prop ) { 8892*31337658SMarcel Moolenaar jQuery.fx.step[ prop ] = function( fx ) { 8893*31337658SMarcel Moolenaar jQuery.style( fx.elem, prop, Math.max(0, fx.now) ); 8894*31337658SMarcel Moolenaar }; 8895*31337658SMarcel Moolenaar}); 8896*31337658SMarcel Moolenaar 8897*31337658SMarcel Moolenaarif ( jQuery.expr && jQuery.expr.filters ) { 8898*31337658SMarcel Moolenaar jQuery.expr.filters.animated = function( elem ) { 8899*31337658SMarcel Moolenaar return jQuery.grep(jQuery.timers, function( fn ) { 8900*31337658SMarcel Moolenaar return elem === fn.elem; 8901*31337658SMarcel Moolenaar }).length; 8902*31337658SMarcel Moolenaar }; 8903*31337658SMarcel Moolenaar} 8904*31337658SMarcel Moolenaar 8905*31337658SMarcel Moolenaar// Try to restore the default display value of an element 8906*31337658SMarcel Moolenaarfunction defaultDisplay( nodeName ) { 8907*31337658SMarcel Moolenaar 8908*31337658SMarcel Moolenaar if ( !elemdisplay[ nodeName ] ) { 8909*31337658SMarcel Moolenaar 8910*31337658SMarcel Moolenaar var body = document.body, 8911*31337658SMarcel Moolenaar elem = jQuery( "<" + nodeName + ">" ).appendTo( body ), 8912*31337658SMarcel Moolenaar display = elem.css( "display" ); 8913*31337658SMarcel Moolenaar elem.remove(); 8914*31337658SMarcel Moolenaar 8915*31337658SMarcel Moolenaar // If the simple way fails, 8916*31337658SMarcel Moolenaar // get element's real default display by attaching it to a temp iframe 8917*31337658SMarcel Moolenaar if ( display === "none" || display === "" ) { 8918*31337658SMarcel Moolenaar // No iframe to use yet, so create it 8919*31337658SMarcel Moolenaar if ( !iframe ) { 8920*31337658SMarcel Moolenaar iframe = document.createElement( "iframe" ); 8921*31337658SMarcel Moolenaar iframe.frameBorder = iframe.width = iframe.height = 0; 8922*31337658SMarcel Moolenaar } 8923*31337658SMarcel Moolenaar 8924*31337658SMarcel Moolenaar body.appendChild( iframe ); 8925*31337658SMarcel Moolenaar 8926*31337658SMarcel Moolenaar // Create a cacheable copy of the iframe document on first call. 8927*31337658SMarcel Moolenaar // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML 8928*31337658SMarcel Moolenaar // document to it; WebKit & Firefox won't allow reusing the iframe document. 8929*31337658SMarcel Moolenaar if ( !iframeDoc || !iframe.createElement ) { 8930*31337658SMarcel Moolenaar iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document; 8931*31337658SMarcel Moolenaar iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" ); 8932*31337658SMarcel Moolenaar iframeDoc.close(); 8933*31337658SMarcel Moolenaar } 8934*31337658SMarcel Moolenaar 8935*31337658SMarcel Moolenaar elem = iframeDoc.createElement( nodeName ); 8936*31337658SMarcel Moolenaar 8937*31337658SMarcel Moolenaar iframeDoc.body.appendChild( elem ); 8938*31337658SMarcel Moolenaar 8939*31337658SMarcel Moolenaar display = jQuery.css( elem, "display" ); 8940*31337658SMarcel Moolenaar body.removeChild( iframe ); 8941*31337658SMarcel Moolenaar } 8942*31337658SMarcel Moolenaar 8943*31337658SMarcel Moolenaar // Store the correct default display 8944*31337658SMarcel Moolenaar elemdisplay[ nodeName ] = display; 8945*31337658SMarcel Moolenaar } 8946*31337658SMarcel Moolenaar 8947*31337658SMarcel Moolenaar return elemdisplay[ nodeName ]; 8948*31337658SMarcel Moolenaar} 8949*31337658SMarcel Moolenaar 8950*31337658SMarcel Moolenaar 8951*31337658SMarcel Moolenaar 8952*31337658SMarcel Moolenaar 8953*31337658SMarcel Moolenaarvar rtable = /^t(?:able|d|h)$/i, 8954*31337658SMarcel Moolenaar rroot = /^(?:body|html)$/i; 8955*31337658SMarcel Moolenaar 8956*31337658SMarcel Moolenaarif ( "getBoundingClientRect" in document.documentElement ) { 8957*31337658SMarcel Moolenaar jQuery.fn.offset = function( options ) { 8958*31337658SMarcel Moolenaar var elem = this[0], box; 8959*31337658SMarcel Moolenaar 8960*31337658SMarcel Moolenaar if ( options ) { 8961*31337658SMarcel Moolenaar return this.each(function( i ) { 8962*31337658SMarcel Moolenaar jQuery.offset.setOffset( this, options, i ); 8963*31337658SMarcel Moolenaar }); 8964*31337658SMarcel Moolenaar } 8965*31337658SMarcel Moolenaar 8966*31337658SMarcel Moolenaar if ( !elem || !elem.ownerDocument ) { 8967*31337658SMarcel Moolenaar return null; 8968*31337658SMarcel Moolenaar } 8969*31337658SMarcel Moolenaar 8970*31337658SMarcel Moolenaar if ( elem === elem.ownerDocument.body ) { 8971*31337658SMarcel Moolenaar return jQuery.offset.bodyOffset( elem ); 8972*31337658SMarcel Moolenaar } 8973*31337658SMarcel Moolenaar 8974*31337658SMarcel Moolenaar try { 8975*31337658SMarcel Moolenaar box = elem.getBoundingClientRect(); 8976*31337658SMarcel Moolenaar } catch(e) {} 8977*31337658SMarcel Moolenaar 8978*31337658SMarcel Moolenaar var doc = elem.ownerDocument, 8979*31337658SMarcel Moolenaar docElem = doc.documentElement; 8980*31337658SMarcel Moolenaar 8981*31337658SMarcel Moolenaar // Make sure we're not dealing with a disconnected DOM node 8982*31337658SMarcel Moolenaar if ( !box || !jQuery.contains( docElem, elem ) ) { 8983*31337658SMarcel Moolenaar return box ? { top: box.top, left: box.left } : { top: 0, left: 0 }; 8984*31337658SMarcel Moolenaar } 8985*31337658SMarcel Moolenaar 8986*31337658SMarcel Moolenaar var body = doc.body, 8987*31337658SMarcel Moolenaar win = getWindow(doc), 8988*31337658SMarcel Moolenaar clientTop = docElem.clientTop || body.clientTop || 0, 8989*31337658SMarcel Moolenaar clientLeft = docElem.clientLeft || body.clientLeft || 0, 8990*31337658SMarcel Moolenaar scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop, 8991*31337658SMarcel Moolenaar scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft, 8992*31337658SMarcel Moolenaar top = box.top + scrollTop - clientTop, 8993*31337658SMarcel Moolenaar left = box.left + scrollLeft - clientLeft; 8994*31337658SMarcel Moolenaar 8995*31337658SMarcel Moolenaar return { top: top, left: left }; 8996*31337658SMarcel Moolenaar }; 8997*31337658SMarcel Moolenaar 8998*31337658SMarcel Moolenaar} else { 8999*31337658SMarcel Moolenaar jQuery.fn.offset = function( options ) { 9000*31337658SMarcel Moolenaar var elem = this[0]; 9001*31337658SMarcel Moolenaar 9002*31337658SMarcel Moolenaar if ( options ) { 9003*31337658SMarcel Moolenaar return this.each(function( i ) { 9004*31337658SMarcel Moolenaar jQuery.offset.setOffset( this, options, i ); 9005*31337658SMarcel Moolenaar }); 9006*31337658SMarcel Moolenaar } 9007*31337658SMarcel Moolenaar 9008*31337658SMarcel Moolenaar if ( !elem || !elem.ownerDocument ) { 9009*31337658SMarcel Moolenaar return null; 9010*31337658SMarcel Moolenaar } 9011*31337658SMarcel Moolenaar 9012*31337658SMarcel Moolenaar if ( elem === elem.ownerDocument.body ) { 9013*31337658SMarcel Moolenaar return jQuery.offset.bodyOffset( elem ); 9014*31337658SMarcel Moolenaar } 9015*31337658SMarcel Moolenaar 9016*31337658SMarcel Moolenaar var computedStyle, 9017*31337658SMarcel Moolenaar offsetParent = elem.offsetParent, 9018*31337658SMarcel Moolenaar prevOffsetParent = elem, 9019*31337658SMarcel Moolenaar doc = elem.ownerDocument, 9020*31337658SMarcel Moolenaar docElem = doc.documentElement, 9021*31337658SMarcel Moolenaar body = doc.body, 9022*31337658SMarcel Moolenaar defaultView = doc.defaultView, 9023*31337658SMarcel Moolenaar prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle, 9024*31337658SMarcel Moolenaar top = elem.offsetTop, 9025*31337658SMarcel Moolenaar left = elem.offsetLeft; 9026*31337658SMarcel Moolenaar 9027*31337658SMarcel Moolenaar while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) { 9028*31337658SMarcel Moolenaar if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) { 9029*31337658SMarcel Moolenaar break; 9030*31337658SMarcel Moolenaar } 9031*31337658SMarcel Moolenaar 9032*31337658SMarcel Moolenaar computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle; 9033*31337658SMarcel Moolenaar top -= elem.scrollTop; 9034*31337658SMarcel Moolenaar left -= elem.scrollLeft; 9035*31337658SMarcel Moolenaar 9036*31337658SMarcel Moolenaar if ( elem === offsetParent ) { 9037*31337658SMarcel Moolenaar top += elem.offsetTop; 9038*31337658SMarcel Moolenaar left += elem.offsetLeft; 9039*31337658SMarcel Moolenaar 9040*31337658SMarcel Moolenaar if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) { 9041*31337658SMarcel Moolenaar top += parseFloat( computedStyle.borderTopWidth ) || 0; 9042*31337658SMarcel Moolenaar left += parseFloat( computedStyle.borderLeftWidth ) || 0; 9043*31337658SMarcel Moolenaar } 9044*31337658SMarcel Moolenaar 9045*31337658SMarcel Moolenaar prevOffsetParent = offsetParent; 9046*31337658SMarcel Moolenaar offsetParent = elem.offsetParent; 9047*31337658SMarcel Moolenaar } 9048*31337658SMarcel Moolenaar 9049*31337658SMarcel Moolenaar if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) { 9050*31337658SMarcel Moolenaar top += parseFloat( computedStyle.borderTopWidth ) || 0; 9051*31337658SMarcel Moolenaar left += parseFloat( computedStyle.borderLeftWidth ) || 0; 9052*31337658SMarcel Moolenaar } 9053*31337658SMarcel Moolenaar 9054*31337658SMarcel Moolenaar prevComputedStyle = computedStyle; 9055*31337658SMarcel Moolenaar } 9056*31337658SMarcel Moolenaar 9057*31337658SMarcel Moolenaar if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) { 9058*31337658SMarcel Moolenaar top += body.offsetTop; 9059*31337658SMarcel Moolenaar left += body.offsetLeft; 9060*31337658SMarcel Moolenaar } 9061*31337658SMarcel Moolenaar 9062*31337658SMarcel Moolenaar if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) { 9063*31337658SMarcel Moolenaar top += Math.max( docElem.scrollTop, body.scrollTop ); 9064*31337658SMarcel Moolenaar left += Math.max( docElem.scrollLeft, body.scrollLeft ); 9065*31337658SMarcel Moolenaar } 9066*31337658SMarcel Moolenaar 9067*31337658SMarcel Moolenaar return { top: top, left: left }; 9068*31337658SMarcel Moolenaar }; 9069*31337658SMarcel Moolenaar} 9070*31337658SMarcel Moolenaar 9071*31337658SMarcel MoolenaarjQuery.offset = { 9072*31337658SMarcel Moolenaar 9073*31337658SMarcel Moolenaar bodyOffset: function( body ) { 9074*31337658SMarcel Moolenaar var top = body.offsetTop, 9075*31337658SMarcel Moolenaar left = body.offsetLeft; 9076*31337658SMarcel Moolenaar 9077*31337658SMarcel Moolenaar if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) { 9078*31337658SMarcel Moolenaar top += parseFloat( jQuery.css(body, "marginTop") ) || 0; 9079*31337658SMarcel Moolenaar left += parseFloat( jQuery.css(body, "marginLeft") ) || 0; 9080*31337658SMarcel Moolenaar } 9081*31337658SMarcel Moolenaar 9082*31337658SMarcel Moolenaar return { top: top, left: left }; 9083*31337658SMarcel Moolenaar }, 9084*31337658SMarcel Moolenaar 9085*31337658SMarcel Moolenaar setOffset: function( elem, options, i ) { 9086*31337658SMarcel Moolenaar var position = jQuery.css( elem, "position" ); 9087*31337658SMarcel Moolenaar 9088*31337658SMarcel Moolenaar // set position first, in-case top/left are set even on static elem 9089*31337658SMarcel Moolenaar if ( position === "static" ) { 9090*31337658SMarcel Moolenaar elem.style.position = "relative"; 9091*31337658SMarcel Moolenaar } 9092*31337658SMarcel Moolenaar 9093*31337658SMarcel Moolenaar var curElem = jQuery( elem ), 9094*31337658SMarcel Moolenaar curOffset = curElem.offset(), 9095*31337658SMarcel Moolenaar curCSSTop = jQuery.css( elem, "top" ), 9096*31337658SMarcel Moolenaar curCSSLeft = jQuery.css( elem, "left" ), 9097*31337658SMarcel Moolenaar calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1, 9098*31337658SMarcel Moolenaar props = {}, curPosition = {}, curTop, curLeft; 9099*31337658SMarcel Moolenaar 9100*31337658SMarcel Moolenaar // need to be able to calculate position if either top or left is auto and position is either absolute or fixed 9101*31337658SMarcel Moolenaar if ( calculatePosition ) { 9102*31337658SMarcel Moolenaar curPosition = curElem.position(); 9103*31337658SMarcel Moolenaar curTop = curPosition.top; 9104*31337658SMarcel Moolenaar curLeft = curPosition.left; 9105*31337658SMarcel Moolenaar } else { 9106*31337658SMarcel Moolenaar curTop = parseFloat( curCSSTop ) || 0; 9107*31337658SMarcel Moolenaar curLeft = parseFloat( curCSSLeft ) || 0; 9108*31337658SMarcel Moolenaar } 9109*31337658SMarcel Moolenaar 9110*31337658SMarcel Moolenaar if ( jQuery.isFunction( options ) ) { 9111*31337658SMarcel Moolenaar options = options.call( elem, i, curOffset ); 9112*31337658SMarcel Moolenaar } 9113*31337658SMarcel Moolenaar 9114*31337658SMarcel Moolenaar if ( options.top != null ) { 9115*31337658SMarcel Moolenaar props.top = ( options.top - curOffset.top ) + curTop; 9116*31337658SMarcel Moolenaar } 9117*31337658SMarcel Moolenaar if ( options.left != null ) { 9118*31337658SMarcel Moolenaar props.left = ( options.left - curOffset.left ) + curLeft; 9119*31337658SMarcel Moolenaar } 9120*31337658SMarcel Moolenaar 9121*31337658SMarcel Moolenaar if ( "using" in options ) { 9122*31337658SMarcel Moolenaar options.using.call( elem, props ); 9123*31337658SMarcel Moolenaar } else { 9124*31337658SMarcel Moolenaar curElem.css( props ); 9125*31337658SMarcel Moolenaar } 9126*31337658SMarcel Moolenaar } 9127*31337658SMarcel Moolenaar}; 9128*31337658SMarcel Moolenaar 9129*31337658SMarcel Moolenaar 9130*31337658SMarcel MoolenaarjQuery.fn.extend({ 9131*31337658SMarcel Moolenaar 9132*31337658SMarcel Moolenaar position: function() { 9133*31337658SMarcel Moolenaar if ( !this[0] ) { 9134*31337658SMarcel Moolenaar return null; 9135*31337658SMarcel Moolenaar } 9136*31337658SMarcel Moolenaar 9137*31337658SMarcel Moolenaar var elem = this[0], 9138*31337658SMarcel Moolenaar 9139*31337658SMarcel Moolenaar // Get *real* offsetParent 9140*31337658SMarcel Moolenaar offsetParent = this.offsetParent(), 9141*31337658SMarcel Moolenaar 9142*31337658SMarcel Moolenaar // Get correct offsets 9143*31337658SMarcel Moolenaar offset = this.offset(), 9144*31337658SMarcel Moolenaar parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset(); 9145*31337658SMarcel Moolenaar 9146*31337658SMarcel Moolenaar // Subtract element margins 9147*31337658SMarcel Moolenaar // note: when an element has margin: auto the offsetLeft and marginLeft 9148*31337658SMarcel Moolenaar // are the same in Safari causing offset.left to incorrectly be 0 9149*31337658SMarcel Moolenaar offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0; 9150*31337658SMarcel Moolenaar offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0; 9151*31337658SMarcel Moolenaar 9152*31337658SMarcel Moolenaar // Add offsetParent borders 9153*31337658SMarcel Moolenaar parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0; 9154*31337658SMarcel Moolenaar parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0; 9155*31337658SMarcel Moolenaar 9156*31337658SMarcel Moolenaar // Subtract the two offsets 9157*31337658SMarcel Moolenaar return { 9158*31337658SMarcel Moolenaar top: offset.top - parentOffset.top, 9159*31337658SMarcel Moolenaar left: offset.left - parentOffset.left 9160*31337658SMarcel Moolenaar }; 9161*31337658SMarcel Moolenaar }, 9162*31337658SMarcel Moolenaar 9163*31337658SMarcel Moolenaar offsetParent: function() { 9164*31337658SMarcel Moolenaar return this.map(function() { 9165*31337658SMarcel Moolenaar var offsetParent = this.offsetParent || document.body; 9166*31337658SMarcel Moolenaar while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) { 9167*31337658SMarcel Moolenaar offsetParent = offsetParent.offsetParent; 9168*31337658SMarcel Moolenaar } 9169*31337658SMarcel Moolenaar return offsetParent; 9170*31337658SMarcel Moolenaar }); 9171*31337658SMarcel Moolenaar } 9172*31337658SMarcel Moolenaar}); 9173*31337658SMarcel Moolenaar 9174*31337658SMarcel Moolenaar 9175*31337658SMarcel Moolenaar// Create scrollLeft and scrollTop methods 9176*31337658SMarcel MoolenaarjQuery.each( ["Left", "Top"], function( i, name ) { 9177*31337658SMarcel Moolenaar var method = "scroll" + name; 9178*31337658SMarcel Moolenaar 9179*31337658SMarcel Moolenaar jQuery.fn[ method ] = function( val ) { 9180*31337658SMarcel Moolenaar var elem, win; 9181*31337658SMarcel Moolenaar 9182*31337658SMarcel Moolenaar if ( val === undefined ) { 9183*31337658SMarcel Moolenaar elem = this[ 0 ]; 9184*31337658SMarcel Moolenaar 9185*31337658SMarcel Moolenaar if ( !elem ) { 9186*31337658SMarcel Moolenaar return null; 9187*31337658SMarcel Moolenaar } 9188*31337658SMarcel Moolenaar 9189*31337658SMarcel Moolenaar win = getWindow( elem ); 9190*31337658SMarcel Moolenaar 9191*31337658SMarcel Moolenaar // Return the scroll offset 9192*31337658SMarcel Moolenaar return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] : 9193*31337658SMarcel Moolenaar jQuery.support.boxModel && win.document.documentElement[ method ] || 9194*31337658SMarcel Moolenaar win.document.body[ method ] : 9195*31337658SMarcel Moolenaar elem[ method ]; 9196*31337658SMarcel Moolenaar } 9197*31337658SMarcel Moolenaar 9198*31337658SMarcel Moolenaar // Set the scroll offset 9199*31337658SMarcel Moolenaar return this.each(function() { 9200*31337658SMarcel Moolenaar win = getWindow( this ); 9201*31337658SMarcel Moolenaar 9202*31337658SMarcel Moolenaar if ( win ) { 9203*31337658SMarcel Moolenaar win.scrollTo( 9204*31337658SMarcel Moolenaar !i ? val : jQuery( win ).scrollLeft(), 9205*31337658SMarcel Moolenaar i ? val : jQuery( win ).scrollTop() 9206*31337658SMarcel Moolenaar ); 9207*31337658SMarcel Moolenaar 9208*31337658SMarcel Moolenaar } else { 9209*31337658SMarcel Moolenaar this[ method ] = val; 9210*31337658SMarcel Moolenaar } 9211*31337658SMarcel Moolenaar }); 9212*31337658SMarcel Moolenaar }; 9213*31337658SMarcel Moolenaar}); 9214*31337658SMarcel Moolenaar 9215*31337658SMarcel Moolenaarfunction getWindow( elem ) { 9216*31337658SMarcel Moolenaar return jQuery.isWindow( elem ) ? 9217*31337658SMarcel Moolenaar elem : 9218*31337658SMarcel Moolenaar elem.nodeType === 9 ? 9219*31337658SMarcel Moolenaar elem.defaultView || elem.parentWindow : 9220*31337658SMarcel Moolenaar false; 9221*31337658SMarcel Moolenaar} 9222*31337658SMarcel Moolenaar 9223*31337658SMarcel Moolenaar 9224*31337658SMarcel Moolenaar 9225*31337658SMarcel Moolenaar 9226*31337658SMarcel Moolenaar// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods 9227*31337658SMarcel MoolenaarjQuery.each([ "Height", "Width" ], function( i, name ) { 9228*31337658SMarcel Moolenaar 9229*31337658SMarcel Moolenaar var type = name.toLowerCase(); 9230*31337658SMarcel Moolenaar 9231*31337658SMarcel Moolenaar // innerHeight and innerWidth 9232*31337658SMarcel Moolenaar jQuery.fn[ "inner" + name ] = function() { 9233*31337658SMarcel Moolenaar var elem = this[0]; 9234*31337658SMarcel Moolenaar return elem ? 9235*31337658SMarcel Moolenaar elem.style ? 9236*31337658SMarcel Moolenaar parseFloat( jQuery.css( elem, type, "padding" ) ) : 9237*31337658SMarcel Moolenaar this[ type ]() : 9238*31337658SMarcel Moolenaar null; 9239*31337658SMarcel Moolenaar }; 9240*31337658SMarcel Moolenaar 9241*31337658SMarcel Moolenaar // outerHeight and outerWidth 9242*31337658SMarcel Moolenaar jQuery.fn[ "outer" + name ] = function( margin ) { 9243*31337658SMarcel Moolenaar var elem = this[0]; 9244*31337658SMarcel Moolenaar return elem ? 9245*31337658SMarcel Moolenaar elem.style ? 9246*31337658SMarcel Moolenaar parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) : 9247*31337658SMarcel Moolenaar this[ type ]() : 9248*31337658SMarcel Moolenaar null; 9249*31337658SMarcel Moolenaar }; 9250*31337658SMarcel Moolenaar 9251*31337658SMarcel Moolenaar jQuery.fn[ type ] = function( size ) { 9252*31337658SMarcel Moolenaar // Get window width or height 9253*31337658SMarcel Moolenaar var elem = this[0]; 9254*31337658SMarcel Moolenaar if ( !elem ) { 9255*31337658SMarcel Moolenaar return size == null ? null : this; 9256*31337658SMarcel Moolenaar } 9257*31337658SMarcel Moolenaar 9258*31337658SMarcel Moolenaar if ( jQuery.isFunction( size ) ) { 9259*31337658SMarcel Moolenaar return this.each(function( i ) { 9260*31337658SMarcel Moolenaar var self = jQuery( this ); 9261*31337658SMarcel Moolenaar self[ type ]( size.call( this, i, self[ type ]() ) ); 9262*31337658SMarcel Moolenaar }); 9263*31337658SMarcel Moolenaar } 9264*31337658SMarcel Moolenaar 9265*31337658SMarcel Moolenaar if ( jQuery.isWindow( elem ) ) { 9266*31337658SMarcel Moolenaar // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode 9267*31337658SMarcel Moolenaar // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat 9268*31337658SMarcel Moolenaar var docElemProp = elem.document.documentElement[ "client" + name ], 9269*31337658SMarcel Moolenaar body = elem.document.body; 9270*31337658SMarcel Moolenaar return elem.document.compatMode === "CSS1Compat" && docElemProp || 9271*31337658SMarcel Moolenaar body && body[ "client" + name ] || docElemProp; 9272*31337658SMarcel Moolenaar 9273*31337658SMarcel Moolenaar // Get document width or height 9274*31337658SMarcel Moolenaar } else if ( elem.nodeType === 9 ) { 9275*31337658SMarcel Moolenaar // Either scroll[Width/Height] or offset[Width/Height], whichever is greater 9276*31337658SMarcel Moolenaar return Math.max( 9277*31337658SMarcel Moolenaar elem.documentElement["client" + name], 9278*31337658SMarcel Moolenaar elem.body["scroll" + name], elem.documentElement["scroll" + name], 9279*31337658SMarcel Moolenaar elem.body["offset" + name], elem.documentElement["offset" + name] 9280*31337658SMarcel Moolenaar ); 9281*31337658SMarcel Moolenaar 9282*31337658SMarcel Moolenaar // Get or set width or height on the element 9283*31337658SMarcel Moolenaar } else if ( size === undefined ) { 9284*31337658SMarcel Moolenaar var orig = jQuery.css( elem, type ), 9285*31337658SMarcel Moolenaar ret = parseFloat( orig ); 9286*31337658SMarcel Moolenaar 9287*31337658SMarcel Moolenaar return jQuery.isNumeric( ret ) ? ret : orig; 9288*31337658SMarcel Moolenaar 9289*31337658SMarcel Moolenaar // Set the width or height on the element (default to pixels if value is unitless) 9290*31337658SMarcel Moolenaar } else { 9291*31337658SMarcel Moolenaar return this.css( type, typeof size === "string" ? size : size + "px" ); 9292*31337658SMarcel Moolenaar } 9293*31337658SMarcel Moolenaar }; 9294*31337658SMarcel Moolenaar 9295*31337658SMarcel Moolenaar}); 9296*31337658SMarcel Moolenaar 9297*31337658SMarcel Moolenaar 9298*31337658SMarcel Moolenaar// Expose jQuery to the global object 9299*31337658SMarcel Moolenaarwindow.jQuery = window.$ = jQuery; 9300*31337658SMarcel Moolenaar})( window ); 9301