UNPKG

iobroker.energiefluss-erweitert

Version:

This ioBroker adapter is the next Version of the energiefluss with the attribute 'erweitert' and allows to display an energyflow animation inside an iframe or HTML DIV.

8 lines 226 kB
/*!
 * @SKB-CGN 2026
 * Energiefluss-erweitert ioBroker Adapter
 *
 * Released under the MIT license
 * https://github.com/SKB-CGN/
 */
"use strict";function hashCode(e){let t=0;if(0===e.length)return t;for(let o=0;o<e.length;o++){t=(t<<5)-t+e.charCodeAt(o),t&=t}return t>>>0}function displayContextmenu(e,t){if(displayMode&&!configuration.basic?.enable_contextmenu)return;const o=$("#mouse_contextmenu");o.css({visibility:"hidden",display:"block"});const n=o.outerWidth(!0),a=o.outerHeight(!0);(e+=10)+n+5>document.documentElement.clientWidth&&(e-=n),e<5&&(e=5),t+a+5>document.documentElement.clientHeight&&(t=t-a-5),t<5&&(t=5),o.css({top:`${t}px`,left:`${e}px`,visibility:"visible",display:"none"}),o.slideDown("fast")}Object.hasOwn||(Object.hasOwn=function(e,t){if(null==e)throw new TypeError("Cannot convert undefined or null to object");return Object.prototype.hasOwnProperty.call(Object(e),t)}),$.fn.extend({countTo:function(e,t=1e3,o){const n=this.parent().parent("text"),a=String(e).includes(".")?String(e).split(".")[1].length:0,i=$(this);var s=null;const r=parseFloat(i.text()),l=parseFloat(e);if(r!=l)return requestAnimationFrame((function e(c){o&&n.addClass("glow"),s||(s=c);var d=c-s,u=r+d/t*(l-r);d<t?(i.text(u.toFixed(a)),requestAnimationFrame(e)):(i.text(l.toFixed(a)),n.removeClass("glow"))})),this},scrollTo:function(e,t,o){const n=$(this);return n.animate({scrollTop:n.scrollTop()-n.offset().top+$(e).offset().top+(o||0)},null==t?1e3:t),this},appendToWithIndex:function(e,t=0){e instanceof jQuery||(e=$(e));let o=e.children(),n=o.length;return t<=0?this.prependTo(e):t>=n?this.appendTo(e):this.insertAfter(o.eq(t-1)),this},efTooltip:function(e){const t=$(this),o=t.hasClass("added_elements"),n=o?getElementCoords(t.attr("id")):null,a=t.data("title");if(!a)return;if($(".custom-tooltip").remove(),t.is(":disabled"))return;if(e.type.includes("touch")&&t[0].classList.contains("mobile"))return;const i=$('<div class="custom-tooltip"></div>').text(translateWord(a)),s=$('<div class="custom-tooltip-arrow"></div>');i.append(s).hide(),$("body").append(i);const r=t.offset(),l=o?n.width:t.outerWidth(),c=o?n.height:t.outerHeight(),d=i.outerWidth(),u=i.outerHeight(),p=$(window).width(),g=appProperties.isTouch?1e3:200;let f=r.left+l/2-d/2,m=r.top-u-10,h="50%";return m<$(window).scrollTop()?(m=r.top+c+10,i.addClass("bottom")):i.removeClass("bottom"),f+d>p&&(f=p-d-10,h=Math.min(r.left+l/2-f,d-12)+"px"),f<10&&(f=10,h=Math.max(r.left+l/2-f,12)+"px"),i.css({left:f,top:m}).fadeIn(200),s.css({left:h}),t.off("mouseleave.efTooltip click.efTooltip").on("mouseleave.efTooltip click.efTooltip",(function(){i.fadeOut(g,(function(){$(this).remove()}))})),i.on("mouseover",(function(){$(this).fadeOut(g,(function(){$(this).remove()}))})),this},efSlider:function(e=300){return this.each((function(){const t=$(this),o=this;let n;clearTimeout(n);if("0px"===window.getComputedStyle(o).maxHeight||0===o.offsetHeight){t.css({display:"block",maxHeight:""}),o.offsetHeight;const a=o.scrollHeight+"px";t.css({transition:`max-height ${e}ms ease`,maxHeight:a}),n=setTimeout((()=>{t.css({maxHeight:"",transition:"",display:""}).addClass("open")}),e)}else{const a=o.scrollHeight+"px";t.css({maxHeight:a,transition:`max-height ${e}ms ease`}),o.offsetHeight,t.css({maxHeight:"0"}),n=setTimeout((()=>{t.css({display:"",transition:"",maxHeight:""}).removeClass("open")}),e)}}))}});const jQueryDialog={open:function(){$(".ui-widget-overlay").hide().fadeIn(600),$(this).parent().focus();const e=$(this).parent();var t=parseInt(e.css("top"));e.css({top:t-60,opacity:0}),e.animate({opacity:1,top:t},{duration:600})},beforeClose:function(){$(".ui-widget-overlay").show().fadeOut(600);var e=$(this).parent();return e.animate({opacity:0,top:parseInt(e.css("top"))-60},{duration:600,queue:!1,complete:function(){$(".ui-dialog, .tmpDiv").remove()}}),!1},classes:{"ui-dialog":"no-close"}},usedImages={tmpImg:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAMAAABHPGVmAAAACXBIWXMAAAsTAAALEwEAmpwYAAABjFBMVEVTjqNUjqNUj6RVj6RWkKVXkaVYkaZYkqZZkqZakqdak6dbk6dclKhdlahelalelqlflqlglqpgl6phl6timKtjmKtjmaxkmaxlmq1onK5pnK9pna9qna9rnrBsnrBtn7FvobJxobNyorR0pLV1pbV5p7h6qLh9qrp+qrp/q7qBrLyCrbyDrb2Err2Gr76GsL6JscCKssCKssGLs8GMtMKNtMKOtcKOtcOSt8WSuMWUucaVucaYvMiavcmbvcqdv8ufwMugwcyhwc2jws6lxM+mxc+nxdCpx9Gqx9KsyNOtydOuytSvy9Swy9Wzzda1zte1z9i2z9i30Nm60tq70tu809vA1t3C197C19/E2N/I2+HJ3OLK3OLM3eTM3uTN3uTO3+XQ4ObS4ufV5OnY5erZ5ura5+vf6u7h6+/i7O/j7fDk7fHl7vHo8PPp8PPq8fTr8vXt8/Xt8/bv9Pby9vjz9/n09/n0+Pn1+Pr2+fr3+vv4+vv4+/v6+/z6/Pz8/f79/v7+/v7+///////P+5XXAAAB0ElEQVRo3u3UyVMTURTF4R8BQ4LE5yxJbByIE3HARFDBiBMEFWcaBwQZBBRUiANOkZg+/7iLYBUlWbQFy/vtuutUner7Xl8wxhhjjDHGGGOMMVur0TUB0JaqPe87GKmbS8QBcF4UgFavJXxHYko5IDUrLWRg12Sg5ezGWMNg4ANN/m997YOGO6sqD4TtSL2VctA4v3qtd+XTDiaqxZ6lcurfWHRU8oF78vNzwSmuauz8pC6H64h//PJUOcjqPhRUOKQXcFbDALsfx+FiNwDPqo/kQ+zHIqSDCd6vNLP955uQX9LlFZSDIZ0BT8/7dAW2VWcBvNJ0vLtSBOBoNikfjusB8O5bm14CU4ELO7CCcjCiDmjRzKC6gM9LALSX5itDf2NJ+ZDXADCjE3oCjOrw5ku4rg/xLSypNy4uVB6WpuPrS45talyddQ7+dKVIe2lyfUns+yKkg/H/PPj9mbu6kYmuXeEE49Viz1I5CdDaB7TX/plY5pzGMnsZlp+fC06uXeFLIUtuSpI8kq+lhQ7Y+SrQcueG2BFJUj9NIxWt9ELD7V8q3wo7rGbnnHMR4ECy9mZPOlJv9zjnXBRIeLUt1OLFbCUbY4wxxhhjjDHGbLE/YAx6QfWMHIAAAAAASUVORK5CYII=",notFound:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAACuUlEQVR4nO2YS2sUQRDHf3EPEVw9STbnHFxhPeiXiMazcQN6EBW/wp7EvSiCEp9BzVcwRL+BwXc86k1RcBcP6s1NwFVhpaBGlqJ7Zh89OxmZPxQM09X1mKmqrmooUKDAqNgLLAGrwBvgG/BLSZ43dU14yuwgzAIrwBbQG5C2dE8lS8OngSbQGcJwSx2VIbImiv3AxhiGW3qpf3IiqAGfPYbI+1vAUaAK7FGq6rvbCXtrk/jyHx3K28AFoDSAjF3AIvDJ40QlLeMlTl84lK7pVx4WUonWHfKep5UTTYey68DUGDJl77JD7hUCY9ZRbdbGND7ClONPdIE5AmLFKGjFhE1cItZiwknyqF/HgwB2/xNuv/6ZmDD7A5x2rEni/gauevaecxx2QU7sJUelKCXkiBha71ur67toXXgtRGbL6DoZwoFVI1TqvMUhY2C/E3XPmuyxuGP47odwYNMIlQPJBZ+hPsdcWDC8r0I48N0IPRDD63JiUOMFVcP/NYQDXSM0KbFOeJyQ5D6VsLds9vzMwoHFGAdc1akf+8yeH3kPoQ9pJPGxFJP4uOF9mkYZlZY4rTJ61/DdzNtB1ja65kM4UHbMu2c9vM2YEImccBkvOG90SPuym5SauXZMNRqlmZMbjS9GxzUCYkZLWr+CRzpdhWinHxrZ26oz9YFmecyZQD7ADYfci6SAaR33rLL1EdteCZvHDnkbA87WI6HiuVVoaz8/iOKSJqyN+YiOkOG1SktbYukqD+qfKevzgtZ5WyotvUsj/l3XK08SDBmGJGwOA28da74JLkhOXHY0e8PQtiZsFHozHj7f2REEczqAD3O529E67wqVXhZOoLEuM+w94LUOI1117D3wTEvmfMIJ28vSiRBoJDiRWk6ERKNwYoeg8b//iUvkBI08G+9yInfGR2jm5SwoUICM8BcCmwiIXNqFbQAAAABJRU5ErkJggg==",bgTrans:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kECA41ARIDse8AAAALSURBVAjXY2AAAgAABQAB4iYFmwAAAABJRU5ErkJggg=="},switchLayouts={0:{description:"lbl_switch_desc_0",symbol:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KCTxwYXRoIGZpbGw9IiNlMWUxZTEiIGQ9Im0yMC43MSA0LjYzbC0xLjM0LTEuMzRjLS4zNy0uMzktMS4wMi0uMzktMS40MSAwTDkgMTIuMjVMMTEuNzUgMTVsOC45Ni04Ljk2Yy4zOS0uMzkuMzktMS4wNCAwLTEuNDFNNyAxNGEzIDMgMCAwIDAtMyAzYzAgMS4zMS0xLjE2IDItMiAyYy45MiAxLjIyIDIuNSAyIDQgMmE0IDQgMCAwIDAgNC00YTMgMyAwIDAgMC0zLTMiIHN0cm9rZS13aWR0aD0iMC41IiBzdHJva2U9IiNlMWUxZTEiIC8+Cjwvc3ZnPg==",icon:!0,own:!0,icon_on:"material-symbols:mode-off-on",icon_off:"material-symbols:mode-off-on"},1:{description:"lbl_switch_desc_1",symbol:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAeCAMAAACMnWmDAAABcVBMVEUAAACZmZmSkpKfn5+VlZWSkpKenp6bm5udnZ2bm5uVlZWWlpaWlpaYmJiYmJiXl5eampqampqampqYmJiampqYmJiampqZmZmZmZmampqZmZmXl5eZmZmYmJiZmZmYmJiZmZmZmZmZmZmYmJiYmJiZmZmZmZmZmZmZmZmYmJiYmJiYmJiYmJiZmZmgoKCgoKCgoKCgoKCZmZmYmJiZmZmYmJiZmZmjo6OmpqalpaWlpaWmpqaYmJiZmZmYmJiZmZmYmJiZmZmZmZmYmJizs7OYmJiZmZmZmZmZmZmbm5ucnJydnZ2ioqKjo6OkpKSlpaWmpqanp6erq6utra2wsLCzs7O1tbW2tra4uLi5ubm6urq7u7u8vLy9vb2+vr6/v7/AwMDCwsLDw8PExMTFxcXGxsbNzc3Q0NDR0dHT09PV1dXW1tbX19fY2Nja2trb29vd3d3h4eHj4+Pk5OTl5eXn5+fp6enq6urr6+vs7Ozu7u78/vsNAAAASHRSTlMABQcIDA4VFxocHSInKi8xOj9JSkxNUVVaYmRla21ub3F/gIGNj6yvsbO3uLzDzM3P0dPY2dzc4O7v8PDx8vP09vb3+Pn7/P6HjOuGAAABSklEQVQYGe3BVzdDQRQG0BO9Rieu3kXv3dX5dAmCFCWIXoZLOL/eS1ZWJvMyXG/sTX9auuEeMs1Bd2Ua/YbMlnnEzDVnkG2l08D++a1l3Yb3galisqkO2H7imKctoIZsqQACUY579wMusiF/GUGWBLGURz/Xiu0PlkQ3MdCgp6qAkmWu4JmTPAL+kBbfWH8qyWqxywovzoSmyGgKSbpxyopjeIWuSC9JTNyw4hrrQtukkxIt4Y0Vr1gV2hYNSjQDixUW1oS2RYMSjeCOFXfYFNomnJSoDZesuMCe0BXpIUk1DljhQ1hoiow6SJKHVcFJxBoOQ1p8430OStIFzydLPj0YbtRjOEmRu4ATloQwm002uICjKMe9+4FysqUe2HjgmPsNoJZsKpsGdoLX1stVwANMlZBtOZ2Ia8+i31DU1DFkmoMdjYX07zu+AGm8d9u5OJZHAAAAAElFTkSuQmCC",x:10,y:10,width:60,height:10,rx:5},2:{description:"lbl_switch_desc_2",symbol:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAeCAMAAACMnWmDAAACHFBMVEUAAAD///+AgICqqqqAgICioqKdnZ2SkpKZmZmWlpacnJyUlJSSkpKUlJSPj4+WlpaXl5eZmZmYmJiampqZmZmXl5efn5+ZmZmbm5uYmJicnJyampqYmJiYmJiXl5ednZ2YmJibm5ucnJyXl5eenp6srKyrq6urq6uZmZmZmZmYmJimpqaZmZmkpKSkpKSjo6OgoKCZmZmfn5+ZmZmfn5+fn5+dnZ2enp6enp6enp6fn5+fn5+fn5+enp6fn5+enp6enp6enp6ioqKfn5+jo6OhoaGioqKfn5+enp6kpKSkpKSqqqqrq6u0tLSsrKyysrKzs7OlpaWmpqanp6eurq6mpqatra2urq6mpqaoqKivr6+wsLCenp6wsLCdnZ2+vr6cnJyxsbG/v7/AwMCbm5u3t7e/v7+bm5uampqbm5u5ubmZmZmamprKysrLy8vMzMzAwMDBwcGZmZmampqbm5ucnJydnZ2ioqKjo6OkpKSlpaWmpqanp6eqqqqrq6utra2urq6vr6+wsLCysrKzs7O1tbW2tra5ubm6urq7u7u8vLy9vb2+vr6/v7/AwMDBwcHCwsLDw8PExMTFxcXGxsbHx8fJycnKysrLy8vMzMzPz8/Q0NDR0dHS0tLT09PV1dXW1tbX19fY2NjZ2dna2trb29vc3Nzd3d3e3t7f39/h4eHj4+Pk5OTl5eXn5+fp6enq6urr6+vs7Ozu7u4xHePoAAAAcnRSTlMAAQIDBgsNDg8REhMcHyAiNjc5OjxAQEFCQ0NERVRWVllZWltcXF5hcHFycnN2eHp+f3+AgoWSlpiZr7Cys7/Cw8XZ2trb29zd5OXm5ubn5+fq6u7u7+/v8PDx8/T09fX39/f3+Pj4+fr6+vv8/Pz8/f1UAU40AAACEElEQVQYGZ3B+V/LcRwH8Lc795EQSkQque/7yJ0jrJiUwsSQerXv2pKWiWpDSxulZZWt482UPv+g6rHHHtu+/fLu+aRYi1Mz8/YK5WWmLqJpLTx4+YGxxOwWMpcYyy4dSKJEc4+W1/TyDPXWPDkyh+KsP/+YBzub7Jpmb+ocYrlHF9dQjO13ONhiQYTWEmK5oiyK2l3B3Vag+WsgHA50NAPWbpar2EURWw3cDtSHVETIDnhYzrCZpiy/zd+AtjEVNdoK+Fju1lKadPZ1oBYuFceF2gCLVZ2mCRuvsxP1/1ScMRves1zhOiI66QsCQypBEBhkMe9xIno54oFD6TTCw2LDz4iSC/gtviidT2hkuWsrKf0ua/ipdPywslxxGuWYuBZ/lc4fWFjOlE05JtYQVjphaCxnyqb0+2xDn9Lpg43litMo+QY74VU6nXCyXMEKohcjHnxUOh/QwWLDlUR0wheAxioBa+hnMe8xItpQyI1oGFdxxhvgYLmba2nCmap+Cz6rOG5YfrHYq1M0adkV9gEtYypqtBX4znJXl9CULQZuB+oGVER/HeBhueJNFLGzgruswBuXP/y7p60BsHaxXOkOisoq4gEHot4FWe7eNoqx+txT/uFy2DXN7nD7We7hhVUUZ/bhymo/z1BP9fNDsyjR/H35ZcZSs1vIXGosz98zj6aVlJKRu18oNyNlAcX4D4F0HeRtd9kcAAAAAElFTkSuQmCC",x:1,y:1,width:78,height:28,rx:15},3:{description:"lbl_switch_desc_3",symbol:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAeCAMAAACMnWmDAAACNFBMVEUAAAD///+AgICqqqqAgICioqKdnZ2SkpKZmZmWlpacnJyUlJSSkpKUlJSPj4+WlpaXl5eZmZmYmJiampqZmZmXl5efn5+ZmZmbm5uYmJicnJyampqYmJiYmJiXl5ednZ2YmJibm5ucnJyXl5eenp6srKyrq6urq6uZmZmZmZmYmJimpqaZmZmkpKSkpKSjo6OgoKCZmZmfn5+ZmZmfn5+fn5+dnZ2enp6enp6enp6fn5+fn5+fn5+enp6fn5+enp6enp6enp6ioqKfn5+jo6OhoaGioqKfn5+enp6kpKSkpKSqqqqrq6u0tLSsrKyysrKzs7OlpaWmpqanp6eurq6mpqatra2urq6mpqaoqKivr6+wsLCenp6wsLCdnZ2+vr6cnJyxsbG/v7/AwMCbm5u3t7e/v7+bm5uampqbm5u5ubmZmZmamprKysrLy8vMzMzAwMDBwcGZmZmampqbm5ucnJydnZ2ioqKjU1Ojo6OkpKSlpaWmpqanp6eqqqqrq6uta2utra2urq6vr6+wsLCysrKzs7O1tbW2tra3gIC5ubm6urq7u7u8vLy9vb2+vr6/kpK/v7/AwMDBwcHCwsLDw8PExMTFoqLFxcXGxsbHx8fJycnKysrLy8vMsrLMzMzPz8/Q0NDR0dHS0tLT09PUwsLV1dXW1tbX19fY2NjZ2dna0tLa2trb29vc3Nzd3d3e3t7f39/h4eHj4+Pk5OTl5eXn5+fp6enq6urr6+vs7Ozu7u7n2VVhAAAAcnRSTlMAAQIDBgsNDg8REhMcHyAiNjc5OjxAQEFCQ0NERVRWVllZWltcXF5hcHFycnN2eHp+f3+AgoWSlpiZr7Cys7/Cw8XZ2trb29zd5OXm5ubn5+fq6u7u7+/v8PDx8/T09fX39/f3+Pj4+fr6+vv8/Pz8/f1UAU40AAACf0lEQVRIx53W+VsSQRgH8O22+zArO8yyrMzu+z7stsNKLTJMKrOsTF9YXDCCNbMkISstpNTERExQm6JM/rlm2QVZZp6HZ+f7wzCwD5/nmdnZ912OS8jszJz8HRqTn5M5i6Nm5p5zt3Vl1W6NqS7TlZ/dnUZwUw9U1PUhxvTV3d8/Re0tP3UPDXsarTxvbfSMMJh3zyxJ9DZcR0GnCZTwzhADWZI74W0zoB4zQPMnfzjs72gGMPcwiIatMW9dMfoI0BCKKAlZAdoZxOI1sjf/GvoC0DoWiefvWwAvg3h1bhQ88cxvBFdEFRcY/fQ/tQg4LfK8DU8/K6OUmmOSt/ISaoKGf2pwzAKvaFy/oKQ/9qVbHuXLRcsweMQbBBiJJAX/Nkx6Q0I8Qwh1J4xyOg9h8MnPdhAjROy0+4JX55A+HYLQJi9ekEfl+uhDjksvRC/gAwm+AzsJxncPMzQQXVzIZd1APHwnQR+YaStWNiu6TnLJqHQVt6kSGeEPCf4GEwNYuVECeQiTYBh4NjDrFrLAAAkOgIW2hw554pC2jb7k9Mv4GHaSoAeaUtxlGli4gOMe42PzhgRfQ4f2czhahc/hYa8fb1eyhzc2kOpJoRzsgxhcUYTsYBtXe+M2EFM+yyR4Zan0MB+vCZjgvRp0g+mH9mrz9Gi02sw7j7wAzqTy9ZWhfF2YIxfEtdECWz8Y8wL1bAW2dHWsZG8xoC7cAp67fOFfva023AK6GDz95ommkluCBkWI52WQwbu5PrHtLT75AH1ziVIbFd0+Bu7O6UXqxjx5X1Wtj7XR99Y+2juJeHeYvrOgXKfX/iqi11UUbJ9Gf71Jy8jO26UxedkZMxKN/ybWLPN0rn8YAAAAAElFTkSuQmCC",x:1,y:1,width:78,height:28,rx:15,text:!0,text_on:"opt_action_on",text_off:"opt_action_off"},4:{description:"lbl_switch_desc_4",symbol:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAeCAMAAACMnWmDAAACOlBMVEUAAAD///+AgICqqqqAgICioqKdnZ2SkpKZmZmWlpacnJyUlJSSkpKUlJSPj4+WlpaXl5eZmZmYmJiampqZmZmXl5efn5+ZmZmbm5uYmJicnJyampqYmJiYmJiXl5ednZ2YmJibm5ucnJyXl5eenp6srKyrq6urq6uZmZmZmZmYmJimpqaZmZmkpKSkpKSjo6OgoKCZmZmfn5+ZmZmfn5+fn5+dnZ2enp6enp6enp6fn5+fn5+fn5+enp6fn5+enp6enp6enp6ioqKfn5+jo6OhoaGioqKfn5+enp6kpKSkpKSqqqqrq6u0tLSsrKyysrKzs7OlpaWmpqanp6eurq6mpqatra2urq6mpqaoqKivr6+wsLCenp6wsLCdnZ2+vr6cnJyxsbG/v7/AwMCbm5u3t7e/v7+bm5uampqbm5u5ubmZmZmamprKysrLy8vMzMzAwMDBwcGZmZmampqbm5ucnJydnZ2ioqKjU1Ojo6OkpKSlpaWmpqanp6eoX1+qqqqrq6utra2urq6vr6+wsLCydXWysrKzs7O1tbW2tra5ubm6urq7u7u8vLy9vb2+vr6/kpK/v7/AwMDBwcHCm5vCwsLDw8PExMTFoqLFxcXGxsbHx8fJqqrJycnKysrLy8vMsrLMzMzPz8/Q0NDR0dHS0tLT09PV1dXW1tbXysrX19fY2NjZ2dna2trb29vc3Nzd2dnd3d3e3t7f39/h4eHj4+Pk5OTl5eXn5+fp6enq6urr6+vs7Ozu7u7IY7QIAAAAcnRSTlMAAQIDBgsNDg8REhMcHyAiNjc5OjxAQEFCQ0NERVRWVllZWltcXF5hcHFycnN2eHp+f3+AgoWSlpiZr7Cys7/Cw8XZ2trb29zd5OXm5ubn5+fq6u7u7+/v8PDx8/T09fX39/f3+Pj4+fr6+vv8/Pz8/f1UAU40AAACbUlEQVRIx53W+VcSURQH8Gm3fTErW8yyrMz2fV9st8VKLTJMKrOsTC8MDhgF5lIkRKUmUKmJYRi4dIsy53/rMQ7IMB6ned+f5sw58zkzb+679zFMXGamZmRvU5nsjNQZzJiZvuvMTU1RuVNlyos0xad3Jsm4yftKqrqRMt1Vd/dOknpLT9zBPnetmWXNte4BCvP2qUXx3rqrGLQbQAxrD1GQBZmj3hYddhoBGj/4w2F/ayOAsZNC1G2Oemvy8T1ATYgXEzIDtFCI+atGvLlX8BNA0xAfy5/XAF4K8fJsATz2xK8HBy+JA/R+9WDFkYi3/ALWQc1fKThkgobxH+5vdkUvXW3Rq7wlBDzkDQIM8Akh9/rG9eo5ThRdHNcs3vUcIOCjHy1g42WxKvyXDo7j2kTv2Tfx5uB9hknOxefwTg6+ASsqih3Cm8Y8xPPzmbRryMJXOegDIyqLH6UeFq5gNpSiHn7LwV9gwP8QpR6Wro+ALITlYBhYxTJxccJnS8G0G2iCHjnYAyaKNySfnHyRlKFHDrqhjmINc+cxzENSNq/k4EtoVf+XB8tIHR70+slyJXpkYQOKXqSy++Pr0LOfgMvy0AqWYak3bAEbqt8plxZHNvPRioAB3kpBJxi+q9/Ljw8L3WbOWfQC2BPa12eK9nVu1khDXC002OreqBeopmuwhSujLXuTDtvJCHjq8IV/djVZyAhop/C0G0eHSmYB9toglhdBCu/62vixt/D4PfzisEXGqM3po+BunVwgHcwT95RV0kBCuiof7J4gOztM3Z5TrNGqP4poNSU5W6eMfbxJSknP2qEyWekp0+KNfxu2TipdOODoAAAAAElFTkSuQmCC",x:1,y:1,width:78,height:28,rx:15,text:!0,text_on:"&#x2714;",text_off:"&#x2716;"},5:{description:"lbl_switch_desc_5",symbol:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KCTxwYXRoIGZpbGw9IiNlMWUxZTEiIGQ9Ik0xMiAyQzkuNzYgMiA3Ljc4IDMuMDUgNi41IDQuNjhsMS40MyAxLjQzQzguODQgNC44NCAxMC4zMiA0IDEyIDRhNSA1IDAgMCAxIDUgNWMwIDEuNjgtLjg0IDMuMTYtMi4xMSA0LjA2bDEuNDIgMS40NEMxNy45NCAxMy4yMSAxOSAxMS4yNCAxOSA5YTcgNyAwIDAgMC03LTdNMy4yOCA0TDIgNS4yN0w1LjA0IDguM0M1IDguNTMgNSA4Ljc2IDUgOWMwIDIuMzggMS4xOSA0LjQ3IDMgNS43NFYxN2ExIDEgMCAwIDAgMSAxaDUuNzNsNCA0TDIwIDIwLjcyem0zLjk1IDYuNWw1LjUgNS41SDEwdi0yLjQyYTUgNSAwIDAgMS0yLjc3LTMuMDhNOSAyMHYxYTEgMSAwIDAgMCAxIDFoNGExIDEgMCAwIDAgMS0xdi0xeiIgc3Ryb2tlLXdpZHRoPSIwLjUiIHN0cm9rZT0iI2UxZTFlMSIgLz4KPC9zdmc+",icon:!0,icon_on:"mdi:lightbulb-on",icon_off:"mdi:lightbulb-off-outline"},6:{description:"lbl_switch_desc_6",symbol:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KCTxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2UxZTFlMSIgc3Ryb2tlLXdpZHRoPSIxLjUiPgoJCTxwYXRoIGQ9Ik0xIDE1VjlhNiA2IDAgMCAxIDYtNmgxMGE2IDYgMCAwIDEgNiA2djZhNiA2IDAgMCAxLTYgNkg3YTYgNiAwIDAgMS02LTZaIiAvPgoJCTxwYXRoIGQ9Ik03IDlhMyAzIDAgMSAxIDAgNmEzIDMgMCAwIDEgMC02WiIgLz4KCQk8cGF0aCBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGQ9Ik0xMiAxNVY5aDNtMiA2VjloM20tOCAzaDIuNTcyTTE3IDEyaDIuNTcyIiAvPgoJPC9nPgo8L3N2Zz4=",icon:!0,icon_on:"iconoir:on-tag",icon_off:"iconoir:off-tag"},7:{description:"lbl_switch_desc_7",symbol:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KCTxwYXRoIGZpbGw9IiNlMWUxZTEiIGQ9Ik0xMiAxMnEtLjQyNSAwLS43MTItLjI4OFQxMSAxMVYzcTAtLjQyNS4yODgtLjcxMlQxMiAydC43MTMuMjg4VDEzIDN2OHEwIC40MjUtLjI4OC43MTNUMTIgMTJtMCA5cS0xLjg3NSAwLTMuNTEyLS43MTJ0LTIuODUtMS45MjV0LTEuOTI1LTIuODVUMyAxMnEwLTEuNTI1LjUtMi45NjNUNC45NSA2LjRxLjI3NS0uMzUuNy0uMzM3dC43NS4zMzdxLjI3NS4yNzUuMjUuNjc1dC0uMjc1Ljc1UTUuNyA4LjcyNSA1LjM1IDkuOFQ1IDEycTAgMi45MjUgMi4wMzggNC45NjNUMTIgMTl0NC45NjMtMi4wMzdUMTkgMTJxMC0xLjE1LS4zMzctMi4yMzhUMTcuNiA3Ljc3NXEtLjI1LS4zMjUtLjI3NS0uNzEydC4yNS0uNjYzcS4zLS4zLjcyNS0uMzEydC43LjMxMnEuOTc1IDEuMiAxLjQ4OCAyLjYyNVQyMSAxMnEwIDEuODc1LS43MTIgMy41MTN0LTEuOTI1IDIuODV0LTIuODUgMS45MjVUMTIgMjEiIHN0cm9rZS13aWR0aD0iMC41IiBzdHJva2U9IiNlMWUxZTEiIC8+Cjwvc3ZnPg==",icon:!0,icon_on:"material-symbols:mode-off-on",icon_off:"material-symbols:mode-off-on"}};let aceLog,aceCSS,aceOverride;const urlParams=new URLSearchParams(window.location.search),appProperties={instance:Number(urlParams.get("instance"))||0,lowPerformance:urlParams.get("lowPerformance")||!1,theme:urlParams.get("theme")||!1,namespace:`energiefluss-erweitert.${urlParams.get("instance")||0}`,hostname:window.location.hostname,localMode:!window.location.hostname,socketURL:window.location.hostname?"/":"https://192.168.2.19:8082/",webURL:window.location.hostname?"/":"https://192.168.2.19:8082/",wwwExtLoaded:!1,devMode:"true"==urlParams.get("devMode"),colorScheme:window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light",userAgent:navigator.userAgent.indexOf("WebKit")>-1?"Chrome":"Firefox",isMobile:/iPhone|iPad|iPod|Android/i.test(navigator.userAgent),isApple:/Apple Computer/i.test(navigator.vendor),isSafari:/Safari/.test(navigator.userAgent)&&!/Chrome|CriOS|FxiOS|Edg/.test(navigator.userAgent),isTouch:"ontouchstart"in window||navigator.maxTouchPoints>0,isCloud:!!window.location.hostname.match(/iobroker\.pro|iobroker\.net/),isProtected:!1,online:!1,aceEditorTheme:{dark:"clouds_midnight",light:"textmate"}};"false"==urlParams.get("localMode")&&(appProperties.localMode=!1);let socket=null;(async()=>{try{await loadAdditionalJSFile(appProperties.socketURL+"_socket/info.js");const e=new URL(appProperties.socketURL,window.location.href);if("undefined"!=typeof socketUrl&&socketUrl){const t=socketUrl.split(":").pop();console.log(`[Socket]: Web-Adapter using socket.io-Adapter. Changing Socket to: ${t}`),e.port=t,appProperties.socketURL=e.toString()}console.debug("[Config] App Properties: ",appProperties),socket=io.connect(appProperties.socketURL,{reconnectionDelay:500,reconnectionAttempts:1/0,upgrade:!0,transports:appProperties.isCloud?void 0:["websocket","polling"]}),loadAdditionalCSSFile(appProperties.theme),appProperties.isApple&&loadAdditionalCSSFile("webkit"),appProperties.isTouch||$("#svg_mobile_mode").hide(),manageSocketListener()}catch(e){console.log("Error: "+e)}})(),console.log("[Config] Using Instance: "+appProperties.namespace);const subscribeObjID=[appProperties.namespace+".configuration",appProperties.namespace+".data","system.adapter."+appProperties.namespace+".alive"];systemLang=navigator.language||navigator.userLanguage,console.log("[Language] Detected System-Language: "+systemLang);let globalSelectedId,configuration={},displayMode=!1,globalConfigChanged=!1,basicConfig=!1,globalUndoStack=[],globalRedoStack=[],globalIobObjectsLoaded=!1,globalGalleryLoaded=!1,globalClipboard=new Set,globalSelection=new Set,globalLastToasts=new Set,globalTourStep=-1;const iconRequestCache={},touchTimeout=500;let globalError=[],oldRefreshObj={};const clockIntervals={},lineTimeouts={},animationTimeouts={},initFilename=window.location.pathname.split("/").pop();if(initFilename.includes("index")||""==initFilename){if(displayMode=!0,!appProperties.isCloud&&!appProperties.localMode){const e=document.createElement("link");e.rel="manifest",e.href=`/energiefluss-erweitert.0/?serve=manifest&instance=${appProperties.instance}`,document.head.appendChild(e)}}else jscolor.presets.default={alphaChannel:"auto",format:"any",borderColor:"var(--primary)",borderRadius:10,controlBorderColor:"#538EA3",previewSize:28,previewPosition:"right",required:!1,backgroundColor:"var(--white)",palette:["#00b5dd","#61687a","#ffce4a","#a1d343","#c5902e","#f20e40"]},ace.require("ace/ext/language_tools");const dataSourceAutocompleteOptions={position:{my:"left top",at:"left bottom",collision:"fit"},source:async function(e,t){globalIobObjectsLoaded||(iobObjects=await loadIobObjects());t($.ui.autocomplete.filter(iobArray,e.term).slice(0,200))},classes:{"ui-autocomplete":"select_overflow"},minLength:3,delay:500,search:function(){globalIobObjectsLoaded||$(this).siblings(".icon_wrapper").find(".ds_search_spinner").show()},response:function(){setTimeout((()=>{$(this).siblings(".icon_wrapper").find(".ds_search_spinner").hide()}),500)}};let iobObjects,iobArray=[],globalUserImages=[];const multiselect_options={columns:1,search:!0,minWidth:"250px",maxWidth:"auto",maxPlaceholderOpts:1,texts:{}},globalTourSteps=[{elements:["#mainNavBar"],text:"main"},{elements:["#container_menu"],text:"basic"},{elements:[".added_elements","#svg_config_div"],text:"elements",alignParent:"#svg_config",align:"top"},{elements:["dded_elements","#config_bar","#svg_config"],text:"configBar",alignParent:"#config_bar",align:"left",action:"openConfig",actionMember:".added_elements"},{elements:["#fieldsetAddDataSource","#lbl_tab2"],text:"datasources",alignParent:"#fieldsetAddDataSource",align:"right",action:"click",actionMember:"#tab2"},{elements:["#fieldsetRemainingBattery","#lbl_tab4"],text:"remainingBattery",alignParent:"#fieldsetRemainingBattery",align:"right",action:"click",actionMember:"#tab4"},{elements:["#fieldsetConsumption","#lbl_tab4"],text:"consumption",alignParent:"#fieldsetConsumption",align:"left",action:"click",actionMember:"#tab4"},{elements:["#fieldsetGallery","#lbl_tab5"],text:"gallery",alignParent:"#fieldsetGallery",align:"right",action:"click",actionMember:"#tab5"},{elements:["#fieldsetConfig","#lbl_tab7"],text:"settings",alignParent:"#fieldsetConfig",align:"right",action:"click",actionMember:"#tab7"},{elements:["#lbl_wiki"],text:"wiki"},{elements:["#lbl_tab8","#fieldsetSave","#fieldsetBackup","#fieldsetSupport"],text:"save",alignParent:"#fieldsetSave",align:"right",action:"click",actionMember:"#tab8"}];function loadIobObjects(){return console.debug("[States] iobObjects not present! Requesting!"),new Promise(((e,t)=>{const o=performance.now();socket.emit("getObjects",(function(t,n){globalIobObjectsLoaded=!0,console.debug(`[States] ${Object.keys(n).length} Objects loaded in ${performance.now()-o} ms`);let a={};Object.keys(n).sort(((e,t)=>e.toLowerCase().localeCompare(t.toLowerCase()))).forEach((e=>a[e]=n[e])),iobArray=Object.keys(a).filter((e=>"state"==a[e].type)),e(a)}))}))}function sprintf(e){var t=Array.prototype.slice.call(arguments,1),o=0;return e.replace(/%s/g,(function(){return t[o++]}))}function truncateText(e,t,o=!1){return null==e?e:(isNaN(e)||(e=e.toString()),o&&"string"==typeof e&&e.startsWith("&")?e:e.length>t?e.slice(0,t-1)+"…":e)}function displayLoading(e){$(".toast").fadeOut(300),$("#loading, .loading-spinner").fadeIn(600),$("#loading_text").show().html(e)}function copyObject(e){return JSON.parse(JSON.stringify(e))}function manageSocketListener(){socket.on("reauthenticate",(function(){const e=(new Date).toLocaleString();console.log(`[Socket] reauthenticate ${e}`)})),socket.on("error",(function(e){const t=(new Date).toLocaleString();console.error(`[Socket] error: ${e} ${t}`)})),socket.on("permissionError",(function(e){const t=(new Date).toLocaleString();console.error(`[Socket] permission error: ${e} ${t}`)})),socket.on("upgrade",(function(e){const t=(new Date).toLocaleString();console.log(`[Socket] connection upgrade at ${t}`)})),socket.on("connect_error",(function(e){const t=(new Date).toLocaleString();console.error("[Socket] connect error: "+e+" "+t),console.log(`Current connection set: ${socket.io.opts.transports}`),socket.io.opts.forceNew=!0,"polling"==socket.io.opts.transports[0]?(socket.io.opts.transports=["websocket","polling"],console.log("[Socket] Connection Error. Trying websocket first!")):(socket.io.opts.transports=["polling","websocket"],console.log("[Socket] Connection Error. Trying polling first!"))})),socket.on("connect",(async function(){const e=(new Date).toLocaleString();console.log(`[Socket] connected at ${e}`),socket.emit("name",appProperties.namespace);const t=["system.config",`system.adapter.${appProperties.namespace}`];await new Promise((e=>{console.debug("[Language] Trying to get language from system!"),socket.emit("getObjects",t,(function(o,n){if(!o&&n){const o=urlParams.get("lang");o?(console.debug(`[Language] Forcing language to ${o}`),systemLang=o):(systemLang=n[t[0]].common.language,console.debug(`[Language] Got it from ioBroker! Translating Texts to locale ${systemLang}!`)),multiselect_options.texts={placeholder:translateWord("opt_please_choose"),search:translateWord("lbl_search"),selectedOptions:" "+translateWord("lbl_selected")},translateAll(),e(n)}else console.error("An error occured during getting the configuration from ioBroker!",o)}))}));const o=displayMode?subscribeObjID:subscribeObjID[2];socket.emit("unsubscribe","*"),socket.emit("subscribe",o),console.log("[Socket] subscribed to: "+o.toString()+" at "+e),loadConfig()})),socket.on("stateChange",(function(e,t){setTimeout((async function(){const o=(new Date).toLocaleString();if(e==subscribeObjID[0])try{Object.keys(clockIntervals).forEach((e=>{clearTimeout(clockIntervals[e]),console.log("Cleared Clock-Timout for "+e)})),$("#frameContainer").is(":visible")&&closeEditorContainer("frame"),$("#action_change_value").is(":visible")&&$(".ui-dialog-buttonset").children(".red").click(),$("#errorLogContainer").is(":visible")&&closeEditorContainer("errorLog"),displayLoading(translateWord("msg_loading_config")),configuration=JSON.parse(t.val),await setLoadedConfig(!0),console.log("[Config] Applied new configuration at "+o)}catch(e){console.error("[Config] Error while parsing Config in JSON-Object!")}if(e==subscribeObjID[1])try{refreshData(JSON.parse(t.val))}catch(e){console.error("[Data] Error while parsing Values in JSON-Object!")}if(e==subscribeObjID[2]&&t.val!=appProperties.online&&1==t.val&&(appProperties.online=t.val,$("#loading").fadeOut("fast"),$(".toast").fadeOut(300),displayMode)){const e=(Math.random()+1).toString(36).substring(7);window.location.href=`?instance=${appProperties.instance}&hash=${e}&lowPerformance=${appProperties.lowPerformance}&theme=${appProperties.theme}&lang=${systemLang}`}}),0)})),socket.on("reconnect",(function(){const e=(new Date).toLocaleString();console.log("[Socket] reconnected at "+e),$("#loading").fadeOut("fast")})),socket.on("disconnect",(function(){appProperties.online=!1;const e=(new Date).toLocaleString();console.log("[Socket] disconnected at "+e),displayLoading(translateWord("msg_reconnect"))}))}function addBorderFill(e,t,o={}){const n=$("#"+e),a=configuration.elements[e]||o;let i=a.radius,s=Math.PI*(2*i),r=a.height,l=a.width,c=a.border_start,d={id:`border_${e}`,class:"border_fill"};if("rect"==a.type)switch(s=2*a.width+2*a.height,c+=90,c){case 90:case 270:if(r!=l){let e=Math.abs(r-l)/2;d.width=r,d.height=l,d.x=r>l?a.pos_x-e:a.pos_x+e,d.y=r>l?a.pos_y+e:a.pos_y-e}}let u=n.clone().attr(d).css({fill:"",filter:"",transform:"rotate("+c+"deg)",strokeDashoffset:s,strokeDasharray:s,strokeLinecap:a.border_style});$(u).insertAfter(n),n.css({stroke:t})}function updateBorderFill(e,t,o,n={}){try{const a=configuration.elements[e]||n,i=$("#border_"+e);let s,r=a.border_direction,l=a.radius,c=Math.PI*(2*l);switch("rect"==a.type&&(c=2*a.width+2*a.height),a.border_type){case"percent":s=100-Math.abs(t);break;case"value":if(!a.border_max)throw addErrorToLog({id:e,for:translateWord("lbl_config_fill_outline"),error:translateWord("failmsg_no_max_value"),function:"-"}),new Error(translateWord("failmsg_no_max_value"));s=100-Math.abs(t)/a.border_max*100}s=Math.min(100,Math.max(0,s)),a.border_reverse&&t<0&&(r="cw"==r?"ccw":"cw"),c="cw"==r?c:-c;const d={strokeDashoffset:(s/100*c).toFixed(0),strokeDasharray:c,stroke:o};i.css(d)}catch(t){console.error("Error while updating border fill for ID: "+e+"! "+t)}}function animateGradient(e,t,o){const n="object"==typeof e?e:document.getElementById(e);let a=parseInt(t),i=parseInt(o),s=!1;n&&(s||function e(){s=!0,a<i?a=Math.min(a+1,i):a>i&&(a=Math.max(a-1,i));n.setAttribute("offset",`${a}%`),a!=i?requestAnimationFrame(e):s=!1}())}function updateMultiGradient(e,t,o,n){const a=document.getElementById(`gradient_${e}_fill`),i=a.childNodes,s=parseInt(a.getAttribute("data-value"));let r;try{switch(n){case"percent":r=t;break;case"value":if(!o)throw addErrorToLog({id:e,for:translateWord("lbl_config_fill_element"),error:translateWord("failmsg_no_max_value"),function:"-"}),new Error(translateWord("failmsg_no_max_value"));r=Math.abs(t)/o*100}}catch(t){console.error("Error while updating gradient for ID: "+e+"! "+t)}if(r=parseInt(r),s!=r){for(const e of i){const t=e.getAttribute("data-defaultOffset");if(null!=t){const o=parseInt(e.getAttribute("offset").replace("%",""));animateGradient(e,o,parseFloat(t)/100*r)}}a.setAttribute("data-value",r)}}function userClock(e,t,o=!1){const n=Object.keys(e).reduce(((t,o)=>("none"!==e[o]&&""!==e[o]&&(t[o]=e[o]),t)),{}),a=document.getElementById(t);let i;const s=new Date;try{i=new Intl.DateTimeFormat(systemLang,n).format(s)}catch(e){console.log("Not a valid date. Waiting for setting-up correctely!",e.message)}return a&&a.innerHTML!=i&&(a.innerHTML=i),o||(clockIntervals[t]=setTimeout(userClock,1e3,e,t)),i}function addErrorToLog(e){if(!displayMode)return;globalError.some((t=>JSON.stringify(e)===JSON.stringify(t)))||globalError.push(e),globalError.length>0&&($("#info_error_area").fadeIn("fast"),addToast("warning",translateWord("toast_warning_errorLog"),"warningErrorLog",!0))}function openErrorLog(){$("#errorLog-table tbody").empty();globalError.forEach((e=>$("#errorLog-table tbody").append(`<tr><td>${e.id}</td><td>${e.for}</td><td>${e.error}</td><td>${e.function}</td></tr>`))),openEditorContainer("errorLog")}async function refreshData(e,t=!1){function o(e,n){if(t)return!1;if(e===n)return!0;if("object"!=typeof e||"object"!=typeof n||null===e||null===n)return!1;const a=Object.keys(e),i=Object.keys(n);if(a.length!==i.length)return!1;for(let t of a)if(!o(e[t],n[t]))return!1;return!0}try{if(o(e.values,oldRefreshObj.values)?appProperties.devMode&&console.debug("[Debug] [Refresh] No changes for 'Values'!"):(appProperties.devMode&&console.debug("[Debug] [Refresh] Changes for 'Values'. Refreshing!",e.values,oldRefreshObj.values),Object.entries(e.values).forEach((t=>{const[o,n]=t,a=configuration.elements[o];if("svg"==a.type&&"switch"==a.subType&&toggleSwitch(o,n),n){let t=n;if(Object.hasOwn(e,"override")&&Object.hasOwn(e.override,o)&&Object.hasOwn(e.override[o],"value")){const n=e.override[o].value;n&&"object"==typeof n?addErrorToLog({id:o,for:`${translateWord("lbl_override")}: <b>value</b>`,error:n.error,function:n.function}):t=e.override[o].value}"value"==a.source_display||"auto"==a.source_display?a.counter_animation?isNaN(t)?$(`#${o}_value`).html(generateMultiLineText(`${o}_value`,t,a.pos_x)):($(`#${o}_value`).children().length>0||$(`#${o}_value`).html(generateMultiLineText(`${o}_value`,0,a.pos_x)),$(`#${o}_value_line_0`).countTo(t,configuration.basic.animation_timer,a.counter_highlight)):($(`#${o}_value`).children().length>0||$(`#${o}_value`).html(generateMultiLineText(`${o}_value`,0,a.pos_x)),$(`#${o}_value_line_0`).html(t),a.counter_highlight&&($(`#${o}`).addClass("glow"),setTimeout((()=>{$(`#${o}`).removeClass("glow")}),2e3))):$(`#${o}_value`).html(generateMultiLineText(`${o}_value`,t,a.pos_x)),""==a?.unit&&e.unit&&e.unit[o]&&$(`#${o}_unit`).html(generateMultiLineText(`${o}_unit`," "+e.unit[o],a.pos_x))}})),oldRefreshObj.values=copyObject(e.values)),displayMode){try{o(e.fillValues,oldRefreshObj.fillValues)?appProperties.devMode&&console.debug("[Debug] [Refresh] No changes for 'Fill-Values'!"):(appProperties.devMode&&console.debug("[Debug] [Refresh] Changes for 'Fill-Values'. Refreshing!",e.fillValues,oldRefreshObj.fillValues),Object.entries(e.fillValues).forEach((t=>{const[o,n]=t,a=configuration.elements[o];if(a&&-1!=a.fill_type&&a.fill_value){let t=a.fill_value,i=n;Object.hasOwn(e,"override")&&Object.hasOwn(e.override,o)&&(Object.hasOwn(e.override[o],"fillcolor")&&(t=e.override[o].fillcolor),Object.hasOwn(e.override[o],"value")&&(i=e.override[o].value)),t=t.replace(/[+-]?(?:\d*\.?\d+)(deg|rad|grad|turn)\s*,\s*|to\s+(top|bottom|left|right)(\s+left|\s+right)?\s*,\s*/gi,"-90deg,").toLocaleLowerCase(),t=parseColorString(t);const s=t.includes("gradient")?"gradient":"color",r=document.getElementById(`gradient_${o}_fill`),l=r?r.getAttribute("data-type"):null,c=r?parseInt(r.getAttribute("data-colorHash")):null,d=hashCode(t);if(c==d)"color"==l&&updateSingleGradient(o,i,a.fill_max,a.fill_type),"gradient"==l&&updateMultiGradient(o,i,a.fill_max,a.fill_type);else if("color"==s&&("color"==l?(r.lastChild.setAttribute("stop-color",t),r.setAttribute("data-colorHash",d)):(r&&r.remove(),generateSingleGradient(o,t,a.fill,a.fill_direction),console.debug("[Config] Single-Fill-Gradient added for: "+o)),updateSingleGradient(o,i,a.fill_max,a.fill_type)),"gradient"==s){if("gradient"==l){$(r).children(".gradientStop").remove();const e=generateSVGGradient("","",t,!0);$(e).insertBefore(`#gradient_${o}_fill_transparent`),r.setAttribute("data-colorHash",d)}else{generateStyleProperty(o,"fill",t,!0);const e=document.getElementById(`gradient_${o}_fill`),n=a.fill&&!a.fill.match(/(?=(gradient|none))/gi)?a.fill:"rgba(0,0,0,0)";let i=document.createElementNS("http://www.w3.org/2000/svg","stop");i.setAttribute("id",`gradient_${o}_fill_transparent`),i.setAttribute("offset","0%"),i.setAttribute("stop-color",n),e.appendChild(i),e.setAttribute("gradientTransform","rotate("+a.fill_direction+",0.5,0.5)"),console.log("[Config] Multi-Fill-Gradient added for: "+o)}updateMultiGradient(o,i,a.fill_max,a.fill_type)}}})),oldRefreshObj.fillValues=copyObject(e.fillValues))}catch(e){console.error("Could not apply Fill-Values. The following error was thrown: "+e)}try{o(e.img_href,oldRefreshObj.img_href)?appProperties.devMode&&console.debug("[Debug] [Refresh] No changes for 'Images'!"):(appProperties.devMode&&console.debug("[Debug] [Refresh] Changes for 'Images'. Refreshing!",e.img_href,oldRefreshObj.img_href),Object.entries(e.img_href).forEach((e=>{const[t,o]=e;"#"==o?$(`#${t}`).fadeOut(600).attr("href",usedImages.bgTrans):$(`#${t}`).attr("href",o).fadeIn(600)})),oldRefreshObj.img_href=copyObject(e.img_href))}catch(e){console.error("Could not apply Image-Sources. The following error was thrown: "+e)}try{o(e.borderValues,oldRefreshObj.borderValues)?appProperties.devMode&&console.debug("[Debug] [Refresh] No changes for 'BorderValues'!"):(appProperties.devMode&&console.debug("[Debug] [Refresh] Changes for 'BorderValues'. Refreshing!",e.borderValues,oldRefreshObj.borderValues),Object.entries(e.borderValues).forEach((t=>{const[o,n]=t,a=new RegExp(/[+-]?(?:\d*\.?\d+)(deg|rad|grad|turn)\s*,\s*|to\s+(top|bottom|left|right)(\s+left|\s+right)?\s*,\s*/gi),i=configuration.elements[o];if(-1!=i.border_type&&i.border_value){const t=(e,t,n,a)=>{const i=t.includes("gradient")?"gradient":"color",s=document.getElementById(e);let r=t;if(s){if(s.style.stroke.includes("url")){const o=document.getElementById(`gradient_${e}_stroke`),n=o?parseInt(o.getAttribute("data-colorHash")):null,a=hashCode(t);"gradient"==i&&n!=a&&(r=generateStyleProperty(e,"stroke",t,!1,"url")),"color"==i&&o&&o.remove()}else"gradient"==i&&(r=generateStyleProperty(e,"stroke",t,!1,"url"));switch(n){case"base":s.style.stroke=r;break;case"border":updateBorderFill(o,a,r)}}};let s=i.border_value,r=i.color,l=n;i.border_reverse&&n<0&&(r=i.border_reverse_value||i.color),Object.hasOwn(e,"override")&&Object.hasOwn(e.override,o)&&(Object.hasOwn(e.override[o],"borderfillcolor")&&(r=e.override[o].borderfillcolor),Object.hasOwn(e.override[o],"bordercolor")&&(s=e.override[o].bordercolor),Object.hasOwn(e.override[o],"value")&&(l=e.override[o].value)),s=s.replace(a,"-90deg,").toLocaleLowerCase(),r=r.replace(a,"-90deg,").toLocaleLowerCase(),s=parseColorString(s),r=parseColorString(r),0==$(`#border_${o}`).length&&(addBorderFill(o,s),console.debug("[Config] Border-Fill added for ID "+o)),t(`border_${o}`,r,"border",l),t(o,s,"base",l)}})),oldRefreshObj.borderValues=copyObject(e.borderValues))}catch(e){console.error("Could not apply Border-Values. The following error was thrown: "+e)}try{o(e.animations,oldRefreshObj.animations)?appProperties.devMode&&console.debug("[Debug] [Refresh] No changes for 'Animations'!"):(appProperties.devMode&&console.debug("[Debug] [Refresh] Changes for 'Animations'. Refreshing!",e.animations,oldRefreshObj.animations),Object.entries(e.animations).forEach((([e,t])=>{const o=document.getElementById(e),n=document.getElementById(e.replace("anim","line")),a=configuration.animations[e]||{},i=configuration.basic.enable_low_performance||"true"===appProperties.lowPerformance,s=configuration.basic.enable_line_animation,r=calculatePathLength(e);if("dots"===t.type){const o=configuration.animation_configuration;setupAnimatedDotBlocks(e,{dotLength:parseInt(o.length),gapLength:parseInt(o.distance),blockGap:parseInt(o.gap)||72,dotsPerBlock:parseInt(t.dots),animationSpeed:configuration.animation.animation_duration})}if(o.style.animationDirection="reverse"===t.option?"reverse":"",!i&&"duration"===t.type){const n=o.style.animationDuration;o.classList.remove("animation_fade"),n!==`${t.duration}ms`&&(clearTimeout(animationTimeouts[e]),o.classList.add("animation_fade"),animationTimeouts[e]=setTimeout((()=>{o.style.animationDuration=`${t.duration}ms`,o.classList.remove("animation_fade")}),200))}const l=!!t.animation,c=!!a.active_only;if(s)if(clearTimeout(lineTimeouts[e]),l){"true"==n.getAttribute("data-drawn")?o.style.display="inline":(animatePath(e.replace("anim","line")),lineTimeouts[e]=setTimeout((()=>{o.style.display="inline"}),r/330*1e3))}else o.style.display="none";else o.style.display=l?"inline":"none",c&&(n.style.display=l?"inline":"none");c&&!l&&(o.style.display="none",s&&(n.style.strokeDasharray="100%",n.style.animation=`eraseAnimatedLine ${r/340}s linear forwards`,n.setAttribute("data-drawn","false")))})),oldRefreshObj.animations=copyObject(e.animations))}catch(e){console.error("Could not apply Animations. The following error was thrown: "+e)}try{o(e.css,oldRefreshObj.css)?appProperties.devMode&&console.debug("[Debug] [Refresh] No changes for 'CSS'!"):(appProperties.devMode&&console.debug("[Debug] [Refresh] Changes for 'CSS'. Refreshing!",e.css,oldRefreshObj.css),Object.entries(e.css).forEach((e=>{const[t,o]=e;o.inactPos&&$("#"+t).removeClass(o.inactPos),o.inactNeg&&$("#"+t).removeClass(o.inactNeg),o.actPos&&$("#"+t).addClass(o.actPos),o.actNeg&&$("#"+t).addClass(o.actNeg)})),oldRefreshObj.css=copyObject(e.css))}catch(e){console.error("Could not apply Own CSS-Values. The following error was thrown: "+e)}o(e.override,oldRefreshObj.override)?appProperties.devMode&&console.debug("[Debug] [Refresh] No changes for 'Override'!"):(appProperties.devMode&&console.debug("[Debug] [Refresh] Changes for 'Override'. Refreshing!",e.override,oldRefreshObj.override),applyElementOverrides(e.override),oldRefreshObj.override=copyObject(e.override))}}catch(e){console.error("[Refresh] An error occured, while refreshing the data! The following Error was thrown: "+e)}}async function applyElementOverrides(e){try{Object.keys(e).length>0&&Object.entries(e).forEach((async e=>{const[t,o]=e;Object.keys(o).length>0&&Object.entries(o).forEach((e=>{const[o,n]=e,a=configuration.elements[t];switch(o.toLowerCase()){case"error":if(!1===n.status)return void addErrorToLog({id:t,for:`${translateWord("lbl_override")}: <b>Object</b>`,error:n.error,function:n.function});break;case"unit":!1===n.status?addErrorToLog({id:t,for:`${translateWord("lbl_override")}: <b>Unit</b>`,error:n.error,function:n.function}):$(`#${t}_unit`).html(generateMultiLineText(`${t}_unit`,n,a.pos_x));break;case"append":$(`#${t}_append`).html(generateMultiLineText(`${t}_append`,n,a.pos_x));break;case"prepend":$(`#${t}_prepend`).html(generateMultiLineText(`${t}_prepend`,n,a.pos_x));break;case"value":case"bordercolor":case"borderfillcolor":case"fillcolor":break;case"img_url":let e=n;e.match(/\//)||(e=appProperties.webURL+appProperties.namespace+"/userFiles/"+e),$(`#${t}`).attr("href",e);break;case"icon":iconHandler(t,n);break;case"pos_x":case"pos_y":if(a&&"text"==a.type){const e="pos_x"==o.toLocaleLowerCase()?"x":"y";$(`#${t}`).attr(e,n)}else addErrorToLog({id:t,for:`${translateWord("lbl_override")}: <b>pos_x/posy_y</b>`,error:"This property can only be used on text or datasource elements!",function:""});break;case"addclass":$(`#${t}`).addClass(n);break;case"removeclass":$(`#${t}`).removeClass(n);break;default:if(!1===n.status)return void addErrorToLog({id:t,for:`${translateWord("lbl_override")}: <b>CSS</b>`,error:n.error,function:n.function});let i=n;if(i.includes("gradient")){i=generateStyleProperty(t,o,n,!1,"url");const e=new RegExp(/(line_|anim_)/gi);t.match(e)&&gradientForStraightLine(t,t.replace(e,""))}$(`#${t}`).css(o,i),a&&"text"==a.type&&"fill"==o&&$(`#${t}`).css("color",i)}}))}))}catch(e){console.error("Could not apply override rules. The following error was thrown: "+e)}}async function translateGoogle(e,t){try{$.ajax({minLength:1,url:"http://translate.googleapis.com/translate_a/single?client=gtx&sl=en&dt=t",type:"GET",data:{tl:t,q:e},success:function(e){console.log(e[0][0][0])},error:function(){console.log("Error while translating into "+t)},timeout:3e3})}catch(e){console.log("Error!")}}async function loadConfig(){const e=performance.now(),t=setTimeout((()=>{addToast("warning",`${translateWord("failmsg_not_reachable")}<br><a href="https://github.com/SKB-CGN/ioBroker.energiefluss-erweitert/wiki/Troubleshooting" target="_blank">Link</a>`)}),4e3);socket.emit("getStates",subscribeObjID,(async function(o,n){if(o)console.log(o),addToast("error",translateWord("failmsg_receiving_data"));else if(n){if(null!=n[subscribeObjID[2]]&&(appProperties.online=n[subscribeObjID[2]].val,!appProperties.online)){clearTimeout(t),console.error(`[Socket] Adapter instance: '${appProperties.instance}' is not started!`);return displayLoading(sprintf(translateWord("msg_instance_loading"),appProperties.instance)),void addToast("error",sprintf(translateWord("failmsg_instance_offline"),appProperties.instance))}if(null!=n[subscribeObjID[0]]){if(globalConfigChanged)return void clearTimeout(t);console.log(`[Config] Trying to load configuration for instance ${appProperties.instance} from state!`);try{if(appProperties.localMode&&!displayMode)configuration=localTest,console.log("[Config] Loading Local Config");else if(configuration=JSON.parse(n[subscribeObjID[0]].val),0==Object.keys(configuration).length)throw new Error("No configuration found in state! Using basic configuration instead!");await setLoadedConfig()}catch(e){console.error("[Config] "+e),basicConfig=!0;addToast("warning",translateWord(1==displayMode?"failmsg_no_config_display_mode":"failmsg_no_config")),console.log("[Config] Loading Basic configuration from file!"),$.getJSON("js/basic_config.json",(async function(e){configuration=e,configuration?(console.log("[Config] File loaded!"),console.debug("[Config] App Properties",configuration),await setLoadedConfig()):addToast("error",translateWord("failmsg_failed_config"))}))}}else addToast("warning",sprintf(translateWord("failmsg_instance"),appProperties.instance));if(clearTimeout(t),null!=n[subscribeObjID[1]]){if(appProperties.localMode)return;try{if(console.log("[Config] Loading initial Data"),!n[subscribeObjID[1]].val)throw new Error("[Config] No data to display found! Please check, if layout is configured and saved properly!");refreshData(JSON.parse(n[subscribeObjID[1]].val))}catch(e){console.log("An error occured, while loading data! "+e)}}}else addToast("error",translateWord("failmsg_no_values"));console.log(`[Config] Configuration loaded in ${performance.now()-e} ms`)})),getBackups("backup_list")}async function gatherIobValues(e){if(!e||0===e.length)return;const t=e.filter((function(){return $(this).is(":visible")})).map((function(){return this.id})).get();if(0===t.length)return;let o;if(t.length>0){try{console.debug("[States] Getting Values for opened States!"),o=await new Promise(((e,o)=>{socket.emit("getStates",t,(function(t,n){t?o(new Error(`getStates error: ${t}`)):n?e(n):o(new Error("No state data received."))}))}))}catch(e){return void console.error("[States] Error while fetching values:",e)}for(const e of t){const t=iobObjects[e]?.common?.unit??"",n=truncateText(o?.[e]?.val,50);$(`#stateRoot [id='${e}']`).find(".stateValue").text(`${n} ${t}`).addClass("glow")}}}function generateStateTree(e,t){const o=performance.now();$(".title.folder, .title.state").off();const n=document,a=n.createElement("div");a.id="stateRoot";let i={};const s=new Map;for(const t in e){const o=t.split(".");let r="",l=a;for(let a=0;a<o.length;a++){if(r=r?`${r}.${o[a]}`:o[a],!s.has(r)){const c=n.createElement("div");if(c.id=r,0==a)c.className="root",c.innerHTML=`<div class='title folder'><span class='type folderClosed'></span><span>${o[a]}</span></div>`;else{if(c.className="sub","state"==e[t].type&&a==o.length-1){i[r]=e[t];continue}{let n="";a>1&&(n=Object.hasOwn(e[t],"common")&&"state"!=e[t].type?"object"==typeof e[t].common?.name?e[t].common.name?.[systemLang]||e[t].common.name?.en||"":e[t].common.name||"":""),c.innerHTML=`<div class='title folder'><span class='type folderClosed'></span><span>${o[a]}</span><span>${n}</span></div>`}}l.appendChild(c),s.set(r,c)}l=s.get(r)}}const r=translateWord("lbl_type"),l=translateWord("lbl_role"),c=translateWord("opt_value");for(const t in i){const o=t.lastIndexOf("."),a=t.slice(0,o),d=t.slice(o+1),u=s.get(a),p=i[t];if(!u)continue;const g="object"==typeof e[t].common?.name?e[t].common.name?.[systemLang]||e[t].common.name?.en||"":e[t].common.name||"",f=n.createElement("div");f.id=t,f.className="sub state",f.innerHTML=`<div class='title state'><span class='type file'></span><span>${d}</span><span class='name'>${g}</span></div><div class='title state mobile'><div class='detail'><span>${r}</span><span>${p?.type??""}</span></div><div class='detail'><span>${l}</span><span>${p?.common?.type??""}</span></div><div class='detail'><span>${c}</span><span class="stateValue"></span></div></div>`,u.appendChild(f)}n.getElementById(t).append(a),$(".title.folder").click((async function(){const e=$(this),o=e.parent(),n=e.find(".type").first(),a=n.hasClass("folderOpen");o.hasClass("root")&&n.hasClass("folderClosed")&&$("#"+t).scrollTo(o,1e3),n.toggleClass("folderOpen folderClosed"),e.siblings().not(".filter.hidden").efSlider();const i=e.siblings(".state.sub").not(".filter.hidden");a?i.find(".stateValue").removeClass("glow"):gatherIobValues(i)})),$(".title.state").click((function(e){const t=$(this).parent();$(".sub.state").removeClass("active"),t.toggleClass("active").next(".title.state").next(".type").addClass("file-selected"),$("#select_state").prop("disabled",!1),console.debug("[States] Active state: "+t.attr("id")),2===e.detail&&$("#select_state").click()})),document.querySelector(".stateExplorerFilter").oninput=null;let d=null;document.querySelector(".stateExplorerFilter").oninput=function(){const e=this.value.trim().toLowerCase(),t=this.closest(".form_div").querySelector(".ds_search_spinner");t.style.display="block",e?(clearTimeout(d),d=setTimeout((()=>{const o=performance.now(),n=[],a=[];for(const t in iobObjects){const o=iobObjects[t];[t,o._id,o.common?.name,o.common?.desc,o.common?.role,o.type].some((t=>"string"==typeof t&&t.trim().toLowerCase().includes(e)))&&n.push({id:t,name:o.common?.name,type:o.type})}console.debug(`[States] Found ${n.length} element(s) in ${performance.now()-o} ms`);document.querySelectorAll("#stateRoot .sub, #stateRoot .root").forEach((e=>{e.style.display="",e.classList.remove("green"),e.classList.add("filter","hidden")})),n.forEach((e=>{const t=document.getElementById(e.id);t&&(!function(e){for(;e&&!e.classList.contains("root");){const t=e.parentElement,o=t.querySelector(".stateValue");if(o&&o.classList.remove("glow"),e.classList.contains("sub")){if(e.classList.contains("green")){e=t;continue}e.classList.remove("hidden"),e.classList.add("filter","green"),t.querySelector(".title.folder>.folderOpen")&&e.classList.add("open")}e=t}e?.classList.contains("root")&&(e.classList.remove("hidden"),e.classList.add("filter","green"),e.style.display="block")}(t),"state"===e.type&&a.push(t))})),gatherIobValues($(a)),t.style.display="none",console.debug(`[States] Rendered ${n.length} element(s) in ${performance.now()-o} ms`)}),500)):(clearTimeout(d),document.querySelectorAll(".filter").forEach((e=>{e.classList.remove("filter","green","hidden")})),t.style.display="none")},$("#stateExplorer_placeholder").hide(),console.debug(`[States] StateTree build up in ${performance.now()-o} ms`)}async function openStateTree(e,t=""){if(globalIobObjectsLoaded||(iobObjects=await loadIobObjects(),generateStateTree(iobObjects,"stateExplorer")),$("#select_state").prop("disabled",!0),$("#"+e).scrollTop(0).show(),t){const o=$(`#stateRoot [id^='${t}']`).first();if(o.length){o.addClass("active").siblings().show(),o.parents(".sub").addClass("open").children(".sub").addClass("open"),o.parents(".sub, .root").children("div.title").children(".type").toggleClass("folderOpen folderClosed");gatherIobValues(o.siblings(".state.sub").add(o)),$("#"+e).scrollTo(o,1e3,-150),$("#select_state").prop("disabled",!1)}}}function getElements(e,t){let o={},n=[],a=[],i=[],s=[],r=[],l=[],c=[],d=[],u=[];Object.entries(configuration.elements).forEach((e=>{const[t,o]=e;switch(o.type){case"text":if("datasource"==o.subType){const e=Object.hasOwn(configuration.datasources,o.source)?configuration.datasources[o.source].alias:"";a.push({id:o.id,text:`${truncateText($(`#${t}`).text(),30)} (${-1!=o.source?e:""} - ID:  ${o.id})`})}else n.push({id:o.id,text:`${truncateText($(`#${t}`).text(),30)} (ID: ${o.id})`});break;case"circle":i.push({id:o.id,text:`ID ${o.id} (X: ${o.pos_x} Y: ${o.pos_y})`,y:o.pos_y});break;case"rect":s.push({id:o.id,text:`ID ${o.id} (X: ${o.pos_x} Y: ${o.pos_y})`,y:o.pos_y});break;case"icon":r.push({id:o.id,text:`ID ${o.id} (X: ${o.pos_x} Y: ${o.pos_y} - ${o.icon})`,y:o.pos_y});break;case"svg":c.push({id:o.id,text:`ID ${o.id} (X: ${o.pos_x} Y: ${o.pos_y})`,y:o.pos_y});break;case"image":d.push({id:o.id,text:`ID ${o.id} (X: ${o.pos_x} Y: ${o.pos_y})`,y:o.pos_y});break;case"foreignObject":u.push({id:o.id,text:`ID ${o.id} (X: ${o.pos_x} Y: ${o.pos_y})`,y:o.pos_y})}})),Object.entries(configuration.defs).forEach((e=>{const[t,o]=e;let n=o.d.substring(1,o.d.indexOf(" "));l.push({id:`line_${o.id}`,text:`ID line_${o.id} (X: ${n})`,d:n})})),o={opt_elm_circle:i.sort(((e,t)=>parseFloat(e.y)-parseFloat(t.y))),opt_elm_ds:a.sort(((e,t)=>parseFloat(e.id)-parseFloat(t.id))),opt_elm_icons:r.sort(((e,t)=>parseFloat(e.y)-parseFloat(t.y))),opt_elm_svg:c.sort(((e,t)=>parseFloat(e.y)-parseFloat(t.y))),opt_elm_image:d.sort(((e,t)=>parseFloat(e.y)-parseFloat(t.y))),opt_elm_fObj:u.sort(((e,t)=>parseFloat(e.y)-parseFloat(t.y))),opt_elm_lines:l.sort(((e,t)=>parseFloat(e.d)-parseFloat(t.d))),opt_elm_rect:s.sort(((e,t)=>parseFloat(e.y)-parseFloat(t.y))),opt_elm_text:n.sort(((e,t)=>e.text<t.text?-1:e.text>t.text?1:0))};let p=document.createDocumentFragment();for(var g of Object.keys(o)){let e=document.createElement("optgroup");for(var f of(e.label=translateWord(g),Object.keys(o[g]))){let n=new Option(o[g][f].text,o[g][f].id);n.selected=o[g][f].id==t,e.append(n)}p.appendChild(e)}const m=document.getElementById(e);m&&(m.innerHTML="",m.append(p))}function generateSwitchSelect(e){const t=document.getElementById("elm_design");let o,n=document.createDocumentFragment();const a=Object.keys(switchLayouts);if(a.length>0)for(const t of a)o=new Option(translateWord(switchLayouts[t].description),t,!1,e==t),o.setAttribute("data-image",switchLayouts[t].symbol?switchLayouts[t].symbol:""),n.appendChild(o);t.innerHTML="",t.append(n)}function getDataSources(e,t,o=!0){let n,a=document.createDocumentFragment();if(o&&a.append(new Option(translateWord("opt_please_choose"),"-1")),Object.keys(configuration.datasources).length>0){const e=Object.entries(configuration.datasources).filter((([,e])=>!e.deleted)).sort((([,e],[,t])=>e.alias.toLowerCase()<t.alias.toLowerCase()?-1:e.alias.toLowerCase()>t.alias.toLowerCase()?1:0));for(var i of e){if(n=new Option(`${i[1].alias} (${i[1].source})`,i[0]),"object"==typeof t)for(var s in t)t[s]==i[0]&&(n.selected=!0);else n.selected=i[0]==t;a.appendChild(n)}}else n=new Option(translateWord("no_ds_added"),"-1"),n.disabled=!0,n.title=translateWord("ex_no_ds_added"),a.appendChild(n);const r=document.getElementById(e);r&&(r.innerHTML="",r.append(a))}function checkDatasourcesInUse(e){let t={},o=0;return Object.entries(configuration.elements).forEach((n=>{const[a,i]=n;Array.isArray(i.add)&&-1!==i.add.map((e=>parseInt(e))).indexOf(e)&&(t[o++]={id:i.id,type:translateWord(`lbl_${i.subType?i.subType:i.type}`),reason:translateWord("failmsg_delete_source_as_addition")}),Array.isArray(i.subtract)&&-1!==i.subtract.map((e=>parseInt(e))).indexOf(e)&&(t[o++]={id:i.id,type:translateWord(`lbl_${i.subType?i.subType:i.type}`),reason:translateWord("failmsg_delete_source_as_subtraction")}),i.source==e&&(t[o++]={id:i.id,type:translateWord(`lbl_${i.subType?i.subType:i.type}`),reason:translateWord("failmsg_delete_source_as_source")}),i.source_action==e&&(t[o++]={id:i.id,type:translateWord(`lbl_${i.subType?i.subType:i.type}`),reason:translateWord("failmsg_delete_source_as_source_action")})})),Object.entries(configuration.calculation?.consumption).forEach((n=>{const[a,i]=n;"boolean"!=typeof i&&i===e&&(t[o++]={id:translateWord(`lbl_consumption_${a}`).replace("*",""),type:translateWord(`lbl_consumption_${a}`).replace("*",""),reason:translateWord("failmsg_delete_source_as_consumption")}),Array.isArray(i)&&"production"==a&&-1!=i.map((e=>parseInt(e))).indexOf(e)&&(t[o++]={id:translateWord(`lbl_consumption_${a}`).replace("*",""),type:translateWord(`lbl_consumption_${a}`).replace("*",""),reason:translateWord("failmsg_delete_source_as_production")})})),Object.entries(configuration.calculation.battery).forEach((n=>{const[a,i]=n;"boolean"!=typeof i&&i==e&&(t[o++]={id:translateWord(`lbl_battery_${a}`).replace("*",""),type:translateWord(`lbl_battery_${a}`).replace("*",""),reason:translateWord("failmsg_delete_source_as_calculation")})})),Object.entries(configuration.animations).forEach((n=>{const[a,i]=n;i.source==e&&(t[o++]={id:a.replace("anim","line"),type:translateWord("lbl_animation"),reason:translateWord("failmsg_delete_source_as_source")})})),t}function receiveImage(e){return new Promise((t=>{if(!e)return t(usedImages.tmpImg);const o=new Image;if(o.style.display="none",o.src="#",o.referrerPolicy="no-referrer",e.startsWith("{")){console.debug("[Image] Loading image URL via ioBroker state: "+e);const n=e.substring(1,e.lastIndexOf("}"));socket.emit("getState",n,(function(e,n){n?(o.onload=()=>t(n.val),o.onerror=()=>t(""),null!=n.val&&""!=n.val?o.src=n.val:displayMode?(console.debug('[Image] State is empty! Returning "#"!'),t("#")):(console.debug('[Image] State is empty! Returning "Not found"!'),t(usedImages.notFound))):console.log("[Image] A valid picture URL under the given source could not be found!")}))}else e.match(/\//)||(e=appProperties.webURL+appProperties.namespace+"/userFiles/"+e,console.debug("[Image] Loading image from gallery: "+e)),o.onload=()=>{t(e)},o.onerror=e=>{t(usedImages.notFound)},o.src=e;displayMode&&$(".type_image").removeClass("draggable")}))}function updateDataSources(){for(var e of(console.debug("[States] Refreshing Datasources!"),Object.keys(configuration.calculation)))for(var t of Object.keys(configuration.calculation[e]))if("production"===t)getDataSources(`calculation.${e}.${t}`,configuration.calculation[e][t],!1),$(`#calculation\\.${e}\\.${t}`).multiselect(multiselect_options);else"boolean"!=typeof configuration.calculation[e][t]&&getDataSources(`calculation.${e}.${t}`,configuration.calculation[e][t],!0)}function calculatePathLength(e){const t=document.getElementById(e);if(!t)return 0;const o=t.getAttribute("xlink:href");return document.querySelector(o).getTotalLength()}function animatePath(e){const t=document.getElementById(e);if("true"==t.getAttribute("data-drawn"))return;const o=calculatePathLength(e),n=o/340;t.style.display="inline",t.style.strokeDasharray=o,t.style.strokeDashoffset=o,t.style.animation=`drawAnimatedLine ${n}s linear forwards`,setTimeout((()=>{t.setAttribute("data-drawn","true"),t.style.strokeDasharray="",t.style.strokeDashoffset="",t.style.animation=""}),1e3*n)}function tourNextStep(e){globalTourStep>-1&&document.querySelectorAll(".tourHighlight").forEach((e=>e.classList.remove("tourHighlight")));const t=document.getElementById("tourPreviousStep"),o=document.getElementById("tourNextStep"),n=globalTourStep+(e?1:-1);if(t.style.display=0==n?"none":"inline-flex",n<0)return;if(globalTourStep=n,globalTourStep==globalTourSteps.length)return void closeEditorContainer("tour");const a=globalTourSteps[globalTourStep];if(a.elements.forEach((e=>{const t=document.querySelector(e);t&&t.classList.add("tourHighlight")})),a.action){const e=document.querySelector(a.actionMember);"openConfig"==a.action?($("#tab1").click(),showConfigBar([e.id],e.tagName.toLowerCase())):(closeConfigBar(),e.click())}else closeConfigBar();const i=document.getElementById("tourContainer");i.style.display="block",globalTourStep==globalTourSteps.length-1?o.querySelector("span").innerText=translateWord("tour_end"):o.querySelector("span").innerText=translateWord("tour_nextStep"),i.querySelector("#tooltipText").innerHTML=translateWord(`tour_${a.text}`),i.querySelector("#tourSteps").innerText=sprintf(translateWord("tour_steps"),globalTourStep+1,globalTourSteps.length);const s=i.getBoundingClientRect(),r=document.querySelector(a?.alignParent?a.alignParent:a.elements[0]).getBoundingClientRect(),l="openConfig"==a.action?355:0;switch(a.align){case"top":i.style.top=`${Math.max(r.top-s.height-40,4)}px`,i.style.left=`${r.left+10}px`;break;case"left":i.style.top="45px",i.style.left=r.left-l-s.width-15+"px";break;case"right":i.style.top="45px",i.style.left=`${r.right+15}px`;break;default:i.style.top=`${r.bottom+15}px`,i.style.left=`${r.left+10}px`}}function tourEnd(){closeConfigBar(),document.querySelectorAll(".tourHighlight").forEach((e=>e.classList.remove("tourHighlight"))),globalTourStep=-1,$("#tab1").click(),configuration.basic.tourVisited=!0}function tourStart(){document.getElementById("tab1").click(),$("#container_menu").removeClass("skeleton"),$("#loading").fadeIn(600).addClass("tour"),$("#tourContainer").css({visibility:"visible",width:"400px"}).addClass("visible").removeClass("hiding");document.getElementById("tourNextStep").querySelector("span").innerText=translateWord("tour_nextStep"),tourNextStep(!0)}async function setLoadedConfig(e=!1){await healthCheck();if(configuration.basic.enable_icon_proxy)if(appProperties.isCloud)console.log("[Proxy] Using direct load via iconify-API!"),loadAdditionalJSFile("js/iconify.min.js");else if(appProperties.wwwExtLoaded){console.log("[Proxy] Using Icon-Proxy for Icons");const t=[],o=performance.now();$(".iconify").each((function(e){const o=$(this),n=loadIconViaProxy(o.data("icon"),o);t.push(n)})),await Promise.all(t),console.debug(`[Proxy] Icons loaded in ${performance.now()-o}ms`),startIconObserver()}else addToast("warning",translateWord("failmsg_wwwExt_iconProxy"));else e||(console.log("[Config] Using direct load via iconify-API!"),loadAdditionalJSFile("js/iconify.min.js"));if($("#style_user").empty().append(configuration.basic.styles),displayMode){const n=await getInstances();if(n.length>1){const a=document.querySelector("#mouse_contextmenu>ul"),i=document.createElement("li"),s=document.createElement("hr");i.appendChild(s),a.appendChild(i);for(let r=0;r<n.length;r++){const l=document.createElement("li"),c=document.createElement("div"),d=document.createElement("img"),u=document.createElement("span");d.src=appProperties.webURL+n[r].icons[0].src.replace(/^\/+/,""),u.textContent=n[r].name,l.setAttribute("class","instance_link"),l.setAttribute("data-id",r),c.append(d,u),l.appendChild(c),a.appendChild(l)}}}else{const p=await checkPasswordProtection();appProperties.isProtected=p,p&&addToast("warning",translateWord("ex_protected_warning"),"warningProtectionWarning",!0),$("#password_protection").toggle(p),$("#password_protection_tip").toggle(!p),resizeSVG(),aceCSS=ace.edit("own_css"),aceCSS.renderer.setScrollMargin(0,12),aceCSS.session.setMode("ace/mode/css"),aceCSS.setTheme("ace/theme/"+appProperties.aceEditorTheme[appProperties.colorScheme]),aceCSS.setOptions({enableBasicAutocompletion:!0,enableSnippets:!0,enableLiveAutocompletion:!0,enableAutoIndent:!0}),aceCSS.on("change",(function(){configuration.basic.styles=aceCSS.getSession().getValue(),$("#style_user").empty().append(configuration.basic.styles)})),Object.entries(configuration.basic).forEach((e=>{const[t,o]=e;if(null!=o)if("object"==typeof o)for(var n of Object.keys(configuration.basic[t]))$(`#basic\\.${t}\\.${n}`).hasClass("color")?$(`#basic\\.${t}\\.${n}`)[0].jscolor.fromString(configuration.basic[t][n]):$(`#basic\\.${t}\\.${n}`).val(configuration.basic[t][n]);else switch(t){default:switch(typeof o){case"boolean":$(`#basic\\.${t}`).prop("checked",o);break;case"number":case"string":$(`#basic\\.${t}`).val(o)}break;case"enable_grid":$(`#basic\\.${t}`).prop("checked",o),o&&$("#help_grid").fadeIn("fast");break;case"enable_area_catch":$(`#basic\\.${t}`).prop("checked",o),o||appProperties.isMobile||$(".tabbed").first().addClass("no_catch");break;case"height":$("#basic\\.height\\.slider").val(o),$("#basic\\.height").val(o),resizeSVG();break;case"width":$("#basic\\.width").val(o),$("#basic\\.width\\.slider").val(o),resizeSVG();break;case"background_color":$("#basic\\.background_color")[0].jscolor.fromString(o);break;case"styles":aceCSS.setValue(configuration.basic.styles,-1),aceCSS.resize();break;case"animation_timer":$("#basic\\.animation_timer").val(configuration.basic.animation_timer?configuration.basic.animation_timer:1e3)}}));for(const f of Object.keys(configuration.animation))if($(`#animation\\.${f}`).val(configuration.animation[f]),"object"==typeof configuration.animation[f])for(const m of Object.keys(configuration.animation[f]))$(`#animation\\.${f}\\.${m}`).val(configuration.animation[f][m]);for(const h of Object.keys(configuration.animation_configuration))$(`#animation_configuration\\.${h}`).val(configuration.animation_configuration[h]);for(const b of Object.keys(configuration.line))$(`#line\\.${b}`).val(configuration.line[b]);for(const _ of Object.keys(configuration.calculation))for(const y of Object.keys(configuration.calculation[_]))switch(y){default:getDataSources(`calculation.${_}.${y}`,configuration.calculation[_][y],!0);break;case"production":getDataSources(`calculation.${_}.${y}`,configuration.calculation[_][y],!1),$(`#calculation\\.${_}\\.${y}`).multiselect(multiselect_options);break;case"charge_prop":case"discharge_prop":case"gridFeed_prop":case"gridConsume_prop":case"batteryCharge_prop":case"batteryDischarge_prop":$(`#calculation\\.${_}\\.${y}`).prop("checked",configuration.calculation[_][y])}configuration.calculation.battery&&configuration.calculation.battery.dod>=0&&null!=configuration.calculation.battery.dod&&configuration.calculation.battery.capacity>=0&&null!=configuration.calculation.battery.capacity&&configuration.calculation.battery.percent>=0&&null!=configuration.calculation.battery.percent&&configuration.calculation.battery.charge>=0&&null!=configuration.calculation.battery.charge&&configuration.calculation.battery.discharge>=0&&null!=configuration.calculation.battery.discharge&&(console.debug("[Calculation] Battery configured!"),$("#calculation\\.battery\\.status").addClass("green").removeClass("red").text(translateWord("txt_calculation_succ"))),configuration.calculation.consumption&&0!=configuration.calculation.consumption.production.indexOf(-1)&&configuration.calculation.consumption.production.length>0&&configuration.calculation.consumption.gridFeed>=0&&null!=configuration.calculation.consumption.gridFeed&&configuration.calculation.consumption.gridConsume>=0&&null!=configuration.calculation.consumption.gridConsume&&(console.debug("[Calculation] Consumption configured!"),$("#calculation\\.consumption\\.status").addClass("green").removeClass("red").text(translateWord("txt_calculation_succ")));const g=Object.entries(configuration.datasources).sort((([,e],[,t])=>e.alias.localeCompare(t.alias))).map((([e])=>Number(e)));for(const w of g)addDataSourceRow(w);configuration.basic.enable_ds_autocomplete&&$("#elm_ds_source").autocomplete(dataSourceAutocompleteOptions)}if(Object.hasOwn(configuration,"elements")){$(".placeholders").empty();const v={elements:[],text:[],icon:[]};for(const k in configuration.elements){const C=configuration.elements[k];"text"==C.type||"icon"==C.type?v[C.type].push({key:k,position:C.position??1/0}):v.elements.push({key:k,position:C.position??1/0})}for(const A in v)v[A].sort((function(e,t){return e.position-t.position}));for(const S in v){const T=v[S];for(let I=0;I<T.length;I++){const O=T[I].key;svgElement(configuration.elements[O])}}for(const E of Object.keys(configuration.defs))svgElement(configuration.defs[E]);const x=[];for(const M in configuration.lines){const P=configuration.lines[M];x.push({key:M,position:P.position??1/0})}x.sort((function(e,t){return e.position-t.position}));for(let j=0;j<x.length;j++){const L=x[j].key;svgElement(configuration.lines[L])}for(const D of Object.keys(configuration.animations))svgElement(configuration.animations[D]);if(updateLineAnimation(),displayMode){configuration.basic.background_color&&(console.debug("[Config]: Setting background color!"),$("#style_user").append(`html,body { background-color: ${configuration.basic.background_color}; }`)),$("#svg_display").attr({viewBox:"0 0 "+configuration.basic.width+" "+configuration.basic.height}),$(".all_elements").removeClass("anim_element no_animation"),$("#config_link, #config_link_ctx").on("click",(function(){window.location.replace("configuration.html?instance="+appProperties.instance)})),$("#info_error_area").hide(),globalError=[],$("#config_link").toggle(configuration.basic.enable_config_icon);if(configuration.basic.enable_low_performance||"true"===appProperties.lowPerformance){console.log("[Config] Low performance mode activated!");let W=0;const N=1e3/(configuration.animation?.lowPerformance?.frames??30),B=document.querySelectorAll(".type_animation"),q=136/(configuration.animation?.lowPerformance?.duration??1200),R=new Map,U=new Set,F=new Map,z=new IntersectionObserver((e=>{e.forEach((e=>{const t=e.target;e.isIntersecting?U.add(t):U.delete(t)}))}),{threshold:0}),G=new MutationObserver((e=>{e.forEach((e=>{"attributes"!==e.type||"style"!==e.attributeName&&"class"!==e.attributeName||Z(e.target)}))}));function Z(e){const t=getComputedStyle(e).strokeDasharray.replace(/px/g,"").split(/[\s,]+/);let o=t.reduce(((e,t)=>e+Number(t)),0);t.length%2!=0&&(o*=2),F.set(e,o)}function V(e){W||(W=e);const t=e-W;t<N||(U.forEach((e=>{const o=F.get(e);let n=R.get(e)||0;const a="reverse"===e.style.animationDirection,i=t*q;n=a?n+i:n-i,n%=o,R.set(e,n),e.style.strokeDashoffset=n})),W=e),requestAnimationFrame(V)}B.forEach((e=>{const t=e.getAttribute("xlink:href");document.querySelector(t);R.set(e,0),Z(e),z.observe(e),G.observe(e,{attributes:!0,attributeFilter:["style","class"]})})),requestAnimationFrame(V)}else $(".type_animation").addClass("animation animation_cfg")}else if(basicConfig||addToast("success",translateWord("succ_msg_loading")),!appProperties.isMobile&&!configuration.basic.tourVisited)return void tourStart();$("#loading").fadeOut("fast"),$("#container_menu").removeClass("skeleton")}else addToast("success",translateWord("succ_msg_loading_basic")),setTimeout((()=>{$("#loading").fadeOut("fast")}),0),$("#config_link > a").attr("href","configuration.html?instance="+appProperties.instance).show()}function updateLineAnimation(){const e=configuration.animation,t=calculateAnimationSpeed(e.stroke_dasharray,e.animation_duration);$("#style_animation").empty().append(`.line {stroke-width:${configuration.line.stroke_width}px; stroke:${configuration.line.stroke}; }`).append(`.animation {stroke-dasharray:${e.stroke_dasharray}; stroke-width:${e.stroke_width}px; stroke-linecap:${e.stroke_linecap}; }`).append(`.animation_cfg {animation-duration:${t}ms; animation-timing-function:${e.animation_timing_function}; }`),displayMode&&$("#style_animation").append(".type_animation {display: none;}")}function calculateAnimationSpeed(e,t){Array.isArray(e)||(e=e.split(" ").map(Number));const o=e.reduce(((e,t)=>e+t),0),n=136/(t/1e3);return Math.ceil(o/n*1e3)}function setupAnimatedDotBlocks(e,t){const o=document.getElementById(e),{dotLength:n,gapLength:a,blockGap:i,dotsPerBlock:s,animationSpeed:r}=t,l=[];if(s>0){for(let e=0;e<s;e++)l.push(n),e!==s-1&&l.push(a);l.push(i),l.length%2==1&&l.push(0)}else l.push(0,i);const c=l.reduce(((e,t)=>e+t),0),d=l.join(" "),u=calculateAnimationSpeed(l,r);return o.style.strokeDasharray=d,o.style.strokeLinecap=0===l[0]?"butt":"",o.style.animationDuration=`${u}ms`,o.style.setProperty("--dashoffset-target",`-${c}px`),{dashParts:d,duration:u}}function linePreview(e){const t=parseInt($("#animation\\.stroke_width").val()),o=parseInt($("#animation_configuration\\.dots").val()),n=parseInt($("#animation_configuration\\.distance").val()),a=parseInt($("#animation_configuration\\.length").val()),i=parseInt($("#animation_configuration\\.gap").val()),s=parseInt($("#line\\.stroke_width").val()),r=parseInt($("#animation\\.animation_duration").val()),l=parseInt($("#animation\\.lowPerformance\\.duration").val()),c=parseInt($("#animation\\.lowPerformance\\.frames").val()),d=$("#animation\\.stroke_linecap").val(),u=$("#animation\\.animation_timing_function").val(),p=setupAnimatedDotBlocks("preview_line_anim",{dotLength:a,gapLength:n,blockGap:i||72,dotsPerBlock:o,animationSpeed:r});configuration.animation={stroke_dasharray:p.dashParts,stroke_width:t,animation_duration:r,stroke_linecap:d,animation_timing_function:u,lowPerformance:{duration:l,frames:c}},configuration.animation_configuration={gap:i,dots:o,distance:n,length:a},configuration.line={stroke_width:s,stroke:"#000000"},updateLineAnimation()}function resizeSVG(){const e=document.getElementById("svg_config");e.setAttribute("width",configuration.basic.width),e.setAttribute("height",configuration.basic.height),e.setAttribute("viewBox",`0 0 ${configuration.basic.width} ${configuration.basic.height}`)}function lineConnection(e){const t=[];for(const o in configuration.defs){const[,n,a]=o.split("_");n!=e&&a!=e||t.push({path:o,from:n,to:a})}return t}function checkSVGSize(e,t){function o(e,t){const o=getElementCoords(e.id),n=Number("width"===t?o.width:o.height);return("width"===t?o.x:o.y)+("circle"===o.type||"text"===o.type?n/2:n)+o.stroke}function n(e){return Object.values(configuration.elements).reduce(((t,n)=>o(n,e)>o(t,e)?n:t))}const a=n("width"),i=n("height");return{width:e>o(a,"width"),height:t>o(i,"height")}}function checkElementBounds(e,t){const o=configuration.basic,n=Number(e.stroke)/2,a="circle"==e.type||"text"==e.type?t.x-Number(e.width)/2-n:t.x-n,i=a+Number(e.width)+2*n,s="circle"==e.type||"text"==e.type?t.y-Number(e.height)/2-n:t.y-n,r=s+Number(e.height)+2*n;return{x:a>=0&&i<=o.width,y:s>=0&&r<=o.height}}function moveSVGElement(e,t){const o=configuration.elements[e.id],n="circle"==e.type?"cx":"x",a="circle"==e.type?"cy":"y",i=checkElementBounds(e,t).x,s=checkElementBounds(e,t).y;if(i&&($("#"+e.id).attr(n,t.x),o.pos_x=t.x,Object.hasOwn(o,"text")&&o.text.match(/\n/gi)&&$("#"+e.id).children().attr("x",t.x),(Object.hasOwn(o,"prepend")||Object.hasOwn(o,"append")||Object.hasOwn(o,"unit"))&&$(`#${e.id}_prepend, #${e.id}_append, #${e.id}_value, #${e.id}_unit`).children().each((function(){$(this).attr("x")&&$(this).attr("x",t.x)}))),s&&($("#"+e.id).attr(a,t.y),o.pos_y=t.y),o?.degree>0){const t=calculateRotation(o.id,o.degree);$("#"+e.id).attr("transform",`rotate(${t.angle}, ${t.cx}, ${t.cy})`)}if(makeConnections(e.connections),i&&s)return!0}function getMousePosition(e){var t=document.getElementById("svg_config").getScreenCTM();return e.touches&&(e=e.touches[0]),{x:parseInt((e.clientX-t.e)/t.a),y:parseInt((e.clientY-t.f)/t.d)}}function getElementCoords(e,t,o={}){const n=configuration.elements[e];let{width:a=1,height:i=1,radius:s=0,stroke:r=0}={...n,...o},l=Number(n.pos_x),c=Number(n.pos_y),d=0,u=0,p=t?getMousePosition(t):{x:0,y:0};switch(p.x-=l,p.y-=c,r=Number(r),n.type){case"circle":a=2*s,i=a,d=l,u=c;break;case"text":const t=document.getElementById(e),o=t.getBoundingClientRect();let r=4;if(t.classList.contains("type_text")){const e=t.children;e.length>1&&(r+=e.length*n.font_size)}if(t.classList.contains("type_datasource")){const e=t.children[1].children;e.length>1&&(r+=e.length*n.font_size)}a=Math.round(o.width),i=Math.round(o.height)-r,d=l,u=c}return{id:Number(e),cx:d,cy:u,x:l,y:c,width:a,height:i,radius:s,stroke:r,connections:lineConnection(e),protected:n.protected||!1,group:n.group,offset:p,type:n.type}}function connectorAngle(e){return(e-90)*(Math.PI/180)}function calculateConnectionPoints(e){const t={},o=configuration.elements[e],n=(parseInt(o.stroke)||0)/2;const a=function(e){if("circle"===o.type){const e=parseInt(o.radius);return{r:e+n,cx:parseInt(o.pos_x),cy:parseInt(o.pos_y),width:2*e,height:2*e,x:parseInt(o.pos_x)-e,y:parseInt(o.pos_y)-e,s:n}}if("rect"===o.type)return{width:parseInt(o.width),height:parseInt(o.height),x:parseInt(o.pos_x),y:parseInt(o.pos_y),s:n}}();return"circle"===o.type&&function({cx:e,cy:o,r:n}){const a=["top_left","top_right","right_top","right_bottom","bottom_left","bottom_right","left_bottom","left_top"],i=["vertical","vertical","horizontal","horizontal","vertical","vertical","horizontal","horizontal"];[340,20,70,110,200,160,250,290].forEach(((s,r)=>{t[a[r]]={x:e+n*Math.cos(connectorAngle(s)),y:o+n*Math.sin(connectorAngle(s)),direction:i[r]}}))}(a),"rect"===o.type&&function({width:e,height:o,x:n,y:a,s:i}){t.top_left={x:n+e/2-20,y:a-i,direction:"vertical"},t.top_right={x:n+e/2+20,y:a-i,direction:"vertical"},t.left_top={x:n-i,y:a+o/2-20,direction:"horizontal"},t.left_bottom={x:n-i,y:a+o/2+20,direction:"horizontal"},t.right_top={x:n+e+i,y:a+o/2-20,direction:"horizontal"},t.right_bottom={x:n+e+i,y:a+o/2+20,direction:"horizontal"},t.bottom_left={x:n+e/2-20,y:a+o+i,direction:"vertical"},t.bottom_right={x:n+e/2+20,y:a+o+i,direction:"vertical"}}(a),function({width:e,height:o,x:n,y:a,s:i}){const s=i||0;t.top={x:n+e/2,y:a-s,direction:"vertical"},t.left={x:n-s,y:a+o/2,direction:"horizontal"},t.right={x:n+e+s,y:a+o/2,direction:"horizontal"},t.bottom={x:n+e/2,y:a+o+s,direction:"vertical"}}(a),o.degree&&function({dimensions:e,degree:n}){const a=e.s||0,i=parseFloat(o.rx||0),s=i*(1-Math.cos(Math.PI/4)),r=i>0?1.3*s:0;t.corner_top_left={x:e.x-a+r,y:e.y-a+r,direction:"vertical"},t.corner_top_right={x:e.x+e.width+a-r,y:e.y-a+r,direction:"horizontal"},t.corner_bottom_left={x:e.x-a+r,y:e.y+e.height+a-r,direction:"horizontal"},t.corner_bottom_right={x:e.x+e.width+a-r,y:e.y+e.height+a-r,direction:"vertical"};const l=parseInt(o.pos_x)+parseInt(o.width)/2,c=parseInt(o.pos_y)+parseInt(o.height)/2,d=Math.PI/180*n,u=Math.cos(d),p=Math.sin(d),g=(n%360+360)%360;for(const e in t){const o=t[e],n=o.x-l,a=o.y-c,i=u*n-p*a+l,s=p*n+u*a+c;let r=o.direction;o.direction&&(g>80&&g<=135||g>225&&g<=315)&&(r="vertical"===o.direction?"horizontal":"vertical"),t[e]={...o,x:Math.round(100*i)/100,y:Math.round(100*s)/100,direction:r}}}({dimensions:a,degree:o.degree}),t}function showConnectionPoints(e=!0){const t=$("#connection_points");e?(t.empty(),Object.keys(configuration.elements).forEach((e=>{const o=configuration.elements[e];if("circle"==o.type||"rect"==o.type){!function(e,t,o){Object.entries(e).forEach((([e,n])=>{const a=document.createElementNS("http://www.w3.org/2000/svg","circle");a.setAttribute("class","tooltip connPoints clickable"),a.setAttribute("cx",n.x),a.setAttribute("cy",n.y),a.setAttribute("r",5),a.setAttribute("data-slot",e),a.setAttribute("data-element",t),a.setAttribute("data-title",`value_${e}`),o.append(a)}))}(calculateConnectionPoints(e),e,t)}}))):t.empty()}async function connectElements(e){return new Promise(((t,o)=>{const n=$(".line:not(.faded_out, .preview)");let a,i,s,r;$(".connector").length>=2?($(`#${e}`).toggleClass("red"),$(`.connect_elements:not(#${e})`).prop("disabled",!0)):addToast("warning",translateWord("failmsg_no_elements")),$(`#${e}`).hasClass("red")?($(`#${e}`).children("span").text(translateWord("value_cancel")),"connect_elements"==e&&hideConfigBar(),showConnectionPoints(),hideCoordinates(),$(`#ex_${e}`).html("connect_elements"==e?`${translateWord("ex_connect_ref")}`:translateWord("ex_reconnect_ref")),$(".all_elements").not(".type_circle, .type_rect").addClass("faded_out not_selectable").removeClass("draggable-multi"),$("#svg_config").addClass("not_selectable"),"reconnect_elements"==e&&($("#"+n[0].id+", #"+n[0].id.replace("anim","line")).removeClass("faded_out"),$(".type_rect, .type_circle").removeClass("faded_out")),$(".connector").removeClass("draggable draggable-multi").addClass("clickable"),$(".clickable").off().click((function(o){let l=o.target.id?o.target.id:$(this).data("element"),c=$(this).data("slot")?$(this).data("slot"):"element";if(null==a)a=l,s=c,$(`#ex_${e}`).html(translateWord("ex_connect_start")),$(this).addClass("red");else if(a==l)$(`#ex_${e}`).html(translateWord("ex_connect_same")),i=null,r=null;else{i=l,r=c;const o=`path_${a}_${i}`;if(Object.hasOwn(configuration.defs,`path_${a}_${i}`)||Object.hasOwn(configuration.defs,`path_${i}_${a}`))if("connect_elements"==e)addToast("warning",translateWord("failmsg_conn_exists"));else{const e=copyObject(configuration.defs[o]),t=copyObject(configuration.lines["line_"+o]),n=copyObject(configuration.animations["anim_"+o]);configuration.defs[o].startSlot=s,configuration.defs[o].endSlot=r;const l=calculatePath(o,a,i);configuration.defs[o].d=l,$(`#${o}`).attr("d",l),saveUndoStep("change",{animation:n,def:e,line:t},{animation:n,def:copyObject(configuration.defs[o]),line:t}),globalConfigChanged=!0}else{switch(e){case"connect_elements":const e={type:"def",id:o,startSlot:s,endSlot:r,d:""};configuration.defs[o]=e,configuration.defs[o].d=calculatePath(o,a,i);const t={type:"line",id:"line_"+o,color:configuration.line.stroke,href:"#"+o};configuration.lines["line_"+o]=t;const l={type:"animation",id:"anim_"+o,color:configuration.animation.stroke,href:"#"+o,source:-1,animation_properties:"positive",animation_option:!1,threshold:null,dots:null,duration:null,power:null,animation_type:-1,css_general:"",css_active_positive:"",css_inactive_positive:"",css_active_negative:"",css_inactive_negative:""};configuration.animations["anim_"+o]=l,saveUndoStep("add",{animation:copyObject(l),def:copyObject(e),line:copyObject(t)},"");break;case"reconnect_elements":if(1==n.length){let e=n[0].id,t=n[0].id.replace("line_",""),l=n[0].id.replace("line","anim");configuration.defs[o]={...configuration.defs[t],id:o,startSlot:s,endSlot:r},configuration.defs[o].d=calculatePath(o,a,i),configuration.lines["line_"+o]={...configuration.lines[e],id:"line_"+o,href:"#"+o},configuration.animations["anim_"+o]={...configuration.animations[l],id:"anim_"+o,href:"#"+o},saveUndoStep("change",{animation:copyObject(configuration.animations[l]),def:copyObject(configuration.defs[t]),line:copyObject(configuration.lines[e])},{animation:copyObject(configuration.animations["anim_"+o]),def:copyObject(configuration.defs[o]),line:copyObject(configuration.lines["line_"+o])}),delete configuration.defs[t],delete configuration.lines[e],delete configuration.animations[l],$(`#${l}, #${e}, #${t}`).remove()}}svgElement(configuration.defs[o]),svgElement(configuration.lines["line_"+o]),svgElement(configuration.animations["anim_"+o]),globalConfigChanged=!0}t(`line_${o}`),showConnectionPoints(!1),a=null,i=null,$(`#${e}`).removeClass("red").children("span").text("connect_elements"==e?translateWord("value_connect"):translateWord("value_reconnect")),$(`#ex_${e}`).html("connect_elements"==e?translateWord("ex_connect"):translateWord("ex_reconnect")),$(".connect_elements").prop("disabled",!1),$(".clickable").off(),$(".added_elements").removeClass("clickable").addClass("draggable"),$(".all_elements").removeClass("connect_elements"==e?"not_selectable faded_out":"not_selectable"),$("#svg_config").removeClass("not_selectable")}}))):($(".clickable").off(),$(".added_elements").removeClass("clickable").addClass("draggable"),$(`#${e}`).children("span").text("connect_elements"==e?translateWord("value_connect"):translateWord("value_reconnect")),$(`#ex_${e}`).html("connect_elements"==e?translateWord("ex_connect"):translateWord("ex_reconnect")),$(".all_elements").removeClass("connect_elements"==e?"not_selectable faded_out":"not_selectable"),$("#svg_config").removeClass("not_selectable"),"reconnect_elements"==e&&t("Aborted"),showConnectionPoints(!1),$(".connect_elements").prop("disabled",!1))}))}function copyToClipboard(e){navigator.clipboard.writeText(e).then((()=>{addToast("info",translateWord("elm_copy_success"))})).catch((e=>{console.error(e.message),alert(e.message),addToast("warning",translateWord("elm_copy_failed"))}))}function convertTextToDS(e){globalConfigChanged=!0;const t=copyObject(configuration.elements[e]);configuration.elements[e]={...configuration.elements[e],subType:"datasource",decimal_places:0,calculate_kw:"none",source_display:"auto",source:-1,text:`${translateWord("lbl_datasource")} ${e}`};const o=copyObject(configuration.elements[e]);saveUndoStep("convertDS",t,o),svgElement(o,!0),addToast("success",translateWord("succ_msg_convertDS")),showConfigBar([e],"text")}function exportElement(e){let t,o=Object.assign({},configuration.elements[e]);["id","source","source_action","pos_x","pos_y","group"].forEach((e=>delete o[e]));const n=getRandomInt(55);$(`<div id="tmpDiv_${n}" class="tmpDiv" />`).appendTo("body"),$(`#tmpDiv_${n}`).prop("title",translateWord("value_export_element")).dialog({resizable:!1,height:520,width:400,maxHeight:"100%",modal:!0,classes:jQueryDialog.classes,open:jQueryDialog.open,beforeClose:jQueryDialog.beforeClose,create:function(){t=ace.edit(`tmpDiv_${n}`),t.session.setMode("ace/mode/json"),t.setTheme("ace/theme/"+appProperties.aceEditorTheme[appProperties.colorScheme]),t.setReadOnly(!0),t.setValue(JSON.stringify(o,void 0,4),-1)},close:function(){t.destroy()},buttons:[{text:translateWord("btn_copy"),class:"input_button jquery",click:function(){copyToClipboard(t.getValue())}},{text:translateWord("btn_close"),class:"input_button jquery",click:function(){$(this).dialog("close")}}]})}function makeConnections(e){if(e.length>0)for(const t of e){const e=calculatePath(t.path,t.from,t.to);configuration.defs[t.path].d=e,$(`#${t.path}`).attr("d",e)}}function calculateRotation(e,t){const o=configuration.elements[e];let n=o.pos_x+o.width/2,a=o.pos_y+o.height/2;if("text"==o.type){const t=document.getElementById(e).getBBox();n=t.x+t.width/2,a=t.y+t.height/2}return{angle:Math.max(0,Math.min(t,360)),cx:n,cy:a}}function calculatePath(e,t,o){function n(e,t){const o=Math.abs(e.x-t.x),n=Math.abs(e.y-t.y);return Math.sqrt(o*o+n*n)}const a=calculateConnectionPoints(t),i=calculateConnectionPoints(o),s=configuration.defs[e],{startSlot:r,endSlot:l}=s;function c(e,t){if("element"===t){const{top:t,right:o,bottom:n,left:a,corner_top_left:i,corner_top_right:s,corner_bottom_left:r,corner_bottom_right:l}=e;return{top:t,right:o,bottom:n,left:a,corner_top_left:i,corner_top_right:s,corner_bottom_left:r,corner_bottom_right:l}}return{[t]:e[t]}}const d=c(a,r),u=c(i,l);let p=1/0,g={start:null,end:null};for(const e in d)for(const t in u){const o=d[e],a=u[t];if(o&&a){const e=n(o,a);e<p&&(p=e,g={start:o,end:a})}}return g.start&&g.end?generatePath(e,g.start.x,g.start.y,g.end.x,g.end.y,g.start.direction||"vertical",g.end.direction||"vertical",r,l):(console.error("Could not find valid start or end slots for path:",e),"")}function generatePath(e,t,o,n,a,i,s,r,l){let c={x:t,y:o},d=[`M${t} ${o}`];const u=Math.abs(n-t),p=Math.abs(a-o),g=configuration.defs[e];let f=g.line_arc?parseFloat(g.line_arc)/100:.2,m=g.line_radius?parseFloat(g.line_radius):15;function h(e){d.push(`H ${e}`),c.x=e}function b(e){d.push(`V ${e}`),c.y=e}function _(e,t,o,n,a,i){const s=function(e,t,o,n){const a=(n-90)*Math.PI/180;return{x:e+o*Math.cos(a),y:t+o*Math.sin(a)}}(e,t,o,a),r=a-n<=180?"0":"1";return c.x=s.x,c.y=s.y,`A ${o} ${o} 0 ${r} ${i} ${s.x} ${s.y}`}function y(e){switch(e){case"right_down":d.push(_(c.x,c.y+m,m,0,90,1));break;case"right_up":d.push(_(c.x,c.y-m,m,0,90,0));break;case"down_left":d.push(_(c.x,c.y+m,m,180,270,1));break;case"down_right":d.push(_(c.x,c.y+m,m,0,90,0));break;case"up_left":d.push(_(c.x-2*m,c.y-m,m,0,90,0));break;case"up_right":d.push(_(c.x,c.y-m,m,0,90,1));break;case"left_down":d.push(_(c.x,c.y+m,m,180,270,0));break;case"left_up":d.push(_(c.x,c.y-m,m,180,270,1))}}return u>0&&u<2*m&&(m=Math.floor(u/2)),p>0&&p<2*m&&(m=Math.floor(p/2)),a==o&&(r==l&&"element"!=r&&"element"!=l?(m=Math.max(m,4),"right"!=r&&"left"!=r||h(n),"top"==r&&(b(o-Math.max(p*f,2)),n>t?(y("up_right"),h(n-m),y("right_down")):(console.log("Here"),y("up_left"),h(n+m),y("left_down")),b(a)),"bottom"==r&&(b(o+Math.max(p*f,2)),n>t?(y("down_right"),h(n-m),y("right_up")):(y("down_left"),h(n+m),y("left_up")),b(a))):h(n)),n===t&&(r==l&&"element"!=r&&"element"!=l?(m=Math.max(m,4),"top"!=r&&"bottom"!=r||b(a),"left"==r&&(h(t-Math.max(u*f,2)),a>o?(y("left_down"),b(a-m),y("down_right")):(y("left_up"),b(a+m),y("up_right"))),"right"==r&&(h(n+Math.max(u*f,2)),a>o?(y("right_down"),b(a-m),y("down_left")):(y("right_up"),b(a+m),y("up_left"))),h(n)):b(a)),a>o&&n>t&&("horizontal"==i?"horizontal"==s?(r==l&&"element"!=r&&"element"!=l?(m=Math.max(m,4),"left"==r&&(h(t-Math.max(u*f,2)),y("left_down"),b(a-m),y("down_right")),"right"==r&&(console.log("Here right"),h(n+Math.max(u*f,2)),y("right_down"),b(a-m),y("down_left"))):(h(t+Math.max(u*f,2)),y("right_down"),b(a-m),y("down_right")),h(n)):(h(n-m),y("right_down"),b(a)):"vertical"==s?r==l&&"element"!=r&&"element"!=l?(m=Math.max(m,4),"top"==r&&(b(o-Math.max(p*f,2)),y("up_right"),h(n-m),y("right_down")),"bottom"==r&&(b(a+Math.max(p*f,2)),y("down_right"),h(n-m),y("right_up")),b(a)):(b(o+Math.max(p*f,2)),y("down_right"),h(n-m),y("right_down"),b(a)):(b(a-m),y("down_right"),h(n))),a>o&&n<t&&("horizontal"==i?"horizontal"==s?(r==l&&"element"!=r&&"element"!=l?(m=Math.max(m,4),"left"==r&&(h(n-Math.max(u*f,2)),y("left_down"),b(a-m),y("down_right")),"right"==r&&(h(t+Math.max(u*f,2)),y("right_down"),b(a-m),y("down_left"))):(h(t-Math.max(u*f,2)),y("left_down"),b(a-m),y("down_left")),h(n)):(h(n+m),y("left_down"),b(a)):"vertical"==s?r==l&&"element"!=r&&"element"!=l?(m=Math.max(m,4),"top"==r&&(b(o-Math.max(p*f,2)),y("up_left"),h(n+m),y("left_down")),"bottom"==r&&(b(a+Math.max(p*f,2)),y("down_left"),h(n+m),y("left_up")),b(a)):(b(o+Math.max(p*f,2)),y("down_left"),h(n+m),y("left_down"),b(a)):(b(a-m),y("down_left"),h(n))),a<o&&n>t&&("horizontal"==i?"horizontal"==s?(r==l&&"element"!=r&&"element"!=l?(m=Math.max(m,4),"left"==r&&(h(t-Math.max(u*f,2)),y("left_up"),b(a+m),y("up_right")),"right"==r&&(h(n+Math.max(u*f,2)),y("right_up"),b(a+m),y("up_left"))):(h(t+Math.max(u*f,2)),y("right_up"),b(a+m),y("up_right")),h(n)):(h(n-m),y("right_up"),b(a)):"vertical"==s?r==l&&"element"!=r&&"element"!=l?(m=Math.max(m,4),"top"==r&&(b(a-Math.max(p*f,2)),y("up_right"),h(n-m),y("right_down")),"bottom"==r&&(b(o+Math.max(p*f,2)),y("down_right"),h(n-m),y("right_up")),b(a)):(b(o-Math.max(p*f,2)),y("up_right"),h(n-m),y("right_up"),b(a)):(b(a+m),y("up_right"),h(n))),a<o&&n<t&&("horizontal"==i?"horizontal"==s?(r==l&&"element"!=r&&"element"!=l?(m=Math.max(m,4),"left"==r&&(h(n-Math.max(u*f,2)),y("left_up"),b(a+m),y("up_right")),"right"==r&&(h(t+Math.max(u*f,2)),y("right_up"),b(a+m),y("up_left"))):(h(t-Math.max(u*f,2)),y("left_up"),b(a+m),y("up_left")),h(n)):(h(n+m),y("left_up"),b(a)):"vertical"==s?r==l&&"element"!=r&&"element"!=l?(m=Math.max(m,4),"top"==r&&(b(a-Math.max(p*f,2)),y("up_left"),h(n+m),y("left_down")),"bottom"==r&&(console.log("working on here"),b(o+Math.max(p*f,2)),y("down_left"),h(n+m),y("left_up")),b(a)):(b(o-Math.max(p*f,2)),y("up_left"),h(n+m),y("left_up"),b(a)):(b(a+m),y("up_left"),h(n))),d.join(" ")}function showConfigBar(e,t,o="tab1"){if(!t)return void console.debug(`[Config-Bar] Current Element is invalid, as it has type ${t}! `);const n=$("#config_bar").children(".tabbed").find(".noStack");n.show();document.getElementById("config_bar").querySelectorAll(".tab1_config, .tab2_config").forEach((e=>{e.scrollTo({top:0,behavior:"instant"})})),$(`#${o}_config`).prop("checked",!0),$("#elm_counter_animation, #elm_convert").prop("checked",!1),$("#elm_select").selectmenu({open:function(){$($(this).selectmenu("instance").menu).children(".ui-menu-item").find("div.ui-state-active")[0].scrollIntoView({block:"center"})},position:{my:"right top+2",at:"right bottom",collision:"fit"}}).selectmenu("menuWidget").addClass("select_overflow"),getElements("elm_select",e[0]),$("#elm_select").val(e[0]).selectmenu("refresh").off().on("selectmenuchange",(function(){const e=$(this).val();$(".added_elements").removeClass("draggable-multi"),showConfigBar([e],$(`#${e}`).prop("tagName")),hideCoordinates()}));const a=document.getElementById(e[0]),i=configuration.basic.enable_area_catch?"center":"end";if(a&&setTimeout((()=>{a.scrollIntoView({behavior:"smooth",block:i,inline:"nearest"})}),500),$(".elm_config, #reconnect_elements, #delete_element, #elm_degree, #elm_degree_slider, #export_element").prop("disabled",!1),$(".all_elements").removeClass("active_element").addClass("faded_out"),"use"!=t)for(const t of e)configuration.elements[t].protected&&($("#elm_pos_x, #elm_pos_y").prop("disabled",!0),$("#elm_protected").prop("checked",!0)),$(`#${t}`).removeClass("faded_out").addClass("active_element");else $(`#${e[0]}`).removeClass("faded_out").addClass("active_element");$(".switchNoIcon").show(),$(".elm_config_box, .elm_config_box_sub").hide(),$(".elm_config").val(""),$(".elm_config, #elm_frame_userDefined").prop("checked",!1),setTimeout((()=>{$("#config_bar").removeClass("skeleton")}),400),$("select.elm_config").each((function(){$(this)[0].selectedIndex=0})),$("#elm_degree, #elm_degree_slider").val(0),$(".elm_config.color").each((function(){$(this)[0].jscolor.fromString("")})),$(".elm_config.gradient").each((function(){v(this.id,"color","")}));let s="use"==t?{animation:e[0].replace("line","anim"),def:e[0].replace("line_",""),line:e[0]}:{};const r=copyObject("use"==t?configuration.animations[s.animation]:configuration.elements[e[0]]),l=e.length>1;if(!l){const o=$(`#${e[0]}`),n=o.index(),a=o.siblings().length+1;"use"==t?configuration.lines[s.line].position!==n&&(console.debug(`[Layout] Element has no/invalid position. Correcting to ${n+1}!`),configuration.lines[s.line].position=n):configuration.elements[e[0]].position!==n&&(console.debug(`[Layout] Element has no/invalid position. Correcting to ${n+1}!`),configuration.elements[e[0]].position=n),$("#elm_pos").text(sprintf(translateWord("title_arrange_pos"),n+1,a))}const c="use"==t?configuration.animations[s.animation]:configuration.elements[e[0]],d="use"==t?copyObject(configuration.lines[s.line]):{},u="use"==t?copyObject(configuration.defs[s.def]):{};let p,g,f,m,h=null,b=!1;switch(t){case"rect":$(".elm_config_box.rect").show();break;case"circle":$(".elm_config_box.circle").show();break;case"text":if($(".elm_config_box.text").show(),l?$(".text_not_ds").hide():$(".text_not_ds").show(),"datasource"==c.subType)switch($(".elm_config_box.datasource").show(),$(".text_not_ds, .text_only").hide(),getDataSources("elm_subtract",c.subtract,!1),getDataSources("elm_add",c.add,!1),$("#elm_subtract").siblings(".ms-options-wrap").length>0?$("#elm_subtract").multiselect("reload"):$("#elm_subtract").multiselect(multiselect_options),$("#elm_add").siblings(".ms-options-wrap").length>0?$("#elm_add").multiselect("reload"):$("#elm_add").multiselect(multiselect_options),getDataSources("elm_source_action",c.source_action,!0),c.source_display){default:case"value":$(".text_not_ds").hide(),$(".linebreak_text").hide();break;case"own_text":$(".text_not_ds").show();break;case"text":$(".linebreak_text").show()}break;case"use":$(".elm_config_box.use").show(),$("#export_element").prop("disabled",!0),console.debug(`[Config-Bar] Init: ${JSON.stringify(s)}`),getDataSources("elm_animation",c.source,!0),$("#elm_start_slot").val("element"==configuration.defs[s.def].startSlot?translateWord("value_element"):translateWord("value_"+configuration.defs[s.def].startSlot)),$("#elm_end_slot").val("element"==configuration.defs[s.def].endSlot?translateWord("value_element"):translateWord("value_"+configuration.defs[s.def].endSlot)),d.color&&d.color.includes("gradient")?v("elm_line_color","gradient",d.color):$("#elm_line_color")[0].jscolor.fromString(d.color),d.shadow&&d.shadow.includes("gradient")?v("elm_shadow","gradient",d.shadow):$("#elm_shadow")[0].jscolor.fromString(d.shadow||""),$("#elm_url").val(d.url),$("#elm_frame").val(d.frame||"_overlay"),$("#elm_line_arc").val(u.line_arc||20),$("#elm_line_radius").val(u.line_radius||15),$("#"+e[0]).removeClass("faded_out");break;case"icon":case"svg":if("svg"==c.subType)$(".elm_config_box.svg").show();else if("switch"==c.subType){generateSwitchSelect(c.design),$("#elm_design").iconselectmenu({position:{my:"right top+2",at:"right bottom",collision:"flipfit"},create:updateSwitchDesignText,change:updateSwitchDesignText}).iconselectmenu("refresh").iconselectmenu("menuWidget").addClass("select_overflow select_icon_menu"),updateSwitchDesignText({target:"#elm_design"}),$("#elm_color_on")[0].jscolor.fromString(c.color_on||""),$("#elm_fill_on")[0].jscolor.fromString(c.fill_on||""),$(".elm_config_box.switch, #sub_switchInfo").show();const e=switchLayouts[c.design];e.text?($(".switchNoIcon, #sub_SwitchBox").show(),$("#elm_text_on")[0].jscolor.fromString(c.text_on||"#FFF"),$("#elm_text_off")[0].jscolor.fromString(c.text_off||"#a35353")):e.icon&&!e.own?$(".switchNoIcon, #sub_SwitchBox").hide():e.own?($("#elm_icon_off").val(c.icon_off||e.icon_off),$("#elm_icon_on").val(c.icon_on||e.icon_on),$(".switchNoIcon, #sub_SwitchBox").hide(),$("#sub_SwitchBoxOwnStyle").show()):($(".switchNoIcon").show(),$("#sub_SwitchBox").hide()),appProperties.isSafari&&($("#elm_degree, #elm_degree_slider").prop("disabled",!0),$("#sub_RotationApple").show())}else $(".elm_config_box.icon").show();break;case"image":$(".elm_config_box.image").show();break;case"foreignObject":$(".elm_config_box.fObj").show()}switch($("#config_bar").addClass("show skeleton"),Object.entries(c).forEach((e=>{const[o,n]=e;if("object"==typeof n&&n&&"clock"===o)for(var a of Object.keys(c[o]))$(`#elm_${o}\\.${a}`).val(c[o][a]);switch(o){case"color":case"fill":case"fill_value":case"border_value":case"border_reverse_value":case"shadow":n&&(n.includes("gradient")?(v(`elm_${o}`,"gradient",n),"rect"!=t&&"circle"!=t||"color"!=o||(v("elm_border_value_fill","gradient",c.color,{background:parseColorString(c.color),color:"transparent"}),$("#elm_border_value_fill").prop("disabled",!0))):($(`#elm_${o}`)[0].jscolor.fromString("none"==n||""==n?"":n),"rect"!=t&&"circle"!=t||"color"!=o||$("#elm_border_value_fill").prop("disabled",!0)[0].jscolor.fromString(c.color)));break;default:$(`#elm_${o}`).val(n)}"degree"==o&&$("#elm_degree_slider").val(n||0),"boolean"==typeof n&&$(`#elm_${o}`).prop("checked",!0===n)})),-1!=c.fill_type&&c.fill_type&&($("#sub_FillType").show(),"value"==c.fill_type&&$("#sub_FillTypeValue").show()),c.border_type&&-1!=c.border_type&&($("#sub_BorderType, #sub_BorderTypeExplain").show(),"value"==c.border_type&&$("#sub_BorderTypeValue").show()),c.border_reverse&&$(".border_reverse_value").show(),c.enable_clock&&($("#sub_enableClock").show(),$("#elm_text").prop("disabled",!0)),c.animation_type&&-1!=c.animation_type&&($("#sub_AnimPower").show(),"dots"==c.animation_type?$("#sub_AnimDots").show():$("#sub_AnimDuration").show()),(c.frame_width||c.frame_height)&&($("#elm_frame_userDefined").prop("checked",!0),$("#sub_FrameUserDefinedSettings").show()),"_self"!=c.frame&&$("#sub_FrameUserDefined").show(),getDataSources("elm_source",c.source,!0),c.action){case"none":$("#sub_FrameDeactivated").hide();break;case"on":case"off":case"toggle":$("#sub_FrameDeactivated, #sub_ActionBox").show();break;case"change":$("#sub_FrameDeactivated, #sub_ActionBox, #sub_ActionShortcuts").show()}function _(e,t,o){"animation"==c.type?saveUndoStep("change",{animation:r,def:u,line:d},{animation:copyObject(configuration.animations[c.id]),def:copyObject(configuration.defs[u.id]),line:copyObject(configuration.lines[d.id])},b):l?(saveUndoStep("changeStack",t,o,b),console.log(`Saved ${t.length} elements for Undo! Update: ${b}`)):t&&o?saveUndoStep("change",t,o,b):saveUndoStep("change",[r],[copyObject(configuration.elements[e])],b),l||console.debug(`[Config-Bar] Element ${e} (${c.type}) saved for undo! Update: ${b}`),b||(b=!0)}function y(e){if(""===(e=e.trim()))return null;let t=Number(e);return Number.isFinite(t)?t:null}async function w(o){if("focus"==o.type)return void(f=this.value);if("blur"==o.type)return void("number"!=this.type||(o.target.id.includes("degree")||null!=y(this.value))&&this.value==f||(this.value=f,clearTimeout(m),m=setTimeout((()=>{this.focus(),this.select(),addToast("warning",translateWord("toast_warning_invalidValue"),"warningValueRestored",!0)}),200)));let n;switch(this.type){case"textarea":case"url":case"text":n=this.value;break;case"select-multiple":n=$(this).val().map((e=>parseInt(e)));break;case"select-one":n=y(this.value)?parseInt(this.value):this.value;break;case"range":case"number":if(null==y(this.value))return;n=parseFloat(this.value);break;case"checkbox":n=this.checked}if(n==p&&g==o.target.id)return;g=o.target.id,p=n,configuration.basic.enable_hide_configbar&&($("#config_bar").css("backgroundColor","transparent"),$(".detail_box").not($(this).parent().closest(".detail_box")).css("opacity",.1),clearTimeout(h),h=setTimeout((()=>{$(".detail_box").css("opacity",1),$("#config_bar").css("backgroundColor","var(--white)")}),600)),globalConfigChanged=!0;const a=o.target.id.replace("elm_","");let i="general";switch(($(this).hasClass("color")||$(this).hasClass("style"))&&(i="style"),$(this).hasClass("attribute")&&(i="attribute"),a){case"animation_type":"dots"==n?($("#sub_AnimDuration").hide(),$("#sub_AnimDots, #sub_AnimPower").slideDown("slow")):"duration"==n?($("#sub_AnimDots").hide(),$("#sub_AnimDuration, #sub_AnimPower").slideDown("slow")):$("#sub_AnimDuration, #sub_AnimDots, #sub_AnimPower").slideUp("slow");break;case"fill_type":-1==n?$("#sub_FillType, #sub_FillTypeValue").slideUp("slow"):($(".tab2_config").scrollTo($(this).parent().closest(".detail_box"),1e3,0),$("#sub_FillType").slideDown("slow"),$("#elm_fill_direction").val(c.fill_direction||90).trigger("change"),"value"==n?$("#sub_FillTypeValue").slideDown("slow"):$("#sub_FillTypeValue").slideUp("slow"));break;case"border_type":-1==n?$("#sub_BorderType, #sub_BorderTypeValue, #sub_BorderTypeExplain").slideUp("slow"):($(".tab2_config").scrollTo($(this).parent().closest(".detail_box"),1e3,0),$("#sub_BorderType, #sub_BorderTypeExplain").slideDown("slow"),$("#elm_border_start").val(c.border_start||180).trigger("change"),$("#elm_border_direction").val(c.border_direction||"cw").trigger("change"),$("#elm_border_style").val(c.border_style||"round").trigger("change"),$("#elm_border_reverse").prop("checked",c.border_reverse).trigger("change"),"value"==n?$("#sub_BorderTypeValue").slideDown("slow"):$("#sub_BorderTypeValue").slideUp("slow"));break;case"border_reverse":n?$(".border_reverse_value").slideDown("slow"):$(".border_reverse_value").slideUp("slow");break;case"source_display":switch(n){default:case"value":$(".text_not_ds").slideUp("slow"),$(".linebreak_text").slideUp("slow"),$("#elm_counter_animation").prop("disabled",!1);break;case"own_text":$("#elm_text").val(`ID ${e[0]}`),$(".text_not_ds").slideDown("fast"),$(".tab1_config").scrollTo($("#elm_text").parent().closest(".detail_box"),1e3);break;case"text":$(".linebreak_text").slideDown("slow"),$("#elm_counter_animation").prop("disabled",!0)}break;case"action":switch(n){case"none":$("#sub_ActionShortcuts, #sub_FrameDeactivated, #sub_ActionBox").slideUp("slow");break;case"on":case"off":case"toggle":$("#sub_FrameDeactivated, #sub_ActionBox").slideDown("slow"),$("#sub_ActionShortcuts").slideUp("slow");break;case"change":$("#sub_FrameDeactivated").fadeIn("slow"),$("#sub_FrameDeactivated, #sub_ActionShortcuts, #sub_ActionBox").slideDown("slow"),$(".tab2_config").scrollTo($(this).parent().closest(".detail_box"),1e3,0),$("#elm_action_type").val(Object.hasOwn(c,"action_type")?c.action_type:"number"),Object.hasOwn(c,"action_type")||(c.action_type="number"),$("#elm_action_display").val(Object.hasOwn(c,"action_display")?c.action_display:"button"),Object.hasOwn(c,"action_display")||(c.action_display="button"),$("#elm_action_display_freeform").prop("checked",!Object.hasOwn(c,"action_display_freeform")||c.action_display_freeform),Object.hasOwn(c,"action_display_freeform")||(c.action_display_freeform=!0)}break;case"enable_clock":n?($("#sub_enableClock").slideDown("slow"),$(".tab1_config").scrollTo($(this).parent().closest(".detail_box"),1e3,0)):$("#sub_enableClock").slideUp("slow"),$("#elm_text").prop("disabled",n);break;case"color":"rect"!=t&&"circle"!=t||(n.includes("gradient")?(console.log(n),v("elm_border_value_fill","gradient",n,{background:parseColorString(n),color:"transparent"}),$("#elm_border_value_fill").prop("disabled",!0)):(v("elm_border_value_fill","color",n),$("#elm_border_value_fill").prop("disabled",!0)[0].jscolor.fromString(n)));break;case"frame":$(".tab2_config").scrollTo($(this).parent().closest(".detail_box"),1e3,0),"_overlay"==n?$("#sub_FrameUserDefined").slideDown("slow"):($("#sub_FrameUserDefinedSettings, #sub_FrameUserDefined").slideUp("slow"),$("#elm_frame_userDefined").prop("checked",!1));break;case"protected":$("#elm_pos_x, #elm_pos_y").prop("disabled",n);break;case"design":{$(".tab1_config").scrollTo($(this).parent().closest(".elm_config_box.switch").prev(),1e3,0);const e=switchLayouts[n];e.text?($("#sub_SwitchBoxOwnStyle").slideUp("slow"),$(".switchNoIcon, #sub_SwitchBox").slideDown("slow"),$("#elm_text_on")[0].jscolor.fromString(c.text_on||"#FFF"),$("#elm_text_off")[0].jscolor.fromString(c.text_off||"#a35353")):e.icon&&!e.own?$(".switchNoIcon, #sub_SwitchBox,#sub_SwitchBoxOwnStyle").slideUp("slow"):e.own?($("#elm_icon_on").val(c.icon_on?c.icon_on:e.icon_on),$("#elm_icon_off").val(c.icon_off?c.icon_off:e.icon_off),$(".switchNoIcon, #sub_SwitchBox").slideUp(),$("#sub_SwitchBoxOwnStyle").slideDown()):($(".switchNoIcon").slideDown("slow"),$("#sub_SwitchBox, #sub_SwitchBoxOwnStyle").slideUp("slow"));break}}switch(i){case"attribute":{const t=[],o=[];let s=!0;const r=[];for(const o of e){const e=getElementCoords(o,null,{stroke:Number($("#elm_stroke").val())||1,radius:Number($("#elm_radius").val())||1,width:Number($("#elm_width").val()),height:Number($("#elm_height").val())}),l={x:"pos_x"==a?n:e.x,y:"pos_y"==a?n:e.y},d=checkElementBounds(e,l);if(!d.x||!d.y){s=!1;break}{t.push(copyObject(configuration.elements[o])),r.push({id:o,type:c.type,action:i,value:n,source:a,payload:{elmProp:e,coords:l}});const d=e.group;if(null!=d&&d>=0&&["pos_x","pos_y"].includes(a)){const l=getElementsByGroup(d);addToast("info",translateWord("toast_info_modifyGroups"),"infoModifyGroups");const c="pos_x"==a?n-e.x:0,u="pos_y"==a?n-e.y:0;for(const e of l){if(e==o)continue;const n=getElementCoords(e),l={x:n.x+c,y:n.y+u},d="pos_x"==a?l.x:l.y,p=checkElementBounds(n,l);if(!p.x||!p.y){s=!1;break}t.push(copyObject(configuration.elements[e])),r.push({id:e,type:n.type,action:i,value:d,source:a,payload:{elmProp:n,coords:l}})}}}}if(s){f=n;for(const e of r){const t=await changeElementProperties(e);o.push(copyObject(t))}_(e[0],t,o)}break}case"style":case"general":{const t=[],o=[];if("animation"!=c.type)for(const s of e){t.push(copyObject(configuration.elements[s]));const e=await changeElementProperties({id:s,type:c.type,action:i,value:n,source:a,payload:{}});o.push(copyObject(e))}else changeElementProperties({id:e[0],type:c.type,action:i,value:n,source:a,payload:s});f=n,_(e[0],t,o);break}}$(this).hasClass("elm_config_update")&&x()}function v(e,t,o,n={}){let a=$(`<input type="text" class="input_text style elm_config" name="${e}" id="${e}" placeholder="" autocorrect="off" autocomplete="off" value="${o}" />`).off().on("input change focus blur",w);if("color"==t&&(a.attr("data-jscolor","{}").addClass("color").removeClass("style").data("current-color",o),$(`#${e}`).next(".icon_wrapper").remove()),"gradient"==t&&(a.addClass("icon_in_input_pad gradient"),0==$(`#${e}`).siblings(".icon_wrapper").length&&$(`<div class="icon_wrapper"><a class="preview_gradient icon_in_input tooltip" data-title="${translateWord("title_show_gradient")}"><span class="iconify" data-icon="material-symbols:preview-outline" data-height="24"></span></a></div>`).insertAfter(`#${e}`)),n&&a.css(n),$(`#${e}`).replaceWith(a),"color"==t){const t=document.querySelector(e);jscolor.install(t)}console.debug(`[Config-Bar] Setting '${e}' to ${t}!`),$(`#${e}`).parent("div").next("div").children("input.color_change").val(translateWord(`value_color_change_${t}`))}function x(){if("datasource"!=c.subType)return;const t=configuration.elements[e[0]];if("own_text"!=t.source_display&&-1!=t.source){let o={id:e[0],source:configuration.datasources[t.source]?.source,source_option:t.source_option||-1,source_option_lc:t.source_option_lc||-1,source_display:t.source_display,linebreak:t.linebreak,type:t.type,threshold:t.threshold||0,calculate_kw:t.calculate_kw,decimal_places:t.decimal_places,override:t.override};console.debug("[Update View] Requesting new Data with: ",o),socket.emit("sendTo",appProperties.namespace,"_updateElementInView",o,(function(t){if(t&&t.error)console.error("[Update View] An error occured, while getting the updated value:",t.error);else{if(console.log(`[Update View] Returned from ioBroker: ${JSON.stringify(t.data)}`),Object.keys(t.data.override)>0){const o=Object.keys(t.data.override[e[0]])[0],n=t.data.override[e[0]][o];if(!1===n?.status){let e="<b>"+translateWord("failmsg_apply_override")+"</b>";return e+="<br>"+n.error,void addToast("error",e,"errorOverride",!0)}}refreshData(t.data,!0),""!=t.data.unit[e[0]]&&$("#elm_unit").val(t.data.unit[e[0]]).trigger("change")}}))}else console.log("[Update View] Source option is own text! Not requesting!")}l?(n.hide(),$("#config_bar>.title>span").text(translateWord("lbl_config_config_stack"))):$("#config_bar>.title>span").text(translateWord("lbl_config_config")),$("#delete_element").off().click((function(){deleteElements(s?.line)})),$("#convert_element_DS").off().click((function(){convertTextToDS(e[0])})),$("#elm_frame_userDefined").off().click((function(){this.checked?$("#sub_FrameUserDefinedSettings").slideDown("slow"):($("#sub_FrameUserDefinedSettings").slideUp("slow"),$("#elm_frame_width, #elm_frame_height").val("").trigger("change")),$(".tab2_config").scrollTo($(this).parent().closest(".detail_box"),1e3,0)})),$(".changeOrder").off().click((function(){const t=$(`#${e[0]}`),o=t.siblings().length+1,n=t.next(),a=t.prev();switch($(this).attr("id")){case"changeOrder_foreground":if(!(n.length>0))return void addToast("info",translateWord("failmsg_max_foreground"));t.insertAfter(n);break;case"changeOrder_background":if(!(a.length>0))return void addToast("info",translateWord("failmsg_max_background"));t.insertBefore(a)}addToast("info",translateWord("toast_info_foreBackground"),"infoForeBackground");t.parent().children().each((function(){const e=this.id,t=$(this).index();if("animation"===c.type)configuration.lines[e].position=t;else configuration.elements[e].position=t}));const i=$(`#${e[0]}`).index();$("#elm_pos").text(sprintf(translateWord("title_arrange_pos"),i+1,o)),_(e[0])})),$("#preview_switch").off().click((function(){toggleSwitch(e[0],0,!0)})),$(".elm_config").off().on("input change focus blur iconselectmenuchange",w),$(".color_change").off().on("click",(function(){const e=$(this).parent("div").prev("div").children(".color, .style"),t=e.attr("id");t&&v(t,e.data("jscolor")?"gradient":"color",e.val())})),$("#reconnect_elements").off().on("click",(async function(){const e=await connectElements(this.id);"Aborted"!=e&&(s={animation:e.replace("line","anim"),def:e.replace("line_",""),line:e},console.debug(`[Config-Bar] After reconnect: ${JSON.stringify(s)}`),getElements("elm_select",s.line),$("#elm_select").selectmenu("refresh"),$(`#${s.line}`).addClass("active_element"),$("#elm_start_slot").val("element"==configuration.defs[s.def].startSlot?translateWord("value_element"):translateWord("value_"+configuration.defs[s.def].startSlot)),$("#elm_end_slot").val("element"==configuration.defs[s.def].endSlot?translateWord("value_element"):translateWord("value_"+configuration.defs[s.def].endSlot))),$(".type_rect, .type_circle").addClass("faded_out")})),$(".icon_autocomplete").each((function(){const e=$(this);e.data("ui-autocomplete")&&e.autocomplete("destroy"),e.off().on("input",(function(){e.autocomplete({position:{my:"right top",at:"right bottom",collision:"flipfit"},classes:{"ui-autocomplete":"ui-autocomplete-icon"},source:function(e,t){$.ajax({minLength:1,url:"https://api.iconify.design/search?",type:"GET",data:{query:e.term},success:function(e){t($.map(e.icons,(function(e){return{label:e}})))}})},select:function(e,t){this.value=t.item.value,w.call(this,e)}}).autocomplete("instance")._renderItem=function(e,t){return $("<li class='ui-menu-item'>").append(`<div class='ui-menu-item-wrapper'><span class='iconify' data-width='24' data-icon='${t.label}'></span><span style='font-weight: normal; padding-left:10px;'>${t.label}</span></div>`).appendTo(e)}}))})),$(".preview_element").off().on("click",(async function(t){const o=configuration.elements[e[0]];if(o.source>=0){const e=await new Promise(((e,t)=>{socket.emit("getState",configuration.datasources[o.source].source,((n,a)=>{a?(console.debug(`[PreviewElement] Pulled value from ioBroker: ${a.val}`),e(a.val)):t(`[PreviewElement] The state could not be received! Please check the associated Datasource: ${configuration.datasources[o.source].source}`)}))})).catch((e=>{console.error(e),addToast("error",sprintf(translateWord("failmsg_invalid_ds"),configuration.datasources[o.source].source))}));if("value"==o.fill_type&&o.fill_max>0||"percent"==o.fill_type||"value"==o.border_type&&o.border_max>0||"percent"==o.border_type){const n=getRandomInt(55);$(`<div id="tmpDiv_${n}" class="tmpDiv" />`).appendTo("body");let a=o.type,i=o.stroke,s=i+("rect"==a?o.width:2*o.radius),r=i+("rect"==a?o.height:2*o.radius);null!=e&&$(`#tmpDiv_${n}`).prop("title",translateWord("lbl_preview_element")).dialog({resizable:!1,width:s+50,maxHeight:"100%",modal:!0,classes:jQueryDialog.classes,open:jQueryDialog.open,beforeClose:jQueryDialog.beforeClose,create:async function(){$(this).html($(`<svg id='preview_${n}' width='${s}' height='${r}' style='width:100%;height:100%;display:block;' />`));let l=Object.assign({},o);l.pos_x=4+i/2+("rect"==a?0:s/2-i/2),l.pos_y=4+i/2+("rect"==a?0:r/2-i/2),l.id=`p${n}`;const c=await svgElement(l,!1,!0);$(c).removeClass("draggable").appendTo($(`#preview_${n}`));let d="preview_element_fill"==t.target.id?o.fill_value:o.border_value;const u=d&&d.includes("gradient")?"gradient":"color";switch(t.target.id){case"preview_element_fill":if("color"==u&&(generateSingleGradient(`p${n}`,d||getRandomRGBA(),o.fill,o.fill_direction),updateSingleGradient(`p${n}`,e||33,o.fill_max,o.fill_type)),"gradient"==u){d=d.replace(/[+-]?(?:\d*\.?\d+)(deg|rad|grad|turn)\s*,\s*|to\s+(top|bottom|left|right)(\s+left|\s+right)?\s*,\s*/gi,"-90deg,"),generateStyleProperty(`p${n}`,"fill",d,!0);const t=document.getElementById(`gradient_p${n}_fill`),a=o.fill&&!o.fill.match(/(?=(gradient|none))/gi)?o.fill:"transparent";let i=document.createElementNS("http://www.w3.org/2000/svg","stop");i.setAttribute("id",`gradient_p${n}_fill_transparent`),i.setAttribute("offset","0%"),i.setAttribute("stop-color",a),t.appendChild(i),t.setAttribute("gradientTransform","rotate("+o.fill_direction+",0.5,0.5)"),updateMultiGradient(`p${n}`,e||33,o.fill_max,o.fill_type),console.log(`[Config] Multi-Fill-Gradient added for: p${n}`)}break;case"preview_element_border":const t=generateStyleProperty(`p${n}`,"stroke",d||getRandomRGBA(),!1,"url");addBorderFill(`p${n}`,t,o),updateBorderFill(`p${n}`,e||33,o.border_value_fill,o)}},buttons:[{text:translateWord("btn_close"),class:"input_button jquery",click:function(){$("#placeholder_gradients").children("[id^='gradient_p']").remove(),$(this).dialog("close")}}]})}else addToast("warning",translateWord("failmsg_preview_element_not_all"))}else addToast("info",translateWord("failmsg_preview_element_no_ds"))})),$(".preview_action").off().on("click",(function(o){const n="use"==t?configuration.lines[s.line]:configuration.elements[e[0]];switch(o.target.closest(".preview_action").id){case"preview_action_url":""!=n.url&&null!=n.url?actionForElement(e[0],o,"url"):addToast("warning",translateWord("failmsg_preview_element_no_url"));break;case"preview_action_click":n.source>=0&&Object.hasOwn(configuration.datasources,n.source)||n.source_action>=0&&Object.hasOwn(configuration.datasources,n.source_action)?"none"==n.action||null==n.action?addToast("warning",translateWord("failmsg_preview_element_no_action")):actionForElement(e[0],o,"click"):addToast("info",translateWord("failmsg_preview_element_no_ds"))}})),$("#manage_shortcuts").off().on("click",(function(){$("#shortcut-table").off();const t=e=>{const t=$("<button>",{class:"ds_buttons btn-update"}).append($("<span>",{class:"iconify","data-height":"24","data-icon":"mdi:check"})),o=$("<button>",{class:"ds_buttons btn-cancel"}).append($("<span>",{class:"iconify red_icon","data-height":"24","data-icon":"mdi:close"})),n=$("<button>",{class:"ds_buttons btn-edit"}).append($("<span>",{class:"iconify","data-height":"24","data-icon":"mdi:pencil"})),a=$("<button>",{class:"ds_buttons btn-delete tooltip","data-title":"title_delete"}).append($("<span>",{class:"iconify red_icon","data-height":"24","data-icon":"mdi:delete"})),i=$("<button>",{class:"ds_buttons btn-restore tooltip","data-title":"title_restore"}).append($("<span>",{class:"iconify","data-height":"24","data-icon":"mdi:backup-restore"})),s=$("<td>").append(t,o,n,a,i),r=$("<tr>").append($("<td>").text(c.shortcuts[e].alias),$("<td>").text(c.shortcuts[e].value),s).data({id:e,alias:c.shortcuts[e].alias,value:c.shortcuts[e].value});$("#shortcut-table tbody").append(r)};$("#frm-addQuickAccess").off().submit((function(o){o.preventDefault();let n=0;Object.hasOwn(c,"shortcuts")?n=Object.keys(c.shortcuts).length>0?Math.max(...Object.keys(c.shortcuts).map((e=>e)))+1:0:c.shortcuts={},c.shortcuts[n]={alias:$("#shortcut_alias").val(),value:$("#shortcut_value").val()},$("#shortcut-table tbody").children().length>0&&$("#shortcut_tmp_line").hide(),t(n),_(e[0]),$(this)[0].reset(),$("#shortcut_aliast").focus(),globalConfigChanged=!0})),$("#shortcut-table").on("click",".btn-edit",(function(){$(':input[form="frm-addQuickAccess"]').prop("disabled",!0),$(".ds_buttons.btn-edit, .ds_buttons.btn-delete").prop("disabled",!0),$(".ui-dialog-buttonset").children().first().prop("disabled",!0);const e=$(this).closest("tr");e.addClass("active"),e.closest("table").find("tbody").find("tr").addClass("editMode").not(e).addClass("inactive");const t=e.data("alias"),o=e.data("value"),n=$("<div>",{class:"form_div no_margin"}).append($("<input>",{type:"text",class:"input_text",id:"edit_shortcut_alias",name:"edit_shortcut_alias",autocorrect:"off",value:t}).attr("autocomplete","off")),a=$("<div>",{class:"form_div no_margin"}).append($("<input>",{type:"text",class:"input_text",id:"edit_shortcut_value",name:"edit_shortcut_value",autocorrect:"off",value:o}).attr("autocomplete","off"));e.find("td:eq(0)").empty().append(n),e.find("td:eq(1)").empty().append(a),e.find(".btn-update, .btn-cancel").show(),e.find(".btn-delete, .btn-edit").hide()})),$("#shortcut-table").on("click",".btn-cancel",(function(){$(':input[form="frm-addQuickAccess"]').prop("disabled",!1),$(".ds_buttons.btn-edit, .ds_buttons.btn-delete").prop("disabled",!1),$(".ui-dialog-buttonset").children().first().prop("disabled",!1);const e=$(this).closest("tr");e.closest("table").find("tbody").find("tr.editMode").removeClass(),e.find("td:eq(0)").text(e.data("alias")),e.find("td:eq(1)").text(e.data("value")),e.find(".btn-update, .btn-cancel").hide(),e.find(".btn-delete, .btn-edit").show()})),$("#shortcut-table").on("click",".btn-update",(function(){$(':input[form="frm-addQuickAccess"]').prop("disabled",!1),$(".ds_buttons.btn-edit, .ds_buttons.btn-delete").prop("disabled",!1),$(".ui-dialog-buttonset").children().first().prop("disabled",!1);const e=$(this).closest("tr");e.closest("table").find("tbody").find("tr.editMode").removeClass();const t=$("#edit_shortcut_alias").val(),o=$("#edit_shortcut_value").val();c.shortcuts[e.data("id")]={alias:t,value:o},e.find("td:eq(0)").text(t),e.find("td:eq(1)").text(o),e.find(".btn-update, .btn-cancel").hide(),e.find(".btn-delete, .btn-edit").show(),globalConfigChanged=!0})),$("#shortcut-table").on("click",".btn-delete",(function(){const e=$(this).parents("tr");e.find(".btn-update, .btn-cancel, .btn-edit, .btn-delete").hide(),e.find(".btn-restore").show(),e.addClass("deleted")})),$("#shortcut-table").on("click",".btn-restore",(function(){const e=$(this).parents("tr");e.find(".btn-restore").hide(),e.find(".btn-edit, .btn-delete").show(),e.removeClass("deleted")})),$("#manage_shortcuts_section").dialog({resizable:!1,height:"auto",maxHeight:"100%",width:560,modal:!0,classes:jQueryDialog.classes,position:{my:"center",at:"center",of:window,collision:"fit"},open:jQueryDialog.open,beforeClose:jQueryDialog.beforeClose,create:function(){if($("#shortcut-table tbody").children().not("#shortcut_tmp_line").remove(),$("#frm-addQuickAccess")[0].reset(),Object.hasOwn(c,"shortcuts"))if(Object.keys(c.shortcuts).length>0){$("#shortcut_tmp_line").hide();const o=Object.entries(c.shortcuts).sort((([,e],[,t])=>e.alias.localeCompare(t.alias,void 0,{numeric:!0,sensitivity:"base"})));for(var e of o)t(e[0])}else $("#shortcut_tmp_line").show();else $("#shortcut_tmp_line").show()},buttons:[{text:translateWord("btn_close"),class:"input_button jquery",click:function(){const t=$("#shortcut-table tbody tr.deleted");t.length>0&&(_(e[0]),t.each((function(){delete c.shortcuts[$(this).data("id")]})),globalConfigChanged=!0),$(this).dialog("close")}}]})})),$(".override_settings").off().on("click",(function(t){let o,n=!1;switch(t.target.closest("button").id){case"override_settings":o="animation"==c.type?configuration.lines[s.line].override:c.override;break;case"override_settings_animation":o=configuration.animations[s.animation].override}console.log(`Loading data for ${c.type}: ${JSON.stringify(o)}`),aceOverride.setValue(JSON.stringify(o,void 0,4),-1),openEditorContainer("codeEditor"),aceOverride.getSession().off("changeAnnotation, change"),aceOverride.getSession().on("changeAnnotation",(function(){const e=aceOverride.getSession().getAnnotations().filter((e=>"error"==e.type));$("#save_code").prop("disabled",e.length>0)})),aceOverride.getSession().on("change",(function(){n=!0})),setTimeout((()=>aceOverride.focus()),100),$("#save_code").off().on("click",(function(){if(n){const o=aceOverride.getValue()?JSON.parse(aceOverride.getValue()):{};switch(console.log(`Saving data for ${c.type}: ${JSON.stringify(o)}`),t.target.closest("button").id){case"override_settings":"animation"==c.type?configuration.lines[s.line].override=o:(c.override=o,x());break;case"override_settings_animation":configuration.animations[s.animation].override=o}_(e[0])}closeEditorContainer("codeEditor"),globalConfigChanged=!0}))})),$("#export_element").off().on("click",(function(){exportElement(e[0])})),$("#overrideFormatCode").off().on("click",(function(e){const t=aceOverride.getValue();if(t.length>0)try{aceOverride.setValue(JSON.stringify(JSON.parse(t),void 0,4),-1)}catch(e){addToast("warning",translateWord("msg_json_malformmated"))}else addToast("info",translateWord("msg_json_empty"))})),$(".form_label").removeClass("form_label").addClass("form_label")}function changeElementProperties({id:e,type:t,action:o,value:n,source:a,payload:i={}}){return new Promise((async(s,r)=>{try{const r=(t,o,n)=>{const a=configuration.elements[e];console.debug(`[Config-Bar] Object ${n} property change! Source: ${t} Value: ${o} | Before: ${a[t]}`),a[t]=o,console.debug("[Config-Bar] Object after change",a),s(a)};switch(o){case"style":{const o={color:{target:e,property:"stroke",value:n},shadow:{target:e,property:"filter",value:n?`drop-shadow(0px 3px 3px ${n})`:""},fill:{target:e,property:"fill",value:n||"none"}},s={animation:{color:{target:i?.animation,property:"stroke",value:n},line_color:{target:i?.line,property:"stroke",value:n},shadow:{target:i?.line,property:"filter",value:n?`drop-shadow(0px 3px 3px ${n})`:""}},text:{color:o.color,fill:o.fill,shadow:o.shadow,font_size:{target:e,property:"font-size",value:n+"px"},font_family:{target:e,property:"font-family",value:n},align:{target:e,property:"text-anchor",value:n}},rect:{color:o.color,shadow:o.shadow,fill:o.fill},circle:{color:o.color,shadow:o.shadow,fill:o.fill},icon:{shadow:o.shadow},svg:{shadow:o.shadow},foreignObject:{shadow:o.shadow},image:{shadow:o.shadow}};let l,c,d;const u=(s[t]||{})[a];if(u?(l=u.target,c=u.property,d=u.value):(l=e,c=a,d=n),n=generateStyleProperty(l,c,n,!0,"color"),"svg"==t){const t=configuration.elements[e];if("switch"==t?.subType){const o=Number($(`#${e}`).data("value")),n=switchLayouts[t.design];switch(a){default:break;case"color":l=o?"":`${e} > .toggleKnob`,c="fill";break;case"color_on":l=o?`${e} > .toggleKnob`:"",c="fill";break;case"fill":l=o?"":`${e} > .toggleBackground`,c=n.icon?"color":"fill";break;case"fill_on":l=o?`${e} > .toggleBackground`:"",c=n.icon?"color":"fill";break;case"text_on":l=`${e} > .toggleText.on`,c="fill";break;case"text_off":l=`${e} > .toggleText.off`,c="fill"}}}if(l&&$(`#${l}`).css(c,d),"shadow"==a&&appProperties.isApple){const e=shadowHandler(n);$(`#${l}`).css("filter",`url(#${e})`)}"animation"==t?("color"==a&&(console.debug(`[Config-Bar] Line-Animation color change! Value: ${n} | Before: ${configuration.animations[i?.animation].color}`),configuration.animations[i?.animation].color=n),"line_color"==a&&(console.debug(`[Config-Bar] Line-Color change! Value: ${n} | Before: ${configuration.lines[i?.line].color}`),configuration.lines[i?.line].color=n),"shadow"==a&&(console.debug(`[Config-Bar] Line-Shadow change! Value: ${n} | Before: ${configuration.lines[i?.line].shadow}`),configuration.lines[i?.line].shadow=n)):r(a,n,"CSS");break}case"attribute":{let o=!1,s=null,l=n;switch(a){case"pos_x":case"pos_y":o=!0;break;case"href":case"preserveAspectRatio":case"viewBox":s=a,"href"==a&&(l=await receiveImage(n));break;case"stroke":n=i?.elmProp.stroke,$(`#${e}`).css("strokeWidth",i?.elmProp.stroke),o=!0;break;case"fObj_content":case"svg_content":$(`#${e}`).html(n);break;case"rx":case"height":case"width":case"radius":o=!0,s="radius"==a?"r":a;break;case"append":case"unit":case"prepend":$(`#${e}_${a}`).html(generateMultiLineText(`${e}_${a}`,n,i?.coords.x));break;case"text":"own_text"==configuration.elements[e].source_display?$(`#${e}_value`).html(generateMultiLineText(`${e}_value`,n,i?.coords.x)):$(`#${e}`).html(generateMultiLineText(e,n,i?.coords.x));break;case"degree_slider":case"degree":const t=calculateRotation(e,n);o=!0,a="degree",s="transform",l=`rotate(${t.angle}, ${t.cx}, ${t.cy})`,$("#elm_degree_slider, #elm_degree").val(n)}s&&($(`#${e}`).attr(s,l),"icon"==t&&$(`#${e}`).attr(`data-${a}`,l)),r(a,n,"Attribute"),"icon"==t&&iconHandler(e,configuration.elements[e].icon,!0),o&&(hideCoordinates(),moveSVGElement(i?.elmProp,i?.coords));break}case"general":if(a.match(/\./)){const t=configuration.elements[e];let o=a.split(".");Object.hasOwn(t,o[0])||(t[o[0]]={}),console.debug(`[Config-Bar] Sub-Object property change! Source: ${a} Value: ${n} | Before: ${t[o[0]][o[1]]}`),t[o[0]][o[1]]=n,a.match(/clock\./)&&userClock(t.clock,e,!0)}else switch(t){default:r(a,n,"General"),"icon"==t&&iconHandler(e,configuration.elements[e].icon,!0);break;case"svg":{const t=configuration.elements[e];"switch"==t?.subType&&(r(a,n,"General"),switchHandler(e,!1));break}case"animation":switch(a){default:const e="animation"==a?"source":a;console.debug(`[Config-Bar] Line-Animation property change! Source: ${e} Value: ${n} | Before: ${configuration.animations[i?.animation][e]}`),configuration.animations[i?.animation][e]=n,console.debug(configuration.animations[i?.animation]);break;case"line_radius":case"line_arc":console.debug(`[Config-Bar] Line-Definition Property changed! Source: ${a} Value: ${n} | Before: ${configuration.defs[i?.def][a]}`),configuration.defs[i?.def][a]=parseFloat(n),console.debug("[Config-Bar] Line-Definition",configuration.defs[i?.def]);const t=configuration.defs[i?.def].id.split("_");console.debug(`[Config-Bar] Re-routing the line between Elments ${t[1]} and ${t[2]} with: Arc: ${configuration.defs[i?.def].line_arc||20}% and Radius: ${configuration.defs[i?.def].line_radius||15}`);const o=calculatePath(configuration.defs[i?.def].id,t[1],t[2]);configuration.defs[i?.def].d=o,$(`#${i?.def}`).attr("d",o);break;case"frame":case"url":console.debug(`[Config-Bar] Line-Property change! Source: ${a} Value: ${n} | Before: ${configuration.lines[i?.line][a]}`),configuration.lines[i?.line][a]=n,console.debug("[Config-Bar] Line",configuration.lines[i?.line])}}}}catch(e){r(e)}}))}function parseColorString(e){if(!e)return;const t=(new Option).style;return t.background=e.trim().replace(/.+?(?=(linear-gradient|radial-gradient))|[;]/gi,""),t.background}function generateStyleProperty(e,t,o,n=!1,a="url"){if(!isNaN(o))return o;const i=parseColorString(o);if(i){if(!o.includes("gradient"))return i;return addGradientToSVG(e,t,generateSVGGradient(e,t,i),n),"url"==a?`url(#gradient_${e}_${t})`:i}return o}function hideConfigBar(){$("#config_bar").removeClass("show skeleton"),$(".all_elements").removeClass("faded_out active_element"),setTimeout((()=>{$(".elm_config").off().val(""),$("#tab1_config").prop("checked",!0),$("#elm_select").val(""),$(".ui-dialog").remove()}),600)}function openEditorContainer(e){$("#loading").fadeIn(600).addClass("bgOnly"),$(`#${e}Container`).addClass("visible active")}function closeEditorContainer(e){$("#loading").fadeOut(600),"tour"==e&&($(`#${e}Container`).addClass("hiding"),tourEnd()),$(`#${e}Container`).removeClass("visible"),setTimeout((()=>{$(`#${e}Container`).removeClass("active"),$("#loading").removeClass("tour bgOnly")}),600),"stateExplorer"==e&&setTimeout((()=>{const e=document.querySelector("#stateRoot");e.querySelectorAll(".state").forEach((e=>{e.classList.remove("active")})),e.querySelectorAll(".sub").forEach((e=>{e.classList.remove("open")})),e.querySelectorAll(".type.folderOpen").forEach((e=>{e.classList.remove("folderOpen"),e.classList.add("folderClosed")})),e.querySelectorAll(".filter").forEach((e=>{e.classList.remove("green","filter")}))}),300),"frame"==e&&setTimeout((()=>{$("#frameContainer>.framed").remove()}),300),$(`#${e}`).scrollTop(0)}function iconHandler(e,t,o=!1){let n=$("<symbol />");$.each($("#"+e).prop("attributes"),(function(){n.attr(this.name,this.value)})),n.removeClass("tooltip");let a=t.split("?");if(a[1]){t=a[0];const e=new URLSearchParams(a[1]);n.attr({"data-icon":t,"data-flip":e.get("flip"),"data-rotate":e.get("rotate")})}else n.attr({"data-icon":t,"data-flip":configuration.elements[e].flip,"data-rotate":configuration.elements[e].rotate});$("#"+e).data("icon")==t&&1!=o||$("#"+e).replaceWith(n)}function toggleSwitch(e,t,o=!1){const n=configuration.elements[e],a=document.getElementById(e);if(!a)return;const i=switchLayouts[n.design??3];if(o){t=1-(a.getAttribute("data-value")||0),a.setAttribute("data-value",t)}const s=a.querySelector(".toggleBackground");if(s.style.fill=t?n.fill_on:n.fill,i.icon){const e=i.own?t?n.icon_on||i.icon_on:n.icon_off||i.icon_off:t?i.icon_on:i.icon_off,o=document.createElementNS("http://www.w3.org/2000/svg","symbol");o.setAttribute("class","toggleBackground iconify"),o.setAttribute("data-icon",e),o.setAttribute("data-width",24),o.setAttribute("data-height",24),s.replaceWith(o),a.style.color=t?n.fill_on:n.fill}else{const e=a.querySelector(".toggleKnob");e.setAttribute("cx",t?"65":"15"),e.style.fill=t?n.color_on:n.color;const o=a.querySelector(".toggleSpinner");o.setAttribute("cx",t?"65":"15"),o.style.display=""}if(i.text){a.querySelector(".toggleText.on").style.opacity=t?1:0;a.querySelector(".toggleText.off").style.opacity=t?0:1}}function switchHandler(e,t=!1){console.debug(`[Config] Running switchHandler for ID ${e}`);const o=configuration.elements[e],n=switchLayouts[o.design??3],a=document.createDocumentFragment();if(!n.icon){const e=document.createElementNS("http://www.w3.org/2000/svg","rect");e.setAttribute("class","toggleBackground"),e.setAttribute("x",n.x),e.setAttribute("y",n.y),e.setAttribute("width",n.width),e.setAttribute("height",n.height),e.setAttribute("rx",n.rx),e.setAttribute("style",`fill: ${o.fill}`),a.appendChild(e)}if(n.text){const e=document.createElementNS("http://www.w3.org/2000/svg","text");e.setAttribute("class","toggleText on"),e.setAttribute("x",10),e.setAttribute("y",15),e.setAttribute("style",`fill: ${o.text_on||"#FFFFFF"}`),e.innerHTML=truncateText(translateWord(n.text_on),3,!0),a.appendChild(e);const t=document.createElementNS("http://www.w3.org/2000/svg","text");t.setAttribute("class","toggleText off"),t.setAttribute("x",70),t.setAttribute("y",15),t.setAttribute("style",`fill: ${o.text_off||"#A35353"}`),t.innerHTML=truncateText(translateWord(n.text_off),3,!0),a.appendChild(t)}if(!n.icon){const e=document.createElementNS("http://www.w3.org/2000/svg","circle");e.setAttribute("class","toggleKnob"),e.setAttribute("cx",15),e.setAttribute("cy",15),e.setAttribute("r",11),e.setAttribute("style",`fill: ${o.color}`),a.appendChild(e);const t=document.createElementNS("http://www.w3.org/2000/svg","circle");t.setAttribute("class","toggleSpinner"),t.setAttribute("cx",15),t.setAttribute("cy",15),t.setAttribute("r",4),a.appendChild(t)}if(n.icon){const e=document.createElementNS("http://www.w3.org/2000/svg","symbol");e.setAttribute("class","toggleBackground iconify"),e.setAttribute("data-icon",n.own&&o.icon_off||n.icon_off),e.setAttribute("data-width",24),e.setAttribute("data-height",24),e.setAttribute("style",`color: ${o.fill}`),a.appendChild(e)}if(t)return a;{const t=document.getElementById(e);t&&(t.setAttribute("data-value",0),t.setAttribute("viewBox",n.icon?"0 0 24 24":"0 0 80 30"),n.icon&&t.setAttribute("style",`color: ${o.fill}`),t.innerHTML="",t.append(a))}}function shadowHandler(e){const t=e.replace(/[\#rgba(,.) ]/g,""),o=document.getElementById("placeholder_filter");if(!document.getElementById(`shadow_${t}`)){let n=document.createElementNS("http://www.w3.org/2000/svg","filter");n.setAttribute("id",`shadow_${t}`),n.setAttribute("filterUnits","userSpaceOnUse");let a=document.createElementNS("http://www.w3.org/2000/svg","feDropShadow");a.setAttribute("dx",0),a.setAttribute("dy",3),a.setAttribute("stdDeviation",3),a.setAttribute("flood-color",e),n.appendChild(a),o.appendChild(n)}return`shadow_${t}`}function gradientForStraightLine(e,t){const o=configuration.defs[t.replace("#","")];o&&!o.d.includes("A")&&$(`#gradient_${e}_stroke`).attr("gradientUnits","userSpaceOnUse")}async function svgElement(e,t=!1,o=!1,n){let a=e.shadow?`filter: drop-shadow(0px 3px 3px ${e.shadow});`:"";if(e.shadow&&appProperties.isApple){a=`filter: url(#${shadowHandler(e.shadow)});`}let i=["all_elements","added_elements",e.css_general||null].filter(Boolean);displayMode?(e.url||e.action&&"none"!=e.action)&&i.push("action_element"):i.push("draggable");const s=generateStyleProperty(e.id,"stroke",e.color,!1,"url")||"none",r=generateStyleProperty(e.id,"fill",e.fill,!1,"url")||"none";let l=null,c="elements",d=null;switch(e.type){case"rect":i.push("type_rect","connector"),l=document.createElementNS("http://www.w3.org/2000/svg","rect"),l.setAttribute("x",e.pos_x),l.setAttribute("y",e.pos_y),l.setAttribute("width",e.width),l.setAttribute("height",e.height),l.setAttribute("rx",e.rx),l.setAttribute("style",`stroke: ${s}; stroke-width:${e.stroke}px; fill:${r}; ${a}`);break;case"circle":i.push("type_circle","connector"),l=document.createElementNS("http://www.w3.org/2000/svg","circle"),l.setAttribute("cx",e.pos_x),l.setAttribute("cy",e.pos_y),l.setAttribute("r",e.radius),l.setAttribute("style",`stroke:${s}; stroke-width:${e.stroke}px; fill:${r}; ${a}`);break;case"text":if(c="text",l=document.createElementNS("http://www.w3.org/2000/svg","text"),l.setAttribute("x",e.pos_x),l.setAttribute("y",e.pos_y),l.setAttribute("dominant-baseline","central"),l.setAttribute("style",`stroke:${s}; color:${r}; fill:${r}; font-family:${e.font_family}; text-anchor:${e.align}; font-size:${e.font_size}px; ${a}`),"datasource"==e.subType){let t=-1!=e.source?Number(0).toFixed(e.decimal_places):e.text;i.push("type_datasource"),"own_text"==e.source_display&&(t=e.text),l.innerHTML=`<tspan id='${e.id}_prepend'>${generateMultiLineText(e.id+"_prepend",e.prepend,e.pos_x)}</tspan><tspan id='${e.id}_value'>${generateMultiLineText(e.id+"_value",t,e.pos_x)}</tspan><tspan id='${e.id}_append'>${generateMultiLineText(e.id+"_append",e.append,e.pos_x)}</tspan><tspan id='${e.id}_unit'> ${generateMultiLineText(e.id+"_unit",e.unit,e.pos_x)}</tspan>`}else i.push("type_text"),e.enable_clock?(l.innerHTML=userClock(e.clock,e.id,!0),displayMode&&(userClock(e.clock,e.id),console.debug("[Config] Activating UserClock for "+e.id))):l.innerHTML=generateMultiLineText(e.id,e.text,e.pos_x);break;case"svg":case"icon":if("svg"==e.subType)i.push("type_svg"),l=document.createElementNS("http://www.w3.org/2000/svg","svg"),l.setAttribute("viewBox",e.viewBox||`0 0 ${e.width} ${e.height}`),l.innerHTML=e.svg_content;else if("switch"==e.subType){i.push("type_switch");const t=switchLayouts[e.design],o=switchHandler(e.id,!0);l=document.createElementNS("http://www.w3.org/2000/svg","svg"),l.setAttribute("viewBox",t.icon?"0 0 24 24 ":"0 0 80 30"),l.setAttribute("style",`${a} ${t.icon?`color: ${e.fill};`:""}`),l.setAttribute("preserveAspectRatio","xMidYMid meet"),l.append(o)}else i.push("type_icon","iconify"),l=document.createElementNS("http://www.w3.org/2000/svg","symbol"),l.setAttribute("data-icon",e.icon),l.setAttribute("data-width",e.width),l.setAttribute("data-height",e.height),l.setAttribute("data-rotate",e.rotate||0),l.setAttribute("data-flip",e.flip||"");l.setAttribute("x",e.pos_x),l.setAttribute("y",e.pos_y),l.setAttribute("width",e.width),l.setAttribute("height",e.height),"switch"!=e.subType&&l.setAttribute("style",`color: ${s}; ${a}`),s.includes("gradient")&&l.setAttribute("style",`fill: ${s}; ${a}`),c="svg"==e.subType?"elements":"icons";break;case"image":{i.push("type_image");const t=await receiveImage(e.href);l=document.createElementNS("http://www.w3.org/2000/svg","image"),l.setAttribute("x",e.pos_x),l.setAttribute("y",e.pos_y),l.setAttribute("preserveAspectRatio",e.preserveAspectRatio),l.setAttribute("width",e.width),l.setAttribute("height",e.height),l.setAttribute("href",t),l.setAttribute("style",`${a} ${"#"==t?"display: none;":""}`);break}case"foreignObject":i.push("type_fObj"),l=document.createElementNS("http://www.w3.org/2000/svg","foreignObject"),l.setAttribute("x",e.pos_x),l.setAttribute("y",e.pos_y),l.setAttribute("width",e.width),l.setAttribute("height",e.height),l.setAttribute("style",`color: ${e.color}; ${a}`),l.innerHTML=e.fObj_content;break;case"def":i=["type_def"],c="defs",l=document.createElementNS("http://www.w3.org/2000/svg","path"),l.setAttribute("d",e.d);break;case"line":i=["line","all_elements"],c="lines",displayMode?(e.url||e.action&&"none"!=e.action)&&i.push("action_element"):i.push("line_cfg"),d=configuration.animations[e.id.replace("line","anim")].active_only&&displayMode?"none":"inline",l=document.createElementNS("http://www.w3.org/2000/svg","use"),l.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",e.href),l.setAttribute("style",`stroke:${s}; display:${d}; ${a}`),gradientForStraightLine(e.id,e.href);break;case"animation":i=["type_animation","all_elements","anim_element","animation",e.css_general||null].filter(Boolean),c="animations",1==configuration.basic.enable_animation?i.push("animation_cfg"):i.push("no_animation"),l=document.createElementNS("http://www.w3.org/2000/svg","use"),l.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",e.href),l.setAttribute("style",`stroke:${s};`),gradientForStraightLine(e.id,e.href);break;default:console.log("No Type specified! Ignoring!")}if(l.setAttribute("id",e.id),l.setAttribute("class",i.join(" ")),o)return l;if(t){$(`#${e.id}`).index()!=e.position?($(`#${e.id}`).remove(),$(l).appendToWithIndex($(`#placeholder_${c}`),e.position)):$(`#${e.id}`).replaceWith(l)}else $(l).appendToWithIndex($(`#placeholder_${c}`),e.position);"line"==e.type&&configuration.basic.enable_line_animation&&displayMode&&"inline"==d&&animatePath(e.id),e?.degree>0&&requestAnimationFrame((()=>{const t=calculateRotation(e.id,e.degree);l.setAttribute("transform",`rotate(${t.angle}, ${t.cx}, ${t.cy})`)})),"function"==typeof n&&n(e.id,e.type)}function getMaxID(){return Object.keys(configuration.elements).length>0?Math.max(...Object.keys(configuration.elements).map((e=>e)))+1:0}function getRandomInt(e){return Math.floor(Math.random()*e)}function getRandomRGBA(){var e=Math.round,t=Math.random;return"rgba("+e(255*t())+","+e(255*t())+","+e(255*t())+",1)"}function addDataSourceRow(e){if(document.querySelector(`#datasource-table tr[data-id="${e}"]`))return;const t=$(`<tr class="highlight-green" data-source="${configuration.datasources[e].source}" data-alias="${configuration.datasources[e].alias}" data-id="${e}" data-factor="${configuration.datasources[e].factor??1}"><td>${configuration.datasources[e].alias}</td><td>${configuration.datasources[e].source}</td><td>${configuration.datasources[e].factor??translateWord("txt_ds_no_factor")}</td><td><button class='ds_buttons btn-update'><span class='iconify' data-height='24' data-icon='mdi:check'></span></button><button class='ds_buttons btn-cancel'><span class='iconify red_icon' data-height='24' data-icon='mdi:close'></span></button><button class='ds_buttons btn-edit'><span class='iconify' data-height='24' data-icon='mdi:pencil'></span></button><button class='ds_buttons btn-delete tooltip' data-title='title_delete'><span class='iconify red_icon' data-height='24' data-icon='mdi:delete'></span></button><button class='ds_buttons btn-restore tooltip' data-title='title_restore'><span class='iconify' data-height='24' data-icon='mdi:backup-restore'></span></button></td></tr>`),o=$("#datasource-table"),n=o.find("tbody"),a=(o.find("thead"),o.find('th[data-sorting="true"]')),i=a.index(),s=a.attr("data-asc"),r=n.find("tr").map((function(){return $(this).find("td").eq(i).text().toLocaleLowerCase().trim()})).get();let l=0===i?configuration.datasources[e].alias.toLowerCase():configuration.datasources[e].source.toLowerCase();r.push(l);let c=r.sort();"false"==s&&(c=c.reverse());const d=c.indexOf(l);t.hide().appendToWithIndex($("#datasource-table tbody"),d).fadeIn(2e3),setTimeout((()=>{$(t).removeClass("highlight-green")}),4e3),$("#ds_tmp_line").remove()}function checkDuplicateDatasource(e){return Object.keys(configuration.datasources).find((t=>configuration.datasources[t].source.toLowerCase()===e.toLowerCase()))}function loadAdditionalJSFile(e){return new Promise(((t,o)=>{const n=document.createElement("script");n.type="text/javascript",n.src=e,n.onload=function(){console.log("[Config] Loaded additional file: "+e),t()},n.onerror=function(){o("Failed to load additional file: "+e)},document.head.appendChild(n)}))}function loadAdditionalCSSFile(e){if("false"!=e&&""!=e){let t=document.createElement("link");t.rel="stylesheet",t.href=`style/${e}.css`,t.onload=function(){console.log(`[Config] Loaded theme: ${e}`)},document.head.appendChild(t)}}function generateMultiLineText(e,t,o){let n="";if(t)if(isNaN(t))if(t.includes("<br>")||t.includes("\n")){let a;t.includes("<br>")&&(a=t.split("<br>")),t.includes("\n")&&(a=t.split("\n")),a.length>0&&((e.toString().includes("append")||e.toString().includes("unit")||e.toString().includes("prepend"))&&(n+=`<tspan id="${e}_line_tmp" x="${o}" dy="1em"></tspan>`),a.forEach((function(t,a){t&&(n+=`<tspan id="${e}_line_${a}" x="${o}" dy="1em">${t}</tspan>`)})))}else n=` <tspan id="${e}_line_0">${t}</tspan >`;else n=` <tspan id="${e}_line_0">${t}</tspan >`;return n}function saveWorkspace(){return new Promise(((e,t)=>{socket.emit("sendTo",appProperties.namespace,"_saveConfiguration",configuration,(function(o){o&&o.error?(console.log("An error occured, while saving the backup. The following error was provided: ",o.error),t(""),addToast("error",translateWord("failmsg_save_workspace"))):(console.log("[Save] "+o.data),getBackups("backup_list"),e(configuration))}))}))}function getBackups(e){socket.emit("sendTo",appProperties.namespace,"_getBackups",{},(function(t){if(t&&t.error)console.log("An error occured, while receiving the backups. The following error was provided: ",t.error);else{let o;t.data.sort(((e,t)=>-1*e.localeCompare(t))),$("#"+e).empty().append(new Option(translateWord("opt_please_choose"),"-1")),t.data.length>0?t.data.forEach((t=>{const n=new Date(parseInt(t)).toLocaleString("de-DE",{hour:"numeric",minute:"numeric",day:"2-digit",month:"2-digit",year:"numeric",second:"2-digit",hour12:!1});o=new Option(n,t),$("#"+e).append(o)})):($("#"+e).empty(),o=new Option(translateWord("opt_no_backups"),-1),$("#"+e).append(o))}}))}function deleteElements(e){if(globalConfigChanged=!0,e){const t={animation:e.replace("line","anim"),def:e.replace("line_",""),line:e};saveUndoStep("delete",{animation:configuration.animations[t.animation],def:configuration.defs[t.def],line:configuration.lines[t.line]},""),delete configuration.defs[t.def],delete configuration.lines[t.line],delete configuration.animations[t.animation],$(`#${t.def}, #${t.line}, #${t.animation}`).remove(),addToast("success",translateWord("succ_msg_line_delete"))}else{const e=[],t=[];if(globalSelection.forEach((o=>{const n=lineConnection(o);0==n.length?(e.push(configuration.elements[o]),delete configuration.elements[o],$(`#${o}`).remove(),globalSelection.delete(o)):t.push({id:o,conns:n})})),saveUndoStep("delete",e,""),globalSelection.size>0)if(t.length>0)for(let e=0;e<t.length;e++){const o=`${t[e].id}`,n=t[e].conns.map((e=>`line_${e.path}`)).join(", ");addToast("warning",sprintf(translateWord("failmsg_selection_delete_existing_conn"),o,n)),console.log(o,n)}else addToast("warning",translateWord("failmsg_selection_delete"));else addToast("success",translateWord("succ_msg_selection_delete"))}$("#placeholder_coordinate_desc").empty(),closeConfigBar()}async function duplicateElements(e,t=!1,o=null){if(e.size>0){globalConfigChanged=!0;const n=new Set(e),a=n.size>1?15:0;let i=0;$(".draggable").removeClass("draggable-multi dragging"),globalSelection.clear();for(const e of n){const s=getMaxID(),r=copyObject(configuration.elements[e]),l=getElementCoords(r.id);if(o){const e={x:o.x+i*a,y:o.y+i*a},t=checkElementBounds(l,e);t.x&&t.y?(r.pos_x=e.x,r.pos_y=e.y):(t.x?r.pos_x=e.x:e.x+l.width>configuration.basic.width?r.pos_x=configuration.basic.width-l.width-l.stroke:r.pos_x=(r.radius||1)+l.stroke/2,t.y?r.pos_y=e.y:e.y+l.height>configuration.basic.height?r.pos_y=configuration.basic.height-l.height-l.stroke:r.pos_y=(r.radius||1)+l.stroke/2)}else r.pos_x=configuration.basic.width<parseInt(r.pos_x)+l.width+15?parseInt(r.pos_x)-15:parseInt(r.pos_x)+15,r.pos_y=configuration.basic.height<parseInt(r.pos_y)+l.height+15?parseInt(r.pos_y)-15:parseInt(r.pos_y)+15;r.id=s,r.group=null,configuration.elements[s]=r,saveUndoStep("add",r,""),1==n.size?await svgElement(configuration.elements[s],!1,!1,(function(e,o){appProperties.isMobile||(showConfigBar([e],o),t&&addToast("info",translateWord("succ_msg_duplicate")))})):await svgElement(configuration.elements[s]),addElementToSelection(s),i++}$("#svg_config").focus()}}function saveUndoStep(e,t,o,n=!1){if(globalRedoStack=[],$("#edit_redo").addClass("not_active"),n){t=globalUndoStack.pop().oldProps}globalUndoStack.push({action:e,oldProps:t,newProps:o}),$("#edit_undo").removeClass("not_active")}function undoStep(){if(globalUndoStack.length>0){closeConfigBar(),$(".draggable-multi").removeClass("draggable-multi");const e=globalUndoStack.pop();switch(globalRedoStack.push(copyObject(e)),$("#edit_redo").removeClass("not_active"),e.action){case"add":e.oldProps.id&&(delete configuration.elements[e.oldProps.id],$(`#${e.oldProps.id}`).remove()),3==Object.keys(e.oldProps).length&&(delete configuration.defs[e.oldProps.def.id],delete configuration.lines[e.oldProps.line.id],delete configuration.animations[e.oldProps.animation.id],$(`#${e.oldProps.def.id}, #${e.oldProps.line.id}, #${e.oldProps.animation.id}`).remove());break;case"align":case"move":for(const t of e.oldProps)moveSVGElement(t,{x:t.x,y:t.y});break;case"delete":if(Array.isArray(e.oldProps))for(const t of e.oldProps)configuration.elements[t.id]=t,svgElement(t);Object.hasOwn(e.oldProps,"line")&&3==Object.keys(e.oldProps).length&&(configuration.defs[e.oldProps.def.id]=e.oldProps.def,configuration.lines[e.oldProps.line.id]=e.oldProps.line,configuration.animations[e.oldProps.animation.id]=e.oldProps.animation,svgElement(configuration.defs[e.oldProps.def.id]),svgElement(configuration.lines[e.oldProps.line.id]),svgElement(configuration.animations[e.oldProps.animation.id]));break;case"changeStack":case"change":if(Array.isArray(e.oldProps))for(const t of e.oldProps){configuration.elements[t.id]=t,svgElement(t,!0);makeConnections(lineConnection(t.id))}if(Object.hasOwn(e.oldProps,"line")&&3==Object.keys(e.oldProps).length){let t=!0;e.oldProps.line.id!=e.newProps.line.id&&(delete configuration.defs[e.newProps.def.id],delete configuration.lines[e.newProps.line.id],delete configuration.animations[e.newProps.animation.id],$(`#${e.newProps.def.id}, #${e.newProps.line.id}, #${e.newProps.animation.id}`).remove(),t=!1),configuration.defs[e.oldProps.def.id]=e.oldProps.def,configuration.lines[e.oldProps.line.id]=e.oldProps.line,configuration.animations[e.oldProps.animation.id]=e.oldProps.animation,svgElement(configuration.defs[e.oldProps.def.id],t),svgElement(configuration.lines[e.oldProps.line.id],t),svgElement(configuration.animations[e.oldProps.animation.id],t)}break;case"createGroup":case"removeGroup":if(Array.isArray(e.oldProps))for(const t of e.oldProps)configuration.elements[t.id].group=t.group;break;case"convertDS":configuration.elements[e.oldProps.id]=e.oldProps,svgElement(e.oldProps,!0)}console.debug("[Undo] Performing:",e.action),addToast("info",sprintf(translateWord("toast_info_undo"),translateWord("value_"+e.action)),"infoUndo",!0),0===globalUndoStack.length&&$("#edit_undo").addClass("not_active")}}function redoStep(){if(globalRedoStack.length>0){closeConfigBar(),$(".draggable-multi").removeClass("draggable-multi");const e=globalRedoStack.pop();switch(globalUndoStack.push(copyObject(e)),$("#edit_undo").removeClass("not_active"),e.action){case"add":e.oldProps.id&&(configuration.elements[e.oldProps.id]=e.oldProps,svgElement(e.oldProps)),3==Object.keys(e.oldProps).length&&(configuration.defs[e.oldProps.def.id]=e.oldProps.def,configuration.lines[e.oldProps.line.id]=e.oldProps.line,configuration.animations[e.oldProps.animation.id]=e.oldProps.animation,svgElement(configuration.defs[e.oldProps.def.id]),svgElement(configuration.lines[e.oldProps.line.id]),svgElement(configuration.animations[e.oldProps.animation.id]));break;case"align":case"move":for(const t of e.newProps)moveSVGElement(t,{x:t.x,y:t.y});break;case"delete":if(Array.isArray(e.oldProps))for(const t of e.oldProps)delete configuration.elements[t.id],$(`#${t.id}`).remove();Object.hasOwn(e.oldProps,"line")&&3==Object.keys(e.oldProps).length&&(delete configuration.defs[e.oldProps.def.id],delete configuration.lines[e.oldProps.line.id],delete configuration.animations[e.oldProps.animation.id],$(`#${e.oldProps.def.id}, #${e.oldProps.line.id}, #${e.oldProps.animation.id}`).remove());break;case"changeStack":case"change":if(Array.isArray(e.newProps))for(const t of e.newProps){configuration.elements[t.id]=t,svgElement(t,!0);makeConnections(lineConnection(t.id))}if(Object.hasOwn(e.oldProps,"line")&&3==Object.keys(e.oldProps).length){let t=!0;e.oldProps.line.id!=e.newProps.line.id&&(delete configuration.defs[e.oldProps.def.id],delete configuration.lines[e.oldProps.line.id],delete configuration.animations[e.oldProps.animation.id],$(`#${e.oldProps.def.id}, #${e.oldProps.line.id}, #${e.oldProps.animation.id}`).remove(),t=!1,console.log(e)),configuration.defs[e.newProps.def.id]=e.newProps.def,configuration.lines[e.newProps.line.id]=e.newProps.line,configuration.animations[e.newProps.animation.id]=e.newProps.animation,svgElement(configuration.defs[e.newProps.def.id],t),svgElement(configuration.lines[e.newProps.line.id],t),svgElement(configuration.animations[e.newProps.animation.id],t)}break;case"createGroup":case"removeGroup":if(Array.isArray(e.newProps))for(const t of e.newProps)configuration.elements[t.id].group=t.group;break;case"convertDS":configuration.elements[e.newProps.id]=e.newProps,svgElement(e.newProps,!0)}console.debug("[Redo] Performing:",e.action),addToast("info",sprintf(translateWord("toast_info_redo"),translateWord("value_"+e.action)),"infoRedo",!0),0===globalRedoStack.length&&$("#edit_redo").addClass("not_active")}}function restoreToast(){localStorage.setItem("shownNotice","[]"),addToast("success",translateWord("toast_hints_restored")),globalLastToasts.clear()}function addToast(e,t,o="",n=!1){const a=document.getElementById("toast-container");let i="";if(o){if(!n&&globalLastToasts.has(o))return;globalLastToasts.add(o),"info"==e&&(i=`<div class="checkbox-container">\n          <label class="tooltip" data-title="toast_reactivate">\n            <input type="checkbox" class="toastCheckbox" onchange="toggleHideToast(this, '${o}')">${translateWord("toast_show_again")}\n          </label>\n          </div>`);if((JSON.parse(localStorage.getItem("shownNotice"))||[]).includes(o))return}const s=document.createElement("div");if(s.id=o,s.className=`toast ${e}`,s.innerHTML=`\n      <span>${t}</span>\n      <button class="close-btn" onclick="closeToast(this, '${o}')">\n        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" width="12" height="12">\n            <path d="M1 1l10 10M11 1L1 11" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>\n        </svg>\n      </button>\n      ${i}\n      <div class="toast-progress"></div>\n  `,o){const e=document.getElementById(o);e?e.replaceWith(s):a.appendChild(s)}else a.appendChild(s);const r=s.querySelector(".toast-progress"),l=Math.min(Math.max(100*t.length,3e3),1e4),c={duration:l,element:s,progressBar:r,timer:null,remaining:l,startTime:null,notice:o,elapsed:-10};s.addEventListener("mouseover",(()=>pauseToastTimer(c))),s.addEventListener("mouseout",(()=>resumeToastTimer(c))),setTimeout((()=>{startToastTimer(c),r.style.transition=`width ${l}ms linear`,r.style.width="100%",s.className=`toast ${e} show`}),10)}function startToastTimer(e){e.startTime=Date.now(),e.timer=setTimeout((()=>{closeToast(e.element,e.notice)}),e.remaining)}function pauseToastTimer(e){if(e.timer){clearTimeout(e.timer),e.timer=null;const t=Date.now()-e.startTime;e.remaining-=t,e.elapsed+=t;const o=100*e.remaining/(e.remaining+e.elapsed);e.progressBar.style.transition="none",e.progressBar.style.width=100-o+"%"}}function resumeToastTimer(e){if(!e.timer){startToastTimer(e);const t=e.progressBar;t.style.transition=`width ${e.remaining}ms linear`,t.style.width="100%"}}function toggleHideToast(e,t){e.checked&&($(".custom-tooltip").fadeOut(),setTimeout((()=>{closeToast(e,t)}),300))}function closeToast(e,t=""){const o=e.closest(".toast"),n=o.querySelector(".toastCheckbox");if(n&&n.checked){const e=JSON.parse(localStorage.getItem("shownNotice"))||[];e.includes(t)||(e.push(t),localStorage.setItem("shownNotice",JSON.stringify(e)))}o?(o.classList.remove("show"),setTimeout((()=>{o.remove()}),300)):o.remove()}function generateSVGGradient(e,t,o,n=!1){function a(e){return e.map((e=>{let t=document.createElementNS("http://www.w3.org/2000/svg","stop");const o=e[1].replace("px","");return t.setAttribute("offset",o),t.setAttribute("data-defaultOffset",o),t.setAttribute("stop-color",e[0]),t}))}try{const i=function(e){let t=/.*gradient\s*\(((?:\([^)]*\)|[^)(]*)*)\)/.exec(e);const o=/#[0-9a-fA-F]{3,6}|(rgb|rgba|hsl|hsla) ?\([ 0-9.%,]+?\)|([Tt]ransparent|[Aa]lice[Bb]lue|[Aa]ntique[Ww]hite|[Aa]qua(marine)?|[Aa]zure|[Bb]eige|[Bb]isque|[Bb]lack|[Bb]lanched[Aa]lmond|[Bb]lue([Vv]iolet)?|[Bb]rown|[Bb]urly[Ww]ood|[Cc]adet[Bb]lue|[Cc]hartreuse|[Cc]hocolate|[Cc]oral|[Cc]ornflower[Bb]lue|[Cc]ornsilk|[Cc]rimson|[Cc]yan|[Dd]ark([Bb]lue|[Cc]yan|[Gg]olden[Rr]od|[Gg]ray|[Gg]rey|[Gg]reen|[Kk]haki|[Mm]agenta|[Oo]live[Gg]reen|[Oo]range|[Oo]rchid|[Rr]ed|[Ss]almon|[Ss]ea[Gg]reen|[Ss]late[Bb]lue|[Ss]late[Gg]ray|[Ss]late[Gg]rey|[Tt]urquoise|[Vv]iolet)?|[Dd]eep([Pp]ink|[Ss]ky[Bb]lue)?|[Dd]im([Gg]ray|[Gg]rey)?|[Dd]odger[Bb]lue|[Ff]ire[Bb]rick|[Ff]loral[Ww]hite|[Ff]orest[Gg]reen|[Ff]uchsia|[Gg]ainsboro|[Gg]host[Ww]hite|[Gg]old(en[Rr]od)?|[Gg]ray|[Gg]rey|[Gg]reen([Yy]ellow)?|[Hh]oney[Dd]ew|[Hh]ot[Pp]ink|[Ii]ndian[Rr]ed|[Ii]ndigo|[Ii]vory|[Kk]haki|[Ll]avender([Bb]lush)?|[Ll]awn[Gg]reen|[Ll]emon[Cc]hiffon|[Ll]ight([Bb]lue|[Cc]oral|[Cc]yan|[Gg]olden[Rr]od[Yy]ellow|[Gg]ray|[Gg]rey|[Gg]reen|[Pp]ink|[Ss]almon|[Ss]ea[Gg]reen|[Ss]ky[Bb]lue|[Ss]late[Gg]ray|[Ss]late[Gg]rey|[Ss]teel[Bb]lue|[Yy]ellow)?|[Ll]ime([Gg]reen)?|[Ll]inen|[Mm]agenta|[Mm]aroon|[Mm]edium([Aa]qua[Mm]arine|[Bb]lue|[Oo]rchid|[Pp]urple|[Ss]ea[Gg]reen|[Ss]late[Bb]lue|[Ss]pring[Gg]reen|[Tt]urquoise|[Vv]iolet[Rr]ed)?|[Mm]idnight[Bb]lue|[Mm]int[Cc]ream|[Mm]isty[Rr]ose|[Mm]occasin|[Nn]avajo[Ww]hite|[Nn]avy|[Oo]ld[Ll]ace|[Oo]live([Dd]rab)?|[Oo]range([Rr]ed)?|[Oo]rchid|[Pp]ale[Gg]olden[Rr]od|[Pp]ale([Gg]reen|[Tt]urquoise|[Vv]iolet[Rr]ed)?|[Pp]apaya[Ww]hip|[Pp]each[Pp]uff|[Pp]eru|[Pp]ink|[Pp]lum|[Pp]owder[Bb]lue|[Pp]urple|[Rr]ebecca[Pp]urple|[Rr]ed|[Rr]osy[Bb]rown|[Rr]oyal[Bb]lue|[Ss]addle[Bb]rown|[Ss]almon|[Ss]andy[Bb]rown|[Ss]ea([Gg]reen|[Ss]hell)?|[Ss]ienna|[Ss]ilver|[Ss]ky[Bb]lue|[Ss]late([Bb]lue|[Gg]ray|[Gg]rey)?|[Ss]now|[Ss]pring[Gg]reen|[Ss]teel[Bb]lue|[Tt]an|[Tt]eal|[Tt]histle|[Tt]omato|[Tt]urquoise|[Vv]iolet|[Ww]heat|[Ww]hite([Ss]moke)?|[Yy]ellow([Gg]reen)?)/,n=new RegExp(o.source,"g"),a=/(?:[+-]?\d*\.?\d+)(?:%|[a-z]+)?/g,i=new RegExp(`(${o.source})|${/((?:\d*\.)?\d+(px|%|em|deg|turn|rad|grad)?)/.source}`,"g");let s="N/A";const r=/(deg|turn|rad|grad)/g,l=/(to (left( top| bottom)|right( top| bottom)|top( right| left)?|bottom( right| left)?)?)/g,c=/(ellipse|circle)/g,d=/(farthest-(corner|side)?|closest-(corner|side)?)/g,u=e.match(/((repeating-)?conic-gradient|(repeating-)?linear-gradient|(repeating-)?radial-gradient)/g)[0],p=u.includes("conic");t=t[1].match(/(?:[^)(,]+|\([^)(]+\))+/g);for(let e=0;e<t.length;e++)t[e]=t[e].trim();const g=function(){return!!t[0].match(n)},f=g();g()||(s=t[0],t.shift());const m=function(e){return e.match(/rad/)?parseFloat(e)*(180/Math.PI):e.match(/turn/)?360*parseFloat(e):e.match(/grad/)?parseFloat(e)/400*360:e},h=p?"deg":"%",b=`0${h}`,_=p?"360deg":"100%";let y=[];for(let e=0;e<t.length;e++){const o=t[e].match(i);3===o.length?(y.push(`${o[0]} ${o[1]}`),y.push(`${o[0]} ${o[2]}`)):y.push(t[e])}let $=[];for(let e=0;e<y.length;e++){const t=y[e].match(i),o=t[0],n=t[1];$[e]=n?[o,p?`${m(n)}deg`:n]:[o,0===e?b:e===y.length-1?_:null]}const w=[];let v=!1;for(let e=0;e<$.length;e++){const t=!$[e][1];t&&!v&&(w.push([e]),v=!0),!t&&v&&(w[w.length-1].push(e-1),v=!1)}for(let e=0;e<w.length;e++){const t=w[e][0],o=w[e][1],n=parseFloat($[t-1][1]),a=o-t+2,i=(parseFloat($[o+1][1])-n)/a;let s=n;for(let e=0;e<a;e++){s+=i;const o=+s.toFixed(2);$[t+e][1]=`${o}${h}`}}return{type:u,stops:$,gradientDefinition:s,firstParameterIsColor:f,position:function(e){let t,o,n=e,a=null;if(n.match(/(at)/g)){n=n.slice(n.indexOf("at"),n.length),n=n.replace("at ","");const e=n.split(" ");if(4===e.length)t="left"===e[0]?e[1]:`calc(100% - ${e[1]})`,o="top"===e[2]?e[3]:`calc(100% - ${e[3]})`;else if(1===e.length||2===e.length)switch(n){case"center":case"center center":t="50%",o="50%";break;case"right top":case"top right":t="100%",o="0%";break;case"left top":case"top left":t="0%",o="0%";break;case"right bottom":case"bottom right":t="100%",o="100%";break;case"left bottom":case"bottom left":t="0%",o="100%";break;case"top":case"center top":case"top center":t="50%",o="0%";break;case"left":case"center left":case"left center":t="0%",o="50%";break;case"right":case"center right":case"right center":t="100%",o="50%";break;case"bottom":case"center bottom":case"bottom center":t="50%",o="100%";break;default:a=n.split(" "),t=a[0],o=a[1]||"50%"}}else t="50%",o="50%";return{x:t,y:o}}(s),linearAngle:function(e){let t=0;if(!u.match(/(repeating-)?linear-gradient/))return t;if(e.match(r))t=parseInt(e,10);else switch(function(){const t=e.match(l);return t&&t[0]}()){case"to top":default:t=0;break;case"to bottom":t=180;break;case"to left":t=270;break;case"to right":t=90;break;case"to right top":case"to top right":t=45;break;case"to left top":case"to top left":t=315;break;case"to right bottom":case"to bottom right":t=135;break;case"to left bottom":case"to bottom left":t=225}return t}(s),shape:function(e){const t=e.match(c);return t?t[0]:"ellipse"}(s),size:function(e){if(!u.match(/(repeating-)?radial-gradient/))return"farthest-corner";if(e.match(/(at)/g)){if((e=(e=(e=e.split("at")[0]).replace(/ellipse |circle /g,"")).trim()).match(/ /g))return e.split(" ");if(e.match(a))return e;if(e.match(d))return e.match(d)[0]}else{if((e=(e=e.replace(/ellipse |circle /g,"")).trim()).match(/ /g))return e.split(" ");if(e.match(a))return e;if(e.match(d))return e.match(d)[0]}return"farthest-corner"}(s),conicAngle:function(e){let t=0;return e.match(/from (.*?) at/)?t=m(e.match(/from (.*?) at/)[1]):e.match(/from/)&&(t=m(e.match(/from (.*)/)[1])),t}(s)}}(o);if(n)return a(i.stops);if("linear-gradient"===i.type)return function(e,t,o,n){const i=o.linearAngle*(Math.PI/180)-Math.PI,s={x:(50+50*Math.sin(i)).toFixed(2),y:(50-50*Math.cos(i)).toFixed(2)},r={x:(50+50*Math.sin(i+Math.PI)).toFixed(2),y:(50-50*Math.cos(i+Math.PI)).toFixed(2)};let l=document.createElementNS("http://www.w3.org/2000/svg","linearGradient");return l.setAttribute("id",`gradient_${e}_${t}`),l.setAttribute("data-type","gradient"),l.setAttribute("data-colorHash",n),l.setAttribute("data-value",0),l.setAttribute("x1",`${s.x}%`),l.setAttribute("y1",`${s.y}%`),l.setAttribute("x2",`${r.x}%`),l.setAttribute("y2",`${r.y}%`),l.append(...a(o.stops)),l}(e,t,i,hashCode(o));if("radial-gradient"===i.type)return function(e,t,o,n){if(!o.position)return;let i=document.createElementNS("http://www.w3.org/2000/svg","radialGradient");return i.setAttribute("id",`gradient_${e}_${t}`),i.setAttribute("data-type","gradient"),i.setAttribute("data-colorHash",n),i.setAttribute("data-value",0),i.setAttribute("cx",o.position.x),i.setAttribute("cy",o.position.y),i.setAttribute("r","50%"),i.append(...a(o.stops)),i}(e,t,i,hashCode(o))}catch(t){return void console.error(`Failed to parse the provided CSS-String for ID ${e}! Error: ${t}`)}}function addGradientToSVG(e,t,o,n=!1){const a=document.getElementById("placeholder_gradients"),i=document.getElementById(`gradient_${e}_${t}`);i?i.replaceWith(o):a.appendChild(o),n&&$(`#${e}`).css(t,`url(#gradient_${e}_${t})`)}function generateSingleGradient(e,t,o,n=90){const a=document.createElementNS("http://www.w3.org/2000/svg","linearGradient");a.setAttribute("id",`gradient_${e}_fill`),a.setAttribute("data-type","color"),a.setAttribute("data-colorHash",hashCode(t)),a.setAttribute("gradientTransform","rotate("+n+",0.5,0.5)");const i=document.createElementNS("http://www.w3.org/2000/svg","stop");i.setAttribute("id",`gradient_${e}_fill_transparent`),i.setAttribute("class","stopAnimation"),i.setAttribute("offset","0%"),i.setAttribute("stop-color","none"==o||""==o?"transparent":o),a.appendChild(i);const s=document.createElementNS("http://www.w3.org/2000/svg","stop");s.setAttribute("id",`gradient_${e}_color_transparent`),s.setAttribute("stop-color","none"==t||""==t?"transparent":t),a.appendChild(s),$(a).appendTo("#placeholder_gradients"),$("#"+e).css("fill",`url(#gradient_${e}_fill)`)}function updateSingleGradient(e,t,o,n){const a=document.getElementById(`gradient_${e}_fill_transparent`),i=a?a.getAttribute("offset").replace("%",""):null;try{let a;switch(n){case"percent":a=100-Math.abs(t);break;case"value":if(!o)throw addErrorToLog({id:e,for:translateWord("lbl_config_fill_element"),error:translateWord("failmsg_no_max_value"),function:"-"}),new Error(translateWord("failmsg_no_max_value"));a=100-Math.abs(t)/o*100}a=Math.min(100,Math.max(0,a)),null!=a&&i!=a&&animateGradient(`gradient_${e}_fill_transparent`,i,a)}catch(t){console.error("Error while updating gradient for ID: "+e+"! "+t)}}function closeConfigBar(){hideConfigBar(),hideCoordinates(),$(".all_elements").removeClass("draggable-multi")}function updateSwitchDesignText(e,t){const o=$(e.target).find("option:selected"),n=$(e.target).iconselectmenu("widget");n.children(".ui-selectmenu-text").find("img").remove(),n.children(".ui-selectmenu-text").prepend($("<img>",{src:o.data("image")}))}function generateFrameInput(e){const t=e.protocol,o=e.url;switch(t){case"jsonTable":{const e=JSON.parse(o),t=document.createElement("div");t.className="ef-table-div";const r=document.createElement("table");r.className="ef-table jsonTable";const l=document.createElement("thead"),c=document.createElement("tr");for(var n in e[0]){const e=document.createElement("th");e.textContent=n,c.appendChild(e)}l.appendChild(c),r.appendChild(l);const d=document.createElement("tbody");for(var a=0;a<e.length;a++){var i=document.createElement("tr");for(var n in e[a]){var s=document.createElement("td");s.textContent=e[a][n],i.appendChild(s)}d.appendChild(i)}return r.appendChild(d),t.appendChild(r),t}case"text":return`<div class='content'>${o}</div>`}}async function actionForElement(e,t,o=""){const n="string"==typeof e&&e.includes("line_")?configuration.lines[e]:configuration.elements[e];if(null!=n.action&&"none"!=n.action&&!o||"click"==o){let i=n.source_action>=0?n.source_action:n.source;if(Object.hasOwn(configuration.datasources,i)){const s=configuration.datasources[i].source;switch(n.action){case"default":case"none":break;case"toggle":if("switch"==n.subType){const p=document.getElementById(e);if(p){const g=p.querySelector(".toggleSpinner");g&&(g.style.display="block")}}socket.emit("getState",s,(function(e,t){e?console.log("An error occured, while getting the state. The following error was provided: "+e):"boolean"==typeof t.val?socket.emit("setState",s,{val:!t.val,ack:!1},(function(e,t){e?console.log("[Action] An error occured, while toggling the state. The following error was provided: "+e):console.debug("[Action] The state was set successfully!",t)})):(addToast("warning",translateWord("failmsg_action_not_bool")),console.error("[Action] This state can not be toggled, because it is not a boolean state!"))}));break;case"on":socket.emit("setState",s,{val:!0,ack:!1},(function(e){e?console.log(`[Action] An error occured, while setting the state. The following error was provided: ${e}`):console.debug("[Action] The state was set successfully!")}));break;case"off":socket.emit("setState",s,{val:!1,ack:!1},(function(e){e?console.log(`An error occured, while setting the state. The following error was provided: ${e}`):console.debug("[Action] The state was set successfully!")}));break;case"change":function r(e,t){switch(t){case"boolean":return"boolean"==typeof e?e:"true"===e.toString().toLowerCase();case"number":return"number"==typeof e?e:parseFloat(e);default:return String(e)}}function l(e){return new Promise(((t,o)=>{const n=r(e,d);socket.emit("setState",s,{val:n,ack:!1},(function(n,a){console.debug(`[Action] ${e} submitted to host for state ${a}`),n?(console.log(`[Action] An error occured, while setting the state. The following error was provided: ${n}`),o()):(console.debug("[Action] The state was set successfully!"),t())}))}))}const c=await new Promise(((e,t)=>{socket.emit("getState",s,((o,n)=>{n?(console.debug(`[Action] Pulled value from ioBroker: ${n.val} Type: ${typeof n.val}`),e(n.val)):t(`[Action] The state could not be received! Please check the associated Datasource: ${s}`)}))})).catch((e=>{console.error(e),addToast("warning",sprintf(translateWord("failmsg_invalid_ds"),s))})),d=await new Promise(((e,t)=>{socket.emit("getObject",s,((o,n)=>{n&&n.common?e(n.common?.type):t(`[Action] The state could not be received! Please check the associated Datasource: ${s}`)}))})).catch((e=>{console.error(e),addToast("warning",sprintf(translateWord("failmsg_invalid_ds"),s))}));let u=[{text:translateWord("value_set_value"),class:"input_button jquery",click:async function(){l($("#shortcuts\\.action\\.value").val()).then((()=>{$(this).dialog("close")})).catch((e=>{}))}},{text:translateWord("value_cancel"),class:"input_button red jquery",click:function(){$(this).dialog("close")}}];if(Object.hasOwn(n,"action_display_freeform")?($('[id="shortcuts.action"]').toggle(n.action_display_freeform),n.action_display_freeform||u.shift()):($('[id="shortcuts.action"]').toggle(!1),u.shift()),$("#shortcuts\\.action\\.value").attr("type",n.action_type).val(c),Object.hasOwn(n,"shortcuts"))if(Object.keys(n.shortcuts).length>0){let f;const m=$("<div>"),h=Object.entries(n.shortcuts).sort((([,e],[,t])=>e.alias.localeCompare(t.alias,void 0,{numeric:!0,sensitivity:"base"})));switch(n.action_display){default:case"button":f=$("<div>",{class:"shortcuts_additional_buttons",text:translateWord("shortcuts_additional_buttons")});const b=(e,t)=>{if(null==t)return"shortcut_inactive";return e.toString().toLowerCase()===t.toString().toLowerCase()?"":"shortcut_inactive"};for(const v of h)m.append($("<input>",{type:"button","data-title":v[1].alias,class:`tooltip input_button shortcuts_button ${b(v[1].value,c)}`,"data-value":v[1].value,value:v[1].alias||v[1].value}));f.append(m);break;case"select":f=$("<div>",{class:"contentBox"}),m.addClass("form_div select");const _=$("<label>",{for:"shortcuts_select",class:"form_label",text:translateWord("shortcuts_additional_buttons")}),y=$("<select>",{class:"input_select",id:"shortcuts_select"});for(var a of h)y.append($("<option>",{value:a[1].value,text:a[1].alias||a[1].value,selected:a[1].value.toString().toLowerCase()==c.toString().toLowerCase()}));const w=$("<div>",{class:"select-option"}).append(y);m.append(_,w),f.append(m)}$("#shortcuts\\.elements").show().html(f)}else n.action_display_freeform?$("#shortcuts\\.elements").hide().html(""):($("#shortcuts\\.elements").show().text(translateWord("shortcuts_no_shortcuts")),addErrorToLog({id:e,for:translateWord("opt_action_change"),error:translateWord("shortcuts_no_shortcuts"),function:"-"}));else console.log("No Shortcuts defined"),n.action_display_freeform?$("#shortcuts\\.elements").hide().html(""):($("#shortcuts\\.elements").show().text(translateWord("shortcuts_no_shortcuts")),addErrorToLog({id:e,for:translateWord("opt_action_change"),error:translateWord("shortcuts_no_shortcuts"),function:"-"}));$("#action_change_value").dialog({title:configuration.datasources[i].alias||configuration.datasources[i].source,position:{my:"right-5 bottom-10",at:"left top",of:t,collision:"flipfit"},resizable:!1,height:"auto",maxHeight:"100%",width:"auto",modal:!0,classes:jQueryDialog.classes,open:jQueryDialog.open,beforeClose:jQueryDialog.beforeClose,create:function(){$("#shortcuts\\.action\\.value").off().on("keypress",(function(e){"Enter"===e.key&&$(".ui-dialog-buttonset").children().first().click()})),$(".shortcuts_button").length>0&&$(".shortcuts_button").off().on("click",(async function(){$("#shortcuts\\.action\\.value").val($(this).data("value")),$(this).blur();try{$('[id="shortcuts.action"]').is(":hidden")&&(await l($(this).data("value")),$(".ui-dialog-buttonset").children().first().click()),$(".shortcuts_button").addClass("shortcut_inactive"),$(this).toggleClass("shortcut_inactive")}catch(e){return}})),$("#shortcuts_select").length>0&&$("#shortcuts_select").off().on("change",(async function(){$("#shortcuts\\.action\\.value").val($(this).val());try{$('[id="shortcuts.action"]').is(":hidden")&&(await l($(this).val()),$(".ui-dialog-buttonset").children().first().click())}catch(e){return}}))},buttons:u})}}else addErrorToLog({id:e,for:translateWord(`opt_action_${n.action}`),error:translateWord("failmsg_preview_element_no_ds"),function:"-"})}if(("none"==n.action||!Object.hasOwn(n,"action"))&&""!=n.url&&null!=n.url&&!o||"url"==o){function x(e){try{const t=new URL(e);if("http:"===t.protocol||"https:"===t.protocol)return"http"}catch(e){}try{const t=JSON.parse(e);if(Array.isArray(t)&&t.every((e=>"object"==typeof e&&null!==e&&!Array.isArray(e))))return"jsonTable"}catch(e){}return"text"}async function k(e){const t=new RegExp("{([^)]+)}"),o=e.match(t);if(o&&o.length>0){const t=o[1];e=await new Promise(((e,o)=>{socket.emit("getState",t,((n,a)=>{a?(console.debug(`[Action] Pulled data from ioBroker: ${t}`),e(a.val)):o(`[Action] The state could not be received! Please check the associated Datasource: ${t}`)}))})).catch((e=>{console.error(e),addToast("warning",sprintf(translateWord("failmsg_invalid_ds"),t))}))}return{protocol:x(e),url:e}}const C=await k(n.url),A="http"!=C.protocol?"_overlay":n.frame;switch(A){case"_blank":case"_self":if(o&&"_self"==n.frame)addToast("warning",translateWord("failmsg_opening_frame_preview"));else{const T=n.frame_height&&n.frame_width?`width=${n.frame_width}, height=${n.frame_height}`:"",I=window.open(C.url,n.frame,T);I?I.focus():addToast("warning",translateWord("failmsg_opening_frame"))}break;default:const S=()=>{$("#frameContainer").css({height:n.frame_height||"",width:n.frame_width||""}),openEditorContainer("frame")};switch(C.protocol){case"jsonTable":case"text":displayLoading("");const O=generateFrameInput(C),E=$("<div/>",{class:"framed scrollbar"}).html(O);$("#frameContainer").append(E),S();break;case"http":{displayLoading(translateWord("msg_loading_url"));let M=null;const P=$("<iframe/>",{src:C.url,class:"framed scrollbar",sandbox:"allow-forms allow-modals allow-popups allow-same-origin allow-scripts allow-top-navigation"}).on("load",(function(){""!=$(this).attr("src")&&(S(),$(this).off()),clearTimeout(M)}));$("#frameContainer").append(P),M=setTimeout((()=>{closeEditorContainer("frame"),addToast("warning",translateWord("failmsg_loading_url"))}),5e3)}}}console.log(`[Action] URL found! Opening: ${C.protocol} Frame: ${A}`)}}function wrapUploadImage(e,t){let o=$(`<div class="imgContainer" id="${e}" />`),n=$('<div class="uploads_img" />'),a=$('<div class="uploads_name tooltip" />').data("title",e).text(e),i=$('<div class="uploads_btn" />'),s=$("<input />",{type:"button",class:"input_button delete_upload",value:translateWord("value_delete")});i.append(s);var r=$("<img />",{src:appProperties.webURL+appProperties.namespace+"/userFiles"+t+e,alt:e});return n.append(r),o.append(n,a,i),o}function getUserImages(){return new Promise((e=>{if(globalGalleryLoaded)e(!0);else if(appProperties.wwwExtLoaded){console.debug("[Config] Loading User-Gallery!");const t=new XMLHttpRequest;t.onload=function(){if(t.status>=200&&t.status<300){const o=JSON.parse(t.responseText),n=o.files,a=o.path;if($(".userImagesText.placeholder").show(),$(".fileSelector").prop("disabled",!1),n.length>0){$(".userImagesText-dummy").hide(),$("#deleteGallery").prop("disabled",!1),$("#userImages div.imgContainer").remove(),globalUserImages=n,console.debug(`[Config] Using ${a} for userFiles!`);for(let e=0;e<n.length;e++)$("#userImages").append(wrapUploadImage(n[e],a))}else $(".userImagesText.dummy").fadeIn("fast");$(".userImagesText.placeholder").hide(),globalGalleryLoaded=!0,e(!0)}},t.open("GET",appProperties.webURL+appProperties.namespace+"/?serve=getUploads",!0),t.send()}else $(".drop_zone").off(),addToast("warning",translateWord("failmsg_wwwExt_gallery"))}))}function deleteUserGallery(){$("#dialog_section").prop("title",translateWord("lbl_gallery")).html(translateWord("msg_gallery_delete")).dialog({resizable:!1,height:"auto",maxHeight:"100%",width:400,modal:!0,classes:jQueryDialog.classes,open:jQueryDialog.open,beforeClose:jQueryDialog.beforeClose,buttons:[{text:translateWord("value_delete_gallery"),width:"auto",class:"input_button red jquery",click:function(){$(this).dialog("close");for(let e=0;e<globalUserImages.length;e++)deleteUserImage(globalUserImages[e]);addToast("success",translateWord("msg_gallery_deleted")),$("#deleteGallery").prop("disabled",!0),$(".userImagesText.dummy").fadeIn("fast")}},{text:translateWord("value_cancel"),class:"input_button jquery",click:function(){$(this).dialog("close")}}]})}function deleteUserImage(e){const t=new XMLHttpRequest;t.onload=function(){if(t.status>=200&&t.status<300){const o=JSON.parse(t.responseText);console.debug("[Image]",o);const n=o.filename.replaceAll(".","\\.");$(`#${n}`).fadeOut("fast",(function(){$(this).remove(),0==$("#userImages div").length&&($(".userImagesText dummy").fadeIn("fast"),$("#deleteGallery").prop("disabled",!0)),globalUserImages=globalUserImages.filter((t=>t!=e))}))}},t.open("GET",appProperties.webURL+appProperties.namespace+`/?serve=deleteUpload&image=${e}`,!0),t.send()}function startIconObserver(){console.log("[Proxy] Starting Icon Observer");new MutationObserver((e=>{const t=[];for(const{addedNodes:o}of e)for(const e of o){if(1!==e.nodeType||!e.tagName)continue;const o=e.tagName.toLowerCase();if("svg"===o&&e.style.fill?.includes("gradient")&&e.firstChild)e.firstChild.setAttribute("fill",e.style.fill);else if("svg"!==o)if(e.classList.contains("iconify"))t.push(e);else{const o=e.getElementsByClassName("iconify");o.length&&t.push(...o)}}const o=[...new Set(t)];configuration?.basic?.enable_icon_proxy&&o.forEach((e=>{const t=e.getAttribute("data-icon");t&&loadIconViaProxy(t,$(e))}))})).observe(document.body,{childList:!0,subtree:!0})}function healthCheck(){return new Promise((e=>{const t=new XMLHttpRequest;t.onload=function(){t.status>=200&&t.status<300?(appProperties.wwwExtLoaded=!0,e(!0)):(appProperties.wwwExtLoaded=!1,e(!1))},t.onerror=function(){e(!1)},t.open("GET",appProperties.webURL+appProperties.namespace+"/?serve=healthCheck",!0),t.send()}))}function checkIP(){return console.log("Checking IP!"),new Promise((e=>{const t=new XMLHttpRequest;t.onload=function(){if(t.status>=200&&t.status<300){const o=JSON.parse(t.responseText);e(o)}else e(!1)},t.onerror=function(){e(!1)},t.open("GET",appProperties.webURL+appProperties.namespace+"/?serve=ip",!0),t.send()}))}function getInstances(){return console.log("[Config] Getting Instances"),new Promise((e=>{const t=new XMLHttpRequest;t.onload=function(){if(t.status>=200&&t.status<300){const o=JSON.parse(t.responseText);e(o)}else e(!1)},t.onerror=function(){e(!1)},t.open("GET",appProperties.webURL+appProperties.namespace+"/?serve=instances",!0),t.send()}))}function checkPasswordProtection(){return new Promise((e=>{socket.emit("sendTo",appProperties.namespace,"_checkProtection",{},(function(t){e(t?.data)}))}))}function loadIconViaProxy(e,t){return new Promise(((o,n)=>{if(!e)return o();if("svg"==$(t).prop("tagName"))return o();const a=e=>{const o=(new DOMParser).parseFromString(e.icon,"image/svg+xml"),n=$(o.documentElement);n.data(t.data()).attr({id:t.attr("id"),class:t.attr("class"),style:t.attr("style"),title:t.attr("title"),x:t.attr("x"),y:t.attr("y"),width:t.attr("width"),height:t.attr("height")}),0==e.found&&n.addClass("tooltip").data("title",translateWord("failmsg_icon_not_found")),t.replaceWith(n)},i=`icon=${e}&width=${t.data("width")||24}&height=${t.data("height")||24}&flip=${t.data("flip")||""}&rotate=${t.data("rotate")||0}`,s=localStorage.getItem(`ef_icon_${i}`);if(s){const e=JSON.parse(s);if(!(Date.now()>e.expires))return a(e),o();localStorage.removeItem(`ef_icon_${i}`)}if(iconRequestCache[i])return iconRequestCache[i].then((e=>{a(e),o()}));iconRequestCache[i]=new Promise(((t,o)=>{try{const n=new XMLHttpRequest;n.onload=function(){if(n.status>=200&&n.status<300){const e=JSON.parse(n.responseText);localStorage.setItem(`ef_icon_${i}`,JSON.stringify({icon:e.icon,expires:Date.now()+6048e5,found:e.found})),t(e)}else o(new Error(`HTTP Error: ${n.status}`))},n.onerror=function(){o(new Error(`Network-Error for icon ${e}`))};const a=`${appProperties.webURL}${appProperties.namespace}/?serve=icon&${i}`;n.open("GET",a,!0),n.send()}catch(e){console.log("Error! "+e),o(e)}})),iconRequestCache[i].then((e=>{a(e),o()})).catch((e=>{console.log("Error! "+e),n(e)})).finally((()=>{delete iconRequestCache[i]}))}))}function getElementsByGroup(e){return Object.values(configuration.elements).filter((t=>t.group===e)).map((e=>e.id))}function addElementToSelection(e){globalSelection.add(Number(e));const t=document.getElementById(e);t.classList.add("draggable-multi"),!0===configuration.elements[e]?.protected&&t.classList.add("protected"),$("#duplicate_elements").removeClass("not_active")}function hideCoordinates(){$("#placeholder_coordinate_desc").children().fadeOut("fast",(function(){$(this).remove()}))}function makeDraggable(e){let t,o,n=[],a="tab1",i=!1,s=0,r=!1,l=!1,c=!1,d=!1,u=e.target,p=null,g=!1,f=null,m={};const h=10;function b(e){return Math.round(e/h)*h}function _(){addToast("info",sprintf(translateWord("msg_copy_elements"),globalSelection.size)),globalClipboard=new Set(globalSelection),n=[]}function y(e){s>0||(globalSelection.forEach((e=>{const t=configuration.elements[e]?.group;if(t){getElementsByGroup(t).forEach((e=>{globalSelection.add(e)})),s++}})),s>0&&(n=[],C(e)))}function w(){const e=$("#stack_action, #ctx_stack");if(e.addClass("not_active"),globalSelection.size<2)return;const t=Array.from(globalSelection),o=getElementCoords(t[0]).type;t.every((e=>getElementCoords(e).type===o))&&e.removeClass("not_active")}function v(e){g=!0,e.preventDefault(),1===globalSelection.size?$("#ctx_export").removeClass("not_active"):$("#ctx_export").addClass("not_active");const t=Number(e.target.closest(".draggable")?.id);if(t>=0){const e=configuration.elements[t]?.group;e>=0&&null!=e?($("#ctx_group_add").hide(),$("#ctx_group_remove").removeClass("not_active").show()):($("#ctx_group_add").addClass("not_active").show(),$("#ctx_group_remove").hide())}else $("#ctx_group_add").addClass("not_active").show(),$("#ctx_group_remove").hide();if(globalSelection.size>0||f){if(f)$("#ctx_copy").addClass("not_active"),$("#ctx_delete").removeClass("not_active");else if($("#ctx_copy, #ctx_delete").removeClass("not_active"),globalSelection.size>1){let e=!1;globalSelection.forEach((t=>{const o=configuration.elements[t]?.group;o&&(e=!0)})),e?($("#ctx_group_add").hide(),$("#ctx_group_remove").removeClass("not_active").show()):($("#ctx_group_remove").hide(),$("#ctx_group_add").removeClass("not_active").show())}}else $("#ctx_copy, #ctx_delete").addClass("not_active");globalClipboard.size>0?$("#ctx_paste").removeClass("not_active"):$("#ctx_paste").addClass("not_active");let o=e.clientX,n=e.clientY;if(1===e.touches?.length){const t=e.touches[0];o=t.clientX,n=t.clientY}displayContextmenu(o,n)}function x(){$("#svg_config_div").removeClass("noscroll")}function k(e,t,o,n){$(`#coord_desc_div_${e.id}`).text(t);const a=Number(e.stroke)/2;let i="circle"==e.type||"text"==e.type?o-Number(e.width)/2-a:o-a,s="circle"==e.type||"text"==e.type?n-Number(e.height)/2-a:n-a;const r=$(`#coord_desc_div_${e.id}`),l=Math.round(r.width())+12,c=Math.round(r.height())+20;i=i+l>configuration.basic.width?i-l:Math.max(i,4),s=s<c?s+e.height+2*a+10:s-32,$(`#coord_desc_${e.id}`).attr({x:i,y:s})}function C(e){if(globalSelection.forEach((t=>{n.push(getElementCoords(t,e))})),configuration.basic.enable_show_coordinates){const e=p?n.find((e=>e.id==p)):n[n.length-1];if(0==$(`#coord_desc_${e.id}`).length){$("#placeholder_coordinate_desc").empty();let t=document.createElementNS("http://www.w3.org/2000/svg","foreignObject");t.setAttribute("id",`coord_desc_${e.id}`),t.setAttribute("width",1),t.setAttribute("height",1),t.setAttribute("class","coord_desc"),t.innerHTML=`<div id='coord_desc_div_${e.id}'>X: ${e.x} | Y: ${e.y}</div>`,$(t).hide().fadeIn("fast").appendTo("#placeholder_coordinate_desc")}k(e,`X: ${e.x} | Y: ${e.y}`,e.x,e.y)}i=!1,r=!1}function A(){globalSelection.forEach((e=>{const t=document.getElementById(e);t&&t.classList.remove("draggable-multi","dragging","protected")})),globalSelection.clear(),$("#duplicate_elements").addClass("not_active"),$(".line").removeClass("not_selectable")}function S(){n=[],p=null,f=null,i=!1,r=!1,s=0}function T(e){const n=Number(e.target.closest(".draggable")?.id),i=document.getElementById(n);if(!(i&&i.classList.contains("not_selectable")||e.target.classList.contains("not_selectable")||e.target.closest("svg").classList.contains("not_selectable"))){if(n>=0)if(e.ctrlKey)if(hideConfigBar(),s=0,globalSelection.has(n)){globalSelection.delete(n);const e=configuration.elements[n]?.group;if(e){getElementsByGroup(e).forEach((e=>{globalSelection.delete(e);document.getElementById(e).classList.remove("draggable-multi","dragging","protected")}))}i.classList.remove("draggable-multi","dragging","protected")}else addElementToSelection(n);else S(),i.classList.contains("draggable-multi")||(A(),addElementToSelection(n)),p=n,C(e);if(g=2===e.button,appProperties.isTouch&&(o=setTimeout(v,500,e)),a=2===e.detail?"tab2":"tab1",e.target.classList.contains("line")){if(e.target.classList.contains("not_selectable"))return;e.ctrlKey?(e.stopPropagation(),addToast("warning",translateWord("failmsg_drag_no_line"))):(A(),S(),f=e.target.id)}if(e.target.classList.contains("lasso")){if(e.ctrlKey)return;c=!0,t=getMousePosition(e),$("#svg_config_div").addClass("noscroll"),A(),S(),hideCoordinates(),hideConfigBar(),appProperties.isTouch&&addToast("info",translateWord("toast_info_lasso"),"lasso")}}}function I(e){if(g||e.target.classList.contains("not_selectable"))return;const a=getMousePosition(e);if(appProperties.isTouch&&($("#mouse_contextmenu").hide(),clearTimeout(o)),c)if(l=!0,d)$("#lasso_rect").attr({x:Math.min(t.x,a.x),y:Math.min(t.y,a.y),width:Math.abs(t.x-a.x),height:Math.abs(t.y-a.y)});else{let e=document.createElementNS("http://www.w3.org/2000/svg","rect");e.setAttribute("x",t.x),e.setAttribute("y",t.y),e.setAttribute("width",0),e.setAttribute("height",0),e.setAttribute("rx",0),e.setAttribute("id","lasso_rect"),$(e).appendTo("#placeholder_lasso"),d=!0}else if(e.ctrlKey&&"v"===e.key&&(globalClipboard.size>0?($(".draggable-multi").removeClass("draggable-multi"),duplicateElements(globalClipboard,!1)):addToast("info",translateWord("failmsg_no_elements_clipboard"))),"Delete"===e.key&&(deleteElements(f),f=null),globalSelection.size>0&&(e.ctrlKey?e.target.classList.contains("line")&&$(e.target).addClass("not_selectable"):$(e.target).removeClass("not_selectable"),e.key&&("ArrowUp"!==e.key&&"ArrowDown"!==e.key&&"ArrowRight"!==e.key&&"ArrowLeft"!==e.key||0==n.length&&(C(e),y(e)),e.ctrlKey&&"c"===e.key&&_()),n.length>0)){if(y(e),n.some((e=>1==e.protected)))return 0!=e.buttons&&$(".draggable-multi").addClass("not_selectable"),r=!0,void addToast("warning",translateWord("failmsg_protected_element"),"infoProtectedElement");s>0&&addToast("info",translateWord("toast_info_dragGroups"),"infoDragGroups"),e.key&&!e.shiftKey&&addToast("info",translateWord("toast_info_moveShift"),"infoShiftKey"),$("#svg_config_div").addClass("noscroll"),$(".anim_element").removeClass("animation_cfg").addClass("no_animation"),hideConfigBar(),"mousemove"!=e.type&&"touchmove"!=e.type||(1==n.length&&addToast("info",translateWord("toast_info_moreElements"),"infoMoreElements"),appProperties.isTouch||addToast("info",translateWord("toast_info_dragShift"),"infoShiftDrag"));for(let t=0;t<n.length;t++){const o=n[t],i=configuration.elements[n[t].id];let s={x:a.x-o.offset.x,y:a.y-o.offset.y},r={x:"-",y:"-"};if($("#"+o.id).addClass("dragging"),isNaN(s.x)){const t=e.shiftKey?10:1;let o={x:0,y:0};switch(e.key){case"ArrowRight":o.x=t;break;case"ArrowLeft":o.x=-t;break;case"ArrowUp":o.y=-t;break;case"ArrowDown":o.y=t}s={x:i.pos_x+o.x,y:i.pos_y+o.y}}else e.shiftKey&&(s={x:b(s.x),y:b(s.y)});const l=checkElementBounds(o,s);if(!l.x)return;if(r.x=s.x,!l.y)return;r.y=s.y,moveSVGElement(o,s),configuration.basic.enable_show_coordinates&&k(o,`X: ${r.x} | Y: ${r.y}`,s.x,s.y)}i=!0,globalConfigChanged=!0}}function O(e){if(appProperties.isTouch&&clearTimeout(o),null!=c){if(c=null,d=!1,t=null,l){let e={start_x:parseInt($("#lasso_rect").attr("x")),start_y:parseInt($("#lasso_rect").attr("y")),end_x:parseInt($("#lasso_rect").attr("x"))+parseInt($("#lasso_rect").attr("width")),end_y:parseInt($("#lasso_rect").attr("y"))+parseInt($("#lasso_rect").attr("height"))};$(".added_elements").each((function(){let t=getElementCoords(this.id);const o="circle"==t.type||"text"==t.type?t.width/2:t.width,n="circle"==t.type||"text"==t.type?t.height/2:t.height;t.x>=e.start_x&&t.x+o<=e.end_x&&t.y>=e.start_y&&t.y+n<=e.end_y&&addElementToSelection(t.id)})),x()}l=!1,$("#lasso_rect").remove()}if(n.length>0){if(i){let e=[],t=[];for(let o=0;o<n.length;o++)e.push(n[o]),t.push(getElementCoords(n[o].id));saveUndoStep("move",e,t)}$(".added_elements").removeClass("dragging not_selectable"),x(),$("#basic\\.enable_animation").prop("checked")&&setTimeout((function(){$(".anim_element").removeClass("no_animation").addClass("animation_cfg")}),600),!1!==i||!1!==r||g||e.ctrlKey||p>=0&&(showConfigBar([p],n[0].type,a),A(),addElementToSelection(p),setTimeout((()=>{"tab1"==a&&addToast("info",translateWord("toast_info_elmClick"),"infoElmClick")}),500)),S()}w()}u.addEventListener("mousedown",T),u.addEventListener("touchstart",T,!1),u.addEventListener("mousemove",I),u.addEventListener("touchmove",I),u.addEventListener("mouseup",O),u.addEventListener("mouseleave",(function(e){O(e)}),!1),u.addEventListener("touchend",O,!1),u.addEventListener("touchleave",O,!1),u.addEventListener("touchcancel",O,!1),u.addEventListener("keydown",I),u.addEventListener("keyup",(function(e){if("Shift"==e.key)return;if(x(),w(),n.length>0&&i){let e=[],t=[];for(let o=0;o<n.length;o++)e.push(n[o]),t.push(getElementCoords(n[o].id));saveUndoStep("move",e,t),n=[]}$(".added_elements").removeClass("not_selectable")})),u.addEventListener("contextmenu",(function(e){e.preventDefault(),2==e.button&&v(e)})),$("#ctx_copy").click((function(e){e.preventDefault(),globalSelection.size>0&&_()})),$("#ctx_paste").click((function(e){e.preventDefault(),globalClipboard.size>0&&($(".draggable-multi").removeClass("draggable-multi"),duplicateElements(globalClipboard,!1,m))})),$("#ctx_delete").click((function(e){e.preventDefault(),(globalSelection.size>0||f)&&(deleteElements(f),f=null)})),$("#ctx_export").click((function(e){e.preventDefault(),globalSelection.size>0&&exportElement(globalSelection.values().next().value)})),$("#ctx_group_add").click((function(e){e.preventDefault(),globalSelection.size>0&&!this.classList.contains("not_active")&&function(){const e=Math.max(...Object.values(configuration.elements).map((e=>e.group??0)))+1;let t=[],o=[];globalSelection.forEach((n=>{configuration.elements[n].group=e,console.debug(`[Group] Setting group ${e} to Element: ${n}`),t.push({id:n,group:null}),o.push({id:n,group:e})})),saveUndoStep("createGroup",t,o),addToast("info",sprintf(translateWord("msg_group_elements"),globalSelection.size))}()})),$("#ctx_stack").click((function(e){e.preventDefault(),globalSelection.size>0&&!this.classList.contains("not_active")&&$("#stack_action").click()})),$("#ctx_group_remove").click((function(e){e.preventDefault(),globalSelection.size>0&&!this.classList.contains("not_active")&&function(){const e=globalSelection.values().next().value;let t=[],o=[];globalSelection.forEach((n=>{const a=configuration.elements[n]?.group;if(a){getElementsByGroup(a).forEach((e=>{configuration.elements[e].group=null,globalSelection.delete(e),t.push({id:e,group:a}),o.push({id:e,group:null}),console.debug(`[Group] Removing group ${a} from Element: ${e}`)})),saveUndoStep("removeGroup",t,o),globalSelection.add(e)}})),addToast("info",translateWord("msg_ungroup_elements"))}()}))}$((function(){if(!displayMode){let e;$(".basic_config").on("input change",(async function(t){globalConfigChanged=!0;let o=this.id.replace(".slider","").split(".");if(o.length>0){let n;switch(o.length){case 2:switch(this.id){default:configuration[o[0]][o[1]]="checkbox"==this.type?this.checked:"number"==this.type?Number(this.value):this.value;break;case"basic.enable_ds_autocomplete":this.checked?$("#elm_ds_source").autocomplete(dataSourceAutocompleteOptions):$("#elm_ds_source").hasClass("ui-autocomplete-input")&&$("#elm_ds_source").autocomplete("destroy"),configuration[o[0]][o[1]]=this.checked;break;case"basic.enable_show_coordinates":this.checked||$("#placeholder_coordinate_desc").empty(),configuration[o[0]][o[1]]=this.checked;break;case"basic.enable_animation":this.checked?$(".anim_element").removeClass("no_animation").addClass("animation_cfg"):$(".anim_element").removeClass("animation_cfg").addClass("no_animation"),configuration[o[0]][o[1]]=this.checked;break;case"basic.enable_grid":this.checked?$("#help_grid").fadeIn("fast"):$("#help_grid").fadeOut("fast"),configuration[o[0]][o[1]]=this.checked;break;case"basic.enable_area_catch":this.checked?$(".tabbed").first().removeClass("no_catch"):$(".tabbed").first().addClass("no_catch"),configuration[o[0]][o[1]]=this.checked;break;case"basic.height.slider":case"basic.width.slider":$(`#${o[0]}\\.${o[1]}`).val(this.value).trigger("input");break;case"basic.height":case"basic.width":checkSVGSize("basic.height"==this.id?configuration.basic.width:this.value,"basic.height"==this.id?this.value:configuration.basic.height)[o[1]]?(n=parseInt(this.value),$(`#${o[0]}\\.${o[1]}\\.slider`).val(n),clearTimeout(e)):(n="basic.height"==this.id?configuration.basic.height:configuration.basic.width,"input"==t.type&&(clearTimeout(e),e=setTimeout((()=>{$(`#${o[0]}\\.${o[1]}\\.slider`).val(n),$(`#${o[0]}\\.${o[1]}`).val(n)}),500))),configuration[o[0]][o[1]]=n,resizeSVG()}console.debug("[Basic Config] changed: "+this.id,"checkbox"==this.type?this.checked:this.value,configuration[o[0]]);break;case 3:switch(this.type){case"text":n=this.value;break;case"select-multiple":n=$(this).val().map((e=>parseInt(e)));break;case"select-one":n=isNaN(this.value)?this.value:parseInt(this.value);break;case"number":n=parseInt(this.value);break;case"checkbox":n=this.checked}configuration[o[0]][o[1]][o[2]]=n,console.debug("[Detailed Config] changed: "+this.id,n,configuration[o[0]][o[1]]),configuration.calculation.battery.dod>=0&&null!=configuration.calculation.battery.dod&&configuration.calculation.battery.capacity>=0&&null!=configuration.calculation.battery.capacity&&configuration.calculation.battery.percent>=0&&null!=configuration.calculation.battery.percent&&configuration.calculation.battery.charge>=0&&null!=configuration.calculation.battery.charge&&configuration.calculation.battery.discharge>=0&&null!=configuration.calculation.battery.discharge?(console.debug("[Calculation] Battery configured!"),$("#calculation\\.battery\\.status").addClass("green").removeClass("red").text(translateWord("txt_calculation_succ"))):$("#calculation\\.battery\\.status").addClass("red").removeClass("green").text(translateWord("txt_calculation_fail")),0!=configuration.calculation.consumption.production.indexOf(-1)&&configuration.calculation.consumption.production.length>0&&configuration.calculation.consumption.gridFeed>=0&&null!=configuration.calculation.consumption.gridFeed&&configuration.calculation.consumption.gridConsume>=0&&null!=configuration.calculation.consumption.gridConsume?(console.debug("[Calculation] Consumption configured!"),$("#calculation\\.consumption\\.status").addClass("green").removeClass("red").text(translateWord("txt_calculation_succ"))):$("#calculation\\.consumption\\.status").addClass("red").removeClass("green").text(translateWord("txt_calculation_fail"))}}})),$("input:radio[name=tabs]").click((async function(e){if($(".ui-dialog").remove(),closeConfigBar(),$("#align_elements").click(),$("#connect_elements").hasClass("red")&&$("#connect_elements").click(),$("#placeholder_coordinate_desc").empty(),"tab5"==this.id&&await getUserImages(),appProperties.isTouch){const t=e.target.id,o=document.getElementById(`lbl_${t}`);o&&o.scrollIntoView({behavior:"smooth",inline:"center"})}})),$("#show_hide_config").click((function(){$("#container_menu").toggleClass("hidden")})),$("#svg_mobile_mode").click((function(){const e=$(this).children("svg"),t=$(this).children("span");t.text()==translateWord("value_mode_lasso")?(e.replaceWith($("<span />",{class:"iconify","data-icon":"mdi:cursor-move","data-width":"24","data-height":"24"})),t.text(translateWord("value_mode_move"))):(e.replaceWith($("<span />",{class:"iconify","data-icon":"mdi:pencil","data-width":"24","data-height":"24"})),t.text(translateWord("value_mode_lasso"))),$("#svg_config_div").removeClass("noscroll").toggleClass("actionAllowed")})),$(".line_preview").on("change input",(function(){globalConfigChanged=!0,linePreview(this.id)})),$(".align_elements").click((function(e){$(".added_elements").removeClass("alignable").addClass("draggable"),$(".all_elements, .align_elements").removeClass("faded_out");let t,o=$(this).closest("a").data("align");$(".align_elements").not(this).addClass("faded_out"),$("#align_elements").show(),$("#connect_elements").prop("disabled",!0),$("#svg_config").addClass("not_selectable"),closeConfigBar(),$(".line:not(.preview)").addClass("not_selectable faded_out"),$(".added_elements").removeClass("draggable draggable-multi faded_out").addClass("alignable"),$("#ex_how_align").html(translateWord("ex_align_ref")),$(".alignable").off().click((function(e){if(null==t){const o=$(e.target).closest(".alignable").attr("id");$("#"+o).addClass("active_element not_selectable").off(),t=getElementCoords(o),$("#ex_how_align").html(translateWord("ex_align_ref_selected")),$(".alignable").each((function(){const e=this.getAttribute("id");o!=e&&configuration.elements[e]?.protected&&$(`#${e}`).addClass("not_selectable protected tooltip").data("title",translateWord("title_protected"))}))}else{let n=!0;const a=[],i=[],s=[];globalConfigChanged=!0;const r=$(e.target).closest(".alignable");if(r.hasClass("not_selectable"))return void addToast("warning",translateWord("failmsg_protected_element"),"infoProtectedElement",!0);const l=r.attr("id"),c=getElementCoords(l),d={x:t.cx?t.cx-t.width/2:t.x,y:t.cy?t.cy-t.height/2:t.y},u=(e,t,o)=>{switch(o){case"center":return e.cx>0?d.x+t.width/2:d.x+t.width/2-e.width/2;case"left":return e.cx>0?d.x-t.stroke/2+e.width/2+e.stroke/2:d.x-t.stroke/2+e.stroke/2;case"right":return e.cx>0?d.x+t.width+t.stroke/2-e.width/2-e.stroke/2:d.x+t.stroke/2+t.width-e.width-e.stroke/2;case"vcenter":case"top":case"bottom":return e.cx>0?e.cx:e.x;default:return 0}},p=(e,t,o)=>{switch(o){case"center":case"left":case"right":return e.cy>0?e.cy:e.y;case"vcenter":return e.cy>0?d.y+t.height/2:d.y+t.height/2-e.height/2;case"top":return e.cy>0?d.y-t.stroke/2+e.height/2+e.stroke/2:d.y-t.stroke/2+e.stroke/2;case"bottom":return e.cy>0?d.y+t.height+t.stroke/2-e.height/2-e.stroke/2:d.y+t.stroke/2+t.height-e.height-e.stroke/2;default:return 0}},g={center:{x:u(c,t,"center"),y:p(c,t,"center")},left:{x:u(c,t,"left"),y:p(c,t,"left")},right:{x:u(c,t,"right"),y:p(c,t,"right")},vcenter:{x:u(c,t,"vcenter"),y:p(c,t,"vcenter")},top:{x:u(c,t,"top"),y:p(c,t,"top")},bottom:{x:u(c,t,"bottom"),y:p(c,t,"bottom")}},f=checkElementBounds(c,g[o]);if(f.x&&f.y){a.push(c),s.push({elm:c,coords:g[o]});const e=c.group;if(null!=e&&e>=0){console.log("Element belongs to a group!");const t=getElementsByGroup(e);addToast("info",translateWord("toast_info_modifyGroups"),"infoModifyGroups");for(const e of t){if(e==l)continue;const t=getElementCoords(e),i=t.x-c.x,r=t.y-c.y,d={x:g[o].x+i,y:g[o].y+r},u=checkElementBounds(t,d);if(!u.x||!u.y){n=!1;break}a.push(t),s.push({elm:t,coords:d})}}}else n=!1,addToast("warning",translateWord("failmsg_align_impossible"));if(n){for(const e of s)moveSVGElement(e.elm,e.coords),i.push(getElementCoords(e.elm.id));saveUndoStep("align",a,i)}}}))})),$("#align_elements").click((function(){$("#ex_how_align").html(translateWord("ex_align")),$("#connect_elements").prop("disabled",!1),$("#align_elements").hide(),$(".alignable").off(),$(".added_elements").removeClass("alignable").addClass("draggable"),$(".align_elements").removeClass("faded_out"),$(".all_elements").removeClass("faded_out protected not_selectable active_element tooltip"),$(".line, #svg_config").removeClass("not_selectable")})),$("#import_element").click((function(){let e;const t=getRandomInt(55);$(`<div id="tmpDiv_${t}" class="tmpDiv" />`).appendTo("body"),$(`#tmpDiv_${t}`).prop("title",translateWord("lbl_import_element")).dialog({resizable:!1,height:520,width:400,classes:jQueryDialog.classes,open:jQueryDialog.open,beforeClose:jQueryDialog.beforeClose,close:function(){e.destroy()},create:function(){e=ace.edit(`tmpDiv_${t}`),e.session.setMode("ace/mode/json"),e.setTheme("ace/theme/"+appProperties.aceEditorTheme[appProperties.colorScheme]),$(".ui-dialog-buttonset").children().first().prop("disabled",!0),setTimeout((()=>e.focus()),100),e.getSession().off("changeAnnotation"),e.getSession().on("changeAnnotation",(function(){let t=e.getSession().getAnnotations().filter((e=>"error"==e.type));$(".ui-dialog-buttonset").children().first().prop("disabled",t.length>0||0==e.getSession().getValue().length)}))},buttons:[{text:translateWord("btn_import"),class:"input_button jquery",click:function(){try{const t=JSON.parse(e.getValue());if(t&&["circle","text","rect","icon","image","svg","foreignObject"].includes(t.type)){globalConfigChanged=!0;let e=$(document).scrollLeft(),o=$(document).scrollTop();const n=getMaxID();configuration.basic.enable_area_catch&&(e=$("#svg_config_div").scrollLeft(),o=$("#svg_config_div").scrollTop()),t.id=n,t.source=-1,t.pos_x=e+(parseInt(configuration.basic.elm.pos_x)||50)+getRandomInt(50),t.pos_y=o+(parseInt(configuration.basic.elm.pos_y)||50)+getRandomInt(50),saveUndoStep("add",t,""),configuration.elements[n]=t,svgElement(configuration.elements[n]),console.debug(`[Import] Element: ${t}`),showConfigBar([n],t.type)}else addToast("warning",translateWord("failmsg_import_type"))}catch(e){addToast("warning",translateWord("failmsg_import_error")),console.log(e)}finally{$(this).dialog("close")}}},{text:translateWord("value_cancel"),class:"input_button jquery red",click:function(){$(this).dialog("close")}}]})})),$("#duplicate_elements").click((async function(){this.classList.contains("not_active")||await duplicateElements(globalSelection,!0)})),$(".undo_redo_element").click((function(){globalSelection.clear(),$("#duplicate_elements").addClass("not_active");switch($(this).closest("a").attr("id")){case"edit_undo":undoStep();break;case"edit_redo":redoStep()}})),$("#stack_action").click((function(){if(!this.classList.contains("not_active")){const e=getElementCoords(globalSelection.values().next().value).type;hideCoordinates(),showConfigBar(Array.from(globalSelection),e)}})),$(".add_element").click((function(e){globalConfigChanged=!0;let t=$(document).scrollLeft(),o=$(document).scrollTop();const n=getMaxID();configuration.basic.enable_area_catch&&(t=$("#svg_config_div").scrollLeft(),o=$("#svg_config_div").scrollTop());let a={position:0,id:n,pos_x:Math.round(t)+(parseInt(configuration.basic.elm.pos_x)||50)+getRandomInt(50),pos_y:Math.round(o)+(parseInt(configuration.basic.elm.pos_y)||50)+getRandomInt(50),source:-1};switch($(this).closest("a").data("id")){case"circle":a.radius=parseInt(configuration.basic.circle.radius)||50,a.type="circle",a.fill_value="",a.fill_type=-1,a.fill_direction=90,a.fill_max=0,a.border_value="",a.border_type=-1,a.border_direction="cw",a.border_style="round",a.border_max=0,a.border_reverse_value="",a.border_reverse=!1,a.border_start=180,a.color=configuration.basic.elm.color||getRandomRGBA(),a.fill=configuration.basic.elm.fill||"none",a.stroke=parseInt(configuration.basic.elm.stroke_width)||5;break;case"rect":a.type="rect",a.width=parseInt(configuration.basic.rect.width)||100,a.height=parseInt(configuration.basic.rect.height)||100,a.rx=parseInt(configuration.basic.rect.corners)||10,a.fill_value="",a.fill_type=-1,a.fill_direction=90,a.fill_max=0,a.border_value="",a.border_type=-1,a.border_direction="cw",a.border_style="round",a.border_max=0,a.border_reverse_value="",a.border_reverse=!1,a.border_start=180,a.color=configuration.basic.elm.color||getRandomRGBA(),a.fill=configuration.basic.elm.fill||"none",a.stroke=parseInt(configuration.basic.elm.stroke_width)||5;break;case"text":a.type="text",a.text="Text",a.align=configuration.basic.font.align||"middle",a.color=configuration.basic.font.color||"none",a.fill=configuration.basic.font.fill||getRandomRGBA(),a.font_size=configuration.basic.font.size||20,a.font_family=configuration.basic.font.family||'"Arial", sans-serif';break;case"datasource":a.calculate_kw="none",a.counter_animation=!1,a.convert=!1,a.decimal_places=0,a.type="text",a.align=configuration.basic.font.align||"middle",a.subType="datasource",a.text=`${translateWord("lbl_datasource")} ${n}`,a.source_option=-1,a.source_option_lc=-1,a.source_display="auto",a.linebreak=0,a.subtract=[],a.add=[],a.unit="",a.source_action=-1,a.color=configuration.basic.font.color||"none",a.fill=configuration.basic.font.fill||getRandomRGBA(),a.font_size=configuration.basic.font.size||20,a.font_family=configuration.basic.font.family||'"Arial", sans-serif',a.pos_x+=25;break;case"icon":a.type="icon",a.width=24,a.height=24,a.icon="mdi:omega",a.color=configuration.basic.icon.color||getRandomRGBA();break;case"switch":a.type="svg",a.subType="switch",a.width=80,a.height=30,a.color="#FFF",a.fill="#e1e1e1",a.color_on="#FFF",a.fill_on="#28a745",a.design=3,a.text_on="#FFF",a.text_off="#a35353",a.action="toggle";break;case"svg":a.svg_content='<path d="M19.564 4.42a.75.75 0 0 0-1.378-.59l-6.75 15.75a.75.75 0 0 0 1.378.59l6.75-15.75ZM7 18.5a1.5 1.5 0 1 1-3 0a1.5 1.5 0 0 1 3 0Z" fill="currentColor"></path>',a.subType="svg",a.type="svg",a.width=24,a.height=24,a.viewBox="0 0 24 24";break;case"image":a.href="",a.width=100,a.height=100,a.type="image",a.preserveAspectRatio="xMidYMid meet";break;case"fObj":a.fObj_content=`<div xmlns="http://www.w3.org/1999/xhtml">${translateWord("help_fObj_tmp")}</div>`,a.width=60,a.height=100,a.type="foreignObject",a.color=getRandomRGBA()}configuration.elements[n]=a,svgElement(a),saveUndoStep("add",a,"")})),$("#config_swap").click((function(){$("#config_bar").toggleClass("left right")})),$(".connect_elements").click((async function(e){await connectElements(e.target.closest(".connect_elements").id)})),$("#save_workspace, #save_workspace_exit").click((async function(){globalConfigChanged=!1;const e=await checkPasswordProtection(),t=$("#save_password");if(e){const e=t.val();if(!e)return addToast("warning",translateWord("failmsg_protection_noPass"),"warningProtectionNoPass",!0),void t.focus();await new Promise((o=>{socket.emit("sendTo",appProperties.namespace,"_checkPassword",{password:e},(function(e){if(e.error)return addToast("error",translateWord("failmsg_protection_wrongPass"),"warningProtectionWrongPass",!0),void t.focus();o(e.data)}))}))}const o=Object.entries(configuration.datasources).filter((([e,t])=>!0===t.deleted)).map((([e])=>e));if(o.length>0&&o.forEach((e=>{delete configuration.datasources[e];const t=document.querySelector(`#datasource-table [data-id='${e}']`);t&&t.remove()})),appProperties.localMode)addToast("success",translateWord("succ_msg_local_output"));else{await saveWorkspace()&&(addToast("success",translateWord("succ_msg_save_workspace")),"save_workspace_exit"==this.id&&window.location.replace("index.html?instance="+appProperties.instance))}aceLog.setValue(JSON.stringify(configuration,void 0,4),-1)})),$("#workspace_exit").click((function(){window.location.replace("index.html?instance="+appProperties.instance)})),$(".check_datasources").click((async function(e){const t=Object.entries(configuration.datasources),o=t.length;let n=0;const a=e.target.closest(".check_datasources").id;console.log(a);for(const[e,o]of t){const t=$(`#datasource-table tbody tr[data-id="${e}"`);t.removeClass("highlight-red highlight-green");let i="highlight-red";switch(a){case"check_ds":console.debug(`[Datasource] Checking availability of ${o.source}`);await new Promise((e=>{socket.emit("getState",o.source,((t,o)=>{e(o)}))}))&&(i="highlight-green",n++);break;case"check_ds_use":console.debug(`[Datasource] Checking usage of ${configuration.datasources[e].source}`),Object.keys(checkDatasourcesInUse(e)).length>0&&(i="highlight-green",n++)}$(t).addClass(i),setTimeout((()=>{$(t).removeClass(i)}),4e3)}addToast("info",sprintf(translateWord(`msg_ds_${a}`),n,o))})),$("#restore_backup").click((function(){let e=$("#backup_list").val();-1!=e&&""!=e&&null!=e?$("#dialog_section").prop("title",translateWord("lbl_backup_section")).html(translateWord("msg_backup_restore")).dialog({resizable:!1,height:"auto",maxHeight:"100%",width:400,modal:!0,classes:jQueryDialog.classes,open:jQueryDialog.open,beforeClose:jQueryDialog.beforeClose,buttons:[{text:translateWord("value_save_restore"),width:"auto",class:"input_button jquery",click:function(){$(this).dialog("close"),socket.emit("sendTo",appProperties.namespace,"_restoreBackup",{filename:e},(async function(e){e&&e.error?(console.log("An error occured, while restoring the backup. The following error was provided: ",e.error),addToast("error",translateWord("failmsg_backup"))):(configuration=e.data,console.log(e.data),await setLoadedConfig(),addToast("info",translateWord("succ_msg_backup")))}))}},{text:translateWord("value_cancel"),class:"input_button jquery red",click:function(){$(this).dialog("close"),addToast("info",translateWord("failmsg_backup_cancel"))}}]}):addToast("warning",translateWord("failmsg_backup_no_valid"))})),$.widget("custom.iconselectmenu",$.ui.selectmenu,{_renderItem:function(e,t){var o=$("<li>"),n=$("<div>"),a=t.element.attr("data-image");return t.disabled&&o.addClass("ui-state-disabled"),a&&$("<img>",{src:a}).appendTo(n),$("<span>",{text:t.label}).appendTo(n),o.append(n).appendTo(e)}})}})),$(document).ready((async function(e){let t;if(document.addEventListener("contextmenu",(e=>e.preventDefault())),$("body").on("mouseenter.efTooltip",".tooltip",(function(e){$(this).efTooltip(e)})),$("body").on("touchstart.efTooltip",".tooltip",(function(e){const o=$(this);t=setTimeout((()=>{o.efTooltip(e)}),500)})),$("body").on("touchend touchmove touchcancel",".tooltip",(function(){clearTimeout(t)})),document.addEventListener("click",(function(e){0===e.button&&$("#mouse_contextmenu").fadeOut(200)})),displayMode){let e;$("#svg_display").on("dblclick",(function(e){const t=document.documentElement;document.fullscreenElement?document.exitFullscreen():t.requestFullscreen().catch((e=>{addToast("info","Your browser does not support fullscreen!")}))})).on("contextmenu",(function(e){e.preventDefault(),2===e.button&&displayContextmenu(e.clientX,e.clientY)})).on("touchstart",(function(t){1===t.touches.length&&(e=setTimeout((function(){const e=t.touches[0];displayContextmenu(e.clientX,e.clientY)}),500))})).on("touchend touchmove touchcancel",(function(){clearTimeout(e)})).on("touchmove",(function(e){$("#mouse_contextmenu").fadeOut(200)})),$("body").on("click",".action_element",(function(e){const t=$(this).attr("id");console.debug(`[Action] Clicked on Action Element ${t}`),actionForElement(t,e)})),$("body").on("click",".instance_link",(function(e){const t=Number($(this).attr("data-id"));window.location.replace(`index${appProperties.localMode?"-local":""}.html?instance=${t}`)}))}else $("body").on("dragover",".drop_zone",(function(e){e.preventDefault(),$(this).addClass("dragFile"),$(this).siblings().find(".uploadInfo").text(translateWord("txt_upload_status_drop"))})),$("body").on("dragleave",".drop_zone",(function(e){e.preventDefault(),$(this).removeClass("dragFile"),$(this).siblings().find(".uploadInfo").text(translateWord("txt_upload_status_init"))})),$("body").on("drop",".drop_zone",(function(e){e.preventDefault(),$(this).find(".uploadFile").prop("files",e.originalEvent.dataTransfer.files).trigger("change")})),$("body").on("change",".uploadFile",(async function(){const e=$(this).hasClass("browse"),t=$(this).closest(".uploadForm"),o=t.siblings(".uploadErrors"),n=t.find(".upload_progress>div"),a=t.find(".uploadInfo");function i(e){return new Promise((function(t,o){const n=new XMLHttpRequest,a=new FormData;a.append("uploadFile",e),n.onload=function(){n.status>=200&&n.status<300?t(JSON.parse(n.responseText)):o(n.status)},n.open("POST",appProperties.webURL+appProperties.namespace+"/upload",!0),n.send(a)}))}const s=this.files.length;let r=[];n.css("width","0%"),o.removeClass("open"),t.find(".fileSelector").blur().prop("disabled",!0);for(const t of this.files){if(a.text(sprintf(translateWord("txt_upload_uploading"),Object.keys(r).length||1,s)),t.size>5242880)r.push({filename:t.name,success:!1,reason:"size"});else if(t.type.includes("image"))if(globalUserImages.includes(t.name.trim().replace(/[^a-z0-9._\-]/gi,"_").replace(/_{2,}/g,"_").toLowerCase()))r.push({filename:t.name,success:!1,reason:"exists"});else{const o=await i(t);console.log("Uploaded: "+o.filename),r.push({filename:o.filename,success:!0,reason:"success"}),globalUserImages.push(o.filename);const n=globalUserImages.sort().indexOf(o.filename),a=wrapUploadImage(o.filename,o.path).hide(),s=a.clone();$(".userImagesText.dummy").fadeOut("fast"),a.appendToWithIndex($("#userImages").not("span"),n).fadeIn(2e3),e&&s.appendToWithIndex($("#userImagesBrowse").not("span"),n).fadeIn(2e3).attr({id:"","sel-id":o.filename}).find(".delete_upload").val(translateWord("value_select")).removeClass("delete_upload").addClass("select_upload")}else r.push({filename:t.name,success:!1,reason:"type"});n.css("width",Object.keys(r).length/s*100+"%")}if(r.find((e=>!1===e.success))){o.addClass("open");const e=o.find(".upload_errors-table tbody");e.empty(),r.forEach((function(t){e.append(`<tr><td>${t.filename}</td><td>${translateWord("txt_upload_error_"+t.reason)}</td></tr>`)})),addToast("warning",translateWord("txt_upload_status_error")),a.text(translateWord("txt_upload_status_error"))}else addToast("success",translateWord("txt_upload_status_success")),a.text(translateWord("txt_upload_status_success")),$("#deleteGallery").prop("disabled",!1);$(".uploadFile").val(null),t.find(".fileSelector").blur().prop("disabled",!1),t.find(".drop_zone").removeClass("dragFile")})),window.addEventListener("keydown",(function(e){if((e.ctrlKey||e.metaKey)&&"z"===e.key&&"input"!=this.document.activeElement.tagName.toLowerCase()&&undoStep(),(e.ctrlKey||e.metaKey)&&"y"===e.key&&"input"!=this.document.activeElement.tagName.toLowerCase()&&redoStep(),(e.ctrlKey||e.metaKey)&&"d"===e.key&&(e.preventDefault(),$("#duplicate_elements").click()),(e.ctrlKey||e.metaKey)&&"m"===e.key&&(e.preventDefault(),$("#stack_action").click()),(e.ctrlKey||e.metaKey)&&"a"===e.key){const t=document.getElementById("svg_config");document.activeElement===t&&(e.preventDefault(),Object.keys(configuration.elements).length>0&&Object.keys(configuration.elements).forEach((e=>addElementToSelection(e))))}(e.ctrlKey||e.metaKey)&&"s"===e.key&&(e.preventDefault(),$("#tab8").click()),(e.ctrlKey||e.metaKey)&&"o"===e.key&&(e.preventDefault(),$("#tab1").click()),(e.ctrlKey||e.metaKey)&&"g"===e.key&&(e.preventDefault(),$("#tab5").click())})),$("body").on("click",".line",(function(e){$(this).hasClass("preview")||$(this).hasClass("not_selectable")||(hideCoordinates(),showConfigBar([e.target.id],e.target.tagName.toLowerCase(),2===e.detail?"tab2":"tab1"))})),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",(e=>{appProperties.colorScheme=e.matches?"dark":"light",console.log("Color-Scheme-changed: "+appProperties.colorScheme),aceLog.setTheme("ace/theme/"+appProperties.aceEditorTheme[appProperties.colorScheme]),aceCSS.setTheme("ace/theme/"+appProperties.aceEditorTheme[appProperties.colorScheme]),aceOverride.setTheme("ace/theme/"+appProperties.aceEditorTheme[appProperties.colorScheme])})),aceLog=ace.edit("save_output"),aceLog.renderer.setScrollMargin(0,12),aceLog.session.setMode("ace/mode/json"),aceLog.setTheme("ace/theme/"+appProperties.aceEditorTheme[appProperties.colorScheme]),aceLog.setReadOnly(!0),aceOverride=ace.edit("codeEditor"),aceOverride.session.setMode("ace/mode/json"),aceOverride.setTheme("ace/theme/"+appProperties.aceEditorTheme[appProperties.colorScheme]),aceOverride.setOptions({enableBasicAutocompletion:!0,enableSnippets:!0,enableLiveAutocompletion:!0,enableAutoIndent:!0}),$(window).on("beforeunload",(function(){if(globalConfigChanged)return translateWord("leave_unsaved")})),$("body").on("click",".help",(function(){const e=$(this).data("help");let t=translateWord(e);switch(t==e&&(t=translateWord("ex_no_help")),e){case"help_override":t=sprintf(t,`<pre><code>${JSON.stringify({">10":{color:"#FF0000"},">5":{color:"#538ea3"}},void 0,4)}</code></pre>`);break;case"help_design":t=sprintf(t,"<pre><code>.type_switch > .toggleText {\n  font-size: 20px;\n}</code></pre>")}t=t.replaceAll("< /","</"),$("#help_section").html(t).dialog({resizable:!1,classes:jQueryDialog.classes,position:{my:"left top",at:"right bottom",of:this,collision:"fit"},width:400,modal:!1,open:function(e,t){$("#help_section").scrollTop(0),$(this).parent().focus()},close:function(){$(this).dialog("destroy")},buttons:[{text:translateWord("btn_close"),class:"input_button jquery",click:function(){$(this).dialog("close")}}]})})),$("body").on("click",".delete_upload",(function(){deleteUserImage($(this).parents(".imgContainer").attr("id"))})),$("body").on("keyup",".userImages_filter",(function(){const e=new RegExp($(this).val().trim().toLowerCase()),t=$(this).parents(".formFilter"),o=t.siblings(".userImages").children(".imgContainer");if(o.show(),$(this).val().trim()){let n=0;o.each((function(){(this.id||$(this).attr("sel-id")).match(e)||($(this).hide(),n++)})),o.length==n?t.siblings(".userImagesText.noResults").fadeIn("fast"):t.siblings(".userImagesText.noResults").hide()}else t.siblings(".userImagesText.noResults").hide()})),$("#frm-addDataSource").submit((function(e){e.preventDefault();const t=$("#elm_ds_source").val(),o=$("#elm_ds_alias").val()?$("#elm_ds_alias").val():"",n=Number($("#elm_ds_factor").val()),a=checkDuplicateDatasource(t);if(a){const e=$(`#datasource-table tbody tr[data-id="${a}"`);e[0].scrollIntoView({behavior:"smooth",block:"end"});document.querySelector(".tab2 .ef-table-div").scrollIntoView({behavior:"smooth",block:"start"}),e.addClass("highlight-red"),setTimeout((()=>{e.removeClass("highlight-red")}),4e3),addToast("warning",translateWord("failmsg_ds_already_exists"))}else{globalConfigChanged=!0;const e=Object.keys(configuration.datasources).length>0?Math.max(...Object.keys(configuration.datasources).map((e=>e)))+1:0;console.debug(`[States] New ID for added datasource: ${e}`),configuration.datasources[e]={source:t,alias:o,factor:n},addDataSourceRow(e),addToast("success",translateWord("succ_msg_ds_created")),$(this)[0].reset(),updateDataSources()}})),$("#datasource-table").on("click",".btn-delete",(function(){const e=checkDatasourcesInUse($(this).parents("tr").data("id"));if(Object.keys(e).length>0){let o,n=`<div class="ef-table-div"><table class='ef-table small'><thead><tr><th>${translateWord("lbl_config_element")}</th><th>${translateWord("lbl_type")}</th><th>${translateWord("lbl_used_as")}</th></thead><tbody>`,a="";for(var t in e)a+=`<tr><td>${e[t].id}</td><td>${e[t].type}</td><td>${e[t].reason}</td></tr>`;o=`${n}${a} </tbody></table></div>`,$("#dialog_section").prop("title",translateWord("lbl_ds_delete_section")).html(`<span class='dsInUseInfoTitle'> ${translateWord("failmsg_delete_source")}</span>`).append(o).dialog({resizable:!1,maxHeight:"98%",width:"auto",modal:!0,classes:jQueryDialog.classes,beforeClose:jQueryDialog.beforeClose,open:jQueryDialog.open,close:function(){$(this).dialog("close")},buttons:[{text:translateWord("btn_close"),class:"input_button jquery",click:function(){$(this).dialog("close")}}]})}else{const e=$(this).parents("tr");e.find(".btn-update, .btn-cancel, .btn-edit, .btn-delete").hide(),e.find(".btn-restore").show(),e.addClass("deleted"),globalConfigChanged=!0,configuration.datasources[e.data("id")].deleted=!0}})),$("#datasource-table").on("click",".btn-restore",(function(){const e=$(this).parents("tr");e.find(".btn-restore").hide(),e.find(".btn-edit, .btn-delete").show(),e.removeClass("deleted"),delete configuration.datasources[e.data("id")].deleted})),$("#datasource-table").on("click",".btn-edit",(function(){$("#frm-addDataSource :input, #frm-addDataSource a, .tabbed>input, .ds_buttons.btn-edit, .ds_buttons.btn-delete").prop("disabled",!0),$("#frm-addDataSource a, .tabbed nav label").attr("disabled",!0),$("#datasource-table .sortable .filter").removeClass("filter").addClass("no_filter");const e=$(this).closest("tr");e.addClass("active"),e.closest("table").find("tbody").find("tr").addClass("editMode").not(e).addClass("inactive");const t=e.data("alias"),o=e.data("source"),n=e.data("factor"),a=$("<div>",{class:"form_div no_margin"}).append($("<input>",{type:"text",class:"input_text",id:"edit_ds_alias",name:"edit_ds_alias",autocorrect:"off",value:t}).attr("autocomplete","off")),i=$("<div>",{class:"form_div no_margin"}).append($("<input>",{class:"input_text icon_in_input_pad datasource_autocomplete",type:"text",id:"edit_ds_source",name:"edit_ds_source",autocorrect:"off",minlength:3,required:!0,value:o}).attr("autocomplete","off").autocomplete(configuration.basic.enable_ds_autocomplete?dataSourceAutocompleteOptions:{source:function(){}})).append($("<div>",{class:"icon_wrapper"}).append($("<a>",{class:"frm-datasource icon_in_input tooltip","data-title":"title_sel_ds"}).append($("<span>",{class:"iconify","data-icon":"mdi:database-search","data-height":"24"}))).append($("<div>",{class:"ds_search_spinner"}).append($("<span>",{class:"spinner"})))),s=$("<div>",{class:"form_div no_margin"}).append($("<div>",{class:"select-option"}).append($("<select>",{class:"input_select",name:"edit_ds_factor",id:"edit_ds_factor"}).append($("<option>",{value:1,text:translateWord("opt_ds_factor_1")})).append($("<option>",{value:1e3,text:translateWord("opt_ds_factor_1000")}))));e.find("td:eq(0)").empty().append(a),e.find("td:eq(1)").empty().append(i),e.find("td:eq(2)").empty().append(s),e.find(".btn-update, .btn-cancel").show(),e.find(".btn-delete, .btn-edit").hide(),$("#edit_ds_factor").val(n)})),$("#datasource-table").on("click",".btn-cancel",(function(){$("#frm-addDataSource :input, #frm-addDataSource a, .tabbed>input, .ds_buttons.btn-edit, .ds_buttons.btn-delete").prop("disabled",!1),$("#frm-addDataSource a, .tabbed nav label").attr("disabled",!1),$("#datasource-table .sortable .no_filter").removeClass("no_filter").addClass("filter");const e=$(this).closest("tr");e.closest("table").find("tbody").find("tr.editMode").removeClass(),e.find("td:eq(0)").text(e.data("alias")),e.find("td:eq(1)").text(e.data("source")),e.find("td:eq(2)").text(e.data("factor")),e.find(".btn-edit, .btn-delete").show(),e.find(".btn-cancel, .btn-update").hide()})),$("#datasource-table").on("click",".btn-update",(function(){const e=$(this).closest("tr");e.closest("table").find("tbody").find("tr.editMode").removeClass();const t=$("#edit_ds_alias").val(),o=$("#edit_ds_source").val(),n=Number($("#edit_ds_factor").val());if(o.length>=3){const a=checkDuplicateDatasource(o);null!=a&&a!=e.data("id")?($("#edit_ds_source").focus(),addToast("warning",translateWord("failmsg_ds_already_exists"))):($("#frm-addDataSource :input, #frm-addDataSource a, .tabbed>input, .ds_buttons.btn-edit, .ds_buttons.btn-delete").prop("disabled",!1),$("#frm-addDataSource a, .tabbed nav label").attr("disabled",!1),$("#datasource-table .sortable .no_filter").removeClass("no_filter").addClass("filter"),configuration.datasources[e.data("id")]={source:o,alias:t,factor:n},console.debug(`[States] Datasource updated: New values: ${JSON.stringify(configuration.datasources[e.data("id")])}`),$("#frm-addDataSource :input, #frm-addDataSource a").prop("disabled",!1),$("#frm-addDataSource a").attr("disabled",!1),e.closest("table").find("tbody").find("tr.editMode").removeClass(),globalConfigChanged=!0,e.find("td:eq(0)").text(t),e.find("td:eq(1)").text(o),e.find("td:eq(2)").text(n),e.data({alias:t,source:o,factor:n}),e.find(".btn-edit, .btn-delete").show(),e.find(".btn-cancel, .btn-update").hide(),updateDataSources())}else $("#edit_ds_source").focus(),addToast("warning",translateWord("msg_ds_not_empty"))})),$("body").on("click",".frm-datasource",(function(){const e=new RegExp("{([^)]+)}"),t=$(this).closest(".form_div").find("input"),o=t.attr("id");let n=configuration.basic.enable_last_id&&""==t.val()?globalSelectedId:t.val();if(t.hasClass("href")&&n.length>0){const t=n.match(e);t&&t.length>0&&(n=t[1])}openEditorContainer("stateExplorer"),addToast("info",translateWord("msg_firstSelect_DS"),"infoFirstSelectDS"),setTimeout((()=>{openStateTree("stateExplorer",n)}),200),$("#select_state").off().on("click",(function(){const e=$("#stateRoot .state.active"),n=e.attr("id"),a=e.find(".name").text();t.hasClass("href")?($(`#${o}`).val(`{${n}}`).focus().trigger("change"),"elm_url"==o&&$("#elm_frame").val("_overlay").trigger("change")):"elm_ds_source"==o?($("#elm_ds_source").val(n).focus(),$("#elm_ds_alias").val(a)):$(`#${o}`).val(n).focus(),globalSelectedId=n,closeEditorContainer("stateExplorer"),$(".state").removeClass("active").children(".type").removeClass("file-selected")})),$("#reloadStateExplorer").off().on("click",(async function(){$("#select_state").prop("disabled",!0),$("#stateRoot").empty().remove(),$("#stateExplorer_placeholder").show(),iobObjects=await loadIobObjects(),generateStateTree(iobObjects,"stateExplorer"),$(".stateExplorerFilter").trigger("keyup")}))})),$("#datasource-table").on("click","th.filter",(function(){const e=$(this),t=e.closest("table"),o=t.find("tbody"),n=e.index(),a="true"!==e.attr("data-asc"),i=o.find("tr").get();i.sort((function(e,t){const o=$(e).children().eq(n).text().trim(),a=$(t).children().eq(n).text().trim();return $.isNumeric(o)&&$.isNumeric(a)?parseFloat(o)-parseFloat(a):o.localeCompare(a,void 0,{numeric:!0,sensitivity:"base"})})),t.find("th.filter>.sort_icon").empty(),t.find("th.filter").attr("data-sorting","false"),e.find(".sort_icon").append($("<span>",{class:"iconify","data-icon":"mdi:sort-alphabetical-"+(a?"ascending":"descending"),"data-height":18})),a||i.reverse(),$.each(i,(function(e,t){o.append(t)})),e.attr({"data-asc":a,"data-sorting":!0})})),$("#image_href_gallery").click((function(){const e=$(this).closest(".form_div").find("input").attr("id");$("#userImagesBrowseDialog").prop("title",translateWord("lbl_gallery")).dialog({resizable:!1,height:window.innerHeight-50,width:640,modal:!1,classes:jQueryDialog.classes,beforeClose:jQueryDialog.beforeClose,close:function(){$(this).dialog("close")},create:async function(){await getUserImages(),$("#userImagesBrowseContainer").children(".userImages_noResults").hide();let t=$("#userImages").children().clone();$("#userImagesBrowseFilter").val(""),t.each((function(e,t){$(t).hasClass("imgContainer")&&$(t).attr({id:"","sel-id":this.id}).show().find(".delete_upload").val(translateWord("value_select")).removeClass("delete_upload").addClass("select_upload")})),$("#userImagesBrowse").empty().append(t),$("body").on("click",".select_upload",(function(t){const o=$(this).parents(".imgContainer").attr("sel-id");console.log("Clicked",o),$("#"+e).val(o).trigger("change"),$(".ui-dialog-buttonset").children().first().click()}))},open:jQueryDialog.open,buttons:[{text:translateWord("btn_close"),class:"input_button jquery",click:function(){$(this).dialog("close"),setTimeout((()=>{$("#toggleUploadBrowse").removeClass("open");const e=$(".uploadArea.browse");e.find(".uploadErrors").removeClass("open").find(".toggle-link").removeClass("open"),e.find(".upload_progress>div").css("width","0%"),e.find(".uploadInfo").text(translateWord("txt_upload_status_init"))}),500)}}]})})),$("body").on("click",".toggle-link",(function(){const e=$(this);if(e.toggleClass("open"),e.hasClass("exclude"))return;const t=e.hasClass("open")?"start":"end";setTimeout((()=>{e[0].scrollIntoView({behavior:"smooth",block:t,container:"nearest"})}),200)})),$("body").on("click",".preview_gradient",(function(){const e=getRandomInt(55),t=$(this).parent("div").prev(".color, .style").val();if(t){const o=parseColorString(t);if(o){const t=generateSVGGradient(e,"test",o);t?($(`<div id="tmpDiv_${e}" class="tmpDiv" />`).appendTo("body"),$(`#tmpDiv_${e}`).prop("title",translateWord("title_show_gradient")).dialog({resizable:!1,width:"50%",maxHeight:"100%",modal:!0,classes:jQueryDialog.classes,open:jQueryDialog.open,beforeClose:jQueryDialog.beforeClose,create:function(){let o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.setAttribute("preserveAspectRatio","none"),o.setAttribute("width","100%"),o.setAttribute("height",200);let n=document.createElementNS("http://www.w3.org/2000/svg","defs");n.appendChild(t);let a=document.createElementNS("http://www.w3.org/2000/svg","rect");a.setAttribute("x",0),a.setAttribute("y",0),a.setAttribute("width","100%"),a.setAttribute("height",200),a.setAttribute("fill",`url(#gradient_${e}_test)`),o.append(n,a),$(this).append(o)},buttons:[{text:translateWord("btn_close"),class:"input_button jquery",click:function(){$(this).dialog("close")}}]})):addToast("warning",translateWord("failmsg_parse_gradient"))}else addToast("warning",translateWord("failmsg_parse_gradient"))}}))}));