Project

General

Profile

1
define([
2
	"../core",
3
	"./var/nonce",
4
	"./var/rquery",
5
	"../ajax"
6
], function( jQuery, nonce, rquery ) {
7

    
8
var oldCallbacks = [],
9
	rjsonp = /(=)\?(?=&|$)|\?\?/;
10

    
11
// Default jsonp settings
12
jQuery.ajaxSetup({
13
	jsonp: "callback",
14
	jsonpCallback: function() {
15
		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
16
		this[ callback ] = true;
17
		return callback;
18
	}
19
});
20

    
21
// Detect, normalize options and install callbacks for jsonp requests
22
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
23

    
24
	var callbackName, overwritten, responseContainer,
25
		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
26
			"url" :
27
			typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
28
		);
29

    
30
	// Handle iff the expected data type is "jsonp" or we have a parameter to set
31
	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
32

    
33
		// Get callback name, remembering preexisting value associated with it
34
		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
35
			s.jsonpCallback() :
36
			s.jsonpCallback;
37

    
38
		// Insert callback into url or form data
39
		if ( jsonProp ) {
40
			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
41
		} else if ( s.jsonp !== false ) {
42
			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
43
		}
44

    
45
		// Use data converter to retrieve json after script execution
46
		s.converters["script json"] = function() {
47
			if ( !responseContainer ) {
48
				jQuery.error( callbackName + " was not called" );
49
			}
50
			return responseContainer[ 0 ];
51
		};
52

    
53
		// force json dataType
54
		s.dataTypes[ 0 ] = "json";
55

    
56
		// Install callback
57
		overwritten = window[ callbackName ];
58
		window[ callbackName ] = function() {
59
			responseContainer = arguments;
60
		};
61

    
62
		// Clean-up function (fires after converters)
63
		jqXHR.always(function() {
64
			// Restore preexisting value
65
			window[ callbackName ] = overwritten;
66

    
67
			// Save back as free
68
			if ( s[ callbackName ] ) {
69
				// make sure that re-using the options doesn't screw things around
70
				s.jsonpCallback = originalSettings.jsonpCallback;
71

    
72
				// save the callback name for future use
73
				oldCallbacks.push( callbackName );
74
			}
75

    
76
			// Call if it was a function and we have a response
77
			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
78
				overwritten( responseContainer[ 0 ] );
79
			}
80

    
81
			responseContainer = overwritten = undefined;
82
		});
83

    
84
		// Delegate to script
85
		return "script";
86
	}
87
});
88

    
89
});
(1-1/6)