1273562Smarcel/*! 2273562Smarcel * jQuery JavaScript Library v1.7 3273562Smarcel * http://jquery.com/ 4273562Smarcel * 5273562Smarcel * Copyright 2011, John Resig 6273562Smarcel * Dual licensed under the MIT or GPL Version 2 licenses. 7273562Smarcel * http://jquery.org/license 8273562Smarcel * 9273562Smarcel * Includes Sizzle.js 10273562Smarcel * http://sizzlejs.com/ 11273562Smarcel * Copyright 2011, The Dojo Foundation 12273562Smarcel * Released under the MIT, BSD, and GPL Licenses. 13273562Smarcel * 14273562Smarcel * Date: Thu Nov 3 16:18:21 2011 -0400 15273562Smarcel */ 16273562Smarcel(function( window, undefined ) { 17273562Smarcel 18273562Smarcel// Use the correct document accordingly with window argument (sandbox) 19273562Smarcelvar document = window.document, 20273562Smarcel navigator = window.navigator, 21273562Smarcel location = window.location; 22273562Smarcelvar jQuery = (function() { 23273562Smarcel 24273562Smarcel// Define a local copy of jQuery 25273562Smarcelvar jQuery = function( selector, context ) { 26273562Smarcel // The jQuery object is actually just the init constructor 'enhanced' 27273562Smarcel return new jQuery.fn.init( selector, context, rootjQuery ); 28273562Smarcel }, 29273562Smarcel 30273562Smarcel // Map over jQuery in case of overwrite 31273562Smarcel _jQuery = window.jQuery, 32273562Smarcel 33273562Smarcel // Map over the $ in case of overwrite 34273562Smarcel _$ = window.$, 35273562Smarcel 36273562Smarcel // A central reference to the root jQuery(document) 37273562Smarcel rootjQuery, 38273562Smarcel 39273562Smarcel // A simple way to check for HTML strings or ID strings 40273562Smarcel // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) 41273562Smarcel quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, 42273562Smarcel 43273562Smarcel // Check if a string has a non-whitespace character in it 44273562Smarcel rnotwhite = /\S/, 45273562Smarcel 46273562Smarcel // Used for trimming whitespace 47273562Smarcel trimLeft = /^\s+/, 48273562Smarcel trimRight = /\s+$/, 49273562Smarcel 50273562Smarcel // Check for digits 51273562Smarcel rdigit = /\d/, 52273562Smarcel 53273562Smarcel // Match a standalone tag 54273562Smarcel rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, 55273562Smarcel 56273562Smarcel // JSON RegExp 57273562Smarcel rvalidchars = /^[\],:{}\s]*$/, 58273562Smarcel rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, 59273562Smarcel rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, 60273562Smarcel rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, 61273562Smarcel 62273562Smarcel // Useragent RegExp 63273562Smarcel rwebkit = /(webkit)[ \/]([\w.]+)/, 64273562Smarcel ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, 65273562Smarcel rmsie = /(msie) ([\w.]+)/, 66273562Smarcel rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, 67273562Smarcel 68273562Smarcel // Matches dashed string for camelizing 69273562Smarcel rdashAlpha = /-([a-z]|[0-9])/ig, 70273562Smarcel rmsPrefix = /^-ms-/, 71273562Smarcel 72273562Smarcel // Used by jQuery.camelCase as callback to replace() 73273562Smarcel fcamelCase = function( all, letter ) { 74273562Smarcel return ( letter + "" ).toUpperCase(); 75273562Smarcel }, 76273562Smarcel 77273562Smarcel // Keep a UserAgent string for use with jQuery.browser 78273562Smarcel userAgent = navigator.userAgent, 79273562Smarcel 80273562Smarcel // For matching the engine and version of the browser 81273562Smarcel browserMatch, 82273562Smarcel 83273562Smarcel // The deferred used on DOM ready 84273562Smarcel readyList, 85273562Smarcel 86273562Smarcel // The ready event handler 87273562Smarcel DOMContentLoaded, 88273562Smarcel 89273562Smarcel // Save a reference to some core methods 90273562Smarcel toString = Object.prototype.toString, 91273562Smarcel hasOwn = Object.prototype.hasOwnProperty, 92273562Smarcel push = Array.prototype.push, 93273562Smarcel slice = Array.prototype.slice, 94273562Smarcel trim = String.prototype.trim, 95273562Smarcel indexOf = Array.prototype.indexOf, 96273562Smarcel 97273562Smarcel // [[Class]] -> type pairs 98273562Smarcel class2type = {}; 99273562Smarcel 100273562SmarceljQuery.fn = jQuery.prototype = { 101273562Smarcel constructor: jQuery, 102273562Smarcel init: function( selector, context, rootjQuery ) { 103273562Smarcel var match, elem, ret, doc; 104273562Smarcel 105273562Smarcel // Handle $(""), $(null), or $(undefined) 106273562Smarcel if ( !selector ) { 107273562Smarcel return this; 108273562Smarcel } 109273562Smarcel 110273562Smarcel // Handle $(DOMElement) 111273562Smarcel if ( selector.nodeType ) { 112273562Smarcel this.context = this[0] = selector; 113273562Smarcel this.length = 1; 114273562Smarcel return this; 115273562Smarcel } 116273562Smarcel 117273562Smarcel // The body element only exists once, optimize finding it 118273562Smarcel if ( selector === "body" && !context && document.body ) { 119273562Smarcel this.context = document; 120273562Smarcel this[0] = document.body; 121273562Smarcel this.selector = selector; 122273562Smarcel this.length = 1; 123273562Smarcel return this; 124273562Smarcel } 125273562Smarcel 126273562Smarcel // Handle HTML strings 127273562Smarcel if ( typeof selector === "string" ) { 128273562Smarcel // Are we dealing with HTML string or an ID? 129273562Smarcel if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { 130273562Smarcel // Assume that strings that start and end with <> are HTML and skip the regex check 131273562Smarcel match = [ null, selector, null ]; 132273562Smarcel 133273562Smarcel } else { 134273562Smarcel match = quickExpr.exec( selector ); 135273562Smarcel } 136273562Smarcel 137273562Smarcel // Verify a match, and that no context was specified for #id 138273562Smarcel if ( match && (match[1] || !context) ) { 139273562Smarcel 140273562Smarcel // HANDLE: $(html) -> $(array) 141273562Smarcel if ( match[1] ) { 142273562Smarcel context = context instanceof jQuery ? context[0] : context; 143273562Smarcel doc = ( context ? context.ownerDocument || context : document ); 144273562Smarcel 145273562Smarcel // If a single string is passed in and it's a single tag 146273562Smarcel // just do a createElement and skip the rest 147273562Smarcel ret = rsingleTag.exec( selector ); 148273562Smarcel 149273562Smarcel if ( ret ) { 150273562Smarcel if ( jQuery.isPlainObject( context ) ) { 151273562Smarcel selector = [ document.createElement( ret[1] ) ]; 152273562Smarcel jQuery.fn.attr.call( selector, context, true ); 153273562Smarcel 154273562Smarcel } else { 155273562Smarcel selector = [ doc.createElement( ret[1] ) ]; 156273562Smarcel } 157273562Smarcel 158273562Smarcel } else { 159273562Smarcel ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); 160273562Smarcel selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; 161273562Smarcel } 162273562Smarcel 163273562Smarcel return jQuery.merge( this, selector ); 164273562Smarcel 165273562Smarcel // HANDLE: $("#id") 166273562Smarcel } else { 167273562Smarcel elem = document.getElementById( match[2] ); 168273562Smarcel 169273562Smarcel // Check parentNode to catch when Blackberry 4.6 returns 170273562Smarcel // nodes that are no longer in the document #6963 171273562Smarcel if ( elem && elem.parentNode ) { 172273562Smarcel // Handle the case where IE and Opera return items 173273562Smarcel // by name instead of ID 174273562Smarcel if ( elem.id !== match[2] ) { 175273562Smarcel return rootjQuery.find( selector ); 176273562Smarcel } 177273562Smarcel 178273562Smarcel // Otherwise, we inject the element directly into the jQuery object 179273562Smarcel this.length = 1; 180273562Smarcel this[0] = elem; 181273562Smarcel } 182273562Smarcel 183273562Smarcel this.context = document; 184273562Smarcel this.selector = selector; 185273562Smarcel return this; 186273562Smarcel } 187273562Smarcel 188273562Smarcel // HANDLE: $(expr, $(...)) 189273562Smarcel } else if ( !context || context.jquery ) { 190273562Smarcel return ( context || rootjQuery ).find( selector ); 191273562Smarcel 192273562Smarcel // HANDLE: $(expr, context) 193273562Smarcel // (which is just equivalent to: $(context).find(expr) 194273562Smarcel } else { 195273562Smarcel return this.constructor( context ).find( selector ); 196273562Smarcel } 197273562Smarcel 198273562Smarcel // HANDLE: $(function) 199273562Smarcel // Shortcut for document ready 200273562Smarcel } else if ( jQuery.isFunction( selector ) ) { 201273562Smarcel return rootjQuery.ready( selector ); 202273562Smarcel } 203273562Smarcel 204273562Smarcel if ( selector.selector !== undefined ) { 205273562Smarcel this.selector = selector.selector; 206273562Smarcel this.context = selector.context; 207273562Smarcel } 208273562Smarcel 209273562Smarcel return jQuery.makeArray( selector, this ); 210273562Smarcel }, 211273562Smarcel 212273562Smarcel // Start with an empty selector 213273562Smarcel selector: "", 214273562Smarcel 215273562Smarcel // The current version of jQuery being used 216273562Smarcel jquery: "1.7", 217273562Smarcel 218273562Smarcel // The default length of a jQuery object is 0 219273562Smarcel length: 0, 220273562Smarcel 221273562Smarcel // The number of elements contained in the matched element set 222273562Smarcel size: function() { 223273562Smarcel return this.length; 224273562Smarcel }, 225273562Smarcel 226273562Smarcel toArray: function() { 227273562Smarcel return slice.call( this, 0 ); 228273562Smarcel }, 229273562Smarcel 230273562Smarcel // Get the Nth element in the matched element set OR 231273562Smarcel // Get the whole matched element set as a clean array 232273562Smarcel get: function( num ) { 233273562Smarcel return num == null ? 234273562Smarcel 235273562Smarcel // Return a 'clean' array 236273562Smarcel this.toArray() : 237273562Smarcel 238273562Smarcel // Return just the object 239273562Smarcel ( num < 0 ? this[ this.length + num ] : this[ num ] ); 240273562Smarcel }, 241273562Smarcel 242273562Smarcel // Take an array of elements and push it onto the stack 243273562Smarcel // (returning the new matched element set) 244273562Smarcel pushStack: function( elems, name, selector ) { 245273562Smarcel // Build a new jQuery matched element set 246273562Smarcel var ret = this.constructor(); 247273562Smarcel 248273562Smarcel if ( jQuery.isArray( elems ) ) { 249273562Smarcel push.apply( ret, elems ); 250273562Smarcel 251273562Smarcel } else { 252273562Smarcel jQuery.merge( ret, elems ); 253273562Smarcel } 254273562Smarcel 255273562Smarcel // Add the old object onto the stack (as a reference) 256273562Smarcel ret.prevObject = this; 257273562Smarcel 258273562Smarcel ret.context = this.context; 259273562Smarcel 260273562Smarcel if ( name === "find" ) { 261273562Smarcel ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; 262273562Smarcel } else if ( name ) { 263273562Smarcel ret.selector = this.selector + "." + name + "(" + selector + ")"; 264273562Smarcel } 265273562Smarcel 266273562Smarcel // Return the newly-formed element set 267273562Smarcel return ret; 268273562Smarcel }, 269273562Smarcel 270273562Smarcel // Execute a callback for every element in the matched set. 271273562Smarcel // (You can seed the arguments with an array of args, but this is 272273562Smarcel // only used internally.) 273273562Smarcel each: function( callback, args ) { 274273562Smarcel return jQuery.each( this, callback, args ); 275273562Smarcel }, 276273562Smarcel 277273562Smarcel ready: function( fn ) { 278273562Smarcel // Attach the listeners 279273562Smarcel jQuery.bindReady(); 280273562Smarcel 281273562Smarcel // Add the callback 282273562Smarcel readyList.add( fn ); 283273562Smarcel 284273562Smarcel return this; 285273562Smarcel }, 286273562Smarcel 287273562Smarcel eq: function( i ) { 288273562Smarcel return i === -1 ? 289273562Smarcel this.slice( i ) : 290273562Smarcel this.slice( i, +i + 1 ); 291273562Smarcel }, 292273562Smarcel 293273562Smarcel first: function() { 294273562Smarcel return this.eq( 0 ); 295273562Smarcel }, 296273562Smarcel 297273562Smarcel last: function() { 298273562Smarcel return this.eq( -1 ); 299273562Smarcel }, 300273562Smarcel 301273562Smarcel slice: function() { 302273562Smarcel return this.pushStack( slice.apply( this, arguments ), 303273562Smarcel "slice", slice.call(arguments).join(",") ); 304273562Smarcel }, 305273562Smarcel 306273562Smarcel map: function( callback ) { 307273562Smarcel return this.pushStack( jQuery.map(this, function( elem, i ) { 308273562Smarcel return callback.call( elem, i, elem ); 309273562Smarcel })); 310273562Smarcel }, 311273562Smarcel 312273562Smarcel end: function() { 313273562Smarcel return this.prevObject || this.constructor(null); 314273562Smarcel }, 315273562Smarcel 316273562Smarcel // For internal use only. 317273562Smarcel // Behaves like an Array's method, not like a jQuery method. 318273562Smarcel push: push, 319273562Smarcel sort: [].sort, 320273562Smarcel splice: [].splice 321273562Smarcel}; 322273562Smarcel 323273562Smarcel// Give the init function the jQuery prototype for later instantiation 324273562SmarceljQuery.fn.init.prototype = jQuery.fn; 325273562Smarcel 326273562SmarceljQuery.extend = jQuery.fn.extend = function() { 327273562Smarcel var options, name, src, copy, copyIsArray, clone, 328273562Smarcel target = arguments[0] || {}, 329273562Smarcel i = 1, 330273562Smarcel length = arguments.length, 331273562Smarcel deep = false; 332273562Smarcel 333273562Smarcel // Handle a deep copy situation 334273562Smarcel if ( typeof target === "boolean" ) { 335273562Smarcel deep = target; 336273562Smarcel target = arguments[1] || {}; 337273562Smarcel // skip the boolean and the target 338273562Smarcel i = 2; 339273562Smarcel } 340273562Smarcel 341273562Smarcel // Handle case when target is a string or something (possible in deep copy) 342273562Smarcel if ( typeof target !== "object" && !jQuery.isFunction(target) ) { 343273562Smarcel target = {}; 344273562Smarcel } 345273562Smarcel 346273562Smarcel // extend jQuery itself if only one argument is passed 347273562Smarcel if ( length === i ) { 348273562Smarcel target = this; 349273562Smarcel --i; 350273562Smarcel } 351273562Smarcel 352273562Smarcel for ( ; i < length; i++ ) { 353273562Smarcel // Only deal with non-null/undefined values 354273562Smarcel if ( (options = arguments[ i ]) != null ) { 355273562Smarcel // Extend the base object 356273562Smarcel for ( name in options ) { 357273562Smarcel src = target[ name ]; 358273562Smarcel copy = options[ name ]; 359273562Smarcel 360273562Smarcel // Prevent never-ending loop 361273562Smarcel if ( target === copy ) { 362273562Smarcel continue; 363273562Smarcel } 364273562Smarcel 365273562Smarcel // Recurse if we're merging plain objects or arrays 366273562Smarcel if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { 367273562Smarcel if ( copyIsArray ) { 368273562Smarcel copyIsArray = false; 369273562Smarcel clone = src && jQuery.isArray(src) ? src : []; 370273562Smarcel 371273562Smarcel } else { 372273562Smarcel clone = src && jQuery.isPlainObject(src) ? src : {}; 373273562Smarcel } 374273562Smarcel 375273562Smarcel // Never move original objects, clone them 376273562Smarcel target[ name ] = jQuery.extend( deep, clone, copy ); 377273562Smarcel 378273562Smarcel // Don't bring in undefined values 379273562Smarcel } else if ( copy !== undefined ) { 380273562Smarcel target[ name ] = copy; 381273562Smarcel } 382273562Smarcel } 383273562Smarcel } 384273562Smarcel } 385273562Smarcel 386273562Smarcel // Return the modified object 387273562Smarcel return target; 388273562Smarcel}; 389273562Smarcel 390273562SmarceljQuery.extend({ 391273562Smarcel noConflict: function( deep ) { 392273562Smarcel if ( window.$ === jQuery ) { 393273562Smarcel window.$ = _$; 394273562Smarcel } 395273562Smarcel 396273562Smarcel if ( deep && window.jQuery === jQuery ) { 397273562Smarcel window.jQuery = _jQuery; 398273562Smarcel } 399273562Smarcel 400273562Smarcel return jQuery; 401273562Smarcel }, 402273562Smarcel 403273562Smarcel // Is the DOM ready to be used? Set to true once it occurs. 404273562Smarcel isReady: false, 405273562Smarcel 406273562Smarcel // A counter to track how many items to wait for before 407273562Smarcel // the ready event fires. See #6781 408273562Smarcel readyWait: 1, 409273562Smarcel 410273562Smarcel // Hold (or release) the ready event 411273562Smarcel holdReady: function( hold ) { 412273562Smarcel if ( hold ) { 413273562Smarcel jQuery.readyWait++; 414273562Smarcel } else { 415273562Smarcel jQuery.ready( true ); 416273562Smarcel } 417273562Smarcel }, 418273562Smarcel 419273562Smarcel // Handle when the DOM is ready 420273562Smarcel ready: function( wait ) { 421273562Smarcel // Either a released hold or an DOMready/load event and not yet ready 422273562Smarcel if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { 423273562Smarcel // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). 424273562Smarcel if ( !document.body ) { 425273562Smarcel return setTimeout( jQuery.ready, 1 ); 426273562Smarcel } 427273562Smarcel 428273562Smarcel // Remember that the DOM is ready 429273562Smarcel jQuery.isReady = true; 430273562Smarcel 431273562Smarcel // If a normal DOM Ready event fired, decrement, and wait if need be 432273562Smarcel if ( wait !== true && --jQuery.readyWait > 0 ) { 433273562Smarcel return; 434273562Smarcel } 435273562Smarcel 436273562Smarcel // If there are functions bound, to execute 437273562Smarcel readyList.fireWith( document, [ jQuery ] ); 438273562Smarcel 439273562Smarcel // Trigger any bound ready events 440273562Smarcel if ( jQuery.fn.trigger ) { 441273562Smarcel jQuery( document ).trigger( "ready" ).unbind( "ready" ); 442273562Smarcel } 443273562Smarcel } 444273562Smarcel }, 445273562Smarcel 446273562Smarcel bindReady: function() { 447273562Smarcel if ( readyList ) { 448273562Smarcel return; 449273562Smarcel } 450273562Smarcel 451273562Smarcel readyList = jQuery.Callbacks( "once memory" ); 452273562Smarcel 453273562Smarcel // Catch cases where $(document).ready() is called after the 454273562Smarcel // browser event has already occurred. 455273562Smarcel if ( document.readyState === "complete" ) { 456273562Smarcel // Handle it asynchronously to allow scripts the opportunity to delay ready 457273562Smarcel return setTimeout( jQuery.ready, 1 ); 458273562Smarcel } 459273562Smarcel 460273562Smarcel // Mozilla, Opera and webkit nightlies currently support this event 461273562Smarcel if ( document.addEventListener ) { 462273562Smarcel // Use the handy event callback 463273562Smarcel document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); 464273562Smarcel 465273562Smarcel // A fallback to window.onload, that will always work 466273562Smarcel window.addEventListener( "load", jQuery.ready, false ); 467273562Smarcel 468273562Smarcel // If IE event model is used 469273562Smarcel } else if ( document.attachEvent ) { 470273562Smarcel // ensure firing before onload, 471273562Smarcel // maybe late but safe also for iframes 472273562Smarcel document.attachEvent( "onreadystatechange", DOMContentLoaded ); 473273562Smarcel 474273562Smarcel // A fallback to window.onload, that will always work 475273562Smarcel window.attachEvent( "onload", jQuery.ready ); 476273562Smarcel 477273562Smarcel // If IE and not a frame 478273562Smarcel // continually check to see if the document is ready 479273562Smarcel var toplevel = false; 480273562Smarcel 481273562Smarcel try { 482273562Smarcel toplevel = window.frameElement == null; 483273562Smarcel } catch(e) {} 484273562Smarcel 485273562Smarcel if ( document.documentElement.doScroll && toplevel ) { 486273562Smarcel doScrollCheck(); 487273562Smarcel } 488273562Smarcel } 489273562Smarcel }, 490273562Smarcel 491273562Smarcel // See test/unit/core.js for details concerning isFunction. 492273562Smarcel // Since version 1.3, DOM methods and functions like alert 493273562Smarcel // aren't supported. They return false on IE (#2968). 494273562Smarcel isFunction: function( obj ) { 495273562Smarcel return jQuery.type(obj) === "function"; 496273562Smarcel }, 497273562Smarcel 498273562Smarcel isArray: Array.isArray || function( obj ) { 499273562Smarcel return jQuery.type(obj) === "array"; 500273562Smarcel }, 501273562Smarcel 502273562Smarcel // A crude way of determining if an object is a window 503273562Smarcel isWindow: function( obj ) { 504273562Smarcel return obj && typeof obj === "object" && "setInterval" in obj; 505273562Smarcel }, 506273562Smarcel 507273562Smarcel isNumeric: function( obj ) { 508273562Smarcel return obj != null && rdigit.test( obj ) && !isNaN( obj ); 509273562Smarcel }, 510273562Smarcel 511273562Smarcel type: function( obj ) { 512273562Smarcel return obj == null ? 513273562Smarcel String( obj ) : 514273562Smarcel class2type[ toString.call(obj) ] || "object"; 515273562Smarcel }, 516273562Smarcel 517273562Smarcel isPlainObject: function( obj ) { 518273562Smarcel // Must be an Object. 519273562Smarcel // Because of IE, we also have to check the presence of the constructor property. 520273562Smarcel // Make sure that DOM nodes and window objects don't pass through, as well 521273562Smarcel if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { 522273562Smarcel return false; 523273562Smarcel } 524273562Smarcel 525273562Smarcel try { 526273562Smarcel // Not own constructor property must be Object 527273562Smarcel if ( obj.constructor && 528273562Smarcel !hasOwn.call(obj, "constructor") && 529273562Smarcel !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { 530273562Smarcel return false; 531273562Smarcel } 532273562Smarcel } catch ( e ) { 533273562Smarcel // IE8,9 Will throw exceptions on certain host objects #9897 534273562Smarcel return false; 535273562Smarcel } 536273562Smarcel 537273562Smarcel // Own properties are enumerated firstly, so to speed up, 538273562Smarcel // if last one is own, then all properties are own. 539273562Smarcel 540273562Smarcel var key; 541273562Smarcel for ( key in obj ) {} 542273562Smarcel 543273562Smarcel return key === undefined || hasOwn.call( obj, key ); 544273562Smarcel }, 545273562Smarcel 546273562Smarcel isEmptyObject: function( obj ) { 547273562Smarcel for ( var name in obj ) { 548273562Smarcel return false; 549273562Smarcel } 550273562Smarcel return true; 551273562Smarcel }, 552273562Smarcel 553273562Smarcel error: function( msg ) { 554273562Smarcel throw msg; 555273562Smarcel }, 556273562Smarcel 557273562Smarcel parseJSON: function( data ) { 558273562Smarcel if ( typeof data !== "string" || !data ) { 559273562Smarcel return null; 560273562Smarcel } 561273562Smarcel 562273562Smarcel // Make sure leading/trailing whitespace is removed (IE can't handle it) 563273562Smarcel data = jQuery.trim( data ); 564273562Smarcel 565273562Smarcel // Attempt to parse using the native JSON parser first 566273562Smarcel if ( window.JSON && window.JSON.parse ) { 567273562Smarcel return window.JSON.parse( data ); 568273562Smarcel } 569273562Smarcel 570273562Smarcel // Make sure the incoming data is actual JSON 571273562Smarcel // Logic borrowed from http://json.org/json2.js 572273562Smarcel if ( rvalidchars.test( data.replace( rvalidescape, "@" ) 573273562Smarcel .replace( rvalidtokens, "]" ) 574273562Smarcel .replace( rvalidbraces, "")) ) { 575273562Smarcel 576273562Smarcel return ( new Function( "return " + data ) )(); 577273562Smarcel 578273562Smarcel } 579273562Smarcel jQuery.error( "Invalid JSON: " + data ); 580273562Smarcel }, 581273562Smarcel 582273562Smarcel // Cross-browser xml parsing 583273562Smarcel parseXML: function( data ) { 584273562Smarcel var xml, tmp; 585273562Smarcel try { 586273562Smarcel if ( window.DOMParser ) { // Standard 587273562Smarcel tmp = new DOMParser(); 588273562Smarcel xml = tmp.parseFromString( data , "text/xml" ); 589273562Smarcel } else { // IE 590273562Smarcel xml = new ActiveXObject( "Microsoft.XMLDOM" ); 591273562Smarcel xml.async = "false"; 592273562Smarcel xml.loadXML( data ); 593273562Smarcel } 594273562Smarcel } catch( e ) { 595273562Smarcel xml = undefined; 596273562Smarcel } 597273562Smarcel if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { 598273562Smarcel jQuery.error( "Invalid XML: " + data ); 599273562Smarcel } 600273562Smarcel return xml; 601273562Smarcel }, 602273562Smarcel 603273562Smarcel noop: function() {}, 604273562Smarcel 605273562Smarcel // Evaluates a script in a global context 606273562Smarcel // Workarounds based on findings by Jim Driscoll 607273562Smarcel // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context 608273562Smarcel globalEval: function( data ) { 609273562Smarcel if ( data && rnotwhite.test( data ) ) { 610273562Smarcel // We use execScript on Internet Explorer 611273562Smarcel // We use an anonymous function so that context is window 612273562Smarcel // rather than jQuery in Firefox 613273562Smarcel ( window.execScript || function( data ) { 614273562Smarcel window[ "eval" ].call( window, data ); 615273562Smarcel } )( data ); 616273562Smarcel } 617273562Smarcel }, 618273562Smarcel 619273562Smarcel // Convert dashed to camelCase; used by the css and data modules 620273562Smarcel // Microsoft forgot to hump their vendor prefix (#9572) 621273562Smarcel camelCase: function( string ) { 622273562Smarcel return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); 623273562Smarcel }, 624273562Smarcel 625273562Smarcel nodeName: function( elem, name ) { 626273562Smarcel return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); 627273562Smarcel }, 628273562Smarcel 629273562Smarcel // args is for internal usage only 630273562Smarcel each: function( object, callback, args ) { 631273562Smarcel var name, i = 0, 632273562Smarcel length = object.length, 633273562Smarcel isObj = length === undefined || jQuery.isFunction( object ); 634273562Smarcel 635273562Smarcel if ( args ) { 636273562Smarcel if ( isObj ) { 637273562Smarcel for ( name in object ) { 638273562Smarcel if ( callback.apply( object[ name ], args ) === false ) { 639273562Smarcel break; 640273562Smarcel } 641273562Smarcel } 642273562Smarcel } else { 643273562Smarcel for ( ; i < length; ) { 644273562Smarcel if ( callback.apply( object[ i++ ], args ) === false ) { 645273562Smarcel break; 646273562Smarcel } 647273562Smarcel } 648273562Smarcel } 649273562Smarcel 650273562Smarcel // A special, fast, case for the most common use of each 651273562Smarcel } else { 652273562Smarcel if ( isObj ) { 653273562Smarcel for ( name in object ) { 654273562Smarcel if ( callback.call( object[ name ], name, object[ name ] ) === false ) { 655273562Smarcel break; 656273562Smarcel } 657273562Smarcel } 658273562Smarcel } else { 659273562Smarcel for ( ; i < length; ) { 660273562Smarcel if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { 661273562Smarcel break; 662273562Smarcel } 663273562Smarcel } 664273562Smarcel } 665273562Smarcel } 666273562Smarcel 667273562Smarcel return object; 668273562Smarcel }, 669273562Smarcel 670273562Smarcel // Use native String.trim function wherever possible 671273562Smarcel trim: trim ? 672273562Smarcel function( text ) { 673273562Smarcel return text == null ? 674273562Smarcel "" : 675273562Smarcel trim.call( text ); 676273562Smarcel } : 677273562Smarcel 678273562Smarcel // Otherwise use our own trimming functionality 679273562Smarcel function( text ) { 680273562Smarcel return text == null ? 681273562Smarcel "" : 682273562Smarcel text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); 683273562Smarcel }, 684273562Smarcel 685273562Smarcel // results is for internal usage only 686273562Smarcel makeArray: function( array, results ) { 687273562Smarcel var ret = results || []; 688273562Smarcel 689273562Smarcel if ( array != null ) { 690273562Smarcel // The window, strings (and functions) also have 'length' 691273562Smarcel // The extra typeof function check is to prevent crashes 692273562Smarcel // in Safari 2 (See: #3039) 693273562Smarcel // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 694273562Smarcel var type = jQuery.type( array ); 695273562Smarcel 696273562Smarcel if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { 697273562Smarcel push.call( ret, array ); 698273562Smarcel } else { 699273562Smarcel jQuery.merge( ret, array ); 700273562Smarcel } 701273562Smarcel } 702273562Smarcel 703273562Smarcel return ret; 704273562Smarcel }, 705273562Smarcel 706273562Smarcel inArray: function( elem, array, i ) { 707273562Smarcel var len; 708273562Smarcel 709273562Smarcel if ( array ) { 710273562Smarcel if ( indexOf ) { 711273562Smarcel return indexOf.call( array, elem, i ); 712273562Smarcel } 713273562Smarcel 714273562Smarcel len = array.length; 715273562Smarcel i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; 716273562Smarcel 717273562Smarcel for ( ; i < len; i++ ) { 718273562Smarcel // Skip accessing in sparse arrays 719273562Smarcel if ( i in array && array[ i ] === elem ) { 720273562Smarcel return i; 721273562Smarcel } 722273562Smarcel } 723273562Smarcel } 724273562Smarcel 725273562Smarcel return -1; 726273562Smarcel }, 727273562Smarcel 728273562Smarcel merge: function( first, second ) { 729273562Smarcel var i = first.length, 730273562Smarcel j = 0; 731273562Smarcel 732273562Smarcel if ( typeof second.length === "number" ) { 733273562Smarcel for ( var l = second.length; j < l; j++ ) { 734273562Smarcel first[ i++ ] = second[ j ]; 735273562Smarcel } 736273562Smarcel 737273562Smarcel } else { 738273562Smarcel while ( second[j] !== undefined ) { 739273562Smarcel first[ i++ ] = second[ j++ ]; 740273562Smarcel } 741273562Smarcel } 742273562Smarcel 743273562Smarcel first.length = i; 744273562Smarcel 745273562Smarcel return first; 746273562Smarcel }, 747273562Smarcel 748273562Smarcel grep: function( elems, callback, inv ) { 749273562Smarcel var ret = [], retVal; 750273562Smarcel inv = !!inv; 751273562Smarcel 752273562Smarcel // Go through the array, only saving the items 753273562Smarcel // that pass the validator function 754273562Smarcel for ( var i = 0, length = elems.length; i < length; i++ ) { 755273562Smarcel retVal = !!callback( elems[ i ], i ); 756273562Smarcel if ( inv !== retVal ) { 757273562Smarcel ret.push( elems[ i ] ); 758273562Smarcel } 759273562Smarcel } 760273562Smarcel 761273562Smarcel return ret; 762273562Smarcel }, 763273562Smarcel 764273562Smarcel // arg is for internal usage only 765273562Smarcel map: function( elems, callback, arg ) { 766273562Smarcel var value, key, ret = [], 767273562Smarcel i = 0, 768273562Smarcel length = elems.length, 769273562Smarcel // jquery objects are treated as arrays 770273562Smarcel isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; 771273562Smarcel 772273562Smarcel // Go through the array, translating each of the items to their 773273562Smarcel if ( isArray ) { 774273562Smarcel for ( ; i < length; i++ ) { 775273562Smarcel value = callback( elems[ i ], i, arg ); 776273562Smarcel 777273562Smarcel if ( value != null ) { 778273562Smarcel ret[ ret.length ] = value; 779273562Smarcel } 780273562Smarcel } 781273562Smarcel 782273562Smarcel // Go through every key on the object, 783273562Smarcel } else { 784273562Smarcel for ( key in elems ) { 785273562Smarcel value = callback( elems[ key ], key, arg ); 786273562Smarcel 787273562Smarcel if ( value != null ) { 788273562Smarcel ret[ ret.length ] = value; 789273562Smarcel } 790273562Smarcel } 791273562Smarcel } 792273562Smarcel 793273562Smarcel // Flatten any nested arrays 794273562Smarcel return ret.concat.apply( [], ret ); 795273562Smarcel }, 796273562Smarcel 797273562Smarcel // A global GUID counter for objects 798273562Smarcel guid: 1, 799273562Smarcel 800273562Smarcel // Bind a function to a context, optionally partially applying any 801273562Smarcel // arguments. 802273562Smarcel proxy: function( fn, context ) { 803273562Smarcel if ( typeof context === "string" ) { 804273562Smarcel var tmp = fn[ context ]; 805273562Smarcel context = fn; 806273562Smarcel fn = tmp; 807273562Smarcel } 808273562Smarcel 809273562Smarcel // Quick check to determine if target is callable, in the spec 810273562Smarcel // this throws a TypeError, but we will just return undefined. 811273562Smarcel if ( !jQuery.isFunction( fn ) ) { 812273562Smarcel return undefined; 813273562Smarcel } 814273562Smarcel 815273562Smarcel // Simulated bind 816273562Smarcel var args = slice.call( arguments, 2 ), 817273562Smarcel proxy = function() { 818273562Smarcel return fn.apply( context, args.concat( slice.call( arguments ) ) ); 819273562Smarcel }; 820273562Smarcel 821273562Smarcel // Set the guid of unique handler to the same of original handler, so it can be removed 822273562Smarcel proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; 823273562Smarcel 824273562Smarcel return proxy; 825273562Smarcel }, 826273562Smarcel 827273562Smarcel // Mutifunctional method to get and set values to a collection 828273562Smarcel // The value/s can optionally be executed if it's a function 829273562Smarcel access: function( elems, key, value, exec, fn, pass ) { 830273562Smarcel var length = elems.length; 831273562Smarcel 832273562Smarcel // Setting many attributes 833273562Smarcel if ( typeof key === "object" ) { 834273562Smarcel for ( var k in key ) { 835273562Smarcel jQuery.access( elems, k, key[k], exec, fn, value ); 836273562Smarcel } 837273562Smarcel return elems; 838273562Smarcel } 839273562Smarcel 840273562Smarcel // Setting one attribute 841273562Smarcel if ( value !== undefined ) { 842273562Smarcel // Optionally, function values get executed if exec is true 843273562Smarcel exec = !pass && exec && jQuery.isFunction(value); 844273562Smarcel 845273562Smarcel for ( var i = 0; i < length; i++ ) { 846273562Smarcel fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); 847273562Smarcel } 848273562Smarcel 849273562Smarcel return elems; 850273562Smarcel } 851273562Smarcel 852273562Smarcel // Getting an attribute 853273562Smarcel return length ? fn( elems[0], key ) : undefined; 854273562Smarcel }, 855273562Smarcel 856273562Smarcel now: function() { 857273562Smarcel return ( new Date() ).getTime(); 858273562Smarcel }, 859273562Smarcel 860273562Smarcel // Use of jQuery.browser is frowned upon. 861273562Smarcel // More details: http://docs.jquery.com/Utilities/jQuery.browser 862273562Smarcel uaMatch: function( ua ) { 863273562Smarcel ua = ua.toLowerCase(); 864273562Smarcel 865273562Smarcel var match = rwebkit.exec( ua ) || 866273562Smarcel ropera.exec( ua ) || 867273562Smarcel rmsie.exec( ua ) || 868273562Smarcel ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || 869273562Smarcel []; 870273562Smarcel 871273562Smarcel return { browser: match[1] || "", version: match[2] || "0" }; 872273562Smarcel }, 873273562Smarcel 874273562Smarcel sub: function() { 875273562Smarcel function jQuerySub( selector, context ) { 876273562Smarcel return new jQuerySub.fn.init( selector, context ); 877273562Smarcel } 878273562Smarcel jQuery.extend( true, jQuerySub, this ); 879273562Smarcel jQuerySub.superclass = this; 880273562Smarcel jQuerySub.fn = jQuerySub.prototype = this(); 881273562Smarcel jQuerySub.fn.constructor = jQuerySub; 882273562Smarcel jQuerySub.sub = this.sub; 883273562Smarcel jQuerySub.fn.init = function init( selector, context ) { 884273562Smarcel if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { 885273562Smarcel context = jQuerySub( context ); 886273562Smarcel } 887273562Smarcel 888273562Smarcel return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); 889273562Smarcel }; 890273562Smarcel jQuerySub.fn.init.prototype = jQuerySub.fn; 891273562Smarcel var rootjQuerySub = jQuerySub(document); 892273562Smarcel return jQuerySub; 893273562Smarcel }, 894273562Smarcel 895273562Smarcel browser: {} 896273562Smarcel}); 897273562Smarcel 898273562Smarcel// Populate the class2type map 899273562SmarceljQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { 900273562Smarcel class2type[ "[object " + name + "]" ] = name.toLowerCase(); 901273562Smarcel}); 902273562Smarcel 903273562SmarcelbrowserMatch = jQuery.uaMatch( userAgent ); 904273562Smarcelif ( browserMatch.browser ) { 905273562Smarcel jQuery.browser[ browserMatch.browser ] = true; 906273562Smarcel jQuery.browser.version = browserMatch.version; 907273562Smarcel} 908273562Smarcel 909273562Smarcel// Deprecated, use jQuery.browser.webkit instead 910273562Smarcelif ( jQuery.browser.webkit ) { 911273562Smarcel jQuery.browser.safari = true; 912273562Smarcel} 913273562Smarcel 914273562Smarcel// IE doesn't match non-breaking spaces with \s 915273562Smarcelif ( rnotwhite.test( "\xA0" ) ) { 916273562Smarcel trimLeft = /^[\s\xA0]+/; 917273562Smarcel trimRight = /[\s\xA0]+$/; 918273562Smarcel} 919273562Smarcel 920273562Smarcel// All jQuery objects should point back to these 921273562SmarcelrootjQuery = jQuery(document); 922273562Smarcel 923273562Smarcel// Cleanup functions for the document ready method 924273562Smarcelif ( document.addEventListener ) { 925273562Smarcel DOMContentLoaded = function() { 926273562Smarcel document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); 927273562Smarcel jQuery.ready(); 928273562Smarcel }; 929273562Smarcel 930273562Smarcel} else if ( document.attachEvent ) { 931273562Smarcel DOMContentLoaded = function() { 932273562Smarcel // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). 933273562Smarcel if ( document.readyState === "complete" ) { 934273562Smarcel document.detachEvent( "onreadystatechange", DOMContentLoaded ); 935273562Smarcel jQuery.ready(); 936273562Smarcel } 937273562Smarcel }; 938273562Smarcel} 939273562Smarcel 940273562Smarcel// The DOM ready check for Internet Explorer 941273562Smarcelfunction doScrollCheck() { 942273562Smarcel if ( jQuery.isReady ) { 943273562Smarcel return; 944273562Smarcel } 945273562Smarcel 946273562Smarcel try { 947273562Smarcel // If IE is used, use the trick by Diego Perini 948273562Smarcel // http://javascript.nwbox.com/IEContentLoaded/ 949273562Smarcel document.documentElement.doScroll("left"); 950273562Smarcel } catch(e) { 951273562Smarcel setTimeout( doScrollCheck, 1 ); 952273562Smarcel return; 953273562Smarcel } 954273562Smarcel 955273562Smarcel // and execute any waiting functions 956273562Smarcel jQuery.ready(); 957273562Smarcel} 958273562Smarcel 959273562Smarcel// Expose jQuery as an AMD module, but only for AMD loaders that 960273562Smarcel// understand the issues with loading multiple versions of jQuery 961273562Smarcel// in a page that all might call define(). The loader will indicate 962273562Smarcel// they have special allowances for multiple jQuery versions by 963273562Smarcel// specifying define.amd.jQuery = true. Register as a named module, 964273562Smarcel// since jQuery can be concatenated with other files that may use define, 965273562Smarcel// but not use a proper concatenation script that understands anonymous 966273562Smarcel// AMD modules. A named AMD is safest and most robust way to register. 967273562Smarcel// Lowercase jquery is used because AMD module names are derived from 968273562Smarcel// file names, and jQuery is normally delivered in a lowercase file name. 969273562Smarcelif ( typeof define === "function" && define.amd && define.amd.jQuery ) { 970273562Smarcel define( "jquery", [], function () { return jQuery; } ); 971273562Smarcel} 972273562Smarcel 973273562Smarcelreturn jQuery; 974273562Smarcel 975273562Smarcel})(); 976273562Smarcel 977273562Smarcel 978273562Smarcel// String to Object flags format cache 979273562Smarcelvar flagsCache = {}; 980273562Smarcel 981273562Smarcel// Convert String-formatted flags into Object-formatted ones and store in cache 982273562Smarcelfunction createFlags( flags ) { 983273562Smarcel var object = flagsCache[ flags ] = {}, 984273562Smarcel i, length; 985273562Smarcel flags = flags.split( /\s+/ ); 986273562Smarcel for ( i = 0, length = flags.length; i < length; i++ ) { 987273562Smarcel object[ flags[i] ] = true; 988273562Smarcel } 989273562Smarcel return object; 990273562Smarcel} 991273562Smarcel 992273562Smarcel/* 993273562Smarcel * Create a callback list using the following parameters: 994273562Smarcel * 995273562Smarcel * flags: an optional list of space-separated flags that will change how 996273562Smarcel * the callback list behaves 997273562Smarcel * 998273562Smarcel * By default a callback list will act like an event callback list and can be 999273562Smarcel * "fired" multiple times. 1000273562Smarcel * 1001273562Smarcel * Possible flags: 1002273562Smarcel * 1003273562Smarcel * once: will ensure the callback list can only be fired once (like a Deferred) 1004273562Smarcel * 1005273562Smarcel * memory: will keep track of previous values and will call any callback added 1006273562Smarcel * after the list has been fired right away with the latest "memorized" 1007273562Smarcel * values (like a Deferred) 1008273562Smarcel * 1009273562Smarcel * unique: will ensure a callback can only be added once (no duplicate in the list) 1010273562Smarcel * 1011273562Smarcel * stopOnFalse: interrupt callings when a callback returns false 1012273562Smarcel * 1013273562Smarcel */ 1014273562SmarceljQuery.Callbacks = function( flags ) { 1015273562Smarcel 1016273562Smarcel // Convert flags from String-formatted to Object-formatted 1017273562Smarcel // (we check in cache first) 1018273562Smarcel flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; 1019273562Smarcel 1020273562Smarcel var // Actual callback list 1021273562Smarcel list = [], 1022273562Smarcel // Stack of fire calls for repeatable lists 1023273562Smarcel stack = [], 1024273562Smarcel // Last fire value (for non-forgettable lists) 1025273562Smarcel memory, 1026273562Smarcel // Flag to know if list is currently firing 1027273562Smarcel firing, 1028273562Smarcel // First callback to fire (used internally by add and fireWith) 1029273562Smarcel firingStart, 1030273562Smarcel // End of the loop when firing 1031273562Smarcel firingLength, 1032273562Smarcel // Index of currently firing callback (modified by remove if needed) 1033273562Smarcel firingIndex, 1034273562Smarcel // Add one or several callbacks to the list 1035273562Smarcel add = function( args ) { 1036273562Smarcel var i, 1037273562Smarcel length, 1038273562Smarcel elem, 1039273562Smarcel type, 1040273562Smarcel actual; 1041273562Smarcel for ( i = 0, length = args.length; i < length; i++ ) { 1042273562Smarcel elem = args[ i ]; 1043273562Smarcel type = jQuery.type( elem ); 1044273562Smarcel if ( type === "array" ) { 1045273562Smarcel // Inspect recursively 1046273562Smarcel add( elem ); 1047273562Smarcel } else if ( type === "function" ) { 1048273562Smarcel // Add if not in unique mode and callback is not in 1049273562Smarcel if ( !flags.unique || !self.has( elem ) ) { 1050273562Smarcel list.push( elem ); 1051273562Smarcel } 1052273562Smarcel } 1053273562Smarcel } 1054273562Smarcel }, 1055273562Smarcel // Fire callbacks 1056273562Smarcel fire = function( context, args ) { 1057273562Smarcel args = args || []; 1058273562Smarcel memory = !flags.memory || [ context, args ]; 1059273562Smarcel firing = true; 1060273562Smarcel firingIndex = firingStart || 0; 1061273562Smarcel firingStart = 0; 1062273562Smarcel firingLength = list.length; 1063273562Smarcel for ( ; list && firingIndex < firingLength; firingIndex++ ) { 1064273562Smarcel if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { 1065273562Smarcel memory = true; // Mark as halted 1066273562Smarcel break; 1067273562Smarcel } 1068273562Smarcel } 1069273562Smarcel firing = false; 1070273562Smarcel if ( list ) { 1071273562Smarcel if ( !flags.once ) { 1072273562Smarcel if ( stack && stack.length ) { 1073273562Smarcel memory = stack.shift(); 1074273562Smarcel self.fireWith( memory[ 0 ], memory[ 1 ] ); 1075273562Smarcel } 1076273562Smarcel } else if ( memory === true ) { 1077273562Smarcel self.disable(); 1078273562Smarcel } else { 1079273562Smarcel list = []; 1080273562Smarcel } 1081273562Smarcel } 1082273562Smarcel }, 1083273562Smarcel // Actual Callbacks object 1084273562Smarcel self = { 1085273562Smarcel // Add a callback or a collection of callbacks to the list 1086273562Smarcel add: function() { 1087273562Smarcel if ( list ) { 1088273562Smarcel var length = list.length; 1089273562Smarcel add( arguments ); 1090273562Smarcel // Do we need to add the callbacks to the 1091273562Smarcel // current firing batch? 1092273562Smarcel if ( firing ) { 1093273562Smarcel firingLength = list.length; 1094273562Smarcel // With memory, if we're not firing then 1095273562Smarcel // we should call right away, unless previous 1096273562Smarcel // firing was halted (stopOnFalse) 1097273562Smarcel } else if ( memory && memory !== true ) { 1098273562Smarcel firingStart = length; 1099273562Smarcel fire( memory[ 0 ], memory[ 1 ] ); 1100273562Smarcel } 1101273562Smarcel } 1102273562Smarcel return this; 1103273562Smarcel }, 1104273562Smarcel // Remove a callback from the list 1105273562Smarcel remove: function() { 1106273562Smarcel if ( list ) { 1107273562Smarcel var args = arguments, 1108273562Smarcel argIndex = 0, 1109273562Smarcel argLength = args.length; 1110273562Smarcel for ( ; argIndex < argLength ; argIndex++ ) { 1111273562Smarcel for ( var i = 0; i < list.length; i++ ) { 1112273562Smarcel if ( args[ argIndex ] === list[ i ] ) { 1113273562Smarcel // Handle firingIndex and firingLength 1114273562Smarcel if ( firing ) { 1115273562Smarcel if ( i <= firingLength ) { 1116273562Smarcel firingLength--; 1117273562Smarcel if ( i <= firingIndex ) { 1118273562Smarcel firingIndex--; 1119273562Smarcel } 1120273562Smarcel } 1121273562Smarcel } 1122273562Smarcel // Remove the element 1123273562Smarcel list.splice( i--, 1 ); 1124273562Smarcel // If we have some unicity property then 1125273562Smarcel // we only need to do this once 1126273562Smarcel if ( flags.unique ) { 1127273562Smarcel break; 1128273562Smarcel } 1129273562Smarcel } 1130273562Smarcel } 1131273562Smarcel } 1132273562Smarcel } 1133273562Smarcel return this; 1134273562Smarcel }, 1135273562Smarcel // Control if a given callback is in the list 1136273562Smarcel has: function( fn ) { 1137273562Smarcel if ( list ) { 1138273562Smarcel var i = 0, 1139273562Smarcel length = list.length; 1140273562Smarcel for ( ; i < length; i++ ) { 1141273562Smarcel if ( fn === list[ i ] ) { 1142273562Smarcel return true; 1143273562Smarcel } 1144273562Smarcel } 1145273562Smarcel } 1146273562Smarcel return false; 1147273562Smarcel }, 1148273562Smarcel // Remove all callbacks from the list 1149273562Smarcel empty: function() { 1150273562Smarcel list = []; 1151273562Smarcel return this; 1152273562Smarcel }, 1153273562Smarcel // Have the list do nothing anymore 1154273562Smarcel disable: function() { 1155273562Smarcel list = stack = memory = undefined; 1156273562Smarcel return this; 1157273562Smarcel }, 1158273562Smarcel // Is it disabled? 1159273562Smarcel disabled: function() { 1160273562Smarcel return !list; 1161273562Smarcel }, 1162273562Smarcel // Lock the list in its current state 1163273562Smarcel lock: function() { 1164273562Smarcel stack = undefined; 1165273562Smarcel if ( !memory || memory === true ) { 1166273562Smarcel self.disable(); 1167273562Smarcel } 1168273562Smarcel return this; 1169273562Smarcel }, 1170273562Smarcel // Is it locked? 1171273562Smarcel locked: function() { 1172273562Smarcel return !stack; 1173273562Smarcel }, 1174273562Smarcel // Call all callbacks with the given context and arguments 1175273562Smarcel fireWith: function( context, args ) { 1176273562Smarcel if ( stack ) { 1177273562Smarcel if ( firing ) { 1178273562Smarcel if ( !flags.once ) { 1179273562Smarcel stack.push( [ context, args ] ); 1180273562Smarcel } 1181273562Smarcel } else if ( !( flags.once && memory ) ) { 1182273562Smarcel fire( context, args ); 1183273562Smarcel } 1184273562Smarcel } 1185273562Smarcel return this; 1186273562Smarcel }, 1187273562Smarcel // Call all the callbacks with the given arguments 1188273562Smarcel fire: function() { 1189273562Smarcel self.fireWith( this, arguments ); 1190273562Smarcel return this; 1191273562Smarcel }, 1192273562Smarcel // To know if the callbacks have already been called at least once 1193273562Smarcel fired: function() { 1194273562Smarcel return !!memory; 1195273562Smarcel } 1196273562Smarcel }; 1197273562Smarcel 1198273562Smarcel return self; 1199273562Smarcel}; 1200273562Smarcel 1201273562Smarcel 1202273562Smarcel 1203273562Smarcel 1204273562Smarcelvar // Static reference to slice 1205273562Smarcel sliceDeferred = [].slice; 1206273562Smarcel 1207273562SmarceljQuery.extend({ 1208273562Smarcel 1209273562Smarcel Deferred: function( func ) { 1210273562Smarcel var doneList = jQuery.Callbacks( "once memory" ), 1211273562Smarcel failList = jQuery.Callbacks( "once memory" ), 1212273562Smarcel progressList = jQuery.Callbacks( "memory" ), 1213273562Smarcel state = "pending", 1214273562Smarcel lists = { 1215273562Smarcel resolve: doneList, 1216273562Smarcel reject: failList, 1217273562Smarcel notify: progressList 1218273562Smarcel }, 1219273562Smarcel promise = { 1220273562Smarcel done: doneList.add, 1221273562Smarcel fail: failList.add, 1222273562Smarcel progress: progressList.add, 1223273562Smarcel 1224273562Smarcel state: function() { 1225273562Smarcel return state; 1226273562Smarcel }, 1227273562Smarcel 1228273562Smarcel // Deprecated 1229273562Smarcel isResolved: doneList.fired, 1230273562Smarcel isRejected: failList.fired, 1231273562Smarcel 1232273562Smarcel then: function( doneCallbacks, failCallbacks, progressCallbacks ) { 1233273562Smarcel deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); 1234273562Smarcel return this; 1235273562Smarcel }, 1236273562Smarcel always: function() { 1237273562Smarcel return deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); 1238273562Smarcel }, 1239273562Smarcel pipe: function( fnDone, fnFail, fnProgress ) { 1240273562Smarcel return jQuery.Deferred(function( newDefer ) { 1241273562Smarcel jQuery.each( { 1242273562Smarcel done: [ fnDone, "resolve" ], 1243273562Smarcel fail: [ fnFail, "reject" ], 1244273562Smarcel progress: [ fnProgress, "notify" ] 1245273562Smarcel }, function( handler, data ) { 1246273562Smarcel var fn = data[ 0 ], 1247273562Smarcel action = data[ 1 ], 1248273562Smarcel returned; 1249273562Smarcel if ( jQuery.isFunction( fn ) ) { 1250273562Smarcel deferred[ handler ](function() { 1251273562Smarcel returned = fn.apply( this, arguments ); 1252273562Smarcel if ( returned && jQuery.isFunction( returned.promise ) ) { 1253273562Smarcel returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); 1254273562Smarcel } else { 1255273562Smarcel newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); 1256273562Smarcel } 1257273562Smarcel }); 1258273562Smarcel } else { 1259273562Smarcel deferred[ handler ]( newDefer[ action ] ); 1260273562Smarcel } 1261273562Smarcel }); 1262273562Smarcel }).promise(); 1263273562Smarcel }, 1264273562Smarcel // Get a promise for this deferred 1265273562Smarcel // If obj is provided, the promise aspect is added to the object 1266273562Smarcel promise: function( obj ) { 1267273562Smarcel if ( obj == null ) { 1268273562Smarcel obj = promise; 1269273562Smarcel } else { 1270273562Smarcel for ( var key in promise ) { 1271273562Smarcel obj[ key ] = promise[ key ]; 1272273562Smarcel } 1273273562Smarcel } 1274273562Smarcel return obj; 1275273562Smarcel } 1276273562Smarcel }, 1277273562Smarcel deferred = promise.promise({}), 1278273562Smarcel key; 1279273562Smarcel 1280273562Smarcel for ( key in lists ) { 1281273562Smarcel deferred[ key ] = lists[ key ].fire; 1282273562Smarcel deferred[ key + "With" ] = lists[ key ].fireWith; 1283273562Smarcel } 1284273562Smarcel 1285273562Smarcel // Handle state 1286273562Smarcel deferred.done( function() { 1287273562Smarcel state = "resolved"; 1288273562Smarcel }, failList.disable, progressList.lock ).fail( function() { 1289273562Smarcel state = "rejected"; 1290273562Smarcel }, doneList.disable, progressList.lock ); 1291273562Smarcel 1292273562Smarcel // Call given func if any 1293273562Smarcel if ( func ) { 1294273562Smarcel func.call( deferred, deferred ); 1295273562Smarcel } 1296273562Smarcel 1297273562Smarcel // All done! 1298273562Smarcel return deferred; 1299273562Smarcel }, 1300273562Smarcel 1301273562Smarcel // Deferred helper 1302273562Smarcel when: function( firstParam ) { 1303273562Smarcel var args = sliceDeferred.call( arguments, 0 ), 1304273562Smarcel i = 0, 1305273562Smarcel length = args.length, 1306273562Smarcel pValues = new Array( length ), 1307273562Smarcel count = length, 1308273562Smarcel pCount = length, 1309273562Smarcel deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? 1310273562Smarcel firstParam : 1311273562Smarcel jQuery.Deferred(), 1312273562Smarcel promise = deferred.promise(); 1313273562Smarcel function resolveFunc( i ) { 1314273562Smarcel return function( value ) { 1315273562Smarcel args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; 1316273562Smarcel if ( !( --count ) ) { 1317273562Smarcel deferred.resolveWith( deferred, args ); 1318273562Smarcel } 1319273562Smarcel }; 1320273562Smarcel } 1321273562Smarcel function progressFunc( i ) { 1322273562Smarcel return function( value ) { 1323273562Smarcel pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; 1324273562Smarcel deferred.notifyWith( promise, pValues ); 1325273562Smarcel }; 1326273562Smarcel } 1327273562Smarcel if ( length > 1 ) { 1328273562Smarcel for ( ; i < length; i++ ) { 1329273562Smarcel if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { 1330273562Smarcel args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); 1331273562Smarcel } else { 1332273562Smarcel --count; 1333273562Smarcel } 1334273562Smarcel } 1335273562Smarcel if ( !count ) { 1336273562Smarcel deferred.resolveWith( deferred, args ); 1337273562Smarcel } 1338273562Smarcel } else if ( deferred !== firstParam ) { 1339273562Smarcel deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); 1340273562Smarcel } 1341273562Smarcel return promise; 1342273562Smarcel } 1343273562Smarcel}); 1344273562Smarcel 1345273562Smarcel 1346273562Smarcel 1347273562Smarcel 1348273562SmarceljQuery.support = (function() { 1349273562Smarcel 1350273562Smarcel var div = document.createElement( "div" ), 1351273562Smarcel documentElement = document.documentElement, 1352273562Smarcel all, 1353273562Smarcel a, 1354273562Smarcel select, 1355273562Smarcel opt, 1356273562Smarcel input, 1357273562Smarcel marginDiv, 1358273562Smarcel support, 1359273562Smarcel fragment, 1360273562Smarcel body, 1361273562Smarcel testElementParent, 1362273562Smarcel testElement, 1363273562Smarcel testElementStyle, 1364273562Smarcel tds, 1365273562Smarcel events, 1366273562Smarcel eventName, 1367273562Smarcel i, 1368273562Smarcel isSupported; 1369273562Smarcel 1370273562Smarcel // Preliminary tests 1371273562Smarcel div.setAttribute("className", "t"); 1372273562Smarcel div.innerHTML = " <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/><nav></nav>"; 1373273562Smarcel 1374273562Smarcel 1375273562Smarcel all = div.getElementsByTagName( "*" ); 1376273562Smarcel a = div.getElementsByTagName( "a" )[ 0 ]; 1377273562Smarcel 1378273562Smarcel // Can't get basic test support 1379273562Smarcel if ( !all || !all.length || !a ) { 1380273562Smarcel return {}; 1381273562Smarcel } 1382273562Smarcel 1383273562Smarcel // First batch of supports tests 1384273562Smarcel select = document.createElement( "select" ); 1385273562Smarcel opt = select.appendChild( document.createElement("option") ); 1386273562Smarcel input = div.getElementsByTagName( "input" )[ 0 ]; 1387273562Smarcel 1388273562Smarcel support = { 1389273562Smarcel // IE strips leading whitespace when .innerHTML is used 1390273562Smarcel leadingWhitespace: ( div.firstChild.nodeType === 3 ), 1391273562Smarcel 1392273562Smarcel // Make sure that tbody elements aren't automatically inserted 1393273562Smarcel // IE will insert them into empty tables 1394273562Smarcel tbody: !div.getElementsByTagName( "tbody" ).length, 1395273562Smarcel 1396273562Smarcel // Make sure that link elements get serialized correctly by innerHTML 1397273562Smarcel // This requires a wrapper element in IE 1398273562Smarcel htmlSerialize: !!div.getElementsByTagName( "link" ).length, 1399273562Smarcel 1400273562Smarcel // Get the style information from getAttribute 1401273562Smarcel // (IE uses .cssText instead) 1402273562Smarcel style: /top/.test( a.getAttribute("style") ), 1403273562Smarcel 1404273562Smarcel // Make sure that URLs aren't manipulated 1405273562Smarcel // (IE normalizes it by default) 1406273562Smarcel hrefNormalized: ( a.getAttribute( "href" ) === "/a" ), 1407273562Smarcel 1408273562Smarcel // Make sure that element opacity exists 1409273562Smarcel // (IE uses filter instead) 1410273562Smarcel // Use a regex to work around a WebKit issue. See #5145 1411273562Smarcel opacity: /^0.55/.test( a.style.opacity ), 1412273562Smarcel 1413273562Smarcel // Verify style float existence 1414273562Smarcel // (IE uses styleFloat instead of cssFloat) 1415273562Smarcel cssFloat: !!a.style.cssFloat, 1416273562Smarcel 1417273562Smarcel // Make sure unknown elements (like HTML5 elems) are handled appropriately 1418273562Smarcel unknownElems: !!div.getElementsByTagName( "nav" ).length, 1419273562Smarcel 1420273562Smarcel // Make sure that if no value is specified for a checkbox 1421273562Smarcel // that it defaults to "on". 1422273562Smarcel // (WebKit defaults to "" instead) 1423273562Smarcel checkOn: ( input.value === "on" ), 1424273562Smarcel 1425273562Smarcel // Make sure that a selected-by-default option has a working selected property. 1426273562Smarcel // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) 1427273562Smarcel optSelected: opt.selected, 1428273562Smarcel 1429273562Smarcel // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) 1430273562Smarcel getSetAttribute: div.className !== "t", 1431273562Smarcel 1432273562Smarcel // Tests for enctype support on a form(#6743) 1433273562Smarcel enctype: !!document.createElement("form").enctype, 1434273562Smarcel 1435273562Smarcel // Will be defined later 1436273562Smarcel submitBubbles: true, 1437273562Smarcel changeBubbles: true, 1438273562Smarcel focusinBubbles: false, 1439273562Smarcel deleteExpando: true, 1440273562Smarcel noCloneEvent: true, 1441273562Smarcel inlineBlockNeedsLayout: false, 1442273562Smarcel shrinkWrapBlocks: false, 1443273562Smarcel reliableMarginRight: true 1444273562Smarcel }; 1445273562Smarcel 1446273562Smarcel // Make sure checked status is properly cloned 1447273562Smarcel input.checked = true; 1448273562Smarcel support.noCloneChecked = input.cloneNode( true ).checked; 1449273562Smarcel 1450273562Smarcel // Make sure that the options inside disabled selects aren't marked as disabled 1451273562Smarcel // (WebKit marks them as disabled) 1452273562Smarcel select.disabled = true; 1453273562Smarcel support.optDisabled = !opt.disabled; 1454273562Smarcel 1455273562Smarcel // Test to see if it's possible to delete an expando from an element 1456273562Smarcel // Fails in Internet Explorer 1457273562Smarcel try { 1458273562Smarcel delete div.test; 1459273562Smarcel } catch( e ) { 1460273562Smarcel support.deleteExpando = false; 1461273562Smarcel } 1462273562Smarcel 1463273562Smarcel if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { 1464273562Smarcel div.attachEvent( "onclick", function() { 1465273562Smarcel // Cloning a node shouldn't copy over any 1466273562Smarcel // bound event handlers (IE does this) 1467273562Smarcel support.noCloneEvent = false; 1468273562Smarcel }); 1469273562Smarcel div.cloneNode( true ).fireEvent( "onclick" ); 1470273562Smarcel } 1471273562Smarcel 1472273562Smarcel // Check if a radio maintains its value 1473273562Smarcel // after being appended to the DOM 1474273562Smarcel input = document.createElement("input"); 1475273562Smarcel input.value = "t"; 1476273562Smarcel input.setAttribute("type", "radio"); 1477273562Smarcel support.radioValue = input.value === "t"; 1478273562Smarcel 1479273562Smarcel input.setAttribute("checked", "checked"); 1480273562Smarcel div.appendChild( input ); 1481273562Smarcel fragment = document.createDocumentFragment(); 1482273562Smarcel fragment.appendChild( div.lastChild ); 1483273562Smarcel 1484273562Smarcel // WebKit doesn't clone checked state correctly in fragments 1485273562Smarcel support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; 1486273562Smarcel 1487273562Smarcel div.innerHTML = ""; 1488273562Smarcel 1489273562Smarcel // Figure out if the W3C box model works as expected 1490273562Smarcel div.style.width = div.style.paddingLeft = "1px"; 1491273562Smarcel 1492273562Smarcel // We don't want to do body-related feature tests on frameset 1493273562Smarcel // documents, which lack a body. So we use 1494273562Smarcel // document.getElementsByTagName("body")[0], which is undefined in 1495273562Smarcel // frameset documents, while document.body isn���t. (7398) 1496273562Smarcel body = document.getElementsByTagName("body")[ 0 ]; 1497273562Smarcel // We use our own, invisible, body unless the body is already present 1498273562Smarcel // in which case we use a div (#9239) 1499273562Smarcel testElement = document.createElement( body ? "div" : "body" ); 1500273562Smarcel testElementStyle = { 1501273562Smarcel visibility: "hidden", 1502273562Smarcel width: 0, 1503273562Smarcel height: 0, 1504273562Smarcel border: 0, 1505273562Smarcel margin: 0, 1506273562Smarcel background: "none" 1507273562Smarcel }; 1508273562Smarcel if ( body ) { 1509273562Smarcel jQuery.extend( testElementStyle, { 1510273562Smarcel position: "absolute", 1511273562Smarcel left: "-999px", 1512273562Smarcel top: "-999px" 1513273562Smarcel }); 1514273562Smarcel } 1515273562Smarcel for ( i in testElementStyle ) { 1516273562Smarcel testElement.style[ i ] = testElementStyle[ i ]; 1517273562Smarcel } 1518273562Smarcel testElement.appendChild( div ); 1519273562Smarcel testElementParent = body || documentElement; 1520273562Smarcel testElementParent.insertBefore( testElement, testElementParent.firstChild ); 1521273562Smarcel 1522273562Smarcel // Check if a disconnected checkbox will retain its checked 1523273562Smarcel // value of true after appended to the DOM (IE6/7) 1524273562Smarcel support.appendChecked = input.checked; 1525273562Smarcel 1526273562Smarcel support.boxModel = div.offsetWidth === 2; 1527273562Smarcel 1528273562Smarcel if ( "zoom" in div.style ) { 1529273562Smarcel // Check if natively block-level elements act like inline-block 1530273562Smarcel // elements when setting their display to 'inline' and giving 1531273562Smarcel // them layout 1532273562Smarcel // (IE < 8 does this) 1533273562Smarcel div.style.display = "inline"; 1534273562Smarcel div.style.zoom = 1; 1535273562Smarcel support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); 1536273562Smarcel 1537273562Smarcel // Check if elements with layout shrink-wrap their children 1538273562Smarcel // (IE 6 does this) 1539273562Smarcel div.style.display = ""; 1540273562Smarcel div.innerHTML = "<div style='width:4px;'></div>"; 1541273562Smarcel support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); 1542273562Smarcel } 1543273562Smarcel 1544273562Smarcel div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>"; 1545273562Smarcel tds = div.getElementsByTagName( "td" ); 1546273562Smarcel 1547273562Smarcel // Check if table cells still have offsetWidth/Height when they are set 1548273562Smarcel // to display:none and there are still other visible table cells in a 1549273562Smarcel // table row; if so, offsetWidth/Height are not reliable for use when 1550273562Smarcel // determining if an element has been hidden directly using 1551273562Smarcel // display:none (it is still safe to use offsets if a parent element is 1552273562Smarcel // hidden; don safety goggles and see bug #4512 for more information). 1553273562Smarcel // (only IE 8 fails this test) 1554273562Smarcel isSupported = ( tds[ 0 ].offsetHeight === 0 ); 1555273562Smarcel 1556273562Smarcel tds[ 0 ].style.display = ""; 1557273562Smarcel tds[ 1 ].style.display = "none"; 1558273562Smarcel 1559273562Smarcel // Check if empty table cells still have offsetWidth/Height 1560273562Smarcel // (IE < 8 fail this test) 1561273562Smarcel support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); 1562273562Smarcel div.innerHTML = ""; 1563273562Smarcel 1564273562Smarcel // Check if div with explicit width and no margin-right incorrectly 1565273562Smarcel // gets computed margin-right based on width of container. For more 1566273562Smarcel // info see bug #3333 1567273562Smarcel // Fails in WebKit before Feb 2011 nightlies 1568273562Smarcel // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right 1569273562Smarcel if ( document.defaultView && document.defaultView.getComputedStyle ) { 1570273562Smarcel marginDiv = document.createElement( "div" ); 1571273562Smarcel marginDiv.style.width = "0"; 1572273562Smarcel marginDiv.style.marginRight = "0"; 1573273562Smarcel div.appendChild( marginDiv ); 1574273562Smarcel support.reliableMarginRight = 1575273562Smarcel ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; 1576273562Smarcel } 1577273562Smarcel 1578273562Smarcel // Technique from Juriy Zaytsev 1579273562Smarcel // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ 1580273562Smarcel // We only care about the case where non-standard event systems 1581273562Smarcel // are used, namely in IE. Short-circuiting here helps us to 1582273562Smarcel // avoid an eval call (in setAttribute) which can cause CSP 1583273562Smarcel // to go haywire. See: https://developer.mozilla.org/en/Security/CSP 1584273562Smarcel if ( div.attachEvent ) { 1585273562Smarcel for( i in { 1586273562Smarcel submit: 1, 1587273562Smarcel change: 1, 1588273562Smarcel focusin: 1 1589273562Smarcel } ) { 1590273562Smarcel eventName = "on" + i; 1591273562Smarcel isSupported = ( eventName in div ); 1592273562Smarcel if ( !isSupported ) { 1593273562Smarcel div.setAttribute( eventName, "return;" ); 1594273562Smarcel isSupported = ( typeof div[ eventName ] === "function" ); 1595273562Smarcel } 1596273562Smarcel support[ i + "Bubbles" ] = isSupported; 1597273562Smarcel } 1598273562Smarcel } 1599273562Smarcel 1600273562Smarcel // Run fixed position tests at doc ready to avoid a crash 1601273562Smarcel // related to the invisible body in IE8 1602273562Smarcel jQuery(function() { 1603273562Smarcel var container, outer, inner, table, td, offsetSupport, 1604273562Smarcel conMarginTop = 1, 1605273562Smarcel ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;", 1606273562Smarcel vb = "visibility:hidden;border:0;", 1607273562Smarcel style = "style='" + ptlm + "border:5px solid #000;padding:0;'", 1608273562Smarcel html = "<div " + style + "><div></div></div>" + 1609273562Smarcel "<table " + style + " cellpadding='0' cellspacing='0'>" + 1610273562Smarcel "<tr><td></td></tr></table>"; 1611273562Smarcel 1612273562Smarcel // Reconstruct a container 1613273562Smarcel body = document.getElementsByTagName("body")[0]; 1614273562Smarcel if ( !body ) { 1615273562Smarcel // Return for frameset docs that don't have a body 1616273562Smarcel // These tests cannot be done 1617273562Smarcel return; 1618273562Smarcel } 1619273562Smarcel 1620273562Smarcel container = document.createElement("div"); 1621273562Smarcel container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; 1622273562Smarcel body.insertBefore( container, body.firstChild ); 1623273562Smarcel 1624273562Smarcel // Construct a test element 1625273562Smarcel testElement = document.createElement("div"); 1626273562Smarcel testElement.style.cssText = ptlm + vb; 1627273562Smarcel 1628273562Smarcel testElement.innerHTML = html; 1629273562Smarcel container.appendChild( testElement ); 1630273562Smarcel outer = testElement.firstChild; 1631273562Smarcel inner = outer.firstChild; 1632273562Smarcel td = outer.nextSibling.firstChild.firstChild; 1633273562Smarcel 1634273562Smarcel offsetSupport = { 1635273562Smarcel doesNotAddBorder: ( inner.offsetTop !== 5 ), 1636273562Smarcel doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) 1637273562Smarcel }; 1638273562Smarcel 1639273562Smarcel inner.style.position = "fixed"; 1640273562Smarcel inner.style.top = "20px"; 1641273562Smarcel 1642273562Smarcel // safari subtracts parent border width here which is 5px 1643273562Smarcel offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); 1644273562Smarcel inner.style.position = inner.style.top = ""; 1645273562Smarcel 1646273562Smarcel outer.style.overflow = "hidden"; 1647273562Smarcel outer.style.position = "relative"; 1648273562Smarcel 1649273562Smarcel offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); 1650273562Smarcel offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); 1651273562Smarcel 1652273562Smarcel body.removeChild( container ); 1653273562Smarcel testElement = container = null; 1654273562Smarcel 1655273562Smarcel jQuery.extend( support, offsetSupport ); 1656273562Smarcel }); 1657273562Smarcel 1658273562Smarcel testElement.innerHTML = ""; 1659273562Smarcel testElementParent.removeChild( testElement ); 1660273562Smarcel 1661273562Smarcel // Null connected elements to avoid leaks in IE 1662273562Smarcel testElement = fragment = select = opt = body = marginDiv = div = input = null; 1663273562Smarcel 1664273562Smarcel return support; 1665273562Smarcel})(); 1666273562Smarcel 1667273562Smarcel// Keep track of boxModel 1668273562SmarceljQuery.boxModel = jQuery.support.boxModel; 1669273562Smarcel 1670273562Smarcel 1671273562Smarcel 1672273562Smarcel 1673273562Smarcelvar rbrace = /^(?:\{.*\}|\[.*\])$/, 1674273562Smarcel rmultiDash = /([A-Z])/g; 1675273562Smarcel 1676273562SmarceljQuery.extend({ 1677273562Smarcel cache: {}, 1678273562Smarcel 1679273562Smarcel // Please use with caution 1680273562Smarcel uuid: 0, 1681273562Smarcel 1682273562Smarcel // Unique for each copy of jQuery on the page 1683273562Smarcel // Non-digits removed to match rinlinejQuery 1684273562Smarcel expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), 1685273562Smarcel 1686273562Smarcel // The following elements throw uncatchable exceptions if you 1687273562Smarcel // attempt to add expando properties to them. 1688273562Smarcel noData: { 1689273562Smarcel "embed": true, 1690273562Smarcel // Ban all objects except for Flash (which handle expandos) 1691273562Smarcel "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", 1692273562Smarcel "applet": true 1693273562Smarcel }, 1694273562Smarcel 1695273562Smarcel hasData: function( elem ) { 1696273562Smarcel elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; 1697273562Smarcel return !!elem && !isEmptyDataObject( elem ); 1698273562Smarcel }, 1699273562Smarcel 1700273562Smarcel data: function( elem, name, data, pvt /* Internal Use Only */ ) { 1701273562Smarcel if ( !jQuery.acceptData( elem ) ) { 1702273562Smarcel return; 1703273562Smarcel } 1704273562Smarcel 1705273562Smarcel var privateCache, thisCache, ret, 1706273562Smarcel internalKey = jQuery.expando, 1707273562Smarcel getByName = typeof name === "string", 1708273562Smarcel 1709273562Smarcel // We have to handle DOM nodes and JS objects differently because IE6-7 1710273562Smarcel // can't GC object references properly across the DOM-JS boundary 1711273562Smarcel isNode = elem.nodeType, 1712273562Smarcel 1713273562Smarcel // Only DOM nodes need the global jQuery cache; JS object data is 1714273562Smarcel // attached directly to the object so GC can occur automatically 1715273562Smarcel cache = isNode ? jQuery.cache : elem, 1716273562Smarcel 1717273562Smarcel // Only defining an ID for JS objects if its cache already exists allows 1718273562Smarcel // the code to shortcut on the same path as a DOM node with no cache 1719273562Smarcel id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando, 1720273562Smarcel isEvents = name === "events"; 1721273562Smarcel 1722273562Smarcel // Avoid doing any more work than we need to when trying to get data on an 1723273562Smarcel // object that has no data at all 1724273562Smarcel if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { 1725273562Smarcel return; 1726273562Smarcel } 1727273562Smarcel 1728273562Smarcel if ( !id ) { 1729273562Smarcel // Only DOM nodes need a new unique ID for each element since their data 1730273562Smarcel // ends up in the global cache 1731273562Smarcel if ( isNode ) { 1732273562Smarcel elem[ jQuery.expando ] = id = ++jQuery.uuid; 1733273562Smarcel } else { 1734273562Smarcel id = jQuery.expando; 1735273562Smarcel } 1736273562Smarcel } 1737273562Smarcel 1738273562Smarcel if ( !cache[ id ] ) { 1739273562Smarcel cache[ id ] = {}; 1740273562Smarcel 1741273562Smarcel // Avoids exposing jQuery metadata on plain JS objects when the object 1742273562Smarcel // is serialized using JSON.stringify 1743273562Smarcel if ( !isNode ) { 1744273562Smarcel cache[ id ].toJSON = jQuery.noop; 1745273562Smarcel } 1746273562Smarcel } 1747273562Smarcel 1748273562Smarcel // An object can be passed to jQuery.data instead of a key/value pair; this gets 1749273562Smarcel // shallow copied over onto the existing cache 1750273562Smarcel if ( typeof name === "object" || typeof name === "function" ) { 1751273562Smarcel if ( pvt ) { 1752273562Smarcel cache[ id ] = jQuery.extend( cache[ id ], name ); 1753273562Smarcel } else { 1754273562Smarcel cache[ id ].data = jQuery.extend( cache[ id ].data, name ); 1755273562Smarcel } 1756273562Smarcel } 1757273562Smarcel 1758273562Smarcel privateCache = thisCache = cache[ id ]; 1759273562Smarcel 1760273562Smarcel // jQuery data() is stored in a separate object inside the object's internal data 1761273562Smarcel // cache in order to avoid key collisions between internal data and user-defined 1762273562Smarcel // data. 1763273562Smarcel if ( !pvt ) { 1764273562Smarcel if ( !thisCache.data ) { 1765273562Smarcel thisCache.data = {}; 1766273562Smarcel } 1767273562Smarcel 1768273562Smarcel thisCache = thisCache.data; 1769273562Smarcel } 1770273562Smarcel 1771273562Smarcel if ( data !== undefined ) { 1772273562Smarcel thisCache[ jQuery.camelCase( name ) ] = data; 1773273562Smarcel } 1774273562Smarcel 1775273562Smarcel // Users should not attempt to inspect the internal events object using jQuery.data, 1776273562Smarcel // it is undocumented and subject to change. But does anyone listen? No. 1777273562Smarcel if ( isEvents && !thisCache[ name ] ) { 1778273562Smarcel return privateCache.events; 1779273562Smarcel } 1780273562Smarcel 1781273562Smarcel // Check for both converted-to-camel and non-converted data property names 1782273562Smarcel // If a data property was specified 1783273562Smarcel if ( getByName ) { 1784273562Smarcel 1785273562Smarcel // First Try to find as-is property data 1786273562Smarcel ret = thisCache[ name ]; 1787273562Smarcel 1788273562Smarcel // Test for null|undefined property data 1789273562Smarcel if ( ret == null ) { 1790273562Smarcel 1791273562Smarcel // Try to find the camelCased property 1792273562Smarcel ret = thisCache[ jQuery.camelCase( name ) ]; 1793273562Smarcel } 1794273562Smarcel } else { 1795273562Smarcel ret = thisCache; 1796273562Smarcel } 1797273562Smarcel 1798273562Smarcel return ret; 1799273562Smarcel }, 1800273562Smarcel 1801273562Smarcel removeData: function( elem, name, pvt /* Internal Use Only */ ) { 1802273562Smarcel if ( !jQuery.acceptData( elem ) ) { 1803273562Smarcel return; 1804273562Smarcel } 1805273562Smarcel 1806273562Smarcel var thisCache, i, l, 1807273562Smarcel 1808273562Smarcel // Reference to internal data cache key 1809273562Smarcel internalKey = jQuery.expando, 1810273562Smarcel 1811273562Smarcel isNode = elem.nodeType, 1812273562Smarcel 1813273562Smarcel // See jQuery.data for more information 1814273562Smarcel cache = isNode ? jQuery.cache : elem, 1815273562Smarcel 1816273562Smarcel // See jQuery.data for more information 1817273562Smarcel id = isNode ? elem[ jQuery.expando ] : jQuery.expando; 1818273562Smarcel 1819273562Smarcel // If there is already no cache entry for this object, there is no 1820273562Smarcel // purpose in continuing 1821273562Smarcel if ( !cache[ id ] ) { 1822273562Smarcel return; 1823273562Smarcel } 1824273562Smarcel 1825273562Smarcel if ( name ) { 1826273562Smarcel 1827273562Smarcel thisCache = pvt ? cache[ id ] : cache[ id ].data; 1828273562Smarcel 1829273562Smarcel if ( thisCache ) { 1830273562Smarcel 1831273562Smarcel // Support space separated names 1832273562Smarcel if ( jQuery.isArray( name ) ) { 1833273562Smarcel name = name; 1834273562Smarcel } else if ( name in thisCache ) { 1835273562Smarcel name = [ name ]; 1836273562Smarcel } else { 1837273562Smarcel 1838273562Smarcel // split the camel cased version by spaces 1839273562Smarcel name = jQuery.camelCase( name ); 1840273562Smarcel if ( name in thisCache ) { 1841273562Smarcel name = [ name ]; 1842273562Smarcel } else { 1843273562Smarcel name = name.split( " " ); 1844273562Smarcel } 1845273562Smarcel } 1846273562Smarcel 1847273562Smarcel for ( i = 0, l = name.length; i < l; i++ ) { 1848273562Smarcel delete thisCache[ name[i] ]; 1849273562Smarcel } 1850273562Smarcel 1851273562Smarcel // If there is no data left in the cache, we want to continue 1852273562Smarcel // and let the cache object itself get destroyed 1853273562Smarcel if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { 1854273562Smarcel return; 1855273562Smarcel } 1856273562Smarcel } 1857273562Smarcel } 1858273562Smarcel 1859273562Smarcel // See jQuery.data for more information 1860273562Smarcel if ( !pvt ) { 1861273562Smarcel delete cache[ id ].data; 1862273562Smarcel 1863273562Smarcel // Don't destroy the parent cache unless the internal data object 1864273562Smarcel // had been the only thing left in it 1865273562Smarcel if ( !isEmptyDataObject(cache[ id ]) ) { 1866273562Smarcel return; 1867273562Smarcel } 1868273562Smarcel } 1869273562Smarcel 1870273562Smarcel // Browsers that fail expando deletion also refuse to delete expandos on 1871273562Smarcel // the window, but it will allow it on all other JS objects; other browsers 1872273562Smarcel // don't care 1873273562Smarcel // Ensure that `cache` is not a window object #10080 1874273562Smarcel if ( jQuery.support.deleteExpando || !cache.setInterval ) { 1875273562Smarcel delete cache[ id ]; 1876273562Smarcel } else { 1877273562Smarcel cache[ id ] = null; 1878273562Smarcel } 1879273562Smarcel 1880273562Smarcel // We destroyed the cache and need to eliminate the expando on the node to avoid 1881273562Smarcel // false lookups in the cache for entries that no longer exist 1882273562Smarcel if ( isNode ) { 1883273562Smarcel // IE does not allow us to delete expando properties from nodes, 1884273562Smarcel // nor does it have a removeAttribute function on Document nodes; 1885273562Smarcel // we must handle all of these cases 1886273562Smarcel if ( jQuery.support.deleteExpando ) { 1887273562Smarcel delete elem[ jQuery.expando ]; 1888273562Smarcel } else if ( elem.removeAttribute ) { 1889273562Smarcel elem.removeAttribute( jQuery.expando ); 1890273562Smarcel } else { 1891273562Smarcel elem[ jQuery.expando ] = null; 1892273562Smarcel } 1893273562Smarcel } 1894273562Smarcel }, 1895273562Smarcel 1896273562Smarcel // For internal use only. 1897273562Smarcel _data: function( elem, name, data ) { 1898273562Smarcel return jQuery.data( elem, name, data, true ); 1899273562Smarcel }, 1900273562Smarcel 1901273562Smarcel // A method for determining if a DOM node can handle the data expando 1902273562Smarcel acceptData: function( elem ) { 1903273562Smarcel if ( elem.nodeName ) { 1904273562Smarcel var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; 1905273562Smarcel 1906273562Smarcel if ( match ) { 1907273562Smarcel return !(match === true || elem.getAttribute("classid") !== match); 1908273562Smarcel } 1909273562Smarcel } 1910273562Smarcel 1911273562Smarcel return true; 1912273562Smarcel } 1913273562Smarcel}); 1914273562Smarcel 1915273562SmarceljQuery.fn.extend({ 1916273562Smarcel data: function( key, value ) { 1917273562Smarcel var parts, attr, name, 1918273562Smarcel data = null; 1919273562Smarcel 1920273562Smarcel if ( typeof key === "undefined" ) { 1921273562Smarcel if ( this.length ) { 1922273562Smarcel data = jQuery.data( this[0] ); 1923273562Smarcel 1924273562Smarcel if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) { 1925273562Smarcel attr = this[0].attributes; 1926273562Smarcel for ( var i = 0, l = attr.length; i < l; i++ ) { 1927273562Smarcel name = attr[i].name; 1928273562Smarcel 1929273562Smarcel if ( name.indexOf( "data-" ) === 0 ) { 1930273562Smarcel name = jQuery.camelCase( name.substring(5) ); 1931273562Smarcel 1932273562Smarcel dataAttr( this[0], name, data[ name ] ); 1933273562Smarcel } 1934273562Smarcel } 1935273562Smarcel jQuery._data( this[0], "parsedAttrs", true ); 1936273562Smarcel } 1937273562Smarcel } 1938273562Smarcel 1939273562Smarcel return data; 1940273562Smarcel 1941273562Smarcel } else if ( typeof key === "object" ) { 1942273562Smarcel return this.each(function() { 1943273562Smarcel jQuery.data( this, key ); 1944273562Smarcel }); 1945273562Smarcel } 1946273562Smarcel 1947273562Smarcel parts = key.split("."); 1948273562Smarcel parts[1] = parts[1] ? "." + parts[1] : ""; 1949273562Smarcel 1950273562Smarcel if ( value === undefined ) { 1951273562Smarcel data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); 1952273562Smarcel 1953273562Smarcel // Try to fetch any internally stored data first 1954273562Smarcel if ( data === undefined && this.length ) { 1955273562Smarcel data = jQuery.data( this[0], key ); 1956273562Smarcel data = dataAttr( this[0], key, data ); 1957273562Smarcel } 1958273562Smarcel 1959273562Smarcel return data === undefined && parts[1] ? 1960273562Smarcel this.data( parts[0] ) : 1961273562Smarcel data; 1962273562Smarcel 1963273562Smarcel } else { 1964273562Smarcel return this.each(function() { 1965273562Smarcel var $this = jQuery( this ), 1966273562Smarcel args = [ parts[0], value ]; 1967273562Smarcel 1968273562Smarcel $this.triggerHandler( "setData" + parts[1] + "!", args ); 1969273562Smarcel jQuery.data( this, key, value ); 1970273562Smarcel $this.triggerHandler( "changeData" + parts[1] + "!", args ); 1971273562Smarcel }); 1972273562Smarcel } 1973273562Smarcel }, 1974273562Smarcel 1975273562Smarcel removeData: function( key ) { 1976273562Smarcel return this.each(function() { 1977273562Smarcel jQuery.removeData( this, key ); 1978273562Smarcel }); 1979273562Smarcel } 1980273562Smarcel}); 1981273562Smarcel 1982273562Smarcelfunction dataAttr( elem, key, data ) { 1983273562Smarcel // If nothing was found internally, try to fetch any 1984273562Smarcel // data from the HTML5 data-* attribute 1985273562Smarcel if ( data === undefined && elem.nodeType === 1 ) { 1986273562Smarcel 1987273562Smarcel var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); 1988273562Smarcel 1989273562Smarcel data = elem.getAttribute( name ); 1990273562Smarcel 1991273562Smarcel if ( typeof data === "string" ) { 1992273562Smarcel try { 1993273562Smarcel data = data === "true" ? true : 1994273562Smarcel data === "false" ? false : 1995273562Smarcel data === "null" ? null : 1996273562Smarcel jQuery.isNumeric( data ) ? parseFloat( data ) : 1997273562Smarcel rbrace.test( data ) ? jQuery.parseJSON( data ) : 1998273562Smarcel data; 1999273562Smarcel } catch( e ) {} 2000273562Smarcel 2001273562Smarcel // Make sure we set the data so it isn't changed later 2002273562Smarcel jQuery.data( elem, key, data ); 2003273562Smarcel 2004273562Smarcel } else { 2005273562Smarcel data = undefined; 2006273562Smarcel } 2007273562Smarcel } 2008273562Smarcel 2009273562Smarcel return data; 2010273562Smarcel} 2011273562Smarcel 2012273562Smarcel// checks a cache object for emptiness 2013273562Smarcelfunction isEmptyDataObject( obj ) { 2014273562Smarcel for ( var name in obj ) { 2015273562Smarcel 2016273562Smarcel // if the public data object is empty, the private is still empty 2017273562Smarcel if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { 2018273562Smarcel continue; 2019273562Smarcel } 2020273562Smarcel if ( name !== "toJSON" ) { 2021273562Smarcel return false; 2022273562Smarcel } 2023273562Smarcel } 2024273562Smarcel 2025273562Smarcel return true; 2026273562Smarcel} 2027273562Smarcel 2028273562Smarcel 2029273562Smarcel 2030273562Smarcel 2031273562Smarcelfunction handleQueueMarkDefer( elem, type, src ) { 2032273562Smarcel var deferDataKey = type + "defer", 2033273562Smarcel queueDataKey = type + "queue", 2034273562Smarcel markDataKey = type + "mark", 2035273562Smarcel defer = jQuery._data( elem, deferDataKey ); 2036273562Smarcel if ( defer && 2037273562Smarcel ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && 2038273562Smarcel ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { 2039273562Smarcel // Give room for hard-coded callbacks to fire first 2040273562Smarcel // and eventually mark/queue something else on the element 2041273562Smarcel setTimeout( function() { 2042273562Smarcel if ( !jQuery._data( elem, queueDataKey ) && 2043273562Smarcel !jQuery._data( elem, markDataKey ) ) { 2044273562Smarcel jQuery.removeData( elem, deferDataKey, true ); 2045273562Smarcel defer.fire(); 2046273562Smarcel } 2047273562Smarcel }, 0 ); 2048273562Smarcel } 2049273562Smarcel} 2050273562Smarcel 2051273562SmarceljQuery.extend({ 2052273562Smarcel 2053273562Smarcel _mark: function( elem, type ) { 2054273562Smarcel if ( elem ) { 2055273562Smarcel type = ( type || "fx" ) + "mark"; 2056273562Smarcel jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); 2057273562Smarcel } 2058273562Smarcel }, 2059273562Smarcel 2060273562Smarcel _unmark: function( force, elem, type ) { 2061273562Smarcel if ( force !== true ) { 2062273562Smarcel type = elem; 2063273562Smarcel elem = force; 2064273562Smarcel force = false; 2065273562Smarcel } 2066273562Smarcel if ( elem ) { 2067273562Smarcel type = type || "fx"; 2068273562Smarcel var key = type + "mark", 2069273562Smarcel count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); 2070273562Smarcel if ( count ) { 2071273562Smarcel jQuery._data( elem, key, count ); 2072273562Smarcel } else { 2073273562Smarcel jQuery.removeData( elem, key, true ); 2074273562Smarcel handleQueueMarkDefer( elem, type, "mark" ); 2075273562Smarcel } 2076273562Smarcel } 2077273562Smarcel }, 2078273562Smarcel 2079273562Smarcel queue: function( elem, type, data ) { 2080273562Smarcel var q; 2081273562Smarcel if ( elem ) { 2082273562Smarcel type = ( type || "fx" ) + "queue"; 2083273562Smarcel q = jQuery._data( elem, type ); 2084273562Smarcel 2085273562Smarcel // Speed up dequeue by getting out quickly if this is just a lookup 2086273562Smarcel if ( data ) { 2087273562Smarcel if ( !q || jQuery.isArray(data) ) { 2088273562Smarcel q = jQuery._data( elem, type, jQuery.makeArray(data) ); 2089273562Smarcel } else { 2090273562Smarcel q.push( data ); 2091273562Smarcel } 2092273562Smarcel } 2093273562Smarcel return q || []; 2094273562Smarcel } 2095273562Smarcel }, 2096273562Smarcel 2097273562Smarcel dequeue: function( elem, type ) { 2098273562Smarcel type = type || "fx"; 2099273562Smarcel 2100273562Smarcel var queue = jQuery.queue( elem, type ), 2101273562Smarcel fn = queue.shift(), 2102273562Smarcel hooks = {}; 2103273562Smarcel 2104273562Smarcel // If the fx queue is dequeued, always remove the progress sentinel 2105273562Smarcel if ( fn === "inprogress" ) { 2106273562Smarcel fn = queue.shift(); 2107273562Smarcel } 2108273562Smarcel 2109273562Smarcel if ( fn ) { 2110273562Smarcel // Add a progress sentinel to prevent the fx queue from being 2111273562Smarcel // automatically dequeued 2112273562Smarcel if ( type === "fx" ) { 2113273562Smarcel queue.unshift( "inprogress" ); 2114273562Smarcel } 2115273562Smarcel 2116273562Smarcel jQuery._data( elem, type + ".run", hooks ); 2117273562Smarcel fn.call( elem, function() { 2118273562Smarcel jQuery.dequeue( elem, type ); 2119273562Smarcel }, hooks ); 2120273562Smarcel } 2121273562Smarcel 2122273562Smarcel if ( !queue.length ) { 2123273562Smarcel jQuery.removeData( elem, type + "queue " + type + ".run", true ); 2124273562Smarcel handleQueueMarkDefer( elem, type, "queue" ); 2125273562Smarcel } 2126273562Smarcel } 2127273562Smarcel}); 2128273562Smarcel 2129273562SmarceljQuery.fn.extend({ 2130273562Smarcel queue: function( type, data ) { 2131273562Smarcel if ( typeof type !== "string" ) { 2132273562Smarcel data = type; 2133273562Smarcel type = "fx"; 2134273562Smarcel } 2135273562Smarcel 2136273562Smarcel if ( data === undefined ) { 2137273562Smarcel return jQuery.queue( this[0], type ); 2138273562Smarcel } 2139273562Smarcel return this.each(function() { 2140273562Smarcel var queue = jQuery.queue( this, type, data ); 2141273562Smarcel 2142273562Smarcel if ( type === "fx" && queue[0] !== "inprogress" ) { 2143273562Smarcel jQuery.dequeue( this, type ); 2144273562Smarcel } 2145273562Smarcel }); 2146273562Smarcel }, 2147273562Smarcel dequeue: function( type ) { 2148273562Smarcel return this.each(function() { 2149273562Smarcel jQuery.dequeue( this, type ); 2150273562Smarcel }); 2151273562Smarcel }, 2152273562Smarcel // Based off of the plugin by Clint Helfers, with permission. 2153273562Smarcel // http://blindsignals.com/index.php/2009/07/jquery-delay/ 2154273562Smarcel delay: function( time, type ) { 2155273562Smarcel time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; 2156273562Smarcel type = type || "fx"; 2157273562Smarcel 2158273562Smarcel return this.queue( type, function( next, hooks ) { 2159273562Smarcel var timeout = setTimeout( next, time ); 2160273562Smarcel hooks.stop = function() { 2161273562Smarcel clearTimeout( timeout ); 2162273562Smarcel }; 2163273562Smarcel }); 2164273562Smarcel }, 2165273562Smarcel clearQueue: function( type ) { 2166273562Smarcel return this.queue( type || "fx", [] ); 2167273562Smarcel }, 2168273562Smarcel // Get a promise resolved when queues of a certain type 2169273562Smarcel // are emptied (fx is the type by default) 2170273562Smarcel promise: function( type, object ) { 2171273562Smarcel if ( typeof type !== "string" ) { 2172273562Smarcel object = type; 2173273562Smarcel type = undefined; 2174273562Smarcel } 2175273562Smarcel type = type || "fx"; 2176273562Smarcel var defer = jQuery.Deferred(), 2177273562Smarcel elements = this, 2178273562Smarcel i = elements.length, 2179273562Smarcel count = 1, 2180273562Smarcel deferDataKey = type + "defer", 2181273562Smarcel queueDataKey = type + "queue", 2182273562Smarcel markDataKey = type + "mark", 2183273562Smarcel tmp; 2184273562Smarcel function resolve() { 2185273562Smarcel if ( !( --count ) ) { 2186273562Smarcel defer.resolveWith( elements, [ elements ] ); 2187273562Smarcel } 2188273562Smarcel } 2189273562Smarcel while( i-- ) { 2190273562Smarcel if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || 2191273562Smarcel ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || 2192273562Smarcel jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && 2193273562Smarcel jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { 2194273562Smarcel count++; 2195273562Smarcel tmp.add( resolve ); 2196273562Smarcel } 2197273562Smarcel } 2198273562Smarcel resolve(); 2199273562Smarcel return defer.promise(); 2200273562Smarcel } 2201273562Smarcel}); 2202273562Smarcel 2203273562Smarcel 2204273562Smarcel 2205273562Smarcel 2206273562Smarcelvar rclass = /[\n\t\r]/g, 2207273562Smarcel rspace = /\s+/, 2208273562Smarcel rreturn = /\r/g, 2209273562Smarcel rtype = /^(?:button|input)$/i, 2210273562Smarcel rfocusable = /^(?:button|input|object|select|textarea)$/i, 2211273562Smarcel rclickable = /^a(?:rea)?$/i, 2212273562Smarcel rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, 2213273562Smarcel getSetAttribute = jQuery.support.getSetAttribute, 2214273562Smarcel nodeHook, boolHook, fixSpecified; 2215273562Smarcel 2216273562SmarceljQuery.fn.extend({ 2217273562Smarcel attr: function( name, value ) { 2218273562Smarcel return jQuery.access( this, name, value, true, jQuery.attr ); 2219273562Smarcel }, 2220273562Smarcel 2221273562Smarcel removeAttr: function( name ) { 2222273562Smarcel return this.each(function() { 2223273562Smarcel jQuery.removeAttr( this, name ); 2224273562Smarcel }); 2225273562Smarcel }, 2226273562Smarcel 2227273562Smarcel prop: function( name, value ) { 2228273562Smarcel return jQuery.access( this, name, value, true, jQuery.prop ); 2229273562Smarcel }, 2230273562Smarcel 2231273562Smarcel removeProp: function( name ) { 2232273562Smarcel name = jQuery.propFix[ name ] || name; 2233273562Smarcel return this.each(function() { 2234273562Smarcel // try/catch handles cases where IE balks (such as removing a property on window) 2235273562Smarcel try { 2236273562Smarcel this[ name ] = undefined; 2237273562Smarcel delete this[ name ]; 2238273562Smarcel } catch( e ) {} 2239273562Smarcel }); 2240273562Smarcel }, 2241273562Smarcel 2242273562Smarcel addClass: function( value ) { 2243273562Smarcel var classNames, i, l, elem, 2244273562Smarcel setClass, c, cl; 2245273562Smarcel 2246273562Smarcel if ( jQuery.isFunction( value ) ) { 2247273562Smarcel return this.each(function( j ) { 2248273562Smarcel jQuery( this ).addClass( value.call(this, j, this.className) ); 2249273562Smarcel }); 2250273562Smarcel } 2251273562Smarcel 2252273562Smarcel if ( value && typeof value === "string" ) { 2253273562Smarcel classNames = value.split( rspace ); 2254273562Smarcel 2255273562Smarcel for ( i = 0, l = this.length; i < l; i++ ) { 2256273562Smarcel elem = this[ i ]; 2257273562Smarcel 2258273562Smarcel if ( elem.nodeType === 1 ) { 2259273562Smarcel if ( !elem.className && classNames.length === 1 ) { 2260273562Smarcel elem.className = value; 2261273562Smarcel 2262273562Smarcel } else { 2263273562Smarcel setClass = " " + elem.className + " "; 2264273562Smarcel 2265273562Smarcel for ( c = 0, cl = classNames.length; c < cl; c++ ) { 2266273562Smarcel if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { 2267273562Smarcel setClass += classNames[ c ] + " "; 2268273562Smarcel } 2269273562Smarcel } 2270273562Smarcel elem.className = jQuery.trim( setClass ); 2271273562Smarcel } 2272273562Smarcel } 2273273562Smarcel } 2274273562Smarcel } 2275273562Smarcel 2276273562Smarcel return this; 2277273562Smarcel }, 2278273562Smarcel 2279273562Smarcel removeClass: function( value ) { 2280273562Smarcel var classNames, i, l, elem, className, c, cl; 2281273562Smarcel 2282273562Smarcel if ( jQuery.isFunction( value ) ) { 2283273562Smarcel return this.each(function( j ) { 2284273562Smarcel jQuery( this ).removeClass( value.call(this, j, this.className) ); 2285273562Smarcel }); 2286273562Smarcel } 2287273562Smarcel 2288273562Smarcel if ( (value && typeof value === "string") || value === undefined ) { 2289273562Smarcel classNames = ( value || "" ).split( rspace ); 2290273562Smarcel 2291273562Smarcel for ( i = 0, l = this.length; i < l; i++ ) { 2292273562Smarcel elem = this[ i ]; 2293273562Smarcel 2294273562Smarcel if ( elem.nodeType === 1 && elem.className ) { 2295273562Smarcel if ( value ) { 2296273562Smarcel className = (" " + elem.className + " ").replace( rclass, " " ); 2297273562Smarcel for ( c = 0, cl = classNames.length; c < cl; c++ ) { 2298273562Smarcel className = className.replace(" " + classNames[ c ] + " ", " "); 2299273562Smarcel } 2300273562Smarcel elem.className = jQuery.trim( className ); 2301273562Smarcel 2302273562Smarcel } else { 2303273562Smarcel elem.className = ""; 2304273562Smarcel } 2305273562Smarcel } 2306273562Smarcel } 2307273562Smarcel } 2308273562Smarcel 2309273562Smarcel return this; 2310273562Smarcel }, 2311273562Smarcel 2312273562Smarcel toggleClass: function( value, stateVal ) { 2313273562Smarcel var type = typeof value, 2314273562Smarcel isBool = typeof stateVal === "boolean"; 2315273562Smarcel 2316273562Smarcel if ( jQuery.isFunction( value ) ) { 2317273562Smarcel return this.each(function( i ) { 2318273562Smarcel jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); 2319273562Smarcel }); 2320273562Smarcel } 2321273562Smarcel 2322273562Smarcel return this.each(function() { 2323273562Smarcel if ( type === "string" ) { 2324273562Smarcel // toggle individual class names 2325273562Smarcel var className, 2326273562Smarcel i = 0, 2327273562Smarcel self = jQuery( this ), 2328273562Smarcel state = stateVal, 2329273562Smarcel classNames = value.split( rspace ); 2330273562Smarcel 2331273562Smarcel while ( (className = classNames[ i++ ]) ) { 2332273562Smarcel // check each className given, space seperated list 2333273562Smarcel state = isBool ? state : !self.hasClass( className ); 2334273562Smarcel self[ state ? "addClass" : "removeClass" ]( className ); 2335273562Smarcel } 2336273562Smarcel 2337273562Smarcel } else if ( type === "undefined" || type === "boolean" ) { 2338273562Smarcel if ( this.className ) { 2339273562Smarcel // store className if set 2340273562Smarcel jQuery._data( this, "__className__", this.className ); 2341273562Smarcel } 2342273562Smarcel 2343273562Smarcel // toggle whole className 2344273562Smarcel this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; 2345273562Smarcel } 2346273562Smarcel }); 2347273562Smarcel }, 2348273562Smarcel 2349273562Smarcel hasClass: function( selector ) { 2350273562Smarcel var className = " " + selector + " ", 2351273562Smarcel i = 0, 2352273562Smarcel l = this.length; 2353273562Smarcel for ( ; i < l; i++ ) { 2354273562Smarcel if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { 2355273562Smarcel return true; 2356273562Smarcel } 2357273562Smarcel } 2358273562Smarcel 2359273562Smarcel return false; 2360273562Smarcel }, 2361273562Smarcel 2362273562Smarcel val: function( value ) { 2363273562Smarcel var hooks, ret, isFunction, 2364273562Smarcel elem = this[0]; 2365273562Smarcel 2366273562Smarcel if ( !arguments.length ) { 2367273562Smarcel if ( elem ) { 2368273562Smarcel hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; 2369273562Smarcel 2370273562Smarcel if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { 2371273562Smarcel return ret; 2372273562Smarcel } 2373273562Smarcel 2374273562Smarcel ret = elem.value; 2375273562Smarcel 2376273562Smarcel return typeof ret === "string" ? 2377273562Smarcel // handle most common string cases 2378273562Smarcel ret.replace(rreturn, "") : 2379273562Smarcel // handle cases where value is null/undef or number 2380273562Smarcel ret == null ? "" : ret; 2381273562Smarcel } 2382273562Smarcel 2383273562Smarcel return undefined; 2384273562Smarcel } 2385273562Smarcel 2386273562Smarcel isFunction = jQuery.isFunction( value ); 2387273562Smarcel 2388273562Smarcel return this.each(function( i ) { 2389273562Smarcel var self = jQuery(this), val; 2390273562Smarcel 2391273562Smarcel if ( this.nodeType !== 1 ) { 2392273562Smarcel return; 2393273562Smarcel } 2394273562Smarcel 2395273562Smarcel if ( isFunction ) { 2396273562Smarcel val = value.call( this, i, self.val() ); 2397273562Smarcel } else { 2398273562Smarcel val = value; 2399273562Smarcel } 2400273562Smarcel 2401273562Smarcel // Treat null/undefined as ""; convert numbers to string 2402273562Smarcel if ( val == null ) { 2403273562Smarcel val = ""; 2404273562Smarcel } else if ( typeof val === "number" ) { 2405273562Smarcel val += ""; 2406273562Smarcel } else if ( jQuery.isArray( val ) ) { 2407273562Smarcel val = jQuery.map(val, function ( value ) { 2408273562Smarcel return value == null ? "" : value + ""; 2409273562Smarcel }); 2410273562Smarcel } 2411273562Smarcel 2412273562Smarcel hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; 2413273562Smarcel 2414273562Smarcel // If set returns undefined, fall back to normal setting 2415273562Smarcel if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { 2416273562Smarcel this.value = val; 2417273562Smarcel } 2418273562Smarcel }); 2419273562Smarcel } 2420273562Smarcel}); 2421273562Smarcel 2422273562SmarceljQuery.extend({ 2423273562Smarcel valHooks: { 2424273562Smarcel option: { 2425273562Smarcel get: function( elem ) { 2426273562Smarcel // attributes.value is undefined in Blackberry 4.7 but 2427273562Smarcel // uses .value. See #6932 2428273562Smarcel var val = elem.attributes.value; 2429273562Smarcel return !val || val.specified ? elem.value : elem.text; 2430273562Smarcel } 2431273562Smarcel }, 2432273562Smarcel select: { 2433273562Smarcel get: function( elem ) { 2434273562Smarcel var value, i, max, option, 2435273562Smarcel index = elem.selectedIndex, 2436273562Smarcel values = [], 2437273562Smarcel options = elem.options, 2438273562Smarcel one = elem.type === "select-one"; 2439273562Smarcel 2440273562Smarcel // Nothing was selected 2441273562Smarcel if ( index < 0 ) { 2442273562Smarcel return null; 2443273562Smarcel } 2444273562Smarcel 2445273562Smarcel // Loop through all the selected options 2446273562Smarcel i = one ? index : 0; 2447273562Smarcel max = one ? index + 1 : options.length; 2448273562Smarcel for ( ; i < max; i++ ) { 2449273562Smarcel option = options[ i ]; 2450273562Smarcel 2451273562Smarcel // Don't return options that are disabled or in a disabled optgroup 2452273562Smarcel if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && 2453273562Smarcel (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { 2454273562Smarcel 2455273562Smarcel // Get the specific value for the option 2456273562Smarcel value = jQuery( option ).val(); 2457273562Smarcel 2458273562Smarcel // We don't need an array for one selects 2459273562Smarcel if ( one ) { 2460273562Smarcel return value; 2461273562Smarcel } 2462273562Smarcel 2463273562Smarcel // Multi-Selects return an array 2464273562Smarcel values.push( value ); 2465273562Smarcel } 2466273562Smarcel } 2467273562Smarcel 2468273562Smarcel // Fixes Bug #2551 -- select.val() broken in IE after form.reset() 2469273562Smarcel if ( one && !values.length && options.length ) { 2470273562Smarcel return jQuery( options[ index ] ).val(); 2471273562Smarcel } 2472273562Smarcel 2473273562Smarcel return values; 2474273562Smarcel }, 2475273562Smarcel 2476273562Smarcel set: function( elem, value ) { 2477273562Smarcel var values = jQuery.makeArray( value ); 2478273562Smarcel 2479273562Smarcel jQuery(elem).find("option").each(function() { 2480273562Smarcel this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; 2481273562Smarcel }); 2482273562Smarcel 2483273562Smarcel if ( !values.length ) { 2484273562Smarcel elem.selectedIndex = -1; 2485273562Smarcel } 2486273562Smarcel return values; 2487273562Smarcel } 2488273562Smarcel } 2489273562Smarcel }, 2490273562Smarcel 2491273562Smarcel attrFn: { 2492273562Smarcel val: true, 2493273562Smarcel css: true, 2494273562Smarcel html: true, 2495273562Smarcel text: true, 2496273562Smarcel data: true, 2497273562Smarcel width: true, 2498273562Smarcel height: true, 2499273562Smarcel offset: true 2500273562Smarcel }, 2501273562Smarcel 2502273562Smarcel attr: function( elem, name, value, pass ) { 2503273562Smarcel var ret, hooks, notxml, 2504273562Smarcel nType = elem.nodeType; 2505273562Smarcel 2506273562Smarcel // don't get/set attributes on text, comment and attribute nodes 2507273562Smarcel if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { 2508273562Smarcel return undefined; 2509273562Smarcel } 2510273562Smarcel 2511273562Smarcel if ( pass && name in jQuery.attrFn ) { 2512273562Smarcel return jQuery( elem )[ name ]( value ); 2513273562Smarcel } 2514273562Smarcel 2515273562Smarcel // Fallback to prop when attributes are not supported 2516273562Smarcel if ( !("getAttribute" in elem) ) { 2517273562Smarcel return jQuery.prop( elem, name, value ); 2518273562Smarcel } 2519273562Smarcel 2520273562Smarcel notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); 2521273562Smarcel 2522273562Smarcel // All attributes are lowercase 2523273562Smarcel // Grab necessary hook if one is defined 2524273562Smarcel if ( notxml ) { 2525273562Smarcel name = name.toLowerCase(); 2526273562Smarcel hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); 2527273562Smarcel } 2528273562Smarcel 2529273562Smarcel if ( value !== undefined ) { 2530273562Smarcel 2531273562Smarcel if ( value === null ) { 2532273562Smarcel jQuery.removeAttr( elem, name ); 2533273562Smarcel return undefined; 2534273562Smarcel 2535273562Smarcel } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { 2536273562Smarcel return ret; 2537273562Smarcel 2538273562Smarcel } else { 2539273562Smarcel elem.setAttribute( name, "" + value ); 2540273562Smarcel return value; 2541273562Smarcel } 2542273562Smarcel 2543273562Smarcel } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { 2544273562Smarcel return ret; 2545273562Smarcel 2546273562Smarcel } else { 2547273562Smarcel 2548273562Smarcel ret = elem.getAttribute( name ); 2549273562Smarcel 2550273562Smarcel // Non-existent attributes return null, we normalize to undefined 2551273562Smarcel return ret === null ? 2552273562Smarcel undefined : 2553273562Smarcel ret; 2554273562Smarcel } 2555273562Smarcel }, 2556273562Smarcel 2557273562Smarcel removeAttr: function( elem, value ) { 2558273562Smarcel var propName, attrNames, name, l, 2559273562Smarcel i = 0; 2560273562Smarcel 2561273562Smarcel if ( elem.nodeType === 1 ) { 2562273562Smarcel attrNames = ( value || "" ).split( rspace ); 2563273562Smarcel l = attrNames.length; 2564273562Smarcel 2565273562Smarcel for ( ; i < l; i++ ) { 2566273562Smarcel name = attrNames[ i ].toLowerCase(); 2567273562Smarcel propName = jQuery.propFix[ name ] || name; 2568273562Smarcel 2569273562Smarcel // See #9699 for explanation of this approach (setting first, then removal) 2570273562Smarcel jQuery.attr( elem, name, "" ); 2571273562Smarcel elem.removeAttribute( getSetAttribute ? name : propName ); 2572273562Smarcel 2573273562Smarcel // Set corresponding property to false for boolean attributes 2574273562Smarcel if ( rboolean.test( name ) && propName in elem ) { 2575273562Smarcel elem[ propName ] = false; 2576273562Smarcel } 2577273562Smarcel } 2578273562Smarcel } 2579273562Smarcel }, 2580273562Smarcel 2581273562Smarcel attrHooks: { 2582273562Smarcel type: { 2583273562Smarcel set: function( elem, value ) { 2584273562Smarcel // We can't allow the type property to be changed (since it causes problems in IE) 2585273562Smarcel if ( rtype.test( elem.nodeName ) && elem.parentNode ) { 2586273562Smarcel jQuery.error( "type property can't be changed" ); 2587273562Smarcel } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { 2588273562Smarcel // Setting the type on a radio button after the value resets the value in IE6-9 2589273562Smarcel // Reset value to it's default in case type is set after value 2590273562Smarcel // This is for element creation 2591273562Smarcel var val = elem.value; 2592273562Smarcel elem.setAttribute( "type", value ); 2593273562Smarcel if ( val ) { 2594273562Smarcel elem.value = val; 2595273562Smarcel } 2596273562Smarcel return value; 2597273562Smarcel } 2598273562Smarcel } 2599273562Smarcel }, 2600273562Smarcel // Use the value property for back compat 2601273562Smarcel // Use the nodeHook for button elements in IE6/7 (#1954) 2602273562Smarcel value: { 2603273562Smarcel get: function( elem, name ) { 2604273562Smarcel if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { 2605273562Smarcel return nodeHook.get( elem, name ); 2606273562Smarcel } 2607273562Smarcel return name in elem ? 2608273562Smarcel elem.value : 2609273562Smarcel null; 2610273562Smarcel }, 2611273562Smarcel set: function( elem, value, name ) { 2612273562Smarcel if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { 2613273562Smarcel return nodeHook.set( elem, value, name ); 2614273562Smarcel } 2615273562Smarcel // Does not return so that setAttribute is also used 2616273562Smarcel elem.value = value; 2617273562Smarcel } 2618273562Smarcel } 2619273562Smarcel }, 2620273562Smarcel 2621273562Smarcel propFix: { 2622273562Smarcel tabindex: "tabIndex", 2623273562Smarcel readonly: "readOnly", 2624273562Smarcel "for": "htmlFor", 2625273562Smarcel "class": "className", 2626273562Smarcel maxlength: "maxLength", 2627273562Smarcel cellspacing: "cellSpacing", 2628273562Smarcel cellpadding: "cellPadding", 2629273562Smarcel rowspan: "rowSpan", 2630273562Smarcel colspan: "colSpan", 2631273562Smarcel usemap: "useMap", 2632273562Smarcel frameborder: "frameBorder", 2633273562Smarcel contenteditable: "contentEditable" 2634273562Smarcel }, 2635273562Smarcel 2636273562Smarcel prop: function( elem, name, value ) { 2637273562Smarcel var ret, hooks, notxml, 2638273562Smarcel nType = elem.nodeType; 2639273562Smarcel 2640273562Smarcel // don't get/set properties on text, comment and attribute nodes 2641273562Smarcel if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { 2642273562Smarcel return undefined; 2643273562Smarcel } 2644273562Smarcel 2645273562Smarcel notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); 2646273562Smarcel 2647273562Smarcel if ( notxml ) { 2648273562Smarcel // Fix name and attach hooks 2649273562Smarcel name = jQuery.propFix[ name ] || name; 2650273562Smarcel hooks = jQuery.propHooks[ name ]; 2651273562Smarcel } 2652273562Smarcel 2653273562Smarcel if ( value !== undefined ) { 2654273562Smarcel if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { 2655273562Smarcel return ret; 2656273562Smarcel 2657273562Smarcel } else { 2658273562Smarcel return ( elem[ name ] = value ); 2659273562Smarcel } 2660273562Smarcel 2661273562Smarcel } else { 2662273562Smarcel if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { 2663273562Smarcel return ret; 2664273562Smarcel 2665273562Smarcel } else { 2666273562Smarcel return elem[ name ]; 2667273562Smarcel } 2668273562Smarcel } 2669273562Smarcel }, 2670273562Smarcel 2671273562Smarcel propHooks: { 2672273562Smarcel tabIndex: { 2673273562Smarcel get: function( elem ) { 2674273562Smarcel // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set 2675273562Smarcel // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ 2676273562Smarcel var attributeNode = elem.getAttributeNode("tabindex"); 2677273562Smarcel 2678273562Smarcel return attributeNode && attributeNode.specified ? 2679273562Smarcel parseInt( attributeNode.value, 10 ) : 2680273562Smarcel rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? 2681273562Smarcel 0 : 2682273562Smarcel undefined; 2683273562Smarcel } 2684273562Smarcel } 2685273562Smarcel } 2686273562Smarcel}); 2687273562Smarcel 2688273562Smarcel// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) 2689273562SmarceljQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; 2690273562Smarcel 2691273562Smarcel// Hook for boolean attributes 2692273562SmarcelboolHook = { 2693273562Smarcel get: function( elem, name ) { 2694273562Smarcel // Align boolean attributes with corresponding properties 2695273562Smarcel // Fall back to attribute presence where some booleans are not supported 2696273562Smarcel var attrNode, 2697273562Smarcel property = jQuery.prop( elem, name ); 2698273562Smarcel return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? 2699273562Smarcel name.toLowerCase() : 2700273562Smarcel undefined; 2701273562Smarcel }, 2702273562Smarcel set: function( elem, value, name ) { 2703273562Smarcel var propName; 2704273562Smarcel if ( value === false ) { 2705273562Smarcel // Remove boolean attributes when set to false 2706273562Smarcel jQuery.removeAttr( elem, name ); 2707273562Smarcel } else { 2708273562Smarcel // value is true since we know at this point it's type boolean and not false 2709273562Smarcel // Set boolean attributes to the same name and set the DOM property 2710273562Smarcel propName = jQuery.propFix[ name ] || name; 2711273562Smarcel if ( propName in elem ) { 2712273562Smarcel // Only set the IDL specifically if it already exists on the element 2713273562Smarcel elem[ propName ] = true; 2714273562Smarcel } 2715273562Smarcel 2716273562Smarcel elem.setAttribute( name, name.toLowerCase() ); 2717273562Smarcel } 2718273562Smarcel return name; 2719273562Smarcel } 2720273562Smarcel}; 2721273562Smarcel 2722273562Smarcel// IE6/7 do not support getting/setting some attributes with get/setAttribute 2723273562Smarcelif ( !getSetAttribute ) { 2724273562Smarcel 2725273562Smarcel fixSpecified = { 2726273562Smarcel name: true, 2727273562Smarcel id: true 2728273562Smarcel }; 2729273562Smarcel 2730273562Smarcel // Use this for any attribute in IE6/7 2731273562Smarcel // This fixes almost every IE6/7 issue 2732273562Smarcel nodeHook = jQuery.valHooks.button = { 2733273562Smarcel get: function( elem, name ) { 2734273562Smarcel var ret; 2735273562Smarcel ret = elem.getAttributeNode( name ); 2736273562Smarcel return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? 2737273562Smarcel ret.nodeValue : 2738273562Smarcel undefined; 2739273562Smarcel }, 2740273562Smarcel set: function( elem, value, name ) { 2741273562Smarcel // Set the existing or create a new attribute node 2742273562Smarcel var ret = elem.getAttributeNode( name ); 2743273562Smarcel if ( !ret ) { 2744273562Smarcel ret = document.createAttribute( name ); 2745273562Smarcel elem.setAttributeNode( ret ); 2746273562Smarcel } 2747273562Smarcel return ( ret.nodeValue = value + "" ); 2748273562Smarcel } 2749273562Smarcel }; 2750273562Smarcel 2751273562Smarcel // Apply the nodeHook to tabindex 2752273562Smarcel jQuery.attrHooks.tabindex.set = nodeHook.set; 2753273562Smarcel 2754273562Smarcel // Set width and height to auto instead of 0 on empty string( Bug #8150 ) 2755273562Smarcel // This is for removals 2756273562Smarcel jQuery.each([ "width", "height" ], function( i, name ) { 2757273562Smarcel jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { 2758273562Smarcel set: function( elem, value ) { 2759273562Smarcel if ( value === "" ) { 2760273562Smarcel elem.setAttribute( name, "auto" ); 2761273562Smarcel return value; 2762273562Smarcel } 2763273562Smarcel } 2764273562Smarcel }); 2765273562Smarcel }); 2766273562Smarcel 2767273562Smarcel // Set contenteditable to false on removals(#10429) 2768273562Smarcel // Setting to empty string throws an error as an invalid value 2769273562Smarcel jQuery.attrHooks.contenteditable = { 2770273562Smarcel get: nodeHook.get, 2771273562Smarcel set: function( elem, value, name ) { 2772273562Smarcel if ( value === "" ) { 2773273562Smarcel value = "false"; 2774273562Smarcel } 2775273562Smarcel nodeHook.set( elem, value, name ); 2776273562Smarcel } 2777273562Smarcel }; 2778273562Smarcel} 2779273562Smarcel 2780273562Smarcel 2781273562Smarcel// Some attributes require a special call on IE 2782273562Smarcelif ( !jQuery.support.hrefNormalized ) { 2783273562Smarcel jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { 2784273562Smarcel jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { 2785273562Smarcel get: function( elem ) { 2786273562Smarcel var ret = elem.getAttribute( name, 2 ); 2787273562Smarcel return ret === null ? undefined : ret; 2788273562Smarcel } 2789273562Smarcel }); 2790273562Smarcel }); 2791273562Smarcel} 2792273562Smarcel 2793273562Smarcelif ( !jQuery.support.style ) { 2794273562Smarcel jQuery.attrHooks.style = { 2795273562Smarcel get: function( elem ) { 2796273562Smarcel // Return undefined in the case of empty string 2797273562Smarcel // Normalize to lowercase since IE uppercases css property names 2798273562Smarcel return elem.style.cssText.toLowerCase() || undefined; 2799273562Smarcel }, 2800273562Smarcel set: function( elem, value ) { 2801273562Smarcel return ( elem.style.cssText = "" + value ); 2802273562Smarcel } 2803273562Smarcel }; 2804273562Smarcel} 2805273562Smarcel 2806273562Smarcel// Safari mis-reports the default selected property of an option 2807273562Smarcel// Accessing the parent's selectedIndex property fixes it 2808273562Smarcelif ( !jQuery.support.optSelected ) { 2809273562Smarcel jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { 2810273562Smarcel get: function( elem ) { 2811273562Smarcel var parent = elem.parentNode; 2812273562Smarcel 2813273562Smarcel if ( parent ) { 2814273562Smarcel parent.selectedIndex; 2815273562Smarcel 2816273562Smarcel // Make sure that it also works with optgroups, see #5701 2817273562Smarcel if ( parent.parentNode ) { 2818273562Smarcel parent.parentNode.selectedIndex; 2819273562Smarcel } 2820273562Smarcel } 2821273562Smarcel return null; 2822273562Smarcel } 2823273562Smarcel }); 2824273562Smarcel} 2825273562Smarcel 2826273562Smarcel// IE6/7 call enctype encoding 2827273562Smarcelif ( !jQuery.support.enctype ) { 2828273562Smarcel jQuery.propFix.enctype = "encoding"; 2829273562Smarcel} 2830273562Smarcel 2831273562Smarcel// Radios and checkboxes getter/setter 2832273562Smarcelif ( !jQuery.support.checkOn ) { 2833273562Smarcel jQuery.each([ "radio", "checkbox" ], function() { 2834273562Smarcel jQuery.valHooks[ this ] = { 2835273562Smarcel get: function( elem ) { 2836273562Smarcel // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified 2837273562Smarcel return elem.getAttribute("value") === null ? "on" : elem.value; 2838273562Smarcel } 2839273562Smarcel }; 2840273562Smarcel }); 2841273562Smarcel} 2842273562SmarceljQuery.each([ "radio", "checkbox" ], function() { 2843273562Smarcel jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { 2844273562Smarcel set: function( elem, value ) { 2845273562Smarcel if ( jQuery.isArray( value ) ) { 2846273562Smarcel return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); 2847273562Smarcel } 2848273562Smarcel } 2849273562Smarcel }); 2850273562Smarcel}); 2851273562Smarcel 2852273562Smarcel 2853273562Smarcel 2854273562Smarcel 2855273562Smarcelvar rnamespaces = /\.(.*)$/, 2856273562Smarcel rformElems = /^(?:textarea|input|select)$/i, 2857273562Smarcel rperiod = /\./g, 2858273562Smarcel rspaces = / /g, 2859273562Smarcel rescape = /[^\w\s.|`]/g, 2860273562Smarcel rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, 2861273562Smarcel rhoverHack = /\bhover(\.\S+)?/, 2862273562Smarcel rkeyEvent = /^key/, 2863273562Smarcel rmouseEvent = /^(?:mouse|contextmenu)|click/, 2864273562Smarcel rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, 2865273562Smarcel quickParse = function( selector ) { 2866273562Smarcel var quick = rquickIs.exec( selector ); 2867273562Smarcel if ( quick ) { 2868273562Smarcel // 0 1 2 3 2869273562Smarcel // [ _, tag, id, class ] 2870273562Smarcel quick[1] = ( quick[1] || "" ).toLowerCase(); 2871273562Smarcel quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); 2872273562Smarcel } 2873273562Smarcel return quick; 2874273562Smarcel }, 2875273562Smarcel quickIs = function( elem, m ) { 2876273562Smarcel return ( 2877273562Smarcel (!m[1] || elem.nodeName.toLowerCase() === m[1]) && 2878273562Smarcel (!m[2] || elem.id === m[2]) && 2879273562Smarcel (!m[3] || m[3].test( elem.className )) 2880273562Smarcel ); 2881273562Smarcel }, 2882273562Smarcel hoverHack = function( events ) { 2883273562Smarcel return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); 2884273562Smarcel }; 2885273562Smarcel 2886273562Smarcel/* 2887273562Smarcel * Helper functions for managing events -- not part of the public interface. 2888273562Smarcel * Props to Dean Edwards' addEvent library for many of the ideas. 2889273562Smarcel */ 2890273562SmarceljQuery.event = { 2891273562Smarcel 2892273562Smarcel add: function( elem, types, handler, data, selector ) { 2893273562Smarcel 2894273562Smarcel var elemData, eventHandle, events, 2895273562Smarcel t, tns, type, namespaces, handleObj, 2896273562Smarcel handleObjIn, quick, handlers, special; 2897273562Smarcel 2898273562Smarcel // Don't attach events to noData or text/comment nodes (allow plain objects tho) 2899273562Smarcel if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { 2900273562Smarcel return; 2901273562Smarcel } 2902273562Smarcel 2903273562Smarcel // Caller can pass in an object of custom data in lieu of the handler 2904273562Smarcel if ( handler.handler ) { 2905273562Smarcel handleObjIn = handler; 2906273562Smarcel handler = handleObjIn.handler; 2907273562Smarcel } 2908273562Smarcel 2909273562Smarcel // Make sure that the handler has a unique ID, used to find/remove it later 2910273562Smarcel if ( !handler.guid ) { 2911273562Smarcel handler.guid = jQuery.guid++; 2912273562Smarcel } 2913273562Smarcel 2914273562Smarcel // Init the element's event structure and main handler, if this is the first 2915273562Smarcel events = elemData.events; 2916273562Smarcel if ( !events ) { 2917273562Smarcel elemData.events = events = {}; 2918273562Smarcel } 2919273562Smarcel eventHandle = elemData.handle; 2920273562Smarcel if ( !eventHandle ) { 2921273562Smarcel elemData.handle = eventHandle = function( e ) { 2922273562Smarcel // Discard the second event of a jQuery.event.trigger() and 2923273562Smarcel // when an event is called after a page has unloaded 2924273562Smarcel return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? 2925273562Smarcel jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : 2926273562Smarcel undefined; 2927273562Smarcel }; 2928273562Smarcel // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events 2929273562Smarcel eventHandle.elem = elem; 2930273562Smarcel } 2931273562Smarcel 2932273562Smarcel // Handle multiple events separated by a space 2933273562Smarcel // jQuery(...).bind("mouseover mouseout", fn); 2934273562Smarcel types = hoverHack(types).split( " " ); 2935273562Smarcel for ( t = 0; t < types.length; t++ ) { 2936273562Smarcel 2937273562Smarcel tns = rtypenamespace.exec( types[t] ) || []; 2938273562Smarcel type = tns[1]; 2939273562Smarcel namespaces = ( tns[2] || "" ).split( "." ).sort(); 2940273562Smarcel 2941273562Smarcel // If event changes its type, use the special event handlers for the changed type 2942273562Smarcel special = jQuery.event.special[ type ] || {}; 2943273562Smarcel 2944273562Smarcel // If selector defined, determine special event api type, otherwise given type 2945273562Smarcel type = ( selector ? special.delegateType : special.bindType ) || type; 2946273562Smarcel 2947273562Smarcel // Update special based on newly reset type 2948273562Smarcel special = jQuery.event.special[ type ] || {}; 2949273562Smarcel 2950273562Smarcel // handleObj is passed to all event handlers 2951273562Smarcel handleObj = jQuery.extend({ 2952273562Smarcel type: type, 2953273562Smarcel origType: tns[1], 2954273562Smarcel data: data, 2955273562Smarcel handler: handler, 2956273562Smarcel guid: handler.guid, 2957273562Smarcel selector: selector, 2958273562Smarcel namespace: namespaces.join(".") 2959273562Smarcel }, handleObjIn ); 2960273562Smarcel 2961273562Smarcel // Delegated event; pre-analyze selector so it's processed quickly on event dispatch 2962273562Smarcel if ( selector ) { 2963273562Smarcel handleObj.quick = quickParse( selector ); 2964273562Smarcel if ( !handleObj.quick && jQuery.expr.match.POS.test( selector ) ) { 2965273562Smarcel handleObj.isPositional = true; 2966273562Smarcel } 2967273562Smarcel } 2968273562Smarcel 2969273562Smarcel // Init the event handler queue if we're the first 2970273562Smarcel handlers = events[ type ]; 2971273562Smarcel if ( !handlers ) { 2972273562Smarcel handlers = events[ type ] = []; 2973273562Smarcel handlers.delegateCount = 0; 2974273562Smarcel 2975273562Smarcel // Only use addEventListener/attachEvent if the special events handler returns false 2976273562Smarcel if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { 2977273562Smarcel // Bind the global event handler to the element 2978273562Smarcel if ( elem.addEventListener ) { 2979273562Smarcel elem.addEventListener( type, eventHandle, false ); 2980273562Smarcel 2981273562Smarcel } else if ( elem.attachEvent ) { 2982273562Smarcel elem.attachEvent( "on" + type, eventHandle ); 2983273562Smarcel } 2984273562Smarcel } 2985273562Smarcel } 2986273562Smarcel 2987273562Smarcel if ( special.add ) { 2988273562Smarcel special.add.call( elem, handleObj ); 2989273562Smarcel 2990273562Smarcel if ( !handleObj.handler.guid ) { 2991273562Smarcel handleObj.handler.guid = handler.guid; 2992273562Smarcel } 2993273562Smarcel } 2994273562Smarcel 2995273562Smarcel // Add to the element's handler list, delegates in front 2996273562Smarcel if ( selector ) { 2997273562Smarcel handlers.splice( handlers.delegateCount++, 0, handleObj ); 2998273562Smarcel } else { 2999273562Smarcel handlers.push( handleObj ); 3000273562Smarcel } 3001273562Smarcel 3002273562Smarcel // Keep track of which events have ever been used, for event optimization 3003273562Smarcel jQuery.event.global[ type ] = true; 3004273562Smarcel } 3005273562Smarcel 3006273562Smarcel // Nullify elem to prevent memory leaks in IE 3007273562Smarcel elem = null; 3008273562Smarcel }, 3009273562Smarcel 3010273562Smarcel global: {}, 3011273562Smarcel 3012273562Smarcel // Detach an event or set of events from an element 3013273562Smarcel remove: function( elem, types, handler, selector ) { 3014273562Smarcel 3015273562Smarcel var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), 3016273562Smarcel t, tns, type, namespaces, origCount, 3017273562Smarcel j, events, special, handle, eventType, handleObj; 3018273562Smarcel 3019273562Smarcel if ( !elemData || !(events = elemData.events) ) { 3020273562Smarcel return; 3021273562Smarcel } 3022273562Smarcel 3023273562Smarcel // Once for each type.namespace in types; type may be omitted 3024273562Smarcel types = hoverHack( types || "" ).split(" "); 3025273562Smarcel for ( t = 0; t < types.length; t++ ) { 3026273562Smarcel tns = rtypenamespace.exec( types[t] ) || []; 3027273562Smarcel type = tns[1]; 3028273562Smarcel namespaces = tns[2]; 3029273562Smarcel 3030273562Smarcel // Unbind all events (on this namespace, if provided) for the element 3031273562Smarcel if ( !type ) { 3032273562Smarcel namespaces = namespaces? "." + namespaces : ""; 3033273562Smarcel for ( j in events ) { 3034273562Smarcel jQuery.event.remove( elem, j + namespaces, handler, selector ); 3035273562Smarcel } 3036273562Smarcel return; 3037273562Smarcel } 3038273562Smarcel 3039273562Smarcel special = jQuery.event.special[ type ] || {}; 3040273562Smarcel type = ( selector? special.delegateType : special.bindType ) || type; 3041273562Smarcel eventType = events[ type ] || []; 3042273562Smarcel origCount = eventType.length; 3043273562Smarcel namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; 3044273562Smarcel 3045273562Smarcel // Only need to loop for special events or selective removal 3046273562Smarcel if ( handler || namespaces || selector || special.remove ) { 3047273562Smarcel for ( j = 0; j < eventType.length; j++ ) { 3048273562Smarcel handleObj = eventType[ j ]; 3049273562Smarcel 3050273562Smarcel if ( !handler || handler.guid === handleObj.guid ) { 3051273562Smarcel if ( !namespaces || namespaces.test( handleObj.namespace ) ) { 3052273562Smarcel if ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) { 3053273562Smarcel eventType.splice( j--, 1 ); 3054273562Smarcel 3055273562Smarcel if ( handleObj.selector ) { 3056273562Smarcel eventType.delegateCount--; 3057273562Smarcel } 3058273562Smarcel if ( special.remove ) { 3059273562Smarcel special.remove.call( elem, handleObj ); 3060273562Smarcel } 3061273562Smarcel } 3062273562Smarcel } 3063273562Smarcel } 3064273562Smarcel } 3065273562Smarcel } else { 3066273562Smarcel // Removing all events 3067273562Smarcel eventType.length = 0; 3068273562Smarcel } 3069273562Smarcel 3070273562Smarcel // Remove generic event handler if we removed something and no more handlers exist 3071273562Smarcel // (avoids potential for endless recursion during removal of special event handlers) 3072273562Smarcel if ( eventType.length === 0 && origCount !== eventType.length ) { 3073273562Smarcel if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { 3074273562Smarcel jQuery.removeEvent( elem, type, elemData.handle ); 3075273562Smarcel } 3076273562Smarcel 3077273562Smarcel delete events[ type ]; 3078273562Smarcel } 3079273562Smarcel } 3080273562Smarcel 3081273562Smarcel // Remove the expando if it's no longer used 3082273562Smarcel if ( jQuery.isEmptyObject( events ) ) { 3083273562Smarcel handle = elemData.handle; 3084273562Smarcel if ( handle ) { 3085273562Smarcel handle.elem = null; 3086273562Smarcel } 3087273562Smarcel 3088273562Smarcel // removeData also checks for emptiness and clears the expando if empty 3089273562Smarcel // so use it instead of delete 3090273562Smarcel jQuery.removeData( elem, [ "events", "handle" ], true ); 3091273562Smarcel } 3092273562Smarcel }, 3093273562Smarcel 3094273562Smarcel // Events that are safe to short-circuit if no handlers are attached. 3095273562Smarcel // Native DOM events should not be added, they may have inline handlers. 3096273562Smarcel customEvent: { 3097273562Smarcel "getData": true, 3098273562Smarcel "setData": true, 3099273562Smarcel "changeData": true 3100273562Smarcel }, 3101273562Smarcel 3102273562Smarcel trigger: function( event, data, elem, onlyHandlers ) { 3103273562Smarcel // Don't do events on text and comment nodes 3104273562Smarcel if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { 3105273562Smarcel return; 3106273562Smarcel } 3107273562Smarcel 3108273562Smarcel // Event object or event type 3109273562Smarcel var type = event.type || event, 3110273562Smarcel namespaces = [], 3111273562Smarcel cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; 3112273562Smarcel 3113273562Smarcel if ( type.indexOf( "!" ) >= 0 ) { 3114273562Smarcel // Exclusive events trigger only for the exact event (no namespaces) 3115273562Smarcel type = type.slice(0, -1); 3116273562Smarcel exclusive = true; 3117273562Smarcel } 3118273562Smarcel 3119273562Smarcel if ( type.indexOf( "." ) >= 0 ) { 3120273562Smarcel // Namespaced trigger; create a regexp to match event type in handle() 3121273562Smarcel namespaces = type.split("."); 3122273562Smarcel type = namespaces.shift(); 3123273562Smarcel namespaces.sort(); 3124273562Smarcel } 3125273562Smarcel 3126273562Smarcel if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { 3127273562Smarcel // No jQuery handlers for this event type, and it can't have inline handlers 3128273562Smarcel return; 3129273562Smarcel } 3130273562Smarcel 3131273562Smarcel // Caller can pass in an Event, Object, or just an event type string 3132273562Smarcel event = typeof event === "object" ? 3133273562Smarcel // jQuery.Event object 3134273562Smarcel event[ jQuery.expando ] ? event : 3135273562Smarcel // Object literal 3136273562Smarcel new jQuery.Event( type, event ) : 3137273562Smarcel // Just the event type (string) 3138273562Smarcel new jQuery.Event( type ); 3139273562Smarcel 3140273562Smarcel event.type = type; 3141273562Smarcel event.isTrigger = true; 3142273562Smarcel event.exclusive = exclusive; 3143273562Smarcel event.namespace = namespaces.join( "." ); 3144273562Smarcel event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; 3145273562Smarcel ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; 3146273562Smarcel 3147273562Smarcel // triggerHandler() and global events don't bubble or run the default action 3148273562Smarcel if ( onlyHandlers || !elem ) { 3149273562Smarcel event.preventDefault(); 3150273562Smarcel } 3151273562Smarcel 3152273562Smarcel // Handle a global trigger 3153273562Smarcel if ( !elem ) { 3154273562Smarcel 3155273562Smarcel // TODO: Stop taunting the data cache; remove global events and always attach to document 3156273562Smarcel cache = jQuery.cache; 3157273562Smarcel for ( i in cache ) { 3158273562Smarcel if ( cache[ i ].events && cache[ i ].events[ type ] ) { 3159273562Smarcel jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); 3160273562Smarcel } 3161273562Smarcel } 3162273562Smarcel return; 3163273562Smarcel } 3164273562Smarcel 3165273562Smarcel // Clean up the event in case it is being reused 3166273562Smarcel event.result = undefined; 3167273562Smarcel if ( !event.target ) { 3168273562Smarcel event.target = elem; 3169273562Smarcel } 3170273562Smarcel 3171273562Smarcel // Clone any incoming data and prepend the event, creating the handler arg list 3172273562Smarcel data = data != null ? jQuery.makeArray( data ) : []; 3173273562Smarcel data.unshift( event ); 3174273562Smarcel 3175273562Smarcel // Allow special events to draw outside the lines 3176273562Smarcel special = jQuery.event.special[ type ] || {}; 3177273562Smarcel if ( special.trigger && special.trigger.apply( elem, data ) === false ) { 3178273562Smarcel return; 3179273562Smarcel } 3180273562Smarcel 3181273562Smarcel // Determine event propagation path in advance, per W3C events spec (#9951) 3182273562Smarcel // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) 3183273562Smarcel eventPath = [[ elem, special.bindType || type ]]; 3184273562Smarcel if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { 3185273562Smarcel 3186273562Smarcel bubbleType = special.delegateType || type; 3187273562Smarcel old = null; 3188273562Smarcel for ( cur = elem.parentNode; cur; cur = cur.parentNode ) { 3189273562Smarcel eventPath.push([ cur, bubbleType ]); 3190273562Smarcel old = cur; 3191273562Smarcel } 3192273562Smarcel 3193273562Smarcel // Only add window if we got to document (e.g., not plain obj or detached DOM) 3194273562Smarcel if ( old && old === elem.ownerDocument ) { 3195273562Smarcel eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); 3196273562Smarcel } 3197273562Smarcel } 3198273562Smarcel 3199273562Smarcel // Fire handlers on the event path 3200273562Smarcel for ( i = 0; i < eventPath.length; i++ ) { 3201273562Smarcel 3202273562Smarcel cur = eventPath[i][0]; 3203273562Smarcel event.type = eventPath[i][1]; 3204273562Smarcel 3205273562Smarcel handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); 3206273562Smarcel if ( handle ) { 3207273562Smarcel handle.apply( cur, data ); 3208273562Smarcel } 3209273562Smarcel handle = ontype && cur[ ontype ]; 3210273562Smarcel if ( handle && jQuery.acceptData( cur ) ) { 3211273562Smarcel handle.apply( cur, data ); 3212273562Smarcel } 3213273562Smarcel 3214273562Smarcel if ( event.isPropagationStopped() ) { 3215273562Smarcel break; 3216273562Smarcel } 3217273562Smarcel } 3218273562Smarcel event.type = type; 3219273562Smarcel 3220273562Smarcel // If nobody prevented the default action, do it now 3221273562Smarcel if ( !event.isDefaultPrevented() ) { 3222273562Smarcel 3223273562Smarcel if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && 3224273562Smarcel !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { 3225273562Smarcel 3226273562Smarcel // Call a native DOM method on the target with the same name name as the event. 3227273562Smarcel // Can't use an .isFunction() check here because IE6/7 fails that test. 3228273562Smarcel // Don't do default actions on window, that's where global variables be (#6170) 3229273562Smarcel // IE<9 dies on focus/blur to hidden element (#1486) 3230273562Smarcel if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { 3231273562Smarcel 3232273562Smarcel // Don't re-trigger an onFOO event when we call its FOO() method 3233273562Smarcel old = elem[ ontype ]; 3234273562Smarcel 3235273562Smarcel if ( old ) { 3236273562Smarcel elem[ ontype ] = null; 3237273562Smarcel } 3238273562Smarcel 3239273562Smarcel // Prevent re-triggering of the same event, since we already bubbled it above 3240273562Smarcel jQuery.event.triggered = type; 3241273562Smarcel elem[ type ](); 3242273562Smarcel jQuery.event.triggered = undefined; 3243273562Smarcel 3244273562Smarcel if ( old ) { 3245273562Smarcel elem[ ontype ] = old; 3246273562Smarcel } 3247273562Smarcel } 3248273562Smarcel } 3249273562Smarcel } 3250273562Smarcel 3251273562Smarcel return event.result; 3252273562Smarcel }, 3253273562Smarcel 3254273562Smarcel dispatch: function( event ) { 3255273562Smarcel 3256273562Smarcel // Make a writable jQuery.Event from the native event object 3257273562Smarcel event = jQuery.event.fix( event || window.event ); 3258273562Smarcel 3259273562Smarcel var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), 3260273562Smarcel delegateCount = handlers.delegateCount, 3261273562Smarcel args = [].slice.call( arguments, 0 ), 3262273562Smarcel run_all = !event.exclusive && !event.namespace, 3263273562Smarcel specialHandle = ( jQuery.event.special[ event.type ] || {} ).handle, 3264273562Smarcel handlerQueue = [], 3265273562Smarcel i, j, cur, ret, selMatch, matched, matches, handleObj, sel, hit, related; 3266273562Smarcel 3267273562Smarcel // Use the fix-ed jQuery.Event rather than the (read-only) native event 3268273562Smarcel args[0] = event; 3269273562Smarcel event.delegateTarget = this; 3270273562Smarcel 3271273562Smarcel // Determine handlers that should run if there are delegated events 3272273562Smarcel // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861) 3273273562Smarcel if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) { 3274273562Smarcel 3275273562Smarcel for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { 3276273562Smarcel selMatch = {}; 3277273562Smarcel matches = []; 3278273562Smarcel for ( i = 0; i < delegateCount; i++ ) { 3279273562Smarcel handleObj = handlers[ i ]; 3280273562Smarcel sel = handleObj.selector; 3281273562Smarcel hit = selMatch[ sel ]; 3282273562Smarcel 3283273562Smarcel if ( handleObj.isPositional ) { 3284273562Smarcel // Since .is() does not work for positionals; see http://jsfiddle.net/eJ4yd/3/ 3285273562Smarcel hit = ( hit || (selMatch[ sel ] = jQuery( sel )) ).index( cur ) >= 0; 3286273562Smarcel } else if ( hit === undefined ) { 3287273562Smarcel hit = selMatch[ sel ] = ( handleObj.quick ? quickIs( cur, handleObj.quick ) : jQuery( cur ).is( sel ) ); 3288273562Smarcel } 3289273562Smarcel if ( hit ) { 3290273562Smarcel matches.push( handleObj ); 3291273562Smarcel } 3292273562Smarcel } 3293273562Smarcel if ( matches.length ) { 3294273562Smarcel handlerQueue.push({ elem: cur, matches: matches }); 3295273562Smarcel } 3296273562Smarcel } 3297273562Smarcel } 3298273562Smarcel 3299273562Smarcel // Add the remaining (directly-bound) handlers 3300273562Smarcel if ( handlers.length > delegateCount ) { 3301273562Smarcel handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); 3302273562Smarcel } 3303273562Smarcel 3304273562Smarcel // Run delegates first; they may want to stop propagation beneath us 3305273562Smarcel for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { 3306273562Smarcel matched = handlerQueue[ i ]; 3307273562Smarcel event.currentTarget = matched.elem; 3308273562Smarcel 3309273562Smarcel for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { 3310273562Smarcel handleObj = matched.matches[ j ]; 3311273562Smarcel 3312273562Smarcel // Triggered event must either 1) be non-exclusive and have no namespace, or 3313273562Smarcel // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). 3314273562Smarcel if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { 3315273562Smarcel 3316273562Smarcel event.data = handleObj.data; 3317273562Smarcel event.handleObj = handleObj; 3318273562Smarcel 3319273562Smarcel ret = ( specialHandle || handleObj.handler ).apply( matched.elem, args ); 3320273562Smarcel 3321273562Smarcel if ( ret !== undefined ) { 3322273562Smarcel event.result = ret; 3323273562Smarcel if ( ret === false ) { 3324273562Smarcel event.preventDefault(); 3325273562Smarcel event.stopPropagation(); 3326273562Smarcel } 3327273562Smarcel } 3328273562Smarcel } 3329273562Smarcel } 3330273562Smarcel } 3331273562Smarcel 3332273562Smarcel return event.result; 3333273562Smarcel }, 3334273562Smarcel 3335273562Smarcel // Includes some event props shared by KeyEvent and MouseEvent 3336273562Smarcel // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** 3337273562Smarcel props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), 3338273562Smarcel 3339273562Smarcel fixHooks: {}, 3340273562Smarcel 3341273562Smarcel keyHooks: { 3342273562Smarcel props: "char charCode key keyCode".split(" "), 3343273562Smarcel filter: function( event, original ) { 3344273562Smarcel 3345273562Smarcel // Add which for key events 3346273562Smarcel if ( event.which == null ) { 3347273562Smarcel event.which = original.charCode != null ? original.charCode : original.keyCode; 3348273562Smarcel } 3349273562Smarcel 3350273562Smarcel return event; 3351273562Smarcel } 3352273562Smarcel }, 3353273562Smarcel 3354273562Smarcel mouseHooks: { 3355273562Smarcel props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement wheelDelta".split(" "), 3356273562Smarcel filter: function( event, original ) { 3357273562Smarcel var eventDoc, doc, body, 3358273562Smarcel button = original.button, 3359273562Smarcel fromElement = original.fromElement; 3360273562Smarcel 3361273562Smarcel // Calculate pageX/Y if missing and clientX/Y available 3362273562Smarcel if ( event.pageX == null && original.clientX != null ) { 3363273562Smarcel eventDoc = event.target.ownerDocument || document; 3364273562Smarcel doc = eventDoc.documentElement; 3365273562Smarcel body = eventDoc.body; 3366273562Smarcel 3367273562Smarcel event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); 3368273562Smarcel event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); 3369273562Smarcel } 3370273562Smarcel 3371273562Smarcel // Add relatedTarget, if necessary 3372273562Smarcel if ( !event.relatedTarget && fromElement ) { 3373273562Smarcel event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; 3374273562Smarcel } 3375273562Smarcel 3376273562Smarcel // Add which for click: 1 === left; 2 === middle; 3 === right 3377273562Smarcel // Note: button is not normalized, so don't use it 3378273562Smarcel if ( !event.which && button !== undefined ) { 3379273562Smarcel event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); 3380273562Smarcel } 3381273562Smarcel 3382273562Smarcel return event; 3383273562Smarcel } 3384273562Smarcel }, 3385273562Smarcel 3386273562Smarcel fix: function( event ) { 3387273562Smarcel if ( event[ jQuery.expando ] ) { 3388273562Smarcel return event; 3389273562Smarcel } 3390273562Smarcel 3391273562Smarcel // Create a writable copy of the event object and normalize some properties 3392273562Smarcel var i, prop, 3393273562Smarcel originalEvent = event, 3394273562Smarcel fixHook = jQuery.event.fixHooks[ event.type ] || {}, 3395273562Smarcel copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; 3396273562Smarcel 3397273562Smarcel event = jQuery.Event( originalEvent ); 3398273562Smarcel 3399273562Smarcel for ( i = copy.length; i; ) { 3400273562Smarcel prop = copy[ --i ]; 3401273562Smarcel event[ prop ] = originalEvent[ prop ]; 3402273562Smarcel } 3403273562Smarcel 3404273562Smarcel // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) 3405273562Smarcel if ( !event.target ) { 3406273562Smarcel event.target = originalEvent.srcElement || document; 3407273562Smarcel } 3408273562Smarcel 3409273562Smarcel // Target should not be a text node (#504, Safari) 3410273562Smarcel if ( event.target.nodeType === 3 ) { 3411273562Smarcel event.target = event.target.parentNode; 3412273562Smarcel } 3413273562Smarcel 3414273562Smarcel // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) 3415273562Smarcel if ( event.metaKey === undefined ) { 3416273562Smarcel event.metaKey = event.ctrlKey; 3417273562Smarcel } 3418273562Smarcel 3419273562Smarcel return fixHook.filter? fixHook.filter( event, originalEvent ) : event; 3420273562Smarcel }, 3421273562Smarcel 3422273562Smarcel special: { 3423273562Smarcel ready: { 3424273562Smarcel // Make sure the ready event is setup 3425273562Smarcel setup: jQuery.bindReady 3426273562Smarcel }, 3427273562Smarcel 3428273562Smarcel focus: { 3429273562Smarcel delegateType: "focusin", 3430273562Smarcel noBubble: true 3431273562Smarcel }, 3432273562Smarcel blur: { 3433273562Smarcel delegateType: "focusout", 3434273562Smarcel noBubble: true 3435273562Smarcel }, 3436273562Smarcel 3437273562Smarcel beforeunload: { 3438273562Smarcel setup: function( data, namespaces, eventHandle ) { 3439273562Smarcel // We only want to do this special case on windows 3440273562Smarcel if ( jQuery.isWindow( this ) ) { 3441273562Smarcel this.onbeforeunload = eventHandle; 3442273562Smarcel } 3443273562Smarcel }, 3444273562Smarcel 3445273562Smarcel teardown: function( namespaces, eventHandle ) { 3446273562Smarcel if ( this.onbeforeunload === eventHandle ) { 3447273562Smarcel this.onbeforeunload = null; 3448273562Smarcel } 3449273562Smarcel } 3450273562Smarcel } 3451273562Smarcel }, 3452273562Smarcel 3453273562Smarcel simulate: function( type, elem, event, bubble ) { 3454273562Smarcel // Piggyback on a donor event to simulate a different one. 3455273562Smarcel // Fake originalEvent to avoid donor's stopPropagation, but if the 3456273562Smarcel // simulated event prevents default then we do the same on the donor. 3457273562Smarcel var e = jQuery.extend( 3458273562Smarcel new jQuery.Event(), 3459273562Smarcel event, 3460273562Smarcel { type: type, 3461273562Smarcel isSimulated: true, 3462273562Smarcel originalEvent: {} 3463273562Smarcel } 3464273562Smarcel ); 3465273562Smarcel if ( bubble ) { 3466273562Smarcel jQuery.event.trigger( e, null, elem ); 3467273562Smarcel } else { 3468273562Smarcel jQuery.event.dispatch.call( elem, e ); 3469273562Smarcel } 3470273562Smarcel if ( e.isDefaultPrevented() ) { 3471273562Smarcel event.preventDefault(); 3472273562Smarcel } 3473273562Smarcel } 3474273562Smarcel}; 3475273562Smarcel 3476273562Smarcel// Some plugins are using, but it's undocumented/deprecated and will be removed. 3477273562Smarcel// The 1.7 special event interface should provide all the hooks needed now. 3478273562SmarceljQuery.event.handle = jQuery.event.dispatch; 3479273562Smarcel 3480273562SmarceljQuery.removeEvent = document.removeEventListener ? 3481273562Smarcel function( elem, type, handle ) { 3482273562Smarcel if ( elem.removeEventListener ) { 3483273562Smarcel elem.removeEventListener( type, handle, false ); 3484273562Smarcel } 3485273562Smarcel } : 3486273562Smarcel function( elem, type, handle ) { 3487273562Smarcel if ( elem.detachEvent ) { 3488273562Smarcel elem.detachEvent( "on" + type, handle ); 3489273562Smarcel } 3490273562Smarcel }; 3491273562Smarcel 3492273562SmarceljQuery.Event = function( src, props ) { 3493273562Smarcel // Allow instantiation without the 'new' keyword 3494273562Smarcel if ( !(this instanceof jQuery.Event) ) { 3495273562Smarcel return new jQuery.Event( src, props ); 3496273562Smarcel } 3497273562Smarcel 3498273562Smarcel // Event object 3499273562Smarcel if ( src && src.type ) { 3500273562Smarcel this.originalEvent = src; 3501273562Smarcel this.type = src.type; 3502273562Smarcel 3503273562Smarcel // Events bubbling up the document may have been marked as prevented 3504273562Smarcel // by a handler lower down the tree; reflect the correct value. 3505273562Smarcel this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || 3506273562Smarcel src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; 3507273562Smarcel 3508273562Smarcel // Event type 3509273562Smarcel } else { 3510273562Smarcel this.type = src; 3511273562Smarcel } 3512273562Smarcel 3513273562Smarcel // Put explicitly provided properties onto the event object 3514273562Smarcel if ( props ) { 3515273562Smarcel jQuery.extend( this, props ); 3516273562Smarcel } 3517273562Smarcel 3518273562Smarcel // Create a timestamp if incoming event doesn't have one 3519273562Smarcel this.timeStamp = src && src.timeStamp || jQuery.now(); 3520273562Smarcel 3521273562Smarcel // Mark it as fixed 3522273562Smarcel this[ jQuery.expando ] = true; 3523273562Smarcel}; 3524273562Smarcel 3525273562Smarcelfunction returnFalse() { 3526273562Smarcel return false; 3527273562Smarcel} 3528273562Smarcelfunction returnTrue() { 3529273562Smarcel return true; 3530273562Smarcel} 3531273562Smarcel 3532273562Smarcel// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding 3533273562Smarcel// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html 3534273562SmarceljQuery.Event.prototype = { 3535273562Smarcel preventDefault: function() { 3536273562Smarcel this.isDefaultPrevented = returnTrue; 3537273562Smarcel 3538273562Smarcel var e = this.originalEvent; 3539273562Smarcel if ( !e ) { 3540273562Smarcel return; 3541273562Smarcel } 3542273562Smarcel 3543273562Smarcel // if preventDefault exists run it on the original event 3544273562Smarcel if ( e.preventDefault ) { 3545273562Smarcel e.preventDefault(); 3546273562Smarcel 3547273562Smarcel // otherwise set the returnValue property of the original event to false (IE) 3548273562Smarcel } else { 3549273562Smarcel e.returnValue = false; 3550273562Smarcel } 3551273562Smarcel }, 3552273562Smarcel stopPropagation: function() { 3553273562Smarcel this.isPropagationStopped = returnTrue; 3554273562Smarcel 3555273562Smarcel var e = this.originalEvent; 3556273562Smarcel if ( !e ) { 3557273562Smarcel return; 3558273562Smarcel } 3559273562Smarcel // if stopPropagation exists run it on the original event 3560273562Smarcel if ( e.stopPropagation ) { 3561273562Smarcel e.stopPropagation(); 3562273562Smarcel } 3563273562Smarcel // otherwise set the cancelBubble property of the original event to true (IE) 3564273562Smarcel e.cancelBubble = true; 3565273562Smarcel }, 3566273562Smarcel stopImmediatePropagation: function() { 3567273562Smarcel this.isImmediatePropagationStopped = returnTrue; 3568273562Smarcel this.stopPropagation(); 3569273562Smarcel }, 3570273562Smarcel isDefaultPrevented: returnFalse, 3571273562Smarcel isPropagationStopped: returnFalse, 3572273562Smarcel isImmediatePropagationStopped: returnFalse 3573273562Smarcel}; 3574273562Smarcel 3575273562Smarcel// Create mouseenter/leave events using mouseover/out and event-time checks 3576273562SmarceljQuery.each({ 3577273562Smarcel mouseenter: "mouseover", 3578273562Smarcel mouseleave: "mouseout" 3579273562Smarcel}, function( orig, fix ) { 3580273562Smarcel jQuery.event.special[ orig ] = jQuery.event.special[ fix ] = { 3581273562Smarcel delegateType: fix, 3582273562Smarcel bindType: fix, 3583273562Smarcel 3584273562Smarcel handle: function( event ) { 3585273562Smarcel var target = this, 3586273562Smarcel related = event.relatedTarget, 3587273562Smarcel handleObj = event.handleObj, 3588273562Smarcel selector = handleObj.selector, 3589273562Smarcel oldType, ret; 3590273562Smarcel 3591273562Smarcel // For a real mouseover/out, always call the handler; for 3592273562Smarcel // mousenter/leave call the handler if related is outside the target. 3593273562Smarcel // NB: No relatedTarget if the mouse left/entered the browser window 3594273562Smarcel if ( !related || handleObj.origType === event.type || (related !== target && !jQuery.contains( target, related )) ) { 3595273562Smarcel oldType = event.type; 3596273562Smarcel event.type = handleObj.origType; 3597273562Smarcel ret = handleObj.handler.apply( this, arguments ); 3598273562Smarcel event.type = oldType; 3599273562Smarcel } 3600273562Smarcel return ret; 3601273562Smarcel } 3602273562Smarcel }; 3603273562Smarcel}); 3604273562Smarcel 3605273562Smarcel// IE submit delegation 3606273562Smarcelif ( !jQuery.support.submitBubbles ) { 3607273562Smarcel 3608273562Smarcel jQuery.event.special.submit = { 3609273562Smarcel setup: function() { 3610273562Smarcel // Only need this for delegated form submit events 3611273562Smarcel if ( jQuery.nodeName( this, "form" ) ) { 3612273562Smarcel return false; 3613273562Smarcel } 3614273562Smarcel 3615273562Smarcel // Lazy-add a submit handler when a descendant form may potentially be submitted 3616273562Smarcel jQuery.event.add( this, "click._submit keypress._submit", function( e ) { 3617273562Smarcel // Node name check avoids a VML-related crash in IE (#9807) 3618273562Smarcel var elem = e.target, 3619273562Smarcel form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; 3620273562Smarcel if ( form && !form._submit_attached ) { 3621273562Smarcel jQuery.event.add( form, "submit._submit", function( event ) { 3622273562Smarcel // Form was submitted, bubble the event up the tree 3623273562Smarcel if ( this.parentNode ) { 3624273562Smarcel jQuery.event.simulate( "submit", this.parentNode, event, true ); 3625273562Smarcel } 3626273562Smarcel }); 3627273562Smarcel form._submit_attached = true; 3628273562Smarcel } 3629273562Smarcel }); 3630273562Smarcel // return undefined since we don't need an event listener 3631273562Smarcel }, 3632273562Smarcel 3633273562Smarcel teardown: function() { 3634273562Smarcel // Only need this for delegated form submit events 3635273562Smarcel if ( jQuery.nodeName( this, "form" ) ) { 3636273562Smarcel return false; 3637273562Smarcel } 3638273562Smarcel 3639273562Smarcel // Remove delegated handlers; cleanData eventually reaps submit handlers attached above 3640273562Smarcel jQuery.event.remove( this, "._submit" ); 3641273562Smarcel } 3642273562Smarcel }; 3643273562Smarcel} 3644273562Smarcel 3645273562Smarcel// IE change delegation and checkbox/radio fix 3646273562Smarcelif ( !jQuery.support.changeBubbles ) { 3647273562Smarcel 3648273562Smarcel jQuery.event.special.change = { 3649273562Smarcel 3650273562Smarcel setup: function() { 3651273562Smarcel 3652273562Smarcel if ( rformElems.test( this.nodeName ) ) { 3653273562Smarcel // IE doesn't fire change on a check/radio until blur; trigger it on click 3654273562Smarcel // after a propertychange. Eat the blur-change in special.change.handle. 3655273562Smarcel // This still fires onchange a second time for check/radio after blur. 3656273562Smarcel if ( this.type === "checkbox" || this.type === "radio" ) { 3657273562Smarcel jQuery.event.add( this, "propertychange._change", function( event ) { 3658273562Smarcel if ( event.originalEvent.propertyName === "checked" ) { 3659273562Smarcel this._just_changed = true; 3660273562Smarcel } 3661273562Smarcel }); 3662273562Smarcel jQuery.event.add( this, "click._change", function( event ) { 3663273562Smarcel if ( this._just_changed ) { 3664273562Smarcel this._just_changed = false; 3665273562Smarcel jQuery.event.simulate( "change", this, event, true ); 3666273562Smarcel } 3667273562Smarcel }); 3668273562Smarcel } 3669273562Smarcel return false; 3670273562Smarcel } 3671273562Smarcel // Delegated event; lazy-add a change handler on descendant inputs 3672273562Smarcel jQuery.event.add( this, "beforeactivate._change", function( e ) { 3673273562Smarcel var elem = e.target; 3674273562Smarcel 3675273562Smarcel if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { 3676273562Smarcel jQuery.event.add( elem, "change._change", function( event ) { 3677273562Smarcel if ( this.parentNode && !event.isSimulated ) { 3678273562Smarcel jQuery.event.simulate( "change", this.parentNode, event, true ); 3679273562Smarcel } 3680273562Smarcel }); 3681273562Smarcel elem._change_attached = true; 3682273562Smarcel } 3683273562Smarcel }); 3684273562Smarcel }, 3685273562Smarcel 3686273562Smarcel handle: function( event ) { 3687273562Smarcel var elem = event.target; 3688273562Smarcel 3689273562Smarcel // Swallow native change events from checkbox/radio, we already triggered them above 3690273562Smarcel if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { 3691273562Smarcel return event.handleObj.handler.apply( this, arguments ); 3692273562Smarcel } 3693273562Smarcel }, 3694273562Smarcel 3695273562Smarcel teardown: function() { 3696273562Smarcel jQuery.event.remove( this, "._change" ); 3697273562Smarcel 3698273562Smarcel return rformElems.test( this.nodeName ); 3699273562Smarcel } 3700273562Smarcel }; 3701273562Smarcel} 3702273562Smarcel 3703273562Smarcel// Create "bubbling" focus and blur events 3704273562Smarcelif ( !jQuery.support.focusinBubbles ) { 3705273562Smarcel jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { 3706273562Smarcel 3707273562Smarcel // Attach a single capturing handler while someone wants focusin/focusout 3708273562Smarcel var attaches = 0, 3709273562Smarcel handler = function( event ) { 3710273562Smarcel jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); 3711273562Smarcel }; 3712273562Smarcel 3713273562Smarcel jQuery.event.special[ fix ] = { 3714273562Smarcel setup: function() { 3715273562Smarcel if ( attaches++ === 0 ) { 3716273562Smarcel document.addEventListener( orig, handler, true ); 3717273562Smarcel } 3718273562Smarcel }, 3719273562Smarcel teardown: function() { 3720273562Smarcel if ( --attaches === 0 ) { 3721273562Smarcel document.removeEventListener( orig, handler, true ); 3722273562Smarcel } 3723273562Smarcel } 3724273562Smarcel }; 3725273562Smarcel }); 3726273562Smarcel} 3727273562Smarcel 3728273562SmarceljQuery.fn.extend({ 3729273562Smarcel 3730273562Smarcel on: function( types, selector, data, fn, /*INTERNAL*/ one ) { 3731273562Smarcel var origFn, type; 3732273562Smarcel 3733273562Smarcel // Types can be a map of types/handlers 3734273562Smarcel if ( typeof types === "object" ) { 3735273562Smarcel // ( types-Object, selector, data ) 3736273562Smarcel if ( typeof selector !== "string" ) { 3737273562Smarcel // ( types-Object, data ) 3738273562Smarcel data = selector; 3739273562Smarcel selector = undefined; 3740273562Smarcel } 3741273562Smarcel for ( type in types ) { 3742273562Smarcel this.on( type, selector, data, types[ type ], one ); 3743273562Smarcel } 3744273562Smarcel return this; 3745273562Smarcel } 3746273562Smarcel 3747273562Smarcel if ( data == null && fn == null ) { 3748273562Smarcel // ( types, fn ) 3749273562Smarcel fn = selector; 3750273562Smarcel data = selector = undefined; 3751273562Smarcel } else if ( fn == null ) { 3752273562Smarcel if ( typeof selector === "string" ) { 3753273562Smarcel // ( types, selector, fn ) 3754273562Smarcel fn = data; 3755273562Smarcel data = undefined; 3756273562Smarcel } else { 3757273562Smarcel // ( types, data, fn ) 3758273562Smarcel fn = data; 3759273562Smarcel data = selector; 3760273562Smarcel selector = undefined; 3761273562Smarcel } 3762273562Smarcel } 3763273562Smarcel if ( fn === false ) { 3764273562Smarcel fn = returnFalse; 3765273562Smarcel } else if ( !fn ) { 3766273562Smarcel return this; 3767273562Smarcel } 3768273562Smarcel 3769273562Smarcel if ( one === 1 ) { 3770273562Smarcel origFn = fn; 3771273562Smarcel fn = function( event ) { 3772273562Smarcel // Can use an empty set, since event contains the info 3773273562Smarcel jQuery().off( event ); 3774273562Smarcel return origFn.apply( this, arguments ); 3775273562Smarcel }; 3776273562Smarcel // Use same guid so caller can remove using origFn 3777273562Smarcel fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); 3778273562Smarcel } 3779273562Smarcel return this.each( function() { 3780273562Smarcel jQuery.event.add( this, types, fn, data, selector ); 3781273562Smarcel }); 3782273562Smarcel }, 3783273562Smarcel one: function( types, selector, data, fn ) { 3784273562Smarcel return this.on.call( this, types, selector, data, fn, 1 ); 3785273562Smarcel }, 3786273562Smarcel off: function( types, selector, fn ) { 3787273562Smarcel if ( types && types.preventDefault && types.handleObj ) { 3788273562Smarcel // ( event ) dispatched jQuery.Event 3789273562Smarcel var handleObj = types.handleObj; 3790273562Smarcel jQuery( types.delegateTarget ).off( 3791273562Smarcel handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type, 3792273562Smarcel handleObj.selector, 3793273562Smarcel handleObj.handler 3794273562Smarcel ); 3795273562Smarcel return this; 3796273562Smarcel } 3797273562Smarcel if ( typeof types === "object" ) { 3798273562Smarcel // ( types-object [, selector] ) 3799273562Smarcel for ( var type in types ) { 3800273562Smarcel this.off( type, selector, types[ type ] ); 3801273562Smarcel } 3802273562Smarcel return this; 3803273562Smarcel } 3804273562Smarcel if ( selector === false || typeof selector === "function" ) { 3805273562Smarcel // ( types [, fn] ) 3806273562Smarcel fn = selector; 3807273562Smarcel selector = undefined; 3808273562Smarcel } 3809273562Smarcel if ( fn === false ) { 3810273562Smarcel fn = returnFalse; 3811273562Smarcel } 3812273562Smarcel return this.each(function() { 3813273562Smarcel jQuery.event.remove( this, types, fn, selector ); 3814273562Smarcel }); 3815273562Smarcel }, 3816273562Smarcel 3817273562Smarcel bind: function( types, data, fn ) { 3818273562Smarcel return this.on( types, null, data, fn ); 3819273562Smarcel }, 3820273562Smarcel unbind: function( types, fn ) { 3821273562Smarcel return this.off( types, null, fn ); 3822273562Smarcel }, 3823273562Smarcel 3824273562Smarcel live: function( types, data, fn ) { 3825273562Smarcel jQuery( this.context ).on( types, this.selector, data, fn ); 3826273562Smarcel return this; 3827273562Smarcel }, 3828273562Smarcel die: function( types, fn ) { 3829273562Smarcel jQuery( this.context ).off( types, this.selector || "**", fn ); 3830273562Smarcel return this; 3831273562Smarcel }, 3832273562Smarcel 3833273562Smarcel delegate: function( selector, types, data, fn ) { 3834273562Smarcel return this.on( types, selector, data, fn ); 3835273562Smarcel }, 3836273562Smarcel undelegate: function( selector, types, fn ) { 3837273562Smarcel // ( namespace ) or ( selector, types [, fn] ) 3838273562Smarcel return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); 3839273562Smarcel }, 3840273562Smarcel 3841273562Smarcel trigger: function( type, data ) { 3842273562Smarcel return this.each(function() { 3843273562Smarcel jQuery.event.trigger( type, data, this ); 3844273562Smarcel }); 3845273562Smarcel }, 3846273562Smarcel triggerHandler: function( type, data ) { 3847273562Smarcel if ( this[0] ) { 3848273562Smarcel return jQuery.event.trigger( type, data, this[0], true ); 3849273562Smarcel } 3850273562Smarcel }, 3851273562Smarcel 3852273562Smarcel toggle: function( fn ) { 3853273562Smarcel // Save reference to arguments for access in closure 3854273562Smarcel var args = arguments, 3855273562Smarcel guid = fn.guid || jQuery.guid++, 3856273562Smarcel i = 0, 3857273562Smarcel toggler = function( event ) { 3858273562Smarcel // Figure out which function to execute 3859273562Smarcel var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; 3860273562Smarcel jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); 3861273562Smarcel 3862273562Smarcel // Make sure that clicks stop 3863273562Smarcel event.preventDefault(); 3864273562Smarcel 3865273562Smarcel // and execute the function 3866273562Smarcel return args[ lastToggle ].apply( this, arguments ) || false; 3867273562Smarcel }; 3868273562Smarcel 3869273562Smarcel // link all the functions, so any of them can unbind this click handler 3870273562Smarcel toggler.guid = guid; 3871273562Smarcel while ( i < args.length ) { 3872273562Smarcel args[ i++ ].guid = guid; 3873273562Smarcel } 3874273562Smarcel 3875273562Smarcel return this.click( toggler ); 3876273562Smarcel }, 3877273562Smarcel 3878273562Smarcel hover: function( fnOver, fnOut ) { 3879273562Smarcel return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); 3880273562Smarcel } 3881273562Smarcel}); 3882273562Smarcel 3883273562SmarceljQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + 3884273562Smarcel "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + 3885273562Smarcel "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { 3886273562Smarcel 3887273562Smarcel // Handle event binding 3888273562Smarcel jQuery.fn[ name ] = function( data, fn ) { 3889273562Smarcel if ( fn == null ) { 3890273562Smarcel fn = data; 3891273562Smarcel data = null; 3892273562Smarcel } 3893273562Smarcel 3894273562Smarcel return arguments.length > 0 ? 3895273562Smarcel this.bind( name, data, fn ) : 3896273562Smarcel this.trigger( name ); 3897273562Smarcel }; 3898273562Smarcel 3899273562Smarcel if ( jQuery.attrFn ) { 3900273562Smarcel jQuery.attrFn[ name ] = true; 3901273562Smarcel } 3902273562Smarcel 3903273562Smarcel if ( rkeyEvent.test( name ) ) { 3904273562Smarcel jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; 3905273562Smarcel } 3906273562Smarcel 3907273562Smarcel if ( rmouseEvent.test( name ) ) { 3908273562Smarcel jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; 3909273562Smarcel } 3910273562Smarcel}); 3911273562Smarcel 3912273562Smarcel 3913273562Smarcel 3914273562Smarcel/*! 3915273562Smarcel * Sizzle CSS Selector Engine 3916273562Smarcel * Copyright 2011, The Dojo Foundation 3917273562Smarcel * Released under the MIT, BSD, and GPL Licenses. 3918273562Smarcel * More information: http://sizzlejs.com/ 3919273562Smarcel */ 3920273562Smarcel(function(){ 3921273562Smarcel 3922273562Smarcelvar chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, 3923273562Smarcel expando = "sizcache" + (Math.random() + '').replace('.', ''), 3924273562Smarcel done = 0, 3925273562Smarcel toString = Object.prototype.toString, 3926273562Smarcel hasDuplicate = false, 3927273562Smarcel baseHasDuplicate = true, 3928273562Smarcel rBackslash = /\\/g, 3929273562Smarcel rReturn = /\r\n/g, 3930273562Smarcel rNonWord = /\W/; 3931273562Smarcel 3932273562Smarcel// Here we check if the JavaScript engine is using some sort of 3933273562Smarcel// optimization where it does not always call our comparision 3934273562Smarcel// function. If that is the case, discard the hasDuplicate value. 3935273562Smarcel// Thus far that includes Google Chrome. 3936273562Smarcel[0, 0].sort(function() { 3937273562Smarcel baseHasDuplicate = false; 3938273562Smarcel return 0; 3939273562Smarcel}); 3940273562Smarcel 3941273562Smarcelvar Sizzle = function( selector, context, results, seed ) { 3942273562Smarcel results = results || []; 3943273562Smarcel context = context || document; 3944273562Smarcel 3945273562Smarcel var origContext = context; 3946273562Smarcel 3947273562Smarcel if ( context.nodeType !== 1 && context.nodeType !== 9 ) { 3948273562Smarcel return []; 3949273562Smarcel } 3950273562Smarcel 3951273562Smarcel if ( !selector || typeof selector !== "string" ) { 3952273562Smarcel return results; 3953273562Smarcel } 3954273562Smarcel 3955273562Smarcel var m, set, checkSet, extra, ret, cur, pop, i, 3956273562Smarcel prune = true, 3957273562Smarcel contextXML = Sizzle.isXML( context ), 3958273562Smarcel parts = [], 3959273562Smarcel soFar = selector; 3960273562Smarcel 3961273562Smarcel // Reset the position of the chunker regexp (start from head) 3962273562Smarcel do { 3963273562Smarcel chunker.exec( "" ); 3964273562Smarcel m = chunker.exec( soFar ); 3965273562Smarcel 3966273562Smarcel if ( m ) { 3967273562Smarcel soFar = m[3]; 3968273562Smarcel 3969273562Smarcel parts.push( m[1] ); 3970273562Smarcel 3971273562Smarcel if ( m[2] ) { 3972273562Smarcel extra = m[3]; 3973273562Smarcel break; 3974273562Smarcel } 3975273562Smarcel } 3976273562Smarcel } while ( m ); 3977273562Smarcel 3978273562Smarcel if ( parts.length > 1 && origPOS.exec( selector ) ) { 3979273562Smarcel 3980273562Smarcel if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { 3981273562Smarcel set = posProcess( parts[0] + parts[1], context, seed ); 3982273562Smarcel 3983273562Smarcel } else { 3984273562Smarcel set = Expr.relative[ parts[0] ] ? 3985273562Smarcel [ context ] : 3986273562Smarcel Sizzle( parts.shift(), context ); 3987273562Smarcel 3988273562Smarcel while ( parts.length ) { 3989273562Smarcel selector = parts.shift(); 3990273562Smarcel 3991273562Smarcel if ( Expr.relative[ selector ] ) { 3992273562Smarcel selector += parts.shift(); 3993273562Smarcel } 3994273562Smarcel 3995273562Smarcel set = posProcess( selector, set, seed ); 3996273562Smarcel } 3997273562Smarcel } 3998273562Smarcel 3999273562Smarcel } else { 4000273562Smarcel // Take a shortcut and set the context if the root selector is an ID 4001273562Smarcel // (but not if it'll be faster if the inner selector is an ID) 4002273562Smarcel if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && 4003273562Smarcel Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { 4004273562Smarcel 4005273562Smarcel ret = Sizzle.find( parts.shift(), context, contextXML ); 4006273562Smarcel context = ret.expr ? 4007273562Smarcel Sizzle.filter( ret.expr, ret.set )[0] : 4008273562Smarcel ret.set[0]; 4009273562Smarcel } 4010273562Smarcel 4011273562Smarcel if ( context ) { 4012273562Smarcel ret = seed ? 4013273562Smarcel { expr: parts.pop(), set: makeArray(seed) } : 4014273562Smarcel Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); 4015273562Smarcel 4016273562Smarcel set = ret.expr ? 4017273562Smarcel Sizzle.filter( ret.expr, ret.set ) : 4018273562Smarcel ret.set; 4019273562Smarcel 4020273562Smarcel if ( parts.length > 0 ) { 4021273562Smarcel checkSet = makeArray( set ); 4022273562Smarcel 4023273562Smarcel } else { 4024273562Smarcel prune = false; 4025273562Smarcel } 4026273562Smarcel 4027273562Smarcel while ( parts.length ) { 4028273562Smarcel cur = parts.pop(); 4029273562Smarcel pop = cur; 4030273562Smarcel 4031273562Smarcel if ( !Expr.relative[ cur ] ) { 4032273562Smarcel cur = ""; 4033273562Smarcel } else { 4034273562Smarcel pop = parts.pop(); 4035273562Smarcel } 4036273562Smarcel 4037273562Smarcel if ( pop == null ) { 4038273562Smarcel pop = context; 4039273562Smarcel } 4040273562Smarcel 4041273562Smarcel Expr.relative[ cur ]( checkSet, pop, contextXML ); 4042273562Smarcel } 4043273562Smarcel 4044273562Smarcel } else { 4045273562Smarcel checkSet = parts = []; 4046273562Smarcel } 4047273562Smarcel } 4048273562Smarcel 4049273562Smarcel if ( !checkSet ) { 4050273562Smarcel checkSet = set; 4051273562Smarcel } 4052273562Smarcel 4053273562Smarcel if ( !checkSet ) { 4054273562Smarcel Sizzle.error( cur || selector ); 4055273562Smarcel } 4056273562Smarcel 4057273562Smarcel if ( toString.call(checkSet) === "[object Array]" ) { 4058273562Smarcel if ( !prune ) { 4059273562Smarcel results.push.apply( results, checkSet ); 4060273562Smarcel 4061273562Smarcel } else if ( context && context.nodeType === 1 ) { 4062273562Smarcel for ( i = 0; checkSet[i] != null; i++ ) { 4063273562Smarcel if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { 4064273562Smarcel results.push( set[i] ); 4065273562Smarcel } 4066273562Smarcel } 4067273562Smarcel 4068273562Smarcel } else { 4069273562Smarcel for ( i = 0; checkSet[i] != null; i++ ) { 4070273562Smarcel if ( checkSet[i] && checkSet[i].nodeType === 1 ) { 4071273562Smarcel results.push( set[i] ); 4072273562Smarcel } 4073273562Smarcel } 4074273562Smarcel } 4075273562Smarcel 4076273562Smarcel } else { 4077273562Smarcel makeArray( checkSet, results ); 4078273562Smarcel } 4079273562Smarcel 4080273562Smarcel if ( extra ) { 4081273562Smarcel Sizzle( extra, origContext, results, seed ); 4082273562Smarcel Sizzle.uniqueSort( results ); 4083273562Smarcel } 4084273562Smarcel 4085273562Smarcel return results; 4086273562Smarcel}; 4087273562Smarcel 4088273562SmarcelSizzle.uniqueSort = function( results ) { 4089273562Smarcel if ( sortOrder ) { 4090273562Smarcel hasDuplicate = baseHasDuplicate; 4091273562Smarcel results.sort( sortOrder ); 4092273562Smarcel 4093273562Smarcel if ( hasDuplicate ) { 4094273562Smarcel for ( var i = 1; i < results.length; i++ ) { 4095273562Smarcel if ( results[i] === results[ i - 1 ] ) { 4096273562Smarcel results.splice( i--, 1 ); 4097273562Smarcel } 4098273562Smarcel } 4099273562Smarcel } 4100273562Smarcel } 4101273562Smarcel 4102273562Smarcel return results; 4103273562Smarcel}; 4104273562Smarcel 4105273562SmarcelSizzle.matches = function( expr, set ) { 4106273562Smarcel return Sizzle( expr, null, null, set ); 4107273562Smarcel}; 4108273562Smarcel 4109273562SmarcelSizzle.matchesSelector = function( node, expr ) { 4110273562Smarcel return Sizzle( expr, null, null, [node] ).length > 0; 4111273562Smarcel}; 4112273562Smarcel 4113273562SmarcelSizzle.find = function( expr, context, isXML ) { 4114273562Smarcel var set, i, len, match, type, left; 4115273562Smarcel 4116273562Smarcel if ( !expr ) { 4117273562Smarcel return []; 4118273562Smarcel } 4119273562Smarcel 4120273562Smarcel for ( i = 0, len = Expr.order.length; i < len; i++ ) { 4121273562Smarcel type = Expr.order[i]; 4122273562Smarcel 4123273562Smarcel if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { 4124273562Smarcel left = match[1]; 4125273562Smarcel match.splice( 1, 1 ); 4126273562Smarcel 4127273562Smarcel if ( left.substr( left.length - 1 ) !== "\\" ) { 4128273562Smarcel match[1] = (match[1] || "").replace( rBackslash, "" ); 4129273562Smarcel set = Expr.find[ type ]( match, context, isXML ); 4130273562Smarcel 4131273562Smarcel if ( set != null ) { 4132273562Smarcel expr = expr.replace( Expr.match[ type ], "" ); 4133273562Smarcel break; 4134273562Smarcel } 4135273562Smarcel } 4136273562Smarcel } 4137273562Smarcel } 4138273562Smarcel 4139273562Smarcel if ( !set ) { 4140273562Smarcel set = typeof context.getElementsByTagName !== "undefined" ? 4141273562Smarcel context.getElementsByTagName( "*" ) : 4142273562Smarcel []; 4143273562Smarcel } 4144273562Smarcel 4145273562Smarcel return { set: set, expr: expr }; 4146273562Smarcel}; 4147273562Smarcel 4148273562SmarcelSizzle.filter = function( expr, set, inplace, not ) { 4149273562Smarcel var match, anyFound, 4150273562Smarcel type, found, item, filter, left, 4151273562Smarcel i, pass, 4152273562Smarcel old = expr, 4153273562Smarcel result = [], 4154273562Smarcel curLoop = set, 4155273562Smarcel isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); 4156273562Smarcel 4157273562Smarcel while ( expr && set.length ) { 4158273562Smarcel for ( type in Expr.filter ) { 4159273562Smarcel if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { 4160273562Smarcel filter = Expr.filter[ type ]; 4161273562Smarcel left = match[1]; 4162273562Smarcel 4163273562Smarcel anyFound = false; 4164273562Smarcel 4165273562Smarcel match.splice(1,1); 4166273562Smarcel 4167273562Smarcel if ( left.substr( left.length - 1 ) === "\\" ) { 4168273562Smarcel continue; 4169273562Smarcel } 4170273562Smarcel 4171273562Smarcel if ( curLoop === result ) { 4172273562Smarcel result = []; 4173273562Smarcel } 4174273562Smarcel 4175273562Smarcel if ( Expr.preFilter[ type ] ) { 4176273562Smarcel match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); 4177273562Smarcel 4178273562Smarcel if ( !match ) { 4179273562Smarcel anyFound = found = true; 4180273562Smarcel 4181273562Smarcel } else if ( match === true ) { 4182273562Smarcel continue; 4183273562Smarcel } 4184273562Smarcel } 4185273562Smarcel 4186273562Smarcel if ( match ) { 4187273562Smarcel for ( i = 0; (item = curLoop[i]) != null; i++ ) { 4188273562Smarcel if ( item ) { 4189273562Smarcel found = filter( item, match, i, curLoop ); 4190273562Smarcel pass = not ^ found; 4191273562Smarcel 4192273562Smarcel if ( inplace && found != null ) { 4193273562Smarcel if ( pass ) { 4194273562Smarcel anyFound = true; 4195273562Smarcel 4196273562Smarcel } else { 4197273562Smarcel curLoop[i] = false; 4198273562Smarcel } 4199273562Smarcel 4200273562Smarcel } else if ( pass ) { 4201273562Smarcel result.push( item ); 4202273562Smarcel anyFound = true; 4203273562Smarcel } 4204273562Smarcel } 4205273562Smarcel } 4206273562Smarcel } 4207273562Smarcel 4208273562Smarcel if ( found !== undefined ) { 4209273562Smarcel if ( !inplace ) { 4210273562Smarcel curLoop = result; 4211273562Smarcel } 4212273562Smarcel 4213273562Smarcel expr = expr.replace( Expr.match[ type ], "" ); 4214273562Smarcel 4215273562Smarcel if ( !anyFound ) { 4216273562Smarcel return []; 4217273562Smarcel } 4218273562Smarcel 4219273562Smarcel break; 4220273562Smarcel } 4221273562Smarcel } 4222273562Smarcel } 4223273562Smarcel 4224273562Smarcel // Improper expression 4225273562Smarcel if ( expr === old ) { 4226273562Smarcel if ( anyFound == null ) { 4227273562Smarcel Sizzle.error( expr ); 4228273562Smarcel 4229273562Smarcel } else { 4230273562Smarcel break; 4231273562Smarcel } 4232273562Smarcel } 4233273562Smarcel 4234273562Smarcel old = expr; 4235273562Smarcel } 4236273562Smarcel 4237273562Smarcel return curLoop; 4238273562Smarcel}; 4239273562Smarcel 4240273562SmarcelSizzle.error = function( msg ) { 4241273562Smarcel throw "Syntax error, unrecognized expression: " + msg; 4242273562Smarcel}; 4243273562Smarcel 4244273562Smarcel/** 4245273562Smarcel * Utility function for retreiving the text value of an array of DOM nodes 4246273562Smarcel * @param {Array|Element} elem 4247273562Smarcel */ 4248273562Smarcelvar getText = Sizzle.getText = function( elem ) { 4249273562Smarcel var i, node, 4250273562Smarcel nodeType = elem.nodeType, 4251273562Smarcel ret = ""; 4252273562Smarcel 4253273562Smarcel if ( nodeType ) { 4254273562Smarcel if ( nodeType === 1 ) { 4255273562Smarcel // Use textContent || innerText for elements 4256273562Smarcel if ( typeof elem.textContent === 'string' ) { 4257273562Smarcel return elem.textContent; 4258273562Smarcel } else if ( typeof elem.innerText === 'string' ) { 4259273562Smarcel // Replace IE's carriage returns 4260273562Smarcel return elem.innerText.replace( rReturn, '' ); 4261273562Smarcel } else { 4262273562Smarcel // Traverse it's children 4263273562Smarcel for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { 4264273562Smarcel ret += getText( elem ); 4265273562Smarcel } 4266273562Smarcel } 4267273562Smarcel } else if ( nodeType === 3 || nodeType === 4 ) { 4268273562Smarcel return elem.nodeValue; 4269273562Smarcel } 4270273562Smarcel } else { 4271273562Smarcel 4272273562Smarcel // If no nodeType, this is expected to be an array 4273273562Smarcel for ( i = 0; (node = elem[i]); i++ ) { 4274273562Smarcel // Do not traverse comment nodes 4275273562Smarcel if ( node.nodeType !== 8 ) { 4276273562Smarcel ret += getText( node ); 4277273562Smarcel } 4278273562Smarcel } 4279273562Smarcel } 4280273562Smarcel return ret; 4281273562Smarcel}; 4282273562Smarcel 4283273562Smarcelvar Expr = Sizzle.selectors = { 4284273562Smarcel order: [ "ID", "NAME", "TAG" ], 4285273562Smarcel 4286273562Smarcel match: { 4287273562Smarcel ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, 4288273562Smarcel CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, 4289273562Smarcel NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, 4290273562Smarcel ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, 4291273562Smarcel TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, 4292273562Smarcel CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, 4293273562Smarcel POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, 4294273562Smarcel PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ 4295273562Smarcel }, 4296273562Smarcel 4297273562Smarcel leftMatch: {}, 4298273562Smarcel 4299273562Smarcel attrMap: { 4300273562Smarcel "class": "className", 4301273562Smarcel "for": "htmlFor" 4302273562Smarcel }, 4303273562Smarcel 4304273562Smarcel attrHandle: { 4305273562Smarcel href: function( elem ) { 4306273562Smarcel return elem.getAttribute( "href" ); 4307273562Smarcel }, 4308273562Smarcel type: function( elem ) { 4309273562Smarcel return elem.getAttribute( "type" ); 4310273562Smarcel } 4311273562Smarcel }, 4312273562Smarcel 4313273562Smarcel relative: { 4314273562Smarcel "+": function(checkSet, part){ 4315273562Smarcel var isPartStr = typeof part === "string", 4316273562Smarcel isTag = isPartStr && !rNonWord.test( part ), 4317273562Smarcel isPartStrNotTag = isPartStr && !isTag; 4318273562Smarcel 4319273562Smarcel if ( isTag ) { 4320273562Smarcel part = part.toLowerCase(); 4321273562Smarcel } 4322273562Smarcel 4323273562Smarcel for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { 4324273562Smarcel if ( (elem = checkSet[i]) ) { 4325273562Smarcel while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} 4326273562Smarcel 4327273562Smarcel checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? 4328273562Smarcel elem || false : 4329273562Smarcel elem === part; 4330273562Smarcel } 4331273562Smarcel } 4332273562Smarcel 4333273562Smarcel if ( isPartStrNotTag ) { 4334273562Smarcel Sizzle.filter( part, checkSet, true ); 4335273562Smarcel } 4336273562Smarcel }, 4337273562Smarcel 4338273562Smarcel ">": function( checkSet, part ) { 4339273562Smarcel var elem, 4340273562Smarcel isPartStr = typeof part === "string", 4341273562Smarcel i = 0, 4342273562Smarcel l = checkSet.length; 4343273562Smarcel 4344273562Smarcel if ( isPartStr && !rNonWord.test( part ) ) { 4345273562Smarcel part = part.toLowerCase(); 4346273562Smarcel 4347273562Smarcel for ( ; i < l; i++ ) { 4348273562Smarcel elem = checkSet[i]; 4349273562Smarcel 4350273562Smarcel if ( elem ) { 4351273562Smarcel var parent = elem.parentNode; 4352273562Smarcel checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; 4353273562Smarcel } 4354273562Smarcel } 4355273562Smarcel 4356273562Smarcel } else { 4357273562Smarcel for ( ; i < l; i++ ) { 4358273562Smarcel elem = checkSet[i]; 4359273562Smarcel 4360273562Smarcel if ( elem ) { 4361273562Smarcel checkSet[i] = isPartStr ? 4362273562Smarcel elem.parentNode : 4363273562Smarcel elem.parentNode === part; 4364273562Smarcel } 4365273562Smarcel } 4366273562Smarcel 4367273562Smarcel if ( isPartStr ) { 4368273562Smarcel Sizzle.filter( part, checkSet, true ); 4369273562Smarcel } 4370273562Smarcel } 4371273562Smarcel }, 4372273562Smarcel 4373273562Smarcel "": function(checkSet, part, isXML){ 4374273562Smarcel var nodeCheck, 4375273562Smarcel doneName = done++, 4376273562Smarcel checkFn = dirCheck; 4377273562Smarcel 4378273562Smarcel if ( typeof part === "string" && !rNonWord.test( part ) ) { 4379273562Smarcel part = part.toLowerCase(); 4380273562Smarcel nodeCheck = part; 4381273562Smarcel checkFn = dirNodeCheck; 4382273562Smarcel } 4383273562Smarcel 4384273562Smarcel checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); 4385273562Smarcel }, 4386273562Smarcel 4387273562Smarcel "~": function( checkSet, part, isXML ) { 4388273562Smarcel var nodeCheck, 4389273562Smarcel doneName = done++, 4390273562Smarcel checkFn = dirCheck; 4391273562Smarcel 4392273562Smarcel if ( typeof part === "string" && !rNonWord.test( part ) ) { 4393273562Smarcel part = part.toLowerCase(); 4394273562Smarcel nodeCheck = part; 4395273562Smarcel checkFn = dirNodeCheck; 4396273562Smarcel } 4397273562Smarcel 4398273562Smarcel checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); 4399273562Smarcel } 4400273562Smarcel }, 4401273562Smarcel 4402273562Smarcel find: { 4403273562Smarcel ID: function( match, context, isXML ) { 4404273562Smarcel if ( typeof context.getElementById !== "undefined" && !isXML ) { 4405273562Smarcel var m = context.getElementById(match[1]); 4406273562Smarcel // Check parentNode to catch when Blackberry 4.6 returns 4407273562Smarcel // nodes that are no longer in the document #6963 4408273562Smarcel return m && m.parentNode ? [m] : []; 4409273562Smarcel } 4410273562Smarcel }, 4411273562Smarcel 4412273562Smarcel NAME: function( match, context ) { 4413273562Smarcel if ( typeof context.getElementsByName !== "undefined" ) { 4414273562Smarcel var ret = [], 4415273562Smarcel results = context.getElementsByName( match[1] ); 4416273562Smarcel 4417273562Smarcel for ( var i = 0, l = results.length; i < l; i++ ) { 4418273562Smarcel if ( results[i].getAttribute("name") === match[1] ) { 4419273562Smarcel ret.push( results[i] ); 4420273562Smarcel } 4421273562Smarcel } 4422273562Smarcel 4423273562Smarcel return ret.length === 0 ? null : ret; 4424273562Smarcel } 4425273562Smarcel }, 4426273562Smarcel 4427273562Smarcel TAG: function( match, context ) { 4428273562Smarcel if ( typeof context.getElementsByTagName !== "undefined" ) { 4429273562Smarcel return context.getElementsByTagName( match[1] ); 4430273562Smarcel } 4431273562Smarcel } 4432273562Smarcel }, 4433273562Smarcel preFilter: { 4434273562Smarcel CLASS: function( match, curLoop, inplace, result, not, isXML ) { 4435273562Smarcel match = " " + match[1].replace( rBackslash, "" ) + " "; 4436273562Smarcel 4437273562Smarcel if ( isXML ) { 4438273562Smarcel return match; 4439273562Smarcel } 4440273562Smarcel 4441273562Smarcel for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { 4442273562Smarcel if ( elem ) { 4443273562Smarcel if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { 4444273562Smarcel if ( !inplace ) { 4445273562Smarcel result.push( elem ); 4446273562Smarcel } 4447273562Smarcel 4448273562Smarcel } else if ( inplace ) { 4449273562Smarcel curLoop[i] = false; 4450273562Smarcel } 4451273562Smarcel } 4452273562Smarcel } 4453273562Smarcel 4454273562Smarcel return false; 4455273562Smarcel }, 4456273562Smarcel 4457273562Smarcel ID: function( match ) { 4458273562Smarcel return match[1].replace( rBackslash, "" ); 4459273562Smarcel }, 4460273562Smarcel 4461273562Smarcel TAG: function( match, curLoop ) { 4462273562Smarcel return match[1].replace( rBackslash, "" ).toLowerCase(); 4463273562Smarcel }, 4464273562Smarcel 4465273562Smarcel CHILD: function( match ) { 4466273562Smarcel if ( match[1] === "nth" ) { 4467273562Smarcel if ( !match[2] ) { 4468273562Smarcel Sizzle.error( match[0] ); 4469273562Smarcel } 4470273562Smarcel 4471273562Smarcel match[2] = match[2].replace(/^\+|\s*/g, ''); 4472273562Smarcel 4473273562Smarcel // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' 4474273562Smarcel var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( 4475273562Smarcel match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || 4476273562Smarcel !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); 4477273562Smarcel 4478273562Smarcel // calculate the numbers (first)n+(last) including if they are negative 4479273562Smarcel match[2] = (test[1] + (test[2] || 1)) - 0; 4480273562Smarcel match[3] = test[3] - 0; 4481273562Smarcel } 4482273562Smarcel else if ( match[2] ) { 4483273562Smarcel Sizzle.error( match[0] ); 4484273562Smarcel } 4485273562Smarcel 4486273562Smarcel // TODO: Move to normal caching system 4487273562Smarcel match[0] = done++; 4488273562Smarcel 4489273562Smarcel return match; 4490273562Smarcel }, 4491273562Smarcel 4492273562Smarcel ATTR: function( match, curLoop, inplace, result, not, isXML ) { 4493273562Smarcel var name = match[1] = match[1].replace( rBackslash, "" ); 4494273562Smarcel 4495273562Smarcel if ( !isXML && Expr.attrMap[name] ) { 4496273562Smarcel match[1] = Expr.attrMap[name]; 4497273562Smarcel } 4498273562Smarcel 4499273562Smarcel // Handle if an un-quoted value was used 4500273562Smarcel match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); 4501273562Smarcel 4502273562Smarcel if ( match[2] === "~=" ) { 4503273562Smarcel match[4] = " " + match[4] + " "; 4504273562Smarcel } 4505273562Smarcel 4506273562Smarcel return match; 4507273562Smarcel }, 4508273562Smarcel 4509273562Smarcel PSEUDO: function( match, curLoop, inplace, result, not ) { 4510273562Smarcel if ( match[1] === "not" ) { 4511273562Smarcel // If we're dealing with a complex expression, or a simple one 4512273562Smarcel if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { 4513273562Smarcel match[3] = Sizzle(match[3], null, null, curLoop); 4514273562Smarcel 4515273562Smarcel } else { 4516273562Smarcel var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); 4517273562Smarcel 4518273562Smarcel if ( !inplace ) { 4519273562Smarcel result.push.apply( result, ret ); 4520273562Smarcel } 4521273562Smarcel 4522273562Smarcel return false; 4523273562Smarcel } 4524273562Smarcel 4525273562Smarcel } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { 4526273562Smarcel return true; 4527273562Smarcel } 4528273562Smarcel 4529273562Smarcel return match; 4530273562Smarcel }, 4531273562Smarcel 4532273562Smarcel POS: function( match ) { 4533273562Smarcel match.unshift( true ); 4534273562Smarcel 4535273562Smarcel return match; 4536273562Smarcel } 4537273562Smarcel }, 4538273562Smarcel 4539273562Smarcel filters: { 4540273562Smarcel enabled: function( elem ) { 4541273562Smarcel return elem.disabled === false && elem.type !== "hidden"; 4542273562Smarcel }, 4543273562Smarcel 4544273562Smarcel disabled: function( elem ) { 4545273562Smarcel return elem.disabled === true; 4546273562Smarcel }, 4547273562Smarcel 4548273562Smarcel checked: function( elem ) { 4549273562Smarcel return elem.checked === true; 4550273562Smarcel }, 4551273562Smarcel 4552273562Smarcel selected: function( elem ) { 4553273562Smarcel // Accessing this property makes selected-by-default 4554273562Smarcel // options in Safari work properly 4555273562Smarcel if ( elem.parentNode ) { 4556273562Smarcel elem.parentNode.selectedIndex; 4557273562Smarcel } 4558273562Smarcel 4559273562Smarcel return elem.selected === true; 4560273562Smarcel }, 4561273562Smarcel 4562273562Smarcel parent: function( elem ) { 4563273562Smarcel return !!elem.firstChild; 4564273562Smarcel }, 4565273562Smarcel 4566273562Smarcel empty: function( elem ) { 4567273562Smarcel return !elem.firstChild; 4568273562Smarcel }, 4569273562Smarcel 4570273562Smarcel has: function( elem, i, match ) { 4571273562Smarcel return !!Sizzle( match[3], elem ).length; 4572273562Smarcel }, 4573273562Smarcel 4574273562Smarcel header: function( elem ) { 4575273562Smarcel return (/h\d/i).test( elem.nodeName ); 4576273562Smarcel }, 4577273562Smarcel 4578273562Smarcel text: function( elem ) { 4579273562Smarcel var attr = elem.getAttribute( "type" ), type = elem.type; 4580273562Smarcel // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 4581273562Smarcel // use getAttribute instead to test this case 4582273562Smarcel return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); 4583273562Smarcel }, 4584273562Smarcel 4585273562Smarcel radio: function( elem ) { 4586273562Smarcel return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; 4587273562Smarcel }, 4588273562Smarcel 4589273562Smarcel checkbox: function( elem ) { 4590273562Smarcel return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; 4591273562Smarcel }, 4592273562Smarcel 4593273562Smarcel file: function( elem ) { 4594273562Smarcel return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; 4595273562Smarcel }, 4596273562Smarcel 4597273562Smarcel password: function( elem ) { 4598273562Smarcel return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; 4599273562Smarcel }, 4600273562Smarcel 4601273562Smarcel submit: function( elem ) { 4602273562Smarcel var name = elem.nodeName.toLowerCase(); 4603273562Smarcel return (name === "input" || name === "button") && "submit" === elem.type; 4604273562Smarcel }, 4605273562Smarcel 4606273562Smarcel image: function( elem ) { 4607273562Smarcel return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; 4608273562Smarcel }, 4609273562Smarcel 4610273562Smarcel reset: function( elem ) { 4611273562Smarcel var name = elem.nodeName.toLowerCase(); 4612273562Smarcel return (name === "input" || name === "button") && "reset" === elem.type; 4613273562Smarcel }, 4614273562Smarcel 4615273562Smarcel button: function( elem ) { 4616273562Smarcel var name = elem.nodeName.toLowerCase(); 4617273562Smarcel return name === "input" && "button" === elem.type || name === "button"; 4618273562Smarcel }, 4619273562Smarcel 4620273562Smarcel input: function( elem ) { 4621273562Smarcel return (/input|select|textarea|button/i).test( elem.nodeName ); 4622273562Smarcel }, 4623273562Smarcel 4624273562Smarcel focus: function( elem ) { 4625273562Smarcel return elem === elem.ownerDocument.activeElement; 4626273562Smarcel } 4627273562Smarcel }, 4628273562Smarcel setFilters: { 4629273562Smarcel first: function( elem, i ) { 4630273562Smarcel return i === 0; 4631273562Smarcel }, 4632273562Smarcel 4633273562Smarcel last: function( elem, i, match, array ) { 4634273562Smarcel return i === array.length - 1; 4635273562Smarcel }, 4636273562Smarcel 4637273562Smarcel even: function( elem, i ) { 4638273562Smarcel return i % 2 === 0; 4639273562Smarcel }, 4640273562Smarcel 4641273562Smarcel odd: function( elem, i ) { 4642273562Smarcel return i % 2 === 1; 4643273562Smarcel }, 4644273562Smarcel 4645273562Smarcel lt: function( elem, i, match ) { 4646273562Smarcel return i < match[3] - 0; 4647273562Smarcel }, 4648273562Smarcel 4649273562Smarcel gt: function( elem, i, match ) { 4650273562Smarcel return i > match[3] - 0; 4651273562Smarcel }, 4652273562Smarcel 4653273562Smarcel nth: function( elem, i, match ) { 4654273562Smarcel return match[3] - 0 === i; 4655273562Smarcel }, 4656273562Smarcel 4657273562Smarcel eq: function( elem, i, match ) { 4658273562Smarcel return match[3] - 0 === i; 4659273562Smarcel } 4660273562Smarcel }, 4661273562Smarcel filter: { 4662273562Smarcel PSEUDO: function( elem, match, i, array ) { 4663273562Smarcel var name = match[1], 4664273562Smarcel filter = Expr.filters[ name ]; 4665273562Smarcel 4666273562Smarcel if ( filter ) { 4667273562Smarcel return filter( elem, i, match, array ); 4668273562Smarcel 4669273562Smarcel } else if ( name === "contains" ) { 4670273562Smarcel return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; 4671273562Smarcel 4672273562Smarcel } else if ( name === "not" ) { 4673273562Smarcel var not = match[3]; 4674273562Smarcel 4675273562Smarcel for ( var j = 0, l = not.length; j < l; j++ ) { 4676273562Smarcel if ( not[j] === elem ) { 4677273562Smarcel return false; 4678273562Smarcel } 4679273562Smarcel } 4680273562Smarcel 4681273562Smarcel return true; 4682273562Smarcel 4683273562Smarcel } else { 4684273562Smarcel Sizzle.error( name ); 4685273562Smarcel } 4686273562Smarcel }, 4687273562Smarcel 4688273562Smarcel CHILD: function( elem, match ) { 4689273562Smarcel var first, last, 4690273562Smarcel doneName, parent, cache, 4691273562Smarcel count, diff, 4692273562Smarcel type = match[1], 4693273562Smarcel node = elem; 4694273562Smarcel 4695273562Smarcel switch ( type ) { 4696273562Smarcel case "only": 4697273562Smarcel case "first": 4698273562Smarcel while ( (node = node.previousSibling) ) { 4699273562Smarcel if ( node.nodeType === 1 ) { 4700273562Smarcel return false; 4701273562Smarcel } 4702273562Smarcel } 4703273562Smarcel 4704273562Smarcel if ( type === "first" ) { 4705273562Smarcel return true; 4706273562Smarcel } 4707273562Smarcel 4708273562Smarcel node = elem; 4709273562Smarcel 4710273562Smarcel case "last": 4711273562Smarcel while ( (node = node.nextSibling) ) { 4712273562Smarcel if ( node.nodeType === 1 ) { 4713273562Smarcel return false; 4714273562Smarcel } 4715273562Smarcel } 4716273562Smarcel 4717273562Smarcel return true; 4718273562Smarcel 4719273562Smarcel case "nth": 4720273562Smarcel first = match[2]; 4721273562Smarcel last = match[3]; 4722273562Smarcel 4723273562Smarcel if ( first === 1 && last === 0 ) { 4724273562Smarcel return true; 4725273562Smarcel } 4726273562Smarcel 4727273562Smarcel doneName = match[0]; 4728273562Smarcel parent = elem.parentNode; 4729273562Smarcel 4730273562Smarcel if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { 4731273562Smarcel count = 0; 4732273562Smarcel 4733273562Smarcel for ( node = parent.firstChild; node; node = node.nextSibling ) { 4734273562Smarcel if ( node.nodeType === 1 ) { 4735273562Smarcel node.nodeIndex = ++count; 4736273562Smarcel } 4737273562Smarcel } 4738273562Smarcel 4739273562Smarcel parent[ expando ] = doneName; 4740273562Smarcel } 4741273562Smarcel 4742273562Smarcel diff = elem.nodeIndex - last; 4743273562Smarcel 4744273562Smarcel if ( first === 0 ) { 4745273562Smarcel return diff === 0; 4746273562Smarcel 4747273562Smarcel } else { 4748273562Smarcel return ( diff % first === 0 && diff / first >= 0 ); 4749273562Smarcel } 4750273562Smarcel } 4751273562Smarcel }, 4752273562Smarcel 4753273562Smarcel ID: function( elem, match ) { 4754273562Smarcel return elem.nodeType === 1 && elem.getAttribute("id") === match; 4755273562Smarcel }, 4756273562Smarcel 4757273562Smarcel TAG: function( elem, match ) { 4758273562Smarcel return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; 4759273562Smarcel }, 4760273562Smarcel 4761273562Smarcel CLASS: function( elem, match ) { 4762273562Smarcel return (" " + (elem.className || elem.getAttribute("class")) + " ") 4763273562Smarcel .indexOf( match ) > -1; 4764273562Smarcel }, 4765273562Smarcel 4766273562Smarcel ATTR: function( elem, match ) { 4767273562Smarcel var name = match[1], 4768273562Smarcel result = Sizzle.attr ? 4769273562Smarcel Sizzle.attr( elem, name ) : 4770273562Smarcel Expr.attrHandle[ name ] ? 4771273562Smarcel Expr.attrHandle[ name ]( elem ) : 4772273562Smarcel elem[ name ] != null ? 4773273562Smarcel elem[ name ] : 4774273562Smarcel elem.getAttribute( name ), 4775273562Smarcel value = result + "", 4776273562Smarcel type = match[2], 4777273562Smarcel check = match[4]; 4778273562Smarcel 4779273562Smarcel return result == null ? 4780273562Smarcel type === "!=" : 4781273562Smarcel !type && Sizzle.attr ? 4782273562Smarcel result != null : 4783273562Smarcel type === "=" ? 4784273562Smarcel value === check : 4785273562Smarcel type === "*=" ? 4786273562Smarcel value.indexOf(check) >= 0 : 4787273562Smarcel type === "~=" ? 4788273562Smarcel (" " + value + " ").indexOf(check) >= 0 : 4789273562Smarcel !check ? 4790273562Smarcel value && result !== false : 4791273562Smarcel type === "!=" ? 4792273562Smarcel value !== check : 4793273562Smarcel type === "^=" ? 4794273562Smarcel value.indexOf(check) === 0 : 4795273562Smarcel type === "$=" ? 4796273562Smarcel value.substr(value.length - check.length) === check : 4797273562Smarcel type === "|=" ? 4798273562Smarcel value === check || value.substr(0, check.length + 1) === check + "-" : 4799273562Smarcel false; 4800273562Smarcel }, 4801273562Smarcel 4802273562Smarcel POS: function( elem, match, i, array ) { 4803273562Smarcel var name = match[2], 4804273562Smarcel filter = Expr.setFilters[ name ]; 4805273562Smarcel 4806273562Smarcel if ( filter ) { 4807273562Smarcel return filter( elem, i, match, array ); 4808273562Smarcel } 4809273562Smarcel } 4810273562Smarcel } 4811273562Smarcel}; 4812273562Smarcel 4813273562Smarcelvar origPOS = Expr.match.POS, 4814273562Smarcel fescape = function(all, num){ 4815273562Smarcel return "\\" + (num - 0 + 1); 4816273562Smarcel }; 4817273562Smarcel 4818273562Smarcelfor ( var type in Expr.match ) { 4819273562Smarcel Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); 4820273562Smarcel Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); 4821273562Smarcel} 4822273562Smarcel 4823273562Smarcelvar makeArray = function( array, results ) { 4824273562Smarcel array = Array.prototype.slice.call( array, 0 ); 4825273562Smarcel 4826273562Smarcel if ( results ) { 4827273562Smarcel results.push.apply( results, array ); 4828273562Smarcel return results; 4829273562Smarcel } 4830273562Smarcel 4831273562Smarcel return array; 4832273562Smarcel}; 4833273562Smarcel 4834273562Smarcel// Perform a simple check to determine if the browser is capable of 4835273562Smarcel// converting a NodeList to an array using builtin methods. 4836273562Smarcel// Also verifies that the returned array holds DOM nodes 4837273562Smarcel// (which is not the case in the Blackberry browser) 4838273562Smarceltry { 4839273562Smarcel Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; 4840273562Smarcel 4841273562Smarcel// Provide a fallback method if it does not work 4842273562Smarcel} catch( e ) { 4843273562Smarcel makeArray = function( array, results ) { 4844273562Smarcel var i = 0, 4845273562Smarcel ret = results || []; 4846273562Smarcel 4847273562Smarcel if ( toString.call(array) === "[object Array]" ) { 4848273562Smarcel Array.prototype.push.apply( ret, array ); 4849273562Smarcel 4850273562Smarcel } else { 4851273562Smarcel if ( typeof array.length === "number" ) { 4852273562Smarcel for ( var l = array.length; i < l; i++ ) { 4853273562Smarcel ret.push( array[i] ); 4854273562Smarcel } 4855273562Smarcel 4856273562Smarcel } else { 4857273562Smarcel for ( ; array[i]; i++ ) { 4858273562Smarcel ret.push( array[i] ); 4859273562Smarcel } 4860273562Smarcel } 4861273562Smarcel } 4862273562Smarcel 4863273562Smarcel return ret; 4864273562Smarcel }; 4865273562Smarcel} 4866273562Smarcel 4867273562Smarcelvar sortOrder, siblingCheck; 4868273562Smarcel 4869273562Smarcelif ( document.documentElement.compareDocumentPosition ) { 4870273562Smarcel sortOrder = function( a, b ) { 4871273562Smarcel if ( a === b ) { 4872273562Smarcel hasDuplicate = true; 4873273562Smarcel return 0; 4874273562Smarcel } 4875273562Smarcel 4876273562Smarcel if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { 4877273562Smarcel return a.compareDocumentPosition ? -1 : 1; 4878273562Smarcel } 4879273562Smarcel 4880273562Smarcel return a.compareDocumentPosition(b) & 4 ? -1 : 1; 4881273562Smarcel }; 4882273562Smarcel 4883273562Smarcel} else { 4884273562Smarcel sortOrder = function( a, b ) { 4885273562Smarcel // The nodes are identical, we can exit early 4886273562Smarcel if ( a === b ) { 4887273562Smarcel hasDuplicate = true; 4888273562Smarcel return 0; 4889273562Smarcel 4890273562Smarcel // Fallback to using sourceIndex (in IE) if it's available on both nodes 4891273562Smarcel } else if ( a.sourceIndex && b.sourceIndex ) { 4892273562Smarcel return a.sourceIndex - b.sourceIndex; 4893273562Smarcel } 4894273562Smarcel 4895273562Smarcel var al, bl, 4896273562Smarcel ap = [], 4897273562Smarcel bp = [], 4898273562Smarcel aup = a.parentNode, 4899273562Smarcel bup = b.parentNode, 4900273562Smarcel cur = aup; 4901273562Smarcel 4902273562Smarcel // If the nodes are siblings (or identical) we can do a quick check 4903273562Smarcel if ( aup === bup ) { 4904273562Smarcel return siblingCheck( a, b ); 4905273562Smarcel 4906273562Smarcel // If no parents were found then the nodes are disconnected 4907273562Smarcel } else if ( !aup ) { 4908273562Smarcel return -1; 4909273562Smarcel 4910273562Smarcel } else if ( !bup ) { 4911273562Smarcel return 1; 4912273562Smarcel } 4913273562Smarcel 4914273562Smarcel // Otherwise they're somewhere else in the tree so we need 4915273562Smarcel // to build up a full list of the parentNodes for comparison 4916273562Smarcel while ( cur ) { 4917273562Smarcel ap.unshift( cur ); 4918273562Smarcel cur = cur.parentNode; 4919273562Smarcel } 4920273562Smarcel 4921273562Smarcel cur = bup; 4922273562Smarcel 4923273562Smarcel while ( cur ) { 4924273562Smarcel bp.unshift( cur ); 4925273562Smarcel cur = cur.parentNode; 4926273562Smarcel } 4927273562Smarcel 4928273562Smarcel al = ap.length; 4929273562Smarcel bl = bp.length; 4930273562Smarcel 4931273562Smarcel // Start walking down the tree looking for a discrepancy 4932273562Smarcel for ( var i = 0; i < al && i < bl; i++ ) { 4933273562Smarcel if ( ap[i] !== bp[i] ) { 4934273562Smarcel return siblingCheck( ap[i], bp[i] ); 4935273562Smarcel } 4936273562Smarcel } 4937273562Smarcel 4938273562Smarcel // We ended someplace up the tree so do a sibling check 4939273562Smarcel return i === al ? 4940273562Smarcel siblingCheck( a, bp[i], -1 ) : 4941273562Smarcel siblingCheck( ap[i], b, 1 ); 4942273562Smarcel }; 4943273562Smarcel 4944273562Smarcel siblingCheck = function( a, b, ret ) { 4945273562Smarcel if ( a === b ) { 4946273562Smarcel return ret; 4947273562Smarcel } 4948273562Smarcel 4949273562Smarcel var cur = a.nextSibling; 4950273562Smarcel 4951273562Smarcel while ( cur ) { 4952273562Smarcel if ( cur === b ) { 4953273562Smarcel return -1; 4954273562Smarcel } 4955273562Smarcel 4956273562Smarcel cur = cur.nextSibling; 4957273562Smarcel } 4958273562Smarcel 4959273562Smarcel return 1; 4960273562Smarcel }; 4961273562Smarcel} 4962273562Smarcel 4963273562Smarcel// Check to see if the browser returns elements by name when 4964273562Smarcel// querying by getElementById (and provide a workaround) 4965273562Smarcel(function(){ 4966273562Smarcel // We're going to inject a fake input element with a specified name 4967273562Smarcel var form = document.createElement("div"), 4968273562Smarcel id = "script" + (new Date()).getTime(), 4969273562Smarcel root = document.documentElement; 4970273562Smarcel 4971273562Smarcel form.innerHTML = "<a name='" + id + "'/>"; 4972273562Smarcel 4973273562Smarcel // Inject it into the root element, check its status, and remove it quickly 4974273562Smarcel root.insertBefore( form, root.firstChild ); 4975273562Smarcel 4976273562Smarcel // The workaround has to do additional checks after a getElementById 4977273562Smarcel // Which slows things down for other browsers (hence the branching) 4978273562Smarcel if ( document.getElementById( id ) ) { 4979273562Smarcel Expr.find.ID = function( match, context, isXML ) { 4980273562Smarcel if ( typeof context.getElementById !== "undefined" && !isXML ) { 4981273562Smarcel var m = context.getElementById(match[1]); 4982273562Smarcel 4983273562Smarcel return m ? 4984273562Smarcel m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? 4985273562Smarcel [m] : 4986273562Smarcel undefined : 4987273562Smarcel []; 4988273562Smarcel } 4989273562Smarcel }; 4990273562Smarcel 4991273562Smarcel Expr.filter.ID = function( elem, match ) { 4992273562Smarcel var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); 4993273562Smarcel 4994273562Smarcel return elem.nodeType === 1 && node && node.nodeValue === match; 4995273562Smarcel }; 4996273562Smarcel } 4997273562Smarcel 4998273562Smarcel root.removeChild( form ); 4999273562Smarcel 5000273562Smarcel // release memory in IE 5001273562Smarcel root = form = null; 5002273562Smarcel})(); 5003273562Smarcel 5004273562Smarcel(function(){ 5005273562Smarcel // Check to see if the browser returns only elements 5006273562Smarcel // when doing getElementsByTagName("*") 5007273562Smarcel 5008273562Smarcel // Create a fake element 5009273562Smarcel var div = document.createElement("div"); 5010273562Smarcel div.appendChild( document.createComment("") ); 5011273562Smarcel 5012273562Smarcel // Make sure no comments are found 5013273562Smarcel if ( div.getElementsByTagName("*").length > 0 ) { 5014273562Smarcel Expr.find.TAG = function( match, context ) { 5015273562Smarcel var results = context.getElementsByTagName( match[1] ); 5016273562Smarcel 5017273562Smarcel // Filter out possible comments 5018273562Smarcel if ( match[1] === "*" ) { 5019273562Smarcel var tmp = []; 5020273562Smarcel 5021273562Smarcel for ( var i = 0; results[i]; i++ ) { 5022273562Smarcel if ( results[i].nodeType === 1 ) { 5023273562Smarcel tmp.push( results[i] ); 5024273562Smarcel } 5025273562Smarcel } 5026273562Smarcel 5027273562Smarcel results = tmp; 5028273562Smarcel } 5029273562Smarcel 5030273562Smarcel return results; 5031273562Smarcel }; 5032273562Smarcel } 5033273562Smarcel 5034273562Smarcel // Check to see if an attribute returns normalized href attributes 5035273562Smarcel div.innerHTML = "<a href='#'></a>"; 5036273562Smarcel 5037273562Smarcel if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && 5038273562Smarcel div.firstChild.getAttribute("href") !== "#" ) { 5039273562Smarcel 5040273562Smarcel Expr.attrHandle.href = function( elem ) { 5041273562Smarcel return elem.getAttribute( "href", 2 ); 5042273562Smarcel }; 5043273562Smarcel } 5044273562Smarcel 5045273562Smarcel // release memory in IE 5046273562Smarcel div = null; 5047273562Smarcel})(); 5048273562Smarcel 5049273562Smarcelif ( document.querySelectorAll ) { 5050273562Smarcel (function(){ 5051273562Smarcel var oldSizzle = Sizzle, 5052273562Smarcel div = document.createElement("div"), 5053273562Smarcel id = "__sizzle__"; 5054273562Smarcel 5055273562Smarcel div.innerHTML = "<p class='TEST'></p>"; 5056273562Smarcel 5057273562Smarcel // Safari can't handle uppercase or unicode characters when 5058273562Smarcel // in quirks mode. 5059273562Smarcel if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { 5060273562Smarcel return; 5061273562Smarcel } 5062273562Smarcel 5063273562Smarcel Sizzle = function( query, context, extra, seed ) { 5064273562Smarcel context = context || document; 5065273562Smarcel 5066273562Smarcel // Only use querySelectorAll on non-XML documents 5067273562Smarcel // (ID selectors don't work in non-HTML documents) 5068273562Smarcel if ( !seed && !Sizzle.isXML(context) ) { 5069273562Smarcel // See if we find a selector to speed up 5070273562Smarcel var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); 5071273562Smarcel 5072273562Smarcel if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { 5073273562Smarcel // Speed-up: Sizzle("TAG") 5074273562Smarcel if ( match[1] ) { 5075273562Smarcel return makeArray( context.getElementsByTagName( query ), extra ); 5076273562Smarcel 5077273562Smarcel // Speed-up: Sizzle(".CLASS") 5078273562Smarcel } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { 5079273562Smarcel return makeArray( context.getElementsByClassName( match[2] ), extra ); 5080273562Smarcel } 5081273562Smarcel } 5082273562Smarcel 5083273562Smarcel if ( context.nodeType === 9 ) { 5084273562Smarcel // Speed-up: Sizzle("body") 5085273562Smarcel // The body element only exists once, optimize finding it 5086273562Smarcel if ( query === "body" && context.body ) { 5087273562Smarcel return makeArray( [ context.body ], extra ); 5088273562Smarcel 5089273562Smarcel // Speed-up: Sizzle("#ID") 5090273562Smarcel } else if ( match && match[3] ) { 5091273562Smarcel var elem = context.getElementById( match[3] ); 5092273562Smarcel 5093273562Smarcel // Check parentNode to catch when Blackberry 4.6 returns 5094273562Smarcel // nodes that are no longer in the document #6963 5095273562Smarcel if ( elem && elem.parentNode ) { 5096273562Smarcel // Handle the case where IE and Opera return items 5097273562Smarcel // by name instead of ID 5098273562Smarcel if ( elem.id === match[3] ) { 5099273562Smarcel return makeArray( [ elem ], extra ); 5100273562Smarcel } 5101273562Smarcel 5102273562Smarcel } else { 5103273562Smarcel return makeArray( [], extra ); 5104273562Smarcel } 5105273562Smarcel } 5106273562Smarcel 5107273562Smarcel try { 5108273562Smarcel return makeArray( context.querySelectorAll(query), extra ); 5109273562Smarcel } catch(qsaError) {} 5110273562Smarcel 5111273562Smarcel // qSA works strangely on Element-rooted queries 5112273562Smarcel // We can work around this by specifying an extra ID on the root 5113273562Smarcel // and working up from there (Thanks to Andrew Dupont for the technique) 5114273562Smarcel // IE 8 doesn't work on object elements 5115273562Smarcel } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { 5116273562Smarcel var oldContext = context, 5117273562Smarcel old = context.getAttribute( "id" ), 5118273562Smarcel nid = old || id, 5119273562Smarcel hasParent = context.parentNode, 5120273562Smarcel relativeHierarchySelector = /^\s*[+~]/.test( query ); 5121273562Smarcel 5122273562Smarcel if ( !old ) { 5123273562Smarcel context.setAttribute( "id", nid ); 5124273562Smarcel } else { 5125273562Smarcel nid = nid.replace( /'/g, "\\$&" ); 5126273562Smarcel } 5127273562Smarcel if ( relativeHierarchySelector && hasParent ) { 5128273562Smarcel context = context.parentNode; 5129273562Smarcel } 5130273562Smarcel 5131273562Smarcel try { 5132273562Smarcel if ( !relativeHierarchySelector || hasParent ) { 5133273562Smarcel return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); 5134273562Smarcel } 5135273562Smarcel 5136273562Smarcel } catch(pseudoError) { 5137273562Smarcel } finally { 5138273562Smarcel if ( !old ) { 5139273562Smarcel oldContext.removeAttribute( "id" ); 5140273562Smarcel } 5141273562Smarcel } 5142273562Smarcel } 5143273562Smarcel } 5144273562Smarcel 5145273562Smarcel return oldSizzle(query, context, extra, seed); 5146273562Smarcel }; 5147273562Smarcel 5148273562Smarcel for ( var prop in oldSizzle ) { 5149273562Smarcel Sizzle[ prop ] = oldSizzle[ prop ]; 5150273562Smarcel } 5151273562Smarcel 5152273562Smarcel // release memory in IE 5153273562Smarcel div = null; 5154273562Smarcel })(); 5155273562Smarcel} 5156273562Smarcel 5157273562Smarcel(function(){ 5158273562Smarcel var html = document.documentElement, 5159273562Smarcel matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; 5160273562Smarcel 5161273562Smarcel if ( matches ) { 5162273562Smarcel // Check to see if it's possible to do matchesSelector 5163273562Smarcel // on a disconnected node (IE 9 fails this) 5164273562Smarcel var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), 5165273562Smarcel pseudoWorks = false; 5166273562Smarcel 5167273562Smarcel try { 5168273562Smarcel // This should fail with an exception 5169273562Smarcel // Gecko does not error, returns false instead 5170273562Smarcel matches.call( document.documentElement, "[test!='']:sizzle" ); 5171273562Smarcel 5172273562Smarcel } catch( pseudoError ) { 5173273562Smarcel pseudoWorks = true; 5174273562Smarcel } 5175273562Smarcel 5176273562Smarcel Sizzle.matchesSelector = function( node, expr ) { 5177273562Smarcel // Make sure that attribute selectors are quoted 5178273562Smarcel expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); 5179273562Smarcel 5180273562Smarcel if ( !Sizzle.isXML( node ) ) { 5181273562Smarcel try { 5182273562Smarcel if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { 5183273562Smarcel var ret = matches.call( node, expr ); 5184273562Smarcel 5185273562Smarcel // IE 9's matchesSelector returns false on disconnected nodes 5186273562Smarcel if ( ret || !disconnectedMatch || 5187273562Smarcel // As well, disconnected nodes are said to be in a document 5188273562Smarcel // fragment in IE 9, so check for that 5189273562Smarcel node.document && node.document.nodeType !== 11 ) { 5190273562Smarcel return ret; 5191273562Smarcel } 5192273562Smarcel } 5193273562Smarcel } catch(e) {} 5194273562Smarcel } 5195273562Smarcel 5196273562Smarcel return Sizzle(expr, null, null, [node]).length > 0; 5197273562Smarcel }; 5198273562Smarcel } 5199273562Smarcel})(); 5200273562Smarcel 5201273562Smarcel(function(){ 5202273562Smarcel var div = document.createElement("div"); 5203273562Smarcel 5204273562Smarcel div.innerHTML = "<div class='test e'></div><div class='test'></div>"; 5205273562Smarcel 5206273562Smarcel // Opera can't find a second classname (in 9.6) 5207273562Smarcel // Also, make sure that getElementsByClassName actually exists 5208273562Smarcel if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { 5209273562Smarcel return; 5210273562Smarcel } 5211273562Smarcel 5212273562Smarcel // Safari caches class attributes, doesn't catch changes (in 3.2) 5213273562Smarcel div.lastChild.className = "e"; 5214273562Smarcel 5215273562Smarcel if ( div.getElementsByClassName("e").length === 1 ) { 5216273562Smarcel return; 5217273562Smarcel } 5218273562Smarcel 5219273562Smarcel Expr.order.splice(1, 0, "CLASS"); 5220273562Smarcel Expr.find.CLASS = function( match, context, isXML ) { 5221273562Smarcel if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { 5222273562Smarcel return context.getElementsByClassName(match[1]); 5223273562Smarcel } 5224273562Smarcel }; 5225273562Smarcel 5226273562Smarcel // release memory in IE 5227273562Smarcel div = null; 5228273562Smarcel})(); 5229273562Smarcel 5230273562Smarcelfunction dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { 5231273562Smarcel for ( var i = 0, l = checkSet.length; i < l; i++ ) { 5232273562Smarcel var elem = checkSet[i]; 5233273562Smarcel 5234273562Smarcel if ( elem ) { 5235273562Smarcel var match = false; 5236273562Smarcel 5237273562Smarcel elem = elem[dir]; 5238273562Smarcel 5239273562Smarcel while ( elem ) { 5240273562Smarcel if ( elem[ expando ] === doneName ) { 5241273562Smarcel match = checkSet[elem.sizset]; 5242273562Smarcel break; 5243273562Smarcel } 5244273562Smarcel 5245273562Smarcel if ( elem.nodeType === 1 && !isXML ){ 5246273562Smarcel elem[ expando ] = doneName; 5247273562Smarcel elem.sizset = i; 5248273562Smarcel } 5249273562Smarcel 5250273562Smarcel if ( elem.nodeName.toLowerCase() === cur ) { 5251273562Smarcel match = elem; 5252273562Smarcel break; 5253273562Smarcel } 5254273562Smarcel 5255273562Smarcel elem = elem[dir]; 5256273562Smarcel } 5257273562Smarcel 5258273562Smarcel checkSet[i] = match; 5259273562Smarcel } 5260273562Smarcel } 5261273562Smarcel} 5262273562Smarcel 5263273562Smarcelfunction dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { 5264273562Smarcel for ( var i = 0, l = checkSet.length; i < l; i++ ) { 5265273562Smarcel var elem = checkSet[i]; 5266273562Smarcel 5267273562Smarcel if ( elem ) { 5268273562Smarcel var match = false; 5269273562Smarcel 5270273562Smarcel elem = elem[dir]; 5271273562Smarcel 5272273562Smarcel while ( elem ) { 5273273562Smarcel if ( elem[ expando ] === doneName ) { 5274273562Smarcel match = checkSet[elem.sizset]; 5275273562Smarcel break; 5276273562Smarcel } 5277273562Smarcel 5278273562Smarcel if ( elem.nodeType === 1 ) { 5279273562Smarcel if ( !isXML ) { 5280273562Smarcel elem[ expando ] = doneName; 5281273562Smarcel elem.sizset = i; 5282273562Smarcel } 5283273562Smarcel 5284273562Smarcel if ( typeof cur !== "string" ) { 5285273562Smarcel if ( elem === cur ) { 5286273562Smarcel match = true; 5287273562Smarcel break; 5288273562Smarcel } 5289273562Smarcel 5290273562Smarcel } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { 5291273562Smarcel match = elem; 5292273562Smarcel break; 5293273562Smarcel } 5294273562Smarcel } 5295273562Smarcel 5296273562Smarcel elem = elem[dir]; 5297273562Smarcel } 5298273562Smarcel 5299273562Smarcel checkSet[i] = match; 5300273562Smarcel } 5301273562Smarcel } 5302273562Smarcel} 5303273562Smarcel 5304273562Smarcelif ( document.documentElement.contains ) { 5305273562Smarcel Sizzle.contains = function( a, b ) { 5306273562Smarcel return a !== b && (a.contains ? a.contains(b) : true); 5307273562Smarcel }; 5308273562Smarcel 5309273562Smarcel} else if ( document.documentElement.compareDocumentPosition ) { 5310273562Smarcel Sizzle.contains = function( a, b ) { 5311273562Smarcel return !!(a.compareDocumentPosition(b) & 16); 5312273562Smarcel }; 5313273562Smarcel 5314273562Smarcel} else { 5315273562Smarcel Sizzle.contains = function() { 5316273562Smarcel return false; 5317273562Smarcel }; 5318273562Smarcel} 5319273562Smarcel 5320273562SmarcelSizzle.isXML = function( elem ) { 5321273562Smarcel // documentElement is verified for cases where it doesn't yet exist 5322273562Smarcel // (such as loading iframes in IE - #4833) 5323273562Smarcel var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; 5324273562Smarcel 5325273562Smarcel return documentElement ? documentElement.nodeName !== "HTML" : false; 5326273562Smarcel}; 5327273562Smarcel 5328273562Smarcelvar posProcess = function( selector, context, seed ) { 5329273562Smarcel var match, 5330273562Smarcel tmpSet = [], 5331273562Smarcel later = "", 5332273562Smarcel root = context.nodeType ? [context] : context; 5333273562Smarcel 5334273562Smarcel // Position selectors must be done after the filter 5335273562Smarcel // And so must :not(positional) so we move all PSEUDOs to the end 5336273562Smarcel while ( (match = Expr.match.PSEUDO.exec( selector )) ) { 5337273562Smarcel later += match[0]; 5338273562Smarcel selector = selector.replace( Expr.match.PSEUDO, "" ); 5339273562Smarcel } 5340273562Smarcel 5341273562Smarcel selector = Expr.relative[selector] ? selector + "*" : selector; 5342273562Smarcel 5343273562Smarcel for ( var i = 0, l = root.length; i < l; i++ ) { 5344273562Smarcel Sizzle( selector, root[i], tmpSet, seed ); 5345273562Smarcel } 5346273562Smarcel 5347273562Smarcel return Sizzle.filter( later, tmpSet ); 5348273562Smarcel}; 5349273562Smarcel 5350273562Smarcel// EXPOSE 5351273562Smarcel// Override sizzle attribute retrieval 5352273562SmarcelSizzle.attr = jQuery.attr; 5353273562SmarcelSizzle.selectors.attrMap = {}; 5354273562SmarceljQuery.find = Sizzle; 5355273562SmarceljQuery.expr = Sizzle.selectors; 5356273562SmarceljQuery.expr[":"] = jQuery.expr.filters; 5357273562SmarceljQuery.unique = Sizzle.uniqueSort; 5358273562SmarceljQuery.text = Sizzle.getText; 5359273562SmarceljQuery.isXMLDoc = Sizzle.isXML; 5360273562SmarceljQuery.contains = Sizzle.contains; 5361273562Smarcel 5362273562Smarcel 5363273562Smarcel})(); 5364273562Smarcel 5365273562Smarcel 5366273562Smarcelvar runtil = /Until$/, 5367273562Smarcel rparentsprev = /^(?:parents|prevUntil|prevAll)/, 5368273562Smarcel // Note: This RegExp should be improved, or likely pulled from Sizzle 5369273562Smarcel rmultiselector = /,/, 5370273562Smarcel isSimple = /^.[^:#\[\.,]*$/, 5371273562Smarcel slice = Array.prototype.slice, 5372273562Smarcel POS = jQuery.expr.match.POS, 5373273562Smarcel // methods guaranteed to produce a unique set when starting from a unique set 5374273562Smarcel guaranteedUnique = { 5375273562Smarcel children: true, 5376273562Smarcel contents: true, 5377273562Smarcel next: true, 5378273562Smarcel prev: true 5379273562Smarcel }; 5380273562Smarcel 5381273562SmarceljQuery.fn.extend({ 5382273562Smarcel find: function( selector ) { 5383273562Smarcel var self = this, 5384273562Smarcel i, l; 5385273562Smarcel 5386273562Smarcel if ( typeof selector !== "string" ) { 5387273562Smarcel return jQuery( selector ).filter(function() { 5388273562Smarcel for ( i = 0, l = self.length; i < l; i++ ) { 5389273562Smarcel if ( jQuery.contains( self[ i ], this ) ) { 5390273562Smarcel return true; 5391273562Smarcel } 5392273562Smarcel } 5393273562Smarcel }); 5394273562Smarcel } 5395273562Smarcel 5396273562Smarcel var ret = this.pushStack( "", "find", selector ), 5397273562Smarcel length, n, r; 5398273562Smarcel 5399273562Smarcel for ( i = 0, l = this.length; i < l; i++ ) { 5400273562Smarcel length = ret.length; 5401273562Smarcel jQuery.find( selector, this[i], ret ); 5402273562Smarcel 5403273562Smarcel if ( i > 0 ) { 5404273562Smarcel // Make sure that the results are unique 5405273562Smarcel for ( n = length; n < ret.length; n++ ) { 5406273562Smarcel for ( r = 0; r < length; r++ ) { 5407273562Smarcel if ( ret[r] === ret[n] ) { 5408273562Smarcel ret.splice(n--, 1); 5409273562Smarcel break; 5410273562Smarcel } 5411273562Smarcel } 5412273562Smarcel } 5413273562Smarcel } 5414273562Smarcel } 5415273562Smarcel 5416273562Smarcel return ret; 5417273562Smarcel }, 5418273562Smarcel 5419273562Smarcel has: function( target ) { 5420273562Smarcel var targets = jQuery( target ); 5421273562Smarcel return this.filter(function() { 5422273562Smarcel for ( var i = 0, l = targets.length; i < l; i++ ) { 5423273562Smarcel if ( jQuery.contains( this, targets[i] ) ) { 5424273562Smarcel return true; 5425273562Smarcel } 5426273562Smarcel } 5427273562Smarcel }); 5428273562Smarcel }, 5429273562Smarcel 5430273562Smarcel not: function( selector ) { 5431273562Smarcel return this.pushStack( winnow(this, selector, false), "not", selector); 5432273562Smarcel }, 5433273562Smarcel 5434273562Smarcel filter: function( selector ) { 5435273562Smarcel return this.pushStack( winnow(this, selector, true), "filter", selector ); 5436273562Smarcel }, 5437273562Smarcel 5438273562Smarcel is: function( selector ) { 5439273562Smarcel return !!selector && ( 5440273562Smarcel typeof selector === "string" ? 5441273562Smarcel // If this is a positional selector, check membership in the returned set 5442273562Smarcel // so $("p:first").is("p:last") won't return true for a doc with two "p". 5443273562Smarcel POS.test( selector ) ? 5444273562Smarcel jQuery( selector, this.context ).index( this[0] ) >= 0 : 5445273562Smarcel jQuery.filter( selector, this ).length > 0 : 5446273562Smarcel this.filter( selector ).length > 0 ); 5447273562Smarcel }, 5448273562Smarcel 5449273562Smarcel closest: function( selectors, context ) { 5450273562Smarcel var ret = [], i, l, cur = this[0]; 5451273562Smarcel 5452273562Smarcel // Array (deprecated as of jQuery 1.7) 5453273562Smarcel if ( jQuery.isArray( selectors ) ) { 5454273562Smarcel var level = 1; 5455273562Smarcel 5456273562Smarcel while ( cur && cur.ownerDocument && cur !== context ) { 5457273562Smarcel for ( i = 0; i < selectors.length; i++ ) { 5458273562Smarcel 5459273562Smarcel if ( jQuery( cur ).is( selectors[ i ] ) ) { 5460273562Smarcel ret.push({ selector: selectors[ i ], elem: cur, level: level }); 5461273562Smarcel } 5462273562Smarcel } 5463273562Smarcel 5464273562Smarcel cur = cur.parentNode; 5465273562Smarcel level++; 5466273562Smarcel } 5467273562Smarcel 5468273562Smarcel return ret; 5469273562Smarcel } 5470273562Smarcel 5471273562Smarcel // String 5472273562Smarcel var pos = POS.test( selectors ) || typeof selectors !== "string" ? 5473273562Smarcel jQuery( selectors, context || this.context ) : 5474273562Smarcel 0; 5475273562Smarcel 5476273562Smarcel for ( i = 0, l = this.length; i < l; i++ ) { 5477273562Smarcel cur = this[i]; 5478273562Smarcel 5479273562Smarcel while ( cur ) { 5480273562Smarcel if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { 5481273562Smarcel ret.push( cur ); 5482273562Smarcel break; 5483273562Smarcel 5484273562Smarcel } else { 5485273562Smarcel cur = cur.parentNode; 5486273562Smarcel if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { 5487273562Smarcel break; 5488273562Smarcel } 5489273562Smarcel } 5490273562Smarcel } 5491273562Smarcel } 5492273562Smarcel 5493273562Smarcel ret = ret.length > 1 ? jQuery.unique( ret ) : ret; 5494273562Smarcel 5495273562Smarcel return this.pushStack( ret, "closest", selectors ); 5496273562Smarcel }, 5497273562Smarcel 5498273562Smarcel // Determine the position of an element within 5499273562Smarcel // the matched set of elements 5500273562Smarcel index: function( elem ) { 5501273562Smarcel 5502273562Smarcel // No argument, return index in parent 5503273562Smarcel if ( !elem ) { 5504273562Smarcel return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; 5505273562Smarcel } 5506273562Smarcel 5507273562Smarcel // index in selector 5508273562Smarcel if ( typeof elem === "string" ) { 5509273562Smarcel return jQuery.inArray( this[0], jQuery( elem ) ); 5510273562Smarcel } 5511273562Smarcel 5512273562Smarcel // Locate the position of the desired element 5513273562Smarcel return jQuery.inArray( 5514273562Smarcel // If it receives a jQuery object, the first element is used 5515273562Smarcel elem.jquery ? elem[0] : elem, this ); 5516273562Smarcel }, 5517273562Smarcel 5518273562Smarcel add: function( selector, context ) { 5519273562Smarcel var set = typeof selector === "string" ? 5520273562Smarcel jQuery( selector, context ) : 5521273562Smarcel jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), 5522273562Smarcel all = jQuery.merge( this.get(), set ); 5523273562Smarcel 5524273562Smarcel return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? 5525273562Smarcel all : 5526273562Smarcel jQuery.unique( all ) ); 5527273562Smarcel }, 5528273562Smarcel 5529273562Smarcel andSelf: function() { 5530273562Smarcel return this.add( this.prevObject ); 5531273562Smarcel } 5532273562Smarcel}); 5533273562Smarcel 5534273562Smarcel// A painfully simple check to see if an element is disconnected 5535273562Smarcel// from a document (should be improved, where feasible). 5536273562Smarcelfunction isDisconnected( node ) { 5537273562Smarcel return !node || !node.parentNode || node.parentNode.nodeType === 11; 5538273562Smarcel} 5539273562Smarcel 5540273562SmarceljQuery.each({ 5541273562Smarcel parent: function( elem ) { 5542273562Smarcel var parent = elem.parentNode; 5543273562Smarcel return parent && parent.nodeType !== 11 ? parent : null; 5544273562Smarcel }, 5545273562Smarcel parents: function( elem ) { 5546273562Smarcel return jQuery.dir( elem, "parentNode" ); 5547273562Smarcel }, 5548273562Smarcel parentsUntil: function( elem, i, until ) { 5549273562Smarcel return jQuery.dir( elem, "parentNode", until ); 5550273562Smarcel }, 5551273562Smarcel next: function( elem ) { 5552273562Smarcel return jQuery.nth( elem, 2, "nextSibling" ); 5553273562Smarcel }, 5554273562Smarcel prev: function( elem ) { 5555273562Smarcel return jQuery.nth( elem, 2, "previousSibling" ); 5556273562Smarcel }, 5557273562Smarcel nextAll: function( elem ) { 5558273562Smarcel return jQuery.dir( elem, "nextSibling" ); 5559273562Smarcel }, 5560273562Smarcel prevAll: function( elem ) { 5561273562Smarcel return jQuery.dir( elem, "previousSibling" ); 5562273562Smarcel }, 5563273562Smarcel nextUntil: function( elem, i, until ) { 5564273562Smarcel return jQuery.dir( elem, "nextSibling", until ); 5565273562Smarcel }, 5566273562Smarcel prevUntil: function( elem, i, until ) { 5567273562Smarcel return jQuery.dir( elem, "previousSibling", until ); 5568273562Smarcel }, 5569273562Smarcel siblings: function( elem ) { 5570273562Smarcel return jQuery.sibling( elem.parentNode.firstChild, elem ); 5571273562Smarcel }, 5572273562Smarcel children: function( elem ) { 5573273562Smarcel return jQuery.sibling( elem.firstChild ); 5574273562Smarcel }, 5575273562Smarcel contents: function( elem ) { 5576273562Smarcel return jQuery.nodeName( elem, "iframe" ) ? 5577273562Smarcel elem.contentDocument || elem.contentWindow.document : 5578273562Smarcel jQuery.makeArray( elem.childNodes ); 5579273562Smarcel } 5580273562Smarcel}, function( name, fn ) { 5581273562Smarcel jQuery.fn[ name ] = function( until, selector ) { 5582273562Smarcel var ret = jQuery.map( this, fn, until ), 5583273562Smarcel // The variable 'args' was introduced in 5584273562Smarcel // https://github.com/jquery/jquery/commit/52a0238 5585273562Smarcel // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. 5586273562Smarcel // http://code.google.com/p/v8/issues/detail?id=1050 5587273562Smarcel args = slice.call(arguments); 5588273562Smarcel 5589273562Smarcel if ( !runtil.test( name ) ) { 5590273562Smarcel selector = until; 5591273562Smarcel } 5592273562Smarcel 5593273562Smarcel if ( selector && typeof selector === "string" ) { 5594273562Smarcel ret = jQuery.filter( selector, ret ); 5595273562Smarcel } 5596273562Smarcel 5597273562Smarcel ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; 5598273562Smarcel 5599273562Smarcel if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { 5600273562Smarcel ret = ret.reverse(); 5601273562Smarcel } 5602273562Smarcel 5603273562Smarcel return this.pushStack( ret, name, args.join(",") ); 5604273562Smarcel }; 5605273562Smarcel}); 5606273562Smarcel 5607273562SmarceljQuery.extend({ 5608273562Smarcel filter: function( expr, elems, not ) { 5609273562Smarcel if ( not ) { 5610273562Smarcel expr = ":not(" + expr + ")"; 5611273562Smarcel } 5612273562Smarcel 5613273562Smarcel return elems.length === 1 ? 5614273562Smarcel jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : 5615273562Smarcel jQuery.find.matches(expr, elems); 5616273562Smarcel }, 5617273562Smarcel 5618273562Smarcel dir: function( elem, dir, until ) { 5619273562Smarcel var matched = [], 5620273562Smarcel cur = elem[ dir ]; 5621273562Smarcel 5622273562Smarcel while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { 5623273562Smarcel if ( cur.nodeType === 1 ) { 5624273562Smarcel matched.push( cur ); 5625273562Smarcel } 5626273562Smarcel cur = cur[dir]; 5627273562Smarcel } 5628273562Smarcel return matched; 5629273562Smarcel }, 5630273562Smarcel 5631273562Smarcel nth: function( cur, result, dir, elem ) { 5632273562Smarcel result = result || 1; 5633273562Smarcel var num = 0; 5634273562Smarcel 5635273562Smarcel for ( ; cur; cur = cur[dir] ) { 5636273562Smarcel if ( cur.nodeType === 1 && ++num === result ) { 5637273562Smarcel break; 5638273562Smarcel } 5639273562Smarcel } 5640273562Smarcel 5641273562Smarcel return cur; 5642273562Smarcel }, 5643273562Smarcel 5644273562Smarcel sibling: function( n, elem ) { 5645273562Smarcel var r = []; 5646273562Smarcel 5647273562Smarcel for ( ; n; n = n.nextSibling ) { 5648273562Smarcel if ( n.nodeType === 1 && n !== elem ) { 5649273562Smarcel r.push( n ); 5650273562Smarcel } 5651273562Smarcel } 5652273562Smarcel 5653273562Smarcel return r; 5654273562Smarcel } 5655273562Smarcel}); 5656273562Smarcel 5657273562Smarcel// Implement the identical functionality for filter and not 5658273562Smarcelfunction winnow( elements, qualifier, keep ) { 5659273562Smarcel 5660273562Smarcel // Can't pass null or undefined to indexOf in Firefox 4 5661273562Smarcel // Set to 0 to skip string check 5662273562Smarcel qualifier = qualifier || 0; 5663273562Smarcel 5664273562Smarcel if ( jQuery.isFunction( qualifier ) ) { 5665273562Smarcel return jQuery.grep(elements, function( elem, i ) { 5666273562Smarcel var retVal = !!qualifier.call( elem, i, elem ); 5667273562Smarcel return retVal === keep; 5668273562Smarcel }); 5669273562Smarcel 5670273562Smarcel } else if ( qualifier.nodeType ) { 5671273562Smarcel return jQuery.grep(elements, function( elem, i ) { 5672273562Smarcel return ( elem === qualifier ) === keep; 5673273562Smarcel }); 5674273562Smarcel 5675273562Smarcel } else if ( typeof qualifier === "string" ) { 5676273562Smarcel var filtered = jQuery.grep(elements, function( elem ) { 5677273562Smarcel return elem.nodeType === 1; 5678273562Smarcel }); 5679273562Smarcel 5680273562Smarcel if ( isSimple.test( qualifier ) ) { 5681273562Smarcel return jQuery.filter(qualifier, filtered, !keep); 5682273562Smarcel } else { 5683273562Smarcel qualifier = jQuery.filter( qualifier, filtered ); 5684273562Smarcel } 5685273562Smarcel } 5686273562Smarcel 5687273562Smarcel return jQuery.grep(elements, function( elem, i ) { 5688273562Smarcel return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; 5689273562Smarcel }); 5690273562Smarcel} 5691273562Smarcel 5692273562Smarcel 5693273562Smarcel 5694273562Smarcel 5695273562Smarcelfunction createSafeFragment( document ) { 5696273562Smarcel var list = nodeNames.split( " " ), 5697273562Smarcel safeFrag = document.createDocumentFragment(); 5698273562Smarcel 5699273562Smarcel if ( safeFrag.createElement ) { 5700273562Smarcel while ( list.length ) { 5701273562Smarcel safeFrag.createElement( 5702273562Smarcel list.pop() 5703273562Smarcel ); 5704273562Smarcel } 5705273562Smarcel } 5706273562Smarcel return safeFrag; 5707273562Smarcel} 5708273562Smarcel 5709273562Smarcelvar nodeNames = "abbr article aside audio canvas datalist details figcaption figure footer " + 5710273562Smarcel "header hgroup mark meter nav output progress section summary time video", 5711273562Smarcel rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, 5712273562Smarcel rleadingWhitespace = /^\s+/, 5713273562Smarcel rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, 5714273562Smarcel rtagName = /<([\w:]+)/, 5715273562Smarcel rtbody = /<tbody/i, 5716273562Smarcel rhtml = /<|&#?\w+;/, 5717273562Smarcel rnoInnerhtml = /<(?:script|style)/i, 5718273562Smarcel rnocache = /<(?:script|object|embed|option|style)/i, 5719273562Smarcel rnoshimcache = new RegExp("<(?:" + nodeNames.replace(" ", "|") + ")", "i"), 5720273562Smarcel // checked="checked" or checked 5721273562Smarcel rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, 5722273562Smarcel rscriptType = /\/(java|ecma)script/i, 5723273562Smarcel rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/, 5724273562Smarcel wrapMap = { 5725273562Smarcel option: [ 1, "<select multiple='multiple'>", "</select>" ], 5726273562Smarcel legend: [ 1, "<fieldset>", "</fieldset>" ], 5727273562Smarcel thead: [ 1, "<table>", "</table>" ], 5728273562Smarcel tr: [ 2, "<table><tbody>", "</tbody></table>" ], 5729273562Smarcel td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], 5730273562Smarcel col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ], 5731273562Smarcel area: [ 1, "<map>", "</map>" ], 5732273562Smarcel _default: [ 0, "", "" ] 5733273562Smarcel }, 5734273562Smarcel safeFragment = createSafeFragment( document ); 5735273562Smarcel 5736273562SmarcelwrapMap.optgroup = wrapMap.option; 5737273562SmarcelwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; 5738273562SmarcelwrapMap.th = wrapMap.td; 5739273562Smarcel 5740273562Smarcel// IE can't serialize <link> and <script> tags normally 5741273562Smarcelif ( !jQuery.support.htmlSerialize ) { 5742273562Smarcel wrapMap._default = [ 1, "div<div>", "</div>" ]; 5743273562Smarcel} 5744273562Smarcel 5745273562SmarceljQuery.fn.extend({ 5746273562Smarcel text: function( text ) { 5747273562Smarcel if ( jQuery.isFunction(text) ) { 5748273562Smarcel return this.each(function(i) { 5749273562Smarcel var self = jQuery( this ); 5750273562Smarcel 5751273562Smarcel self.text( text.call(this, i, self.text()) ); 5752273562Smarcel }); 5753273562Smarcel } 5754273562Smarcel 5755273562Smarcel if ( typeof text !== "object" && text !== undefined ) { 5756273562Smarcel return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); 5757273562Smarcel } 5758273562Smarcel 5759273562Smarcel return jQuery.text( this ); 5760273562Smarcel }, 5761273562Smarcel 5762273562Smarcel wrapAll: function( html ) { 5763273562Smarcel if ( jQuery.isFunction( html ) ) { 5764273562Smarcel return this.each(function(i) { 5765273562Smarcel jQuery(this).wrapAll( html.call(this, i) ); 5766273562Smarcel }); 5767273562Smarcel } 5768273562Smarcel 5769273562Smarcel if ( this[0] ) { 5770273562Smarcel // The elements to wrap the target around 5771273562Smarcel var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); 5772273562Smarcel 5773273562Smarcel if ( this[0].parentNode ) { 5774273562Smarcel wrap.insertBefore( this[0] ); 5775273562Smarcel } 5776273562Smarcel 5777273562Smarcel wrap.map(function() { 5778273562Smarcel var elem = this; 5779273562Smarcel 5780273562Smarcel while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { 5781273562Smarcel elem = elem.firstChild; 5782273562Smarcel } 5783273562Smarcel 5784273562Smarcel return elem; 5785273562Smarcel }).append( this ); 5786273562Smarcel } 5787273562Smarcel 5788273562Smarcel return this; 5789273562Smarcel }, 5790273562Smarcel 5791273562Smarcel wrapInner: function( html ) { 5792273562Smarcel if ( jQuery.isFunction( html ) ) { 5793273562Smarcel return this.each(function(i) { 5794273562Smarcel jQuery(this).wrapInner( html.call(this, i) ); 5795273562Smarcel }); 5796273562Smarcel } 5797273562Smarcel 5798273562Smarcel return this.each(function() { 5799273562Smarcel var self = jQuery( this ), 5800273562Smarcel contents = self.contents(); 5801273562Smarcel 5802273562Smarcel if ( contents.length ) { 5803273562Smarcel contents.wrapAll( html ); 5804273562Smarcel 5805273562Smarcel } else { 5806273562Smarcel self.append( html ); 5807273562Smarcel } 5808273562Smarcel }); 5809273562Smarcel }, 5810273562Smarcel 5811273562Smarcel wrap: function( html ) { 5812273562Smarcel return this.each(function() { 5813273562Smarcel jQuery( this ).wrapAll( html ); 5814273562Smarcel }); 5815273562Smarcel }, 5816273562Smarcel 5817273562Smarcel unwrap: function() { 5818273562Smarcel return this.parent().each(function() { 5819273562Smarcel if ( !jQuery.nodeName( this, "body" ) ) { 5820273562Smarcel jQuery( this ).replaceWith( this.childNodes ); 5821273562Smarcel } 5822273562Smarcel }).end(); 5823273562Smarcel }, 5824273562Smarcel 5825273562Smarcel append: function() { 5826273562Smarcel return this.domManip(arguments, true, function( elem ) { 5827273562Smarcel if ( this.nodeType === 1 ) { 5828273562Smarcel this.appendChild( elem ); 5829273562Smarcel } 5830273562Smarcel }); 5831273562Smarcel }, 5832273562Smarcel 5833273562Smarcel prepend: function() { 5834273562Smarcel return this.domManip(arguments, true, function( elem ) { 5835273562Smarcel if ( this.nodeType === 1 ) { 5836273562Smarcel this.insertBefore( elem, this.firstChild ); 5837273562Smarcel } 5838273562Smarcel }); 5839273562Smarcel }, 5840273562Smarcel 5841273562Smarcel before: function() { 5842273562Smarcel if ( this[0] && this[0].parentNode ) { 5843273562Smarcel return this.domManip(arguments, false, function( elem ) { 5844273562Smarcel this.parentNode.insertBefore( elem, this ); 5845273562Smarcel }); 5846273562Smarcel } else if ( arguments.length ) { 5847273562Smarcel var set = jQuery(arguments[0]); 5848273562Smarcel set.push.apply( set, this.toArray() ); 5849273562Smarcel return this.pushStack( set, "before", arguments ); 5850273562Smarcel } 5851273562Smarcel }, 5852273562Smarcel 5853273562Smarcel after: function() { 5854273562Smarcel if ( this[0] && this[0].parentNode ) { 5855273562Smarcel return this.domManip(arguments, false, function( elem ) { 5856273562Smarcel this.parentNode.insertBefore( elem, this.nextSibling ); 5857273562Smarcel }); 5858273562Smarcel } else if ( arguments.length ) { 5859273562Smarcel var set = this.pushStack( this, "after", arguments ); 5860273562Smarcel set.push.apply( set, jQuery(arguments[0]).toArray() ); 5861273562Smarcel return set; 5862273562Smarcel } 5863273562Smarcel }, 5864273562Smarcel 5865273562Smarcel // keepData is for internal use only--do not document 5866273562Smarcel remove: function( selector, keepData ) { 5867273562Smarcel for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { 5868273562Smarcel if ( !selector || jQuery.filter( selector, [ elem ] ).length ) { 5869273562Smarcel if ( !keepData && elem.nodeType === 1 ) { 5870273562Smarcel jQuery.cleanData( elem.getElementsByTagName("*") ); 5871273562Smarcel jQuery.cleanData( [ elem ] ); 5872273562Smarcel } 5873273562Smarcel 5874273562Smarcel if ( elem.parentNode ) { 5875273562Smarcel elem.parentNode.removeChild( elem ); 5876273562Smarcel } 5877273562Smarcel } 5878273562Smarcel } 5879273562Smarcel 5880273562Smarcel return this; 5881273562Smarcel }, 5882273562Smarcel 5883273562Smarcel empty: function() { 5884273562Smarcel for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { 5885273562Smarcel // Remove element nodes and prevent memory leaks 5886273562Smarcel if ( elem.nodeType === 1 ) { 5887273562Smarcel jQuery.cleanData( elem.getElementsByTagName("*") ); 5888273562Smarcel } 5889273562Smarcel 5890273562Smarcel // Remove any remaining nodes 5891273562Smarcel while ( elem.firstChild ) { 5892273562Smarcel elem.removeChild( elem.firstChild ); 5893273562Smarcel } 5894273562Smarcel } 5895273562Smarcel 5896273562Smarcel return this; 5897273562Smarcel }, 5898273562Smarcel 5899273562Smarcel clone: function( dataAndEvents, deepDataAndEvents ) { 5900273562Smarcel dataAndEvents = dataAndEvents == null ? false : dataAndEvents; 5901273562Smarcel deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; 5902273562Smarcel 5903273562Smarcel return this.map( function () { 5904273562Smarcel return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); 5905273562Smarcel }); 5906273562Smarcel }, 5907273562Smarcel 5908273562Smarcel html: function( value ) { 5909273562Smarcel if ( value === undefined ) { 5910273562Smarcel return this[0] && this[0].nodeType === 1 ? 5911273562Smarcel this[0].innerHTML.replace(rinlinejQuery, "") : 5912273562Smarcel null; 5913273562Smarcel 5914273562Smarcel // See if we can take a shortcut and just use innerHTML 5915273562Smarcel } else if ( typeof value === "string" && !rnoInnerhtml.test( value ) && 5916273562Smarcel (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) && 5917273562Smarcel !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) { 5918273562Smarcel 5919273562Smarcel value = value.replace(rxhtmlTag, "<$1></$2>"); 5920273562Smarcel 5921273562Smarcel try { 5922273562Smarcel for ( var i = 0, l = this.length; i < l; i++ ) { 5923273562Smarcel // Remove element nodes and prevent memory leaks 5924273562Smarcel if ( this[i].nodeType === 1 ) { 5925273562Smarcel jQuery.cleanData( this[i].getElementsByTagName("*") ); 5926273562Smarcel this[i].innerHTML = value; 5927273562Smarcel } 5928273562Smarcel } 5929273562Smarcel 5930273562Smarcel // If using innerHTML throws an exception, use the fallback method 5931273562Smarcel } catch(e) { 5932273562Smarcel this.empty().append( value ); 5933273562Smarcel } 5934273562Smarcel 5935273562Smarcel } else if ( jQuery.isFunction( value ) ) { 5936273562Smarcel this.each(function(i){ 5937273562Smarcel var self = jQuery( this ); 5938273562Smarcel 5939273562Smarcel self.html( value.call(this, i, self.html()) ); 5940273562Smarcel }); 5941273562Smarcel 5942273562Smarcel } else { 5943273562Smarcel this.empty().append( value ); 5944273562Smarcel } 5945273562Smarcel 5946273562Smarcel return this; 5947273562Smarcel }, 5948273562Smarcel 5949273562Smarcel replaceWith: function( value ) { 5950273562Smarcel if ( this[0] && this[0].parentNode ) { 5951273562Smarcel // Make sure that the elements are removed from the DOM before they are inserted 5952273562Smarcel // this can help fix replacing a parent with child elements 5953273562Smarcel if ( jQuery.isFunction( value ) ) { 5954273562Smarcel return this.each(function(i) { 5955273562Smarcel var self = jQuery(this), old = self.html(); 5956273562Smarcel self.replaceWith( value.call( this, i, old ) ); 5957273562Smarcel }); 5958273562Smarcel } 5959273562Smarcel 5960273562Smarcel if ( typeof value !== "string" ) { 5961273562Smarcel value = jQuery( value ).detach(); 5962273562Smarcel } 5963273562Smarcel 5964273562Smarcel return this.each(function() { 5965273562Smarcel var next = this.nextSibling, 5966273562Smarcel parent = this.parentNode; 5967273562Smarcel 5968273562Smarcel jQuery( this ).remove(); 5969273562Smarcel 5970273562Smarcel if ( next ) { 5971273562Smarcel jQuery(next).before( value ); 5972273562Smarcel } else { 5973273562Smarcel jQuery(parent).append( value ); 5974273562Smarcel } 5975273562Smarcel }); 5976273562Smarcel } else { 5977273562Smarcel return this.length ? 5978273562Smarcel this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) : 5979273562Smarcel this; 5980273562Smarcel } 5981273562Smarcel }, 5982273562Smarcel 5983273562Smarcel detach: function( selector ) { 5984273562Smarcel return this.remove( selector, true ); 5985273562Smarcel }, 5986273562Smarcel 5987273562Smarcel domManip: function( args, table, callback ) { 5988273562Smarcel var results, first, fragment, parent, 5989273562Smarcel value = args[0], 5990273562Smarcel scripts = []; 5991273562Smarcel 5992273562Smarcel // We can't cloneNode fragments that contain checked, in WebKit 5993273562Smarcel if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) { 5994273562Smarcel return this.each(function() { 5995273562Smarcel jQuery(this).domManip( args, table, callback, true ); 5996273562Smarcel }); 5997273562Smarcel } 5998273562Smarcel 5999273562Smarcel if ( jQuery.isFunction(value) ) { 6000273562Smarcel return this.each(function(i) { 6001273562Smarcel var self = jQuery(this); 6002273562Smarcel args[0] = value.call(this, i, table ? self.html() : undefined); 6003273562Smarcel self.domManip( args, table, callback ); 6004273562Smarcel }); 6005273562Smarcel } 6006273562Smarcel 6007273562Smarcel if ( this[0] ) { 6008273562Smarcel parent = value && value.parentNode; 6009273562Smarcel 6010273562Smarcel // If we're in a fragment, just use that instead of building a new one 6011273562Smarcel if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) { 6012273562Smarcel results = { fragment: parent }; 6013273562Smarcel 6014273562Smarcel } else { 6015273562Smarcel results = jQuery.buildFragment( args, this, scripts ); 6016273562Smarcel } 6017273562Smarcel 6018273562Smarcel fragment = results.fragment; 6019273562Smarcel 6020273562Smarcel if ( fragment.childNodes.length === 1 ) { 6021273562Smarcel first = fragment = fragment.firstChild; 6022273562Smarcel } else { 6023273562Smarcel first = fragment.firstChild; 6024273562Smarcel } 6025273562Smarcel 6026273562Smarcel if ( first ) { 6027273562Smarcel table = table && jQuery.nodeName( first, "tr" ); 6028273562Smarcel 6029273562Smarcel for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) { 6030273562Smarcel callback.call( 6031273562Smarcel table ? 6032273562Smarcel root(this[i], first) : 6033273562Smarcel this[i], 6034273562Smarcel // Make sure that we do not leak memory by inadvertently discarding 6035273562Smarcel // the original fragment (which might have attached data) instead of 6036273562Smarcel // using it; in addition, use the original fragment object for the last 6037273562Smarcel // item instead of first because it can end up being emptied incorrectly 6038273562Smarcel // in certain situations (Bug #8070). 6039273562Smarcel // Fragments from the fragment cache must always be cloned and never used 6040273562Smarcel // in place. 6041273562Smarcel results.cacheable || ( l > 1 && i < lastIndex ) ? 6042273562Smarcel jQuery.clone( fragment, true, true ) : 6043273562Smarcel fragment 6044273562Smarcel ); 6045273562Smarcel } 6046273562Smarcel } 6047273562Smarcel 6048273562Smarcel if ( scripts.length ) { 6049273562Smarcel jQuery.each( scripts, evalScript ); 6050273562Smarcel } 6051273562Smarcel } 6052273562Smarcel 6053273562Smarcel return this; 6054273562Smarcel } 6055273562Smarcel}); 6056273562Smarcel 6057273562Smarcelfunction root( elem, cur ) { 6058273562Smarcel return jQuery.nodeName(elem, "table") ? 6059273562Smarcel (elem.getElementsByTagName("tbody")[0] || 6060273562Smarcel elem.appendChild(elem.ownerDocument.createElement("tbody"))) : 6061273562Smarcel elem; 6062273562Smarcel} 6063273562Smarcel 6064273562Smarcelfunction cloneCopyEvent( src, dest ) { 6065273562Smarcel 6066273562Smarcel if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { 6067273562Smarcel return; 6068273562Smarcel } 6069273562Smarcel 6070273562Smarcel var type, i, l, 6071273562Smarcel oldData = jQuery._data( src ), 6072273562Smarcel curData = jQuery._data( dest, oldData ), 6073273562Smarcel events = oldData.events; 6074273562Smarcel 6075273562Smarcel if ( events ) { 6076273562Smarcel delete curData.handle; 6077273562Smarcel curData.events = {}; 6078273562Smarcel 6079273562Smarcel for ( type in events ) { 6080273562Smarcel for ( i = 0, l = events[ type ].length; i < l; i++ ) { 6081273562Smarcel jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data ); 6082273562Smarcel } 6083273562Smarcel } 6084273562Smarcel } 6085273562Smarcel 6086273562Smarcel // make the cloned public data object a copy from the original 6087273562Smarcel if ( curData.data ) { 6088273562Smarcel curData.data = jQuery.extend( {}, curData.data ); 6089273562Smarcel } 6090273562Smarcel} 6091273562Smarcel 6092273562Smarcelfunction cloneFixAttributes( src, dest ) { 6093273562Smarcel var nodeName; 6094273562Smarcel 6095273562Smarcel // We do not need to do anything for non-Elements 6096273562Smarcel if ( dest.nodeType !== 1 ) { 6097273562Smarcel return; 6098273562Smarcel } 6099273562Smarcel 6100273562Smarcel // clearAttributes removes the attributes, which we don't want, 6101273562Smarcel // but also removes the attachEvent events, which we *do* want 6102273562Smarcel if ( dest.clearAttributes ) { 6103273562Smarcel dest.clearAttributes(); 6104273562Smarcel } 6105273562Smarcel 6106273562Smarcel // mergeAttributes, in contrast, only merges back on the 6107273562Smarcel // original attributes, not the events 6108273562Smarcel if ( dest.mergeAttributes ) { 6109273562Smarcel dest.mergeAttributes( src ); 6110273562Smarcel } 6111273562Smarcel 6112273562Smarcel nodeName = dest.nodeName.toLowerCase(); 6113273562Smarcel 6114273562Smarcel // IE6-8 fail to clone children inside object elements that use 6115273562Smarcel // the proprietary classid attribute value (rather than the type 6116273562Smarcel // attribute) to identify the type of content to display 6117273562Smarcel if ( nodeName === "object" ) { 6118273562Smarcel dest.outerHTML = src.outerHTML; 6119273562Smarcel 6120273562Smarcel } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) { 6121273562Smarcel // IE6-8 fails to persist the checked state of a cloned checkbox 6122273562Smarcel // or radio button. Worse, IE6-7 fail to give the cloned element 6123273562Smarcel // a checked appearance if the defaultChecked value isn't also set 6124273562Smarcel if ( src.checked ) { 6125273562Smarcel dest.defaultChecked = dest.checked = src.checked; 6126273562Smarcel } 6127273562Smarcel 6128273562Smarcel // IE6-7 get confused and end up setting the value of a cloned 6129273562Smarcel // checkbox/radio button to an empty string instead of "on" 6130273562Smarcel if ( dest.value !== src.value ) { 6131273562Smarcel dest.value = src.value; 6132273562Smarcel } 6133273562Smarcel 6134273562Smarcel // IE6-8 fails to return the selected option to the default selected 6135273562Smarcel // state when cloning options 6136273562Smarcel } else if ( nodeName === "option" ) { 6137273562Smarcel dest.selected = src.defaultSelected; 6138273562Smarcel 6139273562Smarcel // IE6-8 fails to set the defaultValue to the correct value when 6140273562Smarcel // cloning other types of input fields 6141273562Smarcel } else if ( nodeName === "input" || nodeName === "textarea" ) { 6142273562Smarcel dest.defaultValue = src.defaultValue; 6143273562Smarcel } 6144273562Smarcel 6145273562Smarcel // Event data gets referenced instead of copied if the expando 6146273562Smarcel // gets copied too 6147273562Smarcel dest.removeAttribute( jQuery.expando ); 6148273562Smarcel} 6149273562Smarcel 6150273562SmarceljQuery.buildFragment = function( args, nodes, scripts ) { 6151273562Smarcel var fragment, cacheable, cacheresults, doc, 6152273562Smarcel first = args[ 0 ]; 6153273562Smarcel 6154273562Smarcel // nodes may contain either an explicit document object, 6155273562Smarcel // a jQuery collection or context object. 6156273562Smarcel // If nodes[0] contains a valid object to assign to doc 6157273562Smarcel if ( nodes && nodes[0] ) { 6158273562Smarcel doc = nodes[0].ownerDocument || nodes[0]; 6159273562Smarcel } 6160273562Smarcel 6161273562Smarcel // Ensure that an attr object doesn't incorrectly stand in as a document object 6162273562Smarcel // Chrome and Firefox seem to allow this to occur and will throw exception 6163273562Smarcel // Fixes #8950 6164273562Smarcel if ( !doc.createDocumentFragment ) { 6165273562Smarcel doc = document; 6166273562Smarcel } 6167273562Smarcel 6168273562Smarcel // Only cache "small" (1/2 KB) HTML strings that are associated with the main document 6169273562Smarcel // Cloning options loses the selected state, so don't cache them 6170273562Smarcel // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment 6171273562Smarcel // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache 6172273562Smarcel // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501 6173273562Smarcel if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document && 6174273562Smarcel first.charAt(0) === "<" && !rnocache.test( first ) && 6175273562Smarcel (jQuery.support.checkClone || !rchecked.test( first )) && 6176273562Smarcel (!jQuery.support.unknownElems && rnoshimcache.test( first )) ) { 6177273562Smarcel 6178273562Smarcel cacheable = true; 6179273562Smarcel 6180273562Smarcel cacheresults = jQuery.fragments[ first ]; 6181273562Smarcel if ( cacheresults && cacheresults !== 1 ) { 6182273562Smarcel fragment = cacheresults; 6183273562Smarcel } 6184273562Smarcel } 6185273562Smarcel 6186273562Smarcel if ( !fragment ) { 6187273562Smarcel fragment = doc.createDocumentFragment(); 6188273562Smarcel jQuery.clean( args, doc, fragment, scripts ); 6189273562Smarcel } 6190273562Smarcel 6191273562Smarcel if ( cacheable ) { 6192273562Smarcel jQuery.fragments[ first ] = cacheresults ? fragment : 1; 6193273562Smarcel } 6194273562Smarcel 6195273562Smarcel return { fragment: fragment, cacheable: cacheable }; 6196273562Smarcel}; 6197273562Smarcel 6198273562SmarceljQuery.fragments = {}; 6199273562Smarcel 6200273562SmarceljQuery.each({ 6201273562Smarcel appendTo: "append", 6202273562Smarcel prependTo: "prepend", 6203273562Smarcel insertBefore: "before", 6204273562Smarcel insertAfter: "after", 6205273562Smarcel replaceAll: "replaceWith" 6206273562Smarcel}, function( name, original ) { 6207273562Smarcel jQuery.fn[ name ] = function( selector ) { 6208273562Smarcel var ret = [], 6209273562Smarcel insert = jQuery( selector ), 6210273562Smarcel parent = this.length === 1 && this[0].parentNode; 6211273562Smarcel 6212273562Smarcel if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) { 6213273562Smarcel insert[ original ]( this[0] ); 6214273562Smarcel return this; 6215273562Smarcel 6216273562Smarcel } else { 6217273562Smarcel for ( var i = 0, l = insert.length; i < l; i++ ) { 6218273562Smarcel var elems = ( i > 0 ? this.clone(true) : this ).get(); 6219273562Smarcel jQuery( insert[i] )[ original ]( elems ); 6220273562Smarcel ret = ret.concat( elems ); 6221273562Smarcel } 6222273562Smarcel 6223273562Smarcel return this.pushStack( ret, name, insert.selector ); 6224273562Smarcel } 6225273562Smarcel }; 6226273562Smarcel}); 6227273562Smarcel 6228273562Smarcelfunction getAll( elem ) { 6229273562Smarcel if ( typeof elem.getElementsByTagName !== "undefined" ) { 6230273562Smarcel return elem.getElementsByTagName( "*" ); 6231273562Smarcel 6232273562Smarcel } else if ( typeof elem.querySelectorAll !== "undefined" ) { 6233273562Smarcel return elem.querySelectorAll( "*" ); 6234273562Smarcel 6235273562Smarcel } else { 6236273562Smarcel return []; 6237273562Smarcel } 6238273562Smarcel} 6239273562Smarcel 6240273562Smarcel// Used in clean, fixes the defaultChecked property 6241273562Smarcelfunction fixDefaultChecked( elem ) { 6242273562Smarcel if ( elem.type === "checkbox" || elem.type === "radio" ) { 6243273562Smarcel elem.defaultChecked = elem.checked; 6244273562Smarcel } 6245273562Smarcel} 6246273562Smarcel// Finds all inputs and passes them to fixDefaultChecked 6247273562Smarcelfunction findInputs( elem ) { 6248273562Smarcel var nodeName = ( elem.nodeName || "" ).toLowerCase(); 6249273562Smarcel if ( nodeName === "input" ) { 6250273562Smarcel fixDefaultChecked( elem ); 6251273562Smarcel // Skip scripts, get other children 6252273562Smarcel } else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) { 6253273562Smarcel jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked ); 6254273562Smarcel } 6255273562Smarcel} 6256273562Smarcel 6257273562SmarceljQuery.extend({ 6258273562Smarcel clone: function( elem, dataAndEvents, deepDataAndEvents ) { 6259273562Smarcel var clone = elem.cloneNode(true), 6260273562Smarcel srcElements, 6261273562Smarcel destElements, 6262273562Smarcel i; 6263273562Smarcel 6264273562Smarcel if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && 6265273562Smarcel (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { 6266273562Smarcel // IE copies events bound via attachEvent when using cloneNode. 6267273562Smarcel // Calling detachEvent on the clone will also remove the events 6268273562Smarcel // from the original. In order to get around this, we use some 6269273562Smarcel // proprietary methods to clear the events. Thanks to MooTools 6270273562Smarcel // guys for this hotness. 6271273562Smarcel 6272273562Smarcel cloneFixAttributes( elem, clone ); 6273273562Smarcel 6274273562Smarcel // Using Sizzle here is crazy slow, so we use getElementsByTagName 6275273562Smarcel // instead 6276273562Smarcel srcElements = getAll( elem ); 6277273562Smarcel destElements = getAll( clone ); 6278273562Smarcel 6279273562Smarcel // Weird iteration because IE will replace the length property 6280273562Smarcel // with an element if you are cloning the body and one of the 6281273562Smarcel // elements on the page has a name or id of "length" 6282273562Smarcel for ( i = 0; srcElements[i]; ++i ) { 6283273562Smarcel // Ensure that the destination node is not null; Fixes #9587 6284273562Smarcel if ( destElements[i] ) { 6285273562Smarcel cloneFixAttributes( srcElements[i], destElements[i] ); 6286273562Smarcel } 6287273562Smarcel } 6288273562Smarcel } 6289273562Smarcel 6290273562Smarcel // Copy the events from the original to the clone 6291273562Smarcel if ( dataAndEvents ) { 6292273562Smarcel cloneCopyEvent( elem, clone ); 6293273562Smarcel 6294273562Smarcel if ( deepDataAndEvents ) { 6295273562Smarcel srcElements = getAll( elem ); 6296273562Smarcel destElements = getAll( clone ); 6297273562Smarcel 6298273562Smarcel for ( i = 0; srcElements[i]; ++i ) { 6299273562Smarcel cloneCopyEvent( srcElements[i], destElements[i] ); 6300273562Smarcel } 6301273562Smarcel } 6302273562Smarcel } 6303273562Smarcel 6304273562Smarcel srcElements = destElements = null; 6305273562Smarcel 6306273562Smarcel // Return the cloned set 6307273562Smarcel return clone; 6308273562Smarcel }, 6309273562Smarcel 6310273562Smarcel clean: function( elems, context, fragment, scripts ) { 6311273562Smarcel var checkScriptType; 6312273562Smarcel 6313273562Smarcel context = context || document; 6314273562Smarcel 6315273562Smarcel // !context.createElement fails in IE with an error but returns typeof 'object' 6316273562Smarcel if ( typeof context.createElement === "undefined" ) { 6317273562Smarcel context = context.ownerDocument || context[0] && context[0].ownerDocument || document; 6318273562Smarcel } 6319273562Smarcel 6320273562Smarcel var ret = [], j; 6321273562Smarcel 6322273562Smarcel for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { 6323273562Smarcel if ( typeof elem === "number" ) { 6324273562Smarcel elem += ""; 6325273562Smarcel } 6326273562Smarcel 6327273562Smarcel if ( !elem ) { 6328273562Smarcel continue; 6329273562Smarcel } 6330273562Smarcel 6331273562Smarcel // Convert html string into DOM nodes 6332273562Smarcel if ( typeof elem === "string" ) { 6333273562Smarcel if ( !rhtml.test( elem ) ) { 6334273562Smarcel elem = context.createTextNode( elem ); 6335273562Smarcel } else { 6336273562Smarcel // Fix "XHTML"-style tags in all browsers 6337273562Smarcel elem = elem.replace(rxhtmlTag, "<$1></$2>"); 6338273562Smarcel 6339273562Smarcel // Trim whitespace, otherwise indexOf won't work as expected 6340273562Smarcel var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(), 6341273562Smarcel wrap = wrapMap[ tag ] || wrapMap._default, 6342273562Smarcel depth = wrap[0], 6343273562Smarcel div = context.createElement("div"); 6344273562Smarcel 6345273562Smarcel // Append wrapper element to unknown element safe doc fragment 6346273562Smarcel if ( context === document ) { 6347273562Smarcel // Use the fragment we've already created for this document 6348273562Smarcel safeFragment.appendChild( div ); 6349273562Smarcel } else { 6350273562Smarcel // Use a fragment created with the owner document 6351273562Smarcel createSafeFragment( context ).appendChild( div ); 6352273562Smarcel } 6353273562Smarcel 6354273562Smarcel // Go to html and back, then peel off extra wrappers 6355273562Smarcel div.innerHTML = wrap[1] + elem + wrap[2]; 6356273562Smarcel 6357273562Smarcel // Move to the right depth 6358273562Smarcel while ( depth-- ) { 6359273562Smarcel div = div.lastChild; 6360273562Smarcel } 6361273562Smarcel 6362273562Smarcel // Remove IE's autoinserted <tbody> from table fragments 6363273562Smarcel if ( !jQuery.support.tbody ) { 6364273562Smarcel 6365273562Smarcel // String was a <table>, *may* have spurious <tbody> 6366273562Smarcel var hasBody = rtbody.test(elem), 6367273562Smarcel tbody = tag === "table" && !hasBody ? 6368273562Smarcel div.firstChild && div.firstChild.childNodes : 6369273562Smarcel 6370273562Smarcel // String was a bare <thead> or <tfoot> 6371273562Smarcel wrap[1] === "<table>" && !hasBody ? 6372273562Smarcel div.childNodes : 6373273562Smarcel []; 6374273562Smarcel 6375273562Smarcel for ( j = tbody.length - 1; j >= 0 ; --j ) { 6376273562Smarcel if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) { 6377273562Smarcel tbody[ j ].parentNode.removeChild( tbody[ j ] ); 6378273562Smarcel } 6379273562Smarcel } 6380273562Smarcel } 6381273562Smarcel 6382273562Smarcel // IE completely kills leading whitespace when innerHTML is used 6383273562Smarcel if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { 6384273562Smarcel div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild ); 6385273562Smarcel } 6386273562Smarcel 6387273562Smarcel elem = div.childNodes; 6388273562Smarcel } 6389273562Smarcel } 6390273562Smarcel 6391273562Smarcel // Resets defaultChecked for any radios and checkboxes 6392273562Smarcel // about to be appended to the DOM in IE 6/7 (#8060) 6393273562Smarcel var len; 6394273562Smarcel if ( !jQuery.support.appendChecked ) { 6395273562Smarcel if ( elem[0] && typeof (len = elem.length) === "number" ) { 6396273562Smarcel for ( j = 0; j < len; j++ ) { 6397273562Smarcel findInputs( elem[j] ); 6398273562Smarcel } 6399273562Smarcel } else { 6400273562Smarcel findInputs( elem ); 6401273562Smarcel } 6402273562Smarcel } 6403273562Smarcel 6404273562Smarcel if ( elem.nodeType ) { 6405273562Smarcel ret.push( elem ); 6406273562Smarcel } else { 6407273562Smarcel ret = jQuery.merge( ret, elem ); 6408273562Smarcel } 6409273562Smarcel } 6410273562Smarcel 6411273562Smarcel if ( fragment ) { 6412273562Smarcel checkScriptType = function( elem ) { 6413273562Smarcel return !elem.type || rscriptType.test( elem.type ); 6414273562Smarcel }; 6415273562Smarcel for ( i = 0; ret[i]; i++ ) { 6416273562Smarcel if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) { 6417273562Smarcel scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] ); 6418273562Smarcel 6419273562Smarcel } else { 6420273562Smarcel if ( ret[i].nodeType === 1 ) { 6421273562Smarcel var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType ); 6422273562Smarcel 6423273562Smarcel ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) ); 6424273562Smarcel } 6425273562Smarcel fragment.appendChild( ret[i] ); 6426273562Smarcel } 6427273562Smarcel } 6428273562Smarcel } 6429273562Smarcel 6430273562Smarcel return ret; 6431273562Smarcel }, 6432273562Smarcel 6433273562Smarcel cleanData: function( elems ) { 6434273562Smarcel var data, id, 6435273562Smarcel cache = jQuery.cache, 6436273562Smarcel special = jQuery.event.special, 6437273562Smarcel deleteExpando = jQuery.support.deleteExpando; 6438273562Smarcel 6439273562Smarcel for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { 6440273562Smarcel if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { 6441273562Smarcel continue; 6442273562Smarcel } 6443273562Smarcel 6444273562Smarcel id = elem[ jQuery.expando ]; 6445273562Smarcel 6446273562Smarcel if ( id ) { 6447273562Smarcel data = cache[ id ]; 6448273562Smarcel 6449273562Smarcel if ( data && data.events ) { 6450273562Smarcel for ( var type in data.events ) { 6451273562Smarcel if ( special[ type ] ) { 6452273562Smarcel jQuery.event.remove( elem, type ); 6453273562Smarcel 6454273562Smarcel // This is a shortcut to avoid jQuery.event.remove's overhead 6455273562Smarcel } else { 6456273562Smarcel jQuery.removeEvent( elem, type, data.handle ); 6457273562Smarcel } 6458273562Smarcel } 6459273562Smarcel 6460273562Smarcel // Null the DOM reference to avoid IE6/7/8 leak (#7054) 6461273562Smarcel if ( data.handle ) { 6462273562Smarcel data.handle.elem = null; 6463273562Smarcel } 6464273562Smarcel } 6465273562Smarcel 6466273562Smarcel if ( deleteExpando ) { 6467273562Smarcel delete elem[ jQuery.expando ]; 6468273562Smarcel 6469273562Smarcel } else if ( elem.removeAttribute ) { 6470273562Smarcel elem.removeAttribute( jQuery.expando ); 6471273562Smarcel } 6472273562Smarcel 6473273562Smarcel delete cache[ id ]; 6474273562Smarcel } 6475273562Smarcel } 6476273562Smarcel } 6477273562Smarcel}); 6478273562Smarcel 6479273562Smarcelfunction evalScript( i, elem ) { 6480273562Smarcel if ( elem.src ) { 6481273562Smarcel jQuery.ajax({ 6482273562Smarcel url: elem.src, 6483273562Smarcel async: false, 6484273562Smarcel dataType: "script" 6485273562Smarcel }); 6486273562Smarcel } else { 6487273562Smarcel jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) ); 6488273562Smarcel } 6489273562Smarcel 6490273562Smarcel if ( elem.parentNode ) { 6491273562Smarcel elem.parentNode.removeChild( elem ); 6492273562Smarcel } 6493273562Smarcel} 6494273562Smarcel 6495273562Smarcel 6496273562Smarcel 6497273562Smarcel 6498273562Smarcelvar ralpha = /alpha\([^)]*\)/i, 6499273562Smarcel ropacity = /opacity=([^)]*)/, 6500273562Smarcel // fixed for IE9, see #8346 6501273562Smarcel rupper = /([A-Z]|^ms)/g, 6502273562Smarcel rnumpx = /^-?\d+(?:px)?$/i, 6503273562Smarcel rnum = /^-?\d/, 6504273562Smarcel rrelNum = /^([\-+])=([\-+.\de]+)/, 6505273562Smarcel 6506273562Smarcel cssShow = { position: "absolute", visibility: "hidden", display: "block" }, 6507273562Smarcel cssWidth = [ "Left", "Right" ], 6508273562Smarcel cssHeight = [ "Top", "Bottom" ], 6509273562Smarcel curCSS, 6510273562Smarcel 6511273562Smarcel getComputedStyle, 6512273562Smarcel currentStyle; 6513273562Smarcel 6514273562SmarceljQuery.fn.css = function( name, value ) { 6515273562Smarcel // Setting 'undefined' is a no-op 6516273562Smarcel if ( arguments.length === 2 && value === undefined ) { 6517273562Smarcel return this; 6518273562Smarcel } 6519273562Smarcel 6520273562Smarcel return jQuery.access( this, name, value, true, function( elem, name, value ) { 6521273562Smarcel return value !== undefined ? 6522273562Smarcel jQuery.style( elem, name, value ) : 6523273562Smarcel jQuery.css( elem, name ); 6524273562Smarcel }); 6525273562Smarcel}; 6526273562Smarcel 6527273562SmarceljQuery.extend({ 6528273562Smarcel // Add in style property hooks for overriding the default 6529273562Smarcel // behavior of getting and setting a style property 6530273562Smarcel cssHooks: { 6531273562Smarcel opacity: { 6532273562Smarcel get: function( elem, computed ) { 6533273562Smarcel if ( computed ) { 6534273562Smarcel // We should always get a number back from opacity 6535273562Smarcel var ret = curCSS( elem, "opacity", "opacity" ); 6536273562Smarcel return ret === "" ? "1" : ret; 6537273562Smarcel 6538273562Smarcel } else { 6539273562Smarcel return elem.style.opacity; 6540273562Smarcel } 6541273562Smarcel } 6542273562Smarcel } 6543273562Smarcel }, 6544273562Smarcel 6545273562Smarcel // Exclude the following css properties to add px 6546273562Smarcel cssNumber: { 6547273562Smarcel "fillOpacity": true, 6548273562Smarcel "fontWeight": true, 6549273562Smarcel "lineHeight": true, 6550273562Smarcel "opacity": true, 6551273562Smarcel "orphans": true, 6552273562Smarcel "widows": true, 6553273562Smarcel "zIndex": true, 6554273562Smarcel "zoom": true 6555273562Smarcel }, 6556273562Smarcel 6557273562Smarcel // Add in properties whose names you wish to fix before 6558273562Smarcel // setting or getting the value 6559273562Smarcel cssProps: { 6560273562Smarcel // normalize float css property 6561273562Smarcel "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" 6562273562Smarcel }, 6563273562Smarcel 6564273562Smarcel // Get and set the style property on a DOM Node 6565273562Smarcel style: function( elem, name, value, extra ) { 6566273562Smarcel // Don't set styles on text and comment nodes 6567273562Smarcel if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { 6568273562Smarcel return; 6569273562Smarcel } 6570273562Smarcel 6571273562Smarcel // Make sure that we're working with the right name 6572273562Smarcel var ret, type, origName = jQuery.camelCase( name ), 6573273562Smarcel style = elem.style, hooks = jQuery.cssHooks[ origName ]; 6574273562Smarcel 6575273562Smarcel name = jQuery.cssProps[ origName ] || origName; 6576273562Smarcel 6577273562Smarcel // Check if we're setting a value 6578273562Smarcel if ( value !== undefined ) { 6579273562Smarcel type = typeof value; 6580273562Smarcel 6581273562Smarcel // convert relative number strings (+= or -=) to relative numbers. #7345 6582273562Smarcel if ( type === "string" && (ret = rrelNum.exec( value )) ) { 6583273562Smarcel value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) ); 6584273562Smarcel // Fixes bug #9237 6585273562Smarcel type = "number"; 6586273562Smarcel } 6587273562Smarcel 6588273562Smarcel // Make sure that NaN and null values aren't set. See: #7116 6589273562Smarcel if ( value == null || type === "number" && isNaN( value ) ) { 6590273562Smarcel return; 6591273562Smarcel } 6592273562Smarcel 6593273562Smarcel // If a number was passed in, add 'px' to the (except for certain CSS properties) 6594273562Smarcel if ( type === "number" && !jQuery.cssNumber[ origName ] ) { 6595273562Smarcel value += "px"; 6596273562Smarcel } 6597273562Smarcel 6598273562Smarcel // If a hook was provided, use that value, otherwise just set the specified value 6599273562Smarcel if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) { 6600273562Smarcel // Wrapped to prevent IE from throwing errors when 'invalid' values are provided 6601273562Smarcel // Fixes bug #5509 6602273562Smarcel try { 6603273562Smarcel style[ name ] = value; 6604273562Smarcel } catch(e) {} 6605273562Smarcel } 6606273562Smarcel 6607273562Smarcel } else { 6608273562Smarcel // If a hook was provided get the non-computed value from there 6609273562Smarcel if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { 6610273562Smarcel return ret; 6611273562Smarcel } 6612273562Smarcel 6613273562Smarcel // Otherwise just get the value from the style object 6614273562Smarcel return style[ name ]; 6615273562Smarcel } 6616273562Smarcel }, 6617273562Smarcel 6618273562Smarcel css: function( elem, name, extra ) { 6619273562Smarcel var ret, hooks; 6620273562Smarcel 6621273562Smarcel // Make sure that we're working with the right name 6622273562Smarcel name = jQuery.camelCase( name ); 6623273562Smarcel hooks = jQuery.cssHooks[ name ]; 6624273562Smarcel name = jQuery.cssProps[ name ] || name; 6625273562Smarcel 6626273562Smarcel // cssFloat needs a special treatment 6627273562Smarcel if ( name === "cssFloat" ) { 6628273562Smarcel name = "float"; 6629273562Smarcel } 6630273562Smarcel 6631273562Smarcel // If a hook was provided get the computed value from there 6632273562Smarcel if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) { 6633273562Smarcel return ret; 6634273562Smarcel 6635273562Smarcel // Otherwise, if a way to get the computed value exists, use that 6636273562Smarcel } else if ( curCSS ) { 6637273562Smarcel return curCSS( elem, name ); 6638273562Smarcel } 6639273562Smarcel }, 6640273562Smarcel 6641273562Smarcel // A method for quickly swapping in/out CSS properties to get correct calculations 6642273562Smarcel swap: function( elem, options, callback ) { 6643273562Smarcel var old = {}; 6644273562Smarcel 6645273562Smarcel // Remember the old values, and insert the new ones 6646273562Smarcel for ( var name in options ) { 6647273562Smarcel old[ name ] = elem.style[ name ]; 6648273562Smarcel elem.style[ name ] = options[ name ]; 6649273562Smarcel } 6650273562Smarcel 6651273562Smarcel callback.call( elem ); 6652273562Smarcel 6653273562Smarcel // Revert the old values 6654273562Smarcel for ( name in options ) { 6655273562Smarcel elem.style[ name ] = old[ name ]; 6656273562Smarcel } 6657273562Smarcel } 6658273562Smarcel}); 6659273562Smarcel 6660273562Smarcel// DEPRECATED, Use jQuery.css() instead 6661273562SmarceljQuery.curCSS = jQuery.css; 6662273562Smarcel 6663273562SmarceljQuery.each(["height", "width"], function( i, name ) { 6664273562Smarcel jQuery.cssHooks[ name ] = { 6665273562Smarcel get: function( elem, computed, extra ) { 6666273562Smarcel var val; 6667273562Smarcel 6668273562Smarcel if ( computed ) { 6669273562Smarcel if ( elem.offsetWidth !== 0 ) { 6670273562Smarcel return getWH( elem, name, extra ); 6671273562Smarcel } else { 6672273562Smarcel jQuery.swap( elem, cssShow, function() { 6673273562Smarcel val = getWH( elem, name, extra ); 6674273562Smarcel }); 6675273562Smarcel } 6676273562Smarcel 6677273562Smarcel return val; 6678273562Smarcel } 6679273562Smarcel }, 6680273562Smarcel 6681273562Smarcel set: function( elem, value ) { 6682273562Smarcel if ( rnumpx.test( value ) ) { 6683273562Smarcel // ignore negative width and height values #1599 6684273562Smarcel value = parseFloat( value ); 6685273562Smarcel 6686273562Smarcel if ( value >= 0 ) { 6687273562Smarcel return value + "px"; 6688273562Smarcel } 6689273562Smarcel 6690273562Smarcel } else { 6691273562Smarcel return value; 6692273562Smarcel } 6693273562Smarcel } 6694273562Smarcel }; 6695273562Smarcel}); 6696273562Smarcel 6697273562Smarcelif ( !jQuery.support.opacity ) { 6698273562Smarcel jQuery.cssHooks.opacity = { 6699273562Smarcel get: function( elem, computed ) { 6700273562Smarcel // IE uses filters for opacity 6701273562Smarcel return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ? 6702273562Smarcel ( parseFloat( RegExp.$1 ) / 100 ) + "" : 6703273562Smarcel computed ? "1" : ""; 6704273562Smarcel }, 6705273562Smarcel 6706273562Smarcel set: function( elem, value ) { 6707273562Smarcel var style = elem.style, 6708273562Smarcel currentStyle = elem.currentStyle, 6709273562Smarcel opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "", 6710273562Smarcel filter = currentStyle && currentStyle.filter || style.filter || ""; 6711273562Smarcel 6712273562Smarcel // IE has trouble with opacity if it does not have layout 6713273562Smarcel // Force it by setting the zoom level 6714273562Smarcel style.zoom = 1; 6715273562Smarcel 6716273562Smarcel // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652 6717273562Smarcel if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) { 6718273562Smarcel 6719273562Smarcel // Setting style.filter to null, "" & " " still leave "filter:" in the cssText 6720273562Smarcel // if "filter:" is present at all, clearType is disabled, we want to avoid this 6721273562Smarcel // style.removeAttribute is IE Only, but so apparently is this code path... 6722273562Smarcel style.removeAttribute( "filter" ); 6723273562Smarcel 6724273562Smarcel // if there there is no filter style applied in a css rule, we are done 6725273562Smarcel if ( currentStyle && !currentStyle.filter ) { 6726273562Smarcel return; 6727273562Smarcel } 6728273562Smarcel } 6729273562Smarcel 6730273562Smarcel // otherwise, set new filter values 6731273562Smarcel style.filter = ralpha.test( filter ) ? 6732273562Smarcel filter.replace( ralpha, opacity ) : 6733273562Smarcel filter + " " + opacity; 6734273562Smarcel } 6735273562Smarcel }; 6736273562Smarcel} 6737273562Smarcel 6738273562SmarceljQuery(function() { 6739273562Smarcel // This hook cannot be added until DOM ready because the support test 6740273562Smarcel // for it is not run until after DOM ready 6741273562Smarcel if ( !jQuery.support.reliableMarginRight ) { 6742273562Smarcel jQuery.cssHooks.marginRight = { 6743273562Smarcel get: function( elem, computed ) { 6744273562Smarcel // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right 6745273562Smarcel // Work around by temporarily setting element display to inline-block 6746273562Smarcel var ret; 6747273562Smarcel jQuery.swap( elem, { "display": "inline-block" }, function() { 6748273562Smarcel if ( computed ) { 6749273562Smarcel ret = curCSS( elem, "margin-right", "marginRight" ); 6750273562Smarcel } else { 6751273562Smarcel ret = elem.style.marginRight; 6752273562Smarcel } 6753273562Smarcel }); 6754273562Smarcel return ret; 6755273562Smarcel } 6756273562Smarcel }; 6757273562Smarcel } 6758273562Smarcel}); 6759273562Smarcel 6760273562Smarcelif ( document.defaultView && document.defaultView.getComputedStyle ) { 6761273562Smarcel getComputedStyle = function( elem, name ) { 6762273562Smarcel var ret, defaultView, computedStyle; 6763273562Smarcel 6764273562Smarcel name = name.replace( rupper, "-$1" ).toLowerCase(); 6765273562Smarcel 6766273562Smarcel if ( !(defaultView = elem.ownerDocument.defaultView) ) { 6767273562Smarcel return undefined; 6768273562Smarcel } 6769273562Smarcel 6770273562Smarcel if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) { 6771273562Smarcel ret = computedStyle.getPropertyValue( name ); 6772273562Smarcel if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) { 6773273562Smarcel ret = jQuery.style( elem, name ); 6774273562Smarcel } 6775273562Smarcel } 6776273562Smarcel 6777273562Smarcel return ret; 6778273562Smarcel }; 6779273562Smarcel} 6780273562Smarcel 6781273562Smarcelif ( document.documentElement.currentStyle ) { 6782273562Smarcel currentStyle = function( elem, name ) { 6783273562Smarcel var left, rsLeft, uncomputed, 6784273562Smarcel ret = elem.currentStyle && elem.currentStyle[ name ], 6785273562Smarcel style = elem.style; 6786273562Smarcel 6787273562Smarcel // Avoid setting ret to empty string here 6788273562Smarcel // so we don't default to auto 6789273562Smarcel if ( ret === null && style && (uncomputed = style[ name ]) ) { 6790273562Smarcel ret = uncomputed; 6791273562Smarcel } 6792273562Smarcel 6793273562Smarcel // From the awesome hack by Dean Edwards 6794273562Smarcel // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 6795273562Smarcel 6796273562Smarcel // If we're not dealing with a regular pixel number 6797273562Smarcel // but a number that has a weird ending, we need to convert it to pixels 6798273562Smarcel if ( !rnumpx.test( ret ) && rnum.test( ret ) ) { 6799273562Smarcel 6800273562Smarcel // Remember the original values 6801273562Smarcel left = style.left; 6802273562Smarcel rsLeft = elem.runtimeStyle && elem.runtimeStyle.left; 6803273562Smarcel 6804273562Smarcel // Put in the new values to get a computed value out 6805273562Smarcel if ( rsLeft ) { 6806273562Smarcel elem.runtimeStyle.left = elem.currentStyle.left; 6807273562Smarcel } 6808273562Smarcel style.left = name === "fontSize" ? "1em" : ( ret || 0 ); 6809273562Smarcel ret = style.pixelLeft + "px"; 6810273562Smarcel 6811273562Smarcel // Revert the changed values 6812273562Smarcel style.left = left; 6813273562Smarcel if ( rsLeft ) { 6814273562Smarcel elem.runtimeStyle.left = rsLeft; 6815273562Smarcel } 6816273562Smarcel } 6817273562Smarcel 6818273562Smarcel return ret === "" ? "auto" : ret; 6819273562Smarcel }; 6820273562Smarcel} 6821273562Smarcel 6822273562SmarcelcurCSS = getComputedStyle || currentStyle; 6823273562Smarcel 6824273562Smarcelfunction getWH( elem, name, extra ) { 6825273562Smarcel 6826273562Smarcel // Start with offset property 6827273562Smarcel var val = name === "width" ? elem.offsetWidth : elem.offsetHeight, 6828273562Smarcel which = name === "width" ? cssWidth : cssHeight; 6829273562Smarcel 6830273562Smarcel if ( val > 0 ) { 6831273562Smarcel if ( extra !== "border" ) { 6832273562Smarcel jQuery.each( which, function() { 6833273562Smarcel if ( !extra ) { 6834273562Smarcel val -= parseFloat( jQuery.css( elem, "padding" + this ) ) || 0; 6835273562Smarcel } 6836273562Smarcel if ( extra === "margin" ) { 6837273562Smarcel val += parseFloat( jQuery.css( elem, extra + this ) ) || 0; 6838273562Smarcel } else { 6839273562Smarcel val -= parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0; 6840273562Smarcel } 6841273562Smarcel }); 6842273562Smarcel } 6843273562Smarcel 6844273562Smarcel return val + "px"; 6845273562Smarcel } 6846273562Smarcel 6847273562Smarcel // Fall back to computed then uncomputed css if necessary 6848273562Smarcel val = curCSS( elem, name, name ); 6849273562Smarcel if ( val < 0 || val == null ) { 6850273562Smarcel val = elem.style[ name ] || 0; 6851273562Smarcel } 6852273562Smarcel // Normalize "", auto, and prepare for extra 6853273562Smarcel val = parseFloat( val ) || 0; 6854273562Smarcel 6855273562Smarcel // Add padding, border, margin 6856273562Smarcel if ( extra ) { 6857273562Smarcel jQuery.each( which, function() { 6858273562Smarcel val += parseFloat( jQuery.css( elem, "padding" + this ) ) || 0; 6859273562Smarcel if ( extra !== "padding" ) { 6860273562Smarcel val += parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0; 6861273562Smarcel } 6862273562Smarcel if ( extra === "margin" ) { 6863273562Smarcel val += parseFloat( jQuery.css( elem, extra + this ) ) || 0; 6864273562Smarcel } 6865273562Smarcel }); 6866273562Smarcel } 6867273562Smarcel 6868273562Smarcel return val + "px"; 6869273562Smarcel} 6870273562Smarcel 6871273562Smarcelif ( jQuery.expr && jQuery.expr.filters ) { 6872273562Smarcel jQuery.expr.filters.hidden = function( elem ) { 6873273562Smarcel var width = elem.offsetWidth, 6874273562Smarcel height = elem.offsetHeight; 6875273562Smarcel 6876273562Smarcel return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none"); 6877273562Smarcel }; 6878273562Smarcel 6879273562Smarcel jQuery.expr.filters.visible = function( elem ) { 6880273562Smarcel return !jQuery.expr.filters.hidden( elem ); 6881273562Smarcel }; 6882273562Smarcel} 6883273562Smarcel 6884273562Smarcel 6885273562Smarcel 6886273562Smarcel 6887273562Smarcelvar r20 = /%20/g, 6888273562Smarcel rbracket = /\[\]$/, 6889273562Smarcel rCRLF = /\r?\n/g, 6890273562Smarcel rhash = /#.*$/, 6891273562Smarcel rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL 6892273562Smarcel rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, 6893273562Smarcel // #7653, #8125, #8152: local protocol detection 6894273562Smarcel rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/, 6895273562Smarcel rnoContent = /^(?:GET|HEAD)$/, 6896273562Smarcel rprotocol = /^\/\//, 6897273562Smarcel rquery = /\?/, 6898273562Smarcel rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, 6899273562Smarcel rselectTextarea = /^(?:select|textarea)/i, 6900273562Smarcel rspacesAjax = /\s+/, 6901273562Smarcel rts = /([?&])_=[^&]*/, 6902273562Smarcel rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/, 6903273562Smarcel 6904273562Smarcel // Keep a copy of the old load method 6905273562Smarcel _load = jQuery.fn.load, 6906273562Smarcel 6907273562Smarcel /* Prefilters 6908273562Smarcel * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) 6909273562Smarcel * 2) These are called: 6910273562Smarcel * - BEFORE asking for a transport 6911273562Smarcel * - AFTER param serialization (s.data is a string if s.processData is true) 6912273562Smarcel * 3) key is the dataType 6913273562Smarcel * 4) the catchall symbol "*" can be used 6914273562Smarcel * 5) execution will start with transport dataType and THEN continue down to "*" if needed 6915273562Smarcel */ 6916273562Smarcel prefilters = {}, 6917273562Smarcel 6918273562Smarcel /* Transports bindings 6919273562Smarcel * 1) key is the dataType 6920273562Smarcel * 2) the catchall symbol "*" can be used 6921273562Smarcel * 3) selection will start with transport dataType and THEN go to "*" if needed 6922273562Smarcel */ 6923273562Smarcel transports = {}, 6924273562Smarcel 6925273562Smarcel // Document location 6926273562Smarcel ajaxLocation, 6927273562Smarcel 6928273562Smarcel // Document location segments 6929273562Smarcel ajaxLocParts, 6930273562Smarcel 6931273562Smarcel // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression 6932273562Smarcel allTypes = ["*/"] + ["*"]; 6933273562Smarcel 6934273562Smarcel// #8138, IE may throw an exception when accessing 6935273562Smarcel// a field from window.location if document.domain has been set 6936273562Smarceltry { 6937273562Smarcel ajaxLocation = location.href; 6938273562Smarcel} catch( e ) { 6939273562Smarcel // Use the href attribute of an A element 6940273562Smarcel // since IE will modify it given document.location 6941273562Smarcel ajaxLocation = document.createElement( "a" ); 6942273562Smarcel ajaxLocation.href = ""; 6943273562Smarcel ajaxLocation = ajaxLocation.href; 6944273562Smarcel} 6945273562Smarcel 6946273562Smarcel// Segment location into parts 6947273562SmarcelajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || []; 6948273562Smarcel 6949273562Smarcel// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport 6950273562Smarcelfunction addToPrefiltersOrTransports( structure ) { 6951273562Smarcel 6952273562Smarcel // dataTypeExpression is optional and defaults to "*" 6953273562Smarcel return function( dataTypeExpression, func ) { 6954273562Smarcel 6955273562Smarcel if ( typeof dataTypeExpression !== "string" ) { 6956273562Smarcel func = dataTypeExpression; 6957273562Smarcel dataTypeExpression = "*"; 6958273562Smarcel } 6959273562Smarcel 6960273562Smarcel if ( jQuery.isFunction( func ) ) { 6961273562Smarcel var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ), 6962273562Smarcel i = 0, 6963273562Smarcel length = dataTypes.length, 6964273562Smarcel dataType, 6965273562Smarcel list, 6966273562Smarcel placeBefore; 6967273562Smarcel 6968273562Smarcel // For each dataType in the dataTypeExpression 6969273562Smarcel for ( ; i < length; i++ ) { 6970273562Smarcel dataType = dataTypes[ i ]; 6971273562Smarcel // We control if we're asked to add before 6972273562Smarcel // any existing element 6973273562Smarcel placeBefore = /^\+/.test( dataType ); 6974273562Smarcel if ( placeBefore ) { 6975273562Smarcel dataType = dataType.substr( 1 ) || "*"; 6976273562Smarcel } 6977273562Smarcel list = structure[ dataType ] = structure[ dataType ] || []; 6978273562Smarcel // then we add to the structure accordingly 6979273562Smarcel list[ placeBefore ? "unshift" : "push" ]( func ); 6980273562Smarcel } 6981273562Smarcel } 6982273562Smarcel }; 6983273562Smarcel} 6984273562Smarcel 6985273562Smarcel// Base inspection function for prefilters and transports 6986273562Smarcelfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR, 6987273562Smarcel dataType /* internal */, inspected /* internal */ ) { 6988273562Smarcel 6989273562Smarcel dataType = dataType || options.dataTypes[ 0 ]; 6990273562Smarcel inspected = inspected || {}; 6991273562Smarcel 6992273562Smarcel inspected[ dataType ] = true; 6993273562Smarcel 6994273562Smarcel var list = structure[ dataType ], 6995273562Smarcel i = 0, 6996273562Smarcel length = list ? list.length : 0, 6997273562Smarcel executeOnly = ( structure === prefilters ), 6998273562Smarcel selection; 6999273562Smarcel 7000273562Smarcel for ( ; i < length && ( executeOnly || !selection ); i++ ) { 7001273562Smarcel selection = list[ i ]( options, originalOptions, jqXHR ); 7002273562Smarcel // If we got redirected to another dataType 7003273562Smarcel // we try there if executing only and not done already 7004273562Smarcel if ( typeof selection === "string" ) { 7005273562Smarcel if ( !executeOnly || inspected[ selection ] ) { 7006273562Smarcel selection = undefined; 7007273562Smarcel } else { 7008273562Smarcel options.dataTypes.unshift( selection ); 7009273562Smarcel selection = inspectPrefiltersOrTransports( 7010273562Smarcel structure, options, originalOptions, jqXHR, selection, inspected ); 7011273562Smarcel } 7012273562Smarcel } 7013273562Smarcel } 7014273562Smarcel // If we're only executing or nothing was selected 7015273562Smarcel // we try the catchall dataType if not done already 7016273562Smarcel if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) { 7017273562Smarcel selection = inspectPrefiltersOrTransports( 7018273562Smarcel structure, options, originalOptions, jqXHR, "*", inspected ); 7019273562Smarcel } 7020273562Smarcel // unnecessary when only executing (prefilters) 7021273562Smarcel // but it'll be ignored by the caller in that case 7022273562Smarcel return selection; 7023273562Smarcel} 7024273562Smarcel 7025273562Smarcel// A special extend for ajax options 7026273562Smarcel// that takes "flat" options (not to be deep extended) 7027273562Smarcel// Fixes #9887 7028273562Smarcelfunction ajaxExtend( target, src ) { 7029273562Smarcel var key, deep, 7030273562Smarcel flatOptions = jQuery.ajaxSettings.flatOptions || {}; 7031273562Smarcel for ( key in src ) { 7032273562Smarcel if ( src[ key ] !== undefined ) { 7033273562Smarcel ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; 7034273562Smarcel } 7035273562Smarcel } 7036273562Smarcel if ( deep ) { 7037273562Smarcel jQuery.extend( true, target, deep ); 7038273562Smarcel } 7039273562Smarcel} 7040273562Smarcel 7041273562SmarceljQuery.fn.extend({ 7042273562Smarcel load: function( url, params, callback ) { 7043273562Smarcel if ( typeof url !== "string" && _load ) { 7044273562Smarcel return _load.apply( this, arguments ); 7045273562Smarcel 7046273562Smarcel // Don't do a request if no elements are being requested 7047273562Smarcel } else if ( !this.length ) { 7048273562Smarcel return this; 7049273562Smarcel } 7050273562Smarcel 7051273562Smarcel var off = url.indexOf( " " ); 7052273562Smarcel if ( off >= 0 ) { 7053273562Smarcel var selector = url.slice( off, url.length ); 7054273562Smarcel url = url.slice( 0, off ); 7055273562Smarcel } 7056273562Smarcel 7057273562Smarcel // Default to a GET request 7058273562Smarcel var type = "GET"; 7059273562Smarcel 7060273562Smarcel // If the second parameter was provided 7061273562Smarcel if ( params ) { 7062273562Smarcel // If it's a function 7063273562Smarcel if ( jQuery.isFunction( params ) ) { 7064273562Smarcel // We assume that it's the callback 7065273562Smarcel callback = params; 7066273562Smarcel params = undefined; 7067273562Smarcel 7068273562Smarcel // Otherwise, build a param string 7069273562Smarcel } else if ( typeof params === "object" ) { 7070273562Smarcel params = jQuery.param( params, jQuery.ajaxSettings.traditional ); 7071273562Smarcel type = "POST"; 7072273562Smarcel } 7073273562Smarcel } 7074273562Smarcel 7075273562Smarcel var self = this; 7076273562Smarcel 7077273562Smarcel // Request the remote document 7078273562Smarcel jQuery.ajax({ 7079273562Smarcel url: url, 7080273562Smarcel type: type, 7081273562Smarcel dataType: "html", 7082273562Smarcel data: params, 7083273562Smarcel // Complete callback (responseText is used internally) 7084273562Smarcel complete: function( jqXHR, status, responseText ) { 7085273562Smarcel // Store the response as specified by the jqXHR object 7086273562Smarcel responseText = jqXHR.responseText; 7087273562Smarcel // If successful, inject the HTML into all the matched elements 7088273562Smarcel if ( jqXHR.isResolved() ) { 7089273562Smarcel // #4825: Get the actual response in case 7090273562Smarcel // a dataFilter is present in ajaxSettings 7091273562Smarcel jqXHR.done(function( r ) { 7092273562Smarcel responseText = r; 7093273562Smarcel }); 7094273562Smarcel // See if a selector was specified 7095273562Smarcel self.html( selector ? 7096273562Smarcel // Create a dummy div to hold the results 7097273562Smarcel jQuery("<div>") 7098273562Smarcel // inject the contents of the document in, removing the scripts 7099273562Smarcel // to avoid any 'Permission Denied' errors in IE 7100273562Smarcel .append(responseText.replace(rscript, "")) 7101273562Smarcel 7102273562Smarcel // Locate the specified elements 7103273562Smarcel .find(selector) : 7104273562Smarcel 7105273562Smarcel // If not, just inject the full result 7106273562Smarcel responseText ); 7107273562Smarcel } 7108273562Smarcel 7109273562Smarcel if ( callback ) { 7110273562Smarcel self.each( callback, [ responseText, status, jqXHR ] ); 7111273562Smarcel } 7112273562Smarcel } 7113273562Smarcel }); 7114273562Smarcel 7115273562Smarcel return this; 7116273562Smarcel }, 7117273562Smarcel 7118273562Smarcel serialize: function() { 7119273562Smarcel return jQuery.param( this.serializeArray() ); 7120273562Smarcel }, 7121273562Smarcel 7122273562Smarcel serializeArray: function() { 7123273562Smarcel return this.map(function(){ 7124273562Smarcel return this.elements ? jQuery.makeArray( this.elements ) : this; 7125273562Smarcel }) 7126273562Smarcel .filter(function(){ 7127273562Smarcel return this.name && !this.disabled && 7128273562Smarcel ( this.checked || rselectTextarea.test( this.nodeName ) || 7129273562Smarcel rinput.test( this.type ) ); 7130273562Smarcel }) 7131273562Smarcel .map(function( i, elem ){ 7132273562Smarcel var val = jQuery( this ).val(); 7133273562Smarcel 7134273562Smarcel return val == null ? 7135273562Smarcel null : 7136273562Smarcel jQuery.isArray( val ) ? 7137273562Smarcel jQuery.map( val, function( val, i ){ 7138273562Smarcel return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 7139273562Smarcel }) : 7140273562Smarcel { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 7141273562Smarcel }).get(); 7142273562Smarcel } 7143273562Smarcel}); 7144273562Smarcel 7145273562Smarcel// Attach a bunch of functions for handling common AJAX events 7146273562SmarceljQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){ 7147273562Smarcel jQuery.fn[ o ] = function( f ){ 7148273562Smarcel return this.bind( o, f ); 7149273562Smarcel }; 7150273562Smarcel}); 7151273562Smarcel 7152273562SmarceljQuery.each( [ "get", "post" ], function( i, method ) { 7153273562Smarcel jQuery[ method ] = function( url, data, callback, type ) { 7154273562Smarcel // shift arguments if data argument was omitted 7155273562Smarcel if ( jQuery.isFunction( data ) ) { 7156273562Smarcel type = type || callback; 7157273562Smarcel callback = data; 7158273562Smarcel data = undefined; 7159273562Smarcel } 7160273562Smarcel 7161273562Smarcel return jQuery.ajax({ 7162273562Smarcel type: method, 7163273562Smarcel url: url, 7164273562Smarcel data: data, 7165273562Smarcel success: callback, 7166273562Smarcel dataType: type 7167273562Smarcel }); 7168273562Smarcel }; 7169273562Smarcel}); 7170273562Smarcel 7171273562SmarceljQuery.extend({ 7172273562Smarcel 7173273562Smarcel getScript: function( url, callback ) { 7174273562Smarcel return jQuery.get( url, undefined, callback, "script" ); 7175273562Smarcel }, 7176273562Smarcel 7177273562Smarcel getJSON: function( url, data, callback ) { 7178273562Smarcel return jQuery.get( url, data, callback, "json" ); 7179273562Smarcel }, 7180273562Smarcel 7181273562Smarcel // Creates a full fledged settings object into target 7182273562Smarcel // with both ajaxSettings and settings fields. 7183273562Smarcel // If target is omitted, writes into ajaxSettings. 7184273562Smarcel ajaxSetup: function( target, settings ) { 7185273562Smarcel if ( settings ) { 7186273562Smarcel // Building a settings object 7187273562Smarcel ajaxExtend( target, jQuery.ajaxSettings ); 7188273562Smarcel } else { 7189273562Smarcel // Extending ajaxSettings 7190273562Smarcel settings = target; 7191273562Smarcel target = jQuery.ajaxSettings; 7192273562Smarcel } 7193273562Smarcel ajaxExtend( target, settings ); 7194273562Smarcel return target; 7195273562Smarcel }, 7196273562Smarcel 7197273562Smarcel ajaxSettings: { 7198273562Smarcel url: ajaxLocation, 7199273562Smarcel isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), 7200273562Smarcel global: true, 7201273562Smarcel type: "GET", 7202273562Smarcel contentType: "application/x-www-form-urlencoded", 7203273562Smarcel processData: true, 7204273562Smarcel async: true, 7205273562Smarcel /* 7206273562Smarcel timeout: 0, 7207273562Smarcel data: null, 7208273562Smarcel dataType: null, 7209273562Smarcel username: null, 7210273562Smarcel password: null, 7211273562Smarcel cache: null, 7212273562Smarcel traditional: false, 7213273562Smarcel headers: {}, 7214273562Smarcel */ 7215273562Smarcel 7216273562Smarcel accepts: { 7217273562Smarcel xml: "application/xml, text/xml", 7218273562Smarcel html: "text/html", 7219273562Smarcel text: "text/plain", 7220273562Smarcel json: "application/json, text/javascript", 7221273562Smarcel "*": allTypes 7222273562Smarcel }, 7223273562Smarcel 7224273562Smarcel contents: { 7225273562Smarcel xml: /xml/, 7226273562Smarcel html: /html/, 7227273562Smarcel json: /json/ 7228273562Smarcel }, 7229273562Smarcel 7230273562Smarcel responseFields: { 7231273562Smarcel xml: "responseXML", 7232273562Smarcel text: "responseText" 7233273562Smarcel }, 7234273562Smarcel 7235273562Smarcel // List of data converters 7236273562Smarcel // 1) key format is "source_type destination_type" (a single space in-between) 7237273562Smarcel // 2) the catchall symbol "*" can be used for source_type 7238273562Smarcel converters: { 7239273562Smarcel 7240273562Smarcel // Convert anything to text 7241273562Smarcel "* text": window.String, 7242273562Smarcel 7243273562Smarcel // Text to html (true = no transformation) 7244273562Smarcel "text html": true, 7245273562Smarcel 7246273562Smarcel // Evaluate text as a json expression 7247273562Smarcel "text json": jQuery.parseJSON, 7248273562Smarcel 7249273562Smarcel // Parse text as xml 7250273562Smarcel "text xml": jQuery.parseXML 7251273562Smarcel }, 7252273562Smarcel 7253273562Smarcel // For options that shouldn't be deep extended: 7254273562Smarcel // you can add your own custom options here if 7255273562Smarcel // and when you create one that shouldn't be 7256273562Smarcel // deep extended (see ajaxExtend) 7257273562Smarcel flatOptions: { 7258273562Smarcel context: true, 7259273562Smarcel url: true 7260273562Smarcel } 7261273562Smarcel }, 7262273562Smarcel 7263273562Smarcel ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), 7264273562Smarcel ajaxTransport: addToPrefiltersOrTransports( transports ), 7265273562Smarcel 7266273562Smarcel // Main method 7267273562Smarcel ajax: function( url, options ) { 7268273562Smarcel 7269273562Smarcel // If url is an object, simulate pre-1.5 signature 7270273562Smarcel if ( typeof url === "object" ) { 7271273562Smarcel options = url; 7272273562Smarcel url = undefined; 7273273562Smarcel } 7274273562Smarcel 7275273562Smarcel // Force options to be an object 7276273562Smarcel options = options || {}; 7277273562Smarcel 7278273562Smarcel var // Create the final options object 7279273562Smarcel s = jQuery.ajaxSetup( {}, options ), 7280273562Smarcel // Callbacks context 7281273562Smarcel callbackContext = s.context || s, 7282273562Smarcel // Context for global events 7283273562Smarcel // It's the callbackContext if one was provided in the options 7284273562Smarcel // and if it's a DOM node or a jQuery collection 7285273562Smarcel globalEventContext = callbackContext !== s && 7286273562Smarcel ( callbackContext.nodeType || callbackContext instanceof jQuery ) ? 7287273562Smarcel jQuery( callbackContext ) : jQuery.event, 7288273562Smarcel // Deferreds 7289273562Smarcel deferred = jQuery.Deferred(), 7290273562Smarcel completeDeferred = jQuery.Callbacks( "once memory" ), 7291273562Smarcel // Status-dependent callbacks 7292273562Smarcel statusCode = s.statusCode || {}, 7293273562Smarcel // ifModified key 7294273562Smarcel ifModifiedKey, 7295273562Smarcel // Headers (they are sent all at once) 7296273562Smarcel requestHeaders = {}, 7297273562Smarcel requestHeadersNames = {}, 7298273562Smarcel // Response headers 7299273562Smarcel responseHeadersString, 7300273562Smarcel responseHeaders, 7301273562Smarcel // transport 7302273562Smarcel transport, 7303273562Smarcel // timeout handle 7304273562Smarcel timeoutTimer, 7305273562Smarcel // Cross-domain detection vars 7306273562Smarcel parts, 7307273562Smarcel // The jqXHR state 7308273562Smarcel state = 0, 7309273562Smarcel // To know if global events are to be dispatched 7310273562Smarcel fireGlobals, 7311273562Smarcel // Loop variable 7312273562Smarcel i, 7313273562Smarcel // Fake xhr 7314273562Smarcel jqXHR = { 7315273562Smarcel 7316273562Smarcel readyState: 0, 7317273562Smarcel 7318273562Smarcel // Caches the header 7319273562Smarcel setRequestHeader: function( name, value ) { 7320273562Smarcel if ( !state ) { 7321273562Smarcel var lname = name.toLowerCase(); 7322273562Smarcel name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name; 7323273562Smarcel requestHeaders[ name ] = value; 7324273562Smarcel } 7325273562Smarcel return this; 7326273562Smarcel }, 7327273562Smarcel 7328273562Smarcel // Raw string 7329273562Smarcel getAllResponseHeaders: function() { 7330273562Smarcel return state === 2 ? responseHeadersString : null; 7331273562Smarcel }, 7332273562Smarcel 7333273562Smarcel // Builds headers hashtable if needed 7334273562Smarcel getResponseHeader: function( key ) { 7335273562Smarcel var match; 7336273562Smarcel if ( state === 2 ) { 7337273562Smarcel if ( !responseHeaders ) { 7338273562Smarcel responseHeaders = {}; 7339273562Smarcel while( ( match = rheaders.exec( responseHeadersString ) ) ) { 7340273562Smarcel responseHeaders[ match[1].toLowerCase() ] = match[ 2 ]; 7341273562Smarcel } 7342273562Smarcel } 7343273562Smarcel match = responseHeaders[ key.toLowerCase() ]; 7344273562Smarcel } 7345273562Smarcel return match === undefined ? null : match; 7346273562Smarcel }, 7347273562Smarcel 7348273562Smarcel // Overrides response content-type header 7349273562Smarcel overrideMimeType: function( type ) { 7350273562Smarcel if ( !state ) { 7351273562Smarcel s.mimeType = type; 7352273562Smarcel } 7353273562Smarcel return this; 7354273562Smarcel }, 7355273562Smarcel 7356273562Smarcel // Cancel the request 7357273562Smarcel abort: function( statusText ) { 7358273562Smarcel statusText = statusText || "abort"; 7359273562Smarcel if ( transport ) { 7360273562Smarcel transport.abort( statusText ); 7361273562Smarcel } 7362273562Smarcel done( 0, statusText ); 7363273562Smarcel return this; 7364273562Smarcel } 7365273562Smarcel }; 7366273562Smarcel 7367273562Smarcel // Callback for when everything is done 7368273562Smarcel // It is defined here because jslint complains if it is declared 7369273562Smarcel // at the end of the function (which would be more logical and readable) 7370273562Smarcel function done( status, nativeStatusText, responses, headers ) { 7371273562Smarcel 7372273562Smarcel // Called once 7373273562Smarcel if ( state === 2 ) { 7374273562Smarcel return; 7375273562Smarcel } 7376273562Smarcel 7377273562Smarcel // State is "done" now 7378273562Smarcel state = 2; 7379273562Smarcel 7380273562Smarcel // Clear timeout if it exists 7381273562Smarcel if ( timeoutTimer ) { 7382273562Smarcel clearTimeout( timeoutTimer ); 7383273562Smarcel } 7384273562Smarcel 7385273562Smarcel // Dereference transport for early garbage collection 7386273562Smarcel // (no matter how long the jqXHR object will be used) 7387273562Smarcel transport = undefined; 7388273562Smarcel 7389273562Smarcel // Cache response headers 7390273562Smarcel responseHeadersString = headers || ""; 7391273562Smarcel 7392273562Smarcel // Set readyState 7393273562Smarcel jqXHR.readyState = status > 0 ? 4 : 0; 7394273562Smarcel 7395273562Smarcel var isSuccess, 7396273562Smarcel success, 7397273562Smarcel error, 7398273562Smarcel statusText = nativeStatusText, 7399273562Smarcel response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined, 7400273562Smarcel lastModified, 7401273562Smarcel etag; 7402273562Smarcel 7403273562Smarcel // If successful, handle type chaining 7404273562Smarcel if ( status >= 200 && status < 300 || status === 304 ) { 7405273562Smarcel 7406273562Smarcel // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 7407273562Smarcel if ( s.ifModified ) { 7408273562Smarcel 7409273562Smarcel if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) { 7410273562Smarcel jQuery.lastModified[ ifModifiedKey ] = lastModified; 7411273562Smarcel } 7412273562Smarcel if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) { 7413273562Smarcel jQuery.etag[ ifModifiedKey ] = etag; 7414273562Smarcel } 7415273562Smarcel } 7416273562Smarcel 7417273562Smarcel // If not modified 7418273562Smarcel if ( status === 304 ) { 7419273562Smarcel 7420273562Smarcel statusText = "notmodified"; 7421273562Smarcel isSuccess = true; 7422273562Smarcel 7423273562Smarcel // If we have data 7424273562Smarcel } else { 7425273562Smarcel 7426273562Smarcel try { 7427273562Smarcel success = ajaxConvert( s, response ); 7428273562Smarcel statusText = "success"; 7429273562Smarcel isSuccess = true; 7430273562Smarcel } catch(e) { 7431273562Smarcel // We have a parsererror 7432273562Smarcel statusText = "parsererror"; 7433273562Smarcel error = e; 7434273562Smarcel } 7435273562Smarcel } 7436273562Smarcel } else { 7437273562Smarcel // We extract error from statusText 7438273562Smarcel // then normalize statusText and status for non-aborts 7439273562Smarcel error = statusText; 7440273562Smarcel if ( !statusText || status ) { 7441273562Smarcel statusText = "error"; 7442273562Smarcel if ( status < 0 ) { 7443273562Smarcel status = 0; 7444273562Smarcel } 7445273562Smarcel } 7446273562Smarcel } 7447273562Smarcel 7448273562Smarcel // Set data for the fake xhr object 7449273562Smarcel jqXHR.status = status; 7450273562Smarcel jqXHR.statusText = "" + ( nativeStatusText || statusText ); 7451273562Smarcel 7452273562Smarcel // Success/Error 7453273562Smarcel if ( isSuccess ) { 7454273562Smarcel deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); 7455273562Smarcel } else { 7456273562Smarcel deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); 7457273562Smarcel } 7458273562Smarcel 7459273562Smarcel // Status-dependent callbacks 7460273562Smarcel jqXHR.statusCode( statusCode ); 7461273562Smarcel statusCode = undefined; 7462273562Smarcel 7463273562Smarcel if ( fireGlobals ) { 7464273562Smarcel globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ), 7465273562Smarcel [ jqXHR, s, isSuccess ? success : error ] ); 7466273562Smarcel } 7467273562Smarcel 7468273562Smarcel // Complete 7469273562Smarcel completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); 7470273562Smarcel 7471273562Smarcel if ( fireGlobals ) { 7472273562Smarcel globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); 7473273562Smarcel // Handle the global AJAX counter 7474273562Smarcel if ( !( --jQuery.active ) ) { 7475273562Smarcel jQuery.event.trigger( "ajaxStop" ); 7476273562Smarcel } 7477273562Smarcel } 7478273562Smarcel } 7479273562Smarcel 7480273562Smarcel // Attach deferreds 7481273562Smarcel deferred.promise( jqXHR ); 7482273562Smarcel jqXHR.success = jqXHR.done; 7483273562Smarcel jqXHR.error = jqXHR.fail; 7484273562Smarcel jqXHR.complete = completeDeferred.add; 7485273562Smarcel 7486273562Smarcel // Status-dependent callbacks 7487273562Smarcel jqXHR.statusCode = function( map ) { 7488273562Smarcel if ( map ) { 7489273562Smarcel var tmp; 7490273562Smarcel if ( state < 2 ) { 7491273562Smarcel for ( tmp in map ) { 7492273562Smarcel statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ]; 7493273562Smarcel } 7494273562Smarcel } else { 7495273562Smarcel tmp = map[ jqXHR.status ]; 7496273562Smarcel jqXHR.then( tmp, tmp ); 7497273562Smarcel } 7498273562Smarcel } 7499273562Smarcel return this; 7500273562Smarcel }; 7501273562Smarcel 7502273562Smarcel // Remove hash character (#7531: and string promotion) 7503273562Smarcel // Add protocol if not provided (#5866: IE7 issue with protocol-less urls) 7504273562Smarcel // We also use the url parameter if available 7505273562Smarcel s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" ); 7506273562Smarcel 7507273562Smarcel // Extract dataTypes list 7508273562Smarcel s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax ); 7509273562Smarcel 7510273562Smarcel // Determine if a cross-domain request is in order 7511273562Smarcel if ( s.crossDomain == null ) { 7512273562Smarcel parts = rurl.exec( s.url.toLowerCase() ); 7513273562Smarcel s.crossDomain = !!( parts && 7514273562Smarcel ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] || 7515273562Smarcel ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) != 7516273562Smarcel ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) ) 7517273562Smarcel ); 7518273562Smarcel } 7519273562Smarcel 7520273562Smarcel // Convert data if not already a string 7521273562Smarcel if ( s.data && s.processData && typeof s.data !== "string" ) { 7522273562Smarcel s.data = jQuery.param( s.data, s.traditional ); 7523273562Smarcel } 7524273562Smarcel 7525273562Smarcel // Apply prefilters 7526273562Smarcel inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); 7527273562Smarcel 7528273562Smarcel // If request was aborted inside a prefiler, stop there 7529273562Smarcel if ( state === 2 ) { 7530273562Smarcel return false; 7531273562Smarcel } 7532273562Smarcel 7533273562Smarcel // We can fire global events as of now if asked to 7534273562Smarcel fireGlobals = s.global; 7535273562Smarcel 7536273562Smarcel // Uppercase the type 7537273562Smarcel s.type = s.type.toUpperCase(); 7538273562Smarcel 7539273562Smarcel // Determine if request has content 7540273562Smarcel s.hasContent = !rnoContent.test( s.type ); 7541273562Smarcel 7542273562Smarcel // Watch for a new set of requests 7543273562Smarcel if ( fireGlobals && jQuery.active++ === 0 ) { 7544273562Smarcel jQuery.event.trigger( "ajaxStart" ); 7545273562Smarcel } 7546273562Smarcel 7547273562Smarcel // More options handling for requests with no content 7548273562Smarcel if ( !s.hasContent ) { 7549273562Smarcel 7550273562Smarcel // If data is available, append data to url 7551273562Smarcel if ( s.data ) { 7552273562Smarcel s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data; 7553273562Smarcel // #9682: remove data so that it's not used in an eventual retry 7554273562Smarcel delete s.data; 7555273562Smarcel } 7556273562Smarcel 7557273562Smarcel // Get ifModifiedKey before adding the anti-cache parameter 7558273562Smarcel ifModifiedKey = s.url; 7559273562Smarcel 7560273562Smarcel // Add anti-cache in url if needed 7561273562Smarcel if ( s.cache === false ) { 7562273562Smarcel 7563273562Smarcel var ts = jQuery.now(), 7564273562Smarcel // try replacing _= if it is there 7565273562Smarcel ret = s.url.replace( rts, "$1_=" + ts ); 7566273562Smarcel 7567273562Smarcel // if nothing was replaced, add timestamp to the end 7568273562Smarcel s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" ); 7569273562Smarcel } 7570273562Smarcel } 7571273562Smarcel 7572273562Smarcel // Set the correct header, if data is being sent 7573273562Smarcel if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { 7574273562Smarcel jqXHR.setRequestHeader( "Content-Type", s.contentType ); 7575273562Smarcel } 7576273562Smarcel 7577273562Smarcel // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 7578273562Smarcel if ( s.ifModified ) { 7579273562Smarcel ifModifiedKey = ifModifiedKey || s.url; 7580273562Smarcel if ( jQuery.lastModified[ ifModifiedKey ] ) { 7581273562Smarcel jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] ); 7582273562Smarcel } 7583273562Smarcel if ( jQuery.etag[ ifModifiedKey ] ) { 7584273562Smarcel jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] ); 7585273562Smarcel } 7586273562Smarcel } 7587273562Smarcel 7588273562Smarcel // Set the Accepts header for the server, depending on the dataType 7589273562Smarcel jqXHR.setRequestHeader( 7590273562Smarcel "Accept", 7591273562Smarcel s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ? 7592273562Smarcel s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : 7593273562Smarcel s.accepts[ "*" ] 7594273562Smarcel ); 7595273562Smarcel 7596273562Smarcel // Check for headers option 7597273562Smarcel for ( i in s.headers ) { 7598273562Smarcel jqXHR.setRequestHeader( i, s.headers[ i ] ); 7599273562Smarcel } 7600273562Smarcel 7601273562Smarcel // Allow custom headers/mimetypes and early abort 7602273562Smarcel if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) { 7603273562Smarcel // Abort if not done already 7604273562Smarcel jqXHR.abort(); 7605273562Smarcel return false; 7606273562Smarcel 7607273562Smarcel } 7608273562Smarcel 7609273562Smarcel // Install callbacks on deferreds 7610273562Smarcel for ( i in { success: 1, error: 1, complete: 1 } ) { 7611273562Smarcel jqXHR[ i ]( s[ i ] ); 7612273562Smarcel } 7613273562Smarcel 7614273562Smarcel // Get transport 7615273562Smarcel transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); 7616273562Smarcel 7617273562Smarcel // If no transport, we auto-abort 7618273562Smarcel if ( !transport ) { 7619273562Smarcel done( -1, "No Transport" ); 7620273562Smarcel } else { 7621273562Smarcel jqXHR.readyState = 1; 7622273562Smarcel // Send global event 7623273562Smarcel if ( fireGlobals ) { 7624273562Smarcel globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); 7625273562Smarcel } 7626273562Smarcel // Timeout 7627273562Smarcel if ( s.async && s.timeout > 0 ) { 7628273562Smarcel timeoutTimer = setTimeout( function(){ 7629273562Smarcel jqXHR.abort( "timeout" ); 7630273562Smarcel }, s.timeout ); 7631273562Smarcel } 7632273562Smarcel 7633273562Smarcel try { 7634273562Smarcel state = 1; 7635273562Smarcel transport.send( requestHeaders, done ); 7636273562Smarcel } catch (e) { 7637273562Smarcel // Propagate exception as error if not done 7638273562Smarcel if ( state < 2 ) { 7639273562Smarcel done( -1, e ); 7640273562Smarcel // Simply rethrow otherwise 7641273562Smarcel } else { 7642273562Smarcel jQuery.error( e ); 7643273562Smarcel } 7644273562Smarcel } 7645273562Smarcel } 7646273562Smarcel 7647273562Smarcel return jqXHR; 7648273562Smarcel }, 7649273562Smarcel 7650273562Smarcel // Serialize an array of form elements or a set of 7651273562Smarcel // key/values into a query string 7652273562Smarcel param: function( a, traditional ) { 7653273562Smarcel var s = [], 7654273562Smarcel add = function( key, value ) { 7655273562Smarcel // If value is a function, invoke it and return its value 7656273562Smarcel value = jQuery.isFunction( value ) ? value() : value; 7657273562Smarcel s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); 7658273562Smarcel }; 7659273562Smarcel 7660273562Smarcel // Set traditional to true for jQuery <= 1.3.2 behavior. 7661273562Smarcel if ( traditional === undefined ) { 7662273562Smarcel traditional = jQuery.ajaxSettings.traditional; 7663273562Smarcel } 7664273562Smarcel 7665273562Smarcel // If an array was passed in, assume that it is an array of form elements. 7666273562Smarcel if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { 7667273562Smarcel // Serialize the form elements 7668273562Smarcel jQuery.each( a, function() { 7669273562Smarcel add( this.name, this.value ); 7670273562Smarcel }); 7671273562Smarcel 7672273562Smarcel } else { 7673273562Smarcel // If traditional, encode the "old" way (the way 1.3.2 or older 7674273562Smarcel // did it), otherwise encode params recursively. 7675273562Smarcel for ( var prefix in a ) { 7676273562Smarcel buildParams( prefix, a[ prefix ], traditional, add ); 7677273562Smarcel } 7678273562Smarcel } 7679273562Smarcel 7680273562Smarcel // Return the resulting serialization 7681273562Smarcel return s.join( "&" ).replace( r20, "+" ); 7682273562Smarcel } 7683273562Smarcel}); 7684273562Smarcel 7685273562Smarcelfunction buildParams( prefix, obj, traditional, add ) { 7686273562Smarcel if ( jQuery.isArray( obj ) ) { 7687273562Smarcel // Serialize array item. 7688273562Smarcel jQuery.each( obj, function( i, v ) { 7689273562Smarcel if ( traditional || rbracket.test( prefix ) ) { 7690273562Smarcel // Treat each array item as a scalar. 7691273562Smarcel add( prefix, v ); 7692273562Smarcel 7693273562Smarcel } else { 7694273562Smarcel // If array item is non-scalar (array or object), encode its 7695273562Smarcel // numeric index to resolve deserialization ambiguity issues. 7696273562Smarcel // Note that rack (as of 1.0.0) can't currently deserialize 7697273562Smarcel // nested arrays properly, and attempting to do so may cause 7698273562Smarcel // a server error. Possible fixes are to modify rack's 7699273562Smarcel // deserialization algorithm or to provide an option or flag 7700273562Smarcel // to force array serialization to be shallow. 7701273562Smarcel buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add ); 7702273562Smarcel } 7703273562Smarcel }); 7704273562Smarcel 7705273562Smarcel } else if ( !traditional && obj != null && typeof obj === "object" ) { 7706273562Smarcel // Serialize object item. 7707273562Smarcel for ( var name in obj ) { 7708273562Smarcel buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); 7709273562Smarcel } 7710273562Smarcel 7711273562Smarcel } else { 7712273562Smarcel // Serialize scalar item. 7713273562Smarcel add( prefix, obj ); 7714273562Smarcel } 7715273562Smarcel} 7716273562Smarcel 7717273562Smarcel// This is still on the jQuery object... for now 7718273562Smarcel// Want to move this to jQuery.ajax some day 7719273562SmarceljQuery.extend({ 7720273562Smarcel 7721273562Smarcel // Counter for holding the number of active queries 7722273562Smarcel active: 0, 7723273562Smarcel 7724273562Smarcel // Last-Modified header cache for next request 7725273562Smarcel lastModified: {}, 7726273562Smarcel etag: {} 7727273562Smarcel 7728273562Smarcel}); 7729273562Smarcel 7730273562Smarcel/* Handles responses to an ajax request: 7731273562Smarcel * - sets all responseXXX fields accordingly 7732273562Smarcel * - finds the right dataType (mediates between content-type and expected dataType) 7733273562Smarcel * - returns the corresponding response 7734273562Smarcel */ 7735273562Smarcelfunction ajaxHandleResponses( s, jqXHR, responses ) { 7736273562Smarcel 7737273562Smarcel var contents = s.contents, 7738273562Smarcel dataTypes = s.dataTypes, 7739273562Smarcel responseFields = s.responseFields, 7740273562Smarcel ct, 7741273562Smarcel type, 7742273562Smarcel finalDataType, 7743273562Smarcel firstDataType; 7744273562Smarcel 7745273562Smarcel // Fill responseXXX fields 7746273562Smarcel for ( type in responseFields ) { 7747273562Smarcel if ( type in responses ) { 7748273562Smarcel jqXHR[ responseFields[type] ] = responses[ type ]; 7749273562Smarcel } 7750273562Smarcel } 7751273562Smarcel 7752273562Smarcel // Remove auto dataType and get content-type in the process 7753273562Smarcel while( dataTypes[ 0 ] === "*" ) { 7754273562Smarcel dataTypes.shift(); 7755273562Smarcel if ( ct === undefined ) { 7756273562Smarcel ct = s.mimeType || jqXHR.getResponseHeader( "content-type" ); 7757273562Smarcel } 7758273562Smarcel } 7759273562Smarcel 7760273562Smarcel // Check if we're dealing with a known content-type 7761273562Smarcel if ( ct ) { 7762273562Smarcel for ( type in contents ) { 7763273562Smarcel if ( contents[ type ] && contents[ type ].test( ct ) ) { 7764273562Smarcel dataTypes.unshift( type ); 7765273562Smarcel break; 7766273562Smarcel } 7767273562Smarcel } 7768273562Smarcel } 7769273562Smarcel 7770273562Smarcel // Check to see if we have a response for the expected dataType 7771273562Smarcel if ( dataTypes[ 0 ] in responses ) { 7772273562Smarcel finalDataType = dataTypes[ 0 ]; 7773273562Smarcel } else { 7774273562Smarcel // Try convertible dataTypes 7775273562Smarcel for ( type in responses ) { 7776273562Smarcel if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) { 7777273562Smarcel finalDataType = type; 7778273562Smarcel break; 7779273562Smarcel } 7780273562Smarcel if ( !firstDataType ) { 7781273562Smarcel firstDataType = type; 7782273562Smarcel } 7783273562Smarcel } 7784273562Smarcel // Or just use first one 7785273562Smarcel finalDataType = finalDataType || firstDataType; 7786273562Smarcel } 7787273562Smarcel 7788273562Smarcel // If we found a dataType 7789273562Smarcel // We add the dataType to the list if needed 7790273562Smarcel // and return the corresponding response 7791273562Smarcel if ( finalDataType ) { 7792273562Smarcel if ( finalDataType !== dataTypes[ 0 ] ) { 7793273562Smarcel dataTypes.unshift( finalDataType ); 7794273562Smarcel } 7795273562Smarcel return responses[ finalDataType ]; 7796273562Smarcel } 7797273562Smarcel} 7798273562Smarcel 7799273562Smarcel// Chain conversions given the request and the original response 7800273562Smarcelfunction ajaxConvert( s, response ) { 7801273562Smarcel 7802273562Smarcel // Apply the dataFilter if provided 7803273562Smarcel if ( s.dataFilter ) { 7804273562Smarcel response = s.dataFilter( response, s.dataType ); 7805273562Smarcel } 7806273562Smarcel 7807273562Smarcel var dataTypes = s.dataTypes, 7808273562Smarcel converters = {}, 7809273562Smarcel i, 7810273562Smarcel key, 7811273562Smarcel length = dataTypes.length, 7812273562Smarcel tmp, 7813273562Smarcel // Current and previous dataTypes 7814273562Smarcel current = dataTypes[ 0 ], 7815273562Smarcel prev, 7816273562Smarcel // Conversion expression 7817273562Smarcel conversion, 7818273562Smarcel // Conversion function 7819273562Smarcel conv, 7820273562Smarcel // Conversion functions (transitive conversion) 7821273562Smarcel conv1, 7822273562Smarcel conv2; 7823273562Smarcel 7824273562Smarcel // For each dataType in the chain 7825273562Smarcel for ( i = 1; i < length; i++ ) { 7826273562Smarcel 7827273562Smarcel // Create converters map 7828273562Smarcel // with lowercased keys 7829273562Smarcel if ( i === 1 ) { 7830273562Smarcel for ( key in s.converters ) { 7831273562Smarcel if ( typeof key === "string" ) { 7832273562Smarcel converters[ key.toLowerCase() ] = s.converters[ key ]; 7833273562Smarcel } 7834273562Smarcel } 7835273562Smarcel } 7836273562Smarcel 7837273562Smarcel // Get the dataTypes 7838273562Smarcel prev = current; 7839273562Smarcel current = dataTypes[ i ]; 7840273562Smarcel 7841273562Smarcel // If current is auto dataType, update it to prev 7842273562Smarcel if ( current === "*" ) { 7843273562Smarcel current = prev; 7844273562Smarcel // If no auto and dataTypes are actually different 7845273562Smarcel } else if ( prev !== "*" && prev !== current ) { 7846273562Smarcel 7847273562Smarcel // Get the converter 7848273562Smarcel conversion = prev + " " + current; 7849273562Smarcel conv = converters[ conversion ] || converters[ "* " + current ]; 7850273562Smarcel 7851273562Smarcel // If there is no direct converter, search transitively 7852273562Smarcel if ( !conv ) { 7853273562Smarcel conv2 = undefined; 7854273562Smarcel for ( conv1 in converters ) { 7855273562Smarcel tmp = conv1.split( " " ); 7856273562Smarcel if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) { 7857273562Smarcel conv2 = converters[ tmp[1] + " " + current ]; 7858273562Smarcel if ( conv2 ) { 7859273562Smarcel conv1 = converters[ conv1 ]; 7860273562Smarcel if ( conv1 === true ) { 7861273562Smarcel conv = conv2; 7862273562Smarcel } else if ( conv2 === true ) { 7863273562Smarcel conv = conv1; 7864273562Smarcel } 7865273562Smarcel break; 7866273562Smarcel } 7867273562Smarcel } 7868273562Smarcel } 7869273562Smarcel } 7870273562Smarcel // If we found no converter, dispatch an error 7871273562Smarcel if ( !( conv || conv2 ) ) { 7872273562Smarcel jQuery.error( "No conversion from " + conversion.replace(" "," to ") ); 7873273562Smarcel } 7874273562Smarcel // If found converter is not an equivalence 7875273562Smarcel if ( conv !== true ) { 7876273562Smarcel // Convert with 1 or 2 converters accordingly 7877273562Smarcel response = conv ? conv( response ) : conv2( conv1(response) ); 7878273562Smarcel } 7879273562Smarcel } 7880273562Smarcel } 7881273562Smarcel return response; 7882273562Smarcel} 7883273562Smarcel 7884273562Smarcel 7885273562Smarcel 7886273562Smarcel 7887273562Smarcelvar jsc = jQuery.now(), 7888273562Smarcel jsre = /(\=)\?(&|$)|\?\?/i; 7889273562Smarcel 7890273562Smarcel// Default jsonp settings 7891273562SmarceljQuery.ajaxSetup({ 7892273562Smarcel jsonp: "callback", 7893273562Smarcel jsonpCallback: function() { 7894273562Smarcel return jQuery.expando + "_" + ( jsc++ ); 7895273562Smarcel } 7896273562Smarcel}); 7897273562Smarcel 7898273562Smarcel// Detect, normalize options and install callbacks for jsonp requests 7899273562SmarceljQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { 7900273562Smarcel 7901273562Smarcel var inspectData = s.contentType === "application/x-www-form-urlencoded" && 7902273562Smarcel ( typeof s.data === "string" ); 7903273562Smarcel 7904273562Smarcel if ( s.dataTypes[ 0 ] === "jsonp" || 7905273562Smarcel s.jsonp !== false && ( jsre.test( s.url ) || 7906273562Smarcel inspectData && jsre.test( s.data ) ) ) { 7907273562Smarcel 7908273562Smarcel var responseContainer, 7909273562Smarcel jsonpCallback = s.jsonpCallback = 7910273562Smarcel jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback, 7911273562Smarcel previous = window[ jsonpCallback ], 7912273562Smarcel url = s.url, 7913273562Smarcel data = s.data, 7914273562Smarcel replace = "$1" + jsonpCallback + "$2"; 7915273562Smarcel 7916273562Smarcel if ( s.jsonp !== false ) { 7917273562Smarcel url = url.replace( jsre, replace ); 7918273562Smarcel if ( s.url === url ) { 7919273562Smarcel if ( inspectData ) { 7920273562Smarcel data = data.replace( jsre, replace ); 7921273562Smarcel } 7922273562Smarcel if ( s.data === data ) { 7923273562Smarcel // Add callback manually 7924273562Smarcel url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback; 7925273562Smarcel } 7926273562Smarcel } 7927273562Smarcel } 7928273562Smarcel 7929273562Smarcel s.url = url; 7930273562Smarcel s.data = data; 7931273562Smarcel 7932273562Smarcel // Install callback 7933273562Smarcel window[ jsonpCallback ] = function( response ) { 7934273562Smarcel responseContainer = [ response ]; 7935273562Smarcel }; 7936273562Smarcel 7937273562Smarcel // Clean-up function 7938273562Smarcel jqXHR.always(function() { 7939273562Smarcel // Set callback back to previous value 7940273562Smarcel window[ jsonpCallback ] = previous; 7941273562Smarcel // Call if it was a function and we have a response 7942273562Smarcel if ( responseContainer && jQuery.isFunction( previous ) ) { 7943273562Smarcel window[ jsonpCallback ]( responseContainer[ 0 ] ); 7944273562Smarcel } 7945273562Smarcel }); 7946273562Smarcel 7947273562Smarcel // Use data converter to retrieve json after script execution 7948273562Smarcel s.converters["script json"] = function() { 7949273562Smarcel if ( !responseContainer ) { 7950273562Smarcel jQuery.error( jsonpCallback + " was not called" ); 7951273562Smarcel } 7952273562Smarcel return responseContainer[ 0 ]; 7953273562Smarcel }; 7954273562Smarcel 7955273562Smarcel // force json dataType 7956273562Smarcel s.dataTypes[ 0 ] = "json"; 7957273562Smarcel 7958273562Smarcel // Delegate to script 7959273562Smarcel return "script"; 7960273562Smarcel } 7961273562Smarcel}); 7962273562Smarcel 7963273562Smarcel 7964273562Smarcel 7965273562Smarcel 7966273562Smarcel// Install script dataType 7967273562SmarceljQuery.ajaxSetup({ 7968273562Smarcel accepts: { 7969273562Smarcel script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" 7970273562Smarcel }, 7971273562Smarcel contents: { 7972273562Smarcel script: /javascript|ecmascript/ 7973273562Smarcel }, 7974273562Smarcel converters: { 7975273562Smarcel "text script": function( text ) { 7976273562Smarcel jQuery.globalEval( text ); 7977273562Smarcel return text; 7978273562Smarcel } 7979273562Smarcel } 7980273562Smarcel}); 7981273562Smarcel 7982273562Smarcel// Handle cache's special case and global 7983273562SmarceljQuery.ajaxPrefilter( "script", function( s ) { 7984273562Smarcel if ( s.cache === undefined ) { 7985273562Smarcel s.cache = false; 7986273562Smarcel } 7987273562Smarcel if ( s.crossDomain ) { 7988273562Smarcel s.type = "GET"; 7989273562Smarcel s.global = false; 7990273562Smarcel } 7991273562Smarcel}); 7992273562Smarcel 7993273562Smarcel// Bind script tag hack transport 7994273562SmarceljQuery.ajaxTransport( "script", function(s) { 7995273562Smarcel 7996273562Smarcel // This transport only deals with cross domain requests 7997273562Smarcel if ( s.crossDomain ) { 7998273562Smarcel 7999273562Smarcel var script, 8000273562Smarcel head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement; 8001273562Smarcel 8002273562Smarcel return { 8003273562Smarcel 8004273562Smarcel send: function( _, callback ) { 8005273562Smarcel 8006273562Smarcel script = document.createElement( "script" ); 8007273562Smarcel 8008273562Smarcel script.async = "async"; 8009273562Smarcel 8010273562Smarcel if ( s.scriptCharset ) { 8011273562Smarcel script.charset = s.scriptCharset; 8012273562Smarcel } 8013273562Smarcel 8014273562Smarcel script.src = s.url; 8015273562Smarcel 8016273562Smarcel // Attach handlers for all browsers 8017273562Smarcel script.onload = script.onreadystatechange = function( _, isAbort ) { 8018273562Smarcel 8019273562Smarcel if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) { 8020273562Smarcel 8021273562Smarcel // Handle memory leak in IE 8022273562Smarcel script.onload = script.onreadystatechange = null; 8023273562Smarcel 8024273562Smarcel // Remove the script 8025273562Smarcel if ( head && script.parentNode ) { 8026273562Smarcel head.removeChild( script ); 8027273562Smarcel } 8028273562Smarcel 8029273562Smarcel // Dereference the script 8030273562Smarcel script = undefined; 8031273562Smarcel 8032273562Smarcel // Callback if not abort 8033273562Smarcel if ( !isAbort ) { 8034273562Smarcel callback( 200, "success" ); 8035273562Smarcel } 8036273562Smarcel } 8037273562Smarcel }; 8038273562Smarcel // Use insertBefore instead of appendChild to circumvent an IE6 bug. 8039273562Smarcel // This arises when a base node is used (#2709 and #4378). 8040273562Smarcel head.insertBefore( script, head.firstChild ); 8041273562Smarcel }, 8042273562Smarcel 8043273562Smarcel abort: function() { 8044273562Smarcel if ( script ) { 8045273562Smarcel script.onload( 0, 1 ); 8046273562Smarcel } 8047273562Smarcel } 8048273562Smarcel }; 8049273562Smarcel } 8050273562Smarcel}); 8051273562Smarcel 8052273562Smarcel 8053273562Smarcel 8054273562Smarcel 8055273562Smarcelvar // #5280: Internet Explorer will keep connections alive if we don't abort on unload 8056273562Smarcel xhrOnUnloadAbort = window.ActiveXObject ? function() { 8057273562Smarcel // Abort all pending requests 8058273562Smarcel for ( var key in xhrCallbacks ) { 8059273562Smarcel xhrCallbacks[ key ]( 0, 1 ); 8060273562Smarcel } 8061273562Smarcel } : false, 8062273562Smarcel xhrId = 0, 8063273562Smarcel xhrCallbacks; 8064273562Smarcel 8065273562Smarcel// Functions to create xhrs 8066273562Smarcelfunction createStandardXHR() { 8067273562Smarcel try { 8068273562Smarcel return new window.XMLHttpRequest(); 8069273562Smarcel } catch( e ) {} 8070273562Smarcel} 8071273562Smarcel 8072273562Smarcelfunction createActiveXHR() { 8073273562Smarcel try { 8074273562Smarcel return new window.ActiveXObject( "Microsoft.XMLHTTP" ); 8075273562Smarcel } catch( e ) {} 8076273562Smarcel} 8077273562Smarcel 8078273562Smarcel// Create the request object 8079273562Smarcel// (This is still attached to ajaxSettings for backward compatibility) 8080273562SmarceljQuery.ajaxSettings.xhr = window.ActiveXObject ? 8081273562Smarcel /* Microsoft failed to properly 8082273562Smarcel * implement the XMLHttpRequest in IE7 (can't request local files), 8083273562Smarcel * so we use the ActiveXObject when it is available 8084273562Smarcel * Additionally XMLHttpRequest can be disabled in IE7/IE8 so 8085273562Smarcel * we need a fallback. 8086273562Smarcel */ 8087273562Smarcel function() { 8088273562Smarcel return !this.isLocal && createStandardXHR() || createActiveXHR(); 8089273562Smarcel } : 8090273562Smarcel // For all other browsers, use the standard XMLHttpRequest object 8091273562Smarcel createStandardXHR; 8092273562Smarcel 8093273562Smarcel// Determine support properties 8094273562Smarcel(function( xhr ) { 8095273562Smarcel jQuery.extend( jQuery.support, { 8096273562Smarcel ajax: !!xhr, 8097273562Smarcel cors: !!xhr && ( "withCredentials" in xhr ) 8098273562Smarcel }); 8099273562Smarcel})( jQuery.ajaxSettings.xhr() ); 8100273562Smarcel 8101273562Smarcel// Create transport if the browser can provide an xhr 8102273562Smarcelif ( jQuery.support.ajax ) { 8103273562Smarcel 8104273562Smarcel jQuery.ajaxTransport(function( s ) { 8105273562Smarcel // Cross domain only allowed if supported through XMLHttpRequest 8106273562Smarcel if ( !s.crossDomain || jQuery.support.cors ) { 8107273562Smarcel 8108273562Smarcel var callback; 8109273562Smarcel 8110273562Smarcel return { 8111273562Smarcel send: function( headers, complete ) { 8112273562Smarcel 8113273562Smarcel // Get a new xhr 8114273562Smarcel var xhr = s.xhr(), 8115273562Smarcel handle, 8116273562Smarcel i; 8117273562Smarcel 8118273562Smarcel // Open the socket 8119273562Smarcel // Passing null username, generates a login popup on Opera (#2865) 8120273562Smarcel if ( s.username ) { 8121273562Smarcel xhr.open( s.type, s.url, s.async, s.username, s.password ); 8122273562Smarcel } else { 8123273562Smarcel xhr.open( s.type, s.url, s.async ); 8124273562Smarcel } 8125273562Smarcel 8126273562Smarcel // Apply custom fields if provided 8127273562Smarcel if ( s.xhrFields ) { 8128273562Smarcel for ( i in s.xhrFields ) { 8129273562Smarcel xhr[ i ] = s.xhrFields[ i ]; 8130273562Smarcel } 8131273562Smarcel } 8132273562Smarcel 8133273562Smarcel // Override mime type if needed 8134273562Smarcel if ( s.mimeType && xhr.overrideMimeType ) { 8135273562Smarcel xhr.overrideMimeType( s.mimeType ); 8136273562Smarcel } 8137273562Smarcel 8138273562Smarcel // X-Requested-With header 8139273562Smarcel // For cross-domain requests, seeing as conditions for a preflight are 8140273562Smarcel // akin to a jigsaw puzzle, we simply never set it to be sure. 8141273562Smarcel // (it can always be set on a per-request basis or even using ajaxSetup) 8142273562Smarcel // For same-domain requests, won't change header if already provided. 8143273562Smarcel if ( !s.crossDomain && !headers["X-Requested-With"] ) { 8144273562Smarcel headers[ "X-Requested-With" ] = "XMLHttpRequest"; 8145273562Smarcel } 8146273562Smarcel 8147273562Smarcel // Need an extra try/catch for cross domain requests in Firefox 3 8148273562Smarcel try { 8149273562Smarcel for ( i in headers ) { 8150273562Smarcel xhr.setRequestHeader( i, headers[ i ] ); 8151273562Smarcel } 8152273562Smarcel } catch( _ ) {} 8153273562Smarcel 8154273562Smarcel // Do send the request 8155273562Smarcel // This may raise an exception which is actually 8156273562Smarcel // handled in jQuery.ajax (so no try/catch here) 8157273562Smarcel xhr.send( ( s.hasContent && s.data ) || null ); 8158273562Smarcel 8159273562Smarcel // Listener 8160273562Smarcel callback = function( _, isAbort ) { 8161273562Smarcel 8162273562Smarcel var status, 8163273562Smarcel statusText, 8164273562Smarcel responseHeaders, 8165273562Smarcel responses, 8166273562Smarcel xml; 8167273562Smarcel 8168273562Smarcel // Firefox throws exceptions when accessing properties 8169273562Smarcel // of an xhr when a network error occured 8170273562Smarcel // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE) 8171273562Smarcel try { 8172273562Smarcel 8173273562Smarcel // Was never called and is aborted or complete 8174273562Smarcel if ( callback && ( isAbort || xhr.readyState === 4 ) ) { 8175273562Smarcel 8176273562Smarcel // Only called once 8177273562Smarcel callback = undefined; 8178273562Smarcel 8179273562Smarcel // Do not keep as active anymore 8180273562Smarcel if ( handle ) { 8181273562Smarcel xhr.onreadystatechange = jQuery.noop; 8182273562Smarcel if ( xhrOnUnloadAbort ) { 8183273562Smarcel delete xhrCallbacks[ handle ]; 8184273562Smarcel } 8185273562Smarcel } 8186273562Smarcel 8187273562Smarcel // If it's an abort 8188273562Smarcel if ( isAbort ) { 8189273562Smarcel // Abort it manually if needed 8190273562Smarcel if ( xhr.readyState !== 4 ) { 8191273562Smarcel xhr.abort(); 8192273562Smarcel } 8193273562Smarcel } else { 8194273562Smarcel status = xhr.status; 8195273562Smarcel responseHeaders = xhr.getAllResponseHeaders(); 8196273562Smarcel responses = {}; 8197273562Smarcel xml = xhr.responseXML; 8198273562Smarcel 8199273562Smarcel // Construct response list 8200273562Smarcel if ( xml && xml.documentElement /* #4958 */ ) { 8201273562Smarcel responses.xml = xml; 8202273562Smarcel } 8203273562Smarcel responses.text = xhr.responseText; 8204273562Smarcel 8205273562Smarcel // Firefox throws an exception when accessing 8206273562Smarcel // statusText for faulty cross-domain requests 8207273562Smarcel try { 8208273562Smarcel statusText = xhr.statusText; 8209273562Smarcel } catch( e ) { 8210273562Smarcel // We normalize with Webkit giving an empty statusText 8211273562Smarcel statusText = ""; 8212273562Smarcel } 8213273562Smarcel 8214273562Smarcel // Filter status for non standard behaviors 8215273562Smarcel 8216273562Smarcel // If the request is local and we have data: assume a success 8217273562Smarcel // (success with no data won't get notified, that's the best we 8218273562Smarcel // can do given current implementations) 8219273562Smarcel if ( !status && s.isLocal && !s.crossDomain ) { 8220273562Smarcel status = responses.text ? 200 : 404; 8221273562Smarcel // IE - #1450: sometimes returns 1223 when it should be 204 8222273562Smarcel } else if ( status === 1223 ) { 8223273562Smarcel status = 204; 8224273562Smarcel } 8225273562Smarcel } 8226273562Smarcel } 8227273562Smarcel } catch( firefoxAccessException ) { 8228273562Smarcel if ( !isAbort ) { 8229273562Smarcel complete( -1, firefoxAccessException ); 8230273562Smarcel } 8231273562Smarcel } 8232273562Smarcel 8233273562Smarcel // Call complete if needed 8234273562Smarcel if ( responses ) { 8235273562Smarcel complete( status, statusText, responses, responseHeaders ); 8236273562Smarcel } 8237273562Smarcel }; 8238273562Smarcel 8239273562Smarcel // if we're in sync mode or it's in cache 8240273562Smarcel // and has been retrieved directly (IE6 & IE7) 8241273562Smarcel // we need to manually fire the callback 8242273562Smarcel if ( !s.async || xhr.readyState === 4 ) { 8243273562Smarcel callback(); 8244273562Smarcel } else { 8245273562Smarcel handle = ++xhrId; 8246273562Smarcel if ( xhrOnUnloadAbort ) { 8247273562Smarcel // Create the active xhrs callbacks list if needed 8248273562Smarcel // and attach the unload handler 8249273562Smarcel if ( !xhrCallbacks ) { 8250273562Smarcel xhrCallbacks = {}; 8251273562Smarcel jQuery( window ).unload( xhrOnUnloadAbort ); 8252273562Smarcel } 8253273562Smarcel // Add to list of active xhrs callbacks 8254273562Smarcel xhrCallbacks[ handle ] = callback; 8255273562Smarcel } 8256273562Smarcel xhr.onreadystatechange = callback; 8257273562Smarcel } 8258273562Smarcel }, 8259273562Smarcel 8260273562Smarcel abort: function() { 8261273562Smarcel if ( callback ) { 8262273562Smarcel callback(0,1); 8263273562Smarcel } 8264273562Smarcel } 8265273562Smarcel }; 8266273562Smarcel } 8267273562Smarcel }); 8268273562Smarcel} 8269273562Smarcel 8270273562Smarcel 8271273562Smarcel 8272273562Smarcel 8273273562Smarcelvar elemdisplay = {}, 8274273562Smarcel iframe, iframeDoc, 8275273562Smarcel rfxtypes = /^(?:toggle|show|hide)$/, 8276273562Smarcel rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i, 8277273562Smarcel timerId, 8278273562Smarcel fxAttrs = [ 8279273562Smarcel // height animations 8280273562Smarcel [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ], 8281273562Smarcel // width animations 8282273562Smarcel [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ], 8283273562Smarcel // opacity animations 8284273562Smarcel [ "opacity" ] 8285273562Smarcel ], 8286273562Smarcel fxNow; 8287273562Smarcel 8288273562SmarceljQuery.fn.extend({ 8289273562Smarcel show: function( speed, easing, callback ) { 8290273562Smarcel var elem, display; 8291273562Smarcel 8292273562Smarcel if ( speed || speed === 0 ) { 8293273562Smarcel return this.animate( genFx("show", 3), speed, easing, callback ); 8294273562Smarcel 8295273562Smarcel } else { 8296273562Smarcel for ( var i = 0, j = this.length; i < j; i++ ) { 8297273562Smarcel elem = this[ i ]; 8298273562Smarcel 8299273562Smarcel if ( elem.style ) { 8300273562Smarcel display = elem.style.display; 8301273562Smarcel 8302273562Smarcel // Reset the inline display of this element to learn if it is 8303273562Smarcel // being hidden by cascaded rules or not 8304273562Smarcel if ( !jQuery._data(elem, "olddisplay") && display === "none" ) { 8305273562Smarcel display = elem.style.display = ""; 8306273562Smarcel } 8307273562Smarcel 8308273562Smarcel // Set elements which have been overridden with display: none 8309273562Smarcel // in a stylesheet to whatever the default browser style is 8310273562Smarcel // for such an element 8311273562Smarcel if ( display === "" && jQuery.css(elem, "display") === "none" ) { 8312273562Smarcel jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) ); 8313273562Smarcel } 8314273562Smarcel } 8315273562Smarcel } 8316273562Smarcel 8317273562Smarcel // Set the display of most of the elements in a second loop 8318273562Smarcel // to avoid the constant reflow 8319273562Smarcel for ( i = 0; i < j; i++ ) { 8320273562Smarcel elem = this[ i ]; 8321273562Smarcel 8322273562Smarcel if ( elem.style ) { 8323273562Smarcel display = elem.style.display; 8324273562Smarcel 8325273562Smarcel if ( display === "" || display === "none" ) { 8326273562Smarcel elem.style.display = jQuery._data( elem, "olddisplay" ) || ""; 8327273562Smarcel } 8328273562Smarcel } 8329273562Smarcel } 8330273562Smarcel 8331273562Smarcel return this; 8332273562Smarcel } 8333273562Smarcel }, 8334273562Smarcel 8335273562Smarcel hide: function( speed, easing, callback ) { 8336273562Smarcel if ( speed || speed === 0 ) { 8337273562Smarcel return this.animate( genFx("hide", 3), speed, easing, callback); 8338273562Smarcel 8339273562Smarcel } else { 8340273562Smarcel var elem, display, 8341273562Smarcel i = 0, 8342273562Smarcel j = this.length; 8343273562Smarcel 8344273562Smarcel for ( ; i < j; i++ ) { 8345273562Smarcel elem = this[i]; 8346273562Smarcel if ( elem.style ) { 8347273562Smarcel display = jQuery.css( elem, "display" ); 8348273562Smarcel 8349273562Smarcel if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) { 8350273562Smarcel jQuery._data( elem, "olddisplay", display ); 8351273562Smarcel } 8352273562Smarcel } 8353273562Smarcel } 8354273562Smarcel 8355273562Smarcel // Set the display of the elements in a second loop 8356273562Smarcel // to avoid the constant reflow 8357273562Smarcel for ( i = 0; i < j; i++ ) { 8358273562Smarcel if ( this[i].style ) { 8359273562Smarcel this[i].style.display = "none"; 8360273562Smarcel } 8361273562Smarcel } 8362273562Smarcel 8363273562Smarcel return this; 8364273562Smarcel } 8365273562Smarcel }, 8366273562Smarcel 8367273562Smarcel // Save the old toggle function 8368273562Smarcel _toggle: jQuery.fn.toggle, 8369273562Smarcel 8370273562Smarcel toggle: function( fn, fn2, callback ) { 8371273562Smarcel var bool = typeof fn === "boolean"; 8372273562Smarcel 8373273562Smarcel if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) { 8374273562Smarcel this._toggle.apply( this, arguments ); 8375273562Smarcel 8376273562Smarcel } else if ( fn == null || bool ) { 8377273562Smarcel this.each(function() { 8378273562Smarcel var state = bool ? fn : jQuery(this).is(":hidden"); 8379273562Smarcel jQuery(this)[ state ? "show" : "hide" ](); 8380273562Smarcel }); 8381273562Smarcel 8382273562Smarcel } else { 8383273562Smarcel this.animate(genFx("toggle", 3), fn, fn2, callback); 8384273562Smarcel } 8385273562Smarcel 8386273562Smarcel return this; 8387273562Smarcel }, 8388273562Smarcel 8389273562Smarcel fadeTo: function( speed, to, easing, callback ) { 8390273562Smarcel return this.filter(":hidden").css("opacity", 0).show().end() 8391273562Smarcel .animate({opacity: to}, speed, easing, callback); 8392273562Smarcel }, 8393273562Smarcel 8394273562Smarcel animate: function( prop, speed, easing, callback ) { 8395273562Smarcel var optall = jQuery.speed( speed, easing, callback ); 8396273562Smarcel 8397273562Smarcel if ( jQuery.isEmptyObject( prop ) ) { 8398273562Smarcel return this.each( optall.complete, [ false ] ); 8399273562Smarcel } 8400273562Smarcel 8401273562Smarcel // Do not change referenced properties as per-property easing will be lost 8402273562Smarcel prop = jQuery.extend( {}, prop ); 8403273562Smarcel 8404273562Smarcel function doAnimation() { 8405273562Smarcel // XXX 'this' does not always have a nodeName when running the 8406273562Smarcel // test suite 8407273562Smarcel 8408273562Smarcel if ( optall.queue === false ) { 8409273562Smarcel jQuery._mark( this ); 8410273562Smarcel } 8411273562Smarcel 8412273562Smarcel var opt = jQuery.extend( {}, optall ), 8413273562Smarcel isElement = this.nodeType === 1, 8414273562Smarcel hidden = isElement && jQuery(this).is(":hidden"), 8415273562Smarcel name, val, p, e, 8416273562Smarcel parts, start, end, unit, 8417273562Smarcel method; 8418273562Smarcel 8419273562Smarcel // will store per property easing and be used to determine when an animation is complete 8420273562Smarcel opt.animatedProperties = {}; 8421273562Smarcel 8422273562Smarcel for ( p in prop ) { 8423273562Smarcel 8424273562Smarcel // property name normalization 8425273562Smarcel name = jQuery.camelCase( p ); 8426273562Smarcel if ( p !== name ) { 8427273562Smarcel prop[ name ] = prop[ p ]; 8428273562Smarcel delete prop[ p ]; 8429273562Smarcel } 8430273562Smarcel 8431273562Smarcel val = prop[ name ]; 8432273562Smarcel 8433273562Smarcel // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default) 8434273562Smarcel if ( jQuery.isArray( val ) ) { 8435273562Smarcel opt.animatedProperties[ name ] = val[ 1 ]; 8436273562Smarcel val = prop[ name ] = val[ 0 ]; 8437273562Smarcel } else { 8438273562Smarcel opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing'; 8439273562Smarcel } 8440273562Smarcel 8441273562Smarcel if ( val === "hide" && hidden || val === "show" && !hidden ) { 8442273562Smarcel return opt.complete.call( this ); 8443273562Smarcel } 8444273562Smarcel 8445273562Smarcel if ( isElement && ( name === "height" || name === "width" ) ) { 8446273562Smarcel // Make sure that nothing sneaks out 8447273562Smarcel // Record all 3 overflow attributes because IE does not 8448273562Smarcel // change the overflow attribute when overflowX and 8449273562Smarcel // overflowY are set to the same value 8450273562Smarcel opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ]; 8451273562Smarcel 8452273562Smarcel // Set display property to inline-block for height/width 8453273562Smarcel // animations on inline elements that are having width/height animated 8454273562Smarcel if ( jQuery.css( this, "display" ) === "inline" && 8455273562Smarcel jQuery.css( this, "float" ) === "none" ) { 8456273562Smarcel 8457273562Smarcel // inline-level elements accept inline-block; 8458273562Smarcel // block-level elements need to be inline with layout 8459273562Smarcel if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) { 8460273562Smarcel this.style.display = "inline-block"; 8461273562Smarcel 8462273562Smarcel } else { 8463273562Smarcel this.style.zoom = 1; 8464273562Smarcel } 8465273562Smarcel } 8466273562Smarcel } 8467273562Smarcel } 8468273562Smarcel 8469273562Smarcel if ( opt.overflow != null ) { 8470273562Smarcel this.style.overflow = "hidden"; 8471273562Smarcel } 8472273562Smarcel 8473273562Smarcel for ( p in prop ) { 8474273562Smarcel e = new jQuery.fx( this, opt, p ); 8475273562Smarcel val = prop[ p ]; 8476273562Smarcel 8477273562Smarcel if ( rfxtypes.test( val ) ) { 8478273562Smarcel 8479273562Smarcel // Tracks whether to show or hide based on private 8480273562Smarcel // data attached to the element 8481273562Smarcel method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 ); 8482273562Smarcel if ( method ) { 8483273562Smarcel jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" ); 8484273562Smarcel e[ method ](); 8485273562Smarcel } else { 8486273562Smarcel e[ val ](); 8487273562Smarcel } 8488273562Smarcel 8489273562Smarcel } else { 8490273562Smarcel parts = rfxnum.exec( val ); 8491273562Smarcel start = e.cur(); 8492273562Smarcel 8493273562Smarcel if ( parts ) { 8494273562Smarcel end = parseFloat( parts[2] ); 8495273562Smarcel unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" ); 8496273562Smarcel 8497273562Smarcel // We need to compute starting value 8498273562Smarcel if ( unit !== "px" ) { 8499273562Smarcel jQuery.style( this, p, (end || 1) + unit); 8500273562Smarcel start = ( (end || 1) / e.cur() ) * start; 8501273562Smarcel jQuery.style( this, p, start + unit); 8502273562Smarcel } 8503273562Smarcel 8504273562Smarcel // If a +=/-= token was provided, we're doing a relative animation 8505273562Smarcel if ( parts[1] ) { 8506273562Smarcel end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start; 8507273562Smarcel } 8508273562Smarcel 8509273562Smarcel e.custom( start, end, unit ); 8510273562Smarcel 8511273562Smarcel } else { 8512273562Smarcel e.custom( start, val, "" ); 8513273562Smarcel } 8514273562Smarcel } 8515273562Smarcel } 8516273562Smarcel 8517273562Smarcel // For JS strict compliance 8518273562Smarcel return true; 8519273562Smarcel } 8520273562Smarcel 8521273562Smarcel return optall.queue === false ? 8522273562Smarcel this.each( doAnimation ) : 8523273562Smarcel this.queue( optall.queue, doAnimation ); 8524273562Smarcel }, 8525273562Smarcel 8526273562Smarcel stop: function( type, clearQueue, gotoEnd ) { 8527273562Smarcel if ( typeof type !== "string" ) { 8528273562Smarcel gotoEnd = clearQueue; 8529273562Smarcel clearQueue = type; 8530273562Smarcel type = undefined; 8531273562Smarcel } 8532273562Smarcel if ( clearQueue && type !== false ) { 8533273562Smarcel this.queue( type || "fx", [] ); 8534273562Smarcel } 8535273562Smarcel 8536273562Smarcel return this.each(function() { 8537273562Smarcel var i, 8538273562Smarcel hadTimers = false, 8539273562Smarcel timers = jQuery.timers, 8540273562Smarcel data = jQuery._data( this ); 8541273562Smarcel 8542273562Smarcel // clear marker counters if we know they won't be 8543273562Smarcel if ( !gotoEnd ) { 8544273562Smarcel jQuery._unmark( true, this ); 8545273562Smarcel } 8546273562Smarcel 8547273562Smarcel function stopQueue( elem, data, i ) { 8548273562Smarcel var hooks = data[ i ]; 8549273562Smarcel jQuery.removeData( elem, i, true ); 8550273562Smarcel hooks.stop( gotoEnd ); 8551273562Smarcel } 8552273562Smarcel 8553273562Smarcel if ( type == null ) { 8554273562Smarcel for ( i in data ) { 8555273562Smarcel if ( data[ i ].stop && i.indexOf(".run") === i.length - 4 ) { 8556273562Smarcel stopQueue( this, data, i ); 8557273562Smarcel } 8558273562Smarcel } 8559273562Smarcel } else if ( data[ i = type + ".run" ] && data[ i ].stop ){ 8560273562Smarcel stopQueue( this, data, i ); 8561273562Smarcel } 8562273562Smarcel 8563273562Smarcel for ( i = timers.length; i--; ) { 8564273562Smarcel if ( timers[ i ].elem === this && (type == null || timers[ i ].queue === type) ) { 8565273562Smarcel if ( gotoEnd ) { 8566273562Smarcel 8567273562Smarcel // force the next step to be the last 8568273562Smarcel timers[ i ]( true ); 8569273562Smarcel } else { 8570273562Smarcel timers[ i ].saveState(); 8571273562Smarcel } 8572273562Smarcel hadTimers = true; 8573273562Smarcel timers.splice( i, 1 ); 8574273562Smarcel } 8575273562Smarcel } 8576273562Smarcel 8577273562Smarcel // start the next in the queue if the last step wasn't forced 8578273562Smarcel // timers currently will call their complete callbacks, which will dequeue 8579273562Smarcel // but only if they were gotoEnd 8580273562Smarcel if ( !( gotoEnd && hadTimers ) ) { 8581273562Smarcel jQuery.dequeue( this, type ); 8582273562Smarcel } 8583273562Smarcel }); 8584273562Smarcel } 8585273562Smarcel 8586273562Smarcel}); 8587273562Smarcel 8588273562Smarcel// Animations created synchronously will run synchronously 8589273562Smarcelfunction createFxNow() { 8590273562Smarcel setTimeout( clearFxNow, 0 ); 8591273562Smarcel return ( fxNow = jQuery.now() ); 8592273562Smarcel} 8593273562Smarcel 8594273562Smarcelfunction clearFxNow() { 8595273562Smarcel fxNow = undefined; 8596273562Smarcel} 8597273562Smarcel 8598273562Smarcel// Generate parameters to create a standard animation 8599273562Smarcelfunction genFx( type, num ) { 8600273562Smarcel var obj = {}; 8601273562Smarcel 8602273562Smarcel jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() { 8603273562Smarcel obj[ this ] = type; 8604273562Smarcel }); 8605273562Smarcel 8606273562Smarcel return obj; 8607273562Smarcel} 8608273562Smarcel 8609273562Smarcel// Generate shortcuts for custom animations 8610273562SmarceljQuery.each({ 8611273562Smarcel slideDown: genFx( "show", 1 ), 8612273562Smarcel slideUp: genFx( "hide", 1 ), 8613273562Smarcel slideToggle: genFx( "toggle", 1 ), 8614273562Smarcel fadeIn: { opacity: "show" }, 8615273562Smarcel fadeOut: { opacity: "hide" }, 8616273562Smarcel fadeToggle: { opacity: "toggle" } 8617273562Smarcel}, function( name, props ) { 8618273562Smarcel jQuery.fn[ name ] = function( speed, easing, callback ) { 8619273562Smarcel return this.animate( props, speed, easing, callback ); 8620273562Smarcel }; 8621273562Smarcel}); 8622273562Smarcel 8623273562SmarceljQuery.extend({ 8624273562Smarcel speed: function( speed, easing, fn ) { 8625273562Smarcel var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { 8626273562Smarcel complete: fn || !fn && easing || 8627273562Smarcel jQuery.isFunction( speed ) && speed, 8628273562Smarcel duration: speed, 8629273562Smarcel easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing 8630273562Smarcel }; 8631273562Smarcel 8632273562Smarcel opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : 8633273562Smarcel opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default; 8634273562Smarcel 8635273562Smarcel // normalize opt.queue - true/undefined/null -> "fx" 8636273562Smarcel if ( opt.queue == null || opt.queue === true ) { 8637273562Smarcel opt.queue = "fx"; 8638273562Smarcel } 8639273562Smarcel 8640273562Smarcel // Queueing 8641273562Smarcel opt.old = opt.complete; 8642273562Smarcel 8643273562Smarcel opt.complete = function( noUnmark ) { 8644273562Smarcel if ( jQuery.isFunction( opt.old ) ) { 8645273562Smarcel opt.old.call( this ); 8646273562Smarcel } 8647273562Smarcel 8648273562Smarcel if ( opt.queue ) { 8649273562Smarcel jQuery.dequeue( this, opt.queue ); 8650273562Smarcel } else if ( noUnmark !== false ) { 8651273562Smarcel jQuery._unmark( this ); 8652273562Smarcel } 8653273562Smarcel }; 8654273562Smarcel 8655273562Smarcel return opt; 8656273562Smarcel }, 8657273562Smarcel 8658273562Smarcel easing: { 8659273562Smarcel linear: function( p, n, firstNum, diff ) { 8660273562Smarcel return firstNum + diff * p; 8661273562Smarcel }, 8662273562Smarcel swing: function( p, n, firstNum, diff ) { 8663273562Smarcel return ( ( -Math.cos( p*Math.PI ) / 2 ) + 0.5 ) * diff + firstNum; 8664273562Smarcel } 8665273562Smarcel }, 8666273562Smarcel 8667273562Smarcel timers: [], 8668273562Smarcel 8669273562Smarcel fx: function( elem, options, prop ) { 8670273562Smarcel this.options = options; 8671273562Smarcel this.elem = elem; 8672273562Smarcel this.prop = prop; 8673273562Smarcel 8674273562Smarcel options.orig = options.orig || {}; 8675273562Smarcel } 8676273562Smarcel 8677273562Smarcel}); 8678273562Smarcel 8679273562SmarceljQuery.fx.prototype = { 8680273562Smarcel // Simple function for setting a style value 8681273562Smarcel update: function() { 8682273562Smarcel if ( this.options.step ) { 8683273562Smarcel this.options.step.call( this.elem, this.now, this ); 8684273562Smarcel } 8685273562Smarcel 8686273562Smarcel ( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this ); 8687273562Smarcel }, 8688273562Smarcel 8689273562Smarcel // Get the current size 8690273562Smarcel cur: function() { 8691273562Smarcel if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) { 8692273562Smarcel return this.elem[ this.prop ]; 8693273562Smarcel } 8694273562Smarcel 8695273562Smarcel var parsed, 8696273562Smarcel r = jQuery.css( this.elem, this.prop ); 8697273562Smarcel // Empty strings, null, undefined and "auto" are converted to 0, 8698273562Smarcel // complex values such as "rotate(1rad)" are returned as is, 8699273562Smarcel // simple values such as "10px" are parsed to Float. 8700273562Smarcel return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed; 8701273562Smarcel }, 8702273562Smarcel 8703273562Smarcel // Start an animation from one number to another 8704273562Smarcel custom: function( from, to, unit ) { 8705273562Smarcel var self = this, 8706273562Smarcel fx = jQuery.fx; 8707273562Smarcel 8708273562Smarcel this.startTime = fxNow || createFxNow(); 8709273562Smarcel this.end = to; 8710273562Smarcel this.now = this.start = from; 8711273562Smarcel this.pos = this.state = 0; 8712273562Smarcel this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" ); 8713273562Smarcel 8714273562Smarcel function t( gotoEnd ) { 8715273562Smarcel return self.step( gotoEnd ); 8716273562Smarcel } 8717273562Smarcel 8718273562Smarcel t.queue = this.options.queue; 8719273562Smarcel t.elem = this.elem; 8720273562Smarcel t.saveState = function() { 8721273562Smarcel if ( self.options.hide && jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) { 8722273562Smarcel jQuery._data( self.elem, "fxshow" + self.prop, self.start ); 8723273562Smarcel } 8724273562Smarcel }; 8725273562Smarcel 8726273562Smarcel if ( t() && jQuery.timers.push(t) && !timerId ) { 8727273562Smarcel timerId = setInterval( fx.tick, fx.interval ); 8728273562Smarcel } 8729273562Smarcel }, 8730273562Smarcel 8731273562Smarcel // Simple 'show' function 8732273562Smarcel show: function() { 8733273562Smarcel var dataShow = jQuery._data( this.elem, "fxshow" + this.prop ); 8734273562Smarcel 8735273562Smarcel // Remember where we started, so that we can go back to it later 8736273562Smarcel this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop ); 8737273562Smarcel this.options.show = true; 8738273562Smarcel 8739273562Smarcel // Begin the animation 8740273562Smarcel // Make sure that we start at a small width/height to avoid any flash of content 8741273562Smarcel if ( dataShow !== undefined ) { 8742273562Smarcel // This show is picking up where a previous hide or show left off 8743273562Smarcel this.custom( this.cur(), dataShow ); 8744273562Smarcel } else { 8745273562Smarcel this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() ); 8746273562Smarcel } 8747273562Smarcel 8748273562Smarcel // Start by showing the element 8749273562Smarcel jQuery( this.elem ).show(); 8750273562Smarcel }, 8751273562Smarcel 8752273562Smarcel // Simple 'hide' function 8753273562Smarcel hide: function() { 8754273562Smarcel // Remember where we started, so that we can go back to it later 8755273562Smarcel this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop ); 8756273562Smarcel this.options.hide = true; 8757273562Smarcel 8758273562Smarcel // Begin the animation 8759273562Smarcel this.custom( this.cur(), 0 ); 8760273562Smarcel }, 8761273562Smarcel 8762273562Smarcel // Each step of an animation 8763273562Smarcel step: function( gotoEnd ) { 8764273562Smarcel var p, n, complete, 8765273562Smarcel t = fxNow || createFxNow(), 8766273562Smarcel done = true, 8767273562Smarcel elem = this.elem, 8768273562Smarcel options = this.options; 8769273562Smarcel 8770273562Smarcel if ( gotoEnd || t >= options.duration + this.startTime ) { 8771273562Smarcel this.now = this.end; 8772273562Smarcel this.pos = this.state = 1; 8773273562Smarcel this.update(); 8774273562Smarcel 8775273562Smarcel options.animatedProperties[ this.prop ] = true; 8776273562Smarcel 8777273562Smarcel for ( p in options.animatedProperties ) { 8778273562Smarcel if ( options.animatedProperties[ p ] !== true ) { 8779273562Smarcel done = false; 8780273562Smarcel } 8781273562Smarcel } 8782273562Smarcel 8783273562Smarcel if ( done ) { 8784273562Smarcel // Reset the overflow 8785273562Smarcel if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) { 8786273562Smarcel 8787273562Smarcel jQuery.each( [ "", "X", "Y" ], function( index, value ) { 8788273562Smarcel elem.style[ "overflow" + value ] = options.overflow[ index ]; 8789273562Smarcel }); 8790273562Smarcel } 8791273562Smarcel 8792273562Smarcel // Hide the element if the "hide" operation was done 8793273562Smarcel if ( options.hide ) { 8794273562Smarcel jQuery( elem ).hide(); 8795273562Smarcel } 8796273562Smarcel 8797273562Smarcel // Reset the properties, if the item has been hidden or shown 8798273562Smarcel if ( options.hide || options.show ) { 8799273562Smarcel for ( p in options.animatedProperties ) { 8800273562Smarcel jQuery.style( elem, p, options.orig[ p ] ); 8801273562Smarcel jQuery.removeData( elem, "fxshow" + p, true ); 8802273562Smarcel // Toggle data is no longer needed 8803273562Smarcel jQuery.removeData( elem, "toggle" + p, true ); 8804273562Smarcel } 8805273562Smarcel } 8806273562Smarcel 8807273562Smarcel // Execute the complete function 8808273562Smarcel // in the event that the complete function throws an exception 8809273562Smarcel // we must ensure it won't be called twice. #5684 8810273562Smarcel 8811273562Smarcel complete = options.complete; 8812273562Smarcel if ( complete ) { 8813273562Smarcel 8814273562Smarcel options.complete = false; 8815273562Smarcel complete.call( elem ); 8816273562Smarcel } 8817273562Smarcel } 8818273562Smarcel 8819273562Smarcel return false; 8820273562Smarcel 8821273562Smarcel } else { 8822273562Smarcel // classical easing cannot be used with an Infinity duration 8823273562Smarcel if ( options.duration == Infinity ) { 8824273562Smarcel this.now = t; 8825273562Smarcel } else { 8826273562Smarcel n = t - this.startTime; 8827273562Smarcel this.state = n / options.duration; 8828273562Smarcel 8829273562Smarcel // Perform the easing function, defaults to swing 8830273562Smarcel this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration ); 8831273562Smarcel this.now = this.start + ( (this.end - this.start) * this.pos ); 8832273562Smarcel } 8833273562Smarcel // Perform the next step of the animation 8834273562Smarcel this.update(); 8835273562Smarcel } 8836273562Smarcel 8837273562Smarcel return true; 8838273562Smarcel } 8839273562Smarcel}; 8840273562Smarcel 8841273562SmarceljQuery.extend( jQuery.fx, { 8842273562Smarcel tick: function() { 8843273562Smarcel var timer, 8844273562Smarcel timers = jQuery.timers, 8845273562Smarcel i = 0; 8846273562Smarcel 8847273562Smarcel for ( ; i < timers.length; i++ ) { 8848273562Smarcel timer = timers[ i ]; 8849273562Smarcel // Checks the timer has not already been removed 8850273562Smarcel if ( !timer() && timers[ i ] === timer ) { 8851273562Smarcel timers.splice( i--, 1 ); 8852273562Smarcel } 8853273562Smarcel } 8854273562Smarcel 8855273562Smarcel if ( !timers.length ) { 8856273562Smarcel jQuery.fx.stop(); 8857273562Smarcel } 8858273562Smarcel }, 8859273562Smarcel 8860273562Smarcel interval: 13, 8861273562Smarcel 8862273562Smarcel stop: function() { 8863273562Smarcel clearInterval( timerId ); 8864273562Smarcel timerId = null; 8865273562Smarcel }, 8866273562Smarcel 8867273562Smarcel speeds: { 8868273562Smarcel slow: 600, 8869273562Smarcel fast: 200, 8870273562Smarcel // Default speed 8871273562Smarcel _default: 400 8872273562Smarcel }, 8873273562Smarcel 8874273562Smarcel step: { 8875273562Smarcel opacity: function( fx ) { 8876273562Smarcel jQuery.style( fx.elem, "opacity", fx.now ); 8877273562Smarcel }, 8878273562Smarcel 8879273562Smarcel _default: function( fx ) { 8880273562Smarcel if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) { 8881273562Smarcel fx.elem.style[ fx.prop ] = fx.now + fx.unit; 8882273562Smarcel } else { 8883273562Smarcel fx.elem[ fx.prop ] = fx.now; 8884273562Smarcel } 8885273562Smarcel } 8886273562Smarcel } 8887273562Smarcel}); 8888273562Smarcel 8889273562Smarcel// Adds width/height step functions 8890273562Smarcel// Do not set anything below 0 8891273562SmarceljQuery.each([ "width", "height" ], function( i, prop ) { 8892273562Smarcel jQuery.fx.step[ prop ] = function( fx ) { 8893273562Smarcel jQuery.style( fx.elem, prop, Math.max(0, fx.now) ); 8894273562Smarcel }; 8895273562Smarcel}); 8896273562Smarcel 8897273562Smarcelif ( jQuery.expr && jQuery.expr.filters ) { 8898273562Smarcel jQuery.expr.filters.animated = function( elem ) { 8899273562Smarcel return jQuery.grep(jQuery.timers, function( fn ) { 8900273562Smarcel return elem === fn.elem; 8901273562Smarcel }).length; 8902273562Smarcel }; 8903273562Smarcel} 8904273562Smarcel 8905273562Smarcel// Try to restore the default display value of an element 8906273562Smarcelfunction defaultDisplay( nodeName ) { 8907273562Smarcel 8908273562Smarcel if ( !elemdisplay[ nodeName ] ) { 8909273562Smarcel 8910273562Smarcel var body = document.body, 8911273562Smarcel elem = jQuery( "<" + nodeName + ">" ).appendTo( body ), 8912273562Smarcel display = elem.css( "display" ); 8913273562Smarcel elem.remove(); 8914273562Smarcel 8915273562Smarcel // If the simple way fails, 8916273562Smarcel // get element's real default display by attaching it to a temp iframe 8917273562Smarcel if ( display === "none" || display === "" ) { 8918273562Smarcel // No iframe to use yet, so create it 8919273562Smarcel if ( !iframe ) { 8920273562Smarcel iframe = document.createElement( "iframe" ); 8921273562Smarcel iframe.frameBorder = iframe.width = iframe.height = 0; 8922273562Smarcel } 8923273562Smarcel 8924273562Smarcel body.appendChild( iframe ); 8925273562Smarcel 8926273562Smarcel // Create a cacheable copy of the iframe document on first call. 8927273562Smarcel // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML 8928273562Smarcel // document to it; WebKit & Firefox won't allow reusing the iframe document. 8929273562Smarcel if ( !iframeDoc || !iframe.createElement ) { 8930273562Smarcel iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document; 8931273562Smarcel iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" ); 8932273562Smarcel iframeDoc.close(); 8933273562Smarcel } 8934273562Smarcel 8935273562Smarcel elem = iframeDoc.createElement( nodeName ); 8936273562Smarcel 8937273562Smarcel iframeDoc.body.appendChild( elem ); 8938273562Smarcel 8939273562Smarcel display = jQuery.css( elem, "display" ); 8940273562Smarcel body.removeChild( iframe ); 8941273562Smarcel } 8942273562Smarcel 8943273562Smarcel // Store the correct default display 8944273562Smarcel elemdisplay[ nodeName ] = display; 8945273562Smarcel } 8946273562Smarcel 8947273562Smarcel return elemdisplay[ nodeName ]; 8948273562Smarcel} 8949273562Smarcel 8950273562Smarcel 8951273562Smarcel 8952273562Smarcel 8953273562Smarcelvar rtable = /^t(?:able|d|h)$/i, 8954273562Smarcel rroot = /^(?:body|html)$/i; 8955273562Smarcel 8956273562Smarcelif ( "getBoundingClientRect" in document.documentElement ) { 8957273562Smarcel jQuery.fn.offset = function( options ) { 8958273562Smarcel var elem = this[0], box; 8959273562Smarcel 8960273562Smarcel if ( options ) { 8961273562Smarcel return this.each(function( i ) { 8962273562Smarcel jQuery.offset.setOffset( this, options, i ); 8963273562Smarcel }); 8964273562Smarcel } 8965273562Smarcel 8966273562Smarcel if ( !elem || !elem.ownerDocument ) { 8967273562Smarcel return null; 8968273562Smarcel } 8969273562Smarcel 8970273562Smarcel if ( elem === elem.ownerDocument.body ) { 8971273562Smarcel return jQuery.offset.bodyOffset( elem ); 8972273562Smarcel } 8973273562Smarcel 8974273562Smarcel try { 8975273562Smarcel box = elem.getBoundingClientRect(); 8976273562Smarcel } catch(e) {} 8977273562Smarcel 8978273562Smarcel var doc = elem.ownerDocument, 8979273562Smarcel docElem = doc.documentElement; 8980273562Smarcel 8981273562Smarcel // Make sure we're not dealing with a disconnected DOM node 8982273562Smarcel if ( !box || !jQuery.contains( docElem, elem ) ) { 8983273562Smarcel return box ? { top: box.top, left: box.left } : { top: 0, left: 0 }; 8984273562Smarcel } 8985273562Smarcel 8986273562Smarcel var body = doc.body, 8987273562Smarcel win = getWindow(doc), 8988273562Smarcel clientTop = docElem.clientTop || body.clientTop || 0, 8989273562Smarcel clientLeft = docElem.clientLeft || body.clientLeft || 0, 8990273562Smarcel scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop, 8991273562Smarcel scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft, 8992273562Smarcel top = box.top + scrollTop - clientTop, 8993273562Smarcel left = box.left + scrollLeft - clientLeft; 8994273562Smarcel 8995273562Smarcel return { top: top, left: left }; 8996273562Smarcel }; 8997273562Smarcel 8998273562Smarcel} else { 8999273562Smarcel jQuery.fn.offset = function( options ) { 9000273562Smarcel var elem = this[0]; 9001273562Smarcel 9002273562Smarcel if ( options ) { 9003273562Smarcel return this.each(function( i ) { 9004273562Smarcel jQuery.offset.setOffset( this, options, i ); 9005273562Smarcel }); 9006273562Smarcel } 9007273562Smarcel 9008273562Smarcel if ( !elem || !elem.ownerDocument ) { 9009273562Smarcel return null; 9010273562Smarcel } 9011273562Smarcel 9012273562Smarcel if ( elem === elem.ownerDocument.body ) { 9013273562Smarcel return jQuery.offset.bodyOffset( elem ); 9014273562Smarcel } 9015273562Smarcel 9016273562Smarcel var computedStyle, 9017273562Smarcel offsetParent = elem.offsetParent, 9018273562Smarcel prevOffsetParent = elem, 9019273562Smarcel doc = elem.ownerDocument, 9020273562Smarcel docElem = doc.documentElement, 9021273562Smarcel body = doc.body, 9022273562Smarcel defaultView = doc.defaultView, 9023273562Smarcel prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle, 9024273562Smarcel top = elem.offsetTop, 9025273562Smarcel left = elem.offsetLeft; 9026273562Smarcel 9027273562Smarcel while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) { 9028273562Smarcel if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) { 9029273562Smarcel break; 9030273562Smarcel } 9031273562Smarcel 9032273562Smarcel computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle; 9033273562Smarcel top -= elem.scrollTop; 9034273562Smarcel left -= elem.scrollLeft; 9035273562Smarcel 9036273562Smarcel if ( elem === offsetParent ) { 9037273562Smarcel top += elem.offsetTop; 9038273562Smarcel left += elem.offsetLeft; 9039273562Smarcel 9040273562Smarcel if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) { 9041273562Smarcel top += parseFloat( computedStyle.borderTopWidth ) || 0; 9042273562Smarcel left += parseFloat( computedStyle.borderLeftWidth ) || 0; 9043273562Smarcel } 9044273562Smarcel 9045273562Smarcel prevOffsetParent = offsetParent; 9046273562Smarcel offsetParent = elem.offsetParent; 9047273562Smarcel } 9048273562Smarcel 9049273562Smarcel if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) { 9050273562Smarcel top += parseFloat( computedStyle.borderTopWidth ) || 0; 9051273562Smarcel left += parseFloat( computedStyle.borderLeftWidth ) || 0; 9052273562Smarcel } 9053273562Smarcel 9054273562Smarcel prevComputedStyle = computedStyle; 9055273562Smarcel } 9056273562Smarcel 9057273562Smarcel if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) { 9058273562Smarcel top += body.offsetTop; 9059273562Smarcel left += body.offsetLeft; 9060273562Smarcel } 9061273562Smarcel 9062273562Smarcel if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) { 9063273562Smarcel top += Math.max( docElem.scrollTop, body.scrollTop ); 9064273562Smarcel left += Math.max( docElem.scrollLeft, body.scrollLeft ); 9065273562Smarcel } 9066273562Smarcel 9067273562Smarcel return { top: top, left: left }; 9068273562Smarcel }; 9069273562Smarcel} 9070273562Smarcel 9071273562SmarceljQuery.offset = { 9072273562Smarcel 9073273562Smarcel bodyOffset: function( body ) { 9074273562Smarcel var top = body.offsetTop, 9075273562Smarcel left = body.offsetLeft; 9076273562Smarcel 9077273562Smarcel if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) { 9078273562Smarcel top += parseFloat( jQuery.css(body, "marginTop") ) || 0; 9079273562Smarcel left += parseFloat( jQuery.css(body, "marginLeft") ) || 0; 9080273562Smarcel } 9081273562Smarcel 9082273562Smarcel return { top: top, left: left }; 9083273562Smarcel }, 9084273562Smarcel 9085273562Smarcel setOffset: function( elem, options, i ) { 9086273562Smarcel var position = jQuery.css( elem, "position" ); 9087273562Smarcel 9088273562Smarcel // set position first, in-case top/left are set even on static elem 9089273562Smarcel if ( position === "static" ) { 9090273562Smarcel elem.style.position = "relative"; 9091273562Smarcel } 9092273562Smarcel 9093273562Smarcel var curElem = jQuery( elem ), 9094273562Smarcel curOffset = curElem.offset(), 9095273562Smarcel curCSSTop = jQuery.css( elem, "top" ), 9096273562Smarcel curCSSLeft = jQuery.css( elem, "left" ), 9097273562Smarcel calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1, 9098273562Smarcel props = {}, curPosition = {}, curTop, curLeft; 9099273562Smarcel 9100273562Smarcel // need to be able to calculate position if either top or left is auto and position is either absolute or fixed 9101273562Smarcel if ( calculatePosition ) { 9102273562Smarcel curPosition = curElem.position(); 9103273562Smarcel curTop = curPosition.top; 9104273562Smarcel curLeft = curPosition.left; 9105273562Smarcel } else { 9106273562Smarcel curTop = parseFloat( curCSSTop ) || 0; 9107273562Smarcel curLeft = parseFloat( curCSSLeft ) || 0; 9108273562Smarcel } 9109273562Smarcel 9110273562Smarcel if ( jQuery.isFunction( options ) ) { 9111273562Smarcel options = options.call( elem, i, curOffset ); 9112273562Smarcel } 9113273562Smarcel 9114273562Smarcel if ( options.top != null ) { 9115273562Smarcel props.top = ( options.top - curOffset.top ) + curTop; 9116273562Smarcel } 9117273562Smarcel if ( options.left != null ) { 9118273562Smarcel props.left = ( options.left - curOffset.left ) + curLeft; 9119273562Smarcel } 9120273562Smarcel 9121273562Smarcel if ( "using" in options ) { 9122273562Smarcel options.using.call( elem, props ); 9123273562Smarcel } else { 9124273562Smarcel curElem.css( props ); 9125273562Smarcel } 9126273562Smarcel } 9127273562Smarcel}; 9128273562Smarcel 9129273562Smarcel 9130273562SmarceljQuery.fn.extend({ 9131273562Smarcel 9132273562Smarcel position: function() { 9133273562Smarcel if ( !this[0] ) { 9134273562Smarcel return null; 9135273562Smarcel } 9136273562Smarcel 9137273562Smarcel var elem = this[0], 9138273562Smarcel 9139273562Smarcel // Get *real* offsetParent 9140273562Smarcel offsetParent = this.offsetParent(), 9141273562Smarcel 9142273562Smarcel // Get correct offsets 9143273562Smarcel offset = this.offset(), 9144273562Smarcel parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset(); 9145273562Smarcel 9146273562Smarcel // Subtract element margins 9147273562Smarcel // note: when an element has margin: auto the offsetLeft and marginLeft 9148273562Smarcel // are the same in Safari causing offset.left to incorrectly be 0 9149273562Smarcel offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0; 9150273562Smarcel offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0; 9151273562Smarcel 9152273562Smarcel // Add offsetParent borders 9153273562Smarcel parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0; 9154273562Smarcel parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0; 9155273562Smarcel 9156273562Smarcel // Subtract the two offsets 9157273562Smarcel return { 9158273562Smarcel top: offset.top - parentOffset.top, 9159273562Smarcel left: offset.left - parentOffset.left 9160273562Smarcel }; 9161273562Smarcel }, 9162273562Smarcel 9163273562Smarcel offsetParent: function() { 9164273562Smarcel return this.map(function() { 9165273562Smarcel var offsetParent = this.offsetParent || document.body; 9166273562Smarcel while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) { 9167273562Smarcel offsetParent = offsetParent.offsetParent; 9168273562Smarcel } 9169273562Smarcel return offsetParent; 9170273562Smarcel }); 9171273562Smarcel } 9172273562Smarcel}); 9173273562Smarcel 9174273562Smarcel 9175273562Smarcel// Create scrollLeft and scrollTop methods 9176273562SmarceljQuery.each( ["Left", "Top"], function( i, name ) { 9177273562Smarcel var method = "scroll" + name; 9178273562Smarcel 9179273562Smarcel jQuery.fn[ method ] = function( val ) { 9180273562Smarcel var elem, win; 9181273562Smarcel 9182273562Smarcel if ( val === undefined ) { 9183273562Smarcel elem = this[ 0 ]; 9184273562Smarcel 9185273562Smarcel if ( !elem ) { 9186273562Smarcel return null; 9187273562Smarcel } 9188273562Smarcel 9189273562Smarcel win = getWindow( elem ); 9190273562Smarcel 9191273562Smarcel // Return the scroll offset 9192273562Smarcel return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] : 9193273562Smarcel jQuery.support.boxModel && win.document.documentElement[ method ] || 9194273562Smarcel win.document.body[ method ] : 9195273562Smarcel elem[ method ]; 9196273562Smarcel } 9197273562Smarcel 9198273562Smarcel // Set the scroll offset 9199273562Smarcel return this.each(function() { 9200273562Smarcel win = getWindow( this ); 9201273562Smarcel 9202273562Smarcel if ( win ) { 9203273562Smarcel win.scrollTo( 9204273562Smarcel !i ? val : jQuery( win ).scrollLeft(), 9205273562Smarcel i ? val : jQuery( win ).scrollTop() 9206273562Smarcel ); 9207273562Smarcel 9208273562Smarcel } else { 9209273562Smarcel this[ method ] = val; 9210273562Smarcel } 9211273562Smarcel }); 9212273562Smarcel }; 9213273562Smarcel}); 9214273562Smarcel 9215273562Smarcelfunction getWindow( elem ) { 9216273562Smarcel return jQuery.isWindow( elem ) ? 9217273562Smarcel elem : 9218273562Smarcel elem.nodeType === 9 ? 9219273562Smarcel elem.defaultView || elem.parentWindow : 9220273562Smarcel false; 9221273562Smarcel} 9222273562Smarcel 9223273562Smarcel 9224273562Smarcel 9225273562Smarcel 9226273562Smarcel// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods 9227273562SmarceljQuery.each([ "Height", "Width" ], function( i, name ) { 9228273562Smarcel 9229273562Smarcel var type = name.toLowerCase(); 9230273562Smarcel 9231273562Smarcel // innerHeight and innerWidth 9232273562Smarcel jQuery.fn[ "inner" + name ] = function() { 9233273562Smarcel var elem = this[0]; 9234273562Smarcel return elem ? 9235273562Smarcel elem.style ? 9236273562Smarcel parseFloat( jQuery.css( elem, type, "padding" ) ) : 9237273562Smarcel this[ type ]() : 9238273562Smarcel null; 9239273562Smarcel }; 9240273562Smarcel 9241273562Smarcel // outerHeight and outerWidth 9242273562Smarcel jQuery.fn[ "outer" + name ] = function( margin ) { 9243273562Smarcel var elem = this[0]; 9244273562Smarcel return elem ? 9245273562Smarcel elem.style ? 9246273562Smarcel parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) : 9247273562Smarcel this[ type ]() : 9248273562Smarcel null; 9249273562Smarcel }; 9250273562Smarcel 9251273562Smarcel jQuery.fn[ type ] = function( size ) { 9252273562Smarcel // Get window width or height 9253273562Smarcel var elem = this[0]; 9254273562Smarcel if ( !elem ) { 9255273562Smarcel return size == null ? null : this; 9256273562Smarcel } 9257273562Smarcel 9258273562Smarcel if ( jQuery.isFunction( size ) ) { 9259273562Smarcel return this.each(function( i ) { 9260273562Smarcel var self = jQuery( this ); 9261273562Smarcel self[ type ]( size.call( this, i, self[ type ]() ) ); 9262273562Smarcel }); 9263273562Smarcel } 9264273562Smarcel 9265273562Smarcel if ( jQuery.isWindow( elem ) ) { 9266273562Smarcel // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode 9267273562Smarcel // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat 9268273562Smarcel var docElemProp = elem.document.documentElement[ "client" + name ], 9269273562Smarcel body = elem.document.body; 9270273562Smarcel return elem.document.compatMode === "CSS1Compat" && docElemProp || 9271273562Smarcel body && body[ "client" + name ] || docElemProp; 9272273562Smarcel 9273273562Smarcel // Get document width or height 9274273562Smarcel } else if ( elem.nodeType === 9 ) { 9275273562Smarcel // Either scroll[Width/Height] or offset[Width/Height], whichever is greater 9276273562Smarcel return Math.max( 9277273562Smarcel elem.documentElement["client" + name], 9278273562Smarcel elem.body["scroll" + name], elem.documentElement["scroll" + name], 9279273562Smarcel elem.body["offset" + name], elem.documentElement["offset" + name] 9280273562Smarcel ); 9281273562Smarcel 9282273562Smarcel // Get or set width or height on the element 9283273562Smarcel } else if ( size === undefined ) { 9284273562Smarcel var orig = jQuery.css( elem, type ), 9285273562Smarcel ret = parseFloat( orig ); 9286273562Smarcel 9287273562Smarcel return jQuery.isNumeric( ret ) ? ret : orig; 9288273562Smarcel 9289273562Smarcel // Set the width or height on the element (default to pixels if value is unitless) 9290273562Smarcel } else { 9291273562Smarcel return this.css( type, typeof size === "string" ? size : size + "px" ); 9292273562Smarcel } 9293273562Smarcel }; 9294273562Smarcel 9295273562Smarcel}); 9296273562Smarcel 9297273562Smarcel 9298273562Smarcel// Expose jQuery to the global object 9299273562Smarcelwindow.jQuery = window.$ = jQuery; 9300273562Smarcel})( window ); 9301