@xibosignage/xibo-layout-renderer 1.0.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 (42) hide show
  1. package/LICENSE +165 -0
  2. package/README.md +2 -0
  3. package/dist/assets/logo-BLa_l1uk.png +0 -0
  4. package/dist/rollup.config.dev.d.ts +3 -0
  5. package/dist/rollup.config.prod.d.ts +3 -0
  6. package/dist/src/Modules/Generators/Generators.d.ts +30 -0
  7. package/dist/src/Modules/Generators/index.d.ts +1 -0
  8. package/dist/src/Modules/Layout/Layout.d.ts +12 -0
  9. package/dist/src/Modules/Layout/index.d.ts +1 -0
  10. package/dist/src/Modules/Media/AudioMedia.d.ts +5 -0
  11. package/dist/src/Modules/Media/Media.d.ts +9 -0
  12. package/dist/src/Modules/Media/VideoMedia.d.ts +4 -0
  13. package/dist/src/Modules/Media/index.d.ts +3 -0
  14. package/dist/src/Modules/Platform/Platform.d.ts +2 -0
  15. package/dist/src/Modules/Platform/index.d.ts +1 -0
  16. package/dist/src/Modules/Region/Region.d.ts +4 -0
  17. package/dist/src/Modules/Region/index.d.ts +1 -0
  18. package/dist/src/Modules/SplashScreen/SplashScreen.d.ts +11 -0
  19. package/dist/src/Modules/SplashScreen/index.d.ts +1 -0
  20. package/dist/src/Modules/Transitions/Transitions.d.ts +90 -0
  21. package/dist/src/Modules/Transitions/index.d.ts +1 -0
  22. package/dist/src/Types/Layout/Layout.types.d.ts +78 -0
  23. package/dist/src/Types/Layout/index.d.ts +1 -0
  24. package/dist/src/Types/Media/Media.types.d.ts +45 -0
  25. package/dist/src/Types/Media/index.d.ts +1 -0
  26. package/dist/src/Types/Region/Region.types.d.ts +49 -0
  27. package/dist/src/Types/Region/index.d.ts +1 -0
  28. package/dist/src/Types/XLR/XLR.types.d.ts +25 -0
  29. package/dist/src/Types/XLR/index.d.ts +1 -0
  30. package/dist/src/index.d.ts +2 -0
  31. package/dist/src/types.d.ts +4 -0
  32. package/dist/src/xibo-layout-renderer.d.ts +3 -0
  33. package/dist/styles.css +171 -0
  34. package/dist/xibo-layout-renderer.cjs.js +2634 -0
  35. package/dist/xibo-layout-renderer.cjs.js.map +1 -0
  36. package/dist/xibo-layout-renderer.d.ts +201 -0
  37. package/dist/xibo-layout-renderer.esm.js +2626 -0
  38. package/dist/xibo-layout-renderer.esm.js.map +1 -0
  39. package/dist/xibo-layout-renderer.js +2638 -0
  40. package/dist/xibo-layout-renderer.min.js +2 -0
  41. package/dist/xibo-layout-renderer.min.js.map +1 -0
  42. package/package.json +45 -0
