jekyll-theme-conference 3.4.0 → 3.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +45 -21
  3. data/_includes/js/conference.js +26 -16
  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 +735 -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 -16
  17. data/_includes/partials/checks.html +1 -1
  18. data/_includes/partials/footer.html +1 -1
  19. data/_includes/partials/get_live_timestamps.html +4 -4
  20. data/_includes/partials/get_page_title.html +1 -1
  21. data/_includes/partials/get_talk_timestamp.html +2 -2
  22. data/_includes/partials/header.html +1 -1
  23. data/_includes/partials/modal_live.html +3 -2
  24. data/_includes/partials/navbar.html +1 -1
  25. data/_includes/partials/show_live_button.html +2 -2
  26. data/_layouts/config.html +78 -0
  27. data/_layouts/data.html +29 -3
  28. data/_layouts/home.html +1 -1
  29. data/_layouts/location.html +1 -1
  30. data/_layouts/room.html +1 -1
  31. data/_layouts/stream-overview.html +1 -1
  32. data/assets/js/config.json +3 -0
  33. metadata +17 -14
  34. data/_includes/js/conference-live.js +0 -701
  35. 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();