/* * * * (c) 2010-2017 Christer Vasseng, Torstein Honsi * * License: www.highcharts.com/license * * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!! * * */ 'use strict'; import H from '../parts/Globals.js'; import U from '../parts/Utilities.js'; var merge = U.merge, objectEach = U.objectEach; /** * @interface Highcharts.AjaxSettingsObject */ /** * The payload to send. * * @name Highcharts.AjaxSettingsObject#data * @type {string|Highcharts.Dictionary} */ /** * The data type expected. * @name Highcharts.AjaxSettingsObject#dataType * @type {"json"|"xml"|"text"|"octet"} */ /** * Function to call on error. * @name Highcharts.AjaxSettingsObject#error * @type {Function} */ /** * The headers; keyed on header name. * @name Highcharts.AjaxSettingsObject#headers * @type {Highcharts.Dictionary} */ /** * Function to call on success. * @name Highcharts.AjaxSettingsObject#success * @type {Function} */ /** * The verb to use. * @name Highcharts.AjaxSettingsObject#type * @type {"GET"|"POST"|"UPDATE"|"DELETE"} */ /** * The URL to call. * @name Highcharts.AjaxSettingsObject#url * @type {string} */ /** * Perform an Ajax call. * * @function Highcharts.ajax * * @param {Partial} attr * The Ajax settings to use. * * @return {false|undefined} * Returns false, if error occured. */ H.ajax = function (attr) { var options = merge(true, { url: false, type: 'get', dataType: 'json', success: false, error: false, data: false, headers: {} }, attr), headers = { json: 'application/json', xml: 'application/xml', text: 'text/plain', octet: 'application/octet-stream' }, r = new XMLHttpRequest(); /** * @private * @param {XMLHttpRequest} xhr - Internal request object. * @param {string|Error} err - Occured error. * @return {void} */ function handleError(xhr, err) { if (options.error) { options.error(xhr, err); } else { // @todo Maybe emit a highcharts error event here } } if (!options.url) { return false; } r.open(options.type.toUpperCase(), options.url, true); if (!options.headers['Content-Type']) { r.setRequestHeader('Content-Type', headers[options.dataType] || headers.text); } objectEach(options.headers, function (val, key) { r.setRequestHeader(key, val); }); // @todo lacking timeout handling r.onreadystatechange = function () { var res; if (r.readyState === 4) { if (r.status === 200) { res = r.responseText; if (options.dataType === 'json') { try { res = JSON.parse(res); } catch (e) { return handleError(r, e); } } return options.success && options.success(res); } handleError(r, r.responseText); } }; try { options.data = JSON.stringify(options.data); } catch (e) { // empty } r.send(options.data || true); }; /** * Get a JSON resource over XHR, also supporting CORS without preflight. * * @function Highcharts.getJSON * @param {string} url * The URL to load. * @param {Function} success * The success callback. For error handling, use the `Highcharts.ajax` * function instead. * @return {void} */ H.getJSON = function (url, success) { H.ajax({ url: url, success: success, dataType: 'json', headers: { // Override the Content-Type to avoid preflight problems with CORS // in the Highcharts demos 'Content-Type': 'text/plain' } }); };