+
+ fade_in_rows(carousel);
+
+ carousel.style.display = 'table';
+};
+
+function get_group(group_name, cb)
+{
+ let req = new XMLHttpRequest();
+ req.onload = function(e) {
+ cb(JSON.parse(req.responseText), group_name);
+ };
+ req.open('GET', 'https://sheets.googleapis.com/v4/spreadsheets/1uh7kr5v_hyD072b1G2tbQlhqd_8ldS_6j30CBocQ-4E/values/\'' + group_name + '\'!A1:J50?key=AIzaSyAuP9yQn8g0bSay6r_RpGtpFeIbwprH1TU');
+ req.send();
+}
+
+function showgroup(group_name)
+{
+ get_group(group_name, function(response, group_name) {
+ let teams = parse_teams_from_spreadsheet(response);
+ let games = parse_games_from_spreadsheet(response, group_name, false);
+ display_group_parsed(teams, games, group_name);
+ });
+ publish_group_rank(group_name); // Update the spreadsheet in the background.
+}
+
+
+function showgroup_from_state()
+{
+ showgroup(state['group_name']);
+}
+
+let carousel_timeout = null;
+
+function hidetable()
+{
+ fade_out_rows(document.getElementById('carousel'));
+};
+
+function showschedule(page)
+{
+ let teams = [];
+ let games = [];
+ let num_left = 3;
+
+ let 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, 0);
+ }
+ };
+
+ get_group('Group A', cb);
+ get_group('Group B', cb);
+ get_group('Playoffs', cb);
+};
+
+function do_series(series)
+{
+ do_series_internal(series, 0);
+};
+
+function do_series_internal(series, idx)
+{
+ (series[idx][1])();
+ if (idx + 1 < series.length) {
+ carousel_timeout = setTimeout(function() { do_series_internal(series, idx + 1); }, series[idx][0]);
+ }