Subversion Repositories SmartDukaan

Rev

Details | Last modification | View Log | RSS feed

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