X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=carousel.js;h=3d8d20f03220005760af088b40819a138df13981;hb=f7bfc5011e5c9122235b14fc4133591ffe671173;hp=5a56039c9bfb7fc5591dd938081561c5a7ffcdbf;hpb=b563d061114c6280b3738f7c389fa762b160cb58;p=ultimatescore diff --git a/carousel.js b/carousel.js index 5a56039..3d8d20f 100644 --- a/carousel.js +++ b/carousel.js @@ -1,4 +1,14 @@ - +addheading = function(carousel, colspan, content) +{ + var thead = document.createElement("thead"); + var tr = document.createElement("tr"); + var th = document.createElement("th"); + th.innerHTML = content; + th.setAttribute("colspan", colspan); + tr.appendChild(th); + thead.appendChild(tr); + carousel.appendChild(thead); +}; addtd = function(tr, className, content) { var td = document.createElement("td"); td.appendChild(document.createTextNode(content)); @@ -177,7 +187,8 @@ rank = function(games, teams, start_rank, tiebreakers) { for (i = 0; i < games.length; ++i) { var idx1 = teams_to_idx[games[i].name1]; var idx2 = teams_to_idx[games[i].name2]; - if (idx1 !== undefined && idx2 !== undefined) { + if (idx1 !== undefined && idx2 !== undefined && + !isNaN(games[i].score1) && isNaN(games[i].score2)) { teams[idx1].h2h_gd += games[i].score1; teams[idx1].h2h_gd -= games[i].score2; teams[idx2].h2h_gd += games[i].score2; @@ -223,40 +234,66 @@ rank = function(games, teams, start_rank, tiebreakers) { return result; }; -var req = new XMLHttpRequest(); -req.onload = function(e) { - var response = JSON.parse(req.responseText); - console.log(response.values); - var carousel = document.getElementById('carousel'); +parse_teams_from_spreadsheet = function(response) { var teams = []; for (var i = 2; response.values[i].length >= 1; ++i) { teams.push({ "name": response.values[i][0], - "shortname": response.values[i][1], + "mediumname": response.values[i][1], + "shortname": response.values[i][2], "nplayed": 0, "gd": 0, "pts": 0, "goals": 0 }); } + return teams; +}; + +parse_games_from_spreadsheet = function(response, group_name, include_unplayed) { var games = []; - for (var i = 12; response.values[i] !== undefined && response.values[i].length >= 1; ++i) { - if (response.values[i][2] && response.values[i][3]) { + var i; + for (i = 0; i < response.values.length; ++i) { + if (response.values[i][0] === 'Results') { + i += 2; + break; + } + } + + for ( ; response.values[i] !== undefined && response.values[i].length >= 1; ++i) { + if ((response.values[i][2] && response.values[i][3]) || include_unplayed) { + var real_group_name = response.values[i][8]; + if (real_group_name === undefined) { + real_group_name = group_name; + } games.push({ "name1": response.values[i][0], "name2": response.values[i][1], "score1": parseInt(response.values[i][2]), - "score2": parseInt(response.values[i][3]) + "score2": parseInt(response.values[i][3]), + "streamtime": response.values[i][7], + "group_name": real_group_name }); } } - console.log(games); + return games; +}; + +var display_group = function(response, group_name) +{ + var teams = parse_teams_from_spreadsheet(response); + var games = parse_games_from_spreadsheet(response, group_name, false); + display_group_parsed(teams, games, group_name); +}; +var display_group_parsed = function(teams, games, group_name) +{ var teams_to_idx = make_teams_to_idx(teams); for (i = 0; i < games.length; ++i) { var idx1 = teams_to_idx[games[i].name1]; var idx2 = teams_to_idx[games[i].name2]; if (games[i].score1 === undefined || games[i].score2 === undefined || + isNaN(games[i].score1) || isNaN(games[i].score2) || idx1 === undefined || idx2 === undefined || games[i].score1 == games[i].score2) { continue; @@ -278,7 +315,19 @@ req.onload = function(e) { tiebreakers = []; teams = rank(games, teams, 1, tiebreakers); - console.log(tiebreakers. join(", ")); + + var carousel = document.getElementById('carousel'); + clear_carousel(carousel); + + addheading(carousel, 5, "Current standings, TrønDisk 2017
" + group_name); + var tr = document.createElement("tr"); + tr.className = "subfooter"; + addth(tr, "rank", ""); + addth(tr, "team", ""); + addth(tr, "nplayed", "P"); + addth(tr, "gd", "GD"); + addth(tr, "pts", "Pts"); + carousel.appendChild(tr); var row_num = 2; for (i = 0; i < teams.length; ++i) { @@ -290,14 +339,12 @@ req.onload = function(e) { addtd(tr, "gd", teams[i].gd.toString().replace(/-/, '−')); addtd(tr, "pts", teams[i].pts); - tr.style = "-webkit-animation: fade-in 1.0s ease; -webkit-animation-delay: " + 0.25 * (row_num++) + "s; -webkit-animation-fill-mode: both;"; carousel.appendChild(tr); } if (tiebreakers.length > 0) { var tie_tr = document.createElement("tr"); tie_tr.className = "footer"; - tie_tr.style = "-webkit-animation: fade-in 2.0s ease; -webkit-animation-delay: " + 0.25 * (row_num++) + "s; -webkit-animation-fill-mode: both;"; var td = document.createElement("td"); td.appendChild(document.createTextNode("Tiebreaks applied: " + tiebreakers.join(', '))); td.setAttribute("colspan", "5"); @@ -307,17 +354,203 @@ req.onload = function(e) { var footer_tr = document.createElement("tr"); footer_tr.className = "footer"; - footer_tr.style = "-webkit-animation: fade-in 2.0s ease; -webkit-animation-delay: " + 0.25 * (row_num++) + "s; -webkit-animation-fill-mode: both;"; var td = document.createElement("td"); td.appendChild(document.createTextNode("www.trondheimfrisbeeklubb.no | #trøndisk")); td.setAttribute("colspan", "5"); footer_tr.appendChild(td); carousel.appendChild(footer_tr); - console.log(footer_tr); + + fade_in_rows(carousel); carousel.style.display = 'table'; -} -req.open('GET', 'https://sheets.googleapis.com/v4/spreadsheets/1CwRHQtpokVMGTPJu2FYYG-6rnG7OfISIcEHwBfXh-Y4/values/A1:E22?key=AIzaSyAuP9yQn8g0bSay6r_RpGtpFeIbwprH1TU'); -if (false) { +}; + +var fade_in_rows = function(table) +{ + var trs = table.getElementsByTagName("tr"); + for (var i = 1; i < trs.length; ++i) { // The header already has its own fade-in. + if (trs[i].className === "footer") { + trs[i].style = "-webkit-animation: fade-in 1.0s ease; -webkit-animation-delay: " + (0.25 * i) + "s; -webkit-animation-fill-mode: both;"; + } else { + trs[i].style = "-webkit-animation: fade-in 2.0s ease; -webkit-animation-delay: " + (0.25 * i) + "s; -webkit-animation-fill-mode: both;"; + } + } +}; + +var fade_out_rows = function(table) +{ + var trs = table.getElementsByTagName("tr"); + for (var i = 0; i < trs.length; ++i) { + if (trs[i].className === "footer") { + trs[i].style = "-webkit-animation: fade-out 1.0s ease; -webkit-animation-delay: " + (0.125 * i) + "s; -webkit-animation-fill-mode: both;"; + } else { + trs[i].style = "-webkit-animation: fade-out 1.0s ease; -webkit-animation-delay: " + (0.125 * i) + "s; -webkit-animation-fill-mode: both;"; + } + } +}; + +var clear_carousel = function(table) +{ + while (table.childNodes.length > 0) { + table.removeChild(table.firstChild); + } +}; + +// Stream schedule +var display_stream_schedule = function(response, group_name) { + var teams = parse_teams_from_spreadsheet(response); + var games = parse_games_from_spreadsheet(response, group_name, true); + display_stream_schedule_parsed(teams, games); +}; + +var display_stream_schedule_parsed = function(teams, games) { + var teams_to_idx = make_teams_to_idx(teams); + games = games.filter(function(game) { return game.streamtime !== undefined && game.streamtime.match(/[0-9]+:[0-9]+/) != null; }); + games.sort(function(a, b) { + var m1 = a.streamtime.match(/([0-9]+):([0-9]+)/); + var m2 = b.streamtime.match(/([0-9]+):([0-9]+)/); + return (m1[1] * 60 + m1[2]) - (m2[1] * 60 + m2[2]); + }); + + // Pick out a reasonable place to start the list. We'll show the last + // completed match and start from there. + var max_list_len = 8; + var start_idx = games.length - 1; + for (var i = 0; i < games.length; ++i) { + if (isNaN(games[i].score1) || isNaN(games[i].score2) && + games[i].score1 === games[i].score2) { + start_idx = i; + break; + } + } + if (start_idx > 0) start_idx--; + if (games.length >= max_list_len) { + start_idx = Math.min(start_idx, games.length - max_list_len); + } + + var carousel = document.getElementById('carousel'); + clear_carousel(carousel); + addheading(carousel, 3, "Stream schedule, TrønDisk 2017
Saturday"); + + var row_num = 0; + for (i = start_idx; i < games.length && row_num < max_list_len; ++i) { + var tr = document.createElement("tr"); + + var name1 = teams[teams_to_idx[games[i].name1]].mediumname; + var name2 = teams[teams_to_idx[games[i].name2]].mediumname; + + addtd(tr, "matchup", name1 + "–" + name2); + addtd(tr, "group", games[i].group_name); + + if (!isNaN(games[i].score1) && !isNaN(games[i].score2) && + games[i].score1 !== games[i].score2) { + addtd(tr, "streamtime", games[i].score1 + "–" + games[i].score2); + } else { + addth(tr, "streamtime", games[i].streamtime); + } + + row_num++; + carousel.appendChild(tr); + } + + fade_in_rows(carousel); + + carousel.style.display = 'table'; +}; + +var get_group = function(group_name, cb) +{ + var req = new XMLHttpRequest(); + req.onload = function(e) { + cb(JSON.parse(req.responseText), group_name); + }; + req.open('GET', 'https://sheets.googleapis.com/v4/spreadsheets/1CwRHQtpokVMGTPJu2FYYG-6rnG7OfISIcEHwBfXh-Y4/values/\'' + group_name + '\'!A1:J50?key=AIzaSyAuP9yQn8g0bSay6r_RpGtpFeIbwprH1TU'); req.send(); -} +}; + +var showgroup = function(group_name) +{ + get_group(group_name, display_group); +}; + +var carousel_timeout = null; + +var hidetable = function() +{ + fade_out_rows(document.getElementById('carousel')); +}; + +var showschedule = function() +{ + var teams = []; + var games = []; + var num_left = 3; + + var cb = function(response, group_name) { + teams = teams.concat(parse_teams_from_spreadsheet(response)); + games = games.concat(parse_games_from_spreadsheet(response, group_name, true)); + if (--num_left == 0) { + display_stream_schedule_parsed(teams, games); + } + }; + + get_group('Group A', cb); + get_group('Group B', cb); + get_group('Playoffs', cb); +}; + +var do_series = function(series) +{ + do_series_internal(series, 0); +}; + +var do_series_internal = function(series, idx) +{ + (series[idx][1])(); + if (idx + 1 < series.length) { + carousel_timeout = setTimeout(function() { do_series_internal(series, idx + 1); }, series[idx][0]); + } +}; + +var showcarousel = function() +{ + var teams_per_group = []; + var games_per_group = []; + var combined_teams = []; + var combined_games = []; + var num_left = 3; + + var cb = function(response, group_name) { + var teams = parse_teams_from_spreadsheet(response); + var games = parse_games_from_spreadsheet(response, group_name, true); + teams_per_group[group_name] = teams; + games_per_group[group_name] = games; + + combined_teams = combined_teams.concat(teams); + combined_games = combined_games.concat(games); + if (--num_left == 0) { + do_series([ + [ 13000, function() { display_group_parsed(teams_per_group['Group A'], games_per_group['Group A'], 'Group A'); } ], + [ 2000, function() { hidetable(); } ], + [ 13000, function() { display_group_parsed(teams_per_group['Group B'], games_per_group['Group B'], 'Group B'); } ], + [ 2000, function() { hidetable(); } ], + [ 13000, function() { display_stream_schedule_parsed(combined_teams, combined_games); } ], + [ 2000, function() { hidetable(); } ] + ]); + } + }; + + get_group('Group A', cb); + get_group('Group B', cb); + get_group('Playoffs', cb); +}; + +var stopcarousel = function() +{ + if (carousel_timeout !== null) { + hidetable(); + clearTimeout(carousel_timeout); + carousel_timeout = null; + } +}; +