define(['../core', '../ajax'], function(jQuery) {
  // Install script dataType
  jQuery.ajaxSetup({
    accepts: {
      script:
        'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript',
    },
    contents: {
      script: /(?:java|ecma)script/,
    },
    converters: {
      'text script': function(text) {
        jQuery.globalEval(text);
        return text;
      },
    },
  });

  // Handle cache's special case and crossDomain
  jQuery.ajaxPrefilter('script', function(s) {
    if (s.cache === undefined) {
      s.cache = false;
    }
    if (s.crossDomain) {
      s.type = 'GET';
    }
  });

  // Bind script tag hack transport
  jQuery.ajaxTransport('script', function(s) {
    // This transport only deals with cross domain requests
    if (s.crossDomain) {
      var script, callback;
      return {
        send: function(_, complete) {
          script = jQuery('<script>')
            .prop({
              async: true,
              charset: s.scriptCharset,
              src: s.url,
            })
            .on(
              'load error',
              (callback = function(evt) {
                script.remove();
                callback = null;
                if (evt) {
                  complete(evt.type === 'error' ? 404 : 200, evt.type);
                }
              })
            );
          document.head.appendChild(script[0]);
        },
        abort: function() {
          if (callback) {
            callback();
          }
        },
      };
    }
  });
});
