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