docs: function done( status, nativeStatusText, responses, headers ) {
  				var isSuccess, success, error, response, modified,
  					statusText = nativeStatusText;
  	
  				// Called once
  				if ( state === 2 ) {
  					return;
  				}
  	
  				// State is "done" now
  				state = 2;
  	
  				// Clear timeout if it exists
  				if ( timeoutTimer ) {
  					window.clearTimeout( timeoutTimer );
  				}
  	
  				// Dereference transport for early garbage collection
  				// (no matter how long the jqXHR object will be used)
  				transport = undefined;
  	
  				// Cache response headers
  				responseHeadersString = headers || "";
  	
  				// Set readyState
  				jqXHR.readyState = status > 0 ? 4 : 0;
  	
  				// Determine if successful
  				isSuccess = status >= 200 && status < 300 || status === 304;
  	
  				// Get response data
  				if ( responses ) {
  					response = ajaxHandleResponses( s, jqXHR, responses );
  				}
  	
  				// Convert no matter what (that way responseXXX fields are always set)
  				response = ajaxConvert( s, response, jqXHR, isSuccess );
  	
  				// If successful, handle type chaining
  				if ( isSuccess ) {
  	
  					// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
  					if ( s.ifModified ) {
  						modified = jqXHR.getResponseHeader( "Last-Modified" );
  						if ( modified ) {
  							jQuery.lastModified[ cacheURL ] = modified;
  						}
  						modified = jqXHR.getResponseHeader( "etag" );
  						if ( modified ) {
  							jQuery.etag[ cacheURL ] = modified;
  						}
  					}
  	
  					// if no content
  					if ( status === 204 || s.type === "HEAD" ) {
  						statusText = "nocontent";
  	
  					// if not modified
  					} else if ( status === 304 ) {
  						statusText = "notmodified";
  	
  					// If we have data, let's convert it
  					} else {
  						statusText = response.state;
  						success = response.data;
  						error = response.error;
  						isSuccess = !error;
  					}
  				} else {
  	
  					// Extract error from statusText and normalize for non-aborts
  					error = statusText;
  					if ( status || !statusText ) {
  						statusText = "error";
  						if ( status < 0 ) {
  							status = 0;
  						}
  					}
  				}
  	
  				// Set data for the fake xhr object
  				jqXHR.status = status;
  				jqXHR.statusText = ( nativeStatusText || statusText ) + "";
  	
  				// Success/Error
  				if ( isSuccess ) {
  					deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
  				} else {
  					deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
  				}
  	
  				// Status-dependent callbacks
  				jqXHR.statusCode( statusCode );
  				statusCode = undefined;
  	
  				if ( fireGlobals ) {
  					globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
  						[ jqXHR, s, isSuccess ? success : error ] );
  				}
  	
  				// Complete
  				completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
  	
  				if ( fireGlobals ) {
  					globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
  	
  					// Handle the global AJAX counter
  					if ( !( --jQuery.active ) ) {
  						jQuery.event.trigger( "ajaxStop" );
  					}
  				}
  			}