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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +107 -25
  3. data/_includes/js/conference.js +28 -17
  4. data/_includes/js/init.js +37 -0
  5. data/_includes/js/{bootstrap.js → lib/bootstrap.js} +0 -0
  6. data/_includes/js/{jquery-3.5.1.min.js → lib/jquery-3.5.1.min.js} +0 -0
  7. data/_includes/js/{leaflet-easybutton.js → lib/leaflet-easybutton.js} +0 -0
  8. data/_includes/js/{leaflet-locatecontrol.js → lib/leaflet-locatecontrol.js} +0 -0
  9. data/_includes/js/{leaflet-providers.js → lib/leaflet-providers.js} +0 -0
  10. data/_includes/js/{leaflet.js → lib/leaflet.js} +0 -0
  11. data/_includes/js/{popper.min.js → lib/popper.min.js} +0 -0
  12. data/_includes/js/{syncscroll.js → lib/syncscroll.js} +0 -0
  13. data/_includes/js/live.js +718 -0
  14. data/_includes/js/map.js +38 -0
  15. data/_includes/js/{conference-modal.js → modal.js} +13 -15
  16. data/_includes/js/{conference-program.js → program.js} +10 -17
  17. data/_includes/partials/checks.html +1 -1
  18. data/_includes/partials/footer.html +1 -1
  19. data/_includes/partials/get_enable_map.html +11 -0
  20. data/_includes/partials/get_live_timestamps.html +1 -1
  21. data/_includes/partials/get_page_description.html +23 -0
  22. data/_includes/partials/get_page_title.html +33 -0
  23. data/_includes/partials/get_talk_timestamp.html +2 -2
  24. data/_includes/partials/header.html +7 -4
  25. data/_includes/partials/list_page_meta.html +23 -0
  26. data/_includes/partials/list_speakers.html +11 -5
  27. data/_includes/partials/modal_live.html +3 -2
  28. data/_includes/partials/navbar.html +1 -1
  29. data/_includes/partials/navbar_rooms.html +5 -1
  30. data/_includes/partials/show_live_button.html +2 -2
  31. data/_layouts/config.html +78 -0
  32. data/_layouts/data.html +20 -2
  33. data/_layouts/home.html +1 -1
  34. data/_layouts/location.html +1 -1
  35. data/_layouts/page.html +4 -0
  36. data/_layouts/stream-overview.html +1 -1
  37. data/assets/js/config.json +3 -0
  38. metadata +24 -17
  39. data/_includes/js/conference-live.js +0 -701
  40. 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();