| 1 |
- "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,n,a){var o=e.split("/").pop();return ftui.toast([o+":"+i,a].join("<br/>"),"error"),!1},$.fn.once=function(t,e){return this.each(function(){$(this).off(t).on(t,e)})},$.fn.widgetId=function(){return[$(this).data("type"),$(this).data("device")?$(this).data("device").replace(" ","default"):"default",$(this).data("get"),$(this).index()].join(".")},$.fn.wgid=function(){var t=$(this);if(!t.isValidData("wgid")){var e=t.data("type")+"_xxxx-xxxx-xxxx".replace(/[xy]/g,function(t){var e=16*Math.random()|0;return("x"==t?e:3&e|8).toString(16)});t.attr("data-wgid",e)}return t.data("wgid")},$.fn.filterData=function(t,e){return this.filter(function(){return $(this).data(t)==e})},$.fn.filterDeviceReading=function(t,e,i){return $(this).filter(function(){return $(this).matchDeviceReading(t,e,i)})},$.fn.matchDeviceReading=function(t,e,i){var n=$(this),a=n.data(t);return String(a)===i&&String(n.data("device"))===e||a===e+":"+i||a==="["+e+":"+i+"]"||$.inArray(i,a)>-1&&String(n.data("device"))===e||$.inArray(e+":"+i,a)>-1},$.fn.isValidData=function(t){return void 0!==$(this).data(t)},$.fn.isValidAttr=function(t){return void 0!==$(this).attr(t)},$.fn.initData=function(t,e){var i=$(this);return i.data(t,i.isValidData(t)?i.data(t):e),i},$.fn.reinitData=function(t,e){var i=$(this),n="data-"+t;return i.data(t,i.isValidAttr(n)?i.attr(n):e),i},$.fn.initClassColor=function(t){var e=$(this),i=ftui.getClassColor(e);i&&e.attr("data-"+t,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 i,n,a,o,r=$(this),s=String(ftui.getPart(e,r.data(t+"-part"))),l=r.data(t+"-on"),u=r.data(t+"-off"),f=String(l);f.match(/:/)&&(n=(i=f.split(":"))[0].replace("[",""),a=i[1].replace("]",""),(o=ftui.getDeviceParameter(n,a))&&ftui.isValid(o)&&(f=o.val));var c=String(u);if(c.match(/:/)&&(n=(i=c.split(":"))[0].replace("[",""),a=i[1].replace("]",""),(o=ftui.getDeviceParameter(n,a))&&ftui.isValid(o)&&(c=o.val)),ftui.isValid(l)){if(s===f)return"on";if(s.match(new RegExp("^"+f+"$")))return"on"}if(ftui.isValid(u)){if(s===c)return"off";if(s.match(new RegExp("^"+c+"$")))return"off"}if(ftui.isValid(l)&&ftui.isValid(u)){if("!off"===f&&!s.match(new RegExp("^"+c+"$")))return"on";if("!on"===c&&!s.match(new RegExp("^"+f+"$")))return"off";if(f==="!"+c&&!s.match(new RegExp("^"+c+"$")))return"on";if(c==="!"+f&&!s.match(new RegExp("^"+f+"$")))return"off"}},$.fn.isUrlData=function(t){var e=$(this).data(t);return e&&e.match(/^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+$/)},$.fn.isDeviceReading=function(t){var e=$(this).data(t);return e&&!$.isNumeric(e)&&"string"==typeof e&&e.match(/^[\w\s-.]+:[\w\s-]+$/)},$.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")),n=$(this).data(t);if($.isArray(n)&&(n=n[e]),(n=String(n))&&n.match(/:/)){var a=n.split(":");i=a[0].replace("[",""),n=a[1].replace("]","")}if(i&&i.length){var o=ftui.deviceStates[i];return o&&o[n]?o[n]:{}}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)}},$.fn.otherThen=function(t){return $(this).filter(function(){return $(this).wgid()!==t.wgid()})}}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,n){me.elements.filterDeviceReading(n,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,n){me.elements.filterDeviceReading(n,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")).addClass("hide"):e.addClass("hide")),"off"===e.matchingState("hide",i)&&(ftui.isValid(e.data("hideparents"))?e.parents(e.data("hideparents")).removeClass("hide"):e.removeClass("hide"))})})}function updateHide(t,e,i){$.each(["hide","hide-on","hide-off"],function(n,a){if(t.matchDeviceReading(a,e,i)){var o=t.getReading("hide").val;"on"===t.matchingState("hide",o)&&(ftui.isValid(t.data("hideparents"))?t.parents(t.data("hideparents")).addClass("hide"):t.addClass("hide")),"off"===t.matchingState("hide",o)&&(ftui.isValid(t.data("hideparents"))?t.parents(t.data("hideparents")).removeClass("hide"):t.removeClass("hide"))}})}function updateLock(t,e,i){$.each(["lock","lock-on","lock-off"],function(n,a){if(t.matchDeviceReading(a,e,i)){var o=t.getReading("lock").val;"on"===t.matchingState("lock",o)&&t.addClass("lock"),"off"===t.matchingState("lock",o)&&t.removeClass("lock")}})}function updateReachable(t,e,i){$.each(["reachable","reachable-on","reachable-off"],function(n,a){if(t.matchDeviceReading(a,e,i)){var o=t.getReading("reachable").val;"on"===t.matchingState("reachable",o)&&t.removeClass("unreachable"),"off"===t.matchingState("reachable",o)&&t.addClass("unreachable")}})}function update_reachable(t,e){$.each(["reachable","reachable-on","reachable-off"],function(i,n){me.elements.filterDeviceReading(n,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;i<len;i+=2)i+1<len&&(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 round(t,e){return $.isNumeric(t)&&e?ftui.round(Number(t),e):t}function fix(t,e){return $.isNumeric(t)&&e>=0?Number(t).toFixed(e):t}function factor(t,e){return $.isNumeric(t)&&e>=0?Number(t)*e:t}function map(t,e,i){if("object"==typeof t&&null!==t)for(var n in t)if(e===n||e.match(new RegExp("^"+n+"$")))return t[n];return i}function init_attr(t){t.initData("get","STATE");var e=t.data("get");t.initData("set","STATE"!==e?e:""),t.initData("cmd","set"),t.initData("get-on","(true|1|on|open|ON)"),t.initData("get-off","!on"),me.addReading(t,"get"),t.isDeviceReading("get-on")&&me.addReading(t,"get-on"),t.isDeviceReading("get-off")&&me.addReading(t,"get-off"),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 reinit(){}function init(){ftui.log(1,"init widget: name="+me.widgetname+" area="+me.area),me.elements=$('[data-type="'+me.widgetname+'"]:not([data-ready])',me.area),me.elements.each(function(t){var e=$(this);e.attr("data-ready",""),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 n=t.data("device");$.isArray(i)||(i=new Array(i.toString()));for(var a=i.length-1;a>=0;a-=1){var o=i[a];if(o.match(/:/)){var r=o.split(":");n=r[0].replace("[",""),o=r[1].replace("]","")}if(ftui.isValid(n)&&ftui.isValid(o)&&""!==n&&""!==o&&" "!==n&&" "!==o){n=n.toString();var s="STATE"===o?n:[n,o].join("-");subscriptions[s]={},subscriptions[s].device=n,subscriptions[s].reading=o}}}}function extractReadings(t,e){var i=t.data(e);if(ftui.isValid(i)&&($.isArray(i)||!i.toString().match(/^[#\.\[][^:]*$/))){$.isArray(i)||(i=new Array(i.toString()));for(var n=i.length-1;n>=0;n-=1){var a,o,r=i[n];if(r.match(/:/)){var s=r.split(":");a=s[0].replace("[",""),o=s[1].replace("]","")}if(ftui.isValid(a)&&ftui.isValid(o)&&""!==a&&""!==o&&" "!==a&&" "!==o){a=a.toString();var l="STATE"===o?a:[a,o].join("-");subscriptions[l]={},subscriptions[l].device=a,subscriptions[l].reading=o}}}}function update(t,e){ftui.log(1,"warning: "+me.widgetname+" has not implemented update function")}var subscriptions={},elements=[],me={widgetname:"widget",area:"",init:init,reinit:reinit,init_attr:init_attr,init_ui:init_ui,update:update,update_lock:update_lock,update_reachable:update_reachable,update_hide:update_hide,updateHide:updateHide,updateLock:updateLock,updateReachable:updateReachable,substitution:substitution,fix:fix,factor:factor,round:round,map:map,addReading:addReading,extractReadings:extractReadings,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 n=ftui.subscriptions[i].device;ftui.devs.indexOf(n)<0&&ftui.devs.push(n);var a=ftui.subscriptions[i].reading;ftui.reads.indexOf(a)<0&&ftui.reads.push(a)}}var o=ftui.devs.length?$.map(ftui.devs,$.trim).join():".*",r=ftui.reads.length?$.map(ftui.reads,$.trim).join(" "):"";ftui.config.longPollFilter?ftui.poll.long.filter=ftui.config.longPollFilter:ftui.poll.long.filter=o+", "+r,ftui.config.shortPollFilter?ftui.poll.short.filter=ftui.config.shortPollFilter:ftui.poll.short.filter=o+" "+r,ftui.states.lastShortpoll=0},load:function(t,e){return ftui.log(1,'Load plugin "'+t+'" for area "'+e+'"'),ftui.loadPlugin(t,e)},reinit:function(){$.each(this.modules,function(t,e){"object"==typeof e&&e.reinit()})},update:function(t,e){$.each(this.modules,function(i,n){"object"==typeof n&&n.update(t,e)}),ftui.updateBindElements("ftui.deviceStates"),ftui.log(1,'call "plugins.update" done for "'+t+":"+e+'"')}},ftui={version:"2.7.6",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:{short:{lastTimestamp:new Date,timer:null,request:null,result:null,lastErrorToast:null},long:{xhr:null,currLine:0,lastUpdateTimestamp:new Date,lastEventTimestamp:new Date,timer:null,result:null,lastErrorToast:null}},states:{width:0,lastSetOnline:0,lastShortpoll:0,longPollRestart:!1,inits:[]},deviceStates:{},paramIdMap:{},timestampMap:{},subscriptions:{},subscriptionTs:{},scripts:[],gridster:{instances:{},instance:null,baseX:0,baseY:0,margins:5,mincols:0,cols:0,rows:0},init:function(){function t(){$.toast&&!$('link[href$="lib/jquery.toast.min.css"]').length&&$("head").append('<link rel="stylesheet" href="'+ftui.config.basedir+'lib/jquery.toast.min.css" type="text/css" />')}ftui.hideWidgets(),ftui.paramIdMap={},ftui.timestampMap={},ftui.config.longPollType=$("meta[name='longpoll_type']").attr("content")||"websocket";var e=$("meta[name='longpoll']").attr("content")||"1";ftui.config.doLongPoll="0"!=e,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.fadeTime=$("meta[name='fade_time']").attr("content")||200,"0"===ftui.config.fadeTime&&(ftui.log(1,"fadeTime=0 => disable jQuery animation"),jQuery.fx.off=!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 i=window.location.pathname;ftui.config.filename=i.substring(i.lastIndexOf("/")+1),ftui.log(1,"Filename: "+ftui.config.filename);var n=$("meta[name='fhemweb_url']").attr("content");ftui.config.fhemDir=n||location.origin+"/fhem/",n&&new RegExp("^((?!http://|https://).)*$").test(n)&&(ftui.config.fhemDir=location.origin+"/"+n+"/"),ftui.config.fhemDir=ftui.config.fhemDir.replace("///","//"),ftui.log(1,"FHEM dir: "+ftui.config.fhemDir);var a=navigator.language||navigator.userLanguage;ftui.config.lang=$("meta[name='lang']").attr("content")||(ftui.isValid(a)?a.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?t():ftui.dynamicload(ftui.config.basedir+"lib/jquery.toast.min.js",!1).done(function(){t()}),$(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_version",ftui.version),localStorage.removeItem("ftui_version")}catch(t){ftui.toast("You are in Privacy Mode<br>Please deactivate Privacy Mode and then reload the page.","error")}var o=ftui.getAndroidVersion(),r=/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream,s=o&&parseFloat(o)<5||r;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",$("<div id='shade' />").prependTo("body").hide(),$("#shade").on(ftui.config.clickEventType,function(t){$(document).trigger("shadeClicked")});for(var l=[],u=0;u<localStorage.length;u++)localStorage.key(u).match(/[0-9abcdef]{4}-[0-9abcdef]{4}-[0-9abcdef]{4}/)&&l.push(localStorage.key(u));for(u=0;u<l.length;u++)localStorage.removeItem(l[u]);if(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 f=ftui.config.basedir+"css/fhem-tablet-ui.css";$.when($.get(f,function(){$("<link>",{rel:"stylesheet",type:"text/css",href:f}).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>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, .dialog > header ~ .hbox:first-of-type:nth-last-of-type(1), .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){$(this).siblings("header").outerHeight()>0&&$(this).css({height:"calc(100% - "+$(this).siblings("header").outerHeight()+"px)"})})}),$(document).on("initWidgetsDone",function(){ftui.states.longPollRestart=!0,ftui.restartLongPoll(),ftui.initHeaderLinks(),ftui.saveStatesLocal("subscriptions"),ftui.saveStatesLocal("modules"),$(".line-full").each(function(){$(this).css({"line-height":$(this).parent().height()+"px"})}),ftui.startShortPollInterval(500),$(document).trigger("changedSelection"),ftui.config.ICONDEMO||ftui.disableSelection()}),f7||$("*:not(select):not(textarea)").focus(function(){$(this).blur()}),ftui.saveStatesLocal("version"),ftui.saveStatesLocal("config"),setInterval(function(){ftui.healthCheck()},6e4)},initGridster:function(t){function e(){var e=-1,i=-1,n=0,a=0,o=0,r=0;$(".gridster > ul > li").each(function(){var t=$(this).data("col")+$(this).data("sizex")-1;t>e&&(e=t);var n=$(this).data("row")+$(this).data("sizey")-1;n>i&&(i=n)}),o=ftui.gridster.cols>0?ftui.gridster.cols:e,r=ftui.gridster.rows>0?ftui.gridster.rows:i;var s=2*o*ftui.gridster.margins,l=2*r*ftui.gridster.margins;n=ftui.gridster.baseX>0?ftui.gridster.baseX:(window.innerWidth-s)/o,a=ftui.gridster.baseY>0?ftui.gridster.baseY:(window.innerHeight-l)/r,n<ftui.gridster.minX&&(n=ftui.gridster.minX),a<ftui.gridster.minY&&(a=ftui.gridster.minY),ftui.gridster.mincols=parseInt($("meta[name='widget_min_cols'],meta[name='gridster_min_cols']").attr("content")||o),ftui.gridster.instances[t]&&ftui.gridster.instances[t].destroy(),ftui.gridster.instances[t]=$(".gridster > ul",t).gridster({widget_base_dimensions:[n,a],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()),$(".gridster > ul > li:has(* .gridster)").each(function(){$(this).css({"background-color":"transparent",margin:"-"+ftui.gridster.margins+"px"})}),$(".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",t).length&&($('link[href$="lib/jquery.gridster.min.css"]').length||$("head").append('<link rel="stylesheet" href="'+ftui.config.basedir+'lib/jquery.gridster.min.css" type="text/css" />'),$.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:"html",console.time("initPage-"+t),ftui.states.startTime=new Date,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 n in e)t=t.replace(new RegExp(n,"g"),e[n]);i.html(t)})});$.when.apply(this,e).then(function(){ftui.log(1,"init templates - Done"),ftui.initWidgets(t).done(function(){console.timeEnd("initPage-"+t);var e="initPage ("+t+"): in "+(new Date-ftui.states.startTime)+"ms";ftui.config.debuglevel>1&&ftui.toast(e),ftui.log(1,e)})})},initWidgets:function(t){var e=new $.Deferred;t=ftui.isValid(t)?t:"html";var i=[];ftui.log(2,"initWidgets before- area="+t),ftui.log(2,$.map(plugins.modules,function(t){return t.area+":"+t.widgetname}).join(" ")),plugins.removeArea(t),ftui.log(2,"initWidgets after removed- area="+t),ftui.log(2,$.map(plugins.modules,function(t){return t.area+":"+t.widgetname}).join(" ")),$("[data-type] ",t).each(function(t){var e=$(this).data("type");i.indexOf(e)<0&&i.push(e)});var n=$.map(i,function(e,i){return plugins.load(e,t)});return $.when.apply(this,n).then(function(){plugins.updateParameters(),ftui.log(1,"initWidgets - Done"),$(document).trigger("initWidgetsDone",[t]),e.resolve()}),e.promise()},initHeaderLinks:function(){($("[class*=fa-]").length||$('[data-type="select"]').length||$('[data-type="homestatus"]').length)&&!$('link[href$="lib/font-awesome.min.css"]').length&&$("head").append('<link rel="stylesheet" href="'+ftui.config.basedir+'lib/font-awesome.min.css" type="text/css" />'),$("[class*=oa-]").length&&!$('link[href$="lib/openautomation.css"]').length&&$("head").append('<link rel="stylesheet" href="'+ftui.config.basedir+'lib/openautomation.css" type="text/css" />'),$("[class*=fs-]").length&&!$('link[href$="lib/fhemSVG.css"]').length&&$("head").append('<link rel="stylesheet" href="'+ftui.config.basedir+'lib/fhemSVG.css" type="text/css" />'),$("[class*=mi-]").length&&!$('link[href$="lib/material-icons.min.css"]').length&&$("head").append('<link rel="stylesheet" href="'+ftui.config.basedir+'lib/material-icons.min.css" type="text/css" />'),$("[class*=wi-]").length&&!$('link[href$="lib/weather-icons.min.css"]').length&&$("head").append('<link rel="stylesheet" href="'+ftui.config.basedir+'lib/weather-icons.min.css" type="text/css" />'),$("[class*=wi-wind]").length&&!$('link[href$="lib/weather-icons-wind.min.css"]').length&&$("head").append('<link rel="stylesheet" href="'+ftui.config.basedir+'lib/weather-icons-wind.min.css" type="text/css" />')},startLongpoll:function(){ftui.log(2,"startLongpoll: "+ftui.config.doLongPoll),ftui.poll.long.lastEventTimestamp=new Date,ftui.config.doLongPoll&&(ftui.config.shortpollInterval=$("meta[name='shortpoll_interval']").attr("content")||900,ftui.poll.long.timer=setTimeout(function(){ftui.longPoll()},0))},stopLongpoll:function(){ftui.log(2,"stopLongpoll"),clearInterval(ftui.poll.long.timer),ftui.poll.long.request&&ftui.poll.long.request.abort(),ftui.poll.long.websocket&&(ftui.poll.long.websocket.close(),ftui.poll.long.websocket=void 0,ftui.log(2,"stopped websocket"))},restartLongPoll:function(t,e){ftui.log(2,"restartLongpoll");var i;clearTimeout(ftui.poll.long.timer),t&&ftui.toast("Disconnected from FHEM<br>"+t,e),ftui.stopLongpoll(),ftui.states.longPollRestart?i=0:(ftui.toast("Retry to connect in 10 seconds"),i=1e4),ftui.poll.long.timer=setTimeout(function(){ftui.startLongpoll()},i)},forceRefresh:function(){ftui.states.lastShortpoll=0,ftui.shortPoll()},startShortPollInterval:function(t){ftui.log(1,"shortpoll: start in (ms):"+(t||1e3*ftui.config.shortpollInterval)),clearInterval(ftui.poll.short.timer),ftui.poll.short.timer=setTimeout(function(){ftui.shortPoll(),ftui.startShortPollInterval()},t||1e3*ftui.config.shortpollInterval)},shortPoll:function(t){var e=(new Date).getTime()/1e3;if(!(e-ftui.states.lastShortpoll<ftui.config.shortpollInterval)){ftui.log(1,"start shortpoll");for(var i=new Date,n=0,a=ftui.devs.length;n<a;n++){var o=ftui.deviceStates[ftui.devs[n]];for(var r in o)o[r].valid=!1}console.time("get jsonlist2"),ftui.poll.short.request=ftui.sendFhemCommand("jsonlist2 "+ftui.poll.short.filter).done(function(n){function a(t,e){for(var i in e){var n=!1,a="STATE"===i?t:[t,i].join("-"),o=e[i];if("object"!=typeof o&&(o={Value:o,Time:""}),ftui.subscriptions[a]){var r=ftui.getDeviceParameter(t,i);n=!r||r.val!==o.Value||r.date!==o.Time,ftui.log(5,"isUpdated="+n)}var s=ftui.deviceStates[t]||{},l=s[i]||{};l.date=o.Time,l.val=o.Value,l.valid=!0,s[i]=l,ftui.deviceStates[t]=s,ftui.paramIdMap[a]={},ftui.paramIdMap[a].device=t,ftui.paramIdMap[a].reading=i,ftui.timestampMap[a+"-ts"]={},ftui.timestampMap[a+"-ts"].device=t,ftui.timestampMap[a+"-ts"].reading=i,n&&(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(n)[0]+" 1="+Object.keys(n)[1]),n&&n.Results){var o=n.Results.length;ftui.log(2,"shortpoll: fhemJSON.Results.length="+o);for(var r=n.Results,s=o-1;s>=0;s-=1){var l=r[s],u=l.Name;u.indexOf("FHEMWEB")<0&&!u.match(/WEB_\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}_\d{5}/)&&(a(u,l.Internals),a(u,l.Attributes),a(u,l.Readings))}var f=ftui.diffSeconds(i,new Date);if(ftui.config.debuglevel>1){var c=Object.keys(ftui.paramIdMap).length;ftui.toast("Full refresh done in "+f+"s for "+c+" parameter(s)")}ftui.log(1,"shortPoll: Done"),ftui.poll.short.lastErrorToast&&ftui.poll.short.lastErrorToast.reset(),ftui.states.lastShortpoll=e,ftui.poll.short.duration=1e3*f,ftui.poll.short.lastTimestamp=new Date,ftui.poll.short.result="ok",ftui.saveStatesLocal("deviceStates"),ftui.saveStatesLocal("shortPoll"),ftui.updateBindElements("ftui."),t||ftui.onUpdateDone()}else{var d="request failed: Result is null";ftui.log(1,"shortPoll: "+d),ftui.poll.short.result=d,ftui.toast("<u>ShortPoll "+d+" </u><br>","error"),ftui.saveStatesLocal("shortPoll")}console.timeEnd("read jsonlist2")}).fail(function(t,e,i){var n=e+", "+i;ftui.log(1,"shortPoll: request failed: "+n),ftui.poll.short.result=n,ftui.states.lastSetOnline=0,ftui.states.lastShortpoll=0,ftui.saveStatesLocal("deviceStates"),ftui.saveStatesLocal("shortPoll"),e.indexOf("parsererror")<0?(ftui.poll.short.lastErrorToast=ftui.toast("<u>ShortPoll Request Failed, will retry in "+ftui.config.shortPollDelay/1e3+"s</u><br>"+n,"error"),ftui.getCSrf(),ftui.startShortPollInterval(ftui.config.shortPollDelay)):ftui.toast("<u>ShortPoll Request Failed</u><br>"+n,"error")})}},longPoll:function(){if(ftui.config.DEMO)console.log("DEMO-Mode: no longpoll");else 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.poll.long.websocket)return void ftui.log(3,"valid ftui.poll.long.websocket found");ftui.poll.long.lastErrorToast&&ftui.poll.long.lastErrorToast.reset(),ftui.config.debuglevel>1&&ftui.toast("Longpoll (WebSocket) started"),ftui.poll.long.URL=ftui.config.fhemDir.replace(/^http/i,"ws")+"?XHR=1&inform=type=status;filter="+ftui.poll.long.filter+";since="+ftui.poll.long.lastEventTimestamp.getTime()+";fmt=JSON×tamp="+(new Date).getTime(),ftui.log(1,"websockets URL="+ftui.poll.long.URL),ftui.states.longPollRestart=!1,ftui.poll.long.websocket=new WebSocket(ftui.poll.long.URL),ftui.poll.long.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. <br /> 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.long.URL&&ftui.restartLongPoll(e)},ftui.poll.long.websocket.onerror=function(t){ftui.log(1,"Error while longpoll: "+t.data),ftui.config.debuglevel>1&&t.target.url===ftui.poll.long.URL&&(ftui.poll.long.lastErrorToast=ftui.toast("Error while longpoll (websocket)","error")),ftui.config.DEBUG&&ftui.saveStatesLocal("longPoll")},ftui.poll.long.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.poll.long.xhr)return void ftui.log(3,"longpoll: valid ftui.poll.long.xhr found");if(ftui.poll.long.request)return void ftui.log(3,"longpoll: valid ftui.poll.long.request found");ftui.poll.long.currLine=0,ftui.poll.long.lastErrorToast&&ftui.poll.long.lastErrorToast.reset(),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.poll.long.request=$.ajax({url:ftui.config.fhemDir,cache:!1,async:!0,method:"GET",data:{XHR:1,inform:"type=status;filter="+ftui.poll.long.filter+";since="+ftui.poll.long.lastEventTimestamp.getTime()+";fmt=JSON",fwcsrf:ftui.config.csrf},username:ftui.config.username,password:ftui.config.password,xhr:function(){return ftui.poll.long.xhr=new window.XMLHttpRequest,ftui.poll.long.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,"longpoll: ajax responseURL="+ftui.poll.long.xhr.responseURL),ftui.log(1,"longpoll: ajax statusText="+ftui.poll.long.xhr.statusText),ftui.poll.long.xhr}}).done(function(t){ftui.poll.long.xhr&&(ftui.poll.long.xhr.abort(),ftui.poll.long.xhr=null),ftui.poll.long.request=null,ftui.states.longPollRestart?ftui.longPoll():(ftui.log(1,"longpoll: Disconnected from FHEM - poll done - "+t),ftui.restartLongPoll(t))}).fail(function(t,e,i){ftui.poll.long.xhr&&(ftui.poll.long.xhr.abort(),ftui.poll.long.xhr=null),ftui.poll.long.request=null,ftui.states.longPollRestart?ftui.longPoll():(ftui.log(1,"longpoll: Error - text="+e+": "+i),ftui.config.debuglevel>1&&(ftui.poll.long.lastErrorToast=ftui.toast("Error while longpoll (ajax)<br>"+e+": "+i,"error")),ftui.restartLongPoll(e+": "+i))})}},handleUpdates:function(t){for(var e=t.split(/\n/),i=ftui.poll.long.currLine,n=e.length;i<n;i++){ftui.log(5,e[i]),ftui.poll.long.lastLine=e[i];var a=e[i].slice(-1);if(ftui.isValid(e[i])&&""!==e[i]&&"]"===a)try{var o=JSON.parse(e[i]),r=null,s=null,l=o[1]!==o[2],u=""===o[1]&&""===o[2];ftui.log(4,o);var f=ftui.paramIdMap[o[0]],c=ftui.timestampMap[o[0]],d=ftui.subscriptions[o[0]];f&&(l&&(f.reading="STATE"),(s=(r=ftui.deviceStates[f.device]||{})[f.reading]||{}).val=o[1],s.valid=!0,r[f.reading]=s,ftui.deviceStates[f.device]=r,l&&ftui.subscriptions[o[0]]&&(ftui.poll.long.lastDevice=f.device,ftui.poll.long.lastReading=f.reading,ftui.poll.long.lastValue=s.val,plugins.update(f.device,f.reading))),c&&!l&&((s=(r=ftui.deviceStates[c.device]||{})[c.reading]||{}).date=o[1],r[c.reading]=s,ftui.poll.long.lastUpdateTimestamp=s.date.toDate(),ftui.deviceStates[c.device]=r,ftui.subscriptionTs[o[0]]&&(ftui.poll.long.lastDevice=c.device,ftui.poll.long.lastReading=c.reading,ftui.poll.long.lastValue=s.val,plugins.update(c.device,c.reading))),u&&d&&plugins.update(d.device,d.reading)}catch(t){ftui.poll.long.lastError=t,ftui.log(1,"longpoll: Error="+t),ftui.log(1,"longpoll: Bad line="+e[i])}}ftui.poll.long.lastEventTimestamp=new Date,ftui.config.DEBUG&&(ftui.saveStatesLocal("longPoll"),ftui.saveStatesLocal("deviceStates")),ftui.updateBindElements("ftui.poll"),ftui.poll.long.websocket||(ftui.poll.long.currLine=e.length-1,ftui.poll.long.currLine>9999&&(ftui.states.longPollRestart=!0,ftui.poll.long.request.abort()))},setFhemStatus:function(t){ftui.config.DEMO?console.log("DEMO-Mode: no setFhemStatus"):(ftui.startShortPollInterval(),ftui.sendFhemCommand(t))},sendFhemCommand:function(t){var e="jsonlist"===(t=t.replace(" "," ")).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(e,i,n){ftui.toast("<u>FHEM Command failed</u><br>"+i+": "+n+" cmd="+t,"error")}})},loadStyleSchema:function(){$.each($('link[href$="-ui.css"],link[href$="-ui.min.css"]'),function(t,e){if(e&&e.sheet&&e.sheet.cssRules&&!e.getAttribute("disabled")){var i=e.sheet.cssRules;for(var n in i)if(i[n].style){var a=i[n].style.cssText.split(";");a.pop();var o=i[n].selectorText,r={};for(var s in a){var l=a[s].toString().split(":");l[0].match(/color/)&&(r[$.trim(l[0])]=ftui.rgbToHex($.trim(l[1]).replace("! important","").replace("!important","")))}Object.keys(r).length&&(ftui.config.styleCollection[o]=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&&!0===i?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.poll.short.timer),ftui.stopLongpoll(),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("ftui.deviceStates"))||{}},saveStatesLocal:function(t){try{switch(t){case"deviceStates":localStorage.setItem("ftui.deviceStates",JSON.stringify(ftui.deviceStates));break;case"shortPoll":localStorage.setItem("ftui.poll.short",JSON.stringify(ftui.poll.short));break;case"longPoll":localStorage.setItem("ftui.poll.long",JSON.stringify(ftui.poll.long));break;case"subscriptions":localStorage.setItem("ftui.subscriptions",JSON.stringify(ftui.subscriptions));break;case"config":localStorage.setItem("ftui.config",JSON.stringify(ftui.config));break;case"version":localStorage.setItem("ftui.version",JSON.stringify(ftui.version));break;case"modules":for(var e=[],i=0,n=plugins.modules.length;i<n;i++){var a=plugins.modules[i].widgetname,o=plugins.modules[i].area;e.push({name:a,area:o})}localStorage.setItem("modules",JSON.stringify(e))}}catch(t){}},getDeviceParameter:function(t,e){if(t&&t.length){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,'Start load plugin "'+t+'" for area "'+e+'"'),ftui.dynamicload(ftui.config.basedir+"js/widget_"+t+".js",!0).done(function(){var n=[],a=window["depends_"+t];if($.isFunction(a)){var o=a();o&&(o=$.isArray(o)?o:[o],$.map(o,function(t,e){t.match(new RegExp("^.*.(js|css)$"))?n.push(ftui.dynamicload(t,!1)):n.push(ftui.loadPlugin(t))}))}else ftui.log(2,"function depends_"+t+" not found (maybe ok)");$.when.apply(this,n).always(function(){var n=window["Modul_"+t]?new window["Modul_"+t]:null;if(n){if(void 0!==e){plugins.addModule(n),ftui.isValid(e)&&(n.area=e),ftui.log(1,"Try to init plugin: "+t),n.init();for(var a in n.subscriptions)n.update(n.subscriptions[a].device,n.subscriptions[a].reading)}ftui.log(1,'Finished load plugin "'+t+'" for area "'+e+'"'),$('[data-type="'+t+'"]',e).removeClass("widget-hide")}else ftui.log(1,'Failed to load plugin "'+t+'" for area "'+e+'"');i.resolve()})}).fail(function(){ftui.toast("Failed to load plugin : "+t),ftui.log(1,"Failed to load plugin : "+t+' - add <script src="js/widget_'+t+'.js" defer><\/script> do your page, to see more informations about this failure'),i.resolve()}),i.promise()},dynamicload:function(t,e){ftui.log(3,"dynamic load file:"+t+" / async:"+e);for(var i=new $.Deferred,n=!1,a=0,o=ftui.scripts.length;a<o;a++)if(ftui.scripts[a].url===t){n=!0;break}if(n)ftui.log(3,"dynamic load not neccesary for:"+t),i=ftui.scripts[a].deferred;else{if(t.match(new RegExp("^.*.(js)$"))){var r=document.createElement("script");r.type="text/javascript",r.async=!!e,r.src=t,r.onload=function(){ftui.log(3,"dynamidynamic load done:"+t),i.resolve()},document.getElementsByTagName("head")[0].appendChild(r)}else{var s=document.createElement("link");s.rel="stylesheet",s.type="text/css",s.href=t,s.media="all",i.resolve(),document.getElementsByTagName("head")[0].appendChild(s)}var l={};l.deferred=i,l.url=t,ftui.scripts.push(l)}return i.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(){var t=new Date-ftui.poll.long.lastEventTimestamp;t/1e3>ftui.config.maxLongpollAge&&ftui.config.maxLongpollAge>0&&!ftui.config.DEMO&&ftui.config.doLongPoll&&(ftui.log(1,"No longpoll event since "+t/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),n=parseInt(t.substring(4,6),16);e/=255,i/=255,n/=255;var a,o,r=Math.max(e,i,n),s=Math.min(e,i,n),l=(r+s)/2;if(r==s)a=o=0;else{var u=r-s;switch(o=l>.5?u/(2-r-s):u/(r+s),r){case e:a=(i-n)/u+(i<n?6:0);break;case i:a=(n-e)/u+2;break;case n:a=(e-i)/u+4}a/=6}return[a,o,l]},hslToRgb:function(t,e,i){var n,a,o,r,s=function(t){return("0"+parseInt(t).toString(16)).slice(-2)};if(0===e)n=a=o=i;else{r=function(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+(e-t)*(2/3-i)*6:t};var l=i<.5?i*(1+e):i+e-i*e,u=2*i-l;n=r(u,l,t+1/3),a=r(u,l,t),o=r(u,l,t-1/3)}return[s(Math.round(255*n)),s(Math.round(255*a)),s(Math.round(255*o))].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 n=parseInt(t.substr(0,2),16),a=parseInt(t.substr(2,2),16),o=parseInt(t.substr(4,2),16),r=parseInt(e.substr(0,2),16)-n,s=parseInt(e.substr(2,2),16)-a,l=parseInt(e.substr(4,2),16)-o;return r=(r*i+n).toString(16).split(".")[0],s=(s*i+a).toString(16).split(".")[0],l=(l*i+o).toString(16).split(".")[0],1==r.length&&(r="0"+r),1==s.length&&(s="0"+s),1==l.length&&(l="0"+l),"#"+r+s+l},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 n="";if(ftui.isValid(t)){var a=t.match(new RegExp("^"+e+"$"));if(a)for(var o=1,r=a.length;o<r;o++)n+=a[o]}return n}return t},showModal:function(t){t?$("#shade").fadeIn(ftui.config.fadeTime):$("#shade").fadeOut(ftui.config.fadeTime)},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,n=t.length;i<n;i++)if(!$.isNumeric(t[i]))return ftui.indexOfRegex(t,e);return ftui.indexOfNumeric(t,e)},indexOfNumeric:function(t,e){for(var i=-1,n=0,a=t.length;n<a;n++)Number(e)>=Number(t[n])&&(i=n);return i},indexOfRegex:function(t,e){for(var i=t.length,n=0;n<i;n++)try{if(e.match(new RegExp("^"+t[n]+"$")))return n}catch(t){}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 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+)$/),n=t.match(/(\d\d).(\d\d).(\d\d\d\d)/),a=(new Date).getTimezoneOffset();return e?new Date(+e[1],+e[2]-1,+e[3],+e[4],+e[5],+e[6]):i?new Date(70,0,1,0,0,i[1],0):n?new Date(+n[3],+n[2]-1,+n[1],0,-a,0,0):new Date},diffMinutes:function(t,e){return(new Date(e-t)/1e3/60).toFixed(0)},diffSeconds:function(t,e){return(new Date(e-t)/1e3).toFixed(1)},durationFromSeconds:function(t){var e=Math.floor(t/3600),i=Math.floor(t%3600/60),n=t%60,a="";return e>0&&(a+=e+":"+(i<10?"0":"")),a+=i+":"+(n<10?"0":""),a+=""+n},mapColor:function(t){return ftui.getStyle("."+t,"color")||t},round:function(t,e){var i=function(t,e,i){i&&(e=-e);var n=(""+t).split("e");return+(n[0]+"e"+(n[1]?+n[1]+e:e))};return i(Math.round(i(t,e,!1)),e,!0)},parseJsonFromString:function(t){return JSON.parse(t)},getAndroidVersion:function(t){var e=(t=(t||navigator.userAgent).toLowerCase()).match(/android\s([0-9\.]*)/);return!!e&&e[1]},getStyle:function(t,e){var i=ftui.config.styleCollection[t],n=i&&i[e]?i[e]:null;if(null===n){var a="."+t.split(".").reverse().join(".");a=a.substring(0,a.length-1),n=(i=ftui.config.styleCollection[a])&&i[e]?i[e]:null}return n},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 n in i)if(i[n].selectorText&&i[n].selectorText.match(new RegExp(t+":"))){var a=i[n].style.content;return a?(a=a.replace(/"/g,"").replace(/'/g,""),/[^\u0000-\u00ff]/.test(a)?a:String.fromCharCode(parseInt(a.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;if(1==ftui.config.TOAST&&(i=!1),e&&"error"===e){if(f7)f7.ftui.addNotification({title:"FTUI",message:t,hold:1500});else if($.toast)return $.toast({heading:"Error",text:t,hideAfter:2e4,icon:"error",loader:!1,position:ftui.config.toastPosition,stack:i})}else if(f7)f7.ftui.addNotification({title:"FTUI",message:t,hold:1500});else if($.toast)return $.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.toMinFromMs=function(){var t=Number(this)/1e3,e=Math.floor(t%60).toString();return Math.floor(t/=60).toString()+":"+(e[1]?e:"0"+e[0])},String.prototype.toMinFromSec=function(){var t=Number(this),e=Math.floor(t%60).toString();return Math.floor(t/=60).toString()+":"+(e[1]?e:"0"+e[0])},String.prototype.toHoursFromMin=function(){var t=Number(this),e=Math.floor(t/60).toString(),i=(t-60*e).toString();return e+":"+(i[1]?i:"0"+i[0])},String.prototype.toHoursFromSec=function(){var t=Number(this),e=Math.floor(t/3600).toString(),i=Math.floor(t%60).toString(),n=(Math.floor(t/60)-60*e).toString();return e+":"+(n[1]?n:"0"+n[0])+":"+(i[1]?i:"0"+i[0])},String.prototype.addFactor=function(t){return Number(this)*t},Date.prototype.addMinutes=function(t){return new Date(this.getTime()+6e4*t)},Date.prototype.ago=function(t){var e=(new Date-this)/1e3,i=Math.floor(e%60);e/=60;var n=Math.floor(e%60);e/=60;var a=Math.floor(e%24);e/=24;var o,r=Math.floor(e),s="de"===ftui.config.lang?["Tag(e)","Stunde(n)","Minute(n)","Sekunde(n)"]:["day(s)","hour(s)","minute(s)","second(s)"];return ftui.isValid(t)?o=(o=(o=(o=(o=(o=(o=t.replace("dd",r)).replace("hh",a>9?a:"0"+a)).replace("mm",n>9?n:"0"+n)).replace("ss",i>9?i:"0"+i)).replace("h",a)).replace("m",n)).replace("s",i):(o=r>0?r+" "+s[0]+" ":"",o+=a>0?a+" "+s[1]+" ":"",o+=n>0?n+" "+s[2]+" ":"",o+=i+" "+s[3]),o},Date.prototype.format=function(t){var e=this.getFullYear().toString(),i=this.getYear().toString(),n=(this.getMonth()+1).toString(),a=this.getDate().toString(),o=this.getHours().toString(),r=this.getMinutes().toString(),s=this.getSeconds().toString(),l=this.eeee(),u=this.eee(),f=this.ee(),c=t;return c=c.replace("DD",a>9?a:"0"+a),c=c.replace("D",a),c=c.replace("MM",n>9?n:"0"+n),c=c.replace("M",n),c=c.replace("YYYY",e),c=c.replace("YY",i),c=c.replace("hh",o>9?o:"0"+o),c=c.replace("mm",r>9?r:"0"+r),c=c.replace("ss",s>9?s:"0"+s),c=c.replace("h",o),c=c.replace("m",r),c=c.replace("s",s),c=c.replace("eeee",l),c=c.replace("eee",u),c=c.replace("ee",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(),n=this.getMinutes().toString();return(e[1]?e:"0"+e[0])+"."+(t[1]?t:"0"+t[0])+". "+(i[1]?i:"0"+i[0])+":"+(n[1]?n:"0"+n[0])},Date.prototype.eeee=function(){return"de"===ftui.config.lang?["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"][this.getDay()]:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"][this.getDay()]},Date.prototype.eee=function(){return"de"===ftui.config.lang?["Son","Mon","Die","Mit","Don","Fre","Sam"][this.getDay()]:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"][this.getDay()]},Date.prototype.ee=function(){return"de"===ftui.config.lang?["So","Mo","Di","Mi","Do","Fr","Sa"][this.getDay()]:["Su","Mo","Tu","We","Th","Fr","Sa"][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(){jQuery(document).ready(function(){console.log("jQuery dynamically loaded"),onjQueryLoaded()})},script.src=ftui.config.basedir+"lib/jquery.min.js",document.getElementsByTagName("head")[0].appendChild(script)}
|