yunkong2.admin
Version:
The adapter opens a webserver for the yunkong2 admin UI.
1 lines • 390 kB
JavaScript
"use strict";Array.prototype.remove=function(){for(var e,t,n=arguments,i=n.length;i&&this.length;)for(e=n[--i];-1!==(t=this.indexOf(e));)this.splice(t,1);return this},console.debug||(console.debug=console.log),"undefined"==typeof Number&&(console.log("define Number"),Number=function(e){return parseFloat(e)}),Object.assign||(Object.assign=$.extend);var $iframeDialog=null,configNotSaved=null,showConfig=null,defaults={},customPostInits={},FORBIDDEN_CHARS=/[\]\[*,;'"`<>\\\s?]/g,adapterRedirect=function(e,t){e&&setTimeout(function(){e+=document.location.pathname,e+=document.location.hash,document.location.href=e},t||5e3)},gMain=null;function detectIE(){var e=window.navigator.userAgent,t=e.indexOf("MSIE ");if(0<t)return parseInt(e.substring(t+5,e.indexOf(".",t)),10);if(0<e.indexOf("Trident/")){var n=e.indexOf("rv:");return parseInt(e.substring(n+3,e.indexOf(".",n)),10)}var i=e.indexOf("Edge/");return 0<i&&parseInt(e.substring(i+5,e.indexOf(".",i)),10)}function Adapters(e){var H=this;function t(){H.$grid.show(),H.$tiles.html("").hide(),H.$tab.find("#main-toolbar-table-types-btn").hide(),H.$grid.data("inited")?(H.$tab.find("#btn_collapse_adapters").show(),H.$tab.find("#btn_expand_adapters").show(),H.$tab.find("#btn_list_adapters").show()):(H.$grid.data("inited",!0),H.$grid.fancytree({extensions:["table","gridnav","filter","themeroller"],checkbox:!1,strings:{noData:_("No data")},table:{indentation:5},show:function(e,t,n){H.sortTree()},source:H.tree,renderColumns:function(e,t){var n=t.node,i=$(n.tr).find(">td"),a=H.data[n.key];function s(e){return'<div class="text-ellipsis">'+e+"</div>"}if(a){i.eq(0).css({overflow:"hidden","white-space":"nowrap"});var o=a.desc.indexOf("<div"),r=0<=o?a.desc.substr(0,o):a.desc;i.eq(1).html(s(a.desc)).attr("title",r).css({"white-space":"nowrap",position:"relative","font-weight":a.bold?"bold":null}).find(">div>div").css("height: 22px !important"),u(2,a.keywords).attr("title",a.keywords),i.eq(3).html(a.installed),i.eq(4).html(a.version),u(5,a.license),u(6,a.install),H.initButtons(n.key),H.isCollapsed[a.group]&&(H.isCollapsed[a.group]=!1,H.main.saveConfig("adaptersIsCollapsed",JSON.stringify(H.isCollapsed)))}else{i.eq(0).css({"font-weight":"bold"}),i.eq(0).find("img").remove(),i.eq(0).find("span.fancytree-title").attr("style","padding-left: 0px !important");for(var c=0;c<H.tree.length;c++)if(H.tree[c].key===n.key){i.eq(1).html(H.tree[c].desc||"").css({overflow:"hidden","white-space":"nowrap",position:"relative"});for(var l=0,d=0;d<H.tree[c].children.length;d++)H.data[H.tree[c].children[d].key].installed&&l++;H.tree[c].installed=l,n.data.installed=l,'[<span title="'+_("Installed from group")+'">'+l+'</span> / <span title="'+_("Total count in group")+'">'+H.tree[c].children.length+"</span>]",i.eq(1).html(s('<span class="dark-green">'+l+"</span> "+_("of")+'<span class="dark-blue"> '+H.tree[c].children.length+"</span> "+_("Adapters from this Group installed")));break}}function u(e,t){return i.eq(e).html(s(t))}},gridnav:{autofocusInput:!1,handleCursorKeys:!0},filter:{mode:"hide",autoApply:!0},collapse:function(e,t){H.isCollapsed[t.node.key]||(H.isCollapsed[t.node.key]=!0,H.main.saveConfig("adaptersIsCollapsed",JSON.stringify(H.isCollapsed)))}}),H.$tab.find("#btn_collapse_adapters").show().off("click").on("click",function(){H.$tab.find(".process-adapters").show(),setTimeout(function(){H.$grid.fancytree("getRootNode").visit(function(e){(!H.filterVals.length||e.match||e.subMatch)&&e.setExpanded(!1)}),H.$tab.find(".process-adapters").hide()},100)}),H.$tab.find("#btn_expand_adapters").show().off("click").on("click",function(){H.$tab.find(".process-adapters").show(),setTimeout(function(){H.$grid.fancytree("getRootNode").visit(function(e){(!H.filterVals.length||e.match||e.subMatch)&&e.setExpanded(!0)}),H.$tab.find(".process-adapters").hide()},100)}),H.$tab.find("#btn_list_adapters").show().off("click").on("click",function(){var e=H.$tab.find(".process-adapters");e.show(),H.isList=!H.isList,H.isList?(H.$tab.find("#btn_list_adapters").addClass("red lighten-3"),H.$tab.find("#btn_expand_adapters").hide(),H.$tab.find("#btn_collapse_adapters").hide(),$(this).attr("title",_("list"))):(H.$tab.find("#btn_list_adapters").removeClass("red lighten-3"),H.$tab.find("#btn_expand_adapters").show(),H.$tab.find("#btn_collapse_adapters").show(),$(this).attr("title",_("tree"))),H.main.saveConfig("adaptersIsList",H.isList),e.show(),setTimeout(function(){H._postInit(!0),e.hide()},200)})),H.isList?(H.$tab.find("#btn_list_adapters").addClass("red lighten-3").attr("title",_("tree")),H.$tab.find("#btn_expand_adapters").hide(),H.$tab.find("#btn_collapse_adapters").hide()):(H.$tab.find("#btn_list_adapters").removeClass("red lighten-3").attr("title",_("list")),H.$tab.find("#btn_expand_adapters").show(),H.$tab.find("#btn_collapse_adapters").show()),H.$tab.find(".filter-input").trigger("change")}function n(){H.$grid.hide(),H.$tiles.show(),H.$tab.find("#main-toolbar-table-types-btn").show(),H.$tab.find("#btn_list_adapters").hide(),H.$tab.find("#btn_collapse_adapters").hide(),H.$tab.find("#btn_expand_adapters").hide(),H.$tab.find(".filter-input").trigger("change")}function i(){H.onlyUpdatable?(H.$tab.find("#btn_filter_updates").addClass("red lighten-3"),H.$tab.find("#btn_upgrade_all").show()):(H.$tab.find("#btn_upgrade_all").hide(),H.$tab.find("#btn_filter_updates").removeClass("red lighten-3"))}function a(){H.main.config.expertMode?(H.$tab.find("#btn_adapters_expert_mode").addClass("red lighten-3"),H.$tab.find("#btn_upgrade_all").show()):(H.$tab.find("#btn_adapters_expert_mode").removeClass("red lighten-3"),i())}function B(){var t=!1;H.currentFilter?H.$tiles.find(".tile").each(function(){var e=$(this);(!H.currentType||e.hasClass("class-"+H.currentType))&&G({key:e.data("id")})?(t=!0,e.show()):e.hide()}):H.currentType?(H.$tiles.find(".tile").hide(),H.$tiles.find(".class-"+H.currentType).show(),H.$tiles.find(".tile").each(function(){if($(this).is(":visible"))return!(t=!0)})):H.$tiles.find(".tile").show().each(function(){if($(this).is(":visible"))return!(t=!0)}),t?H.$tiles.find(".filtered-out").hide():H.$tiles.find(".filtered-out").show()}function G(e){if(H.currentFilter){if(!H.data[e.key])return!1;var t=H.data[e.key].title;t&&"object"==typeof t&&(t=t[systemLang]||t.en);var n=H.data[e.key].desc;return n&&"object"==typeof n&&(n=n[systemLang]||n.en),!!(H.data[e.key].name&&-1!==H.data[e.key].name.toLowerCase().indexOf(H.currentFilter)||t&&-1!==t.toLowerCase().indexOf(H.currentFilter)||H.data[e.key].keywords&&-1!==H.data[e.key].keywords.toLowerCase().indexOf(H.currentFilter)||n&&-1!==n.toLowerCase().indexOf(H.currentFilter))}return!0}function F(e,t){var n="";if(t.news)for(var i in t.news)if(t.news.hasOwnProperty(i)){if(systemLang===i&&(n+=(n?"\n":"")+t.news[i]),"en"===i||"cn"===i)continue;if(i===e)break;n+=(n?"\n":"")+(t.news[i][systemLang]||t.news[i].en)}return n}function Z(e){if(!e)return"";var t;if(e instanceof Array){t={};for(var n=0;n<e.length;n++)if("string"!=typeof e[n])for(var i in e[n])e[n].hasOwnProperty(i)&&(t[i]=e[n][i])}else t=e;for(var a in t)if(t.hasOwnProperty(a))if("js-controller"===a){if(!semver.satisfies(H.main.objects["system.host."+H.main.currentHost].common.installedVersion,t[a]))return _("Invalid version of %s. Required %s",a,t[a])}else{if(!H.main.objects["system.adapter."+a]||!H.main.objects["system.adapter."+a].common||!H.main.objects["system.adapter."+a].common.installedVersion)return _("No version of %s",a);if(!semver.satisfies(H.main.objects["system.adapter."+a].common.installedVersion,t[a]))return _("Invalid version of %s",a)}return""}function J(e,t,n,i,a,s,o){if(o=o||Date.now(),!e)return"";"string"!=typeof e&&"number"!=typeof e||(e=new Date(e));var r=o.getTime()-e.getTime(),c=Math.floor(r/864e5);if(0===c)return o.getDate()===e.getDate()?t:n;if(1===c)return o.getDate()-e.getDate()==1?n:a.replace("%d",c+1);var l=c%10,d=c%100;return(d<10||20<d)&&2<=l&&l<=4?a.replace("%d",c):(d<10||20<d)&&1===l?i.replace("%d",c):s.replace("%d",c)}function W(e,t,n){var i="";return t||"string"==typeof e?(t||(i+='<div class="group-upload-progress"'),!0):(n=e,e=null),n&&(i+='<table style="height: 3px; " title="'+_("Upload")+" "+n+'%" class="no-space" style="width:100%; height: 100%; opacity: 0.7"><tr style="height: 100%" class="no-space"><td class="no-space" style="width:'+n+'%;background: blue"></td><td style="width:'+(100-n)+'%;opacity: 0.1" class="no-space"></td></tr></table>'),i}this.curRepository=null,this.curRepoLastUpdate=null,this.curInstalled=null,this.curRepoLastHost=null,this.list=[],this.$tab=$("#tab-adapters"),this.$grid=this.$tab.find("#grid-adapters"),this.$tiles=this.$tab.find("#grid-adapters-tiles"),this.$installDialog=$("#dialog-install-url"),this.main=e,this.tree=[],this.data={},this.urls={},this.groupImages={"common adapters_group":"img/common.png",general_group:"img/common.png",hardware_group:"img/hardware.png",lighting_group:"img/hardware.png",energy_group:"img/hardware.png",household_group:"img/hardware.png","iot-systems_group":"img/hardware.png","climate-control_group":"img/hardware.png",infrastructure_group:"img/hardware.png",garden_group:"img/hardware.png",alarm_group:"img/hardware.png",script_group:"img/script.png",logic_group:"img/script.png",media_group:"img/media.png",multimedia_group:"img/media.png",communication_group:"img/communication.png",protocols_group:"img/communication.png",network_group:"img/communication.png",messaging_group:"img/communication.png",visualisation_group:"img/visualisation.png",visualization_group:"img/visualisation.png","visualization-icons_group":"img/visualisation.png","visualization-widgets_group":"img/visualisation.png",storage_group:"img/storage.png",weather_group:"img/weather.png",schedule_group:"img/schedule.png",vis_group:"img/vis.png","date-and-time_group":"img/service.png",geoposition_group:"img/service.png",utility_group:"img/service.png","misc-data_group":"img/service.png",service_group:"img/service.png","third-party_group":"img/service.png"},this.inited=!1,this.isList=!1,this.filterVals={length:0},this.onlyInstalled=!1,this.onlyUpdatable=!1,this.currentFilter="",this.currentType="",this.isCollapsed={},this.isTiles=!0,this.types={occ:"schedule"},this.prepare=function(){this.$tab.find("#btn_switch_adapters").off("click").on("click",function(){H.$tab.find(".process-adapters").show(),H.isTiles=!H.isTiles,H.isTiles?(H.$tab.removeClass("view-table").addClass("view-tiles"),$(this).find("i").text("view_list")):($(this).find("i").text("view_module"),H.$tab.removeClass("view-tiles").addClass("view-table")),H.main.saveConfig("adaptersIsTiles",H.isTiles),setTimeout(function(){H.isTiles?n():t(),H._postInit(!0),H.$tab.find(".process-adapters").hide()},50)}),this.$tab.find("#btn_filter_adapters").off("click").on("click",function(){H.$tab.find(".process-adapters").show(),H.onlyInstalled=!H.onlyInstalled,H.onlyInstalled?H.$tab.find("#btn_filter_adapters").addClass("red lighten-3"):H.$tab.find("#btn_filter_adapters").removeClass("red lighten-3"),H.main.saveConfig("adaptersOnlyInstalled",H.onlyInstalled),setTimeout(function(){H._postInit(!0),H.$tab.find(".process-adapters").hide()},50)}),this.$tab.find("#btn_filter_updates").off("click").on("click",function(){H.$tab.find(".process-adapters").show(),H.onlyUpdatable=!H.onlyUpdatable,i(),H.main.saveConfig("adaptersOnlyUpdatable",H.onlyUpdatable),setTimeout(function(){H._postInit(!0),H.$tab.find(".process-adapters").hide()},200)}),this.$tab.find("#btn_filter_custom_url").off("click").on("click",function(){var e,t='<option value="">'+_("none")+"</option>",n=[];for(e in H.urls)H.urls.hasOwnProperty(e)&&n.push(e);n.sort();for(var i=0;i<n.length;i++){var a=H.urls[n[i]].match(/\.com\/([-_$§A-Za-z0-9]+)\/([-._$§A-Za-z0-9]+)\//);a&&2<=a.length&&(H.main.config.expertMode||-1===n[i].indexOf("js-controller"))&&(t+='<option value="https://git.spacen.net/'+a[1]+"/yunkong2."+n[i]+"/tarball/master "+n[i]+'">'+n[i]+"</option>")}H.$installDialog.find("#install-github-link").html(t).val(H.main.config.adaptersGithub||""),H.$installDialog.modal(),H.$installDialog.find(".btn-install").off("click").on("click",function(){var e,t,n;if(!H.$installDialog.find('a[href="#tabs-install-github"]').hasClass("active"))(e=H.$installDialog.find("#install-url-link").val()).startsWith("http")&&e.endsWith(".git")&&(e="git+"+e),t=H.$installDialog.find("#install-url-debug").prop("checked")?" --debug":"",n="";else{var i=H.$installDialog.find("#install-github-link").val().split(" ");e=i[0],t=H.$installDialog.find("#install-github-debug").prop("checked")?" --debug":"",n=" "+i[1]}e?H.main.cmdExec(null,'url "'+e+'"'+n+t,function(e){e||H.init(!0,!0)}):H.main.showError(_("Invalid link"))}),H.$installDialog.find("#install-github-link").select(),H.$installDialog.find('input[type="checkbox"]+span').off("click").on("click",function(){var e=$(this).prev();e.prop("disabled")||e.prop("checked",!e.prop("checked")).trigger("change")}),H.$installDialog.modal("open"),H.$installDialog.find(".tabs").mtabs({nShow:function(e){e&&H.main.saveConfig("adaptersInstallTab",$(e).attr("id"))}}),H.main.config.adaptersInstallTab&&!H.main.noSelect&&H.$installDialog.find(".tabs").mtabs("select",H.main.config.adaptersInstallTab)}),this.$tab.find("#btn_upgrade_all").off("click").on("click",function(){H.main.confirmMessage(_("Do you want to upgrade all adapters?"),_("Please confirm"),"help",function(e){e&&H.main.cmdExec(null,"upgrade",function(e){e||H._postInit(!0)})})}),this.$tab.find("#btn_adapters_expert_mode").on("click",function(){H.main.config.expertMode=!H.main.config.expertMode,H.main.saveConfig("expertMode",H.main.config.expertMode),H.updateExpertMode(),H.main.tabs.instances.updateExpertMode()}),H.main.config.expertMode&&H.$tab.find("#btn_adapters_expert_mode").addClass("red lighten-3"),this.$installDialog.find("#install-github-link").on("change",function(){H.main.saveConfig("adaptersGithub",$(this).val())}),this.$installDialog.find("#install-url-link").on("keyup",function(e){13===e.which&&H.$installDialog.find("#dialog-install-url-button").trigger("click")}),this.isTiles=void 0===this.main.config.adaptersIsTiles||null===this.main.config.adaptersIsTiles||this.main.config.adaptersIsTiles,this.isList=this.main.config.adaptersIsList||!1,this.onlyInstalled=this.main.config.adaptersOnlyInstalled||!1,this.onlyUpdatable=this.main.config.adaptersOnlyUpdatable||!1,this.currentFilter=this.main.config.adaptersCurrentFilter||"",this.currentType=this.main.config.adaptersCurrentType||"",this.currentOrder=this.main.config.adaptersCurrentOrder||"a-z",this.isCollapsed=this.main.config.adaptersIsCollapsed?JSON.parse(this.main.config.adaptersIsCollapsed):{},this.currentFilter?(this.$tab.find(".filter-input").addClass("input-not-empty").val(H.currentFilter),this.$tab.find(".filter-clear").show()):this.$tab.find(".filter-clear").hide(),this.onlyInstalled?this.$tab.find("#btn_filter_adapters").addClass("red lighten-3"):this.$tab.find("#btn_filter_adapters").removeClass("red lighten-3"),this.onlyUpdatable?this.$tab.find("#btn_filter_updates").addClass("red lighten-3"):this.$tab.find("#btn_filter_updates").removeClass("red lighten-3"),"ie"===this.main.browser&&this.main.browserVersion<=10&&(this.isTiles=!1,this.$tab.find("#btn_switch_adapters").hide()),a(),this.$tab.find("#btn_refresh_adapters").on("click",function(){H.init(!0,!0)}),this.$tab.find(".filter-input").on("keyup",function(){$(this).trigger("change")}).on("change",function(e){H.filterTimer&&clearTimeout(H.filterTimer),H.filterTimer=setTimeout(function(){H.filterTimer=null,H.currentFilter=H.$tab.find(".filter-input").val().toLowerCase(),e&&e.target&&$(e.target)[H.currentFilter?"addClass":"removeClass"]("input-not-empty"),H.currentFilter?H.$tab.find(".filter-clear").show():H.$tab.find(".filter-clear").hide(),H.main.saveConfig("adaptersCurrentFilter",H.currentFilter),H.isTiles?B():H.$grid.fancytree("getTree").filterNodes(G,!1)},400)}),this.$tab.find(".filter-clear").on("click",function(){H.$tab.find(".filter-input").val("").trigger("change")}),this.isTiles?(this.$tab.find("#btn_switch_adapters").find("i").text("view_list"),H.$tab.removeClass("view-table").addClass("view-tiles"),n()):(H.$tab.removeClass("view-tiles").addClass("view-table"),t())},this.updateExpertMode=function(){this.init(!0),a()},this.getAdaptersInfo=function(e,t,n,i){if(e){if(!i)throw"Callback cannot be null or undefined";t&&(!this.curRepoLastUpdate||1e3<(new Date).getTime()-this.curRepoLastUpdate)&&(this.curRepository=null,this.curInstalled=null),this.curRunning?this.curRunning.push(i):(this.curRepository&&this.curRepoLastHost===e||(this.curRepository=null,this.main.socket.emit("sendToHost",e,"getRepository",{repo:this.main.systemConfig.common.activeRepo,update:n},function(e){"permissionError"===e&&(console.error('May not read "getRepository"'),e={}),H.curRepository=e||{},H.curRepository&&H.curInstalled&&H.curRunning&&(H.curRepoLastUpdate=(new Date).getTime(),setTimeout(function(){for(var e=0;e<H.curRunning.length;e++)H.curRunning[e](H.curRepository,H.curInstalled);H.curRunning=null},0))})),this.curInstalled&&this.curRepoLastHost===e||(this.curInstalled=null,this.main.socket.emit("sendToHost",e,"getInstalled",null,function(e){"permissionError"===e&&(console.error('May not read "getInstalled"'),e={}),H.curInstalled=e||{},H.curRepository&&H.curInstalled&&(H.curRepoLastUpdate=(new Date).getTime(),setTimeout(function(){for(var e=0;e<H.curRunning.length;e++)H.curRunning[e](H.curRepository,H.curInstalled);H.curRunning=null},0))})),this.curRepoLastHost=e,this.curInstalled&&this.curRepository?setTimeout(function(){if(H.curRunning){for(var e=0;e<H.curRunning.length;e++)H.curRunning[e](H.curRepository,H.curInstalled);H.curRunning=null}i&&i(H.curRepository,H.curInstalled)},0):this.curRunning=[i])}},this.enableColResize=function(){$.fn.colResizable&&this.$grid.is(":visible")&&this.$grid.colResizable({liveDrag:!0})},this.sortTree=function(){H.$grid.fancytree("getRootNode").sortChildren(function(e,t){var n=e.data.installed||0,i=(t.data.installed||0)-n;if(i)return i;var a=e.titleLang||e.title||"";"object"==typeof a&&(a=a[systemLang]||a.en);var s=t.titleLang||t.title||"";return"object"==typeof s&&(s=s[systemLang]||s.en),a=a.toLowerCase(),(s=s.toLowerCase())<a?1:a<s?-1:0},!0)},this._postInit=function(e,t){void 0!==this.$grid?(H.$tab.find(".process-adapters").show(),this.$grid.find("tbody").html(""),this.getAdaptersInfo(this.main.currentHost,e,t,function(e,t){var n,i,a,o,s=0,r=[],c=[],l=new Date,d={"add instance":_("add instance"),update:_("update"),upload:_("upload"),"Available version:":_("Available version:"),"Active instances":_("Active instances"),"Installed version":_("Installed version"),readme:_("readme"),"delete adapter":_("delete adapter"),"install specific version":_("install specific version"),all:_("all"),"Last update":_("Last update"),"Installations counter":_("Installation counter"),today:_("today"),yesterday:_("yesterday"),"1 %d days ago":_("1 %d days ago"),"2 %d days ago":_("2 %d days ago"),"5 %d days ago":_("5 %d days ago")};if(t){for(o in t)t.hasOwnProperty(o)&&(n=t[o])&&!n.controller&&"hosts"!==o&&r.push(o);r.sort()}for(o in H.urls={},e)e.hasOwnProperty(o)&&(t&&t[o]&&!t[o].versionDate&&(t[o].versionDate=e[o].versionDate),e[o].nogit||(H.urls[o]=e[o].meta),(n=e[o])&&!n.controller&&(i="",t&&t[o]||c.push(o)));function u(e,t,n,i){var a=function(e){if(e){var t=e.split(".");e="0"===t[0]&&"0"===t[1]&&"0"===t[2]?"planned":"0"===t[0]&&"0"===t[1]?"alpha":"0"===t[0]?"beta":"npm error"===e?"error":"stable"}return e}(e),s=a+"\n\r"+(n||"");return e='<table style="cursor: alias; width: 100%; text-align: center; border: 0; border-spacing: 0;'+(n?"color: blue;":"")+'" cellspacing="0" cellpadding="0" class="ui-widget"><tr class="'+a+'Bg"><td title="'+d["Available version:"]+" "+s+'" class="actual-version">'+e+'</td><td style="border: 0; padding: 0; width: 30px" class="update-version">',t&&(e+='<button class="adapter-update-submit small-button m" data-adapter-name="'+o+'" '+(i?' disabled title="'+i+'"':'title="'+d.update+'"')+'><i class="material-icons">refresh</i></button>'),e+="</td></tr></table>"}c.sort(),H.tree=[],H.data={};for(var m=0;m<r.length;m++)if(o=r[m],(n=t?t[o]:null)&&!n.controller&&"hosts"!==o){var g="",h="",f=n.icon;i="",e[o]&&e[o].version&&(i=e[o].version),e[o]&&e[o].extIcon&&(f=e[o].extIcon);var p=0,b=0;if(n.version){var M="",y=!1,v="";H.main.upToDate(i,n.version)||(M=F(n.version,e[o]),y=!0,v=Z(e[o].dependencies),s++),g='<table style="min-width: 80px; text-align: center; border: 0; border-spacing: 0;" cellspacing="0" cellpadding="0" class="ui-widget"><tr>';for(var w=0;w<H.main.instances.length;w++)H.main.objects[H.main.instances[w]]&&H.main.objects[H.main.instances[w]].common.name===o&&(p++,H.main.objects[H.main.instances[w]].common.enabled&&b++);if(p?(g+='<td style="border: 0; text-align: center; padding: 0; width: 40px">',b!==p&&(g+='<span title="'+_("Installed instances")+'">'+p+"</span>",b&&(g+=" ~ ")),b&&(g+='<span title="'+d["Active instances"]+'" class="true">'+b+"</span>"),g+="</td>"):g+='<td style="border: 0; padding: 0; width: 40px"></td>',g+='<td style="border: 0; padding: 0; width: 50px" title="'+d["Installed version"]+'">'+n.version+"</td>",h='<span class="installed" title="'+d["Installed version"]+'">'+n.version+"</span>",g+="</tr></table>",!y&&H.onlyUpdatable)continue}i=u(a=i,y,M,v);var j=(n.type||H.types[o]||"common adapters")+"_group";C=(C="object"==typeof n.desc?n.desc[systemLang]||n.desc.en:n.desc)||"",C+=W(j,o,H.main.states["system.adapter."+o+".upload"]?H.main.states["system.adapter."+o+".upload"].val:0);var N=n.titleLang||n.title;if(N="object"==typeof N?N[systemLang]||N.en:N,H.data[o]={image:f?'<img onerror="this.src=\'img/info-big.png\';" src="'+f+'" class="adapter-table-icon" />':"",icon:f||"",stat:e[o]?e[o].stat:0,name:o,title:(N||"").replace("yunkong2 Visualisation - ",""),desc:C,news:M,updatableError:v,keywords:n.keywords?n.keywords.join(" "):"",version:i,installed:g,rawVersion:a,instances:p,rawInstalled:h,versionDate:n.versionDate,updatable:y,bold:n.highlight||!1,install:'<button data-adapter-name="'+o+'" class="adapter-install-submit small-button m" title="'+d["add instance"]+'" data-adapter-desc="'+C+'"><i class="material-icons">add_circle_outline</i></button><button '+(n.readme?"":'disabled="disabled" ')+'data-adapter-name="'+o+'" data-adapter-url="'+(n.readme||"")+'" class="adapter-readme-submit small-button" title="'+d.readme+'"><i class="material-icons">help_outline</i></button>'+(H.main.config.expertMode?'<button data-adapter-name="'+o+'" class="adapter-upload-submit small-button" title="'+d.upload+'"><i class="material-icons">file_upload</i></button>':"")+"<button "+(g?"":'disabled="disabled" ')+'data-adapter-name="'+o+'" class="adapter-delete-submit small-button" title="'+d["delete adapter"]+'"><i class="material-icons">delete_forever</i></button>'+(H.main.config.expertMode?'<button data-adapter-name="'+o+'" data-target="adapters-menu" class="adapter-update-custom-submit small-button" title="'+d["install specific version"]+'"><i class="material-icons">add_to_photos</i></button>':""),group:j,license:n.license||"",licenseUrl:n.licenseUrl||""},n.type||console.log('"'+o+'": "common adapters",'),n.type&&H.types[o]&&console.log('Adapter "'+o+'" has own type. Remove from admin.'),H.isList)H.tree.push({icon:f,title:H.data[o].title||o,key:o});else{for(var T=-1,L=0;L<H.tree.length;L++)if(H.tree[L].key===H.data[o].group){T=L;break}T<0&&(d[H.data[o].group]||(d[H.data[o].group]=_(H.data[o].group)),H.tree.push({title:d[H.data[o].group],desc:W(j),key:H.data[o].group,folder:!0,expanded:!H.isCollapsed[H.data[o].group],children:[],icon:H.groupImages[H.data[o].group]}),T=H.tree.length-1),H.tree[T].children.push({icon:f,title:H.data[o].title||o,key:o})}}if(!H.onlyInstalled&&!H.onlyUpdatable)for(m=0;m<c.length;m++)if((n=e[o=c[m]])&&!n.controller&&(i="",!t||!t[o])){n&&n.version&&(i=u(a=i=n.version));var C;j=(n.type||H.types[o]||"common adapters")+"_group";if(C=(C="object"==typeof n.desc?n.desc[systemLang]||n.desc.en:n.desc)||"",C+=W(j,o,H.main.states["system.adapter."+o+".upload"]?H.main.states["system.adapter."+o+".upload"].val:0),N="object"==typeof(N=n.titleLang||n.title)?N[systemLang]||N.en:N,H.data[o]={image:n.extIcon?'<img onerror="this.src=\'img/info-big.png\';" src="'+n.extIcon+'" class="adapter-table-icon" />':"",icon:n.extIcon,stat:n.stat,name:o,title:(N||"").replace("yunkong2 Visualisation - ",""),desc:C,keywords:n.keywords?n.keywords.join(" "):"",rawVersion:a,version:i,bold:n.highlight,installed:"",versionDate:n.versionDate,install:'<button data-adapter-name="'+o+'" class="adapter-install-submit small-button" title="'+d["add instance"]+'" data-adapter-desc="'+C+'"><i class="material-icons">add_circle_outline</i></button><button '+(n.readme?"":'disabled="disabled" ')+' data-adapter-name="'+o+'" data-adapter-url="'+(n.readme||"")+'" class="adapter-readme-submit small-button" title="'+d.readme+'"><i class="material-icons">help_outline</i></button><button data-adapter-name="'+o+'" class="adapter-delete-submit small-button hide" title="'+d["delete adapter"]+'"><i class="material-icons">delete_forever</i></button>'+(H.main.config.expertMode?'<button data-adapter-name="'+o+'" data-target="adapters-menu" class="adapter-update-custom-submit small-button" title="'+d["install specific version"]+'"><i class="material-icons">add_to_photos</i></button>':""),license:n.license||"",licenseUrl:n.licenseUrl||"",group:j},n.type||console.log('"'+o+'": "common adapters",'),n.type&&H.types[o]&&console.log('Adapter "'+o+'" has own type. Remove from admin.'),H.isList)H.tree.push({icon:n.extIcon,title:H.data[o].title||o,key:o});else{for(var D=-1,I=0;I<H.tree.length;I++)if(H.tree[I].key===H.data[o].group){D=I;break}D<0&&(d[H.data[o].group]||(d[H.data[o].group]=_(H.data[o].group)),H.tree.push({title:d[H.data[o].group],key:H.data[o].group,folder:!0,expanded:!H.isCollapsed[H.data[o].group],children:[],icon:H.groupImages[H.data[o].group]}),D=H.tree.length-1),H.tree[D].children.push({title:H.data[o].title||o,icon:n.extIcon,desc:W(j),key:o})}}if("popular"===H.currentOrder||"updated"===H.currentOrder){var k=Object.keys(H.data);"popular"===H.currentOrder?k.sort(function(e,t){return H.data[e].stat>H.data[t].stat?-1:H.data[e].stat<H.data[t].stat?1:0}):"updated"===H.currentOrder&&k.sort(function(e,t){return H.data[e].versionDate&&!H.data[t].versionDate?-1:!H.data[e].versionDate&&H.data[t].versionDate?1:H.data[e].versionDate>H.data[t].versionDate?-1:H.data[e].versionDate<H.data[t].versionDate?1:t<e?-1:e<t?1:0});for(var O={},E=0;E<k.length;E++)O[k[E]]=H.data[k[E]];H.data=O}if(H.isTiles&&("ie"!==H.main.browser||10<H.main.browserVersion)){var z="",A=[];for(var x in H.data)if(H.data.hasOwnProperty(x)){var S=H.data[x];-1===A.indexOf(S.group)&&A.push(S.group),z+='<div class="col s12 m6 l4 xl3 tile class-'+S.group+'" data-id="'+S.name+'">',z+=' <div class="card hoverable card-adapters">',z+=' <div class="card-header '+(S.updatable?"updatable":S.installed?"installed":"")+'"></div>',z+=' <div class="card-content">',z+=' <img onerror="this.src=\'img/info-big.png\';" class="card-profile-image" src="'+S.icon+'">',z+=' <span class="card-title grey-text text-darken-4">'+S.title+"</span>",z+=' <a title="info" class="btn-floating activator btnUp blue lighten-2 z-depth-3"><i class="material-icons">more_vert</i></a>',z+=' <ul class="ver">',z+=" <li>"+d["Available version:"]+' <span class="data '+(S.updatable?"updatable":"")+'" '+(S.news?' title="'+S.news+'"':"")+">"+S.rawVersion+"</span>"+(S.updatable?'<button class="adapter-update-submit small-button" data-adapter-name="'+x+'" '+(v?' disabled title="'+S.updatableError+'"':'title="'+d.update+'"')+'><i class="material-icons">refresh</i></button>':"")+"</li>",S.installed&&(z+=" <li>"+d["Installed version"]+': <span class="data">'+S.rawInstalled+"</span></li>"),S.instances&&(z+=" <li>"+_("Installed instances")+': <span class="data">'+S.instances+"</span></li>"),z+=" </ul>",z+=" </div>",z+=' <div class="footer right-align"></div>',z+=' <div class="card-reveal">',z+=' <i class="card-title material-icons right">close</i>',z+=" <p>"+S.desc+"</p>",z+=' <div class="card-reveal-buttons">',z+=S.install,z+=" </div>",z+=" </div>","popular"===H.currentOrder&&S.stat?z+=' <div class="stat" title="'+d["Installations counter"]+'">'+S.stat+"</div>":"updated"===H.currentOrder&&S.versionDate&&(z+=' <div class="last-update" title="'+d["Last update"]+'">'+J(S.versionDate,d.today,d.yesterday,d["1 %d days ago"],d["2 %d days ago"],d["5 %d days ago"],l)+"</div>"),z+=" </div>",z+="</div>"}for(var Y in z+='<div class="col s12 m6 l4 xl3 filtered-out">',z+=' <div class="card hoverable card-adapters">',z+=' <div class="card-header"></div>',z+=' <div class="card-content">',z+=' <span class="card-title grey-text text-darken-4">'+_("Filtered out")+"</span>",z+=" </div>",z+=' <div class="footer right-align"></div>',z+=" </div>",z+="</div>",H.$tiles.html(z),H.data)H.data.hasOwnProperty(Y)&&H.initButtons(Y);for(var R='<li class="main-toolbar-table-types-item" data-type=""><a>'+d.all+"</a></li>\n",Q=0;Q<A.length;Q++)R+='<li class="main-toolbar-table-types-item" data-type="'+A[Q]+'"><a>'+_(A[Q])+"</a></li>\n";var P=H.$tab.find("#main-toolbar-table-types");P.html(R),P.find(".main-toolbar-table-types-item").show().off("click").on("click",function(){H.currentType=$(this).data("type")||"",B(),H.$tab.find("#main-toolbar-table-types-btn").html(_(H.currentType||"all")),H.main.saveConfig("adaptersCurrentType",H.currentType)}),H.currentType&&!d[H.currentType]&&(d[H.currentType]=_(H.currentType)),H.$tab.find("#main-toolbar-table-types-btn").html(d[H.currentType||"all"]).dropdown({constrainWidth:!1,gutter:0}),(P=H.$tab.find("#main-toolbar-table-order")).find(".main-toolbar-table-order-item").off("click").on("click",function(){H.currentOrder=$(this).data("type")||"",H.$tab.find("#main-toolbar-table-order-btn").html(_(H.currentOrder||"a-z")),H.main.saveConfig("adaptersCurrentOrder",H.currentOrder),H._postInit()}),H.currentOrder&&!d[H.currentOrder]&&(d[H.currentOrder]=_(H.currentOrder)),H.$tab.find("#main-toolbar-table-order-btn").show().html(d[H.currentOrder||"a-z"]).dropdown({constrainWidth:!1,gutter:0}),B()}else{H.$tab.find("#main-toolbar-table-types-btn").hide(),H.$tab.find("#main-toolbar-table-order-btn").hide(),H.$grid.fancytree("getTree").reload(H.tree),H.$grid.find(".fancytree-icon").each(function(){$(this).attr("src")&&$(this).css({width:18,height:18}),$(this).on("hover",function(){var e='<div class="icon-large" style="left: '+Math.round($(this).position().left+$(this).width()+5)+'px;"><img src="'+$(this).attr("src")+'"/></div>',t=$(e);t.insertAfter($(this)),$(this).data("big",t[0]);var n=parseFloat(t.height()),i=Math.round($(this).position().top-(n-parseFloat($(this).height()))/2);n+i>(window.innerHeight||document.documentElement.clientHeight)&&(i=(window.innerHeight||document.documentElement.clientHeight)-n),t.css({top:i})},function(){var e=$(this).data("big");$(e).remove(),$(this).data("big",void 0)})}),H.currentFilter&&H.$grid.fancytree("getTree").filterNodes(G,!1),H.sortTree(),H.enableColResize();var U=["tab-adapters-table-name","tab-adapters-table-description","tab-adapters-table-keywords","tab-adapters-table-installed","tab-adapters-table-available","tab-adapters-table-license","tab-adapters-table-install"];H.$grid.find("tbody tr").each(function(){var e=0;$(this).find("td").each(function(){$(this).addClass(U[e]),e++})})}H.$tab.find(".grid-main-div").removeClass("order-a-z order-popular order-updated").addClass(H.currentOrder?"order-"+H.currentOrder:""),H.$tab.find(".process-adapters").hide(),H.updateCounter(s)})):this.enableColResize(),this.restoreScroll()},this.saveScroll=function(){this.scrollTop=this.$tab.find(".grid-main-div").scrollTop()},this.restoreScroll=function(){this.scrollTop&&this.$tab.find(".grid-main-div").scrollTop(this.scrollTop)},this.updateCounter=function(e){if(void 0===e)this.getAdaptersInfo(this.main.currentHost,!1,!1,function(e,t){var n=0;for(var i in t)if(t.hasOwnProperty(i)){var a=t?t[i]:null;if(a&&!a.controller&&"hosts"!==i){var s="";e[i]&&e[i].version&&(s=e[i].version),a.version&&!H.main.upToDate(s,a.version)&&n++}}H.updateCounter(n)});else if(e){var t=$("#updates-for-adapters");t.length?t.text(e):$('<span id="updates-for-adapters" title="'+_("updates")+'" class="new badge updates-for-adapters" data-badge-caption="">'+e+"</span>").appendTo('.admin-sidemenu-items[data-tab="tab-adapters"] a')}else $("#updates-for-adapters").remove()},this.init=function(e,t){this.inited&&!e||(this.main.objectsLoaded?(this.inited||(this.inited=!0,this.main.subscribeObjects("system.host.*"),this.main.subscribeStates("system.host.*")),this.main.tabs.hosts.getHosts(function(){H._postInit(e,t)})):setTimeout(function(){H.init(e,t)},250))},this.destroy=function(){this.inited&&(this.saveScroll(),this.inited=!1,this.main.unsubscribeObjects("system.host.*"),this.main.unsubscribeStates("system.host.*"))},this.initButtons=function(r){this.$tab.find('.adapter-install-submit[data-adapter-name="'+r+'"]').off("click").on("click",function(){var s=$(this).attr("data-adapter-name"),e=$(this).attr("data-adapter-desc");!function(e,t,n){if(H.main.tabs.hosts.list.length<=1&&!H.main.config.expertMode)return n(!0,H.main.currentHost,"");var i=$("#dialog-add-instance");i.find(".dialog-add-instance-name").html(e),i.find(".dialog-add-description").html(t);for(var a="",s=0;s<H.main.tabs.hosts.list.length;s++){var o=H.main.tabs.hosts.list[s];a+="<option "+(o.name===H.main.currentHost?"selected":"")+' value="'+o.name+'">'+o.name+"</option>"}H.main.tabs.hosts.list.length<=1?i.find(".dialog-add-instance-host").addClass("disabled").prop("disabled",!0):i.find(".dialog-add-instance-host").removeClass("disabled").prop("disabled",!1),i.find(".dialog-add-instance-host").html(a).select();for(var r=-1,c=[],l=0;l<H.main.tabs.instances.list.length;l++){var d=H.main.tabs.instances.list[l].split(".");if(d[d.length-2]===e){var u=parseInt(d[d.length-1],10);c.push(u),r<u&&(r=u)}}r+=10,a='<option selected value="">'+_("auto")+"</option>";for(var m=0;m<r;m++)-1===c.indexOf(m)&&(a+='<option value="'+m+'">'+m+"</option>");i.find(".dialog-add-instance-number").html(a).select(),i.find(".dialog-add-install-btn").off("click").on("click",function(e){n&&(n(!0,i.find(".dialog-add-instance-host").val(),i.find(".dialog-add-instance-number").val()),n=null),i.find(".dialog-add-cancel-btn").off("click"),i.find(".dialog-add-instance-number").off("click")}),i.find(".dialog-add-cancel-btn").off("click").on("click",function(e){n&&(n(!1),n=null),i.find(".dialog-add-cancel-btn").off("click"),i.find(".dialog-add-instance-number").off("click")}),i.modal({dismissible:!1,complete:function(){i.find(".dialog-add-instance-name").html("")}}).modal("open")}(s,e,function(e,i,a){e&&H.getAdaptersInfo(i,!1,!1,function(e,t){var n=e[s];n||(n=t[s]),n&&(n.license&&"MIT"!==n.license?function(i,a){var s=$("#dialog-license");if(!H.data[i].installed&&H.data[i].licenseUrl){var o=setTimeout(function(){a(!(o=null))},1e4);"object"==typeof H.data[i].licenseUrl&&(H.data[i].licenseUrl=H.data[i].licenseUrl[systemLang]||H.data[i].licenseUrl.en),H.main.socket.emit("httpGet",H.data[i].licenseUrl,function(e,t,n){o&&(clearTimeout(o),o=null,!e&&n?(s.css({"z-index":200}),n=(n=n.toString().replace(/\r\n/g,"<br>")).replace(/\n/g,"<br>"),s.find(".license_text").html(n),s.find(".license_agreement_name").text(_(" for %s",i)),s.modal({dismissible:!1,complete:function(){s.find(".license_text").html("")}}).modal("open"),s.find(".license_agree").off("click").on("click",function(e){a&&(a(!0),a=null),s.find(".license_agree").off("click"),s.find(".license_non_agree").off("click")}),s.find(".license_non_agree").off("click").on("click",function(e){a&&(a(!1),a=null),s.find(".license_agree").off("click"),s.find(".license_non_agree").off("click")})):(a&&a(!0),a=null))})}else a(!0)}(s,function(e){e&&H.main.cmdExec(null,"add "+s+" "+a+" --host "+i,function(e){e||H._postInit(!0)})}):H.main.cmdExec(null,"add "+s+" "+a+" --host "+i,function(e){e||H._postInit(!0)}))})})}),this.$tab.find('.adapter-delete-submit[data-adapter-name="'+r+'"]').off("click").on("click",function(){var t=$(this).attr("data-adapter-name");H.main.confirmMessage(_("Are you sure you want to delete adapter %s?",t),_("Please confirm"),"help",function(e){e&&H.main.cmdExec(null,"del "+t,function(e){e||H._postInit(!0)})})}),this.$tab.find('.adapter-readme-submit[data-adapter-name="'+r+'"]').off("click").on("click",function(){H.main.navigate({tab:"adapters",dialog:"readme",params:$(this).data("adapter-name")})}),this.$tab.find('.adapter-update-submit[data-adapter-name="'+r+'"]').off("click").on("click",function(){var e=$(this).attr("data-adapter-name");"admin"===e&&(H.main.waitForRestart=!0),H.main.cmdExec(null,"upgrade "+e,function(e){e||H._postInit(!0)})}),this.$tab.find('.adapter-upload-submit[data-adapter-name="'+r+'"]').off("click").on("click",function(){var e=$(this).attr("data-adapter-name");H.main.cmdExec(null,"upload "+e,function(e){e||H._postInit(!0)})});var e=this.$tab.find('.adapter-update-custom-submit[data-adapter-name="'+r+'"]');e.off("click").on("click",function(){var e=[];if(H.main.objects["system.adapter."+r].common.news){var t=H.main.objects["system.adapter."+r].common.news;for(var n in t)t.hasOwnProperty(n)&&e.push(n)}else e.push(H.main.objects["system.adapter."+r].common.version);for(var i='<div class="collection">',a=0;a<e.length;a++){var s=t[e[a]]?t[e[a]][systemLang]||t[e[a]].en:"";i+='<a data-version="'+e[a]+'" data-position="left" data-delay="50" title="'+s+'" data-adapter-name="'+$(this).data("adapter-name")+'" class="collection-item adapters-versions-link tooltipped"><span class="adapters-versions-link-version">'+e[a]+'</span> - <div class="adapters-versions-link-history">'+s+"</div></a>"}i+="</div>";var o=$("#adapters-menu");o.length||((o=$('<div id="adapters-menu" class="modal modal-fixed-footer"><div class="modal-content"><h4>Modal Header</h4><p></p></div><div class="modal-footer"><a class="modal-action modal-close waves-effect waves-green btn-flat ">'+_("Close")+"</a></div></div>")).appendTo($(".materialize-dialogs").first()),o.modal()),o.data("trigger",this),o.find("p").html(i),o.find("h4").html(_("Versions of %s",r)),o.find(".adapters-versions-link").off("click").on("click",function(){o.modal("close");var e=$(this).data("adapter-name"),t=$(this).data("version");t&&e&&H.main.cmdExec(null,"upgrade "+e+"@"+t,function(e){e||H._postInit(!0)})}),o.modal("open")}),H.main.objects["system.adapter."+r]||e.hide()},this.objectChange=function(e,t){if(e.match(/^system\.adapter\.[a-zA-Z0-9-_]+$/)){if(t)-1===this.list.indexOf(e)&&this.list.push(e);else{var n=this.list.indexOf(e);-1!==n&&this.list.splice(n,1)}void 0!==this.$grid&&this.$grid[0]._isInited&&this.init(!0)}},this.stateChange=function(e,t){if(e&&t){var n=e.match(/^system\.adapter\.([\w\d-]+)\.upload$/);if(n){var i=this.$tab.find('.adapter-upload-progress[data-adapter-name="'+n[1]+'"]'),a=W(t.val);i.html(a).css({opacity:t.val?.7:0}),this.$tab.find('.group-upload-progress[data-adapter-group="'+i.data("adapter-group")+'"]').html(a).css({opacity:t.val?.7:0})}}}}function Config(e){var t=this;this.$dialog=$("#dialog-config"),this.$configFrame=this.$dialog.find("#config-iframe"),this.main=e,this.prepare=function(){$iframeDialog=this},this.init=function(){if(!this.inited){this.inited=!0;var e=this.main.navigateGetParams(),t=e.split(".");this.main.objects[e]&&this.main.objects[e].common&&this.main.objects[e].common.materialize?this.$configFrame.attr("src","adapter/"+t[2]+"/index_m.html?"+t[3]):this.$configFrame.attr("src","adapter/"+t[2]+"/?"+t[3]);var n=e.replace(/^system\.adapter\./,"");this.$dialog.data("name",n),this.$dialog.find(".title").html(_("Adapter configuration")+": "+n)}},this.allStored=function(){return!window.frames["config-iframe"].changed},this.close=function(){t.main.navigate()},this.destroy=function(){if(this.inited&&(this.inited=!1,this.$configFrame.attr("src",""),void 0!==showConfig&&showConfig&&showConfig.length)){var e=showConfig.shift();setTimeout(function(){t.main.navigate({tab:"instances",dialog:"config",params:e})},1e3)}}}function Customs(C){var m,g,h,f,L,D,I,k,O,E,z,A,x="__different__",S=this;function Y(e){if(e)S.historyTimeout&&clearTimeout(S.historyTimeout);else if(S.historyTimeout)return;S.historyTimeout=setTimeout(function(){S.historyTimeout=null,z&&S.loadHistoryTable(z.data("id"),!0)},e||5e3)}function R(t,n){$.ajax({headers:{Accept:"text/html"},cache:!0,url:"/adapter/"+t+"/custom_m.html",success:function(e){n(null,e)},error:function(e){$.ajax({headers:{Accept:"text/html"},cache:!0,url:"/adapter/"+t+"/custom.html",success:function(e){n(null,e)},error:function(e){n(e.responseText)}})}})}function Q(e){e.stopPropagation(),e.preventDefault();var t=S.$dialog.find("#customs-tabs"),c=t.data("ids");S.currentCustoms=null;var l=_(x);if(t.find("input, select").each(function(){var e=$(this).data("instance"),t=$(this).data("field");if(t){var n;if("checkbox"===$(this).attr("type")){if(this.indeterminate)return;n=$(this).prop("checked")}else n=$(this).val();if(n!==l){null===n&&(n=""),void 0===n&&(n=""),"false"===n&&(n=!1),"true"===n&&(n=!0);var i=parseFloat(n);n.toString().replace(/^\+/,"").replace(/([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)/,"$1")===i.toString()&&(n=i);for(var a=0;a<c.length;a++){var s=S.main.objects[c[a]].common.custom;if(void 0===(s=S.main.objects[c[a]].common.custom=s||{})[e]){var o,r=e.split(".")[0];o=defaults[r]?"function"==typeof defaults[r]?defaults[r](S.main.objects[c[a]],S.main.objects["system.adapter."+e]):defaults[r]:S.defaults[r],s[e]=o||{}}s[e][t]=n}}}}),c){S.$dialog.find(".dialog-system-buttons .btn-save").addClass("disabled");for(var n=0;n<c.length;n++){var i=!1,a=S.main.objects[c[n]].common.custom;for(var s in a)a.hasOwnProperty(s)&&(a[s].enabled?i=!0:delete a[s]);i||(S.main.objects[c[n]].common.custom=null)}S.setCustoms(c,function(){S.loadHistoryChart(),S.main.navigate()})}}function P(e){switch(e){case"tab-customs-settings":S.loadHistoryChart();break;case"tab-customs-table":z.select(),S.loadHistoryChart();break;case"tab-customs-chart":S.$dialog.find("#tab-customs-chart .select-instance").select();var t=S.$dialog.find("#tabs-customs");S.loadHistoryChart(t.data("id"))}}return this.main=C,this.$dialog=$("#dialog-customs"),this.customEnabled=null,this.currentCustoms=null,this.check=function(){for(var e=0;e<this.main.instances.length;e++)if(this.main.objects[this.main.instances[e]].common&&("storage"===this.main.objects[this.main.instances[e]].common.type||this.main.objects[this.main.instances[e]].common.supportCustoms)&&this.main.objects[this.main.instances[e]].common.enabled)return null!==this.customEnabled&&!0!==this.customEnabled?(this.customEnabled=!0,this.inited&&this.init(null,!0)):this.customEnabled=!0,void!0;null!==this.customEnabled&&!1!==this.customEnabled?(this.customEnabled=!1,this.inited&&this.init(null,!0)):this.customEnabled=!1},this.stateChange=function(e){this.currentCustoms===e&&Y()},this.initCustomsTabs=function(e,t){var s=this.$dialog.find("#customs-tabs");e=e||[],s.html("");var o=_(x);this.defaults={};var n=this.main.config["object-customs-collapsed"];n=n?n.split(","):[];for(var r={},i=null,a=null,c=0;c<t.length;c++){var l=t[c].replace(/^system\.adapter\./,"");r[l]={};for(var d=0;d<e.length;d++){var u=C.objects[e[d]].common.custom,m=u?u[l]:null;if(C.objects[e[d]].common&&(null===i?i=C.objects[e[d]].common.type:""!==i&&i!==C.objects[e[d]].common.type&&(i=""),null===a?a=C.objects[e[d]].common.role:""!==a&&a!==C.objects[e[d]].common.role&&(a="")),m)for(var g in m)m.hasOwnProperty(g)&&(void 0===r[l][g]?r[l][g]=m[g]:r[l][g]!==m[g]&&(r[l][g]=x));else{var h=l.split(".")[0],f=null;for(var p in f=defaults[h]?"function"==typeof defaults[h]?defaults[h](S.main.objects[e[d]],S.main.objects["system.adapter."+l]):defaults[h]:this.defaults[h])f.hasOwnProperty(p)&&(void 0===r[l][p]?r[l][p]=f[p]:r[l][p]!==f[p]&&(r[l][p]=x))}}}for(var b=0;b<t.length;b++){var y=t[b].split("."),v=y[2],w=y[3],j=v+"."+w,N=this.main.objects["system.adapter."+v].common.icon;N="/adapter/"+v+"/"+N;var T='<li data-adapter="'+j+'" class="'+(-1===n.indexOf(j)?"active":"")+'"> <div class="collapsible-header"> <img src="'+N+'" />'+_("Settings for %s",j)+' <span class="activated" data-adapter="'+j+'" style="opacity: '+(!r[j]||!0!==r[j].enabled&&r[j].enabled!==x?"0":"1")+'">'+_("active")+'</span> </div> <div class="customs-settings collapsible-body">'+$('script[data-template-name="'+v+'"]').html()+" </div></li>",L=$(T);this.defaults[v]={},L.find("input, select").each(function(){var e=$(this);e.attr("data-instance",v+"."+w);var t=e.attr("data-field"),n=e.attr("data-default");"true"===n&&(n=!0),"false"===n&&(n=!1),void 0!==n&&n.toString().replace(/\+/,"")===parseFloat(n).toString()&&(n=parseFloat(n)),S.defaults[v][t]=n,"enabled"===t&&e.on("click",function(e){e.stopPropagation(),$(this).prop("checked")})}),s.append(L),customPostInits.hasOwnProperty(v)&&"function"==typeof customPostInits[v]&&customPostInits[v](L,r[v+"."+w],S.main.objects["system.adapter."+v+"."+w],i,a)}s.find("input, select").each(function(){var e,n=$(this),t=n.data("instance"),i=t.split(".")[0],a=n.data("field");void 0!==r[t][a]?"checkbox"===n.attr("type")?r[t][a]===x?n[0].indeterminate=!0:n.prop("checked",r[t][a]):r[t][a]===x?("number"===n.attr("type")&&n.attr("type","text"),"SELECT"===n.prop("tagName").toUpperCase()?(n.prepend('<option value="'+o+'">'+o+"</option>"),n.val(o)):n.val("").attr("placeholder",o)):n.val(r[t][a]):(S.defaults[i]&&void 0!==S.defaults[i][a]&&(e=S.defaults[i][a]),void 0!==e&&("checkbox"===n.attr("type")?n.prop("checked",e):n.val(e)));"checkbox"===n.attr("type")?n.on("change",function(){if(S.$dialog.find(".dialog-system-buttons .btn-save").removeClass("disabled"),"enabled"===$(this).data("field")){var e=n.data("instance"),t=s.find('.activated[data-adapter="'+e+'"]');$(this).prop("checked")?t.css("opacity",1):t.css("opacity",0)}}):n.on("change",function(){S.$dialog.find(".dialog-system-buttons .btn-save").removeClass("disabled")}).on("keyup",function(){$(this).trigger("change")})}),this.showCustomsData(1<e.length?null:e[0]),this.$dialog.find(".dialog-system-buttons .btn-save").addClass("disabled"),translateAll("#dialog-customs"),S.$dialog.find(".collapsible").collapsible({onOpenEnd:function(e){var t=S.main.config["object-customs-collapsed"];t=t?t.split(","):[];var n=$(e).data("adapter"),i=t.indexOf(n);-1!==i&&t.splice(i,1),S.main.saveConfig("object-customs-collapsed",t.join(","))},onCloseEnd:function(e){var t=S.main.config["object-customs-collapsed"];t=t?t.split(","):[];var n=$(e).data("adapter");-1===t.indexOf(n)&&t.push(n),S.main.saveConfig("object-customs-collapsed",t.join(","))}}),S.$dialog.find('input[type="checkbox"]+span').off("click").on("click",function(){var e=$(this).prev();e.prop("disabled")||(e[0].indeterminate?(e[0].indeterminate=!1,e.prop("checked",!0).trigger("change")):e.prop("checked",!e.prop("checked")).trigger("change"))}),s.find("select").select(),M.updateTextFields("#dialog-customs"),this.resizeHistory()},this.loadHistoryTable=function(e,t,l){g=g||S.$dialog.find("#grid-history"),m=m||S.$dialog.find("#grid-history-body"),t||m.html('<tr><td colspan="5" style="text-align: center">'+_("Loading...")+"</td></tr>");var n={aggregate:"none",instance:z.val(),from:!0,ack:!0,q:!0};L||(L=this.$dialog.find("#tab-customs-table .datepicker.date-from"),D=this.$dialog.find("#tab-customs-table .datepicker.date-to"),I=this.$dialog.find("#tab-customs-table .timepicker.time-from"),k=this.$dialog.find("#tab-customs-table .timepicker.time-to"));var d,i=L.val()?M.Datepicker.getInstance(L).toString("yyyy.mm.dd"):"",a=I.val(),s=D.val()?M.Datepicker.getInstance(D).toString("yyyy.mm.dd"):"",o=k.val(),r=!0;if(s?(r=!1,(s=new Date(s)).setHours(23),s.setMinutes(59),s.setSeconds(59),s.setMilliseconds(999)):s=new Date,o){var c=o.split(":");s.setHours(c[0]),s.setMinutes(c[1]),s.setSeconds(59),s.setMilliseconds(999),r=!1}if(s=s.getTime(),r&&(s+=1e4),n.end=s,i||a){if(i=new Date(i||s),a){var u=a.split(":");i.setHours(u[0]),i.setMinutes(u[1])}else i.setHours(0),i.setMinutes(0);i.setSeconds(0),i.setMilliseconds(0),n.start=i.getTime()}else n.count=50;l&&(d=new Date(s).toISOString()+"_"+(n.start?new Date(n.start):n.count+"points")+"_"+e+"__"+n.instance+".csv"),C.socket.emit("getHistory",e,n,function(r,c){setTimeout(function(){var e,t,n,i="value;acknowledged;from;timestamp;lastchanged;\n";if(r)console.error(r),m.html('<tr><td colspan="5" style="text-align: center" class="error">'+r+"</td></tr>");else{var a="";if(c&&c.length){for(var s=c.length-1;0<=s;s--){var o=(c[s].from||"").replace("system.adapter.","").replace("system.","");a+='<tr class="'+(c[s].ts>f?"highlight":"")+'"> <td>'+c[s].val+"</td> <td>"+c[s].ack+"</td> <td>"+o+"</td> <td>"+C.formatDate(c[s].ts)+"</td> <td>"+C.formatDate(c[s].lc)+"</td></tr>\n",l&&(i+=c[s].val+";"+c[s].ack+";"+(o||"")+";"+(c[s].ts?new Date(c[s].ts).toISOString():"")+";"+(c[s].lc?new Date(c[s].lc).toISOString():"")+";\n")}f=c[c.length-1].ts}else a='<tr><td colspan="5" style="text-align: center">'+_("No data")+"</td></tr>";m.html(a)}!function e(){$.fn.colResizable&&(g.is(":visible")?(g.data("inited")||((h=new IobListHeader("grid-history-header",{list:g,colWidthOffset:1,prefix:"log-filter"})).add("text","val"),h.add("text","ack"),h.add("text","from"),h.add("text","ts"),h.add("text","lc")),g.colResizable({liveDrag:!0,partialRefresh:!0,marginLeft:5,postbackSafe:!0,onResize:function(e){return h.syncHeader()}}),h.syncHeader()):setTimeout(function(){e()},200))}(),l&&(e=d,t=i,(n=document.createElement("a")).setAttribute("href","data:text/plain;charset=utf-8,"+encodeURIComponent(t)),n.setAttribute("download",e),n.style.display="none",document.body.appendChild(n),n.click(),document.body.removeChild(n))},