(function( jQuery ) {

// Install text to script executor
jQuery.extend( true, jQuery.ajaxSettings , {

	accepts: {
		script: "text/javascript, application/javascript"
	},
	
	autoDataType: {
		script: /javascript/
	},
		
	dataConverters: {
		"text => script": jQuery.globalEval
	}
} );

// Bind script tag hack transport
jQuery.xhr.bindTransport("script", function(s) {
	
	// Handle cache special case
	if ( s.cache === undefined ) {
		s.cache = false;
	}
	
	// This transport only deals with cross domain get requests
	if ( s.crossDomain && s.async && ( s.type === "GET" || ! s.data ) ) {
		
		s.global = false;
		
		var script,
			head = document.getElementsByTagName("head")[0] || document.documentElement;
		
		return {
			
			send: function(_, callback) {

				script = document.createElement("script");

				script.async = "async";

				if ( s.scriptCharset ) {
					script.charset = s.scriptCharset;
				}
				
				script.src = s.url;
				
				// Attach handlers for all browsers
				script.onload = script.onreadystatechange = function(statusText) {
					
					if ( (!script.readyState ||
							script.readyState === "loaded" || script.readyState === "complete") ) {
								
						// Handle memory leak in IE
						script.onload = script.onreadystatechange = null;
						
						// Remove the script
						if ( head && script.parentNode ) {
							head.removeChild( script );
						}
						
						script = undefined;
						
						// Callback & dereference
						callback(statusText ? 0 : 200, statusText || "success");
					}
				};
				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
				// This arises when a base node is used (#2709 and #4378).
				head.insertBefore( script, head.firstChild );
			},
			
			abort: function(statusText) {
				if ( script ) {
					script.onload(statusText);
				}
			}
		};
	}
});

})(jQuery);