+(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);