function prepareGraphJson(json) { var callableParams = ['xTickFormatter', 'xTooltipFormatter', 'xRangeFormatter', 'yTickFormatter', 'yTooltipFormatter', 'x_on_zoom', 'sideLegend']; callableParams.forEach(function (k) { if (typeof json[k] === 'string') { json[k] = eval('(' + json[k] + ')'); } }); var customFormatters; if (customFormatters = json.yCustomTooltipFormatters) { for (var k in customFormatters) { if (typeof customFormatters[k] === 'string') { customFormatters[k] = eval('(' + customFormatters[k] + ')'); } }; } console.log('new json', json); return json; } function zoomGraphX(x, tokenData) { var basePath = window.basePath || ''; return fetch(basePath + '/zoomed', { method: 'post', headers: { "Content-type": "application/x-www-form-urlencoded; charset=UTF-8" }, body: 'x=' + x + '&id=' + tokenData.id + '&date=' + tokenData.date + '&token=' + tokenData.token }).then(function (response) { if (response.status !== 200) { console.error('Zoom fetch error. Status Code: ', response); return Promise.reject(); } return response.json().then(function (json) { return prepareGraphJson(json); }); }); } function fetchGraph(id, tokenData, retry) { var domEl = document.getElementById(id); if (!domEl) { console.warn('graph el #' + id + ' not found'); return; } var loadingEl = domEl.querySelector('.chart_wrap_loading'); var basePath = window.basePath || ''; retry = retry || 0; return fetch(basePath + '/asyncgraph' + (tokenData.test ? '?_test=1' : ''), { method: 'post', headers: { "Content-type": "application/x-www-form-urlencoded; charset=UTF-8" }, body: 'id=' + tokenData.id + '&date=' + tokenData.date + '&token=' + tokenData.token }).then(function (response) { if (response.status !== 200) { console.error('Async graph fetch error. Status Code: ', response); if (response.status === 500) { loadingEl.innerHTML = 'Internal Server Error, Retrying '+(++retry) +'...'; setTimeout(function () { fetchGraph(id, tokenData, retry) }, 1000 * retry); } return; } return response.json().then(function (json) { renderGraph(id, json); }); }); } function renderGraph(id, json, initial) { var domEl = document.getElementById(id); var loadingEl = domEl.querySelector('.chart_wrap_loading'); var isScatter = json.scatter || (json.types && Object.keys(json.types).some(function(k){return json.types[k]=='scatter'})); var dynEnabled = isDynamicEnabled(json); var rawJson = dynEnabled ? deepCloneJson(json) : null; if (!isScatter && (!json.columns.length || json.columns[0].length <= 2)) { if (loadingEl) { loadingEl.innerHTML = 'Not enough data to display.'; } return; } if (dynEnabled && detectModeFromJson(rawJson) === 'relative') { delete json.x_on_zoom; } json = prepareGraphJson(json); var chart = Graph.render(domEl, json); domEl.classList.add('chart_wrap_rendered'); window.charts = window.charts || {}; window.charts[id] = chart; if (dynEnabled) { try { initDynamicModeToggle(domEl, chart, rawJson); } catch (e) { console.warn('dynamic toggle init failed', e); } } setTimeout(function () { if (loadingEl) { loadingEl.parentNode && loadingEl.parentNode.removeChild(loadingEl) } }, 1000); if (json.csvExport) { var exportHTML = '