var updateQueryString = require("./util/update-query-string"); module.exports = function(location, options, callback) { options = options || {} var queryString var requestOptions = options.requestOptions || {} var requestMethod = (requestOptions.requestMethod || "GET").toUpperCase() var requestParams = requestOptions.requestParams || null var requestPayload = null var request = new XMLHttpRequest() var timeout = options.timeout || 0 request.onreadystatechange = function() { if (request.readyState === 4) { if (request.status === 200) { callback(request.responseText, request, location) } else { callback(null, request, location) } } } request.onerror = function(e) { console.log(e) callback(null, request, location) } request.ontimeout = function() { callback(null, request, location) } // Prepare the request payload for forms, if available if (requestParams && requestParams.length) { // Build query string queryString = (requestParams.map(function(param) {return param.name + "=" + param.value})).join("&") switch (requestMethod) { case "GET": // Reset query string to avoid an issue with repeat submissions where checkboxes that were // previously checked are incorrectly preserved location = location.split("?")[0] // Append new query string location += "?" + queryString break case "POST": // Send query string as request payload requestPayload = queryString break } } // Add a timestamp as part of the query string if cache busting is enabled if (options.cacheBust) { location = updateQueryString(location, "t", Date.now()) } request.open(requestMethod, location, true) request.timeout = timeout request.setRequestHeader("X-Requested-With", "XMLHttpRequest") request.setRequestHeader("X-PJAX", "true") // Send the proper header information for POST forms if (requestPayload && requestMethod === "POST") { request.setRequestHeader("Content-type", "application/x-www-form-urlencoded") } request.send(requestPayload) return request }