diff --git a/.gitattributes b/.gitattributes deleted file mode 100755 index dfe0770..0000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto diff --git a/.gitignore b/.gitignore deleted file mode 100755 index ea9bc90..0000000 --- a/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -nbproject/ -test.php -core/config/common.config.php -plugins -sftp-config.json -.project -.DS_Store -Thumbs.db -*.php~ -.remote-sync.json -.vscode \ No newline at end of file diff --git a/3rdparty/images/layers-2x.png b/3rdparty/images/layers-2x.png new file mode 100644 index 0000000..200c333 Binary files /dev/null and b/3rdparty/images/layers-2x.png differ diff --git a/3rdparty/images/layers.png b/3rdparty/images/layers.png new file mode 100644 index 0000000..1a72e57 Binary files /dev/null and b/3rdparty/images/layers.png differ diff --git a/3rdparty/images/marker-icon-2x.png b/3rdparty/images/marker-icon-2x.png new file mode 100644 index 0000000..88f9e50 Binary files /dev/null and b/3rdparty/images/marker-icon-2x.png differ diff --git a/3rdparty/images/marker-icon.png b/3rdparty/images/marker-icon.png new file mode 100644 index 0000000..950edf2 Binary files /dev/null and b/3rdparty/images/marker-icon.png differ diff --git a/3rdparty/images/marker-shadow.png b/3rdparty/images/marker-shadow.png new file mode 100644 index 0000000..9fd2979 Binary files /dev/null and b/3rdparty/images/marker-shadow.png differ diff --git a/3rdparty/leaflet.css b/3rdparty/leaflet.css new file mode 100644 index 0000000..ea8c2f7 --- /dev/null +++ b/3rdparty/leaflet.css @@ -0,0 +1,661 @@ +/* required styles */ + +.leaflet-pane, +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-tile-container, +.leaflet-pane > svg, +.leaflet-pane > canvas, +.leaflet-zoom-box, +.leaflet-image-layer, +.leaflet-layer { + position: absolute; + left: 0; + top: 0; + } +.leaflet-container { + overflow: hidden; + } +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + -webkit-user-drag: none; + } +/* Prevents IE11 from highlighting tiles in blue */ +.leaflet-tile::selection { + background: transparent; +} +/* Safari renders non-retina tile on retina better with this, but Chrome is worse */ +.leaflet-safari .leaflet-tile { + image-rendering: -webkit-optimize-contrast; + } +/* hack that prevents hw layers "stretching" when loading new tiles */ +.leaflet-safari .leaflet-tile-container { + width: 1600px; + height: 1600px; + -webkit-transform-origin: 0 0; + } +.leaflet-marker-icon, +.leaflet-marker-shadow { + display: block; + } +/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */ +/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */ +.leaflet-container .leaflet-overlay-pane svg { + max-width: none !important; + max-height: none !important; + } +.leaflet-container .leaflet-marker-pane img, +.leaflet-container .leaflet-shadow-pane img, +.leaflet-container .leaflet-tile-pane img, +.leaflet-container img.leaflet-image-layer, +.leaflet-container .leaflet-tile { + max-width: none !important; + max-height: none !important; + width: auto; + padding: 0; + } + +.leaflet-container img.leaflet-tile { + /* See: https://bugs.chromium.org/p/chromium/issues/detail?id=600120 */ + mix-blend-mode: plus-lighter; +} + +.leaflet-container.leaflet-touch-zoom { + -ms-touch-action: pan-x pan-y; + touch-action: pan-x pan-y; + } +.leaflet-container.leaflet-touch-drag { + -ms-touch-action: pinch-zoom; + /* Fallback for FF which doesn't support pinch-zoom */ + touch-action: none; + touch-action: pinch-zoom; +} +.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom { + -ms-touch-action: none; + touch-action: none; +} +.leaflet-container { + -webkit-tap-highlight-color: transparent; +} +.leaflet-container a { + -webkit-tap-highlight-color: rgba(51, 181, 229, 0.4); +} +.leaflet-tile { + filter: inherit; + visibility: hidden; + } +.leaflet-tile-loaded { + visibility: inherit; + } +.leaflet-zoom-box { + width: 0; + height: 0; + -moz-box-sizing: border-box; + box-sizing: border-box; + z-index: 800; + } +/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */ +.leaflet-overlay-pane svg { + -moz-user-select: none; + } + +.leaflet-pane { z-index: 400; } + +.leaflet-tile-pane { z-index: 200; } +.leaflet-overlay-pane { z-index: 400; } +.leaflet-shadow-pane { z-index: 500; } +.leaflet-marker-pane { z-index: 600; } +.leaflet-tooltip-pane { z-index: 650; } +.leaflet-popup-pane { z-index: 700; } + +.leaflet-map-pane canvas { z-index: 100; } +.leaflet-map-pane svg { z-index: 200; } + +.leaflet-vml-shape { + width: 1px; + height: 1px; + } +.lvml { + behavior: url(#default#VML); + display: inline-block; + position: absolute; + } + + +/* control positioning */ + +.leaflet-control { + position: relative; + z-index: 800; + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; + } +.leaflet-top, +.leaflet-bottom { + position: absolute; + z-index: 1000; + pointer-events: none; + } +.leaflet-top { + top: 0; + } +.leaflet-right { + right: 0; + } +.leaflet-bottom { + bottom: 0; + } +.leaflet-left { + left: 0; + } +.leaflet-control { + float: left; + clear: both; + } +.leaflet-right .leaflet-control { + float: right; + } +.leaflet-top .leaflet-control { + margin-top: 10px; + } +.leaflet-bottom .leaflet-control { + margin-bottom: 10px; + } +.leaflet-left .leaflet-control { + margin-left: 10px; + } +.leaflet-right .leaflet-control { + margin-right: 10px; + } + + +/* zoom and fade animations */ + +.leaflet-fade-anim .leaflet-popup { + opacity: 0; + -webkit-transition: opacity 0.2s linear; + -moz-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; + } +.leaflet-fade-anim .leaflet-map-pane .leaflet-popup { + opacity: 1; + } +.leaflet-zoom-animated { + -webkit-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; + } +svg.leaflet-zoom-animated { + will-change: transform; +} + +.leaflet-zoom-anim .leaflet-zoom-animated { + -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1); + -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1); + transition: transform 0.25s cubic-bezier(0,0,0.25,1); + } +.leaflet-zoom-anim .leaflet-tile, +.leaflet-pan-anim .leaflet-tile { + -webkit-transition: none; + -moz-transition: none; + transition: none; + } + +.leaflet-zoom-anim .leaflet-zoom-hide { + visibility: hidden; + } + + +/* cursors */ + +.leaflet-interactive { + cursor: pointer; + } +.leaflet-grab { + cursor: -webkit-grab; + cursor: -moz-grab; + cursor: grab; + } +.leaflet-crosshair, +.leaflet-crosshair .leaflet-interactive { + cursor: crosshair; + } +.leaflet-popup-pane, +.leaflet-control { + cursor: auto; + } +.leaflet-dragging .leaflet-grab, +.leaflet-dragging .leaflet-grab .leaflet-interactive, +.leaflet-dragging .leaflet-marker-draggable { + cursor: move; + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + cursor: grabbing; + } + +/* marker & overlays interactivity */ +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-image-layer, +.leaflet-pane > svg path, +.leaflet-tile-container { + pointer-events: none; + } + +.leaflet-marker-icon.leaflet-interactive, +.leaflet-image-layer.leaflet-interactive, +.leaflet-pane > svg path.leaflet-interactive, +svg.leaflet-image-layer.leaflet-interactive path { + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; + } + +/* visual tweaks */ + +.leaflet-container { + background: #ddd; + outline-offset: 1px; + } +.leaflet-container a { + color: #0078A8; + } +.leaflet-zoom-box { + border: 2px dotted #38f; + background: rgba(255,255,255,0.5); + } + + +/* general typography */ +.leaflet-container { + font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; + font-size: 12px; + font-size: 0.75rem; + line-height: 1.5; + } + + +/* general toolbar styles */ + +.leaflet-bar { + box-shadow: 0 1px 5px rgba(0,0,0,0.65); + border-radius: 4px; + } +.leaflet-bar a { + background-color: #fff; + border-bottom: 1px solid #ccc; + width: 26px; + height: 26px; + line-height: 26px; + display: block; + text-align: center; + text-decoration: none; + color: black; + } +.leaflet-bar a, +.leaflet-control-layers-toggle { + background-position: 50% 50%; + background-repeat: no-repeat; + display: block; + } +.leaflet-bar a:hover, +.leaflet-bar a:focus { + background-color: #f4f4f4; + } +.leaflet-bar a:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + } +.leaflet-bar a:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom: none; + } +.leaflet-bar a.leaflet-disabled { + cursor: default; + background-color: #f4f4f4; + color: #bbb; + } + +.leaflet-touch .leaflet-bar a { + width: 30px; + height: 30px; + line-height: 30px; + } +.leaflet-touch .leaflet-bar a:first-child { + border-top-left-radius: 2px; + border-top-right-radius: 2px; + } +.leaflet-touch .leaflet-bar a:last-child { + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; + } + +/* zoom control */ + +.leaflet-control-zoom-in, +.leaflet-control-zoom-out { + font: bold 18px 'Lucida Console', Monaco, monospace; + text-indent: 1px; + } + +.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out { + font-size: 22px; + } + + +/* layers control */ + +.leaflet-control-layers { + box-shadow: 0 1px 5px rgba(0,0,0,0.4); + background: #fff; + border-radius: 5px; + } +.leaflet-control-layers-toggle { + background-image: url(images/layers.png); + width: 36px; + height: 36px; + } +.leaflet-retina .leaflet-control-layers-toggle { + background-image: url(images/layers-2x.png); + background-size: 26px 26px; + } +.leaflet-touch .leaflet-control-layers-toggle { + width: 44px; + height: 44px; + } +.leaflet-control-layers .leaflet-control-layers-list, +.leaflet-control-layers-expanded .leaflet-control-layers-toggle { + display: none; + } +.leaflet-control-layers-expanded .leaflet-control-layers-list { + display: block; + position: relative; + } +.leaflet-control-layers-expanded { + padding: 6px 10px 6px 6px; + color: #333; + background: #fff; + } +.leaflet-control-layers-scrollbar { + overflow-y: scroll; + overflow-x: hidden; + padding-right: 5px; + } +.leaflet-control-layers-selector { + margin-top: 2px; + position: relative; + top: 1px; + } +.leaflet-control-layers label { + display: block; + font-size: 13px; + font-size: 1.08333em; + } +.leaflet-control-layers-separator { + height: 0; + border-top: 1px solid #ddd; + margin: 5px -10px 5px -6px; + } + +/* Default icon URLs */ +.leaflet-default-icon-path { /* used only in path-guessing heuristic, see L.Icon.Default */ + background-image: url(images/marker-icon.png); + } + + +/* attribution and scale controls */ + +.leaflet-container .leaflet-control-attribution { + background: #fff; + background: rgba(255, 255, 255, 0.8); + margin: 0; + } +.leaflet-control-attribution, +.leaflet-control-scale-line { + padding: 0 5px; + color: #333; + line-height: 1.4; + } +.leaflet-control-attribution a { + text-decoration: none; + } +.leaflet-control-attribution a:hover, +.leaflet-control-attribution a:focus { + text-decoration: underline; + } +.leaflet-attribution-flag { + display: inline !important; + vertical-align: baseline !important; + width: 1em; + height: 0.6669em; + } +.leaflet-left .leaflet-control-scale { + margin-left: 5px; + } +.leaflet-bottom .leaflet-control-scale { + margin-bottom: 5px; + } +.leaflet-control-scale-line { + border: 2px solid #777; + border-top: none; + line-height: 1.1; + padding: 2px 5px 1px; + white-space: nowrap; + -moz-box-sizing: border-box; + box-sizing: border-box; + background: rgba(255, 255, 255, 0.8); + text-shadow: 1px 1px #fff; + } +.leaflet-control-scale-line:not(:first-child) { + border-top: 2px solid #777; + border-bottom: none; + margin-top: -2px; + } +.leaflet-control-scale-line:not(:first-child):not(:last-child) { + border-bottom: 2px solid #777; + } + +.leaflet-touch .leaflet-control-attribution, +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + box-shadow: none; + } +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + border: 2px solid rgba(0,0,0,0.2); + background-clip: padding-box; + } + + +/* popup */ + +.leaflet-popup { + position: absolute; + text-align: center; + margin-bottom: 20px; + } +.leaflet-popup-content-wrapper { + padding: 1px; + text-align: left; + border-radius: 12px; + } +.leaflet-popup-content { + margin: 13px 24px 13px 20px; + line-height: 1.3; + font-size: 13px; + font-size: 1.08333em; + min-height: 1px; + } +.leaflet-popup-content p { + margin: 17px 0; + margin: 1.3em 0; + } +.leaflet-popup-tip-container { + width: 40px; + height: 20px; + position: absolute; + left: 50%; + margin-top: -1px; + margin-left: -20px; + overflow: hidden; + pointer-events: none; + } +.leaflet-popup-tip { + width: 17px; + height: 17px; + padding: 1px; + + margin: -10px auto 0; + pointer-events: auto; + + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + } +.leaflet-popup-content-wrapper, +.leaflet-popup-tip { + background: white; + color: #333; + box-shadow: 0 3px 14px rgba(0,0,0,0.4); + } +.leaflet-container a.leaflet-popup-close-button { + position: absolute; + top: 0; + right: 0; + border: none; + text-align: center; + width: 24px; + height: 24px; + font: 16px/24px Tahoma, Verdana, sans-serif; + color: #757575; + text-decoration: none; + background: transparent; + } +.leaflet-container a.leaflet-popup-close-button:hover, +.leaflet-container a.leaflet-popup-close-button:focus { + color: #585858; + } +.leaflet-popup-scrolled { + overflow: auto; + } + +.leaflet-oldie .leaflet-popup-content-wrapper { + -ms-zoom: 1; + } +.leaflet-oldie .leaflet-popup-tip { + width: 24px; + margin: 0 auto; + + -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)"; + filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678); + } + +.leaflet-oldie .leaflet-control-zoom, +.leaflet-oldie .leaflet-control-layers, +.leaflet-oldie .leaflet-popup-content-wrapper, +.leaflet-oldie .leaflet-popup-tip { + border: 1px solid #999; + } + + +/* div icon */ + +.leaflet-div-icon { + background: #fff; + border: 1px solid #666; + } + + +/* Tooltip */ +/* Base styles for the element that has a tooltip */ +.leaflet-tooltip { + position: absolute; + padding: 6px; + background-color: #fff; + border: 1px solid #fff; + border-radius: 3px; + color: #222; + white-space: nowrap; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + pointer-events: none; + box-shadow: 0 1px 3px rgba(0,0,0,0.4); + } +.leaflet-tooltip.leaflet-interactive { + cursor: pointer; + pointer-events: auto; + } +.leaflet-tooltip-top:before, +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + position: absolute; + pointer-events: none; + border: 6px solid transparent; + background: transparent; + content: ""; + } + +/* Directions */ + +.leaflet-tooltip-bottom { + margin-top: 6px; +} +.leaflet-tooltip-top { + margin-top: -6px; +} +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-top:before { + left: 50%; + margin-left: -6px; + } +.leaflet-tooltip-top:before { + bottom: 0; + margin-bottom: -12px; + border-top-color: #fff; + } +.leaflet-tooltip-bottom:before { + top: 0; + margin-top: -12px; + margin-left: -6px; + border-bottom-color: #fff; + } +.leaflet-tooltip-left { + margin-left: -6px; +} +.leaflet-tooltip-right { + margin-left: 6px; +} +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + top: 50%; + margin-top: -6px; + } +.leaflet-tooltip-left:before { + right: 0; + margin-right: -12px; + border-left-color: #fff; + } +.leaflet-tooltip-right:before { + left: 0; + margin-left: -12px; + border-right-color: #fff; + } + +/* Printing */ + +@media print { + /* Prevent printers from removing background-images of controls. */ + .leaflet-control { + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + } + } \ No newline at end of file diff --git a/3rdparty/leaflet.js b/3rdparty/leaflet.js new file mode 100644 index 0000000..037df86 --- /dev/null +++ b/3rdparty/leaflet.js @@ -0,0 +1,5 @@ +/* @preserve + * Leaflet 1.9.4, a JS library for interactive maps. https://leafletjs.com + * (c) 2010-2023 Vladimir Agafonkin, (c) 2010-2011 CloudMade + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).leaflet={})}(this,function(t){"use strict";function l(t){for(var e,i,n=1,o=arguments.length;n=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=_(t);var e=this.min,i=this.max,n=t.min,t=t.max,o=t.x>=e.x&&n.x<=i.x,t=t.y>=e.y&&n.y<=i.y;return o&&t},overlaps:function(t){t=_(t);var e=this.min,i=this.max,n=t.min,t=t.max,o=t.x>e.x&&n.xe.y&&n.y=n.lat&&i.lat<=o.lat&&e.lng>=n.lng&&i.lng<=o.lng},intersects:function(t){t=g(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),t=t.getNorthEast(),o=t.lat>=e.lat&&n.lat<=i.lat,t=t.lng>=e.lng&&n.lng<=i.lng;return o&&t},overlaps:function(t){t=g(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),t=t.getNorthEast(),o=t.lat>e.lat&&n.late.lng&&n.lng","http://www.w3.org/2000/svg"===(Wt.firstChild&&Wt.firstChild.namespaceURI));function y(t){return 0<=navigator.userAgent.toLowerCase().indexOf(t)}var b={ie:pt,ielt9:mt,edge:n,webkit:ft,android:gt,android23:vt,androidStock:yt,opera:xt,chrome:wt,gecko:bt,safari:Pt,phantom:Lt,opera12:o,win:Tt,ie3d:Mt,webkit3d:zt,gecko3d:_t,any3d:Ct,mobile:Zt,mobileWebkit:St,mobileWebkit3d:Et,msPointer:kt,pointer:Ot,touch:Bt,touchNative:At,mobileOpera:It,mobileGecko:Rt,retina:Nt,passiveEvents:Dt,canvas:jt,svg:Ht,vml:!Ht&&function(){try{var t=document.createElement("div"),e=(t.innerHTML='',t.firstChild);return e.style.behavior="url(#default#VML)",e&&"object"==typeof e.adj}catch(t){return!1}}(),inlineSvg:Wt,mac:0===navigator.platform.indexOf("Mac"),linux:0===navigator.platform.indexOf("Linux")},Ft=b.msPointer?"MSPointerDown":"pointerdown",Ut=b.msPointer?"MSPointerMove":"pointermove",Vt=b.msPointer?"MSPointerUp":"pointerup",qt=b.msPointer?"MSPointerCancel":"pointercancel",Gt={touchstart:Ft,touchmove:Ut,touchend:Vt,touchcancel:qt},Kt={touchstart:function(t,e){e.MSPOINTER_TYPE_TOUCH&&e.pointerType===e.MSPOINTER_TYPE_TOUCH&&O(e);ee(t,e)},touchmove:ee,touchend:ee,touchcancel:ee},Yt={},Xt=!1;function Jt(t,e,i){return"touchstart"!==e||Xt||(document.addEventListener(Ft,$t,!0),document.addEventListener(Ut,Qt,!0),document.addEventListener(Vt,te,!0),document.addEventListener(qt,te,!0),Xt=!0),Kt[e]?(i=Kt[e].bind(this,i),t.addEventListener(Gt[e],i,!1),i):(console.warn("wrong event specified:",e),u)}function $t(t){Yt[t.pointerId]=t}function Qt(t){Yt[t.pointerId]&&(Yt[t.pointerId]=t)}function te(t){delete Yt[t.pointerId]}function ee(t,e){if(e.pointerType!==(e.MSPOINTER_TYPE_MOUSE||"mouse")){for(var i in e.touches=[],Yt)e.touches.push(Yt[i]);e.changedTouches=[e],t(e)}}var ie=200;function ne(t,i){t.addEventListener("dblclick",i);var n,o=0;function e(t){var e;1!==t.detail?n=t.detail:"mouse"===t.pointerType||t.sourceCapabilities&&!t.sourceCapabilities.firesTouchEvents||((e=Ne(t)).some(function(t){return t instanceof HTMLLabelElement&&t.attributes.for})&&!e.some(function(t){return t instanceof HTMLInputElement||t instanceof HTMLSelectElement})||((e=Date.now())-o<=ie?2===++n&&i(function(t){var e,i,n={};for(i in t)e=t[i],n[i]=e&&e.bind?e.bind(t):e;return(t=n).type="dblclick",n.detail=2,n.isTrusted=!1,n._simulated=!0,n}(t)):n=1,o=e))}return t.addEventListener("click",e),{dblclick:i,simDblclick:e}}var oe,se,re,ae,he,le,ue=we(["transform","webkitTransform","OTransform","MozTransform","msTransform"]),ce=we(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),de="webkitTransition"===ce||"OTransition"===ce?ce+"End":"transitionend";function _e(t){return"string"==typeof t?document.getElementById(t):t}function pe(t,e){var i=t.style[e]||t.currentStyle&&t.currentStyle[e];return"auto"===(i=i&&"auto"!==i||!document.defaultView?i:(t=document.defaultView.getComputedStyle(t,null))?t[e]:null)?null:i}function P(t,e,i){t=document.createElement(t);return t.className=e||"",i&&i.appendChild(t),t}function T(t){var e=t.parentNode;e&&e.removeChild(t)}function me(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function fe(t){var e=t.parentNode;e&&e.lastChild!==t&&e.appendChild(t)}function ge(t){var e=t.parentNode;e&&e.firstChild!==t&&e.insertBefore(t,e.firstChild)}function ve(t,e){return void 0!==t.classList?t.classList.contains(e):0<(t=xe(t)).length&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(t)}function M(t,e){var i;if(void 0!==t.classList)for(var n=F(e),o=0,s=n.length;othis.options.maxZoom)?this.setZoom(t):this},panInsideBounds:function(t,e){this._enforcingBounds=!0;var i=this.getCenter(),t=this._limitCenter(i,this._zoom,g(t));return i.equals(t)||this.panTo(t,e),this._enforcingBounds=!1,this},panInside:function(t,e){var i=m((e=e||{}).paddingTopLeft||e.padding||[0,0]),n=m(e.paddingBottomRight||e.padding||[0,0]),o=this.project(this.getCenter()),t=this.project(t),s=this.getPixelBounds(),i=_([s.min.add(i),s.max.subtract(n)]),s=i.getSize();return i.contains(t)||(this._enforcingBounds=!0,n=t.subtract(i.getCenter()),i=i.extend(t).getSize().subtract(s),o.x+=n.x<0?-i.x:i.x,o.y+=n.y<0?-i.y:i.y,this.panTo(this.unproject(o),e),this._enforcingBounds=!1),this},invalidateSize:function(t){if(!this._loaded)return this;t=l({animate:!1,pan:!0},!0===t?{animate:!0}:t);var e=this.getSize(),i=(this._sizeChanged=!0,this._lastCenter=null,this.getSize()),n=e.divideBy(2).round(),o=i.divideBy(2).round(),n=n.subtract(o);return n.x||n.y?(t.animate&&t.pan?this.panBy(n):(t.pan&&this._rawPanBy(n),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(a(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:e,newSize:i})):this},stop:function(){return this.setZoom(this._limitZoom(this._zoom)),this.options.zoomSnap||this.fire("viewreset"),this._stop()},locate:function(t){var e,i;return t=this._locateOptions=l({timeout:1e4,watch:!1},t),"geolocation"in navigator?(e=a(this._handleGeolocationResponse,this),i=a(this._handleGeolocationError,this),t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t)):this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e;this._container._leaflet_id&&(e=t.code,t=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout"),this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+t+"."}))},_handleGeolocationResponse:function(t){if(this._container._leaflet_id){var e,i,n=new v(t.coords.latitude,t.coords.longitude),o=n.toBounds(2*t.coords.accuracy),s=this._locateOptions,r=(s.setView&&(e=this.getBoundsZoom(o),this.setView(n,s.maxZoom?Math.min(e,s.maxZoom):e)),{latlng:n,bounds:o,timestamp:t.timestamp});for(i in t.coords)"number"==typeof t.coords[i]&&(r[i]=t.coords[i]);this.fire("locationfound",r)}},addHandler:function(t,e){return e&&(e=this[t]=new e(this),this._handlers.push(e),this.options[t]&&e.enable()),this},remove:function(){if(this._initEvents(!0),this.options.maxBounds&&this.off("moveend",this._panInsideMaxBounds),this._containerId!==this._container._leaflet_id)throw new Error("Map container is being reused by another instance");try{delete this._container._leaflet_id,delete this._containerId}catch(t){this._container._leaflet_id=void 0,this._containerId=void 0}for(var t in void 0!==this._locationWatchId&&this.stopLocate(),this._stop(),T(this._mapPane),this._clearControlPos&&this._clearControlPos(),this._resizeRequest&&(r(this._resizeRequest),this._resizeRequest=null),this._clearHandlers(),this._loaded&&this.fire("unload"),this._layers)this._layers[t].remove();for(t in this._panes)T(this._panes[t]);return this._layers=[],this._panes=[],delete this._mapPane,delete this._renderer,this},createPane:function(t,e){e=P("div","leaflet-pane"+(t?" leaflet-"+t.replace("Pane","")+"-pane":""),e||this._mapPane);return t&&(this._panes[t]=e),e},getCenter:function(){return this._checkIfLoaded(),this._lastCenter&&!this._moved()?this._lastCenter.clone():this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds();return new s(this.unproject(t.getBottomLeft()),this.unproject(t.getTopRight()))},getMinZoom:function(){return void 0===this.options.minZoom?this._layersMinZoom||0:this.options.minZoom},getMaxZoom:function(){return void 0===this.options.maxZoom?void 0===this._layersMaxZoom?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,e,i){t=g(t),i=m(i||[0,0]);var n=this.getZoom()||0,o=this.getMinZoom(),s=this.getMaxZoom(),r=t.getNorthWest(),t=t.getSouthEast(),i=this.getSize().subtract(i),t=_(this.project(t,n),this.project(r,n)).getSize(),r=b.any3d?this.options.zoomSnap:1,a=i.x/t.x,i=i.y/t.y,t=e?Math.max(a,i):Math.min(a,i),n=this.getScaleZoom(t,n);return r&&(n=Math.round(n/(r/100))*(r/100),n=e?Math.ceil(n/r)*r:Math.floor(n/r)*r),Math.max(o,Math.min(s,n))},getSize:function(){return this._size&&!this._sizeChanged||(this._size=new p(this._container.clientWidth||0,this._container.clientHeight||0),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(t,e){t=this._getTopLeftPoint(t,e);return new f(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._pixelOrigin},getPixelWorldBounds:function(t){return this.options.crs.getProjectedBounds(void 0===t?this.getZoom():t)},getPane:function(t){return"string"==typeof t?this._panes[t]:t},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t,e){var i=this.options.crs;return e=void 0===e?this._zoom:e,i.scale(t)/i.scale(e)},getScaleZoom:function(t,e){var i=this.options.crs,t=(e=void 0===e?this._zoom:e,i.zoom(t*i.scale(e)));return isNaN(t)?1/0:t},project:function(t,e){return e=void 0===e?this._zoom:e,this.options.crs.latLngToPoint(w(t),e)},unproject:function(t,e){return e=void 0===e?this._zoom:e,this.options.crs.pointToLatLng(m(t),e)},layerPointToLatLng:function(t){t=m(t).add(this.getPixelOrigin());return this.unproject(t)},latLngToLayerPoint:function(t){return this.project(w(t))._round()._subtract(this.getPixelOrigin())},wrapLatLng:function(t){return this.options.crs.wrapLatLng(w(t))},wrapLatLngBounds:function(t){return this.options.crs.wrapLatLngBounds(g(t))},distance:function(t,e){return this.options.crs.distance(w(t),w(e))},containerPointToLayerPoint:function(t){return m(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return m(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){t=this.containerPointToLayerPoint(m(t));return this.layerPointToLatLng(t)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(w(t)))},mouseEventToContainerPoint:function(t){return De(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){t=this._container=_e(t);if(!t)throw new Error("Map container not found.");if(t._leaflet_id)throw new Error("Map container is already initialized.");S(t,"scroll",this._onScroll,this),this._containerId=h(t)},_initLayout:function(){var t=this._container,e=(this._fadeAnimated=this.options.fadeAnimation&&b.any3d,M(t,"leaflet-container"+(b.touch?" leaflet-touch":"")+(b.retina?" leaflet-retina":"")+(b.ielt9?" leaflet-oldie":"")+(b.safari?" leaflet-safari":"")+(this._fadeAnimated?" leaflet-fade-anim":"")),pe(t,"position"));"absolute"!==e&&"relative"!==e&&"fixed"!==e&&"sticky"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._paneRenderers={},this._mapPane=this.createPane("mapPane",this._container),Z(this._mapPane,new p(0,0)),this.createPane("tilePane"),this.createPane("overlayPane"),this.createPane("shadowPane"),this.createPane("markerPane"),this.createPane("tooltipPane"),this.createPane("popupPane"),this.options.markerZoomAnimation||(M(t.markerPane,"leaflet-zoom-hide"),M(t.shadowPane,"leaflet-zoom-hide"))},_resetView:function(t,e,i){Z(this._mapPane,new p(0,0));var n=!this._loaded,o=(this._loaded=!0,e=this._limitZoom(e),this.fire("viewprereset"),this._zoom!==e);this._moveStart(o,i)._move(t,e)._moveEnd(o),this.fire("viewreset"),n&&this.fire("load")},_moveStart:function(t,e){return t&&this.fire("zoomstart"),e||this.fire("movestart"),this},_move:function(t,e,i,n){void 0===e&&(e=this._zoom);var o=this._zoom!==e;return this._zoom=e,this._lastCenter=t,this._pixelOrigin=this._getNewPixelOrigin(t),n?i&&i.pinch&&this.fire("zoom",i):((o||i&&i.pinch)&&this.fire("zoom",i),this.fire("move",i)),this},_moveEnd:function(t){return t&&this.fire("zoomend"),this.fire("moveend")},_stop:function(){return r(this._flyToFrame),this._panAnim&&this._panAnim.stop(),this},_rawPanBy:function(t){Z(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_panInsideMaxBounds:function(){this._enforcingBounds||this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(t){this._targets={};var e=t?k:S;e((this._targets[h(this._container)]=this)._container,"click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress keydown keyup",this._handleDOMEvent,this),this.options.trackResize&&e(window,"resize",this._onResize,this),b.any3d&&this.options.transform3DLimit&&(t?this.off:this.on).call(this,"moveend",this._onMoveEnd)},_onResize:function(){r(this._resizeRequest),this._resizeRequest=x(function(){this.invalidateSize({debounceMoveend:!0})},this)},_onScroll:function(){this._container.scrollTop=0,this._container.scrollLeft=0},_onMoveEnd:function(){var t=this._getMapPanePos();Math.max(Math.abs(t.x),Math.abs(t.y))>=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(t,e){for(var i,n=[],o="mouseout"===e||"mouseover"===e,s=t.target||t.srcElement,r=!1;s;){if((i=this._targets[h(s)])&&("click"===e||"preclick"===e)&&this._draggableMoved(i)){r=!0;break}if(i&&i.listens(e,!0)){if(o&&!We(s,t))break;if(n.push(i),o)break}if(s===this._container)break;s=s.parentNode}return n=n.length||r||o||!this.listens(e,!0)?n:[this]},_isClickDisabled:function(t){for(;t&&t!==this._container;){if(t._leaflet_disable_click)return!0;t=t.parentNode}},_handleDOMEvent:function(t){var e,i=t.target||t.srcElement;!this._loaded||i._leaflet_disable_events||"click"===t.type&&this._isClickDisabled(i)||("mousedown"===(e=t.type)&&Me(i),this._fireDOMEvent(t,e))},_mouseEvents:["click","dblclick","mouseover","mouseout","contextmenu"],_fireDOMEvent:function(t,e,i){"click"===t.type&&((a=l({},t)).type="preclick",this._fireDOMEvent(a,a.type,i));var n=this._findEventTargets(t,e);if(i){for(var o=[],s=0;sthis.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),n=this._getCenterOffset(t)._divideBy(1-1/n);if(!0!==i.animate&&!this.getSize().contains(n))return!1;x(function(){this._moveStart(!0,i.noMoveStart||!1)._animateZoom(t,e,!0)},this)}return!0},_animateZoom:function(t,e,i,n){this._mapPane&&(i&&(this._animatingZoom=!0,this._animateToCenter=t,this._animateToZoom=e,M(this._mapPane,"leaflet-zoom-anim")),this.fire("zoomanim",{center:t,zoom:e,noUpdate:n}),this._tempFireZoomEvent||(this._tempFireZoomEvent=this._zoom!==this._animateToZoom),this._move(this._animateToCenter,this._animateToZoom,void 0,!0),setTimeout(a(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&z(this._mapPane,"leaflet-zoom-anim"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom,void 0,!0),this._tempFireZoomEvent&&this.fire("zoom"),delete this._tempFireZoomEvent,this.fire("move"),this._moveEnd(!0))}});function Ue(t){return new B(t)}var B=et.extend({options:{position:"topright"},initialize:function(t){c(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this.remove(),this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),t=t._controlCorners[i];return M(e,"leaflet-control"),-1!==i.indexOf("bottom")?t.insertBefore(e,t.firstChild):t.appendChild(e),this._map.on("unload",this.remove,this),this},remove:function(){return this._map&&(T(this._container),this.onRemove&&this.onRemove(this._map),this._map.off("unload",this.remove,this),this._map=null),this},_refocusOnMap:function(t){this._map&&t&&0",e=document.createElement("div");return e.innerHTML=t,e.firstChild},_addItem:function(t){var e,i=document.createElement("label"),n=this._map.hasLayer(t.layer),n=(t.overlay?((e=document.createElement("input")).type="checkbox",e.className="leaflet-control-layers-selector",e.defaultChecked=n):e=this._createRadioElement("leaflet-base-layers_"+h(this),n),this._layerControlInputs.push(e),e.layerId=h(t.layer),S(e,"click",this._onInputClick,this),document.createElement("span")),o=(n.innerHTML=" "+t.name,document.createElement("span"));return i.appendChild(o),o.appendChild(e),o.appendChild(n),(t.overlay?this._overlaysList:this._baseLayersList).appendChild(i),this._checkDisabledLayers(),i},_onInputClick:function(){if(!this._preventClick){var t,e,i=this._layerControlInputs,n=[],o=[];this._handlingClick=!0;for(var s=i.length-1;0<=s;s--)t=i[s],e=this._getLayer(t.layerId).layer,t.checked?n.push(e):t.checked||o.push(e);for(s=0;se.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expandSafely:function(){var t=this._section,e=(this._preventClick=!0,S(t,"click",O),this.expand(),this);setTimeout(function(){k(t,"click",O),e._preventClick=!1})}})),qe=B.extend({options:{position:"topleft",zoomInText:'',zoomInTitle:"Zoom in",zoomOutText:'',zoomOutTitle:"Zoom out"},onAdd:function(t){var e="leaflet-control-zoom",i=P("div",e+" leaflet-bar"),n=this.options;return this._zoomInButton=this._createButton(n.zoomInText,n.zoomInTitle,e+"-in",i,this._zoomIn),this._zoomOutButton=this._createButton(n.zoomOutText,n.zoomOutTitle,e+"-out",i,this._zoomOut),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(t){!this._disabled&&this._map._zoomthis._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(t.shiftKey?3:1))},_createButton:function(t,e,i,n,o){i=P("a",i,n);return i.innerHTML=t,i.href="#",i.title=e,i.setAttribute("role","button"),i.setAttribute("aria-label",e),Ie(i),S(i,"click",Re),S(i,"click",o,this),S(i,"click",this._refocusOnMap,this),i},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";z(this._zoomInButton,e),z(this._zoomOutButton,e),this._zoomInButton.setAttribute("aria-disabled","false"),this._zoomOutButton.setAttribute("aria-disabled","false"),!this._disabled&&t._zoom!==t.getMinZoom()||(M(this._zoomOutButton,e),this._zoomOutButton.setAttribute("aria-disabled","true")),!this._disabled&&t._zoom!==t.getMaxZoom()||(M(this._zoomInButton,e),this._zoomInButton.setAttribute("aria-disabled","true"))}}),Ge=(A.mergeOptions({zoomControl:!0}),A.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new qe,this.addControl(this.zoomControl))}),B.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0},onAdd:function(t){var e="leaflet-control-scale",i=P("div",e),n=this.options;return this._addScales(n,e+"-line",i),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=P("div",e,i)),t.imperial&&(this._iScale=P("div",e,i))},_update:function(){var t=this._map,e=t.getSize().y/2,t=t.distance(t.containerPointToLatLng([0,e]),t.containerPointToLatLng([this.options.maxWidth,e]));this._updateScales(t)},_updateScales:function(t){this.options.metric&&t&&this._updateMetric(t),this.options.imperial&&t&&this._updateImperial(t)},_updateMetric:function(t){var e=this._getRoundNum(t);this._updateScale(this._mScale,e<1e3?e+" m":e/1e3+" km",e/t)},_updateImperial:function(t){var e,i,t=3.2808399*t;5280'+(b.inlineSvg?' ':"")+"Leaflet"},initialize:function(t){c(this,t),this._attributions={}},onAdd:function(t){for(var e in(t.attributionControl=this)._container=P("div","leaflet-control-attribution"),Ie(this._container),t._layers)t._layers[e].getAttribution&&this.addAttribution(t._layers[e].getAttribution());return this._update(),t.on("layeradd",this._addAttribution,this),this._container},onRemove:function(t){t.off("layeradd",this._addAttribution,this)},_addAttribution:function(t){t.layer.getAttribution&&(this.addAttribution(t.layer.getAttribution()),t.layer.once("remove",function(){this.removeAttribution(t.layer.getAttribution())},this))},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t&&(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update()),this},removeAttribution:function(t){return t&&this._attributions[t]&&(this._attributions[t]--,this._update()),this},_update:function(){if(this._map){var t,e=[];for(t in this._attributions)this._attributions[t]&&e.push(t);var i=[];this.options.prefix&&i.push(this.options.prefix),e.length&&i.push(e.join(", ")),this._container.innerHTML=i.join(' ')}}}),n=(A.mergeOptions({attributionControl:!0}),A.addInitHook(function(){this.options.attributionControl&&(new Ke).addTo(this)}),B.Layers=Ve,B.Zoom=qe,B.Scale=Ge,B.Attribution=Ke,Ue.layers=function(t,e,i){return new Ve(t,e,i)},Ue.zoom=function(t){return new qe(t)},Ue.scale=function(t){return new Ge(t)},Ue.attribution=function(t){return new Ke(t)},et.extend({initialize:function(t){this._map=t},enable:function(){return this._enabled||(this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled&&(this._enabled=!1,this.removeHooks()),this},enabled:function(){return!!this._enabled}})),ft=(n.addTo=function(t,e){return t.addHandler(e,this),this},{Events:e}),Ye=b.touch?"touchstart mousedown":"mousedown",Xe=it.extend({options:{clickTolerance:3},initialize:function(t,e,i,n){c(this,n),this._element=t,this._dragStartTarget=e||t,this._preventOutline=i},enable:function(){this._enabled||(S(this._dragStartTarget,Ye,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(Xe._dragging===this&&this.finishDrag(!0),k(this._dragStartTarget,Ye,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(t){var e,i;this._enabled&&(this._moved=!1,ve(this._element,"leaflet-zoom-anim")||(t.touches&&1!==t.touches.length?Xe._dragging===this&&this.finishDrag():Xe._dragging||t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||((Xe._dragging=this)._preventOutline&&Me(this._element),Le(),re(),this._moving||(this.fire("down"),i=t.touches?t.touches[0]:t,e=Ce(this._element),this._startPoint=new p(i.clientX,i.clientY),this._startPos=Pe(this._element),this._parentScale=Ze(e),i="mousedown"===t.type,S(document,i?"mousemove":"touchmove",this._onMove,this),S(document,i?"mouseup":"touchend touchcancel",this._onUp,this)))))},_onMove:function(t){var e;this._enabled&&(t.touches&&1e&&(i.push(t[n]),o=n);oe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i}function ri(t,e,i,n){var o=e.x,e=e.y,s=i.x-o,r=i.y-e,a=s*s+r*r;return 0this._layersMaxZoom&&this.setZoom(this._layersMaxZoom),void 0===this.options.minZoom&&this._layersMinZoom&&this.getZoom()t.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(l=!l);return l||yi.prototype._containsPoint.call(this,t,!0)}});var wi=ci.extend({initialize:function(t,e){c(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n,o=d(t)?t:t.features;if(o){for(e=0,i=o.length;es.x&&(r=i.x+a-s.x+o.x),i.x-r-n.x<(a=0)&&(r=i.x-n.x),i.y+e+o.y>s.y&&(a=i.y+e-s.y+o.y),i.y-a-n.y<0&&(a=i.y-n.y),(r||a)&&(this.options.keepInView&&(this._autopanning=!0),t.fire("autopanstart").panBy([r,a]))))},_getAnchor:function(){return m(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}})),Ii=(A.mergeOptions({closePopupOnClick:!0}),A.include({openPopup:function(t,e,i){return this._initOverlay(Bi,t,e,i).openOn(this),this},closePopup:function(t){return(t=arguments.length?t:this._popup)&&t.close(),this}}),o.include({bindPopup:function(t,e){return this._popup=this._initOverlay(Bi,this._popup,t,e),this._popupHandlersAdded||(this.on({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(t){return this._popup&&(this instanceof ci||(this._popup._source=this),this._popup._prepareOpen(t||this._latlng)&&this._popup.openOn(this._map)),this},closePopup:function(){return this._popup&&this._popup.close(),this},togglePopup:function(){return this._popup&&this._popup.toggle(this),this},isPopupOpen:function(){return!!this._popup&&this._popup.isOpen()},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},getPopup:function(){return this._popup},_openPopup:function(t){var e;this._popup&&this._map&&(Re(t),e=t.layer||t.target,this._popup._source!==e||e instanceof fi?(this._popup._source=e,this.openPopup(t.latlng)):this._map.hasLayer(this._popup)?this.closePopup():this.openPopup(t.latlng))},_movePopup:function(t){this._popup.setLatLng(t.latlng)},_onKeyPress:function(t){13===t.originalEvent.keyCode&&this._openPopup(t)}}),Ai.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:!1,sticky:!1,opacity:.9},onAdd:function(t){Ai.prototype.onAdd.call(this,t),this.setOpacity(this.options.opacity),t.fire("tooltipopen",{tooltip:this}),this._source&&(this.addEventParent(this._source),this._source.fire("tooltipopen",{tooltip:this},!0))},onRemove:function(t){Ai.prototype.onRemove.call(this,t),t.fire("tooltipclose",{tooltip:this}),this._source&&(this.removeEventParent(this._source),this._source.fire("tooltipclose",{tooltip:this},!0))},getEvents:function(){var t=Ai.prototype.getEvents.call(this);return this.options.permanent||(t.preclick=this.close),t},_initLayout:function(){var t="leaflet-tooltip "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=P("div",t),this._container.setAttribute("role","tooltip"),this._container.setAttribute("id","leaflet-tooltip-"+h(this))},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(t){var e,i=this._map,n=this._container,o=i.latLngToContainerPoint(i.getCenter()),i=i.layerPointToContainerPoint(t),s=this.options.direction,r=n.offsetWidth,a=n.offsetHeight,h=m(this.options.offset),l=this._getAnchor(),i="top"===s?(e=r/2,a):"bottom"===s?(e=r/2,0):(e="center"===s?r/2:"right"===s?0:"left"===s?r:i.xthis.options.maxZoom||nthis.options.maxZoom||void 0!==this.options.minZoom&&oi.max.x)||!e.wrapLat&&(t.yi.max.y))return!1}return!this.options.bounds||(e=this._tileCoordsToBounds(t),g(this.options.bounds).overlaps(e))},_keyToBounds:function(t){return this._tileCoordsToBounds(this._keyToTileCoords(t))},_tileCoordsToNwSe:function(t){var e=this._map,i=this.getTileSize(),n=t.scaleBy(i),i=n.add(i);return[e.unproject(n,t.z),e.unproject(i,t.z)]},_tileCoordsToBounds:function(t){t=this._tileCoordsToNwSe(t),t=new s(t[0],t[1]);return t=this.options.noWrap?t:this._map.wrapLatLngBounds(t)},_tileCoordsToKey:function(t){return t.x+":"+t.y+":"+t.z},_keyToTileCoords:function(t){var t=t.split(":"),e=new p(+t[0],+t[1]);return e.z=+t[2],e},_removeTile:function(t){var e=this._tiles[t];e&&(T(e.el),delete this._tiles[t],this.fire("tileunload",{tile:e.el,coords:this._keyToTileCoords(t)}))},_initTile:function(t){M(t,"leaflet-tile");var e=this.getTileSize();t.style.width=e.x+"px",t.style.height=e.y+"px",t.onselectstart=u,t.onmousemove=u,b.ielt9&&this.options.opacity<1&&C(t,this.options.opacity)},_addTile:function(t,e){var i=this._getTilePos(t),n=this._tileCoordsToKey(t),o=this.createTile(this._wrapCoords(t),a(this._tileReady,this,t));this._initTile(o),this.createTile.length<2&&x(a(this._tileReady,this,t,null,o)),Z(o,i),this._tiles[n]={el:o,coords:t,current:!0},e.appendChild(o),this.fire("tileloadstart",{tile:o,coords:t})},_tileReady:function(t,e,i){e&&this.fire("tileerror",{error:e,tile:i,coords:t});var n=this._tileCoordsToKey(t);(i=this._tiles[n])&&(i.loaded=+new Date,this._map._fadeAnimated?(C(i.el,0),r(this._fadeFrame),this._fadeFrame=x(this._updateOpacity,this)):(i.active=!0,this._pruneTiles()),e||(M(i.el,"leaflet-tile-loaded"),this.fire("tileload",{tile:i.el,coords:t})),this._noTilesToLoad()&&(this._loading=!1,this.fire("load"),b.ielt9||!this._map._fadeAnimated?x(this._pruneTiles,this):setTimeout(a(this._pruneTiles,this),250)))},_getTilePos:function(t){return t.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(t){var e=new p(this._wrapX?H(t.x,this._wrapX):t.x,this._wrapY?H(t.y,this._wrapY):t.y);return e.z=t.z,e},_pxBoundsToTileRange:function(t){var e=this.getTileSize();return new f(t.min.unscaleBy(e).floor(),t.max.unscaleBy(e).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var t in this._tiles)if(!this._tiles[t].loaded)return!1;return!0}});var Di=Ni.extend({options:{minZoom:0,maxZoom:18,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1,referrerPolicy:!1},initialize:function(t,e){this._url=t,(e=c(this,e)).detectRetina&&b.retina&&0')}}catch(t){}return function(t){return document.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}(),zt={_initContainer:function(){this._container=P("div","leaflet-vml-container")},_update:function(){this._map._animatingZoom||(Wi.prototype._update.call(this),this.fire("update"))},_initPath:function(t){var e=t._container=Vi("shape");M(e,"leaflet-vml-shape "+(this.options.className||"")),e.coordsize="1 1",t._path=Vi("path"),e.appendChild(t._path),this._updateStyle(t),this._layers[h(t)]=t},_addPath:function(t){var e=t._container;this._container.appendChild(e),t.options.interactive&&t.addInteractiveTarget(e)},_removePath:function(t){var e=t._container;T(e),t.removeInteractiveTarget(e),delete this._layers[h(t)]},_updateStyle:function(t){var e=t._stroke,i=t._fill,n=t.options,o=t._container;o.stroked=!!n.stroke,o.filled=!!n.fill,n.stroke?(e=e||(t._stroke=Vi("stroke")),o.appendChild(e),e.weight=n.weight+"px",e.color=n.color,e.opacity=n.opacity,n.dashArray?e.dashStyle=d(n.dashArray)?n.dashArray.join(" "):n.dashArray.replace(/( *, *)/g," "):e.dashStyle="",e.endcap=n.lineCap.replace("butt","flat"),e.joinstyle=n.lineJoin):e&&(o.removeChild(e),t._stroke=null),n.fill?(i=i||(t._fill=Vi("fill")),o.appendChild(i),i.color=n.fillColor||n.color,i.opacity=n.fillOpacity):i&&(o.removeChild(i),t._fill=null)},_updateCircle:function(t){var e=t._point.round(),i=Math.round(t._radius),n=Math.round(t._radiusY||i);this._setPath(t,t._empty()?"M0 0":"AL "+e.x+","+e.y+" "+i+","+n+" 0,23592600")},_setPath:function(t,e){t._path.v=e},_bringToFront:function(t){fe(t._container)},_bringToBack:function(t){ge(t._container)}},qi=b.vml?Vi:ct,Gi=Wi.extend({_initContainer:function(){this._container=qi("svg"),this._container.setAttribute("pointer-events","none"),this._rootGroup=qi("g"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){T(this._container),k(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_update:function(){var t,e,i;this._map._animatingZoom&&this._bounds||(Wi.prototype._update.call(this),e=(t=this._bounds).getSize(),i=this._container,this._svgSize&&this._svgSize.equals(e)||(this._svgSize=e,i.setAttribute("width",e.x),i.setAttribute("height",e.y)),Z(i,t.min),i.setAttribute("viewBox",[t.min.x,t.min.y,e.x,e.y].join(" ")),this.fire("update"))},_initPath:function(t){var e=t._path=qi("path");t.options.className&&M(e,t.options.className),t.options.interactive&&M(e,"leaflet-interactive"),this._updateStyle(t),this._layers[h(t)]=t},_addPath:function(t){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(t._path),t.addInteractiveTarget(t._path)},_removePath:function(t){T(t._path),t.removeInteractiveTarget(t._path),delete this._layers[h(t)]},_updatePath:function(t){t._project(),t._update()},_updateStyle:function(t){var e=t._path,t=t.options;e&&(t.stroke?(e.setAttribute("stroke",t.color),e.setAttribute("stroke-opacity",t.opacity),e.setAttribute("stroke-width",t.weight),e.setAttribute("stroke-linecap",t.lineCap),e.setAttribute("stroke-linejoin",t.lineJoin),t.dashArray?e.setAttribute("stroke-dasharray",t.dashArray):e.removeAttribute("stroke-dasharray"),t.dashOffset?e.setAttribute("stroke-dashoffset",t.dashOffset):e.removeAttribute("stroke-dashoffset")):e.setAttribute("stroke","none"),t.fill?(e.setAttribute("fill",t.fillColor||t.color),e.setAttribute("fill-opacity",t.fillOpacity),e.setAttribute("fill-rule",t.fillRule||"evenodd")):e.setAttribute("fill","none"))},_updatePoly:function(t,e){this._setPath(t,dt(t._parts,e))},_updateCircle:function(t){var e=t._point,i=Math.max(Math.round(t._radius),1),n="a"+i+","+(Math.max(Math.round(t._radiusY),1)||i)+" 0 1,0 ",e=t._empty()?"M0 0":"M"+(e.x-i)+","+e.y+n+2*i+",0 "+n+2*-i+",0 ";this._setPath(t,e)},_setPath:function(t,e){t._path.setAttribute("d",e)},_bringToFront:function(t){fe(t._path)},_bringToBack:function(t){ge(t._path)}});function Ki(t){return b.svg||b.vml?new Gi(t):null}b.vml&&Gi.include(zt),A.include({getRenderer:function(t){t=(t=t.options.renderer||this._getPaneRenderer(t.options.pane)||this.options.renderer||this._renderer)||(this._renderer=this._createRenderer());return this.hasLayer(t)||this.addLayer(t),t},_getPaneRenderer:function(t){var e;return"overlayPane"!==t&&void 0!==t&&(void 0===(e=this._paneRenderers[t])&&(e=this._createRenderer({pane:t}),this._paneRenderers[t]=e),e)},_createRenderer:function(t){return this.options.preferCanvas&&Ui(t)||Ki(t)}});var Yi=xi.extend({initialize:function(t,e){xi.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){return this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return[(t=g(t)).getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}});Gi.create=qi,Gi.pointsToPath=dt,wi.geometryToLayer=bi,wi.coordsToLatLng=Li,wi.coordsToLatLngs=Ti,wi.latLngToCoords=Mi,wi.latLngsToCoords=zi,wi.getFeature=Ci,wi.asFeature=Zi,A.mergeOptions({boxZoom:!0});var _t=n.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){S(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){k(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){T(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),re(),Le(),this._startPoint=this._map.mouseEventToContainerPoint(t),S(document,{contextmenu:Re,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=P("div","leaflet-zoom-box",this._container),M(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t);var t=new f(this._point,this._startPoint),e=t.getSize();Z(this._box,t.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(T(this._box),z(this._container,"leaflet-crosshair")),ae(),Te(),k(document,{contextmenu:Re,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(t){1!==t.which&&1!==t.button||(this._finish(),this._moved&&(this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(a(this._resetState,this),0),t=new s(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point)),this._map.fitBounds(t).fire("boxzoomend",{boxZoomBounds:t})))},_onKeyDown:function(t){27===t.keyCode&&(this._finish(),this._clearDeferredResetState(),this._resetState())}}),Ct=(A.addInitHook("addHandler","boxZoom",_t),A.mergeOptions({doubleClickZoom:!0}),n.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var e=this._map,i=e.getZoom(),n=e.options.zoomDelta,i=t.originalEvent.shiftKey?i-n:i+n;"center"===e.options.doubleClickZoom?e.setZoom(i):e.setZoomAround(t.containerPoint,i)}})),Zt=(A.addInitHook("addHandler","doubleClickZoom",Ct),A.mergeOptions({dragging:!0,inertia:!0,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0}),n.extend({addHooks:function(){var t;this._draggable||(t=this._map,this._draggable=new Xe(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),this._draggable.on("predrag",this._onPreDragLimit,this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDragWrap,this),t.on("zoomend",this._onZoomEnd,this),t.whenReady(this._onZoomEnd,this))),M(this._map._container,"leaflet-grab leaflet-touch-drag"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){z(this._map._container,"leaflet-grab"),z(this._map._container,"leaflet-touch-drag"),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDragStart:function(){var t,e=this._map;e._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity?(t=g(this._map.options.maxBounds),this._offsetLimit=_(this._map.latLngToContainerPoint(t.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(t.getSouthEast()).multiplyBy(-1).add(this._map.getSize())),this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))):this._offsetLimit=null,e.fire("movestart").fire("dragstart"),e.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(t){var e,i;this._map.options.inertia&&(e=this._lastTime=+new Date,i=this._lastPos=this._draggable._absPos||this._draggable._newPos,this._positions.push(i),this._times.push(e),this._prunePositions(e)),this._map.fire("move",t).fire("drag",t)},_prunePositions:function(t){for(;1e.max.x&&(t.x=this._viscousLimit(t.x,e.max.x)),t.y>e.max.y&&(t.y=this._viscousLimit(t.y,e.max.y)),this._draggable._newPos=this._draggable._startPos.add(t))},_onPreDragWrap:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,n=(n+e+i)%t-e-i,t=Math.abs(o+i)e.getMaxZoom()&&1=')) { - ajax::error(displayException($e), $e->getCode()); - } else { - ajax::error(displayExeption($e), $e->getCode()); - } + ajax::error(displayException($e), $e->getCode()); } diff --git a/core/class/jeeasy.class.php b/core/class/jeeasy.class.php index 9728e65..6eab56d 100755 --- a/core/class/jeeasy.class.php +++ b/core/class/jeeasy.class.php @@ -22,6 +22,227 @@ class jeeasy extends eqLogic { + public static function getPluginDetails($_marketId = null) { + $marketURL = config::byKey('market::address'); + $pluginDetails = array( + 26 => [ + 'logicalId' => 'alarm', + 'name' => __('Alarme', __FILE__), + 'category' => ' ' . __('Sécurité', __FILE__), + 'icon' => $marketURL . '/filestore/market/plugin/images/alarm_icon.png', + 'description' => __("Créez facilement votre système d'alarme sur mesure", __FILE__), + 'installed' => is_file(__DIR__ . '/../../../alarm/plugin_info/info.json') + ], + 52 => [ + 'logicalId' => 'rfxcom', + 'name' => __('RFXcom', __FILE__), + 'category' => ' ' . __('Protocole domotique', __FILE__), + 'icon' => $marketURL . '/filestore/market/plugin/images/rfxcom_icon.png', + 'description' => __("Pilotez vos périphériques RFXcom", __FILE__), + 'installed' => is_file(__DIR__ . '/../../../rfxcom/plugin_info/info.json') + ], + 203 => [ + 'logicalId' => 'eibd', + 'name' => __('EIB - KNX', __FILE__), + 'category' => ' ' . __('Protocole domotique', __FILE__), + 'icon' => $marketURL . '/filestore/market/plugin/images/eibd_icon.png', + 'description' => __("Pilotez vos périphériques KNX", __FILE__), + 'installed' => is_file(__DIR__ . '/../../../eibd/plugin_info/info.json') + ], + 1666 => [ + 'logicalId' => 'Freebox_OS', + 'name' => __('Freebox OS', __FILE__), + 'category' => ' ' . __('Monitoring', __FILE__), + 'icon' => $marketURL . '/filestore/market/plugin/images/Freebox_OS_icon.png', + 'description' => __("Prenez le contrôle de votre Freebox", __FILE__), + 'installed' => is_file(__DIR__ . '/../../../Freebox_OS/plugin_info/info.json') + ], + 2030 => [ + 'logicalId' => 'mobile', + 'name' => __('Mobile', __FILE__), + 'category' => ' ' . __('Communication', __FILE__), + 'icon' => $marketURL . '/filestore/market/plugin/images/mobile_icon.png', + 'description' => __("Pilotez votre installation domotique depuis iOS/Android", __FILE__), + 'installed' => is_file(__DIR__ . '/../../../mobile/plugin_info/info.json') + ], + 2046 => [ + 'logicalId' => 'ipx800v4', + 'name' => __('IPX 800 v4', __FILE__), + 'category' => ' ' . __('Protocole domotique', __FILE__), + 'icon' => $marketURL . '/filestore/market/plugin/images/ipx800v4_icon.png', + 'description' => __("Pilotez vos périphériques IPX 800", __FILE__), + 'installed' => is_file(__DIR__ . '/../../../ipx800v4/plugin_info/info.json') + ], + // 2286 => [ + // 'logicalId' => 'wifip', + // 'name' => __('Wifip', __FILE__), + // 'category' => ' ' . __('Communication', __FILE__), + // 'icon' => $marketURL . '/filestore/market/plugin/images/wifip_icon.png', + // 'description' => '', + // 'installed' => is_file(__DIR__ . '/../../../wifip/plugin_info/info.json') + // ], + 2622 => [ + 'logicalId' => 'openenocean', + 'name' => __('EnOcean', __FILE__), + 'category' => ' ' . __('Protocole domotique', __FILE__), + 'icon' => $marketURL . '/filestore/market/plugin/images/openenocean_icon.png', + 'description' => __("Pilotez vos périphériques Enocean", __FILE__), + 'installed' => is_file(__DIR__ . '/../../../openenocean/plugin_info/info.json') + ], + // 2781 => [ + // 'logicalId' => 'rfplayer', + // 'name' => __('Ziblue RfPlayer', __FILE__), + // 'category' => ' ' . __('Protocole domotique', __FILE__), + // 'icon' => $marketURL . '/filestore/market/plugin/images/rfplayer_icon.png', + // 'description' => '', + // 'installed' => is_file(__DIR__ . '/../../../rfplayer/plugin_info/info.json') + // ], + 3349 => [ + 'logicalId' => 'rfplayer2', + 'name' => __('RfPlayer2', __FILE__), + 'category' => ' ' . __('Protocole domotique', __FILE__), + 'icon' => $marketURL . '/filestore/market/plugin/images/rfplayer2_icon.png', + 'description' => __("Pilotez vos périphériques RF Player", __FILE__), + 'installed' => is_file(__DIR__ . '/../../../rfplayer2/plugin_info/info.json') + ], + 3610 => [ + 'logicalId' => 'deconz', + 'name' => __('Deconz', __FILE__), + 'category' => ' ' . __('Protocole domotique', __FILE__), + 'icon' => $marketURL . '/filestore/market/plugin/images/deconz_icon.png', + 'description' => __("Pilotez vos périphériques Deconz", __FILE__), + 'installed' => is_file(__DIR__ . '/../../../deconz/plugin_info/info.json') + ], + 3895 => [ + 'logicalId' => 'ventilairsec', + 'name' => __('Ventilairsec', __FILE__), + 'category' => ' ' . __('Monitoring', __FILE__), + 'icon' => $marketURL . '/filestore/market/plugin/images/ventilairsec_icon.png', + 'description' => __("Liez votre VMI du groupe Ventilairsec avec l'application VMI Link", __FILE__), + 'installed' => is_file(__DIR__ . '/../../../ventilairsec/plugin_info/info.json') + ], + // 4050 => [ + // 'logicalId' => 'zigbee', + // 'name' => __('Zigbee', __FILE__), + // 'category' => ' ' . __('Protocole domotique', __FILE__), + // 'icon' => $marketURL . '/filestore/market/plugin/images/zigbee_icon.png', + // 'description' => ', + // 'installed' => is_file(__DIR__ . '/../../../zigbee/plugin_info/info.json') + // ], + 4146 => [ + 'logicalId' => 'lorapayload', + 'name' => __('Lora Payload', __FILE__), + 'category' => ' ' . __('Protocole domotique', __FILE__), + 'icon' => $marketURL . '/filestore/market/plugin/images/lorapayload_icon.png', + 'description' => __("Pilotez vos périphériques Lora", __FILE__), + 'installed' => is_file(__DIR__ . '/../../../lorapayload/plugin_info/info.json') + ], + 4195 => [ + 'logicalId' => 'atlas', + 'name' => __('Atlas', __FILE__), + 'category' => ' ' . __('Passerelle domotique', __FILE__), + 'icon' => $marketURL . '/filestore/market/plugin/images/atlas_icon.png', + 'description' => __("Prenez le contrôle de votre Atlas", __FILE__), + 'installed' => is_file(__DIR__ . '/../../../atlas/plugin_info/info.json') + ], + 4306 => [ + 'logicalId' => 'zwavejs', + 'name' => __('Z-Wave JS', __FILE__), + 'category' => ' ' . __('Protocole domotique', __FILE__), + 'icon' => $marketURL . '/filestore/market/plugin/images/zwavejs_icon.png', + 'description' => __("Pilotez vos périphériques Z-Wave", __FILE__), + 'installed' => is_file(__DIR__ . '/../../../zwavejs/plugin_info/info.json') + ], + 4346 => [ + 'logicalId' => 'luna', + 'name' => __('Luna', __FILE__), + 'category' => ' ' . __('Passerelle domotique', __FILE__), + 'icon' => $marketURL . '/filestore/market/plugin/images/luna_icon.png', + 'description' => __("Prenez le contrôle de votre Luna", __FILE__), + 'installed' => is_file(__DIR__ . '/../../../luna/plugin_info/info.json') + ], + 4351 => [ + 'logicalId' => 'z2m', + 'name' => __('JeeZigbee', __FILE__), + 'category' => ' ' . __('Protocole domotique', __FILE__), + 'icon' => $marketURL . '/filestore/market/plugin/images/z2m_icon.png', + 'description' => __("Pilotez vos périphériques Zigbee", __FILE__), + 'installed' => is_file(__DIR__ . '/../../../z2m/plugin_info/info.json') + ], + 4408 => [ + 'logicalId' => 'lns', + 'name' => __('LNS', __FILE__), + 'category' => __('Programmation', __FILE__), + 'icon' => $marketURL . '/filestore/market/plugin/images/lns_icon.png', + 'description' => __("Installez et configurez automatiquement Chirpstack V3", __FILE__), + 'installed' => is_file(__DIR__ . '/../../../lns/plugin_info/info.json') + ] + ); + if (!$_marketId) { + return $pluginDetails; + } + if (isset($pluginDetails[$_marketId])) { + return $pluginDetails[$_marketId]; + } + return false; + } + + public static function getWizardSteps($_mode = 'default'): array { + $wizard['welcome'] = __('Accueil', __FILE__); + update::checkAllUpdate(); + if (update::nbNeedUpdate() > 0) { + $wizard['updates'] = __('Mises à jour', __FILE__); + } + if (in_array($hardware = strtolower(jeedom::getHardwareName()), ['atlas', 'luna', 'freeboxdelta'])) { + if (strpos($hardware, 'freebox') !== false) { + $hardware = 'freebox_OS'; + } + if (!is_object(update::byLogicalId($hardware))) { + $wizard[$hardware] = ucfirst($hardware); + } + } + $wizard['general'] = __('Général', __FILE__); + $wizard['interface'] = __('Interface', __FILE__); + $wizard['networks'] = __('Réseaux', __FILE__); + $wizard['plugins'] = __('Plugins', __FILE__); + $wizard['objects'] = __('Objets', __FILE__); + if ($_mode != 'mb') { + $wizard['services'] = __('Services', __FILE__); + } + $wizard['ready'] = __('Prêt à démarrer', __FILE__); + return $wizard; + } + + public static function getWizardMode(): string { + if (config::byKey('mbState', 'core', 0) == 1) { + return 'mb'; + } + return 'default'; + } + + public static function updateServicePackInfos() { + $servicePack = 'Community'; + $plugins = array(); + $jsonrpc = repo_market::getJsonRpc(); + if ($jsonrpc->sendRequest('servicepack::info')) { + $result = $jsonrpc->getResult(); + $servicePack = $result['licenceName']; + if ($servicePack != 'Community') { + if (is_array($result['licencePlugins'])) { + $plugins = $result['licencePlugins']; + } + $plugins = array_merge($plugins, $result['mainPlugins']); + } + config::save('SPInfos', array('servicePack' => $servicePack, 'plugins' => $plugins), __CLASS__); + return array('servicePack' => $servicePack, 'plugins' => $plugins); + } + return false; + } + + public static function cronDaily() { + self::updateServicePackInfos(); + } + public static function discoverNetwork() { global $JEEDOM_JEEASY_DISCOVER; $gw = shell_exec("ip route show default | awk '/default/ {print $3}'"); @@ -45,10 +266,10 @@ public static function discoverNetwork() { continue; } if (strpos($line, 'MAC Address') !== false) { - $name = substr($line, ($p = strpos($line, '(')+1), strrpos($line, ')')-$p); + $name = substr($line, ($p = strpos($line, '(') + 1), strrpos($line, ')') - $p); preg_match('/MAC Address: (.*?) \((.*?)\)/', $line, $matches); $return[$matches[1]] = array('name' => $matches[2], 'ip' => $previous); - // $name = $matches[2]; + // $name = $matches[2]; $mac = $matches[1]; $ip = $previous; $arrayTemp = array('mac' => $mac, 'ip' => $ip); @@ -88,304 +309,10 @@ public static function generateScenario($_name, $_replace = array()) { return json_decode(str_replace(array_keys($_replace), $_replace, json_encode(json_decode(file_get_contents(__DIR__ . '/../config/' . $_name . '.json'), true))), true); } - public static function changeLanguage($choice) { - if ($choice != '') { - config::save('language', $choice); - } - } - - public static function saveJson($_json) { - $jsonFile = __DIR__ . '/../../../../data/custom/wizard.json'; - if (!$fh = fopen($jsonFile, 'w')) { - throw new Exception(__('Impossible d\'ouvrir : ', __FILE__) . $jsonFile); - } - fwrite($fh, $_json); - fclose($fh); - return true; - } - - public static function sendObjects($_objects) { - - $roomsDatas = array( - 'cuisine' => array( - 'level' => 1, - 'name' => 'Cuisine', - 'image' => 'core/img/object_background/cuisine/cuisine_2.jpg', - 'icon' => '', - 'parent' => '' - ), - // 'bureau' => array( - // 'level' => 1, - // 'name' => 'Bureau', - // 'image' => 'core/img/object_background/bureau/bureau_1.jpg', - // 'icon' => '' - // 'parent' => '' - // ), - 'sam' => array( - 'level' => 1, - 'name' => 'Salle à manger', - 'image' => 'core/img/object_background/salle_a_manger/salle_a_manger_1.jpg', - 'icon' => '', - 'parent' => '' - ), - 'salon' => array( - 'level' => 1, - 'name' => 'Salon', - 'image' => 'core/img/object_background/salon/salon_2.jpg', - 'icon' => '', - 'parent' => '' - ), - 'sdb' => array( - 'level' => 1, - 'name' => 'Salle de bain', - 'image' => 'core/img/object_background/salle_de_bain/salle_de_bain_1.jpg', - 'icon' => '', - 'parent' => '' - ), - 'chambre1' => array( - 'level' => 1, - 'name' => 'Chambre 1', - 'image' => 'core/img/object_background/chambre/chambre_1.jpg', - 'icon' => '', - 'parent' => '' - ), - 'chambre2' => array( - 'level' => 1, - 'name' => 'Chambre 2', - 'image' => 'core/img/object_background/chambre/chambre_3.jpg', - 'icon' => '', - 'parent' => '' - ), - 'chambre3' => array( - 'level' => 1, - 'name' => 'Chambre 3', - 'image' => 'core/img/object_background/chambre/chambre_4.jpg', - 'icon' => '', - 'parent' => '' - ) - ); - - $houseData = array( - 'house' => array( - 'name' => 'Maison', - 'image' => 'core/img/object_background/salon/salon_5.jpg', - 'icon' => '' - ), - 'apartment' => array( - 'name' => 'Appartement', - 'image' => 'core/img/object_background/cuisine/cuisine_1.jpg', - 'icon' => '' - ), - 'work' => array( - 'name' => 'Travail', - 'image' => 'core/img/object_background/bureau/bureau_1.jpg', - 'icon' => '' - ), - 'basement' => array( - 'name' => 'Batiment', - 'image' => 'core/img/object_background/batiment/industrial_building.jpg', - 'icon' => '' - ) - - ); - - $_objects = json_decode($_objects, true); - - preg_match('/\[([^]]+)\]/', $_objects[0], $key); - $main = $key[1]; - $house = jeeObject::byName($houseData[$main]['name']); - - if (!is_object($house)) { - //log::add('core', 'info', 'création box'); - $house = new jeeObject(); - $house->setName($houseData[$main]['name']); - $house->setIsVisible(1); - $house->setFather_id(0); - $house->save(); - $house->setDisplay('icon', $houseData[$main]['icon']); - $files = ls(__DIR__ . '/../../../../data/object/', 'object' . $house->getId() . '*'); - if (count($files) > 0) { - foreach ($files as $file) { - unlink(__DIR__ . '/../../../../data/object/' . $file); - } - } - $house->setImage('type', 'jpg'); - $image = __DIR__ . '/../../../../' . $houseData[$main]['image']; - $house->setImage('sha512', sha512(file_get_contents($image))); - $filename = 'object' . $house->getId() . '-' . $house->getImage('sha512') . '.' . $house->getImage('type'); - $filepath = __DIR__ . '/../../../../data/object/' . $filename; - file_put_contents($filepath, file_get_contents($image)); - $house->save(); - } - - $houseId = $house->getId(); - - unset($_objects[0]); - $structure = array(); - $structure[$main]['image'] = 'core/img/object_background//'; - $structure[$main]['icon'] = ''; - - foreach ($_objects as $obj) { - - preg_match('/\[([^]]+)\]/', $obj, $regexRoom); - $currentRoom = $regexRoom[1]; - - $structure[$main]['rooms'][] = $roomsDatas[$currentRoom]; - - $room = jeeObject::byName($roomsDatas[$currentRoom]['name']); - - if (!is_object($room)) { - $room = new jeeObject(); - $room->setName($roomsDatas[$currentRoom]['name']); - $room->setIsVisible(1); - $room->setFather_id($houseId); - $room->save(); - $room->setDisplay('icon', $roomsDatas[$currentRoom]['icon']); - $files = ls(__DIR__ . '/../../../../data/object/', 'object' . $room->getId() . '*'); - if (count($files) > 0) { - foreach ($files as $file) { - unlink(__DIR__ . '/../../../../data/object/' . $file); - } - } - $room->setImage('type', 'jpg'); - $image = __DIR__ . '/../../../../' . $roomsDatas[$currentRoom]['image']; - $room->setImage('sha512', sha512(file_get_contents($image))); - $filename = 'object' . $room->getId() . '-' . $room->getImage('sha512') . '.' . $room->getImage('type'); - $filepath = __DIR__ . '/../../../../data/object/' . $filename; - file_put_contents($filepath, file_get_contents($image)); - $room->save(); - } - } - $json = json_encode($structure); - //self::saveJson($json); - return true; - } - - public static function generateObject() { - // $house = object::byName('box-' . $houseCode); - // if (!is_object($house)) { - // //log::add('core', 'info', 'création box'); - // $house = new object(); - // $house->setName('box-' . $houseCode); - // $house->setIsVisible(1); - // $house->setFather_id(0); - // $house->save(); - // } - // $houseId = $house->getId(); - // //on parse toutes les lignes pour trouver le logement passé en paramètre - // foreach ($Reader as $Row) { - // if ($Row[0] == $houseCode) { - // //list($cKey, $cValue) = explode('-', $Row[3], 2); - // $roomName = $Row[1]; - // $room = object::byName('Chambre '.$roomName); - // if (!is_object($room)) { - // //log::add('core', 'info', 'création pièce ' . $roomName); - // $room = new object(); - // } - // $room->setName('Chambre '.$roomName); - // $room->setIsVisible(1); - // $room->setFather_id($houseId); - // $room->save(); - // $roomId = $room->getId(); - } - - public static function checkPlugin($_plugin) { - if($_plugin == 'openvpn'){ - $plugin = $_plugin; - }else{ - $plugin = plugin::byId($_plugin); - } - - if (!is_object($plugin)) { - $plugin = $_plugin; - } - if(config::byKey('core::branch') == 'beta' || config::byKey('core::branch') == 'alpha'){ - self::checkInstallPlugin($plugin, 'beta'); - }else{ - self::checkInstallPlugin($plugin); - } - self::checkDependancyPlugin($plugin); - self::checkDeamonPlugin($plugin); - } - - public static function checkInstallPlugin($_plugin, $branch = 'stable') { - $plugin = !is_object($_plugin) ? $_plugin : plugin::byId($_plugin); - if (is_object($plugin) && $plugin->isActive()) { - return 'OK'; - } - $market_info = repo_market::byLogicalId($_plugin); - if (!is_object($market_info)) { - return __('Le plugin n\'est pas présent sur le market', __FILE__); - } - if ($market_info->getCost() > 0) { - if ($market_info->getPurchase() != 1) { - return __('Veuillez vous rendre sur le market pour acquérir le plugin puis refaire l\'opération. Plugin', __FILE__) . ' : ' . $market_info->getName(); - } - } - - $update = update::byLogicalId($_plugin); - if (!is_object($update)) { - $update = new update(); - } - $update->setLogicalId($_plugin); - $update->setSource('market'); - $update->setConfiguration('version', $branch); - $update->save(); - $update->doUpdate(); - $plugin = plugin::byId($_plugin); - if (!is_object($plugin)) { - return __('Impossible d\'installer le plugin', __FILE__) . ' : ' . $market_info->getName(); - } - if (!$plugin->isActive()) { - $plugin->setIsEnable(1); - } - if (!$plugin->isActive()) { - return __('Impossible d\'activer le plugin', __FILE__) . ' : ' . $market_info->getName(); - } - return 'OK'; - } - - public static function checkDependancyPlugin($_plugin) { - $plugin = is_object($_plugin) ? $_plugin : plugin::byId($_plugin); - if ($plugin->getHasDependency() != 1) { - return 'OK'; - } - $dependancy = $plugin->dependancy_info(); - if ($dependancy['state'] == 'ok') { - return 'OK'; - } - - $plugin->dependancy_install(); - $dependancy = $plugin->dependancy_info(); - if ($dependancy['state'] != 'ok') { - return __('Nous n\'arrivons pas à installer les dépendances du plugin. Nous vous conseillons de consulter les logs et/ou de contacter le support.', __FILE__); - } - return 'OK'; - } - - public static function configInternalPlugin($typeConfig, $key, $plugin) { - if ($typeConfig == 'gpio') { - $pluginConfigFile = dirname(__FILE__) . '/../data/pluginConfig.json'; - if (!file_exists($pluginConfigFile)) { - throw new Exception("{{Fichier pluginConfig introuvable}}", 1); - } - $pluginConfigFile = file_get_contents($pluginConfigFile); - $pluginsConf = json_decode($pluginConfigFile, true); - $step = $pluginsConf['pluginsInfos'][$plugin]['versions'][$key]; - - foreach ($step as $k => $v) { - config::save($k, $v, $plugin); - } - return 'gpio'; - } elseif ($typeConfig == 'usb') { - return 'usb'; - } - } - - public static function initStartBox(){ + public static function initStartBox() { log::removeAll(); log::add('jeeasy', 'debug', 'initStartBox'); - if(config::byKey('jeedom::firstUse') == 1){ + if (config::byKey('jeedom::firstUse') == 1) { config::save('api', config::genKey()); config::save('apimarket', config::genKey()); config::save('apipro', config::genKey()); @@ -394,40 +321,6 @@ public static function initStartBox(){ message::removeAll(); repo_market::test(); } - - public static function dns_Go() { - repo_market::test(); - try{ - jeeasy::checkPlugin('openvpn'); - sleep(10); - config::save('market::allowDNS',1); - network::dns_start(); - }catch (Exception $e) { - log::add('jeeasy', 'debug', 'erreur DNS > '.$e); - - } - sleep(2); - repo_market::test(); - } - - public static function checkDeamonPlugin($_plugin) { - $plugin = is_object($_plugin) ? $_plugin : plugin::byId($_plugin); - if ($plugin->getHasOwnDeamon() != 1) { - return; - } - $deamon = $plugin->deamon_info(); - if ($deamon['state'] == 'ok') { - return; - } - echo '
' . __('Nous avons détecté que le démon ne tourne pas, nous allons essayer de le démarrer. Merci de patienter...', __FILE__); - $plugin->deamon_start(); - sleep(5); - $deamon = $plugin->deamon_info(); - if ($deamon['state'] != 'ok') { - throw new Exception(__('Nous n\'arrivons pas à démarrer le démon du plugin. Nous vous conseillons de consulter les logs et/ou de contacter le support. Plugin', __FILE__) . ' : ' . $_plugin); - } - echo '
' . __('Démarrage du démon réussi', __FILE__); - } } class jeeasyCmd extends cmd { diff --git a/core/data/wizard.configuration.json b/core/data/wizard.configuration.json deleted file mode 100755 index 20cde59..0000000 --- a/core/data/wizard.configuration.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "trame": { - "accueil": { - "title": "Accueil", - "wizard": "jeedom_configuration_accueil", - "order": 0, - "custom": "", - "visible": 1 - }, - "general": { - "title": "Général", - "wizard": "jeedom_configuration_general", - "order": 1, - "custom": "", - "visible": 1 - }, - "market": { - "title": "Market", - "wizard": "jeedom_configuration_market", - "order": 2, - "custom": "", - "visible": 1 - }, - "reseaux": { - "title": "Réseaux locaux", - "wizard": "jeedom_configuration_reseaux", - "order": 3, - "custom": "", - "visible": 1 - }, - "dns": { - "title": "DNS", - "wizard": "jeedom_configuration_dns", - "order": 4, - "custom": "", - "visible": 1 - }, - "batterie": { - "title": "Batterie", - "wizard": "jeedom_configuration_batterie", - "order": 5, - "custom": "", - "visible": 1 - }, - "sauvegarde": { - "title": "Sauvegarde Cloud", - "wizard": "jeedom_configuration_sauvegarde", - "order": 6, - "custom": "", - "visible": 1 - }, - "discovery": { - "title": "Discovery", - "wizard": "jeedom_configuration_discovery", - "order": 7, - "custom": "", - "visible": 1 - }, - "app": { - "title": "App Mobile", - "wizard": "jeedom_configuration_app", - "order": 8, - "custom": "", - "visible": 1 - }, - "alertes": { - "title": "Alertes", - "wizard": "jeedom_configuration_alertes", - "order": 9, - "custom": "", - "visible": 1 - }, - "fin": { - "title": "Fin", - "wizard": "jeedom_configuration_fin", - "order": 10, - "custom": "", - "visible": 1 - } - }, - "update": 0 -} diff --git a/core/data/wizard.json b/core/data/wizard.json deleted file mode 100755 index d692f59..0000000 --- a/core/data/wizard.json +++ /dev/null @@ -1,113 +0,0 @@ -{ -"trame": { - "welcome" : - { - "title": "Bienvenue", - "wizard": "welcome", - "order": 0, - "custom": "", - "visible": 1 - } - , - "language" : - { - "title": "Choix de la langue", - "wizard": "language", - "order": 1, - "custom": "", - "visible": 1 - } - , - "boxName" : - { - "title": "Nommez votre box", - "wizard": "boxName", - "order": 2, - "custom": "", - "visible": 1 - }, - - "objects" : { - - "title": "Pièces", - "wizard": "objects", - "order": 3, - "custom": "", - "visible": 1 - - }, - "dnsGo" : { - - "title": "OpenVPN", - "wizard": "dnsGo", - "order": 4, - "custom": "", - "visible": 1 - - }, - "pack" : - { - "title": "Service pack", - "wizard": "pack", - "order": 5, - "custom": "", - "visible": 1 - } - , - "pluginsConfigs" : - { - "title": "Configuration des plugins", - "wizard": "pluginsConfigs", - "order": 6, - "custom": "", - "visible": 1 - } - , - "services" : - { - "title": "Services", - "wizard": "services", - "order": 7, - "custom": "", - "visible": 1 - } - , - "backupCloud" : - { - "title": "BackupCloud", - "wizard": "backupCloud", - "order": 8, - "custom": "", - "visible": 1 - } -, - "assistants" : - { - "title": "Assistants Vocaux", - "wizard": "assistants", - "order": 9, - "custom": "", - "visible": 1 - } - , - "atlas" : - { - "title": "Options Atlas", - "wizard": "atlas", - "order": 10, - "custom": "", - "visible": 1 - } - , - "ready" : - { - "title": "Prêt à démarrer", - "wizard": "ready", - "order": 11, - "custom": "", - "visible": 1 - } - - }, - "update": 1 -} diff --git a/core/img/check.jpg b/core/img/check.jpg deleted file mode 100755 index 8752986..0000000 Binary files a/core/img/check.jpg and /dev/null differ diff --git a/desktop/css/jeeasy.css b/desktop/css/jeeasy.css index bd4b6aa..5eca929 100755 --- a/desktop/css/jeeasy.css +++ b/desktop/css/jeeasy.css @@ -1,54 +1,12 @@ -.divTableJeeasy { - background-color:#f5f5f5; - padding: 10px !important; - height: 17em; - border-radius: 1em; - font-weight: bold; - text-align: center; - box-shadow: 0 1px 1.5px 0 rgba(0,0,0, 0.12), 0 1px 1px 0 rgba(0,0,0,0.24); -} - -.divTableJeeasy:active{ - box-shadow: inset 0 1px 1.5px 0 rgba(0,0,0, 0.12), inset 0 1px 1px 0 rgba(0,0,0,0.24); -} - -.divTableJeeasy:hover{ - background-color:#e4e4e4; - color: #87cf09; -} - -.iconTableJeeasy { - font-size: 10em; - margin-bottom: 20px; - margin-top:20px; -} - -.textInfoJeeasy{ -text-align: center; -font-weight: bold; -text-transform: uppercase; -margin-bottom: 20px; -font-size: 20px; -text-shadow: 1px 1px 1px rgba(0,0,0,1); -} - - #tableDiscover { - width: 100%; - + width: 100%; } - -#tdName{ -border-top: 1px solid rgb(147, 202, 2); -font-weight: bold; -font-size: 20; -color:#93ca02; -text-decoration: underline #93ca02; -text-underline-offset: 3px; +#tdName { + border-top: 1px solid rgb(147, 202, 2); + font-weight: bold; + font-size: 20; + color: #93ca02; + text-decoration: underline #93ca02; + text-underline-offset: 3px; } - - -#div_mainContainer{ -background-color: rgba(135, 207, 9, 0.2); -} \ No newline at end of file diff --git a/desktop/css/wizard.css b/desktop/css/wizard.css new file mode 100644 index 0000000..de3e835 --- /dev/null +++ b/desktop/css/wizard.css @@ -0,0 +1,290 @@ +body { + padding-top: unset; +} + +#jeedomMenuBar { + display: none; +} + +#div_mainContainer { + display: flex; + justify-content: center; + align-items: center; +} + +#jeeasy_wizard .flex-evenly { + width: 100%; + height: 100%; + display: flex; + justify-content: space-evenly; + align-items: center; +} + +#jeeasy_wizard .flex-column { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; +} + +#bt_quitJeeasyWizard { + position: absolute; + top: 5%; + right: 5%; +} + +#wizard_container { + height: 620px; + display: grid; + justify-items: center; + align-items: center; + grid-template-columns: 100%; + grid-template-rows: 50px 250px 0 25px auto; + overflow: hidden; + background-color: rgb(var(--panel-bg-color)); + border-radius: var(--border-radius); +} + +#wizard_container>h3 { + grid-row-start: 1; +} + +#wizard_container>img { + max-width: 350px; + max-height: 225px; + grid-row-start: 2; +} + +#wizard_container>.logo { + grid-row-start: 2 +} + +#wizard_container .input-group { + max-width: 480px; + margin: auto; +} + +#wizard_container .form-control { + font-weight: bold; + text-align-last: center; +} + +.bold { + font-weight: bold; +} + +/*** UPDATES ***/ +#wizard_container>#updates { + min-height: 250px; + flex-wrap: wrap; +} + +#wizard_container>#updates>.update { + height: 130px; + width: 100px; + border: solid 3px var(--al-warning-color); + border-radius: 15px; + overflow: hidden; +} + +#wizard_container>#updates>.update>.update-name { + height: 40px; +} + +#wizard_container>#updates>.update>img { + width: 80px; +} + +#wizard_container>#updates>.update[data-type="core"] { + border: solid 3px var(--al-danger-color); +} + +#wizard_container>#updates>.update[data-type="core"]>img { + margin-bottom: -50%; +} + +#wizard_container>#updates>.update.selected { + border: solid 3px var(--logo-primary-color); +} + +/*** PLUGINS ***/ +#wizard_container>#plugins { + min-height: 250px; + flex-wrap: wrap; +} + +#wizard_container>#plugins>.plugin { + max-height: 50%; + width: 25%; + max-width: 125px; + opacity: .5; + border: solid 3px var(--linkHover-color); + border-radius: var(--border-radius); + overflow: hidden; +} + +#wizard_container>#plugins>.plugin:hover { + opacity: 1; +} + +#wizard_container>#plugins>.plugin.selected { + opacity: 1; + border: solid 3px var(--logo-primary-color); +} + +#wizard_container>#plugins>.plugin.selected[data-installed="1"] { + border: solid 3px var(--al-info-color); +} + +#wizard_container>#plugins>.plugin>img { + max-width: 80px; +} + +#wizard_container>#plugins>.plugin>.plugin-category { + font-size: 10px; + margin: -2px 2px 0 2px; +} + +/*** OBJECTS ***/ +#wizard_container>.step_father .sel_father, +#wizard_container>.step_childs .sel_child { + border-radius: var(--border-radius); + background-color: var(--el-defaultColor); + overflow: hidden; +} + +#wizard_container>.step_father .sel_father:hover, +#wizard_container>.step_father .sel_father.selected { + transform: scale(1.2); +} + +#wizard_container>.step_childs .sel_child { + opacity: .25; +} + +#wizard_container>.step_childs .sel_child:hover { + opacity: 1; +} + +#wizard_container>.step_childs .sel_child.selected { + opacity: 1; + border: solid 3px var(--logo-primary-color); +} + +#wizard_container>.step_father img { + width: 250px; + max-width: 100%; + max-height: 150px; +} + +#wizard_container>.step_childs .panel { + width: 100%; + max-width: 1000px; +} + +#wizard_container>.step_childs .panel-body { + padding: 12px 0 10px 10px; +} + +#wizard_container>.step_childs img { + width: 180px; + max-width: 100%; + max-height: 100px; +} + +#wizard_container>.step_father .object_name, +#wizard_container>.step_childs .object_name { + font-weight: bold; + color: white; + padding: 2px; + background-color: var(--al-info-color); +} + +/*** SERVICES ***/ +#wizard_container>.services .service { + position: relative; + height: 225px; + width: 100%; + max-width: 600px; + margin-bottom: unset; + background-size: cover; + background-position: bottom; + background-repeat: no-repeat; + border: solid 2px; +} + +#wizard_container>.logo.services .service { + max-width: 750px; +} + +#wizard_container>.services .service>a { + position: absolute; + width: 100%; + height: 100%; + left: 0; +} + +#wizard_container>.services .service>.panel-heading { + background-color: rgba(var(--eq-bg-color), .2) !important; + border-bottom: unset; +} + +#wizard_container>.services .service>.panel-body { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: calc(100% - 35px); + background-color: rgba(var(--eq-bg-color), .8); + color: rgb(var(--contrast-color)); + margin-right: unset; + padding: unset; +} + +#wizard_container>.services .service-nav { + font-size: 40px +} + +/*** NAVIGATION ***/ +#wizard_navigation { + margin: 15px auto; +} + +#wizard_navigation>div { + margin: auto 10px; + min-width: 50px; +} + +.navBtn, +#bt_jeedom_ready { + font-size: 45px; + cursor: pointer !important; + color: var(--logo-primary-color); +} + +.navDot { + width: 25px; + height: 25px; + margin: 5px; + border-radius: 50%; + display: inline-flex; + align-items: center; + justify-content: center; + color: white; + background-color: rgb(var(--contrast-color), .7); + user-select: none; +} + +.navDot:hover, +.navDot.active { + transform: scale(1.5); +} + +.navDot.active { + margin: 0 10px; +} + +.navDot.blocked { + opacity: .5; +} diff --git a/desktop/js/common.js b/desktop/js/common.js deleted file mode 100644 index 22453e1..0000000 --- a/desktop/js/common.js +++ /dev/null @@ -1,34 +0,0 @@ - - - -function progress(ProgressPourcent, idElement){ - let divProgressbar = document.getElementById(idElement); - if(ProgressPourcent == -1){ - divProgressbar.removeClass('progress-bar-success progress-bar-info progress-bar-warning'); - divProgressbar.addClass('active progress-bar-danger'); - divProgressbar.width('100%'); - divProgressbar.attr('aria-valuenow',100); - divProgressbar.html('N/A'); - return; - } - if(ProgressPourcent == 100){ - divProgressbar.classList.remove('active', 'progress-bar-info', 'progress-bar-danger', 'progress-bar-warning'); - divProgressbar.classList.add('progress-bar-success'); - divProgressbar.style.width = ProgressPourcent + '%'; - divProgressbar.setAttribute('aria-valuenow', ProgressPourcent); - divProgressbar.innerHTML = 'FIN'; - textAtlasElements.forEach(function(element) { - element.style.display = 'none'; - }); - Good(); - return; - } - divProgressbar.classList.remove('active', 'progress-bar-info', 'progress-bar-danger', 'progress-bar-warning'); - divProgressbar.classList.add('progress-bar-success'); - divProgressbar.style.width = ProgressPourcent + '%'; - divProgressbar.setAttribute('aria-valuenow', ProgressPourcent); - divProgressbar.innerHTML = ProgressPourcent + '%'; - } - - - diff --git a/desktop/js/dns.js b/desktop/js/dns.js deleted file mode 100755 index 375e9bc..0000000 --- a/desktop/js/dns.js +++ /dev/null @@ -1,6 +0,0 @@ -$(document).ready(function () { - $('.activerDns').hide(); -}) -function afficher() { - $('.activerDns').show(); -} \ No newline at end of file diff --git a/desktop/js/jeeasy.js b/desktop/js/jeeasy.js index c5f6fa2..e0e703a 100755 --- a/desktop/js/jeeasy.js +++ b/desktop/js/jeeasy.js @@ -51,6 +51,10 @@ $('#bt_jeeasyEqLogicConfiguration').on('click', function() { }) }) +document.getElementById('bt_jeeasyWizardV2').addEventListener('click', function() { + jeedomUtils.loadPage('index.php?v=d&m=jeeasy&p=wizard&noFirstUse=1') +}) + $('#bt_jeeasyIncludeConfiguration').on('click', function() { bootbox.prompt({ title: "{{Très bien ajoutons un module à votre domotique. Quelle est sa technologie}} ?", diff --git a/desktop/js/wizard.js b/desktop/js/wizard.js new file mode 100644 index 0000000..d56f35c --- /dev/null +++ b/desktop/js/wizard.js @@ -0,0 +1,232 @@ +var _contentContainer = document.getElementById('wizard_container') +var slideOut = { + opacity: [1, 0], + transform: ['translateX(0)', 'translateX(-10%)'] +} +var slideIn = { + opacity: [0, 1], + transform: ['translateX(10%)', 'translateX(0)'] +} +var slideOutReverse = { + opacity: [1, 0], + transform: ['translateX(0)', 'translateX(10%)'] +} +var slideInReverse = { + opacity: [0, 1], + transform: ['translateX(-10%)', 'translateX(0)'] +} + +let currentStep = getUrlVars('step') +if (!currentStep) { + currentStep = document.querySelector('.navDot').dataset.step +} +document.querySelector('.navDot[data-step="' + currentStep + '"]').classList.add('active') +setTimeout(() => { + loadStep(currentStep) +}, 250) + +document.querySelectorAll('.navDot').forEach(_dot => { + _dot.addEventListener('click', function() { + let current = document.querySelector('.navDot.active') + if (this == current || this.hasClass('blocked')) { + return false + } + if (current.nextElementSibling?.hasClass('blocked')) { + allowNavigation() + } + + let outAnimation = slideOut + let inAnimation = slideIn + if (Number(this.innerText) < Number(current.innerText)) { + outAnimation = slideOutReverse + inAnimation = slideInReverse + } + + _contentContainer.animate(outAnimation, { + duration: 500 + }) + setTimeout(() => { + document.querySelector('.navDot.active').classList.remove('active') + this.classList.add('active') + _contentContainer.empty() + loadStep(this.dataset.step) + _contentContainer.animate(inAnimation, { + duration: 500 + }) + }, 450) + }) +}) + +document.querySelectorAll('.navBtn').forEach(_navBtn => { + _navBtn.addEventListener('click', function() { + let activeNavDot = document.querySelector('.navDot.active') + if (this.classList.value.includes('bt_next')) { + activeNavDot.nextElementSibling.triggerEvent('click') + } else if (this.classList.value.includes('bt_prev')) { + activeNavDot.previousElementSibling.triggerEvent('click') + } + }) +}) + +document.getElementById('bt_quitJeeasyWizard').addEventListener('click', function() { + let confirm = "{{Voulez-vous vraiment fermer l'assistant de configuration?}}" + confirm += '

