jekyll-theme-conference 3.2.0 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +107 -25
- data/_includes/js/conference.js +28 -17
- data/_includes/js/init.js +37 -0
- data/_includes/js/{bootstrap.js → lib/bootstrap.js} +0 -0
- data/_includes/js/{jquery-3.5.1.min.js → lib/jquery-3.5.1.min.js} +0 -0
- data/_includes/js/{leaflet-easybutton.js → lib/leaflet-easybutton.js} +0 -0
- data/_includes/js/{leaflet-locatecontrol.js → lib/leaflet-locatecontrol.js} +0 -0
- data/_includes/js/{leaflet-providers.js → lib/leaflet-providers.js} +0 -0
- data/_includes/js/{leaflet.js → lib/leaflet.js} +0 -0
- data/_includes/js/{popper.min.js → lib/popper.min.js} +0 -0
- data/_includes/js/{syncscroll.js → lib/syncscroll.js} +0 -0
- data/_includes/js/live.js +718 -0
- data/_includes/js/map.js +38 -0
- data/_includes/js/{conference-modal.js → modal.js} +13 -15
- data/_includes/js/{conference-program.js → program.js} +10 -17
- data/_includes/partials/checks.html +1 -1
- data/_includes/partials/footer.html +1 -1
- data/_includes/partials/get_enable_map.html +11 -0
- data/_includes/partials/get_live_timestamps.html +1 -1
- data/_includes/partials/get_page_description.html +23 -0
- data/_includes/partials/get_page_title.html +33 -0
- data/_includes/partials/get_talk_timestamp.html +2 -2
- data/_includes/partials/header.html +7 -4
- data/_includes/partials/list_page_meta.html +23 -0
- data/_includes/partials/list_speakers.html +11 -5
- data/_includes/partials/modal_live.html +3 -2
- data/_includes/partials/navbar.html +1 -1
- data/_includes/partials/navbar_rooms.html +5 -1
- data/_includes/partials/show_live_button.html +2 -2
- data/_layouts/config.html +78 -0
- data/_layouts/data.html +20 -2
- data/_layouts/home.html +1 -1
- data/_layouts/location.html +1 -1
- data/_layouts/page.html +4 -0
- data/_layouts/stream-overview.html +1 -1
- data/assets/js/config.json +3 -0
- metadata +24 -17
- data/_includes/js/conference-live.js +0 -701
- data/_includes/js/conference-map.js +0 -45
@@ -1,701 +0,0 @@
|
|
1
|
-
window.conference.live = (function() {
|
2
|
-
{% assign d = site.data.program.days | first -%}
|
3
|
-
{%- include partials/get_day_time.html -%}
|
4
|
-
{%- assign t = day_start_talk -%}
|
5
|
-
|
6
|
-
{%- include partials/get_talk_timestamp.html -%}
|
7
|
-
{%- assign conf_start = timestamp_start -%}
|
8
|
-
|
9
|
-
{%- assign d = site.data.program.days | last -%}
|
10
|
-
{%- include partials/get_day_time.html -%}
|
11
|
-
{%- assign t = day_end_talk -%}
|
12
|
-
|
13
|
-
{%- include partials/get_talk_timestamp.html -%}
|
14
|
-
{%- assign conf_end = timestamp_end -%}
|
15
|
-
|
16
|
-
let data;
|
17
|
-
|
18
|
-
let confStart = {{ conf_start }};
|
19
|
-
let confEnd = {{ conf_end }};
|
20
|
-
let confDur = confEnd - confStart;
|
21
|
-
|
22
|
-
let freezeTime = false;
|
23
|
-
let timeFrozen = 0;
|
24
|
-
let timeOffset = 0;
|
25
|
-
|
26
|
-
let demo = {{ site.conference.live.demo | default: "false" }};
|
27
|
-
let durDemo = 5*60; // in seconds
|
28
|
-
let durPause = 10; // in seconds
|
29
|
-
|
30
|
-
let demoStart = confStart - confDur/durDemo*durPause;
|
31
|
-
let demoEnd = confEnd + confDur/durDemo*durPause;
|
32
|
-
|
33
|
-
let liveTimer;
|
34
|
-
let streamVideoTimer;
|
35
|
-
let streamInfoTimer;
|
36
|
-
|
37
|
-
let loadData = function () {
|
38
|
-
// Fetch schedule from external file
|
39
|
-
$.getJSON('{{ site.baseurl }}/assets/js/data.json', function(json) {
|
40
|
-
data = json;
|
41
|
-
});
|
42
|
-
};
|
43
|
-
|
44
|
-
let getData = function () {
|
45
|
-
// Return data
|
46
|
-
return data;
|
47
|
-
};
|
48
|
-
|
49
|
-
let mod = function (n, m) {
|
50
|
-
// Absolute modulo
|
51
|
-
return ((n % m) + m) % m;
|
52
|
-
};
|
53
|
-
|
54
|
-
let timeNow = function () {
|
55
|
-
// Current timestamp in seconds
|
56
|
-
return Math.floor(Date.now() / 1000);
|
57
|
-
};
|
58
|
-
|
59
|
-
let timeCont = function () {
|
60
|
-
// Continuous time (respecting previous pauses)
|
61
|
-
return timeNow() - timeOffset;
|
62
|
-
};
|
63
|
-
|
64
|
-
let timeCycle = function () {
|
65
|
-
// Cyclic timestamp in seconds
|
66
|
-
let actTime = timeNow();
|
67
|
-
let relTime = mod(actTime, durDemo + 2*durPause) / (durDemo + 2*durPause);
|
68
|
-
let cycleTime = mod((demoEnd - demoStart) * relTime - timeOffset, (demoEnd - demoStart)) + demoStart;
|
69
|
-
return cycleTime;
|
70
|
-
};
|
71
|
-
|
72
|
-
let time = function () {
|
73
|
-
// Return app time
|
74
|
-
if (freezeTime) {
|
75
|
-
return timeFrozen;
|
76
|
-
}
|
77
|
-
else if (demo) {
|
78
|
-
return timeCycle();
|
79
|
-
}
|
80
|
-
else {
|
81
|
-
return timeCont();
|
82
|
-
}
|
83
|
-
};
|
84
|
-
|
85
|
-
let pauseTime = function () {
|
86
|
-
// Pause app time
|
87
|
-
if (!freezeTime) {
|
88
|
-
timeFrozen = time();
|
89
|
-
freezeTime = true;
|
90
|
-
|
91
|
-
stopUpdate();
|
92
|
-
}
|
93
|
-
};
|
94
|
-
|
95
|
-
let continueTime = function () {
|
96
|
-
// Continue app time
|
97
|
-
if (freezeTime) {
|
98
|
-
freezeTime = false;
|
99
|
-
timeOffset += time() - timeFrozen;
|
100
|
-
startUpdate();
|
101
|
-
}
|
102
|
-
};
|
103
|
-
|
104
|
-
let resetTime = function () {
|
105
|
-
// Reset app time
|
106
|
-
timeOffset = 0;
|
107
|
-
freezeTime = false;
|
108
|
-
|
109
|
-
startUpdate();
|
110
|
-
};
|
111
|
-
|
112
|
-
let setTime = function (newTime, newDay) {
|
113
|
-
// Set and pause app time
|
114
|
-
pauseTime();
|
115
|
-
|
116
|
-
let dayIdx;
|
117
|
-
if (arguments.length < 2) {
|
118
|
-
dayIdx = 0;
|
119
|
-
}
|
120
|
-
else if (Number.isInteger(newDay)) {
|
121
|
-
dayIdx = newDay-1;
|
122
|
-
}
|
123
|
-
else if (/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/.test(newDay)) {
|
124
|
-
dayIdx = data.days.find(o => o.name === newDay);
|
125
|
-
}
|
126
|
-
else {
|
127
|
-
dayIdx = data.days.find(o => o.name === newDay);
|
128
|
-
}
|
129
|
-
let newDate = data.days[dayIdx].date;
|
130
|
-
|
131
|
-
let d = new Date(newDate);
|
132
|
-
newTime = newTime.split(':');
|
133
|
-
d.setHours(newTime[0], newTime[1]);
|
134
|
-
|
135
|
-
timeFrozen = Math.floor(d.getTime() / 1000);
|
136
|
-
|
137
|
-
update();
|
138
|
-
};
|
139
|
-
|
140
|
-
let getTime = function () {
|
141
|
-
// Return app time as string
|
142
|
-
let tConvert = time();
|
143
|
-
|
144
|
-
let d = new Date(tConvert * 1000);
|
145
|
-
let dStr = d.toISOString().slice(0,10);
|
146
|
-
let h = d.getHours();
|
147
|
-
let m = d.getMinutes();
|
148
|
-
|
149
|
-
return dStr +" "+ h +":"+ (m < 10 ? "0" : "") + m;
|
150
|
-
};
|
151
|
-
|
152
|
-
let timeUnit = function () {
|
153
|
-
// App time refresh rate
|
154
|
-
if (demo) {
|
155
|
-
return 0.1;
|
156
|
-
}
|
157
|
-
else {
|
158
|
-
return 60;
|
159
|
-
}
|
160
|
-
};
|
161
|
-
|
162
|
-
let delayStart = function (startTime) {
|
163
|
-
// Seconds until given startTime occurs
|
164
|
-
let tNow = time();
|
165
|
-
let tUnit = timeUnit();
|
166
|
-
|
167
|
-
if (demo) {
|
168
|
-
// Convert virtual duration to real duration
|
169
|
-
return mod(startTime - tNow, demoEnd - demoStart) / (demoEnd - demoStart) * (durDemo + 2*durPause);
|
170
|
-
}
|
171
|
-
else {
|
172
|
-
if (startTime > tNow) {
|
173
|
-
return startTime - tNow;
|
174
|
-
}
|
175
|
-
else {
|
176
|
-
// Start on the unit
|
177
|
-
return (tUnit - (tNow % tUnit));
|
178
|
-
}
|
179
|
-
}
|
180
|
-
};
|
181
|
-
|
182
|
-
let toggleDemo = function () {
|
183
|
-
// Toggle app demo mode
|
184
|
-
demo = !demo;
|
185
|
-
resetTime();
|
186
|
-
};
|
187
|
-
|
188
|
-
let demoOn = function () {
|
189
|
-
// Return app demo status
|
190
|
-
return demo;
|
191
|
-
};
|
192
|
-
|
193
|
-
let updateLive = function () {
|
194
|
-
// Update status all live elements in DOM
|
195
|
-
let tNow = time();
|
196
|
-
let liveShow = document.getElementsByClassName('live-show');
|
197
|
-
let liveHide = document.getElementsByClassName('live-hide');
|
198
|
-
let liveTime = document.getElementsByClassName('live-time');
|
199
|
-
let livePast = document.getElementsByClassName('live-past');
|
200
|
-
|
201
|
-
// Show elements for a given period
|
202
|
-
for (let i = 0; i < liveShow.length; i++) {
|
203
|
-
let tStarts = liveShow[i].dataset.start.split(',');
|
204
|
-
let tEnds = liveShow[i].dataset.end.split(',');
|
205
|
-
|
206
|
-
for (let k = 0; k < tStarts.length; k++) {
|
207
|
-
if (tNow >= tStarts[k] && tNow < tEnds[k]) {
|
208
|
-
// Show when active
|
209
|
-
liveShow[i].classList.remove('d-none');
|
210
|
-
break;
|
211
|
-
}
|
212
|
-
else if (!liveShow[i].classList.contains('d-none')) {
|
213
|
-
// Hide otherwise
|
214
|
-
liveShow[i].classList.add('d-none');
|
215
|
-
}
|
216
|
-
}
|
217
|
-
}
|
218
|
-
|
219
|
-
// Hide elements for a given period
|
220
|
-
for (let i = 0; i < liveHide.length; i++) {
|
221
|
-
let tStarts = liveHide[i].dataset.start.split(',');
|
222
|
-
let tEnds = liveHide[i].dataset.end.split(',');
|
223
|
-
|
224
|
-
for (let k = 0; k < tStarts.length; k++) {
|
225
|
-
if (tNow >= tStarts[k] && tNow < tEnds[k]) {
|
226
|
-
// Hide when active
|
227
|
-
if (!liveHide[i].classList.contains('d-none')) {
|
228
|
-
liveHide[i].classList.add('d-none');
|
229
|
-
break;
|
230
|
-
}
|
231
|
-
}
|
232
|
-
else {
|
233
|
-
// Show otherwise
|
234
|
-
liveHide[i].classList.remove('d-none');
|
235
|
-
}
|
236
|
-
}
|
237
|
-
}
|
238
|
-
|
239
|
-
// Update duration string for given elements
|
240
|
-
for (let i = 0; i < liveTime.length; i++) {
|
241
|
-
let t = liveTime[i].dataset.time;
|
242
|
-
if (typeof t == "undefined") {
|
243
|
-
break;
|
244
|
-
}
|
245
|
-
let tRel = tNow - t;
|
246
|
-
|
247
|
-
let tStr;
|
248
|
-
if (tRel >= -60 && tRel < 0) {
|
249
|
-
tStr = '{{ site.data.lang[site.conference.lang].live.time.soon | default: "soon" }}';
|
250
|
-
}
|
251
|
-
else if (tRel >= 0 && tRel < 60) {
|
252
|
-
tStr = '{{ site.data.lang[site.conference.lang].live.time.now | default: "now" }}';
|
253
|
-
}
|
254
|
-
else {
|
255
|
-
if (tRel < 0) {
|
256
|
-
tStr = '{{ site.data.lang[site.conference.lang].live.time.in | default: "in" }} ';
|
257
|
-
}
|
258
|
-
else {
|
259
|
-
tStr = '{{ site.data.lang[site.conference.lang].live.time.since | default: "since" }} ';
|
260
|
-
}
|
261
|
-
tRel = Math.abs(tRel);
|
262
|
-
|
263
|
-
let dWeeks = Math.floor(tRel / (7*24*60*60));
|
264
|
-
let dDays = Math.floor(tRel / (24*60*60));
|
265
|
-
let dHours = Math.floor(tRel / (60*60));
|
266
|
-
let dMins = Math.floor(tRel / (60));
|
267
|
-
if (dWeeks > 4) {
|
268
|
-
break;
|
269
|
-
}
|
270
|
-
else if (dWeeks > 1) {
|
271
|
-
tStr += dWeeks +' {{ site.data.lang[site.conference.lang].live.time.weeks | default: "weeks" }}';
|
272
|
-
}
|
273
|
-
else if (dWeeks == 1) {
|
274
|
-
tStr += '1 {{ site.data.lang[site.conference.lang].live.time.week | default: "week" }}';
|
275
|
-
}
|
276
|
-
else if (dDays > 1) {
|
277
|
-
tStr += dDays +' {{ site.data.lang[site.conference.lang].live.time.days | default: "days" }}';
|
278
|
-
}
|
279
|
-
else if (dDays == 1) {
|
280
|
-
tStr += '1 {{ site.data.lang[site.conference.lang].live.time.day | default: "day" }}';
|
281
|
-
}
|
282
|
-
else if (dHours > 1) {
|
283
|
-
tStr += dHours +' {{ site.data.lang[site.conference.lang].live.time.hours | default: "hours" }}';
|
284
|
-
}
|
285
|
-
else if (dHours == 1) {
|
286
|
-
tStr += '1 {{ site.data.lang[site.conference.lang].live.time.hour | default: "hour" }}';
|
287
|
-
}
|
288
|
-
else if (dMins > 1) {
|
289
|
-
tStr += dMins +' {{ site.data.lang[site.conference.lang].live.time.minutes | default: "minutes" }}';
|
290
|
-
}
|
291
|
-
else {
|
292
|
-
tStr += '1 {{ site.data.lang[site.conference.lang].live.time.minute | default: "minute" }}';
|
293
|
-
}
|
294
|
-
}
|
295
|
-
|
296
|
-
liveTime[i].innerHTML = tStr;
|
297
|
-
}
|
298
|
-
|
299
|
-
// Disable elements for a given period
|
300
|
-
for (let i = 0; i < livePast.length; i++) {
|
301
|
-
let t = livePast[i].dataset.time;
|
302
|
-
if (typeof t == "undefined") {
|
303
|
-
break;
|
304
|
-
}
|
305
|
-
let tRel = tNow - t;
|
306
|
-
|
307
|
-
if (tRel < 0) {
|
308
|
-
// Grey out when in past
|
309
|
-
if (!livePast[i].classList.contains('text-secondary')) {
|
310
|
-
livePast[i].classList.add('text-secondary');
|
311
|
-
}
|
312
|
-
}
|
313
|
-
else {
|
314
|
-
// Show normal otherwise
|
315
|
-
livePast[i].classList.remove('text-secondary');
|
316
|
-
}
|
317
|
-
}
|
318
|
-
|
319
|
-
// Cancel timer after program is over
|
320
|
-
if (tNow > confEnd && !demo) {
|
321
|
-
stopUpdateLive();
|
322
|
-
}
|
323
|
-
};
|
324
|
-
|
325
|
-
let startUpdateLive = function () {
|
326
|
-
// Start update timer to update live elements in DOM
|
327
|
-
stopUpdateLive();
|
328
|
-
updateLive();
|
329
|
-
|
330
|
-
if (demo) {
|
331
|
-
// Immediate start required since delayStart would wait for next wrap around
|
332
|
-
liveTimer = setInterval(updateLive, timeUnit() * 1000);
|
333
|
-
}
|
334
|
-
else {
|
335
|
-
setTimeout(function() {
|
336
|
-
liveTimer = setInterval(updateLive, timeUnit() * 1000);
|
337
|
-
updateLive();
|
338
|
-
}, delayStart(confStart) * 1000);
|
339
|
-
}
|
340
|
-
};
|
341
|
-
|
342
|
-
let stopUpdateLive = function () {
|
343
|
-
// stopUpdate update timer to update live elements in DOM
|
344
|
-
if (typeof liveTimer !== "undefined") {
|
345
|
-
clearInterval(liveTimer);
|
346
|
-
}
|
347
|
-
};
|
348
|
-
|
349
|
-
{% if site.conference.live.streaming -%}
|
350
|
-
let streamPause = {{ site.conference.live.streaming.time_pause | default: 60 }}; // in minutes
|
351
|
-
let streamPrepend = {{ site.conference.live.streaming.time_prepend | default: 5 }}; // in minutes
|
352
|
-
let streamExtend = {{ site.conference.live.streaming.time_extend | default: 5 }}; // in minutes
|
353
|
-
|
354
|
-
let streamModal;
|
355
|
-
|
356
|
-
let getRoom = function (roomName) {
|
357
|
-
// Return room object for given room name
|
358
|
-
if (roomName in data.rooms) {
|
359
|
-
return data.rooms[roomName];
|
360
|
-
}
|
361
|
-
else {
|
362
|
-
return data.rooms[Object.keys(data.rooms)[0]];
|
363
|
-
}
|
364
|
-
};
|
365
|
-
|
366
|
-
let getTalks = function (roomName) {
|
367
|
-
if (roomName in data.talks) {
|
368
|
-
return data.talks[roomName];
|
369
|
-
}
|
370
|
-
else {
|
371
|
-
return false;
|
372
|
-
}
|
373
|
-
};
|
374
|
-
|
375
|
-
let getNextTalk = function (roomName) {
|
376
|
-
// Get talk object for next talk in given room
|
377
|
-
let timeNow = time();
|
378
|
-
let talksHere = getTalks(roomName);
|
379
|
-
|
380
|
-
if (talksHere) {
|
381
|
-
if (timeNow < talksHere[talksHere.length-1].end) {
|
382
|
-
for (var i = 0; i < talksHere.length; i++) {
|
383
|
-
if (timeNow < talksHere[i].end) {
|
384
|
-
return talksHere[i];
|
385
|
-
}
|
386
|
-
}
|
387
|
-
}
|
388
|
-
}
|
389
|
-
return false;
|
390
|
-
};
|
391
|
-
|
392
|
-
let getNextPause = function (roomName) {
|
393
|
-
// Get time object for next pause in given room
|
394
|
-
let timeNow = time();
|
395
|
-
let talksHere = getTalks(roomName);
|
396
|
-
|
397
|
-
if (talksHere) {
|
398
|
-
if (timeNow < talksHere[talksHere.length-1].end) {
|
399
|
-
for (var i = 1; i < talksHere.length; i++) {
|
400
|
-
if (timeNow < talksHere[i].start && streamPause*60 <= talksHere[i].start - talksHere[i-1].end) {
|
401
|
-
return {
|
402
|
-
'start': talksHere[i-1].end,
|
403
|
-
'end': talksHere[i].start,
|
404
|
-
};
|
405
|
-
}
|
406
|
-
}
|
407
|
-
}
|
408
|
-
}
|
409
|
-
return false;
|
410
|
-
};
|
411
|
-
|
412
|
-
let setStreamIframeContent = function (content) {
|
413
|
-
// Set stream modal iframe to show given text
|
414
|
-
streamModal.find('iframe').attr('src', '');
|
415
|
-
streamModal.find('iframe').addClass('d-none');
|
416
|
-
streamModal.find('#stream-placeholder > div').text(content);
|
417
|
-
streamModal.find('#stream-placeholder').addClass('d-flex');
|
418
|
-
};
|
419
|
-
|
420
|
-
let setStreamIframeSrc = function (href) {
|
421
|
-
// Set stream modal iframe to show given URL
|
422
|
-
streamModal.find('iframe').attr('src', href);
|
423
|
-
streamModal.find('#stream-placeholder').addClass('d-none').removeClass('d-flex');
|
424
|
-
streamModal.find('iframe').removeClass('d-none');
|
425
|
-
};
|
426
|
-
|
427
|
-
let setStreamVideo = function (roomName) {
|
428
|
-
// Update stream modal iframe:
|
429
|
-
// Show stream with start/pause/end message (for given room) and keep updated
|
430
|
-
let timeNow = time();
|
431
|
-
|
432
|
-
let talksHere = getTalks(roomName);
|
433
|
-
let roomStart, roomEnd;
|
434
|
-
if (talksHere) {
|
435
|
-
roomStart = talksHere[0].start;
|
436
|
-
roomEnd = talksHere[talksHere.length-1].end;
|
437
|
-
}
|
438
|
-
else {
|
439
|
-
// If no program for given room, take overall first and last talk
|
440
|
-
roomStart = 0;
|
441
|
-
roomEnd = 0;
|
442
|
-
for (let roomNameTalk in data.talks) {
|
443
|
-
talksHere = getTalks(roomNameTalk);
|
444
|
-
let crntRoomStart = talksHere[0].start;
|
445
|
-
let crntRoomEnd = talksHere[talksHere.length-1].end;
|
446
|
-
|
447
|
-
if (roomStart == 0 || roomStart > crntRoomStart) {
|
448
|
-
roomStart = crntRoomStart;
|
449
|
-
}
|
450
|
-
if (roomEnd == 0 || roomEnd < crntRoomEnd) {
|
451
|
-
roomEnd = crntRoomEnd;
|
452
|
-
}
|
453
|
-
}
|
454
|
-
}
|
455
|
-
|
456
|
-
if (typeof streamVideoTimer !== "undefined") {
|
457
|
-
clearInterval(streamVideoTimer);
|
458
|
-
}
|
459
|
-
|
460
|
-
// Conference not yet started
|
461
|
-
if (timeNow < roomStart - streamPrepend*60) {
|
462
|
-
setStreamIframeContent('{{ site.data.lang[site.conference.lang].live.pre_stream | default: "Live stream has not started yet." }}');
|
463
|
-
|
464
|
-
if (!freezeTime) {
|
465
|
-
streamVideoTimer = setTimeout(setStreamVideo, delayStart(roomStart - streamPrepend*60) * 1000, roomName);
|
466
|
-
}
|
467
|
-
}
|
468
|
-
|
469
|
-
// Conference is over
|
470
|
-
else if (timeNow > roomEnd + streamExtend*60) {
|
471
|
-
setStreamIframeContent('{{ site.data.lang[site.conference.lang].live.post_stream | default: "Live stream has ended." }}');
|
472
|
-
|
473
|
-
if (!freezeTime && demo) {
|
474
|
-
streamVideoTimer = setTimeout(setStreamVideo, delayStart(roomEnd - streamPrepend*60) * 1000, roomName);
|
475
|
-
}
|
476
|
-
}
|
477
|
-
|
478
|
-
// Conference ongoing
|
479
|
-
else {
|
480
|
-
let pauseNext = getNextPause(roomName);
|
481
|
-
|
482
|
-
// Currently stream is paused
|
483
|
-
if (pauseNext && timeNow >= pauseNext.start + streamExtend*60 && timeNow <= pauseNext.end - streamPrepend*60) {
|
484
|
-
setStreamIframeContent('{{ site.data.lang[site.conference.lang].live.pause_stream | default: "Live stream is currently paused." }}');
|
485
|
-
|
486
|
-
if (!freezeTime) {
|
487
|
-
streamVideoTimer = setTimeout(setStreamVideo, delayStart(pauseNext.end - streamPrepend*60) * 1000, roomName);
|
488
|
-
}
|
489
|
-
}
|
490
|
-
// Currently a talk is active
|
491
|
-
else {
|
492
|
-
let room = getRoom(roomName);
|
493
|
-
setStreamIframeSrc(room.href);
|
494
|
-
|
495
|
-
if (!freezeTime) {
|
496
|
-
if (pauseNext) {
|
497
|
-
streamVideoTimer = setTimeout(setStreamVideo, delayStart(pauseNext.start + streamExtend*60) * 1000, roomName);
|
498
|
-
}
|
499
|
-
else {
|
500
|
-
streamVideoTimer = setTimeout(setStreamVideo, delayStart(roomEnd + streamExtend*60) * 1000, roomName);
|
501
|
-
}
|
502
|
-
}
|
503
|
-
}
|
504
|
-
}
|
505
|
-
};
|
506
|
-
|
507
|
-
let setStreamInfo = function (roomName) {
|
508
|
-
// Update stream modal info bar:
|
509
|
-
// Show next talk and speaker (for given room) and keep updated
|
510
|
-
let timeNow = time();
|
511
|
-
let talkNext = getNextTalk(roomName);
|
512
|
-
|
513
|
-
if (typeof streamInfoTimer !== "undefined") {
|
514
|
-
clearInterval(streamInfoTimer);
|
515
|
-
}
|
516
|
-
|
517
|
-
if (talkNext && timeNow >= talkNext.start - streamPause*60) {
|
518
|
-
document.getElementById('stream-info').dataset.time = talkNext.start;
|
519
|
-
document.getElementById('stream-info-time').dataset.time = talkNext.start;
|
520
|
-
updateLive();
|
521
|
-
|
522
|
-
streamModal.find('#stream-info-color').removeClass(function (index, className) {
|
523
|
-
return (className.match(/(^|\s)border-soft-\S+/g) || []).join(' ');
|
524
|
-
});
|
525
|
-
streamModal.find('#stream-info-color').addClass('border-soft-' + talkNext.color);
|
526
|
-
|
527
|
-
streamModal.find('#stream-info-talk').text(talkNext.name).attr('href', talkNext.href);
|
528
|
-
|
529
|
-
let speakerStr = '';
|
530
|
-
for (var i = 0; i < talkNext.speakers.length; i++) {
|
531
|
-
let speaker = data.speakers[talkNext.speakers[i]];
|
532
|
-
if (speaker.href == '') {
|
533
|
-
speakerStr += speaker.name +', '
|
534
|
-
}
|
535
|
-
else {
|
536
|
-
speakerStr += '<a class="text-reset" href="'+ speaker.href +'">'+ speaker.name +'</a>, ';
|
537
|
-
}
|
538
|
-
}
|
539
|
-
speakerStr = speakerStr.slice(0, -2);
|
540
|
-
streamModal.find('#stream-info-speakers').html(speakerStr);
|
541
|
-
|
542
|
-
streamModal.find('#stream-info').removeClass('d-none');
|
543
|
-
|
544
|
-
if (!freezeTime) {
|
545
|
-
streamInfoTimer = setTimeout(setStreamInfo, delayStart(talkNext.end) * 1000, roomName);
|
546
|
-
}
|
547
|
-
}
|
548
|
-
else {
|
549
|
-
streamModal.find('#stream-info').addClass('d-none');
|
550
|
-
|
551
|
-
if (!freezeTime) {
|
552
|
-
if (talkNext) {
|
553
|
-
streamInfoTimer = setTimeout(setStreamInfo, delayStart(talkNext.start - streamPause*60) * 1000, roomName);
|
554
|
-
}
|
555
|
-
else if (demo) {
|
556
|
-
let talksHere = getTalks(roomName);
|
557
|
-
if (talksHere) {
|
558
|
-
streamInfoTimer = setTimeout(setStreamInfo, delayStart(talksHere[0].start - streamPrepend*60) * 1000, roomName);
|
559
|
-
}
|
560
|
-
}
|
561
|
-
}
|
562
|
-
}
|
563
|
-
};
|
564
|
-
|
565
|
-
let setStream = function (roomName) {
|
566
|
-
// Update stream modal (iframe and info bar) for given room
|
567
|
-
streamModal.find('.modal-footer .btn').removeClass('active');
|
568
|
-
streamModal.find('#stream-select').val(0);
|
569
|
-
|
570
|
-
// Recover room name in case of empty default
|
571
|
-
let room = getRoom(roomName);
|
572
|
-
roomName = room.name;
|
573
|
-
|
574
|
-
setStreamVideo(roomName);
|
575
|
-
setStreamInfo(roomName);
|
576
|
-
|
577
|
-
streamModal.find('#stream-button' + room.id).addClass('active');
|
578
|
-
streamModal.find('#stream-select').val(room.id);
|
579
|
-
};
|
580
|
-
|
581
|
-
let updateStream = function () {
|
582
|
-
// Update stream modal for currently active room button
|
583
|
-
if (streamModal.hasClass('show')) {
|
584
|
-
let activeButton = streamModal.find('.modal-footer .btn.active');
|
585
|
-
let roomName = activeButton.data('room');
|
586
|
-
|
587
|
-
if (typeof roomName !== "undefined") {
|
588
|
-
setStream(roomName);
|
589
|
-
}
|
590
|
-
}
|
591
|
-
};
|
592
|
-
|
593
|
-
let stopUpdateStream = function () {
|
594
|
-
// Stop stream modal update timer
|
595
|
-
if (typeof streamVideoTimer !== "undefined") {
|
596
|
-
clearInterval(streamVideoTimer);
|
597
|
-
}
|
598
|
-
if (typeof streamInfoTimer !== "undefined") {
|
599
|
-
clearInterval(streamInfoTimer);
|
600
|
-
}
|
601
|
-
};
|
602
|
-
|
603
|
-
let hideModal = function () {
|
604
|
-
// Close stream modal
|
605
|
-
streamModal.find('iframe').attr('src', '');
|
606
|
-
streamModal.find('.modal-footer .btn').removeClass('active');
|
607
|
-
streamModal.find('#stream-select').selectedIndex = -1;
|
608
|
-
};
|
609
|
-
|
610
|
-
let setupStream = function () {
|
611
|
-
// Setup events when modal opens/closes
|
612
|
-
streamModal = $('#stream-modal');
|
613
|
-
|
614
|
-
// configure modal opening buttons
|
615
|
-
streamModal.on('show.bs.modal', function (event) {
|
616
|
-
let button = $(event.relatedTarget);
|
617
|
-
let roomName = button.data('room');
|
618
|
-
setStream(roomName);
|
619
|
-
});
|
620
|
-
streamModal.on('hide.bs.modal', function () {
|
621
|
-
hideModal();
|
622
|
-
});
|
623
|
-
|
624
|
-
// configure room selection buttons in modal
|
625
|
-
streamModal.find('.modal-footer .btn').on('click', function(event) {
|
626
|
-
event.preventDefault();
|
627
|
-
|
628
|
-
let roomName = $(this).data('room');
|
629
|
-
setStream(roomName);
|
630
|
-
});
|
631
|
-
|
632
|
-
// configure room selection menu in modal
|
633
|
-
streamModal.find('#stream-select').on('change', function(event) {
|
634
|
-
event.preventDefault();
|
635
|
-
|
636
|
-
let roomName = $(this).children('option:selected').text();
|
637
|
-
setStream(roomName);
|
638
|
-
});
|
639
|
-
};
|
640
|
-
|
641
|
-
let setup = function () {
|
642
|
-
loadData();
|
643
|
-
startUpdateLive();
|
644
|
-
setupStream();
|
645
|
-
};
|
646
|
-
|
647
|
-
let update = function () {
|
648
|
-
updateLive();
|
649
|
-
updateStream();
|
650
|
-
};
|
651
|
-
|
652
|
-
let startUpdate = function () {
|
653
|
-
startUpdateLive();
|
654
|
-
updateStream();
|
655
|
-
};
|
656
|
-
|
657
|
-
let stopUpdate = function () {
|
658
|
-
stopUpdateLive();
|
659
|
-
stopUpdateStream();
|
660
|
-
};
|
661
|
-
|
662
|
-
{%- else -%}
|
663
|
-
|
664
|
-
let setup = function () {
|
665
|
-
loadData();
|
666
|
-
startUpdateLive();
|
667
|
-
};
|
668
|
-
|
669
|
-
let update = function () {
|
670
|
-
updateLive();
|
671
|
-
};
|
672
|
-
|
673
|
-
let startUpdate = function () {
|
674
|
-
startUpdateLive();
|
675
|
-
};
|
676
|
-
|
677
|
-
let stopUpdate = function () {
|
678
|
-
stopUpdateLive();
|
679
|
-
};
|
680
|
-
|
681
|
-
{%- endif %}
|
682
|
-
|
683
|
-
return {
|
684
|
-
init: setup,
|
685
|
-
getData: getData,
|
686
|
-
|
687
|
-
pauseTime: pauseTime,
|
688
|
-
continueTime: continueTime,
|
689
|
-
resetTime: resetTime,
|
690
|
-
setTime: setTime,
|
691
|
-
getTime: getTime,
|
692
|
-
|
693
|
-
toggleDemo: toggleDemo,
|
694
|
-
demo: demoOn,
|
695
|
-
durDemo: durDemo,
|
696
|
-
durPause: durPause
|
697
|
-
};
|
698
|
-
|
699
|
-
})();
|
700
|
-
|
701
|
-
window.conference.live.init();
|