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.
1 lines • 220 kB
JavaScript
"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}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 a=this.parent().parent("text"),n=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&&a.addClass("glow"),s||(s=c);var d=c-s,u=r+d/t*(l-r);d<t?(i.text(u.toFixed(n)),requestAnimationFrame(e)):(i.text(l.toFixed(n)),a.removeClass("glow"))})),this},scrollTo:function(e,t,o){const a=$(this);return a.animate({scrollTop:a.scrollTop()-a.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(),a=o.length;return t<=0?this.prependTo(e):t>=a?this.appendTo(e):this.insertAfter(o.eq(t-1)),this},efTooltip:function(){const e=$(this),t=e.hasClass("added_elements"),o=t?getElementCoords(e.attr("id")):null,a=e.data("title");if(!a)return;if(e.is(":disabled"))return;if(event.type.includes("touch")&&e[0].classList.contains("mobile"))return;const n=$('<div class="custom-tooltip"></div>').text(translateWord(a)),i=$('<div class="custom-tooltip-arrow"></div>');n.append(i).hide(),$("body").append(n);const s=e.offset(),r=t?o.width:e.outerWidth(),l=t?o.height:e.outerHeight(),c=n.outerWidth(),d=n.outerHeight(),u=$(window).width(),g=appProperties.isMobile?800:200;let p=s.left+r/2-c/2,f=s.top-d-10,m="50%";return f<$(window).scrollTop()?(f=s.top+l+10,n.addClass("bottom")):n.removeClass("bottom"),p+c>u&&(p=u-c-10,m=Math.min(s.left+r/2-p,c-12)+"px"),p<10&&(p=10,m=Math.max(s.left+r/2-p,12)+"px"),n.css({left:p,top:f}).fadeIn(200),i.css({left:m}),e.on("mouseleave click",(function(){n.fadeOut(g,(function(){$(this).remove()}))})),n.on("mouseover",(function(){$(this).fadeOut(g,(function(){$(this).remove()}))})),this},efSlider:function(e=300){return this.each((function(){const t=$(this),o=this;let a;clearTimeout(a);if("0px"===window.getComputedStyle(o).maxHeight||0===o.offsetHeight){t.css({display:"block",maxHeight:""}),o.offsetHeight;const n=o.scrollHeight+"px";t.css({transition:`max-height ${e}ms ease`,maxHeight:n}),a=setTimeout((()=>{t.css({maxHeight:"",transition:"",display:""}).addClass("open")}),e)}else{const n=o.scrollHeight+"px";t.css({maxHeight:n,transition:`max-height ${e}ms ease`}),o.offsetHeight,t.css({maxHeight:"0"}),a=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:"✔",text_off:"✖"},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?"/":"http://192.168.2.19:8083/",webURL:window.location.hostname?"/":"http://192.168.2.19:8083/",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),isCloud:!!window.location.hostname.match(/iobroker\.pro|iobroker\.net/),isProtected:!1,online:!1,aceEditorTheme:{dark:"clouds_midnight",light:"textmate"}};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(appProperties),socket=io.connect(appProperties.socketURL,{reconnectionDelay:500,reconnectionAttempts:1/0,upgrade:!0,transports:appProperties.isCloud?void 0:["websocket","polling"]}),socket.on("reauthenticate",(function(){let e=(new Date).toLocaleString();console.log(`[Socket] reauthenticate ${e}`)})),socket.on("error",(function(e){let t=(new Date).toLocaleString();console.error(`[Socket] error: ${e} ${t}`)})),socket.on("permissionError",(function(e){let t=(new Date).toLocaleString();console.error(`[Socket] permission error: ${e} ${t}`)})),socket.on("upgrade",(function(e){let t=(new Date).toLocaleString();console.log(`[Socket] connection upgrade at ${t}`)})),socket.on("connect_error",(function(e){let 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(){let 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,a){if(!o&&a){const o=urlParams.get("lang");o?(console.debug(`[Language] Forcing language to ${o}`),systemLang=o):(systemLang=a[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(a)}else console.error("An error occured during getting the configuration from ioBroker!",o)}))})),loadConfig()}))}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={};let globalError=[],oldRefreshObj={};const clockIntervals={},lineTimeouts={};var filename=location.pathname.substr(location.pathname.lastIndexOf("/")+1);if(filename.includes("index")||""==filename){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,a){globalIobObjectsLoaded=!0,console.debug(`[States] ${Object.keys(a).length} Objects loaded in ${performance.now()-o} ms`);let n={};Object.keys(a).sort(((e,t)=>e.toLowerCase().localeCompare(t.toLowerCase()))).forEach((e=>n[e]=a[e])),iobArray=Object.keys(n).filter((e=>"state"==n[e].type)),e(n)}))}))}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){$("#loading, .loading-spinner").fadeIn(600).removeClass("noText"),$("#loading_text").show().html(e)}function copyObject(e){return JSON.parse(JSON.stringify(e))}function displayListener(){const e=(new Date).toLocaleString();socket.emit("subscribe",subscribeObjID),console.log("[Socket] subscribed to: "+subscribeObjID.toString()+" at "+e),socket.on("reconnect",(function(){console.log("[Socket] reconnected at "+e),socket.emit("subscribe",subscribeObjID),$("#loading").fadeOut("fast")})),socket.on("disconnect",(function(){console.log("[Socket] disconnected "+e),displayLoading(translateWord("msg_reconnect"))})),socket.on("stateChange",(function(t,o){setTimeout((async function(){if(t==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(o.val),await setLoadedConfig(!0),console.log("[Config] Applied new configuration at "+e)}catch(e){console.error("[Config] Error while parsing Config in JSON-Object!")}if(t==subscribeObjID[1])try{refreshData(JSON.parse(o.val))}catch(e){console.error("[Data] Error while parsing Values in JSON-Object!")}if(t==subscribeObjID[2]&&o.val!=appProperties.online&&1==o.val){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)}))}function addBorderFill(e,t,o={}){const a=$("#"+e),n=configuration.elements[e]||o;let i=n.radius,s=Math.PI*(2*i),r=n.height,l=n.width,c=n.border_start,d={id:`border_${e}`,class:"border_fill"};if("rect"==n.type)switch(s=2*n.width+2*n.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?n.pos_x-e:n.pos_x+e,d.y=r>l?n.pos_y+e:n.pos_y-e}}let u=a.clone().attr(d).css({fill:"",filter:"",transform:"rotate("+c+"deg)",strokeDashoffset:s,strokeDasharray:s,strokeLinecap:n.border_style});$(u).insertAfter(a),a.css({stroke:t})}function updateBorderFill(e,t,o,a={}){try{const n=configuration.elements[e]||a,i=$("#border_"+e);let s,r=n.border_direction,l=n.radius,c=Math.PI*(2*l);switch("rect"==n.type&&(c=2*n.width+2*n.height),n.border_type){case"percent":s=100-Math.abs(t);break;case"value":if(!n.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)/n.border_max*100}s=Math.min(100,Math.max(0,s)),n.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 a="object"==typeof e?e:document.getElementById(e);let n=parseInt(t),i=parseInt(o),s=!1;a&&(s||function e(){s=!0,n<i?n=Math.min(n+1,i):n>i&&(n=Math.max(n-1,i));a.setAttribute("offset",`${n}%`),n!=i?requestAnimationFrame(e):s=!1}())}function updateMultiGradient(e,t,o,a){const n=document.getElementById(`gradient_${e}_fill`),i=n.childNodes,s=parseInt(n.getAttribute("data-value"));let r;try{switch(a){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)}}n.setAttribute("data-value",r)}}function userClock(e,t,o=!1){const a=Object.keys(e).reduce(((t,o)=>("none"!==e[o]&&""!==e[o]&&(t[o]=e[o]),t)),{}),n=document.getElementById(t);let i;const s=new Date;try{i=new Intl.DateTimeFormat(systemLang,a).format(s)}catch(e){console.log("Not a valid date. Waiting for setting-up correctely!",e.message)}return n&&n.innerHTML!=i&&(n.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"))}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>`))),$("#loading").fadeIn(600).addClass("noText"),$("#errorLogContainer").css("visibility","visible").addClass("visible")}async function refreshData(e,t=!1){function o(e,a){if(t)return!1;if(e===a)return!0;if("object"!=typeof e||"object"!=typeof a||null===e||null===a)return!1;const n=Object.keys(e),i=Object.keys(a);if(n.length!==i.length)return!1;for(let t of n)if(!o(e[t],a[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,a]=t,n=configuration.elements[o];if("svg"==n.type&&"switch"==n.subType&&toggleSwitch(o,a),a){let t=a;if(Object.hasOwn(e,"override")&&Object.hasOwn(e.override,o)&&Object.hasOwn(e.override[o],"value")){const a=e.override[o].value;a&&"object"==typeof a?addErrorToLog({id:o,for:`${translateWord("lbl_override")}: <b>value</b>`,error:a.error,function:a.function}):t=e.override[o].value}"value"==n.source_display||"auto"==n.source_display?n.counter_animation?isNaN(t)?$(`#${o}_value`).html(generateMultiLineText(`${o}_value`,t,n.pos_x)):($(`#${o}_value`).children().length>0||$(`#${o}_value`).html(generateMultiLineText(`${o}_value`,0,n.pos_x)),$(`#${o}_value_line_0`).countTo(t,configuration.basic.animation_timer,n.counter_highlight)):($(`#${o}_value`).children().length>0||$(`#${o}_value`).html(generateMultiLineText(`${o}_value`,0,n.pos_x)),$(`#${o}_value_line_0`).html(t),n.counter_highlight&&($(`#${o}`).addClass("glow"),setTimeout((()=>{$(`#${o}`).removeClass("glow")}),2e3))):$(`#${o}_value`).html(generateMultiLineText(`${o}_value`,t,n.pos_x)),""==n?.unit&&e.unit&&e.unit[o]&&$(`#${o}_unit`).html(generateMultiLineText(`${o}_unit`," "+e.unit[o],n.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,a]=t,n=configuration.elements[o];if(n&&-1!=n.fill_type&&n.fill_value){let t=n.fill_value,i=a;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,n.fill_max,n.fill_type),"gradient"==l&&updateMultiGradient(o,i,n.fill_max,n.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,n.fill,n.fill_direction),console.debug("[Config] Single-Fill-Gradient added for: "+o)),updateSingleGradient(o,i,n.fill_max,n.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`),a=n.fill&&!n.fill.match(/(?=(gradient|none))/gi)?n.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",a),e.appendChild(i),e.setAttribute("gradientTransform","rotate("+n.fill_direction+",0.5,0.5)"),console.log("[Config] Multi-Fill-Gradient added for: "+o)}updateMultiGradient(o,i,n.fill_max,n.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,a]=t,n=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,a,n)=>{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`),a=o?parseInt(o.getAttribute("data-colorHash")):null,n=hashCode(t);"gradient"==i&&a!=n&&(r=generateStyleProperty(e,"stroke",t,!1,"url")),"color"==i&&o&&o.remove()}else"gradient"==i&&(r=generateStyleProperty(e,"stroke",t,!1,"url"));switch(a){case"base":s.style.stroke=r;break;case"border":updateBorderFill(o,n,r)}}};let s=i.border_value,r=i.color,l=a;i.border_reverse&&a<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(n,"-90deg,").toLocaleLowerCase(),r=r.replace(n,"-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),a=document.getElementById(e.replace("anim","line")),n=configuration.animations[e]||{},i=configuration.basic.enable_low_performance||"true"===appProperties.lowPerformance,s=configuration.basic.enable_line_animation,r=calculatePathAnimationTime(e);o.style.strokeDasharray="dots"===t.type?t.stroke:"",o.style.animationDirection="reverse"===t.option?"reverse":"",i||"duration"!==t.type||(o.style.animationDuration=`${t.duration}ms`);const l=!!t.animation,c=!!n.active_only;if(s)if(clearTimeout(lineTimeouts[e]),l){"true"==a.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&&(a.style.display=l?"inline":"none");c&&!l&&(o.style.display="none",s&&(a.style.strokeDasharray="100%",a.style.animation=`eraseAnimatedLine ${r/340}s linear forwards`,a.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("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,a]=e,n=configuration.elements[t];switch(o.toLowerCase()){case"error":if(console.log("Error in Override found!"),!1===a.status)return void addErrorToLog({id:t,for:`${translateWord("lbl_override")}: <b>Object</b>`,error:a.error,function:a.function});break;case"unit":!1===a.status?addErrorToLog({id:t,for:`${translateWord("lbl_override")}: <b>unit</b>`,error:a.error,function:a.function}):$(`#${t}_unit`).html(generateMultiLineText(`${t}_unit`,a,n.pos_x));break;case"append":$(`#${t}_append`).html(generateMultiLineText(`${t}_append`,a,n.pos_x));break;case"prepend":$(`#${t}_prepend`).html(generateMultiLineText(`${t}_prepend`,a,n.pos_x));break;case"value":case"bordercolor":case"borderfillcolor":case"fillcolor":break;case"img_url":let e=a;e.match(/\//)||(e=appProperties.webURL+appProperties.namespace+"/userFiles/"+e),$(`#${t}`).attr("href",e);break;case"icon":iconHandler(t,a);break;case"pos_x":case"pos_y":if(n&&"text"==n.type){const e="pos_x"==o.toLocaleLowerCase()?"x":"y";$(`#${t}`).attr(e,a)}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;default:if(!1===a.status)return void addErrorToLog({id:t,for:`${translateWord("lbl_override")}: <b>CSS</b>`,error:a.error,function:a.function});let i=a;if(i.includes("gradient")){i=generateStyleProperty(t,o,a,!1,"url");const e=new RegExp(/(line_|anim_)/gi);t.match(e)&&gradientForStraightLine(t,t.replace(e,""))}$(`#${t}`).css(o,i),n&&"text"==n.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);loadAdditionalCSSFile(appProperties.theme),appProperties.isApple&&loadAdditionalCSSFile("webkit"),!appProperties.localMode||displayMode?socket.emit("getStates",subscribeObjID,(async function(o,a){if(o)console.log(o),addToast("error",translateWord("failmsg_receiving_data"));else if(a){if(null!=a[subscribeObjID[2]]&&(appProperties.online=a[subscribeObjID[2]].val,!appProperties.online)){clearTimeout(t);return displayLoading(sprintf(translateWord("msg_instance_loading"),appProperties.instance)),addToast("error",sprintf(translateWord("failmsg_instance_offline"),appProperties.instance)),void console.error(`[Socket] Adapter instance: '${appProperties.instance}' is not started!`)}if(null!=a[subscribeObjID[0]]){console.log(`[Config] Trying to load configuration for instance ${appProperties.instance} from state!`);try{if(configuration=JSON.parse(a[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.log("[Config] "+e),basicConfig=!0,addToast("warning",1==displayMode?translateWord("failmsg_no_config_display_mode"):translateWord("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(configuration),await setLoadedConfig()):addToast("error",translateWord("failmsg_failed_config"))}))}clearTimeout(t)}else clearTimeout(t),addToast("warning",sprintf(translateWord("failmsg_instance"),appProperties.instance));if(null!=a[subscribeObjID[1]])try{if(console.log("[Config] Loading initial Data"),!a[subscribeObjID[1]].val)throw new Error("[Config] No data to display found! Please check, if layout is configured and saved properly!");refreshData(JSON.parse(a[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`)})):(configuration=localTest,configuration?(clearTimeout(t),console.log("[Config] Loading Local Config"),await setLoadedConfig()):(basicConfig=!0,addToast("warning",1==displayMode?translateWord("failmsg_no_config_display_mode"):translateWord("failmsg_no_config")))),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,a){t?o(new Error(`getStates error: ${t}`)):a?e(a):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??"",a=truncateText(o?.[e]?.val,50);$(`#stateRoot [id='${e}']`).find(".stateValue").text(`${a} ${t}`).addClass("glow")}}}function generateStateTree(e,t){const o=performance.now();$(".title.folder, .title.state").off();const a=document,n=a.createElement("div");n.id="stateRoot";let i={};const s=new Map;for(const t in e){const o=t.split(".");let r="",l=n;for(let n=0;n<o.length;n++){if(r=r?`${r}.${o[n]}`:o[n],!s.has(r)){const c=a.createElement("div");if(c.id=r,0==n)c.className="root",c.innerHTML=`<div class='title folder'><span class='type folderClosed'></span><span>${o[n]}</span></div>`;else{if(c.className="sub","state"==e[t].type&&n==o.length-1){i[r]=e[t];continue}{let a="";n>1&&(a=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[n]}</span><span>${a}</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("."),n=t.slice(0,o),d=t.slice(o+1),u=s.get(n),g=i[t];if(!u)continue;const p="object"==typeof e[t].common?.name?e[t].common.name?.[systemLang]||e[t].common.name?.en||"":e[t].common.name||"",f=a.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'>${p}</span></div><div class='title state mobile'><div class='detail'><span>${r}</span><span>${g?.type??""}</span></div><div class='detail'><span>${l}</span><span>${g?.common?.type??""}</span></div><div class='detail'><span>${c}</span><span class="stateValue"></span></div></div>`,u.appendChild(f)}a.getElementById(t).append(n),$(".title.folder").click((async function(){const e=$(this),o=e.parent(),a=e.find(".type").first(),n=a.hasClass("folderOpen");o.hasClass("root")&&a.hasClass("folderClosed")&&$("#"+t).scrollTo(o,1e3),a.toggleClass("folderOpen folderClosed"),e.siblings().not(".filter.hidden").efSlider();const i=e.siblings(".state.sub").not(".filter.hidden");n?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(),a=[],n=[];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)))&&a.push({id:t,name:o.common?.name,type:o.type})}console.debug(`[States] Found ${a.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")})),a.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&&n.push(t))})),gatherIobValues($(n)),t.style.display="none",console.debug(`[States] Rendered ${a.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={},a=[],n=[],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:"";n.push({id:o.id,text:`${truncateText($(`#${t}`).text(),30)} (${-1!=o.source?e:""} - ID: ${o.id})`})}else a.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 a=o.d.substring(1,o.d.indexOf(" "));l.push({id:`line_${o.id}`,text:`ID line_${o.id} (X: ${a})`,d:a})})),o={opt_elm_circle:i.sort(((e,t)=>parseFloat(e.y)-parseFloat(t.y))),opt_elm_ds:n.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:a.sort(((e,t)=>e.text<t.text?-1:e.text>t.text?1:0))};let g=document.createDocumentFragment();for(var p of Object.keys(o)){let e=document.createElement("optgroup");for(var f of(e.label=translateWord(p),Object.keys(o[p]))){let a=new Option(o[p][f].text,o[p][f].id);a.selected=o[p][f].id==t,e.append(a)}g.appendChild(e)}const m=document.getElementById(e);m&&(m.innerHTML="",m.append(g))}function generateSwitchSelect(e){const t=document.getElementById("elm_design");let o,a=document.createDocumentFragment();const n=Object.keys(switchLayouts);if(n.length>0)for(const t of n)o=new Option(translateWord(switchLayouts[t].description),t,!1,e==t),o.setAttribute("data-image",switchLayouts[t].symbol?switchLayouts[t].symbol:""),a.appendChild(o);t.innerHTML="",t.append(a)}function getDataSources(e,t,o=!0){let a,n=document.createDocumentFragment();if(o&&n.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(a=new Option(`${i[1].alias} (${i[1].source})`,i[0]),"object"==typeof t)for(var s in t)t[s]==i[0]&&(a.selected=!0);else a.selected=i[0]==t;n.appendChild(a)}}else a=new Option(translateWord("no_ds_added"),"-1"),a.disabled=!0,a.title=translateWord("ex_no_ds_added"),n.appendChild(a);const r=document.getElementById(e);r&&(r.innerHTML="",r.append(n))}function checkDatasourcesInUse(e){let t={},o=0;return Object.entries(configuration.elements).forEach((a=>{const[n,i]=a;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((a=>{const[n,i]=a;"boolean"!=typeof i&&i===e&&(t[o++]={id:translateWord(`lbl_consumption_${n}`).replace("*",""),type:translateWord(`lbl_consumption_${n}`).replace("*",""),reason:translateWord("failmsg_delete_source_as_consumption")}),Array.isArray(i)&&"production"==n&&-1!=i.map((e=>parseInt(e))).indexOf(e)&&(t[o++]={id:translateWord(`lbl_consumption_${n}`).replace("*",""),type:translateWord(`lbl_consumption_${n}`).replace("*",""),reason:translateWord("failmsg_delete_source_as_production")})})),Object.entries(configuration.calculation.battery).forEach((a=>{const[n,i]=a;"boolean"!=typeof i&&i==e&&(t[o++]={id:translateWord(`lbl_battery_${n}`).replace("*",""),type:translateWord(`lbl_battery_${n}`).replace("*",""),reason:translateWord("failmsg_delete_source_as_calculation")})})),Object.entries(configuration.animations).forEach((a=>{const[n,i]=a;i.source==e&&(t[o++]={id:n.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 a=e.substring(1,e.lastIndexOf("}"));socket.emit("getState",a,(function(e,a){a?(o.onload=()=>t(a.val),o.onerror=()=>t(""),null!=a.val&&""!=a.val?o.src=a.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("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 calculatePathAnimationTime(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=calculatePathAnimationTime(e),a=o/340;t.style.display="inline",t.style.strokeDasharray=o,t.style.strokeDashoffset=o,t.style.animation=`drawAnimatedLine ${a}s linear forwards`,setTimeout((()=>{t.setAttribute("data-drawn","true"),t.style.strokeDasharray="",t.style.strokeDashoffset="",t.style.animation=""}),1e3*a)}function tourNextStep(e){globalTourStep>-1&&document.querySelectorAll(".tourHighlight").forEach((e=>e.classList.remove("tourHighlight")));const t=document.getElementById("tourPreviousStep"),o=document.getElementById("tourNextStep"),a=globalTourStep+(e?1:-1);if(t.style.display=0==a?"none":"block",a<0)return;if(globalTourStep=a,globalTourStep==globalTourSteps.length)return void closeEditorContainer("tour");const n=globalTourSteps[globalTourStep];if(n.elements.forEach((e=>{const t=document.querySelector(e);t&&t.classList.add("tourHighlight")})),n.action){const e=document.querySelector(n.actionMember);"openConfig"==n.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.value=translateWord("tour_end"):o.value=translateWord("tour_nextStep"),i.querySelector("#tooltipText").innerHTML=translateWord(`tour_${n.text}`),i.querySelector("#tourSteps").innerText=sprintf(translateWord("tour_steps"),globalTourStep+1,globalTourSteps.length);const s=i.getBoundingClientRect(),r=document.querySelector(n?.alignParent?n.alignParent:n.elements[0]).getBoundingClientRect(),l="openConfig"==n.action?355:0;switch(n.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(),$("#loading").fadeIn(600).addClass("tour noText"),$("#tourContainer").css("visibility","visible").addClass("visible").removeClass("hiding");document.getElementById("tourNextStep").value=translateWord("tour_nextStep"),tourNextStep(!0)}async function setLoadedConfig(e=!1){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(await healthCheck(),appProperties.wwwExtLoaded){console.log("[Proxy] Using Icon-Proxy for Icons");const a=[],n=performance.now();$(".iconify").each((function(e){const t=$(this),o=loadIconViaProxy(t.data("icon"),t);a.push(o)})),await Promise.all(a),console.debug(`[Proxy] Icons loaded in ${performance.now()-n}ms`),startIconObserver()}else addToast("warning",translateWord("failmsg_wwwExt_disabled"));else e||(console.log("[Config] Using direct load via iconify-API!"),loadAdditionalJSFile("js/iconify.min.js"));if(e&&$("#style_user").empty(),$("#style_user").append(configuration.basic.styles),!displayMode){const i=await checkPasswordProtection();for(var t of(appProperties.isProtected=i,i&&addToast("warning",translateWord("ex_protected_warning"),"warningProtectionWarning",!0),$("#password_protection").toggle(i),$("#password_protection_tip").toggle(!i),resizeSVG(),aceCSS=ace.edit("own_css"),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(o)if("object"==typeof o)for(var a of Object.keys(configuration.basic[t]))$(`#basic\\.${t}\\.${a}`).hasClass("color")?$(`#basic\\.${t}\\.${a}`)[0].jscolor.fromString(configuration.basic[t][a]):$(`#basic\\.${t}\\.${a}`).val(configuration.basic[t][a]);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"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)}})),Object.keys(configuration.animation)))$(`#animation\\.${t}`).val(configuration.animation[t]);for(var t of Object.keys(configuration.animation_configuration))$(`#animation_configuration\\.${t}`).val(configuration.animation_configuration[t]);for(var t of Object.keys(configuration.line))$(`#line\\.${t}`).val(configuration.line[t]);for(var t of Object.keys(configuration.calculation))for(var o of Object.keys(configuration.calculation[t]))switch(o){default:getDataSources(`calculation.${t}.${o}`,configuration.calculation[t][o],!0);break;case"production":getDataSources(`calculation.${t}.${o}`,configuration.calculation[t][o],!1),$(`#calculation\\.${t}\\.${o}`).multiselect(multiselect_options);break;case"charge_prop":case"discharge_prop":case"gridFeed_prop":case"gridConsume_prop":case"batteryCharge_prop":case"batteryDischarge_prop":$(`#calculation\\.${t}\\.${o}`).prop("checked",configuration.calculation[t][o])}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"))),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 s=Object.entries(configuration.datasources).sort((([,e],[,t])=>e.alias.localeCompare(t.alias))).map((([e])=>Number(e)));for(const r of s)addDataSourceRow(r);configuration.basic.enable_ds_autocomplete&&$("#elm_ds_source").autocomplete(dataSourceAutocompleteOptions)}if(Object.hasOwn(configuration,"elements")){$(".placeholders").empty();const l={elements:[],text:[],icon:[]};for(const d in configuration.elements){const u=configuration.elements[d];"text"==u.type||"icon"==u.type?l[u.type].push({key:d,position:u.position??1/0}):l.elements.push({key:d,position:u.position??1/0})}for(const g in l)l[g].sort((function(e,t){return e.position-t.position}));for(const p in l){const f=l[p];for(let m=0;m<f.length;m++){const h=f[m].key;svgElement(configuration.elements[h])}}for(var t of Object.keys(configuration.defs))svgElement(configuration.defs[t]);const c=[];for(const b in configuration.lines){const _=configuration.lines[b];c.push({key:b,position:_.position??1/0})}c.sort((function(e,t){return e.position-t.position}));for(let y=0;y<c.length;y++){const w=c[y].key;svgElement(configuration.lines[w])}for(const v of Object.keys(configuration.animations))svgElement(configuration.animations[v]);if(updateLineAnimation(),displayMode){if(configuration.basic.background_color&&(console.debug("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").on("click",(function(){window.location.replace("configuration.html?instance="+appProperties.instance)})),$("#info_error_area").hide(),globalError=[],$("#config_link").toggle(configuration.basic.enable_config_icon),configuration.basic.enable_low_performance||"true"===appProperties.lowPerformance){console.log("[Config] Low performance mode activated!");const x=document.querySelectorAll(".type_animation"),k=-136,A=Math.abs(k)/80,C=new Map;function S(){x.forEach((e=>{if("none"===getComputedStyle(e).display)return;const t="reverse"===e.style.animationDirection;let o=C.get(e);o=t?o>=0?k:o:o<=k?0:o,e.style.strokeDashoffset=o,C.set(e,o+(t?A:-A))})),setTimeout(S,20)}x.forEach((e=>{C.set(e,0)})),setTimeout(S,20)}else $(".type_animation").addClass("animation animation_cfg");if(e){const T=copyObject(oldRefreshObj);oldRefreshObj={},refreshData(T),console.log("[Config] Applying config without re-adding socket listener!")}else displayListener()}if(basicConfig||displayMode||addToast("success",translateWord("succ_msg_loading")),!displayMode&&!appProperties.isMobile&&!configuration.basic.tourVisited)return void tourStart();setTimeout((()=>{$("#loading").fadeOut("fast")}),0)}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(){$("#style_animation").empty().append(`.line {stroke-width:${configuration.line.stroke_width}px; stroke:${configuration.line.stroke}; }`).append(`.animation {stroke:${configuration.animation.stroke}; stroke-dasharray:${configuration.animation.stroke_dasharray};`).append(`stroke-width:${configuration.animation.stroke_width}px; stroke-linecap:${configuration.animation.stroke_linecap}; }`).append(`.animation_cfg {animation-duration:${configuration.animation.animation_duration}ms; animation-timing-function:${configuration.animation.animation_timing_function}; }`),displayMode&&$("#style_animation").append(".type_animation {display: none;}")}function linePreview(e){let t="",o=136,a=parseInt($("#animation\\.stroke_width").val()),n=parseInt($("#animation_configuration\\.dots").val()),i=parseInt($("#animation_configuration\\.distance").val()),s=parseInt($("#animation_configuration\\.length").val()),r=parseInt($("#line\\.stroke_width").val()),l=parseInt($("#animation\\.animation_duration").val()),c=$("#animation\\.stroke_linecap").val(),d=$("#animation\\.animation_timing_function").val();for(let e=0;e<n;e++)i>0&&s>0&&(t+=s+" ",e!=n-1&&(t+=i+" ",o-=i),o-=s);n>0&&s>0&&i&&(t+=" "+o),o<0&&$("#"+e).val($("#"+e).val()-1),configuration.animation={stroke_dasharray:t,stroke_width:a,animation_duration:l,stroke_linecap:c,animation_timing_function:d},configuration.animation_configuration={dots:n,distance:i,length:s},configuration.line={stroke_width:r,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[,a,n]=o.split("_");a!=e&&n!=e||t.push({path:o,from:a,to:n})}return t}function checkSVGSize(e,t){function o(e,t){const o=getElementCoords(e.id),a=Number("width"===t?o.width:o.height);return("width"===t?o.x:o.y)+("circle"===o.type||"text"===o.type?a/2:a)+o.stroke}function a(e){return Object.values(configuration.elements).reduce(((t,a)=>o(a,e)>o(t,e)?a:t))}const n=a("width"),i=a("height");return{width:e>o(n,"width"),height:t>o(i,"height")}}function checkElementBounds(e,t){const o=configuration.basic,a=Number(e.stroke)/2,n="circle"==e.type||"text"==e.type?t.x-Number(e.width)/2-a:t.x-a,i=n+Number(e.width)+2*a,s="circle"==e.type||"text"==e.type?t.y-Number(e.height)/2-a:t.y-a,r=s+Number(e.height)+2*a;return{x:n>=0&&i<=o.width,y:s>=0&&r<=o.height}}function moveSVGElement(e,t){const o=configuration.elements[e.id],a="circle"==e.type?"cx":"x",n="circle"==e.type?"cy":"y",i=checkElementBounds(e,t).x,s=checkElementBounds(e,t).y;if(i&&($("#"+e.id).attr(a,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(n,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 a=configuration.elements[e];let{width:n=1,height:i=1,radius:s=0,stroke:r=0}={...a,...o},l=Number(a.pos_x),c=Number(a.pos_y),d=0,u=0,g=t?getMousePosition(t):{x:0,y:0};switch(g.x-=l,g.y-=c,r=Number(r),a.type){case"circle":n=2*s,i=n,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*a.font_size)}if(t.classList.contains("type_datasource")){const e=t.children[1].children;e.length>1&&(r+=e.length*a.font_size)}n=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:n,height:i,radius:s,stroke:r,connections:lineConnection(e),protected:a.protected||!1,group:a.group,offset:g,type:a.type}}function connectorAngle(e){return(e-90)*(Math.PI/180)}function showConnectionPoints(e=!0){const t=$("#connection_points");e?(t.empty(),$(".connector").each((function(){const e=this.id,o={};o[e]={};const a=$(this).prop("tagName").toLowerCase();let n=function(e,t){if("circle"===t){const t=parseInt(e.attr("r"));return{r:t,cx:parseInt(e.attr("cx")),cy:parseInt(e.attr("cy")),width:2*t,height:2*t,x:parseInt(e.attr("cx"))-t,y:parseInt(e.attr("cy"))-t}}if("rect"===t)return{width:parseInt(e.attr("width")),height:parseInt(e.attr("height")),x:parseInt(e.attr("x")),y:parseInt(e.attr("y"))}}($(this),a);"circle"===a?function(e,{cx:t,cy:o,r:a}){const n=["top_left","top_right","right_top","right_bottom","bottom_left","bottom_right","left_bottom","left_top"];[340,20,70,110,200,160,250,290].forEach(((i,s)=>{e[n[s]]={x:t+a*Math.cos(connectorAngle(i)),y:o+a*Math.sin(connectorAngle(i))}}))}(o[e],n):"rect"===a&&function(e,{width:t,height:o,x:a,y:n}){e.top_left={x:a+t/2-20,y:n},e.top_right={x:a+t/2+20,y:n},e.left_top={x:a,y:n+o/2-20},e.left_bottom={x:a,y:n+o/2+20},e.right_top={x:a+t,y:n+o/2-20},e.right_bottom={x:a+t,y:n+o/2+20},e.bottom_left={x:a+t/2-20,y:n+o},e.bottom_right={x:a+t/2+20,y:n+o}}(o[e],n),function(e,{width:t,height:o,x:a,y:n}){e.top={x:a+t/2,y:n},e.left={x:a,y:n+o/2},e.right={x:a+t,y:n+o/2},e.bottom={x:a+t/2,y:n+o}}(o[e],n),function(e,t,o){Object.entries(e).forEach((([e,a])=>{const n=document.createElementNS("http://www.w3.org/2000/svg","circle");n.setAttribute("class","connPoints clickable"),n.setAttribute("cx",a.x),n.setAttribute("cy",a.y),n.setAttribute("r",5),n.setAttribute("data-slot",e),n.setAttribute("data-element",t),o.append(n)}))}(o[e],e,t)}))):t.empty()}function getSlots(e){const t=Math.floor(e.width/2),o=Math.floor(e.height/2),a=Math.floor(e.stroke/2);return{top:{x:e.cx?e.cx:e.x+t,y:e.cy?e.cy-t-a:e.y-a,direction:"vertical"},right:{x:e.cx?e.cx+t+a:e.x+e.width+a,y:e.cy?e.cy:e.y+o,direction:"horizontal"},bottom:{x:e.cx?e.cx:e.x+t,y:e.cy?e.cy+t+a:e.y+e.height+a,direction:"vertical"},left:{x:e.cx?e.cx-t-a:e.x-a,y:e.cy?e.cy:e.y+o,direction:"horizontal"}}}function getSpecialSlots(e,t){const o=Math.floor(e.width/2),a=Math.floor(e.height/2),n=Math.floor(e.stroke/2);let i=getSlots(e);return e.radius>0?(i.top_left={x:e.cx+e.radius*Math.cos(connectorAngle(340)),y:e.cy+e.radius*Math.sin(connectorAngle(340))-n,direction:"vertical"},i.top_right={x:e.cx+e.radius*Math.cos(connectorAngle(20)),y:e.cy+e.radius*Math.sin(connectorAngle(20))-n,direction:"vertical"},i.right_top={x:e.cx+e.radius*Math.cos(connectorAngle(70))+n,y:e.cy+e.radius*Math.sin(connectorAngle(70)),direction:"horizontal"},i.right_bottom={x:e.cx+e.radius*Math.cos(connectorAngle(110))+n,y:e.cy+e.radius*Math.sin(connectorAngle(110)),direction:"horizontal"},i.bottom_left={x:e.cx+e.radius*Math.cos(connectorAngle(200)),y:e.cy+e.radius*Math.sin(connectorAngle(200))+n,direction:"vertical"},i.bottom_right={x:e.cx+e.radius*Math.cos(connectorAngle(160)),y:e.cy+e.radius*Math.sin(connectorAngle(160))+n,direction:"vertical"},i.left_bottom={x:e.cx+e.radius*Math.cos(connectorAngle(250))-n,y:e.cy+e.radius*Math.sin(connectorAngle(250)),direction:"horizontal"},i.left_top={x:e.cx+e.radius*Math.cos(connectorAngle(290))-n,y:e.cy+e.radius*Math.sin(connectorAngle(290)),direction:"horizontal"}):(i.top_left={x:e.x+o-20,y:e.y-n,direction:"vertical"},i.top_right={x:e.x+o+20,y:e.y-n,direction:"vertical"},i.right_top={x:e.x+e.width+n,y:e.y+a-20,direction:"horizontal"},i.right_bottom={x:e.x+e.width+n,y:e.y+a+20,direction:"horizontal"},i.bottom_left={x:e.x+o-20,y:e.y+e.height+n,direction:"vertical"},i.bottom_right={x:e.x+o+20,y:e.y+e.height+n,direction:"vertical"},i.left_top={x:e.x-n,y:e.y+a-20,direction:"horizontal"},i.left_bottom={x:e.x-n,y:e.y+a+20,direction:"horizontal"}),{spec:i[t]}}async function connectElements(e){return new Promise(((t,o)=>{const a=$(".line:not(.faded_out, .preview)");let n,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}`).val(translateWord("value_cancel")),"connect_elements"==e&&hideConfigBar(),showConnectionPoints(),hideCoordinates(),$(`#ex_${e}`).html("connect_elements"==e?`${translateWord("ex_connect_ref")} <a href="javascript:void(0)" class="help" data-help="help_connect" style="vertical-align: top;">\n <span class="iconify" data-icon="material-symbols-light:help-outline-rounded" data-width="32" data-height="32"></span>\n </a>`: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&&($("#"+a[0].id+", #"+a[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==n)n=l,s=c,$(`#ex_${e}`).html(translateWord("ex_connect_start")),$(this).addClass("red");else if(n==l)$(`#ex_${e}`).html(translateWord("ex_connect_same")),i=null,r=null;else{i=l,r=c;const o=`path_${n}_${i}`;if(Object.hasOwn(configuration.defs,`path_${n}_${i}`)||Object.hasOwn(configuration.defs,`path_${i}_${n}`))if("connect_elements"==e)addToast("warning",translateWord("failmsg_conn_exists"));else{const e=copyObject(configuration.defs[o]),t=copyObject(configuration.lines["line_"+o]),a=copyObject(configuration.animations["anim_"+o]);configuration.defs[o].startSlot=s,configuration.defs[o].endSlot=r;const l=calculatePath(o,n,i);configuration.defs[o].d=l,$(`#${o}`).attr("d",l),saveUndoStep("change",{animation:a,def:e,line:t},{animation:a,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,n,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==a.length){let e=a[0].id,t=a[0].id.replace("line_",""),l=a[0].id.replace("line","anim");configuration.defs[o]={...configuration.defs[t],id:o,startSlot:s,endSlot:r},configuration.defs[o].d=calculatePath(o,n,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),n=null,i=null,$(`#${e}`).val("connect_elements"==e?translateWord("value_connect"):translateWord("value_reconnect")).removeClass("red"),$(`#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}`).val("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")),console.debug("Text copied to clipboard via Clipboard API!")})).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 a=getRandomInt(55);$(`<div id="tmpDiv_${a}" class="tmpDiv" />`).appendTo("body"),$(`#tmpDiv_${a}`).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_${a}`),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",click:function(){copyToClipboard(t.getValue())}},{text:translateWord("btn_close"),class:"input_button",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=document.getElementById(e);let a=0,n=0;if(o){if("svg"===o.tagName.toLowerCase()){const e=parseFloat(o.getAttribute("x"))||0,t=parseFloat(o.getAttribute("y"))||0;a=e+(parseFloat(o.getAttribute("width"))||0)/2,n=t+(parseFloat(o.getAttribute("height"))||0)/2}else{const e=o.getBBox();a=e.x+e.width/2,n=e.y+e.height/2}}return{angle:Math.max(0,Math.min(t,360)),cx:a,cy:n}}function calculatePath(e,t,o){function a(e,t){const o=Math.abs(e.x-t.x),a=Math.abs(e.y-t.y);return Math.sqrt(o*o+a*a)}let n,i,s=getElementCoords(t),r=getElementCoords(o),l=configuration.defs[e].startSlot,c=configuration.defs[e].endSlot;n="element"!=l?getSpecialSlots(s,l):getSlots(s),i="element"!=c?getSpecialSlots(r,c):getSlots(r);let d=1/0,u={};for(const e of Object.keys(n))for(const t of Object.keys(i)){const o=a(n[e],i[t]);o<d&&(d=o,u={start:n[e],end:i[t]})}return generatePath(e,u.start.x,u.start.y,u.end.x,u.end.y,u.start.direction,u.end.direction,l,c)}function polarToCartesian(e,t,o,a){const n=(a-90)*Math.PI/180;return{x:e+o*Math.cos(n),y:t+o*Math.sin(n)}}function generatePath(e,t,o,a,n,i,s,r,l){let c={x:t,y:o},d=[`M${t} ${o}`];const u=Math.abs(a-t),g=Math.abs(n-o);let p=.2;configuration.defs[e].line_arc&&(p=parseFloat(configuration.defs[e].line_arc)/100);let f=15;function m(e){d.push(`H ${e}`),c.x=e}function h(e){d.push(`V ${e}`),c.y=e}function b(e,t,o,a,n,i){const s=polarToCartesian(e,t,o,n),r=n-a<=180?"0":"1";return c.x=s.x,c.y=s.y,`A ${o} ${o} 0 ${r} ${i} ${s.x} ${s.y}`}function _(e){switch(e){case"right_down":d.push(b(c.x,c.y+f,f,0,90,1));break;case"right_up":d.push(b(c.x,c.y-f,f,0,90,0));break;case"down_left":d.push(b(c.x,c.y+f,f,180,270,1));break;case"down_right":d.push(b(c.x,c.y+f,f,0,90,0));break;case"up_left":d.push(b(c.x-2*f,c.y-f,f,0,90,0));break;case"up_right":d.push(b(c.x,c.y-f,f,0,90,1));break;case"left_down":d.push(b(c.x,c.y+f,f,180,270,0));break;case"left_up":d.push(b(c.x,c.y-f,f,180,270,1))}}return configuration.defs[e].line_radius&&(f=parseFloat(configuration.defs[e].line_radius)),u>0&&u<2*f&&(f=Math.floor(u/2)),g>0&&g<2*f&&(f=Math.floor(g/2)),n==o&&(r==l&&"element"!=r&&"element"!=l?(f=Math.max(f,4),"right"!=r&&"left"!=r||m(a),"top"==r&&(h(o-Math.max(g*p,2)),a>t?(_("up_right"),m(a-f),_("right_down")):(console.log("Here"),_("up_left"),m(a+f),_("left_down")),h(n)),"bottom"==r&&(h(o+Math.max(g*p,2)),a>t?(_("down_right"),m(a-f),_("right_up")):(_("down_left"),m(a+f),_("left_up")),h(n))):m(a)),a===t&&(r==l&&"element"!=r&&"element"!=l?(f=Math.max(f,4),"top"!=r&&"bottom"!=r||h(n),"left"==r&&(m(t-Math.max(u*p,2)),n>o?(_("left_down"),h(n-f),_("down_right")):(_("left_up"),h(n+f),_("up_right"))),"right"==r&&(m(a+Math.max(u*p,2)),n>o?(_("right_down"),h(n-f),_("down_left")):(_("right_up"),h(n+f),_("up_left"))),m(a)):h(n)),n>o&&a>t&&("horizontal"==i?"horizontal"==s?(r==l&&"element"!=r&&"element"!=l?(f=Math.max(f,4),"left"==r&&(m(t-Math.max(u*p,2)),_("left_down"),h(n-f),_("down_right")),"right"==r&&(console.log("Here right"),m(a+Math.max(u*p,2)),_("right_down"),h(n-f),_("down_left"))):(m(t+Math.max(u*p,2)),_("right_down"),h(n-f),_("down_right")),m(a)):(m(a-f),_("right_down"),h(n)):"vertical"==s?r==l&&"element"!=r&&"element"!=l?(f=Math.max(f,4),"top"==r&&(h(o-Math.max(g*p,2)),_("up_right"),m(a-f),_("right_down")),"bottom"==r&&(h(n+Math.max(g*p,2)),_("down_right"),m(a-f),_("right_up")),h(n)):(h(o+Math.max(g*p,2)),_("down_right"),m(a-f),_("right_down"),h(n)):(h(n-f),_("down_right"),m(a))),n>o&&a<t&&("horizontal"==i?"horizontal"==s?(r==l&&"element"!=r&&"element"!=l?(f=Math.max(f,4),"left"==r&&(m(a-Math.max(u*p,2)),_("left_down"),h(n-f),_("down_right")),"right"==r&&(m(t+Math.max(u*p,2)),_("right_down"),h(n-f),_("down_left"))):(m(t-Math.max(u*p,2)),_("left_down"),h(n-f),_("down_left")),m(a)):(m(a+f),_("left_down"),h(n)):"vertical"==s?r==l&&"element"!=r&&"element"!=l?(f=Math.max(f,4),"top"==r&&(h(o-Math.max(g*p,2)),_("up_left"),m(a+f),_("left_down")),"bottom"==r&&(h(n+Math.max(g*p,2)),_("down_left"),m(a+f),_("left_up")),h(n)):(h(o+Math.max(g*p,2)),_("down_left"),m(a+f),_("left_down"),h(n)):(h(n-f),_("down_left"),m(a))),n<o&&a>t&&("horizontal"==i?"horizontal"==s?(r==l&&"element"!=r&&"element"!=l?(f=Math.max(f,4),"left"==r&&(m(t-Math.max(u*p,2)),_("left_up"),h(n+f),_("up_right")),"right"==r&&(m(a+Math.max(u*p,2)),_("right_up"),h(n+f),_("up_left"))):(m(t+Math.max(u*p,2)),_("right_up"),h(n+f),_("up_right")),m(a)):(m(a-f),_("right_up"),h(n)):"vertical"==s?r==l&&"element"!=r&&"element"!=l?(f=Math.max(f,4),"top"==r&&(h(n-Math.max(g*p,2)),_("up_right"),m(a-f),_("right_down")),"bottom"==r&&(h(o+Math.max(g*p,2)),_("down_right"),m(a-f),_("right_up")),h(n)):(h(o-Math.max(g*p,2)),_("up_right"),m(a-f),_("right_up"),h(n)):(h(n+f),_("up_right"),m(a))),n<o&&a<t&&("horizontal"==i?"horizontal"==s?(r==l&&"element"!=r&&"element"!=l?(f=Math.max(f,4),"left"==r&&(m(a-Math.max(u*p,2)),_("left_up"),h(n+f),_("up_right")),"right"==r&&(m(t+Math.max(u*p,2)),_("right_up"),h(n+f),_("up_left"))):(m(t-Math.max(u*p,2)),_("left_up"),h(n+f),_("up_left")),m(a)):(m(a+f),_("left_up"),h(n)):"vertical"==s?r==l&&"element"!=r&&"element"!=l?(f=Math.max(f,4),"top"==r&&(h(n-Math.max(g*p,2)),_("up_left"),m(a+f),_("left_down")),"bottom"==r&&(console.log("working on here"),h(o+Math.max(g*p,2)),_("down_left"),m(a+f),_("left_up")),h(n)):(h(o-Math.max(g*p,2)),_("up_left"),m(a+f),_("left_up"),h(n)):(h(n+f),_("up_left"),m(a))),d.join(" ")}function showConfigBar(e,t,o="tab1"){if(!t)return void console.debug(`Current Element is invalid, as it has type ${t}! `);const a=$("#config_bar").children(".tabbed").find(".noStack");if(a.show(),$(".tab1_config").scrollTop(0),$(".tab2_config").scrollTop(0),$(`#${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(){$(".added_elements").removeClass("draggable-multi"),showConfigBar([$(this).val()],$("#"+$(this).val()).prop("tagName")),hideCoordinates()})),$(".elm_config, #reconnect_elements, #delete_element, #elm_degree, #elm_degree_slider").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),$("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(){y(this.id,"color","")}));let n="use"==t?{animation:e[0].replace("line","anim"),def:e[0].replace("line_",""),line:e[0]}:{};const i=copyObject("use"==t?configuration.animations[n.animation]:configuration.elements[e[0]]),s=e.length>1;if(!s){const o=$(`#${e[0]}`),a=o.index(),i=o.siblings().length+1;"use"==t?configuration.lines[n.line].position!==a&&(console.debug(`[Layout] Element has no/invalid position. Correcting to ${a+1}!`),configuration.lines[n.line].position=a):configuration.elements[e[0]].position!==a&&(console.debug(`[Layout] Element has no/invalid position. Correcting to ${a+1}!`),configuration.elements[e[0]].position=a),$("#elm_pos").text(sprintf(translateWord("title_arrange_pos"),a+1,i))}const r="use"==t?configuration.animations[n.animation]:configuration.elements[e[0]],l="use"==t?copyObject(configuration.lines[n.line]):{},c="use"==t?copyObject(configuration.defs[n.def]):{};let d,u,g,p,f=null,m=!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(),s?$(".text_not_ds").hide():$(".text_not_ds").show(),"datasource"==r.subType)switch($(".elm_config_box.datasource").show(),$(".text_not_ds, .text_only").hide(),getDataSources("elm_subtract",r.subtract,!1),getDataSources("elm_add",r.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",r.source_action,!0),r.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(),console.debug(`Init: ${JSON.stringify(n)}`),getDataSources("elm_animation",r.source,!0),$("#elm_start_slot").val("element"==configuration.defs[n.def].startSlot?translateWord("value_element"):translateWord("value_"+configuration.defs[n.def].startSlot)),$("#elm_end_slot").val("element"==configuration.defs[n.def].endSlot?translateWord("value_element"):translateWord("value_"+configuration.defs[n.def].endSlot)),l.color&&l.color.includes("gradient")?y("elm_line_color","gradient",l.color):$("#elm_line_color")[0].jscolor.fromString(l.color),l.shadow&&l.shadow.includes("gradient")?y("elm_shadow","gradient",l.shadow):$("#elm_shadow")[0].jscolor.fromString(l.shadow||""),$("#elm_url").val(l.url),$("#elm_frame").val(l.frame||"_overlay"),$("#elm_line_arc").val(c.line_arc||20),$("#elm_line_radius").val(c.line_radius||15),$("#"+e[0]).removeClass("faded_out");break;case"icon":case"svg":if("svg"==r.subType)$(".elm_config_box.svg").show();else if("switch"==r.subType){generateSwitchSelect(r.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(r.color_on||""),$("#elm_fill_on")[0].jscolor.fromString(r.fill_on||""),$(".elm_config_box.switch, #sub_switchInfo").show();const e=switchLayouts[r.design];e.text?($(".switchNoIcon, #sub_SwitchBox").show(),$("#elm_text_on")[0].jscolor.fromString(r.text_on||"#FFF"),$("#elm_text_off")[0].jscolor.fromString(r.text_off||"#a35353")):e.icon&&!e.own?$(".switchNoIcon, #sub_SwitchBox").hide():e.own?($("#elm_icon_off").val(r.icon_off||e.icon_off),$("#elm_icon_on").val(r.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(Object.entries(r).forEach((e=>{const[o,a]=e;if("object"==typeof a&&a&&"clock"===o)for(var n of Object.keys(r[o]))$(`#elm_${o}\\.${n}`).val(r[o][n]);switch(o){case"color":case"fill":case"fill_value":case"border_value":case"border_reverse_value":case"shadow":a&&(a.includes("gradient")?(y(`elm_${o}`,"gradient",a),"rect"!=t&&"circle"!=t||"color"!=o||(y("elm_border_value_fill","gradient",r.color,{background:parseColorString(r.color),color:"transparent"}),$("#elm_border_value_fill").prop("disabled",!0))):($(`#elm_${o}`)[0].jscolor.fromString("none"==a||""==a?"":a),"rect"!=t&&"circle"!=t||"color"!=o||$("#elm_border_value_fill").prop("disabled",!0)[0].jscolor.fromString(r.color)));break;default:$(`#elm_${o}`).val(a)}"degree"==o&&$("#elm_degree_slider").val(a||0),"boolean"==typeof a&&$(`#elm_${o}`).prop("checked",!0===a)})),-1!=r.fill_type&&r.fill_type&&($("#sub_FillType").show(),"value"==r.fill_type&&$("#sub_FillTypeValue").show()),r.border_type&&-1!=r.border_type&&($("#sub_BorderType, #sub_BorderTypeExplain").show(),"value"==r.border_type&&$("#sub_BorderTypeValue").show()),r.border_reverse&&$(".border_reverse_value").show(),r.enable_clock&&($("#sub_enableClock").show(),$("#elm_text").prop("disabled",!0)),r.animation_type&&-1!=r.animation_type&&($("#sub_AnimPower").show(),"dots"==r.animation_type?$("#sub_AnimDots").show():$("#sub_AnimDuration").show()),(r.frame_width||r.frame_height)&&($("#elm_frame_userDefined").prop("checked",!0),$("#sub_FrameUserDefinedSettings").show()),"_self"!=r.frame&&$("#sub_FrameUserDefined").show(),getDataSources("elm_source",r.source,!0),r.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 h(e,t,o){"animation"==r.type?saveUndoStep("change",{animation:i,def:c,line:l},{animation:copyObject(configuration.animations[r.id]),def:copyObject(configuration.defs[c.id]),line:copyObject(configuration.lines[l.id])},m):s?(saveUndoStep("changeStack",t,o,m),console.log(`Saved ${t.length} elements for Undo! Update: ${m}`)):t&&o?saveUndoStep("change",t,o,m):saveUndoStep("change",[i],[copyObject(configuration.elements[e])],m),s||console.debug(`Element ${e} (${r.type}) saved for undo! Update: ${m}`),m||(m=!0)}function b(e){if(""===(e=e.trim()))return null;let t=Number(e);return Number.isFinite(t)?t:null}async function _(o){if("focus"==o.type)return void(g=this.value);if("blur"==o.type)return void("number"!=this.type||(o.target.id.includes("degree")||null!=b(this.value))&&this.value==g||(this.value=g,clearTimeout(p),p=setTimeout((()=>{this.focus(),this.select(),addToast("warning",translateWord("toast_warning_invalidValue"),"warningValueRestored",!0)}),200)));let a;switch(this.type){case"textarea":case"url":case"text":a=this.value;break;case"select-multiple":a=$(this).val().map((e=>parseInt(e)));break;case"select-one":a=b(this.value)?parseInt(this.value):this.value;break;case"range":case"number":if(null==b(this.value))return;a=parseFloat(this.value);break;case"checkbox":a=this.checked}if(a==d&&u==o.target.id)return;u=o.target.id,d=a,configuration.basic.enable_hide_configbar&&($("#config_bar").css("backgroundColor","transparent"),$(".detail_box").not($(this).parent().closest(".detail_box")).css("opacity",.1),clearTimeout(f),f=setTimeout((()=>{$(".detail_box").css("opacity",1),$("#config_bar").css("backgroundColor","var(--white)")}),600)),globalConfigChanged=!0;const i=o.target.id.replace("elm_","");let s="general";switch(($(this).hasClass("color")||$(this).hasClass("style"))&&(s="style"),$(this).hasClass("attribute")&&(s="attribute"),i){case"animation_type":"dots"==a?($("#sub_AnimDuration").hide(),$("#sub_AnimDots, #sub_AnimPower").slideDown("slow")):"duration"==a?($("#sub_AnimDots").hide(),$("#sub_AnimDuration, #sub_AnimPower").slideDown("slow")):$("#sub_AnimDuration, #sub_AnimDots, #sub_AnimPower").slideUp("slow");break;case"fill_type":-1==a?$("#sub_FillType, #sub_FillTypeValue").slideUp("slow"):($(".tab2_config").scrollTo($(this).parent().closest(".detail_box"),1e3,0),$("#sub_FillType").slideDown("slow"),$("#elm_fill_direction").val(r.fill_direction||90).trigger("change"),"value"==a?$("#sub_FillTypeValue").slideDown("slow"):$("#sub_FillTypeValue").slideUp("slow"));break;case"border_type":-1==a?$("#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(r.border_start||180).trigger("change"),$("#elm_border_direction").val(r.border_direction||"cw").trigger("change"),$("#elm_border_style").val(r.border_style||"round").trigger("change"),$("#elm_border_reverse").prop("checked",r.border_reverse).trigger("change"),"value"==a?$("#sub_BorderTypeValue").slideDown("slow"):$("#sub_BorderTypeValue").slideUp("slow"));break;case"border_reverse":a?$(".border_reverse_value").slideDown("slow"):$(".border_reverse_value").slideUp("slow");break;case"source_display":switch(a){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(a){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(r,"action_type")?r.action_type:"number"),Object.hasOwn(r,"action_type")||(r.action_type="number"),$("#elm_action_display").val(Object.hasOwn(r,"action_display")?r.action_display:"button"),Object.hasOwn(r,"action_display")||(r.action_display="button"),$("#elm_action_display_freeform").prop("checked",!Object.hasOwn(r,"action_display_freeform")||r.action_display_freeform),Object.hasOwn(r,"action_display_freeform")||(r.action_display_freeform=!0)}break;case"enable_clock":a?($("#sub_enableClock").slideDown("slow"),$(".tab1_config").scrollTo($(this).parent().closest(".detail_box"),1e3,0)):$("#sub_enableClock").slideUp("slow"),$("#elm_text").prop("disabled",a);break;case"color":"rect"!=t&&"circle"!=t||(a.includes("gradient")?(console.log(a),y("elm_border_value_fill","gradient",a,{background:parseColorString(a),color:"transparent"}),$("#elm_border_value_fill").prop("disabled",!0)):(y("elm_border_value_fill","color",a),$("#elm_border_value_fill").prop("disabled",!0)[0].jscolor.fromString(a)));break;case"frame":$(".tab2_config").scrollTo($(this).parent().closest(".detail_box"),1e3,0),"_overlay"==a?$("#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",a);break;case"design":{$(".tab1_config").scrollTo($(this).parent().closest(".elm_config_box.switch").prev(),1e3,0);const e=switchLayouts[a];e.text?($("#sub_SwitchBoxOwnStyle").slideUp("slow"),$(".switchNoIcon, #sub_SwitchBox").slideDown("slow"),$("#elm_text_on")[0].jscolor.fromString(r.text_on||"#FFF"),$("#elm_text_off")[0].jscolor.fromString(r.text_off||"#a35353")):e.icon&&!e.own?$(".switchNoIcon, #sub_SwitchBox,#sub_SwitchBoxOwnStyle").slideUp("slow"):e.own?($("#elm_icon_on").val(r.icon_on?r.icon_on:e.icon_on),$("#elm_icon_off").val(r.icon_off?r.icon_off:e.icon_off),$(".switchNoIcon, #sub_SwitchBox").slideUp(),$("#sub_SwitchBoxOwnStyle").slideDown()):($(".switchNoIcon").slideDown("slow"),$("#sub_SwitchBox, #sub_SwitchBoxOwnStyle").slideUp("slow"));break}}switch(s){case"attribute":{const t=[],o=[];let n=!0;const l=[];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())}),c={x:"pos_x"==i?a:e.x,y:"pos_y"==i?a:e.y},d=checkElementBounds(e,c);if(!d.x||!d.y){n=!1;break}{t.push(copyObject(configuration.elements[o])),l.push({id:o,type:r.type,action:s,value:a,source:i,payload:{elmProp:e,coords:c}});const d=e.group;if(null!=d&&d>=0&&["pos_x","pos_y"].includes(i)){const r=getElementsByGroup(d);addToast("info",translateWord("toast_info_modifyGroups"),"infoModifyGroups");const c="pos_x"==i?a-e.x:0,u="pos_y"==i?a-e.y:0;for(const e of r){if(e==o)continue;const a=getElementCoords(e),r={x:a.x+c,y:a.y+u},d="pos_x"==i?r.x:r.y,g=checkElementBounds(a,r);if(!g.x||!g.y){n=!1;break}t.push(copyObject(configuration.elements[e])),l.push({id:e,type:a.type,action:s,value:d,source:i,payload:{elmProp:a,coords:r}})}}}}if(n){g=a;for(const e of l){const t=await changeElementProperties(e);o.push(copyObject(t))}h(e[0],t,o)}break}case"style":case"general":{const t=[],o=[];if("animation"!=r.type)for(const n of e){t.push(copyObject(configuration.elements[n]));const e=await changeElementProperties({id:n,type:r.type,action:s,value:a,source:i,payload:{}});o.push(copyObject(e))}else changeElementProperties({id:e[0],type:r.type,action:s,value:a,source:i,payload:n});g=a,h(e[0],t,o);break}}$(this).hasClass("elm_config_update")&&w()}function y(e,t,o,a={}){let n=$(`<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",_);if("color"==t&&(n.attr("data-jscolor","{}").addClass("color").removeClass("style").data("current-color",o),$(`#${e}`).next(".icon_wrapper").remove()),"gradient"==t&&(n.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}`)),a&&n.css(a),$(`#${e}`).replaceWith(n),"color"==t){const t=document.querySelector(e);jscolor.install(t)}console.debug(`Setting ${e} to ${t}!`),$(`#${e}`).parent("div").next("div").children("input.color_change").val(translateWord(`value_color_change_${t}`))}function w(){if("datasource"!=r.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],a=t.data.override[e[0]][o];if(!1===a?.status){let e="<b>"+translateWord("failmsg_apply_override")+"</b>";return e+="<br>"+a.error,void addToast("error",e)}}refreshData(t.data,!0),""!=t.data.unit[e[0]]&&$("#elm_unit").val(t.data.unit[e[0]]).trigger("change")}}))}else console.log("Source option is own text! Not requesting!")}s?(a.hide(),$("#config_bar>.title>span").text(translateWord("lbl_config_config_stack"))):$("#config_bar>.title>span").text(translateWord("lbl_config_config")),$("#config_bar").addClass("show"),$("#delete_element").off().click((function(){deleteElements(n?.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,a=t.next(),n=t.prev();switch($(this).attr("id")){case"changeOrder_foreground":if(!(a.length>0))return void addToast("info",translateWord("failmsg_max_foreground"));t.insertAfter(a);break;case"changeOrder_background":if(!(n.length>0))return void addToast("info",translateWord("failmsg_max_background"));t.insertBefore(n)}addToast("info",translateWord("toast_info_foreBackground"),"infoForeBackground");t.parent().children().each((function(){const e=this.id,t=$(this).index();if("animation"===r.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)),h(e[0])})),$("#preview_switch").off().click((function(){toggleSwitch(e[0],0,!0)})),$(".elm_config").off().on("input change focus blur iconselectmenuchange",_),$(".color_change").off().on("click",(function(){const e=$(this).parent("div").prev("div").children(".color, .style"),t=e.attr("id");t&&y(t,e.data("jscolor")?"gradient":"color",e.val())})),$("#reconnect_elements").off().on("click",(async function(){const e=await connectElements(this.id);"Aborted"!=e&&(n={animation:e.replace("line","anim"),def:e.replace("line_",""),line:e},console.debug(`After reconnect: ${JSON.stringify(n)}`),getElements("elm_select",n.line),$("#elm_select").selectmenu("refresh"),$(`#${n.line}`).addClass("active_element"),$("#elm_start_slot").val("element"==configuration.defs[n.def].startSlot?translateWord("value_element"):translateWord("value_"+configuration.defs[n.def].startSlot)),$("#elm_end_slot").val("element"==configuration.defs[n.def].endSlot?translateWord("value_element"):translateWord("value_"+configuration.defs[n.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,_.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,((a,n)=>{n?(console.debug(`[PreviewElement] Pulled value from ioBroker: ${n.val}`),e(n.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 a=getRandomInt(55);$(`<div id="tmpDiv_${a}" class="tmpDiv" />`).appendTo("body");let n=o.type,i=o.stroke,s=i+("rect"==n?o.width:2*o.radius),r=i+("rect"==n?o.height:2*o.radius);null!=e&&$(`#tmpDiv_${a}`).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_${a}' width='${s}' height='${r}' style='width:100%;height:100%;display:block;' />`));let l=Object.assign({},o);l.pos_x=4+i/2+("rect"==n?0:s/2-i/2),l.pos_y=4+i/2+("rect"==n?0:r/2-i/2),l.id=`p${a}`;let c=await svgElement(l,!1,!0);$(c).appendTo($(`#preview_${a}`));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${a}`,d||getRandomRGBA(),o.fill,o.fill_direction),updateSingleGradient(`p${a}`,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${a}`,"fill",d,!0);const t=document.getElementById(`gradient_p${a}_fill`),n=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${a}_fill_transparent`),i.setAttribute("offset","0%"),i.setAttribute("stop-color",n),t.appendChild(i),t.setAttribute("gradientTransform","rotate("+o.fill_direction+",0.5,0.5)"),updateMultiGradient(`p${a}`,e||33,o.fill_max,o.fill_type),console.log(`[Config] Multi-Fill-Gradient added for: p${a}`)}break;case"preview_element_border":const t=generateStyleProperty(`p${a}`,"stroke",d||getRandomRGBA(),!1,"url");addBorderFill(`p${a}`,t,o),updateBorderFill(`p${a}`,e||33,o.border_value_fill,o)}},buttons:[{text:translateWord("btn_close"),class:"input_button",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 a="use"==t?configuration.lines[n.line]:configuration.elements[e[0]];switch(o.target.id){case"preview_action_url":""!=a.url&&null!=a.url?actionForElement(e[0],o,"url"):addToast("warning",translateWord("failmsg_preview_element_no_url"));break;case"preview_action_click":a.source>=0&&Object.hasOwn(configuration.datasources,a.source)||a.source_action>=0&&Object.hasOwn(configuration.datasources,a.source_action)?"none"==a.action||null==a.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:"all_datasource ds_buttons btn-update"}).append($("<span>",{class:"iconify","data-height":"24","data-icon":"mdi:check"})),o=$("<button>",{class:"all_datasource ds_buttons btn-cancel"}).append($("<span>",{class:"iconify red_icon","data-height":"24","data-icon":"mdi:close"})),a=$("<button>",{class:"all_datasource ds_buttons btn-edit"}).append($("<span>",{class:"iconify","data-height":"24","data-icon":"mdi:pencil"})),n=$("<button>",{class:"all_datasource 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:"all_datasource 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,a,n,i),l=$("<tr>").append($("<td>").text(r.shortcuts[e].alias),$("<td>").text(r.shortcuts[e].value),s).data({id:e,alias:r.shortcuts[e].alias,value:r.shortcuts[e].value});$("#shortcut-table tbody").append(l)};$("#frm-addQuickAccess").off().submit((function(o){o.preventDefault();let a=0;Object.hasOwn(r,"shortcuts")?a=Object.keys(r.shortcuts).length>0?Math.max(...Object.keys(r.shortcuts).map((e=>e)))+1:0:r.shortcuts={},r.shortcuts[a]={alias:$("#shortcut_alias").val(),value:$("#shortcut_value").val()},$("#shortcut-table tbody").children().length>0&&$("#shortcut_tmp_line").hide(),t(a),h(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"),a=$("<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")),n=$("<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(a),e.find("td:eq(1)").empty().append(n),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();r.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(r,"shortcuts"))if(Object.keys(r.shortcuts).length>0){$("#shortcut_tmp_line").hide();const o=Object.entries(r.shortcuts).sort((([,e],[,t])=>e.alias.toLowerCase()<t.alias.toLowerCase()?-1:e.alias.toLowerCase()>t.alias.toLowerCase()?1:0));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",click:function(){const t=$("#shortcut-table tbody tr.deleted");t.length>0&&(h(e[0]),t.each((function(){delete r.shortcuts[$(this).data("id")]})),globalConfigChanged=!0),$(this).dialog("close")}}]})})),$(".override_settings").off().on("click",(function(t){let o,a=!1;switch(t.target.id){case"override_settings":o="animation"==r.type?configuration.lines[n.line].override:r.override;break;case"override_settings_animation":o=configuration.animations[n.animation].override}aceOverride.setValue(JSON.stringify(o,void 0,4),-1),$("#loading").fadeIn(600).addClass("noText"),$("#codeEditorContainer").css("visibility","visible").addClass("visible"),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(){a=!0})),$("#save_code").off().on("click",(function(){if(a){const o=aceOverride.getValue()?JSON.parse(aceOverride.getValue()):{};switch(t.target.id){case"override_settings":"animation"==r.type?configuration.lines[n.line].override=o:(r.override=o,w());break;case"override_settings_animation":configuration.animations[n.animation].override=o}h(e[0])}closeEditorContainer("codeEditor"),globalConfigChanged=!0}))})),$("#export_element").off().on("click",(function(){exportElement(e[0])})),$("#overrideFormatCode").off().on("click",(function(e){try{aceOverride.setValue(JSON.stringify(JSON.parse(aceOverride.getValue()),void 0,4),-1)}catch(e){addToast("warning",translateWord("msg_json_malformmated"))}})),$(".form_label").removeClass("form_label").addClass("form_label")}function changeElementProperties({id:e,type:t,action:o,value:a,source:n,payload:i={}}){return new Promise((async(s,r)=>{try{const r=(t,o,a)=>{const n=configuration.elements[e];console.debug(`Object ${a} property change! Source: ${t} Value: ${o} | Before: ${n[t]}`),n[t]=o,console.debug("Object after change",n),s(n)};switch(o){case"style":{const o={color:{target:e,property:"stroke",value:a},shadow:{target:e,property:"filter",value:a?`drop-shadow(0px 3px 3px ${a})`:""},fill:{target:e,property:"fill",value:a||"none"}},s={animation:{color:{target:i?.animation,property:"stroke",value:a},line_color:{target:i?.line,property:"stroke",value:a},shadow:{target:i?.line,property:"filter",value:a?`drop-shadow(0px 3px 3px ${a})`:""}},text:{color:o.color,fill:o.fill,shadow:o.shadow,font_size:{target:e,property:"font-size",value:a+"px"},font_family:{target:e,property:"font-family",value:a},align:{target:e,property:"text-anchor",value:a}},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]||{})[n];if(u?(l=u.target,c=u.property,d=u.value):(l=e,c=n,d=a),a=generateStyleProperty(l,c,a,!0,"color"),"svg"==t){const t=configuration.elements[e];if("switch"==t?.subType){const o=Number($(`#${e}`).data("value")),a=switchLayouts[t.design];switch(n){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=a.icon?"color":"fill";break;case"fill_on":l=o?`${e} > .toggleBackground`:"",c=a.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"==n&&appProperties.isApple){const e=shadowHandler(a);$(`#${l}`).css("filter",`url(#${e})`)}"animation"==t?("color"==n&&(console.debug(`Line-Animation color change! Value: ${a} | Before: ${configuration.animations[i?.animation].color}`),configuration.animations[i?.animation].color=a),"line_color"==n&&(console.debug(`Line-Color change! Value: ${a} | Before: ${configuration.lines[i?.line].color}`),configuration.lines[i?.line].color=a),"shadow"==n&&(console.debug(`Line-Shadow change! Value: ${a} | Before: ${configuration.lines[i?.line].shadow}`),configuration.lines[i?.line].shadow=a)):r(n,a,"CSS");break}case"attribute":{let o=!1,s=null,l=a;switch(n){case"pos_x":case"pos_y":o=!0;break;case"href":case"preserveAspectRatio":case"viewBox":s=n,"href"==n&&(l=await receiveImage(a));break;case"stroke":a=i?.elmProp.stroke,$(`#${e}`).css("strokeWidth",i?.elmProp.stroke);break;case"fObj_content":case"svg_content":$(`#${e}`).html(a);break;case"rx":case"height":case"width":case"radius":o=!0,s="radius"==n?"r":n;break;case"append":case"unit":case"prepend":$(`#${e}_${n}`).html(generateMultiLineText(`${e}_${n}`,a,i?.coords.x));break;case"text":"own_text"==configuration.elements[e].source_display?$(`#${e}_value`).html(generateMultiLineText(`${e}_value`,a,i?.coords.x)):$(`#${e}`).html(generateMultiLineText(e,a,i?.coords.x));break;case"degree_slider":case"degree":const t=calculateRotation(e,a);n="degree",s="transform",l=`rotate(${t.angle}, ${t.cx}, ${t.cy})`,$("#elm_degree_slider, #elm_degree").val(a)}s&&($(`#${e}`).attr(s,l),"icon"==t&&$(`#${e}`).attr(`data-${n}`,l)),r(n,a,"Attribute"),"icon"==t&&iconHandler(e,configuration.elements[e].icon,!0),o&&(hideCoordinates(),moveSVGElement(i?.elmProp,i?.coords));break}case"general":if(n.match(/\./)){const t=configuration.elements[e];let o=n.split(".");Object.hasOwn(t,o[0])||(t[o[0]]={}),console.debug(`Sub-Object property change! Source: ${n} Value: ${a} | Before: ${t[o[0]][o[1]]}`),t[o[0]][o[1]]=a,n.match(/clock\./)&&userClock(t.clock,e,!0)}else switch(t){default:r(n,a,"General"),"icon"==t&&iconHandler(e,configuration.elements[e].icon,!0);break;case"svg":{const t=configuration.elements[e];"switch"==t?.subType&&(r(n,a,"General"),switchHandler(e,!1));break}case"animation":switch(n){default:const e="animation"==n?"source":n;console.debug(`Line-Animation property change! Source: ${e} Value: ${a} | Before: ${configuration.animations[i?.animation][e]}`),configuration.animations[i?.animation][e]=a,console.debug(configuration.animations[i?.animation]);break;case"line_radius":case"line_arc":console.debug(`Line-Definition Property changed! Source: ${n} Value: ${a} | Before: ${configuration.defs[i?.def][n]}`),configuration.defs[i?.def][n]=parseFloat(a),console.debug(configuration.defs[i?.def]);const t=configuration.defs[i?.def].id.split("_");console.debug(`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(`Line-Property change! Source: ${n} Value: ${a} | Before: ${configuration.lines[i?.line][n]}`),configuration.lines[i?.line][n]=a,console.debug(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,a=!1,n="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),a),"url"==n?`url(#gradient_${e}_${t})`:i}return o}function hideConfigBar(){$(".all_elements").removeClass("faded_out active_element"),$("#config_bar").removeClass("show"),$(".elm_config").off().val(""),$("#tab1_config").prop("checked",!0),$("#elm_select").val(""),$(".ui-dialog").remove()}function closeEditorContainer(e){$("#loading").fadeOut(600),"tour"==e&&($(`#${e}Container`).addClass("hiding"),tourEnd()),$(`#${e}Container`).removeClass("visible"),setTimeout((()=>{$(`#${e}Container`).css("visibility","hidden"),$("#loading").removeClass("tour noText")}),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((()=>{$("#overlay_frame").remove()}),300),$(`#${e}`).scrollTop(0)}function iconHandler(e,t,o=!1){let a=$("<symbol />");$.each($("#"+e).prop("attributes"),(function(){a.attr(this.name,this.value)})),a.removeClass("tooltip");let n=t.split("?");if(n[1]){t=n[0];const e=new URLSearchParams(n[1]);a.attr({"data-icon":t,"data-flip":e.get("flip"),"data-rotate":e.get("rotate")})}else a.attr({"data-icon":t,"data-flip":configuration.elements[e].flip,"data-rotate":configuration.elements[e].rotate});$("#"+e).data("icon")==t&&1!=o||$("#"+e).replaceWith(a)}function toggleSwitch(e,t,o=!1){const a=configuration.elements[e],n=document.getElementById(e);if(!n)return;const i=switchLayouts[a.design??3];if(o){t=1-(n.getAttribute("data-value")||0),n.setAttribute("data-value",t)}const s=n.querySelector(".toggleBackground");if(s.style.fill=t?a.fill_on:a.fill,i.icon){const e=i.own?t?a.icon_on||i.icon_on:a.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),n.style.color=t?a.fill_on:a.fill}else{const e=n.querySelector(".toggleKnob");e.setAttribute("cx",t?"65":"15"),e.style.fill=t?a.color_on:a.color;const o=n.querySelector(".toggleSpinner");o.setAttribute("cx",t?"65":"15"),o.style.display=""}if(i.text){n.querySelector(".toggleText.on").style.opacity=t?1:0;n.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],a=switchLayouts[o.design??3],n=document.createDocumentFragment();if(!a.icon){const e=document.createElementNS("http://www.w3.org/2000/svg","rect");e.setAttribute("class","toggleBackground"),e.setAttribute("x",a.x),e.setAttribute("y",a.y),e.setAttribute("width",a.width),e.setAttribute("height",a.height),e.setAttribute("rx",a.rx),e.setAttribute("style",`fill: ${o.fill}`),n.appendChild(e)}if(a.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(a.text_on),3,!0),n.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(a.text_off),3,!0),n.appendChild(t)}if(!a.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}`),n.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),n.appendChild(t)}if(a.icon){const e=document.createElementNS("http://www.w3.org/2000/svg","symbol");e.setAttribute("class","toggleBackground iconify"),e.setAttribute("data-icon",a.own&&o.icon_off||a.icon_off),e.setAttribute("data-width",24),e.setAttribute("data-height",24),e.setAttribute("style",`color: ${o.fill}`),n.appendChild(e)}if(t)return n;{const t=document.getElementById(e);t&&(t.setAttribute("data-value",0),t.setAttribute("viewBox",a.icon?"0 0 24 24":"0 0 80 30"),a.icon&&t.setAttribute("style",`color: ${o.fill}`),t.innerHTML="",t.append(n))}}function shadowHandler(e){const t=e.replace(/[\#rgba(,.) ]/g,""),o=document.getElementById("placeholder_filter");if(!document.getElementById(`shadow_${t}`)){let a=document.createElementNS("http://www.w3.org/2000/svg","filter");a.setAttribute("id",`shadow_${t}`),a.setAttribute("filterUnits","userSpaceOnUse");let n=document.createElementNS("http://www.w3.org/2000/svg","feDropShadow");n.setAttribute("dx",0),n.setAttribute("dy",3),n.setAttribute("stdDeviation",3),n.setAttribute("flood-color",e),a.appendChild(n),o.appendChild(a)}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,a){let n=e.shadow?`filter: drop-shadow(0px 3px 3px ${e.shadow});`:"";if(e.shadow&&appProperties.isApple){n=`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}; ${n}`);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}; ${n}`);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; ${n}`),"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",`${n} ${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}; ${n}`),s.includes("gradient")&&l.setAttribute("style",`fill: ${s}; ${n}`),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",`${n} ${"#"==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}; ${n}`),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}; ${n}`),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);if("line"==e.type&&configuration.basic.enable_line_animation&&displayMode&&"inline"==d&&animatePath(e.id),e?.degree>0){const t=calculateRotation(e.id,e.degree);l.setAttribute("transform",`rotate(${t.angle}, ${t.cx}, ${t.cy})`)}"function"==typeof a&&a(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='all_datasource ds_buttons btn-update'><span class='iconify' data-height='24' data-icon='mdi:check'></span></button><button class='all_datasource ds_buttons btn-cancel'><span class='iconify red_icon' data-height='24' data-icon='mdi:close'></span></button><button class='all_datasource ds_buttons btn-edit'><span class='iconify' data-height='24' data-icon='mdi:pencil'></span></button><button class='all_datasource 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='all_datasource 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"),a=o.find("tbody"),n=(o.find("thead"),o.find('th[data-sorting="true"]')),i=n.index(),s=n.attr("data-asc"),r=a.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 a=document.createElement("script");a.type="text/javascript",a.src=e,a.onload=function(){console.log("[Config] Loaded additional file: "+e),t()},a.onerror=function(){console.log("[Config] Failed to load additional file: "+e),o()},document.head.appendChild(a)}))}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 a="";if(t)if(isNaN(t))if(t.includes("<br>")||t.includes("\n")){let n;t.includes("<br>")&&(n=t.split("<br>")),t.includes("\n")&&(n=t.split("\n")),n.length>0&&((e.toString().includes("append")||e.toString().includes("unit")||e.toString().includes("prepend"))&&(a+=`<tspan id="${e}_line_tmp" x="${o}" dy="1em"></tspan>`),n.forEach((function(t,n){t&&(a+=`<tspan id="${e}_line_${n}" x="${o}" dy="1em">${t}</tspan>`)})))}else a=` <tspan id="${e}_line_0">${t}</tspan >`;else a=` <tspan id="${e}_line_0">${t}</tspan >`;return a}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(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 a=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(a,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 a=lineConnection(o);0==a.length?(e.push(configuration.elements[o]),delete configuration.elements[o],$(`#${o}`).remove(),globalSelection.delete(o)):t.push({id:o,conns:a})})),saveUndoStep("delete",e,""),globalSelection.size>0)if(t.length>0)for(let e=0;e<t.length;e++){const o=`${t[e].id}`,a=t[e].conns.map((e=>`line_${e.path}`)).join(", ");addToast("warning",sprintf(translateWord("failmsg_selection_delete_existing_conn"),o,a)),console.log(o,a)}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 a=new Set(e),n=a.size>1?15:0;let i=0;$(".draggable").removeClass("draggable-multi dragging"),globalSelection.clear();for(const e of a){const s=getMaxID(),r=copyObject(configuration.elements[e]),l=getElementCoords(r.id);if(o){const e={x:o.x+i*n,y:o.y+i*n},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==a.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,a=!1){if(globalRedoStack=[],$("#edit_redo").addClass("not_active"),a){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 requested. 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 requested. 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="",a=!1){const n=document.getElementById("toast-container");let i="";if(o){if(!a&&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):n.appendChild(s)}else n.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"),a=o.querySelector(".toastCheckbox");if(a&&a.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,a=!1){function n(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)?)/,a=new RegExp(o.source,"g"),n=/(?:[+-]?\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],g=u.includes("conic");t=t[1].match(/(?:[^)(,]+|\([^)(]+\))+/g);for(let e=0;e<t.length;e++)t[e]=t[e].trim();const p=function(){return!!t[0].match(a)},f=p();p()||(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=g?"deg":"%",b=`0${h}`,_=g?"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],a=t[1];$[e]=a?[o,g?`${m(a)}deg`:a]:[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],a=parseFloat($[t-1][1]),n=o-t+2,i=(parseFloat($[o+1][1])-a)/n;let s=a;for(let e=0;e<n;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,a=e,n=null;if(a.match(/(at)/g)){a=a.slice(a.indexOf("at"),a.length),a=a.replace("at ","");const e=a.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(a){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:n=a.split(" "),t=n[0],o=n[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(n))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(n))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(a)return n(i.stops);if("linear-gradient"===i.type)return function(e,t,o,a){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",a),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(...n(o.stops)),l}(e,t,i,hashCode(o));if("radial-gradient"===i.type)return function(e,t,o,a){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",a),i.setAttribute("data-value",0),i.setAttribute("cx",o.position.x),i.setAttribute("cy",o.position.y),i.setAttribute("r","50%"),i.append(...n(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,a=!1){const n=document.getElementById("placeholder_gradients"),i=document.getElementById(`gradient_${e}_${t}`);i?i.replaceWith(o):n.appendChild(o),a&&$(`#${e}`).css(t,`url(#gradient_${e}_${t})`)}function generateSingleGradient(e,t,o,a=90){const n=document.createElementNS("http://www.w3.org/2000/svg","linearGradient");n.setAttribute("id",`gradient_${e}_fill`),n.setAttribute("data-type","color"),n.setAttribute("data-colorHash",hashCode(t)),n.setAttribute("gradientTransform","rotate("+a+",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),n.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),n.appendChild(s),$(n).appendTo("#placeholder_gradients"),$("#"+e).css("fill",`url(#gradient_${e}_fill)`)}function updateSingleGradient(e,t,o,a){const n=document.getElementById(`gradient_${e}_fill_transparent`),i=n?n.getAttribute("offset").replace("%",""):null;try{let n;switch(a){case"percent":n=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"));n=100-Math.abs(t)/o*100}n=Math.min(100,Math.max(0,n)),null!=n&&i!=n&&animateGradient(`gradient_${e}_fill_transparent`,i,n)}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"),a=$(e.target).iconselectmenu("widget");a.children(".ui-selectmenu-text").find("img").remove(),a.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 a in e[0]){const e=document.createElement("th");e.textContent=a,c.appendChild(e)}l.appendChild(c),r.appendChild(l);const d=document.createElement("tbody");for(var n=0;n<e.length;n++){var i=document.createElement("tr");for(var a in e[n]){var s=document.createElement("td");s.textContent=e[n][a],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 a="string"==typeof e&&e.includes("line_")?configuration.lines[e]:configuration.elements[e];if(null!=a.action&&"none"!=a.action&&!o||"click"==o){let i=a.source_action>=0?a.source_action:a.source;if(Object.hasOwn(configuration.datasources,i)){const s=configuration.datasources[i].source;switch(a.action){case"default":case"none":break;case"toggle":if("switch"==a.subType){const p=document.getElementById(e);if(p){const f=p.querySelector(".toggleSpinner");f&&(f.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("The state was set successfully!")}));break;case"change":let r="string";function l(e){return"boolean"==typeof e?"boolean":"number"!=typeof e||isNaN(e)?"string"==typeof e?"true"===e||"false"===e?"boolean":isNaN(e)||""===e.trim()?"string":"number":void 0:"number"}function c(e,t){switch(t){case"boolean":return"boolean"==typeof e?e:"true"===e.toLowerCase();case"number":return"number"==typeof e?e:parseFloat(e);default:return String(e)}}function d(e){return new Promise(((t,o)=>{const a=l(e),n=c(e,a);if(a!==r)return addToast("warning",sprintf(translateWord("failmsg_invalid_ds_type"),r),"warningInvalidType",!0),console.error(`The value "${e}" (${a}) does not match the type of the datasource "${s} (${r})"!`),o();socket.emit("setState",s,{val:n,ack:!1},(function(a,n){console.debug(`${e} submitted to host for state ${n}`),a?(console.log(`An error occured, while setting the state. The following error was provided: ${a}`),o()):(console.debug("The state was set successfully!"),t())}))}))}const u=await new Promise(((e,t)=>{socket.emit("getState",s,((o,a)=>{a?(console.debug(`[ClickAction] Pulled value from ioBroker: ${a.val} Type: ${typeof a.val}`),r=l(a.val),e(a.val)):t(`[ClickAction] 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 g=[{text:translateWord("value_set_value"),class:"input_button",click:async function(){d($("#shortcuts\\.action\\.value").val()).then((()=>{$(this).dialog("close")})).catch((e=>{}))}},{text:translateWord("value_cancel"),class:"input_button red",click:function(){$(this).dialog("close")}}];if(Object.hasOwn(a,"action_display_freeform")?($('[id="shortcuts.action"]').toggle(a.action_display_freeform),a.action_display_freeform||g.shift()):($('[id="shortcuts.action"]').toggle(!1),g.shift()),$("#shortcuts\\.action\\.value").attr("type",a.action_type).val(u),Object.hasOwn(a,"shortcuts"))if(Object.keys(a.shortcuts).length>0){let m;const h=$("<div>"),b=Object.entries(a.shortcuts).sort((([,e],[,t])=>e.alias.toLowerCase()<t.alias.toLowerCase()?-1:e.alias.toLowerCase()>t.alias.toLowerCase()?1:0));switch(a.action_display){default:case"button":m=$("<div>",{class:"shortcuts_additional_buttons",text:translateWord("shortcuts_additional_buttons")});const _=(e,t)=>{if(void 0===t)return"shortcut_inactive";return e.toString().toLowerCase()===t.toString().toLowerCase()?"":"shortcut_inactive"};for(const x of b)h.append($("<input>",{type:"button","data-title":x[1].alias,class:`tooltip input_button shortcuts_button ${_(x[1].value,u)}`,"data-value":x[1].value,value:x[1].alias||x[1].value}));m.append(h);break;case"select":m=$("<div>",{class:"contentBox"}),h.addClass("form_div select");const y=$("<label>",{for:"shortcuts_select",class:"form_label",text:translateWord("shortcuts_additional_buttons")}),w=$("<select>",{class:"input_select",id:"shortcuts_select"});for(var n of b)w.append($("<option>",{value:n[1].value,text:n[1].alias||n[1].value,selected:n[1].value.toString().toLowerCase()==u.toString().toLowerCase()}));const v=$("<div>",{class:"select-option"}).append(w);h.append(y,v),m.append(h)}$("#shortcuts\\.elements").show().html(m)}else a.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"),a.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:"-"}));null!=u&&$("#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 d($(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 d($(this).val()),$(".ui-dialog-buttonset").children().first().click())}catch(e){return}}))},buttons:g})}}else addErrorToLog({id:e,for:translateWord(`opt_action_${a.action}`),error:translateWord("failmsg_preview_element_no_ds"),function:"-"})}if(("none"==a.action||!Object.hasOwn(a,"action"))&&""!=a.url&&null!=a.url&&!o||"url"==o){function k(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 A(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,((a,n)=>{n?(console.debug(`[ClickAction] Pulled data from ioBroker: ${t}`),e(n.val)):o(`[ClickAction] 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:k(e),url:e}}const C=await A(a.url),S="http"!=C.protocol?"_overlay":a.frame;switch(S){case"_blank":case"_self":if(o&&"_self"==a.frame)addToast("warning",translateWord("failmsg_opening_frame_preview"));else{const M=a.frame_height&&a.frame_width?`width=${a.frame_width}, height=${a.frame_height}`:"",O=window.open(C.url,a.frame,M);O?O.focus():addToast("warning",translateWord("failmsg_opening_frame"))}break;default:const T=()=>{$("#frameContainer").css({height:a.frame_height||"",width:a.frame_width||""}),$("#frameContainer").css("visibility","visible").addClass("visible"),$(".loading-spinner, #loading_text").fadeOut("fast")};switch(C.protocol){case"jsonTable":case"text":displayLoading("");const I=generateFrameInput(C),E=$("<div/>",{class:"framed scrollbar",id:"overlay_frame"}).html(I);$("#frameContainer").append(E),T();break;case"http":{displayLoading(translateWord("msg_loading_url"));let P=null;const j=$("<iframe/>",{id:"overlay_frame",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")&&(T(),$(this).off()),clearTimeout(P)}));$("#frameContainer").append(j),P=setTimeout((()=>{closeEditorContainer("frame"),addToast("warning",translateWord("failmsg_loading_url"))}),5e3)}}}console.log(`[Action] URL found! Opening: ${C.protocol} Frame: ${S}`)}}function wrapUploadImage(e,t){let o=$(`<div class="imgContainer" id="${e}" />`),a=$('<div class="uploads_img" />'),n=$('<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 a.append(r),o.append(a,n,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),a=o.files,n=o.path;if($(".userImages_placeholder").show(),$(".fileSelector").prop("disabled",!1),a.length>0){$(".userImages_dummy").hide(),$("#deleteGallery").prop("disabled",!1),$("#userImages div.imgContainer").remove(),globalUserImages=a,console.debug(`[Config] Using ${n} for userFiles!`);for(let e=0;e<a.length;e++)$("#userImages").append(wrapUploadImage(a[e],n))}else $(".userImages_dummy").fadeIn("fast");$(".userImages_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",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)}},{text:translateWord("value_cancel"),class:"input_button",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(o);const a=o.filename.replaceAll(".","\\.");$(`#${a}`).fadeOut("fast",(function(){$(this).remove(),0==$("#userImages div").length&&($(".userImages_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 checkPasswordProtection(){return new Promise((e=>{socket.emit("sendTo",appProperties.namespace,"_checkProtection",{},(function(t){e(t.data)}))}))}function loadIconViaProxy(e,t){return new Promise(((o,a)=>{if(!e)return o();if("svg"==$(t).prop("tagName"))return o();const n=e=>{const o=(new DOMParser).parseFromString(e.icon,"image/svg+xml"),a=$(o.documentElement);a.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&&a.addClass("tooltip").data("title",translateWord("failmsg_icon_not_found")),t.replaceWith(a)},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 n(e),o();localStorage.removeItem(`ef_icon_${i}`)}if(iconRequestCache[i])return iconRequestCache[i].then((e=>{n(e),o()}));iconRequestCache[i]=new Promise(((t,o)=>{try{const a=new XMLHttpRequest;a.onload=function(){if(a.status>=200&&a.status<300){const e=JSON.parse(a.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: ${a.status}`))},a.onerror=function(){o(new Error(`Network-Error for icon ${e}`))};const n=`${appProperties.webURL}${appProperties.namespace}/?serve=icon&${i}`;a.open("GET",n,!0),a.send()}catch(e){console.log("Error! "+e),o(e)}})),iconRequestCache[i].then((e=>{n(e),o()})).catch((e=>{console.log("Error! "+e),a(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=[],a="tab1",n=!1,i=0,s=!1,r=!1,l=!1,c=!1,d=e.target,u=null,g=!1,p=null,f=!1,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),o=[]}function y(e){i>0||(globalSelection.forEach((e=>{const t=configuration.elements[e]?.group;if(t){getElementsByGroup(t).forEach((e=>{globalSelection.add(e)})),i++}})),i>0&&(o=[],A(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||p){if(p)$("#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");const o=document.body;e.touches&&(e=e.touches[0]);const a=$("#mouse_contextmenu"),n={top:o.clientHeight<e.pageY+(a.height()+6)?e.pageY-(a.height()+6):e.pageY,left:Math.max(0,o.clientWidth<e.pageX+a.width()?e.pageX-a.width():e.pageX)};m=getMousePosition(e),a.css({top:n.top,left:n.left+15}).slideDown("fast")}function x(){$("#svg_config_div").removeClass("noscroll")}function k(e,t,o,a){$(`#coord_desc_div_${e.id}`).text(t);const n=Number(e.stroke)/2;let i="circle"==e.type||"text"==e.type?o-Number(e.width)/2-n:o-n,s="circle"==e.type||"text"==e.type?a-Number(e.height)/2-n:a-n;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*n+10:s-32,$(`#coord_desc_${e.id}`).attr({x:i,y:s})}function A(e){if(globalSelection.forEach((t=>{o.push(getElementCoords(t,e))})),configuration.basic.enable_show_coordinates){const e=u?o.find((e=>e.id==u)):o[o.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)}n=!1,s=!1}function C(){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(){o=[],u=null,p=null,n=!1,s=!1,i=0}function T(e){const o=Number(e.target.closest(".draggable")?.id),n=document.getElementById(o);if(!(n&&n.classList.contains("not_selectable")||e.target.classList.contains("not_selectable"))){if(o>=0)if(e.ctrlKey)if(hideConfigBar(),i=0,globalSelection.has(o)){globalSelection.delete(o);const e=configuration.elements[o]?.group;if(e){getElementsByGroup(e).forEach((e=>{globalSelection.delete(e);document.getElementById(e).classList.remove("draggable-multi","dragging","protected")}))}n.classList.remove("draggable-multi","dragging","protected")}else addElementToSelection(o);else S(),n.classList.contains("draggable-multi")||(C(),addElementToSelection(o)),u=o,A(e);if(g=2===e.button,appProperties.isMobile&&(f||(f=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"))):(C(),S(),p=e.target.id)}if(e.target.classList.contains("lasso")){if(e.ctrlKey)return;l=!0,t=getMousePosition(e),C(),S(),hideCoordinates(),hideConfigBar()}}}function M(e){if(g||e.target.classList.contains("not_selectable"))return;const a=getMousePosition(e);if(appProperties.isMobile&&($("#mouse_contextmenu").hide(),f&&(clearTimeout(f),f=!1)),l)if(r=!0,c)$("#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.setAttribute("style","stroke: var(--primary); stroke-width: 2px; fill: var(--secondary); fill-opacity:0.2;"),$(e).appendTo("#placeholder_lasso"),c=!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(p),p=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==o.length&&(A(e),y(e)),e.ctrlKey&&"c"===e.key&&_()),o.length>0)){if(y(e),o.some((e=>1==e.protected)))return 0!=e.buttons&&$(".draggable-multi").addClass("not_selectable"),s=!0,void addToast("warning",translateWord("failmsg_protected_element"),"infoProtectedElement");i>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==o.length&&addToast("info",translateWord("toast_info_moreElements"),"infoMoreElements"),appProperties.isMobile||addToast("info",translateWord("toast_info_dragShift"),"infoShiftDrag"));for(let t=0;t<o.length;t++){const n=o[t],i=configuration.elements[o[t].id];let s={x:a.x-n.offset.x,y:a.y-n.offset.y},r={x:"-",y:"-"};if($("#"+n.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(n,s);if(!l.x)return;if(r.x=s.x,!l.y)return;r.y=s.y,moveSVGElement(n,s),configuration.basic.enable_show_coordinates&&k(n,`X: ${r.x} | Y: ${r.y}`,s.x,s.y)}n=!0,globalConfigChanged=!0}}function O(e){if(appProperties.isMobile&&f&&(clearTimeout(f),f=!1),null!=l){if(l=null,c=!1,t=null,r){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,a="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+a<=e.end_y&&addElementToSelection(t.id)})),x()}r=!1,$("#lasso_rect").remove()}if(o.length>0){if(n){let e=[],t=[];for(let a=0;a<o.length;a++)e.push(o[a]),t.push(getElementCoords(o[a].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!==n||!1!==s||g||e.ctrlKey||u>=0&&(showConfigBar([u],o[0].type,a),C(),addElementToSelection(u),setTimeout((()=>{"tab1"==a&&addToast("info",translateWord("toast_info_elmClick"),"infoElmClick")}),500)),S()}w()}d.addEventListener("mousedown",T),d.addEventListener("touchstart",T,!1),d.addEventListener("mousemove",M),d.addEventListener("touchmove",M),d.addEventListener("mouseup",O),d.addEventListener("mouseleave",(function(e){O(e)}),!1),d.addEventListener("touchend",O,!1),d.addEventListener("touchleave",O,!1),d.addEventListener("touchcancel",O,!1),d.addEventListener("keydown",M),d.addEventListener("keyup",(function(e){if("Shift"==e.key)return;if(x(),w(),o.length>0&&n){let e=[],t=[];for(let a=0;a<o.length;a++)e.push(o[a]),t.push(getElementCoords(o[a].id));saveUndoStep("move",e,t),o=[]}$(".added_elements").removeClass("not_selectable")})),d.addEventListener("contextmenu",v),$("#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||p)&&(deleteElements(p),p=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((a=>{configuration.elements[a].group=e,console.debug(`Setting group ${e} to Element: ${a}`),t.push({id:a,group:null}),o.push({id:a,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((a=>{const n=configuration.elements[a]?.group;if(n){getElementsByGroup(n).forEach((e=>{configuration.elements[e].group=null,globalSelection.delete(e),t.push({id:e,group:n}),o.push({id:e,group:null}),console.debug(`Removing group ${n} 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 a;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").removeClass("no_catch"):$(".tabbed").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]]?(a=parseInt(this.value),$(`#${o[0]}\\.${o[1]}\\.slider`).val(a),clearTimeout(e)):(a="basic.height"==this.id?configuration.basic.height:configuration.basic.width,"input"==t.type&&(clearTimeout(e),e=setTimeout((()=>{$(`#${o[0]}\\.${o[1]}\\.slider`).val(a),$(`#${o[0]}\\.${o[1]}`).val(a)}),500))),configuration[o[0]][o[1]]=a,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":a=this.value;break;case"select-multiple":a=$(this).val().map((e=>parseInt(e)));break;case"select-one":a=isNaN(this.value)?this.value:parseInt(this.value);break;case"number":a=parseInt(this.value);break;case"checkbox":a=this.checked}configuration[o[0]][o[1]][o[2]]=a,console.debug("Detailed Config changed: "+this.id,a,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(){$(".ui-dialog").remove(),closeConfigBar(),$("#align_elements").click(),$("#connect_elements").hasClass("red")&&$("#connect_elements").click(),$("#placeholder_coordinate_desc").empty(),"tab5"==this.id&&await getUserImages()})),$("#show_hide_config").click((function(){$("#container_menu").toggleClass("hidden")})),$(".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 a=!0;const n=[],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}},g=(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}},p={center:{x:u(c,t,"center"),y:g(c,t,"center")},left:{x:u(c,t,"left"),y:g(c,t,"left")},right:{x:u(c,t,"right"),y:g(c,t,"right")},vcenter:{x:u(c,t,"vcenter"),y:g(c,t,"vcenter")},top:{x:u(c,t,"top"),y:g(c,t,"top")},bottom:{x:u(c,t,"bottom"),y:g(c,t,"bottom")}},f=checkElementBounds(c,p[o]);if(f.x&&f.y){n.push(c),s.push({elm:c,coords:p[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:p[o].x+i,y:p[o].y+r},u=checkElementBounds(t,d);if(!u.x||!u.y){a=!1;break}n.push(t),s.push({elm:t,coords:d})}}}else a=!1,addToast("warning",translateWord("failmsg_align_impossible"));if(a){for(const e of s)moveSVGElement(e.elm,e.coords),i.push(getElementCoords(e.elm.id));saveUndoStep("align",n,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"),$(".all_elements, .align_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,maxHeight:"100%",modal:!0,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),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",click:function(){globalConfigChanged=!0;const t=JSON.parse(e.getValue());let o=0,a=0;const n=getMaxID();configuration.basic.enable_area_catch?(o=$("#svg_config_div").scrollLeft(),a=$("#svg_config_div").scrollTop()):(o=$(document).scrollLeft(),a=$(document).scrollTop()),t.id=n,t.source=-1,t.pos_x=o+(parseInt(configuration.basic.elm.pos_x)||50)+getRandomInt(50),t.pos_y=a+(parseInt(configuration.basic.elm.pos_y)||50)+getRandomInt(50),saveUndoStep("add",t,""),configuration.elements[n]=t,svgElement(configuration.elements[n]),console.debug(`Importing new Element with: ${t}`),showConfigBar([n],t.type),$(this).dialog("close")}},{text:translateWord("value_cancel"),class:"input_button 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=0,o=0;const a=getMaxID();configuration.basic.enable_area_catch?(t=$("#svg_config_div").scrollLeft(),o=$("#svg_config_div").scrollTop()):(t=$(document).scrollLeft(),o=$(document).scrollTop());let n={position:0,id:a,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":n.radius=parseInt(configuration.basic.circle.radius)||50,n.type="circle",n.fill_value="",n.fill_type=-1,n.fill_direction=90,n.fill_max=0,n.border_value="",n.border_type=-1,n.border_direction="cw",n.border_style="round",n.border_max=0,n.border_reverse_value="",n.border_reverse=!1,n.border_start=180,n.color=configuration.basic.elm.color||getRandomRGBA(),n.fill=configuration.basic.elm.fill||"none",n.stroke=parseInt(configuration.basic.elm.stroke_width)||5;break;case"rect":n.type="rect",n.width=parseInt(configuration.basic.rect.width)||100,n.height=parseInt(configuration.basic.rect.height)||100,n.rx=parseInt(configuration.basic.rect.corners)||10,n.fill_value="",n.fill_type=-1,n.fill_direction=90,n.fill_max=0,n.border_value="",n.border_type=-1,n.border_direction="cw",n.border_style="round",n.border_max=0,n.border_reverse_value="",n.border_reverse=!1,n.border_start=180,n.color=configuration.basic.elm.color||getRandomRGBA(),n.fill=configuration.basic.elm.fill||"none",n.stroke=parseInt(configuration.basic.elm.stroke_width)||5;break;case"text":n.type="text",n.text="Text",n.align=configuration.basic.font.align||"middle",n.color=configuration.basic.font.color||"none",n.fill=configuration.basic.font.fill||getRandomRGBA(),n.font_size=configuration.basic.font.size||20,n.font_family=configuration.basic.font.family||'"Arial", sans-serif';break;case"datasource":n.calculate_kw="none",n.counter_animation=!1,n.convert=!1,n.decimal_places=0,n.type="text",n.align=configuration.basic.font.align||"middle",n.subType="datasource",n.text=`${translateWord("lbl_datasource")} ${a}`,n.source_option=-1,n.source_option_lc=-1,n.source_display="auto",n.linebreak=0,n.subtract=[],n.add=[],n.unit="",n.source_action=-1,n.color=configuration.basic.font.color||"none",n.fill=configuration.basic.font.fill||getRandomRGBA(),n.font_size=configuration.basic.font.size||20,n.font_family=configuration.basic.font.family||'"Arial", sans-serif',n.pos_x+=25;break;case"icon":n.type="icon",n.width=24,n.height=24,n.icon="mdi:omega",n.color=configuration.basic.icon.color||getRandomRGBA();break;case"switch":n.type="svg",n.subType="switch",n.width=80,n.height=30,n.color="#FFF",n.fill="#e1e1e1",n.color_on="#FFF",n.fill_on="#28a745",n.design=3,n.text_on="#FFF",n.text_off="#a35353",n.action="toggle";break;case"svg":n.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>',n.subType="svg",n.type="svg",n.width=24,n.height=24,n.viewBox="0 0 24 24";break;case"image":n.href="",n.width=100,n.height=100,n.type="image",n.preserveAspectRatio="xMidYMid meet";break;case"fObj":n.fObj_content=`<div xmlns="http://www.w3.org/1999/xhtml">${translateWord("help_fObj_tmp")}</div>`,n.width=60,n.height=100,n.type="foreignObject",n.color=getRandomRGBA()}configuration.elements[a]=n,svgElement(n),saveUndoStep("add",n,"")})),$("#config_swap").click((function(){$("#config_bar").toggleClass("left right")})),$(".connect_elements").click((async function(e){await connectElements(e.target.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 a=0;const n=e.target.id;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(n){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",a++);break;case"check_ds_use":console.debug(`[Datasource] Checking usage of ${configuration.datasources[e].source}`),Object.keys(checkDatasourcesInUse(e)).length>0&&(i="highlight-green",a++)}$(t).addClass(i),setTimeout((()=>{$(t).removeClass(i)}),4e3)}addToast("info",sprintf(translateWord(`msg_ds_${n}`),a,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",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 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>"),a=$("<div>"),n=t.element.attr("data-image");return t.disabled&&o.addClass("ui-state-disabled"),n&&$("<img>",{src:n}).appendTo(a),$("<span>",{text:t.label}).appendTo(a),o.append(a).appendTo(e)}})}})),$(document).ready((async function(e){await healthCheck(),$("body").on("mouseenter touchstart",".tooltip",(function(e){$(this).efTooltip(e)})),displayMode?(document.getElementById("svg_display")?.addEventListener("dblclick",(()=>{const e=document.documentElement;document.fullscreenElement?document.exitFullscreen():e.requestFullscreen().catch((e=>{addToast("info","Your browser does not support fullscreen!")}))})),$("body").on("click",".action_element",(function(e){let t=$(this).attr("id");console.debug(`[Action] Clicked on Action Element ${t}`),actionForElement(t,e)}))):($("body").on("dragover",".drop_zone",(function(e){e.preventDefault(),$(this).addClass("dragFile"),$(this).siblings(".noFocusLine").find(".uploadInfo").text(translateWord("txt_upload_status_drop"))})),$("body").on("dragleave",".drop_zone",(function(e){e.preventDefault(),$(this).removeClass("dragFile"),$(this).siblings(".noFocusLine").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).parents(".drop_zone");function o(e){return e.trim().replace(/[^a-z0-9._\-]/gi,"_").replace(/_{2,}/g,"_").toLowerCase()}function a(e){return new Promise((function(t,o){const a=new XMLHttpRequest,n=new FormData;n.append("uploadFile",e),a.onload=function(){a.status>=200&&a.status<300?t(JSON.parse(a.responseText)):o(a.status)},a.open("POST",appProperties.webURL+appProperties.namespace+"/upload",!0),a.send(n)}))}t.siblings(".uploadProgress").find(".upload_progress>div").css("width","0%");let n=this.files.length,i=[];$(".fileSelector").blur().prop("disabled",!0),t.siblings(".upload_errors").slideUp();for(const s of this.files){if(t.siblings(".noFocusLine").find(".uploadInfo").text(sprintf(translateWord("txt_upload_uploading"),Object.keys(i).length||1,n)),s.size>5242880)i.push({filename:s.name,success:!1,reason:"size"});else if(s.type.includes("image"))if(globalUserImages.includes(o(s.name)))i.push({filename:s.name,success:!1,reason:"exists"});else{const t=await a(s);console.log("Uploaded: "+t.filename),i.push({filename:t.filename,success:!0,reason:"success"}),globalUserImages.push(t.filename);const o=globalUserImages.sort().indexOf(t.filename),n=wrapUploadImage(t.filename,t.path).hide(),r=n.clone();$(".userImages_dummy").fadeOut("fast"),n.appendToWithIndex($("#userImages").not("span"),o).fadeIn(2e3),e&&r.appendToWithIndex($("#userImagesBrowse").not("span"),o).fadeIn(2e3).attr({id:"","sel-id":t.filename}).find(".delete_upload").val(translateWord("value_select")).removeClass("delete_upload").addClass("select_upload")}else i.push({filename:s.name,success:!1,reason:"type"});t.siblings(".uploadProgress").find(".upload_progress>div").css("width",Object.keys(i).length/n*100+"%"),appProperties.isMobile}i.find((e=>!1===e.success))?(t.siblings(".upload_errors").find(".upload_errors-table tbody").empty(),i.forEach((function(e){t.siblings(".upload_errors").find(".upload_errors-table tbody").append(`<tr><td>${e.filename}</td><td>${translateWord("txt_upload_error_"+e.reason)}</td></tr>`)})),addToast("warning",translateWord("txt_upload_status_error")),t.siblings(".noFocusLine").find(".uploadInfo").html(`${translateWord("txt_upload_status_error")} <a href="javascript:;" class="tooltip" data-title="title_error_link" onclick="$(this).parents('.form_div').siblings('.upload_errors').slideToggle();"><span class="iconify" data-icon="material-symbols:error-outline" data-width="24" height="24" style="color:var(--red);"></span></a>`)):(addToast("success",translateWord("txt_upload_status_success")),t.siblings(".noFocusLine").find(".uploadInfo").text(translateWord("txt_upload_status_success")),$("#deleteGallery").prop("disabled",!1)),$(".uploadFile").val(null),$(".fileSelector").prop("disabled",!1),$(".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())})),document.addEventListener("click",(function(e){0===e.button&&$("#mouse_contextmenu").fadeOut(200)})),$("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.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",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 a=0;o.each((function(){(this.id||$(this).attr("sel-id")).match(e)||($(this).hide(),a++)})),o.length==a?t.siblings(".userImages_noResults").fadeIn("fast"):t.siblings(".userImages_noResults").hide()}else t.siblings(".userImages_noResults").hide()})),$("#frm-addDataSource").submit((function(e){e.preventDefault();const t=$("#elm_ds_source").val(),o=$("#elm_ds_alias").val()?$("#elm_ds_alias").val():"",a=Number($("#elm_ds_factor").val()),n=checkDuplicateDatasource(t);if(n){const e=$(`#datasource-table tbody tr[data-id="${n}"`);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:a},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,a=`<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>`,n="";for(var t in e)n+=`<tr><td>${e[t].id}</td><td>${e[t].type}</td><td>${e[t].reason}</td></tr>`;o=`${a}${n} </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",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"),a=e.data("factor"),n=$("<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 elm_config",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(n),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(a)})),$("#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(),a=Number($("#edit_ds_factor").val());if(o.length>=3){const n=checkDuplicateDatasource(o);null!=n&&n!=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:a},console.debug(`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(a),e.data({alias:t,source:o,factor:a}),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 a=configuration.basic.enable_last_id&&""==t.val()?globalSelectedId:t.val();if(t.hasClass("href")&&a.length>0){const t=a.match(e);t&&t.length>0&&(a=t[1])}$("#loading").fadeIn(600).addClass("noText"),addToast("info",translateWord("msg_firstSelect_DS"),"infoFirstSelectDS"),$("#stateExplorerContainer").css("visibility","visible").addClass("visible"),setTimeout((()=>{openStateTree("stateExplorer",a)}),200),$("#select_state").off().on("click",(function(){const e=$("#stateRoot .state.active"),a=e.attr("id"),n=e.find(".name").text();t.hasClass("href")?($(`#${o}`).val(`{${a}}`).focus().trigger("change"),"elm_url"==o&&$("#elm_frame").val("_overlay").trigger("change")):($("#elm_ds_source").val(a).focus(),$("#elm_ds_alias").val(n)),globalSelectedId=a,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"),a=e.index(),n="true"!==e.attr("data-asc"),i=o.find("tr").get();i.sort((function(e,t){const o=$(e).children().eq(a).text().trim(),n=$(t).children().eq(a).text().trim();return $.isNumeric(o)&&$.isNumeric(n)?parseFloat(o)-parseFloat(n):o.localeCompare(n,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-"+(n?"ascending":"descending"),"data-height":18})),n||i.reverse(),$.each(i,(function(e,t){o.append(t)})),e.attr({"data-asc":n,"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,maxHeight:500,height:"auto",width:640,modal:!0,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",click:function(){$(".uploadForm.browse .drop_zone").siblings(".noFocusLine").find(".uploadInfo").text(translateWord("txt_upload_status_init")).end().siblings(".uploadProgress").find(".upload_progress > div").css("width","0%").end().siblings(".upload_errors").slideUp(),$(".uploadForm.browse").slideUp(),$(this).dialog("close")}}]})})),$("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 a=document.createElementNS("http://www.w3.org/2000/svg","defs");a.appendChild(t);let n=document.createElementNS("http://www.w3.org/2000/svg","rect");n.setAttribute("x",0),n.setAttribute("y",0),n.setAttribute("width","100%"),n.setAttribute("height",200),n.setAttribute("fill",`url(#gradient_${e}_test)`),o.append(a,n),$(this).append(o)},buttons:[{text:translateWord("btn_close"),class:"input_button",click:function(){$(this).dialog("close")}}]})):addToast("warning",translateWord("failmsg_parse_gradient"))}else addToast("warning",translateWord("failmsg_parse_gradient"))}})))}));