let statsresult = new Promise(function (resolve, reject) { $.ajax({ url: "/api/stats", dataType: "json", error: () => reject('API Call Failed.'), success: function (result) { resolve(result) }, }); }); google.charts.load('current', { 'packages': ['corechart'] }); google.charts.setOnLoadCallback(drawColumnChart); google.charts.setOnLoadCallback(drawTrendChart); google.charts.setOnLoadCallback(drawCrossChart); async function drawCrossChart() { let cross = $("#cross_div"); let table = cross.append("
").children().last(); table.css('border-collapse', 'collapse'); let result; try { result = await statsresult; } catch (err) { alert(err); return; } let radius = result.radius; let distance = result.distance; let max = 0; let names = []; for (let name in radius) { if (radius[name] > max) { max = radius[name]; } names.push(name); } let colors = palette('mpn65', names.length); let tr = table.append("").children().last(); tr.append(""); for (let [i, name] of names.entries()) { let td = tr.append("" + name + "").children().last(); td.css('border', '0.5px solid black'); td.css(`background-color`, '#' + colors[i]); td.css(`color`, 'white'); } for (let [i, name] of names.entries()) { let tr = table.append("").children().last(); let td = tr.append("" + name + "").children().last(); td.css('border', '0.5px solid black'); td.css(`background-color`, '#' + colors[i]); td.css(`color`, 'white'); for (let [j, n] of names.entries()) { td = tr.append("").children().last(); td.css('border', '0.5px solid black'); let id = name + n; td.append("
"); if (name !== n) { let r = radius[name]; let chart = d3.select("#" + id).append("svg") .attr("width", 200) .attr("height", 100); chart.append('circle') .style("opacity", 0.5) .style("fill", '#' + colors[i]) .attr("cx", 50) .attr("cy", 50) .attr("r", r * 50 / max); let d = distance[name + "*" + n] || distance[n + "*" + name]; if (d) { d = parseFloat(d); r = radius[n]; chart.append('circle') .style("opacity", 0.5) .style("fill", '#' + colors[j]) .attr("cx", 50 + d * 50 / max) .attr("cy", 50) .attr("r", r * 50 / max); } } } } } async function drawTrendChart() { let result; try { result = await statsresult; } catch (err) { alert(err); return; } let numbers = result.pubDateMonth.name; let data = new google.visualization.DataTable(); data.addColumn('string', 'month'); let names = []; let ms = {}; for (let name in numbers) { data.addColumn('number', name); names.push(name); for (let m in numbers[name]) { ms[m]++; } } for (let m of Object.keys(ms).sort()) { let row = []; row.push(m); for (let name of names) { let n = numbers[name][m]; if (n === undefined) { n = 0; } row.push(n); } data.addRow(row); } let options = { title: 'Number of Signitures', hAxis: { Title: 'Published Month by NIST', showTextEvery: 1, slantedText: true, slantedTextAngle: 70 }, }; let trenddiv = document.getElementById("trend_div"); let chart = new google.visualization.LineChart(trenddiv); let x = document.body.scrollWidth; let chartWidth = x - (3 * 2); if (chartWidth > 600) { trenddiv.setAttribute("style", "width : " + chartWidth + "px;" + "height : " + chartWidth / 2 + "px;") } chart.draw(data, options); } async function drawColumnChart() { let result; try { result = await statsresult; } catch (err) { alert(err); return; } let numbers = result.name; let data = new google.visualization.DataTable(); data.addColumn('string', 'name'); data.addColumn('number', 'number'); for (let name in numbers) { let row = []; let n = parseInt(numbers[name]); row.push(name); row.push(n); data.addRow(row); } let options = { title: 'Number of Signitures', hAxis: { title: 'Vendor Name', showTextEvery: 1, slantedText: true, slantedTextAngle: 70 }, bar: { groupWidth: "65%" }, legend: { position: "none" }, }; let columndiv = document.getElementById("column_div"); let chart = new google.visualization.ColumnChart(columndiv); let x = document.body.scrollWidth; let chartWidth = x - (3 * 2); if (chartWidth > 600) { columndiv.setAttribute("style", "width : " + chartWidth + "px;" + "height : " + chartWidth / 2 + "px;") } chart.draw(data, options); }