-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstats.js
More file actions
108 lines (94 loc) · 2.96 KB
/
stats.js
File metadata and controls
108 lines (94 loc) · 2.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*
* stats.js
* Chris Phifer
*
* Makes request to our server to get score data requested (for the desired game mode)
* and generates a chart based on the data (to show a score distribution of sorts)
*/
google.charts.load('current', {'packages':['corechart']});
//google.charts.setOnLoadCallback(render_chart);
var modes;
var data = [];
/* Give all the radio buttons event listeners for being clicked */
/* Just leave in global scope */
$(document).ready(function() {
modes = document.getElementsByName("difficulty");
for (var i = 0; i < modes.length; i++) {
modes[i].addEventListener('click', get_data);
}
});
function get_data() {
$("#chart").hide();
data = [];
for (var i = 0; i < modes.length; i++) {
if (modes[i].checked) {
process_data(modes[i].value);
break; /* Don't process once we find one selected */
}
}
}
/* Expects array of objects holding score data */
function build_table(difficulty) {
var leaderboard = document.getElementById("leaderboard");
var title = "<h1>Scores (" + difficulty.replace(/\b\w/g, l => l.toUpperCase()) + ")</h1>"
var table = "<table class=\"table table-bordered table-hover table-striped\">"
table += "<thead><tr class=\"success\"><th>Rank</th><th>Username</th><th>Score</th></tr></thead>"
table += "<tbody>"
/* Assume: Array is sorted by score */
for (var i = 0; i < data.length; i++) {
if (data[i].username === "") {
data[i].username = "Anonymous";
}
table += "<tr>"
table += "<th scope=\"row\">" + (i + 1) + "</th>" +
"<td>" + data[i].username + "</td>" +
"<td>" + data[i].score + "</td>"
table += "</tr>"
}
table += "</tbody></table>"
leaderboard.innerHTML = title + table;
render_chart();
}
function render_chart() {
var chart_div = document.getElementById("chart");
var formatted_data = [];
formatted_data[0] = ["Rank", "Score"];
for (var i = 0; i < data.length; i++) {
formatted_data.push([i + 1, data[i].score]);
}
formatted_data = google.visualization.arrayToDataTable(formatted_data);
var options = {
title: "Scores by Rank",
lengend: { position: "bottom" }
};
var chart = new google.visualization.LineChart(chart_div);
if (data.length > 0) {
$("#chart").show();
chart.draw(formatted_data, options);
}
}
/* Perform an XHR to the high-scores route to get all scores for a given difficulty */
function process_data(difficulty) {
if (difficulty === "local") {
if (localStorage.getItem("scores") == null) {
localStorage.setItem("scores", JSON.stringify([]));
}
data = JSON.parse(localStorage.getItem("scores"));
build_table(difficulty);
} else {
var xhr = new XMLHttpRequest();
xhr.open("get", "http://find-the-way.herokuapp.com/high-scores?difficulty=" + difficulty, true);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
var raw_data = xhr.responseText;
data = JSON.parse(raw_data);
build_table(difficulty);
} else {
process_data(difficulty);
}
}
};
xhr.send();
}
}