' + confirm += '
{{Certaines configurations ne seront pas effectuées et plusieurs plugins essentiels ne seront pas installés}}
' + + bootbox.confirm(confirm, function(result) { + if (result) { + exitJeeasy() + } + }) +}) + +document.getElementById('bt_jeedom_ready').addEventListener('click', function() { + exitJeeasy() +}) + +function loadStep(_step) { + updateNavigation(_step) + updateContent('index.php?v=d&plugin=jeeasy&modal=' + _step) +} + +function updateContent(_url) { + fetch(_url) + .then(response => response.text()) + .then(data => { + _contentContainer.innerHTML = data + + _contentContainer.querySelectorAll('script').forEach(_script => { + let newScript = document.createElement('script') + if (_script.src) { + newScript.src = _script.src + } else { + newScript.textContent = _script.textContent + } + _contentContainer.appendChild(newScript) + _contentContainer.removeChild(newScript) + }) + jeedomUtils.initTooltips(_contentContainer) + }) + .catch(error => { + console.error('{{Erreur au chargement de la page}}:', error) + }) +} + +function updateNavigation(_step) { + let current = document.querySelector('.navDot[data-step="' + _step + '"]') + document.querySelector('.navBtn.bt_next').dataset.step = _step + if (!current.previousElementSibling) { + document.querySelector('.navBtn.bt_prev').classList.add('hidden') + } else { + document.querySelector('.navBtn.bt_prev').title = current.previousElementSibling.dataset.title + document.querySelector('.navBtn.bt_prev.hidden')?.classList.remove('hidden') + } + if (!current.nextElementSibling) { + document.querySelector('.navBtn.bt_next').classList.add('hidden') + if (_step == 'ready') { + document.getElementById('bt_jeedom_ready').classList.remove('hidden') + } + } else { + document.getElementById('bt_jeedom_ready').classList.add('hidden') + document.querySelector('.navBtn.bt_next').title = current.nextElementSibling.dataset.title + document.querySelector('.navBtn.bt_next.hidden')?.classList.remove('hidden') + } + jeedomUtils.addOrUpdateUrl('step', _step) +} + +function allowNavigation(_direction = 'both', _allowed = true) { + let current = document.querySelector('.navDot.active') + if (_direction != 'next') { + let prevDot = current.previousElementSibling + while (prevDot) { + if (!_allowed) { + prevDot.classList.add('blocked') + } else { + prevDot.classList.remove('blocked') + } + prevDot = prevDot.previousElementSibling + } + } + if (_direction != 'prev') { + let nextDot = current.nextElementSibling + while (nextDot) { + if (!_allowed) { + nextDot.classList.add('blocked') + } else { + nextDot.classList.remove('blocked') + } + nextDot = nextDot.nextElementSibling + } + } +} + +function configSave(_configuration, _async = true) { + jeedom.config.save({ + configuration: _configuration, + async: _async, + error: function(_error) { + jeedomUtils.showAlert({ + message: _error.message, + level: 'danger' + }) + } + }) +} + +function installPlugin(_marketId, _logicalId, _async = true) { + jeedom.repo.install({ + id: _marketId, + repo: 'market', + async: _async, + global: false, + error: function(error) { + jeedomUtils.showAlert({ + message: error.message, + level: 'danger' + }) + }, + success: function() { + jeedom.plugin.toggle({ + id: _logicalId, + state: 1, + global: false, + error: function(error) { + jeedomUtils.showAlert({ + message: error.message, + level: 'danger' + }) + }, + success: function() { + jeedom.plugin.dependancyChangeAutoMode({ + id: _logicalId, + mode: 1, + error: function(error) { + jeedomUtils.showAlert({ + message: error.message, + level: 'danger' + }) + } + }) + jeedom.plugin.deamonChangeAutoMode({ + id: _logicalId, + mode: 1, + error: function(error) { + jeedomUtils.showAlert({ + message: error.message, + level: 'danger' + }) + } + }) + } + }) + } + }) +} + +function exitJeeasy() { + configSave({ + 'jeedom::firstUse': 0 + }, false) + // loadPage('index.php?v=d&p=overview') + window.location.href = 'index.php?v=d&p=overview' +} diff --git a/desktop/modal/assistants.php b/desktop/modal/assistants.php deleted file mode 100755 index 75426c3..0000000 --- a/desktop/modal/assistants.php +++ /dev/null @@ -1,30 +0,0 @@ - -
-

