X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=carousel.js;h=2336e5545d7a091259150e24a0a49b6f2e73baaa;hb=fa0675bc762138c265795b881f6b43a52e07d8ab;hp=dbf1e1600e802066bbc5999bf16371bf45cfb723;hpb=fed10ae88ec2902742be3f2d35d40e4bca9c5942;p=ultimatescore diff --git a/carousel.js b/carousel.js index dbf1e16..2336e55 100644 --- a/carousel.js +++ b/carousel.js @@ -1,4 +1,4 @@ -addheading = function(carousel, colspan, content) +function addheading(carousel, colspan, content) { var thead = document.createElement("thead"); var tr = document.createElement("tr"); @@ -9,20 +9,20 @@ addheading = function(carousel, colspan, content) thead.appendChild(tr); carousel.appendChild(thead); }; -addtd = function(tr, className, content) { +function addtd(tr, className, content) { var td = document.createElement("td"); td.appendChild(document.createTextNode(content)); td.className = className; tr.appendChild(td); }; -addth = function(tr, className, content) { +function addth(tr, className, content) { var th = document.createElement("th"); th.appendChild(document.createTextNode(content)); th.className = className; tr.appendChild(th); }; -subrank_partitions = function(games, parts, start_rank, tiebreakers) { +function subrank_partitions(games, parts, start_rank, tiebreakers) { var result = []; for (var i = 0; i < parts.length; ++i) { var part = rank(games, parts[i], start_rank, tiebreakers); @@ -34,7 +34,7 @@ subrank_partitions = function(games, parts, start_rank, tiebreakers) { return result; }; -partition = function(teams, compare) +function partition(teams, compare) { teams.sort(compare); @@ -53,7 +53,7 @@ partition = function(teams, compare) return parts; }; -explain_tiebreaker = function(parts, rule_name) +function explain_tiebreaker(parts, rule_name) { var result = []; for (var i = 0; i < parts.length; ++i) { @@ -62,7 +62,7 @@ explain_tiebreaker = function(parts, rule_name) return result.join(" > ") + " (" + rule_name + ")"; } -make_teams_to_idx = function(teams) +function make_teams_to_idx(teams) { var teams_to_idx = []; for (var i = 0; i < teams.length; i++) { @@ -71,7 +71,7 @@ make_teams_to_idx = function(teams) return teams_to_idx; } -partition_by_beat = function(games, teams) +function partition_by_beat(games, teams) { // Head-to-head score by way of components. First construct the beat matrix. var n = teams.length; @@ -149,7 +149,7 @@ partition_by_beat = function(games, teams) } // Takes in an array, gives every element a rank starting with 1, and returns. -rank = function(games, teams, start_rank, tiebreakers) { +function rank(games, teams, start_rank, tiebreakers) { if (teams.length <= 1) { // Only one team, so trivial. teams[0].rank = start_rank; @@ -187,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; @@ -233,13 +234,14 @@ rank = function(games, teams, start_rank, tiebreakers) { return result; }; -parse_teams_from_spreadsheet = function(response) { +function parse_teams_from_spreadsheet(response) { var teams = []; for (var i = 2; response.values[i].length >= 1; ++i) { teams.push({ "name": response.values[i][0], "mediumname": response.values[i][1], "shortname": response.values[i][2], + "tags": response.values[i][3], "nplayed": 0, "gd": 0, "pts": 0, @@ -249,7 +251,7 @@ parse_teams_from_spreadsheet = function(response) { return teams; }; -parse_games_from_spreadsheet = function(response, group_name, include_unplayed) { +function parse_games_from_spreadsheet(response, group_name, include_unplayed) { var games = []; var i; for (i = 0; i < response.values.length; ++i) { @@ -261,33 +263,41 @@ parse_games_from_spreadsheet = function(response, group_name, include_unplayed) 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][9]; + 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]), - "streamtime": response.values[i][7], - "group_name": group_name + "streamday": response.values[i][7], + "streamtime": response.values[i][8], + "group_name": real_group_name }); } } return games; }; -var display_group = function(response, group_name) +function display_group(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) +function display_group_parsed(teams, games, group_name) { + document.getElementById('entire-bug').style.display = 'none'; + var teams_to_idx = make_teams_to_idx(teams); - for (i = 0; i < games.length; ++i) { + for (var 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; @@ -307,13 +317,13 @@ var display_group_parsed = function(teams, games, group_name) } } - tiebreakers = []; + var tiebreakers = []; teams = rank(games, teams, 1, tiebreakers); var carousel = document.getElementById('carousel'); clear_carousel(carousel); - addheading(carousel, 5, "Current standings, TrønDisk 2017
" + group_name); + addheading(carousel, 5, "Current standings, Trøndisk 2017
" + group_name); var tr = document.createElement("tr"); tr.className = "subfooter"; addth(tr, "rank", ""); @@ -359,7 +369,7 @@ var display_group_parsed = function(teams, games, group_name) carousel.style.display = 'table'; }; -var fade_in_rows = function(table) +function fade_in_rows(table) { var trs = table.getElementsByTagName("tr"); for (var i = 1; i < trs.length; ++i) { // The header already has its own fade-in. @@ -371,7 +381,7 @@ var fade_in_rows = function(table) } }; -var fade_out_rows = function(table) +function fade_out_rows(table) { var trs = table.getElementsByTagName("tr"); for (var i = 0; i < trs.length; ++i) { @@ -383,7 +393,7 @@ var fade_out_rows = function(table) } }; -var clear_carousel = function(table) +function clear_carousel(table) { while (table.childNodes.length > 0) { table.removeChild(table.firstChild); @@ -391,24 +401,31 @@ var clear_carousel = function(table) }; // Stream schedule -var display_stream_schedule = function(response, group_name) { +var max_list_len = 8; + +function display_stream_schedule(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); + display_stream_schedule_parsed(teams, games, 0); }; -var display_stream_schedule_parsed = function(teams, games) { - var teams_to_idx = make_teams_to_idx(teams); +function sort_game_list(games) { games = games.filter(function(game) { return game.streamtime !== undefined && game.streamtime.match(/[0-9]+:[0-9]+/) != null; }); games.sort(function(a, b) { + if (a.streamday !== b.streamday) { + return a.streamday - b.streamday; + } + 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]); }); + return games; +} +function find_game_start_idx(games) { // Pick out a reasonable place to start the list. We'll show the last // completed match and start from there. - var max_list_len = 7; var start_idx = games.length - 1; for (var i = 0; i < games.length; ++i) { if (isNaN(games[i].score1) || isNaN(games[i].score2) && @@ -421,12 +438,45 @@ var display_stream_schedule_parsed = function(teams, games) { if (games.length >= max_list_len) { start_idx = Math.min(start_idx, games.length - max_list_len); } + return start_idx; +} + +function find_num_pages(games) { + games = sort_game_list(games); + var start_idx = find_game_start_idx(games); + return Math.ceil((games.length - start_idx) / max_list_len); +} + +function display_stream_schedule_parsed(teams, games, page) { + document.getElementById('entire-bug').style.display = 'none'; + + games = sort_game_list(games); + var start_idx = find_game_start_idx(games); + + start_idx += page * max_list_len; + if (start_idx >= games.length) { + // Error. + return; + } + + var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; + var shortdays = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; + var today = days[(new Date).getDay()]; + + var covered_days = []; + var row_num = 0; + for (var i = start_idx; i < games.length && row_num++ < max_list_len; ++i) { + if (i == start_idx || games[i].streamday != games[i - 1].streamday) { + covered_days.push(days[games[i].streamday]); + } + } var carousel = document.getElementById('carousel'); clear_carousel(carousel); - addheading(carousel, 3, "Stream schedule, TrønDisk 2017
Saturday"); + addheading(carousel, 3, "Stream schedule, Trøndisk 2017
" + covered_days.join('/') + " (all times CET)"); - var row_num = 0; + var teams_to_idx = make_teams_to_idx(teams); + row_num = 0; for (i = start_idx; i < games.length && row_num < max_list_len; ++i) { var tr = document.createElement("tr"); @@ -440,7 +490,12 @@ var display_stream_schedule_parsed = function(teams, games) { games[i].score1 !== games[i].score2) { addtd(tr, "streamtime", games[i].score1 + "–" + games[i].score2); } else { - addth(tr, "streamtime", games[i].streamtime); + var streamtime = games[i].streamtime; + var streamday = days[games[i].streamday]; + if (streamday !== today) { + streamtime = shortdays[games[i].streamday] + " " + streamtime; + } + addth(tr, "streamtime", streamtime); } row_num++; @@ -452,7 +507,7 @@ var display_stream_schedule_parsed = function(teams, games) { carousel.style.display = 'table'; }; -var get_group = function(group_name, cb) +function get_group(group_name, cb) { var req = new XMLHttpRequest(); req.onload = function(e) { @@ -462,45 +517,48 @@ var get_group = function(group_name, cb) req.send(); }; -var showgroup = function(group_name) +function showgroup(group_name) { get_group(group_name, display_group); }; +function showgroup_from_state() +{ + showgroup(state['group_name']); +}; + var carousel_timeout = null; -var hidetable = function() +function hidetable() { fade_out_rows(document.getElementById('carousel')); }; -var showschedule = function() +function showschedule(page) { var teams = []; var games = []; - var num_left = 5; + 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); + display_stream_schedule_parsed(teams, games, 0); } }; get_group('Group A', cb); get_group('Group B', cb); - get_group('Semifinals', cb); - get_group('Bronze final', cb); - get_group('Final', cb); + get_group('Playoffs', cb); }; -var do_series = function(series) +function do_series(series) { do_series_internal(series, 0); }; -var do_series_internal = function(series, idx) +function do_series_internal(series, idx) { (series[idx][1])(); if (idx + 1 < series.length) { @@ -508,13 +566,13 @@ var do_series_internal = function(series, idx) } }; -var showcarousel = function() +function showcarousel() { var teams_per_group = []; var games_per_group = []; var combined_teams = []; var combined_games = []; - var num_left = 5; + var num_left = 3; var cb = function(response, group_name) { var teams = parse_teams_from_spreadsheet(response); @@ -525,30 +583,43 @@ var showcarousel = function() combined_teams = combined_teams.concat(teams); combined_games = combined_games.concat(games); if (--num_left == 0) { - do_series([ + var 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(); } ] - ]); + ]; + var num_pages = find_num_pages(combined_games); + for (let page = 0; page < num_pages; ++page) { + series.push([ 13000, function() { display_stream_schedule_parsed(combined_teams, combined_games, page); } ]); + series.push([ 2000, function() { hidetable(); } ]); + } + + do_series(series); } }; get_group('Group A', cb); get_group('Group B', cb); - get_group('Semifinals', cb); - get_group('Bronze final', cb); - get_group('Final', cb); + get_group('Playoffs', cb); }; -var stopcarousel = function() +function stopcarousel() { - hidetable(); if (carousel_timeout !== null) { + hidetable(); clearTimeout(carousel_timeout); carousel_timeout = null; } }; +function hidescorebug() +{ + document.getElementById('entire-bug').style.display = 'none'; +} + +function showscorebug() +{ + document.getElementById('entire-bug').style.display = null; +}; +