From 11e225ccacf39af85d7b678f09496d602c08d88a Mon Sep 17 00:00:00 2001 From: silas Date: Sun, 28 Oct 2018 23:21:54 +0100 Subject: [PATCH] =?UTF-8?q?Icons=20ausgetauscht,=20Musik=20stoppt=20im=20H?= =?UTF-8?q?intergrund,=20App-ended-listener=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/build.sh | 2 +- bin/test.sh | 4 +- public/js/app.js | 7462 ++++++++++++++++- src/js/init.js | 3 +- src/js/lib/pwa-assets.js | 61 +- src/js/lib/pwa-lib.js | 42 +- .../Application/pwa/js/WordRotatorDb.js | 4 - .../Application/pwa/js/site/LevelSite.js | 2 - .../Application/pwa/js/site/MenuSite.js | 2 +- test/test.testcafe.js | 2 +- 10 files changed, 7551 insertions(+), 33 deletions(-) diff --git a/bin/build.sh b/bin/build.sh index 6dd173a..303bef1 100755 --- a/bin/build.sh +++ b/bin/build.sh @@ -1,4 +1,4 @@ #!/usr/bin/env bash cd $(dirname "$0")/.. -npm run build 2 \ No newline at end of file +npm run build \ No newline at end of file diff --git a/bin/test.sh b/bin/test.sh index 6f45b7c..1edcd5e 100644 --- a/bin/test.sh +++ b/bin/test.sh @@ -2,5 +2,5 @@ cd $(dirname "$0")/.. -testcafe firefox test/test.testcafe.js -#node bin/testcafe.js; \ No newline at end of file +#testcafe firefox test/test.testcafe.js +node bin/testcafe.js; \ No newline at end of file diff --git a/public/js/app.js b/public/js/app.js index 9ed35c1..43dd40a 100755 --- a/public/js/app.js +++ b/public/js/app.js @@ -1,2 +1,7460 @@ -!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};var m=Object.getPrototypeOf,y=m&&m(m(C([])));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}return n.done=!0,n}},l.values=C,I.prototype={constructor:I,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=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev=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:C(t),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=e),d}}}function k(t,e,n,r){var i=e&&e.prototype instanceof _?e:_,o=Object.create(i.prototype),s=new I(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}function w(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(t){return{type:"throw",arg:t}}}function _(){}function b(){}function x(){}function O(t){["next","throw","return"].forEach(function(e){t[e]=function(t){return this._invoke(e,t)}})}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)})}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")}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)}function S(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)}function E(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function I(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(S,this),this.reset(!0)}function C(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=1;i--){var o={};o[r[i]]=n,n=o}e=r[0]}var s=e;e=function(){window[s]=n}}t.h.push(e)}},{key:"u",value:function(){for(var e=0;e0){this.it.splice(e,1);for(var n=this.wt(t),r=0,i=n.length;r0){var t=arguments[0],n=Array.prototype.slice.call(arguments,1);return e.I(t)&&(0===n.length||e.re.apply(null,[t[n[0]]].concat(n.slice(1))))}return!1}},{key:"Mt",value:function(t){return null===t||void 0===t}},{key:"I",value:function(t){return!e.Mt(t)}},{key:"m",value:function(){for(var t=0;t0&&(o=new Array(r+1-s).join("0")+o),n+=o}return n}},{key:"pe",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;o1&&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",""":'"',"'":"'","’":"’","‘":"‘","–":"–","—":"—","…":"…","”":"”"};return e.I(t)&&"function"==typeof t.replace?t.replace(/\&[\w\d\#]{2,5}\;/g,function(t){return n[t]}):t}},{key:"Me",value:function(t){var e=new FormData;for(var n in t)e.set(n,t[n]);return e}},{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)}},{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"}},{key:"ve",value:function(t){for(var n=t.childNodes,r=0,i=n.length;r-1,i=e.userAgent.indexOf("Edge")>-1;return!!e.userAgent.match("CriOS")||null!==t&&void 0!==t&&"Google Inc."===n&&!1===r&&!1===i}},{key:"Le",value:function(t,e){for(var n={},r=0,i=t.length;r0&&(n=r[0])}else-1!==t.Be.indexOf(e)&&(n=e);if(v.I(n)){localStorage.setItem("currentTheme",n.De);var i=new Promise(function(t){document.querySelector("nav.top-bar").addEventListener("transitionend",function(){t()})});document.body.className=n.Re,t.Ie=n;for(var o=0,s=t.Ue.length;o0?t.xe(n[0]):t.Be.length>0&&t.xe(t.Be[0])}}},{key:"We",value:function(){return new l(t.Ie.De,function(e){var n=(t.Be.indexOf(t.Ie)+1)%t.Be.length;t.xe(t.Be[n]),e.title=t.Ie.De,e.H.j()},h.Y)}},{key:"addChangeListener",value:function(e){t.Ue.push(e)}},{key:"getCurrentTheme",value:function(){return t.Ie}}]),t}();y.Ie=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"}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()}},e,this)}));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.ze(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:"qe",value:function(){this.Ke(this.Ve,this.Je,this.je)}},{key:"Ke",value:function(t,e,n){var r=void 0;if(v.I(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.Ke(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.qe(),e.remove(),n()}})}}],[{key:"ze",value:function(t){for(var e=t+"=",n=document.cookie.split(";"),r=0;r0||("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.I(r.Xe)&&r.Xe.close())}},{key:"pt",value:function(){var t=e(r.prototype.__proto__||Object.getPrototypeOf(r.prototype),"pt",this).call(this);return function(e){t(e)instanceof c||!v.I(r.Xe)||r.Xe.close()}}},{key:"ht",value:function(t){var n=e(r.prototype.__proto__||Object.getPrototypeOf(r.prototype),"ht",this).call(this,t);return this.$e(),r.Xe=this,n}},{key:"close",value:function(){document.getElementById("responsive-menu").style.display="none";for(var t=0,e=this.rt.length;t0;){var i=this.hs.firstChild;i.remove(),r.appendChild(i)}this.us={vn:r,title:document.title};var o=this;window.onpopstate=function(){if(o.ns.length>=1){var t=o.ns[o.ns.length-1].zn();!1!==t.Wn()&&o.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.I(this.ss)?this.ss.zn():null}},{key:"ps",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].zn());case 4:if(!t.sent){t.next=6;break}return t.abrupt("return",this.ns[n].zn());case 6:n--,t.next=1;break;case 9:return t.abrupt("return",null);case 10:case"end":return t.stop()}},t,this)}));return function(){return t.apply(this,arguments)}}()},{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.gs()),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.zn().cn(),n.ss=null;var s=n.ns.length-1;if(s<0)return n.Ss(),void n.Ln(n.ls);n.es.removeAllChildren().appendChild(v.he()),o=n.ns[s]}i.zn().dn(),Promise.resolve(e).then(function(t){i.Zn().resolve(t),v.I(o)&&n.show(o)})})}},{key:"addListener",value:function(t,e,n,r){this.es.addEventListener(e,function(e){var i=e.target;t.gn&&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.gn&&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:"ws",value:function(){return this.show(this.ss)}},{key:"show",value:function(t){v.I(this.ss)&&(this.ss.$n(this.ss.zn().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.zn().sn.then(function(n){return t.zn().wn.j(),e.es.removeAllChildren().appendChild(n),e.Pn(),d.Xt().$t(),n}).then(function(n){t.zn().ln(t.Xn()),history.pushState({siteName:t.zn().constructor.name,siteData:n.outerHTML,stackPosition:e.ns.length-1},t.zn().constructor.name,t.zn().En())})}},{key:"Rn",value:function(t){if(v.I(this.ss)&&this.ss.zn()===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.zn()}},{key:"Ms",value:function(){null!=this.ss&&this.ss.zn().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=0&&(this.Ls[e].remove(!0),this.Ls.splice(e,1))}},{key:"Ln",value:function(t,e){return this.ys.Ln(t,e)}},{key:"start",value:function(e){m.Ae(this.Ce);var n=v.m(this.Ws(),e),r=t.js();this.Cs=e,d.init(),y.init(),this.bs&&this.ds(y.We()),this.ys=new O(this.Ps,this.vs),this.ys.as=this.Ls,this.ys.cs(e),this.ys.Ln(n,r),this.Ns(),this.As&&(this.Vs=g.Ne("cookie-compliance"))}},{key:"ms",value:function(){return this.ys.ms()}},{key:"ps",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.ys.ps(e));case 1:case"end":return t.stop()}},t,this)}));return function(){return t.apply(this,arguments)}}()}],[{key:"Os",value:function(t){if(v.Mt(t))return null;for(var e={},n=[],r=t.split("&"),i=0;i0&&(e[n[0]]=decodeURIComponent(n[1]));return e}},{key:"js",value:function(){return t.Os(window.location.search.substr(1))}}]),t}(),S=function(){function t(e,n){s(this,t),this.Js=null,this.content=null,this.zs=null,this.cancelable=!0,this.title=v.m(n,""),this.qs=!0,this.Ks="",this.buttons=[],this.result=null,v.I(e)&&this.Gs(e)}return n(t,[{key:"k",value:function(t){return this.title=t,this}},{key:"Xs",value:function(t){this.qs=t}},{key:"$s",value:function(t){this.Ks=t}},{key:"D",value:function(){return this.title}},{key:"Qs",value:function(t){return this.cancelable=!0===t,this}},{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 this.Ys=Promise.resolve(e),t.next=3,this.Ys;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:"Zs",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.gt(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.I(e)&&e(t),i.close()}:e,v.I(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.qs&&""!==this.title?e.appendChild(d.gt(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.Ks,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;s0&&e.ei(e.ii,i),e.ii++}}]),e}();E.ii=0,E.ri=3500,E.oi=1e3,E.si="success",E.ai="error",E.li="default",E.hi="info",E.ui="warning";var I=function(){function t(e,n){s(this,t);var r=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB||window.ci;this.di=r.open(e,n);var i=this;this.di.onupgradeneeded=function(t){i.mi(i.di.result,t.oldVersion,t.newVersion,t)},this.pi=new Promise(function(t){i.di.onsuccess=function(e){i.Bt=i.di.result,t(e)}})}return n(t,[{key:"gi",value:function(t,e,n){var r=this;return"function"==typeof e&&v.Mt(n)&&(n=e,e="read"),this.pi.then(function(){var i=null;try{i=r.di.result.transaction(t,e)}catch(e){console.warn(e),i=r.di.result.transaction(t)}n(i)})}},{key:"fi",value:function(t,e,n){return"function"==typeof e&&v.Mt(n)&&(n=e,e="readonly"),this.gi(t,e,function(e){n(e.objectStore(t))})}},{key:"Si",value:function(t,e){var n=this;return new Promise(function(r){n.fi(e,"readwrite",function(e){var n=e.put(t);n.onsuccess=r,n.onerror=function(t){throw{type:"indexed-db-error",event:t}}})})}},{key:"wi",value:function(t,e){var n=this;return new Promise(function(r){n.fi(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=0){var n=new S("optimistic-locking-dialog","optimistic-locking-dialog-title");n.ti(),n.show()}else t(e)}:t,this.ir=n}},{key:"or",value:function(){if(!this.er){var t=this;return this.submit().then(function(e){if(e.success){if(null!==t.sr)return t.sr(e.result)}else if(v.I(t.ir))return t.ir(e.errors)})}}},{key:"load",value:function(t,e){return this.lr(Z.load(t,e).then(function(t){return t.success?t.result:{}})),this}},{key:"lr",value:function(t){this.hr(!0);var e=this;return Promise.resolve(t).then(function(t){for(var n in e.hr(!1),t)if(v.I(e.Zi.elements[n])){if(v.I(e.Zi.elements[n].options)&&v.I(t[n+"Options"])){var r=e.Zi.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.Zi.elements[n].value=v.we(t[n]),v.I(t[n])&&""!==(""+t[n]).trim()?e.Zi.elements[n].classList.add("notEmpty"):e.Zi.elements[n].classList.remove("notEmpty")}return e})}},{key:"rr",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.I(this.Zi.elements[i])&&"hidden"!==this.Zi.elements[i].type&&v.Mt(this.Zi.elements[i].ur)&&(v.Mt(this.Zi.elements[i].disabled)||!this.Zi.elements[i].disabled)&&(this.Zi.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.I(r)){t.next=11;break}t.t0=regeneratorRuntime.keys(this.Zi.elements);case 4:if((t.t1=t.t0()).done){t.next=11;break}if(o=t.t1.value,"hidden"===this.Zi.elements[o].type){t.next=9;break}return this.Zi.elements[o].setCustomValidity(d.translate(r)),n=!0,t.abrupt("break",11);case 9:t.next=4;break;case 11:n&&this.Zi.querySelector("input[type=submit]").click();case 12:case"end":return t.stop()}},t,this)}));return function(){return t.apply(this,arguments)}}()},{key:"hr",value:function(t){this.er=t,this.er?this.Zi.classList.add("sending"):this.Zi.classList.remove("sending")}},{key:"submit",value:function(){var t=this;return new Promise(function(e){t.hr(!0);var n=new FormData(t.Zi);e(t.nr(n))}).then(function(e){return t.hr(!1),e})}},{key:"cr",value:function(t){this.sr=t}}]),t}(),F=function(){function t(){s(this,t),this.ke=null,this.mr="settings"}return n(t,null,[{key:"Xt",value:function(){return null===t.dr&&(t.dr=new t),t.dr}}]),n(t,[{key:"pr",value:function(){return v.Mt(this.ke)&&this.gr(),this.ke}},{key:"Sr",value:function(t,e){var n=this.pr();return v.I(n[t])?n[t].value:e}},{key:"wr",value:function(t){this.pr(),delete this.ke[t],this.Mr()}},{key:"Hr",value:function(t,e){this.pr(),this.ke[t]={yr:(new Date).getTime(),value:e},this.Mr()}},{key:"vr",value:function(t){for(var e in this.pr(),t)this.ke[e]=t[e];this.Mr()}},{key:"Pr",value:function(t){return v.m(this.ke[t])}},{key:"gr",value:function(){this.ke=localStorage.getItem(this.mr),null===this.ke?this.ke={}:this.ke=JSON.parse(this.ke)}},{key:"Mr",value:function(){null!==this.ke&&localStorage.setItem(this.mr,JSON.stringify(this.ke))}}]),t}();F.dr=null;var q=function(){function t(){return s(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,N),n(t,[{key:"hn",value:function(){for(var n=e(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"hn",this).call(this),r=this.pn(".setting",!0),i=F.Xt(),o=function(t){var e=r[t],n=e.name,o=void 0;o=e.dataset.raw?localStorage.getItem(n):i.Sr(n);var s=!1;e instanceof HTMLInputElement&&("checkbox"===e.type||"radio"===e.type)&&(s=!0),(!e.dataset.raw&&!i.Pr(n)||e.dataset.raw&&null===o)&&v.I(r[t].dataset.default)&&(o=e.dataset.default,v.I(e.dataset.defaultTranslateable)&&(e.dataset.translation="",e.dataset.translationValue=o,o=d.translate(o))),v.I(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.Hr(n,t),delete e.dataset.translationValue,delete e.dataset.translation})},s=0;sn&&o.jr[n].click(e,i,t)}),this.list=i,i}},{key:"zr",value:function(){for(var t=document.createElement("tr"),e=document.createElement("tr"),n=[],r=0,i=this.jr.length;r=1&&(n=this.Vr(n),r[0].values(n))}},{key:"Gr",value:function(t){t?this.Nr.classList.add("sending"):this.Nr.classList.remove("sending")}}]),t}(),W=function(){function t(e){s(this,t);var n=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,t.Xr,"settings"));for(var r in t.$r)n.Qr(r,new t.$r[r](n));return n.active=null,n}return o(t,b),n(t,[{key:"Qr",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.I(this.active)&&!this.rn[this.active].un()&&this.setActive(null),this.Yr(),n}},{key:"setActive",value:function(t){v.I(this.active)&&(this.rn[this.active].sn.then(function(t){t.classList.remove("active")}),this.pn("#show-fragment-"+this.active).classList.remove("active")),this.active=t,v.I(this.active)&&(this.rn[this.active].sn.then(function(t){t.classList.add("active")}),this.pn("#show-fragment-"+this.active).classList.add("active"))}},{key:"Yr",value:function(){var t=this,e=this.pn("#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.gt(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:"Qr",value:function(e,n){t.$r[e]=n}},{key:"Zr",value:function(e){t.to=e}},{key:"eo",value:function(e){t.Xr=e}}]),t}();W.Xr="core/html/settings.html",W.$r={},W.to=!0,W.no=null,W.so=!0,a.t(function(t){var e=this;if(W.to){if(t.Is("settings",W),v.Mt(W.no)){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 W)){e.next=5;break}r.finish(),e.next=9;break;case 5:return e.next=7,t.ps(function(t){return t instanceof W});case 7:i=e.sent,v.I(i)?i.kn():t.Ln(W);case 9:case"end":return e.stop()}},n,e)})),l.Z,1e4);n.q("img/settings.png"),W.no=n}W.so&&t.ds(W.no)}});var G=function(){function t(){s(this,t)}return n(t,null,[{key:"init",value:function(e){t.io=null,t.ro={oo:!1,id:null,accesses:["default"]},t.app=e,t.ao=new Promise(function(e){t.lo=e})}},{key:"setData",value:function(e){t.ro=Object.assign(t.ro,e);var n=t.app.ks();n&&n.Ms()}},{key:"ho",value:function(e){return t.io=v.m(e,t.io),Z.load(t.io).then(function(e){e.success&&t.setData(e.result),t.lo()})}},{key:"uo",value:function(){return Z.load("u/logout").then(function(e){if(e.success){t.setData(e.result);var n=t.app.ks();n&&n.ws(),E.ni(E.si,d.translate("logged-out-successfully"))}})}},{key:"co",value:function(e){return t.ro.accesses.indexOf(e)>=0}},{key:"do",value:function(e,n){t.mo(function(r){n(r&&t.po(e))})}},{key:"mo",value:function(e){this.ao.then(function(){e(t.fo())})}},{key:"po",value:function(e){return t.ro.id===e}},{key:"fo",value:function(){return v.I(t.ro)&&v.I(t.ro.id)}}]),t}();a.t(function(t){return G.init(t),G.ho("u/me").then(function(){G.mo(function(t){if(t){var e=F.Xt(),n=v.Se(e.pr());for(var r in n)n[r].value=JSON.stringify(n[r].value);Z.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.vr(t.result)}})}})})});var Y=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))).So=v.m(a,"default"),u}return o(t,l),n(t,[{key:"O",value:function(){return e(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"O",this).call(this)&&G.co(this.So)}},{key:"wo",value:function(){return this.So}},{key:"X",value:function(n){var r=e(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"X",this).call(this,v.m(n,new t));return r.So=this.So,r}}]),t}(),$=function(){function t(e){return s(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,"userManagement/html/403.html"))}return o(t,b),t}(),K=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))).So=o,a}return o(t,b),n(t,[{key:"an",value:function(n){return G.co(this.So)?e(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"an",this).call(this,n):(this.Ln($),void this.finish({error:403}))}},{key:"ln",value:function(n){return G.co(this.So)?e(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"ln",this).call(this,n):(this.Ln($),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}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))}return o(t,H),n(t,[{key:"Mo",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))).So=r,o}return o(t,N),n(t,[{key:"un",value:function(){return e(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"un",this).call(this)&&G.co(this.So)}}]),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.cr(function(t){for(var e=0,n=t.length;e0,!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.jo(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:"Jo",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.jo(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:"Vo",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}(),dt=function(){function t(e,n,r){s(this,t),this.buffer=n,this.zo=!1,this.loopStart=null,this.loopEnd=null,this.qo=r,this.context=e,this.startTime=null,this.Ko=null,this.source=null,this.Go=!1}return n(t,[{key:"Xo",value:function(t){this.buffer=t}},{key:"$o",value:function(t,e,n){this.zo=t,v.I(e)&&(this.loopStart=e),v.I(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),r=v.m(r,this.buffer.duration),(i=this.context.createBufferSource()).loop=this.zo,v.I(this.loopStart)&&(i.loopStart=this.loopStart),v.I(this.loopEnd)&&(i.loopEnd=this.loopEnd),i.buffer=this.buffer,t.next=8,this.qo(i);case 8:i.start(e,n,r),this.startTime=(new Date).getTime()-1e3*v.m(n,0),this.source=i,this.Go=!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.I(this.source)?(e=v.m(e,0),this.Ko=(new Date).getTime()-this.startTime,this.Go=!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.Go){t.next=2;break}return t.abrupt("return",this.start(null,v.m(this.Ko,0)/1e3));case 2:case"end":return t.stop()}},t,this)}));return function(){return t.apply(this,arguments)}}()}]),t}(),vt=function(){function e(){var t=this;s(this,e),this.Qo={},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.Yo()})}return n(e,null,[{key:"Xt",value:function(){return v.Mt(e.te)&&(e.te=new e),e.te}}]),n(e,[{key:"Zo",value:function(){return"suspended"!==this.context.state}},{key:"set",value:function(t,n){var r=this;n=v.m(n,e.ea.ta);var i=v.m(this.Qo[n],{});"string"==typeof t&&(t={na:t});var o=t.na;return v.I(o)&&(i.sa=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.ia=v.m(t.ia,i.ia,0),this.Qo[n]=i,i.muted&&this.stop(n),this.Qo[n]}},{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("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.resume(),r=v.m(r,e.ea.ta),v.Mt(i)?i={}:"object"!=(void 0===i?"undefined":t(i))&&(i={na:i}),i.ia=v.m(i.ia,0),this.stop(r),this.set(i,r),this.Qo[r].muted){n.next=10;break}return n.next=3,this.Qo[r].sa;case 3:return o=n.sent,(s=new dt(this.context,o,function(t){var e=a.context.createGain();e.gain.value=a.Qo[r].volume,t.connect(e),e.connect(a.context.destination)})).Xo(o),s.$o(this.Qo[r].loop,.3,o.duration-.3),this.Qo[r].source=s,n.next=10,s.start();case 10:return n.abrupt("return",this.Qo[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.ea.ta);var n=this.Qo[t];v.I(n)&&v.I(n.source)&&n.source.stop()}},{key:"get",value:function(t){return t=v.m(t,e.ea.ta),this.Qo[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.ea.ta),this.Qo[n].muted||!v.I(this.Qo[n].source)){t.next=2;break}return t.abrupt("return",this.Qo[n].source.resume());case 2:case"end":return t.stop()}},t,this)}));return function(){return t.apply(this,arguments)}}()},{key:"Yo",value:function(){if(document.hidden)for(var t in this.Qo)v.I(this.Qo[t].source)&&this.Qo[t].source.stop();else for(var e in this.Qo)!this.Qo[e].muted&&v.I(this.Qo[e].source)&&this.Qo[e].source.resume()}}]),e}();vt.ea={ra:"music",oa:"sound",ta:"default"};var mt=function(){function t(e){s(this,t),"string"==typeof e&&(e={code:e}),this.aa=e,this.la=!1}return n(t,[{key:"ha",value:function(t){this.la=t}},{key:"ua",value:function(){return this.la}},{key:"ca",value:function(){return Z.send("c/code",this.aa)}}]),t}(),yt=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.I(n.code)){var r=n.code,i=v.m(n.cachable,!1),o=new mt(r);o.ha(i);var s=this;o.ca().then(function(t){t.success?E.ni(E.si,d.translate(v.m(t.result.successMessage,"code-activated"))):E.ni(E.si,d.translate(t.errors[0])),s.finish()})}}}]),t}();a.t(function(t){t.Is("code",yt)});var gt=function(){function t(e){return s(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,"contact/html/contact.html",t.da))}return o(t,b),n(t,[{key:"hn",value:function(){var n=this;new H(this.pn("#contact-form"),"contact","post").cr(function(){E.ni("contact-message-sent"),n.finish()}),e(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"hn",this).call(this)}}]),t}();gt.da="contactMe",a.t(function(t){gt.da&&t.Is(gt.da,gt)});var kt=function(){function t(){return s(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,b),t}(),wt=function(){function t(e,n,r,i){s(this,t),this.ma=e,this.pa=n,this.ga=r,this.fa=i}return n(t,[{key:"Sa",value:function(){return v.cloneNode(this.ma)}},{key:"wa",value:function(){return v.cloneNode(this.pa)}},{key:"Ma",value:function(){return v.cloneNode(this.ga)}},{key:"Ha",value:function(){return v.cloneNode(this.fa)}}]),t}(),_t=function(){function t(e){s(this,t),this.rotation=0,this.vn=e,this.parent=null}return n(t,[{key:"ya",value:function(t){return t}},{key:"va",value:function(){return!1}},{key:"Pa",value:function(t){this.parent=t}},{key:"Ta",value:function(){if(null!==this.parent)return this.parent.Ta()}},{key:"La",value:function(){return!1}},{key:"ba",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:"Aa",value:function(){}},{key:"Ca",value:function(t){return t}},{key:"ka",value:function(t){return t}},{key:"Fa",value:function(t){return t}},{key:"xa",value:function(){return this.vn}}]),t}(),bt=function(){function t(e,n){var r;return s(this,t),(r=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e))).Ba="A",v.I(n)&&r.Da(n),r}return o(t,_t),n(t,[{key:"va",value:function(e){return e instanceof t&&e.Ba===this.Ba}},{key:"Da",value:function(t){this.Ba=t}},{key:"Aa",value:function(){this.vn.querySelector(".leaf-element").removeAllChildren().appendChild(document.createTextNode(this.Ba))}}]),t}(),xt=function(){function t(e){var n;s(this,t),(n=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e))).children=[],n.Na="rotate-0",n.Wa=!0,n.Oa=100,n._a=0;var r=n;return n.ja=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.Ia)&&r.vn.contains(i)){if(e.stopPropagation(),e.preventDefault(),r._a+r.Oa>n)return;r.Ta().Va(r),r.rotate(t.Ia,i,t.Ua,o),r._a=(new Date).getTime()}},n.Ja=function(e){var n=(new Date).getTime();if(null!==t.Ia&&r.vn.contains(t.Ia)&&r.vn.contains(e.target)){var i={x:e.pageX,y:e.pageY};if(e.stopPropagation(),e.preventDefault(),r._a+r.Oa>n)return;r.Ta().Va(r),r.rotate(t.Ia,e.target,t.Ua,i),r._a=(new Date).getTime()}},n}return o(t,_t),n(t,[{key:"Ea",value:function(t){this.Wa=t,this.Aa()}}],[{key:"Ra",value:function(){window.addEventListener("mousedown",function(e){t.Ia=e.target,t.Ua={x:e.pageX,y:e.pageY}}),window.addEventListener("mouseup",function(){t.Ia=null,t.Ua={}}),window.addEventListener("touchstart",function(e){1===e.targetTouches.length&&(t.Ia=e.targetTouches[0].target,t.Ua={x:e.targetTouches[0].pageX,y:e.targetTouches[0].pageY})}),window.addEventListener("touchend",function(){t.Ia=null,t.Ua={}})}}]),n(t,[{key:"La",value:function(){return this.Wa&&!this.Ta().za()}},{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.I(n)&&v.I(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=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.La()){t.next=8;break}return this.rotation+=360+90*o,this.rotation%=360,c=this.rotation,this.qa(),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.Ta().Ka(h),h));case 8:case"end":return t.stop()}},t,this)}));return function(){return t.apply(this,arguments)}}()},{key:"va",value:function(e){if(!(e instanceof t)||e.children.length!==this.children.length)return!1;for(var n=0;n=2&&this.vn.classList.add("layer-"+t),this.Wa||this.vn.classList.add("locked");var e=this.vn.querySelector(".child-container");e.removeAllChildren(),this.qa(),this.vn.removeEventListener("mouseup",this.Ja),this.vn.removeEventListener("touchend",this.ja),this.vn.addEventListener("mouseup",this.Ja),this.vn.addEventListener("touchend",this.ja);for(var n=0,r=this.children.length;n=1&&this.children[0]&&this.children[0]instanceof t?this.children[0].$a()+1:1}}]),t}();xt.Ra();var Ot=function(){function t(e){s(this,t),this.Qa=null,this.words=[],this.Ya=[],this.Za=e,this.tl=!1,this.id=null,this.el=null,this.nl=null;var n=this;this.sl=new Promise(function(t,e){n.el=t,n.nl=e}),this.Va=function(){}}return n(t,[{key:"il",value:function(){var t=this.ya(),e=this.Fa();localStorage.setItem("currentLevel",JSON.stringify({id:this.id,rotations:t,locks:e}))}},{key:"Fa",value:function(){return null!==this.Qa?this.Qa.Fa([]):[]}},{key:"ya",value:function(){return null!==this.Qa?this.Qa.ya([]):[]}},{key:"rl",value:function(t){null!==this.Qa&&this.Qa.ka(t)}},{key:"ol",value:function(t){this.id=t}},{key:"K",value:function(){return this.id}},{key:"Ta",value:function(){return this}},{key:"al",value:function(t){this.Qa=t,this.Qa.Pa(this),this.Ya&&this.Ca()}},{key:"ll",value:function(t){this.words=[];for(var e=0,n=t.length;e=2&&this.words[0].length>=this.Sl&&this.words[1].length>=this.Sl){for(var t=Ot.fl(this.words[0],this.Za.Sa()),e=Ot.fl(this.words[1],this.Za.Sa()),n=new Lt(this.Za.Ma()),r=0,i=this.Sl/2;r=6&&this.words[0].length>=this.Sl&&this.words[1].length>=this.Sl&&this.words[2].length>=this.Sl&&this.words[3].length>=this.Sl&&this.words[4].length>=this.Sl&&this.words[5].length>=this.Sl){var t=[];t[0]=Ot.fl(this.words[0],this.Za.Sa()),t[1]=Ot.fl(this.words[1],this.Za.Sa()),t[2]=Ot.fl(this.words[2],this.Za.Sa()),t[3]=Ot.fl(this.words[3],this.Za.Sa()),t[4]=Ot.fl(this.words[4],this.Za.Sa()),t[5]=Ot.fl(this.words[5],this.Za.Sa());for(var e=new Lt(this.Za.Ma()),n=0;n=4&&this.words[0].length>=this.Sl&&this.words[1].length>=this.Sl&&this.words[2].length>=this.Sl&&this.words[3].length>=this.Sl){var t=[];t[0]=Ot.fl(this.words[0],this.Za.Sa()),t[1]=Ot.fl(this.words[1],this.Za.Sa()),t[2]=Ot.fl(this.words[2],this.Za.Sa()),t[3]=Ot.fl(this.words[3],this.Za.Sa());for(var e=new Lt(this.Za.Ma()),n=0;n=1)&&e.createObjectStore(t.vl.yl,{keyPath:"id"}),(v.Mt(n)||n<2&&r>=2)&&i.target.transaction.objectStore(t.vl.yl).createIndex("played",["deleted","played","difficulty","id"],{unique:!1}),(v.Mt(n)||n<3&&r>=3)&&i.target.transaction.objectStore(t.vl.yl).createIndex("difficulty","difficulty",{unique:!1})}},{key:"Pl",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.wi(n,t.vl.yl).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:"Tl",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.vl.yl));case 1:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}()},{key:"Ll",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 console.log("loadNextLevel 1",IDBKeyRange.lowerBound(0)),e.next=3,this.Mi(t.vl.yl);case 3:for(r=(r=e.sent).sort(function(t,e){return t.difficulty-e.difficulty}),console.log("loadNextLevel 2"),i=[],o=[],s=-1,a=0,u=r.length;a=t){e-=t,localStorage.setItem("coins",e),this.Al.title=e,this.Al.j();for(var n=this.level.ml(),r=(n=n.filter(function(t){return!t.ba(!1)}))[Math.floor(Math.random()*n.length)];0!==r.rotation;)r.rotate();r.Ea(!1),this.level.il(),ht.push(["trackEvent","LevelSite","Help","Coins",parseInt(v.m(localStorage.getItem("coins"),"0"))])}else E.ni("not-enough-coins"),ht.push(["trackEvent","LevelSite","Help","Not enough Coins",parseInt(v.m(localStorage.getItem("coins"),"0"))])}},{key:"ql",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.Xl.Gl){e.next=19;break}n=v.m(localStorage.getItem("tutorial-step"),"1"),r=new pt,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.gl(function(){m.en.classList.remove("step-1"),localStorage.setItem("tutorial-step","2"),m.ql()}),i=this.pn(".tutorial-text .step-1"),e.next=9,this.kl();case 9:return r.Jo(i,i.parentElement,null,!0,1,2),e.abrupt("break",17);case 11:return this.level.gl(function(){}),this.level.ul().then(function(){m.en.classList.remove("tutorial"),m.en.classList.remove("step-2"),localStorage.removeItem("tutorial-step"),m.Dl=m.Dl.then(function(){E.ni("extra-coins-after-first-level"),localStorage.setItem("coins",parseInt(v.m(localStorage.getItem("coins"),"0"))+50),m.Al.k(v.m(localStorage.getItem("coins"),"0")),m.Al.j()})}),o=this.pn(".tutorial-text .step-2"),e.next=15,this.kl();case 15:return r.Jo(o,o.parentElement,null,!0,1,2),e.abrupt("break",17);case 17:e.next=49;break;case 19:if(this.level.id!==t.Xl.$l){e.next=35;break}s=v.m(localStorage.getItem("tutorial-step"),"3"),e.t1=s,e.next="3"===e.t1?24:33;break;case 24:return a=new pt,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.pn("#help-button").removeEventListener("click",t),m.kl()},this.pn("#help-button").addEventListener("click",u),l=this.pn(".tutorial-text .step-3"),e.next=31,this.kl();case 31:return a.Jo(l,l.parentElement,null,!0,1,2),e.abrupt("break",33);case 33:e.next=49;break;case 35:if(this.level.id!==t.Xl.Ql){e.next=49;break}c=v.m(localStorage.getItem("tutorial-step"),"4"),e.t2=c,e.next="4"===e.t2?40:49;break;case 40:return h=new pt,this.en.classList.add("tutorial"),this.en.classList.add("step-"+c),f=this.level.ml()[0],(p=this.pn("#tutorial-pointer")).remove(),f.vn.appendChild(p),this.level.gl(function(t){f===t&&(m.en.classList.remove("tutorial"),m.en.classList.remove("step-4"),localStorage.setItem("tutorial-step","5"),m.kl())}),d=this.pn(".tutorial-text .step-4"),e.next=47,this.kl();case 47:return h.Jo(d,d.parentElement,null,!0,1,2),e.abrupt("break",49);case 49:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}()}]),t}();Zt.Kl=[20,40,60,100,120,140,160],Zt.Xl={Gl:67,$l:15,Ql:341};var Ht=function(){function t(e){return s(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,4))}return o(t,Mt),n(t,[{key:"il",value:function(){}}]),t}(),Ft=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(R.Wi(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,S),t}(),qt=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"))).Yl=n.Zl(),n.listener=null,n}return o(t,kt),n(t,[{key:"ln",value:function(n){var i=this;ht.update("Menu Site");var o=e(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"ln",this).call(this,n),s=new Ht(this.Za);s.ll(["WORD","ROTA","TORW","ORDR"]),s.dl(),s.ul().then(function(){ht.push(["trackEvent","MainMenu","levelSolved"]),i.th()});var a=s.cl();a.Aa(),this.pn("#level").removeAllChildren().appendChild(a.xa());var u=s.ml();(function t(){var e=4500*Math.random()+1500;i.eh=setTimeout(function(){for(var e=-1,n=[],r=0;r=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.pn("#play-button"),(n=i.pn("#level-number")).innerText=v.m(localStorage.getItem("levelCounter"),1),r=i.pn("#level"),o=new pt,t.next=5,o.Jo(r,r.parentElement,!1,!1,2,8,null,!1);case 5:return s=getComputedStyle(r),e.style.width=s.getPropertyValue("width"),o.Jo(e.children[0],e,null,null,null,4,null,!1),t.next=10,o.jo(.2,n.parentElement,n.parentElement.parentElement,null,null,null,10,null,!1);case 10:o.Jo(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.Xt();return this.pn("#play-sound").checked="1"===l.Sr("play-sound","1"),this.pn("#play-music").checked="1"===l.Sr("play-music","1"),o}},{key:"th",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:vt.Xt().resume(),this.Ln(Zt,Promise.race([this.Yl,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=Dt.Xt(),t.next=3,r.Ll(Zt.Kl);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.pn("#play-button").addEventListener("click",function(){ht.push(["trackEvent","MainMenu","startButton"]),h.th()}),r=this.pn("#segment-leaf-template"),i=this.pn("#segment-parent-template"),o=this.pn("#segment-row-template"),s=this.pn("#segment-triangle-template"),r.id=null,i.id=null,o.id=null,s.id=null,r.remove(),i.remove(),o.remove(),s.remove(),this.Za=new wt(r,i,o,s),v.m(t.app.Vs)&&t.app.Vs.then(function(){h.listener&&h.listener()}),a=F.Xt(),u=vt.Xt(),(l=this.pn("#play-music")).checked="1"===a.Sr("play-music","1"),l.addEventListener("change",function(){a.Hr("play-music",l.checked?"1":"0"),u.set({muted:!l.checked},vt.ea.ra),l.checked&&u.play(vt.ea.ra),ht.push(["trackEvent","MainMenu","PlayMusic","Play Music",l.checked?1:0])}),(c=this.pn("#play-sound")).checked="1"===a.Sr("play-sound","1"),c.addEventListener("change",function(){a.Hr("play-sound",c.checked?"1":"0"),u.set({muted:!c.checked},vt.ea.oa),ht.push(["trackEvent","MainMenu","PlaySound","Play Sound",c.checked?1:0])}),this.pn("#share-button").addEventListener("click",function(){(new Ft).show()});case 7:case"end":return n.stop()}},n,this)}));return function(){return n.apply(this,arguments)}}()},{key:"cn",value:function(n){clearTimeout(this.eh),window.removeEventListener("resize",this.listener),e(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"cn",this).call(this,n)}},{key:"Zl",value:function(){var t=r(regeneratorRuntime.mark(function t(){var e,n,r,i,o,s,a,u,l,c,h,f;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:e=v.m(localStorage.getItem("date-last-sync"),0),n=Dt.Xt(),r=null,i=1,o=[],s=0;case 3:if(!(s=0&&(Yt="/pwa/wordRotator/publicTest/"),m.Ae(Yt),d.It=["de"],d.Vt=!1,ht.Uo="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.I(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))});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.I(r)?(e.push(r.value),r.continue()):v.I(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.zi)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 D("red","red")),y.Ee(new D("blue","blue")),y.Ee(new D("black","black")),y.Ee(new D("green","green")),y.Ee(new D("pink","pink")),y.Ee(new D("dark","dark")),R.Ei(new ft(new X("img/whatsapp.svg"),"whatsapp",!0)),R.Ei(new ft(new M("img/sms.svg"),"sms",!0)),R.Ei(new ft(new A("img/telegram.svg"),"telegram",!0));var $t=new P;u.l(function(){window.app=$t,window.app.pause=$t.pause,window.app.resume=$t.resume}),W.eo("html/application/setting-template.html"),ut.at=!1,at.Lo=!1,a.resolve($t).then(r(regeneratorRuntime.mark(function t(){var e;return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:W.no.g=l.Y,e=F.Xt(),vt.Xt().play(vt.ea.ra,{na:"sound/brightAndBeautifull__.mp3",loop:!0,volume:.6,muted:"1"!==e.Sr("play-music","1")}).catch(function(t){return console.error(t)}),$t.start(qt),d.bt("de"),ct.Fo(function(){}),window.applyAndroidBridge=u.u;case 3:case"end":return t.stop()}},t,this)}))); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjAiXSwibmFtZXMiOlsiZ2xvYmFsIiwidW5kZWZpbmVkIiwiT3AiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd24iLCJoYXNPd25Qcm9wZXJ0eSIsIiRTeW1ib2wiLCJTeW1ib2wiLCJpdGVyYXRvclN5bWJvbCIsIml0ZXJhdG9yIiwiYXN5bmNJdGVyYXRvclN5bWJvbCIsImFzeW5jSXRlcmF0b3IiLCJ0b1N0cmluZ1RhZ1N5bWJvbCIsInRvU3RyaW5nVGFnIiwiaW5Nb2R1bGUiLCJtb2R1bGUiLCJydW50aW1lIiwicmVnZW5lcmF0b3JSdW50aW1lIiwiZXhwb3J0cyIsIndyYXAiLCJHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0IiwiR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCIsIkdlblN0YXRlRXhlY3V0aW5nIiwiR2VuU3RhdGVDb21wbGV0ZWQiLCJDb250aW51ZVNlbnRpbmVsIiwiSXRlcmF0b3JQcm90b3R5cGUiLCJ0aGlzIiwiZ2V0UHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsIk5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlIiwidmFsdWVzIiwiY2FsbCIsIkdwIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJHZW5lcmF0b3IiLCJjcmVhdGUiLCJHZW5lcmF0b3JGdW5jdGlvbiIsImNvbnN0cnVjdG9yIiwiZGlzcGxheU5hbWUiLCJpc0dlbmVyYXRvckZ1bmN0aW9uIiwiZ2VuRnVuIiwiY3RvciIsIm5hbWUiLCJtYXJrIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJhd3JhcCIsImFyZyIsIl9fYXdhaXQiLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJBc3luY0l0ZXJhdG9yIiwiYXN5bmMiLCJpbm5lckZuIiwib3V0ZXJGbiIsInNlbGYiLCJ0cnlMb2NzTGlzdCIsIml0ZXIiLCJuZXh0IiwidGhlbiIsInJlc3VsdCIsImRvbmUiLCJ2YWx1ZSIsInRvU3RyaW5nIiwia2V5cyIsIm9iamVjdCIsImtleSIsInB1c2giLCJyZXZlcnNlIiwibGVuZ3RoIiwicG9wIiwiQ29udGV4dCIsInJlc2V0Iiwic2tpcFRlbXBSZXNldCIsInByZXYiLCJzZW50IiwiX3NlbnQiLCJkZWxlZ2F0ZSIsIm1ldGhvZCIsInRyeUVudHJpZXMiLCJmb3JFYWNoIiwicmVzZXRUcnlFbnRyeSIsImNoYXJBdCIsImlzTmFOIiwic2xpY2UiLCJzdG9wIiwicm9vdFJlY29yZCIsImNvbXBsZXRpb24iLCJ0eXBlIiwicnZhbCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiZXhjZXB0aW9uIiwiY29udGV4dCIsImhhbmRsZSIsImxvYyIsImNhdWdodCIsInJlY29yZCIsImkiLCJlbnRyeSIsInRyeUxvYyIsImhhc0NhdGNoIiwiaGFzRmluYWxseSIsImNhdGNoTG9jIiwiZmluYWxseUxvYyIsIkVycm9yIiwiYWJydXB0IiwiZmluYWxseUVudHJ5IiwiY29tcGxldGUiLCJhZnRlckxvYyIsImZpbmlzaCIsImNhdGNoIiwidGhyb3duIiwiZGVsZWdhdGVZaWVsZCIsIml0ZXJhYmxlIiwicmVzdWx0TmFtZSIsIm5leHRMb2MiLCJwcm90b0dlbmVyYXRvciIsImdlbmVyYXRvciIsIl9pbnZva2UiLCJzdGF0ZSIsImRvbmVSZXN1bHQiLCJkZWxlZ2F0ZVJlc3VsdCIsIm1heWJlSW52b2tlRGVsZWdhdGUiLCJ0cnlDYXRjaCIsIm1ha2VJbnZva2VNZXRob2QiLCJmbiIsIm9iaiIsImVyciIsInByZXZpb3VzUHJvbWlzZSIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJpbnZva2UiLCJ1bndyYXBwZWQiLCJlcnJvciIsInJldHVybiIsIlR5cGVFcnJvciIsImluZm8iLCJwdXNoVHJ5RW50cnkiLCJsb2NzIiwiaXRlcmF0b3JNZXRob2QiLCJGdW5jdGlvbiIsIl90eXBlb2YiLCJfZ2V0IiwiZ2V0IiwicHJvcGVydHkiLCJyZWNlaXZlciIsImRlc2MiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJwYXJlbnQiLCJnZXR0ZXIiLCJfY3JlYXRlQ2xhc3MiLCJkZWZpbmVQcm9wZXJ0aWVzIiwidGFyZ2V0IiwicHJvcHMiLCJkZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiZGVmaW5lUHJvcGVydHkiLCJDb25zdHJ1Y3RvciIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsIl9hc3luY1RvR2VuZXJhdG9yIiwiZ2VuIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJzdGVwIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJSZWZlcmVuY2VFcnJvciIsIl9pbmhlcml0cyIsInN1YkNsYXNzIiwic3VwZXJDbGFzcyIsIl9jbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiSW5pdFByb21pc2UiLCJfdCIsImUiLCJzIiwidCIsIm8iLCJhbGwiLCJBbmRyb2lkQnJpZGdlIiwiX24iLCJzcGxpdCIsIl90MiIsIm4iLCJ3aW5kb3ciLCJoIiwibCIsIk1lbnVBY3Rpb24iLCJ0aXRsZSIsIkhlbHBlciIsIm0iLCJwIiwiZyIsIlMiLCJvcmRlciIsIk0iLCJIIiwidiIsIlAiLCJpZCIsIlQiLCJMIiwiQSIsIkMiLCJJIiwiY29uc29sZSIsImxvZyIsIlUiLCJfdDMiLCJyZW1vdmUiLCJqIiwiRyIsIlkiLCJaIiwidHQiLCJPcGVuU3VibWVudUFjdGlvbiIsIl90aGlzIiwiZXQiLCJ0b2dnbGUiLCJudCIsInN0IiwiWCIsIk1lbnUiLCJpdCIsInJ0Iiwib3QiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJBcnJheSIsImlzQXJyYXkiLCJfZSIsIl9uMiIsImx0IiwiTiIsInV0IiwiY3QiLCJkdCIsIl9lMiIsIl9uMyIsInJlbW92ZUFsbENoaWxkcmVuIiwiX240IiwiYXBwZW5kQ2hpbGQiLCJjbG9uZU5vZGUiLCJvbmNsaWNrIiwicHQiLCJtYXRjaGVzIiwiY2xvc2VzdCIsInBhcnNlSW50IiwiZGF0YXNldCIsIl9uNSIsIlYiLCJfbjYiLCJfaSIsImNsaWNrIiwiY3JlYXRlRWxlbWVudCIsImhyZWYiLCJKIiwiX243Iiwic3JjIiwiY2xhc3NMaXN0IiwiYWRkIiwiUiIsInRyYW5zbGF0aW9uVGl0bGUiLCJEIiwiVHJhbnNsYXRvciIsImd0IiwiY3JlYXRlVGV4dE5vZGUiLCJmdCIsInRyaW0iLCJPIiwiaHQiLCJTdCIsInNvcnQiLCJxdWVyeVNlbGVjdG9yIiwiSyIsIk10Iiwid3QiLCJfdDQiLCJyZXBsYWNlV2l0aCIsImluZGV4T2YiLCJzcGxpY2UiLCJfdDUiLCJfZTMiLCJfZTQiLCJIdCIsIlN1Ym1lbnUiLCJfdGhpczIiLCJ5dCIsImlzT3BlbiIsIl90aGlzMyIsImNsb3NlIiwiaW5zZXJ0QmVmb3JlIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJvcGVuIiwiVHJhbnNsYXRvckRCIiwidnQiLCJpbmRleGVkREIiLCJtb3pJbmRleGVkREIiLCJ3ZWJraXRJbmRleGVkREIiLCJtc0luZGV4ZWREQiIsIlB0IiwiVHQiLCJvbnVwZ3JhZGVuZWVkZWQiLCJMdCIsIm9uc3VjY2VzcyIsIm9uZXJyb3IiLCJkZWxldGVPYmplY3RTdG9yZSIsIndhcm4iLCJjcmVhdGVPYmplY3RTdG9yZSIsImtleVBhdGgiLCJjcmVhdGVJbmRleCIsInVuaXF1ZSIsIkF0Iiwib2JqZWN0U3RvcmUiLCJwdXQiLCJsYW5nIiwiciIsIl9uOCIsInRyYW5zbGF0aW9uIiwib25jb21wbGV0ZSIsImluZGV4Iiwib3BlbkN1cnNvciIsIklEQktleVJhbmdlIiwib25seSIsIl90NiIsImNvbnRpbnVlIiwiY3VycmVudFRhcmdldCIsInRyYW5zYWN0aW9uIiwieHQiLCJCdCIsIkR0IiwiUnQiLCJJdCIsIlV0IiwiRXQiLCJXdCIsIk50IiwiT3QiLCJqdCIsIlZ0IiwiSnQiLCJ6dCIsInF0IiwiZmV0Y2giLCJHdCIsImpzb24iLCJhc3NpZ24iLCJDdCIsIkt0IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJzZXRBdHRyaWJ1dGUiLCIkdCIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJidCIsIlF0IiwiWXQiLCJmb3JtYXQiLCJpbm5lckhUTUwiLCJ0cmFuc2xhdGUiLCJ0cmFuc2xhdGlvbkFyZ3MiLCJKU09OIiwicGFyc2UiLCJfbjkiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJzdWJzdHIiLCJ0b0xvd2VyQ2FzZSIsImdldEl0ZW0iLCJuYXZpZ2F0b3IiLCJsYW5ndWFnZXMiLCJsYW5ndWFnZSIsIlh0Iiwic3RyaW5naWZ5IiwiYXQiLCJ0ZSIsImVlIiwibmUiLCJzZSIsImllIiwicmUiLCJjb25jYXQiLCJfdDciLCJlbXB0eSIsImVuY29kZVVSSUNvbXBvbmVudCIsImpvaW4iLCJjb250ZW50IiwiY2hpbGROb2RlcyIsImNsYXNzTmFtZSIsImNyZWF0ZUVsZW1lbnROUyIsIlN5c3RlbVNldHRpbmdzIiwidWUiLCJ1c2VyQWdlbnQiLCJtYXRjaCIsImNlIiwib3JpZW50YXRpb24iLCJjcmVhdGVSYW5nZSIsInNlbGVjdE5vZGVDb250ZW50cyIsImdldFNlbGVjdGlvbiIsInJlbW92ZUFsbFJhbmdlcyIsImFkZFJhbmdlIiwiTWF0aCIsImZsb29yIiwiY2hhckNvZGVBdCIsIlJlZ0V4cCIsIl90OCIsIl9uMTAiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJzdHlsZSIsImRpc3BsYXkiLCJnZXRFbGVtZW50QnlJZCIsIkVsZW1lbnQiLCJwcmludCIsIkRhdGUiLCJnZXRVVENEYXkiLCJnZXREYXkiLCJnZXRVVENEYXRlIiwiZ2V0RGF0ZSIsImdldFVUQ01vbnRoIiwiZ2V0TW9udGgiLCJnZXRVVENGdWxsWWVhciIsImdldEZ1bGxZZWFyIiwiYSIsImdldFVUQ0hvdXJzIiwiZ2V0SG91cnMiLCJ1IiwiYyIsInNldERhdGUiLCJkIiwicG93IiwicmVwbGFjZSIsIiVhIiwib3V0ZXJIVE1MIiwiJUEiLCIlYiIsIiVCIiwiJWMiLCJ0b1VUQ1N0cmluZyIsIiVDIiwiJWQiLCIlZSIsIiVmIiwiZ2V0VGltZSIsIiVGIiwidG9JU09TdHJpbmciLCIlRyIsIiVnIiwiJUgiLCIlSSIsIiVqIiwiJWsiLCIlbCIsIiVtIiwiJU0iLCJnZXRNaW51dGVzIiwiJXAiLCIlUCIsIiVzIiwicm91bmQiLCIlUyIsImdldFNlY29uZHMiLCIldSIsIiVWIiwidmFsdWVPZiIsInNldE1vbnRoIiwiY2VpbCIsIiV3IiwiJXgiLCJ0b0xvY2FsZURhdGVTdHJpbmciLCIlWCIsInRvTG9jYWxlVGltZVN0cmluZyIsIiV5IiwiJVkiLCIleiIsInRvVGltZVN0cmluZyIsIiVaIiwiX24xMSIsIlNlIiwiJmFtcDsiLCImIzAzODsiLCImbHQ7IiwiJmd0OyIsIiZxdW90OyIsIiYjMDM5OyIsIiYjODIxNzsiLCImIzgyMTY7IiwiJiM4MjExOyIsIiYjODIxMjsiLCImIzgyMzA7IiwiJiM4MjIxOyIsIkZvcm1EYXRhIiwic2V0IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImhlaWdodCIsIndpZHRoIiwieWUiLCJ2ZSIsInBhcnNlRmxvYXQiLCJnZXRQcm9wZXJ0eVZhbHVlIiwiUGUiLCJkb2N1bWVudEVsZW1lbnQiLCJjbGllbnRIZWlnaHQiLCJfdDkiLCJjb250YWlucyIsInBhcmVudE5vZGUiLCJjaHJvbWUiLCJ2ZW5kb3IiLCJpbml0IiwiQ2UiLCJrZSIsIkFlIiwiVGhlbWVNYW5hZ2VyIiwiRmUiLCJCZSIsImZpbHRlciIsIkRlIiwiX3QxMCIsImFkZEV2ZW50TGlzdGVuZXIiLCJib2R5IiwiUmUiLCJJZSIsIl9lNSIsIl9uMTIiLCJVZSIsInhlIiwiYWRkQ2hhbmdlTGlzdGVuZXIiLCJnZXRDdXJyZW50VGhlbWUiLCJDb29raWVDb21wbGlhbmNlIiwiT2UiLCJqZSIsIlZlIiwiSmUiLCJfcmVmIiwiX2NhbGxlZSIsIl9jb250ZXh0IiwiTmUiLCJfcmVmMiIsIl9jYWxsZWUyIiwiX2NvbnRleHQyIiwiemUiLCJzaG93IiwiS2UiLCJfdDExIiwic2V0VGltZSIsInRvR01UU3RyaW5nIiwiY29va2llIiwicWUiLCJfdDEyIiwic3Vic3RyaW5nIiwiQWN0aW9uQmFyTWVudSIsIkIiLCJZZSIsIlplIiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsIlhlIiwiJGUiLCJfbjEzIiwicmVkdWNlIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiUWUiLCJtYXRjaE1lZGlhIiwiVmlld0luZmxhdGVyIiwiY3JlZGVudGlhbHMiLCJ0ZXh0IiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwiaW1wbGVtZW50YXRpb24iLCJjcmVhdGVIVE1MRG9jdW1lbnQiLCJmaXJzdENoaWxkIiwiX2xvb3AiLCJfdDEzIiwidG4iLCJ2aWV3IiwiZW4iLCJubiIsInNuIiwiaW4iLCJybiIsIm9uIiwiYW4iLCJfdGhpczUiLCJfYXJndW1lbnRzIiwiaG4iLCJfbG9vcDIiLCJsbiIsInVuIiwiY24iLCJkbiIsIkFic3RyYWN0U2l0ZSIsIl90aGlzNiIsImduIiwiU24iLCJ3biIsInVybCIsIk1uIiwiSG4iLCJ5biIsInZuIiwiUG4iLCJMbiIsImJuIiwiX3QxNCIsIkFuIiwiQ24iLCJrbiIsIkJuIiwiUm4iLCJEbiIsImFlIiwiYWRkTGlzdGVuZXIiLCJObiIsIk9uIiwiU2l0ZUNvbnRhaW5lciIsImpuIiwiVm4iLCJKbiIsIlNpdGVNYW5hZ2VyIiwiZXMiLCJucyIsInNzIiwicnMiLCJvcyIsImFzIiwibHMiLCJocyIsIl90MTUiLCJ1cyIsIm9ucG9wc3RhdGUiLCJfdDE2Iiwiem4iLCJXbiIsIl9yZWYzIiwiX2NhbGxlZTMiLCJfZTYiLCJfY29udGV4dDMiLCJfcmVmNCIsIl9jYWxsZWU1IiwiX3RoaXM3IiwiX2NvbnRleHQ1IiwiaGUiLCJfcmVmNSIsIl9jYWxsZWU0IiwiX2NvbnRleHQ0IiwiWW4iLCJ4biIsImdzIiwiZnMiLCJfdDE3IiwiU3MiLCJabiIsIndoaWNoIiwiJG4iLCJHbiIsIlhuIiwiaGlzdG9yeSIsInB1c2hTdGF0ZSIsInNpdGVOYW1lIiwic2l0ZURhdGEiLCJzdGFja1Bvc2l0aW9uIiwiRW4iLCJyZXBsYWNlU3RhdGUiLCJtcyIsIl9lOCIsIl9uMTQiLCJQYXVzZVNpdGUiLCJBcHAiLCJ5cyIsInZzIiwiUHMiLCJUcyIsIk1hcCIsIkxzIiwiYnMiLCJBcyIsIkNzIiwid3MiLCJoYXMiLCJsb2NhdGlvbiIsInBhdGhuYW1lIiwic2VhcmNoIiwiaGFzaCIsIkVzIiwiX24xNSIsInByZXZlbnREZWZhdWx0IiwiT3MiLCJzaXRlQXJncyIsIldzIiwianMiLCJkcyIsIldlIiwiY3MiLCJOcyIsIlZzIiwiX3JlZjYiLCJfY2FsbGVlNiIsIl9jb250ZXh0NiIsInBzIiwiX3QxOCIsIkRpYWxvZyIsIkpzIiwienMiLCJjYW5jZWxhYmxlIiwicXMiLCJLcyIsImJ1dHRvbnMiLCJHcyIsIl9yZWY3IiwiX2NhbGxlZTciLCJfY29udGV4dDciLCJZcyIsIl90MTkiLCJfcmVmOCIsIl9jYWxsZWU4IiwiX3QyMCIsIl9lOSIsIl90MjEiLCJfY29udGV4dDgiLCJOb2RlIiwiWnMiLCJGbGFzaE1lc3NlbmdlciIsInNldFRpbWVvdXQiLCJmYWRlT3V0Iiwic2kiLCJpaSIsIm9wYWNpdHkiLCJlaSIsImZhZGVJbiIsInJpIiwib2kiLCJhaSIsImxpIiwiaGkiLCJ1aSIsIk15RGIiLCJjaSIsImRpIiwibWkiLCJvbGRWZXJzaW9uIiwibmV3VmVyc2lvbiIsInBpIiwiZ2kiLCJmaSIsImV2ZW50IiwiX2xvb3AzIiwiX3MyIiwiZ2V0QWxsIiwiZGVsZXRlIiwiX2xvb3A0IiwiX3MzIiwiX3RoaXM5IiwiY2xlYXIiLCJTY3JpcHRMb2FkZXIiLCJMaSIsIl9lMTAiLCJvbmxvYWQiLCJBaSIsIl9uMTYiLCJyZWwiLCJtZWRpYSIsImhlYWQiLCJTaGFyZUJ1dHRvbiIsIkNpIiwia2kiLCJCaSIsIkRpIiwiUmkiLCJJaSIsIlRZUEVfQUxMIiwiTXVsdGlwbGVTaGFyZUJ1dHRvbiIsIl9pMiIsInhpIiwiU2hhcmVNYW5hZ2VyIiwiVWkiLCJOaSIsIk9pIiwiamkiLCJWaSIsIl9sb29wNSIsIkZpIiwiX2kzIiwiX24xNyIsIkVpIiwiU21zU2hhcmVCdXR0b24iLCJUZWxlZ3JhbVNoYXJlQnV0dG9uIiwiV2hhdHNhcHBTaGFyZUJ1dHRvbiIsIkZyYWdtZW50IiwiX3RoaXMxNCIsIkppIiwiYWN0aXZlIiwiVGhlbWUiLCJDb25zdGFudHMiLCJxaSIsIktpIiwiR2kiLCJEYXRhTWFuYWdlciIsIl9yZWY5IiwiX2NhbGxlZTkiLCJfY29udGV4dDkiLCJYaSIsIiRpIiwiUWkiLCJfcmVmMTAiLCJfY2FsbGVlMTAiLCJfY29udGV4dDEwIiwic3VjY2VzcyIsImVycm9ycyIsIl9yZWYxMSIsIl9jYWxsZWUxMSIsIl9jb250ZXh0MTEiLCJfcmVmMTIiLCJfY2FsbGVlMTIiLCJfdDIyIiwiX24xOSIsIl9jb250ZXh0MTIiLCJhcHBlbmQiLCJGb3JtIiwiWmkiLCJ0ciIsImVyIiwibnIiLCJsb2FkIiwic2VuZCIsIl9yZWYxNCIsIl9yZWYxMyIsInNyIiwiaXIiLCJfY2FsbGVlMTMiLCJfY29udGV4dDEzIiwicnIiLCJfY2FsbGVlMTQiLCJfY29udGV4dDE0Iiwib3IiLCJfZTExIiwiX24yMCIsImVsZW1lbnRzIiwiX24yMSIsInNldEN1c3RvbVZhbGlkaXR5IiwiX3QyMyIsInRpIiwic3VibWl0IiwibHIiLCJociIsIl9uMjIiLCJvcHRpb25zIiwiX2UxMiIsIl9pNCIsImlubmVyVGV4dCIsIndlIiwiX3JlZjE1IiwiX2NhbGxlZTE1IiwiX3QyNCIsIl9jb250ZXh0MTUiLCJ1ciIsImRpc2FibGVkIiwidDAiLCJ0MSIsIlNldHRpbmdzTWFuYWdlciIsIm1yIiwiZHIiLCJnciIsInByIiwiTXIiLCJ5ciIsIl9lMTMiLCJMb2NhbFN0b3JhZ2VTZXR0aW5nc0ZyYWdtZW50IiwicG4iLCJfbG9vcDYiLCJfdDI1IiwicmF3IiwiU3IiLCJIVE1MSW5wdXRFbGVtZW50IiwiUHIiLCJkZWZhdWx0IiwiZGVmYXVsdFRyYW5zbGF0ZWFibGUiLCJ0cmFuc2xhdGlvblZhbHVlIiwiY2hlY2tlZCIsIkhyIiwiX3QyNiIsIl9zNCIsIl9pNSIsIl9vIiwiU21hcnRDb2x1bW4iLCJUciIsIkxyIiwiYnIiLCJBciIsIkNyIiwiY29sdW1uIiwiUnIiLCJDb25zdFNtYXJ0Q29sdW1uIiwiX3RoaXMxNiIsIldyIiwiRGF0YVNtYXJ0Q29sdW1uIiwiZGF0YSIsIkltZ0NvbnN0U21hcnRDb2x1bW4iLCJfdGhpczE4IiwiTGlzdEhlbHBlciIsIk5yIiwiT3IiLCJfciIsImpyIiwiY29sdW1ucyIsIl9lMTQiLCJfbjIzIiwiVnIiLCJfZTE1IiwiX24yNCIsInhyIiwiVXIiLCJ6ciIsIml0ZW0iLCJwYWdlIiwicGFnaW5hdGlvbiIsIm91dGVyV2luZG93IiwiaW5uZXJXaW5kb3ciLCJMaXN0IiwibGlzdENsYXNzIiwibGlzdCIsIl9zNSIsIl9pNiIsIkZyIiwiRHIiLCJFciIsIl9pNyIsIklyIiwidmFsdWVOYW1lcyIsIlNldHRpbmdzU2l0ZSIsIl90aGlzMTkiLCJYciIsIl90MjciLCIkciIsIlFyIiwibW4iLCJzZXRBY3RpdmUiLCJZciIsIl90aGlzMjAiLCJfbG9vcDciLCJfbjI1IiwiX3M2IiwidG8iLCJubyIsInNvIiwiX3RoaXMyMSIsIklzIiwiX2UxNiIsIl9jYWxsZWUxNiIsIl9lMTciLCJfY29udGV4dDE2IiwicSIsIlVzZXJNYW5hZ2VyIiwiaW8iLCJybyIsIm9vIiwiYWNjZXNzZXMiLCJhcHAiLCJhbyIsImxvIiwia3MiLCJNcyIsInNldERhdGEiLCJfZTE4IiwibmkiLCJtbyIsInBvIiwiZm8iLCJobyIsIl90MjgiLCJfZTE5IiwiX3QyOSIsIl90MzAiLCJ2ciIsIlVzZXJBY3Rpb24iLCJfdGhpczIyIiwiU28iLCJjbyIsIk5vdEFsbG93ZWRTaXRlIiwiVXNlclNpdGUiLCJfdGhpczI0IiwiTG9naW5Gb3JtIiwiX3RoaXMyNSIsIlJlZ2lzdHJhdGlvbkZvcm0iLCJVc2VyRnJhZ21lbnQiLCJfdGhpczI3IiwiUGFzc3dvcmRTZXR0aW5nc0ZyYWdtZW50IiwiY3IiLCJfZTIwIiwiX24yNiIsIm9sZFBhc3N3b3JkIiwibmV3UGFzc3dvcmQxIiwibmV3UGFzc3dvcmQyIiwiVXNlclNldHRpbmdzRnJhZ21lbnQiLCJfZTIxIiwiX24yNyIsIkVkaXRVc2VyUm9sZXNTaXRlIiwidXNlcklkIiwiVGkiLCJIbyIsInVzZXJSb2xlcyIsInlvIiwiYXZhaWxhYmxlUm9sZXMiLCJ2byIsInVzZXJuYW1lIiwiSnIiLCJHciIsImhhc1JvbGUiLCJrciIsIkZvcmdvdFBhc3N3b3JkU2l0ZSIsIkxvZ2luU2l0ZSIsIlRuIiwiUG8iLCJUbyIsIkxvIiwiYm8iLCJ1byIsIlJlZ2lzdHJhdGlvblNpdGUiLCJhY3Rpb24iLCJTZXROZXdQYXNzd29yZFNpdGUiLCJjb2RlIiwiSW5zdGFsbE1hbmFnZXIiLCJfdGhpczM1IiwiQW8iLCJDbyIsImtvIiwiX3JlZjE3IiwiX2NhbGxlZTE3IiwiX2NvbnRleHQxNyIsInByb21wdCIsInVzZXJDaG9pY2UiLCJvdXRjb21lIiwicGxhdGZvcm0iLCJNYXRvbW8iLCJfcmVmMTgiLCJfdGhpczM2IiwieG8iLCJfY2FsbGVlMTgiLCJfY29udGV4dDE4IiwiQm8iLCJEbyIsIlJvIiwiSW8iLCJVbyIsImRlZmVyIiwiRW8iLCJfcmVmMTkiLCJfY2FsbGVlMTkiLCJfY29udGV4dDE5IiwiaXNVc2VyT3B0ZWRPdXQiLCJfcmVmMjAiLCJfY2FsbGVlMjAiLCJfY29udGV4dDIwIiwiTm8iLCJtb2RlIiwiX3JlZjIxIiwiX2NhbGxlZTIxIiwiX2NvbnRleHQyMSIsIl9yZWYyMiIsIl9jYWxsZWUyMiIsIl9jb250ZXh0MjIiLCJpc0Zpbml0ZSIsIl9yZWYyMyIsIl9jYWxsZWUyMyIsIl9jb250ZXh0MjMiLCJfcGFxIiwiTWF0b21vU2hhcmVCdXR0b24iLCJTY2FsZUhlbHBlciIsIl9yZWYyNCIsIl9jYWxsZWUyNCIsIl9jb250ZXh0MjQiLCJWbyIsImZvbnRTaXplIiwiam8iLCJfcmVmMjUiLCJfY2FsbGVlMjUiLCJfY29udGV4dDI1IiwiX3JlZjI2IiwiX2NhbGxlZTI2IiwiX3QzMSIsImYiLCJfdDMyIiwiX2NvbnRleHQyNiIsIm9mZnNldFdpZHRoIiwib2Zmc2V0SGVpZ2h0IiwibWluIiwiQXVkaW9DaGFpbiIsImJ1ZmZlciIsInpvIiwibG9vcFN0YXJ0IiwibG9vcEVuZCIsInFvIiwic3RhcnRUaW1lIiwiS28iLCJzb3VyY2UiLCJHbyIsIl9yZWYyNyIsIl9jYWxsZWUyNyIsIl9jb250ZXh0MjciLCJkdXJhdGlvbiIsImNyZWF0ZUJ1ZmZlclNvdXJjZSIsImxvb3AiLCJzdGFydCIsIl9yZWYyOCIsIl9jYWxsZWUyOCIsIl9jb250ZXh0MjgiLCJfcmVmMjkiLCJfY2FsbGVlMjkiLCJfY29udGV4dDI5IiwiU291bmRNYW5hZ2VyIiwiX3RoaXMzOCIsIlFvIiwiQXVkaW9Db250ZXh0Iiwib25zdGF0ZWNoYW5nZSIsIllvIiwiX3RoaXMzOSIsImVhIiwidGEiLCJuYSIsInNhIiwiYXJyYXlCdWZmZXIiLCJkZWNvZGVBdWRpb0RhdGEiLCJtdXRlZCIsInZvbHVtZSIsImlhIiwiX3JlZjMwIiwiX2NhbGxlZTMwIiwiX2NvbnRleHQzMCIsInJlc3VtZSIsIl9yZWYzMSIsIl9jYWxsZWUzMSIsIl9lMjIiLCJfbjI4IiwiX3RoaXM0MCIsIl9jb250ZXh0MzEiLCJjcmVhdGVHYWluIiwiZ2FpbiIsImNvbm5lY3QiLCJkZXN0aW5hdGlvbiIsIlhvIiwiJG8iLCJfcmVmMzIiLCJfY2FsbGVlMzIiLCJfY29udGV4dDMyIiwiaGlkZGVuIiwiX3QzMyIsInJhIiwib2EiLCJDb2RlIiwiYWEiLCJsYSIsIkNvZGVTaXRlIiwiX24yOSIsIl9zNyIsImNhY2hhYmxlIiwiX2k4IiwiaGEiLCJjYSIsInN1Y2Nlc3NNZXNzYWdlIiwiQ29udGFjdFNpdGUiLCJkYSIsIl90aGlzNDMiLCJXb3JkUm90YXRvckJhc2VTaXRlIiwiVGVtcGxhdGVDb250YWluZXIiLCJtYSIsInBhIiwiZ2EiLCJmYSIsIlNlZ21lbnQiLCJyb3RhdGlvbiIsIlRhIiwiX3JlZjMzIiwiX2NhbGxlZTMzIiwiX2NvbnRleHQzMyIsIkxlYWZTZWdtZW50IiwiX3RoaXM0NSIsIkJhIiwiRGEiLCJQYXJlbnRTZWdtZW50IiwiX3RoaXM0NiIsImNoaWxkcmVuIiwiTmEiLCJXYSIsIk9hIiwiX2EiLCJqYSIsImNoYW5nZWRUb3VjaGVzIiwiZWxlbWVudEZyb21Qb2ludCIsInBhZ2VYIiwicGFnZVkiLCJ4IiwieSIsInRhcmdldFRvdWNoZXMiLCJJYSIsInN0b3BQcm9wYWdhdGlvbiIsIlZhIiwicm90YXRlIiwiVWEiLCJKYSIsIl9zOCIsIkFhIiwiemEiLCJfcmVmMzQiLCJfY2FsbGVlMzQiLCJfbjMwIiwiX3M5IiwiX2k5IiwiX3QzNCIsIl9lMjMiLCJfdGhpczQ3IiwiX2NvbnRleHQzNCIsImFicyIsIkxhIiwicWEiLCJLYSIsIl9lMjQiLCJ2YSIsIl9lMjUiLCJfbjMxIiwiQ2EiLCJfZTI2IiwiX24zMiIsImthIiwiX2UyNyIsIl9uMzMiLCJ5YSIsIl9lMjgiLCJfbjM0IiwiRmEiLCJfdDM1IiwiX2UyOSIsImJhIiwiX2UzMCIsIl9uMzUiLCJYYSIsIlBhIiwiJGEiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiX3QzNiIsIl9uMzYiLCJ4YSIsIlJhIiwiTGV2ZWwiLCJRYSIsIndvcmRzIiwiWWEiLCJaYSIsInRsIiwiZWwiLCJubCIsInNsIiwicm90YXRpb25zIiwibG9ja3MiLCJfZTMxIiwiX24zNyIsInRvVXBwZXJDYXNlIiwiX2UzMiIsImlsIiwicGwiLCJfbjM4IiwiX3MxMCIsIl9pMTAiLCJSb3dTZWdtZW50IiwiX3RoaXM0OCIsIl9lMzMiLCJfbjM5IiwiX2UzNCIsIl9uNDAiLCJfZTM1IiwiX240MSIsIl9lMzYiLCJfbjQyIiwiX2UzNyIsIl9uNDMiLCJSb3dMZXZlbCIsIl90aGlzNDkiLCJTbCIsImZsIiwiU2EiLCJfZTM4IiwiX240NCIsIk1hIiwiX3MxMSIsIl9pMTEiLCJfaTEyIiwid2EiLCJhbCIsIlNpbXBsZUxldmVsIiwiUm93TGV2ZWw4IiwiUm93TGV2ZWwxMCIsIlRyaWFuZ2xlU2VnbWVudCIsIlNpeFdvcmRzUm93TGV2ZWwiLCJfdGhpczU0IiwiX2UzOSIsIl9uNDUiLCJfczEyIiwiX2kxMyIsIkhhIiwiX3QzNyIsIl90MzgiLCJTaXhXb3Jkc1Jvd0xldmVsOCIsIlNpeFdvcmRzUm93TGV2ZWwxMiIsIkZvdXJXb3Jkc0xldmVsIiwiX3RoaXM1NyIsIl9lNDAiLCJfbjQ2IiwiX3MxMyIsIl9pMTQiLCJGb3VyV29yZHNMZXZlbDgiLCJGb3VyV29yZHNMZXZlbDEyIiwiTGV2ZWxIZWxwZXIiLCJ0eXBlcyIsInJlbmRlcmVyVHlwZSIsImxsIiwib2wiLCJfZTQxIiwiX240NyIsImhsIiwiMjAiLCI0MCIsIjYwIiwiMTAwIiwiMTIwIiwiMTQwIiwiMTYwIiwiV29yZFJvdGF0b3JEYiIsInZsIiwieWwiLCJfcmVmMzUiLCJfY2FsbGVlMzUiLCJfY29udGV4dDM1Iiwid2kiLCJfcmVmMzYiLCJfY2FsbGVlMzYiLCJfY29udGV4dDM2IiwiX3JlZjM3IiwiX2NhbGxlZTM3IiwiX28yIiwiX2NvbnRleHQzNyIsImxvd2VyQm91bmQiLCJNaSIsImRpZmZpY3VsdHkiLCJkZWxldGVkIiwicGxheWVkIiwicmFuZG9tIiwiX3JlZjM4IiwiX2NhbGxlZTM4IiwiX2NvbnRleHQzOCIsIlRsIiwiU2kiLCJFbmRTaXRlIiwidXBkYXRlIiwiTGV2ZWxTaXRlIiwiRiIsIkFsIiwiQ2wiLCJrbCIsIkZsIiwieGwiLCJCbCIsIkRsIiwiX3JlZjM5IiwiX2NhbGxlZTM5IiwiX3RoaXM2MyIsIl9jb250ZXh0MzkiLCJSbCIsIkpvIiwicGFyZW50RWxlbWVudCIsIklsIiwiVWwiLCJFbCIsIldsIiwiTmwiLCJPbCIsIl9sIiwiamwiLCJWbCIsIkpsIiwiX3JlZjQwIiwiX2NhbGxlZTQwIiwiX2U0MiIsIl9uNDgiLCJfczE0IiwiX2kxNSIsIl9vMyIsIl9jb250ZXh0NDAiLCJIbCIsInVsIiwiemwiLCJkbCIsInJsIiwiY2wiLCJsZXZlbCIsInFsIiwiX3JlZjQxIiwiX2NhbGxlZTQxIiwiX2U0MyIsIl9uNDkiLCJfczE1IiwiX2kxNiIsIl9jb250ZXh0NDEiLCJMbCIsIktsIiwiayIsImNsZWFyVGltZW91dCIsIl9yZWY0MiIsIl9jYWxsZWU0MyIsIl90aGlzNjQiLCJfY29udGV4dDQzIiwiX2NhbGxlZTQyIiwiX2xvb3A4IiwiX3QzOSIsIl9jb250ZXh0NDIiLCJibCIsInJlbW92ZUl0ZW0iLCJ0cmFuc2l0aW9uIiwicGxheSIsIl9uNTAiLCJtbCIsIl9zMTYiLCJFYSIsIl9yZWY0MyIsIl9jYWxsZWU0NCIsIl9lNDQiLCJfdDQwIiwiX3Q0MSIsIl90NDIiLCJfZTQ1IiwiX241MSIsIl9zMTciLCJfdDQzIiwiX2U0NiIsIl9uNTIiLCJfczE4IiwiX2kxNyIsIl90aGlzNjUiLCJfY29udGV4dDQ0IiwiWGwiLCJHbCIsImdsIiwiJGwiLCJRbCIsInQyIiwiTWFpbk1lbnVMZXZlbCIsIlNoYXJlRGlhbG9nIiwiX3RoaXM2NyIsIldpIiwiaG9zdG5hbWUiLCJNZW51U2l0ZSIsIl90aGlzNjgiLCJZbCIsIlpsIiwibGlzdGVuZXIiLCJfdGhpczY5IiwidGgiLCJlaCIsIl90NDQiLCJfY2FsbGVlNDUiLCJfY29udGV4dDQ1IiwiX3JlZjQ1IiwiX2NhbGxlZTQ3IiwiX3RoaXM3MCIsIl9jb250ZXh0NDciLCJyYWNlIiwiX3JlZjQ2IiwiX2NhbGxlZTQ2IiwiX2NvbnRleHQ0NiIsIl9yZWY0NyIsIl9jYWxsZWU0OCIsIl90aGlzNzEiLCJfY29udGV4dDQ4IiwiX3JlZjQ4IiwiX2NhbGxlZTQ5IiwiX3IyIiwiX280IiwiX2xvb3A5IiwiX3Q0NSIsIl9uNTMiLCJfY29udGV4dDQ5IiwiY3VycmVudFJ1biIsImRhdGVMYXN0U3luYyIsImN1cnJlbnRTeW5jRGF0ZSIsIm1heFJ1bnMiLCJsZXZlbHMiLCJQbCIsIlByaXZhY3lQb2xpY3lTaXRlIiwiQ3JlZGl0c1NpdGUiLCJDaG9vc2VUaGVtZURpYWxvZyIsIl90aGlzNzQiLCJfbG9vcDEwIiwiX3Q0NiIsInRoZW1lIiwiSW1wcmVzc3VtU2l0ZSIsIldvcmRSb3RhdG9yU2V0dGluZ0ZyYWdtZW50IiwiX3RoaXM3NyIsIl9jYWxsZWU1MCIsIl9jb250ZXh0NTAiLCJQaSIsImluY2x1ZGVzIiwiRm8iLCJTZWxlY3RXb3Jkc1NpdGUiLCJfcmVmNTAiLCJfY2FsbGVlNTEiLCJfY29udGV4dDUxIiwibmgiLCJ3b3Jkc1RvQ2hlY2siLCJfdGhpczc5Iiwid29yZHNOb3RDaGVja2VkIiwid29yZHNDaGVja2VkIiwid29yZHNVbnN1cmUiLCJ3b3Jkc0RlbGV0ZWQiLCJ3b3Jkc05vdFVzZWQiLCJfbG9vcDExIiwiX3MxOSIsInNoIiwiX2NhbGxlZTUyIiwiX2NvbnRleHQ1MiIsIndvcmRJZCIsIl9jYWxsZWU1MyIsIl9jb250ZXh0NTMiLCJfY2FsbGVlNTQiLCJfY29udGV4dDU0Iiwid29yZCIsIkRlbGV0ZVdvcmRzU2l0ZSIsIl9yZWY1NCIsIl9jYWxsZWU1NSIsIl9jb250ZXh0NTUiLCJfdGhpczgxIiwiX3MyMCIsIl9pMTgiLCJfbG9vcDEyIiwiX2U0NyIsIl9jYWxsZWU1NiIsIl9jb250ZXh0NTYiLCJsZXZlbElkIiwiYmFzZVBhdGgiLCJfbjE4IiwiaXNBY3RpdmVDbG9uZSIsInJlbW92ZUNoaWxkIiwiSFRNTEVsZW1lbnQiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJyZXBsYWNlQ2hpbGQiLCJtYXRjaGVzU2VsZWN0b3IiLCJ3ZWJraXRNYXRjaGVzU2VsZWN0b3IiLCJJREJPYmplY3RTdG9yZSIsIlhNTEh0dHBSZXF1ZXN0IiwiemkiLCJBY3RpdmVYT2JqZWN0IiwicmVzcG9uc2VUZXh0IiwicmVzcG9uc2VUeXBlIiwicmVzcG9uc2UiLCJFZSIsInBhdXNlIiwiZW8iLCJfY2FsbGVlNTciLCJfY29udGV4dDU3IiwiYXBwbHlBbmRyb2lkQnJpZGdlIl0sIm1hcHBpbmdzIjoiQ0FPQyxTQUFVQSxHQUNULGFBRUEsSUFFSUMsRUFGQUMsRUFBS0MsT0FBT0MsVUFDWkMsRUFBU0gsRUFBR0ksZUFFWkMsRUFBNEIsbUJBQVhDLE9BQXdCQSxVQUN6Q0MsRUFBaUJGLEVBQVFHLFVBQVksYUFDckNDLEVBQXNCSixFQUFRSyxlQUFpQixrQkFDL0NDLEVBQW9CTixFQUFRTyxhQUFlLGdCQUUzQ0MsRUFBNkIsaUJBQVhDLE9BQ2xCQyxFQUFVakIsRUFBT2tCLG1CQUNyQixHQUFJRCxFQUNFRixJQUdGQyxPQUFPRyxRQUFVRixPQUpyQixFQWFBQSxFQUFVakIsRUFBT2tCLG1CQUFxQkgsRUFBV0MsT0FBT0cs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 \ No newline at end of file +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; + }; + } + + /** @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); + } + this.close(); + return true; + } + } + return false; + } + + toggle() + { + if (this.isOpen) + { + this.close(); + } + else + { + this.open(); + } + } + + 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) { + try { + db.deleteObjectStore("currentLang"); + db.deleteObjectStore("translations"); + } + 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); + }); + } + + 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); + }); + } + + 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 {}; + }); + } + + 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); + } + }); + }; + + 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]; + } + 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); + } + } + }, shouldLoadImg); + } +} + +class ShareManager { + static init() { + ShareManager.shareButtons = []; + } + + static addShareButton(shareButton) { + ShareManager.shareButtons.push(shareButton); + } + + static generateDefaultShareElement(shareUrl) { + return ShareManager.generateShareElement(shareUrl, ShareManager.getDefaultGenerateCallback()); + } + + static generateDefaultShareElementForButtons(shareUrl, buttons) { + return ShareManager.generateShareElementForButtons(shareUrl, buttons, ShareManager.getDefaultGenerateCallback()); + } + + 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); + }; + shareButtonElement.appendChild(elem); + } + } + return shareButtonElement; + } + + 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; + } + } + + 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; + } + } +} + +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) { + try { + request = new ActiveXObject('Microsoft.XMLHTTP'); + } + 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); + }); + listNameElem.appendChild(liElement); + + if (Helper.isNull(this.active)) { + this.setActive(k); + } + } + } + } + + static addSettingsFragment(name, settingsFragment) { + SettingsSite.settingsFragments[name] = settingsFragment; + } + + static setAddSettingsSite(addLink) { + SettingsSite.shouldAddSettingsSite = addLink; + } + + static setTemplate(template) { + SettingsSite.template = template; + } +} + +SettingsSite.template = 'core/html/settings.html'; +SettingsSite.settingsFragments = {}; +SettingsSite.shouldAddSettingsSite = true; +SettingsSite.settingsAction = null; +SettingsSite.shouldAddSettingsAction = true; + +InitPromise.addPromise(function (app) { + if (SettingsSite.shouldAddSettingsSite) { + app.addDeepLink("settings", SettingsSite); + + 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; + } + 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"]); + } + }) + ]).then(function () { + return res; + }); + } + + 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; + } + + let removingTable = null; + let addingTable = null; + if (res["result"]["hasRole"]) { + removingTable = availableRolesTable; + addingTable = userRolesTable; + } + 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 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"]; + } + 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); + } + 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; + } + 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; + } + + setBuffer(buffer) { + this.buffer = buffer; + } + + setLooping(shouldLoop, loopStart, loopEnd) { + this.shouldLoop = shouldLoop; + + if (Helper.isNotNull(loopStart)) { + this.loopStart = loopStart; + } + if (Helper.isNotNull(loopEnd)) { + this.loopEnd = loopEnd; + } + } + + 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; + } + if (Helper.isNotNull(this.loopEnd)) { + source.loopEnd = this.loopEnd; + } + source.buffer = this.buffer; + await this.chainFunction(source); + + if (Helper.isNull(duration)){ + source.start(delay, offset); + } + else{ + source.start(delay, offset, duration); + } + this.startTime = (new Date()).getTime() - (Helper.nonNull(offset, 0) * 1000); + this.source = source; + this.running = true; + } + + 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 null; + } + + async resume() { + + if (!this.running) { + return this.start(null, Helper.nonNull(this.pauseTime, 0) / 1000.0); + } + } +} + +class SoundManager { + static getInstance() { + if (Helper.isNull(SoundManager.instance)) { + SoundManager.instance = new SoundManager(); + } + 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}; + } + + 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); + } + 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); + } + + return this.channels[channel]; + } + + async resumeContext(){ + if (typeof this.context.resume === "function") { + return this.context.resume(); + } + } + + 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 + }; + } + 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(); + } + 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(); + } + } + + 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(); + } + } + } + + 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(); + } + } + } + + handleVisibilityChange() { + if (document.hidden) { + this.stopAll(); + } + else { + this.resumeAllIfNotMuted(); + } + } +} + +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 + }; + } + 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(); + }); + } + } +} + +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(); + } + } + + 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); + } + } + + 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; + } + } + } + + 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; + } + } + + sameAs(otherSegment) { + if (!(otherSegment instanceof ParentSegment) || otherSegment.children.length !== this.children.length) { + return false; + } + for (let i = 0; i < this.children.length; i++) { + if (!this.children[i].sameAs(otherSegment.children[i])) { + return false; + } + } + return true; + } + + applyRotations(rotations) { + this.rotation = rotations[0]; + + if (isNaN(this.rotation)) { + this.rotation = 0; + } + + 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); + }); + + 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); + }) + }); + } + + 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; + } + } + } + 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; + } + } + } + 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; + } + } + } + } +} +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); + } + + 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; + } + } + } + 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 + })); + if (!res["success"]) { + if (await db.loadNextLevel(LevelSite.RENDERER_TYPES) === null) { + FlashMessenger.addMessage("sync-error", null, 6000); + } + newLastSync = null; + break; + } + res = res["result"]; + newLastSync = Helper.nonNull(newLastSync, res["currentSyncDate"]); + maxRuns = res["maxRuns"]; + + 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; + })); + } + } + 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); + } + } +} + +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(); + }); + themeTemplateContainer.appendChild(themeElem); + } + + 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); + } + }); + + this.findBy("#track-switch").addEventListener("change", function (e) { + Matomo.setTrack(this.checked === true); + e.stopPropagation(); + e.preventDefault(); + }); + + 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); + }); + + 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"); + } + }); + }); + installButton.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); + } + wordContainer.appendChild(wordElem); + } + } +} + +InitPromise.addPromise(app => { + app.addDefaultAction(new UserAction("delete-levels", () => { + app.startSite(DeleteWordsSite); + },null, null, "admin")); +}); + +let basePath = "/pwa/wordRotator/public/"; +if (window.location.pathname.indexOf("publicTest/") >= 0) +{ + basePath = "/pwa/wordRotator/publicTest/"; +} + +SystemSettings.setBasePath(basePath); +Translator.supportedLanguages = ["de"]; +Translator.markTranslations = false; + +Matomo.SIDE_ID = "2"; + +window.onerror = (e, u, l) => { + console.error(e, u, l); +}; + +applyPolyfills(); + +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")); + +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')); + +let app$1 = new App(); + +AndroidBridge.addDefinition(() => { + window["app"] = app$1; + window["app"]["pause"] = app$1.pause; + window["app"]["resume"] = app$1.resume; + window["app"]["setAppEndListener"] = app$1.setAppEndListener; +}); + +SettingsSite.setTemplate("html/application/setting-template.html"); +// SettingsSite.shouldAddSettingsAction = false; + +RegistrationSite.addAction = false; +LoginSite.addLoginAction = false; + +InitPromise.resolve(app$1).then(async function () { + SettingsSite.settingsAction.showFor = MenuAction.SHOW_ALWAYS; + + let settingsManager = SettingsManager.getInstance(); + + 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)); + + app$1.start(MenuSite); + Translator.setLanguage("de"); + + InstallManager.setCanInstallListener(e => { + }); + + window["applyAndroidBridge"] = AndroidBridge.applyDefinitions; +}); diff --git a/src/js/init.js b/src/js/init.js index a0b262b..9d40190 100755 --- a/src/js/init.js +++ b/src/js/init.js @@ -55,10 +55,9 @@ AndroidBridge.addDefinition(() => { window["app"] = app; window["app"]["pause"] = app.pause; window["app"]["resume"] = app.resume; - // window["app"]["refreshCurrentSite"] = app.refreshCurrentSite; + window["app"]["setAppEndListener"] = app.setAppEndListener; }); - SettingsSite.setTemplate("html/application/setting-template.html"); // SettingsSite.shouldAddSettingsAction = false; diff --git a/src/js/lib/pwa-assets.js b/src/js/lib/pwa-assets.js index fdb7a06..6302819 100755 --- a/src/js/lib/pwa-assets.js +++ b/src/js/lib/pwa-assets.js @@ -1,4 +1,4 @@ -import { Helper, InitPromise, MultipleShareButton, AndroidBridge, Fragment, Translator } from './pwa-lib.js'; +import { Helper, InitPromise, MultipleShareButton, AndroidBridge, PauseSite, Fragment, Translator } from './pwa-lib.js'; class DelayPromise extends Promise { static async delay(delay) { @@ -323,7 +323,8 @@ class AudioChain { //sind sonst null, schmeißt in Android 5 einen fehler delay = Helper.nonNull(delay, 0); offset = Helper.nonNull(offset, 0); - duration = Helper.nonNull(duration, this.buffer.duration); + //Duration darf nicht gesetzt werden + // duration = Helper.nonNull(duration, -1); let source = this.context.createBufferSource(); @@ -337,7 +338,12 @@ class AudioChain { source.buffer = this.buffer; await this.chainFunction(source); - source.start(delay, offset, duration); + if (Helper.isNull(duration)){ + source.start(delay, offset); + } + else{ + source.start(delay, offset, duration); + } this.startTime = (new Date()).getTime() - (Helper.nonNull(offset, 0) * 1000); this.source = source; this.running = true; @@ -418,14 +424,14 @@ class SoundManager { return this.channels[channel]; } - async resume(){ + async resumeContext(){ if (typeof this.context.resume === "function") { return this.context.resume(); } } async play(channel, audioOrOptions) { - this.resume(); + this.resumeContext(); channel = Helper.nonNull(channel, SoundManager.CHANNELS.DEFAULT); if (Helper.isNull(audioOrOptions)) { audioOrOptions = {}; @@ -477,25 +483,33 @@ class SoundManager { async resume(channel) { channel = Helper.nonNull(channel, SoundManager.CHANNELS.DEFAULT); - if (!this.channels[channel].muted && Helper.isNotNull(this.channels[channel].source)) { + 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(); + } + } + } + + 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(); + } + } + } + handleVisibilityChange() { if (document.hidden) { - for (let k in this.channels) { - if (Helper.isNotNull(this.channels[k].source)) { - this.channels[k].source.stop(); - } - } + this.stopAll(); } else { - for (let k in this.channels) { - if (!this.channels[k].muted && Helper.isNotNull(this.channels[k].source)) { - this.channels[k].source.resume(); - } - } + this.resumeAllIfNotMuted(); } } } @@ -506,6 +520,21 @@ SoundManager.CHANNELS = { DEFAULT: "default" }; +InitPromise.addPromise(() => { + PauseSite.onPauseListeners.push(() => { + SoundManager.getInstance().stopAll(); + }); + PauseSite.onStartListeners.push(() => { + SoundManager.getInstance().resumeAllIfNotMuted(); + }); +}); + +// AndroidBridge.addDefinition(() => { + // window["soundManagerInstance"] = SoundManager.getInstance(); + // window["soundManagerInstance"]["stopAll"] = window["soundManagerInstance"].stopAll; + // window["soundManagerInstance"]["resumeAllIfNotMuted"] = window["soundManagerInstance"].resumeAllIfNotMuted; +// }); + class TabbedFragment extends Fragment { constructor(site) { super(site, 'pwaAssets/html/fragment/tabbedFragment.html'); diff --git a/src/js/lib/pwa-lib.js b/src/js/lib/pwa-lib.js index 82a46e6..6cff053 100755 --- a/src/js/lib/pwa-lib.js +++ b/src/js/lib/pwa-lib.js @@ -2025,7 +2025,7 @@ class SiteContainer { } class SiteManager { - constructor(siteDivId, actionBarMenuSelector) { + constructor(siteDivId, actionBarMenuSelector, app) { this.siteDiv = document.getElementById(siteDivId); this.siteContainerStack = []; this.currentSiteContainerToShow = null; @@ -2034,6 +2034,7 @@ class SiteManager { this.siteStartingPromise = Promise.resolve(); this.defaultActions = []; this.startSiteName = null; + this.app = app; this.titleElement = document.querySelector(".top-bar-title"); @@ -2140,7 +2141,8 @@ class SiteManager { if (newSiteContainerIndex < 0) { manager.showAppEndedMessage(); - manager.startSite(manager.startSiteName); + app.endApp(); + // manager.startSite(manager.startSiteName); return; } manager.siteDiv.removeAllChildren().appendChild(Helper.createLoadingSymbol()); @@ -2292,8 +2294,31 @@ class PauseSite extends AbstractSite { 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; @@ -2305,6 +2330,9 @@ class App { this._addThemeAction = false; this._showCookieCompliance = true; this._startSite = null; + this._appEndListener = () => { + return this.startSite(this._startSite); + }; } getSiteManager() @@ -2450,6 +2478,16 @@ class App { 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); } diff --git a/src/module/Application/pwa/js/WordRotatorDb.js b/src/module/Application/pwa/js/WordRotatorDb.js index 18bcef7..50114ec 100755 --- a/src/module/Application/pwa/js/WordRotatorDb.js +++ b/src/module/Application/pwa/js/WordRotatorDb.js @@ -39,14 +39,10 @@ export class WordRotatorDb extends MyDb { } async loadNextLevel(rendererTypes) { - console.log("loadNextLevel 1", IDBKeyRange.lowerBound(0)); let levels = await this.loadAll(WordRotatorDb.OBJECT_STORE.LEVEL); levels = levels.sort((a,b) => { return (a["difficulty"] - b["difficulty"]); }); - // const levels = await this.loadMany("difficulty", IDBKeyRange.lowerBound(0), WordRotatorDb.OBJECT_STORE.LEVEL); - // const levels = await this.loadMany("difficulty", null, WordRotatorDb.OBJECT_STORE.LEVEL); - console.log("loadNextLevel 2"); let wrongLevels = []; let newLevels = []; diff --git a/src/module/Application/pwa/js/site/LevelSite.js b/src/module/Application/pwa/js/site/LevelSite.js index 9117442..5a57160 100755 --- a/src/module/Application/pwa/js/site/LevelSite.js +++ b/src/module/Application/pwa/js/site/LevelSite.js @@ -150,9 +150,7 @@ export class LevelSite extends WordRotatorBaseSite { this.wonText.style.fontSize = "0"; const db = WordRotatorDb.getInstance(); - console.log("nextLevel 2"); const nextLevelJson = await db.loadNextLevel(LevelSite.RENDERER_TYPES); - console.log("nextLevel 3"); if (nextLevelJson === null) { this.startSite(EndSite); diff --git a/src/module/Application/pwa/js/site/MenuSite.js b/src/module/Application/pwa/js/site/MenuSite.js index b7b6411..57c795d 100644 --- a/src/module/Application/pwa/js/site/MenuSite.js +++ b/src/module/Application/pwa/js/site/MenuSite.js @@ -97,7 +97,7 @@ export class MenuSite extends WordRotatorBaseSite { } async startLevelSite() { - SoundManager.getInstance().resume(); + 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); diff --git a/test/test.testcafe.js b/test/test.testcafe.js index 26a1e39..507aca0 100644 --- a/test/test.testcafe.js +++ b/test/test.testcafe.js @@ -2,7 +2,7 @@ import {Selector} from 'testcafe'; import {ClientFunction} from 'testcafe'; let isLocal = true; -let isMobile = false; +let isMobile = true; const checkMatrix = async (matrixStringSelector, shouldValues, timeout) => { let delta = 0.0001;