diff --git a/www/sunders/Leaflet/leaflet-LICENSE b/www/sunders/Leaflet/leaflet-LICENSE new file mode 100644 index 0000000..0cb916b --- /dev/null +++ b/www/sunders/Leaflet/leaflet-LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2010-2021, Vladimir Agafonkin +Copyright (c) 2010-2011, CloudMade +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are +permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of + conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list + of conditions and the following disclaimer in the documentation and/or other materials + provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/www/sunders/Leaflet/leaflet-README.md b/www/sunders/Leaflet/leaflet-README.md new file mode 100644 index 0000000..f56c4cc --- /dev/null +++ b/www/sunders/Leaflet/leaflet-README.md @@ -0,0 +1,32 @@ +Leaflet + +Leaflet is the leading open-source JavaScript library for **mobile-friendly interactive maps**. +Weighing just about 39 KB of gzipped JS plus 4 KB of gzipped CSS code, it has all the mapping [features][] most developers ever need. + +Leaflet is designed with *simplicity*, *performance* and *usability* in mind. +It works efficiently across all major desktop and mobile platforms out of the box, +taking advantage of HTML5 and CSS3 on modern browsers while being accessible on older ones too. +It can be extended with a huge amount of [plugins][], +has a beautiful, easy to use and [well-documented][] API +and a simple, readable [source code][] that is a joy to [contribute][] to. + +For more info, docs and tutorials, check out the [official website][].
+For **Leaflet downloads** (including the built master version), check out the [download page][]. + +We're happy to meet new contributors. +If you want to **get involved** with Leaflet development, check out the [contribution guide][contribute]. +Let's make the best mapping library that will ever exist, +and push the limits of what's possible with online maps! + +[![Build Status](https://travis-ci.org/Leaflet/Leaflet.svg?branch=master)](https://travis-ci.org/Leaflet/Leaflet) + + [contributors]: https://github.com/Leaflet/Leaflet/graphs/contributors + [features]: http://leafletjs.com/#features + [plugins]: http://leafletjs.com/plugins.html + [well-documented]: http://leafletjs.com/reference.html "Leaflet API reference" + [source code]: https://github.com/Leaflet/Leaflet "Leaflet GitHub repository" + [hosted on GitHub]: http://github.com/Leaflet/Leaflet + [contribute]: https://github.com/Leaflet/Leaflet/blob/master/CONTRIBUTING.md "A guide to contributing to Leaflet" + [official website]: http://leafletjs.com + [download page]: http://leafletjs.com/download.html + diff --git a/www/sunders/Leaflet/leaflet.css b/www/sunders/Leaflet/leaflet.css new file mode 100644 index 0000000..601476f --- /dev/null +++ b/www/sunders/Leaflet/leaflet.css @@ -0,0 +1,640 @@ +/* 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, +.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; + } + +.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-tile { + will-change: opacity; + } +.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; + } +.leaflet-zoom-anim .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: 0; + } +.leaflet-container a { + color: #0078A8; + } +.leaflet-container a.leaflet-active { + outline: 2px solid orange; + } +.leaflet-zoom-box { + border: 2px dotted #38f; + background: rgba(255,255,255,0.5); + } + + +/* general typography */ +.leaflet-container { + font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; + } + + +/* general toolbar styles */ + +.leaflet-bar { + box-shadow: 0 1px 5px rgba(0,0,0,0.65); + border-radius: 4px; + } +.leaflet-bar a, +.leaflet-bar a:hover { + 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 { + 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; + } +.leaflet-control-layers-separator { + height: 0; + border-top: 1px solid #ddd; + margin: 5px -10px 5px -6px; + } + +/* Default icon URLs */ +.leaflet-default-icon-path { + background-image: url(images/marker-icon.png); + } + + +/* attribution and scale controls */ + +.leaflet-container .leaflet-control-attribution { + background: #fff; + background: rgba(255, 255, 255, 0.7); + margin: 0; + } +.leaflet-control-attribution, +.leaflet-control-scale-line { + padding: 0 5px; + color: #333; + } +.leaflet-control-attribution a { + text-decoration: none; + } +.leaflet-control-attribution a:hover { + text-decoration: underline; + } +.leaflet-container .leaflet-control-attribution, +.leaflet-container .leaflet-control-scale { + font-size: 11px; + } +.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; + font-size: 11px; + white-space: nowrap; + overflow: hidden; + -moz-box-sizing: border-box; + box-sizing: border-box; + + background: #fff; + background: rgba(255, 255, 255, 0.5); + } +.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 19px; + line-height: 1.4; + } +.leaflet-popup-content p { + margin: 18px 0; + } +.leaflet-popup-tip-container { + width: 40px; + height: 20px; + position: absolute; + left: 50%; + margin-left: -20px; + overflow: hidden; + pointer-events: none; + } +.leaflet-popup-tip { + width: 17px; + height: 17px; + padding: 1px; + + margin: -10px auto 0; + + -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; + padding: 4px 4px 0 0; + border: none; + text-align: center; + width: 18px; + height: 14px; + font: 16px/14px Tahoma, Verdana, sans-serif; + color: #c3c3c3; + text-decoration: none; + font-weight: bold; + background: transparent; + } +.leaflet-container a.leaflet-popup-close-button:hover { + color: #999; + } +.leaflet-popup-scrolled { + overflow: auto; + border-bottom: 1px solid #ddd; + border-top: 1px solid #ddd; + } + +.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-popup-tip-container { + margin-top: -1px; + } + +.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-clickable { + 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; + } diff --git a/www/sunders/Leaflet/leaflet.js b/www/sunders/Leaflet/leaflet.js new file mode 100644 index 0000000..21f499c --- /dev/null +++ b/www/sunders/Leaflet/leaflet.js @@ -0,0 +1,6 @@ +/* @preserve + * Leaflet 1.7.1, a JS library for interactive maps. http://leafletjs.com + * (c) 2010-2019 Vladimir Agafonkin, (c) 2010-2011 CloudMade + */ +!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports):"function"==typeof define&&define.amd?define(["exports"],i):i(t.L={})}(this,function(t){"use strict";function h(t){for(var i,e,n=1,o=arguments.length;n=this.min.x&&e.x<=this.max.x&&i.y>=this.min.y&&e.y<=this.max.y},intersects:function(t){t=O(t);var i=this.min,e=this.max,n=t.min,o=t.max,s=o.x>=i.x&&n.x<=e.x,r=o.y>=i.y&&n.y<=e.y;return s&&r},overlaps:function(t){t=O(t);var i=this.min,e=this.max,n=t.min,o=t.max,s=o.x>i.x&&n.xi.y&&n.y=n.lat&&e.lat<=o.lat&&i.lng>=n.lng&&e.lng<=o.lng},intersects:function(t){t=N(t);var i=this._southWest,e=this._northEast,n=t.getSouthWest(),o=t.getNorthEast(),s=o.lat>=i.lat&&n.lat<=e.lat,r=o.lng>=i.lng&&n.lng<=e.lng;return s&&r},overlaps:function(t){t=N(t);var i=this._southWest,e=this._northEast,n=t.getSouthWest(),o=t.getNorthEast(),s=o.lat>i.lat&&n.lati.lng&&n.lng';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(t){return!1}}();function kt(t){return 0<=navigator.userAgent.toLowerCase().indexOf(t)}var Bt={ie:tt,ielt9:it,edge:et,webkit:nt,android:ot,android23:st,androidStock:at,opera:ht,chrome:ut,gecko:lt,safari:ct,phantom:_t,opera12:dt,win:pt,ie3d:mt,webkit3d:ft,gecko3d:gt,any3d:vt,mobile:yt,mobileWebkit:xt,mobileWebkit3d:wt,msPointer:Pt,pointer:Lt,touch:bt,mobileOpera:Tt,mobileGecko:Mt,retina:zt,passiveEvents:Ct,canvas:St,svg:Zt,vml:Et},At=Pt?"MSPointerDown":"pointerdown",It=Pt?"MSPointerMove":"pointermove",Ot=Pt?"MSPointerUp":"pointerup",Rt=Pt?"MSPointerCancel":"pointercancel",Nt={},Dt=!1;function jt(t,i,e,n){function o(t){Ut(t,r)}var s,r,a,h,u,l,c,_;function d(t){t.pointerType===(t.MSPOINTER_TYPE_MOUSE||"mouse")&&0===t.buttons||Ut(t,h)}return"touchstart"===i?(u=t,l=e,c=n,_=p(function(t){t.MSPOINTER_TYPE_TOUCH&&t.pointerType===t.MSPOINTER_TYPE_TOUCH&&Ri(t),Ut(t,l)}),u["_leaflet_touchstart"+c]=_,u.addEventListener(At,_,!1),Dt||(document.addEventListener(At,Wt,!0),document.addEventListener(It,Ht,!0),document.addEventListener(Ot,Ft,!0),document.addEventListener(Rt,Ft,!0),Dt=!0)):"touchmove"===i?(h=e,(a=t)["_leaflet_touchmove"+n]=d,a.addEventListener(It,d,!1)):"touchend"===i&&(r=e,(s=t)["_leaflet_touchend"+n]=o,s.addEventListener(Ot,o,!1),s.addEventListener(Rt,o,!1)),this}function Wt(t){Nt[t.pointerId]=t}function Ht(t){Nt[t.pointerId]&&(Nt[t.pointerId]=t)}function Ft(t){delete Nt[t.pointerId]}function Ut(t,i){for(var e in t.touches=[],Nt)t.touches.push(Nt[e]);t.changedTouches=[t],i(t)}var Vt=Pt?"MSPointerDown":Lt?"pointerdown":"touchstart",qt=Pt?"MSPointerUp":Lt?"pointerup":"touchend",Gt="_leaflet_";var Kt,Yt,Xt,Jt,$t,Qt,ti=fi(["transform","webkitTransform","OTransform","MozTransform","msTransform"]),ii=fi(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),ei="webkitTransition"===ii||"OTransition"===ii?ii+"End":"transitionend";function ni(t){return"string"==typeof t?document.getElementById(t):t}function oi(t,i){var e,n=t.style[i]||t.currentStyle&&t.currentStyle[i];return n&&"auto"!==n||!document.defaultView||(n=(e=document.defaultView.getComputedStyle(t,null))?e[i]:null),"auto"===n?null:n}function si(t,i,e){var n=document.createElement(t);return n.className=i||"",e&&e.appendChild(n),n}function ri(t){var i=t.parentNode;i&&i.removeChild(t)}function ai(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function hi(t){var i=t.parentNode;i&&i.lastChild!==t&&i.appendChild(t)}function ui(t){var i=t.parentNode;i&&i.firstChild!==t&&i.insertBefore(t,i.firstChild)}function li(t,i){if(void 0!==t.classList)return t.classList.contains(i);var e=pi(t);return 0this.options.maxZoom)?this.setZoom(t):this},panInsideBounds:function(t,i){this._enforcingBounds=!0;var e=this.getCenter(),n=this._limitCenter(e,this._zoom,N(t));return e.equals(n)||this.panTo(n,i),this._enforcingBounds=!1,this},panInside:function(t,i){var e,n,o=A((i=i||{}).paddingTopLeft||i.padding||[0,0]),s=A(i.paddingBottomRight||i.padding||[0,0]),r=this.getCenter(),a=this.project(r),h=this.project(t),u=this.getPixelBounds(),l=u.getSize().divideBy(2),c=O([u.min.add(o),u.max.subtract(s)]);return c.contains(h)||(this._enforcingBounds=!0,e=a.subtract(h),n=A(h.x+e.x,h.y+e.y),(h.xc.max.x)&&(n.x=a.x-e.x,0c.max.y)&&(n.y=a.y-e.y,0=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(t,i){for(var e,n=[],o="mouseout"===i||"mouseover"===i,s=t.target||t.srcElement,r=!1;s;){if((e=this._targets[m(s)])&&("click"===i||"preclick"===i)&&!t._simulated&&this._draggableMoved(e)){r=!0;break}if(e&&e.listens(i,!0)){if(o&&!Vi(s,t))break;if(n.push(e),o)break}if(s===this._container)break;s=s.parentNode}return n.length||r||o||!Vi(s,t)||(n=[this]),n},_handleDOMEvent:function(t){var i;this._loaded&&!Ui(t)&&("mousedown"!==(i=t.type)&&"keypress"!==i&&"keyup"!==i&&"keydown"!==i||Pi(t.target||t.srcElement),this._fireDOMEvent(t,i))},_mouseEvents:["click","dblclick","mouseover","mouseout","contextmenu"],_fireDOMEvent:function(t,i,e){var n;if("click"===t.type&&((n=h({},t)).type="preclick",this._fireDOMEvent(n,n.type,e)),!t._stopped&&(e=(e||[]).concat(this._findEventTargets(t,i))).length){var o=e[0];"contextmenu"===i&&o.listens(i,!0)&&Ri(t);var s,r={originalEvent:t};"keypress"!==t.type&&"keydown"!==t.type&&"keyup"!==t.type&&(s=o.getLatLng&&(!o._radius||o._radius<=10),r.containerPoint=s?this.latLngToContainerPoint(o.getLatLng()):this.mouseEventToContainerPoint(t),r.layerPoint=this.containerPointToLayerPoint(r.containerPoint),r.latlng=s?o.getLatLng():this.layerPointToLatLng(r.layerPoint));for(var a=0;athis.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(i),o=this._getCenterOffset(t)._divideBy(1-1/n);return!(!0!==e.animate&&!this.getSize().contains(o))&&(M(function(){this._moveStart(!0,!1)._animateZoom(t,i,!0)},this),!0)},_animateZoom:function(t,i,e,n){this._mapPane&&(e&&(this._animatingZoom=!0,this._animateToCenter=t,this._animateToZoom=i,ci(this._mapPane,"leaflet-zoom-anim")),this.fire("zoomanim",{center:t,zoom:i,noUpdate:n}),setTimeout(p(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&_i(this._mapPane,"leaflet-zoom-anim"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom),M(function(){this._moveEnd(!0)},this))}});function Yi(t){return new Xi(t)}var Xi=S.extend({options:{position:"topright"},initialize:function(t){c(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var i=this._map;return i&&i.removeControl(this),this.options.position=t,i&&i.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this.remove(),this._map=t;var i=this._container=this.onAdd(t),e=this.getPosition(),n=t._controlCorners[e];return ci(i,"leaflet-control"),-1!==e.indexOf("bottom")?n.insertBefore(i,n.firstChild):n.appendChild(i),this._map.on("unload",this.remove,this),this},remove:function(){return this._map&&(ri(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",n=document.createElement("div");return n.innerHTML=e,n.firstChild},_addItem:function(t){var i,e=document.createElement("label"),n=this._map.hasLayer(t.layer);t.overlay?((i=document.createElement("input")).type="checkbox",i.className="leaflet-control-layers-selector",i.defaultChecked=n):i=this._createRadioElement("leaflet-base-layers_"+m(this),n),this._layerControlInputs.push(i),i.layerId=m(t.layer),zi(i,"click",this._onInputClick,this);var o=document.createElement("span");o.innerHTML=" "+t.name;var s=document.createElement("div");return e.appendChild(s),s.appendChild(i),s.appendChild(o),(t.overlay?this._overlaysList:this._baseLayersList).appendChild(e),this._checkDisabledLayers(),e},_onInputClick:function(){var t,i,e=this._layerControlInputs,n=[],o=[];this._handlingClick=!0;for(var s=e.length-1;0<=s;s--)t=e[s],i=this._getLayer(t.layerId).layer,t.checked?n.push(i):t.checked||o.push(i);for(s=0;si.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expand:function(){return this.expand()},_collapse:function(){return this.collapse()}}),$i=Xi.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"−",zoomOutTitle:"Zoom out"},onAdd:function(t){var i="leaflet-control-zoom",e=si("div",i+" leaflet-bar"),n=this.options;return this._zoomInButton=this._createButton(n.zoomInText,n.zoomInTitle,i+"-in",e,this._zoomIn),this._zoomOutButton=this._createButton(n.zoomOutText,n.zoomOutTitle,i+"-out",e,this._zoomOut),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),e},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,i,e,n,o){var s=si("a",e,n);return s.innerHTML=t,s.href="#",s.title=i,s.setAttribute("role","button"),s.setAttribute("aria-label",i),Oi(s),zi(s,"click",Ni),zi(s,"click",o,this),zi(s,"click",this._refocusOnMap,this),s},_updateDisabled:function(){var t=this._map,i="leaflet-disabled";_i(this._zoomInButton,i),_i(this._zoomOutButton,i),!this._disabled&&t._zoom!==t.getMinZoom()||ci(this._zoomOutButton,i),!this._disabled&&t._zoom!==t.getMaxZoom()||ci(this._zoomInButton,i)}});Ki.mergeOptions({zoomControl:!0}),Ki.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new $i,this.addControl(this.zoomControl))});var Qi=Xi.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0},onAdd:function(t){var i="leaflet-control-scale",e=si("div",i),n=this.options;return this._addScales(n,i+"-line",e),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),e},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,i,e){t.metric&&(this._mScale=si("div",i,e)),t.imperial&&(this._iScale=si("div",i,e))},_update:function(){var t=this._map,i=t.getSize().y/2,e=t.distance(t.containerPointToLatLng([0,i]),t.containerPointToLatLng([this.options.maxWidth,i]));this._updateScales(e)},_updateScales:function(t){this.options.metric&&t&&this._updateMetric(t),this.options.imperial&&t&&this._updateImperial(t)},_updateMetric:function(t){var i=this._getRoundNum(t),e=i<1e3?i+" m":i/1e3+" km";this._updateScale(this._mScale,e,i/t)},_updateImperial:function(t){var i,e,n,o=3.2808399*t;5280Leaflet'},initialize:function(t){c(this,t),this._attributions={}},onAdd:function(t){for(var i in(t.attributionControl=this)._container=si("div","leaflet-control-attribution"),Oi(this._container),t._layers)t._layers[i].getAttribution&&this.addAttribution(t._layers[i].getAttribution());return this._update(),this._container},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=[];for(var i in this._attributions)this._attributions[i]&&t.push(i);var e=[];this.options.prefix&&e.push(this.options.prefix),t.length&&e.push(t.join(", ")),this._container.innerHTML=e.join(" | ")}}});Ki.mergeOptions({attributionControl:!0}),Ki.addInitHook(function(){this.options.attributionControl&&(new te).addTo(this)});Xi.Layers=Ji,Xi.Zoom=$i,Xi.Scale=Qi,Xi.Attribution=te,Yi.layers=function(t,i,e){return new Ji(t,i,e)},Yi.zoom=function(t){return new $i(t)},Yi.scale=function(t){return new Qi(t)},Yi.attribution=function(t){return new te(t)};var ie=S.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}});ie.addTo=function(t,i){return t.addHandler(i,this),this};var ee,ne={Events:Z},oe=bt?"touchstart mousedown":"mousedown",se={mousedown:"mouseup",touchstart:"touchend",pointerdown:"touchend",MSPointerDown:"touchend"},re={mousedown:"mousemove",touchstart:"touchmove",pointerdown:"touchmove",MSPointerDown:"touchmove"},ae=E.extend({options:{clickTolerance:3},initialize:function(t,i,e,n){c(this,n),this._element=t,this._dragStartTarget=i||t,this._preventOutline=e},enable:function(){this._enabled||(zi(this._dragStartTarget,oe,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(ae._dragging===this&&this.finishDrag(),Si(this._dragStartTarget,oe,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(t){var i,e;!t._simulated&&this._enabled&&(this._moved=!1,li(this._element,"leaflet-zoom-anim")||ae._dragging||t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||((ae._dragging=this)._preventOutline&&Pi(this._element),xi(),Xt(),this._moving||(this.fire("down"),i=t.touches?t.touches[0]:t,e=bi(this._element),this._startPoint=new k(i.clientX,i.clientY),this._parentScale=Ti(e),zi(document,re[t.type],this._onMove,this),zi(document,se[t.type],this._onUp,this))))},_onMove:function(t){var i,e;!t._simulated&&this._enabled&&(t.touches&&1i&&(e.push(t[n]),o=n);oi.max.x&&(e|=2),t.yi.max.y&&(e|=8),e}function de(t,i,e,n){var o,s=i.x,r=i.y,a=e.x-s,h=e.y-r,u=a*a+h*h;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-e.x)*(t.y-e.y)/(n.y-e.y)+e.x&&(u=!u);return u||Oe.prototype._containsPoint.call(this,t,!0)}});var Ne=Ce.extend({initialize:function(t,i){c(this,i),this._layers={},t&&this.addData(t)},addData:function(t){var i,e,n,o=g(t)?t:t.features;if(o){for(i=0,e=o.length;iu.x&&(l=s.x+n-u.x+h.x),s.x-l-a.x<0&&(l=s.x-a.x),s.y+e+h.y>u.y&&(c=s.y+e-u.y+h.y),s.y-c-a.y<0&&(c=s.y-a.y),(l||c)&&t.fire("autopanstart").panBy([l,c]))},_onCloseButtonClick:function(t){this._close(),Ni(t)},_getAnchor:function(){return A(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}});Ki.mergeOptions({closePopupOnClick:!0}),Ki.include({openPopup:function(t,i,e){return t instanceof tn||(t=new tn(e).setContent(t)),i&&t.setLatLng(i),this.hasLayer(t)?this:(this._popup&&this._popup.options.autoClose&&this.closePopup(),this._popup=t,this.addLayer(t))},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&this.removeLayer(t),this}}),Me.include({bindPopup:function(t,i){return t instanceof tn?(c(t,i),(this._popup=t)._source=this):(this._popup&&!i||(this._popup=new tn(i,this)),this._popup.setContent(t)),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,i){return this._popup&&this._map&&(i=this._popup._prepareOpen(this,t,i),this._map.openPopup(this._popup,i)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(t){return this._popup&&(this._popup._map?this.closePopup():this.openPopup(t)),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 i=t.layer||t.target;this._popup&&this._map&&(Ni(t),i instanceof Be?this.openPopup(t.layer||t.target,t.latlng):this._map.hasLayer(this._popup)&&this._popup._source===i?this.closePopup():this.openPopup(i,t.latlng))},_movePopup:function(t){this._popup.setLatLng(t.latlng)},_onKeyPress:function(t){13===t.originalEvent.keyCode&&this._openPopup(t)}});var en=Qe.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:!1,sticky:!1,interactive:!1,opacity:.9},onAdd:function(t){Qe.prototype.onAdd.call(this,t),this.setOpacity(this.options.opacity),t.fire("tooltipopen",{tooltip:this}),this._source&&this._source.fire("tooltipopen",{tooltip:this},!0)},onRemove:function(t){Qe.prototype.onRemove.call(this,t),t.fire("tooltipclose",{tooltip:this}),this._source&&this._source.fire("tooltipclose",{tooltip:this},!0)},getEvents:function(){var t=Qe.prototype.getEvents.call(this);return bt&&!this.options.permanent&&(t.preclick=this._close),t},_close:function(){this._map&&this._map.closeTooltip(this)},_initLayout:function(){var t="leaflet-tooltip "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=si("div",t)},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(t){var i,e=this._map,n=this._container,o=e.latLngToContainerPoint(e.getCenter()),s=e.layerPointToContainerPoint(t),r=this.options.direction,a=n.offsetWidth,h=n.offsetHeight,u=A(this.options.offset),l=this._getAnchor(),c="top"===r?(i=a/2,h):"bottom"===r?(i=a/2,0):(i="center"===r?a/2:"right"===r?0:"left"===r?a:s.xthis.options.maxZoom||nthis.options.maxZoom||void 0!==this.options.minZoom&&oe.max.x)||!i.wrapLat&&(t.ye.max.y))return!1}if(!this.options.bounds)return!0;var n=this._tileCoordsToBounds(t);return N(this.options.bounds).overlaps(n)},_keyToBounds:function(t){return this._tileCoordsToBounds(this._keyToTileCoords(t))},_tileCoordsToNwSe:function(t){var i=this._map,e=this.getTileSize(),n=t.scaleBy(e),o=n.add(e);return[i.unproject(n,t.z),i.unproject(o,t.z)]},_tileCoordsToBounds:function(t){var i=this._tileCoordsToNwSe(t),e=new R(i[0],i[1]);return this.options.noWrap||(e=this._map.wrapLatLngBounds(e)),e},_tileCoordsToKey:function(t){return t.x+":"+t.y+":"+t.z},_keyToTileCoords:function(t){var i=t.split(":"),e=new k(+i[0],+i[1]);return e.z=+i[2],e},_removeTile:function(t){var i=this._tiles[t];i&&(ri(i.el),delete this._tiles[t],this.fire("tileunload",{tile:i.el,coords:this._keyToTileCoords(t)}))},_initTile:function(t){ci(t,"leaflet-tile");var i=this.getTileSize();t.style.width=i.x+"px",t.style.height=i.y+"px",t.onselectstart=a,t.onmousemove=a,it&&this.options.opacity<1&&mi(t,this.options.opacity),ot&&!st&&(t.style.WebkitBackfaceVisibility="hidden")},_addTile:function(t,i){var e=this._getTilePos(t),n=this._tileCoordsToKey(t),o=this.createTile(this._wrapCoords(t),p(this._tileReady,this,t));this._initTile(o),this.createTile.length<2&&M(p(this._tileReady,this,t,null,o)),vi(o,e),this._tiles[n]={el:o,coords:t,current:!0},i.appendChild(o),this.fire("tileloadstart",{tile:o,coords:t})},_tileReady:function(t,i,e){i&&this.fire("tileerror",{error:i,tile:e,coords:t});var n=this._tileCoordsToKey(t);(e=this._tiles[n])&&(e.loaded=+new Date,this._map._fadeAnimated?(mi(e.el,0),z(this._fadeFrame),this._fadeFrame=M(this._updateOpacity,this)):(e.active=!0,this._pruneTiles()),i||(ci(e.el,"leaflet-tile-loaded"),this.fire("tileload",{tile:e.el,coords:t})),this._noTilesToLoad()&&(this._loading=!1,this.fire("load"),it||!this._map._fadeAnimated?M(this._pruneTiles,this):setTimeout(p(this._pruneTiles,this),250)))},_getTilePos:function(t){return t.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(t){var i=new k(this._wrapX?o(t.x,this._wrapX):t.x,this._wrapY?o(t.y,this._wrapY):t.y);return i.z=t.z,i},_pxBoundsToTileRange:function(t){var i=this.getTileSize();return new I(t.min.unscaleBy(i).floor(),t.max.unscaleBy(i).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var t in this._tiles)if(!this._tiles[t].loaded)return!1;return!0}});var sn=on.extend({options:{minZoom:0,maxZoom:18,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1},initialize:function(t,i){this._url=t,(i=c(this,i)).detectRetina&&zt&&0')}}catch(t){return function(t){return document.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_n={_initContainer:function(){this._container=si("div","leaflet-vml-container")},_update:function(){this._map._animatingZoom||(hn.prototype._update.call(this),this.fire("update"))},_initPath:function(t){var i=t._container=cn("shape");ci(i,"leaflet-vml-shape "+(this.options.className||"")),i.coordsize="1 1",t._path=cn("path"),i.appendChild(t._path),this._updateStyle(t),this._layers[m(t)]=t},_addPath:function(t){var i=t._container;this._container.appendChild(i),t.options.interactive&&t.addInteractiveTarget(i)},_removePath:function(t){var i=t._container;ri(i),t.removeInteractiveTarget(i),delete this._layers[m(t)]},_updateStyle:function(t){var i=t._stroke,e=t._fill,n=t.options,o=t._container;o.stroked=!!n.stroke,o.filled=!!n.fill,n.stroke?(i=i||(t._stroke=cn("stroke")),o.appendChild(i),i.weight=n.weight+"px",i.color=n.color,i.opacity=n.opacity,n.dashArray?i.dashStyle=g(n.dashArray)?n.dashArray.join(" "):n.dashArray.replace(/( *, *)/g," "):i.dashStyle="",i.endcap=n.lineCap.replace("butt","flat"),i.joinstyle=n.lineJoin):i&&(o.removeChild(i),t._stroke=null),n.fill?(e=e||(t._fill=cn("fill")),o.appendChild(e),e.color=n.fillColor||n.color,e.opacity=n.fillOpacity):e&&(o.removeChild(e),t._fill=null)},_updateCircle:function(t){var i=t._point.round(),e=Math.round(t._radius),n=Math.round(t._radiusY||e);this._setPath(t,t._empty()?"M0 0":"AL "+i.x+","+i.y+" "+e+","+n+" 0,23592600")},_setPath:function(t,i){t._path.v=i},_bringToFront:function(t){hi(t._container)},_bringToBack:function(t){ui(t._container)}},dn=Et?cn:J,pn=hn.extend({getEvents:function(){var t=hn.prototype.getEvents.call(this);return t.zoomstart=this._onZoomStart,t},_initContainer:function(){this._container=dn("svg"),this._container.setAttribute("pointer-events","none"),this._rootGroup=dn("g"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){ri(this._container),Si(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_onZoomStart:function(){this._update()},_update:function(){var t,i,e;this._map._animatingZoom&&this._bounds||(hn.prototype._update.call(this),i=(t=this._bounds).getSize(),e=this._container,this._svgSize&&this._svgSize.equals(i)||(this._svgSize=i,e.setAttribute("width",i.x),e.setAttribute("height",i.y)),vi(e,t.min),e.setAttribute("viewBox",[t.min.x,t.min.y,i.x,i.y].join(" ")),this.fire("update"))},_initPath:function(t){var i=t._path=dn("path");t.options.className&&ci(i,t.options.className),t.options.interactive&&ci(i,"leaflet-interactive"),this._updateStyle(t),this._layers[m(t)]=t},_addPath:function(t){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(t._path),t.addInteractiveTarget(t._path)},_removePath:function(t){ri(t._path),t.removeInteractiveTarget(t._path),delete this._layers[m(t)]},_updatePath:function(t){t._project(),t._update()},_updateStyle:function(t){var i=t._path,e=t.options;i&&(e.stroke?(i.setAttribute("stroke",e.color),i.setAttribute("stroke-opacity",e.opacity),i.setAttribute("stroke-width",e.weight),i.setAttribute("stroke-linecap",e.lineCap),i.setAttribute("stroke-linejoin",e.lineJoin),e.dashArray?i.setAttribute("stroke-dasharray",e.dashArray):i.removeAttribute("stroke-dasharray"),e.dashOffset?i.setAttribute("stroke-dashoffset",e.dashOffset):i.removeAttribute("stroke-dashoffset")):i.setAttribute("stroke","none"),e.fill?(i.setAttribute("fill",e.fillColor||e.color),i.setAttribute("fill-opacity",e.fillOpacity),i.setAttribute("fill-rule",e.fillRule||"evenodd")):i.setAttribute("fill","none"))},_updatePoly:function(t,i){this._setPath(t,$(t._parts,i))},_updateCircle:function(t){var i=t._point,e=Math.max(Math.round(t._radius),1),n="a"+e+","+(Math.max(Math.round(t._radiusY),1)||e)+" 0 1,0 ",o=t._empty()?"M0 0":"M"+(i.x-e)+","+i.y+n+2*e+",0 "+n+2*-e+",0 ";this._setPath(t,o)},_setPath:function(t,i){t._path.setAttribute("d",i)},_bringToFront:function(t){hi(t._path)},_bringToBack:function(t){ui(t._path)}});function mn(t){return Zt||Et?new pn(t):null}Et&&pn.include(_n),Ki.include({getRenderer:function(t){var i=(i=t.options.renderer||this._getPaneRenderer(t.options.pane)||this.options.renderer||this._renderer)||(this._renderer=this._createRenderer());return this.hasLayer(i)||this.addLayer(i),i},_getPaneRenderer:function(t){if("overlayPane"===t||void 0===t)return!1;var i=this._paneRenderers[t];return void 0===i&&(i=this._createRenderer({pane:t}),this._paneRenderers[t]=i),i},_createRenderer:function(t){return this.options.preferCanvas&&ln(t)||mn(t)}});var fn=Re.extend({initialize:function(t,i){Re.prototype.initialize.call(this,this._boundsToLatLngs(t),i)},setBounds:function(t){return this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return[(t=N(t)).getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}});pn.create=dn,pn.pointsToPath=$,Ne.geometryToLayer=De,Ne.coordsToLatLng=We,Ne.coordsToLatLngs=He,Ne.latLngToCoords=Fe,Ne.latLngsToCoords=Ue,Ne.getFeature=Ve,Ne.asFeature=qe,Ki.mergeOptions({boxZoom:!0});var gn=ie.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(){zi(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){Si(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){ri(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(),Xt(),xi(),this._startPoint=this._map.mouseEventToContainerPoint(t),zi(document,{contextmenu:Ni,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=si("div","leaflet-zoom-box",this._container),ci(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t);var i=new I(this._point,this._startPoint),e=i.getSize();vi(this._box,i.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(ri(this._box),_i(this._container,"leaflet-crosshair")),Jt(),wi(),Si(document,{contextmenu:Ni,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(t){var i;1!==t.which&&1!==t.button||(this._finish(),this._moved&&(this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(p(this._resetState,this),0),i=new R(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point)),this._map.fitBounds(i).fire("boxzoomend",{boxZoomBounds:i})))},_onKeyDown:function(t){27===t.keyCode&&this._finish()}});Ki.addInitHook("addHandler","boxZoom",gn),Ki.mergeOptions({doubleClickZoom:!0});var vn=ie.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var i=this._map,e=i.getZoom(),n=i.options.zoomDelta,o=t.originalEvent.shiftKey?e-n:e+n;"center"===i.options.doubleClickZoom?i.setZoom(o):i.setZoomAround(t.containerPoint,o)}});Ki.addInitHook("addHandler","doubleClickZoom",vn),Ki.mergeOptions({dragging:!0,inertia:!st,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0});var yn=ie.extend({addHooks:function(){var t;this._draggable||(t=this._map,this._draggable=new ae(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))),ci(this._map._container,"leaflet-grab leaflet-touch-drag"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){_i(this._map._container,"leaflet-grab"),_i(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,i=this._map;i._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity?(t=N(this._map.options.maxBounds),this._offsetLimit=O(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,i.fire("movestart").fire("dragstart"),i.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(t){var i,e;this._map.options.inertia&&(i=this._lastTime=+new Date,e=this._lastPos=this._draggable._absPos||this._draggable._newPos,this._positions.push(e),this._times.push(i),this._prunePositions(i)),this._map.fire("move",t).fire("drag",t)},_prunePositions:function(t){for(;1i.max.x&&(t.x=this._viscousLimit(t.x,i.max.x)),t.y>i.max.y&&(t.y=this._viscousLimit(t.y,i.max.y)),this._draggable._newPos=this._draggable._startPos.add(t))},_onPreDragWrap:function(){var t=this._worldWidth,i=Math.round(t/2),e=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-i+e)%t+i-e,s=(n+i+e)%t-i-e,r=Math.abs(o+e)i.getMaxZoom()&&1 + + + L.SemiCircle/ + L.SemiCircleMarker
+ factories: L.semiCircle/L.SemiCircleMarker + + + Options:
+ startAngle: start angle of the semicircle
+ stopAngle: stop angle of the semicircle
+ Angles are defined like compass courses: 0 = north, 90 = east, etc. + + + +## Provided methods: ## + + + + + + + + + + + + + +
L.SemiCircle.setStartAngle(angle)Set the start angle of the circle to angle and redraw.
L.Circle.setStopAngle(angle)Set the stop angle of the circle to angle and redraw.
L.Circle.setDirection(direction, size)Set the startAngle to direction - (0.5 * size) and the stopAngle to direction + (0.5 * size) and redraw.
+ +## Usage: +The plugin provides two ways to only display a part of the circle: +1. Use the `options` map and set `startAngle` and `stopAngle`. +2. Use `setDirection(direction, size)` to display a semicircle of `size` degrees at `direction`. + +## Example: +[Live demo](http://jieter.github.com/Leaflet-semicircle/examples/semicircle.html) + +Using `options.startAngle` and `options.stopAngle`: +``` +L.semiCircle([51.5, -0.09], { + radius: 500, + startAngle: 45, + stopAngle: 135 +}).addTo(map); +``` + +Draw the same semicircle using `setDirection(direction, size)`: +``` +L.semiCircle([51.5, -0.09], {radius: 500}) + .setDirection(90, 90) + .addTo(map); +``` + +## Screenshot: + +[Live demo](http://jieter.github.com/Leaflet-semicircle/examples/semicircle.html) + +![Semicircles screenshot](screenshot.png) + +## Changelog + +### 2.0.2 (2017-09-01) + - Fixed #24: instance check for canvas renderer + +### 2.0.1 (2017-07-22) + - Fixed #14: Poleward displacement of circle center when radius is large. + +### 2.0.0 (2017-07-09) + - Changed the API to stand-alone classes rather than overwriting `L.Circle` with an extension of itself. + - Added support for Leaflet 1.1.0 diff --git a/www/sunders/Leaflet/semicircle.js b/www/sunders/Leaflet/semicircle.js new file mode 100644 index 0000000..aad6261 --- /dev/null +++ b/www/sunders/Leaflet/semicircle.js @@ -0,0 +1,196 @@ +/** + * Semicircle extension for L.Circle. + * Jan Pieter Waagmeester + * + * This version is tested with leaflet 1.0.2 + */ +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD + define(['leaflet'], factory); + } else if (typeof module !== 'undefined' && typeof require !== 'undefined') { + // Node/CommonJS + module.exports = factory(require('leaflet')); + } else { + // Browser globals + if (typeof window.L === 'undefined') { + throw 'Leaflet must be loaded first'; + } + factory(window.L); + } +})(function (L) { + var DEG_TO_RAD = Math.PI / 180; + + // make sure 0 degrees is up (North) and convert to radians. + function fixAngle (angle) { + return (angle - 90) * DEG_TO_RAD; + } + + // rotate point [x + r, y+r] around [x, y] by `angle` radians. + function rotated (p, angle, r) { + return p.add( + L.point(Math.cos(angle), Math.sin(angle)).multiplyBy(r) + ); + } + + L.Point.prototype.rotated = function (angle, r) { + return rotated(this, angle, r); + }; + + var semicircle = { + options: { + startAngle: 0, + stopAngle: 359.9999 + }, + + startAngle: function () { + if (this.options.startAngle < this.options.stopAngle) { + return fixAngle(this.options.startAngle); + } else { + return fixAngle(this.options.stopAngle); + } + }, + + stopAngle: function () { + if (this.options.startAngle < this.options.stopAngle) { + return fixAngle(this.options.stopAngle); + } else { + return fixAngle(this.options.startAngle); + } + }, + + setStartAngle: function (angle) { + this.options.startAngle = angle; + return this.redraw(); + }, + + setStopAngle: function (angle) { + this.options.stopAngle = angle; + return this.redraw(); + }, + + setDirection: function (direction, degrees) { + if (degrees === undefined) { + degrees = 10; + } + this.options.startAngle = direction - (degrees / 2); + this.options.stopAngle = direction + (degrees / 2); + + return this.redraw(); + }, + getDirection: function () { + return this.stopAngle() - (this.stopAngle() - this.startAngle()) / 2; + }, + + isSemicircle: function () { + var startAngle = this.options.startAngle, + stopAngle = this.options.stopAngle; + + return ( + !(startAngle === 0 && stopAngle > 359) && + !(startAngle === stopAngle) + ); + }, + _containsPoint: function (p) { + function normalize (angle) { + while (angle <= -Math.PI) { + angle += 2.0 * Math.PI; + } + while (angle > Math.PI) { + angle -= 2.0 * Math.PI; + } + return angle; + } + var angle = Math.atan2(p.y - this._point.y, p.x - this._point.x); + var nStart = normalize(this.startAngle()); + var nStop = normalize(this.stopAngle()); + if (nStop <= nStart) { + nStop += 2.0 * Math.PI; + } + if (angle <= nStart) { + angle += 2.0 * Math.PI; + } + return ( + nStart < angle && angle <= nStop && + p.distanceTo(this._point) <= this._radius + this._clickTolerance() + ); + } + }; + + L.SemiCircle = L.Circle.extend(semicircle); + L.SemiCircleMarker = L.CircleMarker.extend(semicircle); + + L.semiCircle = function (latlng, options) { + return new L.SemiCircle(latlng, options); + }; + L.semiCircleMarker = function (latlng, options) { + return new L.SemiCircleMarker(latlng, options); + }; + + var _updateCircleSVG = L.SVG.prototype._updateCircle; + var _updateCircleCanvas = L.Canvas.prototype._updateCircle; + + L.SVG.include({ + _updateCircle: function (layer) { + // If we want a circle, we use the original function + if (!(layer instanceof L.SemiCircle || layer instanceof L.SemiCircleMarker) || + !layer.isSemicircle()) { + return _updateCircleSVG.call(this, layer); + } + if (layer._empty()) { + return this._setPath(layer, 'M0 0'); + } + + var p = layer._map.latLngToLayerPoint(layer._latlng), + r = layer._radius, + r2 = Math.round(layer._radiusY || r), + start = p.rotated(layer.startAngle(), r), + end = p.rotated(layer.stopAngle(), r); + + var largeArc = (layer.options.stopAngle - layer.options.startAngle >= 180) ? '1' : '0'; + + var d = 'M' + p.x + ',' + p.y + + // line to first start point + 'L' + start.x + ',' + start.y + + 'A ' + r + ',' + r2 + ',0,' + largeArc + ',1,' + end.x + ',' + end.y + + ' z'; + + this._setPath(layer, d); + } + }); + + L.Canvas.include({ + _updateCircle: function (layer) { + // If we want a circle, we use the original function + if (!(layer instanceof L.SemiCircle || layer instanceof L.SemiCircleMarker) || + !layer.isSemicircle()) { + return _updateCircleCanvas.call(this, layer); + } + + if (!this._drawing || layer._empty()) { return; } + + var p = layer._point, + ctx = this._ctx, + r = layer._radius, + s = (layer._radiusY || r) / r, + start = p.rotated(layer.startAngle(), r); + + if (s !== 1) { + ctx.save(); + ctx.scale(1, s); + } + + ctx.beginPath(); + ctx.moveTo(p.x, p.y); + ctx.lineTo(start.x, start.y); + ctx.arc(p.x, p.y, r, layer.startAngle(), layer.stopAngle()); + ctx.lineTo(p.x, p.y); + + if (s !== 1) { + ctx.restore(); + } + + this._fillStroke(ctx, layer); + } + }); +}); diff --git a/www/sunders/add-lists.php b/www/sunders/add-lists.php new file mode 100644 index 0000000..12fc0c0 --- /dev/null +++ b/www/sunders/add-lists.php @@ -0,0 +1,299 @@ +'; + + // Loop over the lists to display. + foreach($decodedJSON as $listObject) { + echo '
'.translate($i18n, $i18nDefault, $listObject->{'listTitle'}, [], [], []).'
'; + + // Loop over the entries of the current list. + foreach($listObject->{'listEntries'} as $listEntryObject) { + echo '
+
'; + + // Loop over the icons of the current list entry. + foreach($listEntryObject->{'icons'} as $icon) { + echo ''.translate($i18n, $i18nDefault, $icon->{'alt'}, [], [], []).''; + } + echo '
+
'.translate($i18n, $i18nDefault, $listEntryObject->{'description'}, [], [], []).'
+
'; + } + } + echo ''; + } + + // Convert the content of the manual JSON file to HTML. + function addListManual($jsonPath, $i18n, $i18nDefault) { + global $pathToWebFolder; + + $decodedJSON = getDecodedJSON($jsonPath); + + echo '
'; + + // Loop over the lists to display. + foreach($decodedJSON as $listObject) { + echo '
'.translate($i18n, $i18nDefault, $listObject->{'listTitle'}, [], [], []).'
'; + + // Loop over the entries of the current list. + foreach($listObject->{'listEntries'} as $listEntryObject) { + $keysAsHTMLArray = array(); + $valuesAsHTMLArray = array(); + + // Loop over the keys of the current list entry. + foreach($listEntryObject->{'keys'} as $key) { + + if (is_null($key->{'href'})) { + array_push($keysAsHTMLArray, translate($i18n, $i18nDefault, $key->{'key'}, [], [], [])); + } else { + array_push($keysAsHTMLArray, translate($i18n, $i18nDefault, $key->{'key'}, [$key->{'href'}], [], [])); + } + } + + // Loop over the values of the current list entry. + foreach($listEntryObject->{'values'} as $value) { + + if (is_null($value->{'href'})) { + array_push($valuesAsHTMLArray, translate($i18n, $i18nDefault, $value->{'value'}, [], [], [])); + } else { + array_push($valuesAsHTMLArray, translate($i18n, $i18nDefault, $value->{'value'}, [$value->{'href'}], [], [])); + } + } + + echo '
+
'; + echo implode('
', $keysAsHTMLArray); + echo '
'; + + // Some lists have an icon column. + if ($listObject->{'isListWithIcons'}) { + echo '
' + .implode('
', $valuesAsHTMLArray).' +
+
'; + $iconObject = $listEntryObject->{'icon'}; + if (!is_null($iconObject)){ + echo ''.translate($i18n, $i18nDefault, $iconObject->{'alt'}, [], [], []).''; + } + } else { + echo '
' + .implode('
', $valuesAsHTMLArray).''; + } + + echo '
+
'; + } + + // Some lists end with examples, i.e. 3 images with descriptions. + if (!is_null($listObject->{'examples'})) { + $examplesObject = $listObject->{'examples'}; + $examplesObjectImages = $examplesObject->{'images'}; + $examplesObjectDescriptions = $examplesObject->{'descriptions'}; + + echo '
+
+
'.translate($i18n, $i18nDefault, 'examples', [], [], []).': +
+
+
+
'; + + + for($i = 0; $i < count($examplesObjectImages); ++$i) { + $linesAsHTMLArray = array(); + + foreach($examplesObjectDescriptions[$i]->{'lines'} as $line) { + array_push($linesAsHTMLArray, translate($i18n, $i18nDefault, $line, [], [], [])); + } + + echo '
+
+ '.translate($i18n, $i18nDefault, $examplesObjectImages[$i]->{'alt'}, [], [], []).' +
+
' + .implode('
', $linesAsHTMLArray).' +
+
'; + } + + echo '
+
'; + } + } + echo '
'; + } + + // Convert the content of the links JSON file to HTML. +/* function addListLinks($jsonPath, $i18n, $i18nDefault) { + global $pathToWebFolder; + $expandSectionCounter = 0; + + $decodedJSON = getDecodedJSON($jsonPath); + echo '
'; + + // Loop over the lists to display. + foreach($decodedJSON as $listObject) { + echo '
'.translate($i18n, $i18nDefault, $listObject->{'listTitle'}, [], [], []).'
'; + + // Loop over the sections of the current list. + foreach($listObject->{'sections'} as $sectionObject) { + if ($sectionObject->{'isExpandable'}) { + $sectionToggleChecked = ''; + + if ($sectionObject->{'isExpandedByDefault'}) { + $sectionToggleChecked = 'checked="checked"'; + } + + echo ' '.translate($i18n, $i18nDefault, $sectionOb$ + } + + echo '
'; + + // Loop over the entries of the current section. + foreach($sectionObject->{'listEntries'} as $listEntryObject) { + echo '
+
'; + + // Choose lock icon according to https or http connection. + if (substr($listEntryObject->{'href'}, 0, 5) == 'https') { + echo ''.translate($i18n, $i18nDefault, 'secure-alt', [], [], [])$
+          } else {
+            echo     '<img src= + [ '.htmlentities($listEntryObject->{'sourceText'}).' ]
'.htmlentities($li$ +
+
'; + } + echo '
'; + } + } + echo '
'; + } +*/ + + // Convert the content of the links JSON file to HTML. + function addListLinks($jsonPath, $i18n, $i18nDefault) { + global $pathToWebFolder; + $expandSectionCounter = 0; + + $decodedJSON = getDecodedJSON($jsonPath); + echo ''; + } + + // Convert the content of the credits and licenses JSON file to HTML. + function addListCredits($jsonPath, $i18n, $i18nDefault) { + global $pathToWebFolder; + + $decodedJSON = getDecodedJSON($jsonPath); + + // Loop over the lists to display. + foreach($decodedJSON as $listObject) { + echo ''; + + // Loop over the entries of the current list. + foreach($listObject->{'listEntries'} as $listEntryObject) { + echo '
' + .translate($i18n, $i18nDefault, $listEntryObject->{'type'}, [], [], []).' +
'; + + // Loop over the credits of the current list entry. + foreach($listEntryObject->{'credits'} as $credit) { + $hrefCredit = $credit->{'href-credit'}; + $hrefLicense = $credit->{'href-license'}; + + if (substr($hrefCredit, 0, 4) != 'http') { + $hrefCredit = $pathToWebFolder.$hrefCredit; + } + + if (substr($hrefLicense, 0, 4) != 'http') { + $hrefLicense = $pathToWebFolder.$hrefLicense; + } + + echo ''; + } + } + } + } + + // Create a HTML list that contains the supported languages (i18n). + function addListLanguages($initialLanguage, $i18n, $i18nDefault) { + global $pathToWebFolder, $embedPerma; + + + $supportedLanguages = [ + 'de' => 'deutsch', + 'en' => 'english', + 'es' => 'español', + 'fr' => 'français', + 'it' => 'italiano', + 'ru' => 'русский' + ]; + + echo ' + '; + } +?> + diff --git a/www/sunders/apple-touch-icon.png b/www/sunders/apple-touch-icon.png new file mode 100644 index 0000000..55261d5 Binary files /dev/null and b/www/sunders/apple-touch-icon.png differ diff --git a/www/sunders/camera.php b/www/sunders/camera.php new file mode 100644 index 0000000..96707f7 --- /dev/null +++ b/www/sunders/camera.php @@ -0,0 +1,445 @@ +id = $valId; + $this->lat = $valLat; + $this->lon = $valLon; + } + } + + function mergeNeighbor(&$clusterGrid, $posCell, $pos) { + global $divDiag2; + + if (!array_key_exists($pos, $clusterGrid)) { + /* the neighbor is empty */ + return; + } + + $neighbor = $clusterGrid[$pos]; + + if ($neighbor['count'] == 0) { + /* The neighbor is merged to an other cell, yet */ + return; + } + + $cell = $clusterGrid[$posCell]; + + /* Calculate the (square of) distance from the cell to its neighbor */ + $lonDist = ($cell['longitude']/$cell['count']) - ($neighbor['longitude']/$neighbor['count']); + $latDist = ($cell['latitude'] /$cell['count']) - ($neighbor['latitude'] /$neighbor['count']); + $dist = ($lonDist * $lonDist) + ($latDist * $latDist); + + if ($dist < $divDiag2 / 10) { + $count = $cell['count'] + $neighbor['count']; + $clusterGrid[$posCell]['latitude'] = $cell['latitude'] + $neighbor['latitude']; + $clusterGrid[$posCell]['longitude'] = $cell['longitude'] + $neighbor['longitude']; + $clusterGrid[$posCell]['count'] = $count; + $clusterGrid[$posCell]['points'] = array_merge($cell['points'], $neighbor['points']); + /* Invalidate the merged neighbor */ + $clusterGrid[$pos]['count'] = 0; + } + } + + function mergeNeighborhood(&$clusterGrid, $pos) { + global $divWCount, $divHCount; + + if ($clusterGrid[$pos]['count'] == 0) { + /* cell merged yet */ + return; + } + + $latLon = explode(',', $clusterGrid[$pos]['grid'] ); + if ($latLon[0] > 0 && $latLon[1] < $divHCount - 1) { + if ($latLon[0] > 0) { + $posNeigh = ($latLon[0] - 1) . ',' . ($latLon[1] + 1); + mergeNeighbor($clusterGrid, $pos, $posNeigh); + } + + $posNeigh = $latLon[0] . ',' . ($latLon[1] + 1); + mergeNeighbor($clusterGrid, $pos, $posNeigh); + + if ($latLon[0] < $divWCount - 1) { + $posNeigh = ($latLon[0] + 1) . ',' . ($latLon[1] + 1); + mergeNeighbor($clusterGrid, $pos, $posNeigh); + } + } + + if ($latLon[0] < $divWCount - 1) { + $posNeigh = ($latLon[0] + 1) . ',' . $latLon[1]; + mergeNeighbor($clusterGrid, $pos, $posNeigh); + } + } + + /* Recursive calculation of the quick hull algo + $isBottom : 1 if bottom point is searched, -1 if top point is searched */ + function quickHullCalc(&$pointList, $count, $minPoint, $maxPoint, $isBottom) { + + $msg = 'Quick count='.$count.', min=('.$minPoint->id.','.$minPoint->lat.','.$minPoint->lon.'), max=('.$minPoint->id.','.$minPoint->lat.','.$minPoint->lon.'), isBottom='.$isBottom; + + $farthestPoint = null; + $farthestDist = 0; + $outsideList = array(); + $outsideListCount = 0; + + if ($maxPoint->lon != $minPoint->lon) { + /* Get the line equation as y = mx + p */ + $m = ($maxPoint->lat - $minPoint->lat) / ($maxPoint->lon - $minPoint->lon); + $p = ($maxPoint->lat * $minPoint->lon - $minPoint->lat * $maxPoint->lon) / ($minPoint->lon - $maxPoint->lon); + } else { + /* The line equation is y = p */ + $m = null; + $p = $minPoint->lat; + $coef = (($minPoint->lon > $maxPoint->lon) ? 1 : -1); + } + + /* For each point, check whether : + - it is on the right side of the line + - it is the farthest from the line + */ + foreach ($pointList as $point) { + if (isset($m)) { + $dist = $isBottom * ($m * $point->lon - $point->lat + $p); + } else { + $dist = $coef * ($point->lon - $p); + } + if ($dist > 0 + && $point->id != $minPoint->id + && $point->id != $maxPoint->id) { + + array_push($outsideList, $point); + $outsideListCount++; + + if ($dist > $farthestDist) { + $farthestPoint = $point; + $farthestDist = $dist; + } + } + } + + if ($outsideListCount == 0) { + return array($minPoint); + } else if ($outsideListCount == 1) { + return array($minPoint, $outsideList[0]); + } else { + return array_merge( + quickHullCalc($outsideList, $outsideListCount, $minPoint, $farthestPoint, $isBottom), + quickHullCalc($outsideList, $outsideListCount, $farthestPoint, $maxPoint, $isBottom)); + } + } + + /* This function receives a list of points [lat, lon] and returns a list of points [lat, lon] + representing the minimal convex polygon containing the points */ + function quickHull(&$pointList, $count) { + + $msg= 'Quick count='.$count; + + if ($count == 0) { + return array(); + } else if ($count == 1) { + return array($pointList[0]); + } else if ($count == 2) { + return array($pointList[0], $pointList[1]); + } + + /* retrieves the min and max points on the x axe */ + $minPoint = $pointList[0]; + $maxPoint = $pointList[0]; + + foreach ($pointList as $point) { + if ($point->lon < $minPoint->lon || ($point->lon == $minPoint->lon && $point->lat < $minPoint->lat)) { + $minPoint = $point; + } + if ($point->lon > $maxPoint->lon || ($point->lon == $maxPoint->lon && $point->lat > $maxPoint->lat)) { + $maxPoint = $point; + } + } + + $bottomPoints = quickHullCalc($pointList, $count, $minPoint, $maxPoint, 1); + $topPoints = quickHullCalc($pointList, $count, $maxPoint, $minPoint, -1); + return array_merge($bottomPoints, $topPoints); + } + + + + + $GRID_MAX_ZOOM = 16; + $GRID_CELL_PIXEL = 90; + + /* Check if parameters are not empty */ + if ( !array_key_exists('bbox', $_GET) + || !array_key_exists('zoom', $_GET) + || !array_key_exists('width', $_GET) + || !array_key_exists('height', $_GET)) { + header('Content-type: application/json'); + $result = '{"error":"bbox, zoom, width and height parameters are required. ' + .(array_key_exists('bbox', $_GET) ? '' : 'bbox is empty. ') + .(array_key_exists('zoom', $_GET) ? '' : 'zoom is empty. ') + .(array_key_exists('width', $_GET) ? '' : 'width is empty. ') + .(array_key_exists('height', $_GET) ? '' : 'height is empty. ') + .'"}'; + echo $result; + exit; + } + + /* Check zoom */ + $zoom = $_GET['zoom']; + + if ( !is_numeric($zoom) + || intval($zoom) < 1 + || intval($zoom) > 19) { + header('Content-type: application/json'); + $result = '{"error":"unexpected zoom value : ' + .htmlentities($zoom) + .'"}'; + echo $result; + exit; + } + + /* Check bounds box --> bbox=boundsSW.lng,boundsSW.lat,boundsNE.lng,boundsNE.lat */ + $bbox = explode(',', $_GET['bbox']); + + if ( !is_numeric($bbox[0]) || $bbox[0] > 180 // 0 = SW.lng + || !is_numeric($bbox[2]) || $bbox[2] < -180 // 2 = NE.lng + || !is_numeric($bbox[1]) || $bbox[1] < -90 || $bbox[1] > 90 // 1 = SW.lat + || !is_numeric($bbox[3]) || $bbox[3] < -90 || $bbox[3] > 90) { // 3 = NE.lat + header('Content-type: application/json'); + $result = '{"error":"unexpected bbox longitude and latitude values : ' + .'lon ['.htmlentities($bbox[0]).', '.htmlentities($bbox[2]).'], ' + .'lat ['.htmlentities($bbox[1]).', '.htmlentities($bbox[3]).']' + .'"}'; + echo $result; + exit; + } + + if ($bbox[0] >= $bbox[2]) { // 0 = SW.lng | 2 = NE.lng + header('Content-type: application/json'); + $result = '{"error":"min longitude greater than max longitude : ' + .'lon ['.htmlentities($bbox[0]).', '.htmlentities($bbox[2]).']' + .'"}'; + echo $result; + exit; + } + + if ($bbox[1] >= $bbox[3]) { // 1 = SW.lat | 3 = NE.lat + header('Content-type: application/json'); + $result = '{"error":"min latitude greater than max latitude : ' + .'lat ['.htmlentities($bbox[1]).', '.htmlentities($bbox[3]).']' + .'"}'; + echo $result; + exit; + } + + $lonMin = $bbox[0]; // 0 = SW.lng + $lonMax = $bbox[2]; // 2 = NE.lng + $latMin = $bbox[1]; // 1 = SW.lat + $latMax = $bbox[3]; // 3 = NE.lat + + $pixelWidth = (int) $_GET['width']; + $pixelHeight = (int) $_GET['height']; + + if ($pixelWidth == 0 || $pixelHeight == 0) { + header('Content-type: application/json'); + $result = '{"error":"width or height is null : ' + .htmlentities($pixelWidth).'x'.htmlentities($pixelHeight) + .'"}'; + echo $result; + exit; + } + + $lonWidth = $lonMax - $lonMin; // NE.lng - SW.lng + $latHeight = $latMax - $latMin; // NE.lat - SW.lat + + $divWCount = ((int) ($pixelWidth / $GRID_CELL_PIXEL)) + 1; + $divHCount = ((int) ($pixelHeight / $GRID_CELL_PIXEL)) + 1; + + $divWidth = $lonWidth / $divWCount; + $divHeight = $latHeight / $divHCount; + $divDiag2 = ($divWidth * $divWidth) + ($divHeight * $divHeight); + + /* Connect to database */ + $mysqli = new mysqli(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWD, MYSQL_DB); + if($mysqli->connect_errno) { + header('Content-type: application/json'); + $result = '{"error":"error while connecting to db : ' . $mysqli->error . '"}'; + echo $result; + exit; + } + + $rqtLonMin = $lonMin; // SW.lng + $rqtLonMax = $lonMax; // NE.lng + + /* Indicates whether the map displays the -180/180° longitude */ + if ($rqtLonMax - $rqtLonMin > 360) { + $rqtLonMin = -180; + $rqtLonMax = 180; + } + + /* Select the nodes to be returned, and cluster them on a grid if necessary */ + if ($rqtLonMin >= -180 && $lonMax <= 180) { + $sql='SELECT id, latitude, longitude + FROM position + WHERE latitude between ? and ? + AND longitude between ? and ?'; + } else { + $sql='SELECT id, latitude, longitude + FROM position + WHERE latitude between ? and ? + AND (longitude between ? and 1800000000 OR longitude between -1800000000 and ?)'; + + while ($rqtLonMin < -180) { + $rqtLonMin += 360; + } + while ($rqtLonMax > 180) { + $rqtLonMax -= 360; + } + } + + $rqtLonMin = bcmul($rqtLonMin, 10000000, 0); // SW.lng + $rqtLonMax = bcmul($rqtLonMax, 10000000, 0); // NE.lng + $rqtLatMin = bcmul($latMin, 10000000, 0); // SW.lat + $rqtLatMax = bcmul($latMax, 10000000, 0); // NE.lat + + $resArray = array(); + $nbFetch = 0; + + if ($stmt = $mysqli->prepare($sql)) { + $stmt->bind_param('iiii', $rqtLatMin, $rqtLatMax, $rqtLonMin, $rqtLonMax); // SW.lat, NE.lat, SW.lng, NE.lng + + $stmt->execute(); + + $stmt->bind_result($id, $latitude, $longitude); + + while ($stmt->fetch()) { + $nbFetch++; + + $latitude = bcdiv($latitude, 10000000, 7); + $longitude = bcdiv($longitude, 10000000, 7); + + while ($longitude < $lonMin) { // $lonMin = SW.lng + $longitude += 360; + } + while ($longitude > $lonMax) { // $lonMax = NE.lng + $longitude -= 360; + } + + /* Initialize the current point */ + if ($zoom >= $GRID_MAX_ZOOM) { + array_push($resArray, array( + 'points' => array(new OsmPoint($id, $latitude, $longitude)), + 'latitude' => $latitude, + 'longitude' => $longitude, + 'count' => 1 )); + } else { + $posLat = (int) (($latitude - $latMin) / $divHeight); // $latMin = SW.lat + $posLon = (int) (($longitude - $lonMin) / $divWidth); // $lonMin = SW.lng + $pos = $posLon.','.$posLat; + + if (!array_key_exists($pos, $resArray)) { + $resArray[$pos] = array( + 'points' => array(), + 'latitude' => 0, + 'longitude' => 0, + 'count' => 0, + 'grid' => $pos); + } + + $elt = new OsmPoint($id, $latitude, $longitude); + array_push($resArray[$pos]['points'], $elt); + + /* Increment the number of points */ + $resArray[$pos]['count']++; + $resArray[$pos]['latitude'] += $latitude; + $resArray[$pos]['longitude'] += $longitude; + } + } + + $stmt->close(); + } else { + $mysqli->close(); + header('Content-type: application/json'); + $result = '{"error":"Error while request : ' . $mysqli->error . '"}'; + echo $result; + exit; + } + + /* Unify some clusters if nodes center are near */ + $pointsCount = 0; + if ($zoom < $GRID_MAX_ZOOM) { + foreach($resArray as $val) { + mergeNeighborhood($resArray, $val['grid']); + $pointsCount += $val['count']; + } + } + + $result='['; + $separator=''; + + /* Writing selected points */ + $sql='SELECT k, v + FROM tag + WHERE id = ? + AND k NOT IN ("lat", "lon")'; + + $stmt = $mysqli->prepare($sql); + $stmt->bind_param('d', $id); + $stmt->bind_result($k, $v); + + /* Writing grouped items or not */ + foreach($resArray as $val) { + if ($val['count'] > 0) { + $result = $result.$separator + .'{"lat":"'.($val['latitude'] / $val['count']).'"' + .',"lon":"'.($val['longitude'] / $val['count']).'"'; + + if ($val['count'] == 1) { + $id = $val['points'][0]->id; + $result = $result.',"id":"'.$id.'"'; + + $stmt->execute(); + + while($stmt->fetch()) { + $result = $result.',"'.htmlentities($k).'":"'.htmlentities($v, ENT_COMPAT, 'UTF-8').'"'; + } + } else { + $result = $result + .',"count":"'.$val['count'].'"' + .',"multi":"yes"' + .',"poly":['; + + if ($pointsCount < MAX_POINTS_FOR_QUICKHULL) { + $convexPoly = quickHull($val['points'], $val['count']); + $sepPoly = ''; + foreach($convexPoly as $point) { + $result = $result.$sepPoly.'{' + .'"lat":"'.$point->lat.'"' + .',"id":"'.$point->id.'"' + .',"lon":"'.$point->lon.'"}'; + $sepPoly=','; + } + } + $result=$result.']'; + } + + $result = $result.'}'; + $separator=','; + } + } + + $stmt->close(); + + $result = $result . ']'; + + $mysqli->close(); + + header('Content-type: application/json; Charset : utf-8'); + echo $result; +?> diff --git a/www/sunders/config.php.example b/www/sunders/config.php.example new file mode 100644 index 0000000..6df3a3f --- /dev/null +++ b/www/sunders/config.php.example @@ -0,0 +1,17 @@ + diff --git a/www/sunders/css/spinner.css b/www/sunders/css/spinner.css new file mode 100644 index 0000000..a687599 --- /dev/null +++ b/www/sunders/css/spinner.css @@ -0,0 +1,179 @@ +.spinner-bar { + display: flex; + justify-content: space-between; + width: 360px; +} + +@keyframes spinner1 { + 0% { opacity: 1; } + 5% { opacity: 1; } + 10% { opacity: 0.2; } + 90% { opacity: 0.2; } + 95% { opacity: 1; } + 100% { opacity: 1; } +} + +@keyframes spinner2 { + 0% { opacity: 0.2; } + 5% { opacity: 1; } + 10% { opacity: 1; } + 15% { opacity: 0.2; } + 85% { opacity: 0.2; } + 90% { opacity: 1; } + 95% { opacity: 1; } + 100% { opacity: 0.2; } +} + +@keyframes spinner3 { + 0% { opacity: 0.2; } + 5% { opacity: 0.2; } + 10% { opacity: 1; } + 15% { opacity: 1; } + 20% { opacity: 0.2; } + 80% { opacity: 0.2; } + 85% { opacity: 1; } + 90% { opacity: 1; } + 95% { opacity: 0.2; } + 100% { opacity: 0.2; } +} + +@keyframes spinner4 { + 0% { opacity: 0.2; } + 10% { opacity: 0.2; } + 15% { opacity: 1; } + 20% { opacity: 1; } + 25% { opacity: 0.2; } + 75% { opacity: 0.2; } + 80% { opacity: 1; } + 85% { opacity: 1; } + 90% { opacity: 0.2; } + 100% { opacity: 0.2; } +} + +@keyframes spinner5 { + 0% { opacity: 0.2; } + 15% { opacity: 0.2; } + 20% { opacity: 1; } + 25% { opacity: 1; } + 30% { opacity: 0.2; } + 70% { opacity: 0.2; } + 75% { opacity: 1; } + 80% { opacity: 1; } + 85% { opacity: 0.2; } + 100% { opacity: 0.2; } +} + +@keyframes spinner6 { + 0% { opacity: 0.2; } + 20% { opacity: 0.2; } + 25% { opacity: 1; } + 30% { opacity: 1; } + 35% { opacity: 0.2; } + 65% { opacity: 0.2; } + 70% { opacity: 1; } + 75% { opacity: 1; } + 80% { opacity: 0.2; } + 100% { opacity: 0.2; } +} + +@keyframes spinner7 { + 0% { opacity: 0.2; } + 25% { opacity: 0.2; } + 30% { opacity: 1; } + 35% { opacity: 1; } + 40% { opacity: 0.2; } + 60% { opacity: 0.2; } + 65% { opacity: 1; } + 70% { opacity: 1; } + 75% { opacity: 0.2; } + 100% { opacity: 0.2; } +} + +@keyframes spinner8 { + 0% { opacity: 0.2; } + 30% { opacity: 0.2; } + 35% { opacity: 1; } + 40% { opacity: 1; } + 45% { opacity: 0.2; } + 55% { opacity: 0.2; } + 60% { opacity: 1; } + 65% { opacity: 1; } + 70% { opacity: 0.2; } + 100% { opacity: 0.2; } +} + +@keyframes spinner9 { + 0% { opacity: 0.2; } + 35% { opacity: 0.2; } + 40% { opacity: 1; } + 45% { opacity: 1; } + 50% { opacity: 0.2; } + 55% { opacity: 1; } + 60% { opacity: 1; } + 65% { opacity: 0.2; } + 100% { opacity: 0.2; } +} + +@keyframes spinner10 { + 0% { opacity: 0.2; } + 40% { opacity: 0.2; } + 45% { opacity: 1; } + 55% { opacity: 1; } + 60% { opacity: 0.2; } + 100% { opacity: 0.2; } +} + +.spinner { + animation-duration: 2s; + animation-iteration-count: infinite; + animation-direction: alternate; +} + +.spinner1 { + animation-name: spinner1; +} + +.spinner2 { + animation-name: spinner2; +} + +.spinner3 { + animation-name: spinner3; +} + +.spinner4 { + animation-name: spinner4; +} + +.spinner5 { + animation-name: spinner5; +} + +.spinner6 { + animation-name: spinner6; +} + +.spinner7 { + animation-name: spinner7; +} + +.spinner8 { + animation-name: spinner8; +} + +.spinner9 { + animation-name: spinner9; +} + +.spinner10 { + animation-name: spinner10; +} + +/* MOBILE SETTINGS */ +@media only screen and (max-width: 600px) { + .spinner-bar { + width: 100%; + padding-right: 20px; + padding-left: 20px; + } +} diff --git a/www/sunders/css/stats.css b/www/sunders/css/stats.css new file mode 100644 index 0000000..b317fe6 --- /dev/null +++ b/www/sunders/css/stats.css @@ -0,0 +1,588 @@ +/* ICON COLORS */ + +.icon0-color { color: #6c5d53; } /* gray */ +.icon1-color { color: #d40055; } /* red */ +.icon2-color { color: #0055d4; } /* blue */ +.icon3-color { color: #00d455; } /* green */ +.iconxxx-color { color: #a1a1b3; } /* text color */ + +/* ICON FILL COLORS */ + +.icon0-fill { fill: #6c5d53; } /* gray */ +.icon1-fill { fill: #d40055; } /* red */ +.icon2-fill { fill: #0055d4; } /* blue */ +.icon3-fill { fill: #00d455; } /* green */ +.iconxxx-fill { fill: #a1a1b3; } /* text color */ + +/* ICON STROKE COLORS */ + +.icon0-stroke { stroke: #6c5d53; } /* gray */ +.icon1-stroke { stroke: #d40055; } /* red */ +.icon2-stroke { stroke: #0055d4; } /* blue */ +.icon3-stroke { stroke: #00d455; } /* green */ +.iconxxx-stroke { stroke: #a1a1b3; } /* text color */ + +/* ICON BACKGROUND COLORS */ + +.icon0-bg { background: #6c5d53; } /* gray */ +.icon1-bg { background: #d40055; } /* red */ +.icon2-bg { background: #0055d4; } /* blue */ +.icon3-bg { background: #00d455; } /* green */ +.iconxxx-bg { background: #a1a1b3; } /* text color */ + +/* ICON BORDER TOP COLORS */ + +.icon0-bt { border-top: 1px solid #6c5d53; } /* gray */ +.icon1-bt { border-top: 1px solid #d40055; } /* red */ +.icon2-bt { border-top: 1px solid #0055d4; } /* blue */ +.icon3-bt { border-top: 1px solid #00d455; } /* green */ +.iconxxx-bt { border-top: 1px solid #a1a1b3; } /* text color */ + +/* ICON BORDER BOTTOM COLORS */ + +.icon0-bb { border-bottom: 1px solid #6c5d53; } /* gray */ +.icon1-bb { border-bottom: 1px solid #d40055; } /* red */ +.icon2-bb { border-bottom: 1px solid #0055d4; } /* blue */ +.icon3-bb { border-bottom: 1px solid #00d455; } /* green */ +.iconxxx-bb { border-bottom: 1px solid #a1a1b3; } /* text color */ + +/* CHART COLORS */ + +.color0-color { color: #6c5d53; } /* gray */ +.color1-color { color: rgb(117, 60,123); } +.color2-color { color: rgb(179,121,216); } +.color3-color { color: rgb(202, 45,197); } +.color4-color { color: rgb(170, 0,120); } +.color5-color { color: rgb(209, 15, 85); } +.color6-color { color: rgb(236, 75, 24); } +.color7-color { color: rgb(247,147, 30); } +.color8-color { color: rgb(252,226,108); } +.color9-color { color: rgb(198,242, 94); } +.color10-color { color: rgb(159,196, 55); } +.color11-color { color: rgb( 87,226, 76); } +.color12-color { color: rgb( 64,164, 66); } +.color13-color { color: rgb( 5,222,158); } +.color14-color { color: rgb(196,252,240); } +.color15-color { color: rgb(100,186,170); } +.color16-color { color: rgb( 45,166,162); } +.color17-color { color: rgb( 26,167,238); } +.color18-color { color: rgb( 93,102,232); } +.color19-color { color: rgb( 53, 60,152); } +.color20-color { color: rgb( 53, 11,122); } +.colorxxx-color { color: #a1a1b3; } /* text color */ + +/* CHART FILL COLORS */ + +.color0-fill { fill: #6c5d53; } /* gray */ +.color1-fill { fill: rgb(117, 60,123); } +.color2-fill { fill: rgb(179,121,216); } +.color3-fill { fill: rgb(202, 45,197); } +.color4-fill { fill: rgb(170, 0,120); } +.color5-fill { fill: rgb(209, 15, 85); } +.color6-fill { fill: rgb(236, 75, 24); } +.color7-fill { fill: rgb(247,147, 30); } +.color8-fill { fill: rgb(252,226,108); } +.color9-fill { fill: rgb(198,242, 94); } +.color10-fill { fill: rgb(159,196, 55); } +.color11-fill { fill: rgb( 87,226, 76); } +.color12-fill { fill: rgb( 64,164, 66); } +.color13-fill { fill: rgb( 5,222,158); } +.color14-fill { fill: rgb(196,252,240); } +.color15-fill { fill: rgb(100,186,170); } +.color16-fill { fill: rgb( 45,166,162); } +.color17-fill { fill: rgb( 26,167,238); } +.color18-fill { fill: rgb( 93,102,232); } +.color19-fill { fill: rgb( 53, 60,152); } +.color20-fill { fill: rgb( 53, 11,122); } +.colorxxx-fill { fill: #a1a1b3; } /* text color */ + +/* CHART STROKE COLORS */ + +.color0-stroke { stroke: #6c5d53; } /* gray */ +.color1-stroke { stroke: rgb(117, 60,123); } +.color2-stroke { stroke: rgb(179,121,216); } +.color3-stroke { stroke: rgb(202, 45,197); } +.color4-stroke { stroke: rgb(170, 0,120); } +.color5-stroke { stroke: rgb(209, 15, 85); } +.color6-stroke { stroke: rgb(236, 75, 24); } +.color7-stroke { stroke: rgb(247,147, 30); } +.color8-stroke { stroke: rgb(252,226,108); } +.color9-stroke { stroke: rgb(198,242, 94); } +.color10-stroke { stroke: rgb(159,196, 55); } +.color11-stroke { stroke: rgb( 87,226, 76); } +.color12-stroke { stroke: rgb( 64,164, 66); } +.color13-stroke { stroke: rgb( 5,222,158); } +.color14-stroke { stroke: rgb(196,252,240); } +.color15-stroke { stroke: rgb(100,186,170); } +.color16-stroke { stroke: rgb( 45,166,162); } +.color17-stroke { stroke: rgb( 26,167,238); } +.color18-stroke { stroke: rgb( 93,102,232); } +.color19-stroke { stroke: rgb( 53, 60,152); } +.color20-stroke { stroke: rgb( 53, 11,122); } +.colorxxx-stroke { stroke: #a1a1b3; } /* text color */ + +/* CHART BACKGROUD COLORS */ + +.color0-bg { background: #6c5d53; } /* gray */ +.color1-bg { background: rgb(117, 60,123); } +.color2-bg { background: rgb(179,121,216); } +.color3-bg { background: rgb(202, 45,197); } +.color4-bg { background: rgb(170, 0,120); } +.color5-bg { background: rgb(209, 15, 85); } +.color6-bg { background: rgb(236, 75, 24); } +.color7-bg { background: rgb(247,147, 30); } +.color8-bg { background: rgb(252,226,108); } +.color9-bg { background: rgb(198,242, 94); } +.color10-bg { background: rgb(159,196, 55); } +.color11-bg { background: rgb( 87,226, 76); } +.color12-bg { background: rgb( 64,164, 66); } +.color13-bg { background: rgb( 5,222,158); } +.color14-bg { background: rgb(196,252,240); } +.color15-bg { background: rgb(100,186,170); } +.color16-bg { background: rgb( 45,166,162); } +.color17-bg { background: rgb( 26,167,238); } +.color18-bg { background: rgb( 93,102,232); } +.color19-bg { background: rgb( 53, 60,152); } +.color20-bg { background: rgb( 53, 11,122); } +.colorxxx-bg { background: #a1a1b3; } /* text color */ + +/* CHART BORDER TOP COLORS */ + +.color0-bt { border-top: 1px solid #6c5d53; } /* gray */ +.color1-bt { border-top: 1px solid rgb(117, 60,123); } +.color2-bt { border-top: 1px solid rgb(179,121,216); } +.color3-bt { border-top: 1px solid rgb(202, 45,197); } +.color4-bt { border-top: 1px solid rgb(170, 0,120); } +.color5-bt { border-top: 1px solid rgb(209, 15, 85); } +.color6-bt { border-top: 1px solid rgb(236, 75, 24); } +.color7-bt { border-top: 1px solid rgb(247,147, 30); } +.color8-bt { border-top: 1px solid rgb(252,226,108); } +.color9-bt { border-top: 1px solid rgb(198,242, 94); } +.color10-bt { border-top: 1px solid rgb(159,196, 55); } +.color11-bt { border-top: 1px solid rgb( 87,226, 76); } +.color12-bt { border-top: 1px solid rgb( 64,164, 66); } +.color13-bt { border-top: 1px solid rgb( 5,222,158); } +.color14-bt { border-top: 1px solid rgb(196,252,240); } +.color15-bt { border-top: 1px solid rgb(100,186,170); } +.color16-bt { border-top: 1px solid rgb( 45,166,162); } +.color17-bt { border-top: 1px solid rgb( 26,167,238); } +.color18-bt { border-top: 1px solid rgb( 93,102,232); } +.color19-bt { border-top: 1px solid rgb( 53, 60,152); } +.color20-bt { border-top: 1px solid rgb( 53, 11,122); } +.colorxxx-bt { border-top: 1px solid #a1a1b3; } /* text color */ + +/* CHART BORDER BOTTOM COLORS */ + +.color0-bb { border-bottom: 1px solid #6c5d53; } /* gray */ +.color1-bb { border-bottom: 1px solid rgb(117, 60,123); } +.color2-bb { border-bottom: 1px solid rgb(179,121,216); } +.color3-bb { border-bottom: 1px solid rgb(202, 45,197); } +.color4-bb { border-bottom: 1px solid rgb(170, 0,120); } +.color5-bb { border-bottom: 1px solid rgb(209, 15, 85); } +.color6-bb { border-bottom: 1px solid rgb(236, 75, 24); } +.color7-bb { border-bottom: 1px solid rgb(247,147, 30); } +.color8-bb { border-bottom: 1px solid rgb(252,226,108); } +.color9-bb { border-bottom: 1px solid rgb(198,242, 94); } +.color10-bb { border-bottom: 1px solid rgb(159,196, 55); } +.color11-bb { border-bottom: 1px solid rgb( 87,226, 76); } +.color12-bb { border-bottom: 1px solid rgb( 64,164, 66); } +.color13-bb { border-bottom: 1px solid rgb( 5,222,158); } +.color14-bb { border-bottom: 1px solid rgb(196,252,240); } +.color15-bb { border-bottom: 1px solid rgb(100,186,170); } +.color16-bb { border-bottom: 1px solid rgb( 45,166,162); } +.color17-bb { border-bottom: 1px solid rgb( 26,167,238); } +.color18-bb { border-bottom: 1px solid rgb( 93,102,232); } +.color19-bb { border-bottom: 1px solid rgb( 53, 60,152); } +.color20-bb { border-bottom: 1px solid rgb( 53, 11,122); } +.colorxxx-bb { border-bottom: 1px solid #a1a1b3; } /* text color */ + +body { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + background: #222233; + color: #a1a1b3; + font-family: sans-serif; +} + +.light { + font-weight: 100; +} + +.bold { + font-weight: bold; +} + +.right { + text-align: right; +} + +text { + fill: #a1a1b3; +} + +a { + color: #0192d9; + text-decoration: none; +} + +a:hover { + color: #a1a1b3; +} + +a text { + fill: #0192d9; +} + +div.selected { + border-bottom: solid 2px #0192d9; +} + +div.unselected { + border-bottom: solid 2px #222233; +} + +.header, .footer { + text-align: center; + margin: 0 10%; +} + +.header:hover, .footer:hover { + background: rgba(161, 161, 179, 0.2); +} + +.header { + margin-top: 60px; +} + +.footer { + margin-bottom: 60px; +} + +.distance { + margin: 0 10% 3% 10%; +} + +.to-be-translated { + color: #d40055; +} +.to-be-translated a { + color: #ac39ac; + text-decoration: none; +} + +.to-be-translated a:hover { + color: #d40055; +} + +@media (orientation: landscape) { + .pie { + flex-direction: row; + } + + .pie .pie-chart { + width: 50%; + } + + .pie .pie-legend { + width: 40%; + padding-left: 10%; + } +} + +@media (orientation: portrait) { + .pie { + flex-direction: column; + } + + .pie > div { + width: 100%; + } + + .pie .pie-legend { + margin-top: 50px; + } +} + +/* TOTAL CHART */ + +.vb-total { + margin: 10%; +} + +.g-total > text { + text-anchor: middle; +} + +.g-total .number { + font-size: 20px; +} + +.g-total .text { + font-size: 3px; +} + +/* NAVI */ + +.navi-section-check { + display: none; +} + +.navi-section-check + .navi-section-toggle { + cursor: pointer; + display: block; +} + +/* checkbox = false --> hide navi section */ +.navi-section-check ~ .navi-section { + display: none; +} + +/* checkbox = true --> hide toggle button */ +.navi-section-check:checked + .navi-section-toggle { + display: none; +} + +/* checkbox = true --> show navi section */ +.navi-section-check:checked ~ .navi-section { + display: block; +} + +.navi-section-toggle { + margin: 0 10%; +} + +.navi-section-toggle:hover { + background: rgba(161, 161, 179, 0.2); +} + +.navi-section-toggle .navi-text { + fill: #0192d9; + font-size: 3px; +} + +.navi-row { + display: flex; + flex-direction: row; + margin: 0 10%; +} + +.navi-row.cats .navi-text { + font-size: 10px; +} + +.navi-row.years .navi-text, .navi-row.months .navi-text { + font-size: 17px; +} + +.navi-row.lines .navi-text { + font-size: 6.5px; +} + +.navi-element:hover { + background: rgba(161, 161, 179, 0.2); +} + +.navi-text { + text-anchor: middle; + font-weight: lighter; +} + +/* PIE CHART */ + +.pie { + display: flex; + align-items: flex-start; + margin: 10%; +} + +.pie-slice-link { + cursor: pointer; +} + +.pie-text { + text-anchor: middle; + font-size: 6px; +} + +.g-pie path { + stroke: #222233; +} + +.g-pie .donut-hole { + fill: #222233; +} + +.pie-legend-row { + margin-bottom: 10px; +} + +.pie-legend-row > div { + display: flex; + flex-direction: row; +} + +.square { + min-width: 20px; + min-height: 20px; +} + +.square-double { + min-width: 40px; + min-height: 20px; +} + +/* PIE CHART LEGEND */ + +.pie-legend-section-check { + display: none; +} + +/* checkbox = false + -- show section 'less' + -- show button 'more' + -- hide section 'more' + -- hide button 'less' */ +.pie-legend-section-check ~ .pie-legend-less { + display: block; +} + +.pie-legend-section-check ~ .pie-legend-section-toggle-more { + display: block; +} + +.pie-legend-section-check ~ .pie-legend-more { + display: none; +} + +.pie-legend-section-check ~ .pie-legend-section-toggle-less { + display: none; +} + +/* checkbox = true + -- show section 'more' + -- show button 'less' + -- hide section 'less' + -- hide button 'more' */ + +.pie-legend-section-check:checked ~ .pie-legend-more { + display: block; +} + +.pie-legend-section-check:checked ~ .pie-legend-section-toggle-less { + display: block; +} + +.pie-legend-section-check:checked ~ .pie-legend-less { + display: none; +} + +.pie-legend-section-check:checked ~ .pie-legend-section-toggle-more { + display: none; +} + +.pie-legend label { + cursor: pointer; + height: 40px; + background-repeat: no-repeat; + background-position: 40px; + background-color: transparent; +} + +.pie-legend-section-toggle-more { + background-image: url('../images/button_more_blue.png'); +} + +.pie-legend-section-toggle-more:hover { + background-image: url('../images/button_more_gray.png'); +} + +.pie-legend-section-toggle-less { + background-image: url('../images/button_less_blue.png'); +} + +.pie-legend-section-toggle-less:hover { + background-image: url('../images/button_less_gray.png'); +} + +/* TIME CHART */ + +.time { + display: flex; + flex-direction: column; + margin: 10%; +} + +.time-chart { + margin-bottom: 50px; +} + +.line-text { + text-anchor: middle; + font-weight: lighter; +} + +.g-time { + fill: none; + stroke-width: 4px; +} + +.day .g-time { + stroke-width: 10px; +} + +.h-grid, .v-grid { + stroke: #a1a1b3; +} + +.h-grid { + stroke-width: 2px; + stroke-opacity: 0.1; +} + +.v-grid { + stroke-dasharray:0.5%, 1%; + stroke-opacity: 0.2; +} + +.day .h-grid { + stroke-width: 5px; +} + +.day .v-grid { + stroke-width: 3px; +} + +.v-label { + text-anchor: middle; +} + +.time-legend table { + width: 100%; + border-collapse: collapse; +} + +.time-legend .title { + padding-bottom: 50px; + text-align: center; + font-size: 1.2rem; +} + +.time .row-distance { + font-size: 0.2rem; +} + +.time .row-title { + font-size: 0.8rem; +} + +tfoot td { + font-weight: bold; + text-align: center; + padding-top: 8px; +} + +/*.even-bg { + background: rgba(161, 161, 179, 0.1); +}*/ diff --git a/www/sunders/css/sunders.css b/www/sunders/css/sunders.css new file mode 100644 index 0000000..8011f9f --- /dev/null +++ b/www/sunders/css/sunders.css @@ -0,0 +1,766 @@ +/* COLORS +background: #222233 / 34, 34, 51 +text: #a1a1b3 / 161,161,179 +links: #0192d9 / 1,146,217 + +beige: #f1eee8 / 241,238,232 +lightblue: #0192d9 / 1,146,217 +darkblue: #050585 / 5, 5,133 +gray: #d9d0c9 / 217,208,201 +purple: #ac39ac / 172, 57,172 + +red icon: #d40055 / 212, 0, 85 +blue icon: #0055d4 / 0, 85,212 +green icon: #00d455 / 0,212, 85 +gray icon: #6c5d53 / 108, 93, 83 +yellow icon: #ffdd55 / 255,221, 85 */ + +html { + height: 100%; +} + +body { + height: 100%; + margin: 0; + padding: 0; + overflow-x: hidden; + font-family: sans-serif; +} + +#map { + width: 100%; + height: 100%; +} + +.bold { + font-weight: bold; +} + +.monospace { + font-family: monospace; + font-size: 1.5em; +} + +.text-small { + font-size: 0.8em; +} + +.text-medium { + font-size: 0.9em; +} + +.w-20 { + width: 20px; +} + +.w-45 { + width: 45px; + min-width: 45px; +} + +.w-120 { + width: 120px; + min-width: 120px; +} + +.w-240 { + width: 240px; +} + +.w-260 { + width: 260px; +} + +.w-315 { + width: 315px; +} + +.w-340 { + width: 340px; +} + +.pl-20 { + padding-left: 20px; +} + +.slider-toggle-input[type=checkbox] { + position: absolute; + opacity: 0; +} + +.slider-toggle-input[type=checkbox]:checked ~ .slider-overlay, +.slider-toggle-input[type=checkbox]:checked ~ .slider { + transform: translate3d(0, 0, 0); +} + +.slider-toggle-input[type=checkbox]:checked ~ .slider-toggle-button { + transform: translate3d(-490px, 0, 0) rotate(180deg); +} + +.slider-toggle-button { + position: absolute; + top: 10px; + right: 10px; + z-index: 250000; + cursor: pointer; + transform-origin: 20px 20px; + transition: transform .8s; +} + +.slider-toggle-bar { + display: none; +} + +.slider-overlay { + position: absolute; + right: 30px; + width: 470px; + z-index: 200000; + transform: translate3d(490px, 0, 0); + transition: all .8s; +} + +/*#news.slider-overlay { + display: flex; + align-items: flex-end; + top: 95px; + right: -255px; + color: #ffdd55; + font-weight: bold; +} + +#news.slider-overlay .text { + padding-left: 10px; +}*/ + +#anchorbar.slider-overlay { + top: 10px; +} + +#buttonbar.slider-overlay { + top: 52px; +} + +.topbar { + display: flex; + justify-content: space-around; + align-items: center; + position: absolute; + width: 470px; + height: 40px; + background: #0192d9; + color: #f1eee8; +} + +.topbar.anchorbar { + background-color: rgba(1, 146, 217, 0.9); +} + +.topbar.buttonbar { + background-color: rgba(1, 146, 217, 0.6); +} + +.mobile-bar-padding { + width: 0; +} + +.bar-button { + width: 80px; + height: 30px; + background-repeat: no-repeat; + background-position: center; + background-color: transparent; + border: 1px solid transparent; + cursor: pointer; +} + +.bar-button:hover { + border: 1px solid #f1eee8; +} + +.bar-button.main { + width: 120px; +} + +.bar-button.search { + background-image: url('../images/button_search.png'); +} + +.bar-button.stats { + background-image: url('../images/button_stats.png'); +} + +.bar-button.permalink { + background-image: url('../images/button_permalink.png'); +} + +.search-group { + position: relative; +} + +#search-overlay { + display: none; + position: absolute; + top: 42px; + width: 430px; + padding: 30px 20px; + background-color: rgba(1, 146, 217, 0.9); + color: #f1eee8; +} + +.search-field-row { + display: flex; + justify-content: center; + align-items: center; +} + +#search-input { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #222233; + border: 1px solid #f1eee8; + border-radius: 0px; + border-right: none; + color: #f1eee8; + width: 320px; + height: 30px; + line-height: 30px; + padding: 0px 10px; + font-family: monospace; + font-weight: bold; +} + +#search-input:focus { + outline: 0; +} + +.search-button { + width: 34px; + height: 32px; + background-image: url('../images/button_search.png'); + background-repeat: no-repeat; + background-position: center; + background-color: #222233; + border: 1px solid #f1eee8; + border-left: 1px solid transparent; + color: #f1eee8; + cursor: pointer; +} + +.search-button:hover { + border-left: 1px solid #f1eee8; +} + +.search-button:focus { + outline: 0; +} + +#search-results-overlay { + display: none; + position: absolute; + top: 136px; + bottom: 0; + width: 470px; + overflow-y: auto; + background: #0192d9; + background-color: rgba(1, 146, 217, 0.9); + color: #f1eee8; +} + +#search-spinner-block { + display: none; + padding: 20px 0; +} + +#search-spinner { + display: flex; + justify-content: center; +} + +#search-results-list-block { + display: none; + padding: 20px 0; +} + +#search-results-list { + display: flex; + flex-direction: column; + align-items: center; +} + +.search-result { + width: 370px; + padding: 15px 20px; + border: 1px solid transparent; + border-bottom: 1px dotted #f1eee8; + line-height: 25px; + cursor: pointer; +} + +.search-result:first-child { + border-top: 1px dotted #f1eee8; +} + +.search-result:hover { + background-color: #222233; +} + +.search-more { + width: 100px; + height: 30px; + background-repeat: no-repeat; + background-position: center; + background-color: transparent; + border: 1px solid transparent; + cursor: pointer; +} + +.search-more:hover { + border: 1px solid #f1eee8; +} + +.search-more.search-previous { + background-image: url('../images/button_previous.png'); + margin-bottom: 10px; +} + +.search-more.search-next { + background-image: url('../images/button_next.png'); + margin-top: 10px; +} + +.close { + position: absolute; + top: 10px; + right: 10px; + width: 20px; + height: 20px; + background-image: url('../images/close.png'); + background-repeat: no-repeat; + background-position: center; + background-color: transparent; + border: 1px solid transparent; + cursor: pointer; +} + +.close:hover { + border: 1px solid #f1eee8; +} + +.language-toggle-input { + display: none; +} + +.language-toggle-input[type=checkbox]:checked ~ .language-toggle-button #language li ul { + display: block; +} + +#language { + background-image: url('../images/button_language.png'); + list-style:none; + padding: 0; + z-index: 300000; +} + +#language li { + position: relative; + text-align: center; +} + +#language ul { + display: none; + list-style: none; + position: absolute; + padding: 0; +} + +#language ul a { + color: #f1eee8; + font-family: monospace; + font-size: 1em; + text-decoration: none; +} + +#language ul li { + width: 80px; + height: 30px; + line-height: 30px; + margin-top: 2px; + background-color: rgba(1, 146, 217, 0.9); + border: 1px solid #f1eee8; +} + +#language ul a:first-child li { + margin-top: 18px; +} + +#language ul li:hover { + background-color: rgba(1, 146, 217, 0.6); +} + +.language-current { + font-weight: bold; +} + +.slider { + display: flex; + flex-direction: column; + position: absolute; + top: 0px; + right: 0px; + width: 500px; + height: 100%; + z-index: 100000; + background: #f1eee8; + background-color: rgba(34, 34, 51, 0.95); + color: #a1a1b3; + overflow-y: auto; + transform: translate3d(490px, 0, 0); + transition: all .8s; +} + +.slider a { + color: #0192d9; + text-decoration: none; +} + +.slider a:hover { + color: #a1a1b3; +} + +.slider-item { + box-sizing: border-box; + flex-shrink: 0; + padding-left: 40px; + padding-right: 40px; +} + +.slider-logo { + padding: 140px 0 20px 0; +} + +.slider-logo img { + display: block; + margin: 0 auto; +} + +.slider-title { + padding-top: 120px; + padding-bottom: 20px; + padding-left: 40px; +} + +.slider-subtitle { + text-align: center; +} + +.slider-translation { + text-align: center; + font-style: italic; + padding: 20px 40px 0 40px; +} + +.slider-list-title { + padding-top: 40px; + padding-bottom: 20px; + padding-left: 20px; + font-weight: bold; +} + +.text-small .slider-list-title { + font-size: 1.25em; +} + +.slider-list-section { + padding-left: 20px; + font-weight: bold; + font-size: 0.9em; +} + +.slider-list-section-toggle { + display: none; +} + +.slider-list-section-toggle + .slider-list-section { + cursor: pointer; + display: block; + font-weight: bold; + margin-top: 10px; +} + +.slider-list-section-toggle + .slider-list-section + div { + display: none; +} + +.slider-list-section-toggle:checked + .slider-list-section + div { + display: block; +} + +.slider-list-section-toggle + .slider-list-section:before { + content: "\002B\2000"; /*plus icon + whitespace*/ + display: block; + float: left; +} + +.slider-list-section-toggle:checked + .slider-list-section:before { + content: "\2212\2000"; /*minus icon + whitespace*/ +} + +.slider-list-entry { + display: flex; + flex-direction: row; + align-items: flex-start; + padding-top: 10px; + padding-left: 20px; +} + +.example-boxes { + display: flex; + flex-direction: row; + width: 100%; +} + +.example-boxes .example-box { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; +} + +.example-boxes .example-box .example-box-image { + border: 1px solid #a1a1b3; + margin: 5px; + padding: 5px; +} + +.example-boxes .example-box .example-box-description { + margin: 10px; +} + +.slider-footer { + padding-top: 40px; + padding-bottom: 40px; + text-align: center; +} + +.slider-footer-title { + font-weight: bold; + padding-bottom: 10px; +} + +.slider-credit-type { + padding-top: 6px; +} + +.slider-onion-link { + padding-top: 6px; + font-size: 1.5em; +} + +/* MOBILE SETTINGS */ +@media only screen and (max-width: 600px) { + .slider, + .slider-item, + .slider-list-entry .fieldofview, + .slider-overlay, + .slider-toggle-bar, + .topbar, + .w-240, + .w-260, + .w-315, + .w-340 { + width: 100%; + } + + .slider-toggle-button { + display: none; + } + + .slider-toggle-bar { + display: inherit; + } + + .slider-overlay { + right: 0; + } + + .slider-toggle-bar { + position: absolute; + bottom: 16px; + z-index: 250000; + cursor: pointer; + background-color: rgba(1, 146, 217, 0.6); + line-height: 40px; + text-align: center; + font-weight: bold; + color: #f1eee8; + } + + .slider-toggle-bar.toggle-false { + display: none; + } + + .slider-toggle-input[type=checkbox]:not(:checked) ~ .slider-overlay { + width: 470px; + right: 20px; + } + + .slider-toggle-input[type=checkbox]:not(:checked) ~ .slider-toggle-bar.toggle-false { + display: inherit; + } + + .slider-toggle-input[type=checkbox]:not(:checked) ~ .slider-toggle-bar.toggle-true { + display: none; + } + + .topbar { + position: inherit; + } + + .slider { + transform: translate3d(500px, 0, 0); + } + + .slider-toggle-input[type=checkbox]:not(:checked) ~ .slider { + right: 0px; + width: 500px; + } + + .slider-item, .slider-translation { + padding-left: 20px; + padding-right: 20px; + } + + .slider-list-entry, + .slider-list-section, + .slider-list-title { + padding-left: 10px; + } + + .example-boxes { + flex-direction: column; + } + + .example-boxes .example-box { + flex-direction: row; + } + + .example-boxes .example-box .example-box-image { + margin-left: 10px; + } + + .slider-footer { + padding-bottom: 80px; + } + + #search-overlay { + width: 100%; + padding-right: 0; + padding-left: 0; + } + + .search-field-row { + padding-right: 40px; + padding-left: 40px; + } + + #search-results-overlay { + width: 100%; + } + + .search-result { + width: 100%; + padding-right: 0; + padding-left: 0; + } + + .search-result div { + padding-right: 20px; + padding-left: 20px; + } +} + +/* Label with number of composite cameras. */ +.composite-cameras-label { + background-color: rgba(1, 146, 217, 0.66); + background-clip: padding-box; + color: #fff; + border: 4px solid rgba(0,0,0,0.25); + border-radius: 4px; + font-weight: bold; + padding: 3px 6px; + box-shadow: none; +} + +.composite-cameras-label.leaflet-tooltip-right::before { + left: -4px; + border-right-color: rgba(0,0,0,0.25); +} + +.composite-cameras-label.leaflet-tooltip-left::before { + right: -4px; + border-left-color: rgba(0,0,0,0.25); +} + +.cover { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + background: #222233; + color: #a1a1b3; +} + +.to-be-translated { + color: #d40055; +} +.to-be-translated a { + color: #ac39ac; + text-decoration: none; +} + +.to-be-translated a:hover { + color: #d40055; +} + +/* overwrite leaflet styles */ + +.leaflet-popup-content-wrapper { + background: rgba(34, 34, 51, 0.95); + color: #a1a1b3; + font-size: 0.9rem; + border-radius: 5px; +} + +.leaflet-popup-content-wrapper a { + color: #0192d9; + text-decoration: none; +} + +.leaflet-popup-content-wrapper a:hover { + color: #a1a1b3; +} + +.leaflet-popup-tip { + background: rgba(34, 34, 51, 0.95); + color: #a1a1b3; +} + +.leaflet-bar a { + background: rgba(34, 34, 51, 0.95); + color: #a1a1b3; +} + +.leaflet-bar a:hover { + background: rgba(34, 34, 51, 0.8); + color: #a1a1b3; +} + +.leaflet-container a.leaflet-popup-close-button { + top: 4px; + right: 4px; +} + diff --git a/www/sunders/de/camera.php b/www/sunders/de/camera.php new file mode 100644 index 0000000..d85146c --- /dev/null +++ b/www/sunders/de/camera.php @@ -0,0 +1,3 @@ + diff --git a/www/sunders/de/images b/www/sunders/de/images new file mode 120000 index 0000000..e4c5bd0 --- /dev/null +++ b/www/sunders/de/images @@ -0,0 +1 @@ +../images/ \ No newline at end of file diff --git a/www/sunders/de/index.php b/www/sunders/de/index.php new file mode 100644 index 0000000..624af27 --- /dev/null +++ b/www/sunders/de/index.php @@ -0,0 +1,6 @@ + diff --git a/www/sunders/de/stats/index.php b/www/sunders/de/stats/index.php new file mode 100644 index 0000000..2ed4131 --- /dev/null +++ b/www/sunders/de/stats/index.php @@ -0,0 +1,6 @@ + diff --git a/www/sunders/decode-json.php b/www/sunders/decode-json.php new file mode 100644 index 0000000..2786de7 --- /dev/null +++ b/www/sunders/decode-json.php @@ -0,0 +1,10 @@ + diff --git a/www/sunders/en/camera.php b/www/sunders/en/camera.php new file mode 100644 index 0000000..d85146c --- /dev/null +++ b/www/sunders/en/camera.php @@ -0,0 +1,3 @@ + diff --git a/www/sunders/en/images b/www/sunders/en/images new file mode 120000 index 0000000..e4c5bd0 --- /dev/null +++ b/www/sunders/en/images @@ -0,0 +1 @@ +../images/ \ No newline at end of file diff --git a/www/sunders/en/index.php b/www/sunders/en/index.php new file mode 100644 index 0000000..1471328 --- /dev/null +++ b/www/sunders/en/index.php @@ -0,0 +1,6 @@ + diff --git a/www/sunders/en/stats/index.php b/www/sunders/en/stats/index.php new file mode 100644 index 0000000..9276942 --- /dev/null +++ b/www/sunders/en/stats/index.php @@ -0,0 +1,6 @@ + diff --git a/www/sunders/es/camera.php b/www/sunders/es/camera.php new file mode 100644 index 0000000..d85146c --- /dev/null +++ b/www/sunders/es/camera.php @@ -0,0 +1,3 @@ + diff --git a/www/sunders/es/images b/www/sunders/es/images new file mode 120000 index 0000000..e4c5bd0 --- /dev/null +++ b/www/sunders/es/images @@ -0,0 +1 @@ +../images/ \ No newline at end of file diff --git a/www/sunders/es/index.php b/www/sunders/es/index.php new file mode 100644 index 0000000..20ea3d6 --- /dev/null +++ b/www/sunders/es/index.php @@ -0,0 +1,6 @@ + diff --git a/www/sunders/es/stats/index.php b/www/sunders/es/stats/index.php new file mode 100644 index 0000000..2ce49c5 --- /dev/null +++ b/www/sunders/es/stats/index.php @@ -0,0 +1,6 @@ + diff --git a/www/sunders/favicon.ico b/www/sunders/favicon.ico new file mode 100644 index 0000000..6a84cc4 Binary files /dev/null and b/www/sunders/favicon.ico differ diff --git a/www/sunders/favicon.png b/www/sunders/favicon.png new file mode 100644 index 0000000..ac0b662 Binary files /dev/null and b/www/sunders/favicon.png differ diff --git a/www/sunders/files/license_Leaflet.txt b/www/sunders/files/license_Leaflet.txt new file mode 100644 index 0000000..0cb916b --- /dev/null +++ b/www/sunders/files/license_Leaflet.txt @@ -0,0 +1,23 @@ +Copyright (c) 2010-2021, Vladimir Agafonkin +Copyright (c) 2010-2011, CloudMade +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are +permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of + conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list + of conditions and the following disclaimer in the documentation and/or other materials + provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/www/sunders/files/license_Semicircle.txt b/www/sunders/files/license_Semicircle.txt new file mode 100644 index 0000000..6afb772 --- /dev/null +++ b/www/sunders/files/license_Semicircle.txt @@ -0,0 +1,20 @@ +Copyright 2013 - 2017, Jieter + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/www/sunders/files/license_osmcamera.txt b/www/sunders/files/license_osmcamera.txt new file mode 100644 index 0000000..419b85c --- /dev/null +++ b/www/sunders/files/license_osmcamera.txt @@ -0,0 +1,9 @@ +* The leafletembed.js file is licensed under CC-by-sa (http://creativecommons.org/licenses/by-sa/2.0/), as it was initially derived from code found in that article : http://switch2osm.org/using-tiles/getting-started-with-leaflet/ + +* The images *fixed*png and speedCamera.png in the www/images directory are also licensed under that CC-by-sa (http://creativecommons.org/licenses/by-sa/2.0/), as they are derived from the OpenStreetMap wiki (http://wiki.openstreetmap.org/wiki/File:Surveillance.png and http://wiki.openstreetmap.org/wiki/File:Fixed_speed_camera.png). + +* The Mobile-detect.php file is developped by Victor Stanciu and Serban Ghita and is licensed under MIT license (http://opensource.org/licenses/mit-license.php). + +* The preset file www/camera_preset_all.xml is derived from the one of JOSM, and is licensed under GPL v3 (http://www.gnu.org/copyleft/gpl.html) + +* Everything else is under the WTFPL (http://en.wikipedia.org/wiki/WTFPL). diff --git a/www/sunders/files/sunders.asc b/www/sunders/files/sunders.asc new file mode 100644 index 0000000..da0b837 --- /dev/null +++ b/www/sunders/files/sunders.asc @@ -0,0 +1,52 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBF5kIygBEADC30garhcvDYy/HZd9Rq3jA2P5uD0CtgCQFV8H2RdWq4IeyxU1 +2HUsNO2w/Hhcea9eoAL3vyNlLwmhqH+DrH1T03vqs6s9zvhN5zeA7M/2iHla02BT +NV3MrG0vSaLZI8MiGvDNOQ4l8RIP8miefutxlg63xcmqKsvFUaH3r+zXp7Xv/nBE +53ICUj9i0vfqdUSSNq7yuc9S+nyzMbuwptCAYbVsuzdC/n8HJ3a/egXUvbWCMuZa +zbWkwjc9JC7b7T3XrhRBT4j3FxMLw5z/bi5fgLgWx/ZUjSKRXmlEHfAqTpRxSDww +358qnaPHP/VYRYtYFSttbIroWPDclWPlaUIpmkOxkbMm5oTXdqyvgt3VFefZFtxa +l/et4/nsq0fV8FvTtTAEWTLCWmc5A5UGiE11qlTeC9ZzYGv+N0eXx9VvS30+Se+z +SAkfUvxTA+dlEHrpizC7MxgBHUldN2NxcHE6T21FCqZgbY8xDHRziftAt6ajNeSP +oKwQX30lBKqHq0u25LdBcpheNkcNG0r05/33/uuZbCE9Bt4wTeuxIESn+gc0Jwk6 +wD/kWox3eEz7rGSAp/LW8bgRoU3JXjEtb/RZ85wbGGMrHDnOuItgfYqy3dgILbYN +xosOHIdYjama6luW7KPb6gIME2T7N5obWF59rVrVetZsfq5F17GQNFp0SwARAQAB +tDpTdXJ2ZWlsbGFuY2UgdW5kZXIgU3VydmVpbGxhbmNlIDxoZWxsb0BzdW5kZXJz +LnViZXIuc3BhY2U+iQJUBBMBCgA+AhsDBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheA +FiEEglIBC/3ZXWzd1HQVOABXT/sARiIFAmbeAQQFCQryrdwACgkQOABXT/sARiL8 +OA/+Ox8b1spu4s57v48zwqSjOzngSD/t0KMmLnomAeqkTLEvnbH8GQVUMpzJoJve +keE56bstpHcwGYlhmoLOhc0jeNLnNFumFD0j6fEfNsUjZOmXeMmA+ZOhCS1TL5O3 +dliGrlxSZX9njwhRQp2eNCZ/PIHN9YExM1J6ERnkczmsIiyXLlN34a5C39oRucmF +gVIqe4LDdBZpTSTdEoF1JBGnBwEOvdbrLe6j7nS9Fz4/M7CLtmqPMR2SnXiymrtb +7XIB5TJDe08NvuroHRbu3prvECX5pl6bLRrj/55Bxyq3BY5FsrdmZAtxYfZqcDQO +spySu7FYwT7Khoqu8SYpt3wS8hPkKejOmHngUkiwUzM4x/V4qbQRqhEoMpAYCCCZ +lnfdXcgXT/AnItAInqQ2tOx0ThNWJbyJVWveU/zNPQCUh0i6RGyGQLQ2hyizgX2p +9rHUqJ/FsqjZIsl2AwLmQsQ2UvhveQKLTGLu1Jemk84KjAkxbf/80929mXgv/Z66 +5m4KMOsGAT4t6j3v70nKLtLfv1NUUmOopdgWSRNyFwRlNBI+e76IzMwvyVmsRVox +rbu8eAWq1xZUGlzTVh6YoJZz+FCSH9NO4Nx9qrHnBlStot4tXqhoDYIBDAFDty1p +hEgZLLI9PCFavCd+TCOCofBe4KzIIGVY1yFygBbuYvk1grK5Ag0EXmQjKAEQAMG8 +i6Bq2fpbwqByysGCiSqt/BxofpgPC+Ctdte3524w6KognVfPYABvU/U2BvtMhJ8Z +2ZQW0A42UCPS5ornmzFdNG5y5VxjshrkvI2kZK/bwc+8kG3XY8ocBGMbC2sUrvVR +ff2w9KhAUPHFI0vsotvsmzoE5C1gjllB98gA83lWoHvEsETZ44SsGv9ozFVuNx1T +KIdmCcU9xWMxCoEA6PFtQJquH+AzUG+3j8gA/zTPkwKa9i4GnanJYgff0iXu05pe ++SOb7vvaLMzJ0bl3/2Rghl0aoVJIO9uDF0vq18ugD0YGRRlqn4Ye0DW2N08WzB8s +JEGKvdDArYkhj/S7RMBTJyHrQ8fhmB/oGNjiUMghc7Cg18XaIfNrYln/8+JRhPuQ +w8p9C3CjN8JsmiUz07ZHOf0zPHTa9UgpNO+Nl7he/X9g9oR9eiLiAdKK7Se0W9Kk +Q6yfIIgO/dWNO4g6ye256YC/1a0sxtLis3k9mWKxPOBCh7y1DKcoh1Fn0LGhc0wG +pXddrE9pTvSguV/PnyxcEmqOBk4Z2PVOlRuD9GBYWkfjAL+qPJ3AZvbC+JzgqQ5y +prqeECFw/ndsz2maEM+1XlpOSY9/gbeTEJDfz7khza8pljhkX/1XzLRRc9u546hE +C+P6lDpHQWp2vkeZv6a4qKWqIDMFwWMAIgK5Z9TRABEBAAGJAjwEGAEKACYCGwwW +IQSCUgEL/dldbN3UdBU4AFdP+wBGIgUCZt4ByQUJCvKuoQAKCRA4AFdP+wBGIgXp +D/4gnMLj0vMToXgXPy9P+K7Z8kic8hayAOTturDhK+8mISCF8GMIHyHFuKJJShBv +oQd9Y+jniTBpmq0rUggLKXABMUkSWRnvMfKG2E1Hk4PRgjby4kFrvhSNg7JMpJHF +iemR5iAXYsZMxYg15P2Oi7Yo4Ggrw02tXsGGk6qoZIV+1pWNFmSP4/ymsA7edcAW +BlKMk6I2JHBVi4ek2tj4pKWoWzgGRHzP4OS1RfIXgOBMllKJxEl8l1hQXOMgEiCx +uLtmzQyKlJgEWII5oQOxmezVW44PP2sioXxHHNXrfH5No1JXF0gZwMemDfP15Yej +qraFNSp6v8UTCzbLzJcyoEnV6WGC7So6AV0X8KnHR+Ee/uL5K7HMpyXIE2NmQp3G +nRv3T3xZOEmF+H6oj3babDsBfuZ3xUqj+BgDRMYFA3XfNrsAh7ZE5GM4ecoQf0Hg +mFhkgvQ1FGkUTdPd2StJbV1WmyhoawDDD/j8OcZPy+ShhsGK7H+vaPzfrALUNtZT +ur5IpuLR46eGUCWVH2DC1IKDKBa/SgSH3motn1yvRGbKR4G84Ii/+MT2gmNcjWso +Ve+m58QiydeAt1UpBIRGNTn3QYSx/ybqIW+RH68JVA2k93iFwJi2m6Ob7qnlqKIG +O4rU36FBY0jnhhEq+aJ4/7pj4jjsiicTUMxLYjd1tczUfg== +=qsyN +-----END PGP PUBLIC KEY BLOCK----- diff --git a/www/sunders/fr/camera.php b/www/sunders/fr/camera.php new file mode 100644 index 0000000..d85146c --- /dev/null +++ b/www/sunders/fr/camera.php @@ -0,0 +1,3 @@ + diff --git a/www/sunders/fr/images b/www/sunders/fr/images new file mode 120000 index 0000000..e4c5bd0 --- /dev/null +++ b/www/sunders/fr/images @@ -0,0 +1 @@ +../images/ \ No newline at end of file diff --git a/www/sunders/fr/index.php b/www/sunders/fr/index.php new file mode 100644 index 0000000..2946f9f --- /dev/null +++ b/www/sunders/fr/index.php @@ -0,0 +1,6 @@ + diff --git a/www/sunders/fr/stats/index.php b/www/sunders/fr/stats/index.php new file mode 100644 index 0000000..a4028c4 --- /dev/null +++ b/www/sunders/fr/stats/index.php @@ -0,0 +1,6 @@ + diff --git a/www/sunders/i18n.php b/www/sunders/i18n.php new file mode 100644 index 0000000..9091e79 --- /dev/null +++ b/www/sunders/i18n.php @@ -0,0 +1,80 @@ +{'texts'}->{$key}; + + if (empty($text)) { + $i18n = $i18nDefault; + $text = $i18n->{'texts'}->{$key}; + + if (!empty($text) && substr($key, -4) != '-alt') { + $openTagToBeTranslated = ''; + $closeTagToBeTranslated = ''; + } + } + + $textLinkArray = explode ('@@' , $text); // A @@ at the beginning/end of $text leads to an empty string as the first/last element of $textLinkArray. + $isTextWithoutLinks = count($textLinkArray) == 1; + $translatedText = ''; + + if ($isTextWithoutLinks) { + $translatedText = $translatedText.htmlentities($text); + } else { + foreach ($textLinkArray as $phrase) { + if (substr($phrase, 0, 2) == 'LT') { // link with a text to be translated + $index = (int)substr($phrase, 2, 2); + $translatedText = $translatedText.''.htmlentities($i18n->{'links'}->{$key}[$index]).''.htmlentities(substr($phrase, 4)); + } elseif (substr($phrase, 0, 2) == 'LF') { // link with a fix text + $index = (int)substr($phrase, 2, 2); + $translatedText = $translatedText.''.htmlentities($linksWithFixedText[1][$index]).''.htmlentities(substr($phrase, 4)); + } elseif (substr($phrase, 0, 2) == 'TF') { // fix text + $index = (int)substr($phrase, 2, 2); + $translatedText = $translatedText.htmlentities($fixedTexts[$index].substr($phrase, 4)); + } else { + $translatedText = $translatedText.htmlentities($phrase); + } + } + } + + return $openTagToBeTranslated.$translatedText.$closeTagToBeTranslated; + } +?> diff --git a/www/sunders/i18n/common/de.json b/www/sunders/i18n/common/de.json new file mode 100644 index 0000000..7642776 --- /dev/null +++ b/www/sunders/i18n/common/de.json @@ -0,0 +1,33 @@ +{ + "texts": { + "what-alt": "um was es hier geht", + "how-alt": "wie du mitmachen kannst", + "where-alt": "wo es mehr infos gibt", + "search-button-alt": "in OpenStreetMap suchen", + "permalink-button-alt": "Permalink mit Koordinaten erzeugen", + "stats-button-alt": "Upload-Statistiken", + "language-button-alt": "Sprache ändern", + "subtitle": "(Überwachung unter Überwachung)", + "translation": "", + "what-show": "Surveillance under Surveillance (Überwachung unter Überwachung) zeigt dir Kameras und Wachleute, die dich überwachen — fast überall. Du kannst ihren Standort sehen und, falls die Informationen verfügbar sind, welcher Art sie sind, welches Gebiet sie überwachen oder weitere interessante Fakten.", + "what-icons": "Unterschiedliche Symbole und Farben geben dir einen schnellen Überblick über die erfassten Überwachungseinträge. Klicke auf ein Symbol auf der Karte, um die verfügbaren Informationen zum zugehörigen Eintrag anzuzeigen.", + "how-osm": "Surveillance under Surveillance (Überwachung unter Überwachung) verwendet und zeigt Daten von OpenStreetMap-Mitwirkenden, die auf der regulären @@LF00-Seite nicht angezeigt werden. @@LT00 oder @@LT01, wenn du selbst neue Kameras oder Wachleute eintragen oder bestehende Einträge überarbeiten möchtest.", + "how-update": "Unsere Datenbank wird stündlich aktualisiert. Deshalb kann es einige Zeit dauern bis deine OSM-Einträge auf der Surveillance under Surveillance Karte angezeigt werden.", + "how-keyval": "Dies sind die gebräuchlichsten Schlüssel/Wert-Kombinationen, um einen Überwachungseintrag bei OpenStreetMap zu beschreiben:", + "how-fork": "Neben der Mitarbeit bei OpenStreetMap, kannst du dieses Projekt auch bei @@LF00 forken.", + "where-sites": "Besuch die folgenden Seiten zu überwachungsrelevanten Themen:", + "footer-pgp": "Hier ist unser @@LT00 — benutz ihn!", + "footer-note": "Bitte beachte, dass nur verschlüsselte Emails beantwortet werden.", + "footer-your-key": "Teil uns mit, wo wir deinen PGP-Schlüssel finden.", + "footer-help": "Hilfe zum Thema Verschlüsselung gibt es @@LT00.", + "at": "ät", + "dot": "punkt", + "new-stats": "neue Statistiken!", + "gdpr": "BEIM BESUCH DIESER SEITE WERDEN KEINE PERSÖNLICHEN DATEN GESAMMELT!" + }, + "links": { + "how-osm": [ "Verwende dein existierendes OSM-Konto", "lege ein neues Konto an" ], + "footer-pgp": [ "PGP-Schlüssel" ], + "footer-help": [ "hier" ] + } +} diff --git a/www/sunders/i18n/common/en.json b/www/sunders/i18n/common/en.json new file mode 100644 index 0000000..77116f5 --- /dev/null +++ b/www/sunders/i18n/common/en.json @@ -0,0 +1,32 @@ +{ + "texts": { + "what-alt": "what this is about", + "how-alt": "how to participate", + "where-alt": "where to get more info", + "search-button-alt": "search OpenStreetMap", + "permalink-button-alt": "create permalink with coordinates", + "stats-button-alt": "upload statistics", + "language-button-alt": "change language", + "subtitle": "", + "translation": "", + "what-show": "Surveillance under Surveillance shows you cameras and guards — watching you — almost everywhere. You can see where they are located and, if the information is available, what type they are, the area they observe, or other interesting facts.", + "what-icons": "Different icons and colors give you a quick overview about the indexed surveillance entries. Click on those icons on the map to get the available information.", + "how-osm": "Surveillance under Surveillance uses data from OpenStreetMap contributors that is not visualized on the regular @@LF00 site. If you like to add new cameras or guards or if you like to revise existing entries @@LT00 or @@LT01.", + "how-update": "Our database is updated once an hour. So it might take a while until your OSM entries are visible on the Surveillance under Surveillance map.", + "how-keyval": "These are the most common key/value combinations to describe a surveillance node at OpenStreetMap:", + "how-fork": "Besides contributing to OpenStreetMap feel free to fork this project on @@LF00.", + "where-sites": "Visit the following sites about surveillance related topics:", + "footer-pgp": "Here is our @@LT00 — use it!", + "footer-note": "Please note that only encrypted emails will be answered.", + "footer-your-key": "Let us know where we can find your PGP key.", + "footer-help": "Get help for @@LF00 / @@LF01 / @@LF02.", + "at": "at", + "dot": "dot", + "new-stats": "new statistics!", + "gdpr": "NO PERSONAL DATA IS COLLECTED WHEN YOU VISIT THIS SITE!" + }, + "links": { + "how-osm": [ "use your existing OSM account", "create a new one" ], + "footer-pgp": [ "PGP key" ] + } +} diff --git a/www/sunders/i18n/common/es.json b/www/sunders/i18n/common/es.json new file mode 100644 index 0000000..9eb30f2 --- /dev/null +++ b/www/sunders/i18n/common/es.json @@ -0,0 +1,32 @@ +{ + "texts": { + "what-alt": "de que se trata", + "how-alt": "como participar", + "where-alt": "donde puedo obtener mas información", + "search-button-alt": "buscar en OpenStreetMap", + "permalink-button-alt": "crearte un enlace permanente", + "stats-button-alt": "estadística de subir", + "language-button-alt": "cambiar de idioma", + "subtitle": "(Vigilando a la Vigilancia)", + "translation": "", + "what-show": "Surveillance under Surveillance (vigilando a la vigilancia) muestra las cámaras y los guardas — que te vigilan — en casi todos lados. Podes ver su ubicación y, si la información esta disponible, de que tipo son, el área de cobertura u otra información relevante.", + "what-icons": "Diferentes iconos y colores dan una idea sobre las entradas cargadas. Hace clic sobre esos iconos en el mapa para ver la información disponible.", + "how-osm": "Surveillance under Surveillance (vigilando a la vigilancia) usa datos de OpenStreetMap, éstos no están visibles por defecto en el mapa regular del sitio de @@LF00. Si querés agregar nuevas cámaras o guardias, o si deseas revisar las entradas existentes podes @@LT01 en OSM o @@LT00.", + "how-update": "Nuestra base de datos se actualiza cada una hora. Así que puede tomar un rato hasta que los cambios en OSM se vean reflejados en este mapa.", + "how-keyval": "Estos son las propiedades mas comunes para describir un nodo de vigilancia en OpenStreetMap:", + "how-fork": "Aparte de contribuir a Openstreetmap te invitamos a modificar este proyecto en @@LF00.", + "where-sites": "Podés visitar estos sitios que tratan sobre temas relacionas a la vigilancia:", + "footer-pgp": "Esta es nuestra @@LT00 — Usala!", + "footer-note": "Tené en cuenta que solo los correos cifrados serán respondidos.", + "footer-your-key": "Envianos o decinos donde podemos conseguir tu llave.", + "footer-help": "Si necesitas ayuda con PGP, @@LF00 / @@LF01 / @@LF02.", + "at": "en", + "dot": "punto", + "new-stats": "¡nuevo!", + "gdpr": "¡NO SE RECOGEN DATOS PERSONALES CUANDO USTED VISITA ESTE SITIO!" + }, + "links": { + "how-osm": [ "usar una que ya tengas", "crearte una cuenta" ], + "footer-pgp": [ "llave PGP" ] + } +} diff --git a/www/sunders/i18n/common/fr.json b/www/sunders/i18n/common/fr.json new file mode 100644 index 0000000..02a1635 --- /dev/null +++ b/www/sunders/i18n/common/fr.json @@ -0,0 +1,32 @@ +{ + "texts": { + "what-alt": "utilisation", + "how-alt": "comment participer", + "where-alt": "où s'informer", + "search-button-alt": "chercher sur OpenStreetMap", + "permalink-button-alt": "créer un lien permanent à ces coordonnées", + "stats-button-alt": "statistiques sur les données", + "language-button-alt": "changer langue", + "subtitle": "(Surveillance sous Surveillance)", + "translation": "", + "what-show": "Surveillance under Surveillance vous montre les caméras et gardes — qui vous regardent — presque partout. Vous pouvez voir leurs emplacements et, si l'information est connue, de quels types elles sont, la zone surveillée, ou autres faits intéressants.", + "what-icons": "Différentes icônes et couleurs vous donnent un aperçu des surveillances indexées. Cliquez sur ces icônes sur la carte pour avoir toutes les informations possibles.", + "how-osm": "Surveillance under Surveillance utilise les données des contributeurs OpenStreetMap qui ne sont pas visibles sur le site @@LF00. Si vous souhaitez ajouter de nouvelles caméras/gardes ou si vous voulez modifier les données existantes, @@LT00 ou @@LT01.", + "how-update": "Notre base de donnée est mise à jour toutes les heures. Il se peut donc qu'il faille un certain temps avant que vos modifications sur OSM soient visible sur la carte Surveillance under Surveillance.", + "how-keyval": "Voici les étiquettes clé/valeur les plus courantes dans OpenStreetMap pour qualifier les noeuds de type “surveillance”:", + "how-fork": "En plus de contribuer à OpenStreetMap, n'hésitez pas à forker ce projet sur @@LF00.", + "where-sites": "Visitez les sites suivants qui traitent de sujets liés à la surveillance :", + "footer-pgp": "Voici notre @@LT00 — utilisez-là !", + "footer-note": "Notez que seuls les mails chiffrés recevront une réponse.", + "footer-your-key": "Dites-nous où nous pouvons trouver votre clef PGP.", + "footer-help": "Trouvez de l'aide pour @@LF00 / @@LF01 / @@LF02.", + "at": "at", + "dot": "point", + "new-stats": "nouveau!", + "gdpr": "AUCUNE DONNÉE PERSONNELLE N'EST COLLECTÉE LORS DE VOTRE VISITE SUR CE SITE!" + }, + "links": { + "how-osm": [ "utilisez votre compte OSM", "créez-en un" ], + "footer-pgp": [ "clef PGP" ] + } +} diff --git a/www/sunders/i18n/common/it.json b/www/sunders/i18n/common/it.json new file mode 100644 index 0000000..99430d2 --- /dev/null +++ b/www/sunders/i18n/common/it.json @@ -0,0 +1,32 @@ +{ + "texts": { + "what-alt": "di che cosa si tratta", + "how-alt": "come partecipare", + "where-alt": "dove trovo altre info", + "search-button-alt": "cerca su OpenStreetMap", + "permalink-button-alt": "crea permalink con le coordinate", + "stats-button-alt": "statistiche dell'upload ", + "language-button-alt": "cambia lingua", + "subtitle": "(Sorveglianza sotto Sorveglianza)", + "translation": "", + "what-show": "Surveillance under Surveillance (Sorveglianza sotto Sorveglianza) è un sito che ti mostra telecamere e guardie — che ti osservano — quasi ovunque. Puoi vedere dove si trovano e, se l'informazione è disponibile, di che tipologia,l'area che osservano o altri fatti interessanti.", + "what-icons": "Icone e colori diversi ti danno una rapida panoramica sui differenti tipi di sorveglianza. Clicca su queste icone sulla mappa per ottenere le informazioni disponibili.", + "how-osm": "Surveillance under Surveillance utilizza i dati di OpenStreetMap che non sono visualizzati sul normale @@LF00 sito. Se vuoi aggiungere altre telecamere o guardie o se vuoi rivedere le voci esistenti usa il tuo account entries @@LT00 o creane uno nuovo @@LT01.", + "how-update": "Il nostro database viene aggiornato una volta ogni ora. Quindi potrebbe essere necessario un po' di tempo prima che le tue segnalazioni OSM siano visibili sulla mappa di Surveillance under Surveillance.", + "how-keyval": "These are the most common key/value combinations to describe a surveillance node at OpenStreetMap:", + "how-fork": "Oltre a contribuire a OpenStreetMap sentiti libero di fare un fork di questo progetto su @@LF00.", + "where-sites": "Visita i seguenti siti su argomenti relativi alla sorveglianz:", + "footer-pgp": "Qui la nostra @@LT00 — usala!", + "footer-note": "Si risponde solo a email crittate.", + "footer-your-key": "Facci sapere dove possiamo trovare la tua chiave PGP.", + "footer-help": "Ottieni aiuto per @@LF00 / @@LF01 / @@LF02.", + "at": "at", + "dot": "dot", + "new-stats": "new statistics!", + "gdpr": "NESSUN DATO PERSONALE VIENE RACCOLTO QUANDO VISITI QUESTO SITO!" + }, + "links": { + "how-osm": [ "usa il tuo account OSM", "creane uno nuovo" ], + "footer-pgp": [ "PGP key" ] + } +} diff --git a/www/sunders/i18n/common/ru.json b/www/sunders/i18n/common/ru.json new file mode 100644 index 0000000..9d89390 --- /dev/null +++ b/www/sunders/i18n/common/ru.json @@ -0,0 +1,32 @@ +{ + "texts": { + "what-alt": "", + "how-alt": "", + "where-alt": "", + "search-button-alt": "", + "permalink-button-alt": "", + "stats-button-alt": "", + "language-button-alt": "", + "subtitle": "", + "translation": "This site has not been translated yet. You can help to offer this site in RUSSIAN by sending us your translation via email. Please scroll down for our address. Thanks a lot!", + "what-show": "", + "what-icons": "", + "how-osm": "", + "how-update": "", + "how-keyval": "", + "how-fork": "", + "where-sites": "", + "footer-pgp": "", + "footer-note": "", + "footer-your-key": "", + "footer-help": "", + "at": "", + "dot": "", + "new-stats": "новые!", + "gdpr": "" + }, + "links": { + "how-osm": [ "" ], + "footer-pgp": [ "" ] + } +} diff --git a/www/sunders/i18n/countries/de.json b/www/sunders/i18n/countries/de.json new file mode 100644 index 0000000..b8e8ea5 --- /dev/null +++ b/www/sunders/i18n/countries/de.json @@ -0,0 +1,708 @@ +{ + "texts": { + "xxx": "noch nicht lokalisiert", + "--": "nicht lokalisierbar", + + "AA": "", + "AB": "", + "AC": "Ascension", + "AD": "Andorra", + "AE": "Vereinigte Arabische Emirate", + "AF": "Afghanistan", + "AG": "Antigua und Barbuda", + "AH": "", + "AI": "Anguilla", + "AJ": "", + "AK": "", + "AL": "Albanien", + "AM": "Armenien", + "AN": "Niederländische Antillen", + "AO": "Angola", + "AP": "", + "AQ": "Antarktika", + "AR": "Argentinien", + "AS": "Amerikanisch-Samoa", + "AT": "Österreich", + "AU": "Australien", + "AV": "", + "AW": "Aruba", + "AX": "Åland", + "AY": "", + "AZ": "Aserbaidschan", + + "BA": "Bosnien und Herzegowina", + "BB": "Barbados", + "BC": "", + "BD": "Bangladesch", + "BE": "Belgien", + "BF": "Burkina Faso", + "BG": "Bulgarien", + "BH": "Bahrain", + "BI": "Burundi", + "BJ": "Benin", + "BK": "", + "BL": "Saint-Barthélemy", + "BM": "Bermuda", + "BN": "Brunei", + "BO": "Bolivien", + "BP": "", + "BQ": "Karibische Niederlande", + "BR": "Brasilien", + "BS": "Bahamas", + "BT": "Bhutan", + "BU": "Birma (Myanmar)", + "BV": "Bouvetinsel", + "BW": "Botswana", + "BX": "", + "BY": "Weißrussland", + "BZ": "Belize", + + "CA": "Kanada", + "CB": "", + "CC": "Kokosinseln", + "CD": "Demokratische Republik Kongo", + "CE": "", + "CF": "Zentralafrikanische Republik", + "CG": "Republik Kongo", + "CH": "Schweiz", + "CI": "Elfenbeinküste", + "CJ": "", + "CK": "Cookinseln", + "CL": "Chile", + "CM": "Kamerun", + "CN": "Volksrepublik China", + "CO": "Kolumbien", + "CP": "Clipperton-Insel", + "CQ": "", + "CR": "Costa Rica", + "CS": "Tschechoslowakei (Serbien und Montenegro)", + "CT": "", + "CU": "Kuba", + "CV": "Kap Verde", + "CW": "Curaçao", + "CX": "Weihnachtsinsel", + "CY": "Zypern", + "CZ": "Tschechische Republik", + + "DA": "", + "DB": "", + "DC": "", + "DD": "", + "DE": "Deutschland", + "DF": "", + "DG": "Diego Garcia", + "DH": "", + "DI": "", + "DJ": "Dschibuti", + "DK": "Dänemark", + "DL": "", + "DM": "Dominica", + "DN": "", + "DO": "Dominikanische Republik", + "DP": "", + "DQ": "", + "DR": "", + "DS": "", + "DT": "", + "DU": "", + "DV": "", + "DW": "", + "DX": "", + "DY": "Benin", + "DZ": "Algerien", + + "EA": "Melilla", + "EB": "", + "EC": "Ecuador", + "ED": "", + "EE": "Estland", + "EF": "", + "EG": "Ägypten", + "EH": "Westsahara", + "EI": "", + "EJ": "", + "EK": "", + "EL": "", + "EM": "", + "EN": "", + "EO": "", + "EP": "", + "EQ": "", + "ER": "Eritrea", + "ES": "Spanien", + "ET": "Äthiopien", + "EU": "", + "EV": "", + "EW": "Estland", + "EX": "", + "EY": "", + "EZ": "", + + "FA": "", + "FB": "", + "FC": "", + "FD": "", + "FE": "", + "FF": "", + "FG": "", + "FH": "", + "FI": "Finnland", + "FJ": "Fidschi", + "FK": "Falklandinseln", + "FL": "Liechtenstein", + "FM": "Föderierte Staaten von Mikronesien", + "FN": "", + "FO": "Färöer", + "FP": "", + "FQ": "", + "FR": "Frankreich", + "FS": "", + "FT": "", + "FU": "", + "FV": "", + "FW": "", + "FX": "", + "FY": "", + "FZ": "", + + "GA": "Gabun", + "GB": "Vereinigtes Königreich", + "GC": "", + "GD": "Grenada", + "GE": "Georgien", + "GF": "Französisch-Guayana", + "GG": "Guernsey", + "GH": "Ghana", + "GI": "Gibraltar", + "GJ": "", + "GK": "", + "GL": "Grönland", + "GM": "Gambia", + "GN": "Guinea", + "GO": "", + "GP": "Guadeloupe", + "GQ": "Äquatorialguinea", + "GR": "Griechenland", + "GS": "Südgeorgien und die Südlichen Sandwichinseln", + "GT": "Guatemala", + "GU": "Guam", + "GV": "", + "GW": "Guinea-Bissau", + "GX": "", + "GY": "Guyana", + "GZ": "", + + "HA": "", + "HB": "", + "HC": "", + "HD": "", + "HE": "", + "HF": "", + "HG": "", + "HH": "", + "HI": "", + "HJ": "", + "HK": "Hongkong", + "HL": "", + "HM": "Heard und McDonaldinseln", + "HN": "Honduras", + "HO": "", + "HP": "", + "HQ": "", + "HR": "Kroatien", + "HS": "", + "HT": "Haiti", + "HU": "Ungarn", + "HV": "", + "HW": "", + "HX": "", + "HY": "", + "HZ": "", + + "IA": "", + "IB": "", + "IC": "Kanarische Inseln", + "ID": "Indonesien", + "IE": "Irland", + "IF": "", + "IG": "", + "IH": "", + "II": "", + "IJ": "", + "IK": "", + "IL": "Israel", + "IM": "Isle of Man", + "IN": "Indien", + "IO": "Britisches Territorium im Indischen Ozean", + "IP": "", + "IQ": "Irak", + "IR": "Iran", + "IS": "Island", + "IT": "Italien", + "IU": "", + "IV": "", + "IW": "", + "IX": "", + "IY": "", + "IZ": "", + + "JA": "Jamaika", + "JB": "", + "JC": "", + "JD": "", + "JE": "Jersey", + "JF": "", + "JG": "", + "JH": "", + "JI": "", + "JJ": "", + "JK": "", + "JL": "", + "JM": "Jamaika", + "JN": "", + "JO": "Jordanien", + "JP": "Japan", + "JQ": "", + "JR": "", + "JS": "", + "JT": "", + "JU": "", + "JV": "", + "JW": "", + "JX": "", + "JY": "", + "JZ": "", + + "KA": "", + "KB": "", + "KC": "", + "KD": "", + "KE": "Kenia", + "KF": "", + "KG": "Kirgisistan", + "KH": "Kambodscha", + "KI": "Kiribati", + "KJ": "", + "KK": "", + "KL": "", + "KM": "Komoren", + "KN": "St. Kitts und Nevis", + "KO": "", + "KP": "Nordkorea", + "KQ": "", + "KR": "Südkorea", + "KS": "", + "KT": "", + "KU": "", + "KV": "", + "KW": "Kuwait", + "KX": "", + "KY": "Kaimaninseln", + "KZ": "Kasachstan", + + "LA": "Laos", + "LB": "Libanon", + "LC": "St. Lucia", + "LD": "", + "LE": "", + "LF": "", + "LG": "", + "LH": "", + "LI": "Liechtenstein", + "LJ": "", + "LK": "Sri Lanka", + "LL": "", + "LM": "", + "LN": "", + "LO": "", + "LP": "", + "LQ": "", + "LR": "Liberia", + "LS": "Lesotho", + "LT": "Litauen", + "LU": "Luxemburg", + "LV": "Lettland", + "LW": "", + "LX": "", + "LY": "Libyen", + "LZ": "", + + "MA": "Marokko", + "MB": "", + "MC": "Monaco", + "MD": "Moldawien", + "ME": "Montenegro", + "MF": "Saint-Martin", + "MG": "Madagaskar", + "MH": "Marshallinseln", + "MI": "", + "MJ": "", + "MK": "Mazedonien", + "ML": "Mali", + "MM": "Myanmar", + "MN": "Mongolei", + "MO": "Macau", + "MP": "Nördliche Marianen", + "MQ": "Martinique", + "MR": "Mauretanien", + "MS": "Montserrat", + "MT": "Malta", + "MU": "Mauritius", + "MV": "Malediven", + "MW": "Malawi", + "MX": "Mexiko", + "MY": "Malaysia", + "MZ": "Mosambik", + + "NA": "Namibia", + "NB": "", + "NC": "Neukaledonien", + "ND": "", + "NE": "Niger", + "NF": "Norfolkinsel", + "NG": "Nigeria", + "NH": "", + "NI": "Nicaragua", + "NJ": "", + "NK": "", + "NL": "Niederlande", + "NM": "", + "NN": "", + "NO": "Norwegen", + "NP": "Nepal", + "NQ": "", + "NR": "Nauru", + "NS": "", + "NT": "", + "NU": "Niue", + "NV": "", + "NW": "", + "NX": "", + "NY": "", + "NZ": "Neuseeland", + + "OA": "", + "OB": "", + "OC": "", + "OD": "", + "OE": "", + "OF": "", + "OG": "", + "OH": "", + "OI": "", + "OJ": "", + "OK": "", + "OL": "", + "OM": "Oman", + "ON": "", + "OO": "", + "OP": "", + "OQ": "", + "OR": "", + "OS": "", + "OT": "", + "OU": "", + "OV": "", + "OW": "", + "OX": "", + "OY": "", + "OZ": "", + + "PA": "Panama", + "PB": "", + "PC": "", + "PD": "", + "PE": "Peru", + "PF": "Französisch-Polynesien", + "PG": "Papua-Neuguinea", + "PH": "Philippinen", + "PI": "Philippinen", + "PJ": "", + "PK": "Pakistan", + "PL": "Polen", + "PM": "Saint-Pierre und Miquelon", + "PN": "Pitcairninseln", + "PO": "", + "PP": "", + "PQ": "", + "PR": "Puerto Rico", + "PS": "Staat Palästina", + "PT": "Portugal", + "PU": "", + "PV": "", + "PW": "Palau", + "PX": "", + "PY": "Paraguay", + "PZ": "", + + "QA": "Katar", + "QB": "", + "QC": "", + "QD": "", + "QE": "", + "QF": "", + "QG": "", + "QH": "", + "QI": "", + "QJ": "", + "QK": "", + "QL": "", + "QM": "", + "QN": "", + "QO": "", + "QP": "", + "QQ": "", + "QR": "", + "QS": "", + "QT": "", + "QU": "", + "QV": "", + "QW": "", + "QX": "", + "QY": "", + "QZ": "", + + "RA": "Argentinien", + "RB": "Bolivia; Botswana", + "RC": "Taiwan (Republik China)", + "RD": "", + "RE": "Réunion", + "RF": "", + "RG": "", + "RH": "Haiti", + "RI": "Indonesien", + "RJ": "", + "RK": "", + "RL": "Libanon", + "RM": "Madagaskar", + "RN": "Niger", + "RO": "Rumänien", + "RP": "Philippinen", + "RQ": "", + "RR": "", + "RS": "Serbien", + "RT": "", + "RU": "Russland", + "RV": "", + "RW": "Ruanda", + "RX": "", + "RY": "", + "RZ": "", + + "SA": "Saudi-Arabien", + "SB": "Salomonen", + "SC": "Seychellen", + "SD": "Sudan", + "SE": "Schweden", + "SF": "Finnland", + "SG": "Singapur", + "SH": "St. Helena, Ascension und Tristan da Cunha", + "SI": "Slowenien", + "SJ": "Spitzbergen und Jan Mayen", + "SK": "Slowakei", + "SL": "Sierra Leone", + "SM": "San Marino", + "SN": "Senegal", + "SO": "Somalia", + "SP": "", + "SQ": "", + "SR": "Surinam", + "SS": "Südsudan", + "ST": "São Tomé und Príncipe", + "SU": "Union der Sozialistischen Sowjetrepubliken (UdSSR)", + "SV": "El Salvador", + "SW": "", + "SX": "Sint Maarten", + "SY": "Syrien", + "SZ": "Swasiland", + + "TA": "Tristan da Cunha", + "TB": "", + "TC": "Turks- und Caicosinseln", + "TD": "Tschad", + "TE": "", + "TF": "Französische Süd- und Antarktisgebiete", + "TG": "Togo", + "TH": "Thailand", + "TI": "", + "TJ": "Tadschikistan", + "TK": "Tokelau", + "TL": "Osttimor", + "TM": "Turkmenistan", + "TN": "Tunesien", + "TO": "Tonga", + "TP": "Osttimor", + "TQ": "", + "TR": "Türkei", + "TS": "", + "TT": "Trinidad und Tobago", + "TU": "", + "TV": "Tuvalu", + "TW": "Taiwan (Republik China)", + "TX": "", + "TY": "", + "TZ": "Tansania", + + "UA": "Ukraine", + "UB": "", + "UC": "", + "UD": "", + "UE": "", + "UF": "", + "UG": "Uganda", + "UH": "", + "UI": "", + "UJ": "", + "UK": "Vereinigtes Königreich", + "UL": "", + "UM": "Kleinere Inselbesitzungen der Vereinigten Staaten", + "UN": "", + "UO": "", + "UP": "", + "UQ": "", + "UR": "", + "US": "Vereinigte Staaten von Amerika (USA)", + "UT": "", + "UU": "", + "UV": "", + "UW": "", + "UX": "", + "UY": "Uruguay", + "UZ": "Usbekistan", + + "VA": "Vatikanstadt", + "VB": "", + "VC": "St. Vincent und die Grenadinen", + "VD": "", + "VE": "Venezuela", + "VF": "", + "VG": "Britische Jungferninseln", + "VH": "", + "VI": "Amerikanische Jungferninseln", + "VJ": "", + "VK": "", + "VL": "", + "VM": "", + "VN": "Vietnam", + "VO": "", + "VP": "", + "VQ": "", + "VR": "", + "VS": "", + "VT": "", + "VU": "Vanuatu", + "VV": "", + "VW": "", + "VX": "", + "VY": "", + "VZ": "", + + "WA": "", + "WB": "", + "WC": "", + "WD": "", + "WE": "", + "WF": "Wallis und Futuna", + "WG": "Grenada", + "WH": "", + "WI": "", + "WJ": "", + "WK": "", + "WL": "St. Lucia", + "WM": "", + "WN": "", + "WO": "", + "WP": "", + "WQ": "", + "WR": "", + "WS": "Samoa", + "WT": "", + "WU": "", + "WV": "St. Vincent und die Grenadinen", + "WW": "", + "WX": "", + "WY": "", + "WZ": "", + + "XA": "", + "XB": "", + "XC": "", + "XD": "", + "XE": "", + "XF": "", + "XG": "", + "XH": "", + "XI": "", + "XJ": "", + "XK": "Kosovo", + "XL": "", + "XM": "", + "XN": "", + "XO": "", + "XP": "", + "XQ": "", + "XR": "", + "XS": "", + "XT": "", + "XU": "", + "XV": "", + "XW": "", + "XX": "", + "XY": "", + "XZ": "", + + "YA": "", + "YB": "", + "YC": "", + "YD": "", + "YE": "Jemen", + "YF": "", + "YG": "", + "YH": "", + "YI": "", + "YJ": "", + "YK": "", + "YL": "", + "YM": "", + "YN": "", + "YO": "", + "YP": "", + "YQ": "", + "YR": "", + "YS": "", + "YT": "Mayotte", + "YU": "Jugoslawien", + "YV": "Venezuela", + "YW": "", + "YX": "", + "YY": "", + "YZ": "", + + "ZA": "Südafrika", + "ZB": "", + "ZC": "", + "ZD": "", + "ZE": "", + "ZF": "", + "ZG": "", + "ZH": "", + "ZI": "", + "ZJ": "", + "ZK": "", + "ZL": "", + "ZM": "Sambia", + "ZN": "", + "ZO": "", + "ZP": "", + "ZQ": "", + "ZR": "Zaire", + "ZS": "", + "ZT": "", + "ZU": "", + "ZV": "", + "ZW": "Simbabwe", + "ZX": "", + "ZY": "", + "ZZ": "" + } +} diff --git a/www/sunders/i18n/countries/en.json b/www/sunders/i18n/countries/en.json new file mode 100644 index 0000000..5c8e0c8 --- /dev/null +++ b/www/sunders/i18n/countries/en.json @@ -0,0 +1,708 @@ +{ + "texts": { + "xxx": "not localized yet", + "--": "unable to localize", + + "AA": "", + "AB": "", + "AC": "Ascension Island", + "AD": "Andorra", + "AE": "United Arab Emirates", + "AF": "Afghanistan", + "AG": "Antigua and Barbuda", + "AH": "", + "AI": "Anguilla", + "AJ": "", + "AK": "", + "AL": "Albania", + "AM": "Armenia", + "AN": "Netherlands Antilles", + "AO": "Angola", + "AP": "", + "AQ": "Antarctica", + "AR": "Argentina", + "AS": "American Samoa", + "AT": "Austria", + "AU": "Australia", + "AV": "", + "AW": "Aruba", + "AX": "Åland Islands", + "AY": "", + "AZ": "Azerbaijan", + + "BA": "Bosnia and Herzegovina", + "BB": "Barbados", + "BC": "", + "BD": "Bangladesh", + "BE": "Belgium", + "BF": "Burkina Faso", + "BG": "Bulgaria", + "BH": "Bahrain", + "BI": "Burundi", + "BJ": "Benin", + "BK": "", + "BL": "Saint Barthélemy", + "BM": "Bermuda", + "BN": "Brunei", + "BO": "Bolivia", + "BP": "", + "BQ": "Caribbean Netherlands", + "BR": "Brazil", + "BS": "Bahamas", + "BT": "Bhutan", + "BU": "Burma (Myanmar)", + "BV": "Bouvet Island", + "BW": "Botswana", + "BX": "", + "BY": "Belarus", + "BZ": "Belize", + + "CA": "Canada", + "CB": "", + "CC": "Cocos Islands", + "CD": "Democratic Republic of the Congo", + "CE": "", + "CF": "Central African Republic", + "CG": "Republic of the Congo", + "CH": "Switzerland", + "CI": "Ivory Coast", + "CJ": "", + "CK": "Cook Islands", + "CL": "Chile", + "CM": "Cameroon", + "CN": "People's Republic of China", + "CO": "Colombia", + "CP": "Clipperton Island", + "CQ": "", + "CR": "Costa Rica", + "CS": "Czechoslovakia (Serbia and Montenegro)", + "CT": "", + "CU": "Cuba", + "CV": "Cape Verde", + "CW": "Curaçao", + "CX": "Christmas Island", + "CY": "Cyprus", + "CZ": "Czech Republic", + + "DA": "", + "DB": "", + "DC": "", + "DD": "", + "DE": "Germany", + "DF": "", + "DG": "Diego Garcia", + "DH": "", + "DI": "", + "DJ": "Djibouti", + "DK": "Denmark", + "DL": "", + "DM": "Dominica", + "DN": "", + "DO": "Dominican Republic", + "DP": "", + "DQ": "", + "DR": "", + "DS": "", + "DT": "", + "DU": "", + "DV": "", + "DW": "", + "DX": "", + "DY": "Benin", + "DZ": "Algeria", + + "EA": "Melilla", + "EB": "", + "EC": "Ecuador", + "ED": "", + "EE": "Estonia", + "EF": "", + "EG": "Egypt", + "EH": "Western Sahara", + "EI": "", + "EJ": "", + "EK": "", + "EL": "", + "EM": "", + "EN": "", + "EO": "", + "EP": "", + "EQ": "", + "ER": "Eritrea", + "ES": "Spain", + "ET": "Ethiopia", + "EU": "", + "EV": "", + "EW": "Estonia", + "EX": "", + "EY": "", + "EZ": "", + + "FA": "", + "FB": "", + "FC": "", + "FD": "", + "FE": "", + "FF": "", + "FG": "", + "FH": "", + "FI": "Finland", + "FJ": "Fiji", + "FK": "Falkland Islands", + "FL": "Liechtenstein", + "FM": "Federated States of Micronesia", + "FN": "", + "FO": "Faroe Islands", + "FP": "", + "FQ": "", + "FR": "France", + "FS": "", + "FT": "", + "FU": "", + "FV": "", + "FW": "", + "FX": "", + "FY": "", + "FZ": "", + + "GA": "Gabon", + "GB": "United Kingdom", + "GC": "", + "GD": "Grenada", + "GE": "Georgia", + "GF": "French Guiana", + "GG": "Guernsey", + "GH": "Ghana", + "GI": "Gibraltar", + "GJ": "", + "GK": "", + "GL": "Greenland", + "GM": "Gambia", + "GN": "Guinea", + "GO": "", + "GP": "Guadeloupe", + "GQ": "Equatorial Guinea", + "GR": "Greece", + "GS": "South Georgia and the South Sandwich Islands", + "GT": "Guatemala", + "GU": "Guam", + "GV": "", + "GW": "Guinea-Bissau", + "GX": "", + "GY": "Guyana", + "GZ": "", + + "HA": "", + "HB": "", + "HC": "", + "HD": "", + "HE": "", + "HF": "", + "HG": "", + "HH": "", + "HI": "", + "HJ": "", + "HK": "Hong Kong", + "HL": "", + "HM": "Heard Island and McDonald Islands", + "HN": "Honduras", + "HO": "", + "HP": "", + "HQ": "", + "HR": "Croatia", + "HS": "", + "HT": "Haiti", + "HU": "Hungary", + "HV": "", + "HW": "", + "HX": "", + "HY": "", + "HZ": "", + + "IA": "", + "IB": "", + "IC": "Canary Islands", + "ID": "Indonesia", + "IE": "Ireland", + "IF": "", + "IG": "", + "IH": "", + "II": "", + "IJ": "", + "IK": "", + "IL": "Israel", + "IM": "Isle of Man", + "IN": "India", + "IO": "British Indian Ocean Territory", + "IP": "", + "IQ": "Iraq", + "IR": "Iran", + "IS": "Iceland", + "IT": "Italy", + "IU": "", + "IV": "", + "IW": "", + "IX": "", + "IY": "", + "IZ": "", + + "JA": "Jamaica", + "JB": "", + "JC": "", + "JD": "", + "JE": "Jersey", + "JF": "", + "JG": "", + "JH": "", + "JI": "", + "JJ": "", + "JK": "", + "JL": "", + "JM": "Jamaica", + "JN": "", + "JO": "Jordan", + "JP": "Japan", + "JQ": "", + "JR": "", + "JS": "", + "JT": "", + "JU": "", + "JV": "", + "JW": "", + "JX": "", + "JY": "", + "JZ": "", + + "KA": "", + "KB": "", + "KC": "", + "KD": "", + "KE": "Kenya", + "KF": "", + "KG": "Kyrgyzstan", + "KH": "Cambodia", + "KI": "Kiribati", + "KJ": "", + "KK": "", + "KL": "", + "KM": "Comoros", + "KN": "Saint Kitts and Nevis", + "KO": "", + "KP": "North Korea", + "KQ": "", + "KR": "South Korea", + "KS": "", + "KT": "", + "KU": "", + "KV": "", + "KW": "Kuwait", + "KX": "", + "KY": "Cayman Islands", + "KZ": "Kazakhstan", + + "LA": "Laos", + "LB": "Lebanon", + "LC": "Saint Lucia", + "LD": "", + "LE": "", + "LF": "", + "LG": "", + "LH": "", + "LI": "Liechtenstein", + "LJ": "", + "LK": "Sri Lanka", + "LL": "", + "LM": "", + "LN": "", + "LO": "", + "LP": "", + "LQ": "", + "LR": "Liberia", + "LS": "Lesotho", + "LT": "Lithuania", + "LU": "Luxembourg", + "LV": "Latvia", + "LW": "", + "LX": "", + "LY": "Libya", + "LZ": "", + + "MA": "Morocco", + "MB": "", + "MC": "Monaco", + "MD": "Moldova", + "ME": "Montenegro", + "MF": "Saint Martin", + "MG": "Madagascar", + "MH": "Marshall Islands", + "MI": "", + "MJ": "", + "MK": "Macedonia", + "ML": "Mali", + "MM": "Myanmar", + "MN": "Mongolia", + "MO": "Macau", + "MP": "Northern Mariana Islands", + "MQ": "Martinique", + "MR": "Mauritania", + "MS": "Montserrat", + "MT": "Malta", + "MU": "Mauritius", + "MV": "Maldives", + "MW": "Malawi", + "MX": "Mexico", + "MY": "Malaysia", + "MZ": "Mozambique", + + "NA": "Namibia", + "NB": "", + "NC": "New Caledonia", + "ND": "", + "NE": "Niger", + "NF": "Norfolk Island", + "NG": "Nigeria", + "NH": "", + "NI": "Nicaragua", + "NJ": "", + "NK": "", + "NL": "Netherlands", + "NM": "", + "NN": "", + "NO": "Norway", + "NP": "Nepal", + "NQ": "", + "NR": "Nauru", + "NS": "", + "NT": "", + "NU": "Niue", + "NV": "", + "NW": "", + "NX": "", + "NY": "", + "NZ": "New Zealand", + + "OA": "", + "OB": "", + "OC": "", + "OD": "", + "OE": "", + "OF": "", + "OG": "", + "OH": "", + "OI": "", + "OJ": "", + "OK": "", + "OL": "", + "OM": "Oman", + "ON": "", + "OO": "", + "OP": "", + "OQ": "", + "OR": "", + "OS": "", + "OT": "", + "OU": "", + "OV": "", + "OW": "", + "OX": "", + "OY": "", + "OZ": "", + + "PA": "Panama", + "PB": "", + "PC": "", + "PD": "", + "PE": "Peru", + "PF": "French Polynesia", + "PG": "Papua New Guinea", + "PH": "Philippines", + "PI": "Philippines", + "PJ": "", + "PK": "Pakistan", + "PL": "Poland", + "PM": "Saint Pierre and Miquelon", + "PN": "Pitcairn Islands", + "PO": "", + "PP": "", + "PQ": "", + "PR": "Puerto Rico", + "PS": "State of Palestine", + "PT": "Portugal", + "PU": "", + "PV": "", + "PW": "Palau", + "PX": "", + "PY": "Paraguay", + "PZ": "", + + "QA": "Qatar", + "QB": "", + "QC": "", + "QD": "", + "QE": "", + "QF": "", + "QG": "", + "QH": "", + "QI": "", + "QJ": "", + "QK": "", + "QL": "", + "QM": "", + "QN": "", + "QO": "", + "QP": "", + "QQ": "", + "QR": "", + "QS": "", + "QT": "", + "QU": "", + "QV": "", + "QW": "", + "QX": "", + "QY": "", + "QZ": "", + + "RA": "Argentina", + "RB": "Bolivia; Botswana", + "RC": "Taiwan (Republic of China)", + "RD": "", + "RE": "Réunion", + "RF": "", + "RG": "", + "RH": "Haiti", + "RI": "Indonesia", + "RJ": "", + "RK": "", + "RL": "Lebanon", + "RM": "Madagascar", + "RN": "Niger", + "RO": "Romania", + "RP": "Philippines", + "RQ": "", + "RR": "", + "RS": "Serbia", + "RT": "", + "RU": "Russia", + "RV": "", + "RW": "Rwanda", + "RX": "", + "RY": "", + "RZ": "", + + "SA": "Saudi Arabia", + "SB": "Solomon Islands", + "SC": "Seychelles", + "SD": "Sudan", + "SE": "Sweden", + "SF": "Finland", + "SG": "Singapore", + "SH": "Saint Helena, Ascension and Tristan da Cunha", + "SI": "Slovenia", + "SJ": "Svalbard and Jan Mayen", + "SK": "Slovakia", + "SL": "Sierra Leone", + "SM": "San Marino", + "SN": "Senegal", + "SO": "Somalia", + "SP": "", + "SQ": "", + "SR": "Suriname", + "SS": "South Sudan", + "ST": "São Tomé and Príncipe", + "SU": "Union of Soviet Socialist Republics (USSR)", + "SV": "El Salvador", + "SW": "", + "SX": "Sint Maarten", + "SY": "Syria", + "SZ": "Swaziland", + + "TA": "Tristan da Cunha", + "TB": "", + "TC": "Turks and Caicos Islands", + "TD": "Chad", + "TE": "", + "TF": "French Southern and Antarctic Lands", + "TG": "Togo", + "TH": "Thailand", + "TI": "", + "TJ": "Tajikistan", + "TK": "Tokelau", + "TL": "East Timor", + "TM": "Turkmenistan", + "TN": "Tunisia", + "TO": "Tonga", + "TP": "East Timor", + "TQ": "", + "TR": "Turkey", + "TS": "", + "TT": "Trinidad and Tobago", + "TU": "", + "TV": "Tuvalu", + "TW": "Taiwan (Republic of China)", + "TX": "", + "TY": "", + "TZ": "Tanzania", + + "UA": "Ukraine", + "UB": "", + "UC": "", + "UD": "", + "UE": "", + "UF": "", + "UG": "Uganda", + "UH": "", + "UI": "", + "UJ": "", + "UK": "United Kingdom", + "UL": "", + "UM": "United States Minor Outlying Islands", + "UN": "", + "UO": "", + "UP": "", + "UQ": "", + "UR": "", + "US": "United States of America (USA)", + "UT": "", + "UU": "", + "UV": "", + "UW": "", + "UX": "", + "UY": "Uruguay", + "UZ": "Uzbekistan", + + "VA": "Vatican City", + "VB": "", + "VC": "Saint Vincent and the Grenadines", + "VD": "", + "VE": "Venezuela", + "VF": "", + "VG": "British Virgin Islands", + "VH": "", + "VI": "United States Virgin Islands", + "VJ": "", + "VK": "", + "VL": "", + "VM": "", + "VN": "Vietnam", + "VO": "", + "VP": "", + "VQ": "", + "VR": "", + "VS": "", + "VT": "", + "VU": "Vanuatu", + "VV": "", + "VW": "", + "VX": "", + "VY": "", + "VZ": "", + + "WA": "", + "WB": "", + "WC": "", + "WD": "", + "WE": "", + "WF": "Wallis and Futuna", + "WG": "Grenada", + "WH": "", + "WI": "", + "WJ": "", + "WK": "", + "WL": "Saint Lucia", + "WM": "", + "WN": "", + "WO": "", + "WP": "", + "WQ": "", + "WR": "", + "WS": "Samoa", + "WT": "", + "WU": "", + "WV": "Saint Vincent and the Grenadines", + "WW": "", + "WX": "", + "WY": "", + "WZ": "", + + "XA": "", + "XB": "", + "XC": "", + "XD": "", + "XE": "", + "XF": "", + "XG": "", + "XH": "", + "XI": "", + "XJ": "", + "XK": "Kosovo", + "XL": "", + "XM": "", + "XN": "", + "XO": "", + "XP": "", + "XQ": "", + "XR": "", + "XS": "", + "XT": "", + "XU": "", + "XV": "", + "XW": "", + "XX": "", + "XY": "", + "XZ": "", + + "YA": "", + "YB": "", + "YC": "", + "YD": "", + "YE": "Yemen", + "YF": "", + "YG": "", + "YH": "", + "YI": "", + "YJ": "", + "YK": "", + "YL": "", + "YM": "", + "YN": "", + "YO": "", + "YP": "", + "YQ": "", + "YR": "", + "YS": "", + "YT": "Mayotte", + "YU": "Yugoslavia", + "YV": "Venezuela", + "YW": "", + "YX": "", + "YY": "", + "YZ": "", + + "ZA": "South Africa", + "ZB": "", + "ZC": "", + "ZD": "", + "ZE": "", + "ZF": "", + "ZG": "", + "ZH": "", + "ZI": "", + "ZJ": "", + "ZK": "", + "ZL": "", + "ZM": "Zambia", + "ZN": "", + "ZO": "", + "ZP": "", + "ZQ": "", + "ZR": "Zaire", + "ZS": "", + "ZT": "", + "ZU": "", + "ZV": "", + "ZW": "Zimbabwe", + "ZX": "", + "ZY": "", + "ZZ": "" + } +} diff --git a/www/sunders/i18n/countries/es.json b/www/sunders/i18n/countries/es.json new file mode 100644 index 0000000..1feaf61 --- /dev/null +++ b/www/sunders/i18n/countries/es.json @@ -0,0 +1,708 @@ +{ + "texts": { + "xxx": "aún no localizado", + "--": "incapaz de localizar", + + "AA": "", + "AB": "", + "AC": "Isla Ascensión", + "AD": "Andorra", + "AE": "Emiratos Árabes Unidos", + "AF": "Afganistán", + "AG": "Antigua y Barbuda", + "AH": "", + "AI": "Anguila", + "AJ": "", + "AK": "", + "AL": "Albania", + "AM": "Armenia", + "AN": "Antillas Neerlandesas", + "AO": "Angola", + "AP": "", + "AQ": "Antártida", + "AR": "Argentina", + "AS": "Samoa Americana", + "AT": "Austria", + "AU": "Australia", + "AV": "", + "AW": "Aruba", + "AX": "Åland", + "AY": "", + "AZ": "Azerbaiyán", + + "BA": "Bosnia y Herzegovina", + "BB": "Barbados", + "BC": "", + "BD": "Bangladés", + "BE": "Bélgica", + "BF": "Burkina Faso", + "BG": "Bulgaria", + "BH": "Baréin", + "BI": "Burundi", + "BJ": "Benín", + "BK": "", + "BL": "San Bartolomé", + "BM": "Bermudas", + "BN": "Brunéi", + "BO": "Bolivia", + "BP": "", + "BQ": "Caribe Neerlandés", + "BR": "Brasil", + "BS": "Bahamas", + "BT": "Bután", + "BU": "Birmania (Myanmar)", + "BV": "Isla Bouvet", + "BW": "Botsuana", + "BX": "", + "BY": "Bielorrusia", + "BZ": "Belice", + + "CA": "Canadá", + "CB": "", + "CC": "Islas Cocos", + "CD": "República Democrática del Congo", + "CE": "", + "CF": "República Centroafricana", + "CG": "República del Congo", + "CH": "Suiza", + "CI": "Costa de Marfil", + "CJ": "", + "CK": "Islas Cook", + "CL": "Chile", + "CM": "Camerún", + "CN": "República Popular China", + "CO": "Colombia", + "CP": "Isla Clipperton", + "CQ": "", + "CR": "Costa Rica", + "CS": "Checoslovaquia (Serbia y Montenegro)", + "CT": "", + "CU": "Cuba", + "CV": "Cabo Verde", + "CW": "Curazao", + "CX": "Isla de Navidad", + "CY": "Chipre", + "CZ": "República Checa", + + "DA": "", + "DB": "", + "DC": "", + "DD": "", + "DE": "Alemania", + "DF": "", + "DG": "Diego García", + "DH": "", + "DI": "", + "DJ": "Yibuti", + "DK": "Dinamarca", + "DL": "", + "DM": "Dominica", + "DN": "", + "DO": "República Dominicana", + "DP": "", + "DQ": "", + "DR": "", + "DS": "", + "DT": "", + "DU": "", + "DV": "", + "DW": "", + "DX": "", + "DY": "Benín", + "DZ": "Argelia", + + "EA": "Melilla", + "EB": "", + "EC": "Ecuador", + "ED": "", + "EE": "Estonia", + "EF": "", + "EG": "Egipto", + "EH": "Sahara Occidental", + "EI": "", + "EJ": "", + "EK": "", + "EL": "", + "EM": "", + "EN": "", + "EO": "", + "EP": "", + "EQ": "", + "ER": "Eritrea", + "ES": "España", + "ET": "Etiopía", + "EU": "", + "EV": "", + "EW": "Estonia", + "EX": "", + "EY": "", + "EZ": "", + + "FA": "", + "FB": "", + "FC": "", + "FD": "", + "FE": "", + "FF": "", + "FG": "", + "FH": "", + "FI": "Finlandia", + "FJ": "Fiyi", + "FK": "Islas Malvinas", + "FL": "Liechtenstein", + "FM": "Estados Federados de Micronesia", + "FN": "", + "FO": "Islas Feroe", + "FP": "", + "FQ": "", + "FR": "Francia", + "FS": "", + "FT": "", + "FU": "", + "FV": "", + "FW": "", + "FX": "", + "FY": "", + "FZ": "", + + "GA": "Gabón", + "GB": "Reino Unido", + "GC": "", + "GD": "Granada", + "GE": "Georgia", + "GF": "Guayana Francesa", + "GG": "Guernsey", + "GH": "Ghana", + "GI": "Gibraltar", + "GJ": "", + "GK": "", + "GL": "Groenlandia", + "GM": "Gambia", + "GN": "Guinea", + "GO": "", + "GP": "Guadalupe", + "GQ": "Guinea Ecuatorial", + "GR": "Grecia", + "GS": "Islas Georgias del Sur y Sandwich del Sur", + "GT": "Guatemala", + "GU": "Guam", + "GV": "", + "GW": "Guinea-Bisáu", + "GX": "", + "GY": "Guyana", + "GZ": "", + + "HA": "", + "HB": "", + "HC": "", + "HD": "", + "HE": "", + "HF": "", + "HG": "", + "HH": "", + "HI": "", + "HJ": "", + "HK": "Hong Kong", + "HL": "", + "HM": "Islas Heard y McDonald", + "HN": "Honduras", + "HO": "", + "HP": "", + "HQ": "", + "HR": "Croacia", + "HS": "", + "HT": "Haití", + "HU": "Hungría", + "HV": "", + "HW": "", + "HX": "", + "HY": "", + "HZ": "", + + "IA": "", + "IB": "", + "IC": "Canarias", + "ID": "Indonesia", + "IE": "Irlanda", + "IF": "", + "IG": "", + "IH": "", + "II": "", + "IJ": "", + "IK": "", + "IL": "Israel", + "IM": "Isla de Man", + "IN": "India", + "IO": "Territorio Británico del Océano Índico", + "IP": "", + "IQ": "Irak", + "IR": "Irán", + "IS": "Islandia", + "IT": "Italia", + "IU": "", + "IV": "", + "IW": "", + "IX": "", + "IY": "", + "IZ": "", + + "JA": "Jamaica", + "JB": "", + "JC": "", + "JD": "", + "JE": "Jersey", + "JF": "", + "JG": "", + "JH": "", + "JI": "", + "JJ": "", + "JK": "", + "JL": "", + "JM": "Jamaica", + "JN": "", + "JO": "Jordania", + "JP": "Japón", + "JQ": "", + "JR": "", + "JS": "", + "JT": "", + "JU": "", + "JV": "", + "JW": "", + "JX": "", + "JY": "", + "JZ": "", + + "KA": "", + "KB": "", + "KC": "", + "KD": "", + "KE": "Kenia", + "KF": "", + "KG": "Kirguistán", + "KH": "Camboya", + "KI": "Kiribati", + "KJ": "", + "KK": "", + "KL": "", + "KM": "Comoras", + "KN": "San Cristóbal y Nieves", + "KO": "", + "KP": "Corea del Norte", + "KQ": "", + "KR": "Corea del Sur", + "KS": "", + "KT": "", + "KU": "", + "KV": "", + "KW": "Kuwait", + "KX": "", + "KY": "Islas Caimán", + "KZ": "Kazajistán", + + "LA": "Laos", + "LB": "Líbano", + "LC": "Santa Lucía", + "LD": "", + "LE": "", + "LF": "", + "LG": "", + "LH": "", + "LI": "Liechtenstein", + "LJ": "", + "LK": "Sri Lanka", + "LL": "", + "LM": "", + "LN": "", + "LO": "", + "LP": "", + "LQ": "", + "LR": "Liberia", + "LS": "Lesoto", + "LT": "Lituania", + "LU": "Luxemburgo", + "LV": "Letonia", + "LW": "", + "LX": "", + "LY": "Libia", + "LZ": "", + + "MA": "Marruecos", + "MB": "", + "MC": "Mónaco", + "MD": "Moldavia", + "ME": "Montenegro", + "MF": "San Martín", + "MG": "Madagascar", + "MH": "Islas Marshall", + "MI": "", + "MJ": "", + "MK": "Macedonia", + "ML": "Malí", + "MM": "Myanmar", + "MN": "Mongolia", + "MO": "Macao", + "MP": "Islas Marianas del Norte", + "MQ": "Martinica", + "MR": "Mauritania", + "MS": "Montserrat", + "MT": "Malta", + "MU": "Mauricio", + "MV": "Maldivas", + "MW": "Malaui", + "MX": "México", + "MY": "Malasia", + "MZ": "Mozambique", + + "NA": "Namibia", + "NB": "", + "NC": "Nueva Caledonia", + "ND": "", + "NE": "Níger", + "NF": "Isla Norfolk", + "NG": "Nigeria", + "NH": "", + "NI": "Nicaragua", + "NJ": "", + "NK": "", + "NL": "Países Bajos", + "NM": "", + "NN": "", + "NO": "Noruega", + "NP": "Nepal", + "NQ": "", + "NR": "Nauru", + "NS": "", + "NT": "", + "NU": "Niue", + "NV": "", + "NW": "", + "NX": "", + "NY": "", + "NZ": "Nueva Zelanda", + + "OA": "", + "OB": "", + "OC": "", + "OD": "", + "OE": "", + "OF": "", + "OG": "", + "OH": "", + "OI": "", + "OJ": "", + "OK": "", + "OL": "", + "OM": "Omán", + "ON": "", + "OO": "", + "OP": "", + "OQ": "", + "OR": "", + "OS": "", + "OT": "", + "OU": "", + "OV": "", + "OW": "", + "OX": "", + "OY": "", + "OZ": "", + + "PA": "Panamá", + "PB": "", + "PC": "", + "PD": "", + "PE": "Perú", + "PF": "Polinesia Francesa", + "PG": "Papúa Nueva Guinea", + "PH": "Filipinas", + "PI": "Filipinas", + "PJ": "", + "PK": "Pakistán", + "PL": "Polonia", + "PM": "San Pedro y Miquelón", + "PN": "Islas Pitcairn", + "PO": "", + "PP": "", + "PQ": "", + "PR": "Puerto Rico", + "PS": "Estado de Palestina", + "PT": "Portugal", + "PU": "", + "PV": "", + "PW": "Palaos", + "PX": "", + "PY": "Paraguay", + "PZ": "", + + "QA": "Catar", + "QB": "", + "QC": "", + "QD": "", + "QE": "", + "QF": "", + "QG": "", + "QH": "", + "QI": "", + "QJ": "", + "QK": "", + "QL": "", + "QM": "", + "QN": "", + "QO": "", + "QP": "", + "QQ": "", + "QR": "", + "QS": "", + "QT": "", + "QU": "", + "QV": "", + "QW": "", + "QX": "", + "QY": "", + "QZ": "", + + "RA": "Argentina", + "RB": "Bolivia; Botsuana", + "RC": "Taiwán (República de China)", + "RD": "", + "RE": "Reunión", + "RF": "", + "RG": "", + "RH": "Haití", + "RI": "Indonesia", + "RJ": "", + "RK": "", + "RL": "Líbano", + "RM": "Madagascar", + "RN": "Níger", + "RO": "Rumania", + "RP": "Filipinas", + "RQ": "", + "RR": "", + "RS": "Serbia", + "RT": "", + "RU": "Rusia", + "RV": "", + "RW": "Ruanda", + "RX": "", + "RY": "", + "RZ": "", + + "SA": "Arabia Saudita", + "SB": "Islas Salomón", + "SC": "Seychelles", + "SD": "Sudán", + "SE": "Suecia", + "SF": "Finlandia", + "SG": "Singapur", + "SH": "Santa Elena, Ascensión y Tristán de Acuña", + "SI": "Eslovenia", + "SJ": "Svalbard y Jan Mayen", + "SK": "Eslovaquia", + "SL": "Sierra Leona", + "SM": "San Marino", + "SN": "Senegal", + "SO": "Somalia", + "SP": "", + "SQ": "", + "SR": "Surinam", + "SS": "Sudán del Sur", + "ST": "Santo Tomé y Príncipe", + "SU": "Unión de Repúblicas Socialistas Soviéticas (URSS)", + "SV": "El Salvador", + "SW": "", + "SX": "Sint Maarten", + "SY": "Siria", + "SZ": "Suazilandia", + + "TA": "Tristán de Acuña", + "TB": "", + "TC": "Islas Turcas y Caicos", + "TD": "Chad", + "TE": "", + "TF": "Tierras Australes y Antárticas Francesas", + "TG": "Togo", + "TH": "Tailandia", + "TI": "", + "TJ": "Tayikistán", + "TK": "Tokelau", + "TL": "Timor Oriental", + "TM": "Turkmenistán", + "TN": "Túnez", + "TO": "Tonga", + "TP": "Timor Oriental", + "TQ": "", + "TR": "Turquía", + "TS": "", + "TT": "Trinidad y Tobago", + "TU": "", + "TV": "Tuvalu", + "TW": "Taiwán (República de China)", + "TX": "", + "TY": "", + "TZ": "Tanzania", + + "UA": "Ucrania", + "UB": "", + "UC": "", + "UD": "", + "UE": "", + "UF": "", + "UG": "Uganda", + "UH": "", + "UI": "", + "UJ": "", + "UK": "Reino Unido", + "UL": "", + "UM": "Islas Ultramarinas Menores de Estados Unidos", + "UN": "", + "UO": "", + "UP": "", + "UQ": "", + "UR": "", + "US": "Estados Unidos de América (USA)", + "UT": "", + "UU": "", + "UV": "", + "UW": "", + "UX": "", + "UY": "Uruguay", + "UZ": "Uzbekistán", + + "VA": "Ciudad del Vaticano", + "VB": "", + "VC": "San Vicente y las Granadinas", + "VD": "", + "VE": "Venezuela", + "VF": "", + "VG": "Islas Vírgenes Británicas", + "VH": "", + "VI": "Islas Vírgenes de los Estados Unidos", + "VJ": "", + "VK": "", + "VL": "", + "VM": "", + "VN": "Vietnam", + "VO": "", + "VP": "", + "VQ": "", + "VR": "", + "VS": "", + "VT": "", + "VU": "Vanuatu", + "VV": "", + "VW": "", + "VX": "", + "VY": "", + "VZ": "", + + "WA": "", + "WB": "", + "WC": "", + "WD": "", + "WE": "", + "WF": "Wallis y Futuna", + "WG": "Grenada", + "WH": "", + "WI": "", + "WJ": "", + "WK": "", + "WL": "Santa Lucía", + "WM": "", + "WN": "", + "WO": "", + "WP": "", + "WQ": "", + "WR": "", + "WS": "Samoa", + "WT": "", + "WU": "", + "WV": "San Vicente y las Granadinas", + "WW": "", + "WX": "", + "WY": "", + "WZ": "", + + "XA": "", + "XB": "", + "XC": "", + "XD": "", + "XE": "", + "XF": "", + "XG": "", + "XH": "", + "XI": "", + "XJ": "", + "XK": "Kosovo", + "XL": "", + "XM": "", + "XN": "", + "XO": "", + "XP": "", + "XQ": "", + "XR": "", + "XS": "", + "XT": "", + "XU": "", + "XV": "", + "XW": "", + "XX": "", + "XY": "", + "XZ": "", + + "YA": "", + "YB": "", + "YC": "", + "YD": "", + "YE": "Yemen", + "YF": "", + "YG": "", + "YH": "", + "YI": "", + "YJ": "", + "YK": "", + "YL": "", + "YM": "", + "YN": "", + "YO": "", + "YP": "", + "YQ": "", + "YR": "", + "YS": "", + "YT": "Mayotte", + "YU": "Yugoslavia", + "YV": "Venezuela", + "YW": "", + "YX": "", + "YY": "", + "YZ": "", + + "ZA": "Sudáfrica", + "ZB": "", + "ZC": "", + "ZD": "", + "ZE": "", + "ZF": "", + "ZG": "", + "ZH": "", + "ZI": "", + "ZJ": "", + "ZK": "", + "ZL": "", + "ZM": "Zambia", + "ZN": "", + "ZO": "", + "ZP": "", + "ZQ": "", + "ZR": "Zaire", + "ZS": "", + "ZT": "", + "ZU": "", + "ZV": "", + "ZW": "Zimbabue", + "ZX": "", + "ZY": "", + "ZZ": "" + } +} diff --git a/www/sunders/i18n/countries/fr.json b/www/sunders/i18n/countries/fr.json new file mode 100644 index 0000000..47a4705 --- /dev/null +++ b/www/sunders/i18n/countries/fr.json @@ -0,0 +1,708 @@ +{ + "texts": { + "xxx": "pas encore localisé", + "--": "incapable de localiser", + + "AA": "", + "AB": "", + "AC": "Île de l'Ascension", + "AD": "Andorre", + "AE": "Émirats arabes unis", + "AF": "Afghanistan", + "AG": "Antigua-et-Barbuda", + "AH": "", + "AI": "Anguilla", + "AJ": "", + "AK": "", + "AL": "Albanie", + "AM": "Arménie", + "AN": "Antilles néerlandaises", + "AO": "Angola", + "AP": "", + "AQ": "Antarctique", + "AR": "Argentine", + "AS": "Samoa américaines", + "AT": "Autriche", + "AU": "Australie", + "AV": "", + "AW": "Aruba", + "AX": "Åland", + "AY": "", + "AZ": "Azerbaïdjan", + + "BA": "Bosnie-Herzégovine", + "BB": "Barbade", + "BC": "", + "BD": "Bangladesh", + "BE": "Belgique", + "BF": "Burkina Faso", + "BG": "Bulgarie", + "BH": "Bahreïn", + "BI": "Burundi", + "BJ": "Bénin", + "BK": "", + "BL": "Saint-Barthélemy", + "BM": "Bermudes", + "BN": "Brunei", + "BO": "Bolivie", + "BP": "", + "BQ": "Pays-Bas caribéens", + "BR": "Brésil", + "BS": "Bahamas", + "BT": "Bhoutan", + "BU": "Birmanie (Myanmar)", + "BV": "Île Bouvet", + "BW": "Botswana", + "BX": "", + "BY": "Biélorussie", + "BZ": "Belize", + + "CA": "Canada", + "CB": "", + "CC": "Îles Cocos", + "CD": "République démocratique du Congo", + "CE": "", + "CF": "République centrafricaine", + "CG": "République du Congo", + "CH": "Suisse", + "CI": "Côte d'Ivoire", + "CJ": "", + "CK": "Îles Cook", + "CL": "Chili", + "CM": "Cameroun", + "CN": "République populaire de Chine", + "CO": "Colombie", + "CP": "Île de Clipperton", + "CQ": "", + "CR": "Costa Rica", + "CS": "Tchécoslovaquie (Serbie-et-Monténégro)", + "CT": "", + "CU": "Cuba", + "CV": "Cap-Vert", + "CW": "Curaçao", + "CX": "Île Christmas", + "CY": "Chypre", + "CZ": "République tchèque", + + "DA": "", + "DB": "", + "DC": "", + "DD": "", + "DE": "Allemagne", + "DF": "", + "DG": "Diego Garcia", + "DH": "", + "DI": "", + "DJ": "Djibouti", + "DK": "Danemark", + "DL": "", + "DM": "Dominique", + "DN": "", + "DO": "République dominicaine", + "DP": "", + "DQ": "", + "DR": "", + "DS": "", + "DT": "", + "DU": "", + "DV": "", + "DW": "", + "DX": "", + "DY": "Bénin", + "DZ": "Algérie", + + "EA": "Melilla", + "EB": "", + "EC": "Équateur", + "ED": "", + "EE": "Estonie", + "EF": "", + "EG": "Égypte", + "EH": "Sahara occidental", + "EI": "", + "EJ": "", + "EK": "", + "EL": "", + "EM": "", + "EN": "", + "EO": "", + "EP": "", + "EQ": "", + "ER": "Érythrée", + "ES": "Espagne", + "ET": "Éthiopie", + "EU": "", + "EV": "", + "EW": "Estonie", + "EX": "", + "EY": "", + "EZ": "", + + "FA": "", + "FB": "", + "FC": "", + "FD": "", + "FE": "", + "FF": "", + "FG": "", + "FH": "", + "FI": "Finlande", + "FJ": "Fidji", + "FK": "Îles Malouines", + "FL": "Liechtenstein", + "FM": "États fédérés de Micronésie", + "FN": "", + "FO": "Îles Féroé", + "FP": "", + "FQ": "", + "FR": "France", + "FS": "", + "FT": "", + "FU": "", + "FV": "", + "FW": "", + "FX": "", + "FY": "", + "FZ": "", + + "GA": "Gabon", + "GB": "Royaume-Uni", + "GC": "", + "GD": "Grenade", + "GE": "Géorgie", + "GF": "Guyane", + "GG": "Guernesey", + "GH": "Ghana", + "GI": "Gibraltar", + "GJ": "", + "GK": "", + "GL": "Groenland", + "GM": "Gambie", + "GN": "Guinée", + "GO": "", + "GP": "Guadeloupe", + "GQ": "Guinée équatoriale", + "GR": "Grèce", + "GS": "Géorgie du Sud-et-les Îles Sandwich du Sud", + "GT": "Guatemala", + "GU": "Guam", + "GV": "", + "GW": "Guinée-Bissau", + "GX": "", + "GY": "Guyana", + "GZ": "", + + "HA": "", + "HB": "", + "HC": "", + "HD": "", + "HE": "", + "HF": "", + "HG": "", + "HH": "", + "HI": "", + "HJ": "", + "HK": "Hong Kong", + "HL": "", + "HM": "Îles Heard-et-MacDonald", + "HN": "Honduras", + "HO": "", + "HP": "", + "HQ": "", + "HR": "Croatie", + "HS": "", + "HT": "Haïti", + "HU": "Hongrie", + "HV": "", + "HW": "", + "HX": "", + "HY": "", + "HZ": "", + + "IA": "", + "IB": "", + "IC": "Îles Canaries", + "ID": "Indonésie", + "IE": "Irlande", + "IF": "", + "IG": "", + "IH": "", + "II": "", + "IJ": "", + "IK": "", + "IL": "Israël", + "IM": "Île de Man", + "IN": "Inde", + "IO": "Territoire britannique de l'océan Indien", + "IP": "", + "IQ": "Irak", + "IR": "Iran", + "IS": "Islande", + "IT": "Italie", + "IU": "", + "IV": "", + "IW": "", + "IX": "", + "IY": "", + "IZ": "", + + "JA": "Jamaïque", + "JB": "", + "JC": "", + "JD": "", + "JE": "Jersey", + "JF": "", + "JG": "", + "JH": "", + "JI": "", + "JJ": "", + "JK": "", + "JL": "", + "JM": "Jamaïque", + "JN": "", + "JO": "Jordanie", + "JP": "Japon", + "JQ": "", + "JR": "", + "JS": "", + "JT": "", + "JU": "", + "JV": "", + "JW": "", + "JX": "", + "JY": "", + "JZ": "", + + "KA": "", + "KB": "", + "KC": "", + "KD": "", + "KE": "Kenya", + "KF": "", + "KG": "Kirghizistan", + "KH": "Cambodge", + "KI": "Kiribati", + "KJ": "", + "KK": "", + "KL": "", + "KM": "Comores", + "KN": "Saint-Christophe-et-Niévès", + "KO": "", + "KP": "Corée du Nord", + "KQ": "", + "KR": "Corée du Sud", + "KS": "", + "KT": "", + "KU": "", + "KV": "", + "KW": "Koweït", + "KX": "", + "KY": "Îles Caïmans", + "KZ": "Kazakhstan", + + "LA": "Laos", + "LB": "Liban", + "LC": "Sainte-Lucie", + "LD": "", + "LE": "", + "LF": "", + "LG": "", + "LH": "", + "LI": "Liechtenstein", + "LJ": "", + "LK": "Sri Lanka", + "LL": "", + "LM": "", + "LN": "", + "LO": "", + "LP": "", + "LQ": "", + "LR": "Liberia", + "LS": "Lesotho", + "LT": "Lituanie", + "LU": "Luxembourg", + "LV": "Lettonie", + "LW": "", + "LX": "", + "LY": "Libye", + "LZ": "", + + "MA": "Maroc", + "MB": "", + "MC": "Monaco", + "MD": "Moldavie", + "ME": "Monténégro", + "MF": "Saint-Martin", + "MG": "Madagascar", + "MH": "Îles Marshall", + "MI": "", + "MJ": "", + "MK": "Macédoine", + "ML": "Mali", + "MM": "Myanmar", + "MN": "Mongolie", + "MO": "Macao", + "MP": "Îles Mariannes du Nord", + "MQ": "Martinique", + "MR": "Mauritanie", + "MS": "Montserrat", + "MT": "Malte", + "MU": "Maurice", + "MV": "Maldives", + "MW": "Malawi", + "MX": "Mexique", + "MY": "Malaisie", + "MZ": "Mozambique", + + "NA": "Namibie", + "NB": "", + "NC": "Nouvelle-Calédonie", + "ND": "", + "NE": "Niger", + "NF": "Île Norfolk", + "NG": "Nigeria", + "NH": "", + "NI": "Nicaragua", + "NJ": "", + "NK": "", + "NL": "Pays-Bas", + "NM": "", + "NN": "", + "NO": "Norvège", + "NP": "Népal", + "NQ": "", + "NR": "Nauru", + "NS": "", + "NT": "", + "NU": "Niue", + "NV": "", + "NW": "", + "NX": "", + "NY": "", + "NZ": "Nouvelle-Zélande", + + "OA": "", + "OB": "", + "OC": "", + "OD": "", + "OE": "", + "OF": "", + "OG": "", + "OH": "", + "OI": "", + "OJ": "", + "OK": "", + "OL": "", + "OM": "Oman", + "ON": "", + "OO": "", + "OP": "", + "OQ": "", + "OR": "", + "OS": "", + "OT": "", + "OU": "", + "OV": "", + "OW": "", + "OX": "", + "OY": "", + "OZ": "", + + "PA": "Panama", + "PB": "", + "PC": "", + "PD": "", + "PE": "Pérou", + "PF": "Polynésie française", + "PG": "Papouasie-Nouvelle-Guinée", + "PH": "Philippines", + "PI": "Philippines", + "PJ": "", + "PK": "Pakistan", + "PL": "Pologne", + "PM": "Saint-Pierre-et-Miquelon", + "PN": "Îles Pitcairn", + "PO": "", + "PP": "", + "PQ": "", + "PR": "Porto Rico", + "PS": "État de Palestine", + "PT": "Portugal", + "PU": "", + "PV": "", + "PW": "Palaos", + "PX": "", + "PY": "Paraguay", + "PZ": "", + + "QA": "Qatar", + "QB": "", + "QC": "", + "QD": "", + "QE": "", + "QF": "", + "QG": "", + "QH": "", + "QI": "", + "QJ": "", + "QK": "", + "QL": "", + "QM": "", + "QN": "", + "QO": "", + "QP": "", + "QQ": "", + "QR": "", + "QS": "", + "QT": "", + "QU": "", + "QV": "", + "QW": "", + "QX": "", + "QY": "", + "QZ": "", + + "RA": "Argentine", + "RB": "Bolivie; Botswana", + "RC": "Taïwan (République de Chine)", + "RD": "", + "RE": "La Réunion", + "RF": "", + "RG": "", + "RH": "Haïti", + "RI": "Indonésie", + "RJ": "", + "RK": "", + "RL": "Liban", + "RM": "Madagascar", + "RN": "Niger", + "RO": "Roumanie", + "RP": "Philippines", + "RQ": "", + "RR": "", + "RS": "Serbie", + "RT": "", + "RU": "Russie", + "RV": "", + "RW": "Rwanda", + "RX": "", + "RY": "", + "RZ": "", + + "SA": "Arabie saoudite", + "SB": "Salomon", + "SC": "Seychelles", + "SD": "Soudan", + "SE": "Suède", + "SF": "Finlande", + "SG": "Singapour", + "SH": "Sainte-Hélène, Ascension et Tristan da Cunha", + "SI": "Slovénie", + "SJ": "Svalbard et Jan Mayen", + "SK": "Slovaquie", + "SL": "Sierra Leone", + "SM": "Saint-Marin", + "SN": "Sénégal", + "SO": "Somalie", + "SP": "", + "SQ": "", + "SR": "Suriname", + "SS": "Soudan du Sud", + "ST": "Sao Tomé-et-Principe", + "SU": "Union des républiques socialistes soviétiques (URSS)", + "SV": "Salvador", + "SW": "", + "SX": "Saint-Martin", + "SY": "Syrie", + "SZ": "Swaziland", + + "TA": "Tristan da Cunha", + "TB": "", + "TC": "Îles Turks-et-Caïcos", + "TD": "Tchad", + "TE": "", + "TF": "Terres australes et antarctiques françaises", + "TG": "Togo", + "TH": "Thaïlande", + "TI": "", + "TJ": "Tadjikistan", + "TK": "Tokelau", + "TL": "Timor oriental", + "TM": "Turkménistan", + "TN": "Tunisie", + "TO": "Tonga", + "TP": "Timor oriental", + "TQ": "", + "TR": "Turquie", + "TS": "", + "TT": "Trinité-et-Tobago", + "TU": "", + "TV": "Tuvalu", + "TW": "Taïwan (République de Chine)", + "TX": "", + "TY": "", + "TZ": "Tanzanie", + + "UA": "Ukraine", + "UB": "", + "UC": "", + "UD": "", + "UE": "", + "UF": "", + "UG": "Ouganda", + "UH": "", + "UI": "", + "UJ": "", + "UK": "Royaume-Uni", + "UL": "", + "UM": "Îles mineures éloignées des États-Unis", + "UN": "", + "UO": "", + "UP": "", + "UQ": "", + "UR": "", + "US": "États-Unis d'Amérique (USA)", + "UT": "", + "UU": "", + "UV": "", + "UW": "", + "UX": "", + "UY": "Uruguay", + "UZ": "Ouzbékistan", + + "VA": "Vatican", + "VB": "", + "VC": "Saint-Vincent-et-les-Grenadines", + "VD": "", + "VE": "Venezuela", + "VF": "", + "VG": "Îles Vierges britanniques", + "VH": "", + "VI": "Îles Vierges des États-Unis", + "VJ": "", + "VK": "", + "VL": "", + "VM": "", + "VN": "Viêt Nam", + "VO": "", + "VP": "", + "VQ": "", + "VR": "", + "VS": "", + "VT": "", + "VU": "Vanuatu", + "VV": "", + "VW": "", + "VX": "", + "VY": "", + "VZ": "", + + "WA": "", + "WB": "", + "WC": "", + "WD": "", + "WE": "", + "WF": "Wallis-et-Futuna", + "WG": "Grenade", + "WH": "", + "WI": "", + "WJ": "", + "WK": "", + "WL": "Sainte-Lucie", + "WM": "", + "WN": "", + "WO": "", + "WP": "", + "WQ": "", + "WR": "", + "WS": "Samoa", + "WT": "", + "WU": "", + "WV": "Saint-Vincent-et-les-Grenadines", + "WW": "", + "WX": "", + "WY": "", + "WZ": "", + + "XA": "", + "XB": "", + "XC": "", + "XD": "", + "XE": "", + "XF": "", + "XG": "", + "XH": "", + "XI": "", + "XJ": "", + "XK": "Kosovo", + "XL": "", + "XM": "", + "XN": "", + "XO": "", + "XP": "", + "XQ": "", + "XR": "", + "XS": "", + "XT": "", + "XU": "", + "XV": "", + "XW": "", + "XX": "", + "XY": "", + "XZ": "", + + "YA": "", + "YB": "", + "YC": "", + "YD": "", + "YE": "Yémen", + "YF": "", + "YG": "", + "YH": "", + "YI": "", + "YJ": "", + "YK": "", + "YL": "", + "YM": "", + "YN": "", + "YO": "", + "YP": "", + "YQ": "", + "YR": "", + "YS": "", + "YT": "Mayotte", + "YU": "Yougoslavie", + "YV": "Venezuela", + "YW": "", + "YX": "", + "YY": "", + "YZ": "", + + "ZA": "Afrique du Sud", + "ZB": "", + "ZC": "", + "ZD": "", + "ZE": "", + "ZF": "", + "ZG": "", + "ZH": "", + "ZI": "", + "ZJ": "", + "ZK": "", + "ZL": "", + "ZM": "Zambie", + "ZN": "", + "ZO": "", + "ZP": "", + "ZQ": "", + "ZR": "Zaïre", + "ZS": "", + "ZT": "", + "ZU": "", + "ZV": "", + "ZW": "Zimbabwe", + "ZX": "", + "ZY": "", + "ZZ": "" + } +} diff --git a/www/sunders/i18n/countries/it.json b/www/sunders/i18n/countries/it.json new file mode 100644 index 0000000..d631e28 --- /dev/null +++ b/www/sunders/i18n/countries/it.json @@ -0,0 +1,708 @@ +{ + "texts": { + "xxx": "non ancora localizzato", + "--": "non in grado di localizzare", + + "AA": "", + "AB": "", + "AC": "Isola di Ascensione", + "AD": "Andorra", + "AE": "Emirati Arabi Uniti ", + "AF": "Afghanistan", + "AG": "Antigua e Barbuda", + "AH": "", + "AI": "Anguilla", + "AJ": "", + "AK": "", + "AL": "Albania", + "AM": "Armenia", + "AN": "Antille olandesi", + "AO": "Angola", + "AP": "", + "AQ": "Antartide", + "AR": "Argentina", + "AS": "Samoa Americane", + "AT": "Austria", + "AU": "Australia", + "AV": "", + "AW": "Aruba", + "AX": "Isole Åland", + "AY": "", + "AZ": "Azerbaigian", + + "BA": "Bosnia ed Erzegovina", + "BB": "Barbados", + "BC": "", + "BD": "Bangladesh", + "BE": "Belgio", + "BF": "Burkina Faso", + "BG": "Bulgaria", + "BH": "Bahrain", + "BI": "Burundi", + "BJ": "Benin", + "BK": "", + "BL": "Saint Barthélemy", + "BM": "Bermuda", + "BN": "Brunei", + "BO": "Bolivia", + "BP": "", + "BQ": "Paesi Bassi caraibici", + "BR": "Brasile", + "BS": "Bahamas", + "BT": "Bhutan", + "BU": "Burma (Birmania)", + "BV": "Isola Bouvet", + "BW": "Botswana", + "BX": "", + "BY": "Bielorussia", + "BZ": "Belize", + + "CA": "Canada", + "CB": "", + "CC": "Isole Cocos", + "CD": "Repubblica Democratica del Congo", + "CE": "", + "CF": "Repubblica Centrafricana", + "CG": "Repubblica del Congo", + "CH": "Svizzera", + "CI": "Costa d'Avorio", + "CJ": "", + "CK": "Isole Cook", + "CL": "Cile", + "CM": "Camerun", + "CN": "Repubblica Popolare Cinese", + "CO": "Colombia", + "CP": "Isola di Clipperton", + "CQ": "", + "CR": "Costa Rica", + "CS": "Cecoslovacchia,(Serbia e Montenegro)", + "CT": "", + "CU": "Cuba", + "CV": "Capo Verde", + "CW": "Curaçao", + "CX": "Isola di Natale", + "CY": "Cipro", + "CZ": "Repubblica Ceca", + + "DA": "", + "DB": "", + "DC": "", + "DD": "", + "DE": "Germania", + "DF": "", + "DG": "Diego Garcia", + "DH": "", + "DI": "", + "DJ": "Gibuti", + "DK": "Danimarca", + "DL": "", + "DM": "Dominica", + "DN": "", + "DO": "Repubblica Dominicana", + "DP": "", + "DQ": "", + "DR": "", + "DS": "", + "DT": "", + "DU": "", + "DV": "", + "DW": "", + "DX": "", + "DY": "Benin", + "DZ": "Algeria", + + "EA": "Melilla", + "EB": "", + "EC": "Ecuador", + "ED": "", + "EE": "Estonia", + "EF": "", + "EG": "Egitto", + "EH": "Sahara Occidentale", + "EI": "", + "EJ": "", + "EK": "", + "EL": "", + "EM": "", + "EN": "", + "EO": "", + "EP": "", + "EQ": "", + "ER": "Eritrea", + "ES": "Spagna", + "ET": "Etiopia", + "EU": "", + "EV": "", + "EW": "Estonia", + "EX": "", + "EY": "", + "EZ": "", + + "FA": "", + "FB": "", + "FC": "", + "FD": "", + "FE": "", + "FF": "", + "FG": "", + "FH": "", + "FI": "Finlandia", + "FJ": "Figi", + "FK": "Isole Falkland", + "FL": "Liechtenstein", + "FM": "Stati Federati di Micronesia", + "FN": "", + "FO": "Isole Faroe", + "FP": "", + "FQ": "", + "FR": "Francia", + "FS": "", + "FT": "", + "FU": "", + "FV": "", + "FW": "", + "FX": "", + "FY": "", + "FZ": "", + + "GA": "Gabon", + "GB": "Regno Unito", + "GC": "", + "GD": "Grenada", + "GE": "Georgia", + "GF": "Guiana francese", + "GG": "Guernsey", + "GH": "Ghana", + "GI": "Gibilterra", + "GJ": "", + "GK": "", + "GL": "Groenlandia", + "GM": "Gambia", + "GN": "Guinea", + "GO": "", + "GP": "Guadalupa", + "GQ": "Guinea Equatoriale", + "GR": "Grecia", + "GS": "Georgia del Sud e Isole Sandwich Austral", + "GT": "Guatemala", + "GU": "Guam", + "GV": "", + "GW": "Guinea-Bissau", + "GX": "", + "GY": "Guiana", + "GZ": "", + + "HA": "", + "HB": "", + "HC": "", + "HD": "", + "HE": "", + "HF": "", + "HG": "", + "HH": "", + "HI": "", + "HJ": "", + "HK": "Hong Kong", + "HL": "", + "HM": "Isole Heard e McDonald", + "HN": "Honduras", + "HO": "", + "HP": "", + "HQ": "", + "HR": "Croazia", + "HS": "", + "HT": "Haiti", + "HU": "Ungheria", + "HV": "", + "HW": "", + "HX": "", + "HY": "", + "HZ": "", + + "IA": "", + "IB": "", + "IC": "Isole Canarie", + "ID": "Indonesia", + "IE": "Irlanda", + "IF": "", + "IG": "", + "IH": "", + "II": "", + "IJ": "", + "IK": "", + "IL": "Israele", + "IM": "Isola di Man", + "IN": "India", + "IO": "Territorio britannico dell'Oceano Indiano", + "IP": "", + "IQ": "Iraq", + "IR": "Iran", + "IS": "Islanda", + "IT": "Italia", + "IU": "", + "IV": "", + "IW": "", + "IX": "", + "IY": "", + "IZ": "", + + "JA": "Giamaica", + "JB": "", + "JC": "", + "JD": "", + "JE": "Jersey", + "JF": "", + "JG": "", + "JH": "", + "JI": "", + "JJ": "", + "JK": "", + "JL": "", + "JM": "Giamaica", + "JN": "", + "JO": "Giordania", + "JP": "Giappone", + "JQ": "", + "JR": "", + "JS": "", + "JT": "", + "JU": "", + "JV": "", + "JW": "", + "JX": "", + "JY": "", + "JZ": "", + + "KA": "", + "KB": "", + "KC": "", + "KD": "", + "KE": "Kenya", + "KF": "", + "KG": "Kirghizistan", + "KH": "Cambogia", + "KI": "Kiribati", + "KJ": "", + "KK": "", + "KL": "", + "KM": "Comoros", + "KN": "Saint Kitts e Nevis", + "KO": "", + "KP": "Corea del Nord", + "KQ": "", + "KR": "Corea del Sud", + "KS": "", + "KT": "", + "KU": "", + "KV": "", + "KW": "Kuwait", + "KX": "", + "KY": "Isole Cayman", + "KZ": "Kazakhstan", + + "LA": "Laos", + "LB": "Libano", + "LC": "Saint Lucia", + "LD": "", + "LE": "", + "LF": "", + "LG": "", + "LH": "", + "LI": "Liechtenstein", + "LJ": "", + "LK": "Sri Lanka", + "LL": "", + "LM": "", + "LN": "", + "LO": "", + "LP": "", + "LQ": "", + "LR": "Liberia", + "LS": "Lesotho", + "LT": "Lithuania", + "LU": "Lussemburgo", + "LV": "Latvia", + "LW": "", + "LX": "", + "LY": "Libya", + "LZ": "", + + "MA": "Morocco", + "MB": "", + "MC": "Monaco", + "MD": "Moldova", + "ME": "Montenegro", + "MF": "Saint Martin", + "MG": "Madagascar", + "MH": "Isole Marshall", + "MI": "", + "MJ": "", + "MK": "Macedonia", + "ML": "Mali", + "MM": "Birmania", + "MN": "Mongolia", + "MO": "Macau", + "MP": "Isole Marianne Settentrionali", + "MQ": "Martinica", + "MR": "Mauritania", + "MS": "Montserrat", + "MT": "Malta", + "MU": "Mauritius", + "MV": "Maldive", + "MW": "Malawi", + "MX": "Messico", + "MY": "Malaysia", + "MZ": "Mozambico", + + "NA": "Namibia", + "NB": "", + "NC": "Nuova Caledonia", + "ND": "", + "NE": "Niger", + "NF": "Isola Norfolk", + "NG": "Nigeria", + "NH": "", + "NI": "Nicaragua", + "NJ": "", + "NK": "", + "NL": "Paesi Bassi/Olanda", + "NM": "", + "NN": "", + "NO": "Norvegia", + "NP": "Nepal", + "NQ": "", + "NR": "Nauru", + "NS": "", + "NT": "", + "NU": "Niue", + "NV": "", + "NW": "", + "NX": "", + "NY": "", + "NZ": "Nuova Zelanda", + + "OA": "", + "OB": "", + "OC": "", + "OD": "", + "OE": "", + "OF": "", + "OG": "", + "OH": "", + "OI": "", + "OJ": "", + "OK": "", + "OL": "", + "OM": "Oman", + "ON": "", + "OO": "", + "OP": "", + "OQ": "", + "OR": "", + "OS": "", + "OT": "", + "OU": "", + "OV": "", + "OW": "", + "OX": "", + "OY": "", + "OZ": "", + + "PA": "Panama", + "PB": "", + "PC": "", + "PD": "", + "PE": "Perù", + "PF": "Polinesia francese", + "PG": "Papua Nuova Guinea", + "PH": "Filippine", + "PI": "Filippine", + "PJ": "", + "PK": "Pakistan", + "PL": "Polonia", + "PM": "Saint-Pierre e Miquelon", + "PN": "Isole Pitcairn", + "PO": "", + "PP": "", + "PQ": "", + "PR": "Porto Rico", + "PS": "Stato di Palestina", + "PT": "Portogallo", + "PU": "", + "PV": "", + "PW": "Palau", + "PX": "", + "PY": "Paraguay", + "PZ": "", + + "QA": "Qatar", + "QB": "", + "QC": "", + "QD": "", + "QE": "", + "QF": "", + "QG": "", + "QH": "", + "QI": "", + "QJ": "", + "QK": "", + "QL": "", + "QM": "", + "QN": "", + "QO": "", + "QP": "", + "QQ": "", + "QR": "", + "QS": "", + "QT": "", + "QU": "", + "QV": "", + "QW": "", + "QX": "", + "QY": "", + "QZ": "", + + "RA": "Argentina", + "RB": "Bolivia; Botswana", + "RC": "Taiwan/Formosa (Repubblica Cinese)", + "RD": "", + "RE": "Réunion", + "RF": "", + "RG": "", + "RH": "Haiti", + "RI": "Indonesia", + "RJ": "", + "RK": "", + "RL": "Libano", + "RM": "Madagascar", + "RN": "Niger", + "RO": "Romania", + "RP": "Filippine", + "RQ": "", + "RR": "", + "RS": "Serbia", + "RT": "", + "RU": "Russia", + "RV": "", + "RW": "Ruanda", + "RX": "", + "RY": "", + "RZ": "", + + "SA": "Saudi Arabia", + "SB": "Solomon Islands", + "SC": "Seychelles", + "SD": "Sudan", + "SE": "Svezia", + "SF": "Finlandia", + "SG": "Singapore", + "SH": "Sant'Elena, Ascensione e Tristan da Cunha", + "SI": "Slovenia", + "SJ": "Svalbard e Jan Mayen", + "SK": "Slovacchia", + "SL": "Sierra Leone", + "SM": "San Marino", + "SN": "Senegal", + "SO": "Somalia", + "SP": "", + "SQ": "", + "SR": "Suriname", + "SS": "Sudandel Sud", + "ST": "São Tomé e Príncipe", + "SU": "Unione delle Repubbliche Socialiste Sovietiche (URSS)", + "SV": "El Salvador", + "SW": "", + "SX": "Sint Maarten", + "SY": "Siria", + "SZ": "Swaziland", + + "TA": "Tristan da Cunha", + "TB": "", + "TC": "Turks e Caicos", + "TD": "Ciad", + "TE": "", + "TF": "Terre australi e antartiche francesi", + "TG": "Togo", + "TH": "Thailandia", + "TI": "", + "TJ": "Tagikistan", + "TK": "Tokelau", + "TL": "Timor Orientale", + "TM": "Turkmenistan", + "TN": "Tunisia", + "TO": "Tonga", + "TP": "Timor Orientale", + "TQ": "", + "TR": "Turchia", + "TS": "", + "TT": "Trinidad e Tobago", + "TU": "", + "TV": "Tuvalu", + "TW": "Taiwan/Formosa (Repubblica Cinese)", + "TX": "", + "TY": "", + "TZ": "Tanzania", + + "UA": "Ucraina", + "UB": "", + "UC": "", + "UD": "", + "UE": "", + "UF": "", + "UG": "Uganda", + "UH": "", + "UI": "", + "UJ": "", + "UK": "Regno Unito", + "UL": "", + "UM": "Isole Minori Esterne degli Stati Uniti d'America", + "UN": "", + "UO": "", + "UP": "", + "UQ": "", + "UR": "", + "US": "Stati Uniti d'America (USA)", + "UT": "", + "UU": "", + "UV": "", + "UW": "", + "UX": "", + "UY": "Uruguay", + "UZ": "Uzbekistan", + + "VA": "Città del Vaticano", + "VB": "", + "VC": "Saint Vincent e Grenadine", + "VD": "", + "VE": "Venezuela", + "VF": "", + "VG": "Isole Vergini britanniche", + "VH": "", + "VI": "Isole Vergini americane", + "VJ": "", + "VK": "", + "VL": "", + "VM": "", + "VN": "Vietnam", + "VO": "", + "VP": "", + "VQ": "", + "VR": "", + "VS": "", + "VT": "", + "VU": "Vanuatu", + "VV": "", + "VW": "", + "VX": "", + "VY": "", + "VZ": "", + + "WA": "", + "WB": "", + "WC": "", + "WD": "", + "WE": "", + "WF": "Wallis e Futuna", + "WG": "Grenada", + "WH": "", + "WI": "", + "WJ": "", + "WK": "", + "WL": "Saint Lucia", + "WM": "", + "WN": "", + "WO": "", + "WP": "", + "WQ": "", + "WR": "", + "WS": "Samoa", + "WT": "", + "WU": "", + "WV": "Saint Vincent e Grenadine", + "WW": "", + "WX": "", + "WY": "", + "WZ": "", + + "XA": "", + "XB": "", + "XC": "", + "XD": "", + "XE": "", + "XF": "", + "XG": "", + "XH": "", + "XI": "", + "XJ": "", + "XK": "Kosovo", + "XL": "", + "XM": "", + "XN": "", + "XO": "", + "XP": "", + "XQ": "", + "XR": "", + "XS": "", + "XT": "", + "XU": "", + "XV": "", + "XW": "", + "XX": "", + "XY": "", + "XZ": "", + + "YA": "", + "YB": "", + "YC": "", + "YD": "", + "YE": "Yemen", + "YF": "", + "YG": "", + "YH": "", + "YI": "", + "YJ": "", + "YK": "", + "YL": "", + "YM": "", + "YN": "", + "YO": "", + "YP": "", + "YQ": "", + "YR": "", + "YS": "", + "YT": "Mayotte", + "YU": "Jugoslavia", + "YV": "Venezuela", + "YW": "", + "YX": "", + "YY": "", + "YZ": "", + + "ZA": "Sudafrica", + "ZB": "", + "ZC": "", + "ZD": "", + "ZE": "", + "ZF": "", + "ZG": "", + "ZH": "", + "ZI": "", + "ZJ": "", + "ZK": "", + "ZL": "", + "ZM": "Zambia", + "ZN": "", + "ZO": "", + "ZP": "", + "ZQ": "", + "ZR": "Zaire", + "ZS": "", + "ZT": "", + "ZU": "", + "ZV": "", + "ZW": "Zimbabwe", + "ZX": "", + "ZY": "", + "ZZ": "" + } +} diff --git a/www/sunders/i18n/countries/ru.json b/www/sunders/i18n/countries/ru.json new file mode 100644 index 0000000..af0b05d --- /dev/null +++ b/www/sunders/i18n/countries/ru.json @@ -0,0 +1,708 @@ +{ + "texts": { + "xxx": "еще не локализованы", + "--": "не удалось локализовать", + + "AA": "", + "AB": "", + "AC": "Остров Вознесения", + "AD": "Андорра", + "AE": "Объединённые Арабские Эмираты", + "AF": "Афганистан", + "AG": "Антигуа и Барбуда", + "AH": "", + "AI": "Ангилья", + "AJ": "", + "AK": "", + "AL": "Албания", + "AM": "Армения", + "AN": "Нидерландские Антильские острова", + "AO": "Ангола", + "AP": "", + "AQ": "Антарктида", + "AR": "Аргентина", + "AS": "Американское Самоа", + "AT": "Австрия", + "AU": "Австралия", + "AV": "", + "AW": "Аруба", + "AX": "Аландские острова", + "AY": "", + "AZ": "Азербайджан", + + "BA": "Босния и Герцеговина", + "BB": "Барбадос", + "BC": "", + "BD": "Бангладеш", + "BE": "Бельгия", + "BF": "Буркина-Фасо", + "BG": "Болгария", + "BH": "Бахрейн", + "BI": "Бурунди", + "BJ": "Бенин", + "BK": "", + "BL": "Сен-Бартелеми", + "BM": "Бермудские Острова", + "BN": "Бруней", + "BO": "Боливия", + "BP": "", + "BQ": "Бонайре, Синт-Эстатиус и Саба", + "BR": "Бразилия", + "BS": "Багамские Острова", + "BT": "Бутан", + "BU": "Бирма (Мьянма)", + "BV": "Остров Буве", + "BW": "Ботсвана", + "BX": "", + "BY": "Белоруссия", + "BZ": "Белиз", + + "CA": "Канада", + "CB": "", + "CC": "Кокосовые острова", + "CD": "Демократическая Республика Конго", + "CE": "", + "CF": "Центральноафриканская Республика", + "CG": "Республика Конго", + "CH": "Швейцария", + "CI": "Кот-д’Ивуар", + "CJ": "", + "CK": "Острова Кука", + "CL": "Чили", + "CM": "Камерун", + "CN": "Китайская Народная Республика", + "CO": "Колумбия", + "CP": "Клиппертон", + "CQ": "", + "CR": "Коста-Рика", + "CS": "Чехословакия (Сербия и Черногория)", + "CT": "", + "CU": "Куба", + "CV": "Кабо-Верде", + "CW": "Кюрасао", + "CX": "Остров Рождества", + "CY": "Кипр", + "CZ": "Чешская Республика", + + "DA": "", + "DB": "", + "DC": "", + "DD": "", + "DE": "Германия", + "DF": "", + "DG": "Диего-Гарсия", + "DH": "", + "DI": "", + "DJ": "Джибути", + "DK": "Дания", + "DL": "", + "DM": "Доминика", + "DN": "", + "DO": "Доминиканская Республика", + "DP": "", + "DQ": "", + "DR": "", + "DS": "", + "DT": "", + "DU": "", + "DV": "", + "DW": "", + "DX": "", + "DY": "Бени́н", + "DZ": "Алжир", + + "EA": "Мелилья", + "EB": "", + "EC": "Эквадор", + "ED": "", + "EE": "Эстония", + "EF": "", + "EG": "Египет", + "EH": "Западная Сахара", + "EI": "", + "EJ": "", + "EK": "", + "EL": "", + "EM": "", + "EN": "", + "EO": "", + "EP": "", + "EQ": "", + "ER": "Эритрея", + "ES": "Испания", + "ET": "Эфиопия", + "EU": "", + "EV": "", + "EW": "Эстония", + "EX": "", + "EY": "", + "EZ": "", + + "FA": "", + "FB": "", + "FC": "", + "FD": "", + "FE": "", + "FF": "", + "FG": "", + "FH": "", + "FI": "Финляндия", + "FJ": "Фиджи", + "FK": "Фолклендские острова", + "FL": "Лихтенштейн", + "FM": "Федеративные Штаты Микронезии", + "FN": "", + "FO": "Фарерские острова", + "FP": "", + "FQ": "", + "FR": "Франция", + "FS": "", + "FT": "", + "FU": "", + "FV": "", + "FW": "", + "FX": "", + "FY": "", + "FZ": "", + + "GA": "Габон", + "GB": "Великобритания", + "GC": "", + "GD": "Гренада", + "GE": "Грузия", + "GF": "Гвиана (департамент Франции)", + "GG": "Гернси", + "GH": "Гана", + "GI": "Гибралтар", + "GJ": "", + "GK": "", + "GL": "Гренландия", + "GM": "Гамбия", + "GN": "Гвинея", + "GO": "", + "GP": "Гваделупа", + "GQ": "Экваториальная Гвинея", + "GR": "Греция", + "GS": "Южная Георгия и Южные Сандвичевы Острова", + "GT": "Гватемала", + "GU": "Гуам", + "GV": "", + "GW": "Гвинея-Бисау", + "GX": "", + "GY": "Гайана", + "GZ": "", + + "HA": "", + "HB": "", + "HC": "", + "HD": "", + "HE": "", + "HF": "", + "HG": "", + "HH": "", + "HI": "", + "HJ": "", + "HK": "Гонконг", + "HL": "", + "HM": "Остров Херд и острова Макдональд", + "HN": "Гондурас", + "HO": "", + "HP": "", + "HQ": "", + "HR": "Хорватия", + "HS": "", + "HT": "Гаити", + "HU": "Венгрия", + "HV": "", + "HW": "", + "HX": "", + "HY": "", + "HZ": "", + + "IA": "", + "IB": "", + "IC": "Канарские острова", + "ID": "Индонезия", + "IE": "Ирландия", + "IF": "", + "IG": "", + "IH": "", + "II": "", + "IJ": "", + "IK": "", + "IL": "Израиль", + "IM": "Остров Мэн", + "IN": "Индия", + "IO": "Британская Территория в Индийском Океане", + "IP": "", + "IQ": "Ирак", + "IR": "Иран", + "IS": "Исландия", + "IT": "Италия", + "IU": "", + "IV": "", + "IW": "", + "IX": "", + "IY": "", + "IZ": "", + + "JA": "Ямайка", + "JB": "", + "JC": "", + "JD": "", + "JE": "Джерси", + "JF": "", + "JG": "", + "JH": "", + "JI": "", + "JJ": "", + "JK": "", + "JL": "", + "JM": "Ямайка", + "JN": "", + "JO": "Иордания", + "JP": "Япония", + "JQ": "", + "JR": "", + "JS": "", + "JT": "", + "JU": "", + "JV": "", + "JW": "", + "JX": "", + "JY": "", + "JZ": "", + + "KA": "", + "KB": "", + "KC": "", + "KD": "", + "KE": "Кения", + "KF": "", + "KG": "Киргизия", + "KH": "Камбоджа", + "KI": "Кирибати", + "KJ": "", + "KK": "", + "KL": "", + "KM": "Коморы", + "KN": "Сент-Китс и Невис", + "KO": "", + "KP": "Корейская Народно-Демократическая Республика", + "KQ": "", + "KR": "Республика Корея", + "KS": "", + "KT": "", + "KU": "", + "KV": "", + "KW": "Кувейт", + "KX": "", + "KY": "Острова Кайман", + "KZ": "Казахстан", + + "LA": "Лаос", + "LB": "Ливан", + "LC": "Сент-Люсия", + "LD": "", + "LE": "", + "LF": "", + "LG": "", + "LH": "", + "LI": "Лихтенштейн", + "LJ": "", + "LK": "Шри-Ланка", + "LL": "", + "LM": "", + "LN": "", + "LO": "", + "LP": "", + "LQ": "", + "LR": "Либерия", + "LS": "Лесото", + "LT": "Литва", + "LU": "Люксембург", + "LV": "Латвия", + "LW": "", + "LX": "", + "LY": "Ливия", + "LZ": "", + + "MA": "Марокко", + "MB": "", + "MC": "Монако", + "MD": "Молдавия", + "ME": "Черногория", + "MF": "Сен-Мартен", + "MG": "Мадагаскар", + "MH": "Маршалловы Острова", + "MI": "", + "MJ": "", + "MK": "Македония", + "ML": "Мали", + "MM": "Мьянма", + "MN": "Монголия", + "MO": "Макао", + "MP": "Северные Марианские Острова", + "MQ": "Мартиника", + "MR": "Мавритания", + "MS": "Монтсеррат", + "MT": "Мальта", + "MU": "Маврикий", + "MV": "Мальдивы", + "MW": "Малави", + "MX": "Мексика", + "MY": "Малайзия", + "MZ": "Мозамбик", + + "NA": "Намибия", + "NB": "", + "NC": "Каледония", + "ND": "", + "NE": "Нигер", + "NF": "Остров Норфолк", + "NG": "Нигерия", + "NH": "", + "NI": "Никарагуа", + "NJ": "", + "NK": "", + "NL": "Нидерланды", + "NM": "", + "NN": "", + "NO": "Норвегия", + "NP": "Непал", + "NQ": "", + "NR": "Науру", + "NS": "", + "NT": "", + "NU": "Ниуэ", + "NV": "", + "NW": "", + "NX": "", + "NY": "", + "NZ": "Новая Зеландия", + + "OA": "", + "OB": "", + "OC": "", + "OD": "", + "OE": "", + "OF": "", + "OG": "", + "OH": "", + "OI": "", + "OJ": "", + "OK": "", + "OL": "", + "OM": "Оман", + "ON": "", + "OO": "", + "OP": "", + "OQ": "", + "OR": "", + "OS": "", + "OT": "", + "OU": "", + "OV": "", + "OW": "", + "OX": "", + "OY": "", + "OZ": "", + + "PA": "Панама", + "PB": "", + "PC": "", + "PD": "", + "PE": "Перу", + "PF": "Французская Полинезия", + "PG": "Папуа — Новая Гвинея", + "PH": "Филиппины", + "PI": "Филиппины", + "PJ": "", + "PK": "Пакистан", + "PL": "Польша", + "PM": "Сен-Пьер и Микелон", + "PN": "Острова Питкэрн", + "PO": "", + "PP": "", + "PQ": "", + "PR": "Пуэрто-Рико", + "PS": "Государство Палестина", + "PT": "Португалия", + "PU": "", + "PV": "", + "PW": "Палау", + "PX": "", + "PY": "Парагвай", + "PZ": "", + + "QA": "Катар", + "QB": "", + "QC": "", + "QD": "", + "QE": "", + "QF": "", + "QG": "", + "QH": "", + "QI": "", + "QJ": "", + "QK": "", + "QL": "", + "QM": "", + "QN": "", + "QO": "", + "QP": "", + "QQ": "", + "QR": "", + "QS": "", + "QT": "", + "QU": "", + "QV": "", + "QW": "", + "QX": "", + "QY": "", + "QZ": "", + + "RA": "Аргентина", + "RB": "Боливия; Ботсвана", + "RC": "Тайва́нь (Китайская Республика)", + "RD": "", + "RE": "Реюньон", + "RF": "", + "RG": "", + "RH": "Республика Гаити", + "RI": "Индонезия", + "RJ": "", + "RK": "", + "RL": "Ливан", + "RM": "Мадагаскар", + "RN": "Нигер", + "RO": "Румыния", + "RP": "Филиппины", + "RQ": "", + "RR": "", + "RS": "Сербия", + "RT": "", + "RU": "Россия", + "RV": "", + "RW": "Руанда", + "RX": "", + "RY": "", + "RZ": "", + + "SA": "Саудовская Аравия", + "SB": "Соломоновы Острова", + "SC": "Сейшельские Острова", + "SD": "Судан", + "SE": "Швеция", + "SF": "Финляндия", + "SG": "Сингапур", + "SH": "Острова Святой Елены, Вознесения и Тристан-да-Кунья", + "SI": "Словения", + "SJ": "Шпицберген и Ян-Майен", + "SK": "Словакия", + "SL": "Сьерра-Леоне", + "SM": "Сан-Марино", + "SN": "Сенегал", + "SO": "Сомали", + "SP": "", + "SQ": "", + "SR": "Суринам", + "SS": "Южный Судан", + "ST": "Сан-Томе и Принсипи", + "SU": "Союз Советских Социалистических Республик (СССР)", + "SV": "Сальвадор", + "SW": "", + "SX": "Синт-Мартен", + "SY": "Сирия", + "SZ": "Свазиленд", + + "TA": "Тристан-да-Кунья", + "TB": "", + "TC": "Теркс и Кайкос", + "TD": "Чад", + "TE": "", + "TF": "Французские Южные и Антарктические территории", + "TG": "Того", + "TH": "Таиланд", + "TI": "", + "TJ": "Таджикистан", + "TK": "Токелау", + "TL": "Восточный Тимор", + "TM": "Туркмения", + "TN": "Тунис", + "TO": "Тонга", + "TP": "Восточный Тимор", + "TQ": "", + "TR": "Турция", + "TS": "", + "TT": "Тринидад и Тобаго", + "TU": "", + "TV": "Тувалу", + "TW": "Тайва́нь (Китайская Республика)", + "TX": "", + "TY": "", + "TZ": "Танзания", + + "UA": "Украина", + "UB": "", + "UC": "", + "UD": "", + "UE": "", + "UF": "", + "UG": "Уганда", + "UH": "", + "UI": "", + "UJ": "", + "UK": "Соединённое Королевство", + "UL": "", + "UM": "Внешние малые острова США", + "UN": "", + "UO": "", + "UP": "", + "UQ": "", + "UR": "", + "US": "Соединённые Шта́ты Аме́рики (США)", + "UT": "", + "UU": "", + "UV": "", + "UW": "", + "UX": "", + "UY": "Уругвай", + "UZ": "Узбекистан", + + "VA": "Ватикан", + "VB": "", + "VC": "Сент-Винсент и Гренадины", + "VD": "", + "VE": "Венесуэла", + "VF": "", + "VG": "Виргинские Острова (Великобритания)", + "VH": "", + "VI": "Виргинские Острова (США)", + "VJ": "", + "VK": "", + "VL": "", + "VM": "", + "VN": "Вьетнам", + "VO": "", + "VP": "", + "VQ": "", + "VR": "", + "VS": "", + "VT": "", + "VU": "Вануату", + "VV": "", + "VW": "", + "VX": "", + "VY": "", + "VZ": "", + + "WA": "", + "WB": "", + "WC": "", + "WD": "", + "WE": "", + "WF": "Уоллис и Футуна", + "WG": "Гренада", + "WH": "", + "WI": "", + "WJ": "", + "WK": "", + "WL": "Сент-Люсия", + "WM": "", + "WN": "", + "WO": "", + "WP": "", + "WQ": "", + "WR": "", + "WS": "Самоа", + "WT": "", + "WU": "", + "WV": "Сент-Винсент и Гренадины", + "WW": "", + "WX": "", + "WY": "", + "WZ": "", + + "XA": "", + "XB": "", + "XC": "", + "XD": "", + "XE": "", + "XF": "", + "XG": "", + "XH": "", + "XI": "", + "XJ": "", + "XK": "Косово", + "XL": "", + "XM": "", + "XN": "", + "XO": "", + "XP": "", + "XQ": "", + "XR": "", + "XS": "", + "XT": "", + "XU": "", + "XV": "", + "XW": "", + "XX": "", + "XY": "", + "XZ": "", + + "YA": "", + "YB": "", + "YC": "", + "YD": "", + "YE": "Йемен", + "YF": "", + "YG": "", + "YH": "", + "YI": "", + "YJ": "", + "YK": "", + "YL": "", + "YM": "", + "YN": "", + "YO": "", + "YP": "", + "YQ": "", + "YR": "", + "YS": "", + "YT": "Майотта", + "YU": "Югославия", + "YV": "Венесуэла", + "YW": "", + "YX": "", + "YY": "", + "YZ": "", + + "ZA": "Ю́жная А́фрика", + "ZB": "", + "ZC": "", + "ZD": "", + "ZE": "", + "ZF": "", + "ZG": "", + "ZH": "", + "ZI": "", + "ZJ": "", + "ZK": "", + "ZL": "", + "ZM": "Замбия", + "ZN": "", + "ZO": "", + "ZP": "", + "ZQ": "", + "ZR": "Заир", + "ZS": "", + "ZT": "", + "ZU": "", + "ZV": "", + "ZW": "Зимбабве", + "ZX": "", + "ZY": "", + "ZZ": "" + } +} diff --git a/www/sunders/i18n/credits/de.json b/www/sunders/i18n/credits/de.json new file mode 100644 index 0000000..9c77683 --- /dev/null +++ b/www/sunders/i18n/credits/de.json @@ -0,0 +1,11 @@ +{ + "texts": { + "title-credits": "Danksagungen & Lizenzen", + "type-idea": "Idee und Codebasis", + "type-js": "Javascipt-Erweiterungen", + "type-map": "Karte und Daten zu Überwachungseinträgen", + "type-service": "Webdienste", + "type-icon": "Symbole", + "type-font": "Schriftart für Überschriften" + } +} diff --git a/www/sunders/i18n/credits/en.json b/www/sunders/i18n/credits/en.json new file mode 100644 index 0000000..d066625 --- /dev/null +++ b/www/sunders/i18n/credits/en.json @@ -0,0 +1,11 @@ +{ + "texts": { + "title-credits": "Credits & Licenses", + "type-idea": "Idea and code base", + "type-js": "Javascript plugins", + "type-map": "Map and surveillance node data", + "type-service": "Web services", + "type-icon": "Icons", + "type-font": "Font for titles" + } +} diff --git a/www/sunders/i18n/credits/es.json b/www/sunders/i18n/credits/es.json new file mode 100644 index 0000000..525c33c --- /dev/null +++ b/www/sunders/i18n/credits/es.json @@ -0,0 +1,11 @@ +{ + "texts": { + "title-credits": "Agradecimientos & Licencias", + "type-idea": "Idea e código base", + "type-js": "Javascript complementos", + "type-map": "Mapa e datos de nodos de vigilancia", + "type-service": "Servicios web", + "type-icon": "Iconos", + "type-font": "Tipo de letra en títulos" + } +} diff --git a/www/sunders/i18n/credits/fr.json b/www/sunders/i18n/credits/fr.json new file mode 100644 index 0000000..1f783a9 --- /dev/null +++ b/www/sunders/i18n/credits/fr.json @@ -0,0 +1,11 @@ +{ + "texts": { + "title-credits": "Attributions & Licences", + "type-idea": "Idée et base du code", + "type-js": "Plugins Javascript", + "type-map": "Carte et données des noeuds de surveillance", + "type-service": "Services Web", + "type-icon": "Icônes", + "type-font": "Police pour les titres" + } +} diff --git a/www/sunders/i18n/credits/it.json b/www/sunders/i18n/credits/it.json new file mode 100644 index 0000000..56c0124 --- /dev/null +++ b/www/sunders/i18n/credits/it.json @@ -0,0 +1,11 @@ +{ + "texts": { + "title-credits": "Attribuzioni & Licenze", + "type-idea": "Idea e code base", + "type-js": "Javascript plugin", + "type-map": "Mappa e dati dei nodi di sorveglianza", + "type-service": "Servizi web", + "type-icon": "Icone", + "type-font": "Caratteri per titoli" + } +} diff --git a/www/sunders/i18n/credits/ru.json b/www/sunders/i18n/credits/ru.json new file mode 100644 index 0000000..73b04c1 --- /dev/null +++ b/www/sunders/i18n/credits/ru.json @@ -0,0 +1,11 @@ +{ + "texts": { + "title-credits": "", + "type-idea": "", + "type-js": "", + "type-map": "", + "type-service": "", + "type-icon": "", + "type-font": "" + } +} diff --git a/www/sunders/i18n/links/de.json b/www/sunders/i18n/links/de.json new file mode 100644 index 0000000..912b039 --- /dev/null +++ b/www/sunders/i18n/links/de.json @@ -0,0 +1,17 @@ +{ + "texts": { + "eng": "Englisch", + "fra": "Französisch", + "ger": "Deutsch", + "sect-2015": "2015", + "sect-2016": "2016", + "sect-2017": "2017", + "sect-2018": "2018", + "sect-2019": "2019", + "sect-2020": "2020", + "sect-2021": "2021", + "sect-2022": "2022", + "secure-alt": "Sichere Verbindung", + "insecure-alt": "Unsichere Verbindung!" + } +} diff --git a/www/sunders/i18n/links/en.json b/www/sunders/i18n/links/en.json new file mode 100644 index 0000000..cedf046 --- /dev/null +++ b/www/sunders/i18n/links/en.json @@ -0,0 +1,17 @@ +{ + "texts": { + "eng": "English", + "fra": "French", + "ger": "German", + "sect-2015": "2015", + "sect-2016": "2016", + "sect-2017": "2017", + "sect-2018": "2018", + "sect-2019": "2019", + "sect-2020": "2020", + "sect-2021": "2021", + "sect-2022": "2022", + "secure-alt": "Secure connection", + "insecure-alt": "Insecure connection!" + } +} diff --git a/www/sunders/i18n/links/es.json b/www/sunders/i18n/links/es.json new file mode 100644 index 0000000..28e4e69 --- /dev/null +++ b/www/sunders/i18n/links/es.json @@ -0,0 +1,17 @@ +{ + "texts": { + "eng": "Ingles", + "fra": "Francés", + "ger": "Alemán", + "sect-2015": "2015", + "sect-2016": "2016", + "sect-2017": "2017", + "sect-2018": "2018", + "sect-2019": "2019", + "sect-2020": "2020", + "sect-2021": "2021", + "sect-2022": "2022", + "secure-alt": "", + "insecure-alt": "" + } +} diff --git a/www/sunders/i18n/links/fr.json b/www/sunders/i18n/links/fr.json new file mode 100644 index 0000000..28ff792 --- /dev/null +++ b/www/sunders/i18n/links/fr.json @@ -0,0 +1,17 @@ +{ + "texts": { + "eng": "Anglais", + "fra": "Français", + "ger": "Allemand", + "sect-2015": "2015", + "sect-2016": "2016", + "sect-2017": "2017", + "sect-2018": "2018", + "sect-2019": "2019", + "sect-2020": "2020", + "sect-2021": "2021", + "sect-2022": "2022", + "secure-alt": "Raccordement sûr", + "insecure-alt": "Raccordement peu sûr!" + } +} diff --git a/www/sunders/i18n/links/it.json b/www/sunders/i18n/links/it.json new file mode 100644 index 0000000..d86821f --- /dev/null +++ b/www/sunders/i18n/links/it.json @@ -0,0 +1,17 @@ +{ + "texts": { + "eng": "English", + "fra": "French", + "ger": "German", + "sect-2015": "2015", + "sect-2016": "2016", + "sect-2017": "2017", + "sect-2018": "2018", + "sect-2019": "2019", + "sect-2020": "2020", + "sect-2021": "2021", + "sect-2022": "2022", + "secure-alt": "Connessione sicura", + "insecure-alt": "Connessione non sicura!" + } +} diff --git a/www/sunders/i18n/links/ru.json b/www/sunders/i18n/links/ru.json new file mode 100644 index 0000000..e1265af --- /dev/null +++ b/www/sunders/i18n/links/ru.json @@ -0,0 +1,17 @@ +{ + "texts": { + "eng": "", + "fra": "", + "ger": "", + "sect-2015": "2015", + "sect-2016": "2016", + "sect-2017": "2017", + "sect-2018": "2018", + "sect-2019": "2019", + "sect-2020": "2020", + "sect-2021": "2021", + "sect-2022": "2022", + "secure-alt": "", + "insecure-alt": "" + } +} diff --git a/www/sunders/i18n/manual/de.json b/www/sunders/i18n/manual/de.json new file mode 100644 index 0000000..c41f4fc --- /dev/null +++ b/www/sunders/i18n/manual/de.json @@ -0,0 +1,84 @@ +{ + "texts": { + "title-icon": "Notwendig, um ein Symbol auf der Karte anzuzeigen", + "k-manmade": "@@LT00", + "k-surveillance": "@@LT00", + "k-surv-type": "@@LT00", + "k-cam-type": "@@LT00", + "v-surveillance": "@@LT00 (Überwachung)", + "v-public": "public (öffentlich)", + "v-outdoor": "outdoor (außen)", + "v-indoor": "indoor (in einem Gebäude)", + "v-camera": "camera (Kamera)", + "v-fixed": "fixed (feststehend)", + "v-panning": "panning (schwenkbar)", + "v-dome": "dome (Kuppel)", + "v-guard": "guard (Wachpersonal)", + "v-alpr": "ALPR (AKLS)", + "icon-public-alt": "Überwachung öffentlicher Bereiche", + "icon-outdoor-alt": "Überwachung außerhalb eines Gebäudes", + "icon-indoor-alt": "Überwachung innerhalb eines Gebäudes", + "icon-cam-alt": "Kamera", + "icon-fixed-alt": "Feststehende Kamera", + "icon-panning-alt": "Schwenkbare Kamera", + "icon-dome-alt": "Kuppelkamera", + "icon-guard-alt": "Wachpersonal", + "icon-alpr-alt": "Automatische Kennzeichenlesesysteme", + "title-view-fixed": "Notwendig, zum Anzeigen des feststehenden Kamerablickfelds", + "title-view-dome": "Notwendig, zum Anzeigen des Kuppelkamerablickfelds", + "k-cam-direction": "@@LT00", + "k-cam-angle": "@@LT00", + "k-height": "@@LT00", + "v-direction-0": "0 - 359 (in Grad) oder", + "v-direction-1": "N / NE / E / SE / S / SW / W / NW", + "v-direction-2": "z.B. für wandmontierte Kuppeln", + "v-angle-0": "0 - 90 (in Grad)", + "v-angle-1": "von einer horizontalen Blickrichtung bis zu einer auf den Boden gerichteten Kamera", + "v-angle-2": "Standard: 15°", + "v-height-0": "3 - 12 (in Metern)", + "v-height-1": "Standard: 5m", + "examples": "Beispiele", + "example-img-0-alt": "Feststehendes Blickfeld (Richtung: 90°, Winkel: 15°, Höhe: 5m)", + "example-img-1-alt": "Feststehendes Blickfeld (Richtung: 90°, Winkel: 15°, Höhe: 10m)", + "example-img-2-alt": "Feststehendes Blickfeld (Richtung: 90°, Winkel: 60°, Höhe: 10m)", + "example-img-3-alt": "Rundumblickfeld (Höhe: 3m)", + "example-img-4-alt": "Rundumblickfeld (Höhe: 5m)", + "example-img-5-alt": "Rundumblickfeld (Höhe: 5m, Richtung: 45°)", + "example-direction-45": "Richtung = 45°", + "example-direction-90": "Richtung = 90°", + "example-angle-15": "Winkel = 15°", + "example-angle-60": "Winkel = 60°", + "example-height-3": "Höhe = 3m", + "example-height-5": "Höhe = 5m", + "example-height-10": "Höhe = 10m", + "title-optional": "Optional", + "k-surv-zone": "@@LT00", + "k-cam-mount": "@@LT00", + "k-operator": "@@LT00", + "k-name": "@@LT00", + "k-ref": "@@LT00", + "k-image": "@@LT00", + "v-surv-zone": "bank (Bank) / building (Gebäude) / parking (Parkplatz) / shop (Geschäft) / town (Stadt) / traffic (Verkehr)", + "v-cam-mount": "ceilling (Decke) / pole (Mast) / wall (Wand)", + "v-operator": "Gesellschaft oder Person die die Kamera betreibt", + "v-name": "Name der Kamera", + "v-ref": "Referenznummer der Kamera", + "v-image": "Link zu einem extern abgelegten Bilds, das das kartierte Objekt zeigt" + }, + "links": { + "k-manmade": [ "man_made" ], + "k-surveillance": [ "surveillance" ], + "k-surv-type": [ "surveillance:type" ], + "k-cam-type": [ "camera:type" ], + "k-cam-direction": [ "camera:direction" ], + "k-cam-angle": [ "camera:angle" ], + "k-height": [ "height" ], + "k-surv-zone": [ "surveillance:zone" ], + "k-cam-mount": [ "camera:mount" ], + "k-operator": [ "operator" ], + "k-name": [ "name" ], + "k-ref": [ "ref" ], + "k-image": [ "image" ], + "v-surveillance": [ "surveillance" ] + } +} diff --git a/www/sunders/i18n/manual/en.json b/www/sunders/i18n/manual/en.json new file mode 100644 index 0000000..3556368 --- /dev/null +++ b/www/sunders/i18n/manual/en.json @@ -0,0 +1,84 @@ +{ + "texts": { + "title-icon": "Mandatory to display an icon on the map", + "k-manmade": "@@LT00", + "k-surveillance": "@@LT00", + "k-surv-type": "@@LT00", + "k-cam-type": "@@LT00", + "v-surveillance": "@@LT00", + "v-public": "public", + "v-outdoor": "outdoor", + "v-indoor": "indoor", + "v-camera": "camera", + "v-fixed": "fixed", + "v-panning": "panning", + "v-dome": "dome", + "v-guard": "guard", + "v-alpr": "ALPR", + "icon-public-alt": "Public surveillance", + "icon-outdoor-alt": "Outdoor surveillance", + "icon-indoor-alt": "Indoor surveillance", + "icon-cam-alt": "Camera", + "icon-fixed-alt": "Fixed camera", + "icon-panning-alt": "Panning camera", + "icon-dome-alt": "Dome camera", + "icon-guard-alt": "Guard", + "icon-alpr-alt": "Automatic Licence Plate Recognition", + "title-view-fixed": "Mandatory to draw a fixed camera's field of view", + "title-view-dome": "Mandatory to draw a dome camera's field of view", + "k-cam-direction": "@@LT00", + "k-cam-angle": "@@LT00", + "k-height": "@@LT00", + "v-direction-0": "0 - 359 (in degrees) or", + "v-direction-1": "N / NE / E / SE / S / SW / W / NW", + "v-direction-2": "e.g. for wall-mounted domes", + "v-angle-0": "0 - 90 (in degrees)", + "v-angle-1": "from a horizontal view to a ground-pointed camera", + "v-angle-2": "default: 15°", + "v-height-0": "3 - 12 (in meters)", + "v-height-1": "default: 5m", + "examples": "Examples", + "example-img-0-alt": "Fixed field of view (direction: 90°, angle: 15°, height: 5m)", + "example-img-1-alt": "Fixed field of view (direction: 90°, angle: 15°, height: 10m)", + "example-img-2-alt": "Fixed field of view (direction: 90°, angle: 60°, height: 10m)", + "example-img-3-alt": "Dome field of view (height: 3m)", + "example-img-4-alt": "Dome field of view (height: 5m)", + "example-img-5-alt": "Dome field of view (height: 5m, direction: 45°)", + "example-direction-45": "direction = 45°", + "example-direction-90": "direction = 90°", + "example-angle-15": "angle = 15°", + "example-angle-60": "angle = 60°", + "example-height-3": "height = 3m", + "example-height-5": "height = 5m", + "example-height-10": "height = 10m", + "title-optional": "Optional", + "k-surv-zone": "@@LT00", + "k-cam-mount": "@@LT00", + "k-operator": "@@LT00", + "k-name": "@@LT00", + "k-ref": "@@LT00", + "k-image": "@@LT00", + "v-surv-zone": "bank / building / parking / shop / town / traffic", + "v-cam-mount": "ceilling / pole / wall", + "v-operator": "organization or person operating the camera", + "v-name": "name of the camera", + "v-ref": "reference number of the camera", + "v-image": "link to an externally hosted image that depicts the tagged object" + }, + "links": { + "k-manmade": [ "man_made" ], + "k-surveillance": [ "surveillance" ], + "k-surv-type": [ "surveillance:type" ], + "k-cam-type": [ "camera:type" ], + "k-cam-direction": [ "camera:direction" ], + "k-cam-angle": [ "camera:angle" ], + "k-height": [ "height" ], + "k-surv-zone": [ "surveillance:zone" ], + "k-cam-mount": [ "camera:mount" ], + "k-operator": [ "operator" ], + "k-name": [ "name" ], + "k-ref": [ "ref" ], + "k-image": [ "image" ], + "v-surveillance": [ "surveillance" ] + } +} diff --git a/www/sunders/i18n/manual/es.json b/www/sunders/i18n/manual/es.json new file mode 100644 index 0000000..bfe420d --- /dev/null +++ b/www/sunders/i18n/manual/es.json @@ -0,0 +1,84 @@ +{ + "texts": { + "title-icon": "Obligatorio para mostrar un icono en el mapa", + "k-manmade": "@@LT00", + "k-surveillance": "@@LT00", + "k-surv-type": "@@LT00", + "k-cam-type": "@@LT00", + "v-surveillance": "@@LT00 (vigilancia)", + "v-public": "public (publico)", + "v-outdoor": "outdoor (exteriores)", + "v-indoor": "indoor (interiores)", + "v-camera": "camera (cámara)", + "v-fixed": "fixed (fija)", + "v-panning": "panning (panorámica)", + "v-dome": "dome (domo)", + "v-guard": "guard (guardia)", + "v-alpr": "ALPR", + "icon-public-alt": "", + "icon-outdoor-alt": "", + "icon-indoor-alt": "", + "icon-cam-alt": "", + "icon-fixed-alt": "", + "icon-panning-alt": "", + "icon-dome-alt": "", + "icon-guard-alt": "", + "icon-alpr-alt": "", + "title-view-fixed": "Obligatorio para dibujar el rango de captura de la cámara fija", + "title-view-dome": "Obligatorio para dibujar el rango de captura de la cámara domo", + "k-cam-direction": "@@LT00", + "k-cam-angle": "@@LT00", + "k-height": "@@LT00", + "v-direction-0": "0 - 359 (en grados) o", + "v-direction-1": "N / NE / E / SE / S / SW / W / NW", + "v-direction-2": "ej: para domos montadas en la pared", + "v-angle-0": "0 - 90 (en grados)", + "v-angle-1": "desde una vista horizontal hasta las cámaras que apuntan hacia el piso", + "v-angle-2": "por defecto: 15°", + "v-height-0": "3 -12 (en metros)", + "v-height-1": "por defecto: 5m", + "examples": "Ejemplos", + "example-img-0-alt": "", + "example-img-1-alt": "", + "example-img-2-alt": "", + "example-img-3-alt": "", + "example-img-4-alt": "", + "example-img-5-alt": "", + "example-direction-45": "dirección = 45°", + "example-direction-90": "dirección = 90°", + "example-angle-15": "ángulo = 15°", + "example-angle-60": "ángulo = 60°", + "example-height-3": "altura = 3m", + "example-height-5": "altura = 5m", + "example-height-10": "altura = 10m", + "title-optional": "Opcional", + "k-surv-zone": "@@LT00", + "k-cam-mount": "@@LT00", + "k-operator": "@@LT00", + "k-name": "@@LT00", + "k-ref": "@@LT00", + "k-image": "@@LT00", + "v-surv-zone": "bank (banco) / building (edificio) / parking (estacionamiento) / shop (negocio) / town (centro) / traffic (trafico)", + "v-cam-mount": "ceilling (techo) / pole (palo) / wall (pared)", + "v-operator": "organización o persona que opera la cámara", + "v-name": "nombre de la cámara", + "v-ref": "numero de referencia de la cámara", + "v-image": "enlace a un sitio externo con la imagen del objeto" + }, + "links": { + "k-manmade": [ "man_made" ], + "k-surveillance": [ "surveillance" ], + "k-surv-type": [ "surveillance:type" ], + "k-cam-type": [ "camera:type" ], + "k-cam-direction": [ "camera:direction" ], + "k-cam-angle": [ "camera:angle" ], + "k-height": [ "height" ], + "k-surv-zone": [ "surveillance:zone" ], + "k-cam-mount": [ "camera:mount" ], + "k-operator": [ "operator" ], + "k-name": [ "name" ], + "k-ref": [ "ref" ], + "k-image": [ "image" ], + "v-surveillance": [ "surveillance" ] + } +} diff --git a/www/sunders/i18n/manual/fr.json b/www/sunders/i18n/manual/fr.json new file mode 100644 index 0000000..48f46d3 --- /dev/null +++ b/www/sunders/i18n/manual/fr.json @@ -0,0 +1,84 @@ +{ + "texts": { + "title-icon": "Nécessaires pour afficher une icône sur la carte", + "k-manmade": "@@LT00", + "k-surveillance": "@@LT00", + "k-surv-type": "@@LT00", + "k-cam-type": "@@LT00", + "v-surveillance": "@@LT00", + "v-public": "public", + "v-outdoor": "outdoor", + "v-indoor": "indoor", + "v-camera": "camera", + "v-fixed": "fixed", + "v-panning": "panning", + "v-dome": "dome", + "v-guard": "guard", + "v-alpr": "ALPR (LAPI)", + "icon-public-alt": "Surveillance publique", + "icon-outdoor-alt": "Surveillance extérieure", + "icon-indoor-alt": "Surveillance intérieure", + "icon-cam-alt": "Caméra", + "icon-fixed-alt": "Caméra fixe", + "icon-panning-alt": "Caméra panoramique", + "icon-dome-alt": "Caméra dôme", + "icon-guard-alt": "Garde", + "icon-alpr-alt": "ALPR", + "title-view-fixed": "Nécessaires pour l'affichage du champ de vision de la caméra fixe", + "title-view-dome": "Nécessaires pour l'affichage du champ de vision de la caméra dôme", + "k-cam-direction": "@@LT00", + "k-cam-angle": "@@LT00", + "k-height": "@@LT00", + "v-direction-0": "0 - 359 (en degrés) ou les points cardinaux anglais :", + "v-direction-1": "N / NE / E / SE / S / SW / W / NW", + "v-direction-2": "c.a.d. pour les dômes muraux", + "v-angle-0": "0 - 90 (en degrés)", + "v-angle-1": "représentant un angle ômhorizontal jusqu'à une caméra pointée vers le sol", + "v-angle-2": "par défaut : 15°", + "v-height-0": "3 - 12 (en mètres)", + "v-height-1": "par défaut : 5m", + "examples": "Exemples :", + "example-img-0-alt": "Angle visuel fixe (direction: 90°, angle: 15°, height: 5m)", + "example-img-1-alt": "Angle visuel fixe (direction: 90°, angle: 15°, height: 10m)", + "example-img-2-alt": "Angle visuel fixe (direction: 90°, angle: 60°, height: 10m)", + "example-img-3-alt": "Angle visuel dôme (height: 3m)", + "example-img-4-alt": "Angle visuel dôme (height: 5m)", + "example-img-5-alt": "Angle visuel dôme (height: 5m, direction: 45°)", + "example-direction-45": "direction = 45°", + "example-direction-90": "direction = 90°", + "example-angle-15": "angle = 15°", + "example-angle-60": "angle = 60°", + "example-height-3": "height = 3m", + "example-height-5": "height = 5m", + "example-height-10": "height = 10m", + "title-optional": "Facultatifs", + "k-surv-zone": "@@LT00", + "k-cam-mount": "@@LT00", + "k-operator": "@@LT00", + "k-name": "@@LT00", + "k-ref": "@@LT00", + "k-image": "@@LT00", + "v-surv-zone": "bank / building / parking / shop / town / traffic", + "v-cam-mount": "ceilling / pole / wall", + "v-operator": "entité ou personne exploitant la caméra", + "v-name": "nom de la caméra", + "v-ref": "numéro de référence de la caméra", + "v-image": "lien vers une image hébergée ailleurs de l'objet" + }, + "links": { + "k-manmade": [ "man_made" ], + "k-surveillance": [ "surveillance" ], + "k-surv-type": [ "surveillance:type" ], + "k-cam-type": [ "camera:type" ], + "k-cam-direction": [ "camera:direction" ], + "k-cam-angle": [ "camera:angle" ], + "k-height": [ "height" ], + "k-surv-zone": [ "surveillance:zone" ], + "k-cam-mount": [ "camera:mount" ], + "k-operator": [ "operator" ], + "k-name": [ "name" ], + "k-ref": [ "ref" ], + "k-image": [ "image" ], + "v-surveillance": [ "surveillance" ] + } +} diff --git a/www/sunders/i18n/manual/it.json b/www/sunders/i18n/manual/it.json new file mode 100644 index 0000000..21b6470 --- /dev/null +++ b/www/sunders/i18n/manual/it.json @@ -0,0 +1,84 @@ +{ + "texts": { + "title-icon": "Obbligatorio per visualizzare un'icona sulla mappa", + "k-manmade": "@@LT00", + "k-surveillance": "@@LT00", + "k-surv-type": "@@LT00", + "k-cam-type": "@@LT00", + "v-surveillance": "@@LT00 (sorveglianza)", + "v-public": "public (pubblico)", + "v-outdoor": "outdoor (all'aperto)", + "v-indoor": "indoor (all'interno)", + "v-camera": "camera (telecamera)", + "v-fixed": "fixed (fissa)", + "v-panning": "panning (panoramica)", + "v-dome": "dome (cupola)", + "v-guard": "guard (guardia)", + "v-alpr": "ALPR", + "icon-public-alt": "Sorveglianza pubblica", + "icon-outdoor-alt": "Sorveglianza all'aperto", + "icon-indoor-alt": "Sorveglianza all'interno", + "icon-cam-alt": "Telecamera", + "icon-fixed-alt": "Telecamera fissa", + "icon-panning-alt": "Telecamera panoramica", + "icon-dome-alt": "Telecamera a cupola", + "icon-guard-alt": "Guardia", + "icon-alpr-alt": "Riconoscimento automatico delle targhe", + "title-view-fixed": "Obbligatorio per tracciare il campo visivo della telecamera fissa", + "title-view-dome": "Obbligatorio per tracciare il campo visivo della telecamera a cupola", + "k-cam-direction": "@@LT00", + "k-cam-angle": "@@LT00", + "k-height": "@@LT00", + "v-direction-0": "0 - 359 (in gradi) o", + "v-direction-1": "N / NE / E / SE / S / SO / O / NO", + "v-direction-2": "ad esempio per cupole a muro", + "v-angle-0": "15 - 90 (in gradi)", + "v-angle-1": "da una visuale quasi orizzontale a una telecamera puntata a terra", + "v-angle-2": "predefinito: 15°", + "v-height-0": "3 - 12 (in metri)", + "v-height-1": "predefinito: 5m", + "examples": "Esempi", + "example-img-0-alt": "Campo visivo (direzione: 90°, angolo: 15°, altezza: 5m)", + "example-img-1-alt": "Campo visivo (direzione: 90°, angolo: 15°, altezza: 10m)", + "example-img-2-alt": "Campo visivo (direzione: 90°, angolo: 60°, altezza: 10m)", + "example-img-3-alt": "Cupola visivo (altezza: 3m)", + "example-img-4-alt": "Cupola visivo (altezza: 5m)", + "example-img-5-alt": "Cupola visivo (altezza: 5m, direzione: 45°)", + "example-direction-45": "direzione = 45°", + "example-direction-90": "direzione = 90°", + "example-angle-15": "angolo = 15°", + "example-angle-60": "angolo = 60°", + "example-height-3": "altezza = 3m", + "example-height-5": "altezza = 5m", + "example-height-10": "altezza = 10m", + "title-optional": "Facoltativo", + "k-surv-zone": "@@LT00", + "k-cam-mount": "@@LT00", + "k-operator": "@@LT00", + "k-name": "@@LT00", + "k-ref": "@@LT00", + "k-image": "@@LT00", + "v-surv-zone": "bank (banca) / building (edificio) / parking (parcheggio) / shop (negozio) / town (città) / traffic (traffico)", + "v-cam-mount": "ceilling (soffitto) / pole (palo) / wall (muro)", + "v-operator": "organizzazione o persona che gestisce la telecamera", + "v-name": "denominazione della telecamera", + "v-ref": "numero di riferimento della telecamera", + "v-image": "link a un'immagine in hosting esterno che rappresenta l'oggetto marcato" + }, + "links": { + "k-manmade": [ "man_made" ], + "k-surveillance": [ "surveillance" ], + "k-surv-type": [ "surveillance:type" ], + "k-cam-type": [ "camera:type" ], + "k-cam-direction": [ "camera:direction" ], + "k-cam-angle": [ "camera:angle" ], + "k-height": [ "height" ], + "k-surv-zone": [ "surveillance:zone" ], + "k-cam-mount": [ "camera:mount" ], + "k-operator": [ "operator" ], + "k-name": [ "name" ], + "k-ref": [ "ref" ], + "k-image": [ "image" ], + "v-surveillance": [ "surveillance" ] + } +} diff --git a/www/sunders/i18n/manual/ru.json b/www/sunders/i18n/manual/ru.json new file mode 100644 index 0000000..30252fe --- /dev/null +++ b/www/sunders/i18n/manual/ru.json @@ -0,0 +1,84 @@ +{ + "texts": { + "title-icon": "", + "k-manmade": "@@LT00", + "k-surveillance": "@@LT00", + "k-surv-type": "@@LT00", + "k-cam-type": "@@LT00", + "v-surveillance": "@@LT00", + "v-public": "public", + "v-outdoor": "outdoor", + "v-indoor": "indoor", + "v-camera": "camera", + "v-fixed": "fixed", + "v-panning": "panning", + "v-dome": "dome", + "v-guard": "guard", + "v-alpr": "ALPR", + "icon-public-alt": "", + "icon-outdoor-alt": "", + "icon-indoor-alt": "", + "icon-cam-alt": "", + "icon-fixed-alt": "", + "icon-panning-alt": "", + "icon-dome-alt": "", + "icon-guard-alt": "", + "icon-alpr-alt": "", + "title-view-fixed": "", + "title-view-dome": "", + "k-cam-direction": "@@LT00", + "k-cam-angle": "@@LT00", + "k-height": "@@LT00", + "v-direction-0": "", + "v-direction-1": "", + "v-direction-2": "", + "v-angle-0": "", + "v-angle-1": "", + "v-angle-2": "", + "v-height-0": "", + "v-height-1": "", + "examples": "", + "example-img-0-alt": "", + "example-img-1-alt": "", + "example-img-2-alt": "", + "example-img-3-alt": "", + "example-img-4-alt": "", + "example-img-5-alt": "", + "example-direction-45": "", + "example-direction-90": "", + "example-angle-15": "", + "example-angle-60": "", + "example-height-3": "", + "example-height-5": "", + "example-height-10": "", + "title-optional": "", + "k-surv-zone": "@@LT00", + "k-cam-mount": "@@LT00", + "k-operator": "@@LT00", + "k-name": "@@LT00", + "k-ref": "@@LT00", + "k-image": "@@LT00", + "v-surv-zone": "bank / building / parking / shop / town / traffic", + "v-cam-mount": "ceilling / pole / wall", + "v-operator": "", + "v-name": "", + "v-ref": "", + "v-image": "" + }, + "links": { + "k-manmade": [ "man_made" ], + "k-surveillance": [ "surveillance" ], + "k-surv-type": [ "surveillance:type" ], + "k-cam-type": [ "camera:type" ], + "k-cam-direction": [ "camera:direction" ], + "k-cam-angle": [ "camera:angle" ], + "k-height": [ "height" ], + "k-surv-zone": [ "surveillance:zone" ], + "k-cam-mount": [ "camera:mount" ], + "k-operator": [ "operator" ], + "k-name": [ "name" ], + "k-ref": [ "ref" ], + "k-image": [ "image" ], + "v-surveillance": [ "surveillance" ] + } +} diff --git a/www/sunders/i18n/stats/de.json b/www/sunders/i18n/stats/de.json new file mode 100644 index 0000000..ab6bd26 --- /dev/null +++ b/www/sunders/i18n/stats/de.json @@ -0,0 +1,96 @@ +{ + "texts": { + "node" : "Eintrag", + "nodes" : "Einträge", + "surv-node" : "Überwachungseintrag", + "surv-nodes" : "Überwachungseinträge", + + "filter": "Filter", + "single": "einzel", + "total": "gesamt", + + "area": "Bereich", + "area-pl": "Bereiche", + "area-all": "alle Bereiche", + "country": "Land", + "country-pl": "Länder", + "country-all": "weltweit", + "type": "Art", + "type-pl": "Arten", + "type-all": "alle Arten", + "year": "Jahr", + "year-all": "alle Jahre", + "month": "Monat", + "month-all": "alle Monate", + + "areaxxx-0": "noch nicht kategorisiert", + "areaxxx-1": "", + "areaxxx-2": "??", + "area0-0": "keine Angabe", + "area0-1": "", + "area0-2": "keine Angabe", + "area1-0": "öffentlicher Bereich", + "area1-1": "für alle zugänglich", + "area1-2": "öffentlich", + "area2-0": "privater Bereich", + "area2-1": "nur für befugte Personen zugänglich", + "area2-2": "privat", + "area3-0": "Bereich innerhalb eines Gebäudes", + "area3-1": "", + "area3-2": "Innenraum", + "typexxx-0": "noch nicht kategorisiert", + "typexxx-1": "", + "typexxx-2": "??", + "type0-0": "Kamera", + "type0-1": "keine weiteren Angaben", + "type0-2": "Kamera", + "type1-0": "feststehende Kamera", + "type1-1": "überwacht meist einen begrenzten Bereich", + "type1-2": "feststehend", + "type2-0": "schwenkbare Kamera", + "type2-1": "überwacht meist verschiedene Bereiche", + "type2-2": "schwenkbar", + "type3-0": "Kuppelkamera", + "type3-1": "überwacht meist einen 360°-Bereich", + "type3-2": "Kuppel", + "type4-0": "Wachpersonal", + "type4-1": "z.B. Beschäftigte eines Sicherheitsunternehmens", + "type4-2": "Wache", + "type5-0": "ANSE", + "type5-1": "Automatische Nummernschilderkennung", + "type5-2": "ANSE", + + "all": "alle", + "Jan": "Jan", + "Jan_": "Januar", + "Feb": "Feb", + "Feb_": "Februar", + "Mar": "Mär", + "Mar_": "März", + "Apr": "Apr", + "Apr_": "April", + "May": "Mai", + "May_": "Mai", + "Jun": "Jun", + "Jun_": "Juni", + "Jul": "Jul", + "Jul_": "Juli", + "Aug": "Aug", + "Aug_": "August", + "Sep": "Sep", + "Sep_": "September", + "Oct": "Okt", + "Oct_": "Oktober", + "Nov": "Nov", + "Nov_": "November", + "Dec": "Dez", + "Dec_": "Dezember", + "Su": "So", + "Mo": "Mo", + "Tu": "Di", + "We": "Mi", + "Th": "Do", + "Fr": "Fr", + "Sa": "Sa" + } +} diff --git a/www/sunders/i18n/stats/en.json b/www/sunders/i18n/stats/en.json new file mode 100644 index 0000000..bcf416d --- /dev/null +++ b/www/sunders/i18n/stats/en.json @@ -0,0 +1,96 @@ +{ + "texts": { + "node": "node", + "nodes": "nodes", + "surv-node": "surveillance node", + "surv-nodes": "surveillance nodes", + + "filter": "filter", + "single": "single", + "total": "total", + + "area": "area", + "area-pl": "areas", + "area-all": "all areas", + "country": "country", + "country-pl": "countries", + "country-all": "worldwide", + "type": "type", + "type-pl": "types", + "type-all": "all types", + "year": "year", + "year-all": "all years", + "month": "month", + "month-all": "all months", + + "areaxxx-0": "not categorized yet", + "areaxxx-1": "", + "areaxxx-2": "??", + "area0-0": "not specified", + "area0-1": "", + "area0-2": "not specified", + "area1-0": "public outdoor area", + "area1-1": "accessable by everyone", + "area1-2": "public", + "area2-0": "private outdoor area", + "area2-1": "accessable only by authorized persons", + "area2-2": "private", + "area3-0": "indoor area", + "area3-1": "", + "area3-2": "indoor", + "typexxx-0": "not categorized yet", + "typexxx-1": "", + "typexxx-2": "??", + "type0-0": "camera", + "type0-1": "no further information", + "type0-2": "camera", + "type1-0": "fixed camera", + "type1-1": "usually observing a limited area", + "type1-2": "fixed cam", + "type2-0": "panning camera", + "type2-1": "usually able to observe various areas", + "type2-2": "panning cam", + "type3-0": "dome camera", + "type3-1": "usually observing a 360° area", + "type3-2": "dome cam", + "type4-0": "guard", + "type4-1": "e.g. an employee of a security service", + "type4-2": "guard", + "type5-0": "ALPR", + "type5-1": "Automatic Licence Plate Recognition", + "type5-2": "ALPR", + + "all": "all", + "Jan": "Jan", + "Jan_": "January", + "Feb": "Feb", + "Feb_": "February", + "Mar": "Mar", + "Mar_": "March", + "Apr": "Apr", + "Apr_": "April", + "May": "May", + "May_": "May", + "Jun": "Jun", + "Jun_": "Jun", + "Jul": "Jul", + "Jul_": "July", + "Aug": "Aug", + "Aug_": "August", + "Sep": "Sep", + "Sep_": "September", + "Oct": "Oct", + "Oct_": "October", + "Nov": "Nov", + "Nov_": "November", + "Dec": "Dec", + "Dec_": "December", + "Su": "Su", + "Mo": "Mo", + "Tu": "Tu", + "We": "We", + "Th": "Th", + "Fr": "Fr", + "Sa": "Sa" + } +} diff --git a/www/sunders/i18n/stats/es.json b/www/sunders/i18n/stats/es.json new file mode 100644 index 0000000..776731e --- /dev/null +++ b/www/sunders/i18n/stats/es.json @@ -0,0 +1,96 @@ +{ + "texts": { + "node": "nodo", + "nodes": "nodos", + "surv-node": "nodo de vigilancia", + "surv-nodes": "nodos de vigilancia", + + "filter": "filtro", + "single": "solo", + "total": "total", + + "area": "área", + "area-pl": "áreas", + "area-all": "todas las áreas", + "country": "país", + "country-pl": "países", + "country-all": "mundialmente", + "type": "tipo", + "type-pl": "tipos", + "type-all": "todos los tipos", + "year": "año", + "year-all": "todos los años", + "month": "mes", + "month-all": "todos los meses", + + "areaxxx-0": "aún no categorizado", + "areaxxx-1": "", + "areaxxx-2": "??", + "area0-0": "no especificado", + "area0-1": "", + "area0-2": "no especificado", + "area1-0": "área publica en exteriores", + "area1-1": "accesible por cualquiera", + "area1-2": "publica", + "area2-0": "área privada en exteriores", + "area2-1": "accesible solo por personal autorizado", + "area2-2": "privada", + "area3-0": "área de interiores", + "area3-1": "", + "area3-2": "interiores", + "typexxx-0": "aún no categorizado", + "typexxx-1": "", + "typexxx-2": "??", + "type0-0": "cámara", + "type0-1": "no hay más información", + "type0-2": "cámara", + "type1-0": "cámara fija", + "type1-1": "usualmente abarca un área limitada", + "type1-2": "fija", + "type2-0": "cámara orientable", + "type2-1": "usualmente abarca varias áreas", + "type2-2": "orientable", + "type3-0": "cámara domo", + "type3-1": "abarca un área de 360°", + "type3-2": "domo", + "type4-0": "guardia", + "type4-1": "ej: empleado de un servicio de seguridad", + "type4-2": "guardia", + "type5-0": "ICAP", + "type5-1": "identificador automático de patentes", + "type5-2": "ICAP", + + "all": "todo", + "Jan": "Ene", + "Jan_": "Enero", + "Feb": "Feb", + "Feb_": "Febrero", + "Mar": "Mar", + "Mar_": "Marzo", + "Apr": "Abr", + "Apr_": "Abril", + "May": "May", + "May_": "Mayo", + "Jun": "Jun", + "Jun_": "Junio", + "Jul": "Jul", + "Jul_": "Julio", + "Aug": "Ago", + "Aug_": "Agosto", + "Sep": "Sep", + "Sep_": "Septiembre", + "Oct": "Oct", + "Oct_": "Octubre", + "Nov": "Nov", + "Nov_": "Noviembre", + "Dec": "Dic", + "Dec_": "Diciembre", + "Su": "Do", + "Mo": "Lu", + "Tu": "Ma", + "We": "Mi", + "Th": "Ju", + "Fr": "Vi", + "Sa": "Sa" + } +} diff --git a/www/sunders/i18n/stats/fr.json b/www/sunders/i18n/stats/fr.json new file mode 100644 index 0000000..8ecc09b --- /dev/null +++ b/www/sunders/i18n/stats/fr.json @@ -0,0 +1,96 @@ +{ + "texts": { + "node": "nœud", + "nodes": "nœuds", + "surv-node": "nœud de surveillance", + "surv-nodes": "nœuds de surveillance", + + "filter": "filtre", + "single": "particulière", + "total": "totale", + + "area": "zone", + "area-pl": "zones", + "area-all": "tous les zones", + "country": "pays", + "country-pl": "pays", + "country-all": "dans le monde entier", + "type": "type", + "type-pl": "types", + "type-all": "tous les types", + "year": "année", + "year-all": "tous les ans", + "month": "mois", + "month-all": "tous les mois", + + "areaxxx-0": "encore non classées", + "areaxxx-1": "", + "areaxxx-2": "??", + "area0-0": "non spécifié", + "area0-1": "", + "area0-2": "non spécifié", + "area1-0": "espace extérieur public", + "area1-1": "accessible par tout le monde", + "area1-2": "public", + "area2-0": "espace extérieur privé", + "area2-1": "accessible uniquement par les personnes autorisées", + "area2-2": "privé", + "area3-0": "espace intérieure", + "area3-1": "", + "area3-2": "intérieure", + "typexxx-0": "encore non classées", + "typexxx-1": "", + "typexxx-2": "??", + "type0-0": "caméra", + "type0-1": "aucune information supplémentaire", + "type0-2": "caméra", + "type1-0": "caméra fixe", + "type1-1": "généralement l'observation d'une zone limitée", + "type1-2": "cam fixe", + "type2-0": "caméra panoramique", + "type2-1": "habituellement en mesure d'observer les différents zones", + "type2-2": "cam panoramique", + "type3-0": "caméra dôme", + "type3-1": "généralement l'observation d'un 360° zone", + "type3-2": "cam dôme", + "type4-0": "gardien", + "type4-1": "p. ex. un employé d'un service de sécurité", + "type4-2": "gardien", + "type5-0": "LAPI", + "type5-1": "Lecture Automatisée de Plaques d’Immatriculation", + "type5-2": "LAPI", + + "all": "tout", + "Jan": "Jan", + "Jan_": "Janvier", + "Feb": "Fév", + "Feb_": "Février", + "Mar": "Mar", + "Mar_": "Mars", + "Apr": "Avr", + "Apr_": "Avril", + "May": "Mai", + "May_": "Mai", + "Jun": "Jui", + "Jun_": "Juin", + "Jul": "Jui", + "Jul_": "Juillet", + "Aug": "Aoû", + "Aug_": "Août", + "Sep": "Sep", + "Sep_": "Septembre", + "Oct": "Oct", + "Oct_": "Octobre", + "Nov": "Nov", + "Nov_": "Novembre", + "Dec": "Déc", + "Dec_": "Décembre", + "Su": "Di", + "Mo": "Lu", + "Tu": "Ma", + "We": "Me", + "Th": "Je", + "Fr": "Ve", + "Sa": "Sa" + } +} diff --git a/www/sunders/i18n/stats/it.json b/www/sunders/i18n/stats/it.json new file mode 100644 index 0000000..f4b262a --- /dev/null +++ b/www/sunders/i18n/stats/it.json @@ -0,0 +1,96 @@ +{ + "texts": { + "node": "nodo", + "nodes": "nodi", + "surv-node": "nodo di sorveglianza", + "surv-nodes": "nodi di sorveglianza", + + "filter": "filtro", + "single": "singolo", + "total": "totale", + + "area": "area", + "area-pl": "aree", + "area-all": "tutte le aree", + "country": "paese", + "country-pl": "paesi", + "country-all": "mondiale", + "type": "tipo", + "type-pl": "tipi", + "type-all": "tutti i tipi", + "year": "anno", + "year-all": "tutti gli anni", + "month": "mese", + "month-all": "tutti i mesi", + + "areaxxx-0": "non ancora classificato", + "areaxxx-1": "", + "areaxxx-2": "??", + "area0-0": "non specificato", + "area0-1": "", + "area0-2": "non specificato", + "area1-0": "area pubblica all'aperto", + "area1-1": "accessibile a tutti", + "area1-2": "pubblica", + "area2-0": "spazio esterno privato", + "area2-1": "accessibile solo alle persone autorizzate", + "area2-2": "privato", + "area3-0": "spazio interno", + "area3-1": "", + "area3-2": "interno", + "typexxx-0": "non ancora classificato", + "typexxx-1": "", + "typexxx-2": "??", + "type0-0": "telecamera", + "type0-1": "nessuna ulteriore informazione", + "type0-2": "telecamera", + "type1-0": "telecamera fissa", + "type1-1": "di solito osserva un'area limitata", + "type1-2": "telecamera fissa", + "type2-0": "telecamera panoramica", + "type2-1": "di solito in grado di osservare varie aree", + "type2-2": "telecamera panoramica", + "type3-0": "telecamera a cupola/dome", + "type3-1": "di solito in grado di osservare un'area a 360", + "type3-2": "telecamera a cupola", + "type4-0": "guardia", + "type4-1": "ad es. un dipendente di un servizio di sicurezza", + "type4-2": "guardia", + "type5-0": "ALPR", + "type5-1": "Riconoscimento automatico delle targhe", + "type5-2": "ALPR", + + "all": "tutti", + "Jan": "Gen", + "Jan_": "Gennaio", + "Feb": "Feb", + "Feb_": "Febbraio", + "Mar": "Mar", + "Mar_": "Marzo", + "Apr": "Apr", + "Apr_": "Aprile", + "May": "Mag", + "May_": "Maggio", + "Jun": "Giu", + "Jun_": "Giugno", + "Jul": "Lul", + "Jul_": "Luglio", + "Aug": "Ago", + "Aug_": "Agosto", + "Sep": "Set", + "Sep_": "Settembre", + "Oct": "Ott", + "Oct_": "Ottobre", + "Nov": "Nov", + "Nov_": "Novembre", + "Dec": "Dic", + "Dec_": "Dicembre", + "Su": "Do", + "Mo": "Lu", + "Tu": "Ma", + "We": "Me", + "Th": "Gi", + "Fr": "Ve", + "Sa": "Sa" + } +} diff --git a/www/sunders/i18n/stats/ru.json b/www/sunders/i18n/stats/ru.json new file mode 100644 index 0000000..cf2f560 --- /dev/null +++ b/www/sunders/i18n/stats/ru.json @@ -0,0 +1,96 @@ +{ + "texts": { + "node": "точка", + "nodes": "точки", + "surv-node": "точка наблюдения", + "surv-nodes": "точки наблюдения", + + "filter": "фильтр", + "single": "отдельно", + "total": "общий", + + "area": "область", + "area-pl": "области", + "area-all": "во всех областях", + "country": "страна", + "country-pl": "страны", + "country-all": "во всем мире", + "type": "тип", + "type-pl": "типы", + "type-all": "все типы", + "year": "год", + "year-all": "все годы", + "month": "месяц", + "month-all": "все месяцы", + + "areaxxx-0": "не относятся к категории пока еще не", + "areaxxx-1": "", + "areaxxx-2": "??", + "area0-0": "не указан", + "area0-1": "", + "area0-2": "не указан", + "area1-0": "открытая площадь", + "area1-1": "поднявшись на каждый", + "area1-2": "общественной", + "area2-0": "частная открытая область", + "area2-1": "поднявшись только уполномоченным лицам", + "area2-2": "частный", + "area3-0": "область для установки внутри помещений", + "area3-1": "", + "area3-2": "для использования внутри помещений", + "typexxx-0": "не относятся к категории пока еще не", + "typexxx-1": "", + "typexxx-2": "??", + "type0-0": "камера", + "type0-1": "никакой дополнительной информации", + "type0-2": "камера", + "type1-0": "фиксированная камера", + "type1-1": "обычно наблюдений ограниченной области", + "type1-2": "фиксированная камера", + "type2-0": "панорамирование камерой", + "type2-1": "обычно возможность наблюдать различные районы", + "type2-2": "панорамирование камерой", + "type3-0": "купольная камера", + "type3-1": "как правило, соблюдая 360° область", + "type3-2": "купольная камера", + "type4-0": "ограждение", + "type4-1": "например, сотрудник службы безопасности", + "type4-2": "ограждение", + "type5-0": "АРНЗ", + "type5-1": "Автоматическое Распознавание Номерных Знаков", + "type5-2": "АРНЗ", + + "all": "все", + "Jan": "Янв", + "Jan_": "Январь", + "Feb": "Фев", + "Feb_": "Февраль", + "Mar": "Мар", + "Mar_": "Март", + "Apr": "Апр", + "Apr_": "Апрель", + "May": "Май", + "May_": "Май", + "Jun": "Июн", + "Jun_": "Июнь", + "Jul": "Июл", + "Jul_": "Июль", + "Aug": "Авг", + "Aug_": "Август", + "Sep": "Сен", + "Sep_": "Сентябрь", + "Oct": "Окт", + "Oct_": "Октябрь", + "Nov": "Ноя", + "Nov_": "Ноябрь", + "Dec": "Дек", + "Dec_": "Декабрь", + "Su": "Во", + "Mo": "По", + "Tu": "Вт", + "We": "Ср", + "Th": "Че", + "Fr": "Пя", + "Sa": "Су" + } +} diff --git a/www/sunders/i18n/symbology/de.json b/www/sunders/i18n/symbology/de.json new file mode 100644 index 0000000..86d8ad4 --- /dev/null +++ b/www/sunders/i18n/symbology/de.json @@ -0,0 +1,29 @@ +{ + "texts": { + "title-icons": "Symbole", + "icon-cam-alt": "Kameras", + "desc-cam": "Kamera — keine weiteren Angaben", + "icon-fixed-alt": "Feststehende Kameras", + "desc-fixed": "Feststehende Kamera — überwacht meist einen begrenzten Bereich", + "icon-panning-alt": "Schwenkbare Kameras", + "desc-panning": "Schwenkbare Kamera — überwacht meist verschiedene Bereiche", + "icon-dome-alt": "Kuppelkameras", + "desc-dome": "Kuppelkamera — überwacht meist einen 360°-Bereich", + "icon-guard-alt": "Wachpersonal", + "desc-guard": "Wachpersonal — z.B. Beschäftigte eines Sicherheitsunternehmens", + "icon-alpr-alt": "Automatische Kennzeichenlesesysteme", + "desc-alpr": "AKLS — Automatische Kennzeichenlesesysteme", + "title-colors": "Farben", + "icon-red-alt": "Überwachung öffentlicher Bereiche", + "desc-red": "Roter Hintergrund — Überwachung eines öffentlichen Bereichs, der für alle zugänglich ist", + "icon-blue-alt": "Überwachung außerhalb eines Gebäudes", + "desc-blue": "Blauer Hintergrund — Überwachung eines Bereichs außerhalb eines Gebäudes, der nur für befugte Personen zugänglich ist", + "icon-green-alt": "Überwachung innerhalb eines Gebäudes", + "desc-green": "Grüner Hintergrund — Überwachung eines Bereichs innerhalb eines Gebäudes", + "icon-yellow-fixed-alt": "Feststehend Kamera, zu kontrollieren", + "icon-yellow-dome-alt": "Kuppelkamera, zu kontrollieren", + "icon-yellow-guard-alt": "Wachpersonal, zu kontrollieren", + "icon-yellow-alpr-alt": "Automatische Nummernschilderkennung, zu kontrollieren", + "desc-yellow": "Gelbes Symbol — Mit einem Kontrollkennzeichen markiere Kamera oder Wachpersonaleintrag, die/der noch korrigiert oder vervollständigt werden muss." + } +} diff --git a/www/sunders/i18n/symbology/en.json b/www/sunders/i18n/symbology/en.json new file mode 100644 index 0000000..679259f --- /dev/null +++ b/www/sunders/i18n/symbology/en.json @@ -0,0 +1,29 @@ +{ + "texts": { + "title-icons": "Icons", + "icon-cam-alt": "Cameras", + "desc-cam": "Camera — no further information", + "icon-fixed-alt": "Fixed cameras", + "desc-fixed": "Fixed camera — usually observing a limited area", + "icon-panning-alt": "Panning cameras", + "desc-panning": "Panning camera — usually able to observe various areas", + "icon-dome-alt": "Dome cameras", + "desc-dome": "Dome camera — usually observing a 360° area", + "icon-guard-alt": "Guards", + "desc-guard": "Guard — e.g. an employee of a security service", + "icon-alpr-alt": "Automatic Licence Plate Recognition", + "desc-alpr": "ALPR — Automatic Licence Plate Recognition", + "title-colors": "Colors", + "icon-red-alt": "Public surveillance", + "desc-red": "Red background — observing a public outdoor area, accessable by everyone", + "icon-blue-alt": "Outdoor surveillance", + "desc-blue": "Blue background — observing a private outdoor area, accessable only by authorized persons", + "icon-green-alt": "Indoor surveillance", + "desc-green": "Green background — observing an indoor area", + "icon-yellow-fixed-alt": "Fixed cameras, fixme", + "icon-yellow-dome-alt": "Dome cameras, fixme", + "icon-yellow-guard-alt": "Guards, fixme", + "icon-yellow-alpr-alt": "Automatic Licence Plate Recognition, fixme", + "desc-yellow": "Yellow icon — camera or guard marked with a fixme key because it needs further attention" + } +} diff --git a/www/sunders/i18n/symbology/es.json b/www/sunders/i18n/symbology/es.json new file mode 100644 index 0000000..baea1f9 --- /dev/null +++ b/www/sunders/i18n/symbology/es.json @@ -0,0 +1,29 @@ +{ + "texts": { + "title-icons": "Iconos", + "icon-cam-alt": "Cámaras", + "desc-cam": "Cámara — no hay más información", + "icon-fixed-alt": "Cámaras Fija", + "desc-fixed": "Cámara Fija — usualmente abarca un área limitada", + "icon-panning-alt": "Cámaras Panorámica", + "desc-panning": "Cámara Panorámica — usualmente abarca varias áreas", + "icon-dome-alt": "Cámaras Domo", + "desc-dome": "Cámara Domo — usualmente abarca un área de 360°", + "icon-guard-alt": "Guardia", + "desc-guard": "Guardia — ej: empleado de un servicio de seguridad", + "icon-alpr-alt": "Reconocimiento automático de matrículas", + "desc-alpr": "Reconocimiento automático de matrículas (ANPR en inglés)", + "title-colors": "Colores", + "icon-red-alt": "", + "desc-red": "Fondo rojo — observa un área publica en exteriores, accesible por cualquiera", + "icon-blue-alt": "", + "desc-blue": "Fondo azul — observa un área privada en exteriores, accesible solo por personal autorizado", + "icon-green-alt": "", + "desc-green": "Fondo verde — observa un área de interiores", + "icon-yellow-fixed-alt": "", + "icon-yellow-dome-alt": "", + "icon-yellow-guard-alt": "", + "icon-yellow-alpr-alt": "", + "desc-yellow": "Icono amarillo — cámara o guardia marcada como arréglame, ya que necesita ser revisado." + } +} diff --git a/www/sunders/i18n/symbology/fr.json b/www/sunders/i18n/symbology/fr.json new file mode 100644 index 0000000..e929818 --- /dev/null +++ b/www/sunders/i18n/symbology/fr.json @@ -0,0 +1,29 @@ +{ + "texts": { + "title-icons": "Icônes", + "icon-cam-alt": "Caméras", + "desc-cam": "Caméra — pas d'autre information", + "icon-fixed-alt": "Caméras fixe", + "desc-fixed": "Caméra fixe — en général, surveille une zone réduite", + "icon-panning-alt": "Caméras panoramique", + "desc-panning": "Caméra panoramique — en général, peut surveiller plusieurs zones", + "icon-dome-alt": "Caméras dôme", + "desc-dome": "Caméra dôme — en général, peut surveiller une zone à 360°", + "icon-guard-alt": "Gardes", + "desc-guard": "Garde ou sentinelle — c.a.d. un.e employé.e d'une société de sécurité", + "icon-alpr-alt": "Lecture automatique des plaques d’immatriculation", + "desc-alpr": "LAPI — Lecture automatique des plaques d’immatriculation", + "title-colors": "Couleurs", + "icon-red-alt": "Surveillance publique", + "desc-red": "Fond rouge — surveille une zone extérieure publique, accessible par tous", + "icon-blue-alt": "Surveillance extérieure", + "desc-blue": "Fond bleu — surveille une zone extérieure privée, seulement accessible par les personnes autorisées", + "icon-green-alt": "Surveillance intérieure", + "desc-green": "Fond vert — surveille une zone intérieure", + "icon-yellow-fixed-alt": "Caméras fixe, à corriger", + "icon-yellow-dome-alt": "Caméras dôme, à corriger", + "icon-yellow-guard-alt": "Gardes, à corriger", + "icon-yellow-alpr-alt": "ALPR, à corriger", + "desc-yellow": "Icône à fond jaune — Caméra ou garde marqué avec une étiquette “fixme” (à corriger), indiquant un besoin de précision ultérieure" + } +} diff --git a/www/sunders/i18n/symbology/it.json b/www/sunders/i18n/symbology/it.json new file mode 100644 index 0000000..cfc6d25 --- /dev/null +++ b/www/sunders/i18n/symbology/it.json @@ -0,0 +1,29 @@ +{ + "texts": { + "title-icons": "Icone", + "icon-cam-alt": "Telecamere", + "desc-cam": "Telecamera — nessuna ulteriore informazione", + "icon-fixed-alt": "Telecamere fissa", + "desc-fixed": "Telecamera fissa - di solito osserva un'area limitata", + "icon-panning-alt": "Telecamere a scansione", + "desc-panning": "Telecamera a scansione - di solito in grado di osservare varie aree", + "icon-dome-alt": "Telecamere a cupola", + "desc-dome": "Telecamera a cupola — di solito osservano un'area a 360°", + "icon-guard-alt": "Guardie", + "desc-guard": "Guardia — ad es. un dipendente di un sevizio di vigilanza", + "icon-alpr-alt": "Riconoscimento automatico delle targhe", + "desc-alpr": "Riconoscimento automatico delle targhe (ALPR in inglese)", + "title-colors": "Colori", + "icon-red-alt": "Sorveglianza pubblica", + "desc-red": "Sfondo rosso - osserva un'area pubblica all'aperto, accessibile a tutti", + "icon-blue-alt": "Sorveglianza esterna", + "desc-blue": "Sfondo blu - osserva un'area esterna privata, accessibile solo alle persone autorizzate", + "icon-green-alt": "Sorveglianza interna", + "desc-green": "Sfondo verde - osserva un'area interna", + "icon-yellow-fixed-alt": "Telecamere fisse, fixme", + "icon-yellow-dome-alt": "Telecamere a cupola, fixme", + "icon-yellow-guard-alt": "Guardie, fixme", + "icon-yellow-alpr-alt": "Riconoscimento automatico delle targhe, fixme", + "desc-yellow": "Icona gialla - telecamera o guardia segnata con un tasto fixme perché ha bisogno di ulteriore attenzione" + } +} diff --git a/www/sunders/i18n/symbology/ru.json b/www/sunders/i18n/symbology/ru.json new file mode 100644 index 0000000..34d078e --- /dev/null +++ b/www/sunders/i18n/symbology/ru.json @@ -0,0 +1,29 @@ +{ + "texts": { + "title-icons": "", + "icon-cam-alt": "", + "desc-cam": "", + "icon-fixed-alt": "", + "desc-fixed": "", + "icon-panning-alt": "", + "desc-panning": "", + "icon-dome-alt": "", + "desc-dome": "", + "icon-guard-alt": "", + "desc-guard": "", + "icon-alpr-alt": "", + "desc-alpr": "", + "title-colors": "", + "icon-red-alt": "", + "desc-red": "", + "icon-blue-alt": "", + "desc-blue": "", + "icon-green-alt": "", + "desc-green": "", + "icon-yellow-fixed-alt": "", + "icon-yellow-dome-alt": "", + "icon-yellow-guard-alt": "", + "icon-yellow-alpr-alt": "", + "desc-yellow": "" + } +} diff --git a/www/sunders/images/button_language.png b/www/sunders/images/button_language.png new file mode 100644 index 0000000..746b2d1 Binary files /dev/null and b/www/sunders/images/button_language.png differ diff --git a/www/sunders/images/button_less_blue.png b/www/sunders/images/button_less_blue.png new file mode 100644 index 0000000..a75fb0d Binary files /dev/null and b/www/sunders/images/button_less_blue.png differ diff --git a/www/sunders/images/button_less_gray.png b/www/sunders/images/button_less_gray.png new file mode 100644 index 0000000..309c9f7 Binary files /dev/null and b/www/sunders/images/button_less_gray.png differ diff --git a/www/sunders/images/button_more_blue.png b/www/sunders/images/button_more_blue.png new file mode 100644 index 0000000..0ac9678 Binary files /dev/null and b/www/sunders/images/button_more_blue.png differ diff --git a/www/sunders/images/button_more_gray.png b/www/sunders/images/button_more_gray.png new file mode 100644 index 0000000..06168f7 Binary files /dev/null and b/www/sunders/images/button_more_gray.png differ diff --git a/www/sunders/images/button_next.png b/www/sunders/images/button_next.png new file mode 100644 index 0000000..3b937a2 Binary files /dev/null and b/www/sunders/images/button_next.png differ diff --git a/www/sunders/images/button_permalink.png b/www/sunders/images/button_permalink.png new file mode 100644 index 0000000..2faf85e Binary files /dev/null and b/www/sunders/images/button_permalink.png differ diff --git a/www/sunders/images/button_previous.png b/www/sunders/images/button_previous.png new file mode 100644 index 0000000..26d5352 Binary files /dev/null and b/www/sunders/images/button_previous.png differ diff --git a/www/sunders/images/button_search.png b/www/sunders/images/button_search.png new file mode 100644 index 0000000..4258d24 Binary files /dev/null and b/www/sunders/images/button_search.png differ diff --git a/www/sunders/images/button_stats.png b/www/sunders/images/button_stats.png new file mode 100644 index 0000000..22210f5 Binary files /dev/null and b/www/sunders/images/button_stats.png differ diff --git a/www/sunders/images/cam.png b/www/sunders/images/cam.png new file mode 100644 index 0000000..d2b458a Binary files /dev/null and b/www/sunders/images/cam.png differ diff --git a/www/sunders/images/camAll.png b/www/sunders/images/camAll.png new file mode 100644 index 0000000..551147a Binary files /dev/null and b/www/sunders/images/camAll.png differ diff --git a/www/sunders/images/camBlue.png b/www/sunders/images/camBlue.png new file mode 100644 index 0000000..b399c0a Binary files /dev/null and b/www/sunders/images/camBlue.png differ diff --git a/www/sunders/images/camGreen.png b/www/sunders/images/camGreen.png new file mode 100644 index 0000000..6635468 Binary files /dev/null and b/www/sunders/images/camGreen.png differ diff --git a/www/sunders/images/camRed.png b/www/sunders/images/camRed.png new file mode 100644 index 0000000..8b0e7cc Binary files /dev/null and b/www/sunders/images/camRed.png differ diff --git a/www/sunders/images/close.png b/www/sunders/images/close.png new file mode 100644 index 0000000..4f95711 Binary files /dev/null and b/www/sunders/images/close.png differ diff --git a/www/sunders/images/colorBlue.png b/www/sunders/images/colorBlue.png new file mode 100644 index 0000000..291756b Binary files /dev/null and b/www/sunders/images/colorBlue.png differ diff --git a/www/sunders/images/colorBlueAll.png b/www/sunders/images/colorBlueAll.png new file mode 100644 index 0000000..0a22f1d Binary files /dev/null and b/www/sunders/images/colorBlueAll.png differ diff --git a/www/sunders/images/colorGreen.png b/www/sunders/images/colorGreen.png new file mode 100644 index 0000000..ca92724 Binary files /dev/null and b/www/sunders/images/colorGreen.png differ diff --git a/www/sunders/images/colorGreenAll.png b/www/sunders/images/colorGreenAll.png new file mode 100644 index 0000000..daf47d8 Binary files /dev/null and b/www/sunders/images/colorGreenAll.png differ diff --git a/www/sunders/images/colorRed.png b/www/sunders/images/colorRed.png new file mode 100644 index 0000000..87e6024 Binary files /dev/null and b/www/sunders/images/colorRed.png differ diff --git a/www/sunders/images/colorRedAll.png b/www/sunders/images/colorRedAll.png new file mode 100644 index 0000000..b9adb9a Binary files /dev/null and b/www/sunders/images/colorRedAll.png differ diff --git a/www/sunders/images/dome.png b/www/sunders/images/dome.png new file mode 100644 index 0000000..f017fd0 Binary files /dev/null and b/www/sunders/images/dome.png differ diff --git a/www/sunders/images/domeAll.png b/www/sunders/images/domeAll.png new file mode 100644 index 0000000..309eb4c Binary files /dev/null and b/www/sunders/images/domeAll.png differ diff --git a/www/sunders/images/domeBlue.png b/www/sunders/images/domeBlue.png new file mode 100644 index 0000000..e9b726c Binary files /dev/null and b/www/sunders/images/domeBlue.png differ diff --git a/www/sunders/images/domeGreen.png b/www/sunders/images/domeGreen.png new file mode 100644 index 0000000..9f853b3 Binary files /dev/null and b/www/sunders/images/domeGreen.png differ diff --git a/www/sunders/images/domeRed.png b/www/sunders/images/domeRed.png new file mode 100644 index 0000000..d5b7e20 Binary files /dev/null and b/www/sunders/images/domeRed.png differ diff --git a/www/sunders/images/dome_z-17_h-3.png b/www/sunders/images/dome_z-17_h-3.png new file mode 100644 index 0000000..2af0791 Binary files /dev/null and b/www/sunders/images/dome_z-17_h-3.png differ diff --git a/www/sunders/images/dome_z-17_h-5.png b/www/sunders/images/dome_z-17_h-5.png new file mode 100644 index 0000000..aea28bf Binary files /dev/null and b/www/sunders/images/dome_z-17_h-5.png differ diff --git a/www/sunders/images/dome_z-17_h-5_d-45.png b/www/sunders/images/dome_z-17_h-5_d-45.png new file mode 100644 index 0000000..3e46629 Binary files /dev/null and b/www/sunders/images/dome_z-17_h-5_d-45.png differ diff --git a/www/sunders/images/fixed.png b/www/sunders/images/fixed.png new file mode 100644 index 0000000..2c6e664 Binary files /dev/null and b/www/sunders/images/fixed.png differ diff --git a/www/sunders/images/fixedAll.png b/www/sunders/images/fixedAll.png new file mode 100644 index 0000000..3cb7e06 Binary files /dev/null and b/www/sunders/images/fixedAll.png differ diff --git a/www/sunders/images/fixedBlue.png b/www/sunders/images/fixedBlue.png new file mode 100644 index 0000000..4871b2e Binary files /dev/null and b/www/sunders/images/fixedBlue.png differ diff --git a/www/sunders/images/fixedGreen.png b/www/sunders/images/fixedGreen.png new file mode 100644 index 0000000..25e0e80 Binary files /dev/null and b/www/sunders/images/fixedGreen.png differ diff --git a/www/sunders/images/fixedRed.png b/www/sunders/images/fixedRed.png new file mode 100644 index 0000000..b406e89 Binary files /dev/null and b/www/sunders/images/fixedRed.png differ diff --git a/www/sunders/images/fixed_z-17_d-90_a-15_h-10.png b/www/sunders/images/fixed_z-17_d-90_a-15_h-10.png new file mode 100644 index 0000000..46fdbda Binary files /dev/null and b/www/sunders/images/fixed_z-17_d-90_a-15_h-10.png differ diff --git a/www/sunders/images/fixed_z-17_d-90_a-15_h-5.png b/www/sunders/images/fixed_z-17_d-90_a-15_h-5.png new file mode 100644 index 0000000..5d3bf09 Binary files /dev/null and b/www/sunders/images/fixed_z-17_d-90_a-15_h-5.png differ diff --git a/www/sunders/images/fixed_z-17_d-90_a-60_h-10.png b/www/sunders/images/fixed_z-17_d-90_a-60_h-10.png new file mode 100644 index 0000000..1de1eda Binary files /dev/null and b/www/sunders/images/fixed_z-17_d-90_a-60_h-10.png differ diff --git a/www/sunders/images/guard.png b/www/sunders/images/guard.png new file mode 100644 index 0000000..3243fa2 Binary files /dev/null and b/www/sunders/images/guard.png differ diff --git a/www/sunders/images/guardAll.png b/www/sunders/images/guardAll.png new file mode 100644 index 0000000..6cf08e5 Binary files /dev/null and b/www/sunders/images/guardAll.png differ diff --git a/www/sunders/images/guardBlue.png b/www/sunders/images/guardBlue.png new file mode 100644 index 0000000..8a74bb2 Binary files /dev/null and b/www/sunders/images/guardBlue.png differ diff --git a/www/sunders/images/guardGreen.png b/www/sunders/images/guardGreen.png new file mode 100644 index 0000000..910284f Binary files /dev/null and b/www/sunders/images/guardGreen.png differ diff --git a/www/sunders/images/guardRed.png b/www/sunders/images/guardRed.png new file mode 100644 index 0000000..4f61068 Binary files /dev/null and b/www/sunders/images/guardRed.png differ diff --git a/www/sunders/images/icon.png b/www/sunders/images/icon.png new file mode 100644 index 0000000..c407f58 Binary files /dev/null and b/www/sunders/images/icon.png differ diff --git a/www/sunders/images/link-how-de.png b/www/sunders/images/link-how-de.png new file mode 100644 index 0000000..8c661fe Binary files /dev/null and b/www/sunders/images/link-how-de.png differ diff --git a/www/sunders/images/link-how-en.png b/www/sunders/images/link-how-en.png new file mode 100644 index 0000000..5927ced Binary files /dev/null and b/www/sunders/images/link-how-en.png differ diff --git a/www/sunders/images/link-how-es.png b/www/sunders/images/link-how-es.png new file mode 100644 index 0000000..3c6f770 Binary files /dev/null and b/www/sunders/images/link-how-es.png differ diff --git a/www/sunders/images/link-how-fr.png b/www/sunders/images/link-how-fr.png new file mode 100644 index 0000000..f35f8aa Binary files /dev/null and b/www/sunders/images/link-how-fr.png differ diff --git a/www/sunders/images/link-how-it.png b/www/sunders/images/link-how-it.png new file mode 100644 index 0000000..d14bfa0 Binary files /dev/null and b/www/sunders/images/link-how-it.png differ diff --git a/www/sunders/images/link-how-ru.png b/www/sunders/images/link-how-ru.png new file mode 100644 index 0000000..5927ced Binary files /dev/null and b/www/sunders/images/link-how-ru.png differ diff --git a/www/sunders/images/link-what-de.png b/www/sunders/images/link-what-de.png new file mode 100644 index 0000000..e2a2ae4 Binary files /dev/null and b/www/sunders/images/link-what-de.png differ diff --git a/www/sunders/images/link-what-en.png b/www/sunders/images/link-what-en.png new file mode 100644 index 0000000..01b34e4 Binary files /dev/null and b/www/sunders/images/link-what-en.png differ diff --git a/www/sunders/images/link-what-es.png b/www/sunders/images/link-what-es.png new file mode 100644 index 0000000..07041a4 Binary files /dev/null and b/www/sunders/images/link-what-es.png differ diff --git a/www/sunders/images/link-what-fr.png b/www/sunders/images/link-what-fr.png new file mode 100644 index 0000000..24ffb15 Binary files /dev/null and b/www/sunders/images/link-what-fr.png differ diff --git a/www/sunders/images/link-what-it.png b/www/sunders/images/link-what-it.png new file mode 100644 index 0000000..3474e7f Binary files /dev/null and b/www/sunders/images/link-what-it.png differ diff --git a/www/sunders/images/link-what-ru.png b/www/sunders/images/link-what-ru.png new file mode 100644 index 0000000..01b34e4 Binary files /dev/null and b/www/sunders/images/link-what-ru.png differ diff --git a/www/sunders/images/link-where-de.png b/www/sunders/images/link-where-de.png new file mode 100644 index 0000000..15cd85a Binary files /dev/null and b/www/sunders/images/link-where-de.png differ diff --git a/www/sunders/images/link-where-en.png b/www/sunders/images/link-where-en.png new file mode 100644 index 0000000..71b183d Binary files /dev/null and b/www/sunders/images/link-where-en.png differ diff --git a/www/sunders/images/link-where-es.png b/www/sunders/images/link-where-es.png new file mode 100644 index 0000000..ad3d8d2 Binary files /dev/null and b/www/sunders/images/link-where-es.png differ diff --git a/www/sunders/images/link-where-fr.png b/www/sunders/images/link-where-fr.png new file mode 100644 index 0000000..c761895 Binary files /dev/null and b/www/sunders/images/link-where-fr.png differ diff --git a/www/sunders/images/link-where-it.png b/www/sunders/images/link-where-it.png new file mode 100644 index 0000000..3bf5c11 Binary files /dev/null and b/www/sunders/images/link-where-it.png differ diff --git a/www/sunders/images/link-where-ru.png b/www/sunders/images/link-where-ru.png new file mode 100644 index 0000000..71b183d Binary files /dev/null and b/www/sunders/images/link-where-ru.png differ diff --git a/www/sunders/images/lock-insecure.png b/www/sunders/images/lock-insecure.png new file mode 100644 index 0000000..b21b5ec Binary files /dev/null and b/www/sunders/images/lock-insecure.png differ diff --git a/www/sunders/images/lock-secure.png b/www/sunders/images/lock-secure.png new file mode 100644 index 0000000..eb3d851 Binary files /dev/null and b/www/sunders/images/lock-secure.png differ diff --git a/www/sunders/images/logo.png b/www/sunders/images/logo.png new file mode 100644 index 0000000..8707280 Binary files /dev/null and b/www/sunders/images/logo.png differ diff --git a/www/sunders/images/panning.png b/www/sunders/images/panning.png new file mode 100644 index 0000000..52a0a59 Binary files /dev/null and b/www/sunders/images/panning.png differ diff --git a/www/sunders/images/panningAll.png b/www/sunders/images/panningAll.png new file mode 100644 index 0000000..329cb62 Binary files /dev/null and b/www/sunders/images/panningAll.png differ diff --git a/www/sunders/images/panningBlue.png b/www/sunders/images/panningBlue.png new file mode 100644 index 0000000..3fc7e4b Binary files /dev/null and b/www/sunders/images/panningBlue.png differ diff --git a/www/sunders/images/panningGreen.png b/www/sunders/images/panningGreen.png new file mode 100644 index 0000000..59bdcd6 Binary files /dev/null and b/www/sunders/images/panningGreen.png differ diff --git a/www/sunders/images/panningRed.png b/www/sunders/images/panningRed.png new file mode 100644 index 0000000..f07e4eb Binary files /dev/null and b/www/sunders/images/panningRed.png differ diff --git a/www/sunders/images/slider-toggle.png b/www/sunders/images/slider-toggle.png new file mode 100644 index 0000000..b196c50 Binary files /dev/null and b/www/sunders/images/slider-toggle.png differ diff --git a/www/sunders/images/title-how-de.png b/www/sunders/images/title-how-de.png new file mode 100644 index 0000000..fdf6011 Binary files /dev/null and b/www/sunders/images/title-how-de.png differ diff --git a/www/sunders/images/title-how-en.png b/www/sunders/images/title-how-en.png new file mode 100644 index 0000000..35a71f5 Binary files /dev/null and b/www/sunders/images/title-how-en.png differ diff --git a/www/sunders/images/title-how-es.png b/www/sunders/images/title-how-es.png new file mode 100644 index 0000000..a7585db Binary files /dev/null and b/www/sunders/images/title-how-es.png differ diff --git a/www/sunders/images/title-how-fr.png b/www/sunders/images/title-how-fr.png new file mode 100644 index 0000000..c5f0b93 Binary files /dev/null and b/www/sunders/images/title-how-fr.png differ diff --git a/www/sunders/images/title-how-it.png b/www/sunders/images/title-how-it.png new file mode 100644 index 0000000..5aeaf64 Binary files /dev/null and b/www/sunders/images/title-how-it.png differ diff --git a/www/sunders/images/title-how-ru.png b/www/sunders/images/title-how-ru.png new file mode 100644 index 0000000..35a71f5 Binary files /dev/null and b/www/sunders/images/title-how-ru.png differ diff --git a/www/sunders/images/title-mea.png b/www/sunders/images/title-mea.png new file mode 100644 index 0000000..0a2f35a Binary files /dev/null and b/www/sunders/images/title-mea.png differ diff --git a/www/sunders/images/title-sunders.png b/www/sunders/images/title-sunders.png new file mode 100644 index 0000000..b0f8e8c Binary files /dev/null and b/www/sunders/images/title-sunders.png differ diff --git a/www/sunders/images/title-what-de.png b/www/sunders/images/title-what-de.png new file mode 100644 index 0000000..38ad345 Binary files /dev/null and b/www/sunders/images/title-what-de.png differ diff --git a/www/sunders/images/title-what-en.png b/www/sunders/images/title-what-en.png new file mode 100644 index 0000000..64b3a7b Binary files /dev/null and b/www/sunders/images/title-what-en.png differ diff --git a/www/sunders/images/title-what-es.png b/www/sunders/images/title-what-es.png new file mode 100644 index 0000000..03d435b Binary files /dev/null and b/www/sunders/images/title-what-es.png differ diff --git a/www/sunders/images/title-what-fr.png b/www/sunders/images/title-what-fr.png new file mode 100644 index 0000000..222cb27 Binary files /dev/null and b/www/sunders/images/title-what-fr.png differ diff --git a/www/sunders/images/title-what-it.png b/www/sunders/images/title-what-it.png new file mode 100644 index 0000000..f073ae2 Binary files /dev/null and b/www/sunders/images/title-what-it.png differ diff --git a/www/sunders/images/title-what-ru.png b/www/sunders/images/title-what-ru.png new file mode 100644 index 0000000..64b3a7b Binary files /dev/null and b/www/sunders/images/title-what-ru.png differ diff --git a/www/sunders/images/title-where-de.png b/www/sunders/images/title-where-de.png new file mode 100644 index 0000000..47bfae8 Binary files /dev/null and b/www/sunders/images/title-where-de.png differ diff --git a/www/sunders/images/title-where-en.png b/www/sunders/images/title-where-en.png new file mode 100644 index 0000000..59444bd Binary files /dev/null and b/www/sunders/images/title-where-en.png differ diff --git a/www/sunders/images/title-where-es.png b/www/sunders/images/title-where-es.png new file mode 100644 index 0000000..edae71b Binary files /dev/null and b/www/sunders/images/title-where-es.png differ diff --git a/www/sunders/images/title-where-fr.png b/www/sunders/images/title-where-fr.png new file mode 100644 index 0000000..4920c3e Binary files /dev/null and b/www/sunders/images/title-where-fr.png differ diff --git a/www/sunders/images/title-where-it.png b/www/sunders/images/title-where-it.png new file mode 100644 index 0000000..770e7d9 Binary files /dev/null and b/www/sunders/images/title-where-it.png differ diff --git a/www/sunders/images/title-where-ru.png b/www/sunders/images/title-where-ru.png new file mode 100644 index 0000000..59444bd Binary files /dev/null and b/www/sunders/images/title-where-ru.png differ diff --git a/www/sunders/images/todo_cam.png b/www/sunders/images/todo_cam.png new file mode 100644 index 0000000..4ab5fb5 Binary files /dev/null and b/www/sunders/images/todo_cam.png differ diff --git a/www/sunders/images/todo_camAll.png b/www/sunders/images/todo_camAll.png new file mode 100644 index 0000000..0fb77a4 Binary files /dev/null and b/www/sunders/images/todo_camAll.png differ diff --git a/www/sunders/images/todo_camBlue.png b/www/sunders/images/todo_camBlue.png new file mode 100644 index 0000000..e044c8c Binary files /dev/null and b/www/sunders/images/todo_camBlue.png differ diff --git a/www/sunders/images/todo_camGreen.png b/www/sunders/images/todo_camGreen.png new file mode 100644 index 0000000..d3bcbcc Binary files /dev/null and b/www/sunders/images/todo_camGreen.png differ diff --git a/www/sunders/images/todo_camRed.png b/www/sunders/images/todo_camRed.png new file mode 100644 index 0000000..d84f19e Binary files /dev/null and b/www/sunders/images/todo_camRed.png differ diff --git a/www/sunders/images/todo_dome.png b/www/sunders/images/todo_dome.png new file mode 100644 index 0000000..faf9ac0 Binary files /dev/null and b/www/sunders/images/todo_dome.png differ diff --git a/www/sunders/images/todo_domeAll.png b/www/sunders/images/todo_domeAll.png new file mode 100644 index 0000000..4d0ef2d Binary files /dev/null and b/www/sunders/images/todo_domeAll.png differ diff --git a/www/sunders/images/todo_domeBlue.png b/www/sunders/images/todo_domeBlue.png new file mode 100644 index 0000000..7897384 Binary files /dev/null and b/www/sunders/images/todo_domeBlue.png differ diff --git a/www/sunders/images/todo_domeGreen.png b/www/sunders/images/todo_domeGreen.png new file mode 100644 index 0000000..b1015f8 Binary files /dev/null and b/www/sunders/images/todo_domeGreen.png differ diff --git a/www/sunders/images/todo_domeRed.png b/www/sunders/images/todo_domeRed.png new file mode 100644 index 0000000..f91ac40 Binary files /dev/null and b/www/sunders/images/todo_domeRed.png differ diff --git a/www/sunders/images/todo_fixed.png b/www/sunders/images/todo_fixed.png new file mode 100644 index 0000000..eaf86f3 Binary files /dev/null and b/www/sunders/images/todo_fixed.png differ diff --git a/www/sunders/images/todo_fixedAll.png b/www/sunders/images/todo_fixedAll.png new file mode 100644 index 0000000..0575218 Binary files /dev/null and b/www/sunders/images/todo_fixedAll.png differ diff --git a/www/sunders/images/todo_fixedBlue.png b/www/sunders/images/todo_fixedBlue.png new file mode 100644 index 0000000..35f5133 Binary files /dev/null and b/www/sunders/images/todo_fixedBlue.png differ diff --git a/www/sunders/images/todo_fixedGreen.png b/www/sunders/images/todo_fixedGreen.png new file mode 100644 index 0000000..f28c82d Binary files /dev/null and b/www/sunders/images/todo_fixedGreen.png differ diff --git a/www/sunders/images/todo_fixedRed.png b/www/sunders/images/todo_fixedRed.png new file mode 100644 index 0000000..42a43ed Binary files /dev/null and b/www/sunders/images/todo_fixedRed.png differ diff --git a/www/sunders/images/todo_guard.png b/www/sunders/images/todo_guard.png new file mode 100644 index 0000000..ba85599 Binary files /dev/null and b/www/sunders/images/todo_guard.png differ diff --git a/www/sunders/images/todo_guardAll.png b/www/sunders/images/todo_guardAll.png new file mode 100644 index 0000000..8b1f56f Binary files /dev/null and b/www/sunders/images/todo_guardAll.png differ diff --git a/www/sunders/images/todo_guardBlue.png b/www/sunders/images/todo_guardBlue.png new file mode 100644 index 0000000..e42b0fc Binary files /dev/null and b/www/sunders/images/todo_guardBlue.png differ diff --git a/www/sunders/images/todo_guardGreen.png b/www/sunders/images/todo_guardGreen.png new file mode 100644 index 0000000..e678c31 Binary files /dev/null and b/www/sunders/images/todo_guardGreen.png differ diff --git a/www/sunders/images/todo_guardRed.png b/www/sunders/images/todo_guardRed.png new file mode 100644 index 0000000..33d80e1 Binary files /dev/null and b/www/sunders/images/todo_guardRed.png differ diff --git a/www/sunders/images/todo_panning.png b/www/sunders/images/todo_panning.png new file mode 100644 index 0000000..fc0b320 Binary files /dev/null and b/www/sunders/images/todo_panning.png differ diff --git a/www/sunders/images/todo_panningAll.png b/www/sunders/images/todo_panningAll.png new file mode 100644 index 0000000..8e2b7bd Binary files /dev/null and b/www/sunders/images/todo_panningAll.png differ diff --git a/www/sunders/images/todo_panningBlue.png b/www/sunders/images/todo_panningBlue.png new file mode 100644 index 0000000..9fa6b07 Binary files /dev/null and b/www/sunders/images/todo_panningBlue.png differ diff --git a/www/sunders/images/todo_panningGreen.png b/www/sunders/images/todo_panningGreen.png new file mode 100644 index 0000000..f9f5eba Binary files /dev/null and b/www/sunders/images/todo_panningGreen.png differ diff --git a/www/sunders/images/todo_panningRed.png b/www/sunders/images/todo_panningRed.png new file mode 100644 index 0000000..6bde24b Binary files /dev/null and b/www/sunders/images/todo_panningRed.png differ diff --git a/www/sunders/images/todo_traffic.png b/www/sunders/images/todo_traffic.png new file mode 100644 index 0000000..400ca90 Binary files /dev/null and b/www/sunders/images/todo_traffic.png differ diff --git a/www/sunders/images/traffic.png b/www/sunders/images/traffic.png new file mode 100644 index 0000000..ae6f67e Binary files /dev/null and b/www/sunders/images/traffic.png differ diff --git a/www/sunders/images/yarrow-up.png b/www/sunders/images/yarrow-up.png new file mode 100644 index 0000000..f29a942 Binary files /dev/null and b/www/sunders/images/yarrow-up.png differ diff --git a/www/sunders/index.php b/www/sunders/index.php new file mode 100644 index 0000000..d8fe490 --- /dev/null +++ b/www/sunders/index.php @@ -0,0 +1,301 @@ + 19) { + $initialZoom = DEFAULT_ZOOM; + } + } + + /* Check if the URL contains a numeric lat value and a numeric lon value. + If not use DEFAULT_LAT and DEFAULT_LON from config.php. */ + if (array_key_exists('lat', $_GET) && array_key_exists('lon', $_GET)) { + $initialLat = $_GET['lat']; + $initialLon = $_GET['lon']; + if (!is_numeric($initialLat) || !is_numeric($initialLon)) { + $initialLat = DEFAULT_LAT; + $initialLon = DEFAULT_LON; + } + } + + $sliderToggleChecked = 'checked="checked"'; + $embQueryFirst = ''; + $embedPerma = 'null'; + $embedMode = ''; + if (array_key_exists('emb', $_GET)) { + $embedMode = $_GET['emb']; + if ($embedMode == 'wosb') { + $sliderToggleChecked = ''; + } + } + + $useStatistics = USE_STATISTICS; +?> + + + + + + + + + Surveillance under Surveillance + + + + + + + + + + + + + + + + + + + + + if (window.self !== window.top) { + window.top.location.href="./sunders.html"; + } + '; + } else { + $embQuery = 'emb='.$embedMode; + $embQueryFirst = '?'.$embQuery; + $embedPerma = '\''.$embedMode.'\''; + } + ?> + + > + + + + +
+ + + +
+ +
+ +
+
+ + + + +
+ '; + } + ?> + +
+ +
+
+
+ + +
+
+ +
+
+
+
+
+
+
+
+
+ +
+ + + '.$subtitle.'
'; + } + + if (! empty($translation)) { + echo '
'.$translation.'
'; + } + ?> + +
+
+ <?php echo translate($i18nCommon, $i18nCommonDefault, 'what-alt', [], [], []) ?> +
+
+

+
+
+

+
+ + + +
+
+ <?php echo translate($i18nCommon, $i18nCommonDefault, 'how-alt', [], [], []) ?> +
+
+

+
+
+

+
+
+

+
+ + + + + + + + + +
+
+ <?php echo translate($i18nCommon, $i18nCommonDefault, 'where-alt', [], [], []) ?> +
+
+

+
+ + + + +
+ + + + + + + + + + + + + diff --git a/www/sunders/it/camera.php b/www/sunders/it/camera.php new file mode 100644 index 0000000..d85146c --- /dev/null +++ b/www/sunders/it/camera.php @@ -0,0 +1,3 @@ + diff --git a/www/sunders/it/index.php b/www/sunders/it/index.php new file mode 100644 index 0000000..b285747 --- /dev/null +++ b/www/sunders/it/index.php @@ -0,0 +1,6 @@ + diff --git a/www/sunders/it/stats/index.php b/www/sunders/it/stats/index.php new file mode 100644 index 0000000..662cc1f --- /dev/null +++ b/www/sunders/it/stats/index.php @@ -0,0 +1,6 @@ + diff --git a/www/sunders/js/leafletembed_functions.js b/www/sunders/js/leafletembed_functions.js new file mode 100644 index 0000000..cb199a0 --- /dev/null +++ b/www/sunders/js/leafletembed_functions.js @@ -0,0 +1,457 @@ +var ajaxRequest; +var map; +var osmTiles; +var plotList; +var plotLayers = []; +var footprintPolygon; + +// Returns the value of URL parameter #name. +function getUrlParameter(name) { + name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]'); + var regex = new RegExp('[\\?&]' + name + '=([^&#]*)'); + var results = regex.exec(window.location.search); + return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' ')); +} + +// Draw the map for the first time. +function initMap() { + // Set up the AJAX request. + ajaxRequest=getXmlHttpRequest(); + if (ajaxRequest == null) { + alert('This browser does not support HTTP requests.'); + return; + } + + // --- URLSearchParams is not supported by all browsers --- + // var urlParams = new URLSearchParams(window.location.search); + // var embedMode = urlParams.get('emb'); + var embedMode = getUrlParameter('emb'); + if (embedMode !== '') { + embedMode = '\'' + embedMode + '\''; + } + + // Set up the OSM tile layer with correct attribution + var osmUrl = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'; + // var osmUrl = ''; + var dataAttrib = '© OpenStreetMap contributors'; + var permalink = 'Permalink'; + var mapAttrib = dataAttrib + ' | ' + permalink; + osmTiles = new L.TileLayer(osmUrl, {minZoom: 4, maxZoom: 19, attribution: mapAttrib}); + + // Set up the map. + map = new L.Map('map', {maxZoom: 19}); + map.zoomControl.setPosition('topleft'); + map.attributionControl.setPosition('bottomleft'); + map.setView(new L.LatLng(initialLat, initialLon), initialZoom); + map.addLayer(osmTiles); + addPlots(); + map.on('moveend', onMapMoved); +} + +// Return XMLHttpRequest. +function getXmlHttpRequest() { + if (window.XMLHttpRequest) { return new XMLHttpRequest(); } + if (window.ActiveXObject) { return new ActiveXObject('Microsoft.XMLHTTP'); } + return null; +} + +// Create an URL for the current location and use this URL to reload the map. +function getPermalink(switchToLanguage, embedMode) { + var center = map.getCenter(); + var lat = Math.round(center.lat * 100000000) / 100000000; + var lon = Math.round(center.lng * 100000000) / 100000000; + var serverUrl = location.protocol + '//' + location.host + location.pathname; + var embQuery = ''; + + if (switchToLanguage != null) { + var supportedLanguages = [ 'de', 'en', 'es', 'fr', 'it', 'ru' ]; + var urlLanguage = (serverUrl.slice(-3)).substring(0, 2); + + if ((serverUrl.slice(-4)).substring(0, 1) == '/' && supportedLanguages.includes(urlLanguage)) { + serverUrl = serverUrl.substring(0, serverUrl.length - 3); + } + serverUrl = serverUrl + switchToLanguage; + } + + if (embedMode != null) { + embQuery = '&emb=' + embedMode; + } + + var permalinkUrl = serverUrl + '?lat=' + lat + '&lon=' + lon + '&zoom=' + map.getZoom() + embQuery; + + return permalinkUrl; +} + +// Use the permalink URL to reload the map. +function permalink(switchToLanguage, embedMode) { + window.location = getPermalink(switchToLanguage, embedMode); +} + +// Add plots to map. +function addPlots() { + var bounds = map.getBounds(); + var boundsSW = bounds.getSouthWest(); + var boundsNE = bounds.getNorthEast(); + // extend bounds, to also draw cameras that are located just outside the screen, but whose observation area may be inside + boundsSW.lng -= 0.001; + boundsSW.lat -= 0.001; + boundsNE.lng += 0.001; + boundsNE.lat += 0.001; + var size = map.getSize(); + var url = 'camera.php?bbox=' + boundsSW.lng + ',' + boundsSW.lat + ',' + boundsNE.lng + ',' + boundsNE.lat + '&zoom=' + map.getZoom() + '&width=' + size.x + '&height=' + size.y; + ajaxRequest.onreadystatechange = onStateChanged; + ajaxRequest.open('GET', url, true); + ajaxRequest.send(null); +} + +// Remove all markers from map. +function removeMarkers() { + for (i=0; i' + plot.count + ''; + } else { + countTxt = plot.count; + } + + plotIcon = eval('compositeCamerasIcon'); + + return( + new L.Marker(plotLatLng, { icon: plotIcon }).bindTooltip(countTxt, { + permanent: true, + interactive: true, + direction: 'right', + className: 'composite-cameras-label' + }) + ); +} + +/* Draw a footprint that represents the area composite cameras are located in. + polygonCoordinates is a string like this: + [{"lat":"42.9992737", "lon":"23.2704823"},{"lat":"42.9974195", "lon":"23.2713401"},{"lat":"42.9993203", "lon":"23.2706528"}] */ +function drawFootprint(polygonCoordinates) { + polygonCoordinates = JSON.parse(polygonCoordinates); + var polygonPoints = []; + for (x in eval(polygonCoordinates)) { + polygonPoints.push(new L.LatLng(polygonCoordinates[x]['lat'], polygonCoordinates[x]['lon'])); + } + if (footprintPolygon != null) { + map.removeLayer(footprintPolygon); + } + footprintPolygon = L.polygon(polygonPoints, { color:'#0192d9', weight : 1, fillOpacity:0.1 }); + footprintPolygon.addTo(map); +} + +// Get plot type (public, outdoor, indoor) +function getPlotType(plot) { + return(plot['surveillance']); +} + +// Add camera icon. +function getPlotMarkerCamera(plot, plotLatLng, plotType) { + // Get icon name for current camera or guard: fixed, dome, guard + var iconName = 'cam'; + if (plot['camera:type'] == 'fixed') { + iconName = 'fixed'; + } else if (plot['camera:type'] == 'panning') { + iconName = 'panning'; + } else if (plot['camera:type'] == 'dome') { + iconName = 'dome'; + } else if (plot['surveillance:type'] == 'guard') { + iconName = 'guard'; + } + + /* Add postfix for cameras and guards according to their location: + Red (public outdoor areas), Blue (private outdoor areas), Green (indoor) */ + if (plotType == 'public') { + iconName = iconName + 'Red'; + } else if (plotType == 'indoor' ) { + iconName = iconName + 'Green'; + } else if (plotType == 'outdoor' ) { + iconName = iconName + 'Blue'; + } + + // Get icon name for current traffic camera + if (plot['surveillance:type'] == 'ALPR' || plotType == 'red_light' || plotType == 'level_crossing' || plotType == 'speed_camera') { + iconName = 'traffic'; + } + + // Add prefix for cameras and guards marked with a 'fixme' key: todo_ + if (plot['fixme'] != null) { + iconName = 'todo_' + iconName; + } + + iconName = iconName + 'Icon'; + plotIcon = eval(iconName); // see leafletembed_icons.js + return(new L.Marker(plotLatLng, {icon : plotIcon})); +} + +// Get camera height. +function getCameraHeight(plot) { + var cameraHeight = plot['height']; + if (! isNumeric(cameraHeight)) { + cameraHeight = 5; + } else if (cameraHeight < 3) { + cameraHeight = 3; + } else if (cameraHeight > 12) { + cameraHeight = 12; + } + return(cameraHeight); +} + +// Get focus radius for height. +function getRadiusForHeight(cameraHeight) { + return(cameraHeight * 7); +} + +// Get camera direction. +function getCameraDirection(plot) { + var cameraDirection = plot['camera:direction']; + if (cameraDirection == null) { + cameraDirection = plot['direction']; + if (cameraDirection == null) { + cameraDirection = plot['surveillance:direction']; + } + } + if (cameraDirection == 'N') { + cameraDirection = 0; + } else if (cameraDirection == 'NE') { + cameraDirection = 45; + } else if (cameraDirection == 'E') { + cameraDirection = 90; + } else if (cameraDirection == 'SE') { + cameraDirection = 135; + } else if (cameraDirection == 'S') { + cameraDirection = 180; + } else if (cameraDirection == 'SW') { + cameraDirection = 225; + } else if (cameraDirection == 'W') { + cameraDirection = 270; + } else if (cameraDirection == 'NW') { + cameraDirection = 315; + } + if (isNumeric(cameraDirection)) { + return(cameraDirection * 1); + } +} + +// Get focus color. +function getFocusColor(plotType) { + var focusColor = '#6c5d53'; + if (plotType == 'public') { + focusColor = '#d40055'; + } else if (plotType == 'indoor' ) { + focusColor = '#00d455'; + } else if (plotType == 'outdoor' ) { + focusColor = '#0055d4'; + } + return(focusColor); +} + +// Get camera angle. +function getCameraAngle(plot) { + // 0° = horizontal view + // 90° = vertical view to bottom + // 180° = horizontal view to opposite direction + // 270° = vertical view to sky + // If camera angle is between 90° and 270° the camera looks to the oposite direction. + var cameraAngle = plot['camera:angle']; + if (cameraAngle < 0) { + cameraAngle = -cameraAngle; + } + if (cameraAngle == null || !isNumeric(cameraAngle)) { + cameraAngle = 15; + } + return(cameraAngle); +} + +// Get camera angle type. +function getCameraAngleType(cameraAngle) { + var cameraAngleType = 'regular'; + var tmpAngle = (cameraAngle * 1 + 90) / 180 + var quotient = Math.floor(tmpAngle); + var remainder = tmpAngle % 1; + if (quotient % 2 != 0) { + cameraAngleType = 'opposite'; + } + if ((cameraAngleType == 'regular' && remainder >= 175.5 / 180) || (cameraAngleType == 'opposite' && remainder <= 4.5 / 180)) { + cameraAngleType = 'ground'; + } else if ((cameraAngleType == 'opposite' && remainder >= 175.5 / 180) || (cameraAngleType == 'regular' && remainder <= 4.5 / 180)) { + cameraAngleType = 'sky'; + } + return(cameraAngleType); +} + +// Get camera angle factor. +function getCameraAngleFactor(angle) { + cameraAngle = Math.cos(((angle) * 207986.0) / 11916720); + return(cameraAngle); +} + +// Draw fixed camera focus. +function drawCameraFocusFixed(plotLatLng, focusDirection, focusRadius, focusSize, focusColor) { + return(new L.semiCircle(plotLatLng, { radius: focusRadius, weight:1, color:focusColor, fillOpacity:0.1 }).setDirection(focusDirection, focusSize)); +} + + +// Draw dome focus. +function drawCameraFocusDome(plotLatLng, focusRadius, focusColor) { + return(new L.Circle(plotLatLng, focusRadius, { weight:1, color:focusColor, fillOpacity:0.1 })); +} + +// Add camera popup to camera marker. +function addCameraDetailsData(plotMarker, plot) { + popupDataTable = '' + + '' + // + '' + + '' + + ''; + for (x in plot) { + if (plot[x] !== '' && x != 'multi' && x != 'id' && x != 'userid' && x != 'lat' && x != 'lon') { + popupDataTable = popupDataTable + ''; + } + } + popupDataTable = popupDataTable +''; + + plotMarker.bindPopup(popupDataTable, {autoPan:false, maxWidth:400}); + + plotMarker.on('click', onClick); +} + +function isNumeric(s) { + var intRegex = /^\d+$/; + var floatRegex = /^((\d+(\.\d *)?)|((\d*\.)?\d+))$/; + return ((intRegex.test(s) || floatRegex.test(s))); +} + +initMap() diff --git a/www/sunders/js/leafletembed_icons.js b/www/sunders/js/leafletembed_icons.js new file mode 100644 index 0000000..0e907a2 --- /dev/null +++ b/www/sunders/js/leafletembed_icons.js @@ -0,0 +1,313 @@ +/* Label with number of composite cameras. */ +var compositeCamerasIcon = L.icon({ + iconUrl: 'images/icon.png', + iconSize: [0, 0], + iconAnchor: [0, 0], + labelAnchor: [-6, 0] +}); + +/* Gray icons for non-specific cameras and guards. */ +var camIcon = L.icon({ + iconUrl: 'images/cam.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var fixedIcon = L.icon({ + iconUrl: 'images/fixed.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var panningIcon = L.icon({ + iconUrl: 'images/panning.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var domeIcon = L.icon({ + iconUrl: 'images/dome.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var guardIcon = L.icon({ + iconUrl: 'images/guard.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var trafficIcon = L.icon({ + iconUrl: 'images/traffic.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +/* Blue icons for outdoor cameras and guards. + Those cameras and guards surveil only private, i.e. non-public areas. */ +var camBlueIcon = L.icon({ + iconUrl: 'images/camBlue.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var fixedBlueIcon = L.icon({ + iconUrl: 'images/fixedBlue.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var panningBlueIcon = L.icon({ + iconUrl: 'images/panningBlue.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var domeBlueIcon = L.icon({ + iconUrl: 'images/domeBlue.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var guardBlueIcon = L.icon({ + iconUrl: 'images/guardBlue.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +/* Green icons for indoor cameras and guards. */ +var camGreenIcon = L.icon({ + iconUrl: 'images/camGreen.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var fixedGreenIcon = L.icon({ + iconUrl: 'images/fixedGreen.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var panningGreenIcon = L.icon({ + iconUrl: 'images/panningGreen.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var domeGreenIcon = L.icon({ + iconUrl: 'images/domeGreen.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var guardGreenIcon = L.icon({ + iconUrl: 'images/guardGreen.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +/* Red icons for outdoor cameras and guards. + Those cameras and guards surveil public, i.e. non-private areas. */ +var camRedIcon = L.icon({ + iconUrl: 'images/camRed.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var fixedRedIcon = L.icon({ + iconUrl: 'images/fixedRed.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var panningRedIcon = L.icon({ + iconUrl: 'images/panningRed.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var domeRedIcon = L.icon({ + iconUrl: 'images/domeRed.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var guardRedIcon = L.icon({ + iconUrl: 'images/guardRed.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +/* Gray-yellow icons for non-specific cameras and guards marked with a 'fixme' key. */ +var todo_camIcon = L.icon({ + iconUrl: 'images/todo_cam.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var todo_fixedIcon = L.icon({ + iconUrl: 'images/todo_fixed.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var todo_panningIcon = L.icon({ + iconUrl: 'images/todo_panning.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var todo_domeIcon = L.icon({ + iconUrl: 'images/todo_dome.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var todo_guardIcon = L.icon({ + iconUrl: 'images/todo_guard.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var todo_trafficIcon = L.icon({ + iconUrl: 'images/todo_traffic.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +/* Blue-yellow icons for outdoor cameras and guards marked with a 'fixme' key. + Those cameras and guards surveil only private, i.e. non-public areas. */ +var todo_camBlueIcon = L.icon({ + iconUrl: 'images/todo_camBlue.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var todo_fixedBlueIcon = L.icon({ + iconUrl: 'images/todo_fixedBlue.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var todo_panningBlueIcon = L.icon({ + iconUrl: 'images/todo_panningBlue.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var todo_domeBlueIcon = L.icon({ + iconUrl: 'images/todo_domeBlue.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var todo_guardBlueIcon = L.icon({ + iconUrl: 'images/todo_guardBlue.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +/* Green-yellow icons for indoor cameras and guards marked with a 'fixme' key. */ +var todo_camGreenIcon = L.icon({ + iconUrl: 'images/todo_camGreen.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var todo_fixedGreenIcon = L.icon({ + iconUrl: 'images/todo_fixedGreen.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var todo_panningGreenIcon = L.icon({ + iconUrl: 'images/todo_panningGreen.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var todo_domeGreenIcon = L.icon({ + iconUrl: 'images/todo_domeGreen.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var todo_guardGreenIcon = L.icon({ + iconUrl: 'images/todo_guardGreen.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +/* Red-yellow icons for outdoor cameras and guards marked with a 'fixme' key. + Those cameras and guards surveil public, i.e. non-private areas. */ +var todo_camRedIcon = L.icon({ + iconUrl: 'images/todo_camRed.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var todo_fixedRedIcon = L.icon({ + iconUrl: 'images/todo_fixedRed.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var todo_panningRedIcon = L.icon({ + iconUrl: 'images/todo_panningRed.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var todo_domeRedIcon = L.icon({ + iconUrl: 'images/todo_domeRed.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); + +var todo_guardRedIcon = L.icon({ + iconUrl: 'images/todo_guardRed.png', + iconSize: [20, 20], + iconAnchor: [10, 10], + popupAnchor : [0, -10] +}); diff --git a/www/sunders/js/search.js b/www/sunders/js/search.js new file mode 100644 index 0000000..4ba00a0 --- /dev/null +++ b/www/sunders/js/search.js @@ -0,0 +1,113 @@ +var searchLimit; + +function displaySearchOverlay() { + document.getElementById('search-overlay').style.display = 'block'; +} + +// Close the search overlay. +function closeSearchOverlay() { + document.getElementById('search-overlay').style.display = 'none'; + document.getElementById('search-results-overlay').style.display = 'none'; + document.getElementById('buttonbar').style.bottom = ''; +} + +// Search for possible locations +function searchLocation(maxResults) { + var searchString = document.getElementById('search-input').value; + + if (searchString) { + + document.getElementById('buttonbar').style.bottom = 0; + document.getElementById('search-results-overlay').style.display = 'block'; + + var spinnerDiv = '
'; + for (var i=1; i<=10; i++) { + spinnerDiv += '
▬▬
'; + } + spinnerDiv += '
'; + + document.getElementById('search-results-list-block').style.display = 'none'; + document.getElementById('search-spinner').innerHTML = spinnerDiv; + document.getElementById('search-spinner-block').style.display = 'block'; + + if (maxResults) { + searchLimit = maxResults; + } else { + // Search one more than required to check if there are more results and a 'next' button is required. + searchLimit = 11; + } + + var searchScript = document.createElement('script'); + searchScript.src = 'https://nominatim.openstreetmap.org/search.php?q=' + searchString + '&format=json&json_callback=parseResult&limit=' + searchLimit; + document.body.appendChild(searchScript); + } +} + +function parseResult(response) { + var searchResultDivs = ''; + + if (response.length == searchLimit) { + var lastResultIndex = searchLimit - 1; + var nextSearchLimit = searchLimit + 10; + } else { + var lastResultIndex = response.length; + } + + if (lastResultIndex > 10) { + var previousSearchLimit = searchLimit - 10; + } + + // Button to search for the previous 10 results. + if (previousSearchLimit) { + searchResultDivs += '
'; + } + + searchResultDivs += '
'; + + // Show the current 10 search results. + for (var i=searchLimit-11; i' + + '
' + searchResult.class + ' / ' + searchResult.type + '
' + + '
' + searchResult.display_name + '
' + + '
'; + } + + searchResultDivs += ''; + + // Button to search for the next 10 results. + if (nextSearchLimit) { + searchResultDivs += '
' + } + + document.getElementById('search-spinner-block').style.display = 'none'; + document.getElementById('search-results-list').innerHTML = searchResultDivs; + document.getElementById('search-results-list-block').style.display = 'block'; +} + +// Returns the value of URL parameter #name. +function getUrlParameter(name) { + name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]'); + var regex = new RegExp('[\\?&]' + name + '=([^&#]*)'); + var results = regex.exec(window.location.search); + return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' ')); +} + +// Open map for coordinates +function gotoLocation(lat, lon) { + var serverUrl = location.protocol + '//' + location.host + location.pathname; + var embQuery = ''; + + // --- URLSearchParams is not supported by all browsers --- + // var urlParams = new URLSearchParams(window.location.search); + // var embedMode = urlParams.get('emb'); + var embedMode = getUrlParameter('emb'); + if (embedMode != '') { + embQuery = '&emb=' + embedMode; + } + + var gotoUrl = serverUrl + '?lat=' + lat + '&lon=' + lon + '&zoom=' + map.getZoom() + embQuery; + + window.location = gotoUrl; +} diff --git a/www/sunders/json/credits.json b/www/sunders/json/credits.json new file mode 100644 index 0000000..86e7a78 --- /dev/null +++ b/www/sunders/json/credits.json @@ -0,0 +1,23 @@ +[ { "listTitle": "title-credits", + "listEntries": [ + { "type": "type-idea", + "credits": [ + { "credit": "osmcamera by khris78", "href-credit": "https://github.com/khris78/osmcamera", "license": "CC-BY-SA / MIT / GPLv3 / WTFPL", "href-license": "files/license_osmcamera.txt" } ] }, + { "type": "type-js", + "credits": [ + { "credit": "Leaflet", "href-credit": "https://github.com/Leaflet/Leaflet", "license": "BSD-2-Clause", "href-license": "files/license_Leaflet.txt" }, + { "credit": "Leaflet-Semicircle", "href-credit": "https://github.com/jieter/Leaflet-semicircle", "license": "MIT", "href-license": "files/license_Semicircle.txt" } ] }, + { "type": "type-map", + "credits": [ + { "credit": "OpenStreetMap contributors", "href-credit": "https://www.openstreetmap.org", "license": "ODbL / CC BY-SA", "href-license": "https://www.openstreetmap.org/copyright" } ] }, + { "type": "type-service", + "credits": [ + { "credit": "OpenStreetMap Nominatim", "href-credit": "https://nominatim.openstreetmap.org/", "license": "ODbL", "href-license": "https://www.openstreetmap.org/copyright" }, + { "credit": "GeoNames", "href-credit": "https://www.geonames.org/", "license": "CC BY 3.0", "href-license": "https://creativecommons.org/licenses/by/3.0/" } ] }, + { "type": "type-icon", + "credits": [ { + "credit": "Font Awesome", "href-credit": "https://fontawesome.com/", "license": "CC BY 4.0 / SIL OFL 1.1 / MIT", "href-license": "https://fontawesome.com/license/free" } ] }, + { "type": "type-font", + "credits": [ { + "credit": "Grabstein Grotesk", "href-credit": "https://fontlibrary.org/de/font/grabstein-grotesk", "license": "OLF", "href-license": "http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL" } ] } ] } +] diff --git a/www/sunders/json/links.json b/www/sunders/json/links.json new file mode 100644 index 0000000..f597479 --- /dev/null +++ b/www/sunders/json/links.json @@ -0,0 +1,58 @@ +[ { "listTitle": "eng", + "sections": [ + { "sectionTitle": "", "isExpandable": false, "isExpandedByDefault": true, "listEntries": [ + { "sourceText": "1984 Actionday", "href": "https://1984actionday.wordpress.com/", "linkText": "When will you fight back?" }, + { "sourceText": "ACLU", "href": "https://www.aclu.org/sites/default/files/field_document/061819-robot_surveillance.pdf", "linkText": "The Dawn of Robot Surveillance" }, + { "sourceText": "Adversarial Fashion", "href": "https://adversarialfashion.com/", "linkText": "Patterns on goods designed to trigger Automated License Plate Readers" }, + { "sourceText": "Atlas of Surveillance", "href": "https://atlasofsurveillance.org/", "linkText": "Documenting Police Tech in Our Communities" }, + { "sourceText": "Ban Facial Recognition", "href": "https://www.banfacialrecognition.com/", "linkText": "Ban Facial Recognition" }, + { "sourceText": "Ban Facial Recognition", "href": "https://www.banfacialrecognition.com/festivals/", "linkText": "Ban Facial Recognition at Festivals" }, + { "sourceText": "Ban Facial Recognition", "href": "https://ban-facial-recognition.wesign.it/droitshumains/ban-facial-recognition-europe", "linkText": "Ban Facial Recognition Europe!" }, + { "sourceText": "Electronic Frontier Foundation", "href": "https://www.eff.org/sls", "linkText": "Street Level Surveillance" }, + { "sourceText": "Every Two Years", "href": "https://everytwoyears.org/", "linkText": "Help Make Democracy" }, + { "sourceText": "Fawkes", "href": "http://sandlab.cs.uchicago.edu/fawkes/", "linkText": "Image “Cloaking” for Personal Privacy" }, + { "sourceText": "GitHub", "href": "https://github.com/unsurv", "linkText": "unsurv" }, + { "sourceText": "Insecam", "href": "https://www.insecam.org/", "linkText": "World biggest online cameras directory" }, + { "sourceText": "No CCTV", "href": "http://www.no-cctv.org.uk/", "linkText": "Campaigning against camera surveillance in the UK & beyond" }, + { "sourceText": "NYC Surveillance Camera Project", "href": "http://www.mediaeater.com/cameras/", "linkText": "NYC Surveillance Camera Project" }, + { "sourceText": "Reclaim Your Face", "href": "https://reclaimyourface.eu/", "linkText": "Reclaim Your Face" }, + { "sourceText": "S.T.O.P.", "href": "https://www.stopspying.org/", "linkText": "The Surveillance Technology Oversight Project" }, + { "sourceText": "Spy Blog", "href": "https://p10.secure.hostingprod.com/@spyblog.org.uk/ssl/spyblog/cctv-surveillance-cameras/", "linkText": "Category: CCTV surveillance cameras" }, + { "sourceText": "unsurv", "href": "https://www.unsurv.org/", "linkText": "unsurv.org" }, + { "sourceText": "Wikipedia", "href": "https://www.wikipedia.org/wiki/Mass_surveillance_in_the_United_States", "linkText": "Mass Surveillance in the United States" }, + { "sourceText": "Yale University", "href": "https://privacylab.yale.edu/", "linkText": "Privacy Lab" } + ] } + ] + }, + { "listTitle": "fra", + "sections": [ + { "sectionTitle": "", "isExpandable": false, "isExpandedByDefault": true, "listEntries": [ + { "sourceText": "Ban Facial Recognition", "href": "https://ban-facial-recognition.wesign.it/droitshumains/bannissons-la-reconnaissance-faciale-en-europe", "linkText": "Bannissons la reconnaissance faciale en Europe!" }, + { "sourceText": "BUG BROTHER", "href": "http://bugbrother.blog.lemonde.fr/", "linkText": "Qui surveillera les surveillants?" }, + { "sourceText": "LA QUADRATURE DU NET", "href": "https://www.laquadrature.net/fr", "linkText": "Internet & Libertés" }, + { "sourceText": "Reclaim Your Face", "href": "https://reclaimyourface.eu/fr/", "linkText": "Reclaim Your Face FR" }, + { "sourceText": "SOUS-SURVEILLANCE.NET", "href": "https://www.sous-surveillance.net/", "linkText": "Carte — Revue de presse — Projet" } + ] } + ] + }, + { "listTitle": "ger", + "sections": [ + { "sectionTitle": "", "isExpandable": false, "isExpandedByDefault": true, "listEntries": [ + { "sourceText": "AK Vorrat", "href": "http://wiki.vorratsdatenspeicherung.de/Arbeitsgruppe_Video%C3%BCberwachung", "linkText": "Arbeitsgruppe Videoüberwachung" }, + { "sourceText": "AK Vorrat", "href": "http://wiki.vorratsdatenspeicherung.de/images/Folder_cctv.pdf", "linkText": "Infobroschüre: Videoüberwachung? Sicherheit geht anders!" }, + { "sourceText": "AK Vorrat, Ortsgruppe Hannover", "href": "http://wiki.vorratsdatenspeicherung.de/Ortsgruppen/Hannover/Videoueberwachung_in_Hannover", "linkText": "Videoüberwachung in Hannover" }, + { "sourceText": "AKTION FREIHEIT STATT ANGST", "href": "https://www.aktion-freiheitstattangst.org/", "linkText": "Aktion Freiheit statt Angst e.V." }, + { "sourceText": "Ban Facial Recognition", "href": "https://ban-facial-recognition.wesign.it/droitshumains/verbot-der-gesichtserkennung-in-europa", "linkText": "Verbot der Gesichtserkennung in Europa!" }, + { "sourceText": "Benjamin J. Kees", "href": "https://algoropticon.de/", "linkText": "Algorithmisches Panopticon" }, + { "sourceText": "dieDatenschützer Rhein-Main", "href": "https://ddrm.de/category/videouberwachung-2/", "linkText": "Kategoriearchiv: Videoüberwachung" }, + { "sourceText": "EPICENTER.WORKS", "href": "https://epicenter.works/thema/face-recognition", "linkText": "Face Recognition - Gesichtserkennung" }, + { "sourceText": "EPICENTER.WORKS", "href": "https://überwachungspaket.at/", "linkText": "Stoppt das Überwachungspaket!" }, + { "sourceText": "Frag den Staat", "href": "https://fragdenstaat.de/anfrage/informationen-zum-projekt-sicherheitsbahnhof-berlin-sudkreuz/", "linkText": "Informationen zum „Projekt Sicherheitsbahnhof“ Berlin Südkreuz" }, + { "sourceText": "Frag den Staat", "href": "https://fragdenstaat.de/anfrage/datenschutzkonzept-fur-videouberwachung-am-bahnhof-berlin-sudkreuz/", "linkText": "Datenschutzkonzept für Videoüberwachung am Bahnhof Berlin Südkreuz" }, + { "sourceText": "Kassel-Watch-Log", "href": "https://www.ks-watch.de/", "linkText": "Videoüberwachung im öffentlichen Raum Kassel" }, + { "sourceText": "Reclaim Your Face", "href": "https://reclaimyourface.eu/de/", "linkText": "Reclaim Your Face DE" }, + { "sourceText": "_STATTKAMERAS", "href": "https://stattkameras.de/", "linkText": "Gegen Videoüberwachung am Hansaplatz" } + ] } + ] + } +] diff --git a/www/sunders/json/manual.json b/www/sunders/json/manual.json new file mode 100644 index 0000000..e46f599 --- /dev/null +++ b/www/sunders/json/manual.json @@ -0,0 +1,76 @@ +[ { "listTitle": "title-icon", "isListWithIcons": true, + "listEntries": [ + { "keys": [ { "key": "k-manmade", "href": "https://wiki.openstreetmap.org/wiki/Key:man_made" } ], + "values": [ { "value": "v-surveillance", "href": "https://wiki.openstreetmap.org/wiki/Tag:man_made%3Dsurveillance" } ], + "icon": null }, + { "keys": [ { "key": "k-surveillance", "href": "https://wiki.openstreetmap.org/wiki/Key:surveillance" } ], + "values": [ { "value": "v-public" } ], + "icon": { "src": "colorRed.png", "alt": "icon-public-alt" } }, + { "keys": [ { "key": "k-surveillance", "href": "https://wiki.openstreetmap.org/wiki/Key:surveillance" } ], + "values": [ { "value": "v-outdoor" } ], + "icon": { "src": "colorBlue.png", "alt": "icon-outdoor-alt" } }, + { "keys": [ { "key": "k-surveillance", "href": "https://wiki.openstreetmap.org/wiki/Key:surveillance" } ], + "values": [ { "value": "v-indoor" } ], + "icon": { "src": "colorGreen.png", "alt": "icon-indoor-alt" } }, + { "keys": [ { "key": "k-surv-type", "href": "https://wiki.openstreetmap.org/wiki/Key:surveillance:type" } ], + "values": [ { "value": "v-camera" } ], + "icon": { "src": "cam.png", "alt": "icon-cam-alt" } }, + { "keys": [ { "key": "k-surv-type", "href": "https://wiki.openstreetmap.org/wiki/Key:surveillance:type" }, { "key": "k-cam-type", "href": "https://wiki.openstreetmap.org/wiki/Proposed_features/Extended_tags_for_Key:Surveillance#Camera" } ], + "values": [ { "value": "v-camera" }, { "value": "v-fixed" } ], + "icon": { "src": "fixed.png", "alt": "icon-fixed-alt" } }, + { "keys": [ { "key": "k-surv-type", "href": "https://wiki.openstreetmap.org/wiki/Key:surveillance:type" }, { "key": "k-cam-type", "href": "https://wiki.openstreetmap.org/wiki/Proposed_features/Extended_tags_for_Key:Surveillance#Camera" } ], + "values": [ { "value": "v-camera" }, { "value": "v-panning" } ], + "icon": { "src": "panning.png", "alt": "icon-panning-alt" } }, + { "keys": [ { "key": "k-surv-type", "href": "https://wiki.openstreetmap.org/wiki/Key:surveillance:type" }, { "key": "k-cam-type", "href": "https://wiki.openstreetmap.org/wiki/Proposed_features/Extended_tags_for_Key:Surveillance#Camera" } ], + "values": [ { "value": "v-camera" }, { "value": "v-dome" } ], + "icon": { "src": "dome.png", "alt": "icon-dome-alt" } }, + { "keys": [ { "key": "k-surv-type", "href": "https://wiki.openstreetmap.org/wiki/Key:surveillance:type" } ], + "values": [ { "value": "v-guard" } ], + "icon": { "src": "guard.png", "alt": "icon-guard-alt" } }, + { "keys": [ { "key": "k-surv-type", "href": "https://wiki.openstreetmap.org/wiki/Key:surveillance:type" } ], + "values": [ { "value": "v-alpr" } ], + "icon": { "src": "traffic.png", "alt": "icon-alpr-alt" } } ] }, + { "listTitle": "title-view-fixed", "isListWithIcons": false, + "listEntries": [ + { "keys": [ { "key": "k-surv-type", "href": "https://wiki.openstreetmap.org/wiki/Key:surveillance:type" } ], + "values": [ { "value": "v-camera" } ] }, + { "keys": [ { "key": "k-cam-type", "href": "https://wiki.openstreetmap.org/wiki/Proposed_features/Extended_tags_for_Key:Surveillance#Camera" } ], + "values": [ { "value": "v-fixed" } ] }, + { "keys": [ { "key": "k-cam-direction", "href": "https://wiki.openstreetmap.org/wiki/Proposed_features/Extended_tags_for_Key:Surveillance#Camera" } ], + "values": [ { "value": "v-direction-0" }, { "value": "v-direction-1" } ] }, + { "keys": [ { "key": "k-cam-angle", "href": "https://wiki.openstreetmap.org/wiki/Proposed_features/Extended_tags_for_Key:Surveillance#Camera" } ], + "values": [ { "value": "v-angle-0" }, { "value": "v-angle-1" }, { "value": "v-angle-2" } ] }, + { "keys": [ { "key": "k-height", "href": "https://wiki.openstreetmap.org/wiki/Key:height" } ], + "values": [ { "value": "v-height-0" }, { "value": "v-height-1" } ] } ], + "examples": { + "images": [ { "src": "fixed_z-17_d-90_a-15_h-5.png", "alt": "example-img-0-alt" }, { "src": "fixed_z-17_d-90_a-15_h-10.png", "alt": "example-img-1-alt" }, { "src": "fixed_z-17_d-90_a-60_h-10.png", "alt": "example-img-2-alt" } ], + "descriptions": [ { "lines": [ "example-direction-90", "example-angle-15", "example-height-5" ] }, { "lines": [ "example-direction-90", "example-angle-15", "example-height-10" ] }, { "lines": [ "example-direction-90", "example-angle-60", "example-height-10" ] } ] } }, + { "listTitle": "title-view-dome", "isListWithIcons": false, + "listEntries": [ + { "keys": [ { "key": "k-surv-type", "href": "https://wiki.openstreetmap.org/wiki/Key:surveillance:type" } ], + "values": [ { "value": "v-camera" } ] }, + { "keys": [ { "key": "k-cam-type", "href": "https://wiki.openstreetmap.org/wiki/Proposed_features/Extended_tags_for_Key:Surveillance#Camera" } ], + "values": [ { "value": "v-dome" } ] }, + { "keys": [ { "key": "k-cam-direction", "href": "https://wiki.openstreetmap.org/wiki/Proposed_features/Extended_tags_for_Key:Surveillance#Camera" } ], + "values": [ { "value": "v-direction-0" }, { "value": "v-direction-1" }, { "value": "v-direction-2" } ] }, + { "keys": [ { "key": "k-height", "href": "https://wiki.openstreetmap.org/wiki/Key:height" } ], + "values": [ { "value": "v-height-0" }, { "value": "v-height-1" } ] } ], + "examples": { + "images": [ { "src": "dome_z-17_h-3.png", "alt": "example-img-3-alt" }, { "src": "dome_z-17_h-5.png", "alt": "example-img-4-alt" }, { "src": "dome_z-17_h-5_d-45.png", "alt": "example-img-5-alt" } ], + "descriptions": [ { "lines": [ "example-height-3" ] }, { "lines": [ "example-height-5" ] }, { "lines": [ "example-height-5", "example-direction-45" ] } ] } }, + { "listTitle": "title-optional", "isListWithIcons": false, + "listEntries": [ + { "keys": [ { "key": "k-surv-zone", "href": "https://wiki.openstreetmap.org/wiki/Key:surveillance:zone" } ], + "values": [ { "value": "v-surv-zone" } ] }, + { "keys": [ { "key": "k-cam-mount", "href": "https://wiki.openstreetmap.org/wiki/Proposed_features/Extended_tags_for_Key:Surveillance#Camera" } ], + "values": [ { "value": "v-cam-mount" } ] }, + { "keys": [ { "key": "k-operator", "href": "https://wiki.openstreetmap.org/wiki/Key:operator" } ], + "values": [ { "value": "v-operator" } ] }, + { "keys": [ { "key": "k-name", "href": "https://wiki.openstreetmap.org/wiki/Key:name" } ], + "values": [ { "value": "v-name" } ] }, + { "keys": [ { "key": "k-ref", "href": "https://wiki.openstreetmap.org/wiki/Key:ref" } ], + "values": [ { "value": "v-ref" } ] }, + { "keys": [ { "key": "k-image", "href": "https://wiki.openstreetmap.org/wiki/Key:image" } ], + "values": [ { "value": "v-image" } ] } + ] } +] diff --git a/www/sunders/json/stats-query.json b/www/sunders/json/stats-query.json new file mode 100644 index 0000000..836dd5b --- /dev/null +++ b/www/sunders/json/stats-query.json @@ -0,0 +1,143 @@ +{ + "level0": { + "country": { + "total": [ "country-all", "area-all", "type-all" ], + "navi": [ + { "label": "country-pl", "pie": "country", "cols": [] }, + { "label": "area-pl", "pie": "area", "cols": [] }, + { "label": "type-pl", "pie": "type", "cols": [] } + ], + "query": { "pie": "area", "cols": [ "country" ] } + }, + "area": { + "total": [ "area-all", "country-all", "type-all" ], + "navi": [ + { "label": "country-pl", "pie": "country", "cols": [] }, + { "label": "area-pl", "pie": "area", "cols": [] }, + { "label": "type-pl", "pie": "type", "cols": [] } + ], + "query": { "pie": "country", "cols": [ "area" ] } + }, + "type": { + "total": [ "type-all", "country-all", "area-all" ], + "navi": [ + { "label": "country-pl", "pie": "country", "cols": [] }, + { "label": "area-pl", "pie": "area", "cols": [] }, + { "label": "type-pl", "pie": "type", "cols": [] } + ], + "query": { "pie": "country", "cols": [ "type" ] } + } + }, + "level1": { + "area_country": { + "total": [ "country", "area-all", "type-all" ], + "navi": [ + { "label": "country-all", "pie": "country", "cols": [] }, + { "label": "area-pl", "pie": "area", "cols": [ "country" ] }, + { "label": "type-pl", "pie": "type", "cols": [ "country" ] } + ], + "query": { "pie": "type", "cols": [ "country", "area" ] } + }, + "type_country": { + "total": [ "country", "area-all", "type-all" ], + "navi": [ + { "label": "country-all", "pie": "country", "cols": [] }, + { "label": "area-pl", "pie": "area", "cols": [ "country" ] }, + { "label": "type-pl", "pie": "type", "cols": [ "country" ] } + ], + "query": { "pie": "area", "cols": [ "country", "type" ] } + }, + "country_area": { + "total": [ "area", "country-all", "type-all" ], + "navi": [ + { "label": "country-pl", "pie": "country", "cols": [ "area" ] }, + { "label": "area-all", "pie": "area", "cols": [] }, + { "label": "type-pl", "pie": "type", "cols": [ "area" ] } + ], + "query": { "pie": "type", "cols": [ "area", "country" ] } + }, + "type_area": { + "total": [ "area", "country-all", "type-all" ], + "navi": [ + { "label": "country-pl", "pie": "country", "cols": [ "area" ] }, + { "label": "area-all", "pie": "area", "cols": [] }, + { "label": "type-pl", "pie": "type", "cols": [ "area" ] } + ], + "query": { "pie": "country", "cols": [ "area", "type" ] } + }, + "country_type": { + "total": [ "type", "country-all", "area-all" ], + "navi": [ + { "label": "country-pl", "pie": "country", "cols": [ "type" ] }, + { "label": "area-pl", "pie": "area", "cols": [ "type" ] }, + { "label": "type-all", "pie": "type", "cols": [] } + ], + "query": { "pie": "area", "cols": [ "type", "country" ] } + }, + "area_type": { + "total": [ "type", "country-all", "area-all" ], + "navi": [ + { "label": "country-pl", "pie": "country", "cols": [ "type" ] }, + { "label": "area-pl", "pie": "area", "cols": [ "type" ] }, + { "label": "type-all", "pie": "type", "cols": [] } + ], + "query": { "pie": "country", "cols": [ "type", "area" ] } + } + }, + "level2": { + "type_country|area": { + "total": [ "country", "area", "type-all" ], + "navi": [ + { "label": "country-all", "pie": "country", "cols": [ "area" ] }, + { "label": "area-all", "pie": "area", "cols": [ "country" ] }, + { "label": "type-pl", "pie": "type", "cols": [ "country", "area" ] } + ], + "query": { "pie": null, "cols": [] } + }, + "area_country|type": { + "total": [ "country", "type", "area-all" ], + "navi": [ + { "label": "country-all", "pie": "country", "cols": [ "type" ] }, + { "label": "area-pl", "pie": "area", "cols": [ "country", "type" ] }, + { "label": "type-all", "pie": "type", "cols": [ "country" ] } + ], + "query": { "pie": null, "cols": [] } + }, + "type_area|country": { + "total": [ "area", "country", "type-all" ], + "navi": [ + { "label": "country-all", "pie": "country", "cols": [ "area" ] }, + { "label": "area-all", "pie": "area", "cols": [ "country" ] }, + { "label": "type-pl", "pie": "type", "cols": [ "area", "country" ] } + ], + "query": { "pie": null, "cols": [] } + }, + "country_area|type": { + "total": [ "area", "type", "country-all" ], + "navi": [ + { "label": "country-pl", "pie": "country", "cols": [ "area", "type" ] }, + { "label": "area-all", "pie": "area", "cols": [ "type" ] }, + { "label": "type-all", "pie": "type", "cols": [ "area" ] } + ], + "query": { "pie": null, "cols": [] } + }, + "area_type|country": { + "total": [ "type", "country", "area-all" ], + "navi": [ + { "label": "country-all", "pie": "country", "cols": [ "type" ] }, + { "label": "area-pl", "pie": "area", "cols": [ "type", "country" ] }, + { "label": "type-all", "pie": "type", "cols": [ "country" ] } + ], + "query": { "pie": null, "cols": [] } + }, + "country_type|area": { + "total": [ "type", "area", "country-all" ], + "navi": [ + { "label": "country-pl", "pie": "country", "cols": [ "type", "area" ] }, + { "label": "area-all", "pie": "area", "cols": [ "type" ] }, + { "label": "type-all", "pie": "type", "cols": [ "area" ] } + ], + "query": { "pie": null, "cols": [] } + } + } +} diff --git a/www/sunders/json/symbology.json b/www/sunders/json/symbology.json new file mode 100644 index 0000000..a0765ef --- /dev/null +++ b/www/sunders/json/symbology.json @@ -0,0 +1,29 @@ +[ { "listTitle": "title-icons", + "listEntries": [ + { "icons": [ { "src": "camAll.png", "alt": "icon-cam-alt" } ], + "description": "desc-cam" }, + { "icons": [ { "src": "fixedAll.png", "alt": "icon-fixed-alt" } ], + "description": "desc-fixed" }, + { "icons": [ { "src": "panningAll.png", "alt": "icon-panning-alt" } ], + "description": "desc-panning" }, + { "icons": [ { "src": "domeAll.png", "alt": "icon-dome-alt" } ], + "description": "desc-dome" }, + { "icons": [ { "src": "guardAll.png", "alt": "icon-guard-alt" } ], + "description": "desc-guard" }, + { "icons": [ { "src": "traffic.png", "alt": "icon-alpr-alt" } ], + "description": "desc-alpr" } ] }, + { "listTitle": "title-colors", + "listEntries": [ + { "icons": [ { "src": "colorRedAll.png", "alt": "icon-red-alt" } ], + "description": "desc-red" }, + { "icons": [ { "src": "colorBlueAll.png", "alt": "icon-blue-alt" } ], + "description": "desc-blue" }, + { "icons": [ { "src": "colorGreenAll.png", "alt": "icon-green-alt" } ], + "description": "desc-green" }, + { "icons": [ + { "src": "todo_camAll.png", "alt": "icon-yellow-fixed-alt" }, + { "src": "todo_domeAll.png", "alt": "icon-yellow-dome-alt" }, + { "src": "todo_guardAll.png", "alt": "icon-yellow-guard-alt" }, + { "src": "todo_traffic.png", "alt": "icon-yellow-alpr-alt" } ], + "description": "desc-yellow" } ] } +] diff --git a/www/sunders/mindex.html b/www/sunders/mindex.html new file mode 100644 index 0000000..792d3f8 --- /dev/null +++ b/www/sunders/mindex.html @@ -0,0 +1,21 @@ + + + + + We'll be back! + + + + + + + + + + +
+ Surveillance under Surveillance +

is down for maintenance...

+
+ + diff --git a/www/sunders/mstile-144x144.png b/www/sunders/mstile-144x144.png new file mode 100644 index 0000000..5a62055 Binary files /dev/null and b/www/sunders/mstile-144x144.png differ diff --git a/www/sunders/ru/camera.php b/www/sunders/ru/camera.php new file mode 100644 index 0000000..d85146c --- /dev/null +++ b/www/sunders/ru/camera.php @@ -0,0 +1,3 @@ + diff --git a/www/sunders/ru/images b/www/sunders/ru/images new file mode 120000 index 0000000..e4c5bd0 --- /dev/null +++ b/www/sunders/ru/images @@ -0,0 +1 @@ +../images/ \ No newline at end of file diff --git a/www/sunders/ru/index.php b/www/sunders/ru/index.php new file mode 100644 index 0000000..52e5734 --- /dev/null +++ b/www/sunders/ru/index.php @@ -0,0 +1,6 @@ + diff --git a/www/sunders/ru/stats/index.php b/www/sunders/ru/stats/index.php new file mode 100644 index 0000000..724fb2d --- /dev/null +++ b/www/sunders/ru/stats/index.php @@ -0,0 +1,6 @@ + diff --git a/www/sunders/stats/index.php b/www/sunders/stats/index.php new file mode 100644 index 0000000..029e42c --- /dev/null +++ b/www/sunders/stats/index.php @@ -0,0 +1,1481 @@ + 2 || in_array($initialPie, $colsArray)) { + $colsArray = array(); + } + + foreach ($colsArray as $col) { + if (!in_array($col, $validPies)) { + // ignore 'cols' + $colsArray = array(); + break; + } + } + } + + // get values from URL if valid + if (!empty($colsArray) && array_key_exists('vals', $_GET)) { + $vals = $_GET['vals']; + $vals = strtoupper($vals); + $valsArray = explode('|', $vals); + + if (count($colsArray) == count($valsArray)) { + for ($i = 0; $i < count($colsArray); $i++) { + if ($colsArray[$i] == 'area') { + $i18n = $i18nStats; + $i18nDefault = $i18nStatsDefault; + $key = 'area'.$valsArray[$i].'-2'; + } elseif ($colsArray[$i] == 'type') { + $i18n = $i18nStats; + $i18nDefault = $i18nStatsDefault; + $key = 'type'.$valsArray[$i].'-2'; + } else { + $i18n = $i18nCountries; + $i18nDefault = $i18nCountriesDefault; + // Check if $key consists of 2 capital letters. + $key = preg_match('/\b[A-Z]{2}\b/', $valsArray[$i]) === 1 || '--' ? $valsArray[$i] : 'dontfindme'; + } + if (!isValidValue($i18n, $i18nDefault, $key)) { + // ignore 'vals' and 'cols' + $valsArray = array(); + $colsArray = array(); + break; + } + } + } else { + // ignore 'vals' and 'cols' + $valsArray = array(); + $colsArray = array(); + } + } + + // get year from URL if valid + if (array_key_exists('year', $_GET)) { + $valueStr = $_GET['year']; + $valueInt = (int) $valueStr; + // if (is_numeric($valueStr) && $valueInt >= 2007 && $valueInt <= date('Y')) { // the first OSM surveillance entry is from 2007 + if (is_numeric($valueStr) && $valueInt >= 2008 && $valueInt <= date('Y')) { // the first OSM surveillance entry is from 2008 + $year = $valueStr; + } + } + + // get month from URL if valid + if (array_key_exists('month', $_GET)) { + $valueStr = $_GET['month']; + $valueInt = (int) $valueStr; + if (is_numeric($valueStr) && $valueInt >= 1 && $valueInt <= 12) { + $month = $valueStr; + } + } + + // get embed mode from URL + if (array_key_exists('emb', $_GET)) { + $embedMode = $_GET['emb']; + if ($embedMode == 'wsb' || $embedMode == 'wosb') { + $embQuery = 'emb='.$embedMode; + $embQueryFirst = '?'.$embQuery; + $embQueryNth = '&'.$embQuery; + } + } + + $pieLevel = 'level'.count($colsArray); + + $decodedStatsQueryJSON = getDecodedJSON($pathToWebFolder.'json/stats-query.json'); + $levelObject = $decodedStatsQueryJSON->{$pieLevel}; + $statsKey = count($colsArray) > 0 ? $initialPie.'_'.$cols : $initialPie; + $statsQueryObject = $levelObject->{$statsKey}; + + /* Connect to database */ + $mysqli = new mysqli(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWD, MYSQL_DB); + if($mysqli->connect_errno) { + echo 'Error while connecting to DB : $mysqli->error \n' ; + exit(1); + } + $mysqli->autocommit(FALSE); + + function isValidValue($i18n, $i18nDefault, $key) { + $translated = translate($i18n, $i18nDefault, $key, [], [], []); + return strlen($translated) != 0; + } + + function getCharts($i18nStats, $i18nStatsDefault, $i18nCountries, $i18nCountriesDefault, $pieType, $lineType, $colsArray, $valsArray, $year, $month, $pieLevel, $statsQueryObject) { + + $surveillanceStatsJSON = getSurveillanceStatsJSON($i18nStats, $i18nStatsDefault, $i18nCountries, $i18nCountriesDefault, $pieType, $lineType, $colsArray, $valsArray, $year, $month, $pieLevel, $statsQueryObject); + + return getSurveillanceStatsTags($surveillanceStatsJSON); + } + + function getSurveillanceStatsJSON($i18nStats, $i18nStatsDefault, $i18nCountries, $i18nCountriesDefault, $pieType, $lineType, $colsArray, $valsArray, $year, $month, $pieLevel, $statsQueryObject) { + $objectStrings[] = getTotalStatsJSON($i18nStats, $i18nStatsDefault, $colsArray, $valsArray, $year, $month, $pieLevel, $statsQueryObject); + $objectStrings[] = getNaviStatsJSON($i18nStats, $i18nStatsDefault, $statsQueryObject, $pieType, $lineType, $colsArray, $valsArray, $year, $month); + $objectStrings[] = getPieStatsJSON($i18nStats, $i18nStatsDefault, $i18nCountries, $i18nCountriesDefault, $pieType, $lineType, $colsArray, $valsArray, $year, $month, $statsQueryObject); + + $pieStatsObject = json_decode('{'.$objectStrings[2].'}'); + $pieArray = $pieStatsObject->{'pie-chart'}->{'pie'}; + $pieLegendArray = $pieStatsObject->{'pie-chart'}->{'legend'}; + + $objectStrings[] = getTimeStatsJSON($i18nStats, $i18nStatsDefault, $pieType, $lineType, $colsArray, $valsArray, $year, $month, $pieArray, $pieLegendArray); + + return '{'.(implode(',', $objectStrings)).'}'; + } + + function getTotalStatsJSON($i18nStats, $i18nStatsDefault, $colsArray, $valsArray, $year, $month, $pieLevel, $statsQueryObject) { + global $surveillanceNodesTotal, $titleStringFilter, $titleStringTime; + + $surveillanceNodesTotal = getTotalDataFromDB($colsArray, $valsArray, $year, $month); + + $totalArray = $statsQueryObject->{'total'}; + + if ($pieLevel == 'level0') { + foreach($totalArray as $totalKey) { + $filterArray[] = translate($i18nStats, $i18nStatsDefault, $totalKey, [], [], []); + } + } else { + foreach($totalArray as $totalKey) { + $totalValue = $valsArray[array_search($totalKey, $colsArray)]; + + if ($totalKey == 'country') { + $filterArray[] = translate($i18nStats, $i18nStatsDefault, $totalKey, [], [], []).': '.$totalValue; + } elseif (substr($totalKey, -4) == '-all') { + $filterArray[] = translate($i18nStats, $i18nStatsDefault, $totalKey, [], [], []); + } else { + $filterArray[] = translate($i18nStats, $i18nStatsDefault, $totalKey, [], [], []).': '. + translate($i18nStats, $i18nStatsDefault, $totalKey.$totalValue.'-2', [], [], []); + } + } + } + + $titleStringFilter = implode(' • ', $filterArray); + + $timeArray[] = $year == 'all' ? + translate($i18nStats, $i18nStatsDefault, 'year-all', [], [], []) : + translate($i18nStats, $i18nStatsDefault, 'year', [], [], []).': '.$year; + + $timeArray[] = $month == 'all' ? + translate($i18nStats, $i18nStatsDefault, 'month-all', [], [], []) : + translate($i18nStats, $i18nStatsDefault, 'month', [], [], []).': '.translate($i18nStats, $i18nStatsDefault, date('M', strtotime('1970-'.$month)).'_', [], [], []); + + $titleStringTime = implode(' • ', $timeArray); + $labelKey = 'surv-node'.($surveillanceNodesTotal != 1 ? 's' : ''); + + return '"total": { + "no-of-nodes": '.$surveillanceNodesTotal.', + "label": "'.translate($i18nStats, $i18nStatsDefault, $labelKey, [], [], []).'", + "filter": "'.$titleStringFilter.'", + "time": "'.$titleStringTime.'" + }'; + } + + function getTotalDataFromDB($colsArray, $valsArray, $year, $month) { + global $mysqli, $whereCriteria, $whereValues, $paramTypes; + + $whereValues = $valsArray; + + if (!empty($colsArray)) { + foreach ($colsArray as $col) { + $whereCriteriaArray[] = $col.'=?'; + $paramTypes = $col == 'country' ? $paramTypes.'s' : $paramTypes.'i'; + } + } + + if (!empty($year) && $year != 'all') { + $whereCriteriaArray[] = 'year=?'; + $paramTypes = $paramTypes.'i'; + $whereValues[] = $year; + } + + if (!empty($month) && $month != 'all') { + $whereCriteriaArray[] = 'month=?'; + $paramTypes = $paramTypes.'i'; + $whereValues[] = $month; + } + + if (!empty($whereCriteriaArray)) { + $whereCriteria = ' WHERE '.implode(' AND ', $whereCriteriaArray); + } + + if (!($selectTotalStmt = $mysqli->prepare('SELECT COUNT(*) FROM statistics'.$whereCriteria))) { + echo 'Error while preparing select total statement : ' . $mysqli->error ; + exit(1); + } + + if (!empty($whereValues)) { + if (count($whereValues) == 1) { + $selectTotalStmt->bind_param($paramTypes, $whereValues[0]); + } elseif (count($whereValues) == 2) { + $selectTotalStmt->bind_param($paramTypes, $whereValues[0], $whereValues[1]); + } elseif (count($whereValues) == 3) { + $selectTotalStmt->bind_param($paramTypes, $whereValues[0], $whereValues[1], $whereValues[2]); + } elseif (count($whereValues) == 4) { + $selectTotalStmt->bind_param($paramTypes, $whereValues[0], $whereValues[1], $whereValues[2], $whereValues[3]); + } else { + echo 'Error while binding where parameters to select total statement.'; + } + } + + $selectTotalStmt->bind_result($total); + + $selectTotalStmt->execute(); + while ($selectTotalStmt->fetch()) { + $result = $total; + } + $selectTotalStmt->close(); + + return $result; + } + + function getNaviStatsJSON($i18nStats, $i18nStatsDefault, $statsQueryObject, $pieType, $lineType, $colsArray, $valsArray, $year, $month) { + $naviCatsArrayString = getNaviCatsArrayString($i18nStats, $i18nStatsDefault, $statsQueryObject, $pieType, $lineType, $colsArray, $valsArray, $year, $month); + $naviYearsArrayString = getNaviYearsArrayString($i18nStats, $i18nStatsDefault, $pieType, $lineType, $colsArray, $valsArray, $year, $month); + $naviMonthsArrayString = getNaviMonthsArrayString($i18nStats, $i18nStatsDefault, $pieType, $lineType, $colsArray, $valsArray, $year, $month); + + return '"navi": { + "label": "'.translate($i18nStats, $i18nStatsDefault, 'filter', [], [], []).'", + '.$naviCatsArrayString.', + '.$naviYearsArrayString.', + '.$naviMonthsArrayString.' + }'; + } + + function getPieStatsJSON($i18nStats, $i18nStatsDefault, $i18nCountries, $i18nCountriesDefault, $pieType, $lineType, $colsArray, $valsArray, $year, $month, $statsQueryObject) { + $surveillanceNodesPerX = getPieDataFromDB($pieType); + + $pieLegendArrayStrings = getPieLegendArrayStrings($i18nStats, $i18nStatsDefault, $i18nCountries, $i18nCountriesDefault, $pieType, $lineType, $valsArray, $year, $month, $statsQueryObject, $surveillanceNodesPerX); + + return '"pie-chart": { + '.$pieLegendArrayStrings['pie'].', + '.$pieLegendArrayStrings['legend'].' + }'; + } + + function getPieDataFromDB($pieType) { + global $mysqli, $whereCriteria, $whereValues, $paramTypes; + + if (!($selectPieStmt = $mysqli->prepare('SELECT COUNT(*) total, '.$pieType.' FROM statistics '.$whereCriteria.' GROUP BY '.$pieType.' ORDER BY total DESC'))) { + echo 'Error while preparing select country statement : ' . $mysqli->error ; + exit(1); + } + + if (!empty($whereValues)) { + if (count($whereValues) == 1) { + $selectPieStmt->bind_param($paramTypes, $whereValues[0]); + } elseif (count($whereValues) == 2) { + $selectPieStmt->bind_param($paramTypes, $whereValues[0], $whereValues[1]); + } elseif (count($whereValues) == 3) { + $selectPieStmt->bind_param($paramTypes, $whereValues[0], $whereValues[1], $whereValues[2]); + } elseif (count($whereValues) == 4) { + $selectPieStmt->bind_param($paramTypes, $whereValues[0], $whereValues[1], $whereValues[2], $whereValues[3]); + } else { + echo 'Error while binding where parameters to select country statement.'; + } + } + + $selectPieStmt->bind_result($noOfNodes, $sliceID); + + $selectPieStmt->execute(); + while ($selectPieStmt->fetch()) { + $result[$sliceID] = $noOfNodes; + } + $selectPieStmt->close(); + + return $result; + } + + function getNaviCatsArrayString($i18nStats, $i18nStatsDefault, $statsQueryObject, $pieType, $lineType, $colsArray, $valsArray, $year, $month) { + foreach($statsQueryObject->{'navi'} as $naviObject) { + $naviObjectElements = array(); + $queryStrings = array(); + + $colsQuery = ''; + $valsQuery = ''; + $colsQueryArray = array(); + $valsQueryArray = array(); + + $selectedClass = $naviObject->{'pie'} == $pieType ? 'selected' : 'unselected'; + $naviObjectElements[] = '"selected-class": "'.$selectedClass.'"'; + + $queryStrings[] = '?pie='.$naviObject->{'pie'}; + + for ($i = 0; $i < count($colsArray); $i++) { + if ($colsArray[$i] != $naviObject->{'pie'}) { + $colsQueryArray[] = $colsArray[$i]; + $valsQueryArray[] = $valsArray[$i]; + } + } + + if (!empty($colsQueryArray) && !empty($valsQueryArray)) { + $queryStrings[] = 'cols='.implode('|', $colsQueryArray); + $queryStrings[] = 'vals='.implode('|', $valsQueryArray); + } + $queryStrings[] = 'year='.$year; + $queryStrings[] = 'month='.$month; + $queryStrings[] = 'time='.$lineType; + + $naviObjectElements[] = '"url-query": "'.implode('&', $queryStrings).'"'; + $naviObjectElements[] = '"label": "'.translate($i18nStats, $i18nStatsDefault, $naviObject->{'label'}, [], [], []).'"'; + $naviObjectStrings[] = '{'.implode(',', $naviObjectElements)."}"; + } + + $naviArrayString = '"cats": ['.(implode(',', $naviObjectStrings)).']'; + + return $naviArrayString; + } + + function getPieLegendArrayStrings($i18nStats, $i18nStatsDefault, $i18nCountries, $i18nCountriesDefault, $pieType, $lineType, $valsArray, $year, $month, $statsQueryObject, $surveillanceNodesPerX) { + global $surveillanceNodesTotal, $pieRadius; + + $pieObjectStrings = []; // FIX2023 + $pieLegendObjectStrings = []; // FIX2023 + $rotateDegrees = 0; + $sumOfNodesLT1 = 0; + $sumOfPercentageLT1 = 0; + $fillColor = 1; + + foreach ($surveillanceNodesPerX as $sliceID => $noOfNodes) { + $legendTitleArray = array(); + $queryValues = array(); + $queryStrings = array(); + $urlQuery = ''; + + // The CSS file only knows 20 slice colors. Start again for every 20 slices. + if ($fillColor > 20) { + $fillColor = 1; + } + + if (strlen($sliceID) == 0) { + $sliceID = 'xxx'; + } + + $percentageValue = getPercentage($surveillanceNodesTotal, $noOfNodes); + $degrees = getDegrees($percentageValue); + + $percentageUnit = '%'; + $percentageString = $percentageValue.$percentageUnit; + $nodesUnit = 'node'.($noOfNodes != 1 ? 's' : ''); + $nodesString = $noOfNodes.' '.translate($i18nStats, $i18nStatsDefault, $nodesUnit, [], [], []); + + // Strings for the legend title + if ($pieType == 'country') { + // Countries: country ISO - translated country name + $legendTitleArray[] = $sliceID == 'xxx' ? '??' : $sliceID; + $legendTitleArray[] = translate($i18nCountries, $i18nCountriesDefault, $sliceID, [], [], []); + } else { + // Other: translated title - translated subtitle + $legendTitleArray[] = translate($i18nStats, $i18nStatsDefault, $pieType.$sliceID.'-0', [], [], []); + $legendSubtitle = translate($i18nStats, $i18nStatsDefault, $pieType.$sliceID.'-1', [], [], []); + } + + $legendTitle = implode(' • ', $legendTitleArray); + + // url query for links of pie and legend + $pieQuery = $statsQueryObject->{'query'}->{'pie'}; + if (!(empty($pieQuery) || $sliceID === 'xxx' || in_array('xxx', $valsArray))) { + $queryStrings[] = '?pie='.$pieQuery; + $queryStrings[] = 'cols='.implode ('|', $statsQueryObject->{'query'}->{'cols'}); + foreach ($valsArray as $val) { + $queryValues[] = $val; + } + $queryValues[] = $sliceID; + $queryStrings[] = 'vals='.implode ('|', $queryValues); + $queryStrings[] = 'year='.$year; + $queryStrings[] = 'month='.$month; + $queryStrings[] = 'time='.$lineType; + + $urlQuery = implode('&', $queryStrings); + } + + if ($pieType == 'country' && $percentageValue < 1) { + // Countries < 1% will be sumarized to one gray slice but displayed separately in the legend. + $sumOfNodesLT1 = $sumOfNodesLT1 + $noOfNodes; + $sumOfPercentageLT1 = $sumOfPercentageLT1 + $percentageValue; + $fillClass = 'color0'; + $bgClass = $fillClass; + } else { + // Area slices are using color classes starting with 'icon'. Others are starting with 'color'. + $fillClass = $pieType == 'area' ? 'icon'.$sliceID : 'color'.$fillColor; + $bgClass = $fillClass; + + $pieObjectStrings[] = getPieObjectString($i18nStats, $i18nStatsDefault, $pieType, $degrees, $pieRadius, $rotateDegrees, $fillClass, $sliceID, $nodesString, $percentageString, $urlQuery); + + $rotateDegrees = $rotateDegrees + $degrees; + $fillColor++; + } + + $pieLegendObjectStrings[] = getPieLegendObjectString($legendTitle, $legendSubtitle, $percentageValue, $percentageUnit, $percentageString, $noOfNodes, $nodesUnit, $nodesString, $bgClass, $sliceID, $urlQuery); + } + + // Values of the slice that represents the sum of all < 1% slices. + $percentageString = $sumOfPercentageLT1.'%'; + $nodesString = $sumOfNodesLT1.' node'.($sumOfNodesLT1 != 1 ? 's' : ''); + + if ($pieType == 'country' && $sumOfNodesLT1 > 0) { + $pieObjectStrings[] = getPieObjectString($i18nStats, $i18nStatsDefault, $pieType, (360 - $rotateDegrees), $pieRadius, $rotateDegrees, $fillClass, 'lt1', $nodesString, $percentageString, null); + } + + $pieLegendArrayStrings['pie'] = '"pie": ['.(implode(',', $pieObjectStrings)).']'; + $pieLegendArrayStrings['legend'] = '"legend": ['.(implode(',', $pieLegendObjectStrings)).']'; + + return $pieLegendArrayStrings; + } + + function getPieObjectString($i18nStats, $i18nStatsDefault, $pieType, $degrees, $pieRadius, $rotateDegrees, $fillClass, $sliceID, $nodesString, $percentageString, $urlQuery) { + $sliceClass = (empty($urlQuery) || (strlen($sliceID) == 3) && ($sliceID == 'xxx')) ? '' : 'pie-slice-link'; + $pathTextID = $sliceID; + + if ($pieType == 'country') { + if ($sliceID == 'lt1') { + $idText = '< 1%'; + $sliceClass = ''; + } elseif ($sliceID == 'xxx') { + $idText = '??'; + } elseif ($pieType == 'country') { + $idText = $sliceID; + } + + // mouseover/mouseout in set tag is not working with '--' + if ($pathTextID == '--') { + $pathTextID = 'zzz'; + } + } else { + $idText = translate($i18nStats, $i18nStatsDefault, ($pieType.$sliceID.'-2'), [], [], []); + } + + $largeArcFlag = $degrees > 180 ? '1' : '0'; + $xyCoordinates = getXYCoordinates($degrees, $pieRadius); + + $pathClassesArray = array($sliceClass, $fillClass.'-fill'); + + $pieObjectElements[] = '"id": "'.$sliceID.'"'; + $pieObjectElements[] = '"path-id": "slice'.$pathTextID.'"'; + $pieObjectElements[] = '"path-classes": "'.implode(' ', $pathClassesArray).'"'; + $pieObjectElements[] = '"path-d": "M'.$pieRadius.','.$pieRadius.' L'.$pieRadius.',0 A'.$pieRadius.','.$pieRadius.' 1 '.$largeArcFlag.',1 '.$xyCoordinates['X'].', '.$xyCoordinates['Y'].' z"'; + $pieObjectElements[] = '"has-link": '.(empty($sliceClass) ? 'false' : 'true'); + $pieObjectElements[] = '"url-query": "'.$urlQuery.'"'; + $pieObjectElements[] = '"anim-from": "0, '.$pieRadius.', '.$pieRadius.'"'; + $pieObjectElements[] = '"anim-to": "'.$rotateDegrees.', '.$pieRadius.', '.$pieRadius.'"'; + $pieObjectElements[] = '"anim-values": "0, '.$pieRadius.', '.$pieRadius.'; '.($rotateDegrees / 10).', '.$pieRadius.', '.$pieRadius.'; '.($rotateDegrees * 9 / 10).', '.$pieRadius.', '.$pieRadius.'; '.$rotateDegrees.', '.$pieRadius.', '.$pieRadius.'"'; + $pieObjectElements[] = '"text-id": "text'.$pathTextID.'"'; + $pieObjectElements[] = '"text-x": '.$pieRadius; + $pieObjectElements[] = '"text-y": '.($pieRadius - 8); + $pieObjectElements[] = '"text-label": "'.$idText.'"'; + $pieObjectElements[] = '"text-nodes-y": '.($pieRadius + 2); + $pieObjectElements[] = '"text-nodes": "'.$nodesString.'"'; + $pieObjectElements[] = '"text-percentage-y": '.($pieRadius + 12); + $pieObjectElements[] = '"text-percentage": "'.$percentageString.'"'; + + return '{'.implode(',', $pieObjectElements)."}"; + } + + function getPieLegendObjectString($legendTitle, $legendSubtitle, $percentageValue, $percentageUnit, $percentageString, $nodesValue, $nodesUnit, $nodesString, $bgClass, $sliceID, $urlQuery) { + $pieLegendObjectElements[] = '"id": "'.(strlen($sliceID) == 0 ? '??' : $sliceID).'"'; + $pieLegendObjectElements[] = '"bg-class": "'.$bgClass.'-bg"'; + $pieLegendObjectElements[] = '"title": "'.$legendTitle.'"'; + $pieLegendObjectElements[] = '"has-link": '.(empty($urlQuery) ? 'false' : 'true'); + $pieLegendObjectElements[] = '"url-query": "'.$urlQuery.'"'; + $pieLegendObjectElements[] = '"has-subtitle": '.(empty($legendSubtitle) ? 'false' : 'true'); + $pieLegendObjectElements[] = '"subtitle": "'.$legendSubtitle.'"'; + $pieLegendObjectElements[] = '"is-lt1": '.($percentageValue < 1 ? 'true' : 'false'); + $pieLegendObjectElements[] = '"percentage": { "value": '.$percentageValue.', "unit": "'.$percentageUnit.'", "string": "'.$percentageString.'"}'; + $pieLegendObjectElements[] = '"nodes": { "value": '.$nodesValue.', "unit": "'.$nodesUnit.'", "string": "'.$nodesString.'"}'; + + return '{'.implode(',', $pieLegendObjectElements)."}"; + } + + function getTimeStatsJSON($i18nStats, $i18nStatsDefault, $pieType, $lineType, $colsArray, $valsArray, $year, $month, $pieArray, $pieLegendArray) { + if ($year == 'all') { + // e.g. SELECT year period, COUNT(*) uploads FROM statistics WHERE ... GROUP BY year + $period = 'year'; + } elseif ($month == 'all') { + // e.g. SELECT month period, COUNT(*) uploads FROM statistics WHERE ... GROUP BY month + $period = 'month'; + } else { + // e.g. SELECT day period, COUNT(*) uploads FROM statistics WHERE ... GROUP BY day + $period = 'day'; + } + + $surveillanceNodesPerX = getTimeDataFromDB($pieType, $period); + + $timeNaviLinesArrayString = getNaviLinesArrayString($i18nStats, $i18nStatsDefault, $pieType, $lineType, $colsArray, $valsArray, $year, $month); + $timeLegendArrayStrings = getTimeLegendArrayStrings($i18nStats, $i18nStatsDefault, $pieType, $lineType, $surveillanceNodesPerX, $year, $month, $pieArray, $pieLegendArray, $period); + + return '"time-chart": { + '.$timeNaviLinesArrayString.', + '.$timeLegendArrayStrings['time'].', + '.$timeLegendArrayStrings['legend'].' + }'; + } + + function getTimeDataFromDB($pieType, $period) { + global $mysqli, $whereCriteria, $whereValues, $paramTypes; + + if (!($selectTimeStmt = $mysqli->prepare('SELECT '.$pieType.', '.$period.', COUNT(*) FROM statistics '.$whereCriteria.' GROUP BY '.$pieType.', '.$period))) { + echo 'Error while preparing select country statement : ' . $mysqli->error ; + exit(1); + } + + if (!empty($whereValues)) { + if (count($whereValues) == 1) { + $selectTimeStmt->bind_param($paramTypes, $whereValues[0]); + } elseif (count($whereValues) == 2) { + $selectTimeStmt->bind_param($paramTypes, $whereValues[0], $whereValues[1]); + } elseif (count($whereValues) == 3) { + $selectTimeStmt->bind_param($paramTypes, $whereValues[0], $whereValues[1], $whereValues[2]); + } elseif (count($whereValues) == 4) { + $selectTimeStmt->bind_param($paramTypes, $whereValues[0], $whereValues[1], $whereValues[2], $whereValues[3]); + } else { + echo 'Error while binding where parameters to select country statement.'; + } + } + + $selectTimeStmt->bind_result($lineID, $period, $noOfUploads); + $selectTimeStmt->execute(); + + $maxUploads = 0; + $maxSumUploads = 0; + + while ($selectTimeStmt->fetch()) { + $id = strlen($lineID) == 0 ? '??' : $lineID; + + if (empty($result[$id])) { + $result[$id] = array($period => $noOfUploads); + } else { + $result[$id][$period] = $noOfUploads; + } + + if (empty($sumResult[$period])) { + $sumResult[$period] = $noOfUploads; + } else { + $sumResult[$period] = $sumResult[$period] + $noOfUploads; + } + + $maxSumUploads = $sumResult[$period] > $maxSumUploads ? $sumResult[$period] : $maxSumUploads; + $maxUploads = $noOfUploads > $maxUploads ? $noOfUploads : $maxUploads; + } + + $selectTimeStmt->close(); + + $result['max'] = $maxUploads; + $result['max-sum'] = $maxSumUploads; + + return $result; + } + + function getNaviYearsArrayString($i18nStats, $i18nStatsDefault, $pieType, $lineType, $colsArray, $valsArray, $year, $month) { + // return getNaviArrayString('years', $i18nStats, $i18nStatsDefault, $pieType, $lineType, $colsArray, $valsArray, $year, $month, 2007, idate('Y')); + return getNaviArrayString('years', $i18nStats, $i18nStatsDefault, $pieType, $lineType, $colsArray, $valsArray, $year, $month, 2008, idate('Y')); + } + + function getNaviMonthsArrayString($i18nStats, $i18nStatsDefault, $pieType, $lineType, $colsArray, $valsArray, $year, $month) { + return getNaviArrayString('months', $i18nStats, $i18nStatsDefault, $pieType, $lineType, $colsArray, $valsArray, $year, $month, 1, 12); + } + + function getNaviLinesArrayString($i18nStats, $i18nStatsDefault, $pieType, $lineType, $colsArray, $valsArray, $year, $month) { + return getNaviArrayString('lines', $i18nStats, $i18nStatsDefault, $pieType, $lineType, $colsArray, $valsArray, $year, $month, null, null); + } + + function getNaviArrayString($mode, $i18nStats, $i18nStatsDefault, $pieType, $lineType, $colsArray, $valsArray, $year, $month, $loopStart, $loopEnd) { + if ($mode == 'lines') { + $naviObjectStrings[] = getNaviObjectString($mode, 'single', $pieType, $lineType, $colsArray, $valsArray, $year, $month, translate($i18nStats, $i18nStatsDefault, 'single', [], [], [])); + $naviObjectStrings[] = getNaviObjectString($mode, 'sum', $pieType, $lineType, $colsArray, $valsArray, $year, $month, translate($i18nStats, $i18nStatsDefault, 'total', [], [], [])); + } else { + $allIndex = 'all'; + $allLabel = translate($i18nStats, $i18nStatsDefault, $allIndex, [], [], []); + $naviObjectStrings[] = getNaviObjectString($mode, $allIndex, $pieType, $lineType, $colsArray, $valsArray, $year, $month, $allLabel); + + for ($i = $loopStart; $i <= $loopEnd; $i++) { + $label = $mode == 'months' ? translate($i18nStats, $i18nStatsDefault, date('M', strtotime('1970-'.$i)), [], [], []) : $i; + $naviObjectStrings[] = getNaviObjectString($mode, $i, $pieType, $lineType, $colsArray, $valsArray, $year, $month, $label); + } + } + + return '"'.$mode.'": ['.(implode(',', $naviObjectStrings)).']'; + } + + function getNaviObjectString($mode, $index, $pieType, $lineType, $colsArray, $valsArray, $year, $month, $label) { + if ($mode == 'years') { + $selectedTime = $year; + $queryYear = $index; + $queryMonth = $month; + $queryType = $lineType; + } elseif ($mode == 'months') { + $selectedTime = $month; + $queryYear = $year; + $queryMonth = $index; + $queryType = $lineType; + } else { + $selectedTime = $lineType; + $queryYear = $year; + $queryMonth = $month; + $queryType = $index; + } + + $selectedClass = $index == $selectedTime ? 'selected' : 'unselected'; + $naviObjectElements[] = '"selected-class": "'.$selectedClass.'"'; + + $queryStrings[] = '?pie='.$pieType; + if (!empty($colsArray) && !empty($valsArray)) { + $queryStrings[] = 'cols='.implode('|', $colsArray); + $queryStrings[] = 'vals='.implode('|', $valsArray); + } + $queryStrings[] = 'year='.$queryYear; + $queryStrings[] = 'month='.$queryMonth; + $queryStrings[] = 'time='.$queryType; + $naviObjectElements[] = '"url-query": "'.implode('&', $queryStrings).'"'; + + $naviObjectElements[] = '"label": "'.$label.'"'; + + return '{'.implode(',', $naviObjectElements)."}"; + } + + function getTimeLegendArrayStrings($i18nStats, $i18nStatsDefault, $pieType, $lineType, $surveillanceNodesPerX, $year, $month, $pieArray, $pieLegendArray, $period) { + global $titleStringFilter, $titleStringTime; + + $viewboxMultiplier = 80; + + if ($period == 'year') { + // $periodStart = 2007; + $periodStart = 2008; + $periodEnd = idate('Y'); + } elseif ($period == 'month') { + $periodStart = 1; + $periodEnd = 12; + } elseif ($period == 'day') { + $periodStart = 1; + $periodEnd = idate('t', strtotime($year.'-'.$month)); + } + + if ($periodStart && $periodEnd) { + for ($i = $periodStart; $i <= $periodEnd; $i++) { + $periodArray[] = $i; + } + } + + foreach ($pieArray as $pieElement) { + $pieIdArray[$pieElement->{'id'}] = $pieElement; + } + + /* 1 2 3 4 5 + +----+----+----+----+----+ + 1 |------------------------| + + + + 2 | | + + chart: 5*3 + + 3 | | + + + + 4 |------------------------| + + + + +----+----+----+----+----+ + viewbox: 5*4.5 */ + + $vbWidth = count($periodArray) * $viewboxMultiplier; + $vbHeight = $vbWidth * 4 / 5; + $chartHeight = $vbWidth * 3 / 5; + $chartPaddingTop = ($vbHeight - $chartHeight) * 1 / 5; + $chartPaddingBottom = ($vbHeight - $chartHeight) * 4 / 5; + $horizontalSegments = 4; + + $sumUploadsLT1Array = []; // FIX2023 + $periodsSumObjectElements = []; // FIX2023 + $verticalGridObjectStrings = []; // FIX2023 + $lineObjectStrings = []; // FIX2023 + + $maxUploads = $lineType == 'sum' ? $surveillanceNodesPerX['max-sum'] : $surveillanceNodesPerX['max']; + + // paths of 5 horizontal grid lines to devide the chart in 4 horizontal segments + for ($i=0; $i <= $horizontalSegments; $i++) { + $gridY = $chartPaddingTop + ($i * $chartHeight / $horizontalSegments); + $horizontalGridObjectStrings[] = '{ "path-d": "M0,'.$gridY.' L'.$vbWidth.','.$gridY.'" }'; + $horizontalTspanObjectStrings[] = '{ + "tspan-x": 0, + "tspan-y": '.($gridY - ($vbHeight / 100)).', + "label": "'.($maxUploads - ($maxUploads * $i / $horizontalSegments)).'" }'; + } + + foreach ($pieLegendArray as $i => $pieLegendObject) { + $periodsObjectElements = array(); + $pathDElements = array(); + $colorClass = substr($pieLegendObject->{'bg-class'}, 0, -3); + + foreach ($periodArray as $j => $periodValue) { + $periodStringArray = array(); + // path of a vertical grid line for the current period + $gridX = ($viewboxMultiplier / 2) + ($j * $viewboxMultiplier); + + // do this only once + if ($i == 0) { + $verticalGridObjectStrings[] = '{ "path-d": "M'.$gridX.','.$chartPaddingTop.' L'.$gridX.','.($vbHeight - $chartPaddingBottom).'" }'; + + if ($period == 'month') { + $periodStringArray[] = translate($i18nStats, $i18nStatsDefault, date('M', strtotime('1970-'.$periodValue)), [], [], []); + } elseif ($period == 'day') { + $periodStringArray[] = $periodValue; + $periodStringArray[] = translate($i18nStats, $i18nStatsDefault, substr(date('D', strtotime($year.'-'.$month.'-'.$periodValue)), 0, 2), [], [], []); + } else { + $periodStringArray[] = $periodValue; + } + + foreach ($periodStringArray as $k => $periodString) { + $verticalTspanObjectStrings[] = '{ + "tspan-x": '.$gridX.', + "tspan-y": '.($chartPaddingTop + $chartHeight + ($vbHeight / 25 * ($k + 1))).', + "label": "'.$periodString.'" }'; + } + } + + // coordinate command of the first line point starts with a M (move to), the others with a L (line to) + $dataCommand = $j == 0 ? 'M' : 'L'; + $commandX = $dataCommand.$gridX; + + // initialize the uploads sum of the current period + if (empty($sumUploadsArray[$periodValue])) { + $sumUploadsArray[$periodValue] = 0; + } + + // get uploads of the current period + $uploads = $surveillanceNodesPerX[$pieLegendObject->{'id'} == 'xxx' ? '??' : $pieLegendObject->{'id'}][$periodValue]; + $uploads = empty($uploads) ? 0 : $uploads; + + // sum the uploads of the current period + $sumUploadsArray[$periodValue] = $sumUploadsArray[$periodValue] + $uploads; + + // uploads for the line point of the current period (sum or single) + $uploadsForLine = $lineType == 'sum' ? $sumUploadsArray[$periodValue] : $uploads; + + if ($pieType == 'country' && $pieLegendObject->{'is-lt1'}) { + // Countries < 1% will be sumarized to one gray line but displayed separately in the legend. + if (empty($sumUploadsLT1Array[$commandX])) { + $sumUploadsLT1Array[$commandX] = $uploads; + } else { + $sumUploadsLT1Array[$commandX] = $sumUploadsLT1Array[$commandX] + $uploads; + } + } else { + $pathDElements[] = getPathDElement($chartPaddingTop, $chartHeight, $uploadsForLine, $maxUploads, $commandX); + } + + // collect uploads per period for the legend JSON + $periodsObjectElements[] = '{ "period": "'.(implode('
', $periodStringArray)).'", "uploads": '.$uploads.' }'; + } + + // collect line object for time JSON + if (count($pathDElements) > 0) { + $pathDString = implode(' ', $pathDElements); + $lineObjectStrings[] = getLineObjectString($colorClass, $pathDString, $pieIdArray[$pieLegendObject->{'id'}], $vbWidth, $vbHeight); + } + + // collect legend object for legend JSON + $periodsObjectArrayString = '[ '.implode(',', $periodsObjectElements).' ]'; + $timeLegendObjectStrings[] = getTimeLegendObjectString($colorClass, $pieLegendObject, $periodsObjectArrayString); + } + + // Values of the line that represents the sum of all < 1% lines. + if ($pieType == 'country' && count($sumUploadsLT1Array) > 0) { + $i = $periodStart; + + foreach ($sumUploadsLT1Array as $commandX => $sumUploadsLT1) { + $uploadsForLine = $lineType == 'sum' ? $sumUploadsArray[$i++] : $sumUploadsLT1; + $pathDElements[] = getPathDElement($chartPaddingTop, $chartHeight, $uploadsForLine, $maxUploads, $commandX); + } + + // collect line object of < 1% line for time JSON + $pathDString = implode(' ', $pathDElements); + $lineObjectStrings[] = getLineObjectString('color0', $pathDString, $pieIdArray['lt1'], $vbWidth, $vbHeight); + } + + if ($lineType == 'sum') { + $lineObjectStrings = array_reverse($lineObjectStrings); + } + + // collect sum legend object for legend JSON + foreach ($sumUploadsArray as $periodValue => $sumUploads) { + $periodsSumObjectElements[] = '{ "period": "'.$periodValue.'", "uploads": '.$sumUploads.' }'; + } + $periodsSumObjectArrayString = '[ '.implode(',', $periodsSumObjectElements).' ]'; + $timeLegendObjectStrings[] = getTimeLegendObjectString('iconxxx', null, $periodsSumObjectArrayString); + + // common label for the vertical time chart labels + if ($period == 'year' && $month != 'all') { + $verticalTspanObjectStrings[] = '{ + "tspan-x": '.($vbWidth / 2).', + "tspan-y": '.($chartPaddingTop + $chartHeight + ($vbHeight / 25 * 2)).', + "label": "'.translate($i18nStats, $i18nStatsDefault, date('M', strtotime('1970-'.$month)).'_', [], [], []).'" }'; + } elseif ($period == 'month') { + $verticalTspanObjectStrings[] = '{ + "tspan-x": '.($vbWidth / 2).', + "tspan-y": '.($chartPaddingTop + $chartHeight + ($vbHeight / 25 * 2)).', + "label": "'.$year.'" }'; + } elseif ($period == 'day') { + $verticalTspanObjectStrings[] = '{ + "tspan-x": '.($vbWidth / 2).', + "tspan-y": '.($chartPaddingTop + $chartHeight + ($vbHeight / 25 * 3)).', + "label": "'.translate($i18nStats, $i18nStatsDefault, date('M', strtotime('1970-'.$month)).'_', [], [], []).' '.$year.'" }'; + } + + $timeObjectStrings[] = '"period": "'.$period.'"'; + $timeObjectStrings[] = '"vb-width": '.$vbWidth; + $timeObjectStrings[] = '"vb-height": '.$vbHeight; + $timeObjectStrings[] = '"h-grids": ['.(implode(',', $horizontalGridObjectStrings)).']'; + $timeObjectStrings[] = '"v-grids": ['.(implode(',', $verticalGridObjectStrings)).']'; + $timeObjectStrings[] = '"h-labels": { + "text-x": 0, + "text-y": 0, + "font-size": '.($vbWidth / 50).', + "tspan": ['.(implode(',', $horizontalTspanObjectStrings)).'] + }'; + $timeObjectStrings[] = '"v-labels": { + "text-x": 0, + "text-y": '.($chartPaddingTop + $chartHeight + (2 * $vbHeight / 100)).', + "font-size": '.($vbWidth / 50).', + "tspan": ['.(implode(',', $verticalTspanObjectStrings)).'] + }'; + $timeObjectStrings[] = '"lines": ['.(implode(',', $lineObjectStrings)).']'; + + $timeLegendArrayStrings['time'] = '"time": {'.(implode(',', $timeObjectStrings)).'}'; + $timeLegendArrayStrings['legend'] = '"legend": { + "title": "'.$titleStringFilter.'
'.$titleStringTime.'", + "table": ['.(implode(',', $timeLegendObjectStrings)).'] + }'; + + return $timeLegendArrayStrings; + } + + function getPathDElement($chartPaddingTop, $chartHeight, $uploadsForLine, $maxUploads, $commandX) { + $lineY = $chartPaddingTop + ($chartHeight - ($uploadsForLine / $maxUploads * $chartHeight)); + return $commandX.','.$lineY; + } + + function getLineObjectString($colorClass, $pathDString, $pieObject, $vbWidth, $vbHeight) { + $pathClassesArray = array($colorClass.'-stroke'); + + $lineObjectElements[] = '"path-id": "line'.$pieObject->{'path-id'}.'"'; + $lineObjectElements[] = '"path-classes": "'.implode(' ', $pathClassesArray).'"'; + $lineObjectElements[] = '"path-d": "'.$pathDString.'"'; + $lineObjectElements[] = '"has-link": '.($pieObject->{'has-link'} ? 'true' : 'false'); + $lineObjectElements[] = '"url-query": "'.$pieObject->{'url-query'}.'"'; + $lineObjectElements[] = '"text-id": "'.$pieObject->{'text-id'}.'"'; + $lineObjectElements[] = '"text-x": '.($vbWidth / 2); + $lineObjectElements[] = '"text-y": '.($vbHeight * 39 / 40); + $lineObjectElements[] = '"text-label": "'.$pieObject->{'text-label'}.' • '.$pieObject->{'text-percentage'}.' • '.$pieObject->{'text-nodes'}.'"'; + $lineObjectElements[] = '"font-size": '.($vbWidth / 30); + + return '{'.implode(',', $lineObjectElements)."}"; + } + + function getTimeLegendObjectString($colorClass, $pieLegendObject, $periodsObjectArrayString) { + global $surveillanceNodesTotal; + + if (!empty($pieLegendObject)) { + $title = $pieLegendObject->{'title'}; + $hasLink = $pieLegendObject->{'has-link'} ? 'true' : 'false'; + $urlQuery = $pieLegendObject->{'url-query'}; + $percentage = $pieLegendObject->{'percentage'}->{'string'}; + $nodes = $pieLegendObject->{'nodes'}->{'string'}; + } else { + $title = 'Total'; + $hasLink = 'false'; + $urlQuery = ''; + $percentage = '100%'; + $nodes = $surveillanceNodesTotal.' node'.($surveillanceNodesTotal != 1 ? 's' : ''); + } + + $timeLegendObjectElements[] = '"color-class": "'.$colorClass.'"'; + $timeLegendObjectElements[] = '"title": "'.$title.'"'; + $timeLegendObjectElements[] = '"has-link": '.$hasLink; + $timeLegendObjectElements[] = '"url-query": "'.$urlQuery.'"'; + $timeLegendObjectElements[] = '"percentage": "'.$percentage.'"'; + $timeLegendObjectElements[] = '"nodes": "'.$nodes.'"'; + $timeLegendObjectElements[] = '"periods": '.$periodsObjectArrayString; + + return '{'.implode(',', $timeLegendObjectElements)."}"; + } + + function getSurveillanceStatsTags($surveillanceStatsJSON) { + global $pieRadius, $embQueryNth; + + $surveillanceStatsObjects = json_decode($surveillanceStatsJSON); + + $totalObject = $surveillanceStatsObjects->{'total'}; + $naviObject = $surveillanceStatsObjects->{'navi'}; + $pieChartObject = $surveillanceStatsObjects->{'pie-chart'}; + $timeChartObject = $surveillanceStatsObjects->{'time-chart'}; + + $vGridPathArray = []; // FIX2023 + $linesPathArray = []; // FIX2023 + $thArray = []; // FIX2023 + $tfArray = []; // FIX2023 + + // ######## ######## ######## TOTAL CHART ######## ######## ######## + + $totalTags = ' + + + + '.$totalObject->{'no-of-nodes'}.' + + + '.$totalObject->{'label'}.' + '.$totalObject->{'filter'}.' + '.$totalObject->{'time'}.' + + + Your browser is not able to display SVG graphics. + '; + + // ######## ######## ######## NAVI ######## ######## ######## + + $naviCatsTags = getNaviTags('cats', $naviObject, null); + $naviYearsTags = getNaviTags('years', $naviObject, null); + $naviMonthsTags = getNaviTags('months', $naviObject, null); + + $naviTags = ' + + + '; + + // ######## ######## ######## PIE CHART ######## ######## ######## + + $piePathTags = ''; + $pieUseTags = ''; + $pieLegendTagsLess = ''; + $pieLegendTagsMore = ''; + + foreach($pieChartObject->{'pie'} as $piePieObject) { + $pieAStartTag = ''; + $pieAEndTag = ''; + + if ($piePieObject->{'has-link'}) { + $pieAStartTag = ''; + $pieAEndTag = ''; + } + + if ($piePieObject->{'text-percentage'} == '100.00%') { + $pieTag = ' + '; + } else { + $pieTag = ' + + + '; + } + + $piePathTags = $piePathTags. + $pieAStartTag. + $pieTag. + $pieAEndTag.' + + '.$piePieObject->{'text-label'}.' + '.$piePieObject->{'text-nodes'}.' + '.$piePieObject->{'text-percentage'}.' + + '; + + $pieUseTags = $pieUseTags.' + '; + } + + // background colored pie center circle + $piePathTags = $piePathTags.''; + + // if the legend has more then 10 entries the legend can be toggled (show first 10 entries or show all entries) + $isToggleLegend = count($pieChartObject->{'legend'}) > 10; + + foreach($pieChartObject->{'legend'} as $i => $pieLegendObject) { + $title = $pieLegendObject->{'title'}; + $subtitle = ''; + + if ($pieLegendObject->{'has-link'}) { + $title = ''.$title.''; + } + + if ($pieLegendObject->{'has-subtitle'}) { + $subtitle = ' +
+
+
'.$pieLegendObject->{'subtitle'}.'
+
'; + } + + $currentPieLegendTags = ' +
+
+
+
+
'.$title.'
+
+ '.$subtitle.' +
+
+
'.$pieLegendObject->{'percentage'}->{'string'}.' • '.$pieLegendObject->{'nodes'}->{'string'}.'
+
+
'; + + $pieLegendTagsMore = $pieLegendTagsMore.$currentPieLegendTags; + + if ($isToggleLegend && $i < 10) { + $pieLegendTagsLess = $pieLegendTagsLess.$currentPieLegendTags; + } + } + + if ($isToggleLegend) { + $pieLegendTags = ' + +
+ '.$pieLegendTagsLess.' +
+
+ '.$pieLegendTagsMore.' +
+ + '; + } else { + $pieLegendTags = $pieLegendTagsMore; + } + + $pieTags = ' +
+
+ + + '.$piePathTags.' + + '.$pieUseTags.' + Your browser is not able to display SVG graphics. + +
+
+ '.$pieLegendTags.' +
+
'; + + $pieChartTags = $pieTags; + + // ######## ######## ######## TIME CHART ######## ######## ######## + $timeObject = $timeChartObject->{'time'}; + $legendObject = $timeChartObject->{'legend'}; + $legendTableArray = $legendObject->{'table'}; + + $timeNaviLinesTags = getNaviTags('lines', $timeChartObject, 'time'); + + $noOfColumns = count($legendTableArray[0]->{'periods'}); + + foreach($legendTableArray as $i => $timeLegendObject) { + $tdArray = array(); + $rowTitleArray = array(); + + $title = $timeLegendObject->{'title'}; + + if ($timeLegendObject->{'has-link'}) { + $title = ''.$title.''; + } + + $rowTitleArray[] = $title; // ▪◾◼■ + $rowTitleArray[] = $timeLegendObject->{'percentage'}; + $rowTitleArray[] = $timeLegendObject->{'nodes'}; + + $color = $timeLegendObject->{'color-class'}; + + foreach($timeLegendObject->{'periods'} as $j => $periodObject) { + // $evenClass = $j % 2 == 0 ? "even-bg" : ''; + + if ($i == 0) { + // $thArray[] = ''.$periodObject->{'period'}.''; + $thArray[] = ''.$periodObject->{'period'}.''; + $tfArray[] = ''.$periodObject->{'period'}.''; + } + // $tdArray[] = ''.$periodObject->{'uploads'}.''; + $tdArray[] = ''.$periodObject->{'uploads'}.''; + } + + $tbodyTrArray[] = ' '; + $tbodyTrArray[] = ''.implode(' • ', $rowTitleArray).''; + $tbodyTrArray[] = ''.implode('', $tdArray).''; + } + + foreach ($timeObject->{'h-grids'} as $vGridObject) { + $hGridPathArray[] = ''; + } + + foreach ($timeObject->{'v-grids'} as $hGridObject) { + $vGridPathArray[] = ''; + } + + foreach ($timeObject->{'lines'} as $lineObject) { + $lineAStartTag = ''; + $lineAEndTag = ''; + + if ($lineObject->{'has-link'}) { + $lineAStartTag = ''; + $lineAEndTag = ''; + } + + $lineTag = ' + + '; + + $textTag = ' + + '.$lineObject->{'text-label'}.' + + '; + + $linesPathArray[] = + $lineAStartTag. + $lineTag. + $lineAEndTag. + $textTag; + } + + $hLabelsObject = $timeObject->{'h-labels'}; + foreach ($hLabelsObject->{'tspan'} as $tspanObject) { + $hTspanArray[] = ''.$tspanObject->{'label'}.''; + } + + $vLabelsObject = $timeObject->{'v-labels'}; + foreach ($vLabelsObject->{'tspan'} as $tspanObject) { + $vTspanArray[] = ''.$tspanObject->{'label'}.''; + } + + $timePathUseTags = ' + + + '.(implode('', $hGridPathArray)).' + + + '.(implode('', $vGridPathArray)).' + + + '.(implode('', $linesPathArray)).' + + + '.(implode('', $hTspanArray)).' + + + '.(implode('', $vTspanArray)).' + + Your browser is not able to display SVG graphics. + '; + + $timeLegendTags = ' + + + + '.(implode('', $thArray)).' + + + + + '.(implode('', $tfArray)).' + + + + '.(implode('', $tbodyTrArray)).' + +
'; + + $timeTags = ' +
+
+ '.$timePathUseTags.' +
+
+
'.$legendObject->{'title'}.'
+ '.$timeLegendTags.' +
+
'; + + $timeChartTags = $timeNaviLinesTags.$timeTags; + + return $totalTags.$naviTags.$pieChartTags.$timeChartTags; + } + + function getNaviTags($mode, $naviObject, $id) { + $naviEntryObjects = $naviObject->{$mode}; + $idString = !empty($id) ? 'id="'.$id.'"' : ''; + $naviTags = ''; + } + + function getNaviElement($selectedClass, $urlQuery, $label, $vbHeight, $yText, $id) { + global $embQueryNth; + + $idLink = !empty($id) ? '#'.$id : ''; + + return ' + '; + } + + function getPercentage($total, $part) { + return number_format((($part*100)/$total), 2); + } + + function getDegrees($percentage) { + return 360*($percentage/100); + } + + /* | x + y| + (4) ---------|--------- (1) X,Y + r| z + | + --------------+-------------- + |(100,100) + | + (3) ---------|--------- (2) + | + |*/ + function getXYCoordinates($degrees, $pieRadius) { + if ($degrees <= 90) { + // Coordinate in section (1) + $angle = $degrees; + $z = calculateZ($angle, $pieRadius); + $x = calculateX($angle, $pieRadius); + $y = calculateY($z, $x); + $xyCoordinates['X'] = getCoordinateX12($x, $pieRadius); + $xyCoordinates['Y'] = $y; + } elseif ($degrees <= 180) { + // Coordinate in section (2) + $angle = 180 - $degrees; + $z = calculateZ($angle, $pieRadius); + $x = calculateX($angle, $pieRadius); + $y = calculateY($z, $x); + $xyCoordinates['X'] = getCoordinateX12($x, $pieRadius); + $xyCoordinates['Y'] = getCoordinateY23($y, $pieRadius); + } elseif ($degrees <= 270) { + // Coordinate in section (3) + $angle = $degrees - 180; + $z = calculateZ($angle, $pieRadius); + $x = calculateX($angle, $pieRadius); + $y = calculateY($z, $x); + $xyCoordinates['X'] = getCoordinateX34($x, $pieRadius); + $xyCoordinates['Y'] = getCoordinateY23($y, $pieRadius); + } else { + // Coordinate in section (4) + $angle = 360 - $degrees; + $z = calculateZ($angle, $pieRadius); + $x = calculateX($angle, $pieRadius); + $y = calculateY($z, $x); + $xyCoordinates['X'] = getCoordinateX34($x, $pieRadius); + $xyCoordinates['Y'] = $y; + } + + return $xyCoordinates; + } + + // Calculate side z with the cosine rule [ z² = r² + r² – 2*r*r*cos(α) ] + function calculateZ($angle, $pieRadius) { + $doubleRadiusPow2 = 2*pow($pieRadius, 2); + + return sqrt($doubleRadiusPow2 - ($doubleRadiusPow2 * cos(deg2rad($angle)))); + } + + // Calculate side x using the sine rule [ sin(α) = x/r ] + function calculateX($angle, $pieRadius) { + return sin(deg2rad($angle)) * $pieRadius; + } + + // Calculate side y using Mr. Pythagoras’ theorem [ x² + y² = z² ] + function calculateY($z, $x) { + return sqrt(pow($z, 2) - pow($x, 2)); + } + + // x-coordinate in section 1 or 2 + function getCoordinateX12($x, $pieRadius) { + return $pieRadius + $x; + } + + // x-coordinate in section 3 or 4 + function getCoordinateX34($x, $pieRadius) { + return $pieRadius - $x; + } + + // y-coordinate in section 2 or 3 + function getCoordinateY23($y, $pieRadius) { + return (2 *($pieRadius - $y)) + $y; + } +?> + + + + + + SunderS — Statistics + + + + + + + + + + + + +
+ Surveillance under Surveillance +
+
+ close(); + ?> + + + + + diff --git a/www/sunders/sunders.html b/www/sunders/sunders.html new file mode 100644 index 0000000..d62a3aa --- /dev/null +++ b/www/sunders/sunders.html @@ -0,0 +1,26 @@ + + + + + + Surveillance under Surveillance + + + + + + + + + + + + + +
+ + Surveillance under Surveillance + +
+ +