3 let clock_running = false;
4 let clock_visible = false;
5 let comment_visible = false;
6 let lowerthird_visible = false;
8 let clock_limit = 30 * 60;
16 document.getElementById('team1').innerHTML = state['team1'];
17 document.getElementById('team2').innerHTML = state['team2'];
19 let sheets = { 'A': state['team1'], 'B': state['team2'] };
25 document.getElementById('team1color').style.backgroundColor = state['team1color'];
26 document.getElementById('team2color').style.backgroundColor = state['team2color'];
31 scoreA = state['score1'];
32 scoreB = state['score2'];
39 clock_origin = Date.now();
47 if (!clock_running) return;
48 clock_elapsed = time_elapsed();
49 clock_origin = Date.now();
50 clock_running = false;
53 function setclock(amount)
55 clock_elapsed = amount;
56 clock_origin = Date.now();
60 function setclockfromstate()
62 let amount = parseInt(state['clock_min']) * 60 + parseInt(state['clock_sec']);
66 function adjustclockfromstate()
68 let amount = parseInt(state['clock_min']) * 60 + parseInt(state['clock_sec']);
69 let elapsed = time_elapsed_raw();
70 if (Math.abs(amount - elapsed) >= 2.0) {
75 function setclocklimitfromstate()
77 let amount = parseInt(state['clock_limit_min']) * 60 + parseInt(state['clock_limit_sec']);
83 if (clock_visible) return;
84 let clockbug = document.getElementById('clockbug');
85 clockbug.className = 'clockbug clockbug-animate-in';
91 if (!clock_visible) return;
92 let clockbug = document.getElementById('clockbug');
93 clockbug.className = 'clockbug clockbug-animate-out';
94 clock_visible = false;
99 document.getElementById('comment').innerHTML = state['comment'];
102 function showcomment()
104 if (comment_visible) return;
105 let commentbug = document.getElementById('commentbug');
106 commentbug.className = 'commentbug commentbug-animate-in';
107 comment_visible = true;
110 function hidecomment()
112 if (!comment_visible) return;
113 let commentbug = document.getElementById('commentbug');
114 commentbug.className = 'commentbug commentbug-animate-out';
115 comment_visible = false;
118 function showlowerthird()
120 if (lowerthird_visible) return;
122 document.getElementById('lowerthird-headline').className = 'lowerthird-headline lowerthird-headline-animate-in';
123 document.getElementById('lowerthird-headline-content').className = 'lowerthird-headline-content lowerthird-headline-content-animate-in';
124 document.getElementById('lowerthird-subheading').className = 'lowerthird-subheading lowerthird-subheading-animate-in';
125 document.getElementById('lowerthird-subheading-content').className = 'lowerthird-subheading-content lowerthird-subheading-content-animate-in';
126 document.getElementById('lowerthird-picture').className = 'lowerthird-picture lowerthird-picture-animate-in';
127 document.getElementById('lowerthird-picture-content').className = 'lowerthird-picture-content lowerthird-picture-content-animate-in';
128 lowerthird_visible = true;
131 function setandshowlowerthird()
133 document.getElementById('lowerthird-headline-content').innerHTML = state['text1'];
134 document.getElementById('lowerthird-subheading-content').innerHTML = state['text2'];
135 let img = document.getElementById('lowerthird-img');
136 if (state['image'] === undefined) {
137 img.style.display = 'none';
139 img.src = state['image'];
140 img.style.display = 'inline';
145 function hidelowerthird()
147 if (!lowerthird_visible) return;
148 document.getElementById('lowerthird-headline').className = 'lowerthird-headline lowerthird-headline-hidden lowerthird-headline-animate-out';
149 document.getElementById('lowerthird-headline-content').className = 'lowerthird-headline-content lowerthird-headline-content-animate-out';
150 document.getElementById('lowerthird-subheading').className = 'lowerthird-subheading lowerthird-subheading-animate-out';
151 document.getElementById('lowerthird-subheading-content').className = 'lowerthird-subheading-content lowerthird-subheading-content-animate-out';
152 document.getElementById('lowerthird-picture').className = 'lowerthird-picture lowerthird-picture-animate-out';
153 document.getElementById('lowerthird-picture-content').className = 'lowerthird-picture-content lowerthird-picture-content-animate-out';
154 lowerthird_visible = false;
157 function time_elapsed_raw()
159 let elapsed = (Date.now() - clock_origin) * 1e-3;
160 if (clock_elapsed + elapsed >= clock_limit) {
161 clock_elapsed = clock_limit;
162 clock_origin = Date.now();
163 clock_running = false;
166 return clock_elapsed + elapsed;
169 function time_elapsed()
171 return Math.floor(time_elapsed_raw());
174 function update_clock()
176 let elapsed = time_elapsed();
177 let min = Math.floor(elapsed / 60);
178 let sec = elapsed % 60;
180 if (sec < 10) sec = "0" + sec;
181 let text = min + ":" + sec;
184 // This is a hack around the fact that Exo has variable-width numerals.
185 // It doesn't look fantastic, but for the clock, it's better not to have
186 // the text jumping around.
188 for (let i = 0; i < text.length; ++i) {
189 if (text.charAt(i) === ':') {
192 html += "<div style='display: inline-block; width: 15px'>" + text.charAt(i) + "</div>";
195 document.getElementById('clock').innerHTML = html;
197 document.getElementById('clock').innerHTML = text;
215 if (scoreA > 0) --scoreA;
221 if (scoreB > 0) --scoreB;
225 function resetscore()
231 function update_score()
233 document.getElementById('score').innerHTML = scoreA + " – " + scoreB;
236 /* called by the Nageru theme only */
239 document.getElementById('manualcontrols').style.display = 'none';
240 document.getElementById('area').style.display = 'none';
245 console.log('[[[' + v + ']]]');
246 let j = JSON.parse(v);
247 for(let key in j) state[key] = j[key];
250 setInterval(function() {
260 let websocket = null;
264 console.log("Connecting...");
268 websocket = new WebSocket("ws://127.0.0.1:5250/");
269 websocket.onopen = function(evt) {
270 console.log("Connected to client.");
272 websocket.onclose = function(evt) {
273 console.log("Disconnected from client.");
274 setTimeout(open_ws, 100);
276 websocket.onmessage = function(evt) {
278 let m = msg.match(/^update (.*)/);
282 m = msg.match(/^eval (.*)/);
287 websocket.onerror = function(evt) {
288 console.log('Error: ' + evt.data);
290 } catch (exception) {
291 console.log('Error: ' + exception);
292 setTimeout(open_ws, 100);