}
function add_th(tr, text, colspan) {
- let element = add_cell(tr, 'th', text);
+ let element = document.createElement('th');
+ let link = document.createElement('a');
+ link.style.cursor = 'pointer';
+ link.addEventListener('click', (e) => {
+ sort_by(element);
+ process_matches(global_json, global_filters);
+ });
+ link.textContent = text;
+ element.appendChild(link);
+ tr.appendChild(element);
+
if (colspan > 0) {
element.setAttribute('colspan', colspan);
} else {
rows.push(header);
}
- for (const [q,p] of Object.entries(players)) {
+ for (const [q,p] of get_sorted_players(players)) {
if (q === 'globals') continue;
let row = document.createElement('tr');
let pm = p.goals + p.assists + p.hockey_assists + p.defenses - p.throwaways - p.drops - p.was_ds;
let soft_pm = p.offensive_soft_plus + p.defensive_soft_plus - p.offensive_soft_minus - p.defensive_soft_minus;
let o_efficiency = make_efficiency_ci(p.offensive_points_won, p.offensive_points_completed, z);
let d_efficiency = make_efficiency_ci(p.defensive_points_won, p.defensive_points_completed, z);
- add_3cell(row, p.name, 'name'); // TODO: number?
+ let name = add_3cell(row, p.name, 'name'); // TODO: number?
add_3cell(row, pm > 0 ? ('+' + pm) : pm);
add_3cell(row, soft_pm > 0 ? ('+' + soft_pm) : soft_pm);
add_3cell_ci(row, o_efficiency);
add_3cell_ci(row, d_efficiency);
add_3cell(row, p.points_played);
+ row.dataset.player = q;
rows.push(row);
}
let catches = 0;
let drops = 0;
let was_ds = 0;
- for (const [q,p] of Object.entries(players)) {
+ for (const [q,p] of get_sorted_players(players)) {
if (q === 'globals') continue;
let throw_ok = make_binomial_ci(p.num_throws - p.throwaways, p.num_throws, z);
let catch_ok = make_binomial_ci(p.catches, p.catches + p.drops + p.was_ds, z);
add_3cell_ci(row, catch_ok);
add_3cell(row, '+' + p.offensive_soft_plus);
add_3cell(row, '-' + p.offensive_soft_minus);
+ row.dataset.player = q;
rows.push(row);
num_throws += p.num_throws;
add_th(header, 'Soft +/-', 6);
rows.push(header);
}
- for (const [q,p] of Object.entries(players)) {
+ for (const [q,p] of get_sorted_players(players)) {
if (q === 'globals') continue;
let sum_time = 0;
for (const t of p.pull_times) {
}
add_3cell(row, '+' + p.defensive_soft_plus);
add_3cell(row, '-' + p.defensive_soft_minus);
+ row.dataset.player = q;
rows.push(row);
}
return rows;
rows.push(header);
}
- for (const [q,p] of Object.entries(players)) {
+ for (const [q,p] of get_sorted_players(players)) {
if (q === 'globals') continue;
let row = document.createElement('tr');
add_3cell(row, p.name, 'name'); // TODO: number?
add_3cell(row, Math.floor(p.field_time_ms / 60000) + ' min');
add_3cell(row, p.offensive_points_completed);
add_3cell(row, p.defensive_points_completed);
+ row.dataset.player = q;
rows.push(row);
}
let throwaways = 0;
let receiver_errors = 0;
let touches = 0;
- for (const [q,p] of Object.entries(players)) {
+ for (const [q,p] of get_sorted_players(players)) {
if (q === 'globals') continue;
// Can only happen once per point, so these are binomials.
} else {
add_3cell(row, 'N/A');
}
+ row.dataset.player = q;
rows.push(row);
goals += p.goals;
add_submenu.style.display = 'none';
}
}
+
+let global_sort = {};
+
+function sort_by(th) {
+ let tr = th.parentElement;
+ let child_idx = 0;
+ for (let column_idx = 0; column_idx < tr.children.length; ++column_idx) {
+ let element = tr.children[column_idx];
+ if (element === th) {
+ ++child_idx; // Pad.
+ break;
+ }
+ if (element.hasAttribute('colspan')) {
+ child_idx += parseInt(element.getAttribute('colspan'));
+ } else {
+ ++child_idx;
+ }
+ }
+
+ global_sort = {};
+ let table = tr.parentElement;
+ for (let row_idx = 1; row_idx < table.children.length - 1; ++row_idx) { // Skip header and globals.
+ let row = table.children[row_idx];
+ let player = parseInt(row.dataset.player);
+ let value = row.children[child_idx].textContent;
+ global_sort[player] = value;
+ }
+}
+
+function get_sorted_players(players)
+{
+ let p = Object.entries(players);
+ if (global_sort.length !== 0) {
+ p.sort((a,b) => {
+ let ai = parseFloat(global_sort[a[0]]);
+ let bi = parseFloat(global_sort[b[0]]);
+ if (ai == ai && bi == bi) {
+ return bi - ai; // Reverse numeric.
+ } else if (global_sort[a[0]] < global_sort[b[0]]) {
+ return -1;
+ } else if (global_sort[a[0]] > global_sort[b[0]]) {
+ return 1;
+ } else {
+ return 0;
+ }
+ });
+ }
+ return p;
+}