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