@@ -0,0 +1,2634 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ function ownKeys(e, r) {
6
+ var t = Object.keys(e);
7
+ if (Object.getOwnPropertySymbols) {
8
+ var o = Object.getOwnPropertySymbols(e);
9
+ r && (o = o.filter(function (r) {
10
+ return Object.getOwnPropertyDescriptor(e, r).enumerable;
11
+ })), t.push.apply(t, o);
12
+ }
13
+ return t;
14
+ }
15
+ function _objectSpread2(e) {
16
+ for (var r = 1; r < arguments.length; r++) {
17
+ var t = null != arguments[r] ? arguments[r] : {};
18
+ r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {
19
+ _defineProperty(e, r, t[r]);
20
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
21
+ Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
22
+ });
23
+ }
24
+ return e;
25
+ }
26
+ function _regeneratorRuntime() {
27
+ _regeneratorRuntime = function () {
28
+ return e;
29
+ };
30
+ var t,
31
+ e = {},
32
+ r = Object.prototype,
33
+ n = r.hasOwnProperty,
34
+ o = Object.defineProperty || function (t, e, r) {
35
+ t[e] = r.value;
36
+ },
37
+ i = "function" == typeof Symbol ? Symbol : {},
38
+ a = i.iterator || "@@iterator",
39
+ c = i.asyncIterator || "@@asyncIterator",
40
+ u = i.toStringTag || "@@toStringTag";
41
+ function define(t, e, r) {
42
+ return Object.defineProperty(t, e, {
43
+ value: r,
44
+ enumerable: !0,
45
+ configurable: !0,
46
+ writable: !0
47
+ }), t[e];
48
+ }
49
+ try {
50
+ define({}, "");
51
+ } catch (t) {
52
+ define = function (t, e, r) {
53
+ return t[e] = r;
54
+ };
55
+ }
56
+ function wrap(t, e, r, n) {
57
+ var i = e && e.prototype instanceof Generator ? e : Generator,
58
+ a = Object.create(i.prototype),
59
+ c = new Context(n || []);
60
+ return o(a, "_invoke", {
61
+ value: makeInvokeMethod(t, r, c)
62
+ }), a;
63
+ }
64
+ function tryCatch(t, e, r) {
65
+ try {
66
+ return {
67
+ type: "normal",
68
+ arg: t.call(e, r)
69
+ };
70
+ } catch (t) {
71
+ return {
72
+ type: "throw",
73
+ arg: t
74
+ };
75
+ }
76
+ }
77
+ e.wrap = wrap;
78
+ var h = "suspendedStart",
79
+ l = "suspendedYield",
80
+ f = "executing",
81
+ s = "completed",
82
+ y = {};
83
+ function Generator() {}
84
+ function GeneratorFunction() {}
85
+ function GeneratorFunctionPrototype() {}
86
+ var p = {};
87
+ define(p, a, function () {
88
+ return this;
89
+ });
90
+ var d = Object.getPrototypeOf,
91
+ v = d && d(d(values([])));
92
+ v && v !== r && n.call(v, a) && (p = v);
93
+ var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p);
94
+ function defineIteratorMethods(t) {
95
+ ["next", "throw", "return"].forEach(function (e) {
96
+ define(t, e, function (t) {
97
+ return this._invoke(e, t);
98
+ });
99
+ });
100
+ }
101
+ function AsyncIterator(t, e) {
102
+ function invoke(r, o, i, a) {
103
+ var c = tryCatch(t[r], t, o);
104
+ if ("throw" !== c.type) {
105
+ var u = c.arg,
106
+ h = u.value;
107
+ return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) {
108
+ invoke("next", t, i, a);
109
+ }, function (t) {
110
+ invoke("throw", t, i, a);
111
+ }) : e.resolve(h).then(function (t) {
112
+ u.value = t, i(u);
113
+ }, function (t) {
114
+ return invoke("throw", t, i, a);
115
+ });
116
+ }
117
+ a(c.arg);
118
+ }
119
+ var r;
120
+ o(this, "_invoke", {
121
+ value: function (t, n) {
122
+ function callInvokeWithMethodAndArg() {
123
+ return new e(function (e, r) {
124
+ invoke(t, n, e, r);
125
+ });
126
+ }
127
+ return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
128
+ }
129
+ });
130
+ }
131
+ function makeInvokeMethod(e, r, n) {
132
+ var o = h;
133
+ return function (i, a) {
134
+ if (o === f) throw Error("Generator is already running");
135
+ if (o === s) {
136
+ if ("throw" === i) throw a;
137
+ return {
138
+ value: t,
139
+ done: !0
140
+ };
141
+ }
142
+ for (n.method = i, n.arg = a;;) {
143
+ var c = n.delegate;
144
+ if (c) {
145
+ var u = maybeInvokeDelegate(c, n);
146
+ if (u) {
147
+ if (u === y) continue;
148
+ return u;
149
+ }
150
+ }
151
+ if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) {
152
+ if (o === h) throw o = s, n.arg;
153
+ n.dispatchException(n.arg);
154
+ } else "return" === n.method && n.abrupt("return", n.arg);
155
+ o = f;
156
+ var p = tryCatch(e, r, n);
157
+ if ("normal" === p.type) {
158
+ if (o = n.done ? s : l, p.arg === y) continue;
159
+ return {
160
+ value: p.arg,
161
+ done: n.done
162
+ };
163
+ }
164
+ "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg);
165
+ }
166
+ };
167
+ }
168
+ function maybeInvokeDelegate(e, r) {
169
+ var n = r.method,
170
+ o = e.iterator[n];
171
+ if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y;
172
+ var i = tryCatch(o, e.iterator, r.arg);
173
+ if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y;
174
+ var a = i.arg;
175
+ return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y);
176
+ }
177
+ function pushTryEntry(t) {
178
+ var e = {
179
+ tryLoc: t[0]
180
+ };
181
+ 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e);
182
+ }
183
+ function resetTryEntry(t) {
184
+ var e = t.completion || {};
185
+ e.type = "normal", delete e.arg, t.completion = e;
186
+ }
187
+ function Context(t) {
188
+ this.tryEntries = [{
189
+ tryLoc: "root"
190
+ }], t.forEach(pushTryEntry, this), this.reset(!0);
191
+ }
192
+ function values(e) {
193
+ if (e || "" === e) {
194
+ var r = e[a];
195
+ if (r) return r.call(e);
196
+ if ("function" == typeof e.next) return e;
197
+ if (!isNaN(e.length)) {
198
+ var o = -1,
199
+ i = function next() {
200
+ for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next;
201
+ return next.value = t, next.done = !0, next;
202
+ };
203
+ return i.next = i;
204
+ }
205
+ }
206
+ throw new TypeError(typeof e + " is not iterable");
207
+ }
208
+ return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", {
209
+ value: GeneratorFunctionPrototype,
210
+ configurable: !0
211
+ }), o(GeneratorFunctionPrototype, "constructor", {
212
+ value: GeneratorFunction,
213
+ configurable: !0
214
+ }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) {
215
+ var e = "function" == typeof t && t.constructor;
216
+ return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name));
217
+ }, e.mark = function (t) {
218
+ return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t;
219
+ }, e.awrap = function (t) {
220
+ return {
221
+ __await: t
222
+ };
223
+ }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () {
224
+ return this;
225
+ }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) {
226
+ void 0 === i && (i = Promise);
227
+ var a = new AsyncIterator(wrap(t, r, n, o), i);
228
+ return e.isGeneratorFunction(r) ? a : a.next().then(function (t) {
229
+ return t.done ? t.value : a.next();
230
+ });
231
+ }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () {
232
+ return this;
233
+ }), define(g, "toString", function () {
234
+ return "[object Generator]";
235
+ }), e.keys = function (t) {
236
+ var e = Object(t),
237
+ r = [];
238
+ for (var n in e) r.push(n);
239
+ return r.reverse(), function next() {
240
+ for (; r.length;) {
241
+ var t = r.pop();
242
+ if (t in e) return next.value = t, next.done = !1, next;
243
+ }
244
+ return next.done = !0, next;
245
+ };
246
+ }, e.values = values, Context.prototype = {
247
+ constructor: Context,
248
+ reset: function (e) {
249
+ if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t);
250
+ },
251
+ stop: function () {
252
+ this.done = !0;
253
+ var t = this.tryEntries[0].completion;
254
+ if ("throw" === t.type) throw t.arg;
255
+ return this.rval;
256
+ },
257
+ dispatchException: function (e) {
258
+ if (this.done) throw e;
259
+ var r = this;
260
+ function handle(n, o) {
261
+ return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o;
262
+ }
263
+ for (var o = this.tryEntries.length - 1; o >= 0; --o) {
264
+ var i = this.tryEntries[o],
265
+ a = i.completion;
266
+ if ("root" === i.tryLoc) return handle("end");
267
+ if (i.tryLoc <= this.prev) {
268
+ var c = n.call(i, "catchLoc"),
269
+ u = n.call(i, "finallyLoc");
270
+ if (c && u) {
271
+ if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
272
+ if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
273
+ } else if (c) {
274
+ if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
275
+ } else {
276
+ if (!u) throw Error("try statement without catch or finally");
277
+ if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
278
+ }
279
+ }
280
+ }
281
+ },
282
+ abrupt: function (t, e) {
283
+ for (var r = this.tryEntries.length - 1; r >= 0; --r) {
284
+ var o = this.tryEntries[r];
285
+ if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) {
286
+ var i = o;
287
+ break;
288
+ }
289
+ }
290
+ i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null);
291
+ var a = i ? i.completion : {};
292
+ return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a);
293
+ },
294
+ complete: function (t, e) {
295
+ if ("throw" === t.type) throw t.arg;
296
+ return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y;
297
+ },
298
+ finish: function (t) {
299
+ for (var e = this.tryEntries.length - 1; e >= 0; --e) {
300
+ var r = this.tryEntries[e];
301
+ if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y;
302
+ }
303
+ },
304
+ catch: function (t) {
305
+ for (var e = this.tryEntries.length - 1; e >= 0; --e) {
306
+ var r = this.tryEntries[e];
307
+ if (r.tryLoc === t) {
308
+ var n = r.completion;
309
+ if ("throw" === n.type) {
310
+ var o = n.arg;
311
+ resetTryEntry(r);
312
+ }
313
+ return o;
314
+ }
315
+ }
316
+ throw Error("illegal catch attempt");
317
+ },
318
+ delegateYield: function (e, r, n) {
319
+ return this.delegate = {
320
+ iterator: values(e),
321
+ resultName: r,
322
+ nextLoc: n
323
+ }, "next" === this.method && (this.arg = t), y;
324
+ }
325
+ }, e;
326
+ }
327
+ function _toPrimitive(t, r) {
328
+ if ("object" != typeof t || !t) return t;
329
+ var e = t[Symbol.toPrimitive];
330
+ if (void 0 !== e) {
331
+ var i = e.call(t, r || "default");
332
+ if ("object" != typeof i) return i;
333
+ throw new TypeError("@@toPrimitive must return a primitive value.");
334
+ }
335
+ return ("string" === r ? String : Number)(t);
336
+ }
337
+ function _toPropertyKey(t) {
338
+ var i = _toPrimitive(t, "string");
339
+ return "symbol" == typeof i ? i : i + "";
340
+ }
341
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
342
+ try {
343
+ var info = gen[key](arg);
344
+ var value = info.value;
345
+ } catch (error) {
346
+ reject(error);
347
+ return;
348
+ }
349
+ if (info.done) {
350
+ resolve(value);
351
+ } else {
352
+ Promise.resolve(value).then(_next, _throw);
353
+ }
354
+ }
355
+ function _asyncToGenerator(fn) {
356
+ return function () {
357
+ var self = this,
358
+ args = arguments;
359
+ return new Promise(function (resolve, reject) {
360
+ var gen = fn.apply(self, args);
361
+ function _next(value) {
362
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
363
+ }
364
+ function _throw(err) {
365
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
366
+ }
367
+ _next(undefined);
368
+ });
369
+ };
370
+ }
371
+ function _defineProperty(obj, key, value) {
372
+ key = _toPropertyKey(key);
373
+ if (key in obj) {
374
+ Object.defineProperty(obj, key, {
375
+ value: value,
376
+ enumerable: true,
377
+ configurable: true,
378
+ writable: true
379
+ });
380
+ } else {
381
+ obj[key] = value;
382
+ }
383
+ return obj;
384
+ }
385
+ function _toConsumableArray(arr) {
386
+ return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
387
+ }
388
+ function _arrayWithoutHoles(arr) {
389
+ if (Array.isArray(arr)) return _arrayLikeToArray(arr);
390
+ }
391
+ function _iterableToArray(iter) {
392
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
393
+ }
394
+ function _unsupportedIterableToArray(o, minLen) {
395
+ if (!o) return;
396
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
397
+ var n = Object.prototype.toString.call(o).slice(8, -1);
398
+ if (n === "Object" && o.constructor) n = o.constructor.name;
399
+ if (n === "Map" || n === "Set") return Array.from(o);
400
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
401
+ }
402
+ function _arrayLikeToArray(arr, len) {
403
+ if (len == null || len > arr.length) len = arr.length;
404
+ for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
405
+ return arr2;
406
+ }
407
+ function _nonIterableSpread() {
408
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
409
+ }
410
+ function _createForOfIteratorHelper(o, allowArrayLike) {
411
+ var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
412
+ if (!it) {
413
+ if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike ) {
414
+ if (it) o = it;
415
+ var i = 0;
416
+ var F = function () {};
417
+ return {
418
+ s: F,
419
+ n: function () {
420
+ if (i >= o.length) return {
421
+ done: true
422
+ };
423
+ return {
424
+ done: false,
425
+ value: o[i++]
426
+ };
427
+ },
428
+ e: function (e) {
429
+ throw e;
430
+ },
431
+ f: F
432
+ };
433
+ }
434
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
435
+ }
436
+ var normalCompletion = true,
437
+ didErr = false,
438
+ err;
439
+ return {
440
+ s: function () {
441
+ it = it.call(o);
442
+ },
443
+ n: function () {
444
+ var step = it.next();
445
+ normalCompletion = step.done;
446
+ return step;
447
+ },
448
+ e: function (e) {
449
+ didErr = true;
450
+ err = e;
451
+ },
452
+ f: function () {
453
+ try {
454
+ if (!normalCompletion && it.return != null) it.return();
455
+ } finally {
456
+ if (didErr) throw err;
457
+ }
458
+ }
459
+ };
460
+ }
461
+
462
+ var createNanoEvents = function createNanoEvents() {
463
+ return {
464
+ emit: function emit(event) {
465
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
466
+ args[_key - 1] = arguments[_key];
467
+ }
468
+ for (var i = 0, callbacks = this.events[event] || [], length = callbacks.length; i < length; i++) {
469
+ callbacks[i].apply(callbacks, args);
470
+ }
471
+ },
472
+ events: {},
473
+ on: function on(event, cb) {
474
+ var _this$events,
475
+ _this = this;
476
+ ((_this$events = this.events)[event] || (_this$events[event] = [])).push(cb);
477
+ return function () {
478
+ var _this$events$event;
479
+ _this.events[event] = (_this$events$event = _this.events[event]) === null || _this$events$event === void 0 ? void 0 : _this$events$event.filter(function (i) {
480
+ return cb !== i;
481
+ });
482
+ };
483
+ }
484
+ };
485
+ };
486
+
487
+ var RESOURCE_URL = '/playlist/widget/resource/:regionId/:id';
488
+ var XLF_URL = '/layout/xlf/:layoutId';
489
+ var LAYOUT_BACKGROUND_DOWNLOAD_URL = '/layout/background/:id';
490
+ var LAYOUT_PREVIEW_URL = '/layout/preview/[layoutCode]';
491
+ var LIBRARY_DOWNLOAD_URL = '/library/download/:id';
492
+ var LOADER_URL = '/theme/default/img/loader.gif';
493
+ var platform = {
494
+ getResourceUrl: RESOURCE_URL,
495
+ xlfUrl: XLF_URL,
496
+ layoutBackgroundDownloadUrl: LAYOUT_BACKGROUND_DOWNLOAD_URL,
497
+ layoutPreviewUrl: LAYOUT_PREVIEW_URL,
498
+ libraryDownloadUrl: LIBRARY_DOWNLOAD_URL,
499
+ loaderUrl: LOADER_URL,
500
+ idCounter: 0,
501
+ inPreview: true,
502
+ appHost: null,
503
+ platform: 'CMS'
504
+ };
505
+
506
+ var initialLayout = {
507
+ id: null,
508
+ layoutId: null,
509
+ sw: 0,
510
+ sh: 0,
511
+ xw: 0,
512
+ xh: 0,
513
+ zIndex: 0,
514
+ scaleFactor: 1,
515
+ sWidth: 0,
516
+ sHeight: 0,
517
+ offsetX: 0,
518
+ offsetY: 0,
519
+ bgColor: '',
520
+ bgImage: '',
521
+ bgId: '',
522
+ containerName: '',
523
+ layoutNode: null,
524
+ regionMaxZIndex: 0,
525
+ ready: false,
526
+ regionObjects: [],
527
+ drawer: [],
528
+ allExpired: false,
529
+ regions: [],
530
+ actions: [],
531
+ options: platform,
532
+ done: false,
533
+ allEnded: false,
534
+ path: '',
535
+ prepareLayout: function prepareLayout() {},
536
+ parseXlf: function parseXlf() {},
537
+ run: function run() {},
538
+ on: function on(event, callback) {
539
+ return {};
540
+ },
541
+ regionExpired: function regionExpired() {},
542
+ end: function end() {},
543
+ regionEnded: function regionEnded() {},
544
+ stopAllMedia: function stopAllMedia() {
545
+ return Promise.resolve();
546
+ },
547
+ resetLayout: function resetLayout() {
548
+ return Promise.resolve();
549
+ },
550
+ emitter: {},
551
+ index: -1
552
+ };
553
+
554
+ function nextId(options) {
555
+ if (options.idCounter > 500) {
556
+ options.idCounter = 0;
557
+ }
558
+ options.idCounter = options.idCounter + 1;
559
+ return options.idCounter;
560
+ }
561
+ var getMediaId = function getMediaId(_ref) {
562
+ var mediaType = _ref.mediaType,
563
+ containerName = _ref.containerName;
564
+ var mediaId = containerName;
565
+ if (mediaType === 'video') {
566
+ mediaId = mediaId + '-vid';
567
+ } else if (mediaType === 'audio') {
568
+ mediaId = mediaId + '-aud';
569
+ }
570
+ return mediaId;
571
+ };
572
+ var capitalizeStr = function capitalizeStr(inputStr) {
573
+ if (inputStr === null) {
574
+ return '';
575
+ }
576
+ return String(inputStr).charAt(0).toUpperCase() + String(inputStr).substring(1);
577
+ };
578
+ function getDataBlob(_x) {
579
+ return _getDataBlob.apply(this, arguments);
580
+ }
581
+ function _getDataBlob() {
582
+ _getDataBlob = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(src) {
583
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
584
+ while (1) switch (_context.prev = _context.next) {
585
+ case 0:
586
+ return _context.abrupt("return", fetch(src, {
587
+ mode: 'no-cors'
588
+ }).then(function (res) {
589
+ return res.blob();
590
+ }).then(function (blob) {
591
+ return new Promise(function (res, rej) {
592
+ var reader = new FileReader();
593
+ reader.onloadend = function () {
594
+ return res(reader.result);
595
+ };
596
+ reader.onerror = rej;
597
+ reader.readAsDataURL(blob);
598
+ });
599
+ }));
600
+ case 1:
601
+ case "end":
602
+ return _context.stop();
603
+ }
604
+ }, _callee);
605
+ }));
606
+ return _getDataBlob.apply(this, arguments);
607
+ }
608
+ function preloadMediaBlob(_x2, _x3) {
609
+ return _preloadMediaBlob.apply(this, arguments);
610
+ }
611
+ function _preloadMediaBlob() {
612
+ _preloadMediaBlob = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(src, type) {
613
+ var res, blob, data;
614
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
615
+ while (1) switch (_context2.prev = _context2.next) {
616
+ case 0:
617
+ _context2.next = 2;
618
+ return fetch(src, {
619
+ mode: 'no-cors'
620
+ });
621
+ case 2:
622
+ res = _context2.sent;
623
+ blob = new Blob();
624
+ if (!(type === 'image')) {
625
+ _context2.next = 8;
626
+ break;
627
+ }
628
+ blob = new Blob();
629
+ _context2.next = 19;
630
+ break;
631
+ case 8:
632
+ if (!(type === 'video')) {
633
+ _context2.next = 14;
634
+ break;
635
+ }
636
+ _context2.next = 11;
637
+ return res.blob();
638
+ case 11:
639
+ blob = _context2.sent;
640
+ _context2.next = 19;
641
+ break;
642
+ case 14:
643
+ if (!(type === 'audio')) {
644
+ _context2.next = 19;
645
+ break;
646
+ }
647
+ _context2.next = 17;
648
+ return res.arrayBuffer();
649
+ case 17:
650
+ data = _context2.sent;
651
+ blob = new Blob([data], {
652
+ type: audioFileType(getFileExt(src))
653
+ });
654
+ case 19:
655
+ return _context2.abrupt("return", URL.createObjectURL(blob));
656
+ case 20:
657
+ case "end":
658
+ return _context2.stop();
659
+ }
660
+ }, _callee2);
661
+ }));
662
+ return _preloadMediaBlob.apply(this, arguments);
663
+ }
664
+ function fetchJSON(_x4) {
665
+ return _fetchJSON.apply(this, arguments);
666
+ }
667
+ function _fetchJSON() {
668
+ _fetchJSON = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(url) {
669
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
670
+ while (1) switch (_context3.prev = _context3.next) {
671
+ case 0:
672
+ return _context3.abrupt("return", fetch(url).then(function (res) {
673
+ return res.json();
674
+ })["catch"](function (err) {
675
+ console.debug(err);
676
+ }));
677
+ case 1:
678
+ case "end":
679
+ return _context3.stop();
680
+ }
681
+ }, _callee3);
682
+ }));
683
+ return _fetchJSON.apply(this, arguments);
684
+ }
685
+ function getFileExt(filename) {
686
+ var filenameArr = String(filename).split('.');
687
+ return filenameArr[filenameArr.length - 1];
688
+ }
689
+ function audioFileType(str) {
690
+ var validAudioTypes = {
691
+ 'mp3': 'audio/mp3',
692
+ 'wav': 'audio/wav',
693
+ 'ogg': 'audio/ogg'
694
+ };
695
+ if (Boolean(validAudioTypes[str])) {
696
+ return validAudioTypes[str];
697
+ }
698
+ return undefined;
699
+ }
700
+ function composeResourceUrlByPlatform(options, params) {
701
+ var resourceUrl = params.regionOptions.getResourceUrl.replace(":regionId", params.regionId).replace(":id", params.mediaId) + '?preview=1&layoutPreview=1';
702
+ if (options.platform === 'chromeOS') {
703
+ var resourceEndpoint = '/required-files/resource/';
704
+ if (!params.isGlobalContent && params.isImageOrVideo) {
705
+ resourceUrl = resourceEndpoint + params.fileId + '?saveAs=' + params.uri;
706
+ }
707
+ } else if (!Boolean(params['mediaType'])) {
708
+ resourceUrl += '&scale_override=' + params.scaleFactor;
709
+ }
710
+ return resourceUrl;
711
+ }
712
+ function composeResourceUrl(options, params) {
713
+ var _options$config, _options$config2, _options$config3;
714
+ var schemaVersion = options && ((_options$config = options.config) === null || _options$config === void 0 ? void 0 : _options$config.schemaVersion);
715
+ var hardwareKey = options && ((_options$config2 = options.config) === null || _options$config2 === void 0 ? void 0 : _options$config2.hardwareKey);
716
+ var serverKey = options && ((_options$config3 = options.config) === null || _options$config3 === void 0 ? void 0 : _options$config3.cmsKey);
717
+ return '/pwa/getResource' + '?v=' + schemaVersion + '&serverKey=' + serverKey + '&hardwareKey=' + hardwareKey + '&layoutId=' + params.layoutId + '&regionId=' + params.regionId + '&mediaId=' + params.mediaId;
718
+ }
719
+ function composeBgUrlByPlatform(platform, params) {
720
+ var bgImageUrl = params.layoutBackgroundDownloadUrl.replace(":id", params.layout.id) + '?preview=1&width=' + params.layout.sWidth + '&height=' + params.layout.sHeight + '&dynamic&proportional=0';
721
+ if (platform === 'chromeOS') {
722
+ bgImageUrl = '/required-files/resource/' + params.layout.id + '?saveAs=' + params.layout.bgImage;
723
+ }
724
+ return bgImageUrl;
725
+ }
726
+ function getIndexByLayoutId(layoutsInput, layoutId) {
727
+ var layoutIndexes = layoutsInput.reduce(function (a, b, indx) {
728
+ a[Number(b.layoutId)] = _objectSpread2(_objectSpread2({}, b), {}, {
729
+ index: indx
730
+ });
731
+ return a;
732
+ }, {});
733
+ if (layoutId === null || !layoutId) {
734
+ return layoutIndexes;
735
+ }
736
+ if (Boolean(layoutIndexes[layoutId])) {
737
+ return layoutIndexes[layoutId];
738
+ }
739
+ // Defaults to 0
740
+ return {
741
+ index: 0
742
+ };
743
+ }
744
+
745
+ var initialRegion = {
746
+ layout: initialLayout,
747
+ id: '',
748
+ regionId: '',
749
+ xml: null,
750
+ mediaObjects: [],
751
+ mediaObjectsActions: [],
752
+ currentMedia: -1,
753
+ complete: false,
754
+ containerName: '',
755
+ ending: false,
756
+ ended: false,
757
+ oneMedia: false,
758
+ oldMedia: undefined,
759
+ curMedia: undefined,
760
+ nxtMedia: undefined,
761
+ currentMediaIndex: 0,
762
+ totalMediaObjects: 0,
763
+ ready: false,
764
+ options: {},
765
+ sWidth: 0,
766
+ sHeight: 0,
767
+ offsetX: 0,
768
+ offsetY: 0,
769
+ zIndex: 0,
770
+ index: -1,
771
+ prepareRegion: function prepareRegion() {},
772
+ playNextMedia: function playNextMedia() {},
773
+ transitionNodes: function transitionNodes() {},
774
+ finished: function finished() {},
775
+ run: function run() {},
776
+ end: function end() {},
777
+ exitTransition: function exitTransition() {},
778
+ exitTransitionComplete: function exitTransitionComplete() {},
779
+ on: function on(event, callback) {
780
+ return {};
781
+ },
782
+ prepareMediaObjects: function prepareMediaObjects() {},
783
+ reset: function reset() {}
784
+ };
785
+
786
+ var initialMedia = {
787
+ region: initialRegion,
788
+ xml: null,
789
+ id: '',
790
+ mediaId: '',
791
+ index: 0,
792
+ idCounter: 0,
793
+ containerName: '',
794
+ html: null,
795
+ iframe: null,
796
+ iframeName: '',
797
+ mediaType: '',
798
+ render: 'html',
799
+ attachedAudio: false,
800
+ singlePlay: false,
801
+ timeoutId: setTimeout(function () {}, 0),
802
+ ready: true,
803
+ checkIframeStatus: false,
804
+ loadIframeOnRun: false,
805
+ tempSrc: '',
806
+ finished: false,
807
+ schemaVersion: '1',
808
+ type: '',
809
+ duration: 0,
810
+ useDuration: Boolean(0),
811
+ fileId: '',
812
+ uri: '',
813
+ options: {},
814
+ divWidth: 0,
815
+ divHeight: 0,
816
+ url: null,
817
+ loop: false,
818
+ run: function run() {},
819
+ init: function init() {},
820
+ stop: function stop() {
821
+ return Promise.resolve();
822
+ },
823
+ on: function on(event, callback) {
824
+ return {};
825
+ },
826
+ emitter: {}
827
+ };
828
+
829
+ /*
830
+ * Copyright (C) 2024 Xibo Signage Ltd
831
+ *
832
+ * Xibo - Digital Signage - https://www.xibosignage.com
833
+ *
834
+ * This file is part of Xibo.
835
+ *
836
+ * Xibo is free software: you can redistribute it and/or modify
837
+ * it under the terms of the GNU Lesser General Public License as published by
838
+ * the Free Software Foundation, either version 3 of the License, or
839
+ * any later version.
840
+ *
841
+ * Xibo is distributed in the hope that it will be useful,
842
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
843
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
844
+ * GNU Lesser General Public License for more details.
845
+ *
846
+ * You should have received a copy of the GNU Lesser General Public License
847
+ * along with Xibo. If not, see <http://www.gnu.org/licenses/>.
848
+ */
849
+ var defaultTrans = function defaultTrans(duration, trans) {
850
+ var defaultKeyframes = [{
851
+ display: trans === 'in' ? 'none' : 'block'
852
+ }, {
853
+ display: trans === 'out' ? 'none' : 'block'
854
+ }];
855
+ var defaultTiming = {
856
+ duration: duration
857
+ };
858
+ return {
859
+ keyframes: defaultKeyframes,
860
+ timing: defaultTiming
861
+ };
862
+ };
863
+ var fadeInElem = function fadeInElem(duration) {
864
+ var fadeInKeyframes = [{
865
+ opacity: 0
866
+ }, {
867
+ opacity: 1
868
+ }];
869
+ var fadeInTiming = {
870
+ duration: duration,
871
+ fill: 'forwards'
872
+ };
873
+ return {
874
+ keyframes: fadeInKeyframes,
875
+ timing: fadeInTiming
876
+ };
877
+ };
878
+ var fadeOutElem = function fadeOutElem(duration) {
879
+ var fadeOutKeyframes = [{
880
+ opacity: 1
881
+ }, {
882
+ opacity: 0,
883
+ zIndex: -1
884
+ }];
885
+ var fadeOutTiming = {
886
+ duration: duration,
887
+ fill: 'forwards'
888
+ };
889
+ return {
890
+ keyframes: fadeOutKeyframes,
891
+ timing: fadeOutTiming
892
+ };
893
+ };
894
+ var flyInElem = function flyInElem(duration, keyframeOptions, direction) {
895
+ var flyInKeyframes = [{
896
+ opacity: 0
897
+ }, {
898
+ opacity: 1,
899
+ zIndex: 1
900
+ }];
901
+ var flyInTiming = {
902
+ duration: duration,
903
+ fill: 'forwards'
904
+ };
905
+ if (keyframeOptions && Boolean(keyframeOptions.from)) {
906
+ flyInKeyframes[0] = _objectSpread2(_objectSpread2({}, keyframeOptions.from), flyInKeyframes[0]);
907
+ }
908
+ if (keyframeOptions && Boolean(keyframeOptions.to)) {
909
+ flyInKeyframes[1] = _objectSpread2(_objectSpread2({}, keyframeOptions.to), flyInKeyframes[1]);
910
+ }
911
+ return {
912
+ keyframes: flyInKeyframes,
913
+ timing: flyInTiming
914
+ };
915
+ };
916
+ var flyOutElem = function flyOutElem(duration, keyframeOptions, direction) {
917
+ var flyOutKeyframes = [{
918
+ opacity: 1
919
+ }, {
920
+ opacity: 0,
921
+ zIndex: -1
922
+ }];
923
+ var flyOutTiming = {
924
+ duration: duration,
925
+ fill: 'forwards'
926
+ };
927
+ if (keyframeOptions && Boolean(keyframeOptions.from)) {
928
+ flyOutKeyframes[0] = _objectSpread2(_objectSpread2({}, keyframeOptions.from), flyOutKeyframes[0]);
929
+ }
930
+ if (keyframeOptions && Boolean(keyframeOptions.to)) {
931
+ flyOutKeyframes[1] = _objectSpread2(_objectSpread2({}, keyframeOptions.to), flyOutKeyframes[1]);
932
+ }
933
+ return {
934
+ keyframes: flyOutKeyframes,
935
+ timing: flyOutTiming
936
+ };
937
+ };
938
+ var transitionElement = function transitionElement(transition, options) {
939
+ var transitions = {
940
+ fadeIn: fadeInElem(options.duration),
941
+ fadeOut: fadeOutElem(options.duration),
942
+ flyIn: flyInElem(options.duration, options.keyframes, options.direction),
943
+ flyOut: flyOutElem(options.duration, options.keyframes, options.direction),
944
+ defaultIn: defaultTrans(options.duration, 'in'),
945
+ defaultOut: defaultTrans(options.duration, 'out')
946
+ };
947
+ return transitions[transition];
948
+ };
949
+ var flyTransitionKeyframes = function flyTransitionKeyframes(params) {
950
+ var keyframes = {
951
+ from: {},
952
+ to: {}
953
+ };
954
+ var opacityAttr = function opacityAttr(source) {
955
+ if (source === 'from') {
956
+ return params.trans === 'in' ? 0 : 1;
957
+ }
958
+ return params.trans === 'out' ? 1 : 0;
959
+ };
960
+ switch (params.direction) {
961
+ case 'N':
962
+ keyframes.from = {
963
+ opacity: opacityAttr('from'),
964
+ top: params.trans === 'in' ? "".concat(params.height, "px") : 0
965
+ };
966
+ keyframes.to = {
967
+ opacity: opacityAttr('to'),
968
+ top: params.trans === 'in' ? 0 : "-".concat(params.height, "px")
969
+ };
970
+ break;
971
+ case 'NE':
972
+ keyframes.from = {
973
+ opacity: opacityAttr('from'),
974
+ top: params.trans === 'in' ? "".concat(params.height, "px") : 0,
975
+ left: params.trans === 'in' ? "-".concat(params.width, "px") : 0
976
+ };
977
+ keyframes.to = {
978
+ opacity: opacityAttr('to'),
979
+ top: params.trans === 'in' ? 0 : "-".concat(params.height, "px"),
980
+ left: params.trans === 'in' ? 0 : "".concat(params.width, "px")
981
+ };
982
+ break;
983
+ case 'E':
984
+ keyframes.from = {
985
+ opacity: opacityAttr('from'),
986
+ left: params.trans === 'in' ? "-".concat(params.width, "px") : 0
987
+ };
988
+ keyframes.to = {
989
+ opacity: opacityAttr('to'),
990
+ left: params.trans === 'in' ? 0 : "".concat(params.width, "px")
991
+ };
992
+ break;
993
+ case 'SE':
994
+ keyframes.from = {
995
+ opacity: opacityAttr('from'),
996
+ top: params.trans === 'in' ? "-".concat(params.height, "px") : 0,
997
+ left: params.trans === 'in' ? "-".concat(params.width, "px") : 0
998
+ };
999
+ keyframes.to = {
1000
+ opacity: opacityAttr('to'),
1001
+ top: params.trans === 'in' ? 0 : "".concat(params.height, "px"),
1002
+ left: params.trans === 'in' ? 0 : "".concat(params.width, "px")
1003
+ };
1004
+ break;
1005
+ case 'S':
1006
+ keyframes.from = {
1007
+ opacity: opacityAttr('from'),
1008
+ top: params.trans === 'in' ? "-".concat(params.height, "px") : 0
1009
+ };
1010
+ keyframes.to = {
1011
+ opacity: opacityAttr('to'),
1012
+ top: params.trans === 'in' ? 0 : "".concat(params.height, "px")
1013
+ };
1014
+ break;
1015
+ case 'SW':
1016
+ keyframes.from = {
1017
+ opacity: opacityAttr('from'),
1018
+ top: params.trans === 'in' ? "-".concat(params.height, "px") : 0,
1019
+ left: params.trans === 'in' ? "".concat(params.width, "px") : 0
1020
+ };
1021
+ keyframes.to = {
1022
+ opacity: opacityAttr('to'),
1023
+ top: params.trans === 'in' ? 0 : "".concat(params.height, "px"),
1024
+ left: params.trans === 'in' ? 0 : "-".concat(params.width, "px")
1025
+ };
1026
+ break;
1027
+ case 'W':
1028
+ keyframes.from = {
1029
+ opacity: opacityAttr('from'),
1030
+ left: params.trans === 'in' ? "".concat(params.width, "px") : 0
1031
+ };
1032
+ keyframes.to = {
1033
+ opacity: opacityAttr('to'),
1034
+ left: params.trans === 'in' ? 0 : "-".concat(params.width, "px")
1035
+ };
1036
+ break;
1037
+ case 'NW':
1038
+ keyframes.from = {
1039
+ opacity: opacityAttr('from'),
1040
+ top: params.trans === 'in' ? "".concat(params.height, "px") : 0,
1041
+ left: params.trans === 'in' ? "".concat(params.width, "px") : 0
1042
+ };
1043
+ keyframes.to = {
1044
+ opacity: opacityAttr('to'),
1045
+ top: params.trans === 'in' ? 0 : "-".concat(params.height, "px"),
1046
+ left: params.trans === 'in' ? 0 : "-".concat(params.width, "px")
1047
+ };
1048
+ break;
1049
+ default:
1050
+ keyframes.from = {
1051
+ opacity: opacityAttr('from'),
1052
+ top: params.trans === 'in' ? "".concat(params.height, "px") : 0
1053
+ };
1054
+ keyframes.to = {
1055
+ opacity: opacityAttr('to'),
1056
+ top: params.trans === 'in' ? 0 : "-".concat(params.height, "px")
1057
+ };
1058
+ break;
1059
+ }
1060
+ return keyframes;
1061
+ };
1062
+
1063
+ function VideoMedia(media) {
1064
+ var videoMediaObject = {
1065
+ init: function init() {
1066
+ var $videoMedia = document.getElementById(getMediaId(media));
1067
+ if ($videoMedia) {
1068
+ $videoMedia.onloadstart = function () {
1069
+ console.debug("".concat(capitalizeStr(media.mediaType), " for media > ").concat(media.id, " has started loading data . . ."));
1070
+ };
1071
+ $videoMedia.onloadeddata = function () {
1072
+ if ($videoMedia.readyState >= 2) {
1073
+ console.debug("".concat(capitalizeStr(media.mediaType), " data for media > ").concat(media.id, " has been fully loaded . . ."));
1074
+ }
1075
+ };
1076
+ $videoMedia.oncanplay = function () {
1077
+ console.debug("".concat(capitalizeStr(media.mediaType), " for media > ").concat(media.id, " can be played . . ."));
1078
+ var videoPlayPromise = $videoMedia.play();
1079
+ if (videoPlayPromise !== undefined) {
1080
+ videoPlayPromise.then(function () {
1081
+ console.debug('autoplay started . . .');
1082
+ // Autoplay restarted
1083
+ })["catch"](function (error) {
1084
+ $videoMedia.muted = true;
1085
+ $videoMedia.play();
1086
+ });
1087
+ }
1088
+ };
1089
+ $videoMedia.onplaying = function () {
1090
+ console.debug("".concat(capitalizeStr(media.mediaType), " for media > ").concat(media.id, " is now playing . . ."));
1091
+ };
1092
+ if (media.duration === 0) {
1093
+ $videoMedia.ondurationchange = function () {
1094
+ console.debug('Showing Media ' + media.id + ' for ' + $videoMedia.duration + 's of Region ' + media.region.regionId);
1095
+ };
1096
+ $videoMedia.onended = function () {
1097
+ var _media$emitter;
1098
+ console.debug("".concat(capitalizeStr(media.mediaType), " for media > ").concat(media.id, " has ended playing . . ."));
1099
+ (_media$emitter = media.emitter) === null || _media$emitter === void 0 || _media$emitter.emit('end', media);
1100
+ };
1101
+ }
1102
+ }
1103
+ }
1104
+ };
1105
+ return videoMediaObject;
1106
+ }
1107
+
1108
+ function AudioMedia(media) {
1109
+ var audioMediaObject = {
1110
+ init: function init() {
1111
+ var $audioMedia = document.getElementById(getMediaId(media));
1112
+ var $playBtn = null;
1113
+ if ($audioMedia) {
1114
+ $audioMedia.onloadstart = function () {
1115
+ console.debug("".concat(capitalizeStr(media.mediaType), " for media > ").concat(media.id, " has started loading data . . ."));
1116
+ };
1117
+ $audioMedia.onloadeddata = function () {
1118
+ if ($audioMedia.readyState >= 2) {
1119
+ console.debug("".concat(capitalizeStr(media.mediaType), " data for media > ").concat(media.id, " has been fully loaded . . ."));
1120
+ }
1121
+ };
1122
+ $audioMedia.oncanplay = function () {
1123
+ console.debug("".concat(capitalizeStr(media.mediaType), " for media > ").concat(media.id, " can be played . . ."));
1124
+ };
1125
+ $audioMedia.onplaying = function () {
1126
+ console.debug("".concat(capitalizeStr(media.mediaType), " for media > ").concat(media.id, " is now playing . . ."));
1127
+ if ($playBtn !== null) {
1128
+ $playBtn.remove();
1129
+ }
1130
+ };
1131
+ var audioPlayPromise = $audioMedia.play();
1132
+ if (audioPlayPromise !== undefined) {
1133
+ audioPlayPromise.then(function () {
1134
+ console.debug('autoplay started . . .');
1135
+ // Autoplay restarted
1136
+ })["catch"](function (error) {
1137
+ if (error.name === 'NotAllowedError') {
1138
+ var _$audioMedia$parentNo;
1139
+ // Let's show a play audio button
1140
+ $playBtn = document.createElement('button');
1141
+ $playBtn.classList.add('play-audio-btn');
1142
+ $playBtn.textContent = 'Play Audio';
1143
+ $playBtn.addEventListener('click', function () {
1144
+ $audioMedia.muted = false;
1145
+ $audioMedia.play();
1146
+ });
1147
+ (_$audioMedia$parentNo = $audioMedia.parentNode) === null || _$audioMedia$parentNo === void 0 || _$audioMedia$parentNo.insertBefore($playBtn, $audioMedia.nextSibling);
1148
+ }
1149
+ });
1150
+ }
1151
+ if (media.duration === 0) {
1152
+ $audioMedia.ondurationchange = function () {
1153
+ console.debug('Showing Media ' + media.id + ' for ' + $audioMedia.duration + 's of Region ' + media.region.regionId);
1154
+ };
1155
+ $audioMedia.onended = function () {
1156
+ var _media$emitter;
1157
+ console.debug("".concat(capitalizeStr(media.mediaType), " for media > ").concat(media.id, " has ended playing . . ."));
1158
+ (_media$emitter = media.emitter) === null || _media$emitter === void 0 || _media$emitter.emit('end', media);
1159
+ };
1160
+ }
1161
+ }
1162
+ }
1163
+ };
1164
+ return audioMediaObject;
1165
+ }
1166
+
1167
+ function Media(region, mediaId, xml, options, xlr) {
1168
+ var props = {
1169
+ region: region,
1170
+ mediaId: mediaId,
1171
+ xml: xml,
1172
+ options: options
1173
+ };
1174
+ var mediaTimer = null;
1175
+ var mediaTimeCount = 0;
1176
+ var emitter = createNanoEvents();
1177
+ var mediaObject = _objectSpread2(_objectSpread2({}, initialMedia), props);
1178
+ var startMediaTimer = function startMediaTimer(media) {
1179
+ mediaTimer = setInterval(function () {
1180
+ mediaTimeCount++;
1181
+ if (mediaTimeCount > media.duration) {
1182
+ media.emitter.emit('end', media);
1183
+ }
1184
+ }, 1000);
1185
+ console.debug('Showing Media ' + media.id + ' for ' + media.duration + 's of Region ' + media.region.regionId);
1186
+ };
1187
+ emitter.on('start', function (media) {
1188
+ if (media.mediaType === 'video') {
1189
+ VideoMedia(media).init();
1190
+ if (media.duration > 0) {
1191
+ startMediaTimer(media);
1192
+ }
1193
+ } else if (media.mediaType === 'audio') {
1194
+ AudioMedia(media).init();
1195
+ if (media.duration > 0) {
1196
+ startMediaTimer(media);
1197
+ }
1198
+ } else {
1199
+ startMediaTimer(media);
1200
+ }
1201
+ });
1202
+ emitter.on('end', function (media) {
1203
+ if (mediaTimer) {
1204
+ clearInterval(mediaTimer);
1205
+ mediaTimeCount = 0;
1206
+ }
1207
+ media.region.playNextMedia();
1208
+ });
1209
+ mediaObject.on = function (event, callback) {
1210
+ return emitter.on(event, callback);
1211
+ };
1212
+ mediaObject.emitter = emitter;
1213
+ mediaObject.init = function () {
1214
+ var _self$xml, _self$xml2, _self$xml3, _self$xml4, _self$xml5;
1215
+ var self = mediaObject;
1216
+ self.id = props.mediaId;
1217
+ self.fileId = ((_self$xml = self.xml) === null || _self$xml === void 0 ? void 0 : _self$xml.getAttribute('fileId')) || '';
1218
+ self.idCounter = nextId(props.options);
1219
+ self.containerName = "M-".concat(self.id, "-").concat(self.idCounter);
1220
+ self.iframeName = "".concat(self.containerName, "-iframe");
1221
+ self.mediaType = ((_self$xml2 = self.xml) === null || _self$xml2 === void 0 ? void 0 : _self$xml2.getAttribute('type')) || '';
1222
+ self.render = ((_self$xml3 = self.xml) === null || _self$xml3 === void 0 ? void 0 : _self$xml3.getAttribute('render')) || '';
1223
+ self.duration = parseInt((_self$xml4 = self.xml) === null || _self$xml4 === void 0 ? void 0 : _self$xml4.getAttribute('duration')) || 0;
1224
+ self.options = _objectSpread2({}, props.options);
1225
+ var $mediaIframe = document.createElement('iframe');
1226
+ var mediaOptions = (_self$xml5 = self.xml) === null || _self$xml5 === void 0 ? void 0 : _self$xml5.getElementsByTagName('options');
1227
+ if (mediaOptions) {
1228
+ for (var _i = 0, _Array$from = Array.from(mediaOptions); _i < _Array$from.length; _i++) {
1229
+ var _options = _Array$from[_i];
1230
+ // Get options
1231
+ var _mediaOptions = _options.children;
1232
+ for (var _i2 = 0, _Array$from2 = Array.from(_mediaOptions); _i2 < _Array$from2.length; _i2++) {
1233
+ var mediaOption = _Array$from2[_i2];
1234
+ self.options[mediaOption.nodeName.toLowerCase()] = mediaOption.textContent;
1235
+ }
1236
+ }
1237
+ }
1238
+ // Check for options.uri and add it to media
1239
+ if (Boolean(self.options['uri'])) {
1240
+ self.uri = self.options['uri'];
1241
+ }
1242
+ // Show in fullscreen?
1243
+ if (self.options.showfullscreen === "1") {
1244
+ // Set dimensions as the layout ones
1245
+ self.divWidth = self.region.layout.sWidth;
1246
+ self.divHeight = self.region.layout.sHeight;
1247
+ } else {
1248
+ // Set dimensions as the region ones
1249
+ self.divWidth = self.region.sWidth;
1250
+ self.divHeight = self.region.sHeight;
1251
+ }
1252
+ $mediaIframe.scrolling = 'no';
1253
+ $mediaIframe.id = self.iframeName;
1254
+ $mediaIframe.width = "".concat(self.divWidth, "px");
1255
+ $mediaIframe.height = "".concat(self.divHeight, "px");
1256
+ $mediaIframe.style.cssText = "border: 0;";
1257
+ var $mediaId = getMediaId(self);
1258
+ var $media = document.getElementById($mediaId);
1259
+ if ($media === null) {
1260
+ if (self.mediaType === 'video') {
1261
+ $media = document.createElement('video');
1262
+ } else if (self.mediaType === 'audio') {
1263
+ $media = new Audio();
1264
+ } else {
1265
+ $media = document.createElement('div');
1266
+ }
1267
+ $media.id = $mediaId;
1268
+ }
1269
+ $media.className = 'media--item';
1270
+ /* Scale the Content Container */
1271
+ $media.style.cssText = "\n display: none;\n width: ".concat(self.divWidth, "px;\n height: ").concat(self.divHeight, "px;\n position: absolute;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n ");
1272
+ document.getElementById("".concat(self.region.containerName));
1273
+ var resourceUrlParams = _objectSpread2(_objectSpread2({}, xlr.config.config), {}, {
1274
+ regionOptions: self.region.options,
1275
+ layoutId: self.region.layout.layoutId,
1276
+ regionId: self.region.id,
1277
+ mediaId: self.id,
1278
+ fileId: self.fileId,
1279
+ scaleFactor: self.region.layout.scaleFactor,
1280
+ uri: self.uri,
1281
+ isGlobalContent: self.mediaType === 'global',
1282
+ isImageOrVideo: self.mediaType === 'image' || self.mediaType === 'video'
1283
+ });
1284
+ if (self.mediaType === 'image' || self.mediaType === 'video') {
1285
+ resourceUrlParams.mediaType = self.mediaType;
1286
+ }
1287
+ var tmpUrl = '';
1288
+ if (xlr.config.platform === 'CMS') {
1289
+ tmpUrl = composeResourceUrlByPlatform(xlr.config, resourceUrlParams);
1290
+ } else if (xlr.config.platform === 'chromeOS') {
1291
+ tmpUrl = composeResourceUrl(xlr.config, resourceUrlParams);
1292
+ }
1293
+ self.url = tmpUrl;
1294
+ // Loop if media has loop, or if region has loop and a single media
1295
+ self.loop = self.options['loop'] == '1' || self.region.options['loop'] == '1' && self.region.totalMediaObjects == 1;
1296
+ if (self.render === 'html' || self.render === 'webpage') {
1297
+ $mediaIframe.src = self.url;
1298
+ } else {
1299
+ $mediaIframe.src = "".concat(self.url, "&width=").concat(self.divWidth, "&height=").concat(self.divHeight);
1300
+ }
1301
+ // Check/set iframe based widgets play status
1302
+ // Populate mediaIframe content without using src attribute
1303
+ // let iframeSrc = tmpUrl;
1304
+ //
1305
+ // if (self.render !== 'html' && self.render !== 'webpage') {
1306
+ // iframeSrc = `${tmpUrl}&width=${self.divWidth}&height=${self.divHeight}`;
1307
+ // }
1308
+ //
1309
+ // if (self.render === 'html' || self.render === 'webpage') {
1310
+ // if (xlr.config.platform === 'CMS') {
1311
+ // $mediaIframe.src = iframeSrc;
1312
+ // } else if (xlr.config.platform === 'chromeOS') {
1313
+ // (async () => {
1314
+ // const mediaHtml = await fetchText(iframeSrc);
1315
+ //
1316
+ // if ($mediaIframe) {
1317
+ // $mediaIframe.contentDocument?.open();
1318
+ // $mediaIframe.contentDocument?.write(mediaHtml);
1319
+ // $mediaIframe.contentDocument?.close();
1320
+ // }
1321
+ // })();
1322
+ // }
1323
+ // }
1324
+ if (self.render === 'html' || self.mediaType === 'ticker' || self.mediaType === 'webpage') {
1325
+ self.checkIframeStatus = true;
1326
+ self.iframe = $mediaIframe;
1327
+ } else if (self.mediaType === "image") {
1328
+ if (self.options['scaletype'] === 'stretch') {
1329
+ $media.style.cssText = $media.style.cssText.concat("background-size: 100% 100%;");
1330
+ } else if (self.options['scaletype'] === 'fit') {
1331
+ $media.style.cssText = $media.style.cssText.concat("background-size: cover;");
1332
+ } else {
1333
+ // Center scale type, do we have align or valign?
1334
+ var align = self.options['align'] == "" ? "center" : self.options['align'];
1335
+ var valign = self.options['valign'] == "" || self.options['valign'] == "middle" ? "center" : self.options['valign'];
1336
+ $media.style.cssText = $media.style.cssText.concat("background-position: ".concat(align, " ").concat(valign));
1337
+ }
1338
+ } else if (self.mediaType === 'video') {
1339
+ var $videoMedia = $media;
1340
+ $videoMedia.preload = 'auto';
1341
+ $videoMedia.textContent = 'Unsupported Video';
1342
+ if (Boolean(self.options['mute'])) {
1343
+ $videoMedia.muted = self.options.mute === '1';
1344
+ }
1345
+ if (Boolean(self.options['scaletype'])) {
1346
+ if (self.options.scaletype === 'stretch') {
1347
+ $videoMedia.style.objectFit = 'fill';
1348
+ }
1349
+ }
1350
+ $videoMedia.playsInline = true;
1351
+ if (self.loop) {
1352
+ $videoMedia.loop = true;
1353
+ }
1354
+ $media = $videoMedia;
1355
+ } else if (self.mediaType === 'audio') {
1356
+ var $audioMedia = $media;
1357
+ $audioMedia.preload = 'auto';
1358
+ $audioMedia.textContent = 'Unsupported Audio';
1359
+ $audioMedia.autoplay = true;
1360
+ if (self.loop) {
1361
+ $audioMedia.loop = true;
1362
+ }
1363
+ $media = $audioMedia;
1364
+ }
1365
+ // Duration is per item condition
1366
+ if (self.render === 'html' || self.mediaType === 'ticker') {
1367
+ /* Check if the ticker duration is based on the number of items in the feed */
1368
+ if (self.options['durationisperitem'] === '1') {
1369
+ var regex = new RegExp('<!-- NUMITEMS=(.*?) -->');
1370
+ _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
1371
+ var html, res;
1372
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
1373
+ while (1) switch (_context.prev = _context.next) {
1374
+ case 0:
1375
+ _context.next = 2;
1376
+ return fetchJSON("".concat(tmpUrl, "&width=").concat(self.divWidth, "&height=").concat(self.divHeight));
1377
+ case 2:
1378
+ html = _context.sent;
1379
+ console.debug({
1380
+ html: html
1381
+ });
1382
+ res = regex.exec(html);
1383
+ if (res !== null) {
1384
+ self.duration = parseInt(String(self.duration)) * parseInt(res[1]);
1385
+ }
1386
+ case 6:
1387
+ case "end":
1388
+ return _context.stop();
1389
+ }
1390
+ }, _callee);
1391
+ }))();
1392
+ }
1393
+ }
1394
+ // Check if the media has fade-in/out transitions
1395
+ if (Boolean(self.options['transin']) && Boolean(self.options['transinduration'])) {
1396
+ var transInDuration = Number(self.options.transinduration);
1397
+ var fadeInTrans = transitionElement('fadeIn', {
1398
+ duration: transInDuration
1399
+ });
1400
+ $media.animate(fadeInTrans.keyframes, fadeInTrans.timing);
1401
+ }
1402
+ // Add media to the region
1403
+ // Second media if exists, will be off-canvas
1404
+ // All added media will be hidden by default
1405
+ // It will start showing when region.nextMedia() function is called
1406
+ // When there's only 1 item and loop = false, don't remove the item but leave it at its last state
1407
+ // For image, and only 1 item, it should still have the transition for next state
1408
+ // Add conditions for video duration being 0 or 1 and also the loop property
1409
+ // For video url, we have to create a URL out of the XLF video URL
1410
+ /**
1411
+ * @DONE
1412
+ * Case 1: Video duration = 0, this will play the video for its entire duration
1413
+ * Case 2: Video duration is set > 0 and loop = false
1414
+ * E.g. Set duration = 100s, video duration = 62s
1415
+ * the video will play until 62s and will stop to its last frame until 100s
1416
+ * After 100s, it will expire
1417
+ * Case 3: Video duration is set > 0 and loop = true
1418
+ * E.g. Set duration = 100s, video duration = 62s, loop = true
1419
+ * the video will play until 62s and will loop through until the remaining 38s
1420
+ * to complete the 100s set duration
1421
+ */
1422
+ // Add html node to media for
1423
+ self.html = $media;
1424
+ };
1425
+ mediaObject.run = function () {
1426
+ var self = this;
1427
+ var transInDuration = 1;
1428
+ var transInDirection = 'E';
1429
+ if (Boolean(self.options['transinduration'])) {
1430
+ transInDuration = Number(self.options.transinduration);
1431
+ }
1432
+ if (Boolean(self.options['transindirection'])) {
1433
+ transInDirection = self.options.transindirection;
1434
+ }
1435
+ var defaultTransInOptions = {
1436
+ duration: transInDuration
1437
+ };
1438
+ var transIn = transitionElement('defaultIn', {
1439
+ duration: defaultTransInOptions.duration
1440
+ });
1441
+ if (Boolean(self.options['transin'])) {
1442
+ var transInName = self.options['transin'];
1443
+ if (transInName === 'fly') {
1444
+ transInName = "".concat(transInName, "In");
1445
+ defaultTransInOptions.keyframes = flyTransitionKeyframes({
1446
+ trans: 'in',
1447
+ direction: transInDirection,
1448
+ height: self.divHeight,
1449
+ width: self.divWidth
1450
+ });
1451
+ }
1452
+ transIn = transitionElement(transInName, defaultTransInOptions);
1453
+ }
1454
+ var showCurrentMedia = /*#__PURE__*/function () {
1455
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
1456
+ var $mediaId, $media, isCMS;
1457
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
1458
+ while (1) switch (_context2.prev = _context2.next) {
1459
+ case 0:
1460
+ $mediaId = getMediaId(self);
1461
+ $media = document.getElementById($mediaId);
1462
+ isCMS = xlr.config.platform === 'CMS';
1463
+ if (!$media) {
1464
+ $media = getNewMedia();
1465
+ }
1466
+ if (!$media) {
1467
+ _context2.next = 41;
1468
+ break;
1469
+ }
1470
+ $media.style.setProperty('display', 'block');
1471
+ if (Boolean(self.options['transin'])) {
1472
+ $media.animate(transIn.keyframes, transIn.timing);
1473
+ }
1474
+ if (!(self.mediaType === 'image' && self.url !== null)) {
1475
+ _context2.next = 22;
1476
+ break;
1477
+ }
1478
+ _context2.t0 = $media.style;
1479
+ _context2.t1 = "url(";
1480
+ if (isCMS) {
1481
+ _context2.next = 14;
1482
+ break;
1483
+ }
1484
+ _context2.t2 = self.url;
1485
+ _context2.next = 17;
1486
+ break;
1487
+ case 14:
1488
+ _context2.next = 16;
1489
+ return getDataBlob(self.url);
1490
+ case 16:
1491
+ _context2.t2 = _context2.sent;
1492
+ case 17:
1493
+ _context2.t3 = _context2.t2;
1494
+ _context2.t4 = _context2.t1.concat.call(_context2.t1, _context2.t3);
1495
+ _context2.t0.setProperty.call(_context2.t0, 'background-image', _context2.t4);
1496
+ _context2.next = 40;
1497
+ break;
1498
+ case 22:
1499
+ if (!(self.mediaType === 'video' && self.url !== null)) {
1500
+ _context2.next = 28;
1501
+ break;
1502
+ }
1503
+ _context2.next = 25;
1504
+ return preloadMediaBlob(self.url, self.mediaType);
1505
+ case 25:
1506
+ $media.src = _context2.sent;
1507
+ _context2.next = 40;
1508
+ break;
1509
+ case 28:
1510
+ if (!(self.mediaType === 'audio' && self.url !== null)) {
1511
+ _context2.next = 39;
1512
+ break;
1513
+ }
1514
+ if (!isCMS) {
1515
+ _context2.next = 35;
1516
+ break;
1517
+ }
1518
+ _context2.next = 32;
1519
+ return preloadMediaBlob(self.url, self.mediaType);
1520
+ case 32:
1521
+ _context2.t5 = _context2.sent;
1522
+ _context2.next = 36;
1523
+ break;
1524
+ case 35:
1525
+ _context2.t5 = self.url;
1526
+ case 36:
1527
+ $media.src = _context2.t5;
1528
+ _context2.next = 40;
1529
+ break;
1530
+ case 39:
1531
+ if ((self.render === 'html' || self.mediaType === 'webpage') && self.iframe && self.checkIframeStatus) {
1532
+ // Set state as false ( for now )
1533
+ self.ready = false;
1534
+ // Append iframe
1535
+ $media.innerHTML = '';
1536
+ $media.appendChild(self.iframe);
1537
+ // On iframe load, set state as ready to play full preview
1538
+ // (self.iframe) && self.iframe.addEventListener('load', function(){
1539
+ // self.ready = true;
1540
+ // if (self.iframe) {
1541
+ // const iframeStyles = self.iframe.style.cssText;
1542
+ // self.iframe.style.cssText = iframeStyles?.concat('visibility: visible;');
1543
+ // }
1544
+ // });
1545
+ }
1546
+ case 40:
1547
+ self.emitter.emit('start', self);
1548
+ case 41:
1549
+ case "end":
1550
+ return _context2.stop();
1551
+ }
1552
+ }, _callee2);
1553
+ }));
1554
+ return function showCurrentMedia() {
1555
+ return _ref2.apply(this, arguments);
1556
+ };
1557
+ }();
1558
+ var getNewMedia = function getNewMedia() {
1559
+ var $region = document.getElementById("".concat(self.region.containerName));
1560
+ // This function is for checking whether
1561
+ // the region still has to show a media item
1562
+ // when another region is not finished yet
1563
+ if (self.region.complete && !self.region.layout.allEnded) {
1564
+ // Add currentMedia to the region
1565
+ $region && $region.insertBefore(self.html, $region.lastElementChild);
1566
+ return self.html;
1567
+ }
1568
+ return null;
1569
+ };
1570
+ showCurrentMedia();
1571
+ };
1572
+ mediaObject.stop = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
1573
+ var self, $media;
1574
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
1575
+ while (1) switch (_context3.prev = _context3.next) {
1576
+ case 0:
1577
+ self = mediaObject;
1578
+ $media = document.getElementById(getMediaId(self));
1579
+ if ($media) {
1580
+ $media.style.display = 'none';
1581
+ $media.remove();
1582
+ }
1583
+ case 3:
1584
+ case "end":
1585
+ return _context3.stop();
1586
+ }
1587
+ }, _callee3);
1588
+ }));
1589
+ mediaObject.init();
1590
+ return mediaObject;
1591
+ }
1592
+
1593
+ function Region(layout, xml, regionId, options, xlr) {
1594
+ var props = {
1595
+ layout: layout,
1596
+ xml: xml,
1597
+ regionId: regionId,
1598
+ options: options
1599
+ };
1600
+ var emitter = createNanoEvents();
1601
+ var regionObject = _objectSpread2(_objectSpread2({}, initialRegion), props);
1602
+ regionObject.prepareRegion = function () {
1603
+ var _self$xml, _self$xml2, _self$xml3, _self$xml4, _self$xml5, _self$xml6;
1604
+ var self = regionObject;
1605
+ var layout = self.layout,
1606
+ options = self.options;
1607
+ self.complete = false;
1608
+ self.ending = false;
1609
+ self.ended = false;
1610
+ self.id = props.regionId;
1611
+ self.options = _objectSpread2(_objectSpread2({}, platform), props.options);
1612
+ self.containerName = "R-".concat(self.id, "-").concat(nextId(self.options));
1613
+ self.xml = props.xml;
1614
+ self.mediaObjects = [];
1615
+ self.sWidth = self.xml && Number((_self$xml = self.xml) === null || _self$xml === void 0 ? void 0 : _self$xml.getAttribute('width')) * layout.scaleFactor;
1616
+ self.sHeight = self.xml && Number((_self$xml2 = self.xml) === null || _self$xml2 === void 0 ? void 0 : _self$xml2.getAttribute('height')) * layout.scaleFactor;
1617
+ self.offsetX = self.xml && Number((_self$xml3 = self.xml) === null || _self$xml3 === void 0 ? void 0 : _self$xml3.getAttribute('left')) * layout.scaleFactor;
1618
+ self.offsetY = self.xml && Number((_self$xml4 = self.xml) === null || _self$xml4 === void 0 ? void 0 : _self$xml4.getAttribute('top')) * layout.scaleFactor;
1619
+ self.zIndex = self.xml && Number((_self$xml5 = self.xml) === null || _self$xml5 === void 0 ? void 0 : _self$xml5.getAttribute('zindex'));
1620
+ var regionOptions = (_self$xml6 = self.xml) === null || _self$xml6 === void 0 ? void 0 : _self$xml6.getElementsByTagName('options');
1621
+ if (regionOptions) {
1622
+ for (var _i = 0, _Array$from = Array.from(regionOptions); _i < _Array$from.length; _i++) {
1623
+ var _options = _Array$from[_i];
1624
+ // Get options
1625
+ var _regionOptions = _options.children;
1626
+ for (var _i2 = 0, _Array$from2 = Array.from(_regionOptions); _i2 < _Array$from2.length; _i2++) {
1627
+ var regionOption = _Array$from2[_i2];
1628
+ self.options[regionOption.nodeName.toLowerCase()] = regionOption.textContent;
1629
+ }
1630
+ }
1631
+ }
1632
+ var $region = document.getElementById(self.containerName);
1633
+ var $layout = document.getElementById("".concat(self.layout.containerName));
1634
+ if ($region === null) {
1635
+ $region = document.createElement('div');
1636
+ $region.id = self.containerName;
1637
+ }
1638
+ $layout && $layout.appendChild($region);
1639
+ /* Scale the Layout Container */
1640
+ /* Add region styles */
1641
+ $region.style.cssText = "\n width: ".concat(self.sWidth, "px;\n height: ").concat(self.sHeight, "px;\n position: absolute;\n left: ").concat(self.offsetX, "px;\n top: ").concat(self.offsetY, "px;\n z-index: ").concat(Math.round(self.zIndex), ";\n ");
1642
+ $region.className = 'region--item';
1643
+ /* Parse region media objects */
1644
+ var regionMediaItems = Array.from(self.xml.getElementsByTagName('media'));
1645
+ self.totalMediaObjects = regionMediaItems.length;
1646
+ Array.from(regionMediaItems).forEach(function (mediaXml, indx) {
1647
+ var mediaObj = Media(self, (mediaXml === null || mediaXml === void 0 ? void 0 : mediaXml.getAttribute('id')) || '', mediaXml, options, xlr);
1648
+ mediaObj.index = indx;
1649
+ self.mediaObjects.push(mediaObj);
1650
+ });
1651
+ self.prepareMediaObjects();
1652
+ };
1653
+ regionObject.finished = function () {
1654
+ var self = regionObject;
1655
+ console.debug('Region::finished called . . . ', self.id);
1656
+ // Mark as complete
1657
+ self.complete = true;
1658
+ self.layout.regions[regionObject.index] = regionObject;
1659
+ self.layout.regionExpired();
1660
+ };
1661
+ regionObject.prepareMediaObjects = function () {
1662
+ var self = regionObject;
1663
+ var nextMediaIndex;
1664
+ if (self.mediaObjects.length > 0) {
1665
+ if (self.curMedia) {
1666
+ self.oldMedia = self.curMedia;
1667
+ } else {
1668
+ self.oldMedia = undefined;
1669
+ }
1670
+ if (self.currentMediaIndex >= self.mediaObjects.length) {
1671
+ self.currentMediaIndex = 0;
1672
+ }
1673
+ self.curMedia = self.mediaObjects[self.currentMediaIndex];
1674
+ nextMediaIndex = self.currentMediaIndex + 1;
1675
+ if (nextMediaIndex >= self.mediaObjects.length || !Boolean(self.mediaObjects[nextMediaIndex]) && self.mediaObjects.length === 1) {
1676
+ nextMediaIndex = 0;
1677
+ }
1678
+ if (Boolean(self.mediaObjects[nextMediaIndex])) {
1679
+ self.nxtMedia = self.mediaObjects[nextMediaIndex];
1680
+ }
1681
+ var $region = document.getElementById("".concat(self.containerName));
1682
+ // Append available media to region DOM
1683
+ if (self.curMedia) {
1684
+ $region && $region.insertBefore(self.curMedia.html, $region.lastElementChild);
1685
+ }
1686
+ if (self.nxtMedia) {
1687
+ $region && $region.insertBefore(self.nxtMedia.html, $region.lastElementChild);
1688
+ }
1689
+ }
1690
+ };
1691
+ regionObject.run = function () {
1692
+ console.debug('Called Region::run > ', regionObject.id);
1693
+ // Reset region states
1694
+ regionObject.reset();
1695
+ if (regionObject.curMedia) {
1696
+ regionObject.transitionNodes(regionObject.oldMedia, regionObject.curMedia);
1697
+ }
1698
+ };
1699
+ regionObject.transitionNodes = function (oldMedia, newMedia) {
1700
+ var self = regionObject;
1701
+ var transOutDuration = 1;
1702
+ var transOutDirection = 'E';
1703
+ if (newMedia) {
1704
+ if (oldMedia && Boolean(oldMedia.options['transoutduration'])) {
1705
+ transOutDuration = Number(oldMedia.options.transoutduration);
1706
+ }
1707
+ if (oldMedia && Boolean(oldMedia.options['transoutdirection'])) {
1708
+ transOutDirection = oldMedia.options.transoutdirection;
1709
+ }
1710
+ var defaultTransOutOptions = {
1711
+ duration: transOutDuration
1712
+ };
1713
+ var transOut = transitionElement('defaultOut', {
1714
+ duration: defaultTransOutOptions.duration
1715
+ });
1716
+ var transOutName;
1717
+ if (oldMedia && Boolean(oldMedia.options['transout'])) {
1718
+ transOutName = oldMedia.options['transout'];
1719
+ if (transOutName === 'fly') {
1720
+ transOutName = "".concat(transOutName, "Out");
1721
+ defaultTransOutOptions.keyframes = flyTransitionKeyframes({
1722
+ trans: 'out',
1723
+ direction: transOutDirection,
1724
+ height: oldMedia.divHeight,
1725
+ width: oldMedia.divWidth
1726
+ });
1727
+ }
1728
+ transOut = transitionElement(transOutName, defaultTransOutOptions);
1729
+ }
1730
+ var hideOldMedia = new Promise(function (resolve) {
1731
+ // Hide oldMedia
1732
+ if (oldMedia) {
1733
+ var $oldMedia = document.getElementById(getMediaId(oldMedia));
1734
+ if ($oldMedia) {
1735
+ var removeOldMedia = function removeOldMedia() {
1736
+ $oldMedia.style.setProperty('display', 'none');
1737
+ $oldMedia.remove();
1738
+ };
1739
+ var oldMediaAnimate;
1740
+ if (Boolean(oldMedia.options['transout'])) {
1741
+ oldMediaAnimate = $oldMedia.animate(transOut.keyframes, transOut.timing);
1742
+ }
1743
+ if (Boolean(oldMedia.options['transout']) && self.totalMediaObjects > 1) {
1744
+ if (transOutName === 'flyOut') {
1745
+ // Reset last item to original position and state
1746
+ oldMediaAnimate ? oldMediaAnimate.finished.then(function () {
1747
+ var _oldMediaAnimate;
1748
+ resolve(true);
1749
+ (_oldMediaAnimate = oldMediaAnimate) === null || _oldMediaAnimate === void 0 || (_oldMediaAnimate = _oldMediaAnimate.effect) === null || _oldMediaAnimate === void 0 || _oldMediaAnimate.updateTiming({
1750
+ fill: 'none'
1751
+ });
1752
+ removeOldMedia();
1753
+ }) : undefined;
1754
+ } else {
1755
+ setTimeout(removeOldMedia, transOutDuration / 2);
1756
+ resolve(true);
1757
+ }
1758
+ } else {
1759
+ removeOldMedia();
1760
+ // Resolve this right away
1761
+ // As a result, the transition between two media object
1762
+ // seems like a cross-over
1763
+ resolve(true);
1764
+ }
1765
+ }
1766
+ }
1767
+ });
1768
+ if (oldMedia) {
1769
+ hideOldMedia.then(function (isDone) {
1770
+ if (isDone) {
1771
+ newMedia.run();
1772
+ }
1773
+ });
1774
+ } else {
1775
+ newMedia.run();
1776
+ }
1777
+ }
1778
+ };
1779
+ regionObject.playNextMedia = function () {
1780
+ var _self$curMedia, _self$curMedia2, _self$curMedia3, _self$curMedia4;
1781
+ var self = regionObject;
1782
+ /* The current media has finished running */
1783
+ if (self.ended) {
1784
+ return;
1785
+ }
1786
+ if (self.currentMediaIndex === self.mediaObjects.length - 1) {
1787
+ self.finished();
1788
+ if (self.layout.allEnded) {
1789
+ return;
1790
+ }
1791
+ }
1792
+ // When the region has completed and when currentMedia is html
1793
+ // Then, preserve the currentMedia state
1794
+ if (self.complete && ((_self$curMedia = self.curMedia) === null || _self$curMedia === void 0 ? void 0 : _self$curMedia.render) === 'html') {
1795
+ return;
1796
+ }
1797
+ // When the region has completed and mediaObjects.length = 1
1798
+ // and curMedia.loop = false, then put the media on
1799
+ // its current state
1800
+ if (self.complete && self.mediaObjects.length === 1 && ((_self$curMedia2 = self.curMedia) === null || _self$curMedia2 === void 0 ? void 0 : _self$curMedia2.render) !== 'html' && ((_self$curMedia3 = self.curMedia) === null || _self$curMedia3 === void 0 ? void 0 : _self$curMedia3.mediaType) === 'image' && !((_self$curMedia4 = self.curMedia) !== null && _self$curMedia4 !== void 0 && _self$curMedia4.loop)) {
1801
+ return;
1802
+ }
1803
+ self.currentMediaIndex = self.currentMediaIndex + 1;
1804
+ self.prepareMediaObjects();
1805
+ console.debug('region::playNextMedia', self);
1806
+ self.transitionNodes(self.oldMedia, self.curMedia);
1807
+ };
1808
+ regionObject.end = function () {
1809
+ var self = regionObject;
1810
+ self.ending = true;
1811
+ /* The Layout has finished running */
1812
+ /* Do any region exit transition then clean up */
1813
+ self.layout.regions[self.index] = self;
1814
+ console.debug('Calling Region::end ', self);
1815
+ self.exitTransition();
1816
+ };
1817
+ regionObject.exitTransition = function () {
1818
+ var self = regionObject;
1819
+ /* TODO: Actually implement region exit transitions */
1820
+ var $region = document.getElementById("".concat(self.containerName));
1821
+ if ($region) {
1822
+ $region.style.display = 'none';
1823
+ }
1824
+ console.debug('Called Region::exitTransition ', self.id);
1825
+ self.exitTransitionComplete();
1826
+ };
1827
+ regionObject.exitTransitionComplete = function () {
1828
+ var self = regionObject;
1829
+ console.debug('Called Region::exitTransitionComplete ', self.id);
1830
+ self.ended = true;
1831
+ self.layout.regions[self.index] = self;
1832
+ self.layout.regionEnded();
1833
+ };
1834
+ regionObject.reset = function () {
1835
+ regionObject.ended = false;
1836
+ regionObject.complete = false;
1837
+ regionObject.ending = false;
1838
+ console.debug('Resetting region states', regionObject);
1839
+ };
1840
+ regionObject.on = function (event, callback) {
1841
+ return emitter.on(event, callback);
1842
+ };
1843
+ regionObject.emitter = emitter;
1844
+ regionObject.prepareRegion();
1845
+ return regionObject;
1846
+ }
1847
+
1848
+ var playAgainClickHandle = function playAgainClickHandle(ev) {
1849
+ ev.preventDefault();
1850
+ history.go(0);
1851
+ };
1852
+ function initRenderingDOM(targetContainer) {
1853
+ var _targetContainer = targetContainer;
1854
+ var previewPlayer = document.createElement('div');
1855
+ var previewScreen = document.createElement('div');
1856
+ var endPlay = document.createElement('div');
1857
+ var playAgainLink = document.createElement('a');
1858
+ // Preview player
1859
+ previewPlayer.className = 'player-preview';
1860
+ previewPlayer.id = 'player_container';
1861
+ // Preview screen
1862
+ previewScreen.className = 'screen-preview';
1863
+ previewScreen.id = 'screen_container';
1864
+ // Ended play
1865
+ endPlay.className = 'preview-ended';
1866
+ endPlay.id = 'play_ended';
1867
+ endPlay.style.display = 'none';
1868
+ // Play again link
1869
+ playAgainLink.id = 'play_back_preview';
1870
+ playAgainLink.className = 'play-back-preview';
1871
+ playAgainLink.style.cssText = 'text-decoration: none; color: #ffffff;';
1872
+ playAgainLink.innerHTML = 'Play again?';
1873
+ playAgainLink.removeEventListener('click', playAgainClickHandle);
1874
+ playAgainLink.addEventListener('click', playAgainClickHandle);
1875
+ if (!_targetContainer) {
1876
+ _targetContainer = document.body;
1877
+ }
1878
+ if (_targetContainer) {
1879
+ if (_targetContainer.querySelector('#player_container') === null) {
1880
+ _targetContainer.insertBefore(previewPlayer, _targetContainer.firstChild);
1881
+ if (previewPlayer.querySelector('#screen_container') === null) {
1882
+ previewPlayer.appendChild(previewScreen);
1883
+ }
1884
+ if (previewPlayer.querySelector('#play_ended') === null) {
1885
+ previewPlayer.appendChild(endPlay);
1886
+ if (endPlay.querySelector('a') === null) {
1887
+ endPlay.appendChild(playAgainLink);
1888
+ }
1889
+ }
1890
+ }
1891
+ }
1892
+ }
1893
+ function getXlf(_x) {
1894
+ return _getXlf.apply(this, arguments);
1895
+ }
1896
+ function _getXlf() {
1897
+ _getXlf = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(layoutOptions) {
1898
+ var apiHost, xlfUrl, fetchOptions, res;
1899
+ return _regeneratorRuntime().wrap(function _callee4$(_context4) {
1900
+ while (1) switch (_context4.prev = _context4.next) {
1901
+ case 0:
1902
+ apiHost = window.location.origin;
1903
+ xlfUrl = apiHost + layoutOptions.xlfUrl;
1904
+ fetchOptions = {};
1905
+ if (layoutOptions.platform === 'CMS') {
1906
+ xlfUrl = apiHost + layoutOptions.xlfUrl;
1907
+ fetchOptions.mode = 'no-cors';
1908
+ } else if (layoutOptions.platform === 'chromeOS') {
1909
+ xlfUrl = layoutOptions.xlfUrl;
1910
+ fetchOptions.mode = 'cors';
1911
+ fetchOptions.headers = {
1912
+ 'Content-Type': 'text/xml'
1913
+ };
1914
+ } else if (layoutOptions.platform !== 'CMS' && layoutOptions.appHost !== null) {
1915
+ xlfUrl = layoutOptions.appHost + layoutOptions.xlfUrl;
1916
+ }
1917
+ _context4.next = 6;
1918
+ return fetch(xlfUrl);
1919
+ case 6:
1920
+ res = _context4.sent;
1921
+ _context4.next = 9;
1922
+ return res.text();
1923
+ case 9:
1924
+ return _context4.abrupt("return", _context4.sent);
1925
+ case 10:
1926
+ case "end":
1927
+ return _context4.stop();
1928
+ }
1929
+ }, _callee4);
1930
+ }));
1931
+ return _getXlf.apply(this, arguments);
1932
+ }
1933
+ function getLayout(params) {
1934
+ var _currentLayout = undefined;
1935
+ var _nextLayout = undefined;
1936
+ var _params$xlr = params.xlr,
1937
+ inputLayouts = _params$xlr.inputLayouts,
1938
+ currentLayout = _params$xlr.currentLayout,
1939
+ nextLayout = _params$xlr.nextLayout,
1940
+ currLayoutIndx = _params$xlr.currentLayoutIndex;
1941
+ var hasLayout = inputLayouts.length > 0;
1942
+ var currentLayoutIndex = currLayoutIndx;
1943
+ var nextLayoutIndex = currentLayoutIndex + 1;
1944
+ if (currentLayout === undefined && nextLayout === undefined) {
1945
+ var activeLayout;
1946
+ // Preview just got started
1947
+ if (hasLayout) {
1948
+ var nextLayoutTemp = _objectSpread2({}, initialLayout);
1949
+ activeLayout = inputLayouts[currentLayoutIndex];
1950
+ _currentLayout = _objectSpread2(_objectSpread2({}, initialLayout), activeLayout);
1951
+ if (inputLayouts.length > 1) {
1952
+ nextLayoutTemp = _objectSpread2(_objectSpread2({}, nextLayoutTemp), inputLayouts[nextLayoutIndex]);
1953
+ _nextLayout = nextLayoutTemp;
1954
+ } else {
1955
+ _nextLayout = _currentLayout;
1956
+ }
1957
+ _currentLayout.id = activeLayout.layoutId;
1958
+ if (nextLayoutTemp) {
1959
+ _nextLayout.id = nextLayoutTemp.layoutId;
1960
+ }
1961
+ }
1962
+ } else {
1963
+ if (hasLayout) {
1964
+ var _currentLayout2;
1965
+ _currentLayout = nextLayout;
1966
+ currentLayoutIndex = getIndexByLayoutId(inputLayouts, (_currentLayout2 = _currentLayout) === null || _currentLayout2 === void 0 ? void 0 : _currentLayout2.layoutId).index;
1967
+ nextLayoutIndex = currentLayoutIndex + 1;
1968
+ if (inputLayouts.length > 1 && nextLayoutIndex < inputLayouts.length) {
1969
+ if (Boolean(params.xlr.layouts[nextLayoutIndex])) {
1970
+ _nextLayout = params.xlr.layouts[nextLayoutIndex];
1971
+ } else {
1972
+ _nextLayout = _objectSpread2(_objectSpread2({}, initialLayout), inputLayouts[nextLayoutIndex]);
1973
+ }
1974
+ }
1975
+ // If _nextLayout is undefined, then we go back to first layout
1976
+ if (_nextLayout === undefined) {
1977
+ _nextLayout = params.xlr.layouts[0];
1978
+ }
1979
+ }
1980
+ }
1981
+ return {
1982
+ currentLayoutIndex: currentLayoutIndex,
1983
+ inputLayouts: params.xlr.inputLayouts,
1984
+ current: _currentLayout,
1985
+ next: _nextLayout
1986
+ };
1987
+ }
1988
+ function Layout(data, options, xlr, layout) {
1989
+ var props = {
1990
+ data: data,
1991
+ options: options,
1992
+ layout: layout || initialLayout
1993
+ };
1994
+ var emitter = createNanoEvents();
1995
+ emitter.on('start', function (layout) {
1996
+ layout.done = false;
1997
+ console.debug('Layout start emitted > Layout ID > ', layout.id);
1998
+ });
1999
+ emitter.on('end', /*#__PURE__*/function () {
2000
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(layout) {
2001
+ var $layout;
2002
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
2003
+ while (1) switch (_context.prev = _context.next) {
2004
+ case 0:
2005
+ console.debug('Ending layout with ID of > ', layout.layoutId);
2006
+ /* Remove layout that has ended */
2007
+ $layout = document.getElementById(layout.containerName);
2008
+ layout.done = true;
2009
+ console.debug({
2010
+ $layout: $layout
2011
+ });
2012
+ if ($layout !== null) {
2013
+ $layout.remove();
2014
+ }
2015
+ if (xlr.config.platform !== 'CMS') {
2016
+ // Transition next layout to current layout and prepare next layout if exist
2017
+ xlr.prepareLayouts().then(function (parent) {
2018
+ xlr.playSchedules(parent);
2019
+ });
2020
+ }
2021
+ case 6:
2022
+ case "end":
2023
+ return _context.stop();
2024
+ }
2025
+ }, _callee);
2026
+ }));
2027
+ return function (_x2) {
2028
+ return _ref.apply(this, arguments);
2029
+ };
2030
+ }());
2031
+ var layoutObject = _objectSpread2(_objectSpread2({}, props.layout), {}, {
2032
+ options: props.options
2033
+ });
2034
+ layoutObject.on = function (event, callback) {
2035
+ return emitter.on(event, callback);
2036
+ };
2037
+ layoutObject.emitter = emitter;
2038
+ layoutObject.run = function () {
2039
+ var layout = layoutObject;
2040
+ var $layoutContainer = document.getElementById("".concat(layout.containerName));
2041
+ var $splashScreen = document.getElementById("splash_".concat(layout.id));
2042
+ if ($layoutContainer) {
2043
+ $layoutContainer.style.display = 'block';
2044
+ }
2045
+ if ($splashScreen) {
2046
+ $splashScreen.style.display = 'none';
2047
+ }
2048
+ console.debug('Layout running > Layout ID > ', layout.id);
2049
+ console.debug('Layout Regions > ', layout.regions);
2050
+ for (var i = 0; i < layout.regions.length; i++) {
2051
+ // playLog(4, "debug", "Running region " + self.regions[i].id, false);
2052
+ layout.regions[i].run();
2053
+ }
2054
+ };
2055
+ layoutObject.prepareLayout = function () {
2056
+ layoutObject.parseXlf();
2057
+ };
2058
+ layoutObject.parseXlf = function () {
2059
+ var _layout$layoutNode, _layout$layoutNode2, _layout$layoutNode3, _layout$layoutNode4, _layout$layoutNode5, _layout$layoutNode6;
2060
+ var layout = this;
2061
+ var options = layout.options;
2062
+ layout.done = false;
2063
+ layout.allEnded = false;
2064
+ layout.allExpired = false;
2065
+ layout.containerName = "L" + layout.id + "-" + nextId(options);
2066
+ layout.regions = [];
2067
+ /* Create a hidden div to show the layout in */
2068
+ var $layout = document.getElementById(layout.containerName);
2069
+ if ($layout === null) {
2070
+ $layout = document.createElement('div');
2071
+ $layout.id = layout.containerName;
2072
+ }
2073
+ var $screen = document.getElementById('screen_container');
2074
+ $screen && $screen.appendChild($layout);
2075
+ if ($layout) {
2076
+ $layout.style.display = 'none';
2077
+ $layout.style.outline = 'red solid thin';
2078
+ }
2079
+ layout.layoutNode = props.data;
2080
+ /* Calculate the screen size */
2081
+ layout.sw = ($screen === null || $screen === void 0 ? void 0 : $screen.offsetWidth) || 0;
2082
+ layout.sh = ($screen === null || $screen === void 0 ? void 0 : $screen.offsetHeight) || 0;
2083
+ layout.xw = Number((_layout$layoutNode = layout.layoutNode) === null || _layout$layoutNode === void 0 || (_layout$layoutNode = _layout$layoutNode.firstElementChild) === null || _layout$layoutNode === void 0 ? void 0 : _layout$layoutNode.getAttribute('width'));
2084
+ layout.xh = Number((_layout$layoutNode2 = layout.layoutNode) === null || _layout$layoutNode2 === void 0 || (_layout$layoutNode2 = _layout$layoutNode2.firstElementChild) === null || _layout$layoutNode2 === void 0 ? void 0 : _layout$layoutNode2.getAttribute('height'));
2085
+ layout.zIndex = Number((_layout$layoutNode3 = layout.layoutNode) === null || _layout$layoutNode3 === void 0 || (_layout$layoutNode3 = _layout$layoutNode3.firstElementChild) === null || _layout$layoutNode3 === void 0 ? void 0 : _layout$layoutNode3.getAttribute('zindex')) || 0;
2086
+ /* Calculate Scale Factor */
2087
+ layout.scaleFactor = Math.min(layout.sw / layout.xw, layout.sh / layout.xh);
2088
+ layout.sWidth = layout.xw * layout.scaleFactor;
2089
+ layout.sHeight = layout.xh * layout.scaleFactor;
2090
+ layout.offsetX = Math.abs(layout.sw - layout.sWidth) / 2;
2091
+ layout.offsetY = Math.abs(layout.sh - layout.sHeight) / 2;
2092
+ /* Scale the Layout Container */
2093
+ if ($layout) {
2094
+ $layout.style.width = "".concat(layout.sWidth, "px");
2095
+ $layout.style.height = "".concat(layout.sHeight, "px");
2096
+ $layout.style.position = 'absolute';
2097
+ $layout.style.left = "".concat(layout.offsetX, "px");
2098
+ $layout.style.top = "".concat(layout.offsetY, "px");
2099
+ }
2100
+ if ($layout && layout.zIndex !== null) {
2101
+ $layout.style.zIndex = "".concat(layout.zIndex);
2102
+ }
2103
+ /* Set the layout background */
2104
+ layout.bgColor = ((_layout$layoutNode4 = layout.layoutNode) === null || _layout$layoutNode4 === void 0 || (_layout$layoutNode4 = _layout$layoutNode4.firstElementChild) === null || _layout$layoutNode4 === void 0 ? void 0 : _layout$layoutNode4.getAttribute('bgcolor')) || '';
2105
+ layout.bgImage = ((_layout$layoutNode5 = layout.layoutNode) === null || _layout$layoutNode5 === void 0 || (_layout$layoutNode5 = _layout$layoutNode5.firstElementChild) === null || _layout$layoutNode5 === void 0 ? void 0 : _layout$layoutNode5.getAttribute('background')) || '';
2106
+ if (!(layout.bgImage === "" || typeof layout.bgImage === 'undefined')) {
2107
+ /* Extract the image ID from the filename */
2108
+ layout.bgId = layout.bgImage.substring(0, layout.bgImage.indexOf('.'));
2109
+ var bgImageUrl = composeBgUrlByPlatform(xlr.config.platform, _objectSpread2(_objectSpread2({}, options), {}, {
2110
+ layout: layout
2111
+ }));
2112
+ if ($layout) {
2113
+ $layout.style.backgroundImage = "url(\"".concat(bgImageUrl, "\")");
2114
+ $layout.style.backgroundRepeat = 'no-repeat';
2115
+ $layout.style.backgroundSize = "".concat(layout.sWidth, "px ").concat(layout.sHeight, "px");
2116
+ $layout.style.backgroundPosition = '0px 0px';
2117
+ }
2118
+ }
2119
+ // Set the background color
2120
+ if ($layout && layout.bgColor) {
2121
+ $layout.style.backgroundColor = "".concat(layout.bgColor);
2122
+ }
2123
+ // Hide if layout is not the currentLayout
2124
+ if ($layout && xlr.currentLayoutId !== undefined && xlr.currentLayoutId !== layout.id) {
2125
+ $layout.style.display = 'none';
2126
+ }
2127
+ // Create regions
2128
+ var layoutRegions = Array.from((layout === null || layout === void 0 || (_layout$layoutNode6 = layout.layoutNode) === null || _layout$layoutNode6 === void 0 ? void 0 : _layout$layoutNode6.getElementsByTagName('region')) || []);
2129
+ Array.from(layoutRegions).forEach(function (regionXml, indx) {
2130
+ var regionObj = Region(layout, regionXml, (regionXml === null || regionXml === void 0 ? void 0 : regionXml.getAttribute('id')) || '', options, xlr);
2131
+ regionObj.index = indx;
2132
+ layout.regions.push(regionObj);
2133
+ });
2134
+ };
2135
+ layoutObject.regionExpired = function () {
2136
+ var self = layoutObject;
2137
+ self.allExpired = true;
2138
+ var _iterator = _createForOfIteratorHelper(self.regions),
2139
+ _step;
2140
+ try {
2141
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
2142
+ var layoutRegion = _step.value;
2143
+ if (!layoutRegion.complete) {
2144
+ self.allExpired = false;
2145
+ }
2146
+ }
2147
+ } catch (err) {
2148
+ _iterator.e(err);
2149
+ } finally {
2150
+ _iterator.f();
2151
+ }
2152
+ if (self.allExpired) {
2153
+ self.end();
2154
+ }
2155
+ };
2156
+ layoutObject.regionEnded = function () {
2157
+ var self = layoutObject;
2158
+ self.allEnded = true;
2159
+ for (var i = 0; i < self.regions.length; i++) {
2160
+ if (!self.regions[i].ended) {
2161
+ self.allEnded = false;
2162
+ }
2163
+ }
2164
+ if (self.allEnded) {
2165
+ self.stopAllMedia().then( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
2166
+ var $end, $preview;
2167
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
2168
+ while (1) switch (_context2.prev = _context2.next) {
2169
+ case 0:
2170
+ console.debug('starting to end layout . . .');
2171
+ if (xlr.config.platform === 'CMS') {
2172
+ $end = document.getElementById('play_ended');
2173
+ $preview = document.getElementById('screen_container');
2174
+ if ($preview) {
2175
+ while ($preview.firstChild) {
2176
+ $preview.removeChild($preview.firstChild);
2177
+ }
2178
+ $preview.style.display = 'none';
2179
+ }
2180
+ if ($end) {
2181
+ $end.style.display = 'block';
2182
+ }
2183
+ }
2184
+ self.emitter.emit('end', self);
2185
+ case 3:
2186
+ case "end":
2187
+ return _context2.stop();
2188
+ }
2189
+ }, _callee2);
2190
+ })));
2191
+ }
2192
+ };
2193
+ layoutObject.end = function () {
2194
+ console.debug('Executing Layout::end and Calling Region::end ', layoutObject);
2195
+ /* Ask the layout to gracefully stop running now */
2196
+ var _iterator2 = _createForOfIteratorHelper(layoutObject.regions),
2197
+ _step2;
2198
+ try {
2199
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
2200
+ var layoutRegion = _step2.value;
2201
+ layoutRegion.end();
2202
+ }
2203
+ } catch (err) {
2204
+ _iterator2.e(err);
2205
+ } finally {
2206
+ _iterator2.f();
2207
+ }
2208
+ };
2209
+ layoutObject.stopAllMedia = function () {
2210
+ console.debug('Stopping all media . . .');
2211
+ return new Promise( /*#__PURE__*/function () {
2212
+ var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(resolve) {
2213
+ var i, region, j, media;
2214
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
2215
+ while (1) switch (_context3.prev = _context3.next) {
2216
+ case 0:
2217
+ i = 0;
2218
+ case 1:
2219
+ if (!(i < layoutObject.regions.length)) {
2220
+ _context3.next = 14;
2221
+ break;
2222
+ }
2223
+ region = layoutObject.regions[i];
2224
+ j = 0;
2225
+ case 4:
2226
+ if (!(j < region.mediaObjects.length)) {
2227
+ _context3.next = 11;
2228
+ break;
2229
+ }
2230
+ media = region.mediaObjects[j];
2231
+ _context3.next = 8;
2232
+ return media.stop();
2233
+ case 8:
2234
+ j++;
2235
+ _context3.next = 4;
2236
+ break;
2237
+ case 11:
2238
+ i++;
2239
+ _context3.next = 1;
2240
+ break;
2241
+ case 14:
2242
+ resolve();
2243
+ case 15:
2244
+ case "end":
2245
+ return _context3.stop();
2246
+ }
2247
+ }, _callee3);
2248
+ }));
2249
+ return function (_x3) {
2250
+ return _ref3.apply(this, arguments);
2251
+ };
2252
+ }());
2253
+ };
2254
+ layoutObject.prepareLayout();
2255
+ return layoutObject;
2256
+ }
2257
+
2258
+ exports.ELayoutType = void 0;
2259
+ (function (ELayoutType) {
2260
+ ELayoutType[ELayoutType["CURRENT"] = 0] = "CURRENT";
2261
+ ELayoutType[ELayoutType["NEXT"] = 1] = "NEXT";
2262
+ })(exports.ELayoutType || (exports.ELayoutType = {}));
2263
+ var initialXlr = {
2264
+ inputLayouts: [],
2265
+ config: platform,
2266
+ layouts: [],
2267
+ currentLayoutIndex: 0,
2268
+ currentLayoutId: null,
2269
+ currentLayout: undefined,
2270
+ nextLayout: undefined,
2271
+ bootstrap: function bootstrap() {},
2272
+ init: function init() {
2273
+ return Promise.resolve({});
2274
+ },
2275
+ playSchedules: function playSchedules() {},
2276
+ prepareLayoutXlf: function prepareLayoutXlf(inputLayout) {
2277
+ return Promise.resolve({});
2278
+ },
2279
+ prepareLayouts: function prepareLayouts() {
2280
+ return Promise.resolve({});
2281
+ },
2282
+ updateLayouts: function updateLayouts(inputLayouts) {},
2283
+ updateLoop: function updateLoop(inputLayouts) {}
2284
+ };
2285
+
2286
+ var img$1 = "data:image/png;base64,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";
2287
+
2288
+ var img = "data:image/gif;base64,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";
2289
+
2290
+ /*
2291
+ * Copyright (C) 2024 Xibo Signage Ltd
2292
+ *
2293
+ * Xibo - Digital Signage - https://www.xibosignage.com
2294
+ *
2295
+ * This file is part of Xibo.
2296
+ *
2297
+ * Xibo is free software: you can redistribute it and/or modify
2298
+ * it under the terms of the GNU Lesser General Public License as published by
2299
+ * the Free Software Foundation, either version 3 of the License, or
2300
+ * any later version.
2301
+ *
2302
+ * Xibo is distributed in the hope that it will be useful,
2303
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
2304
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2305
+ * GNU Lesser General Public License for more details.
2306
+ *
2307
+ * You should have received a copy of the GNU Lesser General Public License
2308
+ * along with Xibo. If not, see <http://www.gnu.org/licenses/>.
2309
+ */
2310
+ function SplashScreen($parent, config) {
2311
+ var $previewSplash = document.createElement('div');
2312
+ var $previewLoader = document.createElement('div');
2313
+ var $previewLoaderCaption = document.createElement('div');
2314
+ document.createElement('div');
2315
+ var splashScreenObj = {
2316
+ init: function init() {
2317
+ var _this = this;
2318
+ $previewSplash.classList.add('preview-splash');
2319
+ // Don't show Xibo logo on CMS Preview
2320
+ if (config && config.platform !== 'CMS') {
2321
+ $previewSplash.style.setProperty('background-image', "url(".concat(img$1, ")"));
2322
+ $previewSplash.style.setProperty('background-size', '200px 120px');
2323
+ $previewSplash.style.setProperty('background-position', 'calc(100% - 50px) calc(100% - 30px)');
2324
+ }
2325
+ $previewSplash.constructor.prototype.hide = function () {
2326
+ _this.hide();
2327
+ };
2328
+ $previewLoader.classList.add('preview-loader');
2329
+ $previewLoaderCaption.classList.add('preview-loaderCaption');
2330
+ // Show loader bar and text on CMS Preview
2331
+ if (config && config.platform === 'CMS') {
2332
+ $previewLoader.style.setProperty('background-image', "url(".concat(img, ")"));
2333
+ $previewLoaderCaption.innerHTML = '<p>Loading Layout...</p>';
2334
+ }
2335
+ $previewSplash.insertBefore($previewLoader, $previewSplash.lastElementChild);
2336
+ $previewSplash.insertBefore($previewLoaderCaption, null);
2337
+ this.hide();
2338
+ },
2339
+ show: function show() {
2340
+ if ($parent) {
2341
+ $parent.insertBefore($previewSplash, $parent.firstElementChild);
2342
+ $previewSplash.style.setProperty('display', 'block');
2343
+ }
2344
+ },
2345
+ hide: function hide() {
2346
+ $previewSplash.style.setProperty('display', 'none');
2347
+ }
2348
+ };
2349
+ splashScreenObj.init();
2350
+ return splashScreenObj;
2351
+ }
2352
+
2353
+ function XiboLayoutRenderer(inputLayouts, options) {
2354
+ var props = {
2355
+ inputLayouts: inputLayouts,
2356
+ options: options
2357
+ };
2358
+ var xlrObject = _objectSpread2({}, initialXlr);
2359
+ xlrObject.bootstrap = function () {
2360
+ // Place to set configurations and initialize required props
2361
+ var self = this;
2362
+ self.inputLayouts = !Array.isArray(props.inputLayouts) ? [props.inputLayouts] : props.inputLayouts;
2363
+ self.config = JSON.parse(JSON.stringify(_objectSpread2(_objectSpread2({}, platform), props.options)));
2364
+ // Prepare rendering DOM
2365
+ var previewCanvas = document.querySelector('#preview_canvas');
2366
+ initRenderingDOM(previewCanvas);
2367
+ // Prepare splash screen
2368
+ var splashScreen = SplashScreen(document.querySelector('.player-preview'), self.config);
2369
+ splashScreen.show();
2370
+ };
2371
+ xlrObject.init = function () {
2372
+ var _this = this;
2373
+ return new Promise(function (resolve) {
2374
+ var self = _this;
2375
+ // Check if only have splash screen from inputLayouts
2376
+ if (self.inputLayouts.length === 1 && self.inputLayouts[0].layoutId === 0) {
2377
+ resolve(self);
2378
+ } else {
2379
+ self.prepareLayouts().then(function (xlr) {
2380
+ resolve(xlr);
2381
+ });
2382
+ }
2383
+ });
2384
+ };
2385
+ xlrObject.playSchedules = function (xlr) {
2386
+ // Check if there's a current layout
2387
+ if (xlr.currentLayout !== undefined) {
2388
+ var $splashScreen = document.querySelector('.preview-splash');
2389
+ if ($splashScreen && $splashScreen.style.display === 'block') {
2390
+ $splashScreen === null || $splashScreen === void 0 || $splashScreen.hide();
2391
+ }
2392
+ xlr.currentLayout.emitter.emit('start', xlr.currentLayout);
2393
+ xlr.currentLayout.run();
2394
+ }
2395
+ };
2396
+ xlrObject.updateLoop = function (inputLayouts) {
2397
+ this.updateLayouts(inputLayouts);
2398
+ };
2399
+ xlrObject.updateLayouts = /*#__PURE__*/function () {
2400
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(inputLayouts) {
2401
+ var _this2 = this;
2402
+ var xlr, _this$currentLayout, _this$nextLayout, currLayoutIndex, nxtLayoutIndex, tempOldNxtLayout, newNxtLayoutIndex, tempNxtLayout, hasOldNxtLayout, oldNxtLayoutIndex, _this$nextLayout2, tempNewNxtLayout;
2403
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
2404
+ while (1) switch (_context.prev = _context.next) {
2405
+ case 0:
2406
+ /**
2407
+ * @TODO
2408
+ * Case 1: If currentLayout in inputLayouts and in the same sequence,
2409
+ * Then, continue playing currentLayout.
2410
+ * Check nextLayout in inputLayouts. If in inputLayouts and same sequence, then don't change.
2411
+ * If not in inputLayouts, then replace and prepare nextLayout.
2412
+ *
2413
+ * Case 2: If currentLayout in inputLayouts but not in the same sequence,
2414
+ * Then, replace loop, prepare layouts and start currentLayout
2415
+ *
2416
+ * Case 3: If currentLayout not in inputLayouts,
2417
+ * Then, replace everything and start from first layout in sequence.
2418
+ */
2419
+ this.inputLayouts = inputLayouts;
2420
+ /** Case 1: When currentLayout is not in inputLayouts
2421
+ * Then, replace everything and start from first layout
2422
+ */
2423
+ if (!(inputLayouts.filter(function (inputLayout) {
2424
+ var _this2$currentLayout;
2425
+ return inputLayout.layoutId === ((_this2$currentLayout = _this2.currentLayout) === null || _this2$currentLayout === void 0 ? void 0 : _this2$currentLayout.layoutId);
2426
+ }).length === 0)) {
2427
+ _context.next = 11;
2428
+ break;
2429
+ }
2430
+ // Unset currentLayout, nextLayout and layouts
2431
+ this.layouts = [];
2432
+ this.currentLayout = undefined;
2433
+ this.nextLayout = undefined;
2434
+ _context.next = 7;
2435
+ return this.prepareLayouts();
2436
+ case 7:
2437
+ xlr = _context.sent;
2438
+ this.playSchedules(xlr);
2439
+ _context.next = 40;
2440
+ break;
2441
+ case 11:
2442
+ /** Case 2: When currentLayout is in inputLayouts, then continue playing
2443
+ * Also check for nextLayout if in inputLayouts and same sequence, then don't change and continue playing.
2444
+ * If not in inputLayouts, then replace and prepare nextLayout.
2445
+ */
2446
+ // 2.1 We don't have to do anything for currentLayout
2447
+ // 2.2 Check for nextLayout
2448
+ // Get nextLayout index
2449
+ currLayoutIndex = getIndexByLayoutId(inputLayouts, (_this$currentLayout = this.currentLayout) === null || _this$currentLayout === void 0 ? void 0 : _this$currentLayout.layoutId).index;
2450
+ nxtLayoutIndex = getIndexByLayoutId(inputLayouts, (_this$nextLayout = this.nextLayout) === null || _this$nextLayout === void 0 ? void 0 : _this$nextLayout.layoutId).index;
2451
+ tempOldNxtLayout = this.layouts[nxtLayoutIndex];
2452
+ newNxtLayoutIndex = currLayoutIndex + 1;
2453
+ if (!(nxtLayoutIndex !== newNxtLayoutIndex)) {
2454
+ _context.next = 33;
2455
+ break;
2456
+ }
2457
+ // Delete old nextLayout
2458
+ delete this.layouts[nxtLayoutIndex];
2459
+ if (!Boolean(this.layouts[newNxtLayoutIndex])) {
2460
+ _context.next = 22;
2461
+ break;
2462
+ }
2463
+ this.nextLayout = this.layouts[newNxtLayoutIndex];
2464
+ this.layouts[newNxtLayoutIndex] = this.nextLayout;
2465
+ _context.next = 31;
2466
+ break;
2467
+ case 22:
2468
+ // Check if newNxtLayoutIndex is still within inputLayouts
2469
+ if (newNxtLayoutIndex + 1 > inputLayouts.length) {
2470
+ // Goes back to first layout in the sequence
2471
+ newNxtLayoutIndex = 0;
2472
+ }
2473
+ if (!Boolean(inputLayouts[newNxtLayoutIndex])) {
2474
+ _context.next = 29;
2475
+ break;
2476
+ }
2477
+ tempNxtLayout = _objectSpread2(_objectSpread2({}, initialLayout), inputLayouts[newNxtLayoutIndex]);
2478
+ _context.next = 27;
2479
+ return this.prepareLayoutXlf(tempNxtLayout);
2480
+ case 27:
2481
+ this.nextLayout = _context.sent;
2482
+ this.layouts[newNxtLayoutIndex] = this.nextLayout;
2483
+ case 29:
2484
+ // Move old nextLayout to its index
2485
+ hasOldNxtLayout = inputLayouts.filter(function (_layout) {
2486
+ return _layout.layoutId === (tempOldNxtLayout === null || tempOldNxtLayout === void 0 ? void 0 : tempOldNxtLayout.layoutId);
2487
+ });
2488
+ if (hasOldNxtLayout.length === 1) {
2489
+ oldNxtLayoutIndex = getIndexByLayoutId(inputLayouts, hasOldNxtLayout[0].layoutId).index;
2490
+ this.layouts[oldNxtLayoutIndex] = tempOldNxtLayout;
2491
+ }
2492
+ case 31:
2493
+ _context.next = 40;
2494
+ break;
2495
+ case 33:
2496
+ if (!(inputLayouts[nxtLayoutIndex].layoutId !== ((_this$nextLayout2 = this.nextLayout) === null || _this$nextLayout2 === void 0 ? void 0 : _this$nextLayout2.layoutId))) {
2497
+ _context.next = 39;
2498
+ break;
2499
+ }
2500
+ tempNewNxtLayout = _objectSpread2(_objectSpread2({}, initialLayout), inputLayouts[nxtLayoutIndex]);
2501
+ _context.next = 37;
2502
+ return this.prepareLayoutXlf(tempNewNxtLayout);
2503
+ case 37:
2504
+ this.nextLayout = _context.sent;
2505
+ this.layouts[nxtLayoutIndex] = this.nextLayout;
2506
+ case 39:
2507
+ // Remove old nextLayout if it's not in inputLayouts
2508
+ if (tempOldNxtLayout !== null && tempOldNxtLayout !== void 0 && tempOldNxtLayout.index && Boolean(this.layouts[tempOldNxtLayout === null || tempOldNxtLayout === void 0 ? void 0 : tempOldNxtLayout.index])) {
2509
+ if (inputLayouts.filter(function (_layout) {
2510
+ return _layout.layoutId === (tempOldNxtLayout === null || tempOldNxtLayout === void 0 ? void 0 : tempOldNxtLayout.layoutId);
2511
+ }).length === 0) {
2512
+ delete this.layouts[tempOldNxtLayout === null || tempOldNxtLayout === void 0 ? void 0 : tempOldNxtLayout.index];
2513
+ }
2514
+ }
2515
+ case 40:
2516
+ case "end":
2517
+ return _context.stop();
2518
+ }
2519
+ }, _callee, this);
2520
+ }));
2521
+ return function (_x) {
2522
+ return _ref.apply(this, arguments);
2523
+ };
2524
+ }();
2525
+ xlrObject.prepareLayouts = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
2526
+ var _xlrLayouts$current;
2527
+ var self, xlrLayouts, layoutsXlf, layouts;
2528
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
2529
+ while (1) switch (_context2.prev = _context2.next) {
2530
+ case 0:
2531
+ self = this; // Get layouts
2532
+ xlrLayouts = getLayout({
2533
+ xlr: self
2534
+ });
2535
+ console.debug('prepareLayouts::xlrLayouts', xlrLayouts);
2536
+ self.currentLayoutId = (_xlrLayouts$current = xlrLayouts.current) === null || _xlrLayouts$current === void 0 ? void 0 : _xlrLayouts$current.layoutId;
2537
+ layoutsXlf = function layoutsXlf() {
2538
+ var _xlrLayouts$current2, _xlrLayouts$next;
2539
+ var xlf = [];
2540
+ xlf.push(xlrLayouts.current);
2541
+ if (((_xlrLayouts$current2 = xlrLayouts.current) === null || _xlrLayouts$current2 === void 0 ? void 0 : _xlrLayouts$current2.layoutId) !== ((_xlrLayouts$next = xlrLayouts.next) === null || _xlrLayouts$next === void 0 ? void 0 : _xlrLayouts$next.layoutId)) {
2542
+ xlf.push(xlrLayouts.next);
2543
+ }
2544
+ return xlf.reduce(function (coll, item) {
2545
+ return [].concat(_toConsumableArray(coll), [self.prepareLayoutXlf(item)]);
2546
+ }, []);
2547
+ };
2548
+ _context2.next = 7;
2549
+ return Promise.all(layoutsXlf());
2550
+ case 7:
2551
+ layouts = _context2.sent;
2552
+ console.debug('prepareLayouts::layouts', layouts);
2553
+ console.debug('prepareLayouts::xlr>layouts', self.layouts);
2554
+ return _context2.abrupt("return", new Promise(function (resolve) {
2555
+ layouts.map(function (layoutItem) {
2556
+ if (!Boolean(self.layouts[layoutItem.index])) {
2557
+ self.layouts[layoutItem.index] = layoutItem;
2558
+ }
2559
+ });
2560
+ self.currentLayoutIndex = xlrLayouts.currentLayoutIndex;
2561
+ self.currentLayout = self.layouts[self.currentLayoutIndex];
2562
+ if (Boolean(layouts[1])) {
2563
+ self.nextLayout = layouts[1];
2564
+ } else {
2565
+ // Use current layout as next layout if only one layout is available
2566
+ self.nextLayout = self.layouts[0];
2567
+ }
2568
+ self.layouts[self.currentLayoutIndex] = self.currentLayout;
2569
+ resolve(self);
2570
+ }));
2571
+ case 11:
2572
+ case "end":
2573
+ return _context2.stop();
2574
+ }
2575
+ }, _callee2, this);
2576
+ }));
2577
+ xlrObject.prepareLayoutXlf = /*#__PURE__*/function () {
2578
+ var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(inputLayout) {
2579
+ var _this3 = this;
2580
+ var self, newOptions, layoutXlf, layoutXlfNode, parser;
2581
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
2582
+ while (1) switch (_context3.prev = _context3.next) {
2583
+ case 0:
2584
+ self = this; // Compose layout props first
2585
+ newOptions = Object.assign({}, platform);
2586
+ newOptions = _objectSpread2(_objectSpread2({}, newOptions), props.options);
2587
+ if (self.config.platform === 'CMS' && inputLayout && Boolean(inputLayout.layoutId)) {
2588
+ newOptions.xlfUrl = newOptions.xlfUrl.replace(':layoutId', String(inputLayout.layoutId));
2589
+ } else if (self.config.platform === 'chromeOS') {
2590
+ newOptions.xlfUrl = inputLayout.path;
2591
+ }
2592
+ if (!(inputLayout && inputLayout.layoutNode === null)) {
2593
+ _context3.next = 12;
2594
+ break;
2595
+ }
2596
+ _context3.next = 7;
2597
+ return getXlf(newOptions);
2598
+ case 7:
2599
+ layoutXlf = _context3.sent;
2600
+ parser = new window.DOMParser();
2601
+ layoutXlfNode = parser.parseFromString(layoutXlf, 'text/xml');
2602
+ _context3.next = 13;
2603
+ break;
2604
+ case 12:
2605
+ layoutXlfNode = inputLayout && inputLayout.layoutNode;
2606
+ case 13:
2607
+ return _context3.abrupt("return", new Promise(function (resolve) {
2608
+ var xlrLayoutObj = initialLayout;
2609
+ xlrLayoutObj.id = Number(inputLayout.layoutId);
2610
+ xlrLayoutObj.layoutId = Number(inputLayout.layoutId);
2611
+ xlrLayoutObj.options = newOptions;
2612
+ xlrLayoutObj.index = getIndexByLayoutId(_this3.inputLayouts, xlrLayoutObj.layoutId).index;
2613
+ resolve(Layout(layoutXlfNode, newOptions, self, xlrLayoutObj));
2614
+ }));
2615
+ case 14:
2616
+ case "end":
2617
+ return _context3.stop();
2618
+ }
2619
+ }, _callee3, this);
2620
+ }));
2621
+ return function (_x2) {
2622
+ return _ref3.apply(this, arguments);
2623
+ };
2624
+ }();
2625
+ xlrObject.bootstrap();
2626
+ return xlrObject;
2627
+ }
2628
+
2629
+ exports.default = XiboLayoutRenderer;
2630
+ exports.initialLayout = initialLayout;
2631
+ exports.initialMedia = initialMedia;
2632
+ exports.initialRegion = initialRegion;
2633
+ exports.initialXlr = initialXlr;
2634
+ //# sourceMappingURL=xibo-layout-renderer.cjs.js.map