diff --git a/bin/build.js b/bin/build.js index d9ad898..f7b35de 100755 --- a/bin/build.js +++ b/bin/build.js @@ -26,17 +26,6 @@ let uglifyOptions = { }, // toplevel: true }, - // compress: { - // ecma: "es6", - // keep_fargs: false, - // toplevel: true, - // dead_code: true, - // unused: true, - // passes: 1, - // }, - // sourceMap:{ - // url:"inline" - // }, output: { beautify: true } @@ -67,10 +56,10 @@ let regeneratorOptions = { }; if (shouldIncludeSourcemap){ - // uglifyOptions["sourceMap"] = {url: "inline"}; - uglifyOptions2["sourceMap"] = {url: "inline"}; - // babelOptions["sourceMaps"] = "inline"; - // regeneratorOptions["sourceMaps"] = "inline"; + uglifyOptions["sourceMap"] = {url: "inline"}; + uglifyOptions2["sourceMap"] = {url: "inline", content: "inline"}; + babelOptions["sourceMaps"] = "inline"; + regeneratorOptions["sourceMaps"] = "inline"; } const options = require('../rollup.config'); diff --git a/bin/build.sh b/bin/build.sh index 303bef1..fcb1378 100755 --- a/bin/build.sh +++ b/bin/build.sh @@ -1,4 +1,4 @@ #!/usr/bin/env bash cd $(dirname "$0")/.. -npm run build \ No newline at end of file +npm run build 1 \ No newline at end of file diff --git a/public/html/application/fragment/settings.html b/public/html/application/fragment/settings.html index c12d824..1f63654 100644 --- a/public/html/application/fragment/settings.html +++ b/public/html/application/fragment/settings.html @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/public/js/app.js b/public/js/app.js index f100bc2..8be5f96 100755 --- a/public/js/app.js +++ b/public/js/app.js @@ -1,7533 +1,5534 @@ -class InitPromise -{ - static addPromise(promise) - { - if (typeof promise === 'function') - { - let func = promise; - promise = InitPromise.mainPromise.then(function(app){ - return (func(app)); - }); - } - InitPromise.promises.push(promise); - } - - static resolve(app) - { - InitPromise.mainResolver(app); - return InitPromise.mainPromise.then(function(){ - return Promise.all(InitPromise.promises); - }); - } -} - -InitPromise.promises = []; -InitPromise.mainPromise = new Promise(function(resolver){ - InitPromise.mainResolver = resolver; -}); - -class AndroidBridge { - - static addDefinition(definition, object) { - if (typeof definition !== "function") { - if (typeof definition === "string"){ - let parts = definition.split("."); - for (let i = parts.length-1; i >= 1; i--) { - let newObject = {}; - newObject[parts[i]] = object; - object = newObject; - } - definition = parts[0]; - // console.log("parts for", definition, parts, object); - } - let textDefinition = definition; - definition = () => { - // console.log("defining", textDefinition, object); - window[textDefinition] = object; - }; - } - AndroidBridge.definitions.push(definition); - } - - static applyDefinitions() { - for (let i = 0; i < AndroidBridge.definitions.length; i++) { - AndroidBridge.definitions[i](); - } - return Promise.resolve(); - } -} - -AndroidBridge.definitions = []; -AndroidBridge.addDefinition("InitPromise.addPromise", InitPromise.addPromise); - -class MenuAction { - constructor(title, callback, showFor, order) { - this.title = Helper.nonNull(title, null); - this.callback = callback; - this.showFor = Helper.nonNull(showFor, MenuAction.SHOW_FOR_MEDIUM); - this.order = Helper.nonNull(order, 1000); - this._liClass = ""; - - this._menu = null; - this._activated = true; - this._visible = true; - this.id = MenuAction.maxId++; - this._icon = null; - this._shouldTranslate = true; - this._copies = []; - } - - setTitle(title) - { - this.title = title; - } - - setShouldTranslate(shouldTranslate) - { - this._shouldTranslate = shouldTranslate; - } - - getShowFor(){ - return this.showFor; - } - - getTitle() - { - return this.title; - } - - getShouldTranslate() - { - return this._shouldTranslate; - } - - remove(removeCopies) { - removeCopies = Helper.nonNull(removeCopies, false); - if (Helper.isNotNull(this._menu)) { - console.log(this._menu); - this._menu.removeAction(this); - this._menu = null; - } - if (removeCopies) - { - for (let i = 0; i < this._copies.length; i++) { - this._copies[i].remove(); - } - } - } - - getMenu() { - return this._menu; - } - - setMenu(value) { - this._menu = value; - } - - getVisible() { - return this._visible; - } - - setVisible(value) { - if (value !== this._visible) { - this._visible = value; - this.redraw(); - } - } - - getActivated() { - return this._activated; - } - - getIcon() { - return this._icon; - } - - setIcon(value) { - this._icon = value; - } - - getId() - { - return this.id; - } - - redraw() { - if (Helper.isNotNull(this._menu)) { - this._menu.updateAction(this); - } - } - copy(instance){ - let copy = Helper.nonNull(instance, new MenuAction()); - copy.title = this.title; - copy.callback = this.callback; - copy.showFor = this.showFor; - copy.order = this.order; - copy._liClass = this._liClass; - - copy._activated = this._activated; - copy._visible = this._visible; - copy._icon = this._icon; - copy._shouldTranslate = this._shouldTranslate; - - copy._menu = null; - copy.id = MenuAction.maxId++; - this._copies.push(copy); - return copy; - } - - redrawMenu() - { - if (Helper.isNotNull(this._menu)) { - this._menu.redraw(); - } - } -} -MenuAction.maxId = 0; - -MenuAction.SHOW_ALWAYS = "always"; -MenuAction.SHOW_FOR_MEDIUM = "medium"; -MenuAction.SHOW_FOR_LARGE = "large"; -MenuAction.SHOW_NEVER = "never"; - -class OpenSubmenuAction extends MenuAction { - constructor(title, menu, showFor, order) { - super(title, function (action) { - action.getSubmenu().toggle(); - action.redraw(); - }, showFor, order); - - this.submenu = menu; - menu.setParentAction(this); - } - - getSubmenu() { - return this.submenu; - } - - copy(instance) { - instance = super.copy(Helper.nonNull(instance, new OpenSubmenuAction(null, this.submenu.copy()))); - return instance; - } -} - -class Menu { - constructor(parentElementSelector) { - this.actions = []; - this.submenus = []; - if (typeof parentElementSelector === 'string') { - this.parentElements = document.querySelectorAll(parentElementSelector); - } - else if (Array.isArray(parentElementSelector)) { - this.parentElements = parentElementSelector; - } - else { - this.parentElements = [parentElementSelector]; - } - } - - copy(instance) { - instance = Helper.nonNull(instance, new Menu([])); - - instance.actions = []; - for (let i = 0, n = this.actions.length; i < n; i++) { - instance.actions.push(this.actions[i].copy()); - } - - instance.submenus = []; - for (let i = 0, n = this.submenus.length; i < n; i++) { - instance.submenus.push(this.submenus[i].copy()); - } - - return instance; - } - - addAction(action) { - if (Helper.includesNot(this.actions, action)) { - this.actions.push(action); - this.redraw(); - action.setMenu(this); - if (action instanceof OpenSubmenuAction) { - this.submenus.push(action.getSubmenu()); - } - } - } - - draw() { - if (Helper.isNotNull(this.parentElements)) { - this.sortActions(); - - let actionElements = []; - for (let i = 0; i < this.actions.length; i++) { - let element = this.renderAction(this.actions[i]); - this.actions[i]._htmlElement = element; - actionElements.push(element); - } - for (let i = 0, n = this.parentElements.length; i < n; i++) { - this.parentElements[i].removeAllChildren(); - for (let i2 = 0, n2 = actionElements.length; i2 < n2; i2++) { - this.parentElements[i].appendChild(Helper.cloneNode(actionElements[i2])); - } - this.parentElements[i].onclick = this._getOnClickListener(); - } - } - } - - _getOnClickListener() { - let menu = this; - return function (event) { - let _element = event.target; - if (_element.matches('.action') || _element.matches('.action *')) { - // while (!_element.matches('.action > a')) { - // _element = _element.parentNode; - // } - _element = _element.closest(".action"); - let actionId = parseInt(_element.dataset["id"]); - for (let i = 0, n = menu.actions.length; i < n; i++) { - if (menu.actions[i].id === actionId) { - if (typeof menu.actions[i].callback === 'function' && menu.actions[i].getActivated()) { - menu.actions[i].callback(menu.actions[i], event); - } - return menu.actions[i]; - } - } - for (let i = 0, n = menu.submenus.length; i < n; i++) { - if (menu.submenus[i].click(actionId, event)) { - return menu.submenus[i]; - } - } - } - return null; +!function (t) { + "use strict"; + var e, n = Object.prototype, r = n.hasOwnProperty, i = "function" == typeof Symbol ? Symbol : {}, + o = i.iterator || "@@iterator", s = i.asyncIterator || "@@asyncIterator", a = i.toStringTag || "@@toStringTag", + u = "object" == typeof module, l = t.regeneratorRuntime; + if (l) u && (module.exports = l); else { + (l = t.regeneratorRuntime = u ? module.exports : {}).wrap = k; + var c = "suspendedStart", h = "suspendedYield", f = "executing", p = "completed", d = {}, v = {}; + v[o] = function () { + return this }; - } - - /** @protected */ - renderAction(action) { - let aElement = document.createElement("a"); - if (typeof action.callback === 'string') { - aElement.href = action.callback; - } - - if (Helper.isNotNull(action.getIcon())) { - let iconElement = document.createElement("img"); - iconElement.src = action.getIcon(); - iconElement.classList.add('action-image'); - if (action.getShouldTranslate()) { - iconElement.dataset["translationTitle"] = action.title; - } - aElement.appendChild(iconElement); - } - let title = action.getTitle(); - if (action.getShouldTranslate()) { - title = Translator.makePersistentTranslation(title); - } - else { - title = document.createTextNode(title); - } - aElement.appendChild(title); - - return this.renderLiElement(aElement, action) - } - - /** @protected */ - renderLiElement(aElement, action) { - let liElement = document.createElement("li"); - liElement.classList.add('action'); - if (action._liClass.trim() !== "") { - liElement.classList.add(action._liClass); - } - liElement.appendChild(aElement); - liElement.dataset["id"] = action.id; - if (Helper.isNotNull(action.getIcon())) { - liElement.classList.add("img"); - } - - if (!action.getVisible()) { - liElement.classList.add("hidden"); - } - - if (action instanceof OpenSubmenuAction) { - action.getSubmenu().draw(); - liElement.appendChild(action.getSubmenu().getParentElement()); - liElement.classList.add("is-dropdown-submenu-parent"); - liElement.classList.add("opens-right"); - } - return liElement; - } - - /** @private */ - sortActions() { - this.actions = this.actions.sort(function (first, second) { - return first.order - second.order; - }); - } - - _getElementsForAction(action) { - let elements = []; - for (let i = 0; i < this.parentElements.length; i++) { - let elem = this.parentElements[i].querySelector("[data-id=\"" + action.getId() + "\"]"); - Helper.isNull(elem) || elements.push(elem); - } - return elements - } - - updateAction(action) { - let oldElements = this._getElementsForAction(action); - if (oldElements.length === 0) { - return; - } - - let element = this.renderAction(action); - action._htmlElement = element; - - for (let i = 0; i < oldElements.length; i++) { - oldElements[i].replaceWith(Helper.cloneNode(element)); - } - } - - removeAction(action) { - let index = this.actions.indexOf(action); - if (index > 0) { - this.actions.splice(index, 1); - let oldElements = this._getElementsForAction(action); - for (let i = 0, n = oldElements.length; i < n; i++) { - oldElements[i].remove(); - } - if (action instanceof OpenSubmenuAction) { - let index = this.submenus.indexOf(action.getSubmenu()); - this.submenus.splice(index, 1); - } - } - } - - redraw() { - this.draw(); - } -} - -Menu.SHOW_ALWAYS = "always"; -Menu.SHOW_FOR_MEDIUM = "medium"; -Menu.SHOW_FOR_SMEDIUM = "smedium"; -Menu.SHOW_FOR_LARGE = "large"; -Menu.SHOW_NEVER = "never"; - -class Submenu extends Menu -{ - constructor() - { - let menuElement = document.createElement("ul"); - menuElement.classList.add("menu"); - menuElement.classList.add("vertical"); - menuElement.classList.add("submenu"); - menuElement.classList.add("is-dropdown-submenu"); - menuElement.classList.add("first-sub"); - super(menuElement); - - this.parentAction = null; - this.isOpen = false; - } - - - - copy(instance) - { - instance = super.copy(Helper.nonNull(instance, new Submenu())); - instance.parentElements = []; - for (let i = 0, n = this.parentElements.length; i < n; i++) { - instance.parentElements.push(Helper.cloneNode(this.parentElements[i])); - } - instance.parentAction = this.parentAction; - instance.isOpen = this.isOpen; - return instance; - } - - setParentAction(action) - { - this.parentAction = action; - } - - draw() - { - super.draw(); - if (Helper.isNotNull(this.parentElements)) - { - let self = this; - for (let i = 0; i < this.parentElements.length; i++) { - let closeListener = document.createElement("div"); - closeListener.classList.add("close-listener"); - closeListener.onclick = function(e){ - console.log(e); - self.close(); - }; - this.parentElements[i].insertBefore(closeListener, this.parentElements[i].firstElementChild); - } - } - } - - getParentElement() - { - return this.parentElements[0]; - } - - _getOnClickListener() - { - return function () {}; - } - - click(actionId, event) - { - for (let i = 0, n = this.actions.length; i < n; i++) { - if (this.actions[i].id === actionId) - { - if (typeof this.actions[i].callback === 'function' && this.actions[i].getActivated()) { - this.actions[i].callback(this.actions[i], event); + var m = Object.getPrototypeOf, y = m && m(m(S([]))); + y && y !== n && r.call(y, o) && (v = y); + var g = x.prototype = _.prototype = Object.create(v); + b.prototype = g.constructor = x, x.constructor = b, x[a] = b.displayName = "GeneratorFunction", l.isGeneratorFunction = function (t) { + var e = "function" == typeof t && t.constructor; + return !!e && (e === b || "GeneratorFunction" === (e.displayName || e.name)) + }, l.mark = function (t) { + return Object.setPrototypeOf ? Object.setPrototypeOf(t, x) : (t.__proto__ = x, a in t || (t[a] = "GeneratorFunction")), t.prototype = Object.create(g), t + }, l.awrap = function (t) { + return {__await: t} + }, O(L.prototype), L.prototype[s] = function () { + return this + }, l.AsyncIterator = L, l.async = function (t, e, n, r) { + var i = new L(k(t, e, n, r)); + return l.isGeneratorFunction(e) ? i : i.next().then(function (t) { + return t.done ? t.value : i.next() + }) + }, O(g), g[a] = "Generator", g[o] = function () { + return this + }, g.toString = function () { + return "[object Generator]" + }, l.keys = function (t) { + var e = []; + for (var n in t) e.push(n); + return e.reverse(), function n() { + for (; e.length;) { + var r = e.pop(); + if (r in t) return n.value = r, n.done = !1, n } - this.close(); - return true; + return n.done = !0, n + } + }, l.values = S, C.prototype = { + constructor: C, reset: function (t) { + if (this.prev = 0, this.next = 0, this.sent = this._sent = e, this.done = !1, this.delegate = null, this.method = "next", this.arg = e, this.tryEntries.forEach(E), !t) for (var n in this) "t" === n.charAt(0) && r.call(this, n) && !isNaN(+n.slice(1)) && (this[n] = e) + }, stop: function () { + this.done = !0; + var t = this.tryEntries[0].completion; + if ("throw" === t.type) throw t.arg; + return this.rval + }, dispatchException: function (t) { + if (this.done) throw t; + var n = this; + + function i(r, i) { + return a.type = "throw", a.arg = t, n.next = r, i && (n.method = "next", n.arg = e), !!i + } + + for (var o = this.tryEntries.length - 1; o >= 0; --o) { + var s = this.tryEntries[o], a = s.completion; + if ("root" === s.tryLoc) return i("end"); + if (s.tryLoc <= this.prev) { + var u = r.call(s, "catchLoc"), l = r.call(s, "finallyLoc"); + if (u && l) { + if (this.prev < s.catchLoc) return i(s.catchLoc, !0); + if (this.prev < s.finallyLoc) return i(s.finallyLoc) + } else if (u) { + if (this.prev < s.catchLoc) return i(s.catchLoc, !0) + } else { + if (!l) throw new Error("try statement without catch or finally"); + if (this.prev < s.finallyLoc) return i(s.finallyLoc) + } + } + } + }, abrupt: function (t, e) { + for (var n = this.tryEntries.length - 1; n >= 0; --n) { + var i = this.tryEntries[n]; + if (i.tryLoc <= this.prev && r.call(i, "finallyLoc") && this.prev < i.finallyLoc) { + var o = i; + break + } + } + o && ("break" === t || "continue" === t) && o.tryLoc <= e && e <= o.finallyLoc && (o = null); + var s = o ? o.completion : {}; + return s.type = t, s.arg = e, o ? (this.method = "next", this.next = o.finallyLoc, d) : this.complete(s) + }, complete: function (t, e) { + if ("throw" === t.type) throw t.arg; + 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), d + }, finish: function (t) { + for (var e = this.tryEntries.length - 1; e >= 0; --e) { + var n = this.tryEntries[e]; + if (n.finallyLoc === t) return this.complete(n.completion, n.afterLoc), E(n), d + } + }, catch: function (t) { + for (var e = this.tryEntries.length - 1; e >= 0; --e) { + var n = this.tryEntries[e]; + if (n.tryLoc === t) { + var r = n.completion; + if ("throw" === r.type) { + var i = r.arg; + E(n) + } + return i + } + } + throw new Error("illegal catch attempt") + }, delegateYield: function (t, n, r) { + return this.delegate = { + iterator: S(t), + resultName: n, + nextLoc: r + }, "next" === this.method && (this.arg = e), d } } - return false; } - toggle() - { - if (this.isOpen) - { - this.close(); - } - else - { - this.open(); - } + function k(t, e, n, r) { + var i = e && e.prototype instanceof _ ? e : _, o = Object.create(i.prototype), s = new C(r || []); + return o._invoke = function (t, e, n) { + var r = c; + return function (i, o) { + if (r === f) throw new Error("Generator is already running"); + if (r === p) { + if ("throw" === i) throw o; + return j() + } + for (n.method = i, n.arg = o; ;) { + var s = n.delegate; + if (s) { + var a = P(s, n); + if (a) { + if (a === d) continue; + return a + } + } + if ("next" === n.method) n.sent = n._sent = n.arg; else if ("throw" === n.method) { + if (r === c) throw r = p, n.arg; + n.dispatchException(n.arg) + } else "return" === n.method && n.abrupt("return", n.arg); + r = f; + var u = w(t, e, n); + if ("normal" === u.type) { + if (r = n.done ? p : h, u.arg === d) continue; + return {value: u.arg, done: n.done} + } + "throw" === u.type && (r = p, n.method = "throw", n.arg = u.arg) + } + } + }(t, n, s), o } - open() - { - this.isOpen = true; - for (let i = 0, n = this.parentElements.length; i < n; i++) { - this.parentElements[i].classList.add("js-dropdown-active"); - } - if (Helper.isNotNull(this.parentAction)) - { - this.parentAction.redraw(); - } - } - close() - { - this.isOpen = false; - for (let i = 0, n = this.parentElements.length; i < n; i++) { - this.parentElements[i].classList.remove("js-dropdown-active"); - } - if (Helper.isNotNull(this.parentAction)) - { - this.parentAction.redraw(); - } - } -} - -class TranslatorDB { - constructor() { - this._indexedDB = indexedDB || mozIndexedDB || webkitIndexedDB || msIndexedDB; - this._version = 3; - - let self = this; - this._dbPromise = new Promise(function (resolve, reject) { - let request = self._indexedDB.open("Translator", self._version); - request.onupgradeneeded = function (event) { - let db = event.target.result; - self._upgradeDb(db); - }; - request.onsuccess = function (event) { - let db = event.target.result; - resolve(db); - }; - request.onerror = function (event) { - reject(event); - }; - }).catch(function(e){ - console.error(e); - }); - } - - _upgradeDb(db) { + function w(t, e, n) { try { - db.deleteObjectStore("currentLang"); - db.deleteObjectStore("translations"); + return {type: "normal", arg: t.call(e, n)} + } catch (t) { + return {type: "throw", arg: t} } - catch (e) { - console.warn(e); - } - let currentLangObjectStore = db.createObjectStore("currentLang", {"keyPath": "id"}); - let translationsObjectStore = db.createObjectStore("translations", {"keyPath": ["lang","key"]}); - translationsObjectStore.createIndex("lang", "lang", {"unique": false}); } - setLanguage(lang) { - this._dbPromise.then(function (db) { - let transaction = TranslatorDB._openTransaction(["currentLang"], "readwrite", db); - let currentLangObjectStore = transaction.objectStore("currentLang"); - currentLangObjectStore.put({"id": 1, "lang": lang}); - }).catch(function(e){ - console.error(e); - }); + function _() { } - saveTranslationsForLang(lang, translations) { - return this._dbPromise.then(function (db) { - return new Promise(function (resolve) { - let transaction = TranslatorDB._openTransaction(["translations"], "readwrite", db); - let translationsObjectStore = transaction.objectStore("translations"); - for (let k in translations) { - translationsObjectStore.put({"lang": lang, "key": k, "translation": translations[k]}); - } - transaction.oncomplete = function () { - resolve(); - }; - }); - }).catch(function(e){ - // console.error(e); - }); + function b() { } - loadTranslationsForLang(lang) { - return this._dbPromise.then(function (db) { - return new Promise(function (resolve) { - let transaction = TranslatorDB._openTransaction(["translations"], "readonly", db); - let translationsObjectStore = transaction.objectStore("translations"); - let index = translationsObjectStore.index("lang"); - let request = index.openCursor(IDBKeyRange.only(lang)); - - let translations = {}; - request.onsuccess = function (e) { - let cursor = e.target.result; - if (cursor) { - - let translation = cursor.value; - translations[translation["key"]] = translation["translation"]; - cursor.continue(); - } - }; - transaction.oncomplete = function(){ - resolve(translations); - }; - }); - }).catch(function(e){ - console.error(e); - return {}; - }); + function x() { } - getLanguage() { - return this._dbPromise.then(function (db) { - return new Promise(function (resolve) { - let transaction = TranslatorDB._openTransaction(["currentLang"], "readonly", db); - let currentLangObjectStore = transaction.objectStore("currentLang"); - let req = currentLangObjectStore.get(1); - req.onsuccess = function (e) { - let data = e.currentTarget.result; - if (data) - { - resolve(data["lang"]); - } - else - { - resolve(null); - } - }; - req.onerror = function (e) { - resolve(null); - }; - }); - }).catch(function(e){ - // console.error(e); - }); - } - - static _openTransaction(name, transactionMode, db) { - let transaction = null; - try { - transaction = db.transaction(name, transactionMode); - } - catch (e) { - console.warn(e); - transaction = db.transaction(name); - } - return transaction; - } -} - -class Translator { - constructor() { - this._translations = []; - this._db = new TranslatorDB(); - this._currentLanguage = null; - this._supportedLanguages = Translator.supportedLanguages; - this._baseLanguage = Translator.baseLanguage; - this._languageBasePath = Translator.languageBasePath; - this._markUntranslatedTranslations = Translator.markUntranslatedTranslations; - this._markTranslations = Translator.markTranslations; - - let self = this; - this._initPromise = this.loadBaseLanguage().then(function () { - return self.loadUserLanguage(); - }); - } - - _loadLanguage(language) { - let self = this; - return fetch(Helper.basePath(this._languageBasePath + language + ".json")).then(function (result) { - return result.json(); - }).then(function (res) { - self._translations[language] = Object.assign(res, self._translations[language]); - self._db.saveTranslationsForLang(language, self._translations[language]); - }).catch(function (err) { - console.error("could not load lang " + language + " because of error: ", err); - }); - } - - loadBaseLanguage() { - let self = this; - return this._loadLanguage(this._baseLanguage).then(function () { - self._currentLanguage = self._baseLanguage; - if (typeof document !== 'undefined') { - document.getElementsByTagName("html")[0].setAttribute("lang", self._baseLanguage); + function O(t) { + ["next", "throw", "return"].forEach(function (e) { + t[e] = function (t) { + return this._invoke(e, t) } - }); - }; - - static setLanguage(language) { - let instance = Translator.getInstance(); - if (instance) { - return instance.setLanguage(language); - } - } - - setLanguage(language) { - if (this._currentLanguage === language) { - this.updateTranslations(); - return Promise.resolve(); - } - - if (this._supportedLanguages.indexOf(language) === -1) { - return Promise.resolve(); - } - - this._currentLanguage = language; - if (typeof localStorage !== 'undefined') { - localStorage.setItem("language", language); - } - this._db.setLanguage(language); - - let self = this; - return this._loadLanguage(language).then(function () { - if (typeof document !== 'undefined') { - document.getElementsByTagName("html")[0].setAttribute("lang", language); - } - self.updateTranslations(); - }); - } - - static translate(key, args) { - let instance = Translator.getInstance(); - if (instance) { - return instance.translate(key, args); - } - return ""; - } - - translate(key, args) { - if (typeof key === 'object' && Helper.isNotNull(key)) { - key = this.addDynamicTranslation(key); - } - - let translation = null; - if (Helper.isNotNull(this._translations[this._currentLanguage]) && Helper.isNotNull(this._translations[this._currentLanguage][key])) { - translation = this._translations[this._currentLanguage][key]; - } - - if (Helper.isNull(translation)) { - if (Translator.logMissingTranslations) { - console.warn("missing translation for language " + this._currentLanguage + " and key " + key); - } - if (Helper.isNotNull(this._translations[this._baseLanguage])) { - translation = this._translations[this._baseLanguage][key]; - } - - if (Helper.isNull(translation)) { - if (Translator.logMissingTranslations) { - console.error("missing base translation for key " + key + ". FIX IT"); - } - translation = key; - } - if (this._markUntranslatedTranslations) { - translation = ">>" + translation + "<<"; - } - } - - if (this._markTranslations) { - translation = "$" + translation + "$"; - } - - if (args !== undefined) { - translation = translation.format(args); - } - - return translation; - } - - static addDynamicTranslation(trans) { - let instance = Translator.getInstance(); - if (instance) { - return instance.addDynamicTranslation(trans); - } - } - - addDynamicTranslation(trans) { - let key = trans["key"]; - delete trans["key"]; - for (let lang in trans) { - if (trans.hasOwnProperty(lang)) { - if (Helper.isNull(this._translations[lang])) { - this._translations[lang] = {}; - } - this._translations[lang][key] = trans[lang]; - } - } - return key; - } - - updateTranslations() { - if (typeof document !== 'undefined') { - let elements = document.querySelectorAll("[data-translation]"); - for (let i = 0, max = elements.length; i < max; i++) { - if (elements[i].dataset["translation"] != "") { - try { - elements[i].innerHTML = this.translate(elements[i].dataset["translation"], (elements[i].dataset["translationArgs"] !== undefined) ? JSON.parse(elements[i].dataset["translationArgs"]) : undefined); - } - catch (err) { - console.error("wrong configured translation: " + err); - } - } - for (let k in elements[i].dataset) { - if (k.startsWith("translation") && !k.endsWith("Args")) { - try { - elements[i][k.substr(11).toLowerCase()] = this.translate(elements[i].dataset[k], (elements[i].dataset[k + "Args"] !== undefined) ? JSON.parse(elements[i].dataset[k + "Args"]) : undefined); - } - catch (err) { - console.error("wrong configured translation: " + err); - } - } - } - } - } - } - - loadUserLanguage() { - let userLanguage = localStorage.getItem("language"); - if (Helper.isNull(userLanguage) || this._supportedLanguages.indexOf(userLanguage) === -1) { - let userLanguages = []; - if (Helper.isNotNull(navigator.languages)) { - userLanguages = navigator.languages.slice(0); //.slice(0) klont das Array. Behebt einen Bug in Firefox - } - - if (navigator.language !== undefined) { - userLanguages.push(navigator.language); - } - //sicherstellen, dass überhaupt eine Sprache gefunden wird - userLanguages.push(this._baseLanguage); - - if (userLanguages !== undefined) { - for (let i = 0, numLanguages = userLanguages.length; i < numLanguages; i++) { - if (this._supportedLanguages.indexOf(userLanguages[i]) !== -1) { - userLanguage = userLanguages[i]; - break; - } - } - } - } - return this.setLanguage(userLanguage.toLowerCase()) - } - - static makePersistentTranslation(key, args, tag) { - tag = Helper.nonNull(tag, "span"); - if (typeof key === 'object') { - key = Translator.addDynamicTranslation(key); - } - - if (typeof document !== 'undefined') { - let htmlElem = document.createElement(tag); - htmlElem.dataset["translation"] = key; - if (args !== undefined) { - htmlElem.dataset["translationArgs"] = JSON.stringify(args); - } - htmlElem.innerHTML = Translator.translate(key, args); - return htmlElem; - } - } - - static generateChangeLanguageMenuAction() { - let submenu = new Submenu(); - submenu.addAction(new MenuAction("en", function () { - Translator.getInstance().setLanguage("en"); - })); - submenu.addAction(new MenuAction("de", function () { - Translator.getInstance().setLanguage("de"); - })); - return new OpenSubmenuAction("current-lang", submenu, Menu.SHOW_ALWAYS) - } - - static init() { - Translator.instance = new Translator(); - // Translator.loadBaseLanguage().then(function () { - // Translator.loadUserLanguage(); - // }); - } - - static getInstance() { - return Translator.instance; - } -} -Translator.logMissingTranslations = false; - -Translator.instance = null; - -Translator.baseLanguage = "en"; -Translator.supportedLanguages = [ - "de", - "en" -]; -Translator.markUntranslatedTranslations = true; -Translator.markTranslations = false; -Translator.languageBasePath = "js/lang/"; -Translator.currentLanguage = null; -Translator.translations = {}; - - -AndroidBridge.addDefinition("Translator.setLanguage", Translator.setLanguage); - -class Helper { - static init() { - Helper.heightMmToPxFactor = null; - Helper.widthMmToPxFactor = null; - } - - static includesNot(array, value, fromIndex) { - return -1 === array.indexOf(value, fromIndex); - } - - static includes(array, value, fromIndex) { - return !Helper.includesNot(array, value, fromIndex); - } - - static isSet() { - if (arguments.length > 0) { - const object = arguments[0]; - let keys = Array.prototype.slice.call(arguments, 1); - return (Helper.isNotNull(object) && (keys.length === 0 || Helper.isSet.apply(null, [object[keys[0]]].concat(keys.slice(1))))); - } - return false; - } - - static isNull(variable) { - return (variable === null || variable === undefined); - } - - static isNotNull(variable) { - return !Helper.isNull(variable); - } - - static nonNull(val1, val2) { - for (let i = 0; i < arguments.length; i++) { - if (Helper.isNotNull(arguments[i])) { - return arguments[i]; - } - } - return null; - } - - static notEmpty(value) { - return !Helper.empty(value); - } - - static buildQuery(values) { - let queryStrings = []; - for (let k in values) { - queryStrings.push(encodeURIComponent(k) + "=" + encodeURIComponent(values[k])); - } - return "?" + queryStrings.join("&"); - } - - static empty(value) { - return (Helper.isNull(value) || (typeof value === 'string' && value.trim() === "")) - } - - static inflateElementsFromString(string) { - let template = document.createElement('template'); - template.innerHTML = string; - return template.content.childNodes; - } - - static createLoadingSymbol() { - let svgNS = "http://www.w3.org/2000/svg"; - - let loader = document.createElement("div"); - loader.className = 'loader'; - - let svg = document.createElementNS(svgNS, "svg"); - svg.setAttribute('viewBox', "0 0 32 32"); - svg.setAttribute("widh", "32"); - svg.setAttribute("height", "32"); - - let circle = document.createElementNS(svgNS, "circle"); - circle.setAttribute("id", "spinner"); - circle.setAttribute("cx", "16"); - circle.setAttribute("cy", "16"); - circle.setAttribute("r", "14"); - circle.setAttribute("fill", "none"); - - svg.appendChild(circle); - loader.appendChild(svg); - - return loader; - } - - static basePath(url) { - return SystemSettings.getBasePath() + url; - } - - static isMobileApple() { - return navigator.userAgent.match(/iPhone|iPad|iPod/i); - } - - static isMobile() { - return (navigator.userAgent.match(/Android|BlackBerry|Opera Mini|IEMobile/i) !== null || Helper.isMobileApple() || (typeof window.orientation !== "undefined" || window.orientation === false || window.orientation === null)); - } - - static select(e) { - let range = document.createRange(); - range.selectNodeContents(e); - let sel = window.getSelection(); - sel.removeAllRanges(); - sel.addRange(range); - } - - static format(number, leadingZeros) { - number = "" + number; - while (number.length < leadingZeros) { - number = "0" + number; - } - return number; - } - - static cloneNode(srcNode) { - let destNode = srcNode.cloneNode(true); - destNode.onclick = srcNode.onclick; - return destNode; - } - - static encodeToBase(stringToEncode, base) { - let encodedString = ""; - let charlength = Math.floor(Math.log(265) / Math.log(base)); - for (let i = 0; i < stringToEncode.length; i++) { - let value = stringToEncode.charCodeAt(i).toString(base); - let joinLength = value.length % charlength; - if (joinLength > 0) { - let joinArray = new Array(charlength + 1 - (joinLength)); //+1, da join nur zwischen elemente einfügt - value = joinArray.join("0") + value; - } - encodedString += value; - } - return encodedString; - } - - static decodeToBase(stringToDecode, base) { - let charlength = Math.floor(Math.log(265) / Math.log(base)); - let values = stringToDecode.match(new RegExp(".{1," + charlength + "}", "g")) || []; - let encodedString = ""; - for (let i = 0, n = values.length; i < n; i++) { - encodedString += String.fromCharCode(parseInt(values[i], base)); - } - return encodedString; - } - - static toggleVisibility(elem) { - if (elem.style.display === "none") { - elem.style.display = ""; - return true; - } - else { - elem.style.display = "none"; - return false; - } - } - - static print(content) { - let printContent = document.getElementById("print-content"); - if (content instanceof Element) { - printContent.removeAllChildren(); - printContent.appendChild(content); - } - else { - printContent.innerHTML = content; - } - window.print(); - } - - static strftime(sFormat, date, useUTC) { - if (!(date instanceof Date)) date = new Date(date); - useUTC = Helper.nonNull(useUTC, false); - let nDay = (useUTC) ? date.getUTCDay() : date.getDay(), - nDate = (useUTC) ? date.getUTCDate() : date.getDate(), - nMonth = (useUTC) ? date.getUTCMonth() : date.getMonth(), - nYear = (useUTC) ? date.getUTCFullYear() : date.getFullYear(), - nHour = (useUTC) ? date.getUTCHours() : date.getHours(), - aDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], - aMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], - aDayCount = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334], - isLeapYear = function () { - if ((nYear & 3) !== 0) return false; - return nYear % 100 !== 0 || nYear % 400 === 0; - }, - getThursday = function () { - let target = new Date(date); - target.setDate(nDate - ((nDay + 6) % 7) + 3); - return target; - }, - zeroPad = function (nNum, nPad) { - return ('' + (Math.pow(10, nPad) + nNum)).slice(1); - }; - - return sFormat.replace(/%[a-z]/gi, function (sMatch) { - return { - '%a': Translator.makePersistentTranslation(aDays[nDay].slice(0, 3)).outerHTML, - '%A': Translator.makePersistentTranslation(aDays[nDay]).outerHTML, - '%b': Translator.makePersistentTranslation(aMonths[nMonth].slice(0, 3)).outerHTML, - '%B': Translator.makePersistentTranslation(aMonths[nMonth]).outerHTML, - '%c': date.toUTCString(), - '%C': Math.floor(nYear / 100), - '%d': zeroPad(nDate, 2), - '%e': nDate, - '%f': zeroPad(date.getTime() % 1000, 4), - '%F': date.toISOString().slice(0, 10), - '%G': getThursday().getFullYear(), - '%g': ('' + getThursday().getFullYear()).slice(2), - '%H': zeroPad(nHour, 2), - '%I': zeroPad((nHour + 11) % 12 + 1, 2), - '%j': zeroPad(aDayCount[nMonth] + nDate + ((nMonth > 1 && isLeapYear()) ? 1 : 0), 3), - '%k': '' + nHour, - '%l': (nHour + 11) % 12 + 1, - '%m': zeroPad(nMonth + 1, 2), - '%M': zeroPad(date.getMinutes(), 2), - '%p': (nHour < 12) ? 'AM' : 'PM', - '%P': (nHour < 12) ? 'am' : 'pm', - '%s': Math.round(date.getTime() / 1000), - '%S': zeroPad(date.getSeconds(), 2), - '%u': nDay || 7, - '%V': (function () { - let target = getThursday(), - n1stThu = target.valueOf(); - target.setMonth(0, 1); - let nJan1 = target.getDay(); - if (nJan1 !== 4) target.setMonth(0, 1 + ((4 - nJan1) + 7) % 7); - return zeroPad(1 + Math.ceil((n1stThu - target) / 604800000), 2); - })(), - '%w': '' + nDay, - '%x': date.toLocaleDateString(), - '%X': date.toLocaleTimeString(), - '%y': ('' + nYear).slice(2), - '%Y': nYear, - '%z': date.toTimeString().replace(/.+GMT([+-]\d+).+/, '$1'), - '%Z': date.toTimeString().replace(/.+\((.+?)\)$/, '$1') - }[sMatch] || sMatch; - }); - } - - static cloneJson(obj) { - // https://stackoverflow.com/questions/4120475/how-to-create-and-clone-a-json-object/17502990#17502990 - let i; - - // basic type deep copy - if (Helper.isNull(obj) || typeof obj !== 'object') { - return obj - } - // array deep copy - if (obj instanceof Array) { - let cloneA = []; - for (i = 0; i < obj.length; ++i) { - cloneA[i] = Helper.cloneJson(obj[i]); - } - return cloneA; - } - if (obj instanceof Date) - { - return new Date(obj.getTime()); - } - // object deep copy - let cloneO = {}; - for (i in obj) { - cloneO[i] = Helper.cloneJson(obj[i]); - } - return cloneO; - } - - static htmlspecialcharsDecode(text) { - const map = { - '&': '&', - '&': "&", - '<': '<', - '>': '>', - '"': '"', - ''': "'", - '’': "’", - '‘': "‘", - '–': "–", - '—': "—", - '…': "…", - '”': '”' - }; - - if (Helper.isNotNull(text) && typeof text.replace === "function") { - return text.replace(/\&[\w\d\#]{2,5}\;/g, function (m) { - return map[m]; - }); - } - return text; - } - - static formDataFromObject(obj) { - let formData = new FormData(); - for (let k in obj) { - formData.set(k, obj[k]); - } - return formData; - } - - static scaleContentRecursive(element, content) { - - let elementStyle = window.getComputedStyle(element); - let contentStyle = window.getComputedStyle(content); - - if (contentStyle.height > elementStyle.height || contentStyle.width > elementStyle.width) { - return Helper.scaleDownContentRecursive(element, content); - } - } - - static scaleDownContentRecursive(element, content) { - Helper.convertChildrenToRelativeRecursive(element); - - let elementStyle = window.getComputedStyle(element); - let contentStyle = window.getComputedStyle(content); - - let runs = 0; - let fontSize = parseFloat(contentStyle.getPropertyValue("font-size")); - let width = contentStyle.width; - let height = contentStyle.height; - while (contentStyle.height > elementStyle.height || contentStyle.width > elementStyle.width) { - fontSize *= 0.95; - - if (height > elementStyle.height) { - height *= 0.95; - } - if (width > contentStyle.width) { - width *= 0.95; - } - content.style["font-size"] = fontSize + "px"; - content.style["max-height"] = height + "px"; - content.style["max-width"] = width + "px"; - - runs++; - if (runs > 2000) { - console.log("breaked"); - break; - } - } - Helper.convertToRelative(content); - - contentStyle = window.getComputedStyle(content); - content.style["font-size"] = (parseFloat(contentStyle.getPropertyValue("font-size")) / parseFloat(document.documentElement.clientHeight) * 100) + "vh"; - } - - static convertChildrenToRelativeRecursive(element) { - let children = element.childNodes; - for (let i = 0, n = children.length; i < n; i++) { - if (children[i] instanceof Element) { - Helper.convertToRelative(children[i]); - Helper.convertChildrenToRelativeRecursive(children[i]); - } - } - } - - static convertToRelative(element) { - let hasTransitionClass = (element.classList.contains("no-transtition")); - - element.classList.add("no-transition"); - - let parent = element.parentNode; - - console.log(element); - let elementStyle = window.getComputedStyle(element); - let parentStyle = window.getComputedStyle(parent); - - let fontSize = parseFloat(elementStyle.getPropertyValue("font-size")) / parseFloat(parentStyle.getPropertyValue("font-size")); - - let maxHeight = elementStyle.height; - let maxWidth = elementStyle.width; - - let pHeight = parentStyle.height; - let pWidth = parentStyle.width; - - let relativeAttributes = element.style; - relativeAttributes['max-height'] = Math.floor(maxHeight / pHeight * 100) + "%"; - relativeAttributes['margin-left'] = Math.floor(parseFloat(elementStyle.getPropertyValue('margin-left')) / pWidth * 100) + "%"; - relativeAttributes['margin-right'] = Math.floor(parseFloat(elementStyle.getPropertyValue('margin-right')) / pWidth * 100) + "%"; - relativeAttributes['margin-top'] = Math.floor(parseFloat(elementStyle.getPropertyValue('margin-top')) / pHeight * 100) + "%"; - relativeAttributes['margin-bottom'] = Math.floor(parseFloat(elementStyle.getPropertyValue('margin-bottom')) / pHeight * 100) + "%"; - relativeAttributes['max-width'] = Math.floor(maxWidth / pWidth * 100) + "%"; - relativeAttributes["font-size"] = fontSize + "em"; - // console.log(relativeAttributes); - // element.css(relativeAttributes); - - if (!hasTransitionClass) { - element.classList.remove("no-transition"); - } - } - - static isChrome() { - let isChromium = window.chrome, - winNav = window.navigator, - vendorName = winNav.vendor, - isOpera = winNav.userAgent.indexOf("OPR") > -1, - isIEedge = winNav.userAgent.indexOf("Edge") > -1, - isIOSChrome = winNav.userAgent.match("CriOS"); - - if (isIOSChrome) { - return true; - } else { - return isChromium !== null && - typeof isChromium !== "undefined" && - vendorName === "Google Inc." && - isOpera === false && - isIEedge === false; - } - } - - static getIndexedObject(array, keyValue) { - let obj = {}; - for (let i = 0, n = array.length; i < n; i++) { - obj[array[i][keyValue]] = array[i]; - } - return obj; - } - - static invertKeyValues(obj) { - let new_obj = {}; - - for (let prop in obj) { - if (obj.hasOwnProperty(prop)) { - new_obj[obj[prop]] = prop; - } - } - - return new_obj; - } - - static toArray(object) { - let res = []; - for (let k in object) { - res.push(object[k]); - } - return res; - } -} -Helper.init(); - -class SystemSettings { - static setBasePath(basePath) { - SystemSettings._basePath = basePath; - } - - static getBasePath() { - return SystemSettings._basePath; - } - - static set(key, value) { - SystemSettings._settings[key] = value; - } - - static get(key, defaultValue) { - return Helper.nonNull(SystemSettings._settings[key], defaultValue); - } - - static has(key){ - return Helper.nonNull(SystemSettings._settings[key]); - } -} - -SystemSettings.setBasePath("/"); -SystemSettings._settings = {}; - -class ThemeManager { - static init() { - ThemeManager.loadCurrentTheme(); - } - - static changeCurrentTheme(newTheme) { - let theme = null; - if (typeof newTheme === 'string') { - let themes = ThemeManager.themes.filter(function (theme) { - return theme._name === newTheme; - }); - if (themes.length > 0) { - theme = themes[0]; - } - } - else if (ThemeManager.themes.indexOf(newTheme) !== -1) { - theme = newTheme; - } - if (Helper.isNotNull(theme)) { - localStorage.setItem("currentTheme", theme._name); - let themePromise = new Promise(function (resolve) { - document.querySelector("nav.top-bar").addEventListener("transitionend", function(){ - resolve(); - }); - }); - document.body.className = theme._className; - ThemeManager.currentTheme = theme; - for (let i = 0, n = ThemeManager.changeListeners.length; i < n; i++) { - ThemeManager.changeListeners[i](ThemeManager.currentTheme, themePromise); - } - } - } - - static addTheme(theme) { - ThemeManager.themes.push(theme); - } - - static loadCurrentTheme() { - ThemeManager.changeCurrentTheme(localStorage.getItem("currentTheme")); - if (Helper.isNull(ThemeManager.currentTheme)) { - let className = document.body.className; - let themes = ThemeManager.themes.filter(function (theme) { - return theme._className === className; - }); - if (themes.length > 0) { - ThemeManager.changeCurrentTheme(themes[0]); - } - else if (ThemeManager.themes.length > 0) { - ThemeManager.changeCurrentTheme(ThemeManager.themes[0]); - } - } - } - - static generateChangeThemeMenuAction() { - return new MenuAction(ThemeManager.currentTheme._name, function (action) { - let currentThemeIndex = ThemeManager.themes.indexOf(ThemeManager.currentTheme); - let nextIndex = (currentThemeIndex + 1) % ThemeManager.themes.length; - ThemeManager.changeCurrentTheme(ThemeManager.themes[nextIndex]); - action.title = ThemeManager.currentTheme._name; - action._menu.redraw(); - }, Menu.SHOW_ALWAYS) - } - - static addChangeListener(listener) { - ThemeManager.changeListeners.push(listener); - } - - static getCurrentTheme(){ - return ThemeManager.currentTheme; - } -} - -ThemeManager.currentTheme = null; -ThemeManager.themes = []; -ThemeManager.changeListeners = []; - -AndroidBridge.addDefinition("ThemeManager", { - "addChangeListener": ThemeManager.addChangeListener, - "getCurrentTheme": ThemeManager.getCurrentTheme, -}); - -class CookieCompliance { - - static async showIfNeeded(cookieContainer) { - let cookieCompliance = new CookieCompliance(cookieContainer); - return cookieCompliance.showIfNeeded(); - } - - constructor(cookieContainerId) { - this.cookieContainerId = cookieContainerId; - this.dropCookie = true; - this.cookieDuration = 365 * 10; - this.cookieName = 'complianceCookie'; - this.cookieValue = 'true'; - } - - async showIfNeeded() { - if (CookieCompliance.checkCookie(this.cookieName) !== this.cookieValue) { - return this.show(); - } - return Promise.resolve(); - } - - removeMe() { - this.createCookie(this.cookieName, this.cookieValue, this.cookieDuration); - } - - createCookie(name, value, days) { - let expires; - if (Helper.isNotNull(days)) { - const date = new Date(); - date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); - expires = "; expires=" + date.toGMTString(); - } - else { - expires = ""; - } - if (this.dropCookie) { - document.cookie = name + "=" + value + expires + "; path=/"; - } - } - - eraseCookie(name) { - this.createCookie(name, "", -1); - } - - static checkCookie(name) { - const nameEQ = name + "="; - const cookies = document.cookie.split(';'); - for (let i = 0; i < cookies.length; i++) { - let c = cookies[i]; - while (c.charAt(0) === ' ') { - c = c.substring(1, c.length); - } - if (c.indexOf(nameEQ) === 0) { - return c.substring(nameEQ.length, c.length); - } - } - return null; - } - - show() { - let cookieCompliance = this; - const cookieMessage = document.getElementById(this.cookieContainerId); - cookieMessage.style.display = 'block'; - return new Promise(r => { - cookieMessage.querySelector("#close-cookie-msg").onclick = function () { - cookieCompliance.removeMe(); - cookieMessage.remove(); - r(); - }; - }); - } -} - -class ActionBarMenu extends Menu { - static init() { - function parseStyleToObject(str) { - let styleObject = {}; - - if (typeof str !== 'string') { - return styleObject; - } - - str = str.trim().slice(1, -1); // browsers re-quote string style values - - if (!str) { - return styleObject; - } - - styleObject = str.split('&').reduce(function (ret, param) { - const parts = param.replace(/\+/g, ' ').split('='); - let key = parts[0]; - let val = parts[1]; - key = decodeURIComponent(key); - - // missing `=` should be `null`: - // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters - val = val === undefined ? null : decodeURIComponent(val); - - if (!ret.hasOwnProperty(key)) { - ret[key] = val; - } else if (Array.isArray(ret[key])) { - ret[key].push(val); - } else { - ret[key] = [ret[key], val]; - } - return ret; - }, {}); - - return styleObject; - } - - let cssStyle = document.getElementsByClassName('foundation-mq'); - if (cssStyle.length === 0) { - return; - } - let queries = []; - cssStyle = parseStyleToObject(window.getComputedStyle(cssStyle[0]).getPropertyValue('font-family')); - for (let key in cssStyle) { - if (cssStyle.hasOwnProperty(key)) { - queries.push({ - _name: key, - value: 'only screen and (min-width: ' + cssStyle[key] + ')' - }); - } - } - - window.addEventListener('resize', function () { - if (Helper.isNotNull(ActionBarMenu.currentMenu)) { - ActionBarMenu.currentMenu.updateToggleButton(); - } - }); - let responsiveMenu = document.getElementById("responsive-menu"); - document.getElementById("responsive-menu-toggle").onclick = function () { - if (window.getComputedStyle(responsiveMenu).getPropertyValue('display') === 'none') { - responsiveMenu.style.display = 'block'; - } - else if (Helper.isNotNull(ActionBarMenu.currentMenu)) { - ActionBarMenu.currentMenu.close(); - - } - }; - responsiveMenu.firstElementChild.addEventListener("click", function (e) { - if (e.target === responsiveMenu.firstElementChild && Helper.isNotNull(ActionBarMenu.currentMenu)) { - ActionBarMenu.currentMenu.close(); - } - } - ); - ActionBarMenu.queries = queries; - } - - static _getCurrentSize() { - let matched; - - for (let i = 0; i < ActionBarMenu.queries.length; i++) { - let query = ActionBarMenu.queries[i]; - - if (matchMedia(query.value).matches) { - matched = query; - } - } - - if (typeof matched === 'object') { - return matched._name; - } else { - return matched; - } - } - - static filterVisibleElements(elements) { - let visibleElements = []; - for (let i = 0, n = elements.length; i < n; i++) { - if (!elements[i].classList.contains("hidden")) { - visibleElements.push(elements[i]); - } - } - return visibleElements; - } - - renderLiElement(aElement, action) { - let liElement = super.renderLiElement(aElement, action); - liElement.classList.add(action.getShowFor()); - return liElement; - } - - updateToggleButton() { - let size = ActionBarMenu._getCurrentSize(); - let firstParentElement = this.parentElements[0]; - if ((size === "medium" || size === "smedium" || size === "small") && ActionBarMenu.filterVisibleElements(firstParentElement.getElementsByClassName(Menu.SHOW_FOR_LARGE)).length > 0 || - (size === "smedium" || size === "small") && ActionBarMenu.filterVisibleElements(firstParentElement.getElementsByClassName(Menu.SHOW_FOR_MEDIUM)).length > 0 || - (size === "small") && ActionBarMenu.filterVisibleElements(firstParentElement.getElementsByClassName(Menu.SHOW_FOR_SMEDIUM)).length > 0 || - ActionBarMenu.filterVisibleElements(firstParentElement.getElementsByClassName(Menu.SHOW_NEVER)).length > 0) { - document.getElementById("responsive-menu-toggle").style.display = 'block'; - } else { - document.getElementById("responsive-menu-toggle").style.display = 'none'; - if (Helper.isNotNull(ActionBarMenu.currentMenu)) { - ActionBarMenu.currentMenu.close(); - } - } - } - - _getOnClickListener() { - let superListener = super._getOnClickListener(); - return function (event) { - let action = superListener(event); - if (!(action instanceof OpenSubmenuAction) && Helper.isNotNull(ActionBarMenu.currentMenu)) { - ActionBarMenu.currentMenu.close(); - } - } - } - - draw(parentElement) { - let returnValue = super.draw(parentElement); - this.updateToggleButton(); - - ActionBarMenu.currentMenu = this; - return returnValue; - } - - close() { - document.getElementById("responsive-menu").style.display = 'none'; - for (let i = 0, n = this.submenus.length; i < n; i++) { - this.submenus[i].close(); - } - } - - removeAction(action) { - let res = super.removeAction(action); - this.updateToggleButton(); - return res; - } -} - -ActionBarMenu.queries = []; -ActionBarMenu.currentMenu = null; -ActionBarMenu.init(); - -class ViewInflater { - static inflate(viewUrl, parentUrls) { - parentUrls = Helper.nonNull(parentUrls, []).slice(0); - - let resultPromise = Promise.resolve(); - if (viewUrl instanceof Element) { - resultPromise = Promise.resolve(viewUrl); - } - else { - if (parentUrls.indexOf(viewUrl) !== -1) { - return Promise.reject("views are in a circuit! cannot resolve view for url " + parentUrls[0] + "! url " + viewUrl + " is in stack before!"); - } - parentUrls.push(viewUrl); - resultPromise = fetch(Helper.basePath(viewUrl), {credentials: "same-origin"}).then(function (result) { - return result.text(); - }).then(function (htmlText) { - let doc = (new DOMParser()).parseFromString(htmlText, "text/html"); - if (Helper.isNull(doc)) { - doc = document.implementation.createHTMLDocument(''); - doc.body.innerHTML = htmlText; - } - return doc.body.firstChild - }); - } - - return resultPromise.then(function (parentElement) { - let promises = []; - let childViews = parentElement.querySelectorAll("[data-view]"); - - for (let i = 0, n = childViews.length; i < n; i++) { - promises.push(ViewInflater.inflate(childViews[i].dataset["view"], parentUrls).then(function (element) { - childViews[i].replaceWith(element); - })); - } - return Promise.all(promises).then(function () { - return parentElement; - }); - }); - } -} - -class Context { - constructor(view) { - let self = this; - this._siteContent = null; - this.firstStart = true; - this.inflatePromise = new Promise(function (resolver) { - self.inflatePromiseResolver = resolver; - }); - this.fragments = {}; - - if (Helper.isNotNull(view)) { - this.inflateView(view); - } - } - - onConstruct() { - let results = []; - for (let k in this.fragments) { - results.push(this.fragments[k].onConstruct.apply(this.fragments[k], arguments)); - results.push(this.fragments[k].inflatePromise); - } - return Promise.all(results); - } - - onStart() { - if (this.firstStart) { - this.onFirstStart(); - this.firstStart = false; - } - - for (let k in this.fragments) { - let fragment = this.fragments[k]; - fragment.onStart.apply(this.fragments[k], arguments); - this.fragments[k].inflatePromise.then(function (fragmentView) { - if (fragment.isActive()) { - fragmentView.classList.remove("hidden"); - } - else { - fragmentView.classList.add("hidden"); - } - }); - } - } - - onFirstStart() { - // for (let k in this.fragments) { - // this.fragments[k].onFirstStart.apply(this.fragments[k], arguments); - // } - } - - onPause() { - for (let k in this.fragments) { - this.fragments[k].onPause.apply(this.fragments[k], arguments); - } - } - - onDestroy() { - for (let k in this.fragments) { - this.fragments[k].onDestroy.apply(this.fragments[k], arguments); - } - } - - addFragment(viewQuery, fragment) { - this.fragments[viewQuery] = fragment; - this.inflatePromise = this.inflatePromise.then(function (siteContent) { - return fragment.inflatePromise.then(function (fragmentView) { - siteContent.querySelector(viewQuery).appendChild(fragmentView); - return siteContent; - }); - }); - } - - /** @protected */ - inflateView(link) { - let self = this; - this.inflatePromiseResolver(ViewInflater.inflate(link).then(function (siteContent) { - self._siteContent = siteContent; - return siteContent; - })); - - return this.inflatePromise; - } - - findBy(query, all, asPromise) { - all = Helper.nonNull(all, false); - asPromise = Helper.nonNull(asPromise, false); - - let getVal = function (root) { - let res = null; - if (all) { - res = root.querySelectorAll(query); - if (root.matches(query)) { - res.push(root); - } - } - else { - if (root.matches(query)) { - res = root; - } - else { - res = root.querySelector(query); - } - } - return res; - }; - - if (asPromise) { - return this.inflatePromise.then(function (rootView) { - return getVal(rootView); - }); - } - return getVal(this._siteContent); - } -} - -class AbstractSite extends Context { - constructor(siteManager, view, deepLink) { - super(view); - - this.isVisible = false; - this.siteManager = siteManager; - this.isFinishing = false; - this.actionMenu = null; - this.url = ""; - this.deepLink = deepLink; - this.startArgs = {}; - this.title = siteManager.getDefaultTitle(); - } - - setTitle(titleElement, title) { - if (typeof titleElement === "string") { - title = titleElement; - titleElement = document.createTextNode(titleElement); - } - this.title = { - element: titleElement - }; - this.title["title"] = Helper.nonNull(title, this.title["title"]); - - if (this.isVisible) { - this.siteManager.updateTitle(); - } - } - - startStartsite() { - return this.startSite(this.siteManager.getStartSiteName()); - } - - inflateView(link) { - let self = this; - return super.inflateView(link).then(function (res) { - let promises = []; - for (let i = 0, n = self.fragments.length; i < n; i++) { - promises.push(self.fragments[i].inflatePromise); - } - return Promise.all(promises).then(function () { - return res; - }); - }); - } - - onConstruct(args) { - this.startArgs = args; - if (Helper.isNotNull(this.deepLink)) { - this.setUrlFromParams(args); - } - return super.onConstruct(args); - } - - onStart(args) { - this.isVisible = true; - let res = super.onStart(args); - this.actionMenu.redraw(); - return res; - } - - onPause(args) { - super.onPause(args); - this.isVisible = false; - } - - finish(result) { - if (!this.isFinishing) { - this.isFinishing = true; - this.siteManager.endSite(this, result); - } - } - - startSite(siteName, args) { - return this.siteManager.startSite(siteName, args); - } - - toForeground() { - this.siteManager.toForeground(this); - } - - finishAndStartNext(siteName, startParams, finishResult) { - this.startSite(siteName, startParams); - this.finish(finishResult); - } - - createActionBarMenu(menu) { - let defaultActions = this.siteManager.getDefaultActions(); - for (let i = 0, n = defaultActions.length; i < n; i++) { - menu.addAction(defaultActions[i].copy()); - } - return menu; - } - - setUrl(url) { - this.url = url; - this.siteManager.updateUrl(this); - } - - setUrlFromParams(params) { - this.setUrl(this.deepLink + Helper.buildQuery(params)); - } - - updateUrlParams(params) { - this.startArgs = Object.assign(this.startArgs, params); - this.setUrlFromParams(this.startArgs); - } - - getUrl() { - return this.url; - } - - getFullUrl() { - return Helper.basePath(this.url); - } - - onBackPressed() { - } - - addListener(event, selector, listenerFunction) { - this.siteManager.addListener(this, event, selector, listenerFunction); - } - - addKeyListener(keycode, listenerFunction) - { - this.siteManager.addKeyListener(this, keycode, listenerFunction); - } - - addKeyAndEventListener(keycode, event, selector, listenerFunction) { - this.siteManager.addKeyAndEventListener(this, keycode, event, selector, listenerFunction); - } -} - -class SiteContainer { - constructor(site, finishResolver) { - this._site = site; - this._siteContent = null; - this._pauseParameters = {}; - this._startParameters = {}; - this._finishResolver = finishResolver; - } - getSite() { - return this._site; - } - - setSite(site) { - if (site instanceof AbstractSite) { - this._site = site; - } - } - - getSiteContent() { - return this._siteContent; - } - - setSiteContent(value) { - this._siteContent = value; - } - - getPauseParameters() { - return this._pauseParameters; - } - - setPauseParameters(value) { - this._pauseParameters = value; - } - - getStartParameters() { - return this._startParameters; - } - - setStartParameters(value) { - this._startParameters = value; - } - - getFinishResolver() { - return this._finishResolver; - } - - setFinishResolver(value) { - this._finishResolver = value; - } -} - -class SiteManager { - constructor(siteDivId, actionBarMenuSelector, app) { - this.siteDiv = document.getElementById(siteDivId); - this.siteContainerStack = []; - this.currentSiteContainerToShow = null; - this.actionBarMenuSelector = Helper.nonNull(actionBarMenuSelector, '.action-bar'); - - this.siteStartingPromise = Promise.resolve(); - this.defaultActions = []; - this.startSiteName = null; - this.app = app; - - this.titleElement = document.querySelector(".top-bar-title"); - - const defaultTitleElem = document.createElement("span"); - while (this.titleElement.childNodes.length > 0) { - const child = this.titleElement.firstChild; - child.remove(); - defaultTitleElem.appendChild(child); - } - - this.defaultTitle = { - element: defaultTitleElem, - title: document.title - }; - - let siteManager = this; - window.onpopstate = function (e) { - if (siteManager.siteContainerStack.length >= 1) { - let site = siteManager.siteContainerStack[siteManager.siteContainerStack.length - 1].getSite(); - if (site.onBackPressed() !== false) { - siteManager.endSite(site); - } - } - }; - } - - getDefaultTitle() { - return this.defaultTitle; - } - - setStartSiteName(startSiteName) { - this.startSiteName = startSiteName; - } - - getStartSiteName() { - return this.startSiteName; - } - - addDefaultAction(action) { - this.defaultActions.push(action); - } - - getDefaultActions() { - return this.defaultActions; - } - - getCurrentSite(){ - if (Helper.isNotNull(this.currentSiteContainerToShow)){ - return this.currentSiteContainerToShow.getSite(); - } - return null; - } - - async findSite(filter){ - for (let i = this.siteContainerStack.length-1; i >= 0; i--) { - if (await filter(this.siteContainerStack[i].getSite())){ - return this.siteContainerStack[i].getSite(); - } - } - return null; - } - - async startSite(siteConstructor, paramsPromise) { - if (!(siteConstructor.prototype instanceof AbstractSite)) { - throw { - "error": "wrong class given! Expected AbstractSite, given " + siteConstructor.name - }; - } - - let site = new siteConstructor(this); - let resolver = {}; - let finishPromise = new Promise(function (resolve, reject) { - resolver.resolve = resolve; - resolver.reject = reject; - }); - let siteContainer = new SiteContainer(site, resolver); - this.siteDiv.removeAllChildren().appendChild(Helper.createLoadingSymbol()); - - this.siteStartingPromise = Promise.resolve(paramsPromise).then(async (params) => { - siteContainer.setStartParameters(params); - await Promise.all([site.onConstruct(params), site.inflatePromise]); - - site.actionMenu = site.createActionBarMenu(this.buildActionBarMenu()); - return this.show(siteContainer); - }).catch((e) => { - console.error("site start error for site ", siteConstructor.name, e); - }); - - return finishPromise; - } - - endSite(site, result) { - let manager = this; - this.siteStartingPromise.then(function () { - let index = manager.findContainerIndexBySite(site); - let container = manager.siteContainerStack.splice(index, 1); - container = container[0]; - - let showSiteContainer = null; - if (container === manager.currentSiteContainerToShow) { - manager.currentSiteContainerToShow.getSite().onPause(); - manager.currentSiteContainerToShow = null; - let newSiteContainerIndex = manager.siteContainerStack.length - 1; - if (newSiteContainerIndex < 0) { - - manager.showAppEndedMessage(); - app.endApp(); - // manager.startSite(manager.startSiteName); - return; - } - manager.siteDiv.removeAllChildren().appendChild(Helper.createLoadingSymbol()); - showSiteContainer = manager.siteContainerStack[newSiteContainerIndex]; - } - container.getSite().onDestroy(); - - Promise.resolve(result).then(function (resValue) { - container.getFinishResolver().resolve(resValue); - if (Helper.isNotNull(showSiteContainer)) { - manager.show(showSiteContainer); - } - }); - }); - } - - addListener(site, event, _selector, listener) { - this.siteDiv.addEventListener(event, function (_event) { - let _element = _event.target; - if (site.isVisible && _element.matches(_selector)) { - listener(_element, _event); - } - }); - } - - addKeyAndEventListener(site, keycode, event, selector, listener) { - this.addListener(site, event, selector, listener); - this.addKeyListener(site, keycode, listener); - } - - addKeyListener(site, keycode, listener) { - window.addEventListener("keydown", function (e) { - if (site.isVisible && e.which === keycode) { - listener(this, e); - } - }); - } - - toForeground(site) { - let index = this.findContainerIndexBySite(site); - let container = this.siteContainerStack.splice(index, 1); - container = container[0]; - - this.show(container); - } - - refreshCurrentSite() { - return this.show(this.currentSiteContainerToShow); - } - - /** @private */ - show(siteContainer) { - if (Helper.isNotNull(this.currentSiteContainerToShow)) { - this.currentSiteContainerToShow.setPauseParameters(this.currentSiteContainerToShow.getSite().onPause()); - this.currentSiteContainerToShow.setSiteContent(this.siteDiv.innerHTML); - } - this.siteDiv.removeAllChildren().appendChild(Helper.createLoadingSymbol()); - - let siteManager = this; - this.currentSiteContainerToShow = siteContainer; - if (-1 === this.siteContainerStack.indexOf(siteContainer)) { - this.siteContainerStack.push(siteContainer); - } - - return siteContainer.getSite().inflatePromise.then(function (data) { - siteContainer.getSite().actionMenu.redraw(); - siteManager.siteDiv.removeAllChildren().appendChild(data); - siteManager.updateTitle(); - Translator.getInstance().updateTranslations(); - return data; - }).then(function (data) { - siteContainer.getSite().onStart(siteContainer.getPauseParameters()); - history.pushState({ - 'siteName': siteContainer.getSite().constructor.name, - 'siteData': data.outerHTML, - 'stackPosition': siteManager.siteContainerStack.length - 1 - }, siteContainer.getSite().constructor.name, siteContainer.getSite().getFullUrl()); - }); - } - - updateUrl(site) { - if (Helper.isNotNull(this.currentSiteContainerToShow) && this.currentSiteContainerToShow.getSite() === site) { - let self = this; - history.replaceState({ - 'siteName': site.constructor.name, - 'siteData': site._siteContent.outerHTML, - 'stackPosition': self.siteContainerStack.length - 1 - }, site.constructor.name, site.getFullUrl()); - } - } - - getCurrentSite() { - if (this.currentSiteContainerToShow != null) - return this.currentSiteContainerToShow.getSite(); - } - - redrawCurrentActionBar() { - if (this.currentSiteContainerToShow != null) - this.currentSiteContainerToShow.getSite().actionMenu.redraw(); - } - - updateTitle() { - let title = this.getCurrentSite().title; - this.titleElement.removeAllChildren().appendChild(title.element); - document.title = Helper.nonNull(title.title, this.defaultTitle.title); - } - - /** @private */ - findContainerIndexBySite(site) { - for (let i = 0, n = this.siteContainerStack.length; i < n; i++) { - if (this.siteContainerStack[i].getSite() === site) { - return i; - } - } - return -1; - } - - /** @private */ - findContainerBySite(site) { - let index = this.findContainerIndexBySite(site); - if (index === -1) { - return null; - } - return this.siteContainerStack[index]; - } - - /** @private */ - showAppEndedMessage() { - this.siteDiv.removeAllChildren().appendChild(Translator.makePersistentTranslation("The app has ended! Please close the window.")); - } - - /** @private */ - buildActionBarMenu() { - return new ActionBarMenu(this.actionBarMenuSelector); - } -} - -class PauseSite extends AbstractSite { - onConstruct(args) { - let pausedElement = null; - - if (Helper.isSet(args, "url")) { - pausedElement = args["url"]; - } - else { - pausedElement = document.createElement("div"); - pausedElement.innerHTML = "Paused..."; - } - - this.inflateView(pausedElement); - } - - onPause() { - console.log("onPause"); - for (let i = 0; i < PauseSite.onStartListeners.length; i++) { - if (typeof PauseSite.onStartListeners[i] === "function") { - PauseSite.onStartListeners[i](); - } - } - return super.onPause(); - } - - onStart() { - console.log("onStart"); - for (let i = 0; i < PauseSite.onPauseListeners.length; i++) { - if (typeof PauseSite.onPauseListeners[i] === "function") { - PauseSite.onPauseListeners[i](); - } - } - return super.onPause(); - } -} - -PauseSite.onPauseListeners = []; -PauseSite.onStartListeners = []; - -class App { - constructor() { - this._siteManager = null; - this._actionBarMenuSelector = '.action-bar'; - this._basePath = SystemSettings.getBasePath(); - this._siteContentId = 'site-content'; - this._deepLinks = new Map(); - this._defaultActions = []; - this._addThemeAction = false; - this._showCookieCompliance = true; - this._startSite = null; - this._appEndListener = () => { - return this.startSite(this._startSite); - }; - } - - getSiteManager() - { - return this._siteManager; - } - - addDefaultAction(action) { - this._defaultActions.push(action); - } - - setAddThemeAction(addThemeAction) { - this._addThemeAction = addThemeAction; - } - - getSiteContentId() { - return this._siteContentId; - } - - setSiteContentId(value) { - this._siteContentId = value; - } - - getActionBarMenuSelector() { - return this._actionBarMenuSelector; - } - - setActionBarMenuSelector(value) { - this._actionBarMenuSelector = value; - } - - getBasePath() { - return this._basePath; - } - - setBasePath(value) { - this._basePath = value; - } - - addDeepLink(alias, site) { - this._deepLinks.set(alias.toLowerCase(), site); - } - - setShowCookieCompliance(cookieCompliance) - { - this._showCookieCompliance = cookieCompliance; - } - - refreshCurrentSite() - { - this._siteManager.refreshCurrentSite(); - } - - pause(elementToShow){ - this.startSite(PauseSite, {"url": elementToShow}); - } - - resume(){ - const currentSite = this._siteManager.getCurrentSite(); - if (currentSite instanceof PauseSite) - { - currentSite.finish(); - } - } - - _resolveDeepLink(deepLink) { - deepLink = deepLink.toLowerCase(); - if (this._deepLinks.has(deepLink)) { - return this._deepLinks.get(deepLink); - } - return null; - } - - _getDeepLink() { - let deepLink = ""; - if (window.location.pathname.search(this._basePath) === 0) { - deepLink = window.location.pathname.substr(this._basePath.length).trim(); - } - if (deepLink.charAt(0) === '/') { - deepLink = deepLink.substr(1).trim(); - } - if (deepLink.charAt(deepLink.length - 1) === '/') { - deepLink = deepLink.substr(0, deepLink.length - 2).trim(); - } - if (deepLink.length === 0 && window.location.hash) { - deepLink = window.location.hash.substr(1).trim(); - } - - return this._resolveDeepLink(deepLink); - } - - _addDeepLinksListener() { - let app = this; - let elements = document.getElementsByClassName("deep-link"); - for (let i = 0, n = elements.length; i < n; i++) { - elements[i].addEventListener("click", function (e) { - e.preventDefault(); - app._siteManager.startSite(Helper.nonNull(app._resolveDeepLink(this.dataset["siteName"]), app._startSite), App._extractParams(this.dataset["siteArgs"])); - return true; - }); - } - } - - removeDefaultAction(action) - { - let index = this._defaultActions.indexOf(action); - if (index >= 0) - { - this._defaultActions[index].remove(true); - this._defaultActions.splice(index, 1); - } - } - - startSite(site, parameter) - { - return this._siteManager.startSite(site, parameter); - } - - start(fallbackStartSite) { - SystemSettings.setBasePath(this._basePath); - let startSite = Helper.nonNull(this._getDeepLink(), fallbackStartSite); - let startParams = App._getStartParams(); - this._startSite = fallbackStartSite; - - Translator.init(); - ThemeManager.init(); - if (this._addThemeAction) { - this.addDefaultAction(ThemeManager.generateChangeThemeMenuAction()); - } - this._siteManager = new SiteManager(this._siteContentId, this._actionBarMenuSelector); - this._siteManager.defaultActions = this._defaultActions; - this._siteManager.setStartSiteName(fallbackStartSite); - this._siteManager.startSite(startSite, startParams); - this._addDeepLinksListener(); - - if (this._showCookieCompliance) - { - this._cookieClosePromise = CookieCompliance.showIfNeeded('cookie-compliance'); - } - } - - getCurrentSite(){ - return this._siteManager.getCurrentSite(); - } - - async endApp(){ - if (typeof this._appEndListener === "function"){ - this._appEndListener(); - } - } - - setAppEndListener(appEndListener){ - this._appEndListener = appEndListener; - } - - async findSite(filter){ - return this._siteManager.findSite(filter); - } - - static _extractParams(paramString) { - if (Helper.isNull(paramString)) { - return null; - } - let result = {}, tmp = []; - let items = paramString.split("&"); - for (let index = 0; index < items.length; index++) { - tmp = items[index].split("="); - if (tmp[0].trim().length > 0) { - result[tmp[0]] = decodeURIComponent(tmp[1]); - } - } - return result; - } - - static _getStartParams() { - return App._extractParams(window.location.search.substr(1)); - } -} - -class Dialog { - constructor(content, title) { - this.resolver = null; - this.content = null; - this.backgroundElement = null; - this.cancelable = true; - this.title = Helper.nonNull(title, ""); - this.translatable = true; - this.additionalClasses = ""; - this.buttons = []; - this.result = null; - - if (Helper.isNotNull(content)) { - this.setContent(content); - } - } - - setTitle(title) { - this.title = title; - return this; - } - - setTranslatable(translatable) { - this.translatable = translatable; - } - - setAdditionalClasses(classes) { - this.additionalClasses = classes; - } - - getTitle() { - return this.title; - } - - setCancelable(cancelable) { - this.cancelable = (cancelable === true); - return this; - } - - async setContent(content) { - this.contentPromise = Promise.resolve(content); - this.content = await this.contentPromise; - return this; - } - - addButton(elementOrText, listenerOrResult, shouldClose) { - shouldClose = Helper.nonNull(shouldClose, true); - - let button = null; - if (typeof elementOrText === "string") { - button = document.createElement("button"); - button.classList.add("button"); - button.classList.add("right"); - button.appendChild(Translator.makePersistentTranslation(elementOrText)); - } - else { - button = elementOrText; - } - - let self = this; - if (typeof listenerOrResult !== "function") { - let result = listenerOrResult; - listenerOrResult = function () { - self.result = result; - }; - } - - let callback = null; - if (shouldClose) { - callback = function (e) { - if (Helper.isNotNull(listenerOrResult)) { - listenerOrResult(e); - } - self.close(); - }; - } - else { - callback = listenerOrResult; - } - - if (Helper.isNotNull(callback)) { - button.addEventListener("click", callback); - } - this.buttons.push(button); - } - - async show() { - - let titleElement = document.createElement("span"); - titleElement.classList.add("title"); - if (this.translatable && this.title !== "") { - titleElement.appendChild(Translator.makePersistentTranslation(this.title)); - } - else { - titleElement.innerHTML = this.title; - } - - let titleBar = document.createElement("div"); - titleBar.appendChild(titleElement); - - let contentContainer = document.createElement("div"); - contentContainer.classList.add("content-container"); - - let modalDialog = document.createElement("div"); - modalDialog.className = this.additionalClasses; - modalDialog.classList.add("modal"); - modalDialog.appendChild(titleBar); - modalDialog.appendChild(contentContainer); - - let buttonBar = document.createElement("div"); - buttonBar.classList.add("modal-button-container"); - - for (let i = 0, n = this.buttons.length; i < n; i++) { - buttonBar.appendChild(this.buttons[i]); - } - - await this.contentPromise; - if (!(this.content instanceof Node)) { - this.content = (this.translatable) ? Translator.makePersistentTranslation(this.content) : document.createTextNode(this.content); - } - contentContainer.appendChild(this.content); - - this.backgroundElement = document.createElement("div"); - this.backgroundElement.classList.add("background"); - this.backgroundElement.appendChild(modalDialog); - - this.backgroundElement.querySelector(".modal").appendChild(buttonBar); - this.backgroundElement.style.display = "block"; - - let self = this; - if (this.cancelable) { - let closeButton = document.createElement("span"); - closeButton.classList.add("close"); - closeButton.innerHTML = "×"; - - titleBar.appendChild(closeButton); - closeButton.addEventListener("click", function () { - self.close(); - }); - window.addEventListener("click", function (e) { - if (e.target === self.backgroundElement) { - self.close(); - } - }); - } - - document.body.appendChild(this.backgroundElement); - Translator.getInstance().updateTranslations(); - - return new Promise(function (resolve) { - self.resolver = resolve; - }); - } - - close() { - if (Helper.isNotNull(this.backgroundElement)) { - this.backgroundElement.style.display = "none"; - this.backgroundElement.remove(); - this.backgroundElement = null; - } - if (Helper.isNotNull(this.resolver)) { - this.resolver(this.result); - } - } - - addDefaultButton(){ - this.addButton("confirm-button"); - } -} - -class FlashMessenger { - static deleteMessage(_idNumber, _delayInMilliSeconds) { - _delayInMilliSeconds = Helper.nonNull(_delayInMilliSeconds, 0); - setTimeout(function () { - let elem = document.getElementById("flashMessage" + _idNumber); - elem.fadeOut(.2).then(function () { - elem.remove(); - }); - }, _delayInMilliSeconds); - } - - static addMessage(messageType, messageText, timeToShow, translate){ - - let translationArgs = null; - if (Helper.isNull(messageText) || typeof messageText === "object") - { - translationArgs = messageText; - messageText = messageType; - messageType = FlashMessenger.MESSAGE_TYPE_SUCCESS; - translate = true; - } - translate = Helper.nonNull(translate, false); - - let id = FlashMessenger.messageCount; - - let wrapper = document.createElement("div"); - - let _flashMessage = document.createElement("div"); - _flashMessage.className = "flashMessage " + messageType; - _flashMessage.id = "flashMessage" + id; - _flashMessage.style.opacity = '0'; - _flashMessage.addEventListener("click", function () { - FlashMessenger.deleteMessage(id); - }); - _flashMessage.appendChild((translate) ? Translator.makePersistentTranslation(messageText, translationArgs, "span") : document.createTextNode(messageText)); - - wrapper.appendChild(_flashMessage); - document.getElementById("flashMessageContainer").appendChild(wrapper); - _flashMessage.fadeIn(); - timeToShow = Helper.nonNull(timeToShow, FlashMessenger.defaultTimeToShow); - if (timeToShow > 0) { - FlashMessenger.deleteMessage(FlashMessenger.messageCount, timeToShow); - } - FlashMessenger.messageCount++; - } -} - -FlashMessenger.messageCount = 0; -FlashMessenger.defaultTimeToShow = 3500; -FlashMessenger.LENGTH_SHORT= 1000; - -FlashMessenger.MESSAGE_TYPE_SUCCESS = 'success'; -FlashMessenger.MESSAGE_TYPE_ERROR = 'error'; -FlashMessenger.MESSAGE_TYPE_DEFAULT = 'default'; -FlashMessenger.MESSAGE_TYPE_INFO = 'info'; -FlashMessenger.MESSAGE_TYPE_WARNING = 'warning'; - -class MyDb { - constructor(dbName, version) { - let indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB || window.shimIndexedDB; - this._conn = indexedDB.open(dbName, version); - - let myDB = this; - this._conn.onupgradeneeded = function (upgradeEvent) { - myDB.upgrade(myDB._conn.result, upgradeEvent.oldVersion, upgradeEvent.newVersion, upgradeEvent); - }; - this.queryPromise = new Promise(function (resolve) { - myDB._conn.onsuccess = function (e) { - myDB._db = myDB._conn.result; - resolve(e); - }; - }); - } - - openTransaction(name, transactionMode, callback) { - let myDb = this; - if (typeof transactionMode === 'function' && Helper.isNull(callback)) { - callback = transactionMode; - transactionMode = "read"; - } - - return this.queryPromise.then(function () { - let res = null; - try { - res = myDb._conn.result.transaction(name, transactionMode); - } - catch (e) { - console.warn(e); - res = myDb._conn.result.transaction(name); - } - callback(res); - }); - } - - openStore(name, transactionMode, callback) { - if (typeof transactionMode === 'function' && Helper.isNull(callback)) { - callback = transactionMode; - transactionMode = "readonly"; - } - return this.openTransaction(name, transactionMode, function (t) { - callback(t.objectStore(name)); - }); - } - - saveObj(obj, objectStore) { - let self = this; - return new Promise(function (resolve) { - self.openStore(objectStore, "readwrite", function (store) { - let request = store.put(obj); - request.onsuccess = resolve; - request.onerror = function (e) { - throw { - "type": "indexed-db-error", - "event": e - } - }; - }); - }); - } - - saveMany(manyObj, objectStore) { - let self = this; - return new Promise(function (resolve) { - self.openStore(objectStore, "readwrite", function (store) { - let promises = []; - for (let i = 0, n = manyObj.length; i < n; i++) { - promises.push(new Promise(function (resolveInner) { - let request = store.put(manyObj[i]); - request.onsuccess = resolveInner; - request.onerror = function (e) { - throw { - "type": "indexed-db-error", - "event": e - } - }; - })); - } - resolve(Promise.all(promises)); - }); - }); - } - - load(key, objectStore) { - let self = this; - return new Promise( (resolve, reject) => { - self.openStore(objectStore, function (store) { - let request = store.get(key); - request.onsuccess = function (e) { - resolve(e.currentTarget.result); - }; - request.onerror = function (e) { - console.warn(e); - throw { - "type": "indexed-db-load-error", - "event": e - } - }; - }).catch(e => { - console.warn(e); - reject(e); - }); - }); - } - - loadAll(objectStore, query, count) - { - let self = this; - return new Promise((resolve, reject) => { - self.openStore(objectStore, function (store) { - let request = store.getAll(query, count); - request.onsuccess = function (e) { - resolve(e.currentTarget.result); - }; - request.onerror = function (e) { - console.warn(e); - throw { - "type": "indexed-db-load-error", - "event": e - } - }; - }).catch(e => { - console.warn(e); - reject(e); - }); - }); - } - - loadMany(index, value, objectStore, limit, direction) { - let self = this; - return new Promise(function (resolve) { - self.openStore(objectStore, function (store) { - let indexRequest = store.index(index); - indexRequest.onerror = function (e) { - throw { - "type": "indexed-db-index-error", - "event": e - } - }; - let request = indexRequest.openCursor(value, direction); - request.onerror = function (e) { - throw { - "type": "indexed-db-index-error", - "event": e - } - }; - let objects = []; - let numberResults = 0; - request.onsuccess = function (e) { - let cursor = e.target.result; - if (cursor) { - objects.push(cursor.value); - numberResults++; - if (Helper.isNull(limit) || numberResults < limit) { - cursor.continue(); - return; - } - } - resolve(objects); - }; - }); - }); - } - - remove(id, objectStore) { - let self = this; - return new Promise(function (resolve) { - self.openStore(objectStore, "readwrite", function (store) { - let deleteRequest = store.delete(id); - deleteRequest.onerror = function (e) { - throw { - "type": "indexed-db-delete-error", - "event": e - } - }; - deleteRequest.onsuccess = function (e) { - resolve(); - }; - }); - }); - } - - removeMany(ids, objectStore) { - let self = this; - return new Promise(function (resolve) { - self.openStore(objectStore, "readwrite", function (store) { - let promises = []; - for (let i = 0, n = ids.length; i < n; i++) { - let deleteRequest = store.delete(ids[i]); - deleteRequest.onerror = function (e) { - throw { - "type": "indexed-db-delete-error", - "event": e - } - }; - promises.push(new Promise(function (resolve) { - deleteRequest.onsuccess = function () { - resolve(); - }; - })); - } - resolve(Promise.all(promises)); - }); - }); - } - - removeWithIndex(index, value, objectStore) { - let self = this; - return new Promise(function (resolve) { - self.openStore(objectStore, "readwrite", function (store) { - let indexRequest = store.index(index); - indexRequest.onerror = function (e) { - throw { - "type": "indexed-db-index-error", - "event": e - } - }; - let request = indexRequest.openCursor(value); - request.onerror = function (e) { - throw { - "type": "indexed-db-index-error", - "event": e - } - }; - request.onsuccess = function (e) { - let cursor = e.target.result; - if (cursor) { - cursor.delete(); - cursor.continue(); - } - else { - resolve(); - } - }; - }); - }); - } - - removeAll(objectStore){ - return new Promise((resolve) => { - this.openStore(objectStore, "readwrite", (store) => { - let req = store.clear(); - req.onerror = (e) => { - throw { - "type":"indexed-db-index-error", - "event": e - } - }; - req.onsuccess = resolve; - }); }) } - upgrade(db) { - }; -} - -class ScriptLoader { - static loadScript(scriptSrc) { - if (Helper.isNotNull(ScriptLoader.scriptPromises[scriptSrc])) { - return ScriptLoader.scriptPromises[scriptSrc]; - } - else { - let scriptPromise = new Promise(function (resolve) { - let script = document.createElement("script"); - script.src = Helper.basePath(scriptSrc); - script.onload = resolve; - - document.body.appendChild(script); - }); - ScriptLoader.scriptPromises[scriptSrc] = scriptPromise; - return scriptPromise; - } - } - static loadCss(cssFile, media){ - if (Helper.isNotNull(ScriptLoader.cssPromises[cssFile])) { - return ScriptLoader.cssPromises[cssFile]; - } - else { - media = Helper.nonNull(media, "all"); - let cssPromise = new Promise(function (resolve) { - let link = document.createElement("link"); - link.rel='stylesheet'; - link.type="text/css"; - link.href = Helper.basePath(cssFile); - link.media = media; - link.onload = resolve; - - document.head.appendChild(link); - }); - ScriptLoader.cssPromises[cssFile] = cssPromise; - return cssPromise; - } - } -} - -ScriptLoader.scriptPromises = {}; -ScriptLoader.cssPromises = {}; - -class ShareButton { - constructor(deviceType, icon, callback, shouldLoadImg) - { - this._deviceType = deviceType; - this._icon = icon; - this._callback = callback; - - if (Helper.nonNull(shouldLoadImg, false)){ - this._icon = ViewInflater.inflate(this._icon); - } - } - - shouldShowFor(deviceType) - { - return (deviceType === (deviceType & this._deviceType)) - } - - getIcon() - { - return this._icon; - } - - getCallback() - { - return this._callback; - } -} -ShareButton.TYPE_DESKTOP = 1; -ShareButton.TYPE_MOBILE_APPLE = 2; -ShareButton.TYPE_MOBILE_LEFTOVER = 4; -ShareButton.TYPE_MOBILE = ShareButton.TYPE_MOBILE_APPLE+ShareButton.TYPE_MOBILE_LEFTOVER; -ShareButton.TYPE_ALL = ShareButton.TYPE_DESKTOP+ShareButton.TYPE_MOBILE; - -AndroidBridge.addDefinition(() => { - window["ShareButton"] = ShareButton; - window["ShareButton"]["TYPE_ALL"] = ShareButton.TYPE_ALL; - -}); - -class MultipleShareButton extends ShareButton{ - constructor(deviceType, icon, callbacks, shouldLoadImg) - { - if (Array.isArray(deviceType) && deviceType[0] instanceof ShareButton){ - let btn = deviceType[0]; - callbacks = deviceType; - deviceType = btn._deviceType; - icon = btn._icon; - shouldLoadImg = Helper.nonNull(shouldLoadImg, icon); - } - - super(deviceType, icon, function (link, element, event) { - if (!Array.isArray(callbacks)){ - callbacks = [callbacks]; + function L(t) { + var e; + this._invoke = function (n, i) { + function o() { + return new Promise(function (e, o) { + !function e(n, i, o, s) { + var a = w(t[n], t, i); + if ("throw" !== a.type) { + var u = a.arg, l = u.value; + return l && "object" == typeof l && r.call(l, "__await") ? Promise.resolve(l.__await).then(function (t) { + e("next", t, o, s) + }, function (t) { + e("throw", t, o, s) + }) : Promise.resolve(l).then(function (t) { + u.value = t, o(u) + }, function (t) { + return e("throw", t, o, s) + }) + } + s(a.arg) + }(n, i, e, o) + }) } - for (let i = 0; i < callbacks.length; i++) { - if (callbacks[i] instanceof ShareButton){ - callbacks[i].getCallback()(link, element, event); - } - else { - console.log(callbacks, i); - callbacks[i](link, element, event); - } + + return e = e ? e.then(o, o) : o() + } + } + + function P(t, n) { + var r = t.iterator[n.method]; + if (r === e) { + if (n.delegate = null, "throw" === n.method) { + if (t.iterator.return && (n.method = "return", n.arg = e, P(t, n), "throw" === n.method)) return d; + n.method = "throw", n.arg = new TypeError("The iterator does not provide a 'throw' method") } - }, shouldLoadImg); - } -} - -class ShareManager { - static init() { - ShareManager.shareButtons = []; + return d + } + var i = w(r, t.iterator, n.arg); + if ("throw" === i.type) return n.method = "throw", n.arg = i.arg, n.delegate = null, d; + var o = i.arg; + return o ? o.done ? (n[t.resultName] = o.value, n.next = t.nextLoc, "return" !== n.method && (n.method = "next", n.arg = e), n.delegate = null, d) : o : (n.method = "throw", n.arg = new TypeError("iterator result is not an object"), n.delegate = null, d) } - static addShareButton(shareButton) { - ShareManager.shareButtons.push(shareButton); + function R(t) { + var e = {tryLoc: t[0]}; + 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e) } - static generateDefaultShareElement(shareUrl) { - return ShareManager.generateShareElement(shareUrl, ShareManager.getDefaultGenerateCallback()); + function E(t) { + var e = t.completion || {}; + e.type = "normal", delete e.arg, t.completion = e } - static generateDefaultShareElementForButtons(shareUrl, buttons) { - return ShareManager.generateShareElementForButtons(shareUrl, buttons, ShareManager.getDefaultGenerateCallback()); + function C(t) { + this.tryEntries = [{tryLoc: "root"}], t.forEach(R, this), this.reset(!0) } - static generateShareElement(shareUrl, generateCallback) { - return ShareManager.generateShareElementForButtons(shareUrl, ShareManager.shareButtons, generateCallback); - } - - static generateShareElementForButtons(shareUrl, buttons, generateCallback) { - let shareButtonElement = document.createElement("div"); - let currentDeviceType = ShareManager.getCurrentDeviceType(); - for (let i = 0, n = buttons.length; i < n; i++) { - if (buttons[i].shouldShowFor(currentDeviceType)) { - let elem = generateCallback(buttons[i], shareUrl); - elem.onclick = function (event) { - buttons[i].getCallback()(shareUrl, this, event); + function S(t) { + if (t) { + var n = t[o]; + if (n) return n.call(t); + if ("function" == typeof t.next) return t; + if (!isNaN(t.length)) { + var i = -1, s = function n() { + for (; ++i < t.length;) if (r.call(t, i)) return n.value = t[i], n.done = !1, n; + return n.value = e, n.done = !0, n }; - shareButtonElement.appendChild(elem); + return s.next = s } } - return shareButtonElement; + return {next: j} } - static getCurrentDeviceType() { - if (navigator.userAgent.match(/iPhone|iPad|iPod/i)) { - return ShareButton.TYPE_MOBILE_APPLE; - } - else if ((navigator.userAgent.match(/Android|BlackBerry|Opera Mini|IEMobile/i) !== null || (typeof window.orientation !== "undefined"))) { - return ShareButton.TYPE_MOBILE_LEFTOVER; - } - else { - return ShareButton.TYPE_DESKTOP; + function j() { + return {value: e, done: !0} + } +}(function () { + return this || "object" == typeof self && self +}() || Function("return this")()); +var t = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { + return typeof t +} : function (t) { + return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t +}, e = function t(e, n, r) { + null === e && (e = Function.prototype); + var i = Object.getOwnPropertyDescriptor(e, n); + if (void 0 === i) { + var o = Object.getPrototypeOf(e); + return null === o ? void 0 : t(o, n, r) + } + if ("value" in i) return i.value; + var s = i.get; + return void 0 !== s ? s.call(r) : void 0 +}, n = function () { + function t(t, e) { + for (var n = 0; n < e.length; n++) { + var r = e[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } - static getDefaultGenerateCallback() { - return function (button) { - let linkElement = document.createElement("a"); - linkElement.classList.add("share-icon"); - let iconUrl = button.getIcon(); - if (typeof iconUrl === "string") { - let iconElement = document.createElement("img"); - iconElement.src = Helper.basePath(button.getIcon()); - iconElement.classList.add("share-icon"); - linkElement.appendChild(iconElement); - } - else { - Promise.resolve(iconUrl).then(elem => { - linkElement.appendChild(elem); - }); - } - - return linkElement; - } + return function (e, n, r) { + return n && t(e.prototype, n), r && t(e, r), e } -} +}(); -ShareManager.init(); - -AndroidBridge.addDefinition("ShareManager.addShareButton", ShareManager.addShareButton); - -class SmsShareButton extends ShareButton -{ - constructor(icon, shouldLoadImg) { - super(ShareButton.TYPE_MOBILE, icon, function (link) { - let linkToOpen = ""; - if (ShareManager.getCurrentDeviceType() === ShareButton.TYPE_MOBILE_APPLE) { - linkToOpen = "sms:&body="+encodeURIComponent(link); - } - else { - linkToOpen = "sms:?&body=" + encodeURIComponent(link); - } - window.open(linkToOpen, '_blank', "noopener"); - }, shouldLoadImg); - } -} - -class TelegramShareButton extends ShareButton { - constructor(icon, shouldLoadImg) { - super(ShareButton.TYPE_ALL, icon, function (link) { - let linkToOpen = "https://t.me/share/url?url="+encodeURIComponent(link); - window.open(linkToOpen, '_blank', "noopener"); - }, shouldLoadImg); - } -} - -class WhatsappShareButton extends ShareButton { - constructor(icon, shouldLoadImg) { - super(ShareButton.TYPE_ALL, icon, function (link) { - let linkToOpen = ""; - if (ShareManager.getCurrentDeviceType() === ShareButton.TYPE_DESKTOP) { - linkToOpen = "https://web.whatsapp.com/send?text="+encodeURIComponent(link); - } - else { - linkToOpen = "whatsapp://send?text=" + encodeURIComponent(link); - } - window.open(linkToOpen, '_blank', "noopener"); - }, shouldLoadImg); - } -} - -class Fragment extends Context -{ - constructor(site, view) - { - super(view); - this.site = site; - this.active = true; - } - - getSite() - { - return this.site; - } - - isActive() - { - return this.active; - } -} - -class Theme -{ - constructor(name, className, icon) - { - this._name = name; - this._className = className; - this._icon = icon; - } -} - -function applyPolyfills() { - if (!String.prototype.format) { - String.prototype["format"] = function (args) { - return this.replace(/{(\d+)}/g, function (match, number) { - return args[number] !== undefined - ? args[number] - : match - ; - }); - }; - } - Object["assign"] = Helper.nonNull(Object["assign"], function (base, obj) { - base = Helper.nonNull(base, {}); - if (obj === null || typeof(obj) !== 'object' || 'isActiveClone' in obj) - return base; - - // if (obj instanceof Date) { - // temp = new obj.constructor(); //or new Date(obj); - // } - // else { - // temp = obj.constructor(); - // } - - for (let key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - obj['isActiveClone'] = null; - base[key] = obj[key]; - delete obj['isActiveClone']; - } - } - - return base; - }); - - if (typeof window !== 'undefined') { - if (Helper.isNotNull(window["Node"]) && !window["Node"]["prototype"]["removeAllChildren"]) { - Node.prototype["removeAllChildren"] = function () { - while (this.firstChild) { - this.removeChild(this.firstChild); - } - return this; - }; - } - - if (HTMLElement) { - HTMLElement.prototype["fadeOut"] = Helper.nonNull(HTMLElement.prototype["fadeOut"], - function (time, effect, delay) { - time = Helper.nonNull(time, 0.5); - effect = Helper.nonNull(effect, "ease-in-out"); - delay = Helper.nonNull(delay, 0); - this.style.transition = "opacity " + time + "s " + effect + " " + delay + "s"; - let elem = this; - let animPromise = new Promise(function (resolve) { - let transEndLis = function (e) { - elem.removeEventListener("transitionend", transEndLis); - elem.removeEventListener("transitioncancel", transCancelledLis); - elem.style.opacity = null; - elem.style.transition = null; - resolve(true, e); - }; - - let transCancelledLis = function (e) { - elem.removeEventListener("transitionend", transEndLis); - elem.removeEventListener("transitioncancel", transCancelledLis); - elem.style.opacity = null; - elem.style.transition = null; - resolve(false, e); - }; - elem.addEventListener("transitionend", transEndLis); - elem.addEventListener("transitioncancel", transCancelledLis); - //Fallback - setTimeout(() => { - resolve(false); - }, (time + delay) * 1000); - }); - - //Nach Seitenneuzeichnen, damit chrome das immer macht (und FF auch) - requestAnimationFrame(function () { - requestAnimationFrame(function () { - elem.style.opacity = 0; - }); - }); - return animPromise - }); - - HTMLElement.prototype["fadeIn"] = Helper.nonNull(HTMLElement.prototype["fadeIn"], function (time, effect, delay) { - time = Helper.nonNull(time, 0.5); - effect = Helper.nonNull(effect, "ease-in-out"); - delay = Helper.nonNull(delay, 0); - this.style.transition = "opacity " + time + "s " + effect + " " + delay + "s"; - - let elem = this; - let animPromise = new Promise(function (resolve) { - let transEndLis = function (e) { - elem.removeEventListener("transitionend", transEndLis); - elem.removeEventListener("transitioncancel", transCancelledLis); - elem.style.opacity = null; - elem.style.transition = null; - resolve(true, e); - }; - - let transCancelledLis = function (e) { - elem.removeEventListener("transitionend", transEndLis); - elem.removeEventListener("transitioncancel", transCancelledLis); - elem.style.opacity = null; - elem.style.transition = null; - resolve(false, e); - }; - elem.addEventListener("transitionend", transEndLis); - elem.addEventListener("transitioncancel", transCancelledLis); - - if (getComputedStyle(elem).getPropertyValue("opacity") === "1") { - resolve(false); - } - //Fallback - setTimeout(() => { - resolve(false); - }, (time + delay) * 1000); - - //Nach Seitenneuzeichnen, damit chrome das immer macht (und FF auch) - requestAnimationFrame(function () { - requestAnimationFrame(function () { - elem.style.opacity = 1; - }); - }); - }); - return animPromise; - }); - } - - if (Node) { - Node.prototype["replaceWith"] = Helper.nonNull(Node.prototype["replaceWith"], function (elem) { - this.parentElement.replaceChild(elem, this); - }); - Node.prototype["remove"] = Helper.nonNull(Node.prototype["remove"], function () { - this.parentElement.removeChild(this); - }); - } - - if (Element) { - Element.prototype.matches = Helper.nonNull(Element.prototype.matches, Helper.nonNull(Element.prototype["matchesSelector"], Element.prototype["webkitMatchesSelector"])); - - window["Element"]["prototype"]["closest"] = Helper.nonNull(window["Element"]["prototype"]["getAll"], function (s) { - // if (!Element.prototype.matches) - // Element.prototype.matches = Element.prototype.msMatchesSelector || - // Element.prototype.webkitMatchesSelector; - // - // if (!Element.prototype.closest) - // Element.prototype.closest = function(s) { - let el = this; - if (!document.documentElement.contains(el)) return null; - do { - if (el.matches(s)) return el; - el = el.parentElement; - } while (el !== null); - return null; - // }; - }); - } - - window["IDBObjectStore"]["prototype"]["getAll"] = Helper.nonNull(window["IDBObjectStore"]["prototype"]["getAll"], function () { - let res = {}; - let items = []; - this.openCursor().onsuccess = function (e) { - let cursor = e.target.result; - if (Helper.isNotNull(cursor)) { - items.push(cursor.value); - cursor.continue(); - } - else if (Helper.isNotNull(res.onsuccess)) { - res.onsuccess({currentTarget: {result: items}}); - } - }; - return res; - }); - } - - String.prototype.startsWith = Helper.nonNull(String.prototype.startsWith, function (searchString, position) { - position = position || 0; - return this.indexOf(searchString, position) === position; - }); - - String.prototype.includes = Helper.nonNull(String.prototype.includes, function (searchString) { - return this.indexOf(searchString) >= 0; - }); - - String.prototype.endsWith = Helper.nonNull(String.prototype.endsWith, function (searchString, position) { - var subjectString = this.toString(); - if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) { - position = subjectString.length; - } - position -= searchString.length; - var lastIndex = subjectString.indexOf(searchString, position); - return lastIndex !== -1 && lastIndex === position; - }); - - - window["fetch"] = Helper.nonNull(window["fetch"], function (url, params) { - console.log("customFetch", url); - let request = null; - if (window.XMLHttpRequest) { // Mozilla, Safari, ... - request = new XMLHttpRequest(); - } else if (window.ActiveXObject) { // IE - try { - request = new ActiveXObject('Msxml2.XMLHTTP'); - } - catch (e) { +function r(t) { + return function () { + var e = t.apply(this, arguments); + return new Promise(function (t, n) { + return function r(i, o) { try { - request = new ActiveXObject('Microsoft.XMLHTTP'); + var s = e[i](o), a = s.value + } catch (t) { + return void n(t) } - catch (e) { - } - } - } - - let onloadPromise = new Promise((r) => { - // this.result - request.onload = r; - request.onerror = function (err) { - r(Promise.reject(err)); - }; - }); - - let resultPromise = new Promise(function (resolve) { - - let response = { - "json": function () { - request.send(); - - return onloadPromise.then(() => { - return JSON.parse(request.responseText) - }); - }, - "text": function () { - request.send(); - return onloadPromise.then(() => request.responseText); - }, - "arrayBuffer": () => { - request.responseType = "arraybuffer"; - request.send(); - return onloadPromise.then(() => request.response); - } - }; - resolve(response); - }); - - - request.open('get', url, true); - // request.send(); - return resultPromise; - }); -} - -class Constants{} -Constants.SCRIPTS = { - CKEDITOR:"version/2/ckeditor/ckeditor.js", - LIST_JS: "version/1/listjs/list.min.js" -}; - -class DataManager { - static async load(url, isCachable, raw) { - isCachable = Helper.nonNull(isCachable, false); - raw = Helper.nonNull(raw, false); - let fullUrl = (isCachable) ? Helper.basePath(DataManager.cachePath + url) : Helper.basePath(DataManager.dataPath + url); - - return this._load(fullUrl, raw); - } - - static async _load(url, raw) { - return fetch(url, {"credentials": "same-origin"}).then(function (res) { - if (raw) { - return res.text(); - } - return res.json(); - }).catch(function (e) { - if (!raw) { - return { - "success": false, - "errors": [ - "not-online" - ] - } - } - }); - } - - static async loadStatic(url, raw) { - raw = Helper.nonNull(raw, false); - let fullUrl = Helper.basePath(url); - - return this._load(fullUrl, raw); - } - - static async send(url, params) { - let fullUrl = Helper.basePath(DataManager.dataPath + url); - - if (!(params instanceof FormData)) { - let newParams = new FormData(); - for (let k in params) { - newParams.append(k, params[k]); - } - params = newParams; - } - - return fetch(fullUrl, { - "credentials": "same-origin", - "method": "POST", - "body": params - }).then(function (res) { - return res.json(); - }).catch(function (e) { - console.error("error", e); - return { - "success": false, - "errors": [ - "not-online" - ] - } - }); - } - - static buildQuery(values) { - return Helper.buildQuery(values); - } -} - -DataManager.dataPath = "data/"; -DataManager.cachePath = "cached/"; - -class Form { - constructor(formElem, url, method, isCachable) { - this.formElem = formElem; - this.method = Helper.nonNull(method, Helper.nonNull(formElem["method"], "POST")); - this.isCachable = (Helper.nonNull(isCachable, this.method.toLowerCase() === "get") === true); - - this.isBusy = false; - - if (typeof url === "string") - { - this.submitHandler = function(values){ - if (self.method.toLowerCase() === "get") { - return (DataManager.load(url + DataManager.buildQuery(values), self.isCachable)); - } - else { - return (DataManager.send(url, values)); - } - }; - } - else { - this.submitHandler = url; - } - - let self = this; - - this.submitCallback = null; - this.errorCallback = async function (errors) { - await self.setErrors(errors); - }; - - formElem.addEventListener("submit", async function (e) { - console.log("submitting!", e); - e.preventDefault(); - await self.doSubmit(e); - }); - - for (let i = 0, n = formElem.elements.length; i < n; i++) { - let elem = formElem.elements[i]; - elem.addEventListener("change", function () { - if (this.value.trim() !== "") { - this.classList.add("notEmpty"); - } - else { - this.classList.remove("notEmpty"); - } - this.setCustomValidity(""); - }); - elem.addEventListener("keydown", function () { - this.setCustomValidity(""); - }); - } - } - - onError(errorHandler, ownHandlerForOptimisticLocking){ - ownHandlerForOptimisticLocking = Helper.nonNull(ownHandlerForOptimisticLocking, true); - let callback = null; - - if (ownHandlerForOptimisticLocking){ - callback = function(errors){ - if (Array.isArray(errors) && errors.indexOf("optimistic-locking-exception") >= 0){ - let dialog = new Dialog("optimistic-locking-dialog", "optimistic-locking-dialog-title"); - dialog.addDefaultButton(); - dialog.show(); - } - else - { - errorHandler(errors); - } - }; - } - else - { - callback = errorHandler; - } - this.errorCallback = callback; - } - - doSubmit() { - if (!this.isBusy) { - let self = this; - return this.submit().then(function (res) { - if (res["success"]) { - if (self.submitCallback !== null) { - return self.submitCallback(res["result"]); - } - } - else if (Helper.isNotNull(self.errorCallback)) { - return self.errorCallback(res["errors"]); - } - }); - } - } - - load(url, isCached) { - this.setValues(DataManager.load(url, isCached).then(function (values) { - if (values["success"]) { - return values["result"]; - } - return {}; - })); - return this; - } - - setValues(valuePromise) { - this.setIsBusy(true); - - let self = this; - return Promise.resolve(valuePromise).then(function (values) { - self.setIsBusy(false); - for (let k in values) { - if (Helper.isNotNull(self.formElem.elements[k])) { - if (Helper.isNotNull(self.formElem.elements[k].options) && Helper.isNotNull(values[k+"Options"])) - { - let options = self.formElem.elements[k].options; - for (let val in values[k+"Options"]) - { - let option = document.createElement("option"); - option.value = val; - option.innerText = values[k+"Options"][val]; - options.add(option); - } - } - - self.formElem.elements[k].value = Helper.htmlspecialcharsDecode(values[k]); - if (Helper.isNotNull(values[k]) && (""+values[k]).trim() !== "") { - self.formElem.elements[k].classList.add("notEmpty"); - } - else { - self.formElem.elements[k].classList.remove("notEmpty"); - } - } - } - return self; - }); - } - - async setErrors(errors) { - let hasElem = false; - let firstError = null; - - for (let k in errors) { - if (Helper.isNotNull(this.formElem.elements[k]) && this.formElem.elements[k].type !== "hidden" - && Helper.isNull(this.formElem.elements[k].readonly) && ( - Helper.isNull(this.formElem.elements[k].disabled) || !this.formElem.elements[k].disabled) - ) { - this.formElem.elements[k].setCustomValidity(Translator.translate(Helper.nonNull(errors[k], "form-default-error"))); - hasElem = true; - } - if (Helper.isNull(firstError)) { - firstError = Helper.nonNull(errors[k], "form-default-error"); - } - } - if (!hasElem && Helper.isNotNull(firstError)) { - for (let k in this.formElem.elements) { - if (this.formElem.elements[k].type !== "hidden") { - this.formElem.elements[k].setCustomValidity(Translator.translate(firstError)); - hasElem = true; - break; - } - } - } - - if (hasElem) { - this.formElem.querySelector("input[type=submit]").click(); - } - } - - setIsBusy(isBusy) { - this.isBusy = isBusy; - if (this.isBusy) { - this.formElem.classList.add("sending"); - } - else { - this.formElem.classList.remove("sending"); - } - } - - submit() { - let self = this; - return new Promise(function (resolve) { - self.setIsBusy(true); - let values = new FormData(self.formElem); - resolve(self.submitHandler(values)); - }).then(function (data) { - self.setIsBusy(false); - return data; - }); - } - - onSubmit(callback) { - this.submitCallback = callback; - } -} - -class SettingsManager { - static getInstance() { - if (SettingsManager._instance === null) { - SettingsManager._instance = new SettingsManager(); - } - return SettingsManager._instance; - } - - constructor() { - this._settings = null; - this._localStorageKey = "settings"; - } - - getSettings() { - if (Helper.isNull(this._settings)) { - this._loadSettings(); - } - return this._settings; - } - - getSetting(name, defaultValue) { - const settings = this.getSettings(); - - if (Helper.isNotNull(settings[name])) { - return settings[name].value; - } - else { - return defaultValue; - } - } - - deleteSetting(name) { - this.getSettings(); - delete this._settings[name]; - this._saveSettings(); - } - - setSetting(name, value) { - this.getSettings(); - this._settings[name] = { - date: new Date().getTime(), - value: value - }; - this._saveSettings(); - } - - setSettings(settingsObject) { - this.getSettings(); - for (const k in settingsObject) { - this._settings[k] = settingsObject[k]; - } - this._saveSettings(); - } - - hasSetting(name) - { - return Helper.nonNull(this._settings[name]); - } - - _loadSettings() { - this._settings = localStorage.getItem(this._localStorageKey); - if (this._settings === null) { - this._settings = {}; - } - else { - this._settings = JSON.parse(this._settings); - } - } - - _saveSettings() { - if (this._settings !== null) { - localStorage.setItem(this._localStorageKey, JSON.stringify(this._settings)); - } - } -} - -SettingsManager._instance = null; - -class LocalStorageSettingsFragment extends Fragment { - onFirstStart() { - let res = super.onFirstStart(); - let settings = this.findBy(".setting", true); - const settingsManager = SettingsManager.getInstance(); - - for (let i = 0; i < settings.length; i++) { - let setting = settings[i]; - const name = setting.name; - let value; - if (!setting["dataset"]["raw"]) { - value = settingsManager.getSetting(name); - } else { - value = localStorage.getItem(name); - } - - let isCheckable = false; - if (setting instanceof HTMLInputElement && (setting.type === 'checkbox' || setting.type === 'radio')) { - isCheckable = true; - } - if (((!setting["dataset"]["raw"] && !settingsManager.hasSetting(name)) || (setting["dataset"]["raw"] && value === null)) - && Helper.isNotNull(settings[i]["dataset"]["default"])) { - value = setting["dataset"]["default"]; - if (Helper.isNotNull(setting["dataset"]["defaultTranslateable"])) { - - setting["dataset"]["translation"] = ""; - setting["dataset"]["translationValue"] = value; - value = Translator.translate(value); - } - } - - if (Helper.isNotNull(value)) { - if (isCheckable) { - setting.checked = (value === setting.value); - } - else { - setting.value = value; - } - if (value !== "") { - setting.classList.add("notEmpty"); - } - } - - setting.addEventListener("change", function () { - let value = this.value; - if (isCheckable && !this.checked) { - value = null; - } - if (!setting["dataset"]["raw"]) { - settingsManager.setSetting(name, value); - } else { - localStorage.setItem(name, value); - } - delete setting["dataset"]["translationValue"]; - delete setting["dataset"]["translation"]; - }); - } - return res; - } - - onStart() { - let res = super.onStart(); - let settings = this.findBy(".setting", true); - const settingsManager = SettingsManager.getInstance(); - - for (let i = 0; i < settings.length; i++) { - let setting = settings[i]; - const name = setting.name; - let value; - if (!setting["dataset"]["raw"]) { - value = settingsManager.getSetting(name); - } else { - value = localStorage.getItem(name); - } - - let isCheckable = false; - if (setting instanceof HTMLInputElement && (setting.type === 'checkbox' || setting.type === 'radio')) { - isCheckable = true; - } - - if (Helper.isNotNull(value)) { - if (isCheckable) { - setting.checked = (value === setting.value); - } - else { - setting.value = value; - } - if (value !== "") { - setting.classList.add("notEmpty"); - } - } - } - return res; - } -} - -class SmartColumn{ - constructor(name, label, translateable){ - this._name = name; - this._label = label; - this._translateable = Helper.nonNull(translateable, true); - this._sortable = true; - - this._index = -1; - - this._clickListener = null; - } - - setClickListener(listener) - { - this._clickListener = listener; - return this; - } - - setIndex(index) - { - this._index = index; - } - - getName() - { - return this._name; - } - - getLabel() - { - return this._label; - } - - getHeadElement() - { - const headElement = document.createElement("th"); - headElement.appendChild((this._translateable)?Translator.makePersistentTranslation(this._label):document.createTextNode(this._label)); - - if (this._sortable) - { - headElement.classList.add("sort"); - headElement["dataset"]["sort"] = this._name; - } - - headElement["dataset"]["column"] = this._index; - - this._headElement = headElement; - return this._headElement; - } - - getValueName(){ - return this._name; - } - - prepareData(myData, rowData) - { - return myData; - } - - getItemElement(){ - const element = document.createElement("td"); - element.classList.add(this._name); - element["dataset"]["column"] = this._index; - - if (Helper.isNotNull(this._clickListener)) - { - element.classList.add("clickable"); - } - - return element; - } - - click(tableCell, table, event){ - if (Helper.isNotNull(this._clickListener)) - { - this._clickListener(tableCell, table, event); - } - } -} - -class ConstSmartColumn extends SmartColumn{ - constructor(name, label, translatable, valueTranslatable) { - super(name, label, translatable); - this._sortable = false; - this._valueTranslatable = Helper.nonNull(valueTranslatable, false); - } - - getValueName() { - return null; - } - - getItemElement(){ - const element = super.getItemElement(); - element.classList.remove(this._name); - element.appendChild((this._valueTranslatable)?Translator.makePersistentTranslation(this._name):document.createTextNode(this._name)); - return element; - } -} - -class DataSmartColumn extends SmartColumn{ - constructor(name, label, translateable) { - translateable = Helper.nonNull(translateable, false); - super(name, label, translateable); - } - - getHeadElement() { - return document.createTextNode(""); - } - - getValueName() { - return { - "data":[this._name] - }; - } - - getItemElement() { - return document.createTextNode(""); - } -} - -class ImgConstSmartColumn extends ConstSmartColumn{ - constructor(name, label, translateable) { - super(name, label, translateable); - this._valueTranslatable = false; - } - - getItemElement() { - const element = super.getItemElement(); - const imgElement = document.createElement("img"); - imgElement["src"] = this._name; - - element.removeAllChildren().appendChild(imgElement); - return element; - } -} - -class ListHelper { - constructor(id, options, values) { - this._tableElement = id; - this._options = Helper.nonNull(options, {}); - this._values = values; - - if (typeof this._tableElement === "string") { - this._tableElement = document.getElementById(this._tableElement); - } - - this._columns = []; - if (Array.isArray(options)) { - this._columns = options; - } - else if (Helper.isNotNull(options["columns"])) { - this._columns = options["columns"]; - } - } - - prepareData(data) { - console.log("prepareData", data); - if (Helper.isNotNull(data)) { - for (let i = 0, n = data.length; i < n; i++) { - data[i] = this.prepareDataset(data[i]); - } - } - return data; - } - - prepareDataset(dataset) { - console.log("prepareDataset", dataset); - for (let i = 0, n = this._columns.length; i < n; i++) { - if (Helper.isNotNull(dataset[this._columns[i].getName()])) { - dataset[this._columns[i].getName()] = this._columns[i].prepareData(dataset[this._columns[i].getName()], dataset); - } - } - return dataset; - } - - createTable() { - if (Helper.isNotNull(this._columns)) { - this.updateColumns(); - } - - let id = this._tableElement; - let options = this._options; - let values = this._values; - - options["item"] = Helper.nonNull(options["item"], id["id"] + "-template-item"); - options["page"] = Helper.nonNull(options["page"], 5); - options["pagination"] = Helper.nonNull(options["pagination"], { - "outerWindow": 1, - "innerWindow": 1 - }); - - let template = document.getElementById(options["item"]); - if (template) { - options["item"] = template.outerHTML; - template.remove(); - } - - values = this.prepareData(values); - - const list = new List(id, options, values); - let self = this; - id.querySelector("." + Helper.nonNull(options["listClass"], "list")).addEventListener("click", function (e) { - let columnElem = e.target.closest("td[data-column]"); - const column = parseInt(columnElem["dataset"]["column"]); - if (self._columns.length > column) { - self._columns[column].click(columnElem, list, e); - } - }); - this.list = list; - - return list; - } - - updateColumns() { - const head = document.createElement("tr"); - const item = document.createElement("tr"); - const valueNames = []; - - for (let i = 0, n = this._columns.length; i < n; i++) { - this._columns[i].setIndex(i); - - head.appendChild(this._columns[i].getHeadElement()); - item.appendChild(this._columns[i].getItemElement()); - - const valueName = this._columns[i].getValueName(); - if (Helper.isNotNull(valueName)) { - valueNames.push(valueName); - } - } - const header = this._tableElement.querySelector("thead"); - const footer = this._tableElement.querySelector("tfoot"); - - if (Helper.isNotNull(header)) { - header.removeAllChildren().appendChild(head); - } - if (Helper.isNotNull(footer)) { - footer.removeAllChildren().appendChild(Helper.cloneNode(head)); - } - - - this._options["item"] = item.outerHTML; - this._options["valueNames"] = valueNames; - } - - getList() { - return this.list; - } - - updateItem(valueName, value, newValues) { - const items = this.list.get(valueName, value); - if (Helper.isNotNull(items) && items.length >= 1) { - newValues = this.prepareDataset(newValues); - items[0].values(newValues); - } - } - - setBusy(isBusy) { - if (isBusy) { - this._tableElement.classList.add("sending"); - } - else { - this._tableElement.classList.remove("sending"); - } - } -} - -class SettingsSite extends AbstractSite { - constructor(siteManager) { - super(siteManager, SettingsSite.template, "settings"); - for (let k in SettingsSite.settingsFragments) { - this.addSettingsFragment(k, new SettingsSite.settingsFragments[k](this)); - } - this.active = null; - } - - addSettingsFragment(name, settingsFragment) { - this.addFragment("#settings-fragments", settingsFragment); - delete this.fragments["#settings-fragments"]; - this.fragments[name] = settingsFragment; - } - - onStart() { - let res = super.onStart(); - if (Helper.isNotNull(this.active) && !this.fragments[this.active].isActive()) { - this.setActive(null); - } - - this.buildList(); - return res; - } - - setActive(name) { - if (Helper.isNotNull(this.active)) { - this.fragments[this.active].inflatePromise.then(function (view) { - view.classList.remove("active"); - }); - this.findBy("#show-fragment-" + this.active).classList.remove("active"); - } - this.active = name; - if (Helper.isNotNull(this.active)) { - this.fragments[this.active].inflatePromise.then(function (view) { - view.classList.add("active"); - }); - this.findBy("#show-fragment-" + this.active).classList.add("active"); - } - } - - buildList() { - let listNameElem = this.findBy("#settings-fragment-list"); - listNameElem.removeAllChildren(); - - let self = this; - for (let k in this.fragments) { - if (this.fragments[k].isActive()) { - - let liElement = document.createElement("li"); - liElement.id = "show-fragment-" + k; - liElement.appendChild(Translator.makePersistentTranslation(k, null, "a")); - liElement.addEventListener("click", function () { - self.setActive(k); + if (!s.done) return Promise.resolve(a).then(function (t) { + r("next", t) + }, function (t) { + r("throw", t) }); - listNameElem.appendChild(liElement); + t(a) + }("next") + }) + } +} - if (Helper.isNull(this.active)) { - this.setActive(k); - } - } +function i(t, e) { + if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !e || "object" != typeof e && "function" != typeof e ? t : e +} + +function o(t, e) { + if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); + t.prototype = Object.create(e && e.prototype, { + constructor: { + value: t, + enumerable: !1, + writable: !0, + configurable: !0 } - } - - static addSettingsFragment(name, settingsFragment) { - SettingsSite.settingsFragments[name] = settingsFragment; - } - - static setAddSettingsSite(addLink) { - SettingsSite.shouldAddSettingsSite = addLink; - } - - static setTemplate(template) { - SettingsSite.template = template; - } + }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } -SettingsSite.template = 'core/html/settings.html'; -SettingsSite.settingsFragments = {}; -SettingsSite.shouldAddSettingsSite = true; -SettingsSite.settingsAction = null; -SettingsSite.shouldAddSettingsAction = true; +function s(t, e) { + if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") +} -InitPromise.addPromise(function (app) { - if (SettingsSite.shouldAddSettingsSite) { - app.addDeepLink("settings", SettingsSite); +var a = function () { + function t() { + s(this, t) + } - if (Helper.isNull(SettingsSite.settingsAction)) { - let settingsAction = new MenuAction("settings", async () => { - let currentSite = app.getCurrentSite(); - if (currentSite instanceof SettingsSite) { - currentSite.finish(); - } - else { - let settingsSite = await app.findSite((site) => { - return (site instanceof SettingsSite); - }); - if (Helper.isNotNull(settingsSite)) { - settingsSite.toForeground(); - } - else { - app.startSite(SettingsSite); - } - } - }, MenuAction.SHOW_FOR_LARGE, 10000); - settingsAction.setIcon("img/settings.png"); - SettingsSite.settingsAction = settingsAction; + return n(t, null, [{ + key: "t", value: function (e) { + if ("function" == typeof e) { + var n = e; + e = t.s.then(function (t) { + return n(t) + }) + } + t.i.push(e) } - if (SettingsSite.shouldAddSettingsAction) { - app.addDefaultAction(SettingsSite.settingsAction); - } - } -}); - -class UserManager { - static init(app) { - UserManager.getMeUrl = null; - UserManager.userData = { - online: false, - id: null, - accesses: ["default"] - }; - UserManager.app = app; - - UserManager.fetchMePromise = new Promise(function (resolve) { - UserManager.fetchMePromiseResolver = resolve; - }); - } - - static setData(data) { - UserManager.userData = Object.assign(UserManager.userData, data); - let siteManager = UserManager.app.getSiteManager(); - - if (siteManager) - siteManager.redrawCurrentActionBar(); - } - - static fetchMe(url) { - UserManager.getMeUrl = Helper.nonNull(url, UserManager.getMeUrl); - return DataManager.load(UserManager.getMeUrl).then(function (result) { - if (result["success"]) { - UserManager.setData(result["result"]); - } - UserManager.fetchMePromiseResolver(); - }); - } - - static logOut() { - return DataManager.load("u/logout").then(function (data) { - if (data["success"]) { - UserManager.setData(data["result"]); - let siteManager = UserManager.app.getSiteManager(); - - if (siteManager) - siteManager.refreshCurrentSite(); - FlashMessenger.addMessage(FlashMessenger.MESSAGE_TYPE_SUCCESS, Translator.translate("logged-out-successfully")); - } - }); - } - - static hasAccess(access) { - // console.log("Has access", access, UserManager.userData["accesses"].indexOf(access), UserManager.userData); - return (UserManager.userData["accesses"].indexOf(access) >= 0) - } - - static addCurrentUserListener(userId, listener) { - UserManager.addIsLoggedInListener(function (isLoggedIn) { - listener(isLoggedIn && UserManager.isCurrentUser(userId)); - }); - } - - static addIsLoggedInListener(listener) { - this.fetchMePromise.then(function () { - listener(UserManager.isLoggedIn()); - }); - } - - static isCurrentUser(userId) { - return UserManager.userData.id === userId; - } - - static isLoggedIn() { - return Helper.isNotNull(UserManager.userData) && Helper.isNotNull(UserManager.userData.id); - } -} - -InitPromise.addPromise(function(app){ - UserManager.init(app); - return UserManager.fetchMe("u/me").then(function(){ - UserManager.addIsLoggedInListener(function (isLoggedIn) { - if (isLoggedIn) { - const settingsManager = SettingsManager.getInstance(); - const settings = Helper.cloneJson(settingsManager.getSettings()); - for (let k in settings) { - settings[k]["value"] = JSON.stringify(settings[k]["value"]); - } - DataManager.send("u/syncSettings", settings).then(function(res){ - if (res["success"]) - { - for (let k in res["result"]) - { - res["result"][k]["value"] = JSON.parse(res["result"][k]["value"]); - } - settingsManager.setSettings(res["result"]); - } - }); - } - }); - }); -}); - -class UserAction extends MenuAction { - constructor(title, callback, icon, order, access) { - super(title, callback, icon, order); - this._access = Helper.nonNull(access, "default"); - } - - getVisible() { - // console.log("Action-access: ", this._access); - return (super.getVisible() && UserManager.hasAccess(this._access)); - } - - getAccess() { - return this._access; - } - - copy(instance){ - let copy = super.copy(Helper.nonNull(instance, new UserAction())); - copy._access = this._access; - return copy; - } -} - -class NotAllowedSite extends AbstractSite{ - constructor(siteManager) { - super(siteManager, 'userManagement/html/403.html'); - } -} - -class UserSite extends AbstractSite { - - constructor(siteManager, view, deepLink, access) { - super(siteManager, view, deepLink); - this._access = access; - } - - onConstruct(args) { - if (!UserManager.hasAccess(this._access)) - { - this.startSite(NotAllowedSite); - this.finish({ - "error":403 - }); - return; - } - return super.onConstruct(args); - } - - onStart(args) { - if (!UserManager.hasAccess(this._access)) - { - this.startSite(NotAllowedSite); - this.finish({ - "error":403 - }); - return; - } - return super.onStart(args); - } -} - -class LoginForm extends Form { - - constructor(formElem, url, method, isCachable) { - super(formElem, url, method, isCachable); - - let emailElem = formElem.querySelector("#email"); - let passwordElem = formElem.querySelector("#password"); - - let listener = function(){ - emailElem.setCustomValidity(""); - passwordElem.setCustomValidity(""); - }; - - emailElem.addEventListener("keydown", listener); - passwordElem.addEventListener("keydown", listener); - } -} - -class RegistrationForm extends Form { - constructor(formElem, url, method, isCachable) { - super(formElem, url, method, isCachable); - - // this.pw1 = formElem.querySelector("#password1"); - // this.pw2 = formElem.querySelector("#password2"); - - // let self=this; - // this.pw1.addEventListener("change", function(){ - // self.checkPw(); - // }); - // this.pw2.addEventListener("change", function(){ - // self.checkPw(); - // }); - } - - checkPw(){ - // if (this.pw1.value !== this.pw2.value || this.pw1.value.length < 8) - // { - // - // } - } -} - -class UserFragment extends Fragment{ - - constructor(site, view, access) { - super(site, view); - this._access = access; - } - - isActive() { - return super.isActive() && UserManager.hasAccess(this._access); - } -} - -class PasswordSettingsFragment extends UserFragment{ - constructor(site) - { - super(site, "userManagement/html/fragments/passwordSettings.html", "online"); - } - onFirstStart() { - let res = super.onFirstStart(); - let form = new Form(document.getElementById("change-password-form"), "u/passwordSettings/set", "post"); - form.onSubmit(function(res){ - for (let i = 0, n = res.length; i < n; i++) - { - FlashMessenger.addMessage(res[i]); - } - form.setValues({ - "oldPassword":"", - "newPassword1":"", - "newPassword2":"" - }); - }); - return res; - } -} -InitPromise.addPromise(function(){ - SettingsSite.addSettingsFragment("password-settings", PasswordSettingsFragment); -}); - -class UserSettingsFragment extends UserFragment{ - constructor(site) - { - super(site, "userManagement/html/fragments/userSettings.html", "online"); - } - - onFirstStart() { - let res = super.onFirstStart(); - (new Form(document.getElementById("user-settings-form"), "u/userSettings/set", "post")).load('u/userSettings').onSubmit(function(res){ - for (let i = 0, n = res.length; i < n; i++) - { - FlashMessenger.addMessage(res[i]); - } - }); - return res; - } -} -InitPromise.addPromise(function(){ - SettingsSite.addSettingsFragment("user-settings", UserSettingsFragment); -}); - -class EditUserRolesSite extends UserSite { - constructor(siteManager) { - super(siteManager, 'userManagement/html/editUserRoles.html', "userRoles", "admin"); - } - - onConstruct(args) { - let res = super.onConstruct(args); - this.userId = args["id"]; - - let self = this; - return Promise.all([ - ScriptLoader.loadScript(Constants.SCRIPTS.LIST_JS), - DataManager.load("u/userRoles" + DataManager.buildQuery({"id": self.userId})).then(function (res) { - if (!res["success"]) { - FlashMessenger.addMessage(res["errors"][0]); - self.finish(); - } - else { - self.setUserRoles(res["result"]["userRoles"]); - self.setAvailableRoles(res["result"]["availableRoles"]); - self.setUsername(res["result"]["username"]); - } + }, { + key: "resolve", value: function (e) { + return t.o(e), t.s.then(function () { + return Promise.all(t.i) }) - ]).then(function () { - return res; - }); + } + }]), t +}(); +a.i = [], a.s = new Promise(function (t) { + a.o = t +}); +var u = function () { + function t() { + s(this, t) } - onFirstStart() { - this.findBy("#username").innerHTML = this.username; - - const userRolesElement = this.findBy("#userRoles"); - const availableRolesElement = this.findBy("#availableRoles"); - - const imgColumnUserRoles = new ImgConstSmartColumn("img/minus.png", "", false); - const imgColumnAvailableRoles = new ImgConstSmartColumn("img/plus.png", "", false); - - const userRolesColumns = [ - new DataSmartColumn("id"), - new SmartColumn("name", "name"), - new SmartColumn("description", "description"), - imgColumnUserRoles, - ]; - - const availableRolesColumns = [ - new DataSmartColumn("id"), - new SmartColumn("name", "name"), - new SmartColumn("description", "description"), - imgColumnAvailableRoles, - ]; - - const userRolesListHelper = new ListHelper(userRolesElement, userRolesColumns, this.userRoles); - const availableRolesListHelper = new ListHelper(availableRolesElement, availableRolesColumns, this.availableRoles); - - const userRolesTable = userRolesListHelper.createTable(); - const availableRolesTable = availableRolesListHelper.createTable(); - - let self = this; - const changeRoleFunction = function (roleId, addRole) { - userRolesListHelper.setBusy(true); - availableRolesListHelper.setBusy(true); - - return DataManager.send("u/changeUserRole", { - "id": roleId, - "userId": self.userId, - "add": addRole - }).then(function (res) { - userRolesListHelper.setBusy(false); - availableRolesListHelper.setBusy(false); - - if (!res["success"]) { - FlashMessenger.addMessage(res["errors"][0]); - return res; + return n(t, null, [{ + key: "l", value: function (e, n) { + if ("function" != typeof e) { + if ("string" == typeof e) { + for (var r = e.split("."), i = r.length - 1; i >= 1; i--) { + var o = {}; + o[r[i]] = n, n = o + } + e = r[0] } - - let removingTable = null; - let addingTable = null; - if (res["result"]["hasRole"]) { - removingTable = availableRolesTable; - addingTable = userRolesTable; + var s = e; + e = function () { + window[s] = n } - else { - addingTable = availableRolesTable; - removingTable = userRolesTable; - } - - const rowData = removingTable.get("id", roleId); - if (rowData.length === 1) { - addingTable.add(rowData[0].values()); - removingTable.remove("id", roleId); - } - - return res; - }); - }; - - imgColumnUserRoles.setClickListener(function (cell) { - let userRoleId = cell.closest("tr")["dataset"]["id"]; - changeRoleFunction(userRoleId, false); - }); - - imgColumnAvailableRoles.setClickListener(function (cell) { - let availableRoleId = cell.closest("tr")["dataset"]["id"]; - changeRoleFunction(availableRoleId, true); - }); - - } - - setUserRoles(userRoles) { - this.userRoles = userRoles; - } - - setAvailableRoles(availableRoles) { - this.availableRoles = availableRoles; - } - - setUsername(username) { - this.username = username; - } -} - -InitPromise.addPromise(function (app) { - app.addDeepLink("userRoles", EditUserRolesSite); - app.addDefaultAction(new UserAction('userRoles', function(){ - app.startSite(EditUserRolesSite); - }, null, 1100, "admin")); -}); - -class ForgotPasswordSite extends UserSite{ - - constructor(siteManager) { - super(siteManager, 'userManagement/html/forgotPassword.html', "forgotPassword", "offline"); - } - - onFirstStart() { - let self = this; - (new Form(document.getElementById("forgot-password-form"), "u/newPassword", "post")).onSubmit(function(res){ - // UserManager.setData(res); - // self.startStartsite(); - FlashMessenger.addMessage(FlashMessenger.MESSAGE_TYPE_SUCCESS, Translator.translate("new-password-code-send")); - self.finish(); - }); - } -} -InitPromise.addPromise(function(app){ - app.addDeepLink("forgotPassword", ForgotPasswordSite); -}); - -class LoginSite extends UserSite { - constructor(siteManager) { - super(siteManager, 'userManagement/html/login.html', "login", "offline"); - } - - onFirstStart() { - let self = this; - (new LoginForm(document.getElementById("login-form"), "u/login", "post")).onSubmit(function (res) { - UserManager.setData(res); - self.startStartsite(); - FlashMessenger.addMessage(FlashMessenger.MESSAGE_TYPE_SUCCESS, Translator.translate("login-success")); - self.finish(); - }); - - this.findBy("#forgot-password-link").addEventListener("click", function () { - self.startSite(ForgotPasswordSite); - self.finish(); - }); - } -} - -LoginSite.loginAction = null; -LoginSite.logoutAction = null; -LoginSite.addLoginAction = true; -LoginSite.addLogoutAction = true; - -InitPromise.addPromise(function (app) { - app.addDeepLink("login", LoginSite); - - if (Helper.isNull(LoginSite.loginAction)) { - LoginSite.loginAction = new UserAction('login', function () { - app.startSite(LoginSite); - }, Menu.SHOW_NEVER, 1100, "offline"); - } - if (Helper.isNull(LoginSite.logoutAction)) { - LoginSite.logoutAction = new UserAction('logout', function () { - UserManager.logOut(); - }, Menu.SHOW_NEVER, 1100, "online"); - } - if (LoginSite.addLoginAction){ - app.addDefaultAction(LoginSite.loginAction); - } - if (LoginSite.addLogoutAction){ - app.addDefaultAction(LoginSite.logoutAction); - } -}); - -class RegistrationSite extends UserSite { - constructor(siteManager) { - super(siteManager, 'userManagement/html/registration.html', "registration", "offline"); - } - - onFirstStart() { - (new RegistrationForm(document.getElementById("registration-form"), "u/registration", "post")).onSubmit(function (res) { - FlashMessenger.addMessage(FlashMessenger.MESSAGE_TYPE_SUCCESS, Translator.translate("registration-success")); - }); - } -} - -RegistrationSite.action = null; -RegistrationSite.addAction = true; - -InitPromise.addPromise(function (app) { - app.addDeepLink("registration", RegistrationSite); - - if (Helper.isNull(RegistrationSite.action)) { - RegistrationSite.action = new UserAction('registration', function () { - app.startSite(RegistrationSite); - }, null, 1100, "offline"); - } - if (RegistrationSite.addAction) { - app.addDefaultAction(RegistrationSite.action); - } -}); - -class SetNewPasswordSite extends UserSite { - constructor(siteManager) { - super(siteManager, 'userManagement/html/setNewPassword.html', "newPassword", "offline"); - } - - onConstruct(args) { - this.code = args["code"]; - return super.onConstruct(args); - } - - onFirstStart() { - let formElem = document.getElementById("new-password-form"); - document.getElementById("code").value = this.code; - - let self = this; - (new Form(formElem, "c/code", "post")).onSubmit(function(res){ - FlashMessenger.addMessage(FlashMessenger.MESSAGE_TYPE_SUCCESS, Translator.translate("password-updated")); - self.startSite(LoginSite); - self.finish(); - }); - } -} -InitPromise.addPromise(function(app){ - app.addDeepLink("newPassword", SetNewPasswordSite); -}); - -class MyStorageManager { - static getInstance() { - if (Helper.isNull(MyStorageManager.instance)) { - MyStorageManager.instance = new MyStorageManager(); - } - return MyStorageManager.instance; - } - - async estimate() { - if ('storage' in navigator && 'estimate' in navigator.storage) { - // We've got the real thing! Return its response. - return navigator.storage.estimate(); - } - - if ('webkitTemporaryStorage' in navigator && - 'queryUsageAndQuota' in navigator.webkitTemporaryStorage) { - // Return a promise-based wrapper that will follow the expected interface. - return new Promise(function (resolve, reject) { - navigator.webkitTemporaryStorage.queryUsageAndQuota( - function (usage, quota) { - resolve({usage: usage, quota: quota}); - }, - reject - ); - }); - } - // If we can't estimate the values, return a Promise that resolves with NaN. - return Promise.resolve({usage: NaN, quota: NaN}); - } - - canEstimateStorage() { - return ('storage' in navigator && 'estimate' in navigator.storage || 'webkitTemporaryStorage' in navigator && - 'queryUsageAndQuota' in navigator.webkitTemporaryStorage); - } - - canPersist() { - return (navigator.storage && navigator.storage.persist); - } - - persist(){ - if (this.canPersist()){ - return navigator.storage.persist(); - } - return Promise.resolve(false); - } -} - -MyStorageManager.instance = null; - -class InstallManager { - static init() { - window.addEventListener('beforeinstallprompt', e => { - e.preventDefault(); - this.setDeferredPrompt(e); - }); - } - - static setDeferredPrompt(e){ - this.deferredPromt = e; - if (this.canInstallListener) { - this.canInstallListener(this.deferredPromt); - } - } - - static async prompt(){ - if (Helper.isNotNull(this.deferredPromt)){ - this.deferredPromt["prompt"](); - return this.deferredPromt["userChoice"].then(r => { - MyStorageManager.getInstance().persist(); - return r; - }); - } - return Promise.resolve({ - "outcome":"dismissed", - "platform":"" - }); - } - - static setCanInstallListener(listener, callIfCanInstall) { - this.canInstallListener = listener; - callIfCanInstall = Helper.nonNull(callIfCanInstall, true); - - if (callIfCanInstall && Helper.nonNull(this.deferredPromt)) { - this.canInstallListener(this.deferredPromt); - } - } -} - -InstallManager.init(); - -class Matomo { - - static init() { - Matomo.isTrackingPromise = new Promise(async (resolve) => { - let shouldTrack = Helper.nonNull(localStorage.getItem(Matomo.LOCAL_STORAGE_KEY), "1"); - if (Helper.isNull(shouldTrack)) { - shouldTrack = await Matomo._askIsTracking(); - localStorage.setItem(Matomo.LOCAL_STORAGE_KEY, shouldTrack); } - else { - shouldTrack = (shouldTrack === "1"); - Matomo.setTrack(shouldTrack); + t.h.push(e) + } + }, { + key: "u", value: function () { + for (var e = 0; e < t.h.length; e++) t.h[e](); + return Promise.resolve() + } + }]), t +}(); +u.h = [], u.l("InitPromise.addPromise", a.t); +var l = function () { + function t(e, n, r, i) { + s(this, t), this.title = v.m(e, null), this.g = n, this.p = v.m(r, t.S), this.order = v.m(i, 1e3), this.M = "", this.H = null, this.v = !0, this.P = !0, this.id = t.T++, this.L = null, this.A = !0, this.C = [] + } + + return n(t, [{ + key: "k", value: function (t) { + this.title = t + } + }, { + key: "F", value: function (t) { + this.A = t + } + }, { + key: "B", value: function () { + return this.p + } + }, { + key: "D", value: function () { + return this.title + } + }, { + key: "I", value: function () { + return this.A + } + }, { + key: "remove", value: function (t) { + if (t = v.m(t, !1), v.R(this.H) && (console.log(this.H), this.H.U(this), this.H = null), t) for (var e = 0; e < this.C.length; e++) this.C[e].remove() + } + }, { + key: "W", value: function () { + return this.H + } + }, { + key: "N", value: function (t) { + this.H = t + } + }, { + key: "O", value: function () { + return this.P + } + }, { + key: "_", value: function (t) { + t !== this.P && (this.P = t, this.j()) + } + }, { + key: "V", value: function () { + return this.v + } + }, { + key: "J", value: function () { + return this.L + } + }, { + key: "q", value: function (t) { + this.L = t + } + }, { + key: "$", value: function () { + return this.id + } + }, { + key: "j", value: function () { + v.R(this.H) && this.H.G(this) + } + }, { + key: "K", value: function (e) { + var n = v.m(e, new t); + return n.title = this.title, n.g = this.g, n.p = this.p, n.order = this.order, n.M = this.M, n.v = this.v, n.P = this.P, n.L = this.L, n.A = this.A, n.H = null, n.id = t.T++, this.C.push(n), n + } + }, { + key: "X", value: function () { + v.R(this.H) && this.H.j() + } + }]), t +}(); +l.T = 0, l.Y = "always", l.S = "medium", l.Z = "large", l.tt = "never"; +var c = function () { + function t(e, n, r, o) { + var a; + return s(this, t), (a = i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, function (t) { + t.et().toggle(), t.j() + }, r, o))).nt = n, n.st(a), a + } + + return o(t, l), n(t, [{ + key: "et", value: function () { + return this.nt + } + }, { + key: "K", value: function (n) { + return e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "K", this).call(this, v.m(n, new t(null, this.nt.K()))) + } + }]), t +}(), h = function () { + function t(e) { + s(this, t), this.it = [], this.rt = [], "string" == typeof e ? this.ot = document.querySelectorAll(e) : Array.isArray(e) ? this.ot = e : this.ot = [e] + } + + return n(t, [{ + key: "K", value: function (e) { + (e = v.m(e, new t([]))).it = []; + for (var n = 0, r = this.it.length; n < r; n++) e.it.push(this.it[n].K()); + e.rt = []; + for (var i = 0, o = this.rt.length; i < o; i++) e.rt.push(this.rt[i].K()); + return e + } + }, { + key: "at", value: function (t) { + v.lt(this.it, t) && (this.it.push(t), this.j(), t.N(this), t instanceof c && this.rt.push(t.et())) + } + }, { + key: "ht", value: function () { + if (v.R(this.ot)) { + this.ut(); + for (var t = [], e = 0; e < this.it.length; e++) { + var n = this.ct(this.it[e]); + this.it[e].dt = n, t.push(n) + } + for (var r = 0, i = this.ot.length; r < i; r++) { + this.ot[r].removeAllChildren(); + for (var o = 0, s = t.length; o < s; o++) this.ot[r].appendChild(v.cloneNode(t[o])); + this.ot[r].onclick = this.gt() + } } - resolve(shouldTrack); - }); - Matomo.isTrackingPromise.then(() => { - Matomo.push(['trackPageView'], true); - Matomo.push(['enableLinkTracking'], true); - Matomo.push(['setTrackerUrl', Matomo.TRACK_SITE + '/piwik.php'], true); - Matomo.push(['setSiteId', Matomo.SIDE_ID + ""], true); - - let d = document, g = d.createElement('script'), s = d.getElementsByTagName('head')[0]; - g.type = 'text/javascript'; - g.async = true; - g.defer = true; - g.src = Matomo.TRACK_SITE + '/piwik.js'; - s.appendChild(g); - }); - } - - static update(title) { - if (Helper.nonNull(Matomo.currentUrl)) { - Matomo.push(['setReferrerUrl', Matomo.currentUrl]); } - Matomo.currentUrl = window.location.pathname + window.location.search; - Matomo.push(['setCustomUrl', Matomo.currentUrl]); - Matomo.push(['setDocumentTitle', title]); - - // remove all previously assigned custom variables, requires Matomo (formerly Piwik) 3.0.2 - Matomo.push(['deleteCustomVariables', 'page']); - Matomo.push(['setGenerationTimeMs', 0]); - Matomo.push(['trackPageView']); - - // make Matomo aware of newly added content - var content = document.getElementById('site-content'); - Matomo.push(['MediaAnalytics::scanForMedia', content]); - Matomo.push(['FormAnalytics::scanForForms', content]); - Matomo.push(['trackContentImpressionsWithinNode', content]); - Matomo.push(['enableLinkTracking']); - } - - static async _askIsTracking() { - Matomo.isTrackingPromise = new Promise(resolve => { - Matomo.push([function () { - resolve(!this["isUserOptedOut"]()); - }]); - Matomo.push([function () { - resolve(!this["isUserOptedOut"]()); - }]); - }); - return Matomo.isTrackingPromise; - } - - static async query(method) { - return fetch(Matomo.TRACK_SITE + Matomo.BASE_PATH + method, { - "mode": "cors", - "credentials": "include", - }).then(res => res.text()).then(text => (new window.DOMParser()).parseFromString(text, "text/xml")); - } - - static getTrackingPromise() { - return Matomo.isTrackingPromise; - } - - static async setTrack(shouldTrack) { - Matomo.isTrackingPromise = Promise.resolve(shouldTrack); - localStorage.setItem(Matomo.LOCAL_STORAGE_KEY, (shouldTrack === true) ? "1" : "0"); - - if (shouldTrack) { - Matomo.push(["forgetUserOptOut"], true); - } - else { - Matomo.push(["optUserOut"], true); - } - } - - static async trackEvent(event, name, label, value){ - let ev = ["trackEvent", event, name]; - if (Helper.isNotNull(label)){ - ev.push(label); - } - if (Helper.isNotNull(value) && !isNaN(parseFloat(value)) && isFinite(value)){ - ev.push(value); - } - - return this.push(ev); - } - - static async push(arr, force) { - - if (!Array.isArray(arr)) { - arr = [arr]; - } - window["_paq"].push(arr); - } -} - -Matomo.currentUrl = null; - -Matomo.LOCAL_STORAGE_KEY = "matomoShouldTrack"; -Matomo.TRACK_SITE = "//matomo.silas.link"; -Matomo.BASE_PATH = "/index.php?module=API&method=AjaxOptOut."; -Matomo.SIDE_ID = "1"; - -InitPromise.addPromise(() => { - window["_paq"] = window["_paq"] || []; - Matomo.init(); -}); - -class MatomoShareButton extends MultipleShareButton{ - - constructor(baseButton, platform, shouldLoadImg) { - super([baseButton, (url) => { - Matomo.trackEvent("shared", url, platform); - }], shouldLoadImg); - } -} - -AndroidBridge.addDefinition("MatomoShareButton", MatomoShareButton); - -class ScaleHelper { - async scaleTo(scale, fontElement, container, ignoreHeight, ignoreWidth, margin, fontWeight, animationDelay, addListener) { - - addListener = Helper.nonNull(addListener, true); - animationDelay = Helper.nonNull(animationDelay, 0); - - let newFontSize = await this._getNewFontSize(scale, fontElement, container, ignoreHeight, ignoreWidth, margin, fontWeight, animationDelay === 0); - - if (animationDelay > 0) { - await new Promise(r => { - setTimeout(r, animationDelay); - fontElement.style.fontSize = newFontSize + "px"; - }); - } - - let self = this; - let listener = function () { - return new Promise(resolve => { - let timeout = (typeof addListener === 'number') ? addListener : 255; - setTimeout(() => { - resolve(self.scaleTo(scale, fontElement, container, ignoreHeight, ignoreWidth, margin, fontWeight, animationDelay, false)); - }, timeout); - }); - }; - if (addListener !== false) { - window.addEventListener("resize", listener); - } - return listener; - } - - async scaleToFull(fontElement, container, ignoreHeight, ignoreWidth, margin, fontWeight, animDelay, addListener) { - return this.scaleTo(1, fontElement, container, ignoreHeight, ignoreWidth, margin, fontWeight, animDelay, addListener); - } - - async _getNewFontSize(scale, fontElement, container, ignoreHeight, ignoreWidth, margin, fontWeight, setFontSize) { - margin = Helper.nonNull(margin, 10); - ignoreHeight = Helper.nonNull(ignoreHeight, false); - ignoreWidth = Helper.nonNull(ignoreWidth, false); - fontWeight = Helper.nonNull(fontWeight, fontElement.innerHTML.length); - setFontSize = Helper.nonNull(setFontSize, true); - - let hasNoTransitionClass = container.classList.contains("no-transition"); - - if (!hasNoTransitionClass) { - container.classList.add("no-transition"); - } - - const numChanged = 5; - let oldDiffIndex = 0; - let oldDiff = []; - - for (let i = 0; i < numChanged; i++) { - oldDiff.push(0); - } - - let beforeFontSize = fontElement.style.fontSize; - let currentFontSize = 1; - let widthDiff = 0; - let heightDiff = 0; - let containerWidth = 0; - let containerHeight = 0; - do { - currentFontSize += oldDiff[oldDiffIndex] / (fontWeight + 1); - fontElement.style.fontSize = currentFontSize + 'px'; - - let containerStyle = window.getComputedStyle(container); - - containerWidth = containerStyle.getPropertyValue("width").replace('px', ''); - containerHeight = containerStyle.getPropertyValue("height").replace('px', ''); - - widthDiff = containerWidth - fontElement.offsetWidth; - heightDiff = containerHeight - fontElement.offsetHeight; - - oldDiffIndex = (oldDiffIndex+1)%numChanged; - let newDiff = (ignoreWidth ? heightDiff : (ignoreHeight ? widthDiff : Math.min(widthDiff, heightDiff))); - if (newDiff === oldDiff[(oldDiffIndex+1)%numChanged]) { - break; + }, { + key: "gt", value: function () { + var t = this; + return function (e) { + var n = e.target; + if (n.matches(".action") || n.matches(".action *")) { + n = n.closest(".action"); + for (var r = parseInt(n.dataset.id), i = 0, o = t.it.length; i < o; i++) if (t.it[i].id === r) return "function" == typeof t.it[i].g && t.it[i].V() && t.it[i].g(t.it[i], e), t.it[i]; + for (var s = 0, a = t.rt.length; s < a; s++) if (t.rt[s].click(r, e)) return t.rt[s] + } + return null } - oldDiff[oldDiffIndex] = newDiff; - } while ((widthDiff > (1 - scale) * containerWidth || ignoreWidth) && (heightDiff > (1 - scale) * containerHeight || ignoreHeight)); - - currentFontSize -= margin; - fontElement.style.fontSize = ((setFontSize) ? currentFontSize + "px" : beforeFontSize); - - if (!hasNoTransitionClass) { - await new Promise((r) => { - setTimeout(r, 50); - }); - container.classList.remove("no-transition"); } - - return currentFontSize; - } -} - -class AudioChain { - - constructor(context, sourceBuffer, chainFunction) { - this.buffer = sourceBuffer; - this.shouldLoop = false; - this.loopStart = null; - this.loopEnd = null; - this.chainFunction = chainFunction; - this.context = context; - - this.startTime = null; - this.pauseTime = null; - this.source = null; - - this.running = false; + }, { + key: "ct", value: function (t) { + var e = document.createElement("a"); + if ("string" == typeof t.g && (e.href = t.g), v.R(t.J())) { + var n = document.createElement("img"); + n.src = t.J(), n.classList.add("action-image"), t.I() && (n.dataset.translationTitle = t.title), e.appendChild(n) + } + var r = t.D(); + return r = t.I() ? d.pt(r) : document.createTextNode(r), e.appendChild(r), this.ft(e, t) + } + }, { + key: "ft", value: function (t, e) { + var n = document.createElement("li"); + return n.classList.add("action"), "" !== e.M.trim() && n.classList.add(e.M), n.appendChild(t), n.dataset.id = e.id, v.R(e.J()) && n.classList.add("img"), e.O() || n.classList.add("hidden"), e instanceof c && (e.et().ht(), n.appendChild(e.et().St()), n.classList.add("is-dropdown-submenu-parent"), n.classList.add("opens-right")), n + } + }, { + key: "ut", value: function () { + this.it = this.it.sort(function (t, e) { + return t.order - e.order + }) + } + }, { + key: "wt", value: function (t) { + for (var e = [], n = 0; n < this.ot.length; n++) { + var r = this.ot[n].querySelector('[data-id="' + t.$() + '"]'); + v.Mt(r) || e.push(r) + } + return e + } + }, { + key: "G", value: function (t) { + var e = this.wt(t); + if (0 !== e.length) { + var n = this.ct(t); + t.dt = n; + for (var r = 0; r < e.length; r++) e[r].replaceWith(v.cloneNode(n)) + } + } + }, { + key: "U", value: function (t) { + var e = this.it.indexOf(t); + if (e > 0) { + this.it.splice(e, 1); + for (var n = this.wt(t), r = 0, i = n.length; r < i; r++) n[r].remove(); + if (t instanceof c) { + var o = this.rt.indexOf(t.et()); + this.rt.splice(o, 1) + } + } + } + }, { + key: "j", value: function () { + this.ht() + } + }]), t +}(); +h.Y = "always", h.S = "medium", h.Ht = "smedium", h.Z = "large", h.tt = "never"; +var f = function () { + function t() { + var e; + s(this, t); + var n = document.createElement("ul"); + return n.classList.add("menu"), n.classList.add("vertical"), n.classList.add("submenu"), n.classList.add("is-dropdown-submenu"), n.classList.add("first-sub"), (e = i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, n))).yt = null, e.isOpen = !1, e } - setBuffer(buffer) { - this.buffer = buffer; + return o(t, h), n(t, [{ + key: "K", value: function (n) { + (n = e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "K", this).call(this, v.m(n, new t))).ot = []; + for (var r = 0, i = this.ot.length; r < i; r++) n.ot.push(v.cloneNode(this.ot[r])); + return n.yt = this.yt, n.isOpen = this.isOpen, n + } + }, { + key: "st", value: function (t) { + this.yt = t + } + }, { + key: "ht", value: function () { + var n = this; + e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "ht", this).call(this), v.R(this.ot) && function () { + for (var t = n, e = 0; e < n.ot.length; e++) { + var r = document.createElement("div"); + r.classList.add("close-listener"), r.onclick = function (e) { + console.log(e), t.close() + }, n.ot[e].insertBefore(r, n.ot[e].firstElementChild) + } + }() + } + }, { + key: "St", value: function () { + return this.ot[0] + } + }, { + key: "gt", value: function () { + return function () { + } + } + }, { + key: "click", value: function (t, e) { + for (var n = 0, r = this.it.length; n < r; n++) if (this.it[n].id === t) return "function" == typeof this.it[n].g && this.it[n].V() && this.it[n].g(this.it[n], e), this.close(), !0; + return !1 + } + }, { + key: "toggle", value: function () { + this.isOpen ? this.close() : this.open() + } + }, { + key: "open", value: function () { + this.isOpen = !0; + for (var t = 0, e = this.ot.length; t < e; t++) this.ot[t].classList.add("js-dropdown-active"); + v.R(this.yt) && this.yt.j() + } + }, { + key: "close", value: function () { + this.isOpen = !1; + for (var t = 0, e = this.ot.length; t < e; t++) this.ot[t].classList.remove("js-dropdown-active"); + v.R(this.yt) && this.yt.j() + } + }]), t +}(), p = function () { + function t() { + s(this, t), this.vt = indexedDB || mozIndexedDB || webkitIndexedDB || msIndexedDB, this.Pt = 3; + var e = this; + this.Tt = new Promise(function (t, n) { + var r = e.vt.open("Translator", e.Pt); + r.onupgradeneeded = function (t) { + var n = t.target.result; + e.Lt(n) + }, r.onsuccess = function (e) { + var n = e.target.result; + t(n) + }, r.onerror = function (t) { + n(t) + } + }).catch(function (t) { + console.error(t) + }) } - setLooping(shouldLoop, loopStart, loopEnd) { - this.shouldLoop = shouldLoop; - - if (Helper.isNotNull(loopStart)) { - this.loopStart = loopStart; + return n(t, [{ + key: "Lt", value: function (t) { + try { + t.deleteObjectStore("currentLang"), t.deleteObjectStore("translations") + } catch (t) { + console.warn(t) + } + t.createObjectStore("currentLang", {keyPath: "id"}), t.createObjectStore("translations", {keyPath: ["lang", "key"]}).createIndex("lang", "lang", {unique: !1}) } - if (Helper.isNotNull(loopEnd)) { - this.loopEnd = loopEnd; + }, { + key: "bt", value: function (e) { + this.Tt.then(function (n) { + t.At(["currentLang"], "readwrite", n).objectStore("currentLang").put({id: 1, lang: e}) + }).catch(function (t) { + console.error(t) + }) } + }, { + key: "Ct", value: function (e, n) { + return this.Tt.then(function (r) { + return new Promise(function (i) { + var o = t.At(["translations"], "readwrite", r), s = o.objectStore("translations"); + for (var a in n) s.put({lang: e, key: a, translation: n[a]}); + o.oncomplete = function () { + i() + } + }) + }).catch(function () { + }) + } + }, { + key: "kt", value: function (e) { + return this.Tt.then(function (n) { + return new Promise(function (r) { + var i = t.At(["translations"], "readonly", n), o = {}; + i.objectStore("translations").index("lang").openCursor(IDBKeyRange.only(e)).onsuccess = function (t) { + var e = t.target.result; + if (e) { + var n = e.value; + o[n.key] = n.translation, e.continue() + } + }, i.oncomplete = function () { + r(o) + } + }) + }).catch(function (t) { + return console.error(t), {} + }) + } + }, { + key: "Ft", value: function () { + return this.Tt.then(function (e) { + return new Promise(function (n) { + var r = t.At(["currentLang"], "readonly", e).objectStore("currentLang").get(1); + r.onsuccess = function (t) { + var e = t.currentTarget.result; + n(e ? e.lang : null) + }, r.onerror = function () { + n(null) + } + }) + }).catch(function () { + }) + } + }], [{ + key: "At", value: function (t, e, n) { + var r = null; + try { + r = n.transaction(t, e) + } catch (e) { + console.warn(e), r = n.transaction(t) + } + return r + } + }]), t +}(), d = function () { + function e() { + s(this, e), this.xt = [], this.Bt = new p, this.Dt = null, this.It = e.Rt, this.Ut = e.Et, this.Wt = e.Nt, this.Ot = e._t, this.jt = e.Vt; + var t = this; + this.Jt = this.qt().then(function () { + return t.zt() + }) } - async start(delay, offset, duration) { - //sind sonst null, schmeißt in Android 5 einen fehler - delay = Helper.nonNull(delay, 0); - offset = Helper.nonNull(offset, 0); - //Duration darf nicht gesetzt werden - // duration = Helper.nonNull(duration, -1); - - let source = this.context.createBufferSource(); - - source.loop = this.shouldLoop; - if (Helper.isNotNull(this.loopStart)) { - source.loopStart = this.loopStart; + return n(e, [{ + key: "$t", value: function (t) { + var e = this; + return fetch(v.Gt(this.Wt + t + ".json")).then(function (t) { + return t.json() + }).then(function (n) { + e.xt[t] = Object.assign(n, e.xt[t]), e.Bt.Ct(t, e.xt[t]) + }).catch(function (e) { + console.error("could not load lang " + t + " because of error: ", e) + }) } - if (Helper.isNotNull(this.loopEnd)) { - source.loopEnd = this.loopEnd; + }, { + key: "qt", value: function () { + var t = this; + return this.$t(this.Ut).then(function () { + t.Dt = t.Ut, "undefined" != typeof document && document.getElementsByTagName("html")[0].setAttribute("lang", t.Ut) + }) } - source.buffer = this.buffer; - await this.chainFunction(source); - - if (Helper.isNull(duration)){ - source.start(delay, offset); + }, { + key: "bt", value: function (t) { + if (this.Dt === t) return this.Xt(), Promise.resolve(); + if (-1 === this.It.indexOf(t)) return Promise.resolve(); + this.Dt = t, "undefined" != typeof localStorage && localStorage.setItem("language", t), this.Bt.bt(t); + var e = this; + return this.$t(t).then(function () { + "undefined" != typeof document && document.getElementsByTagName("html")[0].setAttribute("lang", t), e.Xt() + }) } - else{ - source.start(delay, offset, duration); + }, { + key: "translate", value: function (n, r) { + "object" == (void 0 === n ? "undefined" : t(n)) && v.R(n) && (n = this.Qt(n)); + var i = null; + return v.R(this.xt[this.Dt]) && v.R(this.xt[this.Dt][n]) && (i = this.xt[this.Dt][n]), v.Mt(i) && (e.Yt && console.warn("missing translation for language " + this.Dt + " and key " + n), v.R(this.xt[this.Ut]) && (i = this.xt[this.Ut][n]), v.Mt(i) && (e.Yt && console.error("missing base translation for key " + n + ". FIX IT"), i = n), this.Ot && (i = ">>" + i + "<<")), this.jt && (i = "$" + i + "$"), void 0 !== r && (i = i.format(r)), i } - this.startTime = (new Date()).getTime() - (Helper.nonNull(offset, 0) * 1000); - this.source = source; - this.running = true; + }, { + key: "Qt", value: function (t) { + var e = t.key; + for (var n in delete t.key, t) t.hasOwnProperty(n) && (v.Mt(this.xt[n]) && (this.xt[n] = {}), this.xt[n][e] = t[n]); + return e + } + }, { + key: "Xt", value: function () { + if ("undefined" != typeof document) for (var t = document.querySelectorAll("[data-translation]"), e = 0, n = t.length; e < n; e++) { + if ("" != t[e].dataset.translation) try { + t[e].innerHTML = this.translate(t[e].dataset.translation, void 0 !== t[e].dataset.translationArgs ? JSON.parse(t[e].dataset.translationArgs) : void 0) + } catch (t) { + console.error("wrong configured translation: " + t) + } + for (var r in t[e].dataset) if (r.startsWith("translation") && !r.endsWith("Args")) try { + t[e][r.substr(11).toLowerCase()] = this.translate(t[e].dataset[r], void 0 !== t[e].dataset[r + "Args"] ? JSON.parse(t[e].dataset[r + "Args"]) : void 0) + } catch (t) { + console.error("wrong configured translation: " + t) + } + } + } + }, { + key: "zt", value: function () { + var t = localStorage.getItem("language"); + if (v.Mt(t) || -1 === this.It.indexOf(t)) { + var e = []; + if (v.R(navigator.languages) && (e = navigator.languages.slice(0)), void 0 !== navigator.language && e.push(navigator.language), e.push(this.Ut), void 0 !== e) for (var n = 0, r = e.length; n < r; n++) if (-1 !== this.It.indexOf(e[n])) { + t = e[n]; + break + } + } + return this.bt(t.toLowerCase()) + } + }], [{ + key: "bt", value: function (t) { + var n = e.Kt(); + if (n) return n.bt(t) + } + }, { + key: "translate", value: function (t, n) { + var r = e.Kt(); + return r ? r.translate(t, n) : "" + } + }, { + key: "Qt", value: function (t) { + var n = e.Kt(); + if (n) return n.Qt(t) + } + }, { + key: "pt", value: function (n, r, i) { + if (i = v.m(i, "span"), "object" == (void 0 === n ? "undefined" : t(n)) && (n = e.Qt(n)), "undefined" != typeof document) { + var o = document.createElement(i); + return o.dataset.translation = n, void 0 !== r && (o.dataset.translationArgs = JSON.stringify(r)), o.innerHTML = e.translate(n, r), o + } + } + }, { + key: "Zt", value: function () { + var t = new f; + return t.at(new l("en", function () { + e.Kt().bt("en") + })), t.at(new l("de", function () { + e.Kt().bt("de") + })), new c("current-lang", t, h.Y) + } + }, { + key: "init", value: function () { + e.te = new e + } + }, { + key: "Kt", value: function () { + return e.te + } + }]), e +}(); +d.Yt = !1, d.te = null, d.Et = "en", d.Rt = ["de", "en"], d._t = !0, d.Vt = !1, d.Nt = "js/lang/", d.ee = null, d.ne = {}, u.l("Translator.setLanguage", d.bt); +var v = function () { + function e() { + s(this, e) } - async stop(delay) { - if (Helper.isNotNull(this.source)) { - delay = Helper.nonNull(delay, 0); - - this.pauseTime = ((new Date()).getTime()) - this.startTime; - this.running = false; - return this.source.stop(delay); + return n(e, null, [{ + key: "init", value: function () { + e.se = null, e.ie = null } - return null; - } - - async resume() { - - if (!this.running) { - return this.start(null, Helper.nonNull(this.pauseTime, 0) / 1000.0); + }, { + key: "lt", value: function (t, e, n) { + return -1 === t.indexOf(e, n) } - } -} - -class SoundManager { - static getInstance() { - if (Helper.isNull(SoundManager.instance)) { - SoundManager.instance = new SoundManager(); + }, { + key: "includes", value: function (t, n, r) { + return !e.lt(t, n, r) } - return SoundManager.instance; - } - - constructor() { - this.channels = {}; - this.context = new AudioContext(); - this.context.onstatechange = function () { - console.log("stateChange from context", arguments); - }; - this.context.oncomplete = function () { - console.log("onComplete from context", arguments); - }; - - window.addEventListener("visibilitychange", () => { - this.handleVisibilityChange(); - }); - } - - isNotSuspended(){ - // return false; - return this.context.state !== "suspended"; - } - - set(options, channel) { - channel = Helper.nonNull(channel, SoundManager.CHANNELS.DEFAULT); - let audioObject = Helper.nonNull(this.channels[channel], {}); - - if (typeof options === "string") { - options = {audio: options}; + }, { + key: "re", value: function () { + if (arguments.length > 0) { + var t = arguments[0], n = Array.prototype.slice.call(arguments, 1); + return e.R(t) && (0 === n.length || e.re.apply(null, [t[n[0]]].concat(n.slice(1)))) + } + return !1 } - - let audio = options.audio; - if (Helper.isNotNull(audio)) { - audioObject.loadedPromise = fetch(audio).then(res => res.arrayBuffer()).then(arrayBuffer => { - return new Promise((r) => this.context.decodeAudioData(arrayBuffer, r)); - }).catch(e => console.error(e)); - this.stop(channel); + }, { + key: "Mt", value: function (t) { + return null === t || void 0 === t } - audioObject.muted = Helper.nonNull(options.muted, audioObject.muted, false); - audioObject.volume = Helper.nonNull(options.volume, audioObject.volume, 1); - audioObject.loop = Helper.nonNull(options.loop, audioObject.loop, false); - audioObject.timeOffset = Helper.nonNull(options.timeOffset, audioObject.timeOffset, 0); - this.channels[channel] = audioObject; - - if (audioObject.muted) { - this.stop(channel); + }, { + key: "R", value: function (t) { + return !e.Mt(t) } - - return this.channels[channel]; - } - - async resumeContext(){ - if (typeof this.context.resume === "function") { - return this.context.resume(); + }, { + key: "m", value: function () { + for (var t = 0; t < arguments.length; t++) if (e.R(arguments[t])) return arguments[t]; + return null } - } - - async play(channel, audioOrOptions) { - this.resumeContext(); - channel = Helper.nonNull(channel, SoundManager.CHANNELS.DEFAULT); - if (Helper.isNull(audioOrOptions)) { - audioOrOptions = {}; - } else if (!(typeof audioOrOptions === "object")) { - audioOrOptions = { - audio: audioOrOptions + }, { + key: "oe", value: function (t) { + return !e.empty(t) + } + }, { + key: "ae", value: function (t) { + var e = []; + for (var n in t) e.push(encodeURIComponent(n) + "=" + encodeURIComponent(t[n])); + return "?" + e.join("&") + } + }, { + key: "empty", value: function (t) { + return e.Mt(t) || "string" == typeof t && "" === t.trim() + } + }, { + key: "le", value: function (t) { + var e = document.createElement("template"); + return e.innerHTML = t, e.content.childNodes + } + }, { + key: "he", value: function () { + var t = "http://www.w3.org/2000/svg", e = document.createElement("div"); + e.className = "loader"; + var n = document.createElementNS(t, "svg"); + n.setAttribute("viewBox", "0 0 32 32"), n.setAttribute("widh", "32"), n.setAttribute("height", "32"); + var r = document.createElementNS(t, "circle"); + return r.setAttribute("id", "spinner"), r.setAttribute("cx", "16"), r.setAttribute("cy", "16"), r.setAttribute("r", "14"), r.setAttribute("fill", "none"), n.appendChild(r), e.appendChild(n), e + } + }, { + key: "Gt", value: function (t) { + return m.ue() + t + } + }, { + key: "ce", value: function () { + return navigator.userAgent.match(/iPhone|iPad|iPod/i) + } + }, { + key: "de", value: function () { + return null !== navigator.userAgent.match(/Android|BlackBerry|Opera Mini|IEMobile/i) || e.ce() || void 0 !== window.orientation || !1 === window.orientation || null === window.orientation + } + }, { + key: "select", value: function (t) { + var e = document.createRange(); + e.selectNodeContents(t); + var n = window.getSelection(); + n.removeAllRanges(), n.addRange(e) + } + }, { + key: "format", value: function (t, e) { + for (t = "" + t; t.length < e;) t = "0" + t; + return t + } + }, { + key: "cloneNode", value: function (t) { + var e = t.cloneNode(!0); + return e.onclick = t.onclick, e + } + }, { + key: "me", value: function (t, e) { + for (var n = "", r = Math.floor(Math.log(265) / Math.log(e)), i = 0; i < t.length; i++) { + var o = t.charCodeAt(i).toString(e), s = o.length % r; + s > 0 && (o = new Array(r + 1 - s).join("0") + o), n += o + } + return n + } + }, { + key: "ge", value: function (t, e) { + for (var n = Math.floor(Math.log(265) / Math.log(e)), r = t.match(new RegExp(".{1," + n + "}", "g")) || [], i = "", o = 0, s = r.length; o < s; o++) i += String.fromCharCode(parseInt(r[o], e)); + return i + } + }, { + key: "pe", value: function (t) { + return "none" === t.style.display ? (t.style.display = "", !0) : (t.style.display = "none", !1) + } + }, { + key: "print", value: function (t) { + var e = document.getElementById("print-content"); + t instanceof Element ? (e.removeAllChildren(), e.appendChild(t)) : e.innerHTML = t, window.print() + } + }, { + key: "fe", value: function (t, n, r) { + n instanceof Date || (n = new Date(n)); + var i = (r = e.m(r, !1)) ? n.getUTCDay() : n.getDay(), o = r ? n.getUTCDate() : n.getDate(), + s = r ? n.getUTCMonth() : n.getMonth(), a = r ? n.getUTCFullYear() : n.getFullYear(), + u = r ? n.getUTCHours() : n.getHours(), + l = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + c = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + h = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334], f = function () { + var t = new Date(n); + return t.setDate(o - (i + 6) % 7 + 3), t + }, p = function (t, e) { + return ("" + (Math.pow(10, e) + t)).slice(1) + }; + return t.replace(/%[a-z]/gi, function (t) { + return { + "%a": d.pt(l[i].slice(0, 3)).outerHTML, + "%A": d.pt(l[i]).outerHTML, + "%b": d.pt(c[s].slice(0, 3)).outerHTML, + "%B": d.pt(c[s]).outerHTML, + "%c": n.toUTCString(), + "%C": Math.floor(a / 100), + "%d": p(o, 2), + "%e": o, + "%f": p(n.getTime() % 1e3, 4), + "%F": n.toISOString().slice(0, 10), + "%G": f().getFullYear(), + "%g": ("" + f().getFullYear()).slice(2), + "%H": p(u, 2), + "%I": p((u + 11) % 12 + 1, 2), + "%j": p(h[s] + o + (s > 1 && 0 == (3 & a) && (a % 100 != 0 || a % 400 == 0) ? 1 : 0), 3), + "%k": "" + u, + "%l": (u + 11) % 12 + 1, + "%m": p(s + 1, 2), + "%M": p(n.getMinutes(), 2), + "%p": u < 12 ? "AM" : "PM", + "%P": u < 12 ? "am" : "pm", + "%s": Math.round(n.getTime() / 1e3), + "%S": p(n.getSeconds(), 2), + "%u": i || 7, + "%V": function () { + var t = f(), e = t.valueOf(); + t.setMonth(0, 1); + var n = t.getDay(); + return 4 !== n && t.setMonth(0, 1 + (4 - n + 7) % 7), p(1 + Math.ceil((e - t) / 6048e5), 2) + }(), + "%w": "" + i, + "%x": n.toLocaleDateString(), + "%X": n.toLocaleTimeString(), + "%y": ("" + a).slice(2), + "%Y": a, + "%z": n.toTimeString().replace(/.+GMT([+-]\d+).+/, "$1"), + "%Z": n.toTimeString().replace(/.+\((.+?)\)$/, "$1") + }[t] || t + }) + } + }, { + key: "Se", value: function (n) { + var r = void 0; + if (e.Mt(n) || "object" != (void 0 === n ? "undefined" : t(n))) return n; + if (n instanceof Array) { + var i = []; + for (r = 0; r < n.length; ++r) i[r] = e.Se(n[r]); + return i + } + if (n instanceof Date) return new Date(n.getTime()); + var o = {}; + for (r in n) o[r] = e.Se(n[r]); + return o + } + }, { + key: "we", value: function (t) { + var n = { + "&": "&", + "&": "&", + "<": "<", + ">": ">", + """: '"', + "'": "'", + "’": "’", + "‘": "‘", + "–": "–", + "—": "—", + "…": "…", + "”": "”" }; + return e.R(t) && "function" == typeof t.replace ? t.replace(/\&[\w\d\#]{2,5}\;/g, function (t) { + return n[t] + }) : t } - audioOrOptions.timeOffset = Helper.nonNull(audioOrOptions.timeOffset, 0); - - this.stop(channel); - this.set(audioOrOptions, channel); - - if (!this.channels[channel].muted) { - let buffer = await this.channels[channel].loadedPromise; - let source = new AudioChain(this.context, buffer, (sourceNode) => { - let gain = this.context.createGain(); - gain.gain.value = this.channels[channel].volume; - - sourceNode.connect(gain); - gain.connect(this.context.destination); - }); - - source.setBuffer(buffer); - - //to prevent gap in mp3-files - source.setLooping(this.channels[channel].loop, 0.3, buffer.duration - 0.3); - - this.channels[channel].source = source; - await source.start(); + }, { + key: "Me", value: function (t) { + var e = new FormData; + for (var n in t) e.set(n, t[n]); + return e } - return this.channels[channel]; - } - - stop(channel) { - channel = Helper.nonNull(channel, SoundManager.CHANNELS.DEFAULT); - - - let oldAudio = this.channels[channel]; - if (Helper.isNotNull(oldAudio) && Helper.isNotNull(oldAudio.source)) { - oldAudio.source.stop(); + }, { + key: "He", value: function (t, n) { + var r = window.getComputedStyle(t), i = window.getComputedStyle(n); + if (i.height > r.height || i.width > r.width) return e.ye(t, n) } - } - - get(channel) { - channel = Helper.nonNull(channel, SoundManager.CHANNELS.DEFAULT); - return this.channels[channel]; - } - - async resume(channel) { - channel = Helper.nonNull(channel, SoundManager.CHANNELS.DEFAULT); - if (Helper.isNotNull(this.channels[channel]) && !this.channels[channel].muted && Helper.isNotNull(this.channels[channel].source)) { - return this.channels[channel].source.resume(); - } - } - - stopAll(){ - for (let k in this.channels) { - if (Helper.isNotNull(this.channels[k].source)) { - this.channels[k].source.stop(); + }, { + key: "ye", value: function (t, n) { + e.ve(t); + for (var r = window.getComputedStyle(t), i = window.getComputedStyle(n), o = 0, s = parseFloat(i.getPropertyValue("font-size")), a = i.width, u = i.height; i.height > r.height || i.width > r.width;) if (s *= .95, u > r.height && (u *= .95), a > i.width && (a *= .95), n.style["font-size"] = s + "px", n.style["max-height"] = u + "px", n.style["max-width"] = a + "px", ++o > 2e3) { + console.log("breaked"); + break } + e.Pe(n), i = window.getComputedStyle(n), n.style["font-size"] = parseFloat(i.getPropertyValue("font-size")) / parseFloat(document.documentElement.clientHeight) * 100 + "vh" } - } - - resumeAllIfNotMuted(){ - for (let k in this.channels) { - if (Helper.isNotNull(this.channels[k]) && !this.channels[k].muted && Helper.isNotNull(this.channels[k].source)) { - this.channels[k].source.resume(); - } + }, { + key: "ve", value: function (t) { + for (var n = t.childNodes, r = 0, i = n.length; r < i; r++) n[r] instanceof Element && (e.Pe(n[r]), e.ve(n[r])) } - } - - handleVisibilityChange() { - if (document.hidden) { - this.stopAll(); + }, { + key: "Pe", value: function (t) { + var e = t.classList.contains("no-transtition"); + t.classList.add("no-transition"); + var n = t.parentNode; + console.log(t); + var r = window.getComputedStyle(t), i = window.getComputedStyle(n), + o = parseFloat(r.getPropertyValue("font-size")) / parseFloat(i.getPropertyValue("font-size")), + s = r.height, a = r.width, u = i.height, l = i.width, c = t.style; + c["max-height"] = Math.floor(s / u * 100) + "%", c["margin-left"] = Math.floor(parseFloat(r.getPropertyValue("margin-left")) / l * 100) + "%", c["margin-right"] = Math.floor(parseFloat(r.getPropertyValue("margin-right")) / l * 100) + "%", c["margin-top"] = Math.floor(parseFloat(r.getPropertyValue("margin-top")) / u * 100) + "%", c["margin-bottom"] = Math.floor(parseFloat(r.getPropertyValue("margin-bottom")) / u * 100) + "%", c["max-width"] = Math.floor(a / l * 100) + "%", c["font-size"] = o + "em", e || t.classList.remove("no-transition") } - else { - this.resumeAllIfNotMuted(); + }, { + key: "Te", value: function () { + var t = window.chrome, e = window.navigator, n = e.vendor, r = e.userAgent.indexOf("OPR") > -1, + i = e.userAgent.indexOf("Edge") > -1; + return !!e.userAgent.match("CriOS") || null !== t && void 0 !== t && "Google Inc." === n && !1 === r && !1 === i } - } -} - -SoundManager.CHANNELS = { - MUSIC: "music", - SOUND: "sound", - DEFAULT: "default" -}; - -InitPromise.addPromise(() => { - PauseSite.onPauseListeners.push(() => { - SoundManager.getInstance().stopAll(); - }); - PauseSite.onStartListeners.push(() => { - SoundManager.getInstance().resumeAllIfNotMuted(); - }); -}); - -class Code { - constructor(args) { - if (typeof args === "string") { - args = { - "code": args - }; + }, { + key: "Le", value: function (t, e) { + for (var n = {}, r = 0, i = t.length; r < i; r++) n[t[r][e]] = t[r]; + return n } - this.args = args; - this.isCacheable = false; - } - - setIsCacheable(isCacheable) { - this.isCacheable = isCacheable; - } - - getIsCacheable() { - return this.isCacheable; - } - - activate() { - return DataManager.send("c/code", this.args); - } -} - -class CodeSite extends AbstractSite { - constructor(siteManager) { - super(siteManager, "core/html/load.html", "code"); - } - - onConstruct(args) { - super.onConstruct(args); - console.log(args); - - let resPromise = Promise.resolve(); - if (Helper.isNotNull(args["code"])) { - let code = args["code"]; - let isCachable = Helper.nonNull(args["cachable"], false); - - let codeObject = new Code(code); - codeObject.setIsCacheable(isCachable); - - let self = this; - resPromise = codeObject.activate().then(function (res) { - if (!res["success"]) { - FlashMessenger.addMessage(FlashMessenger.MESSAGE_TYPE_SUCCESS, Translator.translate(res["errors"][0])); - } - else { - FlashMessenger.addMessage(FlashMessenger.MESSAGE_TYPE_SUCCESS, Translator.translate(Helper.nonNull(res["result"]["successMessage"], "code-activated"))); - } - self.finish(); - }); + }, { + key: "be", value: function (t) { + var e = {}; + for (var n in t) t.hasOwnProperty(n) && (e[t[n]] = n); + return e } - } -} - -InitPromise.addPromise(function (app) { - app.addDeepLink("code", CodeSite); -}); - -class ContactSite extends AbstractSite{ - constructor(siteManager) { - super(siteManager, 'contact/html/contact.html', ContactSite.DEEP_LINK); - } - - onFirstStart() { - new Form(this.findBy("#contact-form"), "contact", "post").onSubmit((d) => { - FlashMessenger.addMessage("contact-message-sent"); - this.finish(); - }); - - super.onFirstStart(); - } -} -ContactSite.DEEP_LINK = "contactMe"; - -InitPromise.addPromise((app) => { - if (ContactSite.DEEP_LINK){ - app.addDeepLink(ContactSite.DEEP_LINK, ContactSite); - } -}); - -class WordRotatorBaseSite extends AbstractSite { - // createActionBarMenu(menu) { - // menu = super.createActionBarMenu(menu); - // // menu.addAction(SettingsSite.settingsAction.copy()); - // // let actions = menu.actions; - // // for (let i = 0; i < actions.length; i++) { - // // if (actions[i].title === "login" || actions[i].title === "registration"){ - // // actions[i].setVisible(false); - // // } - // // } - // return menu; - // } -} - -class TemplateContainer{ - constructor(leafTemplate, parentTemplate, rowTemplate, triangleTemplate){ - this.leafTemplate = leafTemplate; - this.parentTemplate = parentTemplate; - this.rowTemplate = rowTemplate; - this.triangleTemplate = triangleTemplate; - } - - copyLeafTemplate() - { - return Helper.cloneNode(this.leafTemplate); - } - - copyParentTemplate() - { - return Helper.cloneNode(this.parentTemplate); - } - - copyRowTemplate() - { - return Helper.cloneNode(this.rowTemplate); - } - - copyTriangleTemplate() - { - return Helper.cloneNode(this.triangleTemplate); - } -} - -class Segment{ - constructor(element){ - this.rotation = 0; - this.element = element; - this.parent = null; - } - - getCurrentRotations(rotations){ - return rotations; - } - - sameAs(otherSegment){ - return false; - } - - setParent(parent) - { - this.parent = parent; - } - - getLevel() - { - if (this.parent!==null) - { - return this.parent.getLevel(); + }, { + key: "toArray", value: function (t) { + var e = []; + for (var n in t) e.push(t[n]); + return e } + }]), e +}(); +v.init(); +var m = function () { + function t() { + s(this, t) } - canRotate(){ - return false; - } - - isSolved(){ - return (this.rotation === 0); - } - - async rotate(){ - return Promise.resolve(); - }; - - _updateElement(){}; - - applyRotations(rotations){ - return rotations; - } - - applyLocks(locks) - { - return locks; - } - - getCurrentLocked(lockedArray){ - return lockedArray; - } - - getElement() - { - return this.element; - } -} - -class LeafSegment extends Segment { - - constructor(element, leaf) { - super(element); - this.leaf = 'A'; - if (Helper.isNotNull(leaf)) { - this.setLeaf(leaf); + return n(t, null, [{ + key: "Ae", value: function (e) { + t.Ce = e } - } - - sameAs(otherSegment) { - // debugger; - return (otherSegment instanceof LeafSegment && otherSegment.leaf === this.leaf); - } - - setLeaf(leaf) { - this.leaf = leaf; - } - - _updateElement() { - this.element.querySelector(".leaf-element").removeAllChildren().appendChild(document.createTextNode(this.leaf)); - } -} - -class ParentSegment extends Segment { - static initListener() { - window.addEventListener("mousedown", (e) => { - ParentSegment.mouseDownTarget = e.target; - ParentSegment.clickPosition = {x: e.pageX, y: e.pageY}; - }); - window.addEventListener("mouseup", (e) => { - ParentSegment.mouseDownTarget = null; - ParentSegment.clickPosition = {}; - }); - - window.addEventListener("touchstart", (e) => { - if (e.targetTouches.length === 1) { - ParentSegment.mouseDownTarget = e.targetTouches[0].target; - ParentSegment.clickPosition = {x: e.targetTouches[0].pageX, y: e.targetTouches[0].pageY}; - } - // else if (Array.isArray(e.path) && e.path.length >= 1) { - // ParentSegment.mouseDownTarget = e.path[0]; - // ParentSegment.clickPosition = null; - // } - }); - window.addEventListener("touchend", (e) => { - ParentSegment.mouseDownTarget = null; - ParentSegment.clickPosition = {}; - }); - } - - setIsRotatable(rotatable) { - this.rotatable = rotatable; - this._updateElement(); - } - - constructor(element) { - super(element); - this.children = []; - this.class = "rotate-0"; - this.rotatable = true; - - this.userRotationDelta = 100; - this.lastUserRotation = 0; - - let self = this; - this.touchendListener = function (e) { - let now = new Date().getTime(); - - // console.log("touchendListener", e,now, self.lastUserRotation); - let target = null; - let position = null; - - if (e.changedTouches.length >= 1) { - target = document.elementFromPoint(e.changedTouches[0].pageX, e.changedTouches[0].pageY); - position = {x: e.changedTouches[0].pageX, y: e.changedTouches[0].pageY}; - } - if (target != null && e.targetTouches.length === 0 && self.element.contains(ParentSegment.mouseDownTarget) && self.element.contains(target)) { - e.stopPropagation(); - e.preventDefault(); - if (self.lastUserRotation+self.userRotationDelta > now){ - return; - } - self.getLevel().segmentClickedListener(self); - self.rotate(ParentSegment.mouseDownTarget, target, ParentSegment.clickPosition, position); - // console.log("touchendListener stopped event", e); - - self.lastUserRotation = new Date().getTime(); - } - }; - this.mouseupListener = function (e) { - let now = new Date().getTime(); - // console.log("mouseupListener", e,now, self.lastUserRotation); - - if (ParentSegment.mouseDownTarget !== null && self.element.contains(ParentSegment.mouseDownTarget) && self.element.contains(e.target)) { - let position = {x: e.pageX, y: e.pageY}; - e.stopPropagation(); - e.preventDefault(); - if (self.lastUserRotation+self.userRotationDelta > now){ - return; - } - self.getLevel().segmentClickedListener(self); - self.rotate(ParentSegment.mouseDownTarget, e.target, ParentSegment.clickPosition, position); - // console.log("mouseupListener stopped event", e); - self.lastUserRotation = new Date().getTime(); - } - }; - } - - canRotate() { - return (this.rotatable && !this.getLevel().getHasWon()); - } - - async rotate(firstElem, secondElem, firstPosition, secondPosition) { - const timeout = 250; - const clickTolerance = 5; - - let rotationDirection = 1; - if (Helper.isNotNull(secondElem) && Helper.isNotNull(firstElem) && - (Helper.isNull(firstPosition) || Helper.isNull(secondPosition) || - Math.abs(firstPosition.x - secondPosition.x) > clickTolerance || - Math.abs(firstPosition.y - secondPosition.y) > clickTolerance)) { - - let firstIndex = -1; - let secondIndex = -1; - let rotationIndexes = [0, 1, 3, 2]; - for (let i = 0; i < this.children.length; i++) { - if (this.children[rotationIndexes[i]].element === firstElem || this.children[rotationIndexes[i]].element.contains(firstElem)) { - firstIndex = (i + this.rotation / 90) % 4; - } - if (this.children[rotationIndexes[i]].element === secondElem || this.children[rotationIndexes[i]].element.contains(secondElem)) { - secondIndex = (i + this.rotation / 90) % 4; - } - } - - if (firstIndex >= 0 && secondIndex >= 0) { - if (firstIndex === 2 && (secondIndex === 0 || secondIndex === 1) - || firstIndex === 1 && (secondIndex === 0 || secondIndex === 3) - || (firstIndex === 0 && secondIndex === 3) - || (firstIndex === 3 && secondIndex === 2)) { - rotationDirection = -1; - } - } + }, { + key: "ue", value: function () { + return t.Ce } - - if (this.canRotate()) { - this.rotation += 360 + 90 * rotationDirection; - this.rotation %= 360; - - let currentRotation = this.rotation; - - this._updateRotationClass(); - this.element.classList.add("rotating"); - if (rotationDirection === -1) { - this.element.classList.add("reverse"); - } - - let delayPromise = new Promise(function (resolve) { - setTimeout(resolve, timeout); - }).then(() => { - if (this.rotation === currentRotation) { - this.element.classList.remove("rotating"); - this.element.classList.remove("reverse"); - } - }); - this.getLevel().checkHasWon(delayPromise); - return delayPromise; + }, { + key: "set", value: function (e, n) { + t.ke[e] = n } - } - - sameAs(otherSegment) { - if (!(otherSegment instanceof ParentSegment) || otherSegment.children.length !== this.children.length) { - return false; + }, { + key: "get", value: function (e, n) { + return v.m(t.ke[e], n) } - for (let i = 0; i < this.children.length; i++) { - if (!this.children[i].sameAs(otherSegment.children[i])) { - return false; - } + }, { + key: "has", value: function (e) { + return v.m(t.ke[e]) } - return true; + }]), t +}(); +m.Ae("/"), m.ke = {}; +var y = function () { + function t() { + s(this, t) } - applyRotations(rotations) { - this.rotation = rotations[0]; - - if (isNaN(this.rotation)) { - this.rotation = 0; + return n(t, null, [{ + key: "init", value: function () { + t.Fe() } - - rotations.splice(0, 1); - for (let i = 0, n = this.children.length; i < n; i++) { - rotations = this.children[i].applyRotations(rotations); - } - return rotations; - } - - applyLocks(locks) { - this.rotatable = locks[0]; - locks.splice(0, 1); - for (let i = 0, n = this.children.length; i < n; i++) { - locks = this.children[i].applyLocks(locks); - } - return locks; - } - - getCurrentRotations(rotations) { - rotations.push(this.rotation); - for (let i = 0, n = this.children.length; i < n; i++) { - rotations = this.children[i].getCurrentRotations(rotations); - } - return rotations; - } - - getCurrentLocked(locked) { - locked.push(this.rotatable); - for (let i = 0, n = this.children.length; i < n; i++) { - locked = this.children[i].getCurrentLocked(locked); - } - return locked; - } - - isSolved(checkChildren) { - checkChildren = Helper.nonNull(checkChildren, true); - if (checkChildren) { - for (let i = 0, n = this.children.length; i < n; i++) { - if (!this.children[i].isSolved()) { - return false; - } - } - } - return (this.rotation === 0 || ( - this.children[0].sameAs(this.children[3]) && this.children[1].sameAs(this.children[2]) && ( - this.rotation === 180 || this.children[0].sameAs(this.children[1])))) - } - - setChildren(children) { - this.children = []; - for (let i = 0, n = children.length; i < n; i++) { - this.addChild(children[i]); - } - } - - addChild(child) { - this.children.push(child); - child.setParent(this); - this._updateElement(); - } - - _updateRotationClass() { - // this.style.transform = "rotate("+this.rotation+"deg)"; - this.element.classList.remove(this.class); - this.class = "rotate-" + this.rotation; - if (this.class === "rotate-0") { - this.class = "rotate-360"; - } - this.element.classList.add(this.class); - } - - _updateElement() { - let layer = this._getLayer(); - if (layer >= 2) { - this.element.classList.add("layer-" + layer); - } - - if (!this.rotatable) { - this.element.classList.add("locked"); - } - - const childContainer = this.element.querySelector(".child-container"); - childContainer.removeAllChildren(); - - this._updateRotationClass(); - - this.element.removeEventListener("mouseup", this.mouseupListener); - this.element.removeEventListener("touchend", this.touchendListener); - - this.element.addEventListener("mouseup", this.mouseupListener); - this.element.addEventListener("touchend", this.touchendListener); - - for (let i = 0, n = this.children.length; i < n; i++) { - this.children[i]._updateElement(); - childContainer.appendChild(this.children[i].getElement()); - if (i % 2 === 1 && this.children.length - 1 !== i) { - childContainer.appendChild(document.createElement("br")); - } - } - } - - _getLayer() { - if (this.children.length >= 1 && this.children[0] && this.children[0] instanceof ParentSegment) { - return this.children[0]._getLayer() + 1; - } - return 1; - } -} - -ParentSegment.initListener(); - -class Level { - constructor(templateContainer) { - this.rootSegment = null; - this.words = []; - this.startRotations = []; - this.templateContainer = templateContainer; - - this.hasWon = false; - this.id = null; - - this.wonResolver = null; - this.giveUpResolver = null; - - const self = this; - this.wonPromise = new Promise((resolve, reject) => { - self.wonResolver = resolve; - self.giveUpResolver = reject; - }); - - this.segmentClickedListener = () => {}; - } - - saveAsCurrentLevel(){ - let rotations = this.getCurrentRotations(); - let locked = this.getCurrentLocked(); - localStorage.setItem("currentLevel", JSON.stringify({"id": this.id, "rotations": rotations, "locks":locked})); - } - - getCurrentLocked(){ - if (this.rootSegment !== null) - { - return this.rootSegment.getCurrentLocked([]); - } - return []; - } - - getCurrentRotations(){ - if (this.rootSegment !== null) - { - return this.rootSegment.getCurrentRotations([]); - } - return []; - } - - setLocks(locks) - { - if (this.rootSegment !== null){ - this.rootSegment.applyLocks(locks); - } - } - - setId(id) - { - this.id = id; - } - - getId() - { - return this.id; - } - - getLevel() - { - return this; - } - - setRootSegment(rootSegment) - { - this.rootSegment = rootSegment; - this.rootSegment.setParent(this); - if (this.startRotations) - { - this.applyRotations(); - } - } - - setWords(words) - { - this.words = []; - for (let i = 0, n = words.length; i < n; i++) { - this.words.push(words[i].toUpperCase()); - } - } - - setStartRotations(rotations) - { - this.startRotations = rotations; - } - - applyRotations(rotations) - { - if (this.rootSegment) - { - rotations = Helper.nonNull(rotations, this.startRotations); - this.rootSegment.applyRotations(rotations); - } - } - - getHasWon() - { - return this.hasWon; - } - - checkHasWon(delayPromise) { - if (this.rootSegment.isSolved()){ - this.hasWon = true; - const self = this; - Promise.resolve(delayPromise).then(()=>{ - self.wonResolver(true); - }); - return true; - } - this.saveAsCurrentLevel(); - return false; - } - - getWonPromise(){ - return this.wonPromise; - } - - getRootSegment(){ - return this.rootSegment; - } - - createSegments() {}; - - getRotatableSegments(){ - return Level._getRotatableSegmentsFrom(this.rootSegment); - } - - setSegmentClickedListener(listener){ - this.segmentClickedListener = listener; - } - - static _getRotatableSegmentsFrom(segment){ - let rotatable = []; - if (segment.canRotate()) - { - rotatable.push(segment); - } - if (segment instanceof ParentSegment){ - for (let i = 0; i < segment.children.length; i++) { - rotatable.push.apply(rotatable, Level._getRotatableSegmentsFrom(segment.children[i])); - } - } - return rotatable; - } - - static _createLeafsForWord(word, leafSegmentTemplate) - { - let leafSegments = []; - for (let i = 0, n = word.length; i < n; i++) { - leafSegments.push(new LeafSegment(Helper.cloneNode(leafSegmentTemplate), word.charAt(i))); - } - return leafSegments; - } -} - -class RowSegment extends ParentSegment{ - constructor(element) { - super(element); - this.rotatable = false; - } - - applyRotations(rotations) - { - for (let i = 0, n = this.children.length; i < n; i++) { - rotations = this.children[i].applyRotations(rotations); - } - return rotations; - } - - getCurrentRotations(rotations){ - for (let i = 0, n = this.children.length; i < n; i++) { - rotations = this.children[i].getCurrentRotations(rotations); - } - return rotations; - } - - getCurrentLocked(locked) { - for (let i = 0, n = this.children.length; i < n; i++) { - locked = this.children[i].getCurrentLocked(locked); - } - return locked; - } - - applyLocks(locks) { - for (let i = 0, n = this.children.length; i < n; i++) { - locks = this.children[i].applyLocks(locks); - } - return locks; - } - - _updateElement() { - const childContainer = this.element.querySelector(".child-container"); - childContainer.removeAllChildren(); - - this._updateRotationClass(); - - const self = this; - this.element.onclick = function (e) { - self.rotate(); - e.stopPropagation(); - }; - - for (let i = 0, n = this.children.length; i < n; i++) { - this.children[i]._updateElement(); - childContainer.appendChild(this.children[i].getElement()); - } - } -} - -class RowLevel extends Level { - constructor(container, wordLength) { - super(container); - this.wordLength = wordLength; - } - - createSegments() { - if (this.words.length >= 2 && this.words[0].length >= this.wordLength && this.words[1].length >= this.wordLength) { - let leafsWordOne = Level._createLeafsForWord(this.words[0], this.templateContainer.copyLeafTemplate()); - let leafsWordTwo = Level._createLeafsForWord(this.words[1], this.templateContainer.copyLeafTemplate()); - - let rootSegment = new RowSegment(this.templateContainer.copyRowTemplate()); - for (let i = 0, n = this.wordLength / 2; i < n; i++) { - let parent = new ParentSegment(this.templateContainer.copyParentTemplate()); - parent.addChild(leafsWordOne[2 * i]); - parent.addChild(leafsWordOne[2 * i + 1]); - parent.addChild(leafsWordTwo[2 * i]); - parent.addChild(leafsWordTwo[2 * i + 1]); - rootSegment.addChild(parent); - } - // rootSegment.applyRotations(this.startRotations); - this.setRootSegment(rootSegment); - } - } -} - -class SimpleLevel extends RowLevel{ - constructor(container) { - super(container, 6); - } -} - -class RowLevel8 extends RowLevel{ - constructor(container) { - super(container, 8); - } -} - -class RowLevel10 extends RowLevel{ - constructor(container) { - super(container, 10); - } -} - -class TriangleSegment extends RowSegment{ - -} - -class SixWordsRowLevel extends Level { - - constructor(templateContainer, wordLength) { - super(templateContainer); - this.wordLength = wordLength; - } - - createSegments() { - if (this.words.length >= 6 && - this.words[0].length >= this.wordLength && - this.words[1].length >= this.wordLength && - this.words[2].length >= this.wordLength && - this.words[3].length >= this.wordLength && - this.words[4].length >= this.wordLength && - this.words[5].length >= this.wordLength - ) { - let leafsWords = []; - leafsWords[0] = Level._createLeafsForWord(this.words[0], this.templateContainer.copyLeafTemplate()); - leafsWords[1] = Level._createLeafsForWord(this.words[1], this.templateContainer.copyLeafTemplate()); - leafsWords[2] = Level._createLeafsForWord(this.words[2], this.templateContainer.copyLeafTemplate()); - leafsWords[3] = Level._createLeafsForWord(this.words[3], this.templateContainer.copyLeafTemplate()); - leafsWords[4] = Level._createLeafsForWord(this.words[4], this.templateContainer.copyLeafTemplate()); - leafsWords[5] = Level._createLeafsForWord(this.words[5], this.templateContainer.copyLeafTemplate()); - - let rootSegment = new RowSegment(this.templateContainer.copyRowTemplate()); - for (let i = 0; i < this.wordLength / 4; i++) { - - let parents = []; - parents[0] = new ParentSegment(this.templateContainer.copyParentTemplate()); - parents[1] = new ParentSegment(this.templateContainer.copyParentTemplate()); - parents[2] = new ParentSegment(this.templateContainer.copyParentTemplate()); - parents[3] = new ParentSegment(this.templateContainer.copyParentTemplate()); - parents[4] = new ParentSegment(this.templateContainer.copyParentTemplate()); - parents[5] = new ParentSegment(this.templateContainer.copyParentTemplate()); - - parents[0].addChild(leafsWords[0][4*i]); - parents[0].addChild(leafsWords[0][4*i+1]); - parents[0].addChild(leafsWords[1][4*i]); - parents[0].addChild(leafsWords[1][4*i+1]); - - parents[1].addChild(leafsWords[0][4*i+2]); - parents[1].addChild(leafsWords[0][4*i+3]); - parents[1].addChild(leafsWords[1][4*i+2]); - parents[1].addChild(leafsWords[1][4*i+3]); - - parents[2].addChild(leafsWords[2][4*i]); - parents[2].addChild(leafsWords[2][4*i+1]); - parents[2].addChild(leafsWords[3][4*i]); - parents[2].addChild(leafsWords[3][4*i+1]); - - parents[3].addChild(leafsWords[2][4*i+2]); - parents[3].addChild(leafsWords[2][4*i+3]); - parents[3].addChild(leafsWords[3][4*i+2]); - parents[3].addChild(leafsWords[3][4*i+3]); - - parents[4].addChild(leafsWords[4][4*i]); - parents[4].addChild(leafsWords[4][4*i+1]); - parents[4].addChild(leafsWords[5][4*i]); - parents[4].addChild(leafsWords[5][4*i+1]); - - parents[5].addChild(leafsWords[4][4*i+2]); - parents[5].addChild(leafsWords[4][4*i+3]); - parents[5].addChild(leafsWords[5][4*i+2]); - parents[5].addChild(leafsWords[5][4*i+3]); - - - let parent = new ParentSegment(this.templateContainer.copyParentTemplate()); - let triangle = new TriangleSegment(this.templateContainer.copyTriangleTemplate()); - if (i % 2 === 0) { - parent.addChild(parents[0]); - parent.addChild(parents[1]); - parent.addChild(parents[2]); - parent.addChild(parents[3]); - - let rowSegment = new RowSegment(this.templateContainer.copyRowTemplate()); - - rowSegment.addChild(parents[4]); - rowSegment.addChild(parents[5]); - - triangle.addChild(parent); - triangle.addChild(rowSegment); - - triangle.getElement().classList.add("type-1"); - } - else { - - let rowSegment = new RowSegment(this.templateContainer.copyRowTemplate()); - - rowSegment.addChild(parents[0]); - rowSegment.addChild(parents[1]); - - triangle.addChild(rowSegment); - triangle.addChild(parent); - - parent.addChild(parents[2]); - parent.addChild(parents[3]); - parent.addChild(parents[4]); - parent.addChild(parents[5]); - - triangle.getElement().classList.add("type-2"); - } - rootSegment.addChild(triangle); - } - this.setRootSegment(rootSegment); - } - } -} - -class SixWordsRowLevel8 extends SixWordsRowLevel { - constructor(templateContainer) { - super(templateContainer, 8); - } -} - -class SixWordsRowLevel12 extends SixWordsRowLevel { - constructor(templateContainer) { - super(templateContainer, 12); - } -} - -class FourWordsLevel extends Level { - - constructor(templateContainer, wordLength) { - super(templateContainer); - this.wordLength = wordLength; - } - - createSegments() { - if (this.words.length >= 4 && - this.words[0].length >= this.wordLength && - this.words[1].length >= this.wordLength && - this.words[2].length >= this.wordLength && - this.words[3].length >= this.wordLength - ) { - let leafsWords = []; - leafsWords[0] = Level._createLeafsForWord(this.words[0], this.templateContainer.copyLeafTemplate()); - leafsWords[1] = Level._createLeafsForWord(this.words[1], this.templateContainer.copyLeafTemplate()); - leafsWords[2] = Level._createLeafsForWord(this.words[2], this.templateContainer.copyLeafTemplate()); - leafsWords[3] = Level._createLeafsForWord(this.words[3], this.templateContainer.copyLeafTemplate()); - - let rootSegment = new RowSegment(this.templateContainer.copyRowTemplate()); - for (let i = 0; i < this.wordLength / 4; i++) { - - let parents = []; - parents[0] = new ParentSegment(this.templateContainer.copyParentTemplate()); - parents[1] = new ParentSegment(this.templateContainer.copyParentTemplate()); - parents[2] = new ParentSegment(this.templateContainer.copyParentTemplate()); - parents[3] = new ParentSegment(this.templateContainer.copyParentTemplate()); - - parents[0].addChild(leafsWords[0][4 * i]); - parents[0].addChild(leafsWords[0][4 * i + 1]); - parents[0].addChild(leafsWords[1][4 * i]); - parents[0].addChild(leafsWords[1][4 * i + 1]); - - parents[1].addChild(leafsWords[0][4 * i + 2]); - parents[1].addChild(leafsWords[0][4 * i + 3]); - parents[1].addChild(leafsWords[1][4 * i + 2]); - parents[1].addChild(leafsWords[1][4 * i + 3]); - - parents[2].addChild(leafsWords[2][4 * i]); - parents[2].addChild(leafsWords[2][4 * i + 1]); - parents[2].addChild(leafsWords[3][4 * i]); - parents[2].addChild(leafsWords[3][4 * i + 1]); - - parents[3].addChild(leafsWords[2][4 * i + 2]); - parents[3].addChild(leafsWords[2][4 * i + 3]); - parents[3].addChild(leafsWords[3][4 * i + 2]); - parents[3].addChild(leafsWords[3][4 * i + 3]); - - let parent = new ParentSegment(this.templateContainer.copyParentTemplate()); - parent.addChild(parents[0]); - parent.addChild(parents[1]); - parent.addChild(parents[2]); - parent.addChild(parents[3]); - - rootSegment.addChild(parent); - } - this.setRootSegment(rootSegment); - } - } -} - -class FourWordsLevel8 extends FourWordsLevel{ - constructor(templateContainer) { - super(templateContainer, 8); - } -} - -class FourWordsLevel12 extends FourWordsLevel{ - constructor(templateContainer) { - super(templateContainer, 12); - } -} - -class LevelHelper { - static setLevelType(typeId, level) { - LevelHelper.types[typeId] = level; - } - - static getLevelClass(type) { - return LevelHelper.types[type]; - } - - static inflateLevel(jsonLevel, templateContainer) { - let level = new (LevelHelper.types[jsonLevel["rendererType"]])(templateContainer); - level.setWords(jsonLevel["words"]); - level.setId(jsonLevel["id"]); - - for (let i = 0, n = jsonLevel["rotations"].length; i < n; i++) { - if (jsonLevel["rotations"][i] <= 4) { - jsonLevel["rotations"][i] = 90 * jsonLevel["rotations"][i]; - } - } - - level.setStartRotations(jsonLevel["rotations"]); - return level; - } -} - -LevelHelper.types = { - 20: SimpleLevel, - 40: RowLevel8, - 60: RowLevel10, - 100: SixWordsRowLevel8, - 120: FourWordsLevel8, - 140: SixWordsRowLevel12, - 160: FourWordsLevel12, -}; - -class WordRotatorDb extends MyDb { - - static getInstance() { - if (Helper.isNull(WordRotatorDb.instance)) { - WordRotatorDb.instance = new WordRotatorDb(); - } - return WordRotatorDb.instance; - } - - constructor() { - super("wordRotator", 3); - } - - upgrade(db, oldVersion, newVersion, e) { - console.log("upgrading!"); - if (Helper.isNull(oldVersion) || oldVersion < 1 && newVersion >= 1) { - let levelObjectStore = db.createObjectStore(WordRotatorDb.OBJECT_STORE.LEVEL, {"keyPath": "id"}); - } - if (Helper.isNull(oldVersion) || oldVersion < 2 && newVersion >= 2) { - let levelObjectStore = e.target.transaction.objectStore(WordRotatorDb.OBJECT_STORE.LEVEL); - levelObjectStore.createIndex("played", ["deleted", "played", "difficulty", "id"], {"unique": false}); - } - if (Helper.isNull(oldVersion) || oldVersion < 3 && newVersion >= 3) { - let levelObjectStore = e.target.transaction.objectStore(WordRotatorDb.OBJECT_STORE.LEVEL); - levelObjectStore.createIndex("difficulty", "difficulty", {"unique": false}); - } - }; - - async saveManyLevels(levels) { - return this.saveMany(levels, WordRotatorDb.OBJECT_STORE.LEVEL).catch(e => { - console.error("insert error!", e); - }); - } - - async loadLevel(levelId) { - return this.load(levelId, WordRotatorDb.OBJECT_STORE.LEVEL); - } - - async loadNextLevel(rendererTypes) { - let levels = await this.loadAll(WordRotatorDb.OBJECT_STORE.LEVEL); - levels = levels.sort((a,b) => { - return (a["difficulty"] - b["difficulty"]); - }); - - let wrongLevels = []; - let newLevels = []; - let difficulty = -1; - for (let i = 0, n = levels.length; i < n; i++) { - if ((difficulty < 0 || difficulty === levels[i]["difficulty"]) && !levels[i]["deleted"] && !levels[i]["played"] && rendererTypes.indexOf(levels[i]["rendererType"]) !== -1) { - newLevels.push(levels[i]); - difficulty = levels[i]["difficulty"]; - } - else if (levels[i]["difficulty"] !== 0 && !levels[i]["deleted"] && !levels[i]["played"] ) { - wrongLevels.push(levels[i]); - } - } - - if (newLevels.length === 0) { - return null; - } - - return newLevels[Math.round(Math.random() * newLevels.length) % newLevels.length]; - } - - async saveLevelPlayed(levelId) { - const level = await this.loadLevel(levelId); - level.played = true; - return await this.saveObj(level, WordRotatorDb.OBJECT_STORE.LEVEL); - } -} - -WordRotatorDb.OBJECT_STORE = { - LEVEL: "level", -}; -WordRotatorDb.instance = null; - -class EndSite extends WordRotatorBaseSite{ - constructor(siteManager) { - super(siteManager, "html/application/end.html"); - } - - onStart(args) { - Matomo.update("End Site"); - return super.onStart(args); - } -} - -class LevelSite extends WordRotatorBaseSite { - constructor(siteManager) { - super(siteManager, "html/application/level.html"); - } - - createActionBarMenu(menu) { - menu = super.createActionBarMenu(menu); - - let coinAction = new MenuAction(Helper.nonNull(localStorage.getItem("coins"), "0"), () => { - }, MenuAction.SHOW_ALWAYS, 900); - coinAction.setShouldTranslate(false); - coinAction._liClass = "coin-counter"; - menu.addAction(coinAction); - this.coinAction = coinAction; - - return menu; - } - - onConstruct(args) { - this.levelCounter = Helper.nonNull(localStorage.getItem("levelCounter"), 1); - this.levelScaler = () => { - }; - this.wonParams = { - aborted: false, - coinCounterTimer: null, - }; - this.coinPromise = Promise.resolve(); - - let settingsManager = SettingsManager.getInstance(); - let soundManager = SoundManager.getInstance(); - soundManager.set({ - audio: "sound/single_coin_fall_on_concrete_.mp3", - muted: (settingsManager.getSetting("play-sound", "1") !== "1"), - volume: 0.7 - }, SoundManager.CHANNELS.SOUND); - - soundManager.resume(SoundManager.CHANNELS.MUSIC); - - return super.onConstruct(args); - } - - async onFirstStart() { - super.onFirstStart(); - let leafSegmentTemplate = this.findBy("#segment-leaf-template"); - let parentSegmentTemplate = this.findBy("#segment-parent-template"); - let rowSegmentTemplate = this.findBy("#segment-row-template"); - let triangleTemplate = this.findBy("#segment-triangle-template"); - - leafSegmentTemplate.id = null; - parentSegmentTemplate.id = null; - rowSegmentTemplate.id = null; - triangleTemplate.id = null; - - leafSegmentTemplate.remove(); - parentSegmentTemplate.remove(); - rowSegmentTemplate.remove(); - triangleTemplate.remove(); - - let self = this; - let continueButton = this.findBy("#continue-button"); - continueButton.addEventListener("click", () => { - self.nextLevel(); - }); - - let wonText = this.findBy("#won-text"); - - let scaleHelper = new ScaleHelper(); - this.continueButtonScaler = await scaleHelper.scaleToFull(continueButton, continueButton.parentElement, false, true, 2); - this.wonTextScaler = await scaleHelper.scaleToFull(wonText, wonText.parentElement, false, false, 2, null, 5); - this.wonText = wonText; - this.wonText.style.fontSize = "0"; - - //Benutze Document, da Element außerhalb von Seite (eigentlich unschön!) - this.levelCounterActionContainer = document.getElementById("level-number-container"); - this.levelCounterAction = document.getElementById("level-number"); - this.levelCounterAction.innerText = this.levelCounter; - this.levelNumberScaler = await scaleHelper.scaleToFull(this.levelCounterAction, this.levelCounterActionContainer, false, false, 4); - this.levelCounterActionContainer.classList.add("visible"); - this.templateContainer = new TemplateContainer(leafSegmentTemplate, parentSegmentTemplate, rowSegmentTemplate, triangleTemplate); - - this.coinTemplate = this.findBy("#coin-template"); - this.coinContainer = this.findBy("#coin-container"); - - this.coinTemplate.id = null; - this.coinContainer.removeAllChildren(); - - this.findBy("#help-button").addEventListener("click", () => { - this.help(); - }); - await this.loadLastLevel(); - } - - async loadLastLevel() { - try { - let currentLevelInfo = localStorage.getItem("currentLevel"); - if (Helper.isNotNull(currentLevelInfo)) { - currentLevelInfo = JSON.parse(currentLevelInfo); - - const db = WordRotatorDb.getInstance(); - const levelJson = await db.loadLevel(currentLevelInfo["id"]); - - if (levelJson === null) { - return this.nextLevel(); - } - - const level = LevelHelper.inflateLevel(levelJson, this.templateContainer); - level.setStartRotations(currentLevelInfo["rotations"]); - - const self = this; - level.getWonPromise().then(() => { - self.levelWon(level); + }, { + key: "xe", value: function (e) { + var n = null; + if ("string" == typeof e) { + var r = t.Be.filter(function (t) { + return t.De === e }); - - level.createSegments(); - level.setLocks(currentLevelInfo["locks"]); - level.getRootSegment()._updateElement(); - - level.saveAsCurrentLevel(); - - let levelSegment = this.findBy("#level"); - levelSegment.removeAllChildren().appendChild(level.getRootSegment().getElement()); - let scaleHelper = new ScaleHelper(); - this.levelScaler = await scaleHelper.scaleToFull(levelSegment, levelSegment.parentElement, false, false, 1, level.words[0].length * 1.5, null, 0); - - this.level = level; - let res = this.tutorial(); - Matomo.push(["trackEvent", "LevelSite", "LoadLastLevel"]); - this.level.checkHasWon(); - return res; - } - } - catch (e) { - console.error(e); - } - return this.nextLevel(); - } - - async nextLevel() { - try { - this._siteContent.classList.remove('won'); - this.wonText.style.fontSize = "0"; - - const db = WordRotatorDb.getInstance(); - const nextLevelJson = await db.loadNextLevel(LevelSite.RENDERER_TYPES); - - if (nextLevelJson === null) { - this.startSite(EndSite); - this.finish(); - return; - } - const level = LevelHelper.inflateLevel(nextLevelJson, this.templateContainer); - const self = this; - level.getWonPromise().then(() => { - self.levelWon(level); - }); - - level.createSegments(); - level.getRootSegment()._updateElement(); - - level.saveAsCurrentLevel(); - - let levelSegment = this.findBy("#level"); - levelSegment.removeAllChildren().appendChild(level.getRootSegment().getElement()); - let scaleHelper = new ScaleHelper(); - this.levelScaler = await scaleHelper.scaleToFull(levelSegment, levelSegment.parentElement, false, false, 1, level.words[0].length * 1.5, null, 0); - - this.level = level; - this.levelCounterAction.innerText = this.levelCounter; - this.levelNumberScaler(); - - this.coinAction.setTitle(Helper.nonNull(localStorage.getItem("coins"), "0")); - this.coinAction.redraw(); - - this.wonParams.aborted = true; - clearTimeout(this.wonParams.coinCounterTimer); - - Matomo.push(["trackEvent", "LevelSite", "NextLevel", "Level Number Normal", this.levelCounter]); - - this.level.checkHasWon(); - - return this.tutorial(); - } - catch (e) { - console.error(e); - } - } - - onStart(args) { - Matomo.update("Level Site"); - let res = super.onStart(args); - - if (this.levelCounterAction) { - - this.levelCounterAction.innerText = this.levelCounter; - this.levelCounterActionContainer.classList.add("visible"); - } - this.levelScaler(); - - let settingsManager = SettingsManager.getInstance(); - let soundManager = SoundManager.getInstance(); - soundManager.set({ - audio: "sound/single_coin_fall_on_concrete_.mp3", - muted: (settingsManager.getSetting("play-sound", "1") !== "1"), - volume: 0.7 - }, SoundManager.CHANNELS.SOUND); - - return res; - } - - onPause(args) { - super.onPause(args); - this.levelCounterActionContainer.classList.remove("visible"); - } - - async levelWon(level) { - try { - const db = WordRotatorDb.getInstance(); - const savePromise = db.saveLevelPlayed(level.getId()); - - this.levelCounter++; - localStorage.setItem("levelCounter", this.levelCounter); - - this._siteContent.classList.add('won'); - localStorage.removeItem("currentLevel"); - - let continueButton = this.findBy("#continue-button"); - continueButton.style.transition = "none"; - continueButton.style.opacity = 0; - - this.coinContainer.removeAllChildren(); - let coinsPerLevel = SystemSettings.get("coinsPerLevel", 5); - - let coinsBefore = 0; - - let soundManager = SoundManager.getInstance(); - let audioOptions = soundManager.get(SoundManager.CHANNELS.SOUND); - - this.coinPromise = this.coinPromise.then(() => { - coinsBefore = parseInt(Helper.nonNull(localStorage.getItem("coins"), "0")); - localStorage.setItem("coins", coinsBefore + parseInt(coinsPerLevel)); - }).then(() => { - return Promise.all([new Promise((r) => { - setTimeout(() => { - r(continueButton.fadeIn()); - }, 500); - }), audioOptions.loadedPromise.catch(e => { - console.error(e); - })]); - }); - - this.wonParams.aborted = false; - - for (let i = 0; i < coinsPerLevel; i++) { - let coinElem = Helper.cloneNode(this.coinTemplate); - this.coinContainer.appendChild(coinElem); - this.coinPromise = this.coinPromise.then(() => { - return new Promise(r => { - let timeout = 350; - if (!this.wonParams.aborted) { - coinElem.fadeIn(timeout / 1000); - soundManager.play(SoundManager.CHANNELS.SOUND); - - this.wonParams.coinCounterTimer = setTimeout(() => { - if (!this.wonParams.aborted) { - this.coinAction.setTitle(++coinsBefore); - this.coinAction.redraw(); - } - }, timeout / 2); - } - else { - r(); - } - //Always do the next promise for garbage collection - setTimeout(r, timeout); + r.length > 0 && (n = r[0]) + } else -1 !== t.Be.indexOf(e) && (n = e); + if (v.R(n)) { + localStorage.setItem("currentTheme", n.De); + var i = new Promise(function (t) { + document.querySelector("nav.top-bar").addEventListener("transitionend", function () { + t() }) }); - } - - this.coinPromise = this.coinPromise.catch((e) => { - console.error(e); - }); - - this.wonTextScaler(); - this.continueButtonScaler(); - this.levelScaler(); - - Matomo.push(["trackEvent", "LevelSite", "LevelWon", "Coins", parseInt(Helper.nonNull(localStorage.getItem("coins"), "0"))]); - - await savePromise; - } - catch (e) { - console.error(e); - } - } - - help() { - let cost = SystemSettings.get("costForHelp", 25); - let currentCoins = parseInt(Helper.nonNull(localStorage.getItem("coins"), 0)); - - if (currentCoins >= cost) { - currentCoins -= cost; - localStorage.setItem("coins", currentCoins); - this.coinAction.title = currentCoins; - this.coinAction.redraw(); - - let rotatables = this.level.getRotatableSegments(); - rotatables = rotatables.filter((segment) => { - return (!segment.isSolved(false)); - }); - - let index = Math.floor(Math.random() * rotatables.length); - - let segmentToHelp = rotatables[index]; - while (segmentToHelp.rotation !== 0) { - segmentToHelp.rotate(); - } - segmentToHelp.setIsRotatable(false); - this.level.saveAsCurrentLevel(); - - Matomo.push(["trackEvent", "LevelSite", "Help", "Coins", parseInt(Helper.nonNull(localStorage.getItem("coins"), "0"))]); - } - else { - FlashMessenger.addMessage("not-enough-coins"); - Matomo.push(["trackEvent", "LevelSite", "Help", "Not enough Coins", parseInt(Helper.nonNull(localStorage.getItem("coins"), "0"))]); - } - } - - async tutorial() { - if (this.level.id === LevelSite.TUTORIAL.FIRST_LEVEL) { - let currentStep = Helper.nonNull(localStorage.getItem("tutorial-step"), "1"); - - let scaleHelper = new ScaleHelper(); - this._siteContent.classList.add("tutorial"); - this._siteContent.classList.add("step-" + currentStep); - - switch (currentStep) { - case "1": { - this.level.setSegmentClickedListener(() => { - this._siteContent.classList.remove("step-1"); - localStorage.setItem("tutorial-step", "2"); - this.tutorial(); - }); - - let textElem = this.findBy(".tutorial-text .step-1"); - - await this.levelScaler(); - scaleHelper.scaleToFull(textElem, textElem.parentElement, null, true, 1, 2); - - break; - } - case "2": { - this.level.setSegmentClickedListener(() => { - }); - this.level.getWonPromise().then(() => { - this._siteContent.classList.remove("tutorial"); - this._siteContent.classList.remove("step-2"); - localStorage.removeItem("tutorial-step"); - this.coinPromise = this.coinPromise.then(() => { - FlashMessenger.addMessage("extra-coins-after-first-level"); - localStorage.setItem("coins", parseInt(Helper.nonNull(localStorage.getItem("coins"), "0")) + 50); - this.coinAction.setTitle(Helper.nonNull(localStorage.getItem("coins"), "0")); - this.coinAction.redraw(); - }); - // this.levelScaler(); - }); - - let textElem = this.findBy(".tutorial-text .step-2"); - - await this.levelScaler(); - scaleHelper.scaleToFull(textElem, textElem.parentElement, null, true, 1, 2); - - break; - } - default:{ - this._siteContent.classList.remove("tutorial"); - } + document.body.className = n.Ie, t.Re = n; + for (var o = 0, s = t.Ue.length; o < s; o++) t.Ue[o](t.Re, i) } } - else if (this.level.id === LevelSite.TUTORIAL.SECOND_LEVEL) { - let currentStep = Helper.nonNull(localStorage.getItem("tutorial-step"), "3"); - - switch (currentStep) { - case "3": { - let scaleHelper = new ScaleHelper(); - - this._siteContent.classList.add("tutorial"); - this._siteContent.classList.add("step-" + currentStep); - - let eventListener = () => { - this._siteContent.classList.remove("tutorial"); - this._siteContent.classList.remove("step-3"); - localStorage.setItem("tutorial-step", "4"); - this.findBy("#help-button").removeEventListener("click", eventListener); - this.levelScaler(); - }; - this.findBy("#help-button").addEventListener("click", eventListener); - - let textElem = this.findBy(".tutorial-text .step-3"); - - await this.levelScaler(); - scaleHelper.scaleToFull(textElem, textElem.parentElement, null, true, 1, 2); - break; - } - default:{ - this._siteContent.classList.remove("tutorial"); - } + }, { + key: "Ee", value: function (e) { + t.Be.push(e) + } + }, { + key: "Fe", value: function () { + if (t.xe(localStorage.getItem("currentTheme")), v.Mt(t.Re)) { + var e = document.body.className, n = t.Be.filter(function (t) { + return t.Ie === e + }); + n.length > 0 ? t.xe(n[0]) : t.Be.length > 0 && t.xe(t.Be[0]) } } - else if (this.level.id === LevelSite.TUTORIAL.BIG_SEGMENT_LEVEL) { - let currentStep = Helper.nonNull(localStorage.getItem("tutorial-step"), "4"); - - switch (currentStep) { - case "4": { - - let scaleHelper = new ScaleHelper(); - this._siteContent.classList.add("tutorial"); - this._siteContent.classList.add("step-" + currentStep); - - let rotatableSegments = this.level.getRotatableSegments(); - let firstSegment = rotatableSegments[0]; - - let pointer = this.findBy("#tutorial-pointer"); - pointer.remove(); - firstSegment.element.appendChild(pointer); - - this.level.setSegmentClickedListener((segment) => { - if (firstSegment === segment) { - this._siteContent.classList.remove("tutorial"); - this._siteContent.classList.remove("step-4"); - localStorage.setItem("tutorial-step", "5"); - this.levelScaler(); - } - }); - - let textElem = this.findBy(".tutorial-text .step-4"); - - await this.levelScaler(); - scaleHelper.scaleToFull(textElem, textElem.parentElement, null, true, 1, 2); - - break; - } - default:{ - this._siteContent.classList.remove("tutorial"); - } - } + }, { + key: "We", value: function () { + return new l(t.Re.De, function (e) { + var n = (t.Be.indexOf(t.Re) + 1) % t.Be.length; + t.xe(t.Be[n]), e.title = t.Re.De, e.H.j() + }, h.Y) } - } -} -LevelSite.RENDERER_TYPES = [20, 40, 60, 100, 120, 140, 160]; -LevelSite.TUTORIAL = { - FIRST_LEVEL: 67, - SECOND_LEVEL: 15, - BIG_SEGMENT_LEVEL: 341 -}; - -class MainMenuLevel extends FourWordsLevel{ - - constructor(templateContainer) { - super(templateContainer, 4); + }, { + key: "addChangeListener", value: function (e) { + t.Ue.push(e) + } + }, { + key: "getCurrentTheme", value: function () { + return t.Re + } + }]), t +}(); +y.Re = null, y.Be = [], y.Ue = [], u.l("ThemeManager", { + addChangeListener: y.addChangeListener, + getCurrentTheme: y.getCurrentTheme +}); +var g = function () { + function t(e) { + s(this, t), this.Oe = e, this._e = !0, this.je = 3650, this.Ve = "complianceCookie", this.Je = "true" } - saveAsCurrentLevel() { - } - - // checkHasWon(delayPromise) { - // } -} - -class ShareDialog extends Dialog{ - constructor() { - let viewPromise = ViewInflater.inflate("html/application/dialog/share.html").then(view => { - view.appendChild(ShareManager.generateDefaultShareElement(window.location.hostname + Helper.basePath(""))); - let closeListener = () => { - this.close(); - }; - - view.querySelectorAll("a").forEach((element) => { - element.addEventListener("click", closeListener); - }); - return view; - }); - - super(viewPromise, "share-dialog"); - } -} - -class MenuSite extends WordRotatorBaseSite { - constructor(siteManager) { - super(siteManager, "html/application/menu.html"); - this.loadLevelPromise = this.loadLevels(); - this.listener = null; - } - - onStart(args) { - Matomo.update("Menu Site"); - let res = super.onStart(args); - - let level = new MainMenuLevel(this.templateContainer); - level.setWords(["WORD", "ROTA", "TORW", "ORDR"]); - level.createSegments(); - - level.getWonPromise().then(() => { - Matomo.push(["trackEvent", "MainMenu", "levelSolved"]); - this.startLevelSite(); - }); - - let segment = level.getRootSegment(); - segment._updateElement(); - - let levelSegment = this.findBy("#level"); - levelSegment.removeAllChildren().appendChild(segment.getElement()); - - let rotationsSegments = level.getRotatableSegments(); - - let randomRotationFunction = () => { - let timeout = Math.random() * 4500 + 1500; - this.randomRotateTimeout = setTimeout(() => { - let indexBlocked = -1; - let indexesNotRight = []; - for (let i = 0; i < rotationsSegments.length; i++) { - if (rotationsSegments[i].rotation !== 0) { - indexesNotRight.push(i); - if (indexesNotRight.length >= 2) { - break; - } + return n(t, null, [{ + key: "Ne", value: function () { + var e = r(regeneratorRuntime.mark(function e(n) { + return regeneratorRuntime.wrap(function (e) { + for (; ;) switch (e.prev = e.next) { + case 0: + return e.abrupt("return", new t(n).Ne()); + case 1: + case"end": + return e.stop() } - } - if (indexesNotRight.length === 1) { - indexBlocked = indexesNotRight[0]; - } - - let index = Math.floor(Math.random() * rotationsSegments.length); - if (index === indexBlocked) { - index = (index + 1) % rotationsSegments.length; - } - - rotationsSegments[index].rotate(); - randomRotationFunction(); - }, timeout); - }; - randomRotationFunction(); - - this.listener = async () => { - let playButton = this.findBy("#play-button"); - let levelNumber = this.findBy("#level-number"); - levelNumber.innerText = Helper.nonNull(localStorage.getItem("levelCounter"), 1); - - let levelSegment = this.findBy("#level"); - - let scaleHelper = new ScaleHelper(); - await scaleHelper.scaleToFull(levelSegment, levelSegment.parentElement, false, false, 2, 8, null, false); - - // debugger; - let levelStyle = getComputedStyle(levelSegment); - playButton.style.width = levelStyle.getPropertyValue("width"); - scaleHelper.scaleToFull(playButton.children[0], playButton, null, null, null, 4, null, false); - - await scaleHelper.scaleTo(0.2, levelNumber.parentElement, levelNumber.parentElement.parentElement, null, null, null, 10, null, false); - scaleHelper.scaleToFull(levelNumber, levelNumber.parentElement, false, false, 8, null, null, false); - }; - - this.listener(); - window.addEventListener("resize", this.listener); - - //Musikbuttons update, falls in den Einstellungen umgestellt - let settingsManager = SettingsManager.getInstance(); - let playSoundButton = this.findBy("#play-sound"); - playSoundButton.checked = (settingsManager.getSetting("play-sound", "1") === "1"); - let playMusicButton = this.findBy("#play-music"); - playMusicButton.checked = (settingsManager.getSetting("play-music", "1") === "1"); - - return res; - } - - async startLevelSite() { - SoundManager.getInstance().resumeContext(); - this.startSite(LevelSite, Promise.race([this.loadLevelPromise, new Promise(async resolve => { - const db = WordRotatorDb.getInstance(); - let level = await db.loadNextLevel(LevelSite.RENDERER_TYPES); - if (level !== null) { - resolve(); - } - })])); - } - - async onFirstStart() { - super.onFirstStart(); - - let playButton = this.findBy("#play-button"); - playButton.addEventListener("click", () => { - Matomo.push(["trackEvent", "MainMenu", "startButton"]); - this.startLevelSite(); - }); - - let leafSegmentTemplate = this.findBy("#segment-leaf-template"); - let parentSegmentTemplate = this.findBy("#segment-parent-template"); - let rowSegmentTemplate = this.findBy("#segment-row-template"); - let triangleTemplate = this.findBy("#segment-triangle-template"); - - leafSegmentTemplate.id = null; - parentSegmentTemplate.id = null; - rowSegmentTemplate.id = null; - triangleTemplate.id = null; - - leafSegmentTemplate.remove(); - parentSegmentTemplate.remove(); - rowSegmentTemplate.remove(); - triangleTemplate.remove(); - - this.templateContainer = new TemplateContainer(leafSegmentTemplate, parentSegmentTemplate, rowSegmentTemplate, triangleTemplate); - - if (Helper.nonNull(MenuSite.app._cookieClosePromise)) { - MenuSite.app._cookieClosePromise.then(() => { - if (this.listener) { - this.listener(); - } - }); - } - - let settingsManager = SettingsManager.getInstance(); - let soundManager = SoundManager.getInstance(); - - let playMusicButton = this.findBy("#play-music"); - playMusicButton.checked = (settingsManager.getSetting("play-music", "1") === "1"); - playMusicButton.addEventListener("change", () => { - settingsManager.setSetting("play-music", (playMusicButton.checked)?"1":"0"); - soundManager.set({muted: !playMusicButton.checked}, SoundManager.CHANNELS.MUSIC); - if (playMusicButton.checked) { - soundManager.play(SoundManager.CHANNELS.MUSIC); - } - Matomo.push(["trackEvent", "MainMenu", "PlayMusic", "Play Music", (playMusicButton.checked) ? 1 : 0]); - }); - - let playSoundButton = this.findBy("#play-sound"); - playSoundButton.checked = (settingsManager.getSetting("play-sound", "1") === "1"); - playSoundButton.addEventListener("change", () => { - settingsManager.setSetting("play-sound", (playSoundButton.checked)?"1":"0"); - soundManager.set({muted: !playSoundButton.checked}, SoundManager.CHANNELS.SOUND); - Matomo.push(["trackEvent", "MainMenu", "PlaySound", "Play Sound", (playSoundButton.checked) ? 1 : 0]); - }); - - this.findBy("#share-button").addEventListener("click", () => { - new ShareDialog().show(); - }); - // this.findBy("#share-buttons").appendChild(ShareManager.generateDefaultShareElement("https://wordrotator.silas.link")); - } - - onPause(args) { - clearTimeout(this.randomRotateTimeout); - window.removeEventListener("resize", this.listener); - super.onPause(args); - } - - async loadLevels() { - const dateLastSync = Helper.nonNull(localStorage.getItem("date-last-sync"), 0); - const db = WordRotatorDb.getInstance(); - - let newLastSync = null; - let maxRuns = 1; - let levelPromises = []; - for (let run = 0; run < maxRuns; run++) { - let res = await DataManager.load("wordRotator/levels" + DataManager.buildQuery({ - "currentRun": run, - "dateLastSync": dateLastSync + }, e, this) })); - if (!res["success"]) { - if (await db.loadNextLevel(LevelSite.RENDERER_TYPES) === null) { - FlashMessenger.addMessage("sync-error", null, 6000); + return function () { + return e.apply(this, arguments) + } + }() + }]), n(t, [{ + key: "Ne", value: function () { + var e = r(regeneratorRuntime.mark(function e() { + return regeneratorRuntime.wrap(function (e) { + for (; ;) switch (e.prev = e.next) { + case 0: + return e.abrupt("return", t.qe(this.Ve) !== this.Je ? this.show() : Promise.resolve()); + case 1: + case"end": + return e.stop() + } + }, e, this) + })); + return function () { + return e.apply(this, arguments) + } + }() + }, { + key: "ze", value: function () { + this.$e(this.Ve, this.Je, this.je) + } + }, { + key: "$e", value: function (t, e, n) { + var r = void 0; + if (v.R(n)) { + var i = new Date; + i.setTime(i.getTime() + 24 * n * 60 * 60 * 1e3), r = "; expires=" + i.toGMTString() + } else r = ""; + this._e && (document.cookie = t + "=" + e + r + "; path=/") + } + }, { + key: "Ge", value: function (t) { + this.$e(t, "", -1) + } + }, { + key: "show", value: function () { + var t = this, e = document.getElementById(this.Oe); + return e.style.display = "block", new Promise(function (n) { + e.querySelector("#close-cookie-msg").onclick = function () { + t.ze(), e.remove(), n() } - newLastSync = null; - break; + }) + } + }], [{ + key: "qe", value: function (t) { + for (var e = t + "=", n = document.cookie.split(";"), r = 0; r < n.length; r++) { + for (var i = n[r]; " " === i.charAt(0);) i = i.substring(1, i.length); + if (0 === i.indexOf(e)) return i.substring(e.length, i.length) } - res = res["result"]; - newLastSync = Helper.nonNull(newLastSync, res["currentSyncDate"]); - maxRuns = res["maxRuns"]; + return null + } + }]), t +}(), k = function () { + function r() { + return s(this, r), i(this, (r.__proto__ || Object.getPrototypeOf(r)).apply(this, arguments)) + } - let levels = res["levels"]; - for (let i = 0, n = levels.length; i < n; i++) { - let currentLevel = levels[i]; - levelPromises.push(db.loadLevel(levels[i]["id"]).then(level => { - currentLevel["played"] = (Helper.nonNull(Helper.nonNull(level, {}).played, false)); - return currentLevel; - })); + return o(r, h), n(r, [{ + key: "ft", value: function (t, n) { + var i = e(r.prototype.__proto__ || Object.getPrototypeOf(r.prototype), "ft", this).call(this, t, n); + return i.classList.add(n.B()), i + } + }, { + key: "Xe", value: function () { + var t = r.Ye(), e = this.ot[0]; + ("medium" === t || "smedium" === t || "small" === t) && r.Ze(e.getElementsByClassName(h.Z)).length > 0 || ("smedium" === t || "small" === t) && r.Ze(e.getElementsByClassName(h.S)).length > 0 || "small" === t && r.Ze(e.getElementsByClassName(h.Ht)).length > 0 || r.Ze(e.getElementsByClassName(h.tt)).length > 0 ? document.getElementById("responsive-menu-toggle").style.display = "block" : (document.getElementById("responsive-menu-toggle").style.display = "none", v.R(r.Ke) && r.Ke.close()) + } + }, { + key: "gt", value: function () { + var t = e(r.prototype.__proto__ || Object.getPrototypeOf(r.prototype), "gt", this).call(this); + return function (e) { + t(e) instanceof c || !v.R(r.Ke) || r.Ke.close() } } - let levels = await Promise.all(levelPromises); - console.log("levels to save", levels); - await db.saveManyLevels(levels); - - if (newLastSync != null && newLastSync !== "null") { - localStorage.setItem("date-last-sync", newLastSync); + }, { + key: "ht", value: function (t) { + var n = e(r.prototype.__proto__ || Object.getPrototypeOf(r.prototype), "ht", this).call(this, t); + return this.Xe(), r.Ke = this, n } - } -} - -MenuSite.app = null; -InitPromise.addPromise(app => { - MenuSite.app = app; -}); - -class PrivacyPolicySite extends WordRotatorBaseSite { - constructor(siteManager) { - super(siteManager, "html/application/privacyPolicy.html", "privacyPolicy"); - } - - onFirstStart() { - let trackSwitch =this.findBy("#track-switch"); - - trackSwitch.addEventListener("change", function (e) { - Matomo.setTrack(this.checked === true); - e.stopPropagation(); - e.preventDefault(); - }); - super.onFirstStart(); - } - - onStart(args) { - let trackSwitch =this.findBy("#track-switch"); - let shouldTrack = (Helper.nonNull(localStorage.getItem("matomoShouldTrack"), "1") === "1"); - trackSwitch.checked = shouldTrack; - - Matomo.update("Privacy Policy Site"); - return super.onStart(args); - } -} - -InitPromise.addPromise(app => { - app.addDeepLink("privacyPolicy", PrivacyPolicySite); -}); - -class CreditsSite extends WordRotatorBaseSite{ - constructor(siteManager) { - super(siteManager, "html/application/credits.html", "credits"); - } - - onStart(args) { - Matomo.update("Credits Site"); - return super.onStart(args); - } -} - -InitPromise.addPromise(app => { - app.addDeepLink("credits", CreditsSite); -}); - -class ChooseThemeDialog extends Dialog { - - constructor() { - let viewPromise = ViewInflater.inflate("html/application/dialog/chooseTheme.html").then(view => { - - let template = view.querySelector("#choose-theme-template"); - template.remove(); - template.id = null; - - let themeTemplateContainer = view.querySelector("#theme-choose-container"); - - for (let i = 0; i < ThemeManager.themes.length; i++) { - let themeElem = Helper.cloneNode(template); - let theme = ThemeManager.themes[i]; - themeElem.querySelector(".name").appendChild(Translator.makePersistentTranslation(theme._name)); - themeElem["dataset"]["theme"] = theme._name; - - themeElem.addEventListener("click", () => { - this.result = themeElem["dataset"]["theme"]; - this.close(); + }, { + key: "close", value: function () { + document.getElementById("responsive-menu").style.display = "none"; + for (var t = 0, e = this.rt.length; t < e; t++) this.rt[t].close() + } + }, { + key: "U", value: function (t) { + var n = e(r.prototype.__proto__ || Object.getPrototypeOf(r.prototype), "U", this).call(this, t); + return this.Xe(), n + } + }], [{ + key: "init", value: function () { + var t = document.getElementsByClassName("foundation-mq"); + if (0 !== t.length) { + var e = []; + for (var n in t = function (t) { + var e = {}; + return "string" != typeof t ? e : (t = t.trim().slice(1, -1)) ? e = t.split("&").reduce(function (t, e) { + var n = e.replace(/\+/g, " ").split("="), r = n[0], i = n[1]; + return r = decodeURIComponent(r), i = void 0 === i ? null : decodeURIComponent(i), t.hasOwnProperty(r) ? Array.isArray(t[r]) ? t[r].push(i) : t[r] = [t[r], i] : t[r] = i, t + }, {}) : e + }(window.getComputedStyle(t[0]).getPropertyValue("font-family"))) t.hasOwnProperty(n) && e.push({ + De: n, + value: "only screen and (min-width: " + t[n] + ")" }); - themeTemplateContainer.appendChild(themeElem); + window.addEventListener("resize", function () { + v.R(r.Ke) && r.Ke.Xe() + }); + var i = document.getElementById("responsive-menu"); + document.getElementById("responsive-menu-toggle").onclick = function () { + "none" === window.getComputedStyle(i).getPropertyValue("display") ? i.style.display = "block" : v.R(r.Ke) && r.Ke.close() + }, i.firstElementChild.addEventListener("click", function (t) { + t.target === i.firstElementChild && v.R(r.Ke) && r.Ke.close() + }), r.Qe = e } - - return view; - }); - - super(viewPromise, "choose-theme-dialog-title"); - } -} - -class ImpressumSite extends WordRotatorBaseSite{ - constructor(siteManager) { - super(siteManager, "html/application/impressum.html", "impressum"); - } -} - -InitPromise.addPromise(app => { - app.addDeepLink("impressum", ImpressumSite); -}); - -class WordRotatorSettingFragment extends LocalStorageSettingsFragment { - constructor(site) { - super(site, "html/application/fragment/settings.html"); - } - - onFirstStart() { - let currentThemeName = ThemeManager.currentTheme._name; - SettingsManager.getInstance().setSetting("theme", currentThemeName); - - let themeNameElem = this.findBy("#theme-name"); - themeNameElem.removeAllChildren().appendChild(Translator.makePersistentTranslation(currentThemeName)); - this.findBy("#theme-chooser").addEventListener("click", async () => { - let newTheme = await (new ChooseThemeDialog()).show(); - if (Helper.isNotNull(newTheme)) { - SettingsManager.getInstance().setSetting("theme", newTheme); - ThemeManager.changeCurrentTheme(newTheme); - themeNameElem.removeAllChildren().appendChild(Translator.makePersistentTranslation(newTheme)); - } - }); - - this.findBy("#reset-levels").addEventListener("click", () => { - localStorage.removeItem("currentLevel"); - localStorage.removeItem("date-last-sync"); - localStorage.removeItem("levelCounter"); - localStorage.removeItem("tutorial-step"); - WordRotatorDb.getInstance().removeAll(WordRotatorDb.OBJECT_STORE.LEVEL); - }); - - if (location.hostname.includes("beta") || location.hostname.includes("127.0.0.1")) { - this.findBy("#reset-levels").classList.remove("hidden"); } - - let playMusicButton = this.findBy("#play-music"); - playMusicButton.addEventListener("change", () => { - let soundManager = SoundManager.getInstance(); - soundManager.set({muted: !playMusicButton.checked}, SoundManager.CHANNELS.MUSIC); - if (playMusicButton.checked) { - soundManager.play(SoundManager.CHANNELS.MUSIC); + }, { + key: "Ye", value: function () { + for (var e = void 0, n = 0; n < r.Qe.length; n++) { + var i = r.Qe[n]; + matchMedia(i.value).matches && (e = i) } - }); + return "object" == (void 0 === e ? "undefined" : t(e)) ? e.De : e + } + }, { + key: "Ze", value: function (t) { + for (var e = [], n = 0, r = t.length; n < r; n++) t[n].classList.contains("hidden") || e.push(t[n]); + return e + } + }]), r +}(); +k.Qe = [], k.Ke = null, k.init(); +var w = function () { + function t() { + s(this, t) + } - this.findBy("#track-switch").addEventListener("change", function (e) { - Matomo.setTrack(this.checked === true); - e.stopPropagation(); - e.preventDefault(); - }); + return n(t, null, [{ + key: "tn", value: function (e, n) { + n = v.m(n, []).slice(0); + var r = Promise.resolve(); + if (e instanceof Element) r = Promise.resolve(e); else { + if (-1 !== n.indexOf(e)) return Promise.reject("views are in a circuit! cannot resolve view for url " + n[0] + "! url " + e + " is in stack before!"); + n.push(e), r = fetch(v.Gt(e), {credentials: "same-origin"}).then(function (t) { + return t.text() + }).then(function (t) { + var e = (new DOMParser).parseFromString(t, "text/html"); + return v.Mt(e) && ((e = document.implementation.createHTMLDocument("")).body.innerHTML = t), e.body.firstChild + }) + } + return r.then(function (e) { + for (var r = [], i = e.querySelectorAll("[data-view]"), o = function (e, o) { + r.push(t.tn(i[o].dataset.view, n).then(function (t) { + i[o].replaceWith(t) + })) + }, s = 0, a = i.length; s < a; s++) o(0, s); + return Promise.all(r).then(function () { + return e + }) + }) + } + }]), t +}(), _ = function () { + function t(e) { + s(this, t); + var n = this; + this.en = null, this.nn = !0, this.sn = new Promise(function (t) { + n.in = t + }), this.rn = {}, v.R(e) && this.on(e) + } - this.findBy("#credits-button").addEventListener("click", () => { - this.getSite().startSite(CreditsSite); - }); - this.findBy("#privacy-policy-button").addEventListener("click", () => { - this.getSite().startSite(PrivacyPolicySite); - }); - this.findBy("#contact-button").addEventListener("click", () => { - this.getSite().startSite(ContactSite); - }); - this.findBy("#impressum-button").addEventListener("click", () => { - this.getSite().startSite(ImpressumSite); - }); + return n(t, [{ + key: "an", value: function () { + var t = []; + for (var e in this.rn) t.push(this.rn[e].an.apply(this.rn[e], arguments)), t.push(this.rn[e].sn); + return Promise.all(t) + } + }, { + key: "ln", value: function () { + var t = this, e = arguments; + this.nn && (this.hn(), this.nn = !1); + var n = function (n) { + var r = t.rn[n]; + r.ln.apply(t.rn[n], e), t.rn[n].sn.then(function (t) { + r.un() ? t.classList.remove("hidden") : t.classList.add("hidden") + }) + }; + for (var r in this.rn) n(r) + } + }, { + key: "hn", value: function () { + } + }, { + key: "cn", value: function () { + for (var t in this.rn) this.rn[t].cn.apply(this.rn[t], arguments) + } + }, { + key: "dn", value: function () { + for (var t in this.rn) this.rn[t].dn.apply(this.rn[t], arguments) + } + }, { + key: "mn", value: function (t, e) { + this.rn[t] = e, this.sn = this.sn.then(function (n) { + return e.sn.then(function (e) { + return n.querySelector(t).appendChild(e), n + }) + }) + } + }, { + key: "on", value: function (t) { + var e = this; + return this.in(w.tn(t).then(function (t) { + return e.en = t, t + })), this.sn + } + }, { + key: "gn", value: function (t, e, n) { + e = v.m(e, !1); + var r = function (n) { + var r = null; + return e ? (r = n.querySelectorAll(t), n.matches(t) && r.push(n)) : r = n.matches(t) ? n : n.querySelector(t), r + }; + return (n = v.m(n, !1)) ? this.sn.then(function (t) { + return r(t) + }) : r(this.en) + } + }]), t +}(), b = function () { + function t(e, n, r) { + var o; + return s(this, t), (o = i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, n))).pn = !1, o.fn = e, o.Sn = !1, o.wn = null, o.url = "", o.Mn = r, o.Hn = {}, o.title = e.yn(), o + } - InstallManager.setCanInstallListener(() => { - let installButton = this.findBy("#install-button"); - installButton.addEventListener("click", () => { - installButton.classList.add("hidden"); - InstallManager.prompt().then((e) => { - console.log("clicked", e); - if (e["outcome"] === "accepted") { - Matomo.trackEvent("installed", "installed"); + return o(t, _), n(t, [{ + key: "k", value: function (t, e) { + "string" == typeof t && (e = t, t = document.createTextNode(t)), this.title = {vn: t}, this.title.title = v.m(e, this.title.title), this.pn && this.fn.Pn() + } + }, { + key: "Tn", value: function () { + return this.Ln(this.fn.bn()) + } + }, { + key: "on", value: function (n) { + var r = this; + return e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "on", this).call(this, n).then(function (t) { + for (var e = [], n = 0, i = r.rn.length; n < i; n++) e.push(r.rn[n].sn); + return Promise.all(e).then(function () { + return t + }) + }) + } + }, { + key: "an", value: function (n) { + return this.Hn = n, v.R(this.Mn) && this.An(n), e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "an", this).call(this, n) + } + }, { + key: "ln", value: function (n) { + this.pn = !0; + var r = e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "ln", this).call(this, n); + return this.wn.j(), r + } + }, { + key: "cn", value: function (n) { + e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "cn", this).call(this, n), this.pn = !1 + } + }, { + key: "finish", value: function (t) { + this.Sn || (this.Sn = !0, this.fn.Cn(this, t)) + } + }, { + key: "Ln", value: function (t, e) { + return this.fn.Ln(t, e) + } + }, { + key: "kn", value: function () { + this.fn.kn(this) + } + }, { + key: "Fn", value: function (t, e, n) { + this.Ln(t, e), this.finish(n) + } + }, { + key: "xn", value: function (t) { + for (var e = this.fn.Bn(), n = 0, r = e.length; n < r; n++) t.at(e[n].K()); + return t + } + }, { + key: "Dn", value: function (t) { + this.url = t, this.fn.In(this) + } + }, { + key: "An", value: function (t) { + this.Dn(this.Mn + v.ae(t)) + } + }, { + key: "Rn", value: function (t) { + this.Hn = Object.assign(this.Hn, t), this.An(this.Hn) + } + }, { + key: "Un", value: function () { + return this.url + } + }, { + key: "En", value: function () { + return v.Gt(this.url) + } + }, { + key: "Wn", value: function () { + } + }, { + key: "addListener", value: function (t, e, n) { + this.fn.addListener(this, t, e, n) + } + }, { + key: "Nn", value: function (t, e) { + this.fn.Nn(this, t, e) + } + }, { + key: "On", value: function (t, e, n, r) { + this.fn.On(this, t, e, n, r) + } + }]), t +}(), x = function () { + function t(e, n) { + s(this, t), this._n = e, this.en = null, this.jn = {}, this.Vn = {}, this.Jn = n + } + + return n(t, [{ + key: "qn", value: function () { + return this._n + } + }, { + key: "zn", value: function (t) { + t instanceof b && (this._n = t) + } + }, { + key: "$n", value: function () { + return this.en + } + }, { + key: "Gn", value: function (t) { + this.en = t + } + }, { + key: "Kn", value: function () { + return this.jn + } + }, { + key: "Xn", value: function (t) { + this.jn = t + } + }, { + key: "Qn", value: function () { + return this.Vn + } + }, { + key: "Yn", value: function (t) { + this.Vn = t + } + }, { + key: "Zn", value: function () { + return this.Jn + } + }, { + key: "ts", value: function (t) { + this.Jn = t + } + }]), t +}(), O = function () { + function t(e, n, r) { + s(this, t), this.es = document.getElementById(e), this.ns = [], this.ss = null, this.rs = v.m(n, ".action-bar"), this.os = Promise.resolve(), this.as = [], this.ls = null, this.app = r, this.hs = document.querySelector(".top-bar-title"); + for (var i = document.createElement("span"); this.hs.childNodes.length > 0;) { + var o = this.hs.firstChild; + o.remove(), i.appendChild(o) + } + this.us = {vn: i, title: document.title}; + var a = this; + window.onpopstate = function () { + if (a.ns.length >= 1) { + var t = a.ns[a.ns.length - 1].qn(); + !1 !== t.Wn() && a.Cn(t) + } + } + } + + return n(t, [{ + key: "yn", value: function () { + return this.us + } + }, { + key: "cs", value: function (t) { + this.ls = t + } + }, { + key: "bn", value: function () { + return this.ls + } + }, { + key: "ds", value: function (t) { + this.as.push(t) + } + }, { + key: "Bn", value: function () { + return this.as + } + }, { + key: "ms", value: function () { + return v.R(this.ss) ? this.ss.qn() : null + } + }, { + key: "gs", value: function () { + var t = r(regeneratorRuntime.mark(function t(e) { + var n; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + n = this.ns.length - 1; + case 1: + if (!(n >= 0)) { + t.next = 9; + break + } + return t.next = 4, e(this.ns[n].qn()); + case 4: + if (!t.sent) { + t.next = 6; + break + } + return t.abrupt("return", this.ns[n].qn()); + case 6: + n--, t.next = 1; + break; + case 9: + return t.abrupt("return", null); + case 10: + case"end": + return t.stop() } - }); - }); - installButton.classList.remove("hidden"); - }); - - let storageManager = MyStorageManager.getInstance(); - if (storageManager.canEstimateStorage() && false) { - console.log("can estimate storage!"); - storageManager.estimate().then(storage => { - let storageObject = this.findBy("#storage-info"); - storageObject.appendChild(Translator.makePersistentTranslation("storage-info", [Math.round(storage.usage/(1024*1024)*100)/100, Math.round(storage.quota/(1024*1024)*100)/100, Math.round(storage.usage/storage.quota*10000)/100])); - storageObject.parentElement.classList.remove("hidden"); - }); - } - - return super.onFirstStart(); - } - - onStart() { - Matomo.update("Settings Site"); - super.onStart(); - } -} - -InitPromise.addPromise(function () { - SettingsSite.addSettingsFragment("settings", WordRotatorSettingFragment); -}); - -class SelectWordsSite extends UserSite{ - - constructor(siteManager) { - super(siteManager, "version/2/html/selectWords.html", null, "select-words"); - } - - async onConstruct(args) { - let res = await super.onConstruct(args); - this.stats = (await DataManager.load("words"))["result"]; - this.words = this.stats["wordsToCheck"]; - console.log(this.stats); - return res; - } - - onFirstStart() { - super.onFirstStart(); - this.findBy("#not-checked").appendChild(document.createTextNode(this.stats["wordsNotChecked"])); - this.findBy("#checked").appendChild(document.createTextNode(this.stats["wordsChecked"])); - this.findBy("#not-sure").appendChild(document.createTextNode(this.stats["wordsUnsure"])); - this.findBy("#deleted").appendChild(document.createTextNode(this.stats["wordsDeleted"])); - this.findBy("#unused").appendChild(document.createTextNode(this.stats["wordsNotUsed"])); - - let template = this.findBy("#word-template"); - template.id = null; - template.remove(); - - let container = this.findBy("#word-container"); - - let numWords = this.words.length; - for (let i = 0; i < numWords; i++) { - let wordElement = Helper.cloneNode(template); - wordElement.dataset["id"] = -1; - this.setWord(wordElement, this.words[i]); - container.appendChild(wordElement); - - wordElement.querySelector(".button-ok").addEventListener("click", async () => { - let newWord = (await DataManager.send("checkWord", { - "wordId":wordElement.dataset["id"], - "action":"1" - }))["result"]; - this.setWord(wordElement, newWord[0]); - }); - - wordElement.querySelector(".button-unsure").addEventListener("click", async () => { - let newWord = (await DataManager.send("checkWord", { - "wordId":wordElement.dataset["id"], - "action":"2" - }))["result"]; - this.setWord(wordElement, newWord[0]); - }); - - wordElement.querySelector(".button-delete").addEventListener("click", async () => { - let newWord = (await DataManager.send("checkWord", { - "wordId":wordElement.dataset["id"], - "action":"3" - }))["result"]; - this.setWord(wordElement, newWord[0]); - }); - } - } - - setWord(wordElement, word){ - wordElement.querySelector(".word").removeAllChildren().appendChild(document.createTextNode(word["word"])); - wordElement.dataset["id"] = word["id"]; - } -} - -InitPromise.addPromise(app => { - app.addDefaultAction(new UserAction("select-words", () => { - app.startSite(SelectWordsSite); - }, null, null, "select-words")); -}); - -class DeleteWordsSite extends UserSite { - constructor(siteManager) { - super(siteManager, "version/2/html/deleteLevels.html", null, "admin"); - } - - async onConstruct(args) { - let res = super.onConstruct(args); - this.words = (await DataManager.load("getDoubleUsedWordsAction"))["result"]; - return res; - } - - - onFirstStart() { - super.onFirstStart(); - - let levelTemplate = this.findBy("#level-template"); - let wordTemplate = this.findBy("#word-template"); - let wordContainer = this.findBy("#word-container"); - - levelTemplate.id = null; - levelTemplate.remove(); - - wordTemplate.id = null; - wordTemplate.remove(); - - for (let k in this.words) { - let wordElem = Helper.cloneNode(wordTemplate); - wordElem.querySelector(".name").appendChild(document.createTextNode(k)); - let levelContainer = wordElem.querySelector(".level-container"); - for (let j = 0; j < this.words[k].length; j++) { - let level = this.words[k][j]; - let levelElem = Helper.cloneNode(levelTemplate); - levelElem.querySelector(".id").appendChild(document.createTextNode(level["id"])); - levelElem.querySelector(".words").appendChild(document.createTextNode(level["words"])); - levelElem.querySelector(".positions").appendChild(document.createTextNode(level["rotations"])); - - levelElem.querySelector(".delete-button").addEventListener("click", async () => { - let res = await DataManager.send("deleteLevel", {"levelId": level["id"]}); - if (res["success"]){ - levelElem.remove(); - } - }); - - levelContainer.appendChild(levelElem); + }, t, this) + })); + return function () { + return t.apply(this, arguments) } - wordContainer.appendChild(wordElem); + }() + }, { + key: "Ln", value: function () { + var t = r(regeneratorRuntime.mark(function t(e, n) { + var i, o, s, a, u = this; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + if (e.prototype instanceof b) { + t.next = 2; + break + } + throw{error: "wrong class given! Expected AbstractSite, given " + e.name}; + case 2: + return i = new e(this), o = {}, s = new Promise(function (t, e) { + o.resolve = t, o.reject = e + }), a = new x(i, o), t.abrupt("return", (this.es.removeAllChildren().appendChild(v.he()), this.os = Promise.resolve(n).then(function () { + var t = r(regeneratorRuntime.mark(function t(e) { + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return a.Yn(e), t.next = 3, Promise.all([i.an(e), i.sn]); + case 3: + return i.wn = i.xn(u.ps()), t.abrupt("return", u.show(a)); + case 5: + case"end": + return t.stop() + } + }, t, u) + })); + return function () { + return t.apply(this, arguments) + } + }()).catch(function (t) { + console.error("site start error for site ", e.name, t) + }), s)); + case 4: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "Cn", value: function (t, e) { + var n = this; + this.os.then(function () { + var r = n.fs(t), i = n.ns.splice(r, 1), o = null; + if ((i = i[0]) === n.ss) { + n.ss.qn().cn(), n.ss = null; + var s = n.ns.length - 1; + if (s < 0) return n.Ss(), void app.ws(); + n.es.removeAllChildren().appendChild(v.he()), o = n.ns[s] + } + i.qn().dn(), Promise.resolve(e).then(function (t) { + i.Zn().resolve(t), v.R(o) && n.show(o) + }) + }) + } + }, { + key: "addListener", value: function (t, e, n, r) { + this.es.addEventListener(e, function (e) { + var i = e.target; + t.pn && i.matches(n) && r(i, e) + }) + } + }, { + key: "On", value: function (t, e, n, r, i) { + this.addListener(t, n, r, i), this.Nn(t, e, i) + } + }, { + key: "Nn", value: function (t, e, n) { + window.addEventListener("keydown", function (r) { + t.pn && r.which === e && n(this, r) + }) + } + }, { + key: "kn", value: function (t) { + var e = this.fs(t), n = this.ns.splice(e, 1); + n = n[0], this.show(n) + } + }, { + key: "Ms", value: function () { + return this.show(this.ss) + } + }, { + key: "show", value: function (t) { + v.R(this.ss) && (this.ss.Xn(this.ss.qn().cn()), this.ss.Gn(this.es.innerHTML)), this.es.removeAllChildren().appendChild(v.he()); + var e = this; + return this.ss = t, -1 === this.ns.indexOf(t) && this.ns.push(t), t.qn().sn.then(function (n) { + return t.qn().wn.j(), e.es.removeAllChildren().appendChild(n), e.Pn(), d.Kt().Xt(), n + }).then(function (n) { + t.qn().ln(t.Kn()), history.pushState({ + siteName: t.qn().constructor.name, + siteData: n.outerHTML, + stackPosition: e.ns.length - 1 + }, t.qn().constructor.name, t.qn().En()) + }) + } + }, { + key: "In", value: function (t) { + if (v.R(this.ss) && this.ss.qn() === t) { + history.replaceState({ + siteName: t.constructor.name, + siteData: t.en.outerHTML, + stackPosition: this.ns.length - 1 + }, t.constructor.name, t.En()) + } + } + }, { + key: "ms", value: function () { + if (null != this.ss) return this.ss.qn() + } + }, { + key: "Hs", value: function () { + null != this.ss && this.ss.qn().wn.j() + } + }, { + key: "Pn", value: function () { + var t = this.ms().title; + this.hs.removeAllChildren().appendChild(t.vn), document.title = v.m(t.title, this.us.title) + } + }, { + key: "fs", value: function (t) { + for (var e = 0, n = this.ns.length; e < n; e++) if (this.ns[e].qn() === t) return e; + return -1 + } + }, { + key: "ys", value: function (t) { + var e = this.fs(t); + return -1 === e ? null : this.ns[e] + } + }, { + key: "Ss", value: function () { + this.es.removeAllChildren().appendChild(d.pt("The app has ended! Please close the window.")) + } + }, { + key: "ps", value: function () { + return new k(this.rs) + } + }]), t +}(), L = function () { + function t() { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).apply(this, arguments)) + } + + return o(t, b), n(t, [{ + key: "an", value: function (t) { + var e = null; + v.re(t, "url") ? e = t.url : (e = document.createElement("div")).innerHTML = "Paused...", this.on(e) + } + }, { + key: "cn", value: function () { + console.log("onPause"); + for (var n = 0; n < t.vs.length; n++) "function" == typeof t.vs[n] && t.vs[n](); + return e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "cn", this).call(this) + } + }, { + key: "ln", value: function () { + console.log("onStart"); + for (var n = 0; n < t.Ps.length; n++) "function" == typeof t.Ps[n] && t.Ps[n](); + return e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "cn", this).call(this) + } + }]), t +}(); +L.Ps = [], L.vs = []; +var P = function () { + function t() { + var e = this; + s(this, t), this.Ts = null, this.Ls = ".action-bar", this.Ce = m.ue(), this.bs = "site-content", this.As = new Map, this.Cs = [], this.ks = !1, this.Fs = !0, this.xs = null, this.Bs = function () { + return e.Ln(e.xs) } } -} -InitPromise.addPromise(app => { - app.addDefaultAction(new UserAction("delete-levels", () => { - app.startSite(DeleteWordsSite); - },null, null, "admin")); + return n(t, [{ + key: "Ds", value: function () { + return this.Ts + } + }, { + key: "ds", value: function (t) { + this.Cs.push(t) + } + }, { + key: "Is", value: function (t) { + this.ks = t + } + }, { + key: "Rs", value: function () { + return this.bs + } + }, { + key: "Us", value: function (t) { + this.bs = t + } + }, { + key: "Es", value: function () { + return this.Ls + } + }, { + key: "Ws", value: function (t) { + this.Ls = t + } + }, { + key: "ue", value: function () { + return this.Ce + } + }, { + key: "Ae", value: function (t) { + this.Ce = t + } + }, { + key: "Ns", value: function (t, e) { + this.As.set(t.toLowerCase(), e) + } + }, { + key: "Os", value: function (t) { + this.Fs = t + } + }, { + key: "Ms", value: function () { + this.Ts.Ms() + } + }, { + key: "pause", value: function (t) { + this.Ln(L, {url: t}) + } + }, { + key: "resume", value: function () { + var t = this.Ts.ms(); + t instanceof L && t.finish() + } + }, { + key: "_s", value: function (t) { + return t = t.toLowerCase(), this.As.has(t) ? this.As.get(t) : null + } + }, { + key: "js", value: function () { + var t = ""; + return 0 === window.location.pathname.search(this.Ce) && (t = window.location.pathname.substr(this.Ce.length).trim()), "/" === t.charAt(0) && (t = t.substr(1).trim()), "/" === t.charAt(t.length - 1) && (t = t.substr(0, t.length - 2).trim()), 0 === t.length && window.location.hash && (t = window.location.hash.substr(1).trim()), this._s(t) + } + }, { + key: "Vs", value: function () { + for (var e = this, n = document.getElementsByClassName("deep-link"), r = 0, i = n.length; r < i; r++) n[r].addEventListener("click", function (n) { + return n.preventDefault(), e.Ts.Ln(v.m(e._s(this.dataset.siteName), e.xs), t.Js(this.dataset.siteArgs)), !0 + }) + } + }, { + key: "qs", value: function (t) { + var e = this.Cs.indexOf(t); + e >= 0 && (this.Cs[e].remove(!0), this.Cs.splice(e, 1)) + } + }, { + key: "Ln", value: function (t, e) { + return this.Ts.Ln(t, e) + } + }, { + key: "start", value: function (e) { + m.Ae(this.Ce); + var n = v.m(this.js(), e), r = t.zs(); + this.xs = e, d.init(), y.init(), this.ks && this.ds(y.We()), this.Ts = new O(this.bs, this.Ls), this.Ts.as = this.Cs, this.Ts.cs(e), this.Ts.Ln(n, r), this.Vs(), this.Fs && (this.$s = g.Ne("cookie-compliance")) + } + }, { + key: "ms", value: function () { + return this.Ts.ms() + } + }, { + key: "ws", value: function () { + var t = r(regeneratorRuntime.mark(function t() { + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + "function" == typeof this.Bs && this.Bs(); + case 1: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "setAppEndListener", value: function (t) { + this.Bs = t + } + }, { + key: "gs", value: function () { + var t = r(regeneratorRuntime.mark(function t(e) { + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return t.abrupt("return", this.Ts.gs(e)); + case 1: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }], [{ + key: "Js", value: function (t) { + if (v.Mt(t)) return null; + for (var e = {}, n = [], r = t.split("&"), i = 0; i < r.length; i++) (n = r[i].split("="))[0].trim().length > 0 && (e[n[0]] = decodeURIComponent(n[1])); + return e + } + }, { + key: "zs", value: function () { + return t.Js(window.location.search.substr(1)) + } + }]), t +}(), R = function () { + function t(e, n) { + s(this, t), this.Gs = null, this.content = null, this.Ks = null, this.cancelable = !0, this.title = v.m(n, ""), this.Xs = !0, this.Qs = "", this.buttons = [], this.result = null, v.R(e) && this.Ys(e) + } + + return n(t, [{ + key: "k", value: function (t) { + return this.title = t, this + } + }, { + key: "Zs", value: function (t) { + this.Xs = t + } + }, { + key: "ti", value: function (t) { + this.Qs = t + } + }, { + key: "D", value: function () { + return this.title + } + }, { + key: "ei", value: function (t) { + return this.cancelable = !0 === t, this + } + }, { + key: "Ys", value: function () { + var t = r(regeneratorRuntime.mark(function t(e) { + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return this.ni = Promise.resolve(e), t.next = 3, this.ni; + case 3: + return this.content = t.sent, t.abrupt("return", this); + case 5: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "si", value: function (t, e, n) { + n = v.m(n, !0); + var r = null; + "string" == typeof t ? ((r = document.createElement("button")).classList.add("button"), r.classList.add("right"), r.appendChild(d.pt(t))) : r = t; + var i = this; + if ("function" != typeof e) { + var o = e; + e = function () { + i.result = o + } + } + var s; + s = n ? function (t) { + v.R(e) && e(t), i.close() + } : e, v.R(s) && r.addEventListener("click", s), this.buttons.push(r) + } + }, { + key: "show", value: function () { + var t = r(regeneratorRuntime.mark(function t() { + var e, n, r, i, o, s, a, u, l; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + for ((e = document.createElement("span")).classList.add("title"), this.Xs && "" !== this.title ? e.appendChild(d.pt(this.title)) : e.innerHTML = this.title, (n = document.createElement("div")).appendChild(e), (r = document.createElement("div")).classList.add("content-container"), (i = document.createElement("div")).className = this.Qs, i.classList.add("modal"), i.appendChild(n), i.appendChild(r), (o = document.createElement("div")).classList.add("modal-button-container"), s = 0, a = this.buttons.length; s < a; s++) o.appendChild(this.buttons[s]); + return t.next = 13, this.ni; + case 13: + return this.content instanceof Node || (this.content = this.Xs ? d.pt(this.content) : document.createTextNode(this.content)), r.appendChild(this.content), this.Ks = document.createElement("div"), this.Ks.classList.add("background"), this.Ks.appendChild(i), this.Ks.querySelector(".modal").appendChild(o), this.Ks.style.display = "block", u = this, this.cancelable && ((l = document.createElement("span")).classList.add("close"), l.innerHTML = "×", n.appendChild(l), l.addEventListener("click", function () { + u.close() + }), window.addEventListener("click", function (t) { + t.target === u.Ks && u.close() + })), t.abrupt("return", (document.body.appendChild(this.Ks), d.Kt().Xt(), new Promise(function (t) { + u.Gs = t + }))); + case 23: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "close", value: function () { + v.R(this.Ks) && (this.Ks.style.display = "none", this.Ks.remove(), this.Ks = null), v.R(this.Gs) && this.Gs(this.result) + } + }, { + key: "ii", value: function () { + this.si("confirm-button") + } + }]), t +}(), E = function () { + function e() { + s(this, e) + } + + return n(e, null, [{ + key: "ri", value: function (t, e) { + e = v.m(e, 0), setTimeout(function () { + var e = document.getElementById("flashMessage" + t); + e.fadeOut(.2).then(function () { + e.remove() + }) + }, e) + } + }, { + key: "oi", value: function (n, r, i, o) { + var s = null; + (v.Mt(r) || "object" == (void 0 === r ? "undefined" : t(r))) && (s = r, r = n, n = e.ai, o = !0), o = v.m(o, !1); + var a = e.li, u = document.createElement("div"), l = document.createElement("div"); + l.className = "flashMessage " + n, l.id = "flashMessage" + a, l.style.opacity = "0", l.addEventListener("click", function () { + e.ri(a) + }), l.appendChild(o ? d.pt(r, s, "span") : document.createTextNode(r)), u.appendChild(l), document.getElementById("flashMessageContainer").appendChild(u), l.fadeIn(), (i = v.m(i, e.hi)) > 0 && e.ri(e.li, i), e.li++ + } + }]), e +}(); +E.li = 0, E.hi = 3500, E.ui = 1e3, E.ai = "success", E.ci = "error", E.di = "default", E.mi = "info", E.gi = "warning"; +var C = function () { + function t(e, n) { + s(this, t); + var r = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB || window.pi; + this.fi = r.open(e, n); + var i = this; + this.fi.onupgradeneeded = function (t) { + i.Si(i.fi.result, t.oldVersion, t.newVersion, t) + }, this.wi = new Promise(function (t) { + i.fi.onsuccess = function (e) { + i.Bt = i.fi.result, t(e) + } + }) + } + + return n(t, [{ + key: "Mi", value: function (t, e, n) { + var r = this; + return "function" == typeof e && v.Mt(n) && (n = e, e = "read"), this.wi.then(function () { + var i = null; + try { + i = r.fi.result.transaction(t, e) + } catch (e) { + console.warn(e), i = r.fi.result.transaction(t) + } + n(i) + }) + } + }, { + key: "Hi", value: function (t, e, n) { + return "function" == typeof e && v.Mt(n) && (n = e, e = "readonly"), this.Mi(t, e, function (e) { + n(e.objectStore(t)) + }) + } + }, { + key: "yi", value: function (t, e) { + var n = this; + return new Promise(function (r) { + n.Hi(e, "readwrite", function (e) { + var n = e.put(t); + n.onsuccess = r, n.onerror = function (t) { + throw{type: "indexed-db-error", event: t} + } + }) + }) + } + }, { + key: "vi", value: function (t, e) { + var n = this; + return new Promise(function (r) { + n.Hi(e, "readwrite", function (e) { + for (var n = [], i = function (r, i) { + n.push(new Promise(function (n) { + var r = e.put(t[i]); + r.onsuccess = n, r.onerror = function (t) { + throw{type: "indexed-db-error", event: t} + } + })) + }, o = 0, s = t.length; o < s; o++) i(0, o); + r(Promise.all(n)) + }) + }) + } + }, { + key: "load", value: function (t, e) { + var n = this; + return new Promise(function (r, i) { + n.Hi(e, function (e) { + var n = e.get(t); + n.onsuccess = function (t) { + r(t.currentTarget.result) + }, n.onerror = function (t) { + throw console.warn(t), {type: "indexed-db-load-error", event: t} + } + }).catch(function (t) { + console.warn(t), i(t) + }) + }) + } + }, { + key: "Pi", value: function (t, e, n) { + var r = this; + return new Promise(function (i, o) { + r.Hi(t, function (t) { + var r = t.getAll(e, n); + r.onsuccess = function (t) { + i(t.currentTarget.result) + }, r.onerror = function (t) { + throw console.warn(t), {type: "indexed-db-load-error", event: t} + } + }).catch(function (t) { + console.warn(t), o(t) + }) + }) + } + }, { + key: "Ti", value: function (t, e, n, r, i) { + var o = this; + return new Promise(function (s) { + o.Hi(n, function (n) { + var o = n.index(t); + o.onerror = function (t) { + throw{type: "indexed-db-index-error", event: t} + }; + var a = o.openCursor(e, i); + a.onerror = function (t) { + throw{type: "indexed-db-index-error", event: t} + }; + var u = [], l = 0; + a.onsuccess = function (t) { + var e = t.target.result; + e && (u.push(e.value), l++, v.Mt(r) || l < r) ? e.continue() : s(u) + } + }) + }) + } + }, { + key: "remove", value: function (t, e) { + var n = this; + return new Promise(function (r) { + n.Hi(e, "readwrite", function (e) { + var n = e.delete(t); + n.onerror = function (t) { + throw{type: "indexed-db-delete-error", event: t} + }, n.onsuccess = function () { + r() + } + }) + }) + } + }, { + key: "Li", value: function (t, e) { + var n = this; + return new Promise(function (r) { + n.Hi(e, "readwrite", function (e) { + for (var n = [], i = function (r, i) { + (r = e.delete(t[i])).onerror = function (t) { + throw{type: "indexed-db-delete-error", event: t} + }, n.push(new Promise(function (t) { + r.onsuccess = function () { + t() + } + })) + }, o = 0, s = t.length; o < s; o++) i(s, o); + r(Promise.all(n)) + }) + }) + } + }, { + key: "bi", value: function (t, e, n) { + var r = this; + return new Promise(function (i) { + r.Hi(n, "readwrite", function (n) { + var r = n.index(t); + r.onerror = function (t) { + throw{type: "indexed-db-index-error", event: t} + }; + var o = r.openCursor(e); + o.onerror = function (t) { + throw{type: "indexed-db-index-error", event: t} + }, o.onsuccess = function (t) { + var e = t.target.result; + e ? (e.delete(), e.continue()) : i() + } + }) + }) + } + }, { + key: "Ai", value: function (t) { + var e = this; + return new Promise(function (n) { + e.Hi(t, "readwrite", function (t) { + var e = t.clear(); + e.onerror = function (t) { + throw{type: "indexed-db-index-error", event: t} + }, e.onsuccess = n + }) + }) + } + }, { + key: "Si", value: function () { + } + }]), t +}(), S = function () { + function t() { + s(this, t) + } + + return n(t, null, [{ + key: "Ci", value: function (e) { + if (v.R(t.ki[e])) return t.ki[e]; + var n = new Promise(function (t) { + var n = document.createElement("script"); + n.src = v.Gt(e), n.onload = t, document.body.appendChild(n) + }); + return t.ki[e] = n, n + } + }, { + key: "Fi", value: function (e, n) { + if (v.R(t.xi[e])) return t.xi[e]; + n = v.m(n, "all"); + var r = new Promise(function (t) { + var r = document.createElement("link"); + r.rel = "stylesheet", r.type = "text/css", r.href = v.Gt(e), r.media = n, r.onload = t, document.head.appendChild(r) + }); + return t.xi[e] = r, r + } + }]), t +}(); +S.ki = {}, S.xi = {}; +var j = function () { + function t(e, n, r, i) { + s(this, t), this.Bi = e, this.L = n, this.Di = r, v.m(i, !1) && (this.L = w.tn(this.L)) + } + + return n(t, [{ + key: "Ii", value: function (t) { + return t === (t & this.Bi) + } + }, { + key: "J", value: function () { + return this.L + } + }, { + key: "Ri", value: function () { + return this.Di + } + }]), t +}(); +j.Ui = 1, j.Ei = 2, j.Wi = 4, j.Ni = j.Ei + j.Wi, j.TYPE_ALL = j.Ui + j.Ni, u.l(function () { + window.ShareButton = j, window.ShareButton.TYPE_ALL = j.TYPE_ALL }); +var T = function () { + function t(e, n, r, o) { + if (s(this, t), Array.isArray(e) && e[0] instanceof j) { + var a = e[0]; + r = e, e = a.Bi, n = a.L, o = v.m(o, n) + } + return i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, n, function (t, e, n) { + Array.isArray(r) || (r = [r]); + for (var i = 0; i < r.length; i++) r[i] instanceof j ? r[i].Ri()(t, e, n) : (console.log(r, i), r[i](t, e, n)) + }, o)) + } -let basePath = "/pwa/wordRotator/public/"; -if (window.location.pathname.indexOf("publicTest/") >= 0) -{ - basePath = "/pwa/wordRotator/publicTest/"; -} + return o(t, j), t +}(), M = function () { + function t() { + s(this, t) + } -SystemSettings.setBasePath(basePath); -Translator.supportedLanguages = ["de"]; -Translator.markTranslations = false; + return n(t, null, [{ + key: "init", value: function () { + t.Oi = [] + } + }, { + key: "_i", value: function (e) { + t.Oi.push(e) + } + }, { + key: "ji", value: function (e) { + return t.Vi(e, t.Ji()) + } + }, { + key: "qi", value: function (e, n) { + return t.zi(e, n, t.Ji()) + } + }, { + key: "Vi", value: function (e, n) { + return t.zi(e, t.Oi, n) + } + }, { + key: "zi", value: function (e, n, r) { + for (var i = document.createElement("div"), o = t.$i(), s = function (t) { + if (n[t].Ii(o)) { + var s = r(n[t], e); + s.onclick = function (r) { + n[t].Ri()(e, this, r) + }, i.appendChild(s) + } + }, a = 0, u = n.length; a < u; a++) s(a); + return i + } + }, { + key: "$i", value: function () { + return navigator.userAgent.match(/iPhone|iPad|iPod/i) ? j.Ei : null !== navigator.userAgent.match(/Android|BlackBerry|Opera Mini|IEMobile/i) || void 0 !== window.orientation ? j.Wi : j.Ui + } + }, { + key: "Ji", value: function () { + return function (t) { + var e = document.createElement("a"); + e.classList.add("share-icon"); + var n = t.J(); + if ("string" == typeof n) { + var r = document.createElement("img"); + r.src = v.Gt(t.J()), r.classList.add("share-icon"), e.appendChild(r) + } else Promise.resolve(n).then(function (t) { + e.appendChild(t) + }); + return e + } + } + }]), t +}(); +M.init(), u.l("ShareManager.addShareButton", M._i); +var A = function () { + function t(e, n) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, j.Ni, e, function (t) { + var e; + e = M.$i() === j.Ei ? "sms:&body=" + encodeURIComponent(t) : "sms:?&body=" + encodeURIComponent(t), window.open(e, "_blank", "noopener") + }, n)) + } -Matomo.SIDE_ID = "2"; + return o(t, j), t +}(), N = function () { + function t(e, n) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, j.TYPE_ALL, e, function (t) { + var e = "https://t.me/share/url?url=" + encodeURIComponent(t); + window.open(e, "_blank", "noopener") + }, n)) + } -window.onerror = (e, u, l) => { - console.error(e, u, l); + return o(t, j), t +}(), I = function () { + function t(e, n) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, j.TYPE_ALL, e, function (t) { + var e; + e = M.$i() === j.Ui ? "https://web.whatsapp.com/send?text=" + encodeURIComponent(t) : "whatsapp://send?text=" + encodeURIComponent(t), window.open(e, "_blank", "noopener") + }, n)) + } + + return o(t, j), t +}(), D = function () { + function t(e, n) { + var r; + return s(this, t), (r = i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, n))).Gi = e, r.active = !0, r + } + + return o(t, _), n(t, [{ + key: "qn", value: function () { + return this.Gi + } + }, { + key: "un", value: function () { + return this.active + } + }]), t +}(), B = function t(e, n, r) { + s(this, t), this.De = e, this.Ie = n, this.L = r }; +var q = function t() { + s(this, t) +}; +q.Xi = {Qi: "version/2/ckeditor/ckeditor.js", Yi: "version/1/listjs/list.min.js"}; +var K = function () { + function t() { + s(this, t) + } -applyPolyfills(); + return n(t, null, [{ + key: "load", value: function () { + var e = r(regeneratorRuntime.mark(function e(n, r, i) { + var o; + return regeneratorRuntime.wrap(function (e) { + for (; ;) switch (e.prev = e.next) { + case 0: + return r = v.m(r, !1), i = v.m(i, !1), o = r ? v.Gt(t.Zi + n) : v.Gt(t.tr + n), e.abrupt("return", this.er(o, i)); + case 3: + case"end": + return e.stop() + } + }, e, this) + })); + return function () { + return e.apply(this, arguments) + } + }() + }, { + key: "er", value: function () { + var t = r(regeneratorRuntime.mark(function t(e, n) { + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return t.abrupt("return", fetch(e, {credentials: "same-origin"}).then(function (t) { + return n ? t.text() : t.json() + }).catch(function () { + if (!n) return {success: !1, errors: ["not-online"]} + })); + case 1: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "nr", value: function () { + var t = r(regeneratorRuntime.mark(function t(e, n) { + var r; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return n = v.m(n, !1), r = v.Gt(e), t.abrupt("return", this.er(r, n)); + case 3: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "send", value: function () { + var e = r(regeneratorRuntime.mark(function e(n, r) { + var i, o, s; + return regeneratorRuntime.wrap(function (e) { + for (; ;) switch (e.prev = e.next) { + case 0: + if (i = v.Gt(t.tr + n), !(r instanceof FormData)) { + for (s in o = new FormData, r) o.append(s, r[s]); + r = o + } + return e.abrupt("return", fetch(i, { + credentials: "same-origin", + method: "POST", + body: r + }).then(function (t) { + return t.json() + }).catch(function (t) { + return console.error("error", t), {success: !1, errors: ["not-online"]} + })); + case 3: + case"end": + return e.stop() + } + }, e, this) + })); + return function () { + return e.apply(this, arguments) + } + }() + }, { + key: "ae", value: function (t) { + return v.ae(t) + } + }]), t +}(); +K.tr = "data/", K.Zi = "cached/"; +var H = function () { + function t(e, n, i, o) { + s(this, t), this.sr = e, this.method = v.m(i, v.m(e.method, "POST")), this.ir = !0 === v.m(o, "get" === this.method.toLowerCase()), this.rr = !1, this.or = "string" == typeof n ? function (t) { + return "get" === l.method.toLowerCase() ? K.load(n + K.ae(t), l.ir) : K.send(n, t) + } : n; + var a, u, l = this; + this.ar = null, this.lr = (u = r(regeneratorRuntime.mark(function t(e) { + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return t.next = 2, l.hr(e); + case 2: + case"end": + return t.stop() + } + }, t, this) + })), function () { + return u.apply(this, arguments) + }), e.addEventListener("submit", (a = r(regeneratorRuntime.mark(function t(e) { + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return console.log("submitting!", e), e.preventDefault(), t.next = 4, l.ur(e); + case 4: + case"end": + return t.stop() + } + }, t, this) + })), function () { + return a.apply(this, arguments) + })); + for (var c = 0, h = e.elements.length; c < h; c++) { + var f = e.elements[c]; + f.addEventListener("change", function () { + "" !== this.value.trim() ? this.classList.add("notEmpty") : this.classList.remove("notEmpty"), this.setCustomValidity("") + }), f.addEventListener("keydown", function () { + this.setCustomValidity("") + }) + } + } -ThemeManager.addTheme(new Theme('red', 'red')); -ThemeManager.addTheme(new Theme("blue", "blue")); -ThemeManager.addTheme(new Theme("black", "black")); -ThemeManager.addTheme(new Theme("green", "green")); -ThemeManager.addTheme(new Theme("pink", "pink")); -ThemeManager.addTheme(new Theme("dark", "dark")); + return n(t, [{ + key: "cr", value: function (t, e) { + var n; + n = (e = v.m(e, !0)) ? function (e) { + if (Array.isArray(e) && e.indexOf("optimistic-locking-exception") >= 0) { + var n = new R("optimistic-locking-dialog", "optimistic-locking-dialog-title"); + n.ii(), n.show() + } else t(e) + } : t, this.lr = n + } + }, { + key: "ur", value: function () { + if (!this.rr) { + var t = this; + return this.submit().then(function (e) { + if (e.success) { + if (null !== t.ar) return t.ar(e.result) + } else if (v.R(t.lr)) return t.lr(e.errors) + }) + } + } + }, { + key: "load", value: function (t, e) { + return this.dr(K.load(t, e).then(function (t) { + return t.success ? t.result : {} + })), this + } + }, { + key: "dr", value: function (t) { + this.mr(!0); + var e = this; + return Promise.resolve(t).then(function (t) { + for (var n in e.mr(!1), t) if (v.R(e.sr.elements[n])) { + if (v.R(e.sr.elements[n].options) && v.R(t[n + "Options"])) { + var r = e.sr.elements[n].options; + for (var i in t[n + "Options"]) { + var o = document.createElement("option"); + o.value = i, o.innerText = t[n + "Options"][i], r.add(o) + } + } + e.sr.elements[n].value = v.we(t[n]), v.R(t[n]) && "" !== ("" + t[n]).trim() ? e.sr.elements[n].classList.add("notEmpty") : e.sr.elements[n].classList.remove("notEmpty") + } + return e + }) + } + }, { + key: "hr", value: function () { + var t = r(regeneratorRuntime.mark(function t(e) { + var n, r, i, o; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + for (i in n = !1, r = null, e) v.R(this.sr.elements[i]) && "hidden" !== this.sr.elements[i].type && v.Mt(this.sr.elements[i].gr) && (v.Mt(this.sr.elements[i].disabled) || !this.sr.elements[i].disabled) && (this.sr.elements[i].setCustomValidity(d.translate(v.m(e[i], "form-default-error"))), n = !0), v.Mt(r) && (r = v.m(e[i], "form-default-error")); + if (n || !v.R(r)) { + t.next = 11; + break + } + t.t0 = regeneratorRuntime.keys(this.sr.elements); + case 4: + if ((t.t1 = t.t0()).done) { + t.next = 11; + break + } + if (o = t.t1.value, "hidden" === this.sr.elements[o].type) { + t.next = 9; + break + } + return this.sr.elements[o].setCustomValidity(d.translate(r)), n = !0, t.abrupt("break", 11); + case 9: + t.next = 4; + break; + case 11: + n && this.sr.querySelector("input[type=submit]").click(); + case 12: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "mr", value: function (t) { + this.rr = t, this.rr ? this.sr.classList.add("sending") : this.sr.classList.remove("sending") + } + }, { + key: "submit", value: function () { + var t = this; + return new Promise(function (e) { + t.mr(!0); + var n = new FormData(t.sr); + e(t.or(n)) + }).then(function (e) { + return t.mr(!1), e + }) + } + }, { + key: "pr", value: function (t) { + this.ar = t + } + }]), t +}(), F = function () { + function t() { + s(this, t), this.ke = null, this.wr = "settings" + } -ShareManager.addShareButton(new MatomoShareButton(new WhatsappShareButton('img/whatsapp.svg'), "whatsapp", true)); -ShareManager.addShareButton(new MatomoShareButton(new SmsShareButton('img/sms.svg'), "sms", true)); -ShareManager.addShareButton(new MatomoShareButton(new TelegramShareButton('img/telegram.svg'), "telegram", true)); -// ShareManager.addShareButton(new CopyShareButton('img/copy.svg')); + return n(t, null, [{ + key: "Kt", value: function () { + return null === t.Sr && (t.Sr = new t), t.Sr + } + }]), n(t, [{ + key: "Mr", value: function () { + return v.Mt(this.ke) && this.Hr(), this.ke + } + }, { + key: "yr", value: function (t, e) { + var n = this.Mr(); + return v.R(n[t]) ? n[t].value : e + } + }, { + key: "vr", value: function (t) { + this.Mr(), delete this.ke[t], this.Pr() + } + }, { + key: "Tr", value: function (t, e) { + this.Mr(), this.ke[t] = {Lr: (new Date).getTime(), value: e}, this.Pr() + } + }, { + key: "br", value: function (t) { + for (var e in this.Mr(), t) this.ke[e] = t[e]; + this.Pr() + } + }, { + key: "Ar", value: function (t) { + return v.m(this.ke[t]) + } + }, { + key: "Hr", value: function () { + this.ke = localStorage.getItem(this.wr), null === this.ke ? this.ke = {} : this.ke = JSON.parse(this.ke) + } + }, { + key: "Pr", value: function () { + null !== this.ke && localStorage.setItem(this.wr, JSON.stringify(this.ke)) + } + }]), t +}(); +F.Sr = null; +var V = function () { + function t() { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).apply(this, arguments)) + } -let app$1 = new App(); + return o(t, D), n(t, [{ + key: "hn", value: function () { + for (var n = e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "hn", this).call(this), r = this.gn(".setting", !0), i = F.Kt(), o = function (t) { + var e = r[t], n = e.name, o = void 0; + o = e.dataset.raw ? localStorage.getItem(n) : i.yr(n); + var s = !1; + e instanceof HTMLInputElement && ("checkbox" === e.type || "radio" === e.type) && (s = !0), (!e.dataset.raw && !i.Ar(n) || e.dataset.raw && null === o) && v.R(r[t].dataset.default) && (o = e.dataset.default, v.R(e.dataset.defaultTranslateable) && (e.dataset.translation = "", e.dataset.translationValue = o, o = d.translate(o))), v.R(o) && (s ? e.checked = o === e.value : e.value = o, "" !== o && e.classList.add("notEmpty")), e.addEventListener("change", function () { + var t = this.value; + s && !this.checked && (t = null), e.dataset.raw ? localStorage.setItem(n, t) : i.Tr(n, t), delete e.dataset.translationValue, delete e.dataset.translation + }) + }, s = 0; s < r.length; s++) o(s); + return n + } + }, { + key: "ln", value: function () { + for (var n = e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "ln", this).call(this), r = this.gn(".setting", !0), i = F.Kt(), o = 0; o < r.length; o++) { + var s, a = r[o], u = a.name; + s = a.dataset.raw ? localStorage.getItem(u) : i.yr(u); + var l = !1; + a instanceof HTMLInputElement && ("checkbox" === a.type || "radio" === a.type) && (l = !0), v.R(s) && (l ? a.checked = s === a.value : a.value = s, "" !== s && a.classList.add("notEmpty")) + } + return n + } + }]), t +}(), U = function () { + function t(e, n, r) { + s(this, t), this.De = e, this.Cr = n, this.kr = v.m(r, !0), this.Fr = !0, this.xr = -1, this.Br = null + } -AndroidBridge.addDefinition(() => { - window["app"] = app$1; - window["app"]["pause"] = app$1.pause; - window["app"]["resume"] = app$1.resume; - window["app"]["setAppEndListener"] = app$1.setAppEndListener; + return n(t, [{ + key: "Dr", value: function (t) { + return this.Br = t, this + } + }, { + key: "Ir", value: function (t) { + this.xr = t + } + }, { + key: "Rr", value: function () { + return this.De + } + }, { + key: "Ur", value: function () { + return this.Cr + } + }, { + key: "Er", value: function () { + var t = document.createElement("th"); + return t.appendChild(this.kr ? d.pt(this.Cr) : document.createTextNode(this.Cr)), this.Fr && (t.classList.add("sort"), t.dataset.sort = this.De), t.dataset.column = this.xr, this.Wr = t, this.Wr + } + }, { + key: "Nr", value: function () { + return this.De + } + }, { + key: "Or", value: function (t) { + return t + } + }, { + key: "_r", value: function () { + var t = document.createElement("td"); + return t.classList.add(this.De), t.dataset.column = this.xr, v.R(this.Br) && t.classList.add("clickable"), t + } + }, { + key: "click", value: function (t, e, n) { + v.R(this.Br) && this.Br(t, e, n) + } + }]), t +}(), z = function () { + function t(e, n, r, o) { + var a; + return s(this, t), (a = i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, n, r))).Fr = !1, a.jr = v.m(o, !1), a + } + + return o(t, U), n(t, [{ + key: "Nr", value: function () { + return null + } + }, { + key: "_r", value: function () { + var n = e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "_r", this).call(this); + return n.classList.remove(this.De), n.appendChild(this.jr ? d.pt(this.De) : document.createTextNode(this.De)), n + } + }]), t +}(), Y = function () { + function t(e, n, r) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, n, r = v.m(r, !1))) + } + + return o(t, U), n(t, [{ + key: "Er", value: function () { + return document.createTextNode("") + } + }, { + key: "Nr", value: function () { + return {data: [this.De]} + } + }, { + key: "_r", value: function () { + return document.createTextNode("") + } + }]), t +}(), W = function () { + function t(e, n, r) { + var o; + return s(this, t), (o = i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, n, r))).jr = !1, o + } + + return o(t, z), n(t, [{ + key: "_r", value: function () { + var n = e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "_r", this).call(this), + r = document.createElement("img"); + return r.src = this.De, n.removeAllChildren().appendChild(r), n + } + }]), t +}(), X = function () { + function t(e, n, r) { + s(this, t), this.Vr = e, this.Jr = v.m(n, {}), this.qr = r, "string" == typeof this.Vr && (this.Vr = document.getElementById(this.Vr)), this.zr = [], Array.isArray(n) ? this.zr = n : v.R(n.columns) && (this.zr = n.columns) + } + + return n(t, [{ + key: "Or", value: function (t) { + if (console.log("prepareData", t), v.R(t)) for (var e = 0, n = t.length; e < n; e++) t[e] = this.$r(t[e]); + return t + } + }, { + key: "$r", value: function (t) { + console.log("prepareDataset", t); + for (var e = 0, n = this.zr.length; e < n; e++) v.R(t[this.zr[e].Rr()]) && (t[this.zr[e].Rr()] = this.zr[e].Or(t[this.zr[e].Rr()], t)); + return t + } + }, { + key: "Gr", value: function () { + v.R(this.zr) && this.Kr(); + var t = this.Vr, e = this.Jr, n = this.qr; + e.item = v.m(e.item, t.id + "-template-item"), e.page = v.m(e.page, 5), e.pagination = v.m(e.pagination, { + outerWindow: 1, + innerWindow: 1 + }); + var r = document.getElementById(e.item); + r && (e.item = r.outerHTML, r.remove()), n = this.Or(n); + var i = new List(t, e, n), o = this; + return t.querySelector("." + v.m(e.listClass, "list")).addEventListener("click", function (t) { + var e = t.target.closest("td[data-column]"), n = parseInt(e.dataset.column); + o.zr.length > n && o.zr[n].click(e, i, t) + }), this.list = i, i + } + }, { + key: "Kr", value: function () { + for (var t = document.createElement("tr"), e = document.createElement("tr"), n = [], r = 0, i = this.zr.length; r < i; r++) { + this.zr[r].Ir(r), t.appendChild(this.zr[r].Er()), e.appendChild(this.zr[r]._r()); + var o = this.zr[r].Nr(); + v.R(o) && n.push(o) + } + var s = this.Vr.querySelector("thead"), a = this.Vr.querySelector("tfoot"); + v.R(s) && s.removeAllChildren().appendChild(t), v.R(a) && a.removeAllChildren().appendChild(v.cloneNode(t)), this.Jr.item = e.outerHTML, this.Jr.valueNames = n + } + }, { + key: "Xr", value: function () { + return this.list + } + }, { + key: "Qr", value: function (t, e, n) { + var r = this.list.get(t, e); + v.R(r) && r.length >= 1 && (n = this.$r(n), r[0].values(n)) + } + }, { + key: "Yr", value: function (t) { + t ? this.Vr.classList.add("sending") : this.Vr.classList.remove("sending") + } + }]), t +}(), J = function () { + function t(e) { + s(this, t); + var n = i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, t.Zr, "settings")); + for (var r in t.to) n.eo(r, new t.to[r](n)); + return n.active = null, n + } + + return o(t, b), n(t, [{ + key: "eo", value: function (t, e) { + this.mn("#settings-fragments", e), delete this.rn["#settings-fragments"], this.rn[t] = e + } + }, { + key: "ln", value: function () { + var n = e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "ln", this).call(this); + return v.R(this.active) && !this.rn[this.active].un() && this.setActive(null), this.no(), n + } + }, { + key: "setActive", value: function (t) { + v.R(this.active) && (this.rn[this.active].sn.then(function (t) { + t.classList.remove("active") + }), this.gn("#show-fragment-" + this.active).classList.remove("active")), this.active = t, v.R(this.active) && (this.rn[this.active].sn.then(function (t) { + t.classList.add("active") + }), this.gn("#show-fragment-" + this.active).classList.add("active")) + } + }, { + key: "no", value: function () { + var t = this, e = this.gn("#settings-fragment-list"); + e.removeAllChildren(); + var n = this, r = function (r) { + if (t.rn[r].un()) { + var i = document.createElement("li"); + i.id = "show-fragment-" + r, i.appendChild(d.pt(r, null, "a")), i.addEventListener("click", function () { + n.setActive(r) + }), e.appendChild(i), v.Mt(t.active) && t.setActive(r) + } + }; + for (var i in this.rn) r(i) + } + }], [{ + key: "eo", value: function (e, n) { + t.to[e] = n + } + }, { + key: "so", value: function (e) { + t.io = e + } + }, { + key: "ro", value: function (e) { + t.Zr = e + } + }]), t +}(); +J.Zr = "core/html/settings.html", J.to = {}, J.io = !0, J.oo = null, J.ao = !0, a.t(function (t) { + var e = this; + if (J.io) { + if (t.Ns("settings", J), v.Mt(J.oo)) { + var n = new l("settings", r(regeneratorRuntime.mark(function n() { + var r, i; + return regeneratorRuntime.wrap(function (e) { + for (; ;) switch (e.prev = e.next) { + case 0: + if (!((r = t.ms()) instanceof J)) { + e.next = 5; + break + } + r.finish(), e.next = 9; + break; + case 5: + return e.next = 7, t.gs(function (t) { + return t instanceof J + }); + case 7: + i = e.sent, v.R(i) ? i.kn() : t.Ln(J); + case 9: + case"end": + return e.stop() + } + }, n, e) + })), l.Z, 1e4); + n.q("img/settings.png"), J.oo = n + } + J.ao && t.ds(J.oo) + } }); +var G = function () { + function t() { + s(this, t) + } -SettingsSite.setTemplate("html/application/setting-template.html"); -// SettingsSite.shouldAddSettingsAction = false; + return n(t, null, [{ + key: "init", value: function (e) { + t.lo = null, t.ho = {uo: !1, id: null, accesses: ["default"]}, t.app = e, t.co = new Promise(function (e) { + t.do = e + }) + } + }, { + key: "setData", value: function (e) { + t.ho = Object.assign(t.ho, e); + var n = t.app.Ds(); + n && n.Hs() + } + }, { + key: "mo", value: function (e) { + return t.lo = v.m(e, t.lo), K.load(t.lo).then(function (e) { + e.success && t.setData(e.result), t.do() + }) + } + }, { + key: "po", value: function () { + return K.load("u/logout").then(function (e) { + if (e.success) { + t.setData(e.result); + var n = t.app.Ds(); + n && n.Ms(), E.oi(E.ai, d.translate("logged-out-successfully")) + } + }) + } + }, { + key: "fo", value: function (e) { + return t.ho.accesses.indexOf(e) >= 0 + } + }, { + key: "So", value: function (e, n) { + t.wo(function (r) { + n(r && t.Mo(e)) + }) + } + }, { + key: "wo", value: function (e) { + this.co.then(function () { + e(t.Ho()) + }) + } + }, { + key: "Mo", value: function (e) { + return t.ho.id === e + } + }, { + key: "Ho", value: function () { + return v.R(t.ho) && v.R(t.ho.id) + } + }]), t +}(); +a.t(function (t) { + return G.init(t), G.mo("u/me").then(function () { + G.wo(function (t) { + if (t) { + var e = F.Kt(), n = v.Se(e.Mr()); + for (var r in n) n[r].value = JSON.stringify(n[r].value); + K.send("u/syncSettings", n).then(function (t) { + if (t.success) { + for (var n in t.result) t.result[n].value = JSON.parse(t.result[n].value); + e.br(t.result) + } + }) + } + }) + }) +}); +var $ = function () { + function t(e, n, r, o, a) { + var u; + return s(this, t), (u = i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, n, r, o))).yo = v.m(a, "default"), u + } -RegistrationSite.addAction = false; -LoginSite.addLoginAction = false; + return o(t, l), n(t, [{ + key: "O", value: function () { + return e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "O", this).call(this) && G.fo(this.yo) + } + }, { + key: "vo", value: function () { + return this.yo + } + }, { + key: "K", value: function (n) { + var r = e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "K", this).call(this, v.m(n, new t)); + return r.yo = this.yo, r + } + }]), t +}(), Q = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, "userManagement/html/403.html")) + } -InitPromise.resolve(app$1).then(async function () { - SettingsSite.settingsAction.showFor = MenuAction.SHOW_ALWAYS; + return o(t, b), t +}(), Z = function () { + function t(e, n, r, o) { + var a; + return s(this, t), (a = i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, n, r))).yo = o, a + } - let settingsManager = SettingsManager.getInstance(); + return o(t, b), n(t, [{ + key: "an", value: function (n) { + return G.fo(this.yo) ? e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "an", this).call(this, n) : (this.Ln(Q), void this.finish({error: 403})) + } + }, { + key: "ln", value: function (n) { + return G.fo(this.yo) ? e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "ln", this).call(this, n) : (this.Ln(Q), void this.finish({error: 403})) + } + }]), t +}(), tt = function () { + function t(e, n, r, o) { + s(this, t); + var a = i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, n, r, o)), + u = e.querySelector("#email"), l = e.querySelector("#password"), c = function () { + u.setCustomValidity(""), l.setCustomValidity("") + }; + return u.addEventListener("keydown", c), l.addEventListener("keydown", c), a + } - let soundManager = SoundManager.getInstance(); - soundManager.play(SoundManager.CHANNELS.MUSIC, { - audio: "sound/brightAndBeautifull__.mp3", - loop: true, - volume: 0.6, - muted: (settingsManager.getSetting("play-music", "1") !== "1") - }).catch(e => console.error(e)); + return o(t, H), t +}(), et = function () { + function t(e, n, r, o) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, n, r, o)) + } - app$1.start(MenuSite); - Translator.setLanguage("de"); + return o(t, H), n(t, [{ + key: "Po", value: function () { + } + }]), t +}(), nt = function () { + function t(e, n, r) { + var o; + return s(this, t), (o = i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, n))).yo = r, o + } - InstallManager.setCanInstallListener(e => { + return o(t, D), n(t, [{ + key: "un", value: function () { + return e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "un", this).call(this) && G.fo(this.yo) + } + }]), t +}(), rt = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, "userManagement/html/fragments/passwordSettings.html", "online")) + } + + return o(t, nt), n(t, [{ + key: "hn", value: function () { + var n = e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "hn", this).call(this), + r = new H(document.getElementById("change-password-form"), "u/passwordSettings/set", "post"); + return r.pr(function (t) { + for (var e = 0, n = t.length; e < n; e++) E.oi(t[e]); + r.dr({oldPassword: "", newPassword1: "", newPassword2: ""}) + }), n + } + }]), t +}(); +a.t(function () { + J.eo("password-settings", rt) +}); +var it = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, "userManagement/html/fragments/userSettings.html", "online")) + } + + return o(t, nt), n(t, [{ + key: "hn", value: function () { + var n = e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "hn", this).call(this); + return new H(document.getElementById("user-settings-form"), "u/userSettings/set", "post").load("u/userSettings").pr(function (t) { + for (var e = 0, n = t.length; e < n; e++) E.oi(t[e]) + }), n + } + }]), t +}(); +a.t(function () { + J.eo("user-settings", it) +}); +var ot = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, "userManagement/html/editUserRoles.html", "userRoles", "admin")) + } + + return o(t, Z), n(t, [{ + key: "an", value: function (n) { + var r = e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "an", this).call(this, n); + this.userId = n.id; + var i = this; + return Promise.all([S.Ci(q.Xi.Yi), K.load("u/userRoles" + K.ae({id: i.userId})).then(function (t) { + t.success ? (i.To(t.result.userRoles), i.Lo(t.result.availableRoles), i.bo(t.result.username)) : (E.oi(t.errors[0]), i.finish()) + })]).then(function () { + return r + }) + } + }, { + key: "hn", value: function () { + this.gn("#username").innerHTML = this.username; + var t = this.gn("#userRoles"), e = this.gn("#availableRoles"), n = new W("img/minus.png", "", !1), + r = new W("img/plus.png", "", !1), + i = [new Y("id"), new U("name", "name"), new U("description", "description"), n], + o = [new Y("id"), new U("name", "name"), new U("description", "description"), r], + s = new X(t, i, this.userRoles), a = new X(e, o, this.availableRoles), u = s.Gr(), l = a.Gr(), c = this, + h = function (t, e) { + return s.Yr(!0), a.Yr(!0), K.send("u/changeUserRole", { + id: t, + userId: c.userId, + add: e + }).then(function (e) { + if (s.Yr(!1), a.Yr(!1), !e.success) return E.oi(e.errors[0]), e; + var n = null, r = null; + e.result.hasRole ? (n = l, r = u) : (r = l, n = u); + var i = n.get("id", t); + return 1 === i.length && (r.add(i[0].values()), n.remove("id", t)), e + }) + }; + n.Dr(function (t) { + var e = t.closest("tr").dataset.id; + h(e, !1) + }), r.Dr(function (t) { + var e = t.closest("tr").dataset.id; + h(e, !0) + }) + } + }, { + key: "To", value: function (t) { + this.userRoles = t + } + }, { + key: "Lo", value: function (t) { + this.availableRoles = t + } + }, { + key: "bo", value: function (t) { + this.username = t + } + }]), t +}(); +a.t(function (t) { + t.Ns("userRoles", ot), t.ds(new $("userRoles", function () { + t.Ln(ot) + }, null, 1100, "admin")) +}); +var st = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, "userManagement/html/forgotPassword.html", "forgotPassword", "offline")) + } + + return o(t, Z), n(t, [{ + key: "hn", value: function () { + var t = this; + new H(document.getElementById("forgot-password-form"), "u/newPassword", "post").pr(function () { + E.oi(E.ai, d.translate("new-password-code-send")), t.finish() + }) + } + }]), t +}(); +a.t(function (t) { + t.Ns("forgotPassword", st) +}); +var at = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, "userManagement/html/login.html", "login", "offline")) + } + + return o(t, Z), n(t, [{ + key: "hn", value: function () { + var t = this; + new tt(document.getElementById("login-form"), "u/login", "post").pr(function (e) { + G.setData(e), t.Tn(), E.oi(E.ai, d.translate("login-success")), t.finish() + }), this.gn("#forgot-password-link").addEventListener("click", function () { + t.Ln(st), t.finish() + }) + } + }]), t +}(); +at.Ao = null, at.Co = null, at.ko = !0, at.Fo = !0, a.t(function (t) { + t.Ns("login", at), v.Mt(at.Ao) && (at.Ao = new $("login", function () { + t.Ln(at) + }, h.tt, 1100, "offline")), v.Mt(at.Co) && (at.Co = new $("logout", function () { + G.po() + }, h.tt, 1100, "online")), at.ko && t.ds(at.Ao), at.Fo && t.ds(at.Co) +}); +var ut = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, "userManagement/html/registration.html", "registration", "offline")) + } + + return o(t, Z), n(t, [{ + key: "hn", value: function () { + new et(document.getElementById("registration-form"), "u/registration", "post").pr(function () { + E.oi(E.ai, d.translate("registration-success")) + }) + } + }]), t +}(); +ut.action = null, ut.at = !0, a.t(function (t) { + t.Ns("registration", ut), v.Mt(ut.action) && (ut.action = new $("registration", function () { + t.Ln(ut) + }, null, 1100, "offline")), ut.at && t.ds(ut.action) +}); +var lt = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, "userManagement/html/setNewPassword.html", "newPassword", "offline")) + } + + return o(t, Z), n(t, [{ + key: "an", value: function (n) { + return this.code = n.code, e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "an", this).call(this, n) + } + }, { + key: "hn", value: function () { + var t = document.getElementById("new-password-form"); + document.getElementById("code").value = this.code; + var e = this; + new H(t, "c/code", "post").pr(function () { + E.oi(E.ai, d.translate("password-updated")), e.Ln(at), e.finish() + }) + } + }]), t +}(); +a.t(function (t) { + t.Ns("newPassword", lt) +}); +var ct = function () { + function t() { + s(this, t) + } + + return n(t, [{ + key: "estimate", value: function () { + var t = r(regeneratorRuntime.mark(function t() { + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return t.abrupt("return", "storage" in navigator && "estimate" in navigator.storage ? navigator.storage.estimate() : "webkitTemporaryStorage" in navigator && "queryUsageAndQuota" in navigator.webkitTemporaryStorage ? new Promise(function (t) { + navigator.webkitTemporaryStorage.queryUsageAndQuota(function (e, n) { + t({usage: e, quota: n}) + }) + }) : Promise.resolve({usage: NaN, quota: NaN})); + case 1: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "xo", value: function () { + var t = r(regeneratorRuntime.mark(function t() { + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return t.abrupt("return", this.Bo() ? navigator.storage.persisted() : Promise.resolve(!1)); + case 1: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "Do", value: function () { + return "storage" in navigator && "estimate" in navigator.storage || "webkitTemporaryStorage" in navigator && "queryUsageAndQuota" in navigator.webkitTemporaryStorage + } + }, { + key: "Bo", value: function () { + return navigator.storage && navigator.storage.persist + } + }, { + key: "persist", value: function () { + return this.Bo() ? navigator.storage.persist() : Promise.resolve(!1) + } + }], [{ + key: "Kt", value: function () { + return v.Mt(t.te) && (t.te = new t), t.te + } + }]), t +}(); +ct.te = null; +var ht = function () { + function t() { + s(this, t) + } + + return n(t, null, [{ + key: "init", value: function () { + var t = this; + window.addEventListener("beforeinstallprompt", function (e) { + e.preventDefault(), t.Io(e) + }) + } + }, { + key: "Io", value: function (t) { + this.Ro = t, this.Uo && this.Uo(this.Ro) + } + }, { + key: "prompt", value: function () { + var t = r(regeneratorRuntime.mark(function t() { + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return t.abrupt("return", v.R(this.Ro) ? (this.Ro.prompt(), this.Ro.userChoice.then(function (t) { + return ct.Kt().persist(), t + })) : Promise.resolve({outcome: "dismissed", platform: ""})); + case 1: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "Eo", value: function () { + return matchMedia("(display-mode: standalone)").matches + } + }, { + key: "Wo", value: function (t, e) { + this.Uo = t, (e = v.m(e, !0)) && v.m(this.Ro) && this.Uo(this.Ro) + } + }]), t +}(); +ht.init(); +var ft = function () { + function t() { + s(this, t) + } + + return n(t, null, [{ + key: "init", value: function () { + var e, n = this; + t.No = new Promise((e = r(regeneratorRuntime.mark(function e(r) { + var i; + return regeneratorRuntime.wrap(function (e) { + for (; ;) switch (e.prev = e.next) { + case 0: + if (i = v.m(localStorage.getItem(t.Oo), "1"), !v.Mt(i)) { + e.next = 8; + break + } + return e.next = 4, t._o(); + case 4: + i = e.sent, localStorage.setItem(t.Oo, i), e.next = 9; + break; + case 8: + i = "1" === i, t.jo(i); + case 9: + r(i); + case 10: + case"end": + return e.stop() + } + }, e, n) + })), function () { + return e.apply(this, arguments) + })), t.No.then(function () { + t.push(["trackPageView"], !0), t.push(["enableLinkTracking"], !0), t.push(["setTrackerUrl", t.Vo + "/piwik.php"], !0), t.push(["setSiteId", t.Jo + ""], !0); + var e = document, n = e.createElement("script"), r = e.getElementsByTagName("head")[0]; + n.type = "text/javascript", n.async = !0, n.defer = !0, n.src = t.Vo + "/piwik.js", r.appendChild(n) + }) + } + }, { + key: "update", value: function (e) { + v.m(t.qo) && t.push(["setReferrerUrl", t.qo]), t.qo = window.location.pathname + window.location.search, t.push(["setCustomUrl", t.qo]), t.push(["setDocumentTitle", e]), t.push(["deleteCustomVariables", "page"]), t.push(["setGenerationTimeMs", 0]), t.push(["trackPageView"]); + var n = document.getElementById("site-content"); + t.push(["MediaAnalytics::scanForMedia", n]), t.push(["FormAnalytics::scanForForms", n]), t.push(["trackContentImpressionsWithinNode", n]), t.push(["enableLinkTracking"]) + } + }, { + key: "_o", value: function () { + var e = r(regeneratorRuntime.mark(function e() { + return regeneratorRuntime.wrap(function (e) { + for (; ;) switch (e.prev = e.next) { + case 0: + return e.abrupt("return", (t.No = new Promise(function (e) { + t.push([function () { + e(!this.isUserOptedOut()) + }]), t.push([function () { + e(!this.isUserOptedOut()) + }]) + }), t.No)); + case 1: + case"end": + return e.stop() + } + }, e, this) + })); + return function () { + return e.apply(this, arguments) + } + }() + }, { + key: "zo", value: function () { + var e = r(regeneratorRuntime.mark(function e(n) { + return regeneratorRuntime.wrap(function (e) { + for (; ;) switch (e.prev = e.next) { + case 0: + return e.abrupt("return", fetch(t.Vo + t.$o + n, { + mode: "cors", + credentials: "include" + }).then(function (t) { + return t.text() + }).then(function (t) { + return (new window.DOMParser).parseFromString(t, "text/xml") + })); + case 1: + case"end": + return e.stop() + } + }, e, this) + })); + return function () { + return e.apply(this, arguments) + } + }() + }, { + key: "Go", value: function () { + return t.No + } + }, { + key: "jo", value: function () { + var e = r(regeneratorRuntime.mark(function e(n) { + return regeneratorRuntime.wrap(function (e) { + for (; ;) switch (e.prev = e.next) { + case 0: + t.No = Promise.resolve(n), localStorage.setItem(t.Oo, !0 === n ? "1" : "0"), n ? t.push(["forgetUserOptOut"], !0) : t.push(["optUserOut"], !0); + case 1: + case"end": + return e.stop() + } + }, e, this) + })); + return function () { + return e.apply(this, arguments) + } + }() + }, { + key: "Ko", value: function () { + var t = r(regeneratorRuntime.mark(function t(e, n, r, i) { + var o; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return o = ["trackEvent", e, n], t.abrupt("return", (v.R(r) && o.push(r), v.R(i) && !isNaN(parseFloat(i)) && isFinite(i) && o.push(i), this.push(o))); + case 2: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "push", value: function () { + var t = r(regeneratorRuntime.mark(function t(e) { + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + Array.isArray(e) || (e = [e]), window._paq.push(e); + case 1: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }]), t +}(); +ft.qo = null, ft.Oo = "matomoShouldTrack", ft.Vo = "//matomo.silas.link", ft.$o = "/index.php?module=API&method=AjaxOptOut.", ft.Jo = "1", a.t(function () { + window._paq = window._paq || [], ft.init() +}); +var pt = function () { + function t(e, n, r) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, [e, function (t) { + ft.Ko("shared", t, n) + }], r)) + } + + return o(t, T), t +}(); +u.l("MatomoShareButton", pt); +var dt = function () { + function t() { + s(this, t) + } + + return n(t, [{ + key: "Xo", value: function () { + var t = r(regeneratorRuntime.mark(function t(e, n, r, i, o, s, a, u, l) { + var c, h, f; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return l = v.m(l, !0), u = v.m(u, 0), t.next = 3, this.Qo(e, n, r, i, o, s, a, 0 === u); + case 3: + if (c = t.sent, t.t0 = u > 0, !t.t0) { + t.next = 8; + break + } + return t.next = 8, new Promise(function (t) { + setTimeout(t, u), n.style.fontSize = c + "px" + }); + case 8: + return h = this, f = function () { + return new Promise(function (t) { + setTimeout(function () { + t(h.Xo(e, n, r, i, o, s, a, u, !1)) + }, "number" == typeof l ? l : 255) + }) + }, t.abrupt("return", (!1 !== l && window.addEventListener("resize", f), f)); + case 10: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "Yo", value: function () { + var t = r(regeneratorRuntime.mark(function t(e, n, r, i, o, s, a, u) { + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return t.abrupt("return", this.Xo(1, e, n, r, i, o, s, a, u)); + case 1: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "Qo", value: function () { + var t = r(regeneratorRuntime.mark(function t(e, n, r, i, o, s, a, u) { + var l, c, h, f, p, d, m, y, g, k, w, _; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + for (s = v.m(s, 10), i = v.m(i, !1), o = v.m(o, !1), a = v.m(a, n.innerHTML.length), u = v.m(u, !0), (l = r.classList.contains("no-transition")) || r.classList.add("no-transition"), c = 0, h = [], f = 0; f < 5; f++) h.push(0); + p = n.style.fontSize, d = 1, m = 0, y = 0, g = 0, k = 0; + case 6: + if (d += h[c] / (a + 1), n.style.fontSize = d + "px", w = window.getComputedStyle(r), g = w.getPropertyValue("width").replace("px", ""), k = w.getPropertyValue("height").replace("px", ""), m = g - n.offsetWidth, y = k - n.offsetHeight, c = (c + 1) % 5, (_ = o ? y : i ? m : Math.min(m, y)) !== h[(c + 1) % 5]) { + t.next = 12; + break + } + return t.abrupt("break", 14); + case 12: + h[c] = _; + case 13: + if ((m > (1 - e) * g || o) && (y > (1 - e) * k || i)) { + t.next = 6; + break + } + case 14: + if (d -= s, n.style.fontSize = u ? d + "px" : p, t.t0 = l, t.t0) { + t.next = 21; + break + } + return t.next = 20, new Promise(function (t) { + setTimeout(t, 50) + }); + case 20: + r.classList.remove("no-transition"); + case 21: + return t.abrupt("return", d); + case 22: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }]), t +}(), vt = function () { + function t(e, n, r) { + s(this, t), this.buffer = n, this.Zo = !1, this.loopStart = null, this.loopEnd = null, this.ta = r, this.context = e, this.startTime = null, this.ea = null, this.source = null, this.na = !1 + } + + return n(t, [{ + key: "sa", value: function (t) { + this.buffer = t + } + }, { + key: "ia", value: function (t, e, n) { + this.Zo = t, v.R(e) && (this.loopStart = e), v.R(n) && (this.loopEnd = n) + } + }, { + key: "start", value: function () { + var t = r(regeneratorRuntime.mark(function t(e, n, r) { + var i; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return e = v.m(e, 0), n = v.m(n, 0), (i = this.context.createBufferSource()).loop = this.Zo, v.R(this.loopStart) && (i.loopStart = this.loopStart), v.R(this.loopEnd) && (i.loopEnd = this.loopEnd), i.buffer = this.buffer, t.next = 8, this.ta(i); + case 8: + v.Mt(r) ? i.start(e, n) : i.start(e, n, r), this.startTime = (new Date).getTime() - 1e3 * v.m(n, 0), this.source = i, this.na = !0; + case 12: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "stop", value: function () { + var t = r(regeneratorRuntime.mark(function t(e) { + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return t.abrupt("return", v.R(this.source) ? (e = v.m(e, 0), this.ea = (new Date).getTime() - this.startTime, this.na = !1, this.source.stop(e)) : null); + case 1: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "resume", value: function () { + var t = r(regeneratorRuntime.mark(function t() { + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + if (this.na) { + t.next = 2; + break + } + return t.abrupt("return", this.start(null, v.m(this.ea, 0) / 1e3)); + case 2: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }]), t +}(), mt = function () { + function e() { + var t = this; + s(this, e), this.ra = {}, this.context = new AudioContext, this.context.onstatechange = function () { + console.log("stateChange from context", arguments) + }, this.context.oncomplete = function () { + console.log("onComplete from context", arguments) + }, window.addEventListener("visibilitychange", function () { + t.oa() + }) + } + + return n(e, null, [{ + key: "Kt", value: function () { + return v.Mt(e.te) && (e.te = new e), e.te + } + }]), n(e, [{ + key: "aa", value: function () { + return "suspended" !== this.context.state + } + }, { + key: "set", value: function (t, n) { + var r = this; + n = v.m(n, e.ha.la); + var i = v.m(this.ra[n], {}); + "string" == typeof t && (t = {ua: t}); + var o = t.ua; + return v.R(o) && (i.ca = fetch(o).then(function (t) { + return t.arrayBuffer() + }).then(function (t) { + return new Promise(function (e) { + return r.context.decodeAudioData(t, e) + }) + }).catch(function (t) { + return console.error(t) + }), this.stop(n)), i.muted = v.m(t.muted, i.muted, !1), i.volume = v.m(t.volume, i.volume, 1), i.loop = v.m(t.loop, i.loop, !1), i.da = v.m(t.da, i.da, 0), this.ra[n] = i, i.muted && this.stop(n), this.ra[n] + } + }, { + key: "ma", value: function () { + var t = r(regeneratorRuntime.mark(function t() { + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + if ("function" != typeof this.context.resume) { + t.next = 2; + break + } + return t.abrupt("return", this.context.resume()); + case 2: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "play", value: function () { + var n = r(regeneratorRuntime.mark(function n(r, i) { + var o, s, a = this; + return regeneratorRuntime.wrap(function (n) { + for (; ;) switch (n.prev = n.next) { + case 0: + if (this.ma(), r = v.m(r, e.ha.la), v.Mt(i) ? i = {} : "object" != (void 0 === i ? "undefined" : t(i)) && (i = {ua: i}), i.da = v.m(i.da, 0), this.stop(r), this.set(i, r), this.ra[r].muted) { + n.next = 10; + break + } + return n.next = 3, this.ra[r].ca; + case 3: + return o = n.sent, (s = new vt(this.context, o, function (t) { + var e = a.context.createGain(); + e.gain.value = a.ra[r].volume, t.connect(e), e.connect(a.context.destination) + })).sa(o), s.ia(this.ra[r].loop, .3, o.duration - .3), this.ra[r].source = s, n.next = 10, s.start(); + case 10: + return n.abrupt("return", this.ra[r]); + case 11: + case"end": + return n.stop() + } + }, n, this) + })); + return function () { + return n.apply(this, arguments) + } + }() + }, { + key: "stop", value: function (t) { + t = v.m(t, e.ha.la); + var n = this.ra[t]; + v.R(n) && v.R(n.source) && n.source.stop() + } + }, { + key: "get", value: function (t) { + return t = v.m(t, e.ha.la), this.ra[t] + } + }, { + key: "resume", value: function () { + var t = r(regeneratorRuntime.mark(function t(n) { + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + if (n = v.m(n, e.ha.la), !v.R(this.ra[n]) || this.ra[n].muted || !v.R(this.ra[n].source)) { + t.next = 2; + break + } + return t.abrupt("return", this.ra[n].source.resume()); + case 2: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "ga", value: function () { + for (var t in this.ra) v.R(this.ra[t].source) && this.ra[t].source.stop() + } + }, { + key: "pa", value: function () { + for (var t in this.ra) v.R(this.ra[t]) && !this.ra[t].muted && v.R(this.ra[t].source) && this.ra[t].source.resume() + } + }, { + key: "oa", value: function () { + document.hidden ? this.ga() : this.pa() + } + }]), e +}(); +mt.ha = {fa: "music", Sa: "sound", la: "default"}, a.t(function () { + L.Ps.push(function () { + mt.Kt().ga() + }), L.vs.push(function () { + mt.Kt().pa() + }) +}); +var yt = function () { + function t(e) { + s(this, t), "string" == typeof e && (e = {code: e}), this.wa = e, this.Ma = !1 + } + + return n(t, [{ + key: "Ha", value: function (t) { + this.Ma = t + } + }, { + key: "ya", value: function () { + return this.Ma + } + }, { + key: "va", value: function () { + return K.send("c/code", this.wa) + } + }]), t +}(), gt = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, "core/html/load.html", "code")) + } + + return o(t, b), n(t, [{ + key: "an", value: function (n) { + e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "an", this).call(this, n), console.log(n); + Promise.resolve(); + if (v.R(n.code)) { + var r = n.code, i = v.m(n.cachable, !1), o = new yt(r); + o.Ha(i); + var s = this; + o.va().then(function (t) { + t.success ? E.oi(E.ai, d.translate(v.m(t.result.successMessage, "code-activated"))) : E.oi(E.ai, d.translate(t.errors[0])), s.finish() + }) + } + } + }]), t +}(); +a.t(function (t) { + t.Ns("code", gt) +}); +var kt = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, "contact/html/contact.html", t.Pa)) + } + + return o(t, b), n(t, [{ + key: "hn", value: function () { + var n = this; + new H(this.gn("#contact-form"), "contact", "post").pr(function () { + E.oi("contact-message-sent"), n.finish() + }), e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "hn", this).call(this) + } + }]), t +}(); +kt.Pa = "contactMe", a.t(function (t) { + kt.Pa && t.Ns(kt.Pa, kt) +}); +var wt = function () { + function t() { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).apply(this, arguments)) + } + + return o(t, b), t +}(), _t = function () { + function t(e, n, r, i) { + s(this, t), this.Ta = e, this.La = n, this.ba = r, this.Aa = i + } + + return n(t, [{ + key: "Ca", value: function () { + return v.cloneNode(this.Ta) + } + }, { + key: "ka", value: function () { + return v.cloneNode(this.La) + } + }, { + key: "Fa", value: function () { + return v.cloneNode(this.ba) + } + }, { + key: "xa", value: function () { + return v.cloneNode(this.Aa) + } + }]), t +}(), bt = function () { + function t(e) { + s(this, t), this.rotation = 0, this.vn = e, this.parent = null + } + + return n(t, [{ + key: "Ba", value: function (t) { + return t + } + }, { + key: "Da", value: function () { + return !1 + } + }, { + key: "Ia", value: function (t) { + this.parent = t + } + }, { + key: "Ra", value: function () { + if (null !== this.parent) return this.parent.Ra() + } + }, { + key: "Ua", value: function () { + return !1 + } + }, { + key: "Ea", value: function () { + return 0 === this.rotation + } + }, { + key: "rotate", value: function () { + var t = r(regeneratorRuntime.mark(function t() { + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return t.abrupt("return", Promise.resolve()); + case 1: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "Wa", value: function () { + } + }, { + key: "Na", value: function (t) { + return t + } + }, { + key: "Oa", value: function (t) { + return t + } + }, { + key: "_a", value: function (t) { + return t + } + }, { + key: "ja", value: function () { + return this.vn + } + }]), t +}(), xt = function () { + function t(e, n) { + var r; + return s(this, t), (r = i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e))).Va = "A", v.R(n) && r.Ja(n), r + } + + return o(t, bt), n(t, [{ + key: "Da", value: function (e) { + return e instanceof t && e.Va === this.Va + } + }, { + key: "Ja", value: function (t) { + this.Va = t + } + }, { + key: "Wa", value: function () { + this.vn.querySelector(".leaf-element").removeAllChildren().appendChild(document.createTextNode(this.Va)) + } + }]), t +}(), Ot = function () { + function t(e) { + var n; + s(this, t), (n = i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e))).children = [], n.Xa = "rotate-0", n.Ka = !0, n.Qa = 100, n.Ya = 0; + var r = n; + return n.Za = function (e) { + var n = (new Date).getTime(), i = null, o = null; + if (e.changedTouches.length >= 1 && (i = document.elementFromPoint(e.changedTouches[0].pageX, e.changedTouches[0].pageY), o = { + x: e.changedTouches[0].pageX, + y: e.changedTouches[0].pageY + }), null != i && 0 === e.targetTouches.length && r.vn.contains(t.za) && r.vn.contains(i)) { + if (e.stopPropagation(), e.preventDefault(), r.Ya + r.Qa > n) return; + r.Ra().tl(r), r.rotate(t.za, i, t.$a, o), r.Ya = (new Date).getTime() + } + }, n.el = function (e) { + var n = (new Date).getTime(); + if (null !== t.za && r.vn.contains(t.za) && r.vn.contains(e.target)) { + var i = {x: e.pageX, y: e.pageY}; + if (e.stopPropagation(), e.preventDefault(), r.Ya + r.Qa > n) return; + r.Ra().tl(r), r.rotate(t.za, e.target, t.$a, i), r.Ya = (new Date).getTime() + } + }, n + } + + return o(t, bt), n(t, [{ + key: "Ga", value: function (t) { + this.Ka = t, this.Wa() + } + }], [{ + key: "qa", value: function () { + window.addEventListener("mousedown", function (e) { + t.za = e.target, t.$a = {x: e.pageX, y: e.pageY} + }), window.addEventListener("mouseup", function () { + t.za = null, t.$a = {} + }), window.addEventListener("touchstart", function (e) { + 1 === e.targetTouches.length && (t.za = e.targetTouches[0].target, t.$a = { + x: e.targetTouches[0].pageX, + y: e.targetTouches[0].pageY + }) + }), window.addEventListener("touchend", function () { + t.za = null, t.$a = {} + }) + } + }]), n(t, [{ + key: "Ua", value: function () { + return this.Ka && !this.Ra().nl() + } + }, { + key: "rotate", value: function () { + var t = r(regeneratorRuntime.mark(function t(e, n, r, i) { + var o, s, a, u, l, c, h, f = this; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + if (o = 1, v.R(n) && v.R(e) && (v.Mt(r) || v.Mt(i) || Math.abs(r.x - i.x) > 5 || Math.abs(r.y - i.y) > 5)) { + for (s = -1, a = -1, u = [0, 1, 3, 2], l = 0; l < this.children.length; l++) (this.children[u[l]].vn === e || this.children[u[l]].vn.contains(e)) && (s = (l + this.rotation / 90) % 4), (this.children[u[l]].vn === n || this.children[u[l]].vn.contains(n)) && (a = (l + this.rotation / 90) % 4); + s >= 0 && a >= 0 && (2 === s && (0 === a || 1 === a) || 1 === s && (0 === a || 3 === a) || 0 === s && 3 === a || 3 === s && 2 === a) && (o = -1) + } + if (!this.Ua()) { + t.next = 8; + break + } + return this.rotation += 360 + 90 * o, this.rotation %= 360, c = this.rotation, this.sl(), this.vn.classList.add("rotating"), -1 === o && this.vn.classList.add("reverse"), h = new Promise(function (t) { + setTimeout(t, 250) + }).then(function () { + f.rotation === c && (f.vn.classList.remove("rotating"), f.vn.classList.remove("reverse")) + }), t.abrupt("return", (this.Ra().il(h), h)); + case 8: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "Da", value: function (e) { + if (!(e instanceof t) || e.children.length !== this.children.length) return !1; + for (var n = 0; n < this.children.length; n++) if (!this.children[n].Da(e.children[n])) return !1; + return !0 + } + }, { + key: "Na", value: function (t) { + this.rotation = t[0], isNaN(this.rotation) && (this.rotation = 0), t.splice(0, 1); + for (var e = 0, n = this.children.length; e < n; e++) t = this.children[e].Na(t); + return t + } + }, { + key: "Oa", value: function (t) { + this.Ka = t[0], t.splice(0, 1); + for (var e = 0, n = this.children.length; e < n; e++) t = this.children[e].Oa(t); + return t + } + }, { + key: "Ba", value: function (t) { + t.push(this.rotation); + for (var e = 0, n = this.children.length; e < n; e++) t = this.children[e].Ba(t); + return t + } + }, { + key: "_a", value: function (t) { + t.push(this.Ka); + for (var e = 0, n = this.children.length; e < n; e++) t = this.children[e]._a(t); + return t + } + }, { + key: "Ea", value: function (t) { + if (t = v.m(t, !0)) for (var e = 0, n = this.children.length; e < n; e++) if (!this.children[e].Ea()) return !1; + return 0 === this.rotation || this.children[0].Da(this.children[3]) && this.children[1].Da(this.children[2]) && (180 === this.rotation || this.children[0].Da(this.children[1])) + } + }, { + key: "rl", value: function (t) { + this.children = []; + for (var e = 0, n = t.length; e < n; e++) this.ol(t[e]) + } + }, { + key: "ol", value: function (t) { + this.children.push(t), t.Ia(this), this.Wa() + } + }, { + key: "sl", value: function () { + this.vn.classList.remove(this.Xa), this.Xa = "rotate-" + this.rotation, "rotate-0" === this.Xa && (this.Xa = "rotate-360"), this.vn.classList.add(this.Xa) + } + }, { + key: "Wa", value: function () { + var t = this.al(); + t >= 2 && this.vn.classList.add("layer-" + t), this.Ka || this.vn.classList.add("locked"); + var e = this.vn.querySelector(".child-container"); + e.removeAllChildren(), this.sl(), this.vn.removeEventListener("mouseup", this.el), this.vn.removeEventListener("touchend", this.Za), this.vn.addEventListener("mouseup", this.el), this.vn.addEventListener("touchend", this.Za); + for (var n = 0, r = this.children.length; n < r; n++) this.children[n].Wa(), e.appendChild(this.children[n].ja()), n % 2 == 1 && this.children.length - 1 !== n && e.appendChild(document.createElement("br")) + } + }, { + key: "al", value: function () { + return this.children.length >= 1 && this.children[0] && this.children[0] instanceof t ? this.children[0].al() + 1 : 1 + } + }]), t +}(); +Ot.qa(); +var Lt = function () { + function t(e) { + s(this, t), this.ll = null, this.words = [], this.hl = [], this.ul = e, this.cl = !1, this.id = null, this.dl = null, this.ml = null; + var n = this; + this.gl = new Promise(function (t, e) { + n.dl = t, n.ml = e + }), this.tl = function () { + } + } + + return n(t, [{ + key: "pl", value: function () { + var t = this.Ba(), e = this._a(); + localStorage.setItem("currentLevel", JSON.stringify({id: this.id, rotations: t, locks: e})) + } + }, { + key: "_a", value: function () { + return null !== this.ll ? this.ll._a([]) : [] + } + }, { + key: "Ba", value: function () { + return null !== this.ll ? this.ll.Ba([]) : [] + } + }, { + key: "fl", value: function (t) { + null !== this.ll && this.ll.Oa(t) + } + }, { + key: "Sl", value: function (t) { + this.id = t + } + }, { + key: "$", value: function () { + return this.id + } + }, { + key: "Ra", value: function () { + return this + } + }, { + key: "wl", value: function (t) { + this.ll = t, this.ll.Ia(this), this.hl && this.Na() + } + }, { + key: "Ml", value: function (t) { + this.words = []; + for (var e = 0, n = t.length; e < n; e++) this.words.push(t[e].toUpperCase()) + } + }, { + key: "Hl", value: function (t) { + this.hl = t + } + }, { + key: "Na", value: function (t) { + this.ll && (t = v.m(t, this.hl), this.ll.Na(t)) + } + }, { + key: "nl", value: function () { + return this.cl + } + }, { + key: "il", value: function (t) { + if (this.ll.Ea()) { + this.cl = !0; + var e = this; + return Promise.resolve(t).then(function () { + e.dl(!0) + }), !0 + } + return this.pl(), !1 + } + }, { + key: "yl", value: function () { + return this.gl + } + }, { + key: "vl", value: function () { + return this.ll + } + }, { + key: "Pl", value: function () { + } + }, { + key: "Tl", value: function () { + return t.Ll(this.ll) + } + }, { + key: "bl", value: function (t) { + this.tl = t + } + }], [{ + key: "Ll", value: function (e) { + var n = []; + if (e.Ua() && n.push(e), e instanceof Ot) for (var r = 0; r < e.children.length; r++) n.push.apply(n, t.Ll(e.children[r])); + return n + } + }, { + key: "Al", value: function (t, e) { + for (var n = [], r = 0, i = t.length; r < i; r++) n.push(new xt(v.cloneNode(e), t.charAt(r))); + return n + } + }]), t +}(), Pt = function () { + function t(e) { + var n; + return s(this, t), (n = i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e))).Ka = !1, n + } + + return o(t, Ot), n(t, [{ + key: "Na", value: function (t) { + for (var e = 0, n = this.children.length; e < n; e++) t = this.children[e].Na(t); + return t + } + }, { + key: "Ba", value: function (t) { + for (var e = 0, n = this.children.length; e < n; e++) t = this.children[e].Ba(t); + return t + } + }, { + key: "_a", value: function (t) { + for (var e = 0, n = this.children.length; e < n; e++) t = this.children[e]._a(t); + return t + } + }, { + key: "Oa", value: function (t) { + for (var e = 0, n = this.children.length; e < n; e++) t = this.children[e].Oa(t); + return t + } + }, { + key: "Wa", value: function () { + var t = this.vn.querySelector(".child-container"); + t.removeAllChildren(), this.sl(); + var e = this; + this.vn.onclick = function (t) { + e.rotate(), t.stopPropagation() + }; + for (var n = 0, r = this.children.length; n < r; n++) this.children[n].Wa(), t.appendChild(this.children[n].ja()) + } + }]), t +}(), Rt = function () { + function t(e, n) { + var r; + return s(this, t), (r = i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e))).Cl = n, r + } + + return o(t, Lt), n(t, [{ + key: "Pl", value: function () { + if (this.words.length >= 2 && this.words[0].length >= this.Cl && this.words[1].length >= this.Cl) { + for (var t = Lt.Al(this.words[0], this.ul.Ca()), e = Lt.Al(this.words[1], this.ul.Ca()), n = new Pt(this.ul.Fa()), r = 0, i = this.Cl / 2; r < i; r++) { + var o = new Ot(this.ul.ka()); + o.ol(t[2 * r]), o.ol(t[2 * r + 1]), o.ol(e[2 * r]), o.ol(e[2 * r + 1]), n.ol(o) + } + this.wl(n) + } + } + }]), t +}(), Et = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, 6)) + } + + return o(t, Rt), t +}(), Ct = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, 8)) + } + + return o(t, Rt), t +}(), St = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, 10)) + } + + return o(t, Rt), t +}(), jt = function () { + function t() { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).apply(this, arguments)) + } + + return o(t, Pt), t +}(), Tt = function () { + function t(e, n) { + var r; + return s(this, t), (r = i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e))).Cl = n, r + } + + return o(t, Lt), n(t, [{ + key: "Pl", value: function () { + if (this.words.length >= 6 && this.words[0].length >= this.Cl && this.words[1].length >= this.Cl && this.words[2].length >= this.Cl && this.words[3].length >= this.Cl && this.words[4].length >= this.Cl && this.words[5].length >= this.Cl) { + var t = []; + t[0] = Lt.Al(this.words[0], this.ul.Ca()), t[1] = Lt.Al(this.words[1], this.ul.Ca()), t[2] = Lt.Al(this.words[2], this.ul.Ca()), t[3] = Lt.Al(this.words[3], this.ul.Ca()), t[4] = Lt.Al(this.words[4], this.ul.Ca()), t[5] = Lt.Al(this.words[5], this.ul.Ca()); + for (var e = new Pt(this.ul.Fa()), n = 0; n < this.Cl / 4; n++) { + var r = []; + r[0] = new Ot(this.ul.ka()), r[1] = new Ot(this.ul.ka()), r[2] = new Ot(this.ul.ka()), r[3] = new Ot(this.ul.ka()), r[4] = new Ot(this.ul.ka()), r[5] = new Ot(this.ul.ka()), r[0].ol(t[0][4 * n]), r[0].ol(t[0][4 * n + 1]), r[0].ol(t[1][4 * n]), r[0].ol(t[1][4 * n + 1]), r[1].ol(t[0][4 * n + 2]), r[1].ol(t[0][4 * n + 3]), r[1].ol(t[1][4 * n + 2]), r[1].ol(t[1][4 * n + 3]), r[2].ol(t[2][4 * n]), r[2].ol(t[2][4 * n + 1]), r[2].ol(t[3][4 * n]), r[2].ol(t[3][4 * n + 1]), r[3].ol(t[2][4 * n + 2]), r[3].ol(t[2][4 * n + 3]), r[3].ol(t[3][4 * n + 2]), r[3].ol(t[3][4 * n + 3]), r[4].ol(t[4][4 * n]), r[4].ol(t[4][4 * n + 1]), r[4].ol(t[5][4 * n]), r[4].ol(t[5][4 * n + 1]), r[5].ol(t[4][4 * n + 2]), r[5].ol(t[4][4 * n + 3]), r[5].ol(t[5][4 * n + 2]), r[5].ol(t[5][4 * n + 3]); + var i = new Ot(this.ul.ka()), o = new jt(this.ul.xa()); + if (n % 2 == 0) { + i.ol(r[0]), i.ol(r[1]), i.ol(r[2]), i.ol(r[3]); + var s = new Pt(this.ul.Fa()); + s.ol(r[4]), s.ol(r[5]), o.ol(i), o.ol(s), o.ja().classList.add("type-1") + } else { + var a = new Pt(this.ul.Fa()); + a.ol(r[0]), a.ol(r[1]), o.ol(a), o.ol(i), i.ol(r[2]), i.ol(r[3]), i.ol(r[4]), i.ol(r[5]), o.ja().classList.add("type-2") + } + e.ol(o) + } + this.wl(e) + } + } + }]), t +}(), Mt = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, 8)) + } + + return o(t, Tt), t +}(), At = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, 12)) + } + + return o(t, Tt), t +}(), Nt = function () { + function t(e, n) { + var r; + return s(this, t), (r = i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e))).Cl = n, r + } + + return o(t, Lt), n(t, [{ + key: "Pl", value: function () { + if (this.words.length >= 4 && this.words[0].length >= this.Cl && this.words[1].length >= this.Cl && this.words[2].length >= this.Cl && this.words[3].length >= this.Cl) { + var t = []; + t[0] = Lt.Al(this.words[0], this.ul.Ca()), t[1] = Lt.Al(this.words[1], this.ul.Ca()), t[2] = Lt.Al(this.words[2], this.ul.Ca()), t[3] = Lt.Al(this.words[3], this.ul.Ca()); + for (var e = new Pt(this.ul.Fa()), n = 0; n < this.Cl / 4; n++) { + var r = []; + r[0] = new Ot(this.ul.ka()), r[1] = new Ot(this.ul.ka()), r[2] = new Ot(this.ul.ka()), r[3] = new Ot(this.ul.ka()), r[0].ol(t[0][4 * n]), r[0].ol(t[0][4 * n + 1]), r[0].ol(t[1][4 * n]), r[0].ol(t[1][4 * n + 1]), r[1].ol(t[0][4 * n + 2]), r[1].ol(t[0][4 * n + 3]), r[1].ol(t[1][4 * n + 2]), r[1].ol(t[1][4 * n + 3]), r[2].ol(t[2][4 * n]), r[2].ol(t[2][4 * n + 1]), r[2].ol(t[3][4 * n]), r[2].ol(t[3][4 * n + 1]), r[3].ol(t[2][4 * n + 2]), r[3].ol(t[2][4 * n + 3]), r[3].ol(t[3][4 * n + 2]), r[3].ol(t[3][4 * n + 3]); + var i = new Ot(this.ul.ka()); + i.ol(r[0]), i.ol(r[1]), i.ol(r[2]), i.ol(r[3]), e.ol(i) + } + this.wl(e) + } + } + }]), t +}(), It = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, 8)) + } + + return o(t, Nt), t +}(), Dt = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, 12)) + } + + return o(t, Nt), t +}(), Bt = function () { + function t() { + s(this, t) + } + + return n(t, null, [{ + key: "kl", value: function (e, n) { + t.types[e] = n + } + }, { + key: "Fl", value: function (e) { + return t.types[e] + } + }, { + key: "xl", value: function (e, n) { + var r = new t.types[e.rendererType](n); + r.Ml(e.words), r.Sl(e.id); + for (var i = 0, o = e.rotations.length; i < o; i++) e.rotations[i] <= 4 && (e.rotations[i] = 90 * e.rotations[i]); + return r.Hl(e.rotations), r + } + }]), t +}(); +Bt.types = {20: Et, 40: Ct, 60: St, 100: Mt, 120: It, 140: At, 160: Dt}; +var qt = function () { + function t() { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, "wordRotator", 3)) + } + + return o(t, C), n(t, null, [{ + key: "Kt", value: function () { + return v.Mt(t.te) && (t.te = new t), t.te + } + }]), n(t, [{ + key: "Si", value: function (e, n, r, i) { + console.log("upgrading!"), (v.Mt(n) || n < 1 && r >= 1) && e.createObjectStore(t.Dl.Bl, {keyPath: "id"}), (v.Mt(n) || n < 2 && r >= 2) && i.target.transaction.objectStore(t.Dl.Bl).createIndex("played", ["deleted", "played", "difficulty", "id"], {unique: !1}), (v.Mt(n) || n < 3 && r >= 3) && i.target.transaction.objectStore(t.Dl.Bl).createIndex("difficulty", "difficulty", {unique: !1}) + } + }, { + key: "Il", value: function () { + var e = r(regeneratorRuntime.mark(function e(n) { + return regeneratorRuntime.wrap(function (e) { + for (; ;) switch (e.prev = e.next) { + case 0: + return e.abrupt("return", this.vi(n, t.Dl.Bl).catch(function (t) { + console.error("insert error!", t) + })); + case 1: + case"end": + return e.stop() + } + }, e, this) + })); + return function () { + return e.apply(this, arguments) + } + }() + }, { + key: "Rl", value: function () { + var e = r(regeneratorRuntime.mark(function e(n) { + return regeneratorRuntime.wrap(function (e) { + for (; ;) switch (e.prev = e.next) { + case 0: + return e.abrupt("return", this.load(n, t.Dl.Bl)); + case 1: + case"end": + return e.stop() + } + }, e, this) + })); + return function () { + return e.apply(this, arguments) + } + }() + }, { + key: "Ul", value: function () { + var e = r(regeneratorRuntime.mark(function e(n) { + var r, i, o, s, a, u; + return regeneratorRuntime.wrap(function (e) { + for (; ;) switch (e.prev = e.next) { + case 0: + return e.next = 2, this.Pi(t.Dl.Bl); + case 2: + for (r = e.sent, i = [], o = [], s = -1, a = 0, u = (r = r.sort(function (t, e) { + return t.difficulty - e.difficulty + })).length; a < u; a++) !(s < 0 || s === r[a].difficulty) || r[a].deleted || r[a].played || -1 === n.indexOf(r[a].rendererType) ? 0 === r[a].difficulty || r[a].deleted || r[a].played || i.push(r[a]) : (o.push(r[a]), s = r[a].difficulty); + return e.abrupt("return", 0 === o.length ? null : o[Math.round(Math.random() * o.length) % o.length]); + case 8: + case"end": + return e.stop() + } + }, e, this) + })); + return function () { + return e.apply(this, arguments) + } + }() + }, { + key: "El", value: function () { + var e = r(regeneratorRuntime.mark(function e(n) { + var r; + return regeneratorRuntime.wrap(function (e) { + for (; ;) switch (e.prev = e.next) { + case 0: + return e.next = 2, this.Rl(n); + case 2: + return (r = e.sent).played = !0, e.next = 6, this.yi(r, t.Dl.Bl); + case 6: + return e.abrupt("return", e.sent); + case 7: + case"end": + return e.stop() + } + }, e, this) + })); + return function () { + return e.apply(this, arguments) + } + }() + }, { + key: "Wl", value: function () { + var t = r(regeneratorRuntime.mark(function t() { + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }]), t +}(); +qt.Dl = {Bl: "level"}, qt.te = null; +var Kt = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, "html/application/end.html")) + } + + return o(t, wt), n(t, [{ + key: "ln", value: function (n) { + return ft.update("End Site"), e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "ln", this).call(this, n) + } + }]), t +}(), Ht = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, "html/application/level.html")) + } + + return o(t, wt), n(t, [{ + key: "xn", value: function (n) { + n = e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "xn", this).call(this, n); + var r = new l(v.m(localStorage.getItem("coins"), "0"), function () { + }, l.Y, 900); + return r.F(!1), r.M = "coin-counter", n.at(r), this.Nl = r, n + } + }, { + key: "an", value: function (n) { + this.Ol = v.m(localStorage.getItem("levelCounter"), 1), this._l = function () { + }, this.jl = {Vl: !1, Jl: null}, this.ql = Promise.resolve(); + var r = F.Kt(), i = mt.Kt(); + return i.set({ + ua: "sound/single_coin_fall_on_concrete_.mp3", + muted: "1" !== r.yr("play-sound", "1"), + volume: .7 + }, mt.ha.Sa), i.resume(mt.ha.fa), e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "an", this).call(this, n) + } + }, { + key: "hn", value: function () { + var n = r(regeneratorRuntime.mark(function n() { + var r, i, o, s, a, u, l, c, h = this; + return regeneratorRuntime.wrap(function (n) { + for (; ;) switch (n.prev = n.next) { + case 0: + return e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "hn", this).call(this), r = this.gn("#segment-leaf-template"), i = this.gn("#segment-parent-template"), o = this.gn("#segment-row-template"), s = this.gn("#segment-triangle-template"), r.id = null, i.id = null, o.id = null, s.id = null, r.remove(), i.remove(), o.remove(), s.remove(), a = this, (u = this.gn("#continue-button")).addEventListener("click", function () { + a.zl() + }), l = this.gn("#won-text"), c = new dt, n.next = 8, c.Yo(u, u.parentElement, !1, !0, 2); + case 8: + return this.$l = n.sent, n.next = 11, c.Yo(l, l.parentElement, !1, !1, 2, null, 5); + case 11: + return this.Gl = n.sent, this.Kl = l, this.Kl.style.fontSize = "0", this.Xl = document.getElementById("level-number-container"), this.Ql = document.getElementById("level-number"), this.Ql.innerText = this.Ol, n.next = 19, c.Yo(this.Ql, this.Xl, !1, !1, 4); + case 19: + return this.Yl = n.sent, this.Xl.classList.add("visible"), this.ul = new _t(r, i, o, s), this.Zl = this.gn("#coin-template"), this.th = this.gn("#coin-container"), this.Zl.id = null, this.th.removeAllChildren(), this.gn("#help-button").addEventListener("click", function () { + h.eh() + }), n.next = 29, this.nh(); + case 29: + case"end": + return n.stop() + } + }, n, this) + })); + return function () { + return n.apply(this, arguments) + } + }() + }, { + key: "nh", value: function () { + var t = r(regeneratorRuntime.mark(function t() { + var e, n, r, i, o, s, a, u; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + if (t.prev = 0, e = localStorage.getItem("currentLevel"), !v.R(e)) { + t.next = 23; + break + } + return e = JSON.parse(e), n = qt.Kt(), t.next = 7, n.Rl(e.id); + case 7: + if (null !== (r = t.sent)) { + t.next = 10; + break + } + return t.abrupt("return", this.zl()); + case 10: + return (i = Bt.xl(r, this.ul)).Hl(e.rotations), o = this, i.yl().then(function () { + o.sh(i) + }), i.Pl(), i.fl(e.locks), i.vl().Wa(), i.pl(), (s = this.gn("#level")).removeAllChildren().appendChild(i.vl().ja()), a = new dt, t.next = 19, a.Yo(s, s.parentElement, !1, !1, 1, 1.5 * i.words[0].length, null, 0); + case 19: + return this._l = t.sent, this.level = i, u = this.ih(), t.abrupt("return", (ft.push(["trackEvent", "LevelSite", "LoadLastLevel"]), this.level.il(), u)); + case 23: + t.next = 28; + break; + case 25: + t.prev = 25, t.t0 = t.catch(0), console.error(t.t0); + case 28: + return t.abrupt("return", this.zl()); + case 29: + case"end": + return t.stop() + } + }, t, this, [[0, 25]]) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "zl", value: function () { + var e = r(regeneratorRuntime.mark(function e() { + var n, r, i, o, s, a; + return regeneratorRuntime.wrap(function (e) { + for (; ;) switch (e.prev = e.next) { + case 0: + return e.prev = 0, this.en.classList.remove("won"), this.Kl.style.fontSize = "0", n = qt.Kt(), e.next = 5, n.Ul(t.rh); + case 5: + if (r = e.sent, console.log("nextLevelJson", r), null !== r) { + e.next = 8; + break + } + return e.abrupt("return", (this.Ln(Kt), void this.finish())); + case 8: + return i = Bt.xl(r, this.ul), o = this, i.yl().then(function () { + o.sh(i) + }), i.Pl(), i.vl().Wa(), i.pl(), (s = this.gn("#level")).removeAllChildren().appendChild(i.vl().ja()), a = new dt, e.next = 15, a.Yo(s, s.parentElement, !1, !1, 1, 1.5 * i.words[0].length, null, 0); + case 15: + return this._l = e.sent, this.level = i, this.Ql.innerText = this.Ol, this.Yl(), this.Nl.k(v.m(localStorage.getItem("coins"), "0")), this.Nl.j(), this.jl.Vl = !0, clearTimeout(this.jl.Jl), ft.push(["trackEvent", "LevelSite", "NextLevel", "Level Number Normal", this.Ol]), this.level.il(), e.abrupt("return", this.ih()); + case 28: + e.prev = 28, e.t0 = e.catch(0), console.log("Fehler!"), console.error(e.t0); + case 31: + case"end": + return e.stop() + } + }, e, this, [[0, 28]]) + })); + return function () { + return e.apply(this, arguments) + } + }() + }, { + key: "ln", value: function (n) { + ft.update("Level Site"); + var r = e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "ln", this).call(this, n); + this.Ql && (this.Ql.innerText = this.Ol, this.Xl.classList.add("visible")), this._l(); + var i = F.Kt(); + return mt.Kt().set({ + ua: "sound/single_coin_fall_on_concrete_.mp3", + muted: "1" !== i.yr("play-sound", "1"), + volume: .7 + }, mt.ha.Sa), r + } + }, { + key: "cn", value: function (n) { + e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "cn", this).call(this, n), this.Xl.classList.remove("visible") + } + }, { + key: "sh", value: function () { + var t = r(regeneratorRuntime.mark(function t(e) { + var n = this; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return t.prev = 0, t.delegateYield(regeneratorRuntime.mark(function t() { + var r, i, o, s, a, u, l, c; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + for (r = qt.Kt().El(e.$()), n.Ol++, localStorage.setItem("levelCounter", n.Ol), n.en.classList.add("won"), localStorage.removeItem("currentLevel"), (i = n.gn("#continue-button")).style.transition = "none", i.style.opacity = 0, n.th.removeAllChildren(), o = m.get("coinsPerLevel", 5), s = 0, a = mt.Kt(), u = a.get(mt.ha.Sa), n.ql = n.ql.then(function () { + s = parseInt(v.m(localStorage.getItem("coins"), "0")), localStorage.setItem("coins", s + parseInt(o)) + }).then(function () { + return Promise.all([new Promise(function (t) { + setTimeout(function () { + t(i.fadeIn()) + }, 500) + }), u.ca.catch(function (t) { + console.error(t) + })]) + }), n.jl.Vl = !1, l = function () { + var t = v.cloneNode(n.Zl); + n.th.appendChild(t), n.ql = n.ql.then(function () { + return new Promise(function (e) { + n.jl.Vl ? e() : (t.fadeIn(.35), a.play(mt.ha.Sa), n.jl.Jl = setTimeout(function () { + n.jl.Vl || (n.Nl.k(++s), n.Nl.j()) + }, 175)), setTimeout(e, 350) + }) + }) + }, c = 0; c < o; c++) l(c); + return n.ql = n.ql.catch(function (t) { + console.error(t) + }), n.Gl(), n.$l(), n._l(), ft.push(["trackEvent", "LevelSite", "LevelWon", "Coins", parseInt(v.m(localStorage.getItem("coins"), "0"))]), t.next = 15, r; + case 15: + case"end": + return t.stop() + } + }, t, n) + })(), "t0", 2); + case 2: + t.next = 7; + break; + case 4: + t.prev = 4, t.t1 = t.catch(0), console.error(t.t1); + case 7: + case"end": + return t.stop() + } + }, t, this, [[0, 4]]) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "eh", value: function () { + var t = m.get("costForHelp", 25), e = parseInt(v.m(localStorage.getItem("coins"), 0)); + if (e >= t) { + e -= t, localStorage.setItem("coins", e), this.Nl.title = e, this.Nl.j(); + for (var n = this.level.Tl(), r = (n = n.filter(function (t) { + return !t.Ea(!1) + }))[Math.floor(Math.random() * n.length)]; 0 !== r.rotation;) r.rotate(); + r.Ga(!1), this.level.pl(), ft.push(["trackEvent", "LevelSite", "Help", "Coins", parseInt(v.m(localStorage.getItem("coins"), "0"))]) + } else E.oi("not-enough-coins"), ft.push(["trackEvent", "LevelSite", "Help", "Not enough Coins", parseInt(v.m(localStorage.getItem("coins"), "0"))]) + } + }, { + key: "ih", value: function () { + var e = r(regeneratorRuntime.mark(function e() { + var n, r, i, o, s, a, u, l, c, h, f, p, d, m = this; + return regeneratorRuntime.wrap(function (e) { + for (; ;) switch (e.prev = e.next) { + case 0: + if (this.level.id !== t.ah.oh) { + e.next = 20; + break + } + n = v.m(localStorage.getItem("tutorial-step"), "1"), r = new dt, e.t0 = (this.en.classList.add("tutorial"), this.en.classList.add("step-" + n), n), e.next = "1" === e.t0 ? 5 : "2" === e.t0 ? 11 : 17; + break; + case 5: + return this.level.bl(function () { + m.en.classList.remove("step-1"), localStorage.setItem("tutorial-step", "2"), m.ih() + }), i = this.gn(".tutorial-text .step-1"), e.next = 9, this._l(); + case 9: + return r.Yo(i, i.parentElement, null, !0, 1, 2), e.abrupt("break", 18); + case 11: + return this.level.bl(function () { + }), this.level.yl().then(function () { + m.en.classList.remove("tutorial"), m.en.classList.remove("step-2"), localStorage.removeItem("tutorial-step"), m.ql = m.ql.then(function () { + E.oi("extra-coins-after-first-level"), localStorage.setItem("coins", parseInt(v.m(localStorage.getItem("coins"), "0")) + 50), m.Nl.k(v.m(localStorage.getItem("coins"), "0")), m.Nl.j() + }) + }), o = this.gn(".tutorial-text .step-2"), e.next = 15, this._l(); + case 15: + return r.Yo(o, o.parentElement, null, !0, 1, 2), e.abrupt("break", 18); + case 17: + this.en.classList.remove("tutorial"); + case 18: + e.next = 52; + break; + case 20: + if (this.level.id !== t.ah.lh) { + e.next = 37; + break + } + s = v.m(localStorage.getItem("tutorial-step"), "3"), e.t1 = s, e.next = "3" === e.t1 ? 25 : 34; + break; + case 25: + return a = new dt, this.en.classList.add("tutorial"), this.en.classList.add("step-" + s), u = function t() { + m.en.classList.remove("tutorial"), m.en.classList.remove("step-3"), localStorage.setItem("tutorial-step", "4"), m.gn("#help-button").removeEventListener("click", t), m._l() + }, this.gn("#help-button").addEventListener("click", u), l = this.gn(".tutorial-text .step-3"), e.next = 32, this._l(); + case 32: + return a.Yo(l, l.parentElement, null, !0, 1, 2), e.abrupt("break", 35); + case 34: + this.en.classList.remove("tutorial"); + case 35: + e.next = 52; + break; + case 37: + if (this.level.id !== t.ah.hh) { + e.next = 52; + break + } + c = v.m(localStorage.getItem("tutorial-step"), "4"), e.t2 = c, e.next = "4" === e.t2 ? 42 : 51; + break; + case 42: + return h = new dt, this.en.classList.add("tutorial"), this.en.classList.add("step-" + c), f = this.level.Tl()[0], (p = this.gn("#tutorial-pointer")).remove(), f.vn.appendChild(p), this.level.bl(function (t) { + f === t && (m.en.classList.remove("tutorial"), m.en.classList.remove("step-4"), localStorage.setItem("tutorial-step", "5"), m._l()) + }), d = this.gn(".tutorial-text .step-4"), e.next = 49, this._l(); + case 49: + return h.Yo(d, d.parentElement, null, !0, 1, 2), e.abrupt("break", 52); + case 51: + this.en.classList.remove("tutorial"); + case 52: + case"end": + return e.stop() + } + }, e, this) + })); + return function () { + return e.apply(this, arguments) + } + }() + }]), t +}(); +Ht.rh = [20, 40, 60, 100, 120, 140, 160], Ht.ah = {oh: 67, lh: 15, hh: 341}; +var Ft = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, 4)) + } + + return o(t, Nt), n(t, [{ + key: "pl", value: function () { + } + }]), t +}(), Vt = function () { + function t() { + var e; + return s(this, t), e = i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, w.tn("html/application/dialog/share.html").then(function (t) { + t.appendChild(M.ji(window.location.hostname + v.Gt(""))); + var n = function () { + e.close() + }; + return t.querySelectorAll("a").forEach(function (t) { + t.addEventListener("click", n) + }), t + }), "share-dialog")) + } + + return o(t, R), t +}(), Ut = function () { + function t(e) { + var n; + return s(this, t), (n = i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, "html/application/menu.html"))).uh = n.dh(), n.listener = null, n + } + + return o(t, wt), n(t, [{ + key: "ln", value: function (n) { + var i = this; + ft.update("Menu Site"); + var o = e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "ln", this).call(this, n), + s = new Ft(this.ul); + s.Ml(["WORD", "ROTA", "TORW", "ORDR"]), s.Pl(), s.yl().then(function () { + ft.push(["trackEvent", "MainMenu", "levelSolved"]), i.mh() + }); + var a = s.vl(); + a.Wa(), this.gn("#level").removeAllChildren().appendChild(a.ja()); + var u = s.Tl(); + (function t() { + var e = 4500 * Math.random() + 1500; + i.gh = setTimeout(function () { + for (var e = -1, n = [], r = 0; r < u.length && !(0 !== u[r].rotation && (n.push(r), n.length >= 2)); r++) ; + 1 === n.length && (e = n[0]); + var i = Math.floor(Math.random() * u.length); + i === e && (i = (i + 1) % u.length), u[i].rotate(), t() + }, e) + })(), this.listener = r(regeneratorRuntime.mark(function t() { + var e, n, r, o, s; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return e = i.gn("#play-button"), (n = i.gn("#level-number")).innerText = v.m(localStorage.getItem("levelCounter"), 1), r = i.gn("#level"), o = new dt, t.next = 5, o.Yo(r, r.parentElement, !1, !1, 2, 8, null, !1); + case 5: + return s = getComputedStyle(r), e.style.width = s.getPropertyValue("width"), o.Yo(e.children[0], e, null, null, null, 4, null, !1), t.next = 10, o.Xo(.2, n.parentElement, n.parentElement.parentElement, null, null, null, 10, null, !1); + case 10: + o.Yo(n, n.parentElement, !1, !1, 8, null, null, !1); + case 11: + case"end": + return t.stop() + } + }, t, i) + })), this.listener(), window.addEventListener("resize", this.listener); + var l = F.Kt(); + return this.gn("#play-sound").checked = "1" === l.yr("play-sound", "1"), this.gn("#play-music").checked = "1" === l.yr("play-music", "1"), o + } + }, { + key: "mh", value: function () { + var t = r(regeneratorRuntime.mark(function t() { + var e = this; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + mt.Kt().ma(), this.Ln(Ht, Promise.race([this.uh, new Promise(function () { + var t = r(regeneratorRuntime.mark(function t(n) { + var r; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return r = qt.Kt(), t.next = 3, r.Ul(Ht.rh); + case 3: + if (t.t0 = t.sent, t.t1 = null !== t.t0, !t.t1) { + t.next = 7; + break + } + n(); + case 7: + case"end": + return t.stop() + } + }, t, e) + })); + return function () { + return t.apply(this, arguments) + } + }())])); + case 1: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }, { + key: "hn", value: function () { + var n = r(regeneratorRuntime.mark(function n() { + var r, i, o, s, a, u, l, c, h = this; + return regeneratorRuntime.wrap(function (n) { + for (; ;) switch (n.prev = n.next) { + case 0: + e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "hn", this).call(this), this.gn("#play-button").addEventListener("click", function () { + ft.push(["trackEvent", "MainMenu", "startButton"]), h.mh() + }), r = this.gn("#segment-leaf-template"), i = this.gn("#segment-parent-template"), o = this.gn("#segment-row-template"), s = this.gn("#segment-triangle-template"), r.id = null, i.id = null, o.id = null, s.id = null, r.remove(), i.remove(), o.remove(), s.remove(), this.ul = new _t(r, i, o, s), v.m(t.app.$s) && t.app.$s.then(function () { + h.listener && h.listener() + }), a = F.Kt(), u = mt.Kt(), (l = this.gn("#play-music")).checked = "1" === a.yr("play-music", "1"), l.addEventListener("change", function () { + a.Tr("play-music", l.checked ? "1" : "0"), u.set({muted: !l.checked}, mt.ha.fa), l.checked && u.play(mt.ha.fa), ft.push(["trackEvent", "MainMenu", "PlayMusic", "Play Music", l.checked ? 1 : 0]) + }), (c = this.gn("#play-sound")).checked = "1" === a.yr("play-sound", "1"), c.addEventListener("change", function () { + a.Tr("play-sound", c.checked ? "1" : "0"), u.set({muted: !c.checked}, mt.ha.Sa), ft.push(["trackEvent", "MainMenu", "PlaySound", "Play Sound", c.checked ? 1 : 0]) + }), this.gn("#share-button").addEventListener("click", function () { + (new Vt).show() + }); + case 7: + case"end": + return n.stop() + } + }, n, this) + })); + return function () { + return n.apply(this, arguments) + } + }() + }, { + key: "cn", value: function (n) { + clearTimeout(this.gh), window.removeEventListener("resize", this.listener), e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "cn", this).call(this, n) + } + }, { + key: "dh", value: function () { + var t = r(regeneratorRuntime.mark(function t() { + var e, n, r, i, o, s, a, u, l, c, h; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + e = v.m(localStorage.getItem("date-last-sync"), 0), n = qt.Kt(), r = null, i = 1, o = [], s = 0; + case 3: + if (!(s < i)) { + t.next = 23; + break + } + return t.next = 6, K.load("wordRotator/levels" + K.ae({currentRun: s, dateLastSync: e})); + case 6: + if ((a = t.sent).success) { + t.next = 16; + break + } + return t.next = 10, n.Ul(Ht.rh); + case 10: + if (t.t0 = t.sent, t.t1 = null === t.t0, !t.t1) { + t.next = 14; + break + } + E.oi("sync-error", null, 6e3); + case 14: + return r = null, t.abrupt("break", 23); + case 16: + for (a = a.result, r = v.m(r, a.currentSyncDate), i = a.maxRuns, u = a.levels, l = function (t) { + var e = u[t]; + o.push(n.Rl(u[t].id).then(function (t) { + return e.played = v.m(v.m(t, {}).played, !1), e + })) + }, c = 0; c < u.length; c++) l(c); + case 20: + s++, t.next = 3; + break; + case 23: + return t.next = 25, Promise.all(o); + case 25: + return h = t.sent, console.log("levels to save", h), t.next = 29, n.Il(h); + case 29: + null != r && "null" !== r && localStorage.setItem("date-last-sync", r); + case 30: + case"end": + return t.stop() + } + }, t, this) + })); + return function () { + return t.apply(this, arguments) + } + }() + }]), t +}(); +Ut.app = null, a.t(function (t) { + Ut.app = t +}); +var zt = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, "html/application/privacyPolicy.html", "privacyPolicy")) + } + + return o(t, wt), n(t, [{ + key: "hn", value: function () { + this.gn("#track-switch").addEventListener("change", function (t) { + ft.jo(!0 === this.checked), t.stopPropagation(), t.preventDefault() + }), e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "hn", this).call(this) + } + }, { + key: "ln", value: function (n) { + var r = this.gn("#track-switch"), i = "1" === v.m(localStorage.getItem("matomoShouldTrack"), "1"); + return r.checked = i, ft.update("Privacy Policy Site"), e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "ln", this).call(this, n) + } + }]), t +}(); +a.t(function (t) { + t.Ns("privacyPolicy", zt) +}); +var Yt = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, "html/application/credits.html", "credits")) + } + + return o(t, wt), n(t, [{ + key: "ln", value: function (n) { + return ft.update("Credits Site"), e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "ln", this).call(this, n) + } + }]), t +}(); +a.t(function (t) { + t.Ns("credits", Yt) +}); +var Wt = function () { + function t() { + var e; + return s(this, t), e = i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, w.tn("html/application/dialog/chooseTheme.html").then(function (t) { + var n = t.querySelector("#choose-theme-template"); + n.remove(), n.id = null; + for (var r = t.querySelector("#theme-choose-container"), i = function (t) { + var i = v.cloneNode(n), o = y.Be[t]; + i.querySelector(".name").appendChild(d.pt(o.De)), i.dataset.theme = o.De, i.addEventListener("click", function () { + e.result = i.dataset.theme, e.close() + }), r.appendChild(i) + }, o = 0; o < y.Be.length; o++) i(o); + return t + }), "choose-theme-dialog-title")) + } + + return o(t, R), t +}(), Xt = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, "html/application/impressum.html", "impressum")) + } + + return o(t, wt), t +}(); +a.t(function (t) { + t.Ns("impressum", Xt) +}); +var Jt = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, "html/application/fragment/settings.html")) + } + + return o(t, V), n(t, [{ + key: "hn", value: function () { + var n = this, i = y.Re.De; + F.Kt().Tr("theme", i); + var o = this.gn("#theme-name"); + o.removeAllChildren().appendChild(d.pt(i)), this.gn("#theme-chooser").addEventListener("click", r(regeneratorRuntime.mark(function t() { + var e; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return t.next = 2, (new Wt).show(); + case 2: + e = t.sent, v.R(e) && (F.Kt().Tr("theme", e), y.xe(e), o.removeAllChildren().appendChild(d.pt(e))); + case 4: + case"end": + return t.stop() + } + }, t, n) + }))), this.gn("#reset-levels").addEventListener("click", function () { + localStorage.removeItem("currentLevel"), localStorage.removeItem("date-last-sync"), localStorage.removeItem("levelCounter"), localStorage.removeItem("tutorial-step"), qt.Kt().Ai(qt.Dl.Bl) + }), (location.hostname.includes("beta") || location.hostname.includes("127.0.0.1")) && this.gn("#reset-levels").classList.remove("hidden"); + var s = this.gn("#play-music"); + s.addEventListener("change", function () { + var t = mt.Kt(); + t.set({muted: !s.checked}, mt.ha.fa), s.checked && t.play(mt.ha.fa) + }), this.gn("#track-switch").addEventListener("change", function (t) { + ft.jo(!0 === this.checked), t.stopPropagation(), t.preventDefault() + }), this.gn("#credits-button").addEventListener("click", function () { + n.qn().Ln(Yt) + }), this.gn("#privacy-policy-button").addEventListener("click", function () { + n.qn().Ln(zt) + }), this.gn("#contact-button").addEventListener("click", function () { + n.qn().Ln(kt) + }), this.gn("#impressum-button").addEventListener("click", function () { + n.qn().Ln(Xt) + }), ht.Wo(function () { + var t = n.gn("#install-button"); + t.addEventListener("click", function () { + t.classList.add("hidden"), ht.prompt().then(function (t) { + console.log("clicked", t), "accepted" === t.outcome && ft.Ko("installed", "installed") + }) + }), t.classList.remove("hidden") + }); + var a = ct.Kt(); + return a.Do() && (console.log("can estimate storage!"), Promise.all([a.estimate(), a.xo()]).then(function (t) { + var e = t[0], r = t[1], i = n.gn("#storage-info"); + console.log(r), i.appendChild(d.pt("storage-info", [Math.round(e.usage / 1048576 * 100) / 100, Math.round(e.quota / 1048576 * 100) / 100, Math.round(e.usage / e.quota * 1e4) / 100, r ? "" : "nicht"])), i.parentElement.classList.remove("hidden"), i.parentElement.addEventListener("click", function () { + a.persist().then(function (t) { + console.log(t), i.removeAllChildren().appendChild(d.pt("storage-info", [Math.round(e.usage / 1048576 * 100) / 100, Math.round(e.quota / 1048576 * 100) / 100, Math.round(e.usage / e.quota * 1e4) / 100, t ? "" : "nicht"])) + }) + }) + })), e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "hn", this).call(this) + } + }, { + key: "ln", value: function () { + ft.update("Settings Site"), e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "ln", this).call(this) + } + }]), t +}(); +a.t(function () { + J.eo("settings", Jt) +}); +var Gt = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, "version/2/html/selectWords.html", null, "select-words")) + } + + return o(t, Z), n(t, [{ + key: "an", value: function () { + var n = r(regeneratorRuntime.mark(function n(r) { + var i; + return regeneratorRuntime.wrap(function (n) { + for (; ;) switch (n.prev = n.next) { + case 0: + return n.next = 2, e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "an", this).call(this, r); + case 2: + return i = n.sent, n.next = 5, K.load("words"); + case 5: + return this.ph = n.sent.result, this.words = this.ph.wordsToCheck, console.log(this.ph), n.abrupt("return", i); + case 9: + case"end": + return n.stop() + } + }, n, this) + })); + return function () { + return n.apply(this, arguments) + } + }() + }, { + key: "hn", value: function () { + var n = this; + e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "hn", this).call(this), this.gn("#not-checked").appendChild(document.createTextNode(this.ph.wordsNotChecked)), this.gn("#checked").appendChild(document.createTextNode(this.ph.wordsChecked)), this.gn("#not-sure").appendChild(document.createTextNode(this.ph.wordsUnsure)), this.gn("#deleted").appendChild(document.createTextNode(this.ph.wordsDeleted)), this.gn("#unused").appendChild(document.createTextNode(this.ph.wordsNotUsed)); + var i = this.gn("#word-template"); + i.id = null, i.remove(); + for (var o = this.gn("#word-container"), s = this.words.length, a = function (t) { + var e = v.cloneNode(i); + e.dataset.id = -1, n.fh(e, n.words[t]), o.appendChild(e), e.querySelector(".button-ok").addEventListener("click", r(regeneratorRuntime.mark(function t() { + var r; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return t.next = 2, K.send("checkWord", {wordId: e.dataset.id, action: "1"}); + case 2: + r = t.sent.result, n.fh(e, r[0]); + case 4: + case"end": + return t.stop() + } + }, t, n) + }))), e.querySelector(".button-unsure").addEventListener("click", r(regeneratorRuntime.mark(function t() { + var r; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return t.next = 2, K.send("checkWord", {wordId: e.dataset.id, action: "2"}); + case 2: + r = t.sent.result, n.fh(e, r[0]); + case 4: + case"end": + return t.stop() + } + }, t, n) + }))), e.querySelector(".button-delete").addEventListener("click", r(regeneratorRuntime.mark(function t() { + var r; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return t.next = 2, K.send("checkWord", {wordId: e.dataset.id, action: "3"}); + case 2: + r = t.sent.result, n.fh(e, r[0]); + case 4: + case"end": + return t.stop() + } + }, t, n) + }))) + }, u = 0; u < s; u++) a(u) + } + }, { + key: "fh", value: function (t, e) { + t.querySelector(".word").removeAllChildren().appendChild(document.createTextNode(e.word)), t.dataset.id = e.id + } + }]), t +}(); +a.t(function (t) { + t.ds(new $("select-words", function () { + t.Ln(Gt) + }, null, null, "select-words")) +}); +var $t = function () { + function t(e) { + return s(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, "version/2/html/deleteLevels.html", null, "admin")) + } + + return o(t, Z), n(t, [{ + key: "an", value: function () { + var n = r(regeneratorRuntime.mark(function n(r) { + var i; + return regeneratorRuntime.wrap(function (n) { + for (; ;) switch (n.prev = n.next) { + case 0: + return i = e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "an", this).call(this, r), n.next = 3, K.load("getDoubleUsedWordsAction"); + case 3: + return this.words = n.sent.result, n.abrupt("return", i); + case 5: + case"end": + return n.stop() + } + }, n, this) + })); + return function () { + return n.apply(this, arguments) + } + }() + }, { + key: "hn", value: function () { + var n = this; + e(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "hn", this).call(this); + var i = this.gn("#level-template"), o = this.gn("#word-template"), s = this.gn("#word-container"); + for (var a in i.id = null, i.remove(), o.id = null, o.remove(), this.words) { + var u = v.cloneNode(o); + u.querySelector(".name").appendChild(document.createTextNode(a)); + for (var l = u.querySelector(".level-container"), c = function (t) { + var e = n.words[a][t], o = v.cloneNode(i); + o.querySelector(".id").appendChild(document.createTextNode(e.id)), o.querySelector(".words").appendChild(document.createTextNode(e.words)), o.querySelector(".positions").appendChild(document.createTextNode(e.rotations)), o.querySelector(".delete-button").addEventListener("click", r(regeneratorRuntime.mark(function t() { + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + return t.next = 2, K.send("deleteLevel", {levelId: e.id}); + case 2: + if (t.t0 = t.sent.success, !t.t0) { + t.next = 5; + break + } + o.remove(); + case 5: + case"end": + return t.stop() + } + }, t, n) + }))), l.appendChild(o) + }, h = 0; h < this.words[a].length; h++) c(h); + s.appendChild(u) + } + } + }]), t +}(); +a.t(function (t) { + t.ds(new $("delete-levels", function () { + t.Ln($t) + }, null, null, "admin")) +}); +var Qt = "/pwa/wordRotator/public/"; +window.location.pathname.indexOf("publicTest/") >= 0 && (Qt = "/pwa/wordRotator/publicTest/"), m.Ae(Qt), d.Rt = ["de"], d.Vt = !1, ft.Jo = "2", window.onerror = function (t, e, n) { + console.error(t, e, n) +}, String.prototype.format || (String.prototype.format = function (t) { + return this.replace(/{(\d+)}/g, function (e, n) { + return void 0 !== t[n] ? t[n] : e + }) +}), Object.assign = v.m(Object.assign, function (e, n) { + if (e = v.m(e, {}), null === n || "object" != (void 0 === n ? "undefined" : t(n)) || "isActiveClone" in n) return e; + for (var r in n) Object.prototype.hasOwnProperty.call(n, r) && (n.isActiveClone = null, e[r] = n[r], delete n.isActiveClone); + return e +}), "undefined" != typeof window && (v.R(window.Node) && !window.Node.prototype.removeAllChildren && (Node.prototype.removeAllChildren = function () { + for (; this.firstChild;) this.removeChild(this.firstChild); + return this +}), HTMLElement && (HTMLElement.prototype.fadeOut = v.m(HTMLElement.prototype.fadeOut, function (t, e, n) { + t = v.m(t, .5), e = v.m(e, "ease-in-out"), n = v.m(n, 0), this.style.transition = "opacity " + t + "s " + e + " " + n + "s"; + var r = this, i = new Promise(function (e) { + var i = function t(n) { + r.removeEventListener("transitionend", t), r.removeEventListener("transitioncancel", o), r.style.opacity = null, r.style.transition = null, e(!0, n) + }, o = function t(n) { + r.removeEventListener("transitionend", i), r.removeEventListener("transitioncancel", t), r.style.opacity = null, r.style.transition = null, e(!1, n) + }; + r.addEventListener("transitionend", i), r.addEventListener("transitioncancel", o), setTimeout(function () { + e(!1) + }, 1e3 * (t + n)) }); - - MyStorageManager.getInstance().persist(); - - window["applyAndroidBridge"] = AndroidBridge.applyDefinitions; -}); + return requestAnimationFrame(function () { + requestAnimationFrame(function () { + r.style.opacity = 0 + }) + }), i +}), HTMLElement.prototype.fadeIn = v.m(HTMLElement.prototype.fadeIn, function (t, e, n) { + t = v.m(t, .5), e = v.m(e, "ease-in-out"), n = v.m(n, 0), this.style.transition = "opacity " + t + "s " + e + " " + n + "s"; + var r = this; + return new Promise(function (e) { + var i = function t(n) { + r.removeEventListener("transitionend", t), r.removeEventListener("transitioncancel", o), r.style.opacity = null, r.style.transition = null, e(!0, n) + }, o = function t(n) { + r.removeEventListener("transitionend", i), r.removeEventListener("transitioncancel", t), r.style.opacity = null, r.style.transition = null, e(!1, n) + }; + r.addEventListener("transitionend", i), r.addEventListener("transitioncancel", o), "1" === getComputedStyle(r).getPropertyValue("opacity") && e(!1), setTimeout(function () { + e(!1) + }, 1e3 * (t + n)), requestAnimationFrame(function () { + requestAnimationFrame(function () { + r.style.opacity = 1 + }) + }) + }) +})), Node && (Node.prototype.replaceWith = v.m(Node.prototype.replaceWith, function (t) { + this.parentElement.replaceChild(t, this) +}), Node.prototype.remove = v.m(Node.prototype.remove, function () { + this.parentElement.removeChild(this) +})), Element && (Element.prototype.matches = v.m(Element.prototype.matches, v.m(Element.prototype.matchesSelector, Element.prototype.webkitMatchesSelector)), window.Element.prototype.closest = v.m(window.Element.prototype.getAll, function (t) { + var e = this; + if (!document.documentElement.contains(e)) return null; + do { + if (e.matches(t)) return e; + e = e.parentElement + } while (null !== e); + return null +})), window.IDBObjectStore.prototype.getAll = v.m(window.IDBObjectStore.prototype.getAll, function () { + var t = {}, e = []; + return this.openCursor().onsuccess = function (n) { + var r = n.target.result; + v.R(r) ? (e.push(r.value), r.continue()) : v.R(t.onsuccess) && t.onsuccess({currentTarget: {result: e}}) + }, t +})), String.prototype.startsWith = v.m(String.prototype.startsWith, function (t, e) { + return e = e || 0, this.indexOf(t, e) === e +}), String.prototype.includes = v.m(String.prototype.includes, function (t) { + return this.indexOf(t) >= 0 +}), String.prototype.endsWith = v.m(String.prototype.endsWith, function (t, e) { + var n = this.toString(); + ("number" != typeof e || !isFinite(e) || Math.floor(e) !== e || e > n.length) && (e = n.length), e -= t.length; + var r = n.indexOf(t, e); + return -1 !== r && r === e +}), window.fetch = v.m(window.fetch, function (t) { + console.log("customFetch", t); + var e = null; + if (window.XMLHttpRequest) e = new XMLHttpRequest; else if (window.Ki) try { + e = new ActiveXObject("Msxml2.XMLHTTP") + } catch (t) { + try { + e = new ActiveXObject("Microsoft.XMLHTTP") + } catch (t) { + } + } + var n = new Promise(function (t) { + e.onload = t, e.onerror = function (e) { + t(Promise.reject(e)) + } + }), r = new Promise(function (t) { + t({ + json: function () { + return e.send(), n.then(function () { + return JSON.parse(e.responseText) + }) + }, text: function () { + return e.send(), n.then(function () { + return e.responseText + }) + }, arrayBuffer: function () { + return e.responseType = "arraybuffer", e.send(), n.then(function () { + return e.response + }) + } + }) + }); + return e.open("get", t, !0), r +}), y.Ee(new B("red", "red")), y.Ee(new B("blue", "blue")), y.Ee(new B("black", "black")), y.Ee(new B("green", "green")), y.Ee(new B("pink", "pink")), y.Ee(new B("dark", "dark")), M._i(new pt(new I("img/whatsapp.svg"), "whatsapp", !0)), M._i(new pt(new A("img/sms.svg"), "sms", !0)), M._i(new pt(new N("img/telegram.svg"), "telegram", !0)); +var Zt = new P; +u.l(function () { + window.app = Zt, window.app.pause = Zt.pause, window.app.resume = Zt.resume, window.app.setAppEndListener = Zt.setAppEndListener +}), J.ro("html/application/setting-template.html"), ut.at = !1, at.ko = !1, a.resolve(Zt).then(r(regeneratorRuntime.mark(function t() { + var e; + return regeneratorRuntime.wrap(function (t) { + for (; ;) switch (t.prev = t.next) { + case 0: + J.oo.p = l.Y, e = F.Kt(), mt.Kt().play(mt.ha.fa, { + ua: "sound/brightAndBeautifull__.mp3", + loop: !0, + volume: .6, + muted: "1" !== e.yr("play-music", "1") + }).catch(function (t) { + return console.error(t) + }), Zt.start(Ut), d.bt("de"), ht.Wo(function () { + }), ht.Eo() && ct.Kt().persist(), window.applyAndroidBridge = u.u; + case 3: + case"end": + return t.stop() + } + }, t, this) +}))); \ No newline at end of file diff --git a/public/js/lang/de.json b/public/js/lang/de.json index 696659f..edf9066 100755 --- a/public/js/lang/de.json +++ b/public/js/lang/de.json @@ -1 +1 @@ -{"won":"Gewonnen!","continue":"Weiter","help":"?","not-enough-coins":"Du hast zu wenig Münzen!","sync-error":"Es gab einen Fehler beim Aktualisieren der Level. Bitte stelle sicher, dass du eine aktive Internetverbindung hast und versuche es später erneut.","game-ended":"Oh nein!
Es sieht so aus, als ob du schon alle Level gespielt hast...
Schau später noch einmal rein, evtl gibt es dann neue Level.","play":"Spielen!","tutorial-step-1":"Klicke auf ein Feld, um dieses rotieren zu lassen!","tutorial-step-2":"Um zu gewinnen, drehe die Segmente so, dass du zwei Wörter lesen kannst.","tutorial-step-3":"Die Hilfe löst ein Segment, kostet aber 25 Münzen. Probiere jetzt die Hilfe aus.","tutorial-step-4":"Große Segmente drehst du, indem du diese ziehst.","extra-coins-after-first-level":"Für das erste Level gibt es 50 extra Münzen!","dark":"Dunkel","theme":"Theme:","sound":"Sound:","music":"Musik:","credits":"Credits","privacy-policy":"Datenschutzbestimmungen","impressum":"Impressum","track":"Anonymisierte Nutzungsdaten senden:",">":">","choose-theme-dialog-title":"Theme auswählen:","install":"Installieren","share-dialog":"Teilen:","credits-sister-text":"Ich danke meiner Lieblingsschwester, denn ohne Sie würde diese App nicht so aussehen, wie sie aussieht (wahrscheinlich eher schlechter :p)","credits-coin-text":"Sound:
Der Münz-Sound ist von der Webseite {0}. Alle Rechte für diesen Münz-Sound gehören {0}.","credits-music-text":"Musik:
Bright And Beautiful - GEMAfreie Musik von {0}
Licensed under Creative Commons: By Attribution 4.0 International (CC BY 4.0)
{1}
Angepasst (geschnitten) für diese App","storage-info":"Ungefähr {0}/{1}MB genutzt ({2}%)","Sunday":"Sonntag","Monday":"Montag","Tuesday":"Dienstag","Wednesday":"Mittwoch","Thursday":"Donnerstag","Friday":"Freitag","Saturday":"Samstag","January":"Januar","February":"Februar","March":"März","April":"April","May":"Mai","June":"Juni","July":"Juli","August":"August","September":"September","October":"Oktober","November":"November","December":"Dezember","Sun":"So","Mon":"Mo","Tue":"Di","Wed":"Mi","Thu":"Do","Fri":"Fr","Sat":"Sa","Jan":"Jan","Feb":"Feb","Mar":"Mär","Apr":"Apr","Jun":"Jun","Jul":"Jul","Aug":"Aug","Sep":"Sep","Oct":"Okt","Nov":"Nov","Dec":"Dez","code-not-valid":"Der angegebebe Code ist nicht gültig!","code-activated":"Der Code wurde erfolgreich aktiviert!","contact":"Kontakt","contact-email":"E-Mailadresse","contact-accepted-privacy-policy-2":" gelesen und akzepiert","contact-message":"Nachricht","contact-submit":"Absenden","contact-email-empty":"Die E-Mailadresse wird benötigt, um Ihre Nachricht zu beantworten.","contact-email-not-valid":"Die gegebene E-Mailadresse ist nicht gültig!","contact-accept-privacy-policy-empty":"Die Datenschutzbestimmungen müssen akzeptiert werden!","contact-message-empty":"Bitte geben Sie eine Nachricht ein.","contact-message-sent":"Ihre Nachricht wurde gesendet!","current-lang":"DE","en":"Englisch","de":"Deutsch","black":"Schwarz","red":"Rot","blue":"Blau","green":"Grün","pink":"Rosa","cancel-button":"ABBRECHEN","confirm-button":"OK","we-use-cookie-hint":"Diese Seite nutzt Cookies. Lesen Sie unsere Datenschutzerklärung, um mehr zu erfahren.","policy-heading":"Datenschutzerklärung","area-of-validity-heading":"Geltungsbereich","area-of-validity":"Diese Datenschutzerklärung klärt Nutzer über die Art, den Umfang und Zwecke der Erhebung und Verwendung personenbezogener Daten durch den verantwortlichen Anbieter Silas Günther, Langenbusch 263b - 42897 Remscheid, matrix[at]silas.link auf dieser Website (im folgenden \"Angebot\") auf.

Die rechtlichen Grundlagen des Datenschutzes finden sich im Bundesdatenschutzgesetz (BDSG) und dem Telemediengesetz (TMG).","logfiles-heading":"Zugriffsdaten / Server-Logfiles","logfiles":"Der Anbieter (beziehungsweise sein Webspace-Provider) erhebt Daten über jeden Zugriff auf das Angebot (so genannte Serverlogfiles). Zu den Zugriffsdaten gehören:

Name der abgerufenen Webseite, Datei, Datum und Uhrzeit des Abrufs, übertragene Datenmenge, Meldung über erfolgreichen Abruf, Browsertyp nebst Version, das Betriebssystem des Nutzers, Referrer URL (die zuvor besuchte Seite), IP-Adresse und der anfragende Provider.

Der Anbieter verwendet die Protokolldaten nur für statistische Auswertungen zum Zweck des Betriebs, der Sicherheit und der Optimierung des Angebotes. Der Anbieter behält sich jedoch vor, die Protokolldaten nachträglich zu überprüfen, wenn aufgrund konkreter Anhaltspunkte der berechtigte Verdacht einer rechtswidrigen Nutzung besteht.","contact-support-heading":"Kontaktaufnahme","contact-support":"Bei der Kontaktaufnahme mit dem Anbieter (zum Beispiel per Post oder E-Mail) werden die Angaben des Nutzers zwecks Bearbeitung der Anfrage sowie für den Fall, dass Anschlussfragen entstehen, gespeichert.","cookies-heading":"Cookies","cookies":"Cookies sind kleine Dateien, die es ermöglichen, auf dem Zugriffsgerät der Nutzer (PC, Smartphone o.ä.) spezifische, auf das Gerät bezogene Informationen zu speichern. Sie dienen zum einem der Benutzerfreundlichkeit von Webseiten und damit den Nutzern (z.B. Speicherung von Logindaten). Zum anderen dienen sie, um die statistische Daten der Webseitennutzung zu erfassen und sie zwecks Verbesserung des Angebotes analysieren zu können. Die Nutzer können auf den Einsatz der Cookies Einfluss nehmen. Die meisten Browser verfügen eine Option mit der das Speichern von Cookies eingeschränkt oder komplett verhindert wird. Allerdings wird darauf hingewiesen, dass die Nutzung und insbesondere der Nutzungskomfort ohne Cookies eingeschränkt werden.

Sie können viele Online-Anzeigen-Cookies von Unternehmen über die US-amerikanische Seite http://www.aboutads.info/choices/ oder die EU-Seite http://www.youronlinechoices.com/uk/your-ad-choices/ verwalten.","google-analytics-heading":"Google Analytics","google-analytics":"Dieses Angebot benutzt Google Analytics, einen Webanalysedienst der Google Inc. („Google“). Google Analytics verwendet sog. „Cookies“, Textdateien, die auf Computer der Nutzer gespeichert werden und die eine Analyse der Benutzung der Website durch sie ermöglichen. Die durch den Cookie erzeugten Informationen über Benutzung dieser Website durch die Nutzer werden in der Regel an einen Server von Google in den USA übertragen und dort gespeichert.

Im Falle der Aktivierung der IP-Anonymisierung auf dieser Webseite, wird die IP-Adresse der Nutzer von Google jedoch innerhalb von Mitgliedstaaten der Europäischen Union oder in anderen Vertragsstaaten des Abkommens über den Europäischen Wirtschaftsraum zuvor gekürzt. Nur in Ausnahmefällen wird die volle IP-Adresse an einen Server von Google in den USA übertragen und dort gekürzt. Die IP-Anonymisierung ist auf dieser Website aktiv. Im Auftrag des Betreibers dieser Website wird Google diese Informationen benutzen, um die Nutzung der Website durch die Nutzer auszuwerten, um Reports über die Websiteaktivitäten zusammenzustellen und um weitere mit der Websitenutzung und der Internetnutzung verbundene Dienstleistungen gegenüber dem Websitebetreiber zu erbringen.

Die im Rahmen von Google Analytics von Ihrem Browser übermittelte IP-Adresse wird nicht mit anderen Daten von Google zusammengeführt. Die Nutzer können die Speicherung der Cookies durch eine entsprechende Einstellung Ihrer Browser-Software verhindern; Dieses Angebot weist die Nutzer jedoch darauf hin, dass Sie in diesem Fall gegebenenfalls nicht sämtliche Funktionen dieser Website vollumfänglich werden nutzen können. Die Nutzer können darüber hinaus die Erfassung der durch das Cookie erzeugten und auf ihre Nutzung der Website bezogenen Daten (inkl. Ihrer IP-Adresse) an Google sowie die Verarbeitung dieser Daten durch Google verhindern, indem sie das unter dem folgenden Link verfügbare Browser-Plugin herunterladen und installieren: http://tools.google.com/dlpage/gaoptout?hl=de.

Weitere Informationen zur Datennutzung zu Werbezwecken durch Google, Einstellungs- und Widerspruchsmöglichkeiten erfahren Sie auf den Webseiten von Google:
https://www.google.com/intl/de/policies/privacy/partners/ („Datennutzung durch Google bei Ihrer Nutzung von Websites oder Apps unserer Partner“),
http://www.google.com/policies/technologies/ads („Datennutzung zu Werbezwecken“),
http://www.google.de/settings/ads („Informationen verwalten, die Google verwendet, um Ihnen Werbung einzublenden“) und
http://www.google.com/ads/preferences/ („Bestimmen Sie, welche Werbung Google Ihnen zeigt“).","edited-hint":"Der generierte Text wurde vom Webseiteninhaber angepasst.","generated-hint":"Erstellt mit Datenschutz-Generator.de von RA Dr. Thomas Schwenke","google-play-services-heading":"Google Play Dienste","google-play-services":"Features wie die Bestenliste und Erfolge benötigen einen Login bei Google Play. Hierfür wird die Identität benötigt, um die entsprechenden Punktzahlen und Erfolge an das jeweilige Google Play-Konto zu knüpfen. Alle anderen Features sind weiterhin auch ohne Login bei Google Play nutzbar. Außerdem kann sich jederzeit in den Einstellungen von Google Play abgemeldet werden.","settings":"Einstellungen","close":"Schließen","other-apps":"Andere Apps","optimistic-locking-dialog":"Deine Änderungen können nicht gespeichert werden! Ein anderer Benutzer hat die Daten bereits verändert. Bitte lade die Daten neu und speichere danach.","optimistic-locking-dialog-title":"Nicht gespeichert!","not-online":"Du bist nicht mit dem Internet verbunden. Bitte überprüfe deine Verbindung.","search":"Suchen...","site":"Seite","HTTP-Exception (403) Forbidden":"Nicht erlaubt!","login":"Login","login-email":"E-Mail","login-password":"Passwort","login-automated-login":"Automatischer Login","login-submit":"Login","logout":"Ausloggen","username-or-password-wrong":"Entweder der Username oder das Passwort stimmt nicht!","login-success":"Willkommen zurück!","logged-out-successfully":"Tschüss!","registration":"Registrieren","registration-username":"Username","registration-email":"E-Mail","registration-password1":"Passwort","registration-password2":"Passwort wiederholen","registration-submit":"Registrieren","registration-success":"Ein Registrierungscode wurde an Ihre E-Mailadresse gesendet.","not-allowed-title":"Nicht erlaubt!","not-allowed":"Du hast keine Berechtigung für diese Seite. Wenn das ein Fehler ist, wende dich bitte an einen Admin.","forgot-password":"Passwort vergessen?","forgot-password-title":"Passwort vergessen","forgot-password-email":"E-Mail","forgot-password-submit":"Absenden","forgot-password-text":"Gib deine E-Mailadresse in das Feld ein. Ist die Adresse registriert, werden wir eine E-Mail mit einem Passwort-Resetcode senden.","no-user-found":"Es gibt keinen Benutzer mit dieser E-Mailadresse","new-password-code-send":"Es wurde ein Reset-Code an deine E-Mailadresse gesendet.","new-password":"Neues Passwort","new-password-password1":"Passwort","new-password-password2":"Passwort wiederholen","new-password-submit":"Passwort setzten","password-updated":"Das Passwort ist geupdated!","user-settings":"E-Mail & Username","user-settings-title":"E-Mail & Username","user-settings-form-username":"Username","user-settings-form-old-email":"Aktuelle E-Mail","user-settings-form-new-email":"Neue E-Mail","user-settings-form-submit":"Speichern","user-data-is-changed":"Die Daten wurden gespeichert.","email-code-send":"Ein Änderungscode wurde an die neue E-Mailadresse gesendet. Sobald der Code aktiviert wurde, werden Ihnen E-Mails an die neue Adresse gesendet.","change-email-new-automated-login":"Wenn die E-Mailadresse geändert wird, muss der automatische Login erneut aktiviert werden!","password-settings":"Passwort","change-password-title":"Passwort","change-password-new-automated-login":"Wenn das Passwort geändert wird, muss der automatische Login erneut aktiviert werden!","change-password-old-password":"Altes Passwort","change-password-new-password1":"Neues Passwort","change-password-new-password2":"Neues Passwort wiederholen","change-password-submit":"Speichern","password-changed":"Das Passwort wurde erfolgreich geändert!","registration-username-empty":"Der Username darf nicht leer sein.","registration-username-wrong-char":"Der Username darf nur aus Buchstaben, Zahlen oder den folgenden Zeichen bestehen: -_.&;()#!?$+\",","registration-username-already-taken":"Der Username ist schon vergeben. Bitte wähle einen anderen.","registration-password-empty":"Das Passwort darf nicht leer sein.","registration-password-short":"Das Passwort muss mindestens 8 Zeichen lang sein.","registration-password-not-identical":"Die Passwörter sind nicht identlisch.","registration-email-empty":"Die Email darf nicht leer sein.","registration-email-not-valid":"Die Emailadresse ist keine gültige Emailadresse.","registration-email-already-taken":"Es gibt bereits einen Account mit der Emailadresse.","change-password-old-password-wrong":"Das Passwort stimmt nicht!","user-roles-heading":"Benutzerrollen","user-roles-list":"Aktuelle Rollen:","available-roles-list":"Verfügbare Rollen:","name":"Name","description":"Beschreibung"} \ No newline at end of file +{"won":"Gewonnen!","continue":"Weiter","help":"?","not-enough-coins":"Du hast zu wenig Münzen!","sync-error":"Es gab einen Fehler beim Aktualisieren der Level. Bitte stelle sicher, dass du eine aktive Internetverbindung hast und versuche es später erneut.","game-ended":"Oh nein!
Es sieht so aus, als ob du schon alle Level gespielt hast...
Schau später noch einmal rein, evtl gibt es dann neue Level.","play":"Spielen!","tutorial-step-1":"Klicke auf ein Feld, um dieses rotieren zu lassen!","tutorial-step-2":"Um zu gewinnen, drehe die Segmente so, dass du zwei Wörter lesen kannst.","tutorial-step-3":"Die Hilfe löst ein Segment, kostet aber 25 Münzen. Probiere jetzt die Hilfe aus.","tutorial-step-4":"Große Segmente drehst du, indem du diese ziehst.","extra-coins-after-first-level":"Für das erste Level gibt es 50 extra Münzen!","dark":"Dunkel","theme":"Theme:","sound":"Sound:","music":"Musik:","credits":"Credits","privacy-policy":"Datenschutzbestimmungen","impressum":"Impressum","track":"Anonymisierte Nutzungsdaten senden:",">":">","choose-theme-dialog-title":"Theme auswählen:","install":"Installieren","share-dialog":"Teilen:","credits-sister-text":"Ich danke meiner Lieblingsschwester, denn ohne Sie würde diese App nicht so aussehen, wie sie aussieht (wahrscheinlich eher schlechter :p)","credits-coin-text":"Sound:
Der Münz-Sound ist von der Webseite {0}. Alle Rechte für diesen Münz-Sound gehören {0}.","credits-music-text":"Musik:
Bright And Beautiful - GEMAfreie Musik von {0}
Licensed under Creative Commons: By Attribution 4.0 International (CC BY 4.0)
{1}
Angepasst (geschnitten) für diese App","storage-info":"Ungefähr {0}/{1}MB genutzt ({2}%, {3} persistent)","Sunday":"Sonntag","Monday":"Montag","Tuesday":"Dienstag","Wednesday":"Mittwoch","Thursday":"Donnerstag","Friday":"Freitag","Saturday":"Samstag","January":"Januar","February":"Februar","March":"März","April":"April","May":"Mai","June":"Juni","July":"Juli","August":"August","September":"September","October":"Oktober","November":"November","December":"Dezember","Sun":"So","Mon":"Mo","Tue":"Di","Wed":"Mi","Thu":"Do","Fri":"Fr","Sat":"Sa","Jan":"Jan","Feb":"Feb","Mar":"Mär","Apr":"Apr","Jun":"Jun","Jul":"Jul","Aug":"Aug","Sep":"Sep","Oct":"Okt","Nov":"Nov","Dec":"Dez","code-not-valid":"Der angegebebe Code ist nicht gültig!","code-activated":"Der Code wurde erfolgreich aktiviert!","contact":"Kontakt","contact-email":"E-Mailadresse","contact-accepted-privacy-policy-2":" gelesen und akzepiert","contact-message":"Nachricht","contact-submit":"Absenden","contact-email-empty":"Die E-Mailadresse wird benötigt, um Ihre Nachricht zu beantworten.","contact-email-not-valid":"Die gegebene E-Mailadresse ist nicht gültig!","contact-accept-privacy-policy-empty":"Die Datenschutzbestimmungen müssen akzeptiert werden!","contact-message-empty":"Bitte geben Sie eine Nachricht ein.","contact-message-sent":"Ihre Nachricht wurde gesendet!","current-lang":"DE","en":"Englisch","de":"Deutsch","black":"Schwarz","red":"Rot","blue":"Blau","green":"Grün","pink":"Rosa","cancel-button":"ABBRECHEN","confirm-button":"OK","we-use-cookie-hint":"Diese Seite nutzt Cookies. Lesen Sie unsere Datenschutzerklärung, um mehr zu erfahren.","policy-heading":"Datenschutzerklärung","area-of-validity-heading":"Geltungsbereich","area-of-validity":"Diese Datenschutzerklärung klärt Nutzer über die Art, den Umfang und Zwecke der Erhebung und Verwendung personenbezogener Daten durch den verantwortlichen Anbieter Silas Günther, Langenbusch 263b - 42897 Remscheid, matrix[at]silas.link auf dieser Website (im folgenden \"Angebot\") auf.

Die rechtlichen Grundlagen des Datenschutzes finden sich im Bundesdatenschutzgesetz (BDSG) und dem Telemediengesetz (TMG).","logfiles-heading":"Zugriffsdaten / Server-Logfiles","logfiles":"Der Anbieter (beziehungsweise sein Webspace-Provider) erhebt Daten über jeden Zugriff auf das Angebot (so genannte Serverlogfiles). Zu den Zugriffsdaten gehören:

Name der abgerufenen Webseite, Datei, Datum und Uhrzeit des Abrufs, übertragene Datenmenge, Meldung über erfolgreichen Abruf, Browsertyp nebst Version, das Betriebssystem des Nutzers, Referrer URL (die zuvor besuchte Seite), IP-Adresse und der anfragende Provider.

Der Anbieter verwendet die Protokolldaten nur für statistische Auswertungen zum Zweck des Betriebs, der Sicherheit und der Optimierung des Angebotes. Der Anbieter behält sich jedoch vor, die Protokolldaten nachträglich zu überprüfen, wenn aufgrund konkreter Anhaltspunkte der berechtigte Verdacht einer rechtswidrigen Nutzung besteht.","contact-support-heading":"Kontaktaufnahme","contact-support":"Bei der Kontaktaufnahme mit dem Anbieter (zum Beispiel per Post oder E-Mail) werden die Angaben des Nutzers zwecks Bearbeitung der Anfrage sowie für den Fall, dass Anschlussfragen entstehen, gespeichert.","cookies-heading":"Cookies","cookies":"Cookies sind kleine Dateien, die es ermöglichen, auf dem Zugriffsgerät der Nutzer (PC, Smartphone o.ä.) spezifische, auf das Gerät bezogene Informationen zu speichern. Sie dienen zum einem der Benutzerfreundlichkeit von Webseiten und damit den Nutzern (z.B. Speicherung von Logindaten). Zum anderen dienen sie, um die statistische Daten der Webseitennutzung zu erfassen und sie zwecks Verbesserung des Angebotes analysieren zu können. Die Nutzer können auf den Einsatz der Cookies Einfluss nehmen. Die meisten Browser verfügen eine Option mit der das Speichern von Cookies eingeschränkt oder komplett verhindert wird. Allerdings wird darauf hingewiesen, dass die Nutzung und insbesondere der Nutzungskomfort ohne Cookies eingeschränkt werden.

Sie können viele Online-Anzeigen-Cookies von Unternehmen über die US-amerikanische Seite http://www.aboutads.info/choices/ oder die EU-Seite http://www.youronlinechoices.com/uk/your-ad-choices/ verwalten.","google-analytics-heading":"Google Analytics","google-analytics":"Dieses Angebot benutzt Google Analytics, einen Webanalysedienst der Google Inc. („Google“). Google Analytics verwendet sog. „Cookies“, Textdateien, die auf Computer der Nutzer gespeichert werden und die eine Analyse der Benutzung der Website durch sie ermöglichen. Die durch den Cookie erzeugten Informationen über Benutzung dieser Website durch die Nutzer werden in der Regel an einen Server von Google in den USA übertragen und dort gespeichert.

Im Falle der Aktivierung der IP-Anonymisierung auf dieser Webseite, wird die IP-Adresse der Nutzer von Google jedoch innerhalb von Mitgliedstaaten der Europäischen Union oder in anderen Vertragsstaaten des Abkommens über den Europäischen Wirtschaftsraum zuvor gekürzt. Nur in Ausnahmefällen wird die volle IP-Adresse an einen Server von Google in den USA übertragen und dort gekürzt. Die IP-Anonymisierung ist auf dieser Website aktiv. Im Auftrag des Betreibers dieser Website wird Google diese Informationen benutzen, um die Nutzung der Website durch die Nutzer auszuwerten, um Reports über die Websiteaktivitäten zusammenzustellen und um weitere mit der Websitenutzung und der Internetnutzung verbundene Dienstleistungen gegenüber dem Websitebetreiber zu erbringen.

Die im Rahmen von Google Analytics von Ihrem Browser übermittelte IP-Adresse wird nicht mit anderen Daten von Google zusammengeführt. Die Nutzer können die Speicherung der Cookies durch eine entsprechende Einstellung Ihrer Browser-Software verhindern; Dieses Angebot weist die Nutzer jedoch darauf hin, dass Sie in diesem Fall gegebenenfalls nicht sämtliche Funktionen dieser Website vollumfänglich werden nutzen können. Die Nutzer können darüber hinaus die Erfassung der durch das Cookie erzeugten und auf ihre Nutzung der Website bezogenen Daten (inkl. Ihrer IP-Adresse) an Google sowie die Verarbeitung dieser Daten durch Google verhindern, indem sie das unter dem folgenden Link verfügbare Browser-Plugin herunterladen und installieren: http://tools.google.com/dlpage/gaoptout?hl=de.

Weitere Informationen zur Datennutzung zu Werbezwecken durch Google, Einstellungs- und Widerspruchsmöglichkeiten erfahren Sie auf den Webseiten von Google:
https://www.google.com/intl/de/policies/privacy/partners/ („Datennutzung durch Google bei Ihrer Nutzung von Websites oder Apps unserer Partner“),
http://www.google.com/policies/technologies/ads („Datennutzung zu Werbezwecken“),
http://www.google.de/settings/ads („Informationen verwalten, die Google verwendet, um Ihnen Werbung einzublenden“) und
http://www.google.com/ads/preferences/ („Bestimmen Sie, welche Werbung Google Ihnen zeigt“).","edited-hint":"Der generierte Text wurde vom Webseiteninhaber angepasst.","generated-hint":"Erstellt mit Datenschutz-Generator.de von RA Dr. Thomas Schwenke","google-play-services-heading":"Google Play Dienste","google-play-services":"Features wie die Bestenliste und Erfolge benötigen einen Login bei Google Play. Hierfür wird die Identität benötigt, um die entsprechenden Punktzahlen und Erfolge an das jeweilige Google Play-Konto zu knüpfen. Alle anderen Features sind weiterhin auch ohne Login bei Google Play nutzbar. Außerdem kann sich jederzeit in den Einstellungen von Google Play abgemeldet werden.","settings":"Einstellungen","close":"Schließen","other-apps":"Andere Apps","optimistic-locking-dialog":"Deine Änderungen können nicht gespeichert werden! Ein anderer Benutzer hat die Daten bereits verändert. Bitte lade die Daten neu und speichere danach.","optimistic-locking-dialog-title":"Nicht gespeichert!","not-online":"Du bist nicht mit dem Internet verbunden. Bitte überprüfe deine Verbindung.","search":"Suchen...","site":"Seite","HTTP-Exception (403) Forbidden":"Nicht erlaubt!","login":"Login","login-email":"E-Mail","login-password":"Passwort","login-automated-login":"Automatischer Login","login-submit":"Login","logout":"Ausloggen","username-or-password-wrong":"Entweder der Username oder das Passwort stimmt nicht!","login-success":"Willkommen zurück!","logged-out-successfully":"Tschüss!","registration":"Registrieren","registration-username":"Username","registration-email":"E-Mail","registration-password1":"Passwort","registration-password2":"Passwort wiederholen","registration-submit":"Registrieren","registration-success":"Ein Registrierungscode wurde an Ihre E-Mailadresse gesendet.","not-allowed-title":"Nicht erlaubt!","not-allowed":"Du hast keine Berechtigung für diese Seite. Wenn das ein Fehler ist, wende dich bitte an einen Admin.","forgot-password":"Passwort vergessen?","forgot-password-title":"Passwort vergessen","forgot-password-email":"E-Mail","forgot-password-submit":"Absenden","forgot-password-text":"Gib deine E-Mailadresse in das Feld ein. Ist die Adresse registriert, werden wir eine E-Mail mit einem Passwort-Resetcode senden.","no-user-found":"Es gibt keinen Benutzer mit dieser E-Mailadresse","new-password-code-send":"Es wurde ein Reset-Code an deine E-Mailadresse gesendet.","new-password":"Neues Passwort","new-password-password1":"Passwort","new-password-password2":"Passwort wiederholen","new-password-submit":"Passwort setzten","password-updated":"Das Passwort ist geupdated!","user-settings":"E-Mail & Username","user-settings-title":"E-Mail & Username","user-settings-form-username":"Username","user-settings-form-old-email":"Aktuelle E-Mail","user-settings-form-new-email":"Neue E-Mail","user-settings-form-submit":"Speichern","user-data-is-changed":"Die Daten wurden gespeichert.","email-code-send":"Ein Änderungscode wurde an die neue E-Mailadresse gesendet. Sobald der Code aktiviert wurde, werden Ihnen E-Mails an die neue Adresse gesendet.","change-email-new-automated-login":"Wenn die E-Mailadresse geändert wird, muss der automatische Login erneut aktiviert werden!","password-settings":"Passwort","change-password-title":"Passwort","change-password-new-automated-login":"Wenn das Passwort geändert wird, muss der automatische Login erneut aktiviert werden!","change-password-old-password":"Altes Passwort","change-password-new-password1":"Neues Passwort","change-password-new-password2":"Neues Passwort wiederholen","change-password-submit":"Speichern","password-changed":"Das Passwort wurde erfolgreich geändert!","registration-username-empty":"Der Username darf nicht leer sein.","registration-username-wrong-char":"Der Username darf nur aus Buchstaben, Zahlen oder den folgenden Zeichen bestehen: -_.&;()#!?$+\",","registration-username-already-taken":"Der Username ist schon vergeben. Bitte wähle einen anderen.","registration-password-empty":"Das Passwort darf nicht leer sein.","registration-password-short":"Das Passwort muss mindestens 8 Zeichen lang sein.","registration-password-not-identical":"Die Passwörter sind nicht identlisch.","registration-email-empty":"Die Email darf nicht leer sein.","registration-email-not-valid":"Die Emailadresse ist keine gültige Emailadresse.","registration-email-already-taken":"Es gibt bereits einen Account mit der Emailadresse.","change-password-old-password-wrong":"Das Passwort stimmt nicht!","user-roles-heading":"Benutzerrollen","user-roles-list":"Aktuelle Rollen:","available-roles-list":"Verfügbare Rollen:","name":"Name","description":"Beschreibung"} \ No newline at end of file diff --git a/src/js/init.js b/src/js/init.js index af85640..fa98940 100755 --- a/src/js/init.js +++ b/src/js/init.js @@ -86,10 +86,11 @@ InitPromise.resolve(app).then(async function () { app.start(MenuSite); Translator.setLanguage("de"); - InstallManager.setCanInstallListener(e => { - }); + InstallManager.setCanInstallListener(e => {}); + if (InstallManager.isInstalled()){ + MyStorageManager.getInstance().persist(); + } - MyStorageManager.getInstance().persist(); window["applyAndroidBridge"] = AndroidBridge.applyDefinitions; }); diff --git a/src/js/lib/pwa-assets.js b/src/js/lib/pwa-assets.js index 0cd8c47..3ffdcb2 100755 --- a/src/js/lib/pwa-assets.js +++ b/src/js/lib/pwa-assets.js @@ -17,39 +17,45 @@ class MyStorageManager { } async estimate() { - if ('storage' in navigator && 'estimate' in navigator.storage) { + if ('storage' in navigator && 'estimate' in navigator["storage"]) { // We've got the real thing! Return its response. - return navigator.storage.estimate(); + return navigator["storage"]["estimate"](); } if ('webkitTemporaryStorage' in navigator && - 'queryUsageAndQuota' in navigator.webkitTemporaryStorage) { + 'queryUsageAndQuota' in navigator["webkitTemporaryStorage"]) { // Return a promise-based wrapper that will follow the expected interface. return new Promise(function (resolve, reject) { - navigator.webkitTemporaryStorage.queryUsageAndQuota( + navigator["webkitTemporaryStorage"]["queryUsageAndQuota"]( function (usage, quota) { - resolve({usage: usage, quota: quota}); + resolve({"usage": usage, "quota": quota}); }, - reject ); }); } // If we can't estimate the values, return a Promise that resolves with NaN. - return Promise.resolve({usage: NaN, quota: NaN}); + return Promise.resolve({"usage": NaN, "quota": NaN}); + } + + async isPersistent(){ + if (this.canPersist()){ + return navigator["storage"]["persisted"](); + } + return Promise.resolve(false); } canEstimateStorage() { - return ('storage' in navigator && 'estimate' in navigator.storage || 'webkitTemporaryStorage' in navigator && - 'queryUsageAndQuota' in navigator.webkitTemporaryStorage); + return ('storage' in navigator && 'estimate' in navigator["storage"]|| 'webkitTemporaryStorage' in navigator && + 'queryUsageAndQuota' in navigator["webkitTemporaryStorage"]); } canPersist() { - return (navigator.storage && navigator.storage.persist); + return (navigator["storage"] && navigator["storage"]["persist"]); } persist(){ if (this.canPersist()){ - return navigator.storage.persist(); + return navigator["storage"]["persist"](); } return Promise.resolve(false); } @@ -86,6 +92,10 @@ class InstallManager { }); } + static isInstalled(){ + return matchMedia("(display-mode: standalone)").matches; + } + static setCanInstallListener(listener, callIfCanInstall) { this.canInstallListener = listener; callIfCanInstall = Helper.nonNull(callIfCanInstall, true); diff --git a/src/module/Application/pwa/js/Fragment/WordRotatorSettingFragment.js b/src/module/Application/pwa/js/Fragment/WordRotatorSettingFragment.js index cd2cca5..7c350a3 100644 --- a/src/module/Application/pwa/js/Fragment/WordRotatorSettingFragment.js +++ b/src/module/Application/pwa/js/Fragment/WordRotatorSettingFragment.js @@ -83,12 +83,29 @@ export class WordRotatorSettingFragment extends LocalStorageSettingsFragment { }); let storageManager = MyStorageManager.getInstance(); - if (storageManager.canEstimateStorage() && false) { + if (storageManager.canEstimateStorage()) { console.log("can estimate storage!"); - storageManager.estimate().then(storage => { + Promise.all([storageManager.estimate(), storageManager.isPersistent()]).then(res => { + let storage = res[0]; + let isPersisted = res[1]; let storageObject = this.findBy("#storage-info"); - storageObject.appendChild(Translator.makePersistentTranslation("storage-info", [Math.round(storage.usage/(1024*1024)*100)/100, Math.round(storage.quota/(1024*1024)*100)/100, Math.round(storage.usage/storage.quota*10000)/100])); + console.log(isPersisted); + storageObject.appendChild(Translator.makePersistentTranslation("storage-info", [ + Math.round(storage.usage / (1024 * 1024) * 100) / 100, + Math.round(storage.quota / (1024 * 1024) * 100) / 100, + Math.round(storage.usage / storage.quota * 10000) / 100, + ((isPersisted) ? "" : "nicht")])); storageObject.parentElement.classList.remove("hidden"); + storageObject.parentElement.addEventListener("click", () => { + storageManager.persist().then(isPersisted => { + console.log(isPersisted); + storageObject.removeAllChildren().appendChild(Translator.makePersistentTranslation("storage-info", [ + Math.round(storage.usage / (1024 * 1024) * 100) / 100, + Math.round(storage.quota / (1024 * 1024) * 100) / 100, + Math.round(storage.usage / storage.quota * 10000) / 100, + ((isPersisted) ? "" : "nicht")])); + }); + }) }); } diff --git a/src/module/Application/pwa/js/WordRotatorDb.js b/src/module/Application/pwa/js/WordRotatorDb.js index 50114ec..16ac211 100755 --- a/src/module/Application/pwa/js/WordRotatorDb.js +++ b/src/module/Application/pwa/js/WordRotatorDb.js @@ -69,6 +69,10 @@ export class WordRotatorDb extends MyDb { level.played = true; return await this.saveObj(level, WordRotatorDb.OBJECT_STORE.LEVEL); } + + async countLevels(){ + + } } WordRotatorDb.OBJECT_STORE = { diff --git a/src/module/Application/pwa/js/site/LevelSite.js b/src/module/Application/pwa/js/site/LevelSite.js index 40995aa..5dc3657 100755 --- a/src/module/Application/pwa/js/site/LevelSite.js +++ b/src/module/Application/pwa/js/site/LevelSite.js @@ -152,6 +152,7 @@ export class LevelSite extends WordRotatorBaseSite { const db = WordRotatorDb.getInstance(); const nextLevelJson = await db.loadNextLevel(LevelSite.RENDERER_TYPES); + console.log("nextLevelJson", nextLevelJson); if (nextLevelJson === null) { this.startSite(EndSite); this.finish(); @@ -190,6 +191,7 @@ export class LevelSite extends WordRotatorBaseSite { return this.tutorial(); } catch (e) { + console.log("Fehler!"); console.error(e); } } diff --git a/src/module/Application/pwa/js/site/MenuSite.js b/src/module/Application/pwa/js/site/MenuSite.js index 57c795d..e59767b 100644 --- a/src/module/Application/pwa/js/site/MenuSite.js +++ b/src/module/Application/pwa/js/site/MenuSite.js @@ -179,6 +179,7 @@ export class MenuSite extends WordRotatorBaseSite { const dateLastSync = Helper.nonNull(localStorage.getItem("date-last-sync"), 0); const db = WordRotatorDb.getInstance(); + // let numberLevels = db.countLevels(); let newLastSync = null; let maxRuns = 1; let levelPromises = []; @@ -199,7 +200,7 @@ export class MenuSite extends WordRotatorBaseSite { maxRuns = res["maxRuns"]; let levels = res["levels"]; - for (let i = 0, n = levels.length; i < n; i++) { + for (let i = 0; i < levels.length; i++) { let currentLevel = levels[i]; levelPromises.push(db.loadLevel(levels[i]["id"]).then(level => { currentLevel["played"] = (Helper.nonNull(Helper.nonNull(level, {}).played, false)); diff --git a/src/module/Application/pwa/public/html/application/fragment/settings.html b/src/module/Application/pwa/public/html/application/fragment/settings.html index 2251f99..9bcb987 100644 --- a/src/module/Application/pwa/public/html/application/fragment/settings.html +++ b/src/module/Application/pwa/public/html/application/fragment/settings.html @@ -52,7 +52,8 @@ diff --git a/src/module/Application/pwa/translations/de.json b/src/module/Application/pwa/translations/de.json index 1468a30..daa4e1f 100755 --- a/src/module/Application/pwa/translations/de.json +++ b/src/module/Application/pwa/translations/de.json @@ -32,5 +32,5 @@ "credits-sister-text":"Ich danke meiner Lieblingsschwester, denn ohne Sie würde diese App nicht so aussehen, wie sie aussieht (wahrscheinlich eher schlechter :p)", "credits-coin-text":"Sound:
Der Münz-Sound ist von der Webseite {0}. Alle Rechte für diesen Münz-Sound gehören {0}.", "credits-music-text":"Musik:
Bright And Beautiful - GEMAfreie Musik von {0}
Licensed under Creative Commons: By Attribution 4.0 International (CC BY 4.0)
{1}
Angepasst (geschnitten) für diese App", -"storage-info":"Ungefähr {0}/{1}MB genutzt ({2}%)" +"storage-info":"Ungefähr {0}/{1}MB genutzt ({2}%, {3} persistent)" } \ No newline at end of file