diff --git a/scoreboard.css b/scoreboard.css index a932680..627d2bc 100644 --- a/scoreboard.css +++ b/scoreboard.css @@ -2,6 +2,9 @@ font-family: Comunicacion Digital; src: url(Comunicacion.ttf); } +#scoreboard { + cursor: crosshair; +} #scoreboard td { vertical-align: top; text-align: center; @@ -26,12 +29,21 @@ #timeouts-a, #timeouts-b { font-size: 50%; } -#timeouts-a { +#timeouts-a, #jammer-a { float: left; } -#timeouts-b { +#timeouts-b, #jammer-b { float: right; } + +#jammer-a, #jammer-b { + color: #444; +} + +#jammer-a.lead, #jammer-b.lead { + color: yellow; +} + #jam, #period { background: #000; font-size: 150%; diff --git a/scoreboard.html b/scoreboard.html index 92df83b..84995f1 100644 --- a/scoreboard.html +++ b/scoreboard.html @@ -55,14 +55,16 @@

--:--
+ 0 - + 0

- 0 + - - 0 +
- -:--.-- + -:--.-

diff --git a/scoreboard.js b/scoreboard.js index 477a829..203e0e0 100644 --- a/scoreboard.js +++ b/scoreboard.js @@ -36,36 +36,44 @@ var period = 0; var state = SETUP; +var timer_updates = []; +function update() { + for (i in timer_updates) { + var u = timer_updates[i]; + + u(); + } +} + // Create a timer on [element]. // If [tenths] is true, show tenths of a second. // If [callback] is defined, call it when time runs out. function startTimer(element, tenths, callback) { - var itimer; var startTime; + var running = false; var duration = 0; var className; // Re-calculate and update displayed time - function refresh() { + function refresh () { var remain = element.remaining(); var min = Math.floor(Math.abs(remain / 60000)); var sec = (Math.floor(Math.abs(remain / 100)) / 10) % 60; // Set classes element.className = className; - if (! itimer) { - element.className += " paused"; - } if ((! className) && (remain <= 20000)) { element.className += " lowtime"; } + if (! running) { + element.className += " paused"; + } // Has the timer run out? if ((duration > 0) && (remain <= 0)) { duration = 0; sec = 0; - clearInterval(itimer); - itimer = undefined; + running = false; if (callback) { callback(); } @@ -90,7 +98,7 @@ function startTimer(element, tenths, callback) { // Return remaining time in milliseconds element.remaining = function() { - if (itimer) { + if (running) { var now = (new Date()).getTime(); return duration - (now - startTime); } else { @@ -109,22 +117,23 @@ function startTimer(element, tenths, callback) { // Start timer element.start = function() { - if (! itimer) { + if (! running) { startTime = (new Date()).getTime(); - itimer = setInterval(refresh, 33); + running = true; } refresh(); } // Stop timer element.stop = function() { - if (itimer) { + if (running) { duration = element.remaining(); - clearInterval(itimer); - itimer = undefined; + running = false; } refresh(); } + + timer_updates.push(refresh); } // Transition state machine based on state @@ -157,6 +166,10 @@ function transition(newstate) { jt.start(); jtext.innerHTML = "Timeout"; } + + // Reset lead jammer indicators + e("jammer-a").className = ""; + e("jammer-b").className = ""; } @@ -172,32 +185,23 @@ function score(team, points) { te.innerHTML = ts; } -var preset = {a:-1, b:-1}; -function logo_rotate(team, dir) { - var t; - - preset[team] = (teams.length + preset[team] + dir) % teams.length; - t = teams[preset[team]]; - - e("name-" + team).innerHTML = t[0]; - e("logo-" + team).src = "logos/" + t[1]; -} +var logo = {a:-1, b:-1}; function handle(event) { - var e = event.target; - var team = e.id.substr(e.id.length - 1); + var tgt = event.target; + var team = tgt.id.substr(tgt.id.length - 1); var adj = event.shiftKey?-1:1; var mod = (event.ctrlKey || event.altKey); var newstate; - switch (e.id) { + switch (tgt.id) { case "name-a": case "name-b": if (state == SETUP) { - var tn = prompt("Enter team " + team + " name", e.innerHTML); + var tn = prompt("Enter team " + team + " name", tgt.innerHTML); if (tn) { - e.innerHTML = tn; + tgt.innerHTML = tn; } } break; @@ -208,34 +212,48 @@ function handle(event) { var u = prompt("Enter URL to team " + team + " logo"); if (u) { - e.src = u; + tgt.src = u; } } else { - logo_rotate(team, adj); + var t; + + logo[team] = (teams.length + logo[team] + adj) % teams.length; + t = teams[logo[team]]; + + e("name-" + team).innerHTML = t[0]; + tgt.src = "logos/" + t[1]; } } else { score(team, -adj); } break; + case "jammer-a": + case "jammer-b": + var on = ! tgt.className; + + e("jammer-a").className = ""; + e("jammer-b").className = ""; + if (on) tgt.className = "lead"; + break; case "timeouts-a": case "timeouts-b": // Allow for timeouts > 3 - var v = Number(e.innerHTML); + var v = Number(tgt.innerHTML); v -= adj; if (v == -1) v = 3; - e.innerHTML = v; + tgt.innerHTML = v; break; case "period": if ((state == SETUP) || (state == TIMEOUT)) { - var r = prompt("Enter new time for period clock", e.innerHTML); + var r = prompt("Enter new time for period clock", tgt.innerHTML); if (! r) return; var t = r.split(":"); var sec = 0; if (t.length > 3) { - e.innerHTML = "What?"; + tgt.innerHTML = "What?"; return; } @@ -244,7 +262,7 @@ function handle(event) { sec = (sec * 60) + Number(v); } - e.set(sec*1000); + tgt.set(sec*1000); } else { newstate = TIMEOUT; } @@ -253,14 +271,14 @@ function handle(event) { var pt; if (mod) { - pt = prompt("Enter new period indicator text", e.innerHTML); + pt = prompt("Enter new period indicator text", tgt.innerHTML); } else { var ptl = periodtext.length; period = (period + ptl + adj) % ptl; pt = periodtext[period]; } - if (pt) e.innerHTML = pt; + if (pt) tgt.innerHTML = pt; break; case "jam": if (state == JAM) { @@ -272,9 +290,9 @@ function handle(event) { case "score-a": case "score-b": if (state == SETUP) { - var s = prompt("Enter score for team " + team, e.innerHTML); + var s = prompt("Enter score for team " + team, tgt.innerHTML); if (s) { - e.innerHTML = s; + tgt.innerHTML = s; } } else { score(team, adj); @@ -284,10 +302,10 @@ function handle(event) { transition(newstate); } -function key(e) { +function key(event) { var newstate; - switch (String.fromCharCode(e.which || 0)) { + switch (String.fromCharCode(event.which || 0)) { case " ": if (state == JAM) { newstate = ROTATE; @@ -358,7 +376,8 @@ function start() { startTimer(j, true); j.set(120000); - save_itimer = setInterval(save, 1000); + save_timer = setInterval(save, 1000); + update_itimer = setInterval(update, 33); } window.onload = start;