OSDN Git Service

new repo
[bytom/vapor.git] / tools / side_chain_tool / web / node_modules / jquery / src / ajax.js
1 define( [
2         "./core",
3         "./var/document",
4         "./var/isFunction",
5         "./var/rnothtmlwhite",
6         "./ajax/var/location",
7         "./ajax/var/nonce",
8         "./ajax/var/rquery",
9
10         "./core/init",
11         "./ajax/parseXML",
12         "./event/trigger",
13         "./deferred",
14         "./serialize" // jQuery.param
15 ], function( jQuery, document, isFunction, rnothtmlwhite, location, nonce, rquery ) {
16
17 "use strict";
18
19 var
20         r20 = /%20/g,
21         rhash = /#.*$/,
22         rantiCache = /([?&])_=[^&]*/,
23         rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
24
25         // #7653, #8125, #8152: local protocol detection
26         rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
27         rnoContent = /^(?:GET|HEAD)$/,
28         rprotocol = /^\/\//,
29
30         /* Prefilters
31          * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
32          * 2) These are called:
33          *    - BEFORE asking for a transport
34          *    - AFTER param serialization (s.data is a string if s.processData is true)
35          * 3) key is the dataType
36          * 4) the catchall symbol "*" can be used
37          * 5) execution will start with transport dataType and THEN continue down to "*" if needed
38          */
39         prefilters = {},
40
41         /* Transports bindings
42          * 1) key is the dataType
43          * 2) the catchall symbol "*" can be used
44          * 3) selection will start with transport dataType and THEN go to "*" if needed
45          */
46         transports = {},
47
48         // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
49         allTypes = "*/".concat( "*" ),
50
51         // Anchor tag for parsing the document origin
52         originAnchor = document.createElement( "a" );
53         originAnchor.href = location.href;
54
55 // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
56 function addToPrefiltersOrTransports( structure ) {
57
58         // dataTypeExpression is optional and defaults to "*"
59         return function( dataTypeExpression, func ) {
60
61                 if ( typeof dataTypeExpression !== "string" ) {
62                         func = dataTypeExpression;
63                         dataTypeExpression = "*";
64                 }
65
66                 var dataType,
67                         i = 0,
68                         dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
69
70                 if ( isFunction( func ) ) {
71
72                         // For each dataType in the dataTypeExpression
73                         while ( ( dataType = dataTypes[ i++ ] ) ) {
74
75                                 // Prepend if requested
76                                 if ( dataType[ 0 ] === "+" ) {
77                                         dataType = dataType.slice( 1 ) || "*";
78                                         ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
79
80                                 // Otherwise append
81                                 } else {
82                                         ( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
83                                 }
84                         }
85                 }
86         };
87 }
88
89 // Base inspection function for prefilters and transports
90 function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
91
92         var inspected = {},
93                 seekingTransport = ( structure === transports );
94
95         function inspect( dataType ) {
96                 var selected;
97                 inspected[ dataType ] = true;
98                 jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
99                         var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
100                         if ( typeof dataTypeOrTransport === "string" &&
101                                 !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
102
103                                 options.dataTypes.unshift( dataTypeOrTransport );
104                                 inspect( dataTypeOrTransport );
105                                 return false;
106                         } else if ( seekingTransport ) {
107                                 return !( selected = dataTypeOrTransport );
108                         }
109                 } );
110                 return selected;
111         }
112
113         return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
114 }
115
116 // A special extend for ajax options
117 // that takes "flat" options (not to be deep extended)
118 // Fixes #9887
119 function ajaxExtend( target, src ) {
120         var key, deep,
121                 flatOptions = jQuery.ajaxSettings.flatOptions || {};
122
123         for ( key in src ) {
124                 if ( src[ key ] !== undefined ) {
125                         ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
126                 }
127         }
128         if ( deep ) {
129                 jQuery.extend( true, target, deep );
130         }
131
132         return target;
133 }
134
135 /* Handles responses to an ajax request:
136  * - finds the right dataType (mediates between content-type and expected dataType)
137  * - returns the corresponding response
138  */
139 function ajaxHandleResponses( s, jqXHR, responses ) {
140
141         var ct, type, finalDataType, firstDataType,
142                 contents = s.contents,
143                 dataTypes = s.dataTypes;
144
145         // Remove auto dataType and get content-type in the process
146         while ( dataTypes[ 0 ] === "*" ) {
147                 dataTypes.shift();
148                 if ( ct === undefined ) {
149                         ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
150                 }
151         }
152
153         // Check if we're dealing with a known content-type
154         if ( ct ) {
155                 for ( type in contents ) {
156                         if ( contents[ type ] && contents[ type ].test( ct ) ) {
157                                 dataTypes.unshift( type );
158                                 break;
159                         }
160                 }
161         }
162
163         // Check to see if we have a response for the expected dataType
164         if ( dataTypes[ 0 ] in responses ) {
165                 finalDataType = dataTypes[ 0 ];
166         } else {
167
168                 // Try convertible dataTypes
169                 for ( type in responses ) {
170                         if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
171                                 finalDataType = type;
172                                 break;
173                         }
174                         if ( !firstDataType ) {
175                                 firstDataType = type;
176                         }
177                 }
178
179                 // Or just use first one
180                 finalDataType = finalDataType || firstDataType;
181         }
182
183         // If we found a dataType
184         // We add the dataType to the list if needed
185         // and return the corresponding response
186         if ( finalDataType ) {
187                 if ( finalDataType !== dataTypes[ 0 ] ) {
188                         dataTypes.unshift( finalDataType );
189                 }
190                 return responses[ finalDataType ];
191         }
192 }
193
194 /* Chain conversions given the request and the original response
195  * Also sets the responseXXX fields on the jqXHR instance
196  */
197 function ajaxConvert( s, response, jqXHR, isSuccess ) {
198         var conv2, current, conv, tmp, prev,
199                 converters = {},
200
201                 // Work with a copy of dataTypes in case we need to modify it for conversion
202                 dataTypes = s.dataTypes.slice();
203
204         // Create converters map with lowercased keys
205         if ( dataTypes[ 1 ] ) {
206                 for ( conv in s.converters ) {
207                         converters[ conv.toLowerCase() ] = s.converters[ conv ];
208                 }
209         }
210
211         current = dataTypes.shift();
212
213         // Convert to each sequential dataType
214         while ( current ) {
215
216                 if ( s.responseFields[ current ] ) {
217                         jqXHR[ s.responseFields[ current ] ] = response;
218                 }
219
220                 // Apply the dataFilter if provided
221                 if ( !prev && isSuccess && s.dataFilter ) {
222                         response = s.dataFilter( response, s.dataType );
223                 }
224
225                 prev = current;
226                 current = dataTypes.shift();
227
228                 if ( current ) {
229
230                         // There's only work to do if current dataType is non-auto
231                         if ( current === "*" ) {
232
233                                 current = prev;
234
235                         // Convert response if prev dataType is non-auto and differs from current
236                         } else if ( prev !== "*" && prev !== current ) {
237
238                                 // Seek a direct converter
239                                 conv = converters[ prev + " " + current ] || converters[ "* " + current ];
240
241                                 // If none found, seek a pair
242                                 if ( !conv ) {
243                                         for ( conv2 in converters ) {
244
245                                                 // If conv2 outputs current
246                                                 tmp = conv2.split( " " );
247                                                 if ( tmp[ 1 ] === current ) {
248
249                                                         // If prev can be converted to accepted input
250                                                         conv = converters[ prev + " " + tmp[ 0 ] ] ||
251                                                                 converters[ "* " + tmp[ 0 ] ];
252                                                         if ( conv ) {
253
254                                                                 // Condense equivalence converters
255                                                                 if ( conv === true ) {
256                                                                         conv = converters[ conv2 ];
257
258                                                                 // Otherwise, insert the intermediate dataType
259                                                                 } else if ( converters[ conv2 ] !== true ) {
260                                                                         current = tmp[ 0 ];
261                                                                         dataTypes.unshift( tmp[ 1 ] );
262                                                                 }
263                                                                 break;
264                                                         }
265                                                 }
266                                         }
267                                 }
268
269                                 // Apply converter (if not an equivalence)
270                                 if ( conv !== true ) {
271
272                                         // Unless errors are allowed to bubble, catch and return them
273                                         if ( conv && s.throws ) {
274                                                 response = conv( response );
275                                         } else {
276                                                 try {
277                                                         response = conv( response );
278                                                 } catch ( e ) {
279                                                         return {
280                                                                 state: "parsererror",
281                                                                 error: conv ? e : "No conversion from " + prev + " to " + current
282                                                         };
283                                                 }
284                                         }
285                                 }
286                         }
287                 }
288         }
289
290         return { state: "success", data: response };
291 }
292
293 jQuery.extend( {
294
295         // Counter for holding the number of active queries
296         active: 0,
297
298         // Last-Modified header cache for next request
299         lastModified: {},
300         etag: {},
301
302         ajaxSettings: {
303                 url: location.href,
304                 type: "GET",
305                 isLocal: rlocalProtocol.test( location.protocol ),
306                 global: true,
307                 processData: true,
308                 async: true,
309                 contentType: "application/x-www-form-urlencoded; charset=UTF-8",
310
311                 /*
312                 timeout: 0,
313                 data: null,
314                 dataType: null,
315                 username: null,
316                 password: null,
317                 cache: null,
318                 throws: false,
319                 traditional: false,
320                 headers: {},
321                 */
322
323                 accepts: {
324                         "*": allTypes,
325                         text: "text/plain",
326                         html: "text/html",
327                         xml: "application/xml, text/xml",
328                         json: "application/json, text/javascript"
329                 },
330
331                 contents: {
332                         xml: /\bxml\b/,
333                         html: /\bhtml/,
334                         json: /\bjson\b/
335                 },
336
337                 responseFields: {
338                         xml: "responseXML",
339                         text: "responseText",
340                         json: "responseJSON"
341                 },
342
343                 // Data converters
344                 // Keys separate source (or catchall "*") and destination types with a single space
345                 converters: {
346
347                         // Convert anything to text
348                         "* text": String,
349
350                         // Text to html (true = no transformation)
351                         "text html": true,
352
353                         // Evaluate text as a json expression
354                         "text json": JSON.parse,
355
356                         // Parse text as xml
357                         "text xml": jQuery.parseXML
358                 },
359
360                 // For options that shouldn't be deep extended:
361                 // you can add your own custom options here if
362                 // and when you create one that shouldn't be
363                 // deep extended (see ajaxExtend)
364                 flatOptions: {
365                         url: true,
366                         context: true
367                 }
368         },
369
370         // Creates a full fledged settings object into target
371         // with both ajaxSettings and settings fields.
372         // If target is omitted, writes into ajaxSettings.
373         ajaxSetup: function( target, settings ) {
374                 return settings ?
375
376                         // Building a settings object
377                         ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
378
379                         // Extending ajaxSettings
380                         ajaxExtend( jQuery.ajaxSettings, target );
381         },
382
383         ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
384         ajaxTransport: addToPrefiltersOrTransports( transports ),
385
386         // Main method
387         ajax: function( url, options ) {
388
389                 // If url is an object, simulate pre-1.5 signature
390                 if ( typeof url === "object" ) {
391                         options = url;
392                         url = undefined;
393                 }
394
395                 // Force options to be an object
396                 options = options || {};
397
398                 var transport,
399
400                         // URL without anti-cache param
401                         cacheURL,
402
403                         // Response headers
404                         responseHeadersString,
405                         responseHeaders,
406
407                         // timeout handle
408                         timeoutTimer,
409
410                         // Url cleanup var
411                         urlAnchor,
412
413                         // Request state (becomes false upon send and true upon completion)
414                         completed,
415
416                         // To know if global events are to be dispatched
417                         fireGlobals,
418
419                         // Loop variable
420                         i,
421
422                         // uncached part of the url
423                         uncached,
424
425                         // Create the final options object
426                         s = jQuery.ajaxSetup( {}, options ),
427
428                         // Callbacks context
429                         callbackContext = s.context || s,
430
431                         // Context for global events is callbackContext if it is a DOM node or jQuery collection
432                         globalEventContext = s.context &&
433                                 ( callbackContext.nodeType || callbackContext.jquery ) ?
434                                         jQuery( callbackContext ) :
435                                         jQuery.event,
436
437                         // Deferreds
438                         deferred = jQuery.Deferred(),
439                         completeDeferred = jQuery.Callbacks( "once memory" ),
440
441                         // Status-dependent callbacks
442                         statusCode = s.statusCode || {},
443
444                         // Headers (they are sent all at once)
445                         requestHeaders = {},
446                         requestHeadersNames = {},
447
448                         // Default abort message
449                         strAbort = "canceled",
450
451                         // Fake xhr
452                         jqXHR = {
453                                 readyState: 0,
454
455                                 // Builds headers hashtable if needed
456                                 getResponseHeader: function( key ) {
457                                         var match;
458                                         if ( completed ) {
459                                                 if ( !responseHeaders ) {
460                                                         responseHeaders = {};
461                                                         while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
462                                                                 responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
463                                                         }
464                                                 }
465                                                 match = responseHeaders[ key.toLowerCase() ];
466                                         }
467                                         return match == null ? null : match;
468                                 },
469
470                                 // Raw string
471                                 getAllResponseHeaders: function() {
472                                         return completed ? responseHeadersString : null;
473                                 },
474
475                                 // Caches the header
476                                 setRequestHeader: function( name, value ) {
477                                         if ( completed == null ) {
478                                                 name = requestHeadersNames[ name.toLowerCase() ] =
479                                                         requestHeadersNames[ name.toLowerCase() ] || name;
480                                                 requestHeaders[ name ] = value;
481                                         }
482                                         return this;
483                                 },
484
485                                 // Overrides response content-type header
486                                 overrideMimeType: function( type ) {
487                                         if ( completed == null ) {
488                                                 s.mimeType = type;
489                                         }
490                                         return this;
491                                 },
492
493                                 // Status-dependent callbacks
494                                 statusCode: function( map ) {
495                                         var code;
496                                         if ( map ) {
497                                                 if ( completed ) {
498
499                                                         // Execute the appropriate callbacks
500                                                         jqXHR.always( map[ jqXHR.status ] );
501                                                 } else {
502
503                                                         // Lazy-add the new callbacks in a way that preserves old ones
504                                                         for ( code in map ) {
505                                                                 statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
506                                                         }
507                                                 }
508                                         }
509                                         return this;
510                                 },
511
512                                 // Cancel the request
513                                 abort: function( statusText ) {
514                                         var finalText = statusText || strAbort;
515                                         if ( transport ) {
516                                                 transport.abort( finalText );
517                                         }
518                                         done( 0, finalText );
519                                         return this;
520                                 }
521                         };
522
523                 // Attach deferreds
524                 deferred.promise( jqXHR );
525
526                 // Add protocol if not provided (prefilters might expect it)
527                 // Handle falsy url in the settings object (#10093: consistency with old signature)
528                 // We also use the url parameter if available
529                 s.url = ( ( url || s.url || location.href ) + "" )
530                         .replace( rprotocol, location.protocol + "//" );
531
532                 // Alias method option to type as per ticket #12004
533                 s.type = options.method || options.type || s.method || s.type;
534
535                 // Extract dataTypes list
536                 s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
537
538                 // A cross-domain request is in order when the origin doesn't match the current origin.
539                 if ( s.crossDomain == null ) {
540                         urlAnchor = document.createElement( "a" );
541
542                         // Support: IE <=8 - 11, Edge 12 - 15
543                         // IE throws exception on accessing the href property if url is malformed,
544                         // e.g. http://example.com:80x/
545                         try {
546                                 urlAnchor.href = s.url;
547
548                                 // Support: IE <=8 - 11 only
549                                 // Anchor's host property isn't correctly set when s.url is relative
550                                 urlAnchor.href = urlAnchor.href;
551                                 s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
552                                         urlAnchor.protocol + "//" + urlAnchor.host;
553                         } catch ( e ) {
554
555                                 // If there is an error parsing the URL, assume it is crossDomain,
556                                 // it can be rejected by the transport if it is invalid
557                                 s.crossDomain = true;
558                         }
559                 }
560
561                 // Convert data if not already a string
562                 if ( s.data && s.processData && typeof s.data !== "string" ) {
563                         s.data = jQuery.param( s.data, s.traditional );
564                 }
565
566                 // Apply prefilters
567                 inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
568
569                 // If request was aborted inside a prefilter, stop there
570                 if ( completed ) {
571                         return jqXHR;
572                 }
573
574                 // We can fire global events as of now if asked to
575                 // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
576                 fireGlobals = jQuery.event && s.global;
577
578                 // Watch for a new set of requests
579                 if ( fireGlobals && jQuery.active++ === 0 ) {
580                         jQuery.event.trigger( "ajaxStart" );
581                 }
582
583                 // Uppercase the type
584                 s.type = s.type.toUpperCase();
585
586                 // Determine if request has content
587                 s.hasContent = !rnoContent.test( s.type );
588
589                 // Save the URL in case we're toying with the If-Modified-Since
590                 // and/or If-None-Match header later on
591                 // Remove hash to simplify url manipulation
592                 cacheURL = s.url.replace( rhash, "" );
593
594                 // More options handling for requests with no content
595                 if ( !s.hasContent ) {
596
597                         // Remember the hash so we can put it back
598                         uncached = s.url.slice( cacheURL.length );
599
600                         // If data is available and should be processed, append data to url
601                         if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
602                                 cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
603
604                                 // #9682: remove data so that it's not used in an eventual retry
605                                 delete s.data;
606                         }
607
608                         // Add or update anti-cache param if needed
609                         if ( s.cache === false ) {
610                                 cacheURL = cacheURL.replace( rantiCache, "$1" );
611                                 uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
612                         }
613
614                         // Put hash and anti-cache on the URL that will be requested (gh-1732)
615                         s.url = cacheURL + uncached;
616
617                 // Change '%20' to '+' if this is encoded form body content (gh-2658)
618                 } else if ( s.data && s.processData &&
619                         ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
620                         s.data = s.data.replace( r20, "+" );
621                 }
622
623                 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
624                 if ( s.ifModified ) {
625                         if ( jQuery.lastModified[ cacheURL ] ) {
626                                 jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
627                         }
628                         if ( jQuery.etag[ cacheURL ] ) {
629                                 jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
630                         }
631                 }
632
633                 // Set the correct header, if data is being sent
634                 if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
635                         jqXHR.setRequestHeader( "Content-Type", s.contentType );
636                 }
637
638                 // Set the Accepts header for the server, depending on the dataType
639                 jqXHR.setRequestHeader(
640                         "Accept",
641                         s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
642                                 s.accepts[ s.dataTypes[ 0 ] ] +
643                                         ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
644                                 s.accepts[ "*" ]
645                 );
646
647                 // Check for headers option
648                 for ( i in s.headers ) {
649                         jqXHR.setRequestHeader( i, s.headers[ i ] );
650                 }
651
652                 // Allow custom headers/mimetypes and early abort
653                 if ( s.beforeSend &&
654                         ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
655
656                         // Abort if not done already and return
657                         return jqXHR.abort();
658                 }
659
660                 // Aborting is no longer a cancellation
661                 strAbort = "abort";
662
663                 // Install callbacks on deferreds
664                 completeDeferred.add( s.complete );
665                 jqXHR.done( s.success );
666                 jqXHR.fail( s.error );
667
668                 // Get transport
669                 transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
670
671                 // If no transport, we auto-abort
672                 if ( !transport ) {
673                         done( -1, "No Transport" );
674                 } else {
675                         jqXHR.readyState = 1;
676
677                         // Send global event
678                         if ( fireGlobals ) {
679                                 globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
680                         }
681
682                         // If request was aborted inside ajaxSend, stop there
683                         if ( completed ) {
684                                 return jqXHR;
685                         }
686
687                         // Timeout
688                         if ( s.async && s.timeout > 0 ) {
689                                 timeoutTimer = window.setTimeout( function() {
690                                         jqXHR.abort( "timeout" );
691                                 }, s.timeout );
692                         }
693
694                         try {
695                                 completed = false;
696                                 transport.send( requestHeaders, done );
697                         } catch ( e ) {
698
699                                 // Rethrow post-completion exceptions
700                                 if ( completed ) {
701                                         throw e;
702                                 }
703
704                                 // Propagate others as results
705                                 done( -1, e );
706                         }
707                 }
708
709                 // Callback for when everything is done
710                 function done( status, nativeStatusText, responses, headers ) {
711                         var isSuccess, success, error, response, modified,
712                                 statusText = nativeStatusText;
713
714                         // Ignore repeat invocations
715                         if ( completed ) {
716                                 return;
717                         }
718
719                         completed = true;
720
721                         // Clear timeout if it exists
722                         if ( timeoutTimer ) {
723                                 window.clearTimeout( timeoutTimer );
724                         }
725
726                         // Dereference transport for early garbage collection
727                         // (no matter how long the jqXHR object will be used)
728                         transport = undefined;
729
730                         // Cache response headers
731                         responseHeadersString = headers || "";
732
733                         // Set readyState
734                         jqXHR.readyState = status > 0 ? 4 : 0;
735
736                         // Determine if successful
737                         isSuccess = status >= 200 && status < 300 || status === 304;
738
739                         // Get response data
740                         if ( responses ) {
741                                 response = ajaxHandleResponses( s, jqXHR, responses );
742                         }
743
744                         // Convert no matter what (that way responseXXX fields are always set)
745                         response = ajaxConvert( s, response, jqXHR, isSuccess );
746
747                         // If successful, handle type chaining
748                         if ( isSuccess ) {
749
750                                 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
751                                 if ( s.ifModified ) {
752                                         modified = jqXHR.getResponseHeader( "Last-Modified" );
753                                         if ( modified ) {
754                                                 jQuery.lastModified[ cacheURL ] = modified;
755                                         }
756                                         modified = jqXHR.getResponseHeader( "etag" );
757                                         if ( modified ) {
758                                                 jQuery.etag[ cacheURL ] = modified;
759                                         }
760                                 }
761
762                                 // if no content
763                                 if ( status === 204 || s.type === "HEAD" ) {
764                                         statusText = "nocontent";
765
766                                 // if not modified
767                                 } else if ( status === 304 ) {
768                                         statusText = "notmodified";
769
770                                 // If we have data, let's convert it
771                                 } else {
772                                         statusText = response.state;
773                                         success = response.data;
774                                         error = response.error;
775                                         isSuccess = !error;
776                                 }
777                         } else {
778
779                                 // Extract error from statusText and normalize for non-aborts
780                                 error = statusText;
781                                 if ( status || !statusText ) {
782                                         statusText = "error";
783                                         if ( status < 0 ) {
784                                                 status = 0;
785                                         }
786                                 }
787                         }
788
789                         // Set data for the fake xhr object
790                         jqXHR.status = status;
791                         jqXHR.statusText = ( nativeStatusText || statusText ) + "";
792
793                         // Success/Error
794                         if ( isSuccess ) {
795                                 deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
796                         } else {
797                                 deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
798                         }
799
800                         // Status-dependent callbacks
801                         jqXHR.statusCode( statusCode );
802                         statusCode = undefined;
803
804                         if ( fireGlobals ) {
805                                 globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
806                                         [ jqXHR, s, isSuccess ? success : error ] );
807                         }
808
809                         // Complete
810                         completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
811
812                         if ( fireGlobals ) {
813                                 globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
814
815                                 // Handle the global AJAX counter
816                                 if ( !( --jQuery.active ) ) {
817                                         jQuery.event.trigger( "ajaxStop" );
818                                 }
819                         }
820                 }
821
822                 return jqXHR;
823         },
824
825         getJSON: function( url, data, callback ) {
826                 return jQuery.get( url, data, callback, "json" );
827         },
828
829         getScript: function( url, callback ) {
830                 return jQuery.get( url, undefined, callback, "script" );
831         }
832 } );
833
834 jQuery.each( [ "get", "post" ], function( i, method ) {
835         jQuery[ method ] = function( url, data, callback, type ) {
836
837                 // Shift arguments if data argument was omitted
838                 if ( isFunction( data ) ) {
839                         type = type || callback;
840                         callback = data;
841                         data = undefined;
842                 }
843
844                 // The url can be an options object (which then must have .url)
845                 return jQuery.ajax( jQuery.extend( {
846                         url: url,
847                         type: method,
848                         dataType: type,
849                         data: data,
850                         success: callback
851                 }, jQuery.isPlainObject( url ) && url ) );
852         };
853 } );
854
855 return jQuery;
856 } );