"use strict";function onjQueryLoaded(){ftui.init(),$(".menu").on("click",function(){$(".menu").toggleClass("show")}),$(window).on("beforeunload",function(){ftui.log(5,"beforeunload"),ftui.setOffline()}),$(window).on("online offline",function(){ftui.log(5,"online offline"),navigator.onLine?ftui.setOnline():ftui.setOffline()}),window.onerror=function(t,e,i,o,n){var a=e.split("/").pop();return ftui.toast([a+":"+i,n].join("
"),"error"),!1},$.fn.once=function(t,e){return this.each(function(){$(this).off(t).on(t,e)})},$.fn.widgetId=function(){return["ftui",$(this).data("type"),$(this).data("device").replace(" ","default"),$(this).data("get"),$(this).index()].join("_")},$.fn.uuid=function(){if(!$(this).isValidData("uuid")){var t="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(t){var e=16*Math.random()|0,i="x"==t?e:3&e|8;return i.toString(16)});$(this).attr("data-uuid",t)}return $(this).data("uuid")},$.fn.filterData=function(t,e){return this.filter(function(){return $(this).data(t)==e})},$.fn.filterDeviceReading=function(t,e,i){return this.filter(function(){var o=$(this),n=o.data(t);return String(n)===i&&String(o.data("device"))===e||n===e+":"+i||n==="["+e+":"+i+"]"||$.inArray(i,n)>-1&&String(o.data("device"))===e||$.inArray(e+":"+i,n)>-1})},$.fn.isValidData=function(t){return"undefined"!=typeof $(this).data(t)},$.fn.initData=function(t,e){var i=$(this);return i.data(t,i.isValidData(t)?i.data(t):e),i},$.fn.mappedColor=function(t){return ftui.getStyle("."+$(this).data(t),"color")||$(this).data(t)},$.fn.matchingState=function(t,e){if(!ftui.isValid(e))return"";var s,l,f,u,i=$(this),o=String(ftui.getPart(e,i.data(t+"-part"))),n=i.data(t+"-on"),a=i.data(t+"-off"),r=String(n);r.match(/:/)&&(s=r.split(":"),l=s[0].replace("[",""),f=s[1].replace("]",""),u=ftui.getDeviceParameter(l,f),u&&ftui.isValid(u)&&(r=u.val));var c=String(a);if(c.match(/:/)&&(s=c.split(":"),l=s[0].replace("[",""),f=s[1].replace("]",""),u=ftui.getDeviceParameter(l,f),u&&ftui.isValid(u)&&(c=u.val)),ftui.isValid(n)){if(o===r)return"on";if(o.match(new RegExp("^"+r+"$")))return"on"}if(ftui.isValid(a)){if(o===c)return"off";if(o.match(new RegExp("^"+c+"$")))return"off"}if(ftui.isValid(n)&&ftui.isValid(a)){if("!off"===r&&!o.match(new RegExp("^"+c+"$")))return"on";if("!on"===c&&!o.match(new RegExp("^"+r+"$")))return"off";if(r==="!"+c&&!o.match(new RegExp("^"+c+"$")))return"on";if(c==="!"+r&&!o.match(new RegExp("^"+r+"$")))return"off"}},$.fn.isDeviceReading=function(t){var e=$(this).data(t);return e&&!$.isNumeric(e)&&"string"==typeof e&&e.match(/:/)},$.fn.isExternData=function(t){var e=$(this).data(t);return e?e.match(/^[#\.\[][^:]*$/):""},$.fn.cleanWhitespace=function(){this.contents().filter(function(){return 3==this.nodeType&&!/\S/.test(this.nodeValue)}).remove();return this},$.fn.getReading=function(t,e){var i=String($(this).data("device")),o=$(this).data(t);if($.isArray(o)&&(o=o[e]),o=String(o),o&&o.match(/:/)){var n=o.split(":");i=n[0].replace("[",""),o=n[1].replace("]","")}if(i&&i.length>0){var a=ftui.deviceStates[i];return a&&a[o]?a[o]:{}}return{}},$.fn.valOfData=function(t){var e=$(this).data(t);return ftui.isValid(e)?e.toString().match(/^[#\.\[][^:]*$/)?$(e).data("value"):e:""},$.fn.transmitCommand=function(){if(!$(this).hasClass("notransmit")){var t=[$(this).valOfData("cmd"),$(this).valOfData("device")+$(this).valOfData("filter"),$(this).valOfData("set"),$(this).valOfData("value")].join(" ");ftui.setFhemStatus(t),ftui.toast(t)}}}if("function"==typeof Framework7){var f7={ftui:new Framework7({animateNavBackIcon:!0}),options:{dynamicNavbar:!0,domCache:!0},views:[]};Dom7(".view").each(function(t){var e=f7.ftui.addView("#"+Dom7(this)[0].id,{dynamicNavbar:!0});f7.ftui.views.push(e)}),f7.ftui.onPageInit("*",function(t){ftui.log(1,"f7: "+t.name+" initialized"),ftui.initWidgets('.page[data-page="'+t.name+'"]')})}var Modul_widget=function(){function update_lock(t,e){$.each(["lock","lock-on","lock-off"],function(i,o){me.elements.filterDeviceReading(o,t,e).each(function(t){var e=$(this),i=e.getReading("lock").val;"on"===e.matchingState("lock",i)&&e.addClass("lock"),"off"===e.matchingState("lock",i)&&e.removeClass("lock")})})}function update_hide(t,e){$.each(["hide","hide-on","hide-off"],function(i,o){me.elements.filterDeviceReading(o,t,e).each(function(t){var e=$(this),i=e.getReading("hide").val;"on"===e.matchingState("hide",i)&&(ftui.isValid(e.data("hideparents"))?e.parents(e.data("hideparents")).hide():e.hide()),"off"===e.matchingState("hide",i)&&(ftui.isValid(e.data("hideparents"))?e.parents(e.data("hideparents")).show():e.show())})})}function update_reachable(t,e){$.each(["reachable","reachable-on","reachable-off"],function(i,o){me.elements.filterDeviceReading(o,t,e).each(function(t){var e=$(this),i=e.getReading("reachable").val;"on"===e.matchingState("reachable",i)&&e.removeClass("unreachable"),"off"===e.matchingState("reachable",i)&&e.addClass("unreachable")})})}function substitution(value,subst){if(ftui.isValid(subst)&&ftui.isValid(value))if($.isArray(subst))for(var i=0,len=subst.length;len>i;i+=2)len>i+1&&(value=value.replace(new RegExp(String(subst[i]),"g"),String(subst[i+1])));else{if(subst.match(/^s/)){var f=subst.substr(1,1),sub=subst.split(f);return value?value.replace(new RegExp(sub[1],sub[3]),sub[2]):""}if(subst.match(/weekdayshort/))return ftui.dateFromString(value).ee();if(subst.match(/.*\(\)/))return eval("value."+subst)}return value}function fix(t,e){return $.isNumeric(t)&&e>=0?Number(t).toFixed(e):t}function map(t,e,i){if("object"==typeof t&&null!==t)for(var o in t)if(e===o||e.match(new RegExp("^"+o+"$")))return t[o];return i}function init_attr(t){t.initData("get","STATE"),t.initData("set",""),t.initData("cmd","set"),me.addReading(t,"get"),t.initData("reachable-on","!off"),t.initData("reachable-off","(false|0)"),me.addReading(t,"reachable"),t.isValidData("hide")&&t.initData("hide-on","(true|1|on)"),t.initData("hide","STATE"),t.isValidData("hide-on")&&t.initData("hide-off","!on"),me.addReading(t,"hide"),t.isValidData("lock")&&t.initData("lock-on","(true|1|on)"),t.initData("lock",t.data("get")),t.isValidData("lock-on")&&t.initData("lock-off","!on"),me.addReading(t,"lock")}function init_ui(t){t.text(me.widgetname)}function init(){ftui.log(1,"init widget: name="+me.widgetname+" area="+me.area),me.elements=$('[data-type="'+me.widgetname+'"]',me.area),me.elements.each(function(t){var e=$(this);me.init_attr(e),e=me.init_ui(e)})}function addReading(t,e){var i=t.data(e);if(ftui.isValid(i)&&($.isArray(i)||!i.toString().match(/^[#\.\[][^:]*$/))){var o=t.data("device");$.isArray(i)||(i=new Array(i.toString()));for(var n=i.length-1;n>=0;n-=1){var a=i[n];if(a.match(/:/)){var r=a.split(":");o=r[0].replace("[",""),a=r[1].replace("]","")}if(ftui.isValid(o)&&ftui.isValid(a)&&""!==o&&""!==a&&" "!==o&&" "!==a){o=o.toString();var s="STATE"===a?o:[o,a].join("-");subscriptions[s]={},subscriptions[s].device=o,subscriptions[s].reading=a}}}}function update(t,e){ftui.log(1,"warning: "+me.widgetname+" has not implemented update function")}var subscriptions={},elements=[],me={widgetname:"widget",area:"",init:init,init_attr:init_attr,init_ui:init_ui,update:update,update_lock:update_lock,update_reachable:update_reachable,update_hide:update_hide,substitution:substitution,fix:fix,map:map,addReading:addReading,subscriptions:subscriptions,elements:elements};return me},plugins={modules:[],addModule:function(t){this.modules.push(t)},removeArea:function(t){for(var e=this.modules.length-1;e>=0;e-=1)this.modules[e].area===t&&this.modules.splice(e,1)},updateParameters:function(){ftui.subscriptions={},ftui.subscriptionTs={},ftui.devs=[ftui.config.webDevice],ftui.reads=["STATE","longpoll"];for(var t=this.modules.length-1;t>=0;t-=1){var e=this.modules[t];for(var i in e.subscriptions){ftui.subscriptions[i]=e.subscriptions[i],ftui.subscriptionTs[i+"-ts"]=e.subscriptions[i];var o=ftui.subscriptions[i].device;ftui.devs.indexOf(o)<0&&ftui.devs.push(o);var n=ftui.subscriptions[i].reading;ftui.reads.indexOf(n)<0&&ftui.reads.push(n)}}var a=ftui.devs.length>0?$.map(ftui.devs,$.trim).join():".*",r=ftui.reads.length>0?$.map(ftui.reads,$.trim).join(" "):"";ftui.config.longPollFilter?ftui.poll.longPollFilter=ftui.config.longPollFilter:ftui.poll.longPollFilter=a+", "+r,ftui.config.shortPollFilter?ftui.poll.shortPollFilter=ftui.config.shortPollFilter:ftui.poll.shortPollFilter=a+" "+r,ftui.states.lastShortpoll=0},load:function(t,e){return ftui.log(1,"Load widget : "+t),ftui.loadPlugin(t,e)},update:function(t,e){$.each(this.modules,function(i,o){"object"==typeof o&&o.update(t,e)}),ftui.updateBindElements("ftui.deviceStates"),ftui.log(1,'call "plugins.update" done for "'+t+":"+e+'"')}},ftui={version:"2.6.32",config:{DEBUG:!1,DEMO:!1,ICONDEMO:!1,dir:"",filename:"",basedir:"",fhemDir:"",debuglevel:0,doLongPoll:!0,lang:"de",toastPosition:"bottom-left",shortpollInterval:0,styleCollection:{},stdColors:["green","orange","red","ligthblue","blue","gray","white","mint"]},poll:{currLine:0,xhr:null,longPollRequest:null,shortPollTimer:null,longPollTimer:null,lastUpdateTimestamp:new Date,lastEventTimestamp:new Date,lastShortpollTimestamp:new Date},states:{width:0,lastSetOnline:0,lastShortpoll:0,longPollRestart:!1},deviceStates:{},paramIdMap:{},timestampMap:{},subscriptions:{},subscriptionTs:{},gridster:{instances:{},instance:null,baseX:0,baseY:0,margins:5,mincols:0,cols:0,rows:0},init:function(){function o(){$.toast&&!$('link[href$="lib/jquery.toast.min.css"]').length&&$("head").append('')}ftui.hideWidgets(),ftui.paramIdMap={},ftui.timestampMap={},ftui.config.longPollType=$("meta[name='longpoll_type']").attr("content")||"websocket";var t=$("meta[name='longpoll']").attr("content")||"1";ftui.config.doLongPoll="0"!=t,ftui.config.shortPollFilter=$("meta[name='shortpoll_filter']").attr("content"),ftui.config.longPollFilter=$("meta[name='longpoll_filter']").attr("content"),ftui.config.DEMO="1"==$("meta[name='demo']").attr("content"),ftui.config.ICONDEMO="1"==$("meta[name='icondemo']").attr("content"),ftui.config.debuglevel=$("meta[name='debug']").attr("content")||0,ftui.config.webDevice=$("meta[name='web_device']").attr("content")||$.trim($("body").data("webname"))||"WEB",ftui.config.maxLongpollAge=$("meta[name='longpoll_maxage']").attr("content")||240,ftui.config.DEBUG=ftui.config.debuglevel>0,ftui.config.TOAST=$("meta[name='toast']").attr("content")||5,ftui.config.toastPosition=$("meta[name='toast_position']").attr("content")||"bottom-left",ftui.config.shortpollInterval=$("meta[name='shortpoll_only_interval']").attr("content")||30,ftui.config.shortPollDelay=$("meta[name='shortpoll_restart_delay']").attr("content")||3e3;var e=window.location.pathname;ftui.config.filename=e.substring(e.lastIndexOf("/")+1),ftui.log(1,"Filename: "+ftui.config.filename),ftui.config.fhemDir=$("meta[name='fhemweb_url']").attr("content")||location.origin+"/fhem/",ftui.config.fhemDir=ftui.config.fhemDir.replace("///","//"),ftui.log(1,"FHEM dir: "+ftui.config.fhemDir);var i=navigator.language||navigator.userLanguage;ftui.config.lang=$("meta[name='lang']").attr("content")||ftui.isValid(i)?i.split("-")[0]:"de",ftui.config.username=$("meta[name='username']").attr("content"),ftui.config.password=$("meta[name='password']").attr("content"),ftui.devs=[ftui.config.webDevice],ftui.reads=["STATE"],ftui.getCSrf(),$.fn.toast?o():ftui.dynamicload(ftui.config.basedir+"lib/jquery.toast.min.js",!1).done(function(){o()}),$(document).on("visibilitychange",function(){"hidden"===document.visibilityState||(ftui.log(1,"Page became visible again -> start healthCheck in 3 secondes "),setTimeout(function(){ftui.healthCheck()},3e3))});try{localStorage.setItem("ftui",ftui.version),localStorage.removeItem("ftui")}catch(n){ftui.toast("You are in Privacy Mode
Please deactivate Privacy Mode and then reload the page.","error")}var a=ftui.getAndroidVersion(),r=/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream,s=a&&parseFloat(a)<5||r;if(ftui.config.clickEventType=s?"touchstart":"touchstart mousedown",ftui.config.moveEventType=s?"touchmove":"touchmove mousemove",ftui.config.releaseEventType=s?"touchend":"touchend mouseup",ftui.config.leaveEventType=s?"touchleave":"touchleave mouseout",ftui.config.enterEventType=s?"touchenter":"touchenter mouseenter",$("
").prependTo("body").hide(),$("#shade").on(ftui.config.clickEventType,function(t){$(document).trigger("shadeClicked")}),ftui.readStatesLocal(),0!==$('link[href$="css/fhem-tablet-ui.css"]').length||0!==$('link[href$="css/fhem-tablet-ui.min.css"]').length||f7)ftui.loadStyleSchema(),ftui.initPage();else{var l=ftui.config.basedir+"css/fhem-tablet-ui.css";$.when($.get(l,function(){$("",{rel:"stylesheet",type:"text/css",href:l}).prependTo("head")})).then(function(){var t=0,e=setInterval(function(){ftui.log(1,"fhem-tablet-ui.css dynamically loaded. Waiting until it is ready to use..."),"center"===$("body").css("text-align")&&(ftui.log(1,"fhem-tablet-ui.css is ready to use."),clearInterval(e),ftui.loadStyleSchema(),ftui.initPage()),t++,t>120&&(clearInterval(e),ftui.toast("fhem-tablet-ui.css not ready to use","error"))},50)})}$(document).on("changedSelection",function(){$(".gridster li > header ~ .hbox:only-of-type, .gridster li > header ~ .center:not([data-type]):only-of-type, .card > header ~ div:not([data-type]):only-of-type, .gridster li header ~ div:first-of-type:nth-last-of-type(1)").each(function(t){var e=$(this).siblings("header").outerHeight();e>0&&$(this).css({height:"calc(100% - "+$(this).siblings("header").outerHeight()+"px)"})})}),$(document).on("initWidgetsDone",function(){ftui.startShortPollInterval(500),ftui.states.longPollRestart=!0,ftui.restartLongPoll(),ftui.initHeaderLinks(),$(document).trigger("changedSelection"),ftui.config.ICONDEMO||ftui.disableSelection()}),f7||$("*:not(select):not(textarea)").focus(function(){$(this).blur()}),setInterval(function(){ftui.healthCheck()},6e4)},initGridster:function(t){function e(){var e=-1,i=-1,o=0,n=0,a=0,r=0;$(".gridster > ul > li").each(function(){var t=$(this).data("col")+$(this).data("sizex")-1;t>e&&(e=t);var o=$(this).data("row")+$(this).data("sizey")-1;o>i&&(i=o)}),a=ftui.gridster.cols>0?ftui.gridster.cols:e,r=ftui.gridster.rows>0?ftui.gridster.rows:i;var s=2*a*ftui.gridster.margins,l=2*r*ftui.gridster.margins;o=ftui.gridster.baseX>0?ftui.gridster.baseX:(window.innerWidth-s)/a,n=ftui.gridster.baseY>0?ftui.gridster.baseY:(window.innerHeight-l)/r,o ul",t).gridster({widget_base_dimensions:[o,n],widget_margins:[ftui.gridster.margins,ftui.gridster.margins],draggable:{handle:".gridster li > header"},min_cols:parseInt(ftui.gridster.mincols)}).data("gridster"),ftui.gridster.instances[t]&&("1"==$("meta[name='gridster_disable']").attr("content")&&ftui.gridster.instances[t].disable(),"1"==$("meta[name='gridster_starthidden']").attr("content")&&$(".gridster").hide());var f=$(".gridster > ul > li:has(* .gridster)");f.length>0&&f.css({"background-color":"transparent",margin:"-"+ftui.gridster.margins+"px",width:f.parent().width()-f.position().left,height:"100%"}),$(".gridster > ul > li >.center",t).parent().addClass("has_center"),$(".gridster > ul > li > .vbox",t).parent().addClass("has_vbox")}ftui.gridster.minX=parseInt($("meta[name='widget_min_width'],meta[name='gridster_min_width']").attr("content")||0),ftui.gridster.minY=parseInt($("meta[name='widget_min_height'],meta[name='gridster_min_height']").attr("content")||0),ftui.gridster.baseX=parseInt($("meta[name='widget_base_width'],meta[name='gridster_base_width']").attr("content")||0),ftui.gridster.baseY=parseInt($("meta[name='widget_base_height'],meta[name='gridster_base_height']").attr("content")||0),ftui.gridster.cols=parseInt($("meta[name='gridster_cols']").attr("content")||0),ftui.gridster.rows=parseInt($("meta[name='gridster_rows']").attr("content")||0),ftui.gridster.resize=parseInt($("meta[name='gridster_resize']").attr("content")||ftui.gridster.baseX+ftui.gridster.baseY>0?0:1),$("meta[name='widget_margin'],meta[name='gridster_margin']").attr("content")&&(ftui.gridster.margins=parseInt($("meta[name='widget_margin'],meta[name='gridster_margin']").attr("content"))),$(".gridster").length>0&&($('link[href$="lib/jquery.gridster.min.css"]').length||$("head").append(''),$.fn.gridster?e():ftui.dynamicload(ftui.config.basedir+"lib/jquery.gridster.min.js",!1).done(function(){e()}),ftui.gridster.resize&&$(window).on("resize",function(){ftui.states.width!==window.innerWidth&&(clearTimeout(ftui.states.delayResize),ftui.states.delayResize=setTimeout(e,500),ftui.states.width=window.innerWidth)}))},initPage:function(t){ftui.hideWidgets(t),t=ftui.isValid(t)?t:"",console.time("initPage"),ftui.log(2,"initPage - area="+t),ftui.initGridster(t);var e=$.map($("[data-template]",t),function(t,e){var i=$(t);return $.get(i.data("template"),{},function(t){var e=i.data("parameter");for(var o in e)t=t.replace(new RegExp(o,"g"),e[o]);i.html(t)})});$.when.apply(this,e).then(function(){ftui.initWidgets(t),ftui.log(1,"init templates - Done")})},initWidgets:function(t){t=ftui.isValid(t)?t:"";var e=[];ftui.log(3,plugins),plugins.removeArea(t),ftui.log(3,plugins),ftui.log(2,"initWidgets - area="+t),$("[data-type]",t).each(function(t){var i=$(this).data("type");e.indexOf(i)<0&&e.push(i)});var i=$.map(e,function(e,i){return plugins.load(e,t)});$.when.apply(this,i).then(function(){plugins.updateParameters(),ftui.log(1,"initWidgets - Done"),console.timeEnd("initPage"),$(document).trigger("initWidgetsDone",[t])})},initHeaderLinks:function(){($("[class*=fa-]").length>0||$('[data-type="select"]').length>0||$('[data-type="homestatus"]').length>0)&&!$('link[href$="lib/font-awesome.min.css"]').length&&$("head").append(''),$("[class*=oa-]").length>0&&!$('link[href$="lib/openautomation.css"]').length&&$("head").append(''),$("[class*=fs-]").length>0&&!$('link[href$="lib/fhemSVG.css"]').length&&$("head").append(''),$("[class*=mi-]").length>0&&!$('link[href$="lib/material-icons.min.css"]').length&&$("head").append(''),$("[class*=wi-]").length>0&&!$('link[href$="lib/weather-icons.min.css"]').length&&$("head").append(''),$("[class*=wi-wind]").length>0&&!$('link[href$="lib/weather-icons-wind.min.css"]').length&&$("head").append('')},startLongpoll:function(){ftui.log(2,"startLongpoll: "+ftui.config.doLongPoll),ftui.poll.lastEventTimestamp=new Date,ftui.config.doLongPoll&&(ftui.config.shortpollInterval=$("meta[name='shortpoll_interval']").attr("content")||900,ftui.longPollTimer=setTimeout(function(){ftui.longPoll()},100))},stopLongpoll:function(){ftui.log(2,"stopLongpoll"),clearInterval(ftui.longPollTimer),ftui.longPollRequest&&ftui.longPollRequest.abort(),ftui.websocket&&(ftui.websocket.close(),ftui.websocket=void 0,ftui.log(2,"stopped websocket"))},restartLongPoll:function(t,e){ftui.log(2,"restartLongpoll");var i;clearTimeout(ftui.longPollTimer),t&&ftui.toast("Disconnected from FHEM
"+t,e),ftui.stopLongpoll(),ftui.states.longPollRestart?i=2e3:(ftui.toast("Retry to connect in 10 seconds"),i=1e4),ftui.longPollTimer=setTimeout(function(){ftui.startLongpoll()},i)},startShortPollInterval:function(t){ftui.log(1,"start shortpoll in (ms):"+(t||1e3*ftui.config.shortpollInterval)),clearInterval(ftui.shortPollTimer),ftui.shortPollTimer=setTimeout(function(){ftui.shortPoll(),ftui.startShortPollInterval()},t||1e3*ftui.config.shortpollInterval)},shortPoll:function(t){var e=(new Date).getTime()/1e3;if(!(e-ftui.states.lastShortpollo;o++){var a=ftui.deviceStates[ftui.devs[o]];for(var r in a)a[r].valid=!1}console.time("get jsonlist2"),ftui.shortPollRequest=ftui.sendFhemCommand("jsonlist2 "+ftui.poll.shortPollFilter).done(function(o){function n(t,e){for(var i in e){var o=!1,n="STATE"===i?t:[t,i].join("-"),a=e[i];if("object"!=typeof a&&(a={Value:a,Time:""}),ftui.subscriptions[n]){var r=ftui.getDeviceParameter(t,i);o=!r||r.val!==a.Value||r.date!==a.Time}var s=ftui.deviceStates[t]||{},l=s[i]||{};l.date=a.Time,l.val=a.Value,l.valid=!0,s[i]=l,ftui.deviceStates[t]=s,ftui.paramIdMap[n]={},ftui.paramIdMap[n].device=t,ftui.paramIdMap[n].reading=i,ftui.timestampMap[n+"-ts"]={},ftui.timestampMap[n+"-ts"].device=t,ftui.timestampMap[n+"-ts"].reading=i,o&&(ftui.log(5,"[shortPoll] do update for "+t+","+i),plugins.update(t,i))}}if(console.timeEnd("get jsonlist2"),console.time("read jsonlist2"),ftui.log(3,"fhemJSON: 0="+Object.keys(o)[0]+" 1="+Object.keys(o)[1]),o&&o.Results){var a=o.Results.length;ftui.log(2,"shortpoll: fhemJSON.Results.length="+a);for(var r=o.Results,s=a-1;s>=0;s-=1){var l=r[s],f=l.Name;f.indexOf("FHEMWEB")<0&&f.indexOf("WEB_")<0&&(n(f,l.Internals),n(f,l.Attributes),n(f,l.Readings))}var u=ftui.diffSeconds(i,new Date);if(ftui.config.DEBUG){var c=Object.keys(ftui.paramIdMap).length;ftui.toast("Full refresh done in "+u+"s for "+c+" parameter(s)")}ftui.log(1,"shortPoll - Done"),ftui.states.lastShortpoll=e,ftui.poll.lastShortpollTimestamp=new Date,ftui.saveStatesLocal(),ftui.updateBindElements("ftui."),t||ftui.onUpdateDone()}else ftui.log(1,"shortPoll request failed: Result is null"),ftui.toast("ShortPoll Request Failed: : Result is null
","error");console.timeEnd("read jsonlist2")}).fail(function(t,e,i){var o=e+", "+i;ftui.log(1,"shortPoll request failed: "+o),ftui.states.lastSetOnline=0,ftui.states.lastShortpoll=0,e.indexOf("parsererror")<0?(ftui.toast("ShortPoll Request Failed, will retry in "+ftui.config.shortPollDelay/1e3+"s
"+o,"error"),ftui.getCSrf(),ftui.startShortPollInterval(3e3)):ftui.toast("ShortPoll Request Failed
"+o,"error")})}},longPoll:function(){if(ftui.config.DEMO)return void console.log("DEMO-Mode: no longpoll");if("WebSocket"in window&&"websocket"===ftui.config.longPollType&&ftui.deviceStates[ftui.config.webDevice]&&ftui.deviceStates[ftui.config.webDevice].longpoll&&ftui.deviceStates[ftui.config.webDevice].longpoll.val&&"websocket"===ftui.deviceStates[ftui.config.webDevice].longpoll.val){if(ftui.websocket)return void ftui.log(3,"valid ftui.websocket found");ftui.config.DEBUG&&ftui.toast("Longpoll (WebSocket) started"),ftui.poll.URL=ftui.config.fhemDir.replace(/^http/i,"ws")+"?XHR=1&inform=type=status;filter="+ftui.poll.longPollFilter+";since="+ftui.poll.lastEventTimestamp.getTime()+";fmt=JSON×tamp="+(new Date).getTime(),ftui.log(1,"websockets URL="+ftui.poll.URL),ftui.states.longPollRestart=!1,ftui.websocket=new WebSocket(ftui.poll.URL),ftui.websocket.onclose=function(t){var e;e=1e3==t.code?"Normal closure, meaning that the purpose for which the connection was established has been fulfilled.":1001==t.code?'An endpoint is "going away", such as a server going down or a browser having navigated away from a page.':1002==t.code?"An endpoint is terminating the connection due to a protocol error":1003==t.code?"An endpoint is terminating the connection because it has received a type of data it cannot accept (e.g., an endpoint that understands only text data MAY send this if it receives a binary message).":1004==t.code?"Reserved. The specific meaning might be defined in the future.":1005==t.code?"No status code was actually present.":1006==t.code?"The connection was closed abnormally, e.g., without sending or receiving a Close control frame":1007==t.code?"An endpoint is terminating the connection because it has received data within a message that was not consistent with the type of the message (e.g., non-UTF-8 [http://tools.ietf.org/html/rfc3629] data within a text message).":1008==t.code?'An endpoint is terminating the connection because it has received a message that "violates its policy". This reason is given either if there is no other sutible reason, or if there is a need to hide specific details about the policy.':1009==t.code?"An endpoint is terminating the connection because it has received a message that is too big for it to process.":1010==t.code?"An endpoint (client) is terminating the connection because it has expected the server to negotiate one or more extension, but the server didn't return them in the response message of the WebSocket handshake.
Specifically, the extensions that are needed are: "+t.reason:1011==t.code?"A server is terminating the connection because it encountered an unexpected condition that prevented it from fulfilling the request.":1015==t.code?"The connection was closed due to a failure to perform a TLS handshake (e.g., the server certificate can't be verified).":"Unknown reason",ftui.log(1,"websocket (url="+t.target.url+") closed! reason="+e),t.target.url===ftui.poll.URL&&ftui.restartLongPoll(e)},ftui.websocket.onerror=function(t){ftui.log(1,"Error while longpoll: "+t.data),ftui.config.debuglevel>1&&t.target.url===ftui.poll.URL&&ftui.toast("Error while longpoll (websocket)","error")},ftui.websocket.onmessage=function(t){ftui.handleUpdates(t.data)}}else{if(ftui.log(1,"longpoll: websockets not supportetd or not activated > fall back to AJAX"),ftui.xhr)return void ftui.log(3,"valid ftui.xhr found");if(ftui.longPollRequest)return void ftui.log(3,"valid ftui.longPollRequest found");ftui.poll.currLine=0,ftui.config.DEBUG&&(ftui.states.longPollRestart?ftui.toast("Longpoll (AJAX) re-started"):ftui.toast("Longpoll (AJAX) started")),ftui.log(1,ftui.states.longPollRestart?"Longpoll re-started":"Longpoll started"),ftui.states.longPollRestart=!1,ftui.longPollRequest=$.ajax({url:ftui.config.fhemDir,cache:!1,async:!0,method:"GET",data:{XHR:1,inform:"type=status;filter="+ftui.poll.longPollFilter+";since="+ftui.poll.lastEventTimestamp.getTime()+";fmt=JSON",fwcsrf:ftui.config.csrf},username:ftui.config.username,password:ftui.config.password,xhr:function(){return ftui.xhr=new window.XMLHttpRequest,ftui.xhr.addEventListener("readystatechange",function(t){var e=t.target.responseText;4!==t.target.readyState&&3===t.target.readyState&&ftui.handleUpdates(e)},!1),ftui.log(1,"ajax lomgpoll responseURL="+ftui.xhr.responseURL),ftui.log(1,"ajax longpol statusText="+ftui.xhr.statusText),ftui.xhr}}).done(function(t){ftui.xhr&&(ftui.xhr.abort(),ftui.xhr=null),ftui.longPollRequest=null,ftui.states.longPollRestart?ftui.longPoll():(ftui.log(1,"Disconnected from FHEM - poll done - "+t),ftui.restartLongPoll(t))}).fail(function(t,e,i){ftui.xhr&&(ftui.xhr.abort(),ftui.xhr=null),ftui.longPollRequest=null,ftui.states.longPollRestart?ftui.longPoll():(ftui.log(1,"Error while longpoll: "+e+": "+i),ftui.config.debuglevel>1&&ftui.toast("Error while longpoll (ajax)
"+e+": "+i,"error"),ftui.restartLongPoll(e+": "+i))})}},handleUpdates:function(t){for(var e=t.split(/\n/),i=ftui.poll.currLine,o=e.length;o>i;i++){ftui.log(5,e[i]);var n=e[i].slice(-1);if(ftui.isValid(e[i])&&""!==e[i]&&"]"===n)try{var a=JSON.parse(e[i]),r=null,s=null,l=a[1]!==a[2],f=""===a[1]&&""===a[2];ftui.log(4,a);var u=ftui.paramIdMap[a[0]],c=ftui.timestampMap[a[0]],g=ftui.subscriptions[a[0]];u&&(l&&(u.reading="STATE"),r=ftui.deviceStates[u.device]||{},s=r[u.reading]||{},s.val=a[1],s.valid=!0,r[u.reading]=s,ftui.deviceStates[u.device]=r,l&&ftui.subscriptions[a[0]]&&(ftui.poll.lastDevice=u.device,ftui.poll.lastReading=u.reading,ftui.poll.lastValue=s.val,plugins.update(u.device,u.reading))),c&&!l&&(r=ftui.deviceStates[c.device]||{},s=r[c.reading]||{},s.date=a[1],r[c.reading]=s,ftui.poll.lastUpdateTimestamp=s.date.toDate(),ftui.deviceStates[c.device]=r,ftui.subscriptionTs[a[0]]&&(ftui.poll.lastDevice=c.device,ftui.poll.lastReading=c.reading,ftui.poll.lastValue=s.val,plugins.update(c.device,c.reading))),f&&g&&plugins.update(g.device,g.reading)}catch(d){ftui.log(1,"Error: (longpoll) "+d),ftui.log(1,"Bad line : "+e[i])}}ftui.poll.lastEventTimestamp=new Date,ftui.updateBindElements("ftui.poll"),ftui.websocket||(ftui.poll.currLine=e.length-1,ftui.poll.currLine>9999&&(ftui.states.longPollRestart=!0,ftui.longPollRequest.abort()))},setFhemStatus:function(t){return ftui.config.DEMO?void console.log("DEMO-Mode: no setFhemStatus"):(ftui.startShortPollInterval(),void ftui.sendFhemCommand(t))},sendFhemCommand:function(t){t=t.replace(" "," ");var e="jsonlist"==t.substr(0,8)?"json":"text";return ftui.log(1,"send to FHEM: "+t),$.ajax({async:!0,cache:!1,method:"GET",dataType:e,url:ftui.config.fhemDir,username:ftui.config.username,password:ftui.config.password,data:{cmd:t,fwcsrf:ftui.config.csrf,XHR:"1"},error:function(t,e,i){ftui.toast("FHEM Command failed
"+e+": "+i,"error")}})},loadStyleSchema:function(){$.each($('link[href$="-ui.css"],link[href$="-ui.min.css"]'),function(t,e){if(e&&e.sheet&&e.sheet.cssRules){var i=e.sheet.cssRules;for(var o in i)if(i[o].style){var n=i[o].style.cssText.split(";");n.pop();var a=i[o].selectorText,r={};for(var s in n){var l=n[s].toString().split(":");l[0].match(/color/)&&(r[$.trim(l[0])]=ftui.rgbToHex($.trim(l[1]).replace("! important","").replace("!important","")))}Object.keys(r).length>0&&(ftui.config.styleCollection[a]=r)}}})},onUpdateDone:function(){$(document).trigger("updateDone"),ftui.checkInvalidElements(),ftui.updateBindElements()},checkInvalidElements:function(){$(".autohide[data-get]").each(function(t){var e=$(this),i=e.getReading("get").valid;i&&i===!0?e.removeClass("invalid"):e.addClass("invalid")})},updateBindElements:function(filter){$('[data-bind*="'+filter+'"]').each(function(index){var elem=$(this),variable=elem.data("bind");variable&&elem.text(eval(variable))})},setOnline:function(){var t=(new Date).getTime()/1e3;if(t-ftui.states.lastSetOnline>60){if(ftui.config.DEBUG&&ftui.toast("FHEM connected"),ftui.states.lastSetOnline=t,ftui.states.lastShortpoll=0,ftui.startShortPollInterval(1e3),!ftui.config.doLongPoll){var e=$("meta[name='longpoll']").attr("content")||"1";ftui.config.doLongPoll="0"!=e,ftui.states.longPollRestart=!1,ftui.config.doLongPoll&&ftui.startLongpoll()}ftui.log(1,"FTUI is online")}},setOffline:function(){ftui.config.DEBUG&&ftui.toast("Lost connection to FHEM"),ftui.config.doLongPoll=!1,ftui.states.longPollRestart=!0,clearInterval(ftui.shortPollTimer),ftui.stopLongpoll(),ftui.saveStatesLocal(),ftui.log(1,"FTUI is offline")},readStatesLocal:function(){ftui.config.DEMO?$.ajax({async:!1,method:"GET",url:"/fhem/tablet/data/"+ftui.config.filename.replace(".html",".dat")}).done(function(t){ftui.deviceStates=JSON.parse(t)||{}}):ftui.deviceStates=JSON.parse(localStorage.getItem("deviceStates"))||{}},saveStatesLocal:function(){var t=JSON.stringify(ftui.deviceStates);localStorage.setItem("deviceStates",t),localStorage.setItem("shortPollDuration",ftui.poll.shortPollDuration)},getDeviceParameter:function(t,e){if(t&&t.length>0){var i=ftui.deviceStates[t];return i&&i[e]?i[e]:null}return null},loadPlugin:function(t,e){var i=new $.Deferred;return ftui.log(2,"Create widget : "+t),ftui.dynamicload(ftui.config.basedir+"js/widget_"+t+".js",!0).done(function(){var o=[],n=window["depends_"+t];if($.isFunction(n)){var a=n();a&&(a=$.isArray(a)?a:[a],$.map(a,function(t,e){t.indexOf(".js")<0?o.push(ftui.loadPlugin(t)):o.push(ftui.dynamicload(t,!1))}))}else ftui.log(2,"function depends_"+t+" not found (maybe ok)");$.when.apply(this,o).always(function(){ var o=window["Modul_"+t]?new window["Modul_"+t]:null;if(o){if("undefined"!=typeof e){plugins.addModule(o),ftui.isValid(e)&&(o.area=e),ftui.log(1,"Try to init plugin: "+t),o.init();for(var n in o.subscriptions)o.update(o.subscriptions[n].device,o.subscriptions[n].reading)}ftui.log(1,"Loaded plugin: "+t),$('[data-type="'+t+'"]',e).removeClass("widget-hide")}else ftui.log(1,"Failed to create widget: "+t);i.resolve()})}).fail(function(){ftui.toast("Failed to load plugin : "+t),ftui.log(1,"Failed to load plugin : "+t+' - add do your page, to see more informations about this failure'),i.resolve()}),i.promise()},dynamicload:function(t,e){ftui.config.DEBUG?!1:!0;ftui.log(3,"dynamic load file:"+t+" / async:"+e);var o=new $.Deferred,n=document.createElement("script");return n.type="text/javascript",n.async=e?!0:!1,n.src=t,n.onload=function(){ftui.log(3,"dynamic load done:"+t),o.resolve()},document.getElementsByTagName("head")[0].appendChild(n),o.promise()},getCSrf:function(){$.ajax({url:ftui.config.fhemDir,type:"GET",cache:!1,username:ftui.config.username,password:ftui.config.password,data:{XHR:"1"},success:function(t,e,i){ftui.config.csrf=i.getResponseHeader("X-FHEM-csrfToken"),ftui.log(1,"Got csrf from FHEM:"+ftui.config.csrf)}}).fail(function(t,e,i){ftui.log(1,"Failed to get csrfToken: "+e+": "+i),ftui.config.shortPollDelay=3e4})},healthCheck:function(){if(ftui.config.debuglevel>0){var t=new Date;t.setTime(1e3*ftui.states.lastShortpoll),console.log("--------- start healthCheck --------------"),console.log("now: "+new Date),console.log("FTUI version: "+ftui.version),console.log("Longpoll: "+ftui.config.doLongPoll),console.log("Longpoll type: "+ftui.config.longPollType),console.log("Longpoll objects there: "+(ftui.isValid(ftui.longPollRequest)&&ftui.isValid(ftui.xhr)||ftui.isValid(ftui.websocket))),console.log("Longpoll current line: "+ftui.poll.currLine),console.log("Longpoll last event before: "+ftui.poll.lastEventTimestamp.ago()),console.log("Longpoll last reading update before: "+ftui.poll.lastUpdateTimestamp.ago()),console.log("Shortpoll interval: "+ftui.config.shortpollInterval),console.log("Shortpoll last run before: "+t.ago()),console.log("FHEM dev/par count: "+Object.keys(ftui.paramIdMap).length),console.log("FTUI known devices count: "+Object.keys(ftui.deviceStates).length),console.log("Page length: "+$("html").html().length),console.log("Widgets count: "+$("[data-type]").length),console.log("--------- end healthCheck ---------------")}var e=new Date-ftui.poll.lastEventTimestamp;e/1e3>ftui.config.maxLongpollAge&&ftui.config.maxLongpollAge>0&&!ftui.config.DEMO&&ftui.config.doLongPoll&&(ftui.log(1,"No longpoll event since "+e/1e3+"secondes -> restart polling"),ftui.setOnline(),ftui.restartLongPoll())},FS20:{dimmerArray:[0,6,12,18,25,31,37,43,50,56,62,68,75,81,87,93,100],dimmerValue:function(t){var e=ftui.indexOfNumeric(this.dimmerArray,t);return e>-1?this.dimmerArray[e]:0}},rgbToHsl:function(t){var e=parseInt(t.substring(0,2),16),i=parseInt(t.substring(2,4),16),o=parseInt(t.substring(4,6),16);e/=255,i/=255,o/=255;var r,s,n=Math.max(e,i,o),a=Math.min(e,i,o),l=(n+a)/2;if(n==a)r=s=0;else{var f=n-a;switch(s=l>.5?f/(2-n-a):f/(n+a),n){case e:r=(i-o)/f+(o>i?6:0);break;case i:r=(o-e)/f+2;break;case o:r=(e-i)/f+4}r/=6}return[r,s,l]},hslToRgb:function(t,e,i){var o,n,a,s,r=function(t){return("0"+parseInt(t).toString(16)).slice(-2)};if(0===e)o=n=a=i;else{s=function(t,e,i){return 0>i&&(i+=1),i>1&&(i-=1),1/6>i?t+6*(e-t)*i:.5>i?e:2/3>i?t+(e-t)*(2/3-i)*6:t};var l=.5>i?i*(1+e):i+e-i*e,f=2*i-l;o=s(f,l,t+1/3),n=s(f,l,t),a=s(f,l,t-1/3)}return[r(Math.round(255*o)),r(Math.round(255*n)),r(Math.round(255*a))].join("")},rgbToHex:function(t){var e=t.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i);return e&&4===e.length?"#"+("0"+parseInt(e[1],10).toString(16)).slice(-2)+("0"+parseInt(e[2],10).toString(16)).slice(-2)+("0"+parseInt(e[3],10).toString(16)).slice(-2):t},getGradientColor:function(t,e,i){t=this.rgbToHex(t).replace(/^\s*#|\s*$/g,""),e=this.rgbToHex(e).replace(/^\s*#|\s*$/g,""),3==t.length&&(t=t.replace(/(.)/g,"$1$1")),3==e.length&&(e=e.replace(/(.)/g,"$1$1"));var o=parseInt(t.substr(0,2),16),n=parseInt(t.substr(2,2),16),a=parseInt(t.substr(4,2),16),r=parseInt(e.substr(0,2),16),s=parseInt(e.substr(2,2),16),l=parseInt(e.substr(4,2),16),f=r-o,u=s-n,c=l-a;return f=(f*i+o).toString(16).split(".")[0],u=(u*i+n).toString(16).split(".")[0],c=(c*i+a).toString(16).split(".")[0],1==f.length&&(f="0"+f),1==u.length&&(u="0"+u),1==c.length&&(c="0"+c),"#"+f+u+c},getPart:function(t,e){if(ftui.isValid(e)){if($.isNumeric(e)){var i=ftui.isValid(t)?t.toString().split(" "):"";return i.length>=e&&e>0?i[e-1]:t}var o="";if(ftui.isValid(t)){var n=t.match(new RegExp("^"+e+"$"));if(n)for(var a=1,r=n.length;r>a;a++)o+=n[a]}return o}return t},showModal:function(t){t?$("#shade").fadeIn():$("#shade").fadeOut()},precision:function(t){var e=t+"",i=e.indexOf(".")+1;return i?e.length-i:0},indexOfGeneric:function(t,e){if(!t)return-1;for(var i=0,o=t.length;o>i;i++)if(!$.isNumeric(t[i]))return ftui.indexOfRegex(t,e);return ftui.indexOfNumeric(t,e)},indexOfNumeric:function(t,e){for(var i=-1,o=0,n=t.length;n>o;o++)Number(e)>=Number(t[o])&&(i=o);return i},indexOfRegex:function(t,e){for(var i=t.length,o=0;i>o;o++)try{var n=e.match(new RegExp("^"+t[o]+"$"));if(n)return o}catch(a){}return 2===i&&t[0]==="!"+t[1]&&e!==t[0]?0:2===i&&t[1]==="!"+t[0]&&e!==t[1]?1:t.indexOf(e)},isValid:function(t){return"undefined"!=typeof t&&void 0!==t&&typeof t!=typeof notusedvar},dateFromString:function(t){var e=t.match(/(\d+)-(\d+)-(\d+)[_\s](\d+):(\d+):(\d+).*/),i=t.match(/^(\d+)$/),o=t.match(/(\d\d).(\d\d).(\d\d\d\d)/),n=(new Date).getTimezoneOffset();return e?new Date(+e[1],+e[2]-1,+e[3],+e[4],+e[5],+e[6]):i?new Date(70,1,1,0,0,i[1],0):o?new Date(+o[3],+o[2]-1,+o[1],0,-n,0,0):new Date},diffMinutes:function(t,e){var i=new Date(e-t);return(i/1e3/60).toFixed(0)},diffSeconds:function(t,e){var i=new Date(e-t);return(i/1e3).toFixed(1)},durationFromSeconds:function(t){var e=Math.floor(t/3600),i=Math.floor(t%3600/60),o=t%60,n="";return e>0&&(n+=""+e+":"+(10>i?"0":"")),n+=""+i+":"+(10>o?"0":""),n+=""+o},mapColor:function(t){return ftui.getStyle("."+t,"color")||t},parseJsonFromString:function(t){return JSON.parse(t)},getAndroidVersion:function(t){t=(t||navigator.userAgent).toLowerCase();var e=t.match(/android\s([0-9\.]*)/);return e?e[1]:!1},getStyle:function(t,e){var i=ftui.config.styleCollection[t],o=i&&i[e]?i[e]:null;if(null===o){var n="."+t.split(".").reverse().join(".");n=n.substring(0,n.length-1),i=ftui.config.styleCollection[n],o=i&&i[e]?i[e]:null}return o},getClassColor:function(t){for(var e=ftui.config.stdColors.length-1;e>=0;e-=1)if(t.hasClass(ftui.config.stdColors[e]))return ftui.getStyle("."+ftui.config.stdColors[e],"color");return null},getIconId:function(t){if(!t||""===t||!$('link[href$="lib/font-awesome.min.css"]').length)return"?";var e=$('link[href$="lib/font-awesome.min.css"]')[0];if(e&&e.sheet&&e.sheet.cssRules){var i=e.sheet.cssRules;for(var o in i)if(i[o].selectorText&&i[o].selectorText.match(new RegExp(t+":"))){var n=i[o].style.content;return n?(n=n.replace(/"/g,"").replace(/'/g,""),/[^\u0000-\u00ff]/.test(n)?n:String.fromCharCode(parseInt(n.replace("\\",""),16))):t}}},disableSelection:function(){$("body").each(function(){this.onselectstart=function(){return!1},this.unselectable="on",$(this).css("-moz-user-select","none"),$(this).css("-webkit-user-select","none")})},hideWidgets:function(t){$("[data-type]",t).addClass("widget-hide")},toast:function(t,e){if(0!==ftui.config.TOAST){var i=ftui.config.TOAST;1==ftui.config.TOAST&&(i=!1),e&&"error"===e?f7?f7.ftui.addNotification({title:"FTUI",message:t,hold:1500}):$.toast&&$.toast({heading:"Error",text:t,hideAfter:2e4,icon:"error",loader:!1,position:ftui.config.toastPosition,stack:i}):f7?f7.ftui.addNotification({title:"FTUI",message:t,hold:1500}):$.toast&&$.toast({text:t,loader:!1,position:ftui.config.toastPosition,stack:i})}},log:function(t,e){ftui.config.debuglevel>=t&&console.log(e)}};String.prototype.toDate=function(){return ftui.dateFromString(this)},String.prototype.parseJson=function(){return ftui.parseJsonFromString(this)},String.prototype.toMinFromSec=function(){var t=Number(this),e=Math.floor(t%60).toString(),i=Math.floor(t/=60).toString();return i+":"+(e[1]?e:"0"+e[0])},String.prototype.toHoursFromSec=function(){var t=Number(this),e=Math.floor(t/3600).toString(),i=Math.floor(t%60).toString(),o=(Math.floor(t/60)-60*e).toString();return e+":"+(o[1]?o:"0"+o[0])+":"+(i[1]?i:"0"+i[0])},Date.prototype.addMinutes=function(t){return new Date(this.getTime()+6e4*t)},Date.prototype.ago=function(t){var e=new Date,i=e-this,o=i/1e3,n=Math.floor(o%60);o/=60;var a=Math.floor(o%60);o/=60;var r=Math.floor(o%24);o/=24;var f,s=Math.floor(o),l="de"===ftui.config.lang?["Tag(e)","Stunde(n)","Minute(n)","Sekunde(n)"]:["day(s)","hour(s)","minute(s)","second(s)"];return ftui.isValid(t)?(f=t.replace("dd",s),f=f.replace("hh",r>9?r:"0"+r),f=f.replace("mm",a>9?a:"0"+a),f=f.replace("ss",n>9?n:"0"+n),f=f.replace("h",r),f=f.replace("m",a),f=f.replace("s",n)):(f=s>0?s+" "+l[0]+" ":"",f+=r>0?r+" "+l[1]+" ":"",f+=a>0?a+" "+l[2]+" ":"",f+=n+" "+l[3]),f},Date.prototype.yyyymmdd=function(){var t=this.getFullYear().toString(),e=(this.getMonth()+1).toString(),i=this.getDate().toString();return t+"-"+(e[1]?e:"0"+e[0])+"-"+(i[1]?i:"0"+i[0])},Date.prototype.ddmmyyyy=function(){var t=this.getFullYear().toString(),e=(this.getMonth()+1).toString(),i=this.getDate().toString();return(i[1]?i:"0"+i[0])+"."+(e[1]?e:"0"+e[0])+"."+t},Date.prototype.hhmm=function(){var t=this.getHours().toString(),e=this.getMinutes().toString();return(t[1]?t:"0"+t[0])+":"+(e[1]?e:"0"+e[0])},Date.prototype.hhmmss=function(){var t=this.getHours().toString(),e=this.getMinutes().toString(),i=this.getSeconds().toString();return(t[1]?t:"0"+t[0])+":"+(e[1]?e:"0"+e[0])+":"+(i[1]?i:"0"+i[0])},Date.prototype.ddmm=function(){var t=(this.getMonth()+1).toString(),e=this.getDate().toString();return(e[1]?e:"0"+e[0])+"."+(t[1]?t:"0"+t[0])+"."},Date.prototype.ddmmhhmm=function(){var t=(this.getMonth()+1).toString(),e=this.getDate().toString(),i=this.getHours().toString(),o=this.getMinutes().toString();return(e[1]?e:"0"+e[0])+"."+(t[1]?t:"0"+t[0])+". "+(i[1]?i:"0"+i[0])+":"+(o[1]?o:"0"+o[0])},Date.prototype.eeee=function(){var t=["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],e=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];return"de"===ftui.config.lang?t[this.getDay()]:e[this.getDay()]},Date.prototype.eee=function(){var t=["Son","Mon","Die","Mit","Don","Fre","Sam"],e=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];return"de"===ftui.config.lang?t[this.getDay()]:e[this.getDay()]},Date.prototype.ee=function(){var t=["So","Mo","Di","Mi","Do","Fr","Sa"],e=["Su","Mo","Tu","We","Th","Fr","Sa"];return"de"===ftui.config.lang?t[this.getDay()]:e[this.getDay()]};var src=document.querySelector('script[src*="fhem-tablet-ui"]').getAttribute("src"),file=src.split("/").pop();src=src.replace("/"+file,"");var dir=src.split("/").pop();if(ftui.config.basedir=src.replace(dir,""),""===ftui.config.basedir&&(ftui.config.basedir="./"),console.log("Base dir: "+ftui.config.basedir),ftui.isValid(window.jQuery))$(document).ready(function(){onjQueryLoaded()});else{var script=document.createElement("script");script.type="text/javascript",script.onload=function(){!function(t){t(document).ready(function(){console.log("jQuery dynamically loaded"),onjQueryLoaded()})}(jQuery)},script.src=ftui.config.basedir+"lib/jquery.min.js",document.getElementsByTagName("head")[0].appendChild(script)}