{{Les assistants vocaux}}

-
-
-
-

{{Assistants vocaux}}

-

-
{{Documentation}}
-

-

{{Nous vous proposons une connexion facile pour profiter des assistants vocaux : Amazon Alexa et Google Assistant}}

-

-
Google Assistant Amazon Alexa
-
-
-
-
diff --git a/desktop/modal/atlas.php b/desktop/modal/atlas.php index a620d02..344bebe 100755 --- a/desktop/modal/atlas.php +++ b/desktop/modal/atlas.php @@ -1,111 +1,46 @@ - - - -

{{Merci d'avoir choisi Jeedom Atlas}}

-
-

-
-
-
0%
-
-
-
-
\ No newline at end of file +

{{Plugin}}

+Product Image +
+ {{Le plugin est en cours d'installation, veuillez patienter un instant...}} +
+
{{Le plugin est installé, vous pouvez passer à l'étape suivante}} + +
+ +
+
+
+ + + +
+ {{Icone du plugin}} +
+
+
+ + diff --git a/desktop/modal/atlasRecovery.php b/desktop/modal/atlasRecovery.php new file mode 100644 index 0000000..7c8155c --- /dev/null +++ b/desktop/modal/atlasRecovery.php @@ -0,0 +1,25 @@ + + + diff --git a/desktop/modal/backupCloud.php b/desktop/modal/backupCloud.php deleted file mode 100644 index 9b97be5..0000000 --- a/desktop/modal/backupCloud.php +++ /dev/null @@ -1,47 +0,0 @@ - - -
-
-
-
-

{{Les Sauvegardes Cloud}}

-

-

{{Documentation}}

-

-

{{Nous vous proposons de sauvegarder votre Jeedom chaque nuit de façon sécurisée avec vos propres mots de passe. Soyez rassurés du moindre souci sur votre Jeedom. De plus nous économisons votre bande passante en sauvegardant uniquement les changements.}}

-
-
-
-
-

Assurez la Pérennité de Votre Système avec le Service Backup Cloud de Jeedom

- -

Nous mettons en avant notre service Backup Cloud car il représente la solution incontournable pour garantir la pérennité de votre système Jeedom.

-

En cas de problème avec votre Jeedom, la possibilité de restaurer rapidement votre configuration sur un autre matériel ou sur votre box remise à jour est un atout majeur.

- -

Imaginez : un problème surgit, et vous pouvez restaurer votre Jeedom en quelques minutes, préservant ainsi des mois de travail et de configurations.

- -

Comment Configurer le Service Backup Cloud sur Votre Jeedom :

- -

Accédez à la Configuration : Rendez-vous dans l'interface Jeedom, puis dans l'onglet "Configuration" et sélectionnez "Système".

-

Paramètres du Market : Cliquez sur l'onglet "Réglages" et accédez à la section "Market". Ici, entrez un nom de backup, qui peut être votre nom Jeedom, et un mot de passe.

-

Ce mot de passe est crucial pour reconfigurer le Backup Cloud après un éventuel reset.

-

Activez les Sauvegardes Cloud : Dirigez-vous ensuite vers la page "Sauvegarde" sur votre Jeedom. Activez l'envoi des sauvegardes vers le Market une fois que l'onglet "Market/BackupCloud" est correctement renseigné.

- -

Conseil Important : Gardez précieusement ce mot de passe, car il sera indispensable pour reconfigurer le Backup Cloud sur la box après un éventuel reset.

- -

Ne prenez aucun risque. Configurez dès maintenant le service Backup Cloud sur votre Jeedom et assurez-vous de la sécurité et de la continuité de vos données.

-
- -
- diff --git a/desktop/modal/boxName.php b/desktop/modal/boxName.php deleted file mode 100755 index 0ebefde..0000000 --- a/desktop/modal/boxName.php +++ /dev/null @@ -1,99 +0,0 @@ - - - - -
-
-
-

-

{{Nom actuel de votre box : }}

-

-

-

-

- - -
- - -
- - - -
-
- - - \ No newline at end of file diff --git a/desktop/modal/coordonates.php b/desktop/modal/coordonates.php new file mode 100644 index 0000000..fefdf6e --- /dev/null +++ b/desktop/modal/coordonates.php @@ -0,0 +1,372 @@ + + + + + +
+ +
+ {{Adresse}} + + + +
+ + +
+
+
    + +
    + {{Coordonnées GPS}} + + + + {{,}} + + {{Valider les coordonnées}} + + +
    + +
    + {{Alimenté par}} OpenStreetMap (https://www.openstreetmap.org/) +
    + + + + + + + diff --git a/desktop/modal/dnsGo.php b/desktop/modal/dnsGo.php deleted file mode 100644 index 6c8800e..0000000 --- a/desktop/modal/dnsGo.php +++ /dev/null @@ -1,116 +0,0 @@ -sendRequest('servicepack::info')) { - $result = $jsonrpc->getResult(); - $servicePack = $result['licenceName']; -} - -if ($servicePack != 'Community') { -?> - - -
    -
    -
    -

    -

    -

    - -
    -
    0%
    -
    -
    -
    - - - -
    -
    -

    -

    Vous etes en service Pack Community. Pas de configuration OpenVpn nécessaire. Cliquez sur suivant

    -

    -
    - - diff --git a/desktop/modal/freebox_os.php b/desktop/modal/freebox_os.php index cfc06c0..4138a08 100755 --- a/desktop/modal/freebox_os.php +++ b/desktop/modal/freebox_os.php @@ -2,47 +2,55 @@ if (!isConnect()) { throw new Exception('{{401 - Accès non autorisé}}'); } - -config::save('FREEBOX_SERVER_APP_NAME', config::byKey('product_name'), 'Freebox_OS'); -config::save('FREEBOX_SERVER_DEVICE_NAME', config::byKey('product_name'), 'Freebox_OS'); - +$pluginId = 1666; +$plugin = jeeasy::getPluginDetails($pluginId); +$plugin['id'] = $pluginId; +sendVarToJS('_plugin', $plugin); ?> - - + diff --git a/desktop/modal/general.php b/desktop/modal/general.php new file mode 100644 index 0000000..a78d8b3 --- /dev/null +++ b/desktop/modal/general.php @@ -0,0 +1,195 @@ + + +

    {{Paramètres généraux}}

    +Product Image +
    {{Vous pouvez modifier certains paramètres généraux de votre installation puis passer à l'étape suivante}} + +
    +
    + {{Nom de l'installation}} + + + +
    + +
    + {{Fuseau horaire}} + + + +
    + + + + + + diff --git a/desktop/modal/interface.php b/desktop/modal/interface.php new file mode 100644 index 0000000..4ef6045 --- /dev/null +++ b/desktop/modal/interface.php @@ -0,0 +1,62 @@ + '{{Clair}}/Light', + 'core2019_Dark' => '{{Sombre}}/Dark' +); +$defaultTheme = config::byKey('jeedom_theme_main'); +$alternateTheme = config::byKey('jeedom_theme_alternate'); +$coloredIcons = config::byKey('interface::advance::coloredIcons'); +?> + +

    {{Paramètres d'affichage}}

    +Product Image +
    {{Vous pouvez modifier certains paramètres d'affichage de votre installation puis passer à l'étape suivante}} + +
    + +
    + {{Thème}} + + + +
    + +
    + {{Couleur des icônes}} + + +
    + + + + + +
    + + + +
    + diff --git a/desktop/modal/language.php b/desktop/modal/language.php deleted file mode 100755 index aea76b4..0000000 --- a/desktop/modal/language.php +++ /dev/null @@ -1,93 +0,0 @@ - - - - -
    -
    -
    -

    -

    {{Langage Systeme}}

    -

    -

    -

    -

    - - -
    - -
    - - -
    - - -
    -

    {{Cliquez sur la flèche pour ignorer}}

    -
    - -
    - - - - \ No newline at end of file diff --git a/desktop/modal/luna.php b/desktop/modal/luna.php index f6812a4..deda4fb 100755 --- a/desktop/modal/luna.php +++ b/desktop/modal/luna.php @@ -1,136 +1,46 @@ - - - - -

    {{Merci d'avoir choisi }}

    -
    -

    -
    -
    -
    0%
    -
    -
    -
    -
    \ No newline at end of file +

    {{Plugin}}

    +Product Image +
    + {{Le plugin est en cours d'installation, veuillez patienter un instant...}} +
    +
    {{Le plugin est installé, vous pouvez passer à l'étape suivante}} + +
    + +
    +
    +
    + + + +
    + {{Icone du plugin}} +
    +
    +
    + + diff --git a/desktop/modal/networks.php b/desktop/modal/networks.php new file mode 100644 index 0000000..2572b1f --- /dev/null +++ b/desktop/modal/networks.php @@ -0,0 +1,225 @@ + + +

    {{Paramètres réseaux}}

    +Product Image +
    {{Vous pouvez modifier certains paramètres réseaux de votre installation puis passer à l'étape suivante}} + +
    + +
    + {{Local}} + + + > + {{Interface}} + + + + + + + + +
    + +
    + {{Externe}} + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + {{Docker}} + + + +
    + + diff --git a/desktop/modal/objects.php b/desktop/modal/objects.php index 4974b7f..d9bb5d9 100755 --- a/desktop/modal/objects.php +++ b/desktop/modal/objects.php @@ -2,261 +2,582 @@ if (!isConnect()) { throw new Exception('{{401 - Accès non autorisé}}'); } - +$allObjects = jeeObject::all(); +sendVarToJS([ + '_allObjects' => array_combine(array_map(fn($o) => $o->getId(), $allObjects), array_map(fn($o) => $o->getName(), $allObjects)), + '_rootpath' => realpath(__DIR__ . '/../../../../') +]); ?> +

    {{Configuration des objets}}

    + +
    {{Vous pouvez sélectionner l'objet principal définissant au mieux votre installation ou passer à l'étape suivante}} + +
    +
    + +
    +
    {{Pas d'objet racine}}
    + +
    +
    + + +