2018-03-02 20:25:08 +00:00
|
|
|
var updateQueryString = require("./util/update-query-string");
|
|
|
|
|
|
2017-09-18 14:13:39 +02:00
|
|
|
module.exports = function(location, options, callback) {
|
2019-02-13 22:26:57 -05:00
|
|
|
options = options || {};
|
|
|
|
|
var queryString;
|
|
|
|
|
var requestOptions = options.requestOptions || {};
|
|
|
|
|
var requestMethod = (requestOptions.requestMethod || "GET").toUpperCase();
|
|
|
|
|
var requestParams = requestOptions.requestParams || null;
|
2018-04-29 15:05:22 -04:00
|
|
|
var formData = requestOptions.formData || null;
|
2019-02-13 22:26:57 -05:00
|
|
|
var requestPayload = null;
|
|
|
|
|
var request = new XMLHttpRequest();
|
|
|
|
|
var timeout = options.timeout || 0;
|
2014-05-04 08:45:22 +02:00
|
|
|
|
|
|
|
|
request.onreadystatechange = function() {
|
|
|
|
|
if (request.readyState === 4) {
|
|
|
|
|
if (request.status === 200) {
|
2019-02-13 22:26:57 -05:00
|
|
|
callback(request.responseText, request, location, options);
|
|
|
|
|
} else if (request.status !== 0) {
|
|
|
|
|
callback(null, request, location, options);
|
2014-05-04 08:45:22 +02:00
|
|
|
}
|
|
|
|
|
}
|
2019-02-13 22:26:57 -05:00
|
|
|
};
|
2014-05-04 08:45:22 +02:00
|
|
|
|
2018-01-10 15:45:55 -05:00
|
|
|
request.onerror = function(e) {
|
2019-02-13 22:26:57 -05:00
|
|
|
console.log(e);
|
|
|
|
|
callback(null, request, location, options);
|
|
|
|
|
};
|
2018-01-10 15:45:55 -05:00
|
|
|
|
2018-01-07 23:56:11 -05:00
|
|
|
request.ontimeout = function() {
|
2019-02-13 22:26:57 -05:00
|
|
|
callback(null, request, location, options);
|
|
|
|
|
};
|
2018-01-07 23:56:11 -05:00
|
|
|
|
2018-03-02 20:25:08 +00:00
|
|
|
// Prepare the request payload for forms, if available
|
|
|
|
|
if (requestParams && requestParams.length) {
|
|
|
|
|
// Build query string
|
2019-02-13 22:26:57 -05:00
|
|
|
queryString = requestParams
|
|
|
|
|
.map(function(param) {
|
|
|
|
|
return param.name + "=" + param.value;
|
|
|
|
|
})
|
|
|
|
|
.join("&");
|
2018-03-02 20:25:08 +00:00
|
|
|
|
|
|
|
|
switch (requestMethod) {
|
|
|
|
|
case "GET":
|
|
|
|
|
// Reset query string to avoid an issue with repeat submissions where checkboxes that were
|
|
|
|
|
// previously checked are incorrectly preserved
|
2019-02-13 22:26:57 -05:00
|
|
|
location = location.split("?")[0];
|
2018-03-02 20:25:08 +00:00
|
|
|
|
|
|
|
|
// Append new query string
|
2019-02-13 22:26:57 -05:00
|
|
|
location += "?" + queryString;
|
|
|
|
|
break;
|
2018-03-02 20:25:08 +00:00
|
|
|
|
|
|
|
|
case "POST":
|
|
|
|
|
// Send query string as request payload
|
2019-02-13 22:26:57 -05:00
|
|
|
requestPayload = queryString;
|
|
|
|
|
break;
|
2018-03-02 20:25:08 +00:00
|
|
|
}
|
2019-02-13 22:26:57 -05:00
|
|
|
} else if (formData) {
|
|
|
|
|
requestPayload = formData;
|
2018-04-29 15:05:22 -04:00
|
|
|
}
|
2018-03-02 20:25:08 +00:00
|
|
|
|
2016-06-27 21:46:14 -07:00
|
|
|
// Add a timestamp as part of the query string if cache busting is enabled
|
2018-03-06 10:06:38 +00:00
|
|
|
if (options.cacheBust) {
|
2019-02-13 22:26:57 -05:00
|
|
|
location = updateQueryString(location, "t", Date.now());
|
2016-06-27 21:46:14 -07:00
|
|
|
}
|
|
|
|
|
|
2019-02-13 22:26:57 -05:00
|
|
|
request.open(requestMethod, location, true);
|
|
|
|
|
request.timeout = timeout;
|
|
|
|
|
request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
|
|
|
|
|
request.setRequestHeader("X-PJAX", "true");
|
|
|
|
|
request.setRequestHeader(
|
|
|
|
|
"X-PJAX-Selectors",
|
|
|
|
|
JSON.stringify(options.selectors)
|
|
|
|
|
);
|
2017-09-18 14:13:39 +02:00
|
|
|
|
2018-03-02 20:25:08 +00:00
|
|
|
// Send the proper header information for POST forms
|
2018-08-15 15:07:04 -04:00
|
|
|
if (requestPayload && requestMethod === "POST" && !formData) {
|
2019-02-13 22:26:57 -05:00
|
|
|
request.setRequestHeader(
|
|
|
|
|
"Content-Type",
|
|
|
|
|
"application/x-www-form-urlencoded"
|
|
|
|
|
);
|
2017-09-18 14:13:39 +02:00
|
|
|
}
|
|
|
|
|
|
2019-02-13 22:26:57 -05:00
|
|
|
request.send(requestPayload);
|
2017-09-18 14:13:39 +02:00
|
|
|
|
2019-02-13 22:26:57 -05:00
|
|
|
return request;
|
|
|
|
|
};
|