From d6438fe2c25c33b6d04717ac72b7510a26829633 Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Fri, 1 Nov 2013 17:32:32 -0600 Subject: [PATCH 01/29] Start at a Chrome app --- manifest.json | 15 +++++++++++++++ res/background.js | 5 +++++ res/icon.png | Bin 0 -> 16085 bytes res/scoreboard.js | 40 ++++++++++++++++++++++++++++------------ 4 files changed, 48 insertions(+), 12 deletions(-) create mode 100644 manifest.json create mode 100644 res/background.js create mode 100644 res/icon.png diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..998851c --- /dev/null +++ b/manifest.json @@ -0,0 +1,15 @@ +{ + "name": "LADD Scoreboard", + "description": "Roller Derby Scoreboard", + "version": "5.2", + "manifest_version": 2, + "permissions": [ "storage" ], + "icons": { + "128": "res/icon.png" + }, + "app": { + "background": { + "scripts": ["res/background.js"] + } + } +} diff --git a/res/background.js b/res/background.js new file mode 100644 index 0000000..ba095fb --- /dev/null +++ b/res/background.js @@ -0,0 +1,5 @@ +chrome.app.runtime.onLaunched.addListener(function() { + chrome.app.window.create('../scoreboard.html', { + 'state': 'fullscreen' + }) +}) diff --git a/res/icon.png b/res/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..71ca7f4c34f01fdd8c44103e3a12140a3764199f GIT binary patch literal 16085 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 Date: Sat, 2 Nov 2013 15:47:46 +0000 Subject: [PATCH 02/29] working, still needs fixes tho --- manifest.json | 1 + res/background.js | 2 +- res/scoreboard.js | 195 +++++++++++++++++++--------------------------- scoreboard.html | 24 +++--- 4 files changed, 93 insertions(+), 129 deletions(-) diff --git a/manifest.json b/manifest.json index 998851c..a197a10 100644 --- a/manifest.json +++ b/manifest.json @@ -4,6 +4,7 @@ "version": "5.2", "manifest_version": 2, "permissions": [ "storage" ], + "offline_enabled": true, "icons": { "128": "res/icon.png" }, diff --git a/res/background.js b/res/background.js index ba095fb..883396b 100644 --- a/res/background.js +++ b/res/background.js @@ -1,5 +1,5 @@ chrome.app.runtime.onLaunched.addListener(function() { chrome.app.window.create('../scoreboard.html', { - 'state': 'fullscreen' + //'state': 'fullscreen' }) }) diff --git a/res/scoreboard.js b/res/scoreboard.js index 2b4480d..6edd635 100644 --- a/res/scoreboard.js +++ b/res/scoreboard.js @@ -42,7 +42,7 @@ var state = SETUP; var timer_updates = []; function update() { - for (i in timer_updates) { + for (var i in timer_updates) { var u = timer_updates[i]; u(); @@ -149,7 +149,7 @@ function transition(newstate) { var jtext = e("jamtext"); var jno = e("jamno"); - if ((newstate == undefined) || (newstate == state)) { + if ((newstate === undefined) || (newstate == state)) { return; } @@ -264,29 +264,10 @@ function handle(event) { var newstate; switch (tgt.id) { - case "name-a": - case "name-b": - if (state == SETUP) { - var tn = prompt("Enter team " + team + " name", tgt.innerHTML); - - if (tn) { - tgt.innerHTML = tn; - } - if (window.penalties) { - penalties_setTeamName(team, tn); - } - } - break; case "logo-a": case "logo-b": if (state == SETUP) { - if (mod) { - var u = prompt("Enter URL to team " + team + " logo"); - - if (u) { - tgt.src = u; - } - } else { + if (true) { var t, name; logo[team] = (teams.length + logo[team] + adj) % teams.length; @@ -324,24 +305,8 @@ function handle(event) { break; case "period": if ((state == SETUP) || (state == TIMEOUT)) { - 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) { - tgt.innerHTML = "What?"; - return; - } - - for (var i in t) { - var v = t[i]; - sec = (sec * 60) + Number(v); - } - - tgt.set(sec*1000); - } else { + // Nothin' + } else { newstate = TIMEOUT; } break; @@ -392,10 +357,36 @@ function handle(event) { function key(event) { var e = event || window.event; - var c = String.fromCharCode(e.which || e.keyCode || 0); + var c; var newstate; + switch (e.keyCode) { + case 38: + c = "up"; + break; + case 40: + c = "down"; + break; + default: + c = String.fromCharCode(e.which || e.keyCode || 0); + break; + } + switch (c) { + case "up": + if ((state == TIMEOUT) || (state == SETUP)) { + var pt = document.getElementById("period"); + var rem = pt.remaining(); + pt.set(rem + 1000); + } + break; + case "down": + if ((state == TIMEOUT) || (state == SETUP)) { + var pt = document.getElementById("period"); + var rem = pt.remaining(); + pt.set(rem - 1000); + } + break; case " ": if (state == JAM) { newstate = LINEUP; @@ -446,57 +437,23 @@ function key(event) { transition(newstate); } -function get(k, d) { - var storage; - - if (chrome) { - storage = chrome.storage.local - } else { - storage = window.localStorage; - } - - if (! storage) { - return d; - } - - var v = storage["rdsb_" + k]; - if (v == undefined) { - return d; - } - return v; -} - -function store(k, v) { - var storage; - - if (chrome) { - storage = chrome.storage.local - } else { - storage = window.localStorage; - } - - if ((v == undefined) || ! storage) { - return; - } else { - storage["rdsb_" + k] = v; - } -} function save() { - if (window.penalties_save) { - penalties_save(); - } - store("period_clock", e("period").remaining()); - store("name_a", e("name-a").innerHTML); - store("name_b", e("name-b").innerHTML); - store("logo_a", e("logo-a").src); - store("logo_b", e("logo-b").src); - store("score_a", e("score-a").innerHTML); - store("score_b", e("score-b").innerHTML); - store("timeout_a", e("timeouts-a").innerHTML); - store("timeout_b", e("timeouts-b").innerHTML); - store("jamno", jamno); - store("period", period); + chrome.storage.sync.set( + { + "period_clock": e("period").remaining(), + "name_a": e("name-a").innerHTML, + "name_b": e("name-b").innerHTML, + "logo_a": e("logo-a").src, + "logo_b": e("logo-b").src, + "score_a": e("score-a").innerHTML, + "score_b": e("score-b").innerHTML, + "timeout_a": e("timeouts-a").innerHTML, + "timeout_b": e("timeouts-b").innerHTML, + "jamno": jamno, + "period": period, + } + ); } function iecheck() { @@ -515,7 +472,13 @@ function iecheck() { } } - +function ei(name) { + el = e(name); + if (el.addEventListener) { + el.addEventListener("click", handle, false); + } + return el; +} function start() { resize(); @@ -525,34 +488,34 @@ function start() { var j = document.getElementById("jam"); var c; + // XXX: I think, instead of null, you can pass in a dictionary of defaults + function load(state) { + ei("name-a").innerHTML = state.name_a || "Home"; + ei("name-b").innerHTML = state.name_b || "Vis"; + ei("logo-a").src = state.logo_a || "logos/black.png"; + ei("logo-b").src = state.logo_b || "logos/white.png"; + ei("score-a").innerHTML = state.score_a || 0; + ei("score-b").innerHTML = state.score_b || 0; + ei("timeouts-a").innerHTML = state.timeout_a || 3; + ei("timeouts-b").innerHTML = state.timeout_b || 3; + period = state.period || 0; + jamno = state.jamno || 0; + + var c = state.period_clock || 1800000; + startTimer(p); + p.set(c); + } + chrome.storage.sync.get(null, load); - // IE8 doesn't have localStorage for file:// URLs :< - e("name-a").innerHTML = get("name_a", "Home"); - e("name-b").innerHTML = get("name_b", "Vis"); - e("logo-a").src = get("logo_a", "logos/black.png"); - e("logo-b").src = get("logo_b", "logos/white.png"); - e("score-a").innerHTML = get("score_a", 0); - e("score-b").innerHTML = get("score_b", 0); - e("timeouts-a").innerHTML = get("timeout_a", 3); - e("timeouts-b").innerHTML = get("timeout_b", 3); - period = Number(get("period", 0)); - jamno = Number(get("jamno", 0)); - - save_itimer = setInterval(save, 1000); + ei("jammer-a"); + ei("jammer-b"); + ei("period"); + ei("jam"); - if (window.penalties) { - penalties_init(); - } - - e("periodtext").innerHTML = periodtext[period]; - e("jamtext").innerHTML = jamtext[3]; + ei("periodtext").innerHTML = periodtext[period]; + ei("jamtext").innerHTML = jamtext[3]; transition(); - c = Number(get("period_clock", 1800000)); - startTimer(p); - p.set(c); - - var j = document.getElementById("jam"); startTimer(j, window.tenths); j.set(120000); @@ -590,5 +553,5 @@ function resize() { } window.onload = start; -document.onkeypress = key; // IE requires document, not window +document.onkeydown = key; // IE requires document, not window window.onresize = resize; diff --git a/scoreboard.html b/scoreboard.html index 649b30f..39ebe22 100644 --- a/scoreboard.html +++ b/scoreboard.html @@ -31,24 +31,24 @@ -->

- - 0 - - - + + 0 + + -

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

- - 0 - - - + + 0 + + -

From 45845ab9ee3f1ee80a96051c4e97e42323ad33e3 Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Sat, 2 Nov 2013 14:35:21 -0600 Subject: [PATCH 03/29] Fixes for keydown events --- res/scoreboard.js | 701 ++++++++++++++++++++++++---------------------- 1 file changed, 364 insertions(+), 337 deletions(-) diff --git a/res/scoreboard.js b/res/scoreboard.js index 6edd635..82bdb5f 100644 --- a/res/scoreboard.js +++ b/res/scoreboard.js @@ -28,10 +28,10 @@ longnames = false; tenths = true; /* State names */ -var SETUP = 0; // !P 30:00 !J 2:00 -var JAM = 1; // P J 2:00 -var LINEUP = 2; // P J 1:00 -var TIMEOUT = 3; // !P J 1:00 +var SETUP = 0; // !P 30:00 !J 2:00 +var JAM = 1; // P J 2:00 +var LINEUP = 2; // P J 1:00 +var TIMEOUT = 3; // !P J 1:00 var periodtext = ["Period 1", "Halftime", "Period 2", "Break"]; var jamtext = ["Jam", "Lineup", "Timeout", "Setup"]; @@ -42,148 +42,148 @@ var state = SETUP; var timer_updates = []; function update() { - for (var i in timer_updates) { - var u = timer_updates[i]; + for (var i in timer_updates) { + var u = timer_updates[i]; - u(); - } + 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 startTime; - var running = false; - var set_duration = 0; - var duration = 0; - var className; + var startTime; + var running = false; + var set_duration = 0; + var duration = 0; + var className; - // Re-calculate and update displayed time - function refresh () { - var remain = element.remaining(); - var min = Math.floor(Math.abs(remain / 60000)); - var sec = (Math.floor(Math.abs(remain / 100)) / 10) % 60; + // Re-calculate and update displayed time + 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 ((! className) && (remain <= 20000)) { - element.className += " lowtime"; - } - if (! running) { - element.className += " paused"; - } + // Set classes + element.className = className; + if ((! className) && (remain <= 20000)) { + element.className += " lowtime"; + } + if (! running) { + element.className += " paused"; + } - // Has the timer run out? - if ((set_duration > 0) && (remain <= 0)) { - duration = 0; - sec = 0; - running = false; - if (callback) { - callback(); - } - } + // Has the timer run out? + if ((set_duration > 0) && (remain <= 0)) { + duration = 0; + sec = 0; + running = false; + if (callback) { + callback(); + } + } - // .toFixed() rounds, we want to truncate - if (! tenths) { - sec = Math.floor(sec); - } else { - sec = sec.toFixed(1); - } - // Zero-pad - if (sec < 10) { - sec = "0" + sec; - } + // .toFixed() rounds, we want to truncate + if (! tenths) { + sec = Math.floor(sec); + } else { + sec = sec.toFixed(1); + } + // Zero-pad + if (sec < 10) { + sec = "0" + sec; + } - var t = min + ":" + sec; - if (t != element.innerHTML) { - element.innerHTML = t; - } - } + var t = min + ":" + sec; + if (t != element.innerHTML) { + element.innerHTML = t; + } + } - // Return remaining time in milliseconds - element.remaining = function() { - if (running) { - var now = (new Date()).getTime(); - return duration - (now - startTime); - } else { - return duration; - } - } + // Return remaining time in milliseconds + element.remaining = function() { + if (running) { + var now = (new Date()).getTime(); + return duration - (now - startTime); + } else { + return duration; + } + } - // Set timer to [d] milliseconds. - // Put element into class [cn], if set. - element.set = function(t, cn) { - startTime = (new Date()).getTime(); - set_duration = t; - duration = t; - className = cn; - refresh(); - } + // Set timer to [d] milliseconds. + // Put element into class [cn], if set. + element.set = function(t, cn) { + startTime = (new Date()).getTime(); + set_duration = t; + duration = t; + className = cn; + refresh(); + } - // Start timer - element.start = function() { - if (! running) { - startTime = (new Date()).getTime(); - running = true; - } - refresh(); - } + // Start timer + element.start = function() { + if (! running) { + startTime = (new Date()).getTime(); + running = true; + } + refresh(); + } - // Stop timer - element.stop = function() { - if (running) { - duration = element.remaining(); - running = false; - } - refresh(); - } + // Stop timer + element.stop = function() { + if (running) { + duration = element.remaining(); + running = false; + } + refresh(); + } - timer_updates.push(refresh); + timer_updates.push(refresh); } // Transition state machine based on state function transition(newstate) { - var jt = e("jam"); - var pt = e("period"); - var jtext = e("jamtext"); - var jno = e("jamno"); + var jt = e("jam"); + var pt = e("period"); + var jtext = e("jamtext"); + var jno = e("jamno"); - if ((newstate === undefined) || (newstate == state)) { - return; - } + if ((newstate === undefined) || (newstate == state)) { + return; + } - if ((state == SETUP) && window.penalties) { - penalties_duck(); - } + if ((state == SETUP) && window.penalties) { + penalties_duck(); + } - state = newstate; + state = newstate; - if (state == JAM) { - pt.start(); - jt.set(120000); - jt.start(); - jtext.innerHTML = jamtext[0]; - jamno += 1; - jno.innerHTML = jamno; - } else if (state == LINEUP) { - pt.start(); - jt.set(30000, "lineup"); - jt.start(); - jtext.innerHTML = jamtext[1]; - } else if (state == TIMEOUT) { - pt.stop(); - if (pt.remaining() <= 0) { - pt.set(1800000); - } - jt.set(0, "timeout"); - jt.start(); - jtext.innerHTML = jamtext[2]; - } + if (state == JAM) { + pt.start(); + jt.set(120000); + jt.start(); + jtext.innerHTML = jamtext[0]; + jamno += 1; + jno.innerHTML = jamno; + } else if (state == LINEUP) { + pt.start(); + jt.set(30000, "lineup"); + jt.start(); + jtext.innerHTML = jamtext[1]; + } else if (state == TIMEOUT) { + pt.stop(); + if (pt.remaining() <= 0) { + pt.set(1800000); + } + jt.set(0, "timeout"); + jt.start(); + jtext.innerHTML = jamtext[2]; + } - // Reset lead jammer indicators - e("jammer-a").className = ""; - e("jammer-b").className = ""; + // Reset lead jammer indicators + e("jammer-a").className = ""; + e("jammer-b").className = ""; } @@ -213,32 +213,32 @@ function notice_expire() { } function notice(n) { - var c = document.getElementById("notice"); + var c = document.getElementById("notice"); - c.style.display = "block"; - if (notices[n]) { - c.innerHTML = notices[n]; - clearTimeout(notice_timer); - notice_timer = setTimeout(function() {notice_expire()}, 8000); - } else { - notice_expire(); - } + c.style.display = "block"; + if (notices[n]) { + c.innerHTML = notices[n]; + clearTimeout(notice_timer); + notice_timer = setTimeout(function() {notice_expire()}, 8000); + } else { + notice_expire(); + } } function e(id) { - ret = document.getElementById(id); - if (! ret) { - return Array(); - } - return ret; + ret = document.getElementById(id); + if (! ret) { + return Array(); + } + return ret; } function score(team, points) { - var te = document.getElementById("score-" + team); - var ts = Number(te.innerHTML); + var te = document.getElementById("score-" + team); + var ts = Number(te.innerHTML); - ts += points; - te.innerHTML = ts; + ts += points; + te.innerHTML = ts; } /*********************************** @@ -248,131 +248,158 @@ function score(team, points) { var logo = {a:-1, b:-1}; function leadJammer(team) { - tgt = e("jammer-" + team); - var on = ! tgt.className; + tgt = e("jammer-" + team); + var on = ! tgt.className; - e("jammer-a").className = ""; - e("jammer-b").className = ""; - if (on) tgt.className = "lead"; + e("jammer-a").className = ""; + e("jammer-b").className = ""; + if (on) tgt.className = "lead"; } function handle(event) { - var tgt = event.target || window.event.srcElement; - var team = tgt.id.substr(tgt.id.length - 1); - var adj = event.shiftKey?-1:1; - var mod = (event.ctrlKey || event.altKey); - var newstate; + var tgt = event.target || window.event.srcElement; + var team = tgt.id.substr(tgt.id.length - 1); + var adj = event.shiftKey?-1:1; + var mod = (event.ctrlKey || event.altKey); + var newstate; - switch (tgt.id) { - case "logo-a": - case "logo-b": - if (state == SETUP) { - if (true) { - var t, name; + switch (tgt.id) { + case "logo-a": + case "logo-b": + if (state == SETUP) { + if (true) { + var t, name; - logo[team] = (teams.length + logo[team] + adj) % teams.length; - t = teams[logo[team]]; + logo[team] = (teams.length + logo[team] + adj) % teams.length; + t = teams[logo[team]]; - if (longnames) { - name = t[2]; - } else { - name = t[0]; - } + if (longnames) { + name = t[2]; + } else { + name = t[0]; + } - e("name-" + team).innerHTML = name; - tgt.src = "logos/" + t[1]; + e("name-" + team).innerHTML = name; + tgt.src = "logos/" + t[1]; - if (window.penalties) { - penalties_setTeamName(team, t[0]); - } - } - } else { - score(team, -adj); - } - break; - case "jammer-a": - case "jammer-b": - leadJammer(team); - break; - case "timeouts-a": - case "timeouts-b": - // Allow for timeouts > 3 - var v = Number(tgt.innerHTML); + if (window.penalties) { + penalties_setTeamName(team, t[0]); + } + } + } else { + score(team, -adj); + } + break; + case "jammer-a": + case "jammer-b": + leadJammer(team); + break; + case "timeouts-a": + case "timeouts-b": + // Allow for timeouts > 3 + var v = Number(tgt.innerHTML); - v -= adj; - if (v == -1) v = 3; - tgt.innerHTML = v; - break; - case "period": - if ((state == SETUP) || (state == TIMEOUT)) { - // Nothin' - } else { - newstate = TIMEOUT; - } - break; - case "periodtext": - var pt; + v -= adj; + if (v == -1) v = 3; + tgt.innerHTML = v; + break; + case "period": + if ((state == SETUP) || (state == TIMEOUT)) { + // Nothin' + } else { + newstate = TIMEOUT; + } + break; + case "periodtext": + var pt; - if (mod) { - pt = prompt("Enter new period indicator text", tgt.innerHTML); - } else { - var ptl = periodtext.length; + if (mod) { + pt = prompt("Enter new period indicator text", tgt.innerHTML); + } else { + var ptl = periodtext.length; - period = (period + ptl + adj) % ptl; - pt = periodtext[period]; - } - if (pt) { - tgt.innerHTML = pt; - if (state == TIMEOUT) { - jamno = 0; - e("jamno").innerHTML = jamno; - } - } - break; - case "jam": - if (state == JAM) { - newstate = LINEUP; - } else { - newstate = JAM; - } - break; - case "jamno": - jamno -= adj; - tgt.innerHTML = jamno; - break; - case "score-a": - case "score-b": - if (state == SETUP) { - var s = prompt("Enter score for team " + team, tgt.innerHTML); - if (s) { - tgt.innerHTML = s; - } - } else { - score(team, adj); - } - break; - } - transition(newstate); + period = (period + ptl + adj) % ptl; + pt = periodtext[period]; + } + if (pt) { + tgt.innerHTML = pt; + if (state == TIMEOUT) { + jamno = 0; + e("jamno").innerHTML = jamno; + } + } + break; + case "jam": + if (state == JAM) { + newstate = LINEUP; + } else { + newstate = JAM; + } + break; + case "jamno": + jamno -= adj; + tgt.innerHTML = jamno; + break; + case "score-a": + case "score-b": + if (state == SETUP) { + var s = prompt("Enter score for team " + team, tgt.innerHTML); + if (s) { + tgt.innerHTML = s; + } + } else { + score(team, adj); + } + break; + } + transition(newstate); } function key(event) { - var e = event || window.event; - var c; - var newstate; + var e = event || window.event; + var k = e.which || e.keyCode || 0; + var c; + var newstate; - switch (e.keyCode) { + switch (k) { + case 32: + c = " "; + break; case 38: c = "up"; break; case 40: c = "down"; break; + case 188: + c = ","; + break; + case 190: + c = "."; + break; + case 221: + c = e.shiftKey ? "}" : "]"; + break; + case 219: + c = e.shiftKey ? "{" : "["; + break; default: - c = String.fromCharCode(e.which || e.keyCode || 0); + if ((k >= 48) && (k <= 90)) { + c = String.fromCharCode(k); + if (! e.shiftKey) { + c = c.toLowerCase(); + } + } else { + c = null; + } break; } - switch (c) { + bige = e; + + console.log("Key " + k + " pressed: " + c + " === " + e.which); + + switch (c) { case "up": if ((state == TIMEOUT) || (state == SETUP)) { var pt = document.getElementById("period"); @@ -387,59 +414,59 @@ function key(event) { pt.set(rem - 1000); } break; - case " ": - if (state == JAM) { - newstate = LINEUP; - } else { - newstate = JAM; - } - break; - case "t": - newstate = TIMEOUT; - break; - case "a": - case "[": - score('a', 1); - break; - case "b": - case "]": - score('b', 1); - break; - case "A": - case "{": - score('a', -1); - break; - case "B": - case "}": - score('b', -1); - break; - case ",": - leadJammer('a'); - break; - case ".": - leadJammer('b'); - break; - case "1": - case "2": - case "3": - case "4": - case "5": - case "6": - case "7": - case "8": - case "9": - case "0": - var n = Number(c); + case " ": + if (state == JAM) { + newstate = LINEUP; + } else { + newstate = JAM; + } + break; + case "t": + newstate = TIMEOUT; + break; + case "a": + case "[": + score('a', 1); + break; + case "b": + case "]": + score('b', 1); + break; + case "A": + case "{": + score('a', -1); + break; + case "B": + case "}": + score('b', -1); + break; + case ",": + leadJammer('a'); + break; + case ".": + leadJammer('b'); + break; + case "1": + case "2": + case "3": + case "4": + case "5": + case "6": + case "7": + case "8": + case "9": + case "0": + var n = Number(c); - window.notice(n); - } + window.notice(n); + } - transition(newstate); + transition(newstate); } function save() { - chrome.storage.sync.set( + chrome.storage.local.set( { "period_clock": e("period").remaining(), "name_a": e("name-a").innerHTML, @@ -455,21 +482,21 @@ function save() { } ); } - + function iecheck() { - // If it's IE, it's got to be at least 7 - var ua = navigator.userAgent; - var ie = ua.indexOf("MSIE "); + // If it's IE, it's got to be at least 7 + var ua = navigator.userAgent; + var ie = ua.indexOf("MSIE "); - if (ie == -1) { - // Not IE - return; - } else { - var n = parseFloat(ua.substring(ie + 5, ua.indexOf(";", ie))); - if (n < 7) { - alert("Your browser is too old to run the Woozle scoreboard.\nYou can use Firefox, Chrome, Opera, or Internet Explorer 7 and up."); - } - } + if (ie == -1) { + // Not IE + return; + } else { + var n = parseFloat(ua.substring(ie + 5, ua.indexOf(";", ie))); + if (n < 7) { + alert("Your browser is too old to run the Woozle scoreboard.\nYou can use Firefox, Chrome, Opera, or Internet Explorer 7 and up."); + } + } } function ei(name) { @@ -481,12 +508,12 @@ function ei(name) { } function start() { - resize(); - iecheck(); + resize(); + iecheck(); - var p = document.getElementById("period"); - var j = document.getElementById("jam"); - var c; + var p = document.getElementById("period"); + var j = document.getElementById("jam"); + var c; // XXX: I think, instead of null, you can pass in a dictionary of defaults function load(state) { @@ -505,51 +532,51 @@ function start() { startTimer(p); p.set(c); } - chrome.storage.sync.get(null, load); + chrome.storage.local.get(null, load); - ei("jammer-a"); - ei("jammer-b"); - ei("period"); - ei("jam"); - - ei("periodtext").innerHTML = periodtext[period]; - ei("jamtext").innerHTML = jamtext[3]; - transition(); + ei("jammer-a"); + ei("jammer-b"); + ei("period"); + ei("jam"); + + ei("periodtext").innerHTML = periodtext[period]; + ei("jamtext").innerHTML = jamtext[3]; + transition(); - startTimer(j, window.tenths); - j.set(120000); + startTimer(j, window.tenths); + j.set(120000); - save_timer = setInterval(save, 1000); - update_itimer = setInterval(update, 33); + save_timer = setInterval(save, 10000); // Every 10 seconds + update_itimer = setInterval(update, 33); } function resize() { - var b = document.getElementsByTagName("body")[0]; - var w, h; - - // Internet Explorer makes everything a pain in the ass - if (window.innerWidth) { - w = window.innerWidth; - h = window.innerHeight; - } else if (document.documentElement && document.documentElement.clientWidth) { - w = document.documentElement.clientWidth; - h = document.documentElement.clientHeight; - } else if (document.body) { - w = document.body.clientWidth; - h = document.body.clientHeight; - } else { - // Punt - w = 800; - h = 600; - } + var b = document.getElementsByTagName("body")[0]; + var w, h; + + // Internet Explorer makes everything a pain in the ass + if (window.innerWidth) { + w = window.innerWidth; + h = window.innerHeight; + } else if (document.documentElement && document.documentElement.clientWidth) { + w = document.documentElement.clientWidth; + h = document.documentElement.clientHeight; + } else if (document.body) { + w = document.body.clientWidth; + h = document.body.clientHeight; + } else { + // Punt + w = 800; + h = 600; + } - w /= 7; - h /= 5; + w /= 7; + h /= 5; - var fs = Math.min(w, h); + var fs = Math.min(w, h); - b.style.fontSize = fs + 'px'; + b.style.fontSize = fs + 'px'; } window.onload = start; From 7c364ea4395c9d96d36512c6271497faf93ce2de Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Tue, 5 Nov 2013 20:49:14 -0700 Subject: [PATCH 04/29] Gussy up icon --- manifest.json | 1 + res/hellokitty.svg | 160 --------------------------------------------- res/icon.png | Bin 16085 -> 6153 bytes res/kitty.svg | 157 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 158 insertions(+), 160 deletions(-) delete mode 100644 res/hellokitty.svg create mode 100644 res/kitty.svg diff --git a/manifest.json b/manifest.json index a197a10..643b7e0 100644 --- a/manifest.json +++ b/manifest.json @@ -1,3 +1,4 @@ +// This file is used by the chrome app distribution { "name": "LADD Scoreboard", "description": "Roller Derby Scoreboard", diff --git a/res/hellokitty.svg b/res/hellokitty.svg deleted file mode 100644 index 75b6569..0000000 --- a/res/hellokitty.svg +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/res/icon.png b/res/icon.png index 71ca7f4c34f01fdd8c44103e3a12140a3764199f..d727820815e84d82fdce56a49a666002cacf541a 100644 GIT binary patch literal 6153 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 + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + From e85a1d084cf77a57814e78a249e6818ae1a9829a Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Sat, 18 Jan 2014 21:53:52 -0700 Subject: [PATCH 05/29] Start to really make this a Chrome app --- TODO | 2 + _locales/en/messages.json | 44 ++++++++++++ manifest.json | 24 ++++--- res/close-icon-white.png | Bin 0 -> 8267 bytes res/scoreboard.css | 18 ++++- res/scoreboard.js | 140 ++++++++++++++++---------------------- scoreboard.html | 4 ++ 7 files changed, 139 insertions(+), 93 deletions(-) create mode 100644 TODO create mode 100644 _locales/en/messages.json create mode 100644 res/close-icon-white.png diff --git a/TODO b/TODO new file mode 100644 index 0000000..3d5b07c --- /dev/null +++ b/TODO @@ -0,0 +1,2 @@ +* use chrome.mediaGalleries to load logos +* use chrome.power to keep the display on diff --git a/_locales/en/messages.json b/_locales/en/messages.json new file mode 100644 index 0000000..3fec056 --- /dev/null +++ b/_locales/en/messages.json @@ -0,0 +1,44 @@ +{ + "appName": { + "message": "LADD Scoreboard", + "description": "Application name" + }, + "appDesc": { + "message": "Roller Derby Scoreboard", + "description": "Application description" + }, + + "period1": { + "message": "Period 1", + "description": "Name of first period" + }, + "period2": { + "message": "Period 2", + "description": "Name of second period" + }, + "halftime": { + "message": "Halftime", + "description": "The name of the break between periods" + }, + "timeToGame": { + "message": "To Derby", + "description": "Text shown after countdown to start of game" + }, + + "jam": { + "message": "Jam", + "description": "Time during the game when skaters are actively playing" + }, + "lineup": { + "message": "Lineup", + "description": "Time between active play, when skaters are positioning themselves" + }, + "timeout": { + "message": "Timeout", + "description": "Time when game is suspended: period clock stops counting down" + }, + "setup": { + "message": "Setup", + "description": "Software state allowing logos and times to be adjusted" + } +} \ No newline at end of file diff --git a/manifest.json b/manifest.json index 643b7e0..a124d97 100644 --- a/manifest.json +++ b/manifest.json @@ -1,17 +1,21 @@ // This file is used by the chrome app distribution { - "name": "LADD Scoreboard", - "description": "Roller Derby Scoreboard", - "version": "5.2", - "manifest_version": 2, - "permissions": [ "storage" ], - "offline_enabled": true, - "icons": { - "128": "res/icon.png" - }, + "version": "6.0", "app": { "background": { "scripts": ["res/background.js"] } - } + }, + "icons": { + "128": "res/icon.png" + }, + "permissions": [ + "storage" + ], + "offline_enabled": true, + + "name": "__MSG_appName__", + "description": "__MSG_appDesc__", + "default_locale": "en", + "manifest_version": 2 } diff --git a/res/close-icon-white.png b/res/close-icon-white.png new file mode 100644 index 0000000000000000000000000000000000000000..cd78df531313f4ea21d9ab70ad14cc7291f423be GIT binary patch literal 8267 zcma)ihf~wf^ZqM^5+Ib&K|lfty(zs*Z_)*%hK_;=0s>N!P$W`~fPx|*7DOollwJZ# z6$QkC0umA4RB6&eNq&6h_YZvM=4Nkh=JxJ(Zl9gq=kD0sn!{OySO5TkTUwYn0s!cA z2m+WHPle}=mqDk3(a+l41fc(~m3LO=pU%J{EG|a@04w+ZItX}JB5*p%6m5CYlxc<$ z!NSYh_9dnc0K_IOO)fac{rvklA^XAC;sJx;bHz4;(dWdY?{nTqrE#t}S~G`^H*oXG zn7*Hb^M-zX^)_-f=32~ORE|o&&>#12>utkL-&n1=WCE}8UVlj-5bis6)PKp1F3GhZ z<~p4jh%7z%Q{r>N%Tz=?`8C_xvGMOB8Up*BG#gdAm{2+uFKRE%!;)_FEKjGQYjPu_0)tT83r`IY#Tvs59du0VqB5shvYB20WjBZQg#;j~3CT4{h7XQ@FdQ>ZvcJ)}F&UaII5y)1 zwrBJCEsVQkJD$gw8$GNabT?l|J^BH$*M*{G&Q|yOc{#LP^8kj0Do@B9JFEv>XIw$h zJMia1ea~;Qkwhn}_)-vt4!m8zWcD4%k!0QApWhb^e`gpmpO9C{sbpg^U%3bD0_^NY z<*^%vFM?%^@y*gOK;n->xGh(wDxx4LT!%DGvvQ4fX2Zp+(70lPNEX6$s=RP|U;;a< z_WU}K3;G25PaE51>l!p!Yg8GZ z?B%a02k_>TgB&uLg1|5~b+~YS)0+gQS*pMKNuY490HYI4qMkVK z|7Chq;Se7~4(u;-jnOIqIEj1|zs1$i1#gwHR5;?7Z}zeaSo+1>ci*Q+8h#VEgl3fZ z7;!n|uagOk5G$b1fyPDFAmR1l+q}XF_(wRboL?B3$DS&MSse^suBwyHg6o14KMG7d zf!?+2yAFH;!uxLyU6N)u;g1m9Y^>nnEKZTevNoNaH&X4b(^NggVVP>>jBsN-hE%Eh z#m6jt_VwRdq3zqp#277CT0HsPtK&=-WsW#!lb;2^XQ$&^T&+A)0giHqJcWLUO&r0K zqOJ9s^)7BZFM>vU9#Y^#gdgHJAm0~jwg^MT+j+hB|CKsK;Q#)4+M3*XyxY-T+AzD( zhNZ*SN>b4K6WKMH@*fdlJwdjazaYN{$c6nyNmjs?3_Xrw8y4f^h3Dy1t!@;FV@Ozj zF5*G?{MWXw>o;F(%bP39l`x%05fw*No||`vG}l@hDmdQ(P2QB(@m2iFS`M^3WZ5;g zPF;V4n;qZ&Oupc+YtNrPO7o75Y8WTJGoiSJkz%x|-A?s_nkWuQ%#HG6Cz7$`Hs9K6 zEc%$eaxKq4^xM99m)ONg?>l9&Y0BfRJn^g*oh&7o>>pK7PTR>B{t_pDq5}MG0(n}F zQ}+%7&S(f;5h4w88I|6Cwia=pd=mxGQ`ES1RL~s5vpFIeZ^3cr>UNiM+5Xc!S7dqo z^izfv*ymh-m;-n$AKOxS;!?S@4-qkK&G`?U{Ri)apQum0w1SYrODcf!%QtO6q84t{ zeVufllxr@Rm-d`<*?{hF;J z7m^dheyXT-uq5iE_&-TXp5exQefD5w6}%1!XY&5K_a$RyQF{^LIq#YFr8Zou5UF~H zxlelW->B8vd%6lqb=TR!5LuKa(st{nA776B&L0K;9SuVi?dz0k(%;!9p!jd})@|GbJSOsKM^x{=C2dl~a^ECF<)$LnZ zW8ZK4lnw^bFPLSk!DVJEWI7+l6)$z;a{R|j7i4dT%<1vA*3k1P*ujIYnd za~(xr&m63J_%q8rdBt>Io-1B%j%Vvin-kOi5nW)pUk`;eUs6O#SUZ`{{~(+<^N)Ez zyYGYiUnP-MMOy*@{ zr2e8m#=S6T z{QA^hGJ>d+4g2za-_JrrK;w8Jd;rJWT5z#mB-u}TDA6#UFd=AFqcJMnt47Mnt!$gzpBqMFIGG1n=s z#VBM{)CB-}4&3sP^iGTkC+24!CBu`^YgZ5PG77rAf(yM78R%y6Df{gA!!&|wRhZmu z=|+Xx0nCzcm5ZP9%zxf$+LyagWrB)+2}<-lmzIE zop*MBDwfc*7!0z@*ADC4=Ls8HoCW(&Gj1?w;~(J6akU+Jtg&D{#v;hEp0bb*@P?W7H?^dDY{J>s-3o8>14dn%>e zKO;-C;GzZxyL0rRjvo`IWs%&*ykV_}xUcxYxWIccAmj~a3g5@;x3A92ApJdKE+ zSo%7qspC9ZBd?}+KtxuQeSyi9#Ao+CPN5W5&xdS~E%!7iGqJHS`Hw;Vn3_t+=AcOY zT9K*UvLBJ86wqbtLL*Z*)^HzI(jI#6dMiwqxyw_u(&Ua?-w8~tQ;W?hm5-f7l=)kv z%wowgjh7kU#Jgwx!@)`oqL?CL%TeLbt}|*N!XOmmQqHgfUEh)4dCqR$l@g6Yxbbqs zG+zhgNG&Km;cXeI z%xk?omdyhO+=l8hJB4QWK@S~zujYe2=L$X@&ljZ86fmKYi=3X>()uJ40)KhzU$3`k zoYNwdr%=Dg7|bwzTj9@MjyA^kzKh*`K5`2#C8Ap;$Q-vQYVB6w2Yw2crVHfh(|=dn z&Q7xH3M?f|HN0t9J;&G2nS6zVBsmt8wjS=839H@|9_bD)F}T&q42TKjK)}+Cu0MP)(=w9yx~N(6s!zcR``>-9iRsM3Epy z{18$~qZj}&(j(ye-_M~biL}Br*g;5?_f?m48+R5Mdr424O(0^B!VS-S=d+h@Y$KWu}E5(NvygX8fv zeCV$RT0L3G-#Nc`!)Mgkq7DGBnGHsNW0nS*99i$DiiZ2@$@A#m-W z?nI10K4zM{Q^S_U+bEXo?@Dt47##DcqZLKrws{K1=o1&}W_sErovCdb_ zruIQgM!S)q1u=jo+@jR5e~W8r?|6joRR`N81yI^1y;;z|LY5qvyu?d3n;RI&Oh;@} zd)VQv=q8ZtC-|fwx$`KD6CBYsPymFUm}EOH_ggBUZ35j;D)_+KscWxws804Y1@Z$4 z(SLgZxM16w7oz1ttQa0&ML%7>*U>`$+9Y0g55!r#)}))&h^hX92gTGVY5NQ7`+F&@w^{V5V z1*O2m53Evrl7-l$GQG16tAA*h{rU}(Mq-NTbC?tfGclk0$Wj4JQ1!I}b~pF(GeNPvFFHj#QEj6FgwXlW)N7;2NFGi&Z^)OVKPXGt-#Mt6mBhkO}KO_PZh5XDHn9XxvF#k#~VXI@b)7ao^LSDDZ5C zOP(Eg^V%;petW8U{->7O)S+)A^ZZ5TuE3^QDbPXfjjOUn+s%HJdv8!QnRh}LYxxW> zEqy!>dc!laXyF9_$O#SzPC- z&Sr)&Bir*JTdI@b_+wt!2*@SN!rNcxBWOOxt`vsh(PD#Yml?c8mQ|14hO_-QE+POs zpw%`fA;?pu2DQb?HG`ow#~)6^GRN%>KGqx#O2e(UfYJ2k!vcu~v7DT}W{0o>e%1vU zG^de^&guJ0z;PTq=O)tB7!0UP68KA6NIYjl+XpF7G^KlWIqi!RUh!+Qkfzlx&A-T$ zJu}@CPL3PR`@8oSyaVp?(9L;=y^0Dg!)irjuN;c|gRA&i)f|5p)yj@p;v6Z8D4g%( z<9Ma*A(rQUPn;F-XxTGgE;F=kda_Js(G4-yK+wnGMW3o+1Nq_-CV4wmv@(b;h_ltW zKg|IW@MpxiLgd3e{DuvL;tW61G8OPVkkm%7?!WI}Nj3W!E_nY_mvk)$bzd#K67Q#i z=RDV@2L-K>v1m*XOEIniDW-PRm<4--CT&Q7Ig>dqJzID!j+;5)faXG9peg?<9p@X< z58C0C&hn}dy6bnHDx`!f9JCh6v7hsUD2J8hPf!O2AUG~Z~}H<{@0x<8@}jb z11PQt%EwC_a(#T%&#6smbl`>)p*HCQP}zNcDZ7X|7w(%{na-cOK75 zz<%mQ$8N{6`Heq6_ppP#g-27RVgF$+U2b*8nFtz80lZO$3Ce3PtKEvQJewEiHr$+r z#%E%fn-vSk=T8d`#6Ae0<8Rz2*)fJSHZ!2VNEG9N>njy=s9L&A=7JTSRI&w{#2P&v zs)SUU-C)k{dm)$P->C9JNdTm&%T0MVzU_9F7~`^U%vxbm+{t$zoS2X(`_V3H{x z>Cx|{=v&5H)C>V`%}-ob+030xQrs{6cYj{preAgk01gKC<39Yqo~IJKRQ}*6$4qz0 z%fxIzQ8`M6|Z+gC}FVjBaWEC1Rp1^=dVfIQT)}uh&ni-K5p6&(4e5h}&Eo z?y4Ttlmkz)hOx~X*x(Ug2mUdo9P`5H`5YGsZjj1bGAcdxg`bb<#tX4P;v}MJ5!XMUdKZ0f_BRSErE8@!VB>T_p@@8E#?Bc z_19;Iug>Cc&Pns#`n(UBS;qR2^)?8(K#4F3Jyww|Ze#ij-TTF`V1(B9cISV#V!kZ@ zg-cp=>ryZDG)Gdq{EU9p7X(zlqj%u8-EbQ>M#3rez--%T+dsq<>~L*veSLdzbR?5Wxw+t*^)UvAzuvOA&T6FwTxAc8oVzeZyj9ZT4x9! z+EzW2vi-ev!oc}&kAxz#uoOshI-TAQLM7_qcuDY<(Z*A-4`8;JkJe~XsjsRrDQlh+pE`s`Pp z)WTcrH|`8(1GBouCcmo2HT23HuP1T|$|1X}#@#yDBCdod1%gw6Jt<3}*E}{Wc|D^JH%T^9@`(;|+XZ!Ezrq6na z6c(=dSi*m_P~>)!baHk$)W9wUvGY9q9$L+}SF5&#ZutleegMCvIrtpEfF%+s_Ll&kb=o3<`|gqO`b+ zvZ!@_2+Lk(q(P?0$~^r*v$?LV6<67|2E-a7hZTzmtx+%%`^dH~bqxL4I(Y#RBl|1! zoitWt)2p}nF_!DV)SGX2gnWf3l1h!2oy&YTxH6=;Es7A!90ZHahUzL@)!PKCA8;e; zAZ4-N-FP!03(@B`rD++7X9)2ABJ9rAStWFRyIQQmo_>^t4RAk1*D#W^o8H7+(EUtq z{x)z%^!L+=2nA#9qSAq9(zfax68`ZM;sZ0yy0cGFnoDB zrl@qWuQv8;yb48+tJPis-z!I7z*~R&5NW->F#dI@TW~0)TMk(%3*&L2j^?~a@^VqH z5t2E6G0X}ya<>$2f-d0D{0GI)WgRp}nC^4Fc)O2ZVhU#;r+iI2aChaPL4B>$K8&X; zv`)Xe3R zeXkwURi_ffy_re~@CR>_LQkHl;1dszS*M4@vbH&Z@BDjXT*Pled%3S)ES4}b{;ND* z44ST0VAYjEDwxieFc^mw{npWmc=F0Nynwzk7wWylmZ|1^Z*R-kqw>i#eEzjV00$y2~gl9eL-7wUxJ-53Be}s6F=i;}@ z^!`(t(=&1FeB_dO{7ZoelbPo|8tZe+UifXRn$|Y!@uMT3>Iz6bN7lCIOjYW2%u~WN zYHQB!Q>@cJ1>1ajKQm-_q2;2Z;0AAmgvax}#)VfgFi`|Cvdv?Ba0JQ~kMvu0cyAjg zRMoDw6Gz@ag?Gr@WU=pDcT?875~0xXE7Q{@`E@dVQ)Az`DzPDV)cLpL%=Fo9mCI|C zyZaIkh_P?^0~bJ#H!OtWj7=23PU19t=)zoHG6p5>ajom_G3Z~PO)Mx7*AL3Zv9&?l zV`!w3$@;3;B*ob4J(~a>WXZJA8nWRw(>W4=DIrW3<63=^x0URA{#QyRhhWt1eqR2G zf1DY8onXch?~q7Iq!?kMjp}HUq(Om3bJ*E;<#`hLp*urcij;7Qd4JK(ORM64cO@xu zmz7-fHn#3fB=?m^7Yh^SHnZBh=pCEMe{s#wy-iY#3kCP_f9$8x|08LYy|2eX#>Vo zc89Fm|VXdz!g(LVXTFH;^JF zy00Qe-SO&`JB@@&nc%m>*jyF#&=q}jBz`y*WuKcYWzV6lv1sZ)()E5nghv_f#ykS) z=O*z#FFn>m;!55_*>8Je#7MkTMoA(hwY?&I`(Jh5BKVoC$ILU}`M-Rg_w=#r%w*UM z7g_eRH5WU7g6A|PGE9leZqC!$b*G2Am9rjPa(+24hL-s2dgnEWt)xT#H#b1!i!;2UufZ90v*btm@4PthK)LX1AY>FWxY)fVvETSSsQ*qa^ptr zP@_Hqr^|JO+*stxCztve`P!}dQY2Et_a`77tI4SsJCk~4Zsa@daRo{xvW{7`$+T5R zh;8obGF-X%>*ipNNIOFdkdAE6r)QAW`ioBD4@uK+QR@9WfDcpGs;z!{h0qQ#3#}b_ zw7vKlEZqoQA)%f(bB;<&o4SX@qUoveCx-d^B0NNyNeU&pFt|^d1QK4GA};2QoCF{q zRO*R(U=7M|)M&CD;&pK8@vbx@Hz4r7p@h0}oL--$hs^Da&QG)5-vuUI(>T;kr+gO? z@(j7MDGbj95R4^5^smU0!}J><_Bli%=l~?P(8JqjsP@Js z-wpM_a!1@z`Onmg9fgBfmcv>ETGEcaloYjZ`eyagJ_tPJtvDsfBvbB?zmkh5tyMCk z$Klhg)6YJ-6#}=7!MkLYNgam9uL>6ICu9k74EetbMrr}@N-D(+qkl@zH5uMHn`}Tg zZT89IeO_)3Bj=e$JdA?p8lGpYf5I_Uwa7?Wyfr5W`jW}~5a(3ynyco|nNiiv@Ti9x zFIu-I3wmz}{YXATL596vW%T0RkfLd?9rsCji7}@m4DSl`M2D?xnxIl1KINZ!xT+pD z6}`Jv2vmrtepa12PdeEsWNXm*8w>t`D--b7jRnWKHpugxxu zBq~rGz!te|XsvT@glm_7RlL4ovDWuV-wjgz!TRVL3P7bWhH;$4lPxEaPtCjpfj$3? zKXv_l8*8$MUjk6L@JpGZB zGx=NU&&-CMcCWyK9~>21v2%TudZ4x_x@P+D#J07)o{QS~DRCCku~2Xlv){gRJ>l)1 k_y3U~|Nm6_RRWz!pz6oA6$bvlzXE`zsjW$^5hmsT0rB@YbpQYW literal 0 HcmV?d00001 diff --git a/res/scoreboard.css b/res/scoreboard.css index cfb63f7..276a392 100644 --- a/res/scoreboard.css +++ b/res/scoreboard.css @@ -106,8 +106,8 @@ body { position: absolute; bottom: 0em; left: 50%; - width: 4em; - margin-left: -2em; + width: 3em; + margin-left: -1.5em; } #jamtext, #periodtext { @@ -174,6 +174,20 @@ body { background: #060; } +#close, #prefs { + position: absolute; + top: 0; + right: 0; + height: 16px; + width: 16px; + opacity: 0.5; + cursor: crosshair; +} + +#prefs { + top: inherit; + bottom: 0; +} /* * Notices diff --git a/res/scoreboard.js b/res/scoreboard.js index 82bdb5f..698ea6a 100644 --- a/res/scoreboard.js +++ b/res/scoreboard.js @@ -24,8 +24,15 @@ * change in this file. */ -longnames = false; -tenths = true; +/* Tunables */ +jam_time = 120000; +lineup_time = 30000; +period_time = 1800000; +var presets = { + "WFTDA": [1800, 120, 30], + "USARS": [1800, 90, 30], + "MADE": [900, 90, 30] +} /* State names */ var SETUP = 0; // !P 30:00 !J 2:00 @@ -33,8 +40,18 @@ var JAM = 1; // P J 2:00 var LINEUP = 2; // P J 1:00 var TIMEOUT = 3; // !P J 1:00 -var periodtext = ["Period 1", "Halftime", "Period 2", "Break"]; -var jamtext = ["Jam", "Lineup", "Timeout", "Setup"]; +var periodtext = [ + chrome.i18n.getMessage("timeToGame"), + chrome.i18n.getMessage("period1"), + chrome.i18n.getMessage("halftime"), + chrome.i18n.getMessage("period2") +]; +var jamtext = [ + chrome.i18n.getMessage("jam"), + chrome.i18n.getMessage("lineup"), + chrome.i18n.getMessage("timeout"), + chrome.i18n.getMessage("setup") +]; var period = 0; var jamno = 0; @@ -50,9 +67,8 @@ function update() { } // 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) { +function startTimer(element, callback) { var startTime; var running = false; var set_duration = 0; @@ -61,13 +77,13 @@ function startTimer(element, tenths, callback) { // Re-calculate and update displayed time function refresh () { - var remain = element.remaining(); - var min = Math.floor(Math.abs(remain / 60000)); - var sec = (Math.floor(Math.abs(remain / 100)) / 10) % 60; + var remain = Math.abs(Math.ceil(element.remaining() / 1000)); + var min = Math.floor(remain / 60); + var sec = remain % 60; // Set classes element.className = className; - if ((! className) && (remain <= 20000)) { + if ((! className) && (remain <= 20)) { element.className += " lowtime"; } if (! running) { @@ -84,12 +100,7 @@ function startTimer(element, tenths, callback) { } } - // .toFixed() rounds, we want to truncate - if (! tenths) { - sec = Math.floor(sec); - } else { - sec = sec.toFixed(1); - } + sec = Math.ceil(sec); // Zero-pad if (sec < 10) { sec = "0" + sec; @@ -161,20 +172,20 @@ function transition(newstate) { if (state == JAM) { pt.start(); - jt.set(120000); + jt.set(jam_time); jt.start(); jtext.innerHTML = jamtext[0]; jamno += 1; jno.innerHTML = jamno; } else if (state == LINEUP) { pt.start(); - jt.set(30000, "lineup"); + jt.set(lineup_time, "lineup"); jt.start(); jtext.innerHTML = jamtext[1]; } else if (state == TIMEOUT) { pt.stop(); if (pt.remaining() <= 0) { - pt.set(1800000); + pt.set(period_time); } jt.set(0, "timeout"); jt.start(); @@ -267,24 +278,18 @@ function handle(event) { case "logo-a": case "logo-b": if (state == SETUP) { - if (true) { - var t, name; + var t, name; - logo[team] = (teams.length + logo[team] + adj) % teams.length; - t = teams[logo[team]]; + logo[team] = (teams.length + logo[team] + adj) % teams.length; + t = teams[logo[team]]; - if (longnames) { - name = t[2]; - } else { - name = t[0]; - } + name = t[0]; - e("name-" + team).innerHTML = name; - tgt.src = "logos/" + t[1]; + e("name-" + team).innerHTML = name; + tgt.src = "logos/" + t[1]; - if (window.penalties) { - penalties_setTeamName(team, t[0]); - } + if (window.penalties) { + penalties_setTeamName(team, t[0]); } } else { score(team, -adj); @@ -351,6 +356,12 @@ function handle(event) { score(team, adj); } break; + case "prefs": + chrome.app.window.create("../options.html"); + break; + case "close": + window.close(); + break; } transition(newstate); } @@ -469,36 +480,21 @@ function save() { chrome.storage.local.set( { "period_clock": e("period").remaining(), + + "score_a": e("score-a").innerHTML, + "score_b": e("score-b").innerHTML, "name_a": e("name-a").innerHTML, "name_b": e("name-b").innerHTML, "logo_a": e("logo-a").src, "logo_b": e("logo-b").src, - "score_a": e("score-a").innerHTML, - "score_b": e("score-b").innerHTML, - "timeout_a": e("timeouts-a").innerHTML, - "timeout_b": e("timeouts-b").innerHTML, - "jamno": jamno, - "period": period, + + "period_time": period_time, + "jam_time": jam_time, + "lineup_time": lineup_time, } ); } -function iecheck() { - // If it's IE, it's got to be at least 7 - var ua = navigator.userAgent; - var ie = ua.indexOf("MSIE "); - - if (ie == -1) { - // Not IE - return; - } else { - var n = parseFloat(ua.substring(ie + 5, ua.indexOf(";", ie))); - if (n < 7) { - alert("Your browser is too old to run the Woozle scoreboard.\nYou can use Firefox, Chrome, Opera, or Internet Explorer 7 and up."); - } - } -} - function ei(name) { el = e(name); if (el.addEventListener) { @@ -509,7 +505,6 @@ function ei(name) { function start() { resize(); - iecheck(); var p = document.getElementById("period"); var j = document.getElementById("jam"); @@ -538,45 +533,28 @@ function start() { ei("jammer-b"); ei("period"); ei("jam"); + ei("prefs"); + ei("close"); ei("periodtext").innerHTML = periodtext[period]; ei("jamtext").innerHTML = jamtext[3]; transition(); - startTimer(j, window.tenths); - j.set(120000); + startTimer(j); + j.set(jam_time); save_timer = setInterval(save, 10000); // Every 10 seconds - update_itimer = setInterval(update, 33); + update_itimer = setInterval(update, 200); // 5 times a second } function resize() { - var b = document.getElementsByTagName("body")[0]; var w, h; - // Internet Explorer makes everything a pain in the ass - if (window.innerWidth) { - w = window.innerWidth; - h = window.innerHeight; - } else if (document.documentElement && document.documentElement.clientWidth) { - w = document.documentElement.clientWidth; - h = document.documentElement.clientHeight; - } else if (document.body) { - w = document.body.clientWidth; - h = document.body.clientHeight; - } else { - // Punt - w = 800; - h = 600; - } - - w /= 7; - h /= 5; + w = window.innerWidth / 7; + h = window.innerHeight / 5; - var fs = Math.min(w, h); - - b.style.fontSize = fs + 'px'; + document.body.style.fontSize = Math.min(w, h) + 'px'; } window.onload = start; diff --git a/scoreboard.html b/scoreboard.html index 39ebe22..a44af53 100644 --- a/scoreboard.html +++ b/scoreboard.html @@ -29,6 +29,7 @@ HTML5 says not to use tables for layout. Since this is a highly-styled page, it looks awful without CSS. Sorry. --> +

@@ -54,5 +55,8 @@

+ + + From d3054c4e1dc2183e70ee17c92c0d632375b88eac Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Sat, 18 Jan 2014 23:33:43 -0700 Subject: [PATCH 06/29] Remove prompts, mostly --- TODO | 3 + res/scoreboard.js | 159 ++++++++++++++++++++++++---------------------- scoreboard.html | 33 ++++------ 3 files changed, 100 insertions(+), 95 deletions(-) diff --git a/TODO b/TODO index 3d5b07c..36f93a5 100644 --- a/TODO +++ b/TODO @@ -1,2 +1,5 @@ +* During setup, make period time and scores input fields +* Display clickable timing presets during setup +* A popup logo browser would be nice * use chrome.mediaGalleries to load logos * use chrome.power to keep the display on diff --git a/res/scoreboard.js b/res/scoreboard.js index 698ea6a..497a79e 100644 --- a/res/scoreboard.js +++ b/res/scoreboard.js @@ -1,19 +1,19 @@ /* - * LADD Roller Derby Scoreboard - * Copyright © 2011 Neale Pickett - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + LADD Roller Derby Scoreboard + Copyright © 2014 Neale Pickett + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ /* You can only have one scoreboard per page. This limitation is mostly @@ -24,21 +24,21 @@ * change in this file. */ -/* Tunables */ -jam_time = 120000; -lineup_time = 30000; -period_time = 1800000; -var presets = { - "WFTDA": [1800, 120, 30], - "USARS": [1800, 90, 30], - "MADE": [900, 90, 30] -} +/* Times for various rulesets */ +var presets = [ + ["WFTDA", 1800, 120, 30], + ["USARS", 1800, 90, 30], + ["MADE", 900, 90, 30] +]; +var period_time = presets[0][1] * 1000; +var jam_time = presets[0][2] * 1000; +var lineup_time = presets[0][3] * 1000; /* State names */ -var SETUP = 0; // !P 30:00 !J 2:00 -var JAM = 1; // P J 2:00 -var LINEUP = 2; // P J 1:00 -var TIMEOUT = 3; // !P J 1:00 +var SETUP = 0; +var JAM = 1; +var LINEUP = 2; +var TIMEOUT = 3; var periodtext = [ chrome.i18n.getMessage("timeToGame"), @@ -195,6 +195,8 @@ function transition(newstate) { // Reset lead jammer indicators e("jammer-a").className = ""; e("jammer-b").className = ""; + + save(); } @@ -317,15 +319,10 @@ function handle(event) { break; case "periodtext": var pt; + var ptl = periodtext.length; - if (mod) { - pt = prompt("Enter new period indicator text", tgt.innerHTML); - } else { - var ptl = periodtext.length; - - period = (period + ptl + adj) % ptl; - pt = periodtext[period]; - } + period = (period + ptl + adj) % ptl; + pt = periodtext[period]; if (pt) { tgt.innerHTML = pt; if (state == TIMEOUT) { @@ -348,17 +345,11 @@ function handle(event) { case "score-a": case "score-b": if (state == SETUP) { - var s = prompt("Enter score for team " + team, tgt.innerHTML); - if (s) { - tgt.innerHTML = s; - } + e(tgt.id).innerHTML = 0; } else { score(team, adj); } break; - case "prefs": - chrome.app.window.create("../options.html"); - break; case "close": window.close(); break; @@ -479,22 +470,54 @@ function key(event) { function save() { chrome.storage.local.set( { - "period_clock": e("period").remaining(), - - "score_a": e("score-a").innerHTML, - "score_b": e("score-b").innerHTML, - "name_a": e("name-a").innerHTML, - "name_b": e("name-b").innerHTML, - "logo_a": e("logo-a").src, - "logo_b": e("logo-b").src, - "period_time": period_time, "jam_time": jam_time, "lineup_time": lineup_time, + + "logo_a": e("logo-a").src, + "logo_b": e("logo-b").src, + "score_a": e("score-a").innerHTML, + "score_b": e("score-b").innerHTML, + "timeouts_a": e("timeouts-a").innerHTML, + "timeouts_b": e("timeouts-b").innerHTML, + "period_clock": e("period").remaining(), } ); } + +function load() { + function load_cb(state) { + period_time = state.period_time; + jam_time = state.jam_time; + lineup_time = state.lineup_time; + + e("logo-a").src = state.logo_a; + e("logo-b").src = state.logo_b; + e("score-a").innerHTML = state.score_a; + e("score-b").innerHTML = state.score_b; + e("timeouts-a").innerHTML = state.timeouts_a; + e("timeouts-b").innerHTML = state.timeouts_b; + + var p = e("period"); + startTimer(p); + p.set(state.period_clock); + } + chrome.storage.local.get({ + "period_clock": period_time, + "score_a": 0, + "score_b": 0, + "logo_a": "logos/black.png", + "logo_b": "logos/white.png", + "timeouts_a": 3, + "timeouts_b": 3, + "period_time": period_time, + "jam_time": jam_time, + "lineup_time": lineup_time + }, load_cb); +} + + function ei(name) { el = e(name); if (el.addEventListener) { @@ -505,32 +528,16 @@ function ei(name) { function start() { resize(); + load(); - var p = document.getElementById("period"); - var j = document.getElementById("jam"); - var c; - - // XXX: I think, instead of null, you can pass in a dictionary of defaults - function load(state) { - ei("name-a").innerHTML = state.name_a || "Home"; - ei("name-b").innerHTML = state.name_b || "Vis"; - ei("logo-a").src = state.logo_a || "logos/black.png"; - ei("logo-b").src = state.logo_b || "logos/white.png"; - ei("score-a").innerHTML = state.score_a || 0; - ei("score-b").innerHTML = state.score_b || 0; - ei("timeouts-a").innerHTML = state.timeout_a || 3; - ei("timeouts-b").innerHTML = state.timeout_b || 3; - period = state.period || 0; - jamno = state.jamno || 0; - - var c = state.period_clock || 1800000; - startTimer(p); - p.set(c); - } - chrome.storage.local.get(null, load); - + ei("logo-a"); + ei("logo-b"); + ei("score-a"); + ei("score-b") ei("jammer-a"); ei("jammer-b"); + ei("timeouts-a"); + ei("timeouts-b"); ei("period"); ei("jam"); ei("prefs"); @@ -540,10 +547,10 @@ function start() { ei("jamtext").innerHTML = jamtext[3]; transition(); + var j = e("jam"); startTimer(j); j.set(jam_time); - save_timer = setInterval(save, 10000); // Every 10 seconds update_itimer = setInterval(update, 200); // 5 times a second } diff --git a/scoreboard.html b/scoreboard.html index a44af53..39f8b8e 100644 --- a/scoreboard.html +++ b/scoreboard.html @@ -1,20 +1,20 @@ @@ -25,15 +25,10 @@ - -

- 0 + 3 -

@@ -47,7 +42,7 @@

- 0 + 3 -

From 0f3e875f677e165a7dbbc8c3e3740a48e0c64ed1 Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Sun, 19 Jan 2014 18:25:38 -0700 Subject: [PATCH 07/29] Holy crap it works --- START_SCOREBOARD.html | 36 ------ classic.html | 100 --------------- crg-nologo.html | 192 ---------------------------- crg.html | 199 ----------------------------- highvis.html | 99 --------------- index.html | 152 ---------------------- logos/black.png | Bin 9920 -> 19675 bytes logos/blue.png | Bin 8476 -> 21887 bytes logos/bwbs.png | Bin 0 -> 2178658 bytes logos/campers.png | Bin 0 -> 131834 bytes logos/green.png | Bin 8014 -> 16164 bytes logos/logos.html | 1 + logos/logos.js | 89 +++++++------ logos/orange.png | Bin 9557 -> 20718 bytes logos/qsdd.png | Bin 0 -> 966326 bytes logos/red.png | Bin 0 -> 20130 bytes logos/redhots.png | Bin 0 -> 71259 bytes logos/violet.png | Bin 0 -> 22177 bytes logos/white.png | Bin 10246 -> 21185 bytes logos/yellow.png | Bin 0 -> 20962 bytes micro.html | 71 ----------- penalties.html | 140 --------------------- res/BadGirl.swf | Bin 48224 -> 0 bytes res/FasterFaster.swf | Bin 25868 -> 0 bytes res/HolyShot.swf | Bin 20800 -> 0 bytes res/Ouch.swf | Bin 118171 -> 0 bytes res/Pow.swf | Bin 1375 -> 0 bytes res/Zounds.swf | Bin 2036 -> 0 bytes res/adverts.js | 30 ----- res/icon.png | Bin 6153 -> 5744 bytes res/jammer.svg | 98 --------------- res/kitty.svg | 58 +++++---- res/others.html | 143 --------------------- res/penalties.js | 161 ------------------------ res/scoreboard-explained.png | Bin 47677 -> 0 bytes res/scoreboard.css | 40 ++++-- res/scoreboard.js | 236 ++++++++++++++++++++--------------- res/screenshot.png | Bin 66583 -> 0 bytes res/todo.txt | 2 - res/usage.html | 223 --------------------------------- scoreboard.html | 5 +- 41 files changed, 248 insertions(+), 1827 deletions(-) delete mode 100644 START_SCOREBOARD.html delete mode 100644 classic.html delete mode 100644 crg-nologo.html delete mode 100644 crg.html delete mode 100644 highvis.html delete mode 100644 index.html create mode 100644 logos/bwbs.png create mode 100644 logos/campers.png create mode 100644 logos/qsdd.png create mode 100644 logos/red.png create mode 100644 logos/redhots.png create mode 100644 logos/violet.png create mode 100644 logos/yellow.png delete mode 100644 micro.html delete mode 100644 penalties.html delete mode 100644 res/BadGirl.swf delete mode 100644 res/FasterFaster.swf delete mode 100644 res/HolyShot.swf delete mode 100644 res/Ouch.swf delete mode 100644 res/Pow.swf delete mode 100644 res/Zounds.swf delete mode 100644 res/adverts.js delete mode 100644 res/jammer.svg delete mode 100644 res/others.html delete mode 100644 res/penalties.js delete mode 100644 res/scoreboard-explained.png delete mode 100644 res/screenshot.png delete mode 100644 res/todo.txt delete mode 100644 res/usage.html diff --git a/START_SCOREBOARD.html b/START_SCOREBOARD.html deleted file mode 100644 index 4018f09..0000000 --- a/START_SCOREBOARD.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - LADD Roller Derby Scoreboard - - - - -

LADD Scoreboard

- -

- Having problems? Try something other than Internet Explorer! - Chrome and Firefox have both been tested extensively. -

- - - -

Documentation

- - -
- Neale Pickett <neale@woozle.org> -
- - - diff --git a/classic.html b/classic.html deleted file mode 100644 index 9362253..0000000 --- a/classic.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - LADD Scoreboard - - - - - - - - -
-

- Home - - 0 - - - -

- -

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

- -

- Vis - - 0 - - - -

-
- -
-
Power Jam
-
Grand Slam
-
Ouch
-
OMG
-
- - diff --git a/crg-nologo.html b/crg-nologo.html deleted file mode 100644 index c53813d..0000000 --- a/crg-nologo.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - - LADD Scoreboard - - - - - - - -
-
-

Home

-

-

-
- -
-

Timeouts

-

0

-

0

-
- -
-

Home

-

-

-
- -
-

-

--:--

-
- -
-

- - 0 -

-

-:--

-
- -
- - diff --git a/crg.html b/crg.html deleted file mode 100644 index 89b8710..0000000 --- a/crg.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - LADD Scoreboard - - - - - - - - -
-
-

Home

- -

-

-
- -
-

Timeouts

-

0

-

0

-
- -
-

Home

- -

-

-
- -
-

-

--:--

-
- -
-

- - 0 -

-

-:--

-
- -
- - diff --git a/highvis.html b/highvis.html deleted file mode 100644 index 90fa242..0000000 --- a/highvis.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - LADD Scoreboard - - - - - - - -
-

- --:-- -

-

- - - - - - - - -

-

- -:--.- -

-
-
Power Jam
-
Grand Slam
-
Ouch!
-
OMG
-
-
- - diff --git a/index.html b/index.html deleted file mode 100644 index 60229a5..0000000 --- a/index.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - LADD Roller Derby Scoreboard - - - - -

LADD Roller Derby Scoreboard

- -

- This is a free WFTDA-rules scoreboard, created with ease-of-use - in mind. It is known to work on PC, Mac, Android, iOS, or Linux, using any - common web browser. -

- -

- -
- Try it right now: click on things - to make them change. -

- -

Features

- -
    -
  • - Free to use, share, and change (GPLv3) -
  • -
  • - No Internet connection required -
  • -
  • - Easy mouse-driven (with hotkeys) setup and operation -
  • -
  • - No complicated installation procedure: just open a web page -
  • -
  • - Looks good, with colors tuned for high-visibility - on projectors -
  • -
  • - Appearance can be customized in HTML and CSS; comes with - several pre-written themes -
  • -
  • - Runs on practically anything, including older computers, - smartphones, and tablets -
  • -
  • - Ships with an ever-expanding set of - team logos -
  • -
  • - The only scoreboard conforming to 9.1.5.4, requiring - penalty tracking. -
  • -
- -

Themes

- - -

Documentation

-

- Watch a 5-minute video - tutorial or read the - Full documentation which comes bundled with the - download. -

- - -

Download

-

- Download - version 5.1 to your hard drive to run a scoreboard - without Internet access (recommended: - watch how). This - includes the documentation. -

- -

- If your scoreboard computer has an Internet connection, you don't - need to download anything at all. Just load up - the full-screen version from this - page and you're all set. -

- -

- You can - also browse - the source tree or clone it with git: -

git clone http://woozle.org/~neale/projects/scoreboard
-

- -

Other Derby Stuff By Me

- - - -

Contact Me

- -

- If you'd like me to add your team logo, have an idea for improvement, - or just want to say hi, please send me an email. I especially - like hearing from people who are using the software: I love knowing - I'm able to help people out. -

- -
- Neale Pickett <neale@woozle.org> -
- - - diff --git a/logos/black.png b/logos/black.png index 0cd754c93a03928009987e2605b20bfcdd57c658..8d31ed72bd0acd8c7b4c8aea8574c6a32460d1fd 100644 GIT binary patch literal 19675 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 literal 9